<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>thegeez blog</title>
 <link href="https://thegeez.net/atom.xml" rel="self" />
 <link href="https://thegeez.net/" />
 <updated>2026-01-05T09:36:00Z</updated>
 <id>https://thegeez.net/</id>
 <author>
   <name>Gijs Stuurman</name>
 </author>
 <entry>
   <title>A bird video poker game with PicoLisp prototype for the Sensor Watch</title>
   <link href="https://thegeez.net/2026/01/05/watch_bird_poker_picolisp.html" />
   <updated>2026-01-05T23:00:00Z</updated>
   <id>https://thegeez.net/2026/01/05/watch_bird_poker_picolisp.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;A bird video poker game with PicoLisp prototype for the Sensor Watch&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://www.sensorwatch.net/"&gt;Sensor Watch&lt;/a&gt; is an ARM microcontroller board replacement for the Casio F-91W wristwatch.
 Which is the first watch I ever had.
 The Sensor Watch is named for the possibility to add a temperature or accelerometer sensor.
 I have no need for either of those, but I do want to program a game to create a smart, but not too smart, watch.&lt;/p&gt;

&lt;p&gt;The constraints for any custom program are that the watch has 3 buttons and the LCD screen has 6 clock digits, 2 day digits and 2 weekday segments.
 My first idea was to make a video poker game. However I couldn't figure out a way to display 5 playing cards within the available digits, where each playing card has a rank and a suit.
 Luckily, I came across a blogpost about an alternate poker variant, called &lt;a href="https://blog.fogus.me/games/bird-poker.html"&gt;Bird Poker&lt;/a&gt;. Which uses a single suit of 13 cards, plus 4 wildcards.
 And creating 17 different characters within a single digit segment was more feasible.&lt;/p&gt;

&lt;a href="2026/01/05/watch_bird_poker_picolisp.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>fecs: a lisp interpreter running in wasm</title>
   <link href="https://thegeez.net/2024/09/15/fecs_lisp_wasm.html" />
   <updated>2024-09-15T23:00:00Z</updated>
   <id>https://thegeez.net/2024/09/15/fecs_lisp_wasm.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;fecs: a lisp interpreter running in wasm&lt;/h1&gt;


&lt;p&gt;&lt;a href="/static/fecs/"&gt;fecs&lt;/a&gt; is a lisp interpreter in the style of &lt;a href="https://picolisp.com"&gt;PicoLisp&lt;/a&gt; running in wasm.&lt;/p&gt;

&lt;p&gt;Fecs was made as an exploration of the PicoLisp system and as an attempt to make a programming language that runs on WebAssembly (wasm). It is implemented in C, and compiled to wasm with &lt;a href="https://clang.llvm.org/"&gt;clang/LLVM&lt;/a&gt;. WebAssembly can run on many platforms, including browsers. A nice advantage of running wasm in the browser is the availability of the wasm memory inspector. Because PicoLisp is an interpreter (instead of a code compiler) any running system was therefore easily inspectable and debugable during development.&lt;/p&gt;

&lt;a href="2024/09/15/fecs_lisp_wasm.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Pinball with Scittle/ClojureScript</title>
   <link href="https://thegeez.net/2023/03/01/pinball_scittle.html" />
   <updated>2023-03-01T23:00:00Z</updated>
   <id>https://thegeez.net/2023/03/01/pinball_scittle.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Pinball with Scittle/ClojureScript&lt;/h1&gt;

&lt;p&gt;The past few months I have been on some longer train rides. These rides had plenty of time to look outside the window to the nice scenery between Dresden and Prague. Other routes were more suitable for programming.&lt;/p&gt;

&lt;p&gt;To program on my Android phone I installed the &lt;a href="https://userland.tech/"&gt;UserLAnd&lt;/a&gt; app, which can run a full Ubuntu environment (or other Linux variants), without special permissions or special hacks to the phone or Android system. In this Ubuntu installation I run Emacs for coding with Paredit on Clojure code. The UserLAnd app adds the "Ctrl" and "Alt"/"Meta" key to the Android touchscreen keyboard. Together with some custom configuration in Emacs this makes nice Paredit editing available on my phone.&lt;/p&gt;

&lt;a href="2023/03/01/pinball_scittle.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>SpotlightBoard.com: Calendar for standup and improv</title>
   <link href="https://thegeez.net/2023/01/31/spotlightboard.html" />
   <updated>2023-01-31T23:00:00Z</updated>
   <id>https://thegeez.net/2023/01/31/spotlightboard.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;SpotlightBoard.com: Calendar for standup and improv&lt;/h1&gt;

&lt;p&gt;My latest programming project is &lt;a href="https://spotlightboard.com"&gt;spotlightboard.com&lt;/a&gt;. This is a website to aggregate all the standup and improv events happening in Amsterdam. Users can add their own events and find events based on the calendar and filtering by tags. There's also a comment section for every event and a forum for discussions.&lt;/p&gt;

&lt;p&gt;For this project I tried something different than my usual Clojure programming tools. Spotlightboard is made with &lt;a href="https://elixir-lang.org"&gt;Elixir&lt;/a&gt; and the &lt;a href="https://phoenixframework.org"&gt;Phoenix web framework&lt;/a&gt;. Because Elixir uses immutable datastructures and functional programming it is very easy to get started with for Clojure programmers. It is only a pity that its syntax is not sexp based.&lt;/p&gt;

&lt;a href="2023/01/31/spotlightboard.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Serverless search on AWS Lambda with Janet and SQLite</title>
   <link href="https://thegeez.net/2022/01/11/serverless_search_aws_lambda.html" />
   <updated>2022-01-11T23:00:00Z</updated>
   <id>https://thegeez.net/2022/01/11/serverless_search_aws_lambda.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Serverless search on AWS Lambda with Janet and SQLite&lt;/h1&gt;

&lt;p&gt;Recently I have been porting a simple app on AWS Lambda for posts and comments to use the &lt;a href="https://janet-lang.org"&gt;Janet&lt;/a&gt; programming language. A &lt;a href="/2021/10/28/janet_web_app_aws_lambda.html"&gt;previous post&lt;/a&gt; describes how Janet is a great fit to use with AWS Lambda. The web app now also supports search through the search bar in the header. An earlier version of the postings app was written in Clojure and had a search functionality backed by ElasticSearch/OpenSearch on AWS, which is described &lt;a href="/2020/04/07/serverless_clojure_web_app_aws_lambda.html"&gt;in this post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since postings is a demo app that is rarely used, it benefits from the serverless quality of being able to scale the compute resource usage down to zero. The storage resources are also minimal. Sadly OpenSearch does not follow this serverless model by requiring a provisioned cluster.&lt;/p&gt;

&lt;a href="2022/01/11/serverless_search_aws_lambda.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Web app on AWS Lambda with Janet</title>
   <link href="https://thegeez.net/2021/10/28/janet_web_app_aws_lambda.html" />
   <updated>2021-10-28T23:00:00Z</updated>
   <id>https://thegeez.net/2021/10/28/janet_web_app_aws_lambda.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Web app on AWS Lambda with Janet&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://janet-lang.org"&gt;Janet&lt;/a&gt; is a small functional and imperative programming language. The language has some similarities to Clojure with its Lispy syntax, its data notation, and with its proper REPL for dynamic developing within a running system. Janet also compiles its runtime and VM to C and can therefore run almost anywhere.&lt;/p&gt;

&lt;p&gt;All of Janet's features make it a good candidate to make AWS Lambda serverless functions with. This is because Janet programs start up and compile quickly, certainly when compared to a combination of Clojure and native-image compilation. &lt;a href="https://iakerss4c6.execute-api.eu-central-1.amazonaws.com"&gt;Postings&lt;/a&gt; is a simple forum web app on AWS Lambda behind an API Gateway and using DynamoDB as the database.&lt;/p&gt;


&lt;a href="2021/10/28/janet_web_app_aws_lambda.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Rofolia: a self-hosted collaborative database/spreadsheet hybrid</title>
   <link href="https://thegeez.net/2021/06/01/rofolia_self_host_spreadsheet_database.html" />
   <updated>2021-06-01T23:00:00Z</updated>
   <id>https://thegeez.net/2021/06/01/rofolia_self_host_spreadsheet_database.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Rofolia: a self-hosted collaborative database/spreadsheet hybrid&lt;/h1&gt;

&lt;p&gt;My latest Clojure project is now available! &lt;a href="https://rofolia.com"&gt;Rofolia&lt;/a&gt; is a self-hosted collaborative database/spreadsheet hybrid. It is similar to Airtable and Google Sheets and supports links between tables, lookups, formula's and API access.&lt;/p&gt;

&lt;p&gt;Try the demo at &lt;a href="https://demo.rofolia.com"&gt;demo.rofolia.com&lt;/a&gt; and check out the documentation at &lt;a href="https://rofolia.com"&gt;Rofolia.com&lt;/a&gt;.&lt;/p&gt;
&lt;a href="2021/06/01/rofolia_self_host_spreadsheet_database.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Walkthrough of a spreadsheet/database-hybrid with Clojure(Script)</title>
   <link href="https://thegeez.net/2021/03/15/spreadsheet_database_clojure_aws.html" />
   <updated>2021-03-15T23:00:00Z</updated>
   <id>https://thegeez.net/2021/03/15/spreadsheet_database_clojure_aws.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Walkthrough of a spreadsheet/database-hybrid with Clojure(Script)&lt;/h1&gt;

&lt;p&gt;My latest project is a spreadsheet/database hybrid called &lt;a href="https://mixgrid.thegeez.net"&gt;mixgrid&lt;/a&gt;. Mixgrid is a record based database that is editable like a spreadsheet, similar to &lt;a href="https://airtable.com/"&gt;Airtable&lt;/a&gt;, &lt;a href="https://stackby.com/"&gt;Stackby&lt;/a&gt;, &lt;a href="https://tables.area120.google.com/about#/"&gt;Google Tables&lt;/a&gt; and &lt;a href="https://www.microsoft.com/en-us/microsoft-365/microsoft-lists"&gt;Microsoft Lists&lt;/a&gt;. While mixgrid is in its early stages it already supports some nice features:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Real time collaboration&lt;/li&gt;
  &lt;li&gt;Link records between tables&lt;/li&gt;
  &lt;li&gt;Lookup values from linked records&lt;/li&gt;
  &lt;li&gt;Apply formulas per row&lt;/li&gt;
  &lt;li&gt;Undo &amp;amp; redo support&lt;/li&gt;
  &lt;li&gt;Sorting and nested grouping of rows&lt;/li&gt;
&lt;/ul&gt;

&lt;a href="2021/03/15/spreadsheet_database_clojure_aws.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Databrowser for Crux</title>
   <link href="https://thegeez.net/2020/07/16/databrowser_crux.html" />
   <updated>2020-07-16T23:00:00Z</updated>
   <id>https://thegeez.net/2020/07/16/databrowser_crux.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Databrowser for Crux&lt;/h1&gt;

&lt;p&gt;Databrowser is a web app to explore the data in a &lt;a href="https://www.opencrux.com"&gt;Crux&lt;/a&gt; database. It takes a lot of inspiration from the &lt;a href="https://github.com/cognitect-labs/REBL-distro"&gt;REBL&lt;/a&gt; tool, with added features for Crux documents, such as an easy way to enter time and dates and to view diffs. Here's a longer list of features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write custom queries&lt;/li&gt;
&lt;li&gt;Add Clojure code to your queries to shape the data&lt;/li&gt;
&lt;li&gt;Support for collections of heterogeneous data&lt;/li&gt;
&lt;li&gt;Group and sort the data in grids&lt;/li&gt;
&lt;li&gt;Browse and view pane (similar to REBL)&lt;/li&gt;
&lt;li&gt;Drill down into data through navigation&lt;/li&gt;
&lt;li&gt;Full keyboard navigation support&lt;/li&gt;
&lt;li&gt;Support for easy creation of time and date instances for bi-temporal queries&lt;/li&gt;
&lt;li&gt;Support to view diffs of data&lt;/li&gt;
&lt;/ul&gt;

&lt;a href="2020/07/16/databrowser_crux.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Collaborate serverless-ly on ClojureScript: crepl is back</title>
   <link href="https://thegeez.net/2020/04/17/crepl_is_back.html" />
   <updated>2020-04-17T23:00:00Z</updated>
   <id>https://thegeez.net/2020/04/17/crepl_is_back.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Collaborate serverless-ly on ClojureScript: crepl is back&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://crepl.thegeez.net"&gt;crepl&lt;/a&gt; is a collaborative
  editor written in Clojure and ClojureScript. In the editor you can
  write and evaluate ClojureScript code. And you can work on the same code together, similar to Google Docs. crepl has been offline for quite some time as I did not have a place to deploy it to. Recently, I have been playing around with compiling Clojure with GraalVM's native-image and deploying on AWS Lambda. Because AWS Lambda works together with websockets via API Gateway the whole crepl infrastructure can be deployed in a serverless manner too!&lt;/p&gt;

&lt;p&gt;Try out the serverless crepl here: &lt;a href="https://crepl.thegeez.net"&gt;crepl.thegeez.net&lt;/a&gt;&lt;/p&gt;

&lt;a href="2020/04/17/crepl_is_back.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Serverless Clojure web app on AWS Lambda</title>
   <link href="https://thegeez.net/2020/04/07/serverless_clojure_web_app_aws_lambda.html" />
   <updated>2020-04-07T23:00:00Z</updated>
   <id>https://thegeez.net/2020/04/07/serverless_clojure_web_app_aws_lambda.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Serverless Clojure web app on AWS Lambda&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://postings.thegeez.net"&gt;Postings&lt;/a&gt; app is a simple
 web application for posting text and comments. It is very old
 fashioned because it serves html pages from a server, instead of being a big
 ClojureScript or JavaScript application with Reagent or React. The
 web app does use a tiny bit of JavaScript to load certain html pages
 inline, following the ideas of &lt;a href="https://github.com/turbolinks/turbolinks"&gt;turbolinks&lt;/a&gt;. Everything works without JavaScript too. To post a comment
 the server sends a page with a comment form in it and renders the
 form inline for a nice user experience. Therefore there is no client side
 state to manage for a nice developer experience, both of which are me.
&lt;/p&gt;
&lt;br /&gt;&lt;a href="https://postings.thegeez.net"&gt;&lt;img src="/images/postings_screenshot.png" /&gt;&lt;/a&gt;&lt;a href="2020/04/07/serverless_clojure_web_app_aws_lambda.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Serverless collaboration</title>
   <link href="https://thegeez.net/2019/03/03/serverless_collab.html" />
   <updated>2019-03-03T23:00:00Z</updated>
   <id>https://thegeez.net/2019/03/03/serverless_collab.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Serverless collaboration&lt;/h1&gt;

&lt;p&gt;Previously I've worked on a collaborative tool, which worked like Google Docs. This project was
  called &lt;a href="/2017/02/11/crepl_atom_sync.html"&gt;crepl&lt;/a&gt;. Because
  I stopped paying for hosting of its server, that project is now
  offline. That made me consider: what if a collaborative editor wouldn't need a
  server?&lt;/p&gt;

&lt;p&gt;The server in crepl was needed to handle the connections between all
  the clients and the algorithm for collaborative editing
  needed a central server. For both there are alternatives that do not
  need a server.&lt;/p&gt;

&lt;a href="2019/03/03/serverless_collab.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Fly over Amsterdam with ClojureScript</title>
   <link href="https://thegeez.net/2018/04/01/flight.html" />
   <updated>2018-04-01T23:00:00Z</updated>
   <id>https://thegeez.net/2018/04/01/flight.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Fly over Amsterdam with ClojureScript&lt;/h1&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;a href="2018/04/01/flight.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Probabilistic programming example with
  Anglican</title>
   <link href="https://thegeez.net/2017/11/13/prob_prog_anglican_example.html" />
   <updated>2017-11-13T23:00:00Z</updated>
   <id>https://thegeez.net/2017/11/13/prob_prog_anglican_example.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Probabilistic programming example with
  Anglican&lt;/h1&gt;

&lt;p&gt;At the
  last &lt;a href="https://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/events/244651818/"&gt;Amsterdam
    Clojure Meetup&lt;/a&gt; there was a great demostration by Zhenhao Li
  about &lt;a href="http://www.robots.ox.ac.uk/~fwood/anglican"&gt;Anglican&lt;/a&gt;. Anglican
  is a probabilistic programming language integrated with
  Clojure. I am a fan of the
  book &lt;a href="https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers"&gt;Probabilistic
  Programming and Bayesian Methods for Hackers&lt;/a&gt; from which I solved
  a problem in Clojure, about which I wrote here:

  &lt;/p&gt;&lt;p&gt;&lt;a href="http://thegeez.net/2014/03/12/bayes_mcmc_clojure.html"&gt;Bayesian Inference with Markov Chain Monte Carlo in Clojure&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;Below is the solution to that problem using Anglican:&lt;/p&gt;&lt;a href="2017/11/13/prob_prog_anglican_example.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>ClojureConj 2017 Baltimore: Learning Clojure and ClojureScript by Playing a
  Card Game video</title>
   <link href="https://thegeez.net/2017/11/07/clojure_conj_talk_playing_card_game.html" />
   <updated>2017-11-07T23:00:00Z</updated>
   <id>https://thegeez.net/2017/11/07/clojure_conj_talk_playing_card_game.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;ClojureConj 2017 Baltimore: Learning Clojure and ClojureScript by Playing a
  Card Game video&lt;/h1&gt;

&lt;p&gt;At ClojureConj 2017 I gave a talk titled: "Learning Clojure and
  ClojureScript by Playing a Card Game". The recording of the talk is
  now on
  youtube:&lt;br /&gt;&lt;br /&gt;ClojureTV/ClojureConj 2017: &lt;a href="https://www.youtube.com/watch?v=MzcgW9GIlQ0"&gt;Learning
    Clojure and ClojureScript by Playing a Card Game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More information for each of those Gin Rummy projects as mentioned in the talk are in the links below:&lt;/p&gt;
&lt;a href="2017/11/07/clojure_conj_talk_playing_card_game.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>EuroClojure 2017 Berlin: crepl talk video</title>
   <link href="https://thegeez.net/2017/08/17/crepl_euroclojure_2017_berlin.html" />
   <updated>2017-08-17T23:00:00Z</updated>
   <id>https://thegeez.net/2017/08/17/crepl_euroclojure_2017_berlin.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;EuroClojure 2017 Berlin: crepl talk video&lt;/h1&gt;

&lt;p&gt;At &lt;a href="http://2017.euroclojure.org/building-a-collaborative-web-app/"&gt;EuroClojure 2017&lt;/a&gt; I gave a talk titled: "Building a collaborative
  web app with ClojureScript". The recording of the talk is now on youtube:
&lt;a href="https://www.youtube.com/watch?v=NunlGbJgp4A"&gt;crepl at
  EuroClojure 2017 on ClojureTV&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more background about crepl and c3e check out these blogposts:
  &lt;/p&gt;&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://thegeez.net/2017/02/03/crepl_collaborative_editor.html"&gt;crepl blogpost&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://thegeez.net/2017/03/25/c3e_collaborative_clojure_cloud_editor.html"&gt;c3e
        blogpost&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;&lt;a href="2017/08/17/crepl_euroclojure_2017_berlin.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Data wrangling with transducers for a machine learning problem</title>
   <link href="https://thegeez.net/2017/04/28/data_transducers_machine_learning_clojure.html" />
   <updated>2017-04-28T23:00:00Z</updated>
   <id>https://thegeez.net/2017/04/28/data_transducers_machine_learning_clojure.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Data wrangling with transducers for a machine learning problem&lt;/h1&gt;

&lt;p&gt;The transducers from the &lt;a href="https://github.com/cgrand/xforms"&gt;net.cgrand.xforms&lt;/a&gt; library are great to
  transform and analyze data with in Clojure. This blogpost shows how
  the xforms transducers can be used to do
  data analysis for a machine learning problem from Kaggle, which is a data
  science competition platform.&lt;/p&gt;

&lt;p&gt;One of the competitions on Kaggle is
  the &lt;a href="https://www.kaggle.com/c/titanic"&gt;Titanic
    competition&lt;/a&gt;. For this competition you are given a dataset
  about passengers aboard the Titanic, with data such as their age and how much
  they paid for their ticket. In the training data you are also told
  if the passenger survived. The goal of the competition is to predict
  if a passenger survived or not for a test set of data.&lt;/p&gt;

&lt;a href="2017/04/28/data_transducers_machine_learning_clojure.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Dutch Clojure Days 2017: crepl demo</title>
   <link href="https://thegeez.net/2017/04/13/crepl_dutch_clojure_days_2017.html" />
   <updated>2017-04-13T23:00:00Z</updated>
   <id>https://thegeez.net/2017/04/13/crepl_dutch_clojure_days_2017.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Dutch Clojure Days 2017: crepl demo&lt;/h1&gt;

&lt;p&gt;At the &lt;a href="http://clojuredays.org/"&gt;Dutch Clojure Days&lt;/a&gt;
  2017 in Amsterdam I gave a lightning talk about &lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt;. With crepl
  you can write and run ClojureScript code together. I also introduced
  &lt;a href="http://c3e.thegeez.net"&gt;c3e&lt;/a&gt;, which is a collaborative editor in the browser for full
  projects with multiple files. The video for the talk is
  below:&lt;/p&gt;

 &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/kzbnk-zmSN0" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;

&lt;a href="2017/04/13/crepl_dutch_clojure_days_2017.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl and c3e at Dutch Clojure Days 2017</title>
   <link href="https://thegeez.net/2017/03/25/c3e_collaborative_clojure_cloud_editor.html" />
   <updated>2017-03-25T23:00:00Z</updated>
   <id>https://thegeez.net/2017/03/25/c3e_collaborative_clojure_cloud_editor.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl and c3e at Dutch Clojure Days 2017&lt;/h1&gt;

&lt;p&gt;Today was the 2017 edition
  of &lt;a href="http://clojuredays.org/"&gt;Dutch Clojure Days (DCD17)&lt;/a&gt;, the
  annual international gathering of Clojure enthusiasts and
  practitioners in the Netherlands. At DCD17 I presented a lightning
  talk about crepl.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt; is a collaborative
  editor written in Clojure and ClojureScript. It's like Google Docs
  where you can also run the ClojureScript you write in the
  browser. And by using &lt;a href="/2017/02/11/crepl_atom_sync.html"&gt;atom sync&lt;/a&gt; you can also keep state in
  sync with each browser running the code, which is useful when
  working on code with UIs. These previous blogposts have more information about crepl
  and its features:&lt;/p&gt;

&lt;a href="2017/03/25/c3e_collaborative_clojure_cloud_editor.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Defn Podcast: Episode 18</title>
   <link href="https://thegeez.net/2017/02/21/defn_podcast.html" />
   <updated>2017-02-21T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/21/defn_podcast.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Defn Podcast: Episode 18&lt;/h1&gt;

&lt;p&gt;Last week I joined Ray and Vijay on the Defn Podcast. We talked
  about Clojure as well as my latest
  project: &lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt;. I had a great
  time talking with them. You can listen to the episode below. Enjoy!&lt;/p&gt;

&lt;iframe width="100%" height="166" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/308550288&amp;amp;color=ff5500&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false"&gt;&lt;/iframe&gt;

&lt;a href="2017/02/21/defn_podcast.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl: Link to examples</title>
   <link href="https://thegeez.net/2017/02/20/crepl_links_to_examples.html" />
   <updated>2017-02-20T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/20/crepl_links_to_examples.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl: Link to examples&lt;/h1&gt;

&lt;p&gt;

&lt;/p&gt;&lt;p&gt;&lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt; is a collaborative
  editor where you can write and
  run ClojureScript together. You can now create links to new crepl
  pads that will be loaded with the code from an external source. Once you are in a crepl you can invite others to join you by
  sending them the url in the browser navigation bar. For
  instance try out these examples:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Solve 4Clojure problems together:&lt;br /&gt;
    &lt;a href="http://crepl.thegeez.net/init-pad?4clojure=23"&gt;http://crepl.thegeez.net/init-pad?4clojure=23&lt;/a&gt;&lt;br /&gt;
  More information about 4Clojure in crepl
  in &lt;a href="/2017/02/06/crepl_import_4clojure_reagent.html"&gt;this
      blogpost&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
  &lt;li&gt;A reagent app in crepl with SVG:&lt;br /&gt;
    &lt;a href="http://crepl.thegeez.net/init-pad?source=https://gist.githubusercontent.com/thegeez/d930a7d15fc166a904edeb7e816f96f5/raw/e393ca1585fc15e2ee157615475c0d54d18a19d6/crepl_svg_smiley.cljs"&gt;http://crepl.thegeez.net/init-pad?source=https://gist.githubusercontent.com/thegeez/d930a7d15fc166a904edeb7e816f96f5/raw/e393ca1585fc15e2ee157615475c0d54d18a19d6/crepl_svg_smiley.cljs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
  &lt;/li&gt;
  &lt;li&gt;Using atom-sync to sync state and code in different crepls, with
  an example Tic Tac Toe game:&lt;br /&gt;
    &lt;a href="http://crepl.thegeez.net/init-pad?source=https://gist.githubusercontent.com/thegeez/15913d9fce7698738697fe58ee4e8a94/raw/98e91842b45f8f2620599e473a9e0f5d95943f7b/crepl_tic-tac-toe.clj"&gt;http://crepl.thegeez.net/init-pad?source=https://gist.githubusercontent.com/thegeez/15913d9fce7698738697fe58ee4e8a94/raw/98e91842b45f8f2620599e473a9e0f5d95943f7b/crepl_tic-tac-toe.clj&lt;/a&gt;&lt;br /&gt;
    More about atom-sync in &lt;a href="/2017/02/11/crepl_atom_sync.html"&gt;this blogpost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;a href="2017/02/20/crepl_links_to_examples.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl: Atom sync, share code and state</title>
   <link href="https://thegeez.net/2017/02/11/crepl_atom_sync.html" />
   <updated>2017-02-11T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/11/crepl_atom_sync.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl: Atom sync, share code and state&lt;/h1&gt;

&lt;p&gt;With &lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt; you can write and
  run ClojureScript together. Any changes to the code are synced to
  everybody instantly. Something like Google Docs for
  ClojureScript. You can also use nice libraries such as Reagent to
  make your own UI. An example of making UI's in crepl is in
  this &lt;a href="http://thegeez.net/2017/02/06/crepl_import_4clojure_reagent.html"&gt;blog
  post&lt;/a&gt;. However, anything you do in the UI, such as clicking a
  button, would not be synced to everybody else. Because of
  this the collaborative features for crepl where limited to code. But crepl now has a solution for this:&lt;/p&gt;
&lt;p&gt;Crepl now has a "Atom sync" that keeps both your
  code and state in sync and changes will show up instantly for everybody!&lt;/p&gt;

&lt;a href="2017/02/11/crepl_atom_sync.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl: Import code, solve 4Clojure problems and
  use reagent</title>
   <link href="https://thegeez.net/2017/02/06/crepl_import_4clojure_reagent.html" />
   <updated>2017-02-06T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/06/crepl_import_4clojure_reagent.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl: Import code, solve 4Clojure problems and
  use reagent&lt;/h1&gt;

&lt;p&gt;There have been some upgrades
  to &lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt;. It is now possible
  to import code, solve 4Clojure problems and create your own UI with
  Reagent. It was already possible to &lt;a href="/2017/02/05/crepl_run_continuously.html"&gt;run your code continuously&lt;/a&gt; and
  see the result of your code update instantly.&lt;/p&gt;

&lt;h2&gt;Configure crepl with code&lt;/h2&gt;
&lt;a href="2017/02/06/crepl_import_4clojure_reagent.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl: Run continuously</title>
   <link href="https://thegeez.net/2017/02/05/crepl_run_continuously.html" />
   <updated>2017-02-05T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/05/crepl_run_continuously.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl: Run continuously&lt;/h1&gt;

&lt;p&gt;With &lt;a href="http://crepl.thegeez.net"&gt;crepl&lt;/a&gt; you can write and
  run ClojureScript code together. Everybody always sees the same
  code, because all the changes are updated in everyones browser
  simultaneously. However, everybody can only run the code in their
  own browser. This is why the output of "Evaluate expression" is
  inserted in the code. This way everybody is guaranteed to see the
  same output.&lt;/p&gt;

&lt;textarea id="snippet-1"&gt;
(+ 3 4
   (do (println "Some output")
     5))
(comment ;; eval'd by Guest 83477 =&amp;gt;
  12
;; [println] Some output
  )
&lt;/textarea&gt;

&lt;a href="2017/02/05/crepl_run_continuously.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>crepl: Write and run ClojureScript code
  together</title>
   <link href="https://thegeez.net/2017/02/03/crepl_collaborative_editor.html" />
   <updated>2017-02-03T23:00:00Z</updated>
   <id>https://thegeez.net/2017/02/03/crepl_collaborative_editor.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;crepl: Write and run ClojureScript code
  together&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://crepl.thegeez.net"&gt;crepl&lt;/a&gt; is a collaborative
  editor written in Clojure and ClojureScript. In the editor you can
  write and evaluate ClojureScript code. This is a fun and quick way
  to try out some ClojureScript code. The real fun begins when you
  get others to work on the same code with you by sending them the
  URL. When multiple people are working on the same code at the same
  time you will see their changes appear immediately and the output
  of running the code will be shared with everybody. crepl is like
  Google Docs that can also run ClojureScript!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crepl.thegeez.net"&gt;&lt;img src="/images/crepl_screenshot.png" style="border: 1px solid black;" /&gt;&lt;/a&gt;
Two people working on the same ClojureScript code and seeing the same output.&lt;/p&gt;

&lt;a href="2017/02/03/crepl_collaborative_editor.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>A wiki made with Clojure, yada and Datomic
  Client</title>
   <link href="https://thegeez.net/2017/01/04/wiki_clojure_yada_datomic_client.html" />
   <updated>2017-01-04T23:00:00Z</updated>
   <id>https://thegeez.net/2017/01/04/wiki_clojure_yada_datomic_client.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;A wiki made with Clojure, yada and Datomic
  Client&lt;/h1&gt;

&lt;p&gt;At EuroClojure in Bratislava an unconference session was about
  Clojure and REST. At this
  session &lt;a href="http://clojure-liberator.github.io/liberator/"&gt;Liberator&lt;/a&gt;
  and &lt;a href="https://github.com/juxt/yada"&gt;yada&lt;/a&gt; were discussed by their
  authors. I have used Liberator previously, by not yada. A big
  difference between the two is that yada is asynchronous. This is
  useful when making calls to other services while handling a web
  request.&lt;br /&gt;
&lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt; now has a new Client
API. With the Client API a Datomic database can be accessed as a
service, in a more idiomatic Clojure style than its old REST API. To
play around with yada and Datomic Client I made a wiki with it. As a
bonus the example yada project also
uses &lt;a href="http://boot-clj.com/"&gt;Boot&lt;/a&gt;, instead of Leiningen as
its build tool,
which I had not played around with either.&lt;/p&gt;

&lt;p&gt;The code for clj-wiki is on
  GitHub: &lt;a href="https://github.com/thegeez/clj-wiki"&gt;https://github.com/thegeez/clj-wiki&lt;/a&gt;&lt;br /&gt;
  An example wiki is (temporarily) running at &lt;a href="http://wiki.thegeez.net"&gt;http://wiki.thegeez.net&lt;/a&gt;&lt;/p&gt; 

&lt;a href="2017/01/04/wiki_clojure_yada_datomic_client.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Parsing with clojure.spec for the Advent of Code</title>
   <link href="https://thegeez.net/2016/12/09/parsing_clojure_spec_advent_of_code.html" />
   <updated>2016-12-09T23:00:00Z</updated>
   <id>https://thegeez.net/2016/12/09/parsing_clojure_spec_advent_of_code.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Parsing with clojure.spec for the Advent of Code&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://adventofcode.com"&gt;Advent of Code&lt;/a&gt; is a series of
    code challenges in the form of an advent calender, counting down
    to Christmas. The challenges have inputs in the form of
    strings. Clojure.spec can be used to parse those inputs and turn
    them into useful data. The gist below works through some examples:&lt;/p&gt;

&lt;script src="https://gist.github.com/thegeez/77aee6f0ebcf6a42aa7d893388502e40.js"&gt;&lt;/script&gt;
</content>
 </entry><entry>
   <title>Trello clone clone in Clojure</title>
   <link href="https://thegeez.net/2016/09/22/trello_clone_clone_in_clojure.html" />
   <updated>2016-09-22T23:00:00Z</updated>
   <id>https://thegeez.net/2016/09/22/trello_clone_clone_in_clojure.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Trello clone clone in Clojure&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://github.com/bigardone/phoenix-trello"&gt;Phoenix-Trello&lt;/a&gt;
  project is a Trello clone build with Elixir, Phoenix and
  React. I like the dragging cards interface in Trello, so I made a
  Trello clone clone in Clojure.&lt;/p&gt;

&lt;p&gt;The code for the Clojure version is on GitHub: &lt;a href="https://github.com/thegeez/clj-board"&gt;thegeez/clj-board&lt;/a&gt;. The example is
  running on Heroku: &lt;a href="https://clj-board.herokuapp.com"&gt;https://clj-board.herokuapp.com&lt;/a&gt;&lt;/p&gt;

&lt;a href="2016/09/22/trello_clone_clone_in_clojure.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Pedestal presentation and example app</title>
   <link href="https://thegeez.net/2016/09/01/pedestal_presentation_video_app.html" />
   <updated>2016-09-01T23:00:00Z</updated>
   <id>https://thegeez.net/2016/09/01/pedestal_presentation_video_app.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Pedestal presentation and example app&lt;/h1&gt;

&lt;p&gt;At the &lt;a href="http://www.ticketbase.com/events/dutch-clojure-days-2016"&gt;Dutch Clojure Days&lt;/a&gt; 2016 in Amsterdam I gave a presentation on building
  user facing web applications with Pedestal. The video for it is
  below:&lt;/p&gt;

 &lt;iframe width="560" height="315" src="https://www.youtube.com/embed/4BMGlELVW20" frameborder="0" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;

 &lt;a href="2016/09/01/pedestal_presentation_video_app.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Pedestal and w3a walkthrough: Build a CRUD app
  with Clojure</title>
   <link href="https://thegeez.net/2016/02/15/w3a_pedestal_walkthrough.html" />
   <updated>2016-02-15T23:00:00Z</updated>
   <id>https://thegeez.net/2016/02/15/w3a_pedestal_walkthrough.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Pedestal and w3a walkthrough: Build a CRUD app
  with Clojure&lt;/h1&gt;

&lt;p&gt;This is a walkthrough on how to build a complete user facing web
  application with Clojure on top
  of &lt;a href="http://pedestal.io"&gt;Pedestal&lt;/a&gt;, with the help of the
  &lt;a href="https://github.com/thegeez/w3a"&gt;w3a&lt;/a&gt; library. I have made various attempts at building web
  applications with Pedestal and/or Clojure before. (such as
  &lt;a href="http://thegeez.net/2014/04/30/datascript_clojure_web_app.html"&gt;here&lt;/a&gt;,
  &lt;a href="http://thegeez.net/2015/05/16/w3a_web_application_pedestal.html"&gt;here&lt;/a&gt;
  and &lt;a href="http://thegeez.net/2015/10/12/gatherlist_pedestal_oauth.html"&gt;here&lt;/a&gt;) The current version is good and useful enough to
  make a guide for and hopefully serve as a starting point for other
  Clojure web applications.&lt;/p&gt;

&lt;p&gt;For me a complete user facing web application should have a
  database, templating, forms, authentication and authorization. And
  for development I like to get something I can click through as soon
  as possible, as well as having a dynamic development process from
  the REPL.&lt;/p&gt;

&lt;a href="2016/02/15/w3a_pedestal_walkthrough.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Gatherlist: combining Pedestal &amp; OAuth</title>
   <link href="https://thegeez.net/2015/10/12/gatherlist_pedestal_oauth.html" />
   <updated>2015-10-12T23:00:00Z</updated>
   <id>https://thegeez.net/2015/10/12/gatherlist_pedestal_oauth.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Gatherlist: combining Pedestal &amp;amp; OAuth&lt;/h1&gt;

&lt;p&gt;Visiting conferences is nice. You'll find lots of new and old
  friends and will leave with a whole list of new interesting ideas to
  follow up on. It is also an opportunity to find out how much
  browsing websites on a mobile phone sucks. Want to find today's
  schedule on the conference mobile website? Sorry, the hamburger menu doesn't collapse and blocks the
  program table. Want to find the venue address? Sorry, the hero image of
  the host city's landscape is a static overlay on top of the Google
  maps.&lt;/p&gt;

&lt;p&gt;At conferences it is equally complicated to arrange an impromptu
  meeting or eating arrangement between a larger group of people. It's
  a hassle to exchange contact details with all of them, because not
  everybody is on the same platform. The most common place for
  these types of ad-hoc organizing that I have seen is on Twitter. But it's
  almost impossible to follow a conversation between a lot of people
  on Twitter, especially through the mobile website.&lt;/p&gt;

&lt;a href="2015/10/12/gatherlist_pedestal_oauth.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Web application with Pedestal</title>
   <link href="https://thegeez.net/2015/05/16/w3a_web_application_pedestal.html" />
   <updated>2015-05-16T23:00:00Z</updated>
   <id>https://thegeez.net/2015/05/16/w3a_web_application_pedestal.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Web application with Pedestal&lt;/h1&gt;

&lt;p&gt;As Frankie said, for web development in Clojure we
  should &lt;a href="http://frankiesardo.github.io/posts/2014-12-15-give-pedestal-another-chance.html"&gt;give Pedestal another chance&lt;/a&gt;. So I set out to build a user facing web
  application with &lt;a href="http://pedestal.io"&gt;Pedestal&lt;/a&gt;. To me a minimally useful user facing web application
  should have a database, templating, forms, authentication and
  authorization. And for development I like to get something
  I can click through as soon as possible, as well as having a
  dynamic development process from the REPL.
  The &lt;a href="https://github.com/thegeez/w3a"&gt;w3a&lt;/a&gt; library
  and &lt;a href="https://github.com/thegeez/w3a-example"&gt;w3a-example&lt;/a&gt; try to provide this, using
  Pedestal as foundation. &lt;/p&gt;

&lt;h2&gt;w3a-example&lt;/h2&gt;
&lt;a href="2015/05/16/w3a_web_application_pedestal.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Turned off gin.thegeez.net</title>
   <link href="https://thegeez.net/2014/07/08/gin_datomic_local.html" />
   <updated>2014-07-08T23:00:00Z</updated>
   <id>https://thegeez.net/2014/07/08/gin_datomic_local.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Turned off gin.thegeez.net&lt;/h1&gt;

&lt;p&gt;The server for &lt;a href="/2014/06/12/gin_datomic.html"&gt;Gin Rummy
    with Datomic&lt;/a&gt; has been shut down. Playing over the network against
  a human or AI opponent through the Datomic database is no longer
  available. See the &lt;a href="/2014/06/12/gin_datomic.html"&gt;blog
    post&lt;/a&gt; and code
  at &lt;a href="https://github.com/thegeez/gin"&gt;github.com/thegeez/gin&lt;/a&gt;
  to run the code yourself.&lt;/p&gt;

&lt;p&gt;A ClojureScript-only version to play against the CLJS AI is
  available here: &lt;a href="/static/gin-static/lobby.html"&gt;Gin Rummy&lt;/a&gt;&lt;/p&gt;
</content>
 </entry><entry>
   <title>Gin Rummy with Datomic</title>
   <link href="https://thegeez.net/2014/06/12/gin_datomic.html" />
   <updated>2014-06-12T23:00:00Z</updated>
   <id>https://thegeez.net/2014/06/12/gin_datomic.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Gin Rummy with Datomic&lt;/h1&gt;

&lt;p&gt;When I began to learn Clojure I found the &lt;a href="http://docs.racket-lang.org/games/ginrummy.html"&gt;Gin Rummy&lt;/a&gt; game in the &lt;a href="http://racket-lang.org/"&gt;PLT
  Racket/Scheme&lt;/a&gt; programming environment. Gin is a simple card game and
  it includes a simple AI for an opponent. This game has been the
  basis for some previous hobby projects, specifically a &lt;a href="/2012/03/20/racket_gin_clojurescript.html"&gt;ClojureScript
  implementation&lt;/a&gt; and
  a &lt;a href="/2012/06/01/ginbot_euroclojure.html"&gt;software robot&lt;/a&gt;
  to play the game. But the project I always wanted to make was a way
  to play Gin over the internet. Some 5 years later it is finally
  done:&lt;/p&gt;

&lt;p&gt;At &lt;a href="http://gin.thegeez.net/"&gt;gin.thegeez.net&lt;/a&gt; you can
  play the Gin card game against a ClojureScript AI, a remote Clojure AI or a remote human opponent.&lt;/p&gt;


&lt;a href="2014/06/12/gin_datomic.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Datascript and Quiescent TodoMVC stand-alone</title>
   <link href="https://thegeez.net/2014/05/01/datascript_quiescent_standalone.html" />
   <updated>2014-05-01T23:00:00Z</updated>
   <id>https://thegeez.net/2014/05/01/datascript_quiescent_standalone.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Datascript and Quiescent TodoMVC stand-alone&lt;/h1&gt;
&lt;style type="text/css"&gt;
@charset "UTF-8";body,html{margin:0;padding:0}button{margin:0;padding:0;border:0;background:0 0;font-size:100%;vertical-align:baseline;font-family:inherit;color:inherit;-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none}body{color:#4d4d4d}button,input[type=checkbox]{outline:0}#todoapp{background:#fff;background:rgba(255,255,255,.9);margin:170px 0 40px;border:1px solid #ccc;position:relative;border-top-left-radius:2px;border-top-right-radius:2px;box-shadow:0 2px 6px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.15)}#todoapp:before{content:'';border-left:1px solid #f5d6d6;border-right:1px solid #f5d6d6;width:2px;position:absolute;top:0;left:40px;height:100%}#todoapp input::-webkit-input-placeholder{font-style:italic}#todoapp input::-moz-placeholder{font-style:italic;color:#a9a9a9}#todoapp h1{position:absolute;top:-120px;width:100%;font-size:70px;font-weight:700;text-align:center;color:#b3b3b3;color:rgba(255,255,255,.3);text-shadow:-1px -1px rgba(0,0,0,.2);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;-ms-text-rendering:optimizeLegibility;-o-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}#header{padding-top:15px;border-radius:inherit}#header:before{content:'';position:absolute;top:0;right:0;left:0;height:15px;z-index:2;border-bottom:1px solid #6c615c;background:#8d7d77;background:-webkit-gradient(linear,left top,left bottom,from(rgba(132,110,100,.8)),to(rgba(101,84,76,.8)));background:-webkit-linear-gradient(top,rgba(132,110,100,.8),rgba(101,84,76,.8));background:linear-gradient(top,rgba(132,110,100,.8),rgba(101,84,76,.8));filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, StartColorStr='#9d8b83', EndColorStr='#847670');border-top-left-radius:1px;border-top-right-radius:1px}#new-todo,.edit{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;line-height:1.4em;outline:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);-moz-box-sizing:border-box;-ms-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;-o-font-smoothing:antialiased;font-smoothing:antialiased}#new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.02);z-index:2;box-shadow:none}#main{position:relative;z-index:2;border-top:1px dotted #adadad}label[for=toggle-all]{display:none}#toggle-all{position:absolute;top:-42px;left:-4px;width:40px;text-align:center;border:none}#toggle-all:before{content:'»';font-size:28px;color:#d9d9d9;padding:0 25px 7px}#toggle-all:checked:before{color:#737373}#todo-list{margin:0;padding:0;list-style:none}#todo-list li{position:relative;font-size:24px;border-bottom:1px dotted #ccc}#todo-list li:last-child{border-bottom:none}#todo-list li.editing{border-bottom:none;padding:0}#todo-list li.editing .edit{display:block;width:506px;padding:13px 17px 12px;margin:0 0 0 43px}#todo-list li.editing .view{display:none}#todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;-ms-appearance:none;-o-appearance:none;appearance:none}#todo-list li .toggle:after{content:'✔';line-height:43px;font-size:20px;color:#d9d9d9;text-shadow:0 -1px 0 #bfbfbf}#todo-list li .toggle:checked:after{color:#85ada7;text-shadow:0 1px 0 #669991;bottom:1px;position:relative}#todo-list li label{white-space:pre;word-break:break-word;padding:15px 60px 15px 15px;margin-left:45px;display:block;line-height:1.2;-webkit-transition:color .4s;transition:color .4s}#todo-list li.completed label{color:#a9a9a9;text-decoration:line-through}#todo-list li .sync{position:absolute;top:20px;right:10px;bottom:0;width:40px;height:40px;margin:auto 0}#todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:22px;color:#a88a8a;-webkit-transition:all .2s;transition:all .2s}#todo-list li .destroy:hover{text-shadow:0 0 1px #000,0 0 10px rgba(199,107,107,.8);-webkit-transform:scale(1.3);-ms-transform:scale(1.3);transform:scale(1.3)}#todo-list li .destroy:after{content:'✖'}#todo-list li:hover .destroy{display:block}#todo-list li .edit{display:none}#todo-list li.editing:last-child{margin-bottom:-1px}#footer{color:#777;padding:0 15px;position:absolute;right:0;bottom:-31px;left:0;height:20px;z-index:1;text-align:center}#footer:before{content:'';position:absolute;right:0;bottom:31px;left:0;height:50px;z-index:-1;box-shadow:0 1px 1px rgba(0,0,0,.3),0 6px 0 -3px rgba(255,255,255,.8),0 7px 1px -3px rgba(0,0,0,.3),0 43px 0 -6px rgba(255,255,255,.8),0 44px 2px -6px rgba(0,0,0,.2)}#todo-count{float:left;text-align:left}#filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}#filters li{display:inline}#filters li a{color:#83756f;margin:2px;text-decoration:none}#filters li a.selected{font-weight:700}#clear-completed{float:right;position:relative;line-height:20px;text-decoration:none;background:rgba(0,0,0,.1);font-size:11px;padding:0 10px;border-radius:3px;box-shadow:0 -1px 0 0 rgba(0,0,0,.2)}#clear-completed:hover{background:rgba(0,0,0,.15);box-shadow:0 -1px 0 0 rgba(0,0,0,.3)}#info{margin:65px auto 0;color:#a6a6a6;font-size:12px;text-shadow:0 1px 0 rgba(255,255,255,.7);text-align:center}#info a{color:inherit}@media screen and (-webkit-min-device-pixel-ratio:0){#todo-list li .toggle,#toggle-all{background:0 0}#todo-list li .toggle{height:40px}#toggle-all{top:-56px;left:-15px;width:65px;height:41px;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-appearance:none;appearance:none}}.hidden{display:none}hr{margin:20px 0;border:0;border-top:1px dashed #C5C5C5;border-bottom:1px dashed #F7F7F7}.learn a{font-weight:400;text-decoration:none;color:#b83f45}.learn a:hover{text-decoration:underline;color:#787e7e}.learn h3,.learn h4,.learn h5{margin:10px 0;font-weight:500;line-height:1.2;color:#000}.learn h3{font-size:24px}.learn h4{font-size:18px}.learn h5{margin-bottom:0;font-size:14px}.learn ul{padding:0;margin:0 0 30px 25px}.learn li{line-height:20px}.learn p{font-size:15px;font-weight:300;line-height:1.3;margin-top:0;margin-bottom:0}.quote{border:none;margin:20px 0 60px}.quote p{font-style:italic}.quote p:before{content:'“';font-size:50px;opacity:.15;position:absolute;top:-20px;left:3px}.quote p:after{content:'”';font-size:50px;opacity:.15;position:absolute;bottom:-42px;right:3px}.quote footer{position:absolute;bottom:-40px;right:0}.quote footer img{border-radius:3px}.quote footer a{margin-left:5px;vertical-align:middle}.speech-bubble{position:relative;padding:10px;background:rgba(0,0,0,.04);border-radius:5px}.speech-bubble:after{content:'';position:absolute;top:100%;right:30px;border:13px solid transparent;border-top-color:rgba(0,0,0,.04)}.learn-bar&gt;.learn{position:absolute;width:272px;top:8px;left:-300px;padding:10px;border-radius:5px;background-color:rgba(255,255,255,.6);-webkit-transition-property:left;transition-property:left;-webkit-transition-duration:500ms;transition-duration:500ms}@media (min-width:899px){.learn-bar{width:auto;margin:0 0 0 300px}.learn-bar&gt;.learn{left:8px}.learn-bar #todoapp{width:550px;margin:130px auto 40px}}#todo-error{margin-top:100px}
&lt;/style&gt;
&lt;p&gt;&lt;a href="/2014/04/30/datascript_clojure_web_app.html"&gt;Yesterday&lt;/a&gt;
  I wrote about &lt;a href="http://clj-crud.herokuapp.com/"&gt;clj-crud&lt;/a&gt;
  and its &lt;a href="http://todomvc.com/"&gt;TodoMVC&lt;/a&gt; implementation
  with &lt;a href="https://github.com/tonsky/datascript"&gt;Datascript&lt;/a&gt;
  and &lt;a href="http://facebook.github.io/react/"&gt;React.js&lt;/a&gt;/&lt;a href="https://github.com/levand/quiescent"&gt;Quiescent&lt;/a&gt;. Below is the same implementation, but
  this time in advanced compilation and without using a back-end. Now you don't
  have to log in to see the demo, but of course your todo list won't
  be saved in a database either.&lt;/p&gt;

&lt;a href="2014/05/01/datascript_quiescent_standalone.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Datascript and React.js for a Clojure web app</title>
   <link href="https://thegeez.net/2014/04/30/datascript_clojure_web_app.html" />
   <updated>2014-04-30T23:00:00Z</updated>
   <id>https://thegeez.net/2014/04/30/datascript_clojure_web_app.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Datascript and React.js for a Clojure web app&lt;/h1&gt;
&lt;p&gt;When building a web application with Clojure there are a lot of
  building blocks to choose from. For ClojureScript there has been a
  particularly interesting new offer with the release of &lt;a href="https://github.com/tonsky/datascript"&gt;Datascript&lt;/a&gt;.
  Datascript is a way to manage application state in ClojureScript following
  the database properties of &lt;a href="http://www.datomic.com/"&gt;Datomic&lt;/a&gt; (although not related to that
  project in any way). Together with &lt;a href="http://facebook.github.io/react/"&gt;React.js&lt;/a&gt; to handle the rendering
  of the user interface, this is a nice way to build dynamic,
  data-driven browser front-ends. It also fits in nicely with an
  example &lt;a href="http://clj-crud.herokuapp.com/"&gt;todo&lt;/a&gt; list application I have been working on.&lt;/p&gt;

&lt;h2&gt;Datascript&lt;/h2&gt;
&lt;a href="2014/04/30/datascript_clojure_web_app.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Using SendGrid with Clojure in The Next Web HackBattle</title>
   <link href="https://thegeez.net/2014/04/24/tnw_hackbattle_sendgrid.html" />
   <updated>2014-04-24T23:00:00Z</updated>
   <id>https://thegeez.net/2014/04/24/tnw_hackbattle_sendgrid.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Using SendGrid with Clojure in The Next Web HackBattle&lt;/h1&gt;

&lt;p&gt;This week is &lt;a href="http://thenextweb.com/conference/europe/"&gt;The Next Web&lt;/a&gt; conference in Amsterdam, where I participated
  in the &lt;a href="http://thenextweb.com/conference/europe/hack-battle/"&gt;HackBattle&lt;/a&gt;. Like I did two years ago, I took
  a project I am currently working on and tried to use one of the
  HackBattle API partners. Last time I used &lt;a href="http://thegeez.net/2012/05/16/the_next_web_rijksmuseum.html"&gt;BrowserChannel and the Rijksmuseum API&lt;/a&gt;. The current project I am working on is
  to complete the Clojure web application story by building a
  back-end for a &lt;a href="http://todomvc.com/"&gt;TodoMVC&lt;/a&gt; ClojureScript front-end. I've integrated
  &lt;a href="http://sendgrid.com/docs/API_Reference/Webhooks/parse.html"&gt;SendGrid's
  Inbound Parse Webhook&lt;/a&gt; API to be able to add todos via email.&lt;/p&gt;

&lt;p&gt;Using &lt;a href="http://sendgrid.com"&gt;SendGrid&lt;/a&gt; you can send an
  email with your todo to add it to your todo
  list, when you use your profile name in the subject line. On the
  server side this was easily implemented by adding a POST handler and
  setting some DNS settings properly.&lt;/p&gt;

&lt;a href="2014/04/24/tnw_hackbattle_sendgrid.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Bayesian Inference with Markov Chain Monte Carlo
  in Clojure</title>
   <link href="https://thegeez.net/2014/03/12/bayes_mcmc_clojure.html" />
   <updated>2014-03-12T23:00:00Z</updated>
   <id>https://thegeez.net/2014/03/12/bayes_mcmc_clojure.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Bayesian Inference with Markov Chain Monte Carlo
  in Clojure&lt;/h1&gt;

&lt;p&gt;I've been working through the
  book &lt;a href="https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers"&gt;Probabilistic
  Programming and Bayesian Methods for Hackers&lt;/a&gt; (ProbHack)
  by Cam Davidson-Pilon. This online book is an introduction to
  bayesian methods and probabilistic programming for
  programmers. Its main focus is Bayesian Inference with Markov Chain
  Monte Carlo (BI-MCMC). The ProbHack book uses Python and the PyMC library. For my own
  understanding of the inner-workings of BI-MCMC I ported the code to
  Clojure in
  the &lt;a href="https://github.com/thegeez/bi-mcmc"&gt;bi-mcmc&lt;/a&gt; (bi-mcmc) project on github. &lt;/p&gt;

&lt;h2&gt;BI-MCMC Algorithm&lt;/h2&gt;

&lt;a href="2014/03/12/bayes_mcmc_clojure.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Solving 4clojure problems in an editor</title>
   <link href="https://thegeez.net/2014/01/10/4clojure_in_editor.html" />
   <updated>2014-01-10T23:00:00Z</updated>
   <id>https://thegeez.net/2014/01/10/4clojure_in_editor.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Solving 4clojure problems in an editor&lt;/h1&gt;

&lt;p&gt;On
 Twitter &lt;a href="https://twitter.com/xeqixeqi/status/421323628190244865"&gt;xeqixeqi&lt;/a&gt;
 asked for a leiningen template to be able to solve to the problems
 from &lt;a href="http://www.4clojure.org"&gt;4clojure&lt;/a&gt; in an editor rather
 than the browser. He then solved this problem himself by building a
 &lt;a href="https://github.com/xeqi/foreclojure"&gt;lein template for
 4clojure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I did most of the problems in emacs by copy-pasting the
  test cases from each problem page. To turn the text on
  4clojure into a runnable test I used this
  utility: &lt;a href="https://gist.github.com/thegeez/8352754"&gt;gist:
  4clojure in editor&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry><entry>
   <title>Vintage JavaScript game restoration</title>
   <link href="https://thegeez.net/2013/12/30/vintage_javascript_game_restoration.html" />
   <updated>2013-12-30T23:00:00Z</updated>
   <id>https://thegeez.net/2013/12/30/vintage_javascript_game_restoration.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Vintage JavaScript game restoration&lt;/h1&gt;

&lt;p&gt;At a recent &lt;a href="http://amsclj.nl/"&gt;Amsterdam Clojurians meetup&lt;/a&gt; the topic was game
  development. Some of the first code I played around with in high school were games
  in JavaScript. These games were great as an introduction to programming
  because all that is needed to play around with them is a browser, 'view source' and
  notepad. My favorite JavaScript games then were made by
  K. Moriyama. His site from 1996 is still available online today in
  its original
  form: &lt;a href="http://plaza.harmonix.ne.jp/~jimmeans/"&gt;K. Moriyama's
  Home Page&lt;/a&gt;, including a matrix led visitor counter and gradient
  word-art like header.&lt;/p&gt;

&lt;p&gt;Mr. Moriyama took great care to make sure his games were playable
  on most browsers, including Internet Explorer 4 and Netscape
  Navigator 3. Sadly, current browsers cannot run the JavaScript
  anymore. The game I like most
  is &lt;a href="http://plaza.harmonix.ne.jp/~jimmeans/falcon/"&gt;JS
  Falcon&lt;/a&gt;. To be able to play this game again I have dusted of the
  old JavaScript. All that needed changing were some DOM traversal
  paths and the main loop's update interval. The server-side high
  score bookkeeping has been removed from this version.&lt;/p&gt;

&lt;a href="2013/12/30/vintage_javascript_game_restoration.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Testing RxJava with executable marble
  diagrams</title>
   <link href="https://thegeez.net/2013/03/25/neflix_rxjava_marble.html" />
   <updated>2013-03-25T23:00:00Z</updated>
   <id>https://thegeez.net/2013/03/25/neflix_rxjava_marble.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Testing RxJava with executable marble
  diagrams&lt;/h1&gt;
&lt;p&gt;Reactive Extensions (Rx) from the .Net world are observable
  sequences. In particular they are push based sequences, in contrast
  to the pull based seq api in Clojure. Furthermore you can subscribe
  to and
  unsubscribe from observable sequences. This also makes observable
  sequences a nice candidate to replace futures and callbacks in
  asynchronous code.&lt;br /&gt;&lt;br /&gt;

For more information see any of the following resources:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Rx (Reactive Extensions) &lt;a href="http://rx.codeplex.com/"&gt;.Net Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Erik Meijer (Rx creator) explains Rx &lt;a href="http://channel9.msdn.com/blogs/charles/erik-meijer-rx-in-15-minutes"&gt;video&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Intro to Rx &lt;a href="http://www.introtorx.com/"&gt;Free html ebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In particular the "Intro to Rx" book is a great resource. Every other
example will have you wishing to be able to use Rx in Clojure. Luckily
Netflix recently open sourced their Java variation of Rx called RxJava.&lt;/p&gt;&lt;a href="2013/03/25/neflix_rxjava_marble.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Haskell Picnic</title>
   <link href="https://thegeez.net/2013/01/20/haskell_picnic.html" />
   <updated>2013-01-20T23:00:00Z</updated>
   <id>https://thegeez.net/2013/01/20/haskell_picnic.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Haskell Picnic&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://lisperati.com/haskell/"&gt;PicnicMob&lt;/a&gt; is a Haskell
  tutorial for beginners. It is different from many other
  introductory tutorials as it has an interesting,
non-trivial algorithm as the subject and it produces pictures at every
step. Also you can't go wrong by reading something by Conrad Barski,
author of &lt;a href="http://landoflisp.com/"&gt;Land of Lisp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I worked through the tutorial when I was still at university. The
  picnic placement pictures I first generated are from 2009. I
  revisited the tutorial to read up on the &lt;a href="http://en.wikipedia.org/wiki/Simulated_annealing"&gt;simulated annealing&lt;/a&gt;
  algorithm that is used. Along the way I ported the code to Clojure and this code
  is on GitHub &lt;a href="https://gist.github.com/4580548"&gt;here&lt;/a&gt;. The Clojure code follows the Haskell code quite
  closely. As with the original tutorial the Clojure code is
  inefficient with its use of datastructures and its algorithmic complexity.&lt;/p&gt;


&lt;a href="2013/01/20/haskell_picnic.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>October Amsterdam Clojure Presentation</title>
   <link href="https://thegeez.net/2012/10/28/october_amsterdam_clojure.html" />
   <updated>2012-10-28T23:00:00Z</updated>
   <id>https://thegeez.net/2012/10/28/october_amsterdam_clojure.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;October Amsterdam Clojure Presentation&lt;/h1&gt;

&lt;p&gt;The slides from my presentation
  at &lt;a href="http://amsclj.nl/october.html"&gt;#OctAmsClj&lt;/a&gt; are in the ams-clj repo: &lt;a href="https://github.com/ams-clj/octamsclj-2012/"&gt;Simpler webapps with Clojure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The code for the example in the presentation is here: &lt;a href="https://github.com/thegeez/amscljoct-example"&gt;amscljoct-example&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry><entry>
   <title>Count aggregator in Cascalog</title>
   <link href="https://thegeez.net/2012/08/26/cascalog_clojure_count.html" />
   <updated>2012-08-26T23:00:00Z</updated>
   <id>https://thegeez.net/2012/08/26/cascalog_clojure_count.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Count aggregator in Cascalog&lt;/h1&gt;

&lt;p&gt;At my current job we use the excellent &lt;a href="https://github.com/nathanmarz/cascalog"&gt;Cascalog&lt;/a&gt; library. Cascalog
  is a declarative query language for "Big Data" processing on top of
  Hadoop. Cascalog queries get compiled into MapReduce tasks (through
  the underlying &lt;a href="http://www.cascading.org/"&gt;Cascading&lt;/a&gt; library). This approach is a huge win over
  writing MapReduce tasks yourself. The "Hello World" of MapReduce
  tasks is the &lt;a href="http://wiki.apache.org/hadoop/WordCount"&gt;word-count&lt;/a&gt; example. However this example is a bit
  deceptive as it consists of only one Map task and one Reduce task.
  Most queries that we run require multiple MapReduce tasks chained
  together. With Cascalog we write a query declaratively
  while the underlying libraries take care to create (efficient!)
  chains of MapReduce tasks.&lt;/p&gt;

&lt;p&gt;In the beginning I struggled with writing Cascalog queries with
  aggregators. The best example of this is the count aggregator. The
  following code uses "count" in Cascalog and SQL.&lt;/p&gt;

&lt;a href="2012/08/26/cascalog_clojure_count.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Testing clj-browserchannel</title>
   <link href="https://thegeez.net/2012/07/10/test_selenium_browserchannel.html" />
   <updated>2012-07-10T23:00:00Z</updated>
   <id>https://thegeez.net/2012/07/10/test_selenium_browserchannel.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Testing clj-browserchannel&lt;/h1&gt;

&lt;p&gt;The &lt;a href="https://github.com/thegeez/clj-browserchannel"&gt;clj-browserchannel&lt;/a&gt; project now also contains a test
  project. The &lt;a href="https://github.com/thegeez/clj-browserchannel/tree/master/test"&gt;test project&lt;/a&gt; contains a small executable test that
  tests the whole browserchannel stack, by using the &lt;a href="https://github.com/thegeez/clj-browserchannel/tree/master/chat-demo"&gt;chat-demo&lt;/a&gt;
  application. The test project is meant to test the server-side
  component of the BrowserChannel protocol in
  clj-browserchannel. Together with the client-side implementation as
  part of the Google Closure library this provides real-time
  bi-directional communication for web apps.&lt;/p&gt;

&lt;p&gt;The test is done by mimicking people chatting in the chat-demo
  application. Testing the server component in clj-browserchannel by
  itself is nearly impossible. This is because the server-side is
  fully dependent on cooperation with the client-side to comply to
  the BrowserChannel protocol. However both the protocol and the
  client-side implementation are very sparsely documented. The
  client-side implementation is a black box that can not easily be
  mocked or stubbed. Therefore the approach is to do &lt;a href="http://thinkrelevance.com/blog/2012/04/26/thinkrelevance-the-podcast-episode-010-stu-halloway"&gt;simulation testing&lt;/a&gt;.&lt;/p&gt;

&lt;a href="2012/07/10/test_selenium_browserchannel.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>My understanding of reducers after
  EuroClojure</title>
   <link href="https://thegeez.net/2012/06/12/euroclojure_reducers.html" />
   <updated>2012-06-12T23:00:00Z</updated>
   <id>https://thegeez.net/2012/06/12/euroclojure_reducers.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;My understanding of reducers after
  EuroClojure&lt;/h1&gt;

&lt;p&gt;At EuroClojure Rich Hickey gave a second, unscheduled talk about the new
  reducers library. The talk clarified a few points for me, that I
  didn't initially get from the explaining blogposts on
  &lt;a href="http://clojure.com/blog"&gt;clojure.com/blog&lt;/a&gt;. For the &lt;a href="http://www.meetup.com/The-Amsterdam-Clojure-Meetup-Group/"&gt;Amsterdam Clojure Meetup&lt;/a&gt; I wrote down
  these notes:&lt;/p&gt;

&lt;h2&gt;Reducers vs seq/lazy-seq api&lt;/h2&gt; 
&lt;a href="2012/06/12/euroclojure_reducers.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Playing "Racket Gin Rummy in ClojureScript" with
  Clojure</title>
   <link href="https://thegeez.net/2012/06/01/ginbot_euroclojure.html" />
   <updated>2012-06-01T23:00:00Z</updated>
   <id>https://thegeez.net/2012/06/01/ginbot_euroclojure.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Playing "Racket Gin Rummy in ClojureScript" with
  Clojure&lt;/h1&gt;

&lt;p&gt;In 2010 I built my first real Clojure application. It was a tool to
execute semantic specifications of modeling languages and was part of
my master thesis. Before I decided
to use Clojure for this tool I built a little program to test the
waters. This program was &lt;a href="https://github.com/thegeez/clj-ginbot"&gt;GinBot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whilst dabbling with functional programming languages I tried PLT
Scheme (now &lt;a href="http://racket-lang.org"&gt;PLT Racket&lt;/a&gt;). As part of the DrScheme editor came a couple
of example games. My favorite is the Gin Rummy card game. The object of this game is to make a hand of 10 cards,
  consisting of a set of four cards and two sets of three cards. Players take turns and can choose to pick the top card of the
  discard pile or a face down card from the deck. For more information see the
  rules for Gin Rummy in the &lt;a href="http://docs.racket-lang.org/games/ginrummy.html"&gt; Racket
  documentation&lt;/a&gt;.&lt;/p&gt;

&lt;a href="2012/06/01/ginbot_euroclojure.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>BrowserChannel and the Rijksmuseum API at
  The Next Web HackBattle</title>
   <link href="https://thegeez.net/2012/05/16/the_next_web_rijksmuseum.html" />
   <updated>2012-05-16T23:00:00Z</updated>
   <id>https://thegeez.net/2012/05/16/the_next_web_rijksmuseum.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;BrowserChannel and the Rijksmuseum API at
  The Next Web HackBattle&lt;/h1&gt;

&lt;p&gt;The
  last &lt;a href="http://thenextweb.com/conference/amsterdam/2012/"&gt;The
  Next Web conference&lt;/a&gt; in Amsterdam on the 23rd to 25th of April
  2012 included a two
  day &lt;a href="http://thenextweb.com/conference/amsterdam/2012/hackbattle"&gt;HackBattle&lt;/a&gt;. During
  this HackBattle I built a website combining the API from the
  &lt;a href="http://www.rijksmuseum.nl/api"&gt;Rijksmuseum&lt;/a&gt; with my
  &lt;a href="https://github.com/thegeez/clj-browserchannel"&gt;clj-browserchannel&lt;/a&gt;
  library.&lt;/p&gt;

&lt;p&gt;The Rijksmuseum API contains all the works from the museum in
  digital format, with loads of metadata. The website I build displays
  a selection from these works and allows people to add 'notes' to the
  paintings. When a note is placed, everybody looking at that painting
  will see the note pop-up on the site. The idea behind this was that
  this could be used in a group tour setting through the museum. Of
  course the real-time aspect of the website is provided by
  clj-browserchannel. This group tour aspect is also the motivation
  behind the simple design of the website, which makes it usable on at
  least Android smartphones.
&lt;/p&gt;

&lt;a href="2012/05/16/the_next_web_rijksmuseum.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Why BrowserChannel?</title>
   <link href="https://thegeez.net/2012/04/03/why_browserchannel.html" />
   <updated>2012-04-03T23:00:00Z</updated>
   <id>https://thegeez.net/2012/04/03/why_browserchannel.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Why BrowserChannel?&lt;/h1&gt;
&lt;p&gt;After the release
  of &lt;a href="https://github.com/thegeez/clj-browserchannel-demo"&gt;clj-browserchannel-demo&lt;/a&gt;,
  I have been asked what BrowserChannel is exactly. This post will
  hopefully clarify what BrowserChannel is and why it is a great fit
  for ClojureScript and Clojure web applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://closure-library.googlecode.com/svn-history/r144/docs/closure_goog_net_browserchannel.js.html"&gt;BrowserChannel&lt;/a&gt; is a protocol developed by Google. It provides cross-browser compatible, real-time, bi-directional communication
  for various Google web apps, including Google Docs and GMail.&lt;/p&gt;

&lt;a href="2012/04/03/why_browserchannel.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Racket Gin Rummy in ClojureScript</title>
   <link href="https://thegeez.net/2012/03/20/racket_gin_clojurescript.html" />
   <updated>2012-03-20T23:00:00Z</updated>
   <id>https://thegeez.net/2012/03/20/racket_gin_clojurescript.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Racket Gin Rummy in ClojureScript&lt;/h1&gt;
&lt;p&gt;A ClojureScript implementation of a simple card game. The game can
  be played &lt;a href="http://thegeez-gin.s3-website-eu-west-1.amazonaws.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The Racket programming environment comes with a couple of example
  games written in Scheme. My favorite of these games is Gin
  Rummy. The object of this game is to make a hand of 10 cards,
  consisting of a set of four cards and two sets of three cards. A set
  of cards are cards of the same rank (i.e. three Jacks) or subsequent
  cards of the same suit (i.e. 8,9,10,J of hearts). An ace can be low
  or high. The game has two players with ten cards each. In the middle
  are the deck of cards faced down and a discard pile, with cards face
  up. Players take turns and can choose to pick to top card of the
  discard pile or a face down card from the deck. The chosen card has
  to be exchanged for a card in the players hand, which is placed on
  top of the discard pile. For more information see the
  &lt;a href="http://docs.racket-lang.org/games/ginrummy.html"&gt; Racket documentation&lt;/a&gt;.&lt;/p&gt;

&lt;a href="2012/03/20/racket_gin_clojurescript.html"&gt;Read more&lt;/a&gt;</content>
 </entry><entry>
   <title>Simple static blog with Clojure</title>
   <link href="https://thegeez.net/2012/03/15/static_blog_on_github_with_enlive.html" />
   <updated>2012-03-15T23:00:00Z</updated>
   <id>https://thegeez.net/2012/03/15/static_blog_on_github_with_enlive.html</id>
   <content type="html">&lt;h1 id="post-title"&gt;Simple static blog with Clojure&lt;/h1&gt;
&lt;p&gt;This inaugural post for this Clojure blog describes how it is
created. This blog is hosted by GitHub Pages and the static pages are
generated by a minimal clone for Jekyll written in Clojure and
using Enlive. The code is by no means a replacement for Jekyll, but
can serve as a starting point for people wanting to do the same.&lt;/p&gt;

&lt;p&gt;The code for the static pages generator is in the &lt;a href="https://github.com/thegeez/clj-static-blog"&gt;clj-static-blog&lt;/a&gt; project.&lt;/p&gt;

&lt;a href="2012/03/15/static_blog_on_github_with_enlive.html"&gt;Read more&lt;/a&gt;</content>
 </entry>

</feed>
