diff --git a/experimental/counterTree/tree.go b/experimental/counterTree/tree.go new file mode 100644 index 00000000..b0d45c12 --- /dev/null +++ b/experimental/counterTree/tree.go @@ -0,0 +1,76 @@ +package main + +import ( + "fmt" + "math/bits" + "sync/atomic" + "unsafe" +) + +const debug = true + +type TreeCounterNode struct { + Value uint64 + Zero *TreeCounterNode + One *TreeCounterNode + Parent *TreeCounterNode +} + +// MEGA EXPERIMENTAL. Start from the right-most bits in the integer and move leftwards +type TreeTopicViewCounter struct { + root *TreeCounterNode +} + +func newTreeTopicViewCounter() *TreeTopicViewCounter { + return &TreeTopicViewCounter{ + &TreeCounterNode{0, nil, nil, nil}, + } +} + +func (counter *TreeTopicViewCounter) Bump(signTopicID int64) { + var topicID uint64 = uint64(signTopicID) + var zeroCount = bits.LeadingZeros64(topicID) + if debug { + fmt.Printf("topicID int64: %d\n", signTopicID) + fmt.Printf("topicID int64: %x\n", signTopicID) + fmt.Printf("topicID int64: %b\n", signTopicID) + fmt.Printf("topicID uint64: %b\n", topicID) + fmt.Printf("leading zeroes: %d\n", zeroCount) + + var leadingZeroes = "" + for i := 0; i < zeroCount; i++ { + leadingZeroes += "0" + } + fmt.Printf("topicID lead uint64: %s%b\n", leadingZeroes, topicID) + + fmt.Printf("---\n") + } + + var stopAt uint64 = 64 - uint64(zeroCount) + var spot uint64 = 1 + var node = counter.root + for { + if debug { + fmt.Printf("spot: %d\n", spot) + fmt.Printf("topicID&spot: %d\n", topicID&spot) + } + if topicID&spot == 1 { + if node.One == nil { + atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(node.One)), nil, unsafe.Pointer(&TreeCounterNode{0, nil, nil, node})) + } + node = node.One + } else { + if node.Zero == nil { + atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(node.Zero)), nil, unsafe.Pointer(&TreeCounterNode{0, nil, nil, node})) + } + node = node.Zero + } + + spot++ + if spot >= stopAt { + break + } + } + + atomic.AddUint64(&node.Value, 1) +} diff --git a/experimental/counterTree/tree_test.go b/experimental/counterTree/tree_test.go new file mode 100644 index 00000000..49c1a96d --- /dev/null +++ b/experimental/counterTree/tree_test.go @@ -0,0 +1,24 @@ +package main + +import ( + "log" + "testing" +) + +func TestCounter(t *testing.T) { + counter := newTreeTopicViewCounter() + counter.Bump(1) + counter.Bump(57) + counter.Bump(58) + counter.Bump(59) + counter.Bump(9) +} + +func TestScope(t *testing.T) { + var outVar int + closureHolder := func() { + outVar = 2 + } + closureHolder() + log.Print("outVar: ", outVar) +} diff --git a/gen_router.go b/gen_router.go index 0477f5d3..4b39afd9 100644 --- a/gen_router.go +++ b/gen_router.go @@ -380,10 +380,20 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { common.AgentViewCounter.Bump(13) case ua == "": common.AgentViewCounter.Bump(14) + if common.Dev.DebugMode { + log.Print("prefix: ", prefix) + log.Print("req.URL.Path: ", req.URL.Path) + log.Print("extraData: ", extraData) + log.Print("req.Referer(): ", req.Referer()) + } default: common.AgentViewCounter.Bump(0) if common.Dev.DebugMode { log.Print("Unknown UA: ", req.UserAgent()) + log.Print("prefix: ", prefix) + log.Print("req.URL.Path: ", req.URL.Path) + log.Print("extraData: ", extraData) + log.Print("req.Referer(): ", req.Referer()) } } diff --git a/router_gen/main.go b/router_gen/main.go index 85ac2a46..aad19954 100644 --- a/router_gen/main.go +++ b/router_gen/main.go @@ -340,10 +340,20 @@ func (router *GenRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { common.AgentViewCounter.Bump({{.AllAgentMap.lynx}}) case ua == "": common.AgentViewCounter.Bump({{.AllAgentMap.blank}}) + if common.Dev.DebugMode { + log.Print("prefix: ", prefix) + log.Print("req.URL.Path: ", req.URL.Path) + log.Print("extraData: ", extraData) + log.Print("req.Referer(): ", req.Referer()) + } default: common.AgentViewCounter.Bump({{.AllAgentMap.unknown}}) if common.Dev.DebugMode { log.Print("Unknown UA: ", req.UserAgent()) + log.Print("prefix: ", prefix) + log.Print("req.URL.Path: ", req.URL.Path) + log.Print("extraData: ", extraData) + log.Print("req.Referer(): ", req.Referer()) } } diff --git a/themes/cosora/public/main.css b/themes/cosora/public/main.css index 1806e9b2..42ee466a 100644 --- a/themes/cosora/public/main.css +++ b/themes/cosora/public/main.css @@ -319,6 +319,8 @@ h1, h3 { border: 1px solid var(--header-border-color); border-bottom: 2px solid var(--header-border-color); padding: 8px; + padding-left: 12px; + padding-right: 12px; } @keyframes fadein {