tailrecursion / boot Goto Github PK
View Code? Open in Web Editor NEWA Clojure build tool
License: Eclipse Public License 1.0
A Clojure build tool
License: Eclipse Public License 1.0
I'm stuck with boot-1.1.1.jar; how do i get access to the 2.0.0 version? Thanks!
Hi,
just tried 1.0.3 to see if issue #10 disappeared. I hope this is not again some Windows issue which is harder to test for you, but for some reason a 'boot dev' for instance in hoplife throws an FileNotFoundException for pomegranate_init:
java.io.FileNotFoundException: Could not locate cemerick/pomegranate__init.class or cemerick/pomegranate.clj on classpath:
at clojure.lang.RT.load (RT.java:443)
clojure.lang.RT.load (RT.java:411)
clojure.core$load$fn__5018.invoke (core.clj:5530)
clojure.core$load.doInvoke (core.clj:5529)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invoke (core.clj:5336)
clojure.core$load_lib$fn__4967.invoke (core.clj:5375)
clojure.core$load_lib.doInvoke (core.clj:5374)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invoke (core.clj:619)
clojure.core$load_libs.doInvoke (core.clj:5413)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invoke (core.clj:619)
clojure.core$require.doInvoke (core.clj:5496)
clojure.lang.RestFn.invoke (RestFn.java:619)
tailrecursion.boot.core$eval40$loading__4910__auto____41.invoke (core.clj:10)
tailrecursion.boot.core$eval40.invoke (core.clj:10)
clojure.lang.Compiler.eval (Compiler.java:6619)
clojure.lang.Compiler.eval (Compiler.java:6608)
clojure.lang.Compiler.load (Compiler.java:7064)
clojure.lang.RT.loadResourceScript (RT.java:370)
clojure.lang.RT.loadResourceScript (RT.java:361)
clojure.lang.RT.load (RT.java:440)
clojure.lang.RT.load (RT.java:411)
clojure.core$load$fn__5018.invoke (core.clj:5530)
clojure.core$load.doInvoke (core.clj:5529)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invoke (core.clj:5336)
clojure.core$load_lib$fn__4967.invoke (core.clj:5375)
clojure.core$load_lib.doInvoke (core.clj:5374)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invoke (core.clj:619)
clojure.core$load_libs.doInvoke (core.clj:5413)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invoke (core.clj:619)
clojure.core$require.doInvoke (core.clj:5496)
clojure.lang.RestFn.invoke (RestFn.java:930)
tailrecursion.boot$eval3$loading__4910__auto____4.invoke (boot.clj:9)
tailrecursion.boot$eval3.invoke (boot.clj:9)
clojure.lang.Compiler.eval (Compiler.java:6619)
clojure.lang.Compiler.eval (Compiler.java:6608)
clojure.lang.Compiler.load (Compiler.java:7064)
clojure.lang.RT.loadResourceScript (RT.java:370)
clojure.lang.RT.loadResourceScript (RT.java:361)
clojure.lang.RT.load (RT.java:440)
clojure.lang.RT.load (RT.java:411)
clojure.core$load$fn__5018.invoke (core.clj:5530)
clojure.core$load.doInvoke (core.clj:5529)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invoke (core.clj:5336)
clojure.core$load_lib$fn__4967.invoke (core.clj:5375)
clojure.core$load_lib.doInvoke (core.clj:5374)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invoke (core.clj:619)
clojure.core$load_libs.doInvoke (core.clj:5413)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invoke (core.clj:619)
clojure.core$require.doInvoke (core.clj:5496)
clojure.lang.RestFn.invoke (RestFn.java:408)
tailrecursion.boot.loader$_main.doInvoke (loader.clj:186)
clojure.lang.RestFn.applyTo (RestFn.java:137)
tailrecursion.boot.loader.main (:-1)
pomegranate 0.2.0 is in .m2, so maybe something during the classloader magic is not working properly. I thought that something from the classloader uberjar might be missing in the uberjar build for boot itself. Adding
[com.cemerick/pomegranate "0.2.0" :exclusions [org.clojure/clojure]]
[digest "1.4.3"]
to the boot dependencies helps. Adding pomegranate makes somewhat sense, then digest_init came up, so I added this one, even thought I didn't find the dependency to digest somewhere.
the #10 problem is still there, but Micha Niskin wrote this fix is supposed to be in dev branch, so maybe shouldn't have been fixed yet in master anyway.
this expected "error" should be handled internally to output a message such as
tailrecursion/boot.core/2.5.0/boot.core-2.5.0.jar retrieved from <repo>.
instead of
Error: Could not find artifact tailrecursion:boot.core:jar:2.5.0 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving tailrecursion/boot.core/2.5.0/boot.core-2.5.0.jar from http://clojars.org/repo/
as an inexperienced clojure developer nervously trying boot for the first time, i find errors emanating from this new build tool very scary.
Trying to do boot development
for hoplon-demos and ran into this. I tried infinite-scroll and plotSVG.
I'm not sure why.
java.lang.RuntimeException: No reader function for tag tailrecursion.boot.core/version
...
clojure.core/read-string core.clj: 3497
boot.util/read-string-all util.clj: 134
boot.main/-main main.clj: 104
...
boot.App.runBoot App.java: 217
boot.App.main App.java: 309
I'm running Mac OSX Yosemite with:
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Hi, I am trying to follow the given tutorial.
But when I do ./boot development
with
boot: can't use boot.core version : need at least 2.0.0
java.lang.RuntimeException: No reader function for tag tailrecursion.boot.core/version
I am running this on
Any help would be much appreciated.
java.lang.RuntimeException: Invalid token: Error:
at clojure.lang.Util.runtimeException (Util.java:219)
clojure.lang.LispReader.interpretToken (LispReader.java:326)
clojure.lang.LispReader.read (LispReader.java:211)
clojure.lang.LispReader.readDelimitedList (LispReader.java:1157)
clojure.lang.LispReader$ListReader.invoke (LispReader.java:982)
clojure.lang.LispReader.read (LispReader.java:185)
clojure.lang.RT.readString (RT.java:1738)
clojure.core$read_string.invoke (core.clj:3427)
tailrecursion.boot.loader$_main.doInvoke (loader.clj:169)
clojure.lang.RestFn.applyTo (RestFn.java:137)
tailrecursion.boot.loader.main (:-1)
build.boot
Error: Could not find artifact tailrecursion:ancient-clj:jar:0.1.7 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving org/apache/httpcomponents/httpclient/4.3.1/httpclient-4.3.1.jar from http://repo1.maven.org/maven2/
Error: Could not find artifact clj-http:clj-http:jar:0.7.8 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving org/apache/httpcomponents/httpmime/4.3.1/httpmime-4.3.1.jar from http://repo1.maven.org/maven2/
Retrieving org/apache/httpcomponents/httpcore/4.3/httpcore-4.3.jar from http://repo1.maven.org/maven2/
Retrieving commons-io/commons-io/2.4/commons-io-2.4.jar from http://repo1.maven.org/maven2/
Error: Could not find artifact slingshot:slingshot:jar:0.10.3 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Error: Could not find artifact cheshire:cheshire:jar:5.2.0 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving com/fasterxml/jackson/core/jackson-core/2.2.1/jackson-core-2.2.1.jar from http://repo1.maven.org/maven2/
Retrieving com/fasterxml/jackson/dataformat/jackson-dataformat-smile/2.2.1/jackson-dataformat-smile-2.2.1.jar from http://repo1.maven.org/maven2/
Error: Could not find artifact tigris:tigris:jar:0.1.1 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving org/jsoup/jsoup/1.7.1/jsoup-1.7.1.jar from http://repo1.maven.org/maven2/
Retrieving org/clojure/tools.reader/0.8.1/tools.reader-0.8.1.jar from http://repo1.maven.org/maven2/
Retrieving commons-codec/commons-codec/1.8/commons-codec-1.8.jar from http://repo1.maven.org/maven2/
Error: Could not find artifact crouton:crouton:jar:0.1.1 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar from http://repo1.maven.org/maven2/
Retrieving tailrecursion/ancient-clj/0.1.7/ancient-clj-0.1.7.jar from http://clojars.org/repo/
Retrieving clj-http/clj-http/0.7.8/clj-http-0.7.8.jar from http://clojars.org/repo/
Retrieving cheshire/cheshire/5.2.0/cheshire-5.2.0.jar from http://clojars.org/repo/
Retrieving slingshot/slingshot/0.10.3/slingshot-0.10.3.jar from http://clojars.org/repo/
Retrieving tigris/tigris/0.1.1/tigris-0.1.1.jar from http://clojars.org/repo/
Retrieving crouton/crouton/0.1.1/crouton-0.1.1.jar from http://clojars.org/repo/!/usr/bin/env boot
(set-env!
:project
'my-project
:version
"0.1.0-SNAPSHOT"
:dependencies
[['tailrecursion/boot.core "2.0.0"]
['tailrecursion/boot.task "2.0.0"]
['tailrecursion/hoplon "5.0.0"]
['org.clojure/clojurescript "0.0-2156"]]
:src-paths
#{"src"}
:out-path
"resources/public")
(require
['tailrecursion.hoplon.boot :refer :all]
['tailrecursion.boot.task :refer :all])
boot.edn
{:project my-project
:version "0.1.0-SNAPSHOT"
:dependencies [[tailrecursion/boot.core "1.2.3"]
[tailrecursion/boot.task "1.0.2"]
[tailrecursion/hoplon "4.0.12"]
[org.clojure/clojurescript "0.0-2156"]]
:require-tasks #{[tailrecursion.boot.task :refer :all]
[tailrecursion.hoplon.boot :refer :all]}
:public "resources/public"
:src-paths #{"src"}}
Hi,
I love boot and have only one comment.
Would it be possible to drop the constraint on the script extension? Not sure about others but I am perfectly happy with the clj extension for Clojure programs/scripts.
Thanks
Dimitar
to reproduce, create a project with the following build script:
(set-env!
:src-paths #{"src"}
:tgt-path "tgt"
:dependencies '[[org.apache.tomcat.embed/tomcat-embed-jasper "8.0.8"]
[org.apache.tomcat.embed/tomcat-embed-logging-juli "8.0.8"]
[org.apache.tomcat.embed/tomcat-embed-core "8.0.8"] ])
(task-options!
watch [:quiet false]
speak [:theme "ordinance"]
pom [:project 'tailrecursion/boot.worker.tomcat
:version "0.1.0-SNAPSHOT"
:description "Boot worker to create a standalone Tomcat server."
:url "http://github.com/tailrecursion/boot.task.tomcat"
:scm {:url "https://github.com/tailrecursion/boot.task.tomcat"}
:license {:name "Eclipse Public License"
:url "http://www.eclipse.org/legal/epl-v10.html"} ])
then launch the repl:
boot.user=> (import 'org.apache.catalina.startup.Tomcat)
org.apache.catalina.startup.Tomcat
boot.user=> (require '[clojure.java.io :as io])
nil
boot.user=> (defn create [dir war port]
#_=> (.mkdirs (io/file dir "webapps"))
#_=> (doto (Tomcat.)
#_=> (.setBaseDir dir)
#_=> (.setPort port)
#_=> (.addWebapp "" war)
#_=> (.start) ))
#'boot.user/create
boot.user=> (def server (create "basedir" "my.war" 8888))
Sep 11, 2014 1:06:02 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8888"]
Sep 11, 2014 1:06:02 AM org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
INFO: Using a shared selector for servlet write/read
Sep 11, 2014 1:06:02 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Sep 11, 2014 1:06:02 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.0.8
Sep 11, 2014 1:06:03 AM org.apache.catalina.startup.ContextConfig getDefaultWebXmlFragment
INFO: No global web.xml found
Sep 11, 2014 1:06:03 AM org.apache.tomcat.util.digester.Digester endElement
SEVERE: End event threw exception
java.lang.ClassNotFoundException: org.apache.tomcat.util.descriptor.web.ServletDef
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1333)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1180)
at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:355)
at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:145)
at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:959)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1786)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2951)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:846)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:775)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:628)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1457)
at org.apache.tomcat.util.descriptor.web.WebXmlParser.parseWebXml(WebXmlParser.java:120)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1104)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:303)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5069)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
after hacking about in the repl a bit, i typed exit, then ^C, then ^C, then ^C:
boot.user=> exit
NoClassDefFoundError net/cgrand/parsley/lrplus/TableState$reify__2701
net.cgrand.parsley.lrplus.TableState (lrplus.clj:23)
clojure.lang.KeywordLookupSite.install (KeywordLookupSite.java:52)
clojure.lang.KeywordLookupSite.fault (KeywordLookupSite.java:26)
net.cgrand.parsley.lrplus/step1 (lrplus.clj:165)
net.cgrand.parsley.lrplus/step (lrplus.clj:190)
net.cgrand.parsley/stepper/self--3577 (parsley.clj:39)
net.cgrand.parsley/stepper/self--3577 (parsley.clj:36)
reply.parsing/reparse (parsing.clj:25)
reply.parsing/parsed-forms (parsing.clj:62)
reply.eval-modes.nrepl/run-repl (nrepl.clj:131)
reply.eval-modes.nrepl/main (nrepl.clj:233)
reply.main/launch-nrepl/fn--4269 (main.clj:78)
Caused by:
ClassNotFoundException net.cgrand.parsley.lrplus.TableState$reify__2701
java.net.URLClassLoader$1.run (URLClassLoader.java:366)
java.net.URLClassLoader$1.run (URLClassLoader.java:355)
java.security.AccessController.doPrivileged (AccessController.java:-2)
java.net.URLClassLoader.findClass (URLClassLoader.java:354)
java.lang.ClassLoader.loadClass (ClassLoader.java:424)
java.lang.ClassLoader.loadClass (ClassLoader.java:357)
net.cgrand.parsley.lrplus.TableState (lrplus.clj:23)
clojure.lang.KeywordLookupSite.install (KeywordLookupSite.java:52)
Bye for now!
Exception in thread "main" java.lang.NoClassDefFoundError: boot/main$_main$fn__809
at boot.main$_main.invoke(main.clj:76)
at clojure.lang.Var.invoke(Var.java:379)
at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:91)
at org.projectodd.shimdandy.impl.ClojureRuntimeShimImpl.invoke(ClojureRuntimeShimImpl.java:84)
at boot.App.main(App.java:185)
Caused by: java.lang.ClassNotFoundException: boot.main$_main$fn__809
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 5 more
Exception in thread "SIGINT handler" java.lang.NoClassDefFoundError: reply/eval_modes/nrepl$handle_client_interruption_BANG_$fn__3843$fn__3844
at reply.eval_modes.nrepl$handle_client_interruption_BANG_$fn__3843.invoke(nrepl.clj:37)
at reply.eval_modes.nrepl.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
at sun.misc.Signal$1.run(Signal.java:212)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.ClassNotFoundException: reply.eval_modes.nrepl$handle_client_interruption_BANG_$fn__3843$fn__3844
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 4 more
Exception in thread "SIGINT handler" java.lang.NoClassDefFoundError: reply/eval_modes/nrepl$handle_client_interruption_BANG_$fn__3843$fn__3844
at reply.eval_modes.nrepl$handle_client_interruption_BANG_$fn__3843.invoke(nrepl.clj:37)
at reply.eval_modes.nrepl.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
at sun.misc.Signal$1.run(Signal.java:212)
at java.lang.Thread.run(Thread.java:724)
Exception in thread "SIGINT handler" java.lang.NoClassDefFoundError: reply/eval_modes/nrepl$handle_client_interruption_BANG_$fn__3843$fn__3844
at reply.eval_modes.nrepl$handle_client_interruption_BANG_$fn__3843.invoke(nrepl.clj:37)
at reply.eval_modes.nrepl.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
at sun.misc.Signal$1.run(Signal.java:212)
at java.lang.Thread.run(Thread.java:724)
Exception in thread "SIGINT handler" java.lang.NoClassDefFoundError: reply/eval_modes/nrepl$handle_client_interruption_BANG_$fn__3843$fn__3844
at reply.eval_modes.nrepl$handle_client_interruption_BANG_$fn__3843.invoke(nrepl.clj:37)
at reply.eval_modes.nrepl.proxy$java.lang.Object$SignalHandler$d8c00ec7.handle(Unknown Source)
at sun.misc.Signal$1.run(Signal.java:212)
at java.lang.Thread.run(Thread.java:724)
Hi,
I'm really looking forward to playing with Hoplon, but I'm having some trouble getting boot up and running. Trying to run 'boot' with the edn file in fixtures throws the following (from boot/test/fixtures):
Exception in thread "main" clojure.lang.ArityException: Wrong number of args (0) passed to: loader$-main
Trying to run 'boot' from a newly generated hoplon app folder throws the same error.
Trying to run 'boot help' to make sure I'm not missing any flags throws:
Exception in thread "main" clojure.lang.ArityException: Wrong number of args (1) passed to: loader$-main
And finally, trying to run 'boot watch hoplon' from a newly generated hoplon app folder throws:
Error: Could not find artifact tailrecursion:boot.core:jar:watch in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Error: Could not find artifact tailrecursion:boot.core:jar:watch in http://clojars.org/repo/ (http://clojars.org/repo/)
Is this just me? If so, any advice for what I'm missing here?
If I have datomic-free (any version, it seems) as a dependency, I get this output when I run boot:
$ boot development
org.apache.commons.codec.binary.Base32
If I remove the datomic dependency, like so:
:dependencies '[[tailrecursion/boot.task "2.2.1"]
[tailrecursion/hoplon "5.10.8"]
[org.clojure/clojurescript "0.0-2234"]
[tailrecursion/boot.ring "0.2.1"]
#_[com.datomic/datomic-free "0.9.4815.12"]
[datascript "0.1.6"]
[org.clojure/algo.generic "0.1.2"]
[lein-light-nrepl "0.0.18"]
[org.clojure/tools.nrepl "0.2.3"]]
then it works fine:
$ boot development
Compiling Hoplon dependencies...
Jetty server stored in atom here: #'tailrecursion.boot.task.ring/server...
nrepl running on 56592
Compiling Hoplon pages...
• src/hl/testing_hoplon_castra/index.cljs.hl
Compiling ClojureScript...
I installed the latest boot
using the Arch User Repository. I created a project directory using lein new hoplon foo
in a Sparkleshare folder.
.
|-- assets
| `-- css
| `-- main.css
|-- build.boot
|-- .empty
|-- .gitignore
|-- README.md
`-- src
`-- index.cljs.hl
Sparkleshare uses Git, which is why .empty
files are created. After running boot development
, this is what the directory looks like:
.
|-- assets
| `-- css
| `-- main.css
|-- .boot
| |-- boot-classloader.jar
| |-- .empty
| `-- tmp
| `-- 26666
| |-- _COLON_tailrecursion.boot_SLASH_bootscript
| | `-- dir.tmp
| | `-- tailrecursion
| | `-- boot
| | `-- user.clj
| |-- _COLON_tailrecursion.boot.task_SLASH_cljs_stage
| | `-- dir.tmp
| | |-- .empty
| | `-- main.js
| |-- _COLON_tailrecursion.boot.task_SLASH_ext_out
| | `-- dir.tmp
| | |-- 0000000002_jquery.ext.js
| | `-- .empty
| |-- _COLON_tailrecursion.boot.task_SLASH_flib_out
| | `-- dir.tmp
| | `-- .empty
| |-- _COLON_tailrecursion.boot.task_SLASH_inc_out
| | `-- dir.tmp
| | |-- 0000000001_jquery.inc.js
| | `-- .empty
| |-- _COLON_tailrecursion.boot.task_SLASH_lib_out
| | `-- dir.tmp
| | `-- .empty
| |-- _COLON_tailrecursion.boot.task_SLASH_output_dir
| | `-- dir.tmp
| | |-- cljs
| | | |-- core.cljs
| | | |-- core.js
| | | |-- reader.cljs
| | | `-- reader.js
| | |-- clojure
| | | |-- string.cljs
| | | `-- string.js
| | |-- .empty
| | `-- tailrecursion
| | |-- hoplon
| | | `-- app_pages
| | | |-- .empty
| | | `-- _index_DOT_html.js
| | |-- hoplon.cljs
| | |-- hoplon.js
| | |-- javelin.cljs
| | |-- javelin.js
| | |-- priority_map.cljs
| | `-- priority_map.js
| |-- _COLON_tailrecursion.hoplon.boot_SLASH_cljs_out
| | `-- dir.tmp
| | `-- .empty
| |-- _COLON_tailrecursion.hoplon.boot_SLASH_hoplon_src
| | `-- dir.tmp
| | `-- .empty
| |-- _COLON_tailrecursion.hoplon.boot_SLASH_phantom_tmp1
| | `-- dir.tmp
| | `-- render.js
| |-- _COLON_tailrecursion.hoplon.boot_SLASH_phantom_tmp2
| | `-- dir.tmp
| | `-- .empty
| |-- _COLON_tailrecursion.hoplon.boot_SLASH_public_out
| | `-- dir.tmp
| | |-- .empty
| | `-- index.html
| `-- .delete-me
|-- build.boot
|-- .empty
|-- .gitignore
|-- README.md
|-- resources
| `-- public
| |-- css
| | `-- main.css
| |-- .empty
| |-- index.html
| `-- main.js
`-- src
`-- index.cljs.hl
The compilation runs, but for some reason the contents of the .empty
files is injected at the top of the main.js
file:
$ head -1 resources/public/main.js
I'm a folder!
Manually deleting the .empty
files fixes the issue, but its unclear why they interfere with the working of boot
in the first place.
the java boot loader needs to look up an env var to get the correct repo location in this case.
this is obviously a bug because these annoy me when i look at them.
discussed with micha. smoking weed might be a fix of sorts, but not a viable solution. subsequently suggested approach involves having "-main use a java tempfile instead of a boot tempfile so that boot dirs won't be created unless a task makes tempfile".
ANSI-colored output makes certain text unreadable, or even disrupts completely proper printout on Windows console - eg. when there is period since last action printed each second - ANSI codes disrupts printing over same piece of text ,and instead fills complete console with formatted period text over time.
Here's an example of output:
Compiling Hoplon pages...
Ľ src\index.cljs.hl
Compiling ClojureScript...
←[34m? Elapsed time: 13,318 sec Ť←[33m 00:00:00 00:00:13 00:00:13 00:00:14 00:00:14 00:00:1 00:00:16 00:00:16 00:00:16 00:00:17 00:00:17 00:00:17 00:00:17 00:00:18 00:00:18 00:00:18 0 00:00:20 00:00:20 00:00:20 00:00:21 00:00:21 00:00:21 00:00:21 00:00:22 00:00:22 00:00:22 0
So the solution would be to avoid using ANSI codes altogether, or to differentiate output based on OS..
There are lot of JS libraries that are written to only work with browserify (such as snabbdom). There is a CDN called wzrd.in for browserify modules, but it's poorly implemented. I've barely used it and I've had multiple issues with it. It doesn't support peer dependencies (which motor/cycle needs) or choosing the entry point (which snabbdom needs). It also doesn't bundle the way browserify does, it just concatenates multiple standalone bundles, which can result in unusual behavior, and the author made it clear that he doesn't want to fix it.
I propose having a browserify
boot task that can make the process of including those libraries simpler.
Node, npm and browserify would be installed on the CLJSJS end. Then the task would just install the package and run the globally installed browserify task with the given params, so it shouldn't be too hard to implement.
The task can take in the browserify optional and required parameters: entry points, the UMD module name, and output file (see usage).
For example:
(browserify :package "snabbdom" :entry "modules/class.js" :standalone "snabbdom_class" :out "snabbdom-class.js")
Which would do this under the hood:
$ npm install snabbdom
$ browserify node_modules/snabbdom/modules/class.js --standalone snabbdom_class -o snabbdom-class.js
Then it would be easy to include browserify modules like snabbdom, by just running the browserify
task for all of the entry points/submodules it provides (class, props, style, events, and h), concatenating and miniftying it, and the you're done.
Using a similar build.boot as in demos/hoplife, I have the browser auto-refreshing when I change *.cljs.hl files.
(set-env!
:dependencies (read-string (slurp "deps.edn"))
:src-paths #{"src"}
:out-path "resources/public")
(add-sync! (get-env :out-path) #{"resources/assets"})
(deftask development
"Build for development"
[& args]
(comp
(watch)
#_(hear)
(hoplon {:prerender false})
(dev-server)))
When I make changes to resources/assets/main.css it takes between 0.5 and 3 seconds for the copying of files to the out-path and refreshing of the browser to happen. This is just too long comparing with a normal set up with for instance gulp. Is this the expected time to wait? Any way to make it faster?
EDIT:
I've investigated it further and the problem seems to be with chrome. Firefox refreshes the style instantaneously but Chrome does not refresh it at all. Chrome only refresh the style on mouse enter. That is, if I hover my mouse over the page in the chrome window, then (and only then) it refreshes... Known issue? (Tested with Chrome 35 and 37)
I have noticed that when running boot watch hoplon, bower install
fails to install files (while successfully creating a directory structure) inside the :public directory specified in my boot.edn.
When I try to run the hoplon examples with boot, it just sits there for a very long time, which, after the subsequent stack trace, looks to be 4 retry timeouts.
I am behind a corporate proxy, I have environment settings for proxies that Leiningen seems to understand but boot does not.
It would be nice if:
On a side note, I'm sure you have some very good reasons for why boot isn't just a plugin for leiningen.. care to share what those are?
When I add [itsy "0.1.1"] to the dependencies in the build.boot, it fails to start with boot development
.
Can you reproduce this event?
the project root should not be a dumping ground for any task's persistence, to include nrepl.
the only drawback i can think of is lein nrepl -> boot nrepl history sharing, but this seems like it will be an extremely rare and unnecessary case once boot 2 is up to speed; users will configure their project for one build tool or the other.
The build and install instructions using make for v 1.0.2 work for me (Mac OS X v. 10.9), but they don't work for the latest version of boot v 1.0.3
alan@cheezit:~$ boot :strap > new
alan@cheezit:~$ cat new
Error: Could not find artifact tailrecursion:ancient-clj:jar:0.1.7 in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Retrieving tailrecursion/ancient-clj/0.1.7/ancient-clj-0.1.7.jar from http://clojars.org/repo/
#!/usr/bin/env boot
#tailrecursion.boot.core/version "2.0.0"
Trying to install boot from source, I the following error running ./boot
after install with make boot
.
Exception in thread "main" java.lang.AssertionError: Assert failed: boot.edn (Configuration must be a map)
(map? p1__403#)
at tailrecursion.boot.loader$read_config$asrt_m__405.invoke(loader.clj:43)
at tailrecursion.boot.loader$read_config.invoke(loader.clj:44)
at tailrecursion.boot.loader$_main.doInvoke(loader.clj:100)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at tailrecursion.boot.loader.main(Unknown Source)`
Is it possible to integrate boot as a whole into Lein? 😄
Maybe it can be a implemented as Lein plugin too.
I'm just asking this as the Clojure community already has a great build and dependency tool - Leiningen. Boot does add interesting functionality, such as :require-tasks
and use of EDN format. Perhaps it can be made into a plugin, so that users don't have to use two build tools when working with projects that use boot.
SEVERE: Request Failed.
org.jets3t.service.S3ServiceException: S3 Error Message. GET '/snapshot%2Ftailrecursion%2Fclojure-adapter-servlet%2F0.1.0-SNAPSHOT%2Fmaven-metadata.xml' on Host '.repository.s3.amazonaws.com' @ 'Fri, 03 Oct 2014 15:30:57 GMT' -- ResponseCode: 403, ResponseStatus: Forbidden, XML Error Message: AccessDenied
Access DeniedE7EDF9C66A8B855DU40MhHaosnmvEeU0X8l6wOpNbNY75pcRHaiN6ELQaREnknbQi5bKkRTSdWRPugIK
at org.jets3t.service.impl.rest.httpclient.RestS3Service.performRequest(RestS3Service.java:441)
at org.jets3t.service.impl.rest.httpclient.RestS3Service.performRestGet(RestS3Service.java:876)
at org.jets3t.service.impl.rest.httpclient.RestS3Service.getObjectImpl(RestS3Service.java:1712)
at org.jets3t.service.impl.rest.httpclient.RestS3Service.getObjectImpl(RestS3Service.java:1655)
at org.jets3t.service.S3Service.getObject(S3Service.java:2215)
at org.jets3t.service.S3Service.getObject(S3Service.java:1424)
at org.springframework.aws.maven.SimpleStorageServiceWagon.getResource(SimpleStorageServiceWagon.java:93)
at org.springframework.aws.maven.AbstractWagon.get(AbstractWagon.java:184)
at org.sonatype.aether.connector.wagon.WagonRepositoryConnector$GetTask.run(WagonRepositoryConnector.java:601)
at org.sonatype.aether.util.concurrency.RunnableErrorForwarder$1.run(RunnableErrorForwarder.java:60)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
I'm trying to use boot, and have used the boot.edn
file from the Hoplon docs at http://hoplon.io/#/getting-started/.
Whenever I run boot
, I get this stacktrace:
Exception in thread "main" java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at clojure.lang.RT.loadClassForName(RT.java:2098)
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
at clojure.core$load_lib.doInvoke(core.clj:5374)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5413)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$require.doInvoke(core.clj:5496)
at clojure.lang.RestFn.invoke(RestFn.java:512)
at tailrecursion.boot$loading__4910__auto__.invoke(boot.clj:9)
at tailrecursion.boot__init.load(Unknown Source)
at tailrecursion.boot__init.<clinit>(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at clojure.lang.RT.loadClassForName(RT.java:2098)
at clojure.lang.RT.load(RT.java:430)
at clojure.lang.RT.load(RT.java:411)
at clojure.core$load$fn__5018.invoke(core.clj:5530)
at clojure.core$load.doInvoke(core.clj:5529)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invoke(core.clj:5336)
at clojure.core$load_lib$fn__4967.invoke(core.clj:5375)
at clojure.core$load_lib.doInvoke(core.clj:5374)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$load_libs.doInvoke(core.clj:5413)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invoke(core.clj:619)
at clojure.core$require.doInvoke(core.clj:5496)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at tailrecursion.boot.loader$_main.doInvoke(loader.clj:65)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at tailrecursion.boot.loader.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: java.nio.file.FileSystems
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:171)
at tailrecursion.boot.gitignore$loading__4910__auto__.invoke(gitignore.clj:9)
at tailrecursion.boot.gitignore__init.load(Unknown Source)
at tailrecursion.boot.gitignore__init.<clinit>(Unknown Source)
... 42 more
sudo make boot
is failing with an error after downloading libraries
acron@laptop:$ sudo make boot
[sudo] password for acron:
rm -f boot
lein clean
WARNING: You're currently running as root; probably by accident.
Press control-C to abort or Enter to continue as root.
Set LEIN_ROOT to disable this warning.
lein uberjar
WARNING: You're currently running as root; probably by accident.
Press control-C to abort or Enter to continue as root.
Set LEIN_ROOT to disable this warning.
Copying 30 files to /media/acron/projects/Libraries/boot/lib
Compiling tailrecursion.boot.loader
Compiling tailrecursion.boot.loader
Compiling tailrecursion.boot.semver
Compilation succeeded.
Created /media/acron/projects/Libraries/boot/boot-0.3.0.jar
Including boot-0.3.0.jar
Including aether-api-1.13.1.jar
Including aether-connector-file-1.13.1.jar
Including aether-connector-wagon-1.13.1.jar
Including aether-impl-1.13.1.jar
Including aether-spi-1.13.1.jar
Including aether-util-1.13.1.jar
Including clojure-1.5.1.jar
Including commons-codec-1.4.jar
Including commons-io-2.0.1.jar
Including commons-logging-1.1.1.jar
Including digest-1.4.3.jar
Including dynapath-0.2.3.jar
Including httpclient-4.1.2.jar
Including httpcore-4.1.2.jar
Including jsoup-1.6.1.jar
Including maven-aether-provider-3.0.4.jar
Including maven-model-3.0.4.jar
Including maven-model-builder-3.0.4.jar
Including maven-repository-metadata-3.0.4.jar
Including plexus-classworlds-2.4.jar
Including plexus-component-annotations-1.5.5.jar
Including plexus-interpolation-1.14.jar
Including plexus-utils-2.0.7.jar
Including pomegranate-0.2.0.jar
Including sisu-guice-3.0.3-no_aop.jar
Including sisu-inject-bean-2.2.3.jar
Including sisu-inject-plexus-2.2.3.jar
Including wagon-http-2.2.jar
Including wagon-http-shared4-2.2.jar
Including wagon-provider-api-2.2.jar
Created /media/acron/projects/Libraries/boot/boot-0.3.0-standalone.jar
echo '#!/usr/bin/env bash' > boot
echo 'java $JVM_OPTS -jar $0 "$@"' >> boot
echo 'exit' >> boot
cat target/boot*-standalone.jar >> boot
cat: target/boot*-standalone.jar: No such file or directory
make: *** [boot] Error 1
Java version:
java version "1.7.0_25"
OpenJDK Runtime Environment (IcedTea 2.3.12) (7u25-2.3.12-4ubuntu3)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)
Just stumbled over another problem:
I suddenly got
$ boot dev
org/codehaus/plexus/util/xml/pull/XmlSerializer
? Caused by: org.codehaus.plexus.util.xml.pull.XmlSerializer
at the cygwin prompt, upon starting 'boot dev' on my project. Hoplife, counter et.al. worked. Finally I found that I had to add
[tailrecursion/boot.notify "2.0.0-snapshot"]
to my dependencies (which wasn't there yet as my initial template was from times before this has been added to every example).
There is no error when the call to pprint
is removed.
#!/usr/bin/env boot
#tailrecursion.boot.core/version "2.5.1"
(require '[clojure.pprint :refer [pprint]])
(defn -main [& args]
(pprint {:a 1 :b 2 :c 3})
(System/exit 0))
boot-pprint:$ boot :v
{:cclojure.lang.Compiler$CompilerException: java.lang.StackOverflowError [...]
at clojure.lang.Compiler.load (Compiler.java:7142)
clojure.lang.Compiler.loadFile (Compiler.java:7086)
clojure.lang.RT$3.invoke (RT.java:318)
tailrecursion.boot$_main.doInvoke (boot.clj:117)
clojure.lang.RestFn.invoke (RestFn.java:467)
clojure.lang.Var.invoke (Var.java:394)
clojure.lang.AFn.applyToHelper (AFn.java:165)
clojure.lang.Var.applyTo (Var.java:700)
clojure.core$apply.invoke (core.clj:630)
tailrecursion.boot.loader$_main.doInvoke (loader.clj:190)
clojure.lang.RestFn.applyTo (RestFn.java:137)
tailrecursion.boot.loader.main (:-1)
Caused by: java.lang.StackOverflowError: null
at clojure.lang.AFn.applyToHelper (AFn.java:148)
clojure.lang.RestFn.applyTo (RestFn.java:132)
clojure.lang.Ref.alter (Ref.java:171)
clojure.core$alter.doInvoke (core.clj:2316)
clojure.lang.RestFn.invoke (RestFn.java:464)
clojure.pprint$set_field.invoke (column_writer.clj:29)
clojure.pprint$column_writer$fn__7421$fn__7425.invoke (column_writer.clj:73)
clojure.lang.AFn.call (AFn.java:18)
clojure.lang.LockingTransaction.runInTransaction (LockingTransaction.java:235)
clojure.pprint$column_writer$fn__7421.invoke (column_writer.clj:72)
clojure.pprint.proxy$java.io.Writer$IDeref$e595a7c1.write (:-1)
In order to use the castra dev ring server with Datomic pro easily, boot needs to allow authenticated third party repositories.
In leiningen this config entry adds the Datomic repository:
:repositories #{{:url "https://my.datomic.com/repo"
:username "[email protected]"
:password "datomic-password"}}
If I find the time I'll add it myself and send a pull request, but maybe for you guys this is just a matter of minutes. :) ?
If I remember correctly, right now repositories must be a string, but a map for the above case should be allowed.
I guess this is specific to Windows and I hope not just my machine. But when I use 'boot' SNAPSHOT dependencies can't be resolved. E.g. starting hoplife with 'boot dev' shows the following error output:
$ boot dev
Error: Could not find artifact tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Error: Could not find artifact tailrecursion:boot.ring:jar:0.1.0-SNAPSHOT in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
Error: Could not find artifact tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT in http://clojars.org/repo/ (http://clojars.org/repo/)
Error: Could not find artifact tailrecursion:boot.ring:jar:0.1.0-SNAPSHOT in http://clojars.org/repo/ (http://clojars.org/repo/)
The following artifacts could not be resolved: tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT, tailrecursion:boot.ring:jar:0.1.0-SNAPSHOT: Could not find artifact tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
? Caused by: The following artifacts could not be resolved: tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT, tailrecursion:boot.ring:jar:0.1.0-SNAPSHOT: Could not find artifact tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
? Caused by: Could not find artifact tailrecursion:boot.notify:jar:2.0.0-SNAPSHOT in http://repo1.maven.org/maven2/ (http://repo1.maven.org/maven2/)
This is true for cygwin and also normal commandline use (directly via boot.jar).
I'm so far quite convinced that it's the SNAPSHOT suffix, as for instance adding
[lein-pprint "1.1.1"]
or
[lein-pprint "1.1.2-SNAPSHOT"]
to the deps file cause the dependency resolution to succeed or fail. This is true for other examples as well, if there are SNAPSHOT and regular releases on clojars.
I tried to check the boot and pomegranate code, but at least couldn't quickly find the place where things go wrong. Maybe one of you guys can help faster.
web.xml
file for war packageweb.xml
and servlet implementation classFollowing the instructions in the readme, running build.boot
for the "Hello World" example hangs. The first time through it downloads tailrecursion.boot.core/version "2.5.0"
and then hangs.
This is on OS X, java 1.7.0 55.
When following the getting started guide for setting up boot-1.0.3 on Windows, I get the following error when passing the :strap argument in an empty directory. The .boot/boot-classloader.jar file is created, but dependency resolution soon fails:
java.io.FileNotFoundException: Could not locate ancient_clj/core__init.class or ancient_clj/core.clj on classpath:
at clojure.lang.RT.load (RT.java:443)
clojure.lang.RT.load (RT.java:411)
clojure.core$load$fn__5018.invoke (core.clj:5530)
clojure.core$load.doInvoke (core.clj:5529)
clojure.lang.RestFn.invoke (RestFn.java:408)
clojure.core$load_one.invoke (core.clj:5336)
clojure.core$load_lib$fn__4967.invoke (core.clj:5375)
clojure.core$load_lib.doInvoke (core.clj:5374)
clojure.lang.RestFn.applyTo (RestFn.java:142)
clojure.core$apply.invoke (core.clj:619)
clojure.core$load_libs.doInvoke (core.clj:5413)
clojure.lang.RestFn.applyTo (RestFn.java:137)
clojure.core$apply.invoke (core.clj:619)
clojure.core$require.doInvoke (core.clj:5496)
clojure.lang.RestFn.invoke (RestFn.java:408)
tailrecursion.boot.strap$latest_version.invoke (strap.clj:14)
tailrecursion.boot.strap$strap.invoke (strap.clj:22)
tailrecursion.boot.loader$_main.doInvoke (loader.clj:175)
clojure.lang.RestFn.applyTo (RestFn.java:137)
tailrecursion.boot.loader.main (:-1)
Hacking around in the boot source code, I found that the URL paths for dependencies should be prefixed with file:/// (triple-slashed), not file:// (double-slashed). The URI class seems stricter. If you try to load the latter into a new URI instance, it will fail to parse it.
The java.net.* API seems to suggest constructing a URI, then calling .toURLI() on it, then calling .getFile().
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.