{"action":"created","issue":{"url":"https://api.github.com/repos/lytics/CloudForest/issues/20","repository_url":"https://api.github.com/repos/lytics/CloudForest","labels_url":"https://api.github.com/repos/lytics/CloudForest/issues/20/labels{/name}","comments_url":"https://api.github.com/repos/lytics/CloudForest/issues/20/comments","events_url":"https://api.github.com/repos/lytics/CloudForest/issues/20/events","html_url":"https://github.com/lytics/CloudForest/issues/20","id":382844862,"node_id":"MDU6SXNzdWUzODI4NDQ4NjI=","number":20,"title":"concurrent map writes at catmap.go:20/23","user":{"login":"glycerine","id":445247,"node_id":"MDQ6VXNlcjQ0NTI0Nw==","avatar_url":"https://avatars2.githubusercontent.com/u/445247?v=4","gravatar_id":"","url":"https://api.github.com/users/glycerine","html_url":"https://github.com/glycerine","followers_url":"https://api.github.com/users/glycerine/followers","following_url":"https://api.github.com/users/glycerine/following{/other_user}","gists_url":"https://api.github.com/users/glycerine/gists{/gist_id}","starred_url":"https://api.github.com/users/glycerine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glycerine/subscriptions","organizations_url":"https://api.github.com/users/glycerine/orgs","repos_url":"https://api.github.com/users/glycerine/repos","events_url":"https://api.github.com/users/glycerine/events{/privacy}","received_events_url":"https://api.github.com/users/glycerine/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":2,"created_at":"2018-11-20T20:56:04Z","updated_at":"2018-11-20T21:56:42Z","closed_at":null,"author_association":"NONE","body":" Drat. I tried a simple `growforest` on the iris data set, and the Go runtime is crashing on concurrent map access.\r\n\r\n~~~\r\nin catmap.go\r\nfunc (cm *CatMap) CatToNum(value string) (numericv int) {\r\n    numericv, exsists := cm.Map[value] ///////////////// concurrent read/write here\r\n    if exsists == false {\r\n        numericv = len(cm.Back)\r\n        cm.Map[value] = numericv   ////////////////// concurrent writes here\r\n        cm.Back = append(cm.Back, value)\r\n\r\n    }\r\n    return\r\n}\r\n~~~\r\nrepro: (might need to run a couple of times to get the Go stdlib to detect the concurrent access and panic)\r\n\r\n~~~\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data (master) $ mkdir tmp\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data (master) $ cp iris.data.fm tmp/train.fm && cd ..\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest (master) $ go install github.com/lytics/CloudForest/growforest\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest (master) $ cd data/tmp\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ ls\r\nforest.sf\ttrain.fm\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ ls -al\r\ntotal 16\r\ndrwxrwxr-x  4 jaten  staff   128 Nov 20 14:44 .\r\ndrwxrwxr-x  8 jaten  staff   256 Nov 20 14:43 ..\r\n-rw-rw-r--  1 jaten  staff     0 Nov 20 14:44 forest.sf\r\n-rw-rw-r--  1 jaten  staff  4963 Nov 20 14:44 train.fm\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ rm forest.sf \r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ growforest -train train.fm -rfpred forest.sf -target C:Class -oob -nCores 16 -nTrees 1000 -leafSize 8\r\nThreads : 16\r\nnTrees : 1000\r\nLoading data from: train.fm\r\nTarget : C:Class\r\nNon Target Features : 4\r\nmTry : 2\r\nnon-missing cases: 150\r\nleafSize : 8\r\nnSamples : 150\r\nRecording oob error.\r\nPerforming classification with 3 categories.\r\nfatal error: concurrent map writes\r\n\r\ngoroutine 18 [running]:\r\nruntime.throw(0x11b4b02, 0x15)\r\n\t/usr/local/go/src/runtime/panic.go:616 +0x81 fp=0xc42004e7b0 sp=0xc42004e790 pc=0x1027a61\r\nruntime.mapassign_faststr(0x117fdc0, 0xc4200823f0, 0xc4200e7007, 0xb, 0x12d2120)\r\n\t/usr/local/go/src/runtime/hashmap_fast.go:703 +0x3e9 fp=0xc42004e820 sp=0xc42004e7b0 pc=0x100b209\r\ngithub.com/lytics/CloudForest.(*CatMap).CatToNum(...)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/catmap.go:23\r\ngithub.com/lytics/CloudForest.(*CatBallotBox).Vote(0xc42008a100, 0x0, 0xc4200e7007, 0xb, 0x3ff0000000000000)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/catballotbox.go:42 +0x277 fp=0xc42004e898 sp=0xc42004e820 pc=0x1117af7\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases.func1(0xc420112140, 0xc420114500, 0x15, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:421 +0x8e fp=0xc42004e8f0 sp=0xc42004e898 pc=0x113070e\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc420112140, 0xc42004eb50, 0xc420092f00, 0xc420114500, 0x15, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:70 +0x7d fp=0xc42004e9a8 sp=0xc42004e8f0 pc=0x11286bd\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc4201120a0, 0xc42004eb50, 0xc420092f00, 0xc420114500, 0x25, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c fp=0xc42004ea60 sp=0xc42004e9a8 pc=0x11288bc\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc420112000, 0xc42004eb50, 0xc420092f00, 0xc420114500, 0x36, 0x96, 0x1)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c fp=0xc42004eb18 sp=0xc42004ea60 pc=0x11288bc\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases(0xc42000a060, 0xc420092f00, 0x11d3d00, 0xc42008a100, 0xc420114500, 0x36, 0x96)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:417 +0xba fp=0xc42004eb80 sp=0xc42004eb18 pc=0x112ed6a\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:696 +0x16a7 fp=0xc42004efe0 sp=0xc42004eb80 pc=0x11588c7\r\nruntime.goexit()\r\n\t/usr/local/go/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc42004efe8 sp=0xc42004efe0 pc=0x1050df1\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 1 [semacquire]:\r\nsync.runtime_Semacquire(0xc4200f448c)\r\n\t/usr/local/go/src/runtime/sema.go:56 +0x39\r\nsync.(*WaitGroup).Wait(0xc4200f4480)\r\n\t/usr/local/go/src/sync/waitgroup.go:129 +0x72\r\nmain.main()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:754 +0x3238\r\n\r\ngoroutine 19 [runnable]:\r\nsync.runtime_SemacquireMutex(0xc42008a044, 0x112c500)\r\n\t/usr/local/go/src/runtime/sema.go:71 +0x3d\r\nsync.(*Mutex).Lock(0xc42008a040)\r\n\t/usr/local/go/src/sync/mutex.go:134 +0x108\r\nmath/rand.(*lockedSource).Int63(0xc42008a040, 0x4ab7118ec39a66a6)\r\n\t/usr/local/go/src/math/rand/rand.go:377 +0x2d\r\nmath/rand.(*Rand).Int63(0xc420082180, 0x4ab7118ec39a66a6)\r\n\t/usr/local/go/src/math/rand/rand.go:82 +0x33\r\nmath/rand.(*Rand).Int31(0xc420082180, 0xc44ab7118e)\r\n\t/usr/local/go/src/math/rand/rand.go:96 +0x2b\r\nmath/rand.(*Rand).Int31n(0xc420082180, 0xc400000096, 0xc400000074)\r\n\t/usr/local/go/src/math/rand/rand.go:131 +0x4f\r\nmath/rand.(*Rand).Intn(0xc420082180, 0x96, 0x74)\r\n\t/usr/local/go/src/math/rand/rand.go:169 +0x45\r\nmath/rand.Intn(0x96, 0x74)\r\n\t/usr/local/go/src/math/rand/rand.go:326 +0x37\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:632 +0x1ac8\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 20 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 21 [runnable]:\r\nsync.runtime_SemacquireMutex(0xc42008a044, 0x112c501)\r\n\t/usr/local/go/src/runtime/sema.go:71 +0x3d\r\nsync.(*Mutex).Lock(0xc42008a040)\r\n\t/usr/local/go/src/sync/mutex.go:134 +0x108\r\nmath/rand.(*lockedSource).Int63(0xc42008a040, 0x341e252378ba9d7b)\r\n\t/usr/local/go/src/math/rand/rand.go:377 +0x2d\r\nmath/rand.(*Rand).Int63(0xc420082180, 0x341e252378ba9d7b)\r\n\t/usr/local/go/src/math/rand/rand.go:82 +0x33\r\nmath/rand.(*Rand).Int31(0xc420082180, 0xc4341e2523)\r\n\t/usr/local/go/src/math/rand/rand.go:96 +0x2b\r\nmath/rand.(*Rand).Int31n(0xc420082180, 0xc400000096, 0xc400000013)\r\n\t/usr/local/go/src/math/rand/rand.go:131 +0x4f\r\nmath/rand.(*Rand).Intn(0xc420082180, 0x96, 0x13)\r\n\t/usr/local/go/src/math/rand/rand.go:169 +0x45\r\nmath/rand.Intn(0x96, 0x13)\r\n\t/usr/local/go/src/math/rand/rand.go:326 +0x37\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:632 +0x1ac8\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 22 [runnable]:\r\nsyscall.Syscall(0x4, 0x3, 0xc42017a000, 0x4c, 0x4c, 0x0, 0x0)\r\n\t/usr/local/go/src/syscall/asm_darwin_amd64.s:16 +0x5\r\nsyscall.write(0x3, 0xc42017a000, 0x4c, 0x80, 0xc42016a001, 0x0, 0x0)\r\n\t/usr/local/go/src/syscall/zsyscall_darwin_amd64.go:1321 +0x5f\r\nsyscall.Write(0x3, 0xc42017a000, 0x4c, 0x80, 0x4b, 0x0, 0xc4201a78d0)\r\n\t/usr/local/go/src/syscall/syscall_unix.go:181 +0x49\r\ninternal/poll.(*FD).Write(0xc42009e460, 0xc42017a000, 0x4c, 0x80, 0x0, 0x0, 0x0)\r\n\t/usr/local/go/src/internal/poll/fd_unix.go:256 +0x142\r\nos.(*File).write(0xc42009c058, 0xc42017a000, 0x4c, 0x80, 0xc4201d0020, 0x76, 0xc42016e000)\r\n\t/usr/local/go/src/os/file_unix.go:243 +0x4e\r\nos.(*File).Write(0xc42009c058, 0xc42017a000, 0x4c, 0x80, 0x103f137, 0xc4201a79d8, 0x100d18a)\r\n\t/usr/local/go/src/os/file.go:144 +0x6f\r\nfmt.Fprintln(0x11d3380, 0xc42009c058, 0xc4201a7a88, 0x1, 0x1, 0xc4201d8000, 0x4b, 0x18)\r\n\t/usr/local/go/src/fmt/print.go:255 +0x8b\r\ngithub.com/lytics/CloudForest.(*ForestWriter).WriteNode(0xc420081020, 0xc420156000, 0x11b18f4, 0x1)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/forestwriter.go:95 +0x17d\r\ngithub.com/lytics/CloudForest.(*ForestWriter).WriteNodeAndChildren(0xc420081020, 0xc420156000, 0x11b18f4, 0x1)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/forestwriter.go:63 +0x4d\r\ngithub.com/lytics/CloudForest.(*ForestWriter).WriteTree(0xc420081020, 0xc420158000, 0x0)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/forestwriter.go:38 +0x8b\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:705 +0x15b6\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 23 [runnable]:\r\ngithub.com/lytics/CloudForest.(*CatBallotBox).Vote(0xc42008a100, 0x2, 0xc4200e7007, 0xb, 0x3ff0000000000000)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/catballotbox.go:47 +0x13e\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases.func1(0xc42009e690, 0xc420146500, 0x15, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:421 +0x8e\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc42009e690, 0xc42011fb50, 0xc420092f00, 0xc420146500, 0x15, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:70 +0x7d\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc42009e5f0, 0xc42011fb50, 0xc420092f00, 0xc420146500, 0x17, 0x96, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc42009e550, 0xc42011fb50, 0xc420092f00, 0xc420146500, 0x36, 0x96, 0x1)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases(0xc42008a2a0, 0xc420092f00, 0x11d3d00, 0xc42008a100, 0xc420146500, 0x36, 0x96)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:417 +0xba\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:696 +0x16a7\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 24 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 25 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 26 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 27 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 28 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 29 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 30 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 31 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 32 [runnable]:\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:592\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\n\r\ngoroutine 33 [runnable]:\r\nsync.(*Mutex).Lock(0xc420080a90)\r\n\t/usr/local/go/src/sync/mutex.go:72 +0x2e9\r\ngithub.com/lytics/CloudForest.(*CatBallotBox).Vote(0xc42008a100, 0x3e, 0xc4200e722d, 0xf, 0x3ff0000000000000)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/catballotbox.go:43 +0xa7\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases.func1(0xc420122280, 0xc42013a578, 0xb, 0x87, 0x3)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:421 +0x8e\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc420122280, 0xc42011eb50, 0xc420092f00, 0xc42013a578, 0xb, 0x87, 0x3)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:70 +0x7d\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc4201221e0, 0xc42011eb50, 0xc420092f00, 0xc42013a578, 0x11, 0x87, 0x3)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc420122190, 0xc42011eb50, 0xc420092f00, 0xc42013a578, 0x26, 0x87, 0x2)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:83 +0x27c\r\ngithub.com/lytics/CloudForest.(*Node).Recurse(0xc42009e4b0, 0xc42011eb50, 0xc420092f00, 0xc42013a500, 0x35, 0x96, 0x1)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/node.go:86 +0x203\r\ngithub.com/lytics/CloudForest.(*Tree).VoteCases(0xc42008a180, 0xc420092f00, 0x11d3d00, 0xc42008a100, 0xc42013a500, 0x35, 0x96)\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/tree.go:417 +0xba\r\nmain.main.func1()\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:696 +0x16a7\r\ncreated by main.main\r\n\t/Users/jaten/go/src/github.com/lytics/CloudForest/growforest/growforest.go:747 +0x2669\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ go version\r\ngo version go1.10.2 darwin/amd64\r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ \r\njaten@jatens-MacBook-Pro ~/go/src/github.com/lytics/CloudForest/data/tmp (master) $ git log\r\ncommit 24f133408db30c1c6663d332d684012aed50c299 (HEAD -> master, origin/master, origin/HEAD)\r\nMerge: cd7d62f fb121eb\r\nAuthor: Nicolas Lanker <Stigz@users.noreply.github.com>\r\nDate:   Tue Jun 12 12:58:31 2018 -0700\r\n\r\n    Merge pull request #17 from lytics/transpose_output_change\r\n\r\n    changes bug in featurematrix output from transpose to not transpose\r\n~~~"},"comment":{"url":"https://api.github.com/repos/lytics/CloudForest/issues/comments/440443677","html_url":"https://github.com/lytics/CloudForest/issues/20#issuecomment-440443677","issue_url":"https://api.github.com/repos/lytics/CloudForest/issues/20","id":440443677,"node_id":"MDEyOklzc3VlQ29tbWVudDQ0MDQ0MzY3Nw==","user":{"login":"glycerine","id":445247,"node_id":"MDQ6VXNlcjQ0NTI0Nw==","avatar_url":"https://avatars2.githubusercontent.com/u/445247?v=4","gravatar_id":"","url":"https://api.github.com/users/glycerine","html_url":"https://github.com/glycerine","followers_url":"https://api.github.com/users/glycerine/followers","following_url":"https://api.github.com/users/glycerine/following{/other_user}","gists_url":"https://api.github.com/users/glycerine/gists{/gist_id}","starred_url":"https://api.github.com/users/glycerine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/glycerine/subscriptions","organizations_url":"https://api.github.com/users/glycerine/orgs","repos_url":"https://api.github.com/users/glycerine/repos","events_url":"https://api.github.com/users/glycerine/events{/privacy}","received_events_url":"https://api.github.com/users/glycerine/received_events","type":"User","site_admin":false},"created_at":"2018-11-20T21:56:42Z","updated_at":"2018-11-20T21:56:42Z","author_association":"NONE","body":"ok, https://github.com/lytics/CloudForest/pull/23 should be orthogonal to the rest of the patches."}}
{"actor":{"display_login":"glycerine"}}