Last night I gave a talk at a Perth Linux User's Group meetup about doing Linuxy stuff on small machines:
Frock is a little experimental tool for writing PHP scripts using Clojure-like LISP syntax.
If you want to see what the code looks like, here's an example which fetches and lists top news items from the Hacker News API.
Frock could be interesting to you if you are LISP or Clojure programmer writing a web application which is mostly front-end code, but which needs some small amount of server side logic for e.g. proxying, authentication, data persistence etc. and you want this application to be easily deployable by semi-technical users on commodity hosting.
Basically if your target audience is graphic designers, you like Clojure, and your backend requirements are slim, then you might be interested.
PHP is an old server-side web development language which is simultaneously loathed by software developers everywhere, and also wildly popular and widely deployed. To reconcile this paradox let's take a look at some pros and cons of PHP.
- Ugly language semantics & features.
- Dubious security record.
- Much awful legacy code lying around.
- User-friendly app deployments (simply copy files to server).
- Widely available on internet servers.
- Mature language and ecosystem.
- Excellent documentation.
- Much useful tech bundled ("batteries included").
The pros make PHP quite democratic. It's very easy to install PHP code on widely available, cheap, commodity hosting. It's easy to get started writing PHP applications; the PHP binary comes pre-installed on OSX for example. PHP contains a lot of capabilities by default: zipping files, opening sockets, encryption, command execution.
Frock exists to make the language semantics and features less of a con for brace wrangling LISP heads, whilst retaining the wide deployment surface and other democratic features of PHP.
I built a little blockchain-in-a-browser in ClojureScript to help understand the underlying algorithms.
You can simulate a network of peers by opening multiple browser tabs. Each peer can mine blocks and make transactions independently and the resulting blockchain will resolve conflicts correctly across all tabs.
A blockchain works by laying down a chain of blocks of transaction data.
Each block in the chain contains a cryptographic hash with two important properties:
- It proves a link to the previous block.
- It proves that difficult computational work has been done.
The proof-of-work is accomplished by iteratively updating a nonce until a low-probability hash is discovered.
These two properties mean a blockchain is digital amber.
If somebody wants to modify a transaction deep inside the amber it would be very difficult because they would have to re-create every layer of the blockchain by doing as much work as the original process required.
In my browser blockchain the hashing is implemented like this:
(hash-object [timestamp transactions previous-hash nonce])
As you can see the previous block's hash is included in the current block.
The hashing is performed iteratively in a loop until a hash with at least one byte of leading zeroes is found:
(loop [c 0] (let [candidate-block (make-block (now) transactions previous-hash new-index (make-nonce))] (if (not= (aget (candidate-block :hash) 0) 0) (recur (inc c)) candidate-block)))