pink-gorilla / notebook Goto Github PK
View Code? Open in Web Editor NEWWeb based Clojure notebook application/-library.
Home Page: https://pink-gorilla.github.io/
Web based Clojure notebook application/-library.
Home Page: https://pink-gorilla.github.io/
figwheel_server.log
gorilla-repl.log
would be added to repo.
but they should be excluded from git.
saite has similar features. https://github.com/jsa-aerial/saite
similarities:
https://github.com/day8/re-com/blob/master/src/re_com/dropdown.cljs
https://github.com/pink-gorilla/sample-notebooks/blob/master/samples/fuckup-pprint.clj
if there is a newline \n character in a string, then only one line gets printed.
https://github.com/mauricioszabo/atom-chlorine/tree/master/integration
Chlorine is a repl plugin foe atom editor which uses reagent. It has nice ui tests which we can use as a starting point to get gorilla unit tests going.
It should be possible to dynamically choose a remote NREPL server address using the browser.
Form evaluation may get stuck in IO or long running/endless loops. The basic nrepl building blocks appear to be in place. We should support interruptable eval triggered from the ui - probably via keybinding.
Add Google analytics or other tracking software to know how many people use the app and for how long. I want to see total hours used per month. That is a metric we shoudl watch. More hours = more useful.
open a new notebook.
edit the first cell that has markdown
this came with the laest upgrades
in free-output (created by gorilla_repl.worksheet.free_output.free_output)
in gorilla_repl.worksheet.free_output.free_output (created by markup-segment)
in div (created by markup-segment)
in markup-segment (created by gorilla_repl.worksheet.free_segment.free_segment)
in gorilla_repl.worksheet.free_segment.free_segment (created by gorilla_repl.worksheet.core.worksheet)
in div (created by gorilla_repl.worksheet.core.worksheet)
in div (created by gorilla_repl.worksheet.core.worksheet)
in div (created by gorilla_repl.worksheet.core.worksheet)
in gorilla_repl.worksheet.core.worksheet (created by gorilla-app)
in div (created by gorilla-app)
in gorilla-app (created by gorilla_repl.views.gorilla_app)
TypeError: cm is null
cljs$core$IFn$invoke$arity$variadic editor.cljs:249
gorilla_repl$editor$create_editor_BANG editor.cljs:236
gorilla_repl$worksheet$helper$init_cm_BANG_ helper.cljs:18
G__11293__1 core.cljs:4320
G__11293 core.js:15195
free_output free_output.cljs:35
reagent$impl$component$custom_wrapper_$_componentDidUpdate component.cljs:183
commitLifeCycles react-dom.inc.js:10238
commitAllLifeCycles react-dom.inc.js:11901
callCallback react-dom.inc.js:140
invokeGuardedCallbackDev react-dom.inc.js:178
invokeGuardedCallback react-dom.inc.js:227
commitRoot react-dom.inc.js:12040
completeRoot react-dom.inc.js:12948
performWorkOnRoot react-dom.inc.js:12898
performWork react-dom.inc.js:12816
performSyncWork react-dom.inc.js:12793
requestWork react-dom.inc.js:12693
scheduleWorkImpl react-dom.inc.js:12568
scheduleWork react-dom.inc.js:12528
enqueueForceUpdate react-dom.inc.js:7128
forceUpdate React
reagent$impl$batching$run_queue batching.cljs:39
flush_queues batching.cljs:86
run_queues batching.cljs:76
schedule batching.cljs:63
next_tick re_frame_10x.cljs:128
Two new protocols: Datafiable and Navigable
Clojure’s narrative has always been around data. Data immutability, Code as data etc… Some people say that Clojure is a Data-drive languages. Clojure 1.10 takes the data story one step further. Now, every piece of Clojure can be seen as data: it can be datified and navigated. Out of the box, Clojure provides datification of atoms, vars, namespaces and more…
Remark: Datafiable and Navigable have their most natural application in the context of building tools for data exploration. You will probably not need it in your web service. But it’s part of Clojure now, so I think it’s interesting to discover their “mechanics”.
To datafy a value, we call the datafy function from the clojure.datafy namespace:
Docker image uses jsu branch for now FYI. Currently master does not work with mist of the ui libraries that I use in the workbooks.
The system may be serving the worksheet document before the build is finished. This may end up 404
accessing gorilla.js
.
Workaround: Give the system a few seconds and try again.
Migration to shadow-cljs sacrifed parinfer. We want it back.
We want the notebook being able to use a remote Clojure Kernel via nREPL.
Implementation of basic functionality should not be difficult to implement. We can just launch nREPL listening on the network and use localhost instead of current default in memory communication. Next step would be allowing the user to choose the nrepl server (kernel).
Building blocks are in place, we just need to tweak the "Alt G + Alt L" load dialog a bit.
https://github.com/gadfly361/re-pressed
Any good?
Hi!
I am amazed of your improvements over the original gorilla repl! Thanks so much!
I think now that we have reagent under the hood we could use this to allow for nice UI controls in gorilla repl! For example we could add sliders to limit the display of a big table. Or we could add an UI that collects parameter that will trigger the recalculation of a funcion / cell on the server.
We could go even a step further and display dynamically updating data from the server via a websocket. Possibly we could write a routine that syncs server side atoms with client side atoms that arw then displayed in react. This would allow for a completely new level of interactive data analysis.
And we could also add sub routes to each worksheet that would each display different data.
We can so stuff that is eay mroe advanced than jupyter notebooks.
Are you interested to discuss this?
lein --version
Leiningen 2.9.1 on Java 1.8.0_222 OpenJDK 64-Bit Server VM
lein run -m clojure.main script/figwheel.clj
clojure.lang.Compiler$CompilerException: Syntax error reading source at (cider/nrepl/middleware/test.clj:129:57).
#:clojure.error{:phase :read-source, :line 129, :column 57, :source "cider/nrepl/middleware/test.clj"}
at clojure.lang.Compiler.load (Compiler.java:7642)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:463)
clojure.lang.RT.load (RT.java:428)
clojure.core$load$fn__6824.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:3894)
cider.nrepl$eval714$loading__6706__auto____715.invoke (nrepl.clj:1)
cider.nrepl$eval714.invokeStatic (nrepl.clj:1)
cider.nrepl$eval714.invoke (nrepl.clj:1)
clojure.lang.Compiler.eval (Compiler.java:7176)
clojure.lang.Compiler.eval (Compiler.java:7165)
clojure.lang.Compiler.load (Compiler.java:7635)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:463)
clojure.lang.RT.load (RT.java:428)
clojure.core$load$fn__6824.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:408)
cider_nrepl.plugin$middleware.invokeStatic (plugin.clj:56)
cider_nrepl.plugin$middleware.invoke (plugin.clj:17)
clojure.lang.Var.invoke (Var.java:384)
leiningen.core.project$apply_middleware.invokeStatic (project.clj:817)
leiningen.core.project$apply_middleware.invoke (project.clj:810)
clojure.core.protocols$fn__8144.invokeStatic (protocols.clj:168)
clojure.core.protocols/fn (protocols.clj:124)
clojure.core.protocols$fn__8099$G__8094__8108.invoke (protocols.clj:19)
clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
clojure.core.protocols$fn__8131.invokeStatic (protocols.clj:75)
clojure.core.protocols/fn (protocols.clj:75)
clojure.core.protocols$fn__8073$G__8068__8086.invoke (protocols.clj:13)
clojure.core$reduce.invokeStatic (core.clj:6828)
clojure.core$reduce.invoke (core.clj:6810)
leiningen.core.project$apply_middleware.invokeStatic (project.clj:812)
leiningen.core.project$apply_middleware.invoke (project.clj:810)
leiningen.core.project$activate_middleware.invokeStatic (project.clj:844)
leiningen.core.project$activate_middleware.invoke (project.clj:840)
leiningen.core.project$init_project.invokeStatic (project.clj:986)
leiningen.core.project$init_project.invoke (project.clj:974)
leiningen.core.project$read.invokeStatic (project.clj:1057)
leiningen.core.project$read.invoke (project.clj:1054)
leiningen.core.project$read.invokeStatic (project.clj:1058)
leiningen.core.project$read.invoke (project.clj:1054)
leiningen.core.main$_main$fn__6681.invoke (main.clj:447)
leiningen.core.main$_main.invokeStatic (main.clj:442)
leiningen.core.main$_main.doInvoke (main.clj:439)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.lang.Var.applyTo (Var.java:705)
clojure.core$apply.invokeStatic (core.clj:665)
clojure.main$main_opt.invokeStatic (main.clj:491)
clojure.main$main_opt.invoke (main.clj:487)
clojure.main$main.invokeStatic (main.clj:598)
clojure.main$main.doInvoke (main.clj:561)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.lang.Var.applyTo (Var.java:705)
clojure.main.main (main.java:37)
Caused by: java.lang.RuntimeException: Invalid token: ::clojure.test/once-fixtures
at clojure.lang.Util.runtimeException (Util.java:221)
clojure.lang.LispReader.interpretToken (LispReader.java:412)
clojure.lang.LispReader.read (LispReader.java:305)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:1243)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:1243)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:1243)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$VectorReader.invoke (LispReader.java:1347)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:1243)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1398)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:1243)
clojure.lang.LispReader.read (LispReader.java:285)
clojure.lang.LispReader.read (LispReader.java:216)
clojure.lang.Compiler.load (Compiler.java:7630)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:463)
clojure.lang.RT.load (RT.java:428)
clojure.core$load$fn__6824.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:3894)
cider.nrepl$eval714$loading__6706__auto____715.invoke (nrepl.clj:1)
cider.nrepl$eval714.invokeStatic (nrepl.clj:1)
cider.nrepl$eval714.invoke (nrepl.clj:1)
clojure.lang.Compiler.eval (Compiler.java:7176)
clojure.lang.Compiler.eval (Compiler.java:7165)
clojure.lang.Compiler.load (Compiler.java:7635)
clojure.lang.RT.loadResourceScript (RT.java:381)
clojure.lang.RT.loadResourceScript (RT.java:372)
clojure.lang.RT.load (RT.java:463)
clojure.lang.RT.load (RT.java:428)
clojure.core$load$fn__6824.invoke (core.clj:6126)
clojure.core$load.invokeStatic (core.clj:6125)
clojure.core$load.doInvoke (core.clj:6109)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invokeStatic (core.clj:5908)
clojure.core$load_one.invoke (core.clj:5903)
clojure.core$load_lib$fn__6765.invoke (core.clj:5948)
clojure.core$load_lib.invokeStatic (core.clj:5947)
clojure.core$load_lib.doInvoke (core.clj:5928)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$load_libs.invokeStatic (core.clj:5985)
clojure.core$load_libs.doInvoke (core.clj:5969)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invokeStatic (core.clj:667)
clojure.core$require.invokeStatic (core.clj:6007)
clojure.core$require.doInvoke (core.clj:6007)
clojure.lang.RestFn.invoke (RestFn.java:408)
cider_nrepl.plugin$middleware.invokeStatic (plugin.clj:56)
cider_nrepl.plugin$middleware.invoke (plugin.clj:17)
clojure.lang.Var.invoke (Var.java:384)
leiningen.core.project$apply_middleware.invokeStatic (project.clj:817)
leiningen.core.project$apply_middleware.invoke (project.clj:810)
clojure.core.protocols$fn__8144.invokeStatic (protocols.clj:168)
clojure.core.protocols/fn (protocols.clj:124)
clojure.core.protocols$fn__8099$G__8094__8108.invoke (protocols.clj:19)
clojure.core.protocols$seq_reduce.invokeStatic (protocols.clj:31)
clojure.core.protocols$fn__8131.invokeStatic (protocols.clj:75)
clojure.core.protocols/fn (protocols.clj:75)
clojure.core.protocols$fn__8073$G__8068__8086.invoke (protocols.clj:13)
clojure.core$reduce.invokeStatic (core.clj:6828)
clojure.core$reduce.invoke (core.clj:6810)
leiningen.core.project$apply_middleware.invokeStatic (project.clj:812)
leiningen.core.project$apply_middleware.invoke (project.clj:810)
leiningen.core.project$activate_middleware.invokeStatic (project.clj:844)
leiningen.core.project$activate_middleware.invoke (project.clj:840)
leiningen.core.project$init_project.invokeStatic (project.clj:986)
leiningen.core.project$init_project.invoke (project.clj:974)
leiningen.core.project$read.invokeStatic (project.clj:1057)
leiningen.core.project$read.invoke (project.clj:1054)
leiningen.core.project$read.invokeStatic (project.clj:1058)
leiningen.core.project$read.invoke (project.clj:1054)
leiningen.core.main$_main$fn__6681.invoke (main.clj:447)
leiningen.core.main$_main.invokeStatic (main.clj:442)
leiningen.core.main$_main.doInvoke (main.clj:439)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.lang.Var.applyTo (Var.java:705)
clojure.core$apply.invokeStatic (core.clj:665)
clojure.main$main_opt.invokeStatic (main.clj:491)
clojure.main$main_opt.invoke (main.clj:487)
clojure.main$main.invokeStatic (main.clj:598)
clojure.main$main.doInvoke (main.clj:561)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.lang.Var.applyTo (Var.java:705)
clojure.main.main (main.java:37)
We want this for several reasons and even during development:
https://host/wb-1/
WEB-INF/lib
of alien Java Webapps)Merging upgrade-toolchain
currently has a a regression in this regard, as websocket repl is no longer implemented by abusing a ring-handler.
Hi, I'm excited to try out the new version of gorilla notebook. However, when I try to run the tests I get an error.
When I build the jar I get similar errors.
I still get the error after deleting .m2
dir , and on other gorilla-notebook versions.
What I don't understand is that the github ci for that commit completes the tests without problems. The older docker version also runs without problem.
Any idea what might be causing this?
Cheers
lein test
Warning: implicit hook found: lein-environ.plugin/hooks
Hooks are deprecated and will be removed in a future version.
Compiling 2 source files to /Users/keesterbrugge/code/gorilla-notebook/target/classes
Note: /Users/keesterbrugge/code/gorilla-notebook/src/java/pinkgorilla/NReplEndpoint.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Compiling 2 source files to /Users/keesterbrugge/code/gorilla-notebook/target/classes
Note: /Users/keesterbrugge/code/gorilla-notebook/src/java/pinkgorilla/NReplEndpoint.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
Testing pinkgorilla.core-test
Ran 1 tests containing 3 assertions.
0 failures, 0 errors.
Syntax error (NullPointerException) compiling at (pinkgorilla/handle_test.clj:1:1).
null
Full report at:
/var/folders/l6/xnlks1hs181039ynqpdfp1kc0000gn/T/clojure-6403240090655342054.edn
Tests failed.
Full report:
cat /var/folders/l6/xnlks1hs181039ynqpdfp1kc0000gn/T/clojure-6403240090655342054.edn
{:clojure.main/message
"Syntax error (NullPointerException) compiling at (pinkgorilla/handle_test.clj:1:1).\nnull\n",
:clojure.main/triage
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 1,
:clojure.error/column 1,
:clojure.error/source "handle_test.clj",
:clojure.error/path "pinkgorilla/handle_test.clj",
:clojure.error/class java.lang.NullPointerException},
:clojure.main/trace
{:via
[{:type clojure.lang.Compiler$CompilerException,
:message
"Syntax error compiling at (pinkgorilla/handle_test.clj:1:1).",
:data
{:clojure.error/phase :compile-syntax-check,
:clojure.error/line 1,
:clojure.error/column 1,
:clojure.error/source "pinkgorilla/handle_test.clj"},
:at [clojure.lang.Compiler load "Compiler.java" 7648]}
{:type java.lang.ExceptionInInitializerError,
:at [java.lang.Class forName0 "Class.java" -2]}
{:type java.lang.NullPointerException,
:at [clojure.java.io$resource invokeStatic "io.clj" 451]}],
:trace
[[clojure.java.io$resource invokeStatic "io.clj" 451]
[clojure.java.io$resource invokeStatic "io.clj" 450]
[clojure.java.io$resource invoke "io.clj" 446]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.java$fn__7549
invokeStatic
"java.clj"
66]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.java$fn__7549
invoke
"java.clj"
66]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.java__init
load
nil
66]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.java__init
<clinit>
nil
-1]
[java.lang.Class forName0 "Class.java" -2]
[java.lang.Class forName "Class.java" 348]
[clojure.lang.RT classForName "RT.java" 2211]
[clojure.lang.RT classForName "RT.java" 2220]
[clojure.lang.RT loadClassForName "RT.java" 2239]
[clojure.lang.RT load "RT.java" 449]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn invoke "RestFn.java" 703]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.info$loading__6721__auto____7168
invoke
"info.clj"
1]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.info__init
load
nil
1]
[cider.nrepl.inlined_deps.orchard.v0v5v3.orchard.info__init
<clinit>
nil
-1]
[java.lang.Class forName0 "Class.java" -2]
[java.lang.Class forName "Class.java" 348]
[clojure.lang.RT classForName "RT.java" 2211]
[clojure.lang.RT classForName "RT.java" 2220]
[clojure.lang.RT loadClassForName "RT.java" 2239]
[clojure.lang.RT load "RT.java" 449]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn invoke "RestFn.java" 1096]
[cider.nrepl.middleware.stacktrace$loading__6721__auto____7119
invoke
"stacktrace.clj"
1]
[cider.nrepl.middleware.stacktrace__init load nil 1]
[cider.nrepl.middleware.stacktrace__init <clinit> nil -1]
[java.lang.Class forName0 "Class.java" -2]
[java.lang.Class forName "Class.java" 348]
[clojure.lang.RT classForName "RT.java" 2211]
[clojure.lang.RT classForName "RT.java" 2220]
[clojure.lang.RT loadClassForName "RT.java" 2239]
[clojure.lang.RT load "RT.java" 449]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn invoke "RestFn.java" 482]
[pinkgorilla.middleware.cider$loading__6721__auto____6084
invoke
"cider.clj"
1]
[pinkgorilla.middleware.cider__init load nil 1]
[pinkgorilla.middleware.cider__init <clinit> nil -1]
[java.lang.Class forName0 "Class.java" -2]
[java.lang.Class forName "Class.java" 348]
[clojure.lang.RT classForName "RT.java" 2211]
[clojure.lang.RT classForName "RT.java" 2220]
[clojure.lang.RT loadClassForName "RT.java" 2239]
[clojure.lang.RT load "RT.java" 449]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn invoke "RestFn.java" 805]
[pinkgorilla.route$loading__6721__auto____9016 invoke "route.clj" 1]
[pinkgorilla.route__init load nil 1]
[pinkgorilla.route__init <clinit> nil -1]
[java.lang.Class forName0 "Class.java" -2]
[java.lang.Class forName "Class.java" 348]
[clojure.lang.RT classForName "RT.java" 2211]
[clojure.lang.RT classForName "RT.java" 2220]
[clojure.lang.RT loadClassForName "RT.java" 2239]
[clojure.lang.RT load "RT.java" 449]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn invoke "RestFn.java" 436]
[pinkgorilla.handle_test$eval488$loading__6721__auto____489
invoke
"handle_test.clj"
1]
[pinkgorilla.handle_test$eval488 invokeStatic "handle_test.clj" 1]
[pinkgorilla.handle_test$eval488 invoke "handle_test.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 7177]
[clojure.lang.Compiler eval "Compiler.java" 7166]
[clojure.lang.Compiler load "Compiler.java" 7636]
[clojure.lang.RT loadResourceScript "RT.java" 381]
[clojure.lang.RT loadResourceScript "RT.java" 372]
[clojure.lang.RT load "RT.java" 459]
[clojure.lang.RT load "RT.java" 424]
[clojure.core$load$fn__6839 invoke "core.clj" 6126]
[clojure.core$load invokeStatic "core.clj" 6125]
[clojure.core$load doInvoke "core.clj" 6109]
[clojure.lang.RestFn invoke "RestFn.java" 408]
[clojure.core$load_one invokeStatic "core.clj" 5908]
[clojure.core$load_one invoke "core.clj" 5903]
[clojure.core$load_lib$fn__6780 invoke "core.clj" 5948]
[clojure.core$load_lib invokeStatic "core.clj" 5947]
[clojure.core$load_lib doInvoke "core.clj" 5928]
[clojure.lang.RestFn applyTo "RestFn.java" 142]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$load_libs invokeStatic "core.clj" 5985]
[clojure.core$load_libs doInvoke "core.clj" 5969]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$require invokeStatic "core.clj" 6007]
[clojure.core$require doInvoke "core.clj" 6007]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.core$apply invokeStatic "core.clj" 667]
[clojure.core$apply invoke "core.clj" 660]
[user$eval334 invokeStatic "form-init2538780913966845374.clj" 1]
[user$eval334 invoke "form-init2538780913966845374.clj" 1]
[clojure.lang.Compiler eval "Compiler.java" 7177]
[clojure.lang.Compiler eval "Compiler.java" 7167]
[clojure.lang.Compiler load "Compiler.java" 7636]
[clojure.lang.Compiler loadFile "Compiler.java" 7574]
[clojure.main$load_script invokeStatic "main.clj" 475]
[clojure.main$init_opt invokeStatic "main.clj" 477]
[clojure.main$init_opt invoke "main.clj" 477]
[clojure.main$initialize invokeStatic "main.clj" 508]
[clojure.main$null_opt invokeStatic "main.clj" 542]
[clojure.main$null_opt invoke "main.clj" 539]
[clojure.main$main invokeStatic "main.clj" 664]
[clojure.main$main doInvoke "main.clj" 616]
[clojure.lang.RestFn applyTo "RestFn.java" 137]
[clojure.lang.Var applyTo "Var.java" 705]
[clojure.main main "main.java" 40]],
:phase :compile-syntax-check}}
I expected to be able to use gorilla notebook
I get an error during compilation.
lein deps
lein test
java version "1.8.0_141"
macos 10.14
SAVE Worksheet
2a: Alt G S [In an existing worksheet]
What it does: Brings up the save file box
What it should do: Save and display save success message [It already knows the filename]
2b: Alt G S [In a new worksheet]
What it should do: Should show the save dialog and save the file.
In Firefox 69 Quantum: It shows the save-file dialog but then shows the Firefox menu "History/Show All History"
This works fine in the original gorilla repl.
In LOADING files Alt G L it immediately brings the dialog. Only happens on SAVING.
2c: Alt G S [After I enter test2.clj into the file box and press enter]
Browser: Ugh, got bad response : Forbidden (403)
This message keeps staying there even after loading other files works find which should
reset that message.
2019-10-13 13:05:10,417 [figwh-httpkit-2] INFO gorilla-repl.handle - Loading: resources/gorilla-repl-client/test.clj ...
2019-10-13 13:05:10,418 [figwh-httpkit-2] INFO gorilla-repl.handle - done.
2019-10-13 13:05:28,917 [figwh-httpkit-3] WARN gorilla-repl.websocket-relay - FIXME : Channel closed, we should probably close remote connections
2019-10-13 13:05:30,236 [figwh-httpkit-1] INFO gorilla-repl.handle - Loading: resources/gorilla-repl-client/test.clj ...
2019-10-13 13:05:30,236 [figwh-httpkit-1] INFO gorilla-repl.handle - done.
The save api seems to go to a non existent endpoint.
I was pasting vega spec from some other workbook to a gorilla notebook cell. And the result that I got pasted in was different to what I had in the clipboard.
{:data {:values [ 1 2 3]}}
Was pasted as:
{:data {}}
:values []
123
My data structure was a little more complex.. So illustration only.
I think there needs to be an option to disable parinfer. When writing new code parinfee mode is a huge plus, but when using snippets it is impossible to impoet them
Ctrl g p
Toggle parinfer mode
https://gist.github.com/mfikes/e00202b2de7cc2352fedcf92b1fe60dc
show boko in notebook.
https://github.com/hiredman/clojure-dependency-grapher
hiredman/clojure-dependency-grapher: script reads the ns forms from clojure files in a directory and writes out a graph of dependences
https://github.com/alda-lang/alda
alda is a mudic composition markup.
make it playable in a notebook - this would be cool
observablehq has nicer ui:
https://observablehq.com/@observablehq/observables-not-javascript
input can be hidden for any code cell; only output is visible always.
by having this distinction, markup processing can be moved to a dedicated kernel, and
the ui for markdown is identical to the ui of other kernels.
slick white design, no massive notebook style layout. The view gets on creating a
document that also has nice clean layout, not so much on a input-output mode of operation.
when we have reagent cells I am definitely not interested to view the sourcecode definition of
how the ui component works.
code cells have an output -> the name and parameters of the functions that were
defined in the input - this is very nice view and rescues us being bothered by looking
inside the cell.
cell reordering by drag and drop (I dont think this is an immediately important feature though).
When a notebook is saved that does not correctly render reagent based components,
in the live notebook it gives an error.
But when this notebook is saved, then thereafter it can no longer be reopened AT ALL.
It needs manual patching in a text editor.
The notebook is in branch "dynamic-resolve" called notebooks/reagent-fuckup.clj
Jupyter has mime-bundle, which includes both data and javascript.
We need to do something longterm with this.
Perhaps we should include in the notebook both the compiled javascript, and
the data? Or we include plugin function name and plugin version name to render the data.
If the viewer works only with requirejs and the bundle (which excludes the dependency to
say the full vega library), then we only need to store in the notebook the code that was used
to load the renderers with the external dependencies.
def repr_mimebundle(self, include=None, exclude=None):
"""Display the visualization in the Jupyter notebook."""
id = uuid.uuid4()
return (
{'application/javascript': self._generate_js(id)},
{'jupyter-vega': '#{0}'.format(id)},
)
Appears it will be travis...
DSL that creates Vega spec.
Similar idea and design as gorilla-plot.
https://github.com/dvdt/xvsy
https://github.com/dvdt/xvsy/tree/master/src/front-end
https://github.com/dvdt/gyptis/blob/master/src/cljc/gyptis/vega_templates.cljc
https://github.com/dvdt/gyptis/blob/master/examples/gyptis-usage/src/gyptis_usage/vega_interop.clj
Make it work with pink-gorilla.
Discovery (make reagent components discoverable by name)
A) Sync atoms two way and unidirectional.
Helper library to start sync.
B) Helper library to trigger atom syncing.
This is a meta syntax we need while we dont have clojurescript in notebook.
we could use gered:
https://github.com/gered/views.reagent/blob/master/views.reagent/src/views/reagent/client/component.clj
https://github.com/gered/views.reagent/blob/master/examples/todomvc-browserchannel/src/todomvc/client.cljs
We could use replikativ:
https://github.com/replikativ/chat42/blob/master/src/cljs/chat42/core.cljs
Should be easy to integrate:
http://borisyankov.github.io/react-sparklines/
There is a R wrapper for this also. So 2 things:
a) Understand how reactR works
b) Steal implementation if it is done well
c) Find more reactR components that are cool for data visualizaion
https://react-r.github.io/reactR/articles/intro_htmlwidgets.html
Startup Picture not showing (Picture not included or not served by ring ?)
I saw SandDance 3 by Microsoft a while ago, that’s a library that seem to cover your use case, since it’s designed to render huge amounts of data — in the browser, using GPU.
Open source react component that can, that can render millions of rows, also has
3d graphics.
Workbook content not showing on workbook load.
The file "examples/image-safe.clj" (the file is added in my pull request)
contains several cells with comments and code.
This content can be seen in the workbook file with
cat examples/image-safe.clj
But it does not show up on loading the workbook.
We should be aiming for a smooth transition without to many sacrifes along the way.
In that sense, it appears reasonable to stick with leiningen based dependencies first and run shadow-cljs like this:
lein run -m shadow.cljs.devtools.cli watch app
Issues I found along the way:
Recent versions of shadow-cljs
(2.8.78) require more recent version of Closure than current ClojureScript (1.10.597) so we should probably exclude Closure Deps from ClojureScript at this time.
We need replacements for figwheel auto-testing and devcards.
We should make all connections (websocket and raw tcp/nrepl) as fault tolerant as possible.Network partition should be handled gracefully (try reconnecting really hard, maybe even buffer requests here and there).
At this time we see jetty closing the websocket due to idle timeouts:
Close 1001 java.util.concurrent.TimeoutException: Idle timeout expired: 500001/500000 ms
We see various issues bootstrapping libpython and numpy. We consider numpy and pandas essential with regards to python conversions.
Appears current version [cnuernber/libpython-clj "1.13"]
has a strict python3.6 requirement and Ubuntu has special lib_apt quirks. Had a hard time figuring things out on Ubuntu 19.10.
Other than that, it appears dynamical (pomegranate based) loading it from the repl does not work either.
Python initialization somehow working
Python initialization failing
libpython-1.13
E.g. 1.8
n/a
core.cljs:3718 re-frame: no :event handler registered for: :palette-blurcljs.core.apply.cljs$core$IFn$_invoke$arity$2 @ core.cljs:3718cljs$core$apply @ core.cljs:3709re_frame.loggers.console.cljs$core$IFn$_invoke$arity$variadic @ loggers.cljc:38re_frame$loggers$console @ loggers.cljc:35re_frame.registrar.get_handler.cljs$core$IFn$_invoke$arity$3 @ registrar.cljc:31re_frame$registrar$get_handler @ registrar.cljc:18re_frame$events$handle @ events.cljc:55re_frame.router.EventQueue.re_frame$router$IEventQueue$_process_1st_event_in_queue$arity$1 @ router.cljc:169re_frame$router$_process_1st_event_in_queue @ router.cljc:82re_frame.router.EventQueue.re_frame$router$IEventQueue$_run_queue$arity$1 @ router.cljc:188re_frame$router$_run_queue @ router.cljc:84(anonymous function) @ router.cljc:140re_frame.router.EventQueue.re_frame$router$IEventQueue$_fsm_trigger$arity$3 @ router.cljc:159re_frame$router$_fsm_trigger @ router.cljc:78(anonymous function) @ router.cljc:177channel.port1.onmessage @ nexttick.js:211 core.cljs:3718 Handling re-frame event: [:app:commands]
Service worker (js)
lein assets compress
Fix lein ring uberwar
Deploy on heroku
Add PWA stuff
Enable standalone jar "drop in other webapp extension deployment"
Everything marked with TODO in the code
Introduce next gen clj native worksheet persistence, save uuid to allow references
Implement render/db tests, re-frame
Revisit (Clo)Jupyter
test, devcards TDD
Implement specs
Implement viewer
Explore local (brower repl/kernel)
Drop in uberjar (with min aot)
prod build
Enable clipboard
Enable config / parinfer (optionally)
Build docker image allowing drop in jars (via volume)
Introduce com.stuartsierra.component, maybe tesla ms
Enable travis
Try out dirac devtools
Use timbre logging
Fix Websocket failure handling/reconnect
Authentication/Authorization
POC Sparking/big data
Kill long running threads on server
Use the template below when reporting bugs. Please, make sure that you're
running the latest stable release or the latest snapshot/pre-release of
gorilla-notebook
and that the problem you're reporting hasn't been reported (and
potentially fixed) already.
This is extremely important! Providing us with a reliable way to reproduce
a problem will expedite its solution.
E.g. 0.11.2
E.g. 1.8
E.g. Windows 10
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.