<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Henri Bergius - Javascript</title>
    <description>Latest posts in category 'javascript'</description>
    <link>http://bergie.iki.fi</link>
    <language>en</language>
    <lastBuildDate>Fri, 07 Jun 2013 06:58:07 -0700</lastBuildDate>
    
    <item>
      
      <title>NoFlo: two years of flow-based programming</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; &amp;mdash; the flow-based programming system I started &amp;mdash; is now two years old. I &lt;a href=&quot;https://github.com/bergie/noflo/commit/04698a77272d9cd552ac57ca511ec8f05696ea40&quot;&gt;pushed the first commits&lt;/a&gt; to GitHub on June 5th 2011 from &lt;a href=&quot;http://www.hackerdojo.com/&quot;&gt;Hacker Dojo&lt;/a&gt; in Mountain View. To get us started with the story, I'll let &lt;a href=&quot;http://en.wikipedia.org/wiki/Flow-based_programming&quot;&gt;Wikipedia summarize&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Flow-based programming (FBP) is a programming paradigm that defines applications as networks of &quot;black box&quot; processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;While flow-based programming is still far from mainstream, it has been great to watch to the community grow around NoFlo.&lt;/p&gt;

&lt;p&gt;There are several start-ups using it as their base infrastructure, with several of their engineers contributing to the open source effort. I've personally used the system for quite a wide range of tasks from &lt;a href=&quot;http://bergie.iki.fi/blog/8998693776/&quot;&gt;web services&lt;/a&gt; and &lt;a href=&quot;http://bergie.iki.fi/blog/business_analytics_with_couchdb_and_noflo/&quot;&gt;document transformations&lt;/a&gt; to handling payments and user on-boarding processes.&lt;/p&gt;

&lt;h2&gt;Why I started NoFlo&lt;/h2&gt;

&lt;p&gt;Two years ago I was undergoing a transition from PHP and Python to the JavaScript world, largely lured by the benefits of a &lt;a href=&quot;http://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;universal runtime&lt;/a&gt; and the event-based multi-protocol paradigm &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; offers.&lt;/p&gt;

&lt;p&gt;While new programming languages and environments are easy to get into, this transition provided yet another point where I would have to sit down and port over all the little libraries and utilities I've grown to rely on over the years.&lt;/p&gt;

&lt;p&gt;I wondered if there could be a better way.&lt;/p&gt;

&lt;p&gt;To figure that out, I spent the time I had when traveling between conferences and hackathons of the &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS Project&lt;/a&gt; reading various computer science papers on different programming paradigms. Eventually I stumbled upon some mentions of flow-based programming. I dug deeper, and finally read the canonical book on the subject &amp;mdash; Paul Morrison's &lt;a href=&quot;http://amzn.com/1451542321&quot;&gt;Flow-based programming, 2nd edition&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Having worked with component architectures and Unix pipes before, the idea resonated with me. To think things through, I took the excuse of having some meetings in Portland to &lt;a href=&quot;http://www.flickr.com/photos/bergie/sets/72157626665916769/&quot;&gt;drive up there&lt;/a&gt; following the beautiful &lt;a href=&quot;http://en.wikipedia.org/wiki/California_State_Route_1&quot;&gt;California 1&lt;/a&gt; coastal road. Couple of days alone in a car is a great way to let your mind flow!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/oregon-coast.jpg&quot; alt=&quot;The coastal road in Oregon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Implementing your own is usually the best method for learning a new concept, and so when I got back to the Bay Area, I decided to write an &lt;a href=&quot;https://github.com/bergie/noflo&quot;&gt;FBP system of my own&lt;/a&gt; on Node.js.&lt;/p&gt;

&lt;p&gt;I also kept a &lt;a href=&quot;http://en.wikipedia.org/wiki/Qaiku&quot;&gt;Qaiku&lt;/a&gt; thread on the things I discovered, parts of which I later &lt;a href=&quot;http://bergie.iki.fi/blog/flow-based-programming-is-interesting/&quot;&gt;republished on this site&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Beyond OOP&lt;/h2&gt;

&lt;p&gt;Object-oriented programming and Model-View-Controller have been the dominant programming paradigms since the desktop computing era of the 90s, even while the world has become more connected and multi-device. While these concepts did improve some things, the big promises of programmer productivity and component reuse have mostly been &lt;a href=&quot;http://blog.dmbcllc.com/object-oriented-programming-has-failed-us/&quot;&gt;left unrealised&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Software has &lt;a href=&quot;http://online.wsj.com/article/SB10001424053111903480904576512250915629460.html&quot;&gt;become one of the most important aspects&lt;/a&gt; of business and the society. As an effect, the demand for programmers &lt;a href=&quot;http://blog.nwjobs.com/careercenter/talking_code_demand_for_programmers_software_engineers_outstrips_supply.html&quot;&gt;vastly outstrips&lt;/a&gt; the amount of computer science graduates we're able to produce.&lt;/p&gt;

&lt;p&gt;The tools side of things isn't looking much better, either. While IDEs are admittedly improving all the time, most of the talented programmers have ditched them and moved back to the console-based editors of the 80s like vim and Emacs, many following the &lt;a href=&quot;http://blog.sanctum.geek.nz/unix-as-ide-introduction/&quot;&gt;Unix as your IDE&lt;/a&gt; idea. Clearly the productivity boost given by IDEs doesn't yet match the overhead of using them.&lt;/p&gt;

&lt;p&gt;These areas are where flow-based programming can help.&lt;/p&gt;

&lt;h2&gt;The logic is in the graph&lt;/h2&gt;

&lt;p&gt;When we design software, we usually start by drawing boxes and arrows on a whiteboard. Later on these are then translated to actual software through various text files containing classes, methods, and configuration information.&lt;/p&gt;

&lt;p&gt;As the software evolves, people rarely go back to the original drawing and update it, effectively making the source code only place documenting how different pieces of a system fit together.&lt;/p&gt;

&lt;p&gt;With FBP, the logic of the software is designed as &lt;a href=&quot;http://en.wikipedia.org/wiki/Directed_graph&quot;&gt;a graph&lt;/a&gt; &amp;mdash; much like a flowchart &amp;mdash; and stays as a graph.&lt;/p&gt;

&lt;p&gt;The boxes of the graph depict various instances of reusable components, and the arrows the wiring connecting their ports together.&lt;/p&gt;

&lt;p&gt;The graph is what FBP systems like NoFlo execute, and it is also something that can be easily drawn on the screen, or even edited visually.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/fbp-ui/drawfbp-small.png&quot; alt=&quot;NoFlo graph in DrawFBP&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We humans &lt;a href=&quot;http://books.google.de/books?id=ffw6aBE-9ykC&amp;amp;lpg=PA1108&amp;amp;ots=baZIBoNyYI&amp;amp;dq=humans%20are%20visual%20creatures&amp;amp;pg=PA1108#v=onepage&amp;amp;q=humans%20are%20visual%20creatures&amp;amp;f=false&quot;&gt;are visual creatures&lt;/a&gt;. We are much better at recognizing shapes and visual connections than at finding them from a jumble of text files.&lt;/p&gt;

&lt;p&gt;Each node (or &lt;em&gt;process&lt;/em&gt; in FBP terminology) of a graph is an instance of a component. Just like objects in OOP can receive and react to messages (&lt;em&gt;method calls&lt;/em&gt;), NoFlo components react to packets they receive through their input ports, process them, and eventually send something to their output ports.&lt;/p&gt;

&lt;p&gt;The graph decides where the output is sent, meaning that the overall behavior of a program can be modified by just rewiring some of these connections. In traditional OOP the connections between various objects are usually hardcoded, or managed by a complicated &lt;a href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&quot;&gt;dependency injection&lt;/a&gt; systems.&lt;/p&gt;

&lt;h2&gt;Component reuse&lt;/h2&gt;

&lt;p&gt;Because FBP components are just black boxes performing some well-defined task on incoming packets, they can be connected with each other in multitude of different ways to produce a different behaviour. This gives FBP systems a much better scale of code reuse than traditional OOP or procedural environments.&lt;/p&gt;

&lt;p&gt;As an example, my typical NoFlo applications only contain some 5-15% of components written specifically for that project. The rest are all coming from the &lt;a href=&quot;https://npmjs.org/browse/depended/noflo&quot;&gt;growing ecosystem&lt;/a&gt; of ready-made NoFlo components.&lt;/p&gt;

&lt;p&gt;Writing and &lt;a href=&quot;http://bergie.iki.fi/blog/distributing-noflo-components/&quot;&gt;publishing components&lt;/a&gt; is already quite easy, and is becoming even faster and more reliable through tools like the &lt;a href=&quot;https://github.com/bergie/grunt-init-noflo&quot;&gt;Grunt component scaffolder&lt;/a&gt; and &lt;a href=&quot;https://github.com/bergie/noflo-test&quot;&gt;noflo-test&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The more components are out there the less time we need to spend writing code, and the more we can focus on designing the software logic itself.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;NoFlo on the browser&lt;/h2&gt;

&lt;p&gt;Apart of better tooling and more components, the other big improvement in NoFlo has been support for running FBP programs on the client. Originally NoFlo was designed for server-side flows, but thanks to the improving &lt;a href=&quot;http://bergie.iki.fi/blog/sharing-javascript-libraries-node-browser/&quot;&gt;client-side Component ecosystem&lt;/a&gt;, it became feasible to expose the environment also to web browsers.&lt;/p&gt;

&lt;p&gt;This is keeping true with the promises of the universal runtime. With the next release of NoFlo, flow-based programs can be run on pretty much any computing device, whether a Node.js equipped web server, or a smartphone with a browser.&lt;/p&gt;

&lt;p&gt;The ability to run client-side flow-based programs presents new opportunities. There is a tradition of using tools like &lt;a href=&quot;http://www.filterforge.com/features/editor.html&quot;&gt;FilterForge&lt;/a&gt; for visual effects, or &lt;a href=&quot;http://en.wikipedia.org/wiki/Quartz_Composer&quot;&gt;Quartz Composer&lt;/a&gt; for user interaction design. As a matter of fact, &lt;a href=&quot;https://medium.com/the-year-of-the-looking-glass/af182add5a2f&quot;&gt;Facebook Home was designed using flow-based tools&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;...something like Facebook Home is completely beyond the abilities of Photoshop as a design tool. How can we talk about physics-based UIs and panels and bubbles that can be flung across the screen if we’re sitting around looking at static mocks? (Hint: we can’t.) It's no secret that many of us on the Facebook Design team are avid users of Quartz Composer, a visual prototyping tool that lets you create hi-fidelity demos that look and feel like exactly what you want the end product to be.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Since NoFlo graphs run on any device including the tablets and smartphones that the application being designed is likely to target, it can provide an even better environment for such prototyping. There are lots of opportunities for a new tool here, especially given that &lt;a href=&quot;http://www.fcp.co/final-cut-pro/news/932-will-the-end-of-apple-s-quartz-composer-finally-kill-off-final-cut-pro-7-and-its-plugins&quot;&gt;Quartz Composer's future is quite uncertain&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We are already doing some work on &lt;a href=&quot;https://github.com/bergie/noflo/issues/66&quot;&gt;visual interaction components for NoFlo&lt;/a&gt;. This could be huge for NoFlo and FBP in general!&lt;/p&gt;

&lt;h2&gt;UI is the missing part&lt;/h2&gt;

&lt;p&gt;What we have with NoFlo is already a quite solid programming environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bergie/noflo&quot;&gt;Flow-based engine&lt;/a&gt; that works well in both browser and Node.js&lt;/li&gt;
&lt;li&gt;Growing ecosystem of &lt;a href=&quot;https://npmjs.org/browse/depended/noflo&quot;&gt;reusable open source components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Framework for quickly &lt;a href=&quot;https://github.com/bergie/grunt-init-noflo&quot;&gt;scaffolding&lt;/a&gt; and &lt;a href=&quot;https://github.com/bergie/noflo-test&quot;&gt;testing&lt;/a&gt; new components&lt;/li&gt;
&lt;li&gt;Domain-specific language for &lt;a href=&quot;https://github.com/noflo/fbp#language-for-flow-based-programming&quot;&gt;defining NoFlo graphs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;However, the missing part is a tool that would allow viewing and editing NoFlo graphs visually. Sure, &lt;a href=&quot;http://www.jpaulmorrison.com/cgi-bin/wiki.pl?DrawFBP&quot;&gt;DrawFBP&lt;/a&gt; is there, and can be used with NoFlo. But something fitting modern touchscreen interactions and more connected to the live graphs would be better.&lt;/p&gt;

&lt;p&gt;I did some prototypes on this with &lt;a href=&quot;https://github.com/bergie/noflo-ui&quot;&gt;noflo-ui&lt;/a&gt;, and wrote down &lt;a href=&quot;http://bergie.iki.fi/blog/inspiration-for-fbp-ui/&quot;&gt;bunch of thoughts&lt;/a&gt; on how the graphs would be best shown. There has also been some collaboration with Forrest Oliphant of &lt;a href=&quot;http://meemoo.org/&quot;&gt;Meemoo&lt;/a&gt; fame.&lt;/p&gt;

&lt;p&gt;Last week I sat down with &lt;a href=&quot;http://www.behance.net/leightaylor&quot;&gt;Leigh Taylor&lt;/a&gt;, the original designer behind the &lt;a href=&quot;https://medium.com/&quot;&gt;Medium&lt;/a&gt; blogging platform, to go through the various ideas and concepts we had. Based on this we're starting to have a quite solid design to continue working with.&lt;/p&gt;

&lt;p&gt;There will be more on that in the near future, but here is a sneak preview:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/fbp-ui/leigh-concept-small.jpg&quot; alt=&quot;Leigh's NoFlo UI concept&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;Telling the story of NoFlo&lt;/h2&gt;

&lt;p&gt;Apart from the user interface, the other important task ahead of us is to grow the community around NoFlo and FBP in general.&lt;/p&gt;

&lt;p&gt;This means producing better documentation, and explaining the concept in conferences and meetups. I gave &lt;a href=&quot;http://youtu.be/pgP4v9b5DvE&quot;&gt;a talk on NoFlo in JS.Everywhere 2011&lt;/a&gt;, but the project has moved quite far ahead since then.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/bergie-noflo-interview.jpg&quot; alt=&quot;Being interviewed on NoFlo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To tell the story of NoFlo and FBP we're currently filming a set of interviews with the people involved from the different sides. We're talking with NoFlo contributors, designers, and with people who have years (or even decades!) of experience with flow-based programming. This will hopefully come out next month.&lt;/p&gt;

&lt;p&gt;Expect also more posts and tutorials here &lt;a href=&quot;http://bergie.iki.fi/&quot;&gt;on my blog&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Wed, 05 Jun 2013 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnoflo-two-years%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/noflo-two-years/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/noflo-two-years/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Automated linking with rich text editors</title>
      <description>&lt;p&gt;The web is built of links, of pages linking to other resources on the internet. But making those links manually is tedious. This is another area where &lt;a href=&quot;http://createjs.org&quot;&gt;modern inline editors&lt;/a&gt; could do better.&lt;/p&gt;

&lt;p&gt;Yesterday on Hacker News, there was a thread about &lt;a href=&quot;http://www.wikidata.org&quot;&gt;Wikidata&lt;/a&gt;, Wikimedia Foundation's new knowledge base. &lt;a href=&quot;https://news.ycombinator.com/item?id=5627968&quot;&gt;This comment&lt;/a&gt; struck me especially:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I was using Wikipedia the other day and it occurred to me how primitive it is to have all the inner links to other Wikipedia articles defined manually, surely these should have been automated by now (i.e., marking a word or two would link you to the relevant article).&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And indeed, this is a usability problem that can already be fixed with the &lt;a href=&quot;http://viejs.org/&quot;&gt;Semantic Interaction stack&lt;/a&gt; underneath Create.js.&lt;/p&gt;

&lt;h2&gt;Introducing Annotate.js&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/szabyg/annotate.js&quot;&gt;Annotate.js&lt;/a&gt;&lt;/strong&gt; is a VIE widget built by Szaby Grünwald. It works very similarly to a spell checker in traditional text editors &amp;mdash; you write text, and it highlights the potential entities you might want to link to. You then can either accept or decline these link suggestions by clicking them. In case of multiple potential matches, you can also disambiguate between them by selecting from an offered list.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=zAMUpd6rb9k&amp;amp;feature=share&amp;amp;list=UUnPE7t9tqwcsO0LLyw5zuPQ&quot;&gt;Here is a quick video&lt;/a&gt; of Annotate.js in action:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/zAMUpd6rb9k?list=UUnPE7t9tqwcsO0LLyw5zuPQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;


&lt;p&gt;You can also try it yourself &lt;a href=&quot;http://szabyg.github.io/annotate.js/&quot;&gt;with an online demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Currently Annotate.js &lt;a href=&quot;https://github.com/bergie/hallo/blob/master/src/plugins/annotate.coffee&quot;&gt;has been integrated&lt;/a&gt; with the &lt;a href=&quot;http://hallojs.org&quot;&gt;Hallo rich text editor&lt;/a&gt;, but it would be easy to do the same with other popular editors like Aloha and CKEditor.&lt;/p&gt;

&lt;h2&gt;Connecting to entities&lt;/h2&gt;

&lt;p&gt;The big question with automatic linking is &lt;em&gt;where the entities come from&lt;/em&gt;. There are services like &lt;a href=&quot;http://www.opencalais.com/&quot;&gt;OpenCalais&lt;/a&gt; that can provide these suggestions for your content, but most of them are focused only on shared knowledge bases of big companies, famous people, and major cities.&lt;/p&gt;

&lt;p&gt;Unless you're running a newspaper, it is unlikely that these are the things your content is about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://stanbol.apache.org/&quot;&gt;Apache Stanbol&lt;/a&gt;&lt;/strong&gt; is an open source engine that can provide the enhancements for you. Out of the box it provides suggestions based on the Wikipedia knowledge repository. But more importantly, you can feed it with your own entities.&lt;/p&gt;

&lt;p&gt;This way the enhancements you get for your content can be tuned to be meaningful to your content and your audience. If you write about medicine, they could be about symptoms and diseases, or if you're writing about technology, they could be specific open source projects and their contributors. With Stanbol, the choice is yours.&lt;/p&gt;

&lt;p&gt;The current downside of Stanbol is that you'll have to run it yourself, but there may be &lt;a href=&quot;http://signup.redlink.co/&quot;&gt;solutions coming for that as well&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Beyond editing&lt;/h2&gt;

&lt;p&gt;Like &lt;a href=&quot;http://bergie.iki.fi/blog/never-lose-content/&quot;&gt;never losing your content&lt;/a&gt; or &lt;a href=&quot;http://bergie.iki.fi/blog/create-collections/&quot;&gt;managing collections&lt;/a&gt;, Annotate.js shows what we can do to improve the editing experience when we interact with it in a &lt;em&gt;semantically meaningful&lt;/em&gt; manner.&lt;/p&gt;

&lt;p&gt;What Annotate.js does is not merely creating links, but it also marking the machine-readable relationship between them and the HTML content being edited. This can then be used by yet another set of tools &amp;mdash; like search engines &amp;mdash; to understand and organize the content better.&lt;/p&gt;

&lt;p&gt;It is easy to see Create.js (like Drupal did, &lt;a href=&quot;http://drupal.org/node/1979784&quot;&gt;unfortunately&lt;/a&gt;) as just an easy way to add nice inline editing features to your CMS. However, while that is a good initial step, the addition of being able to interact with your content on the semantic level can do a lot more. Automated linking is just another demonstration of that.&lt;/p&gt;

&lt;p&gt;As the ecosystem around Create.js and VIE matures, and it ships in more systems, there will be things that we can't even imagine now built on the stack.&lt;/p&gt;

&lt;p&gt;If your CMS is &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;properly decoupled&lt;/a&gt;, you can benefit from that immediately.&lt;/p&gt;
</description>
      <pubDate>Tue, 30 Apr 2013 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fautomated-linking%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/automated-linking/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/automated-linking/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Writing reusable, multi-platform JavaScript with Component</title>
      <description>&lt;p&gt;I'm currently in the process of porting the &lt;a href=&quot;http://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; Flow-Based Programming environment to run also in the browser. While there are some obvious differences in things like filesystem interaction and component loading, the goal here is to reuse as much of the same code as possible between these two platforms.&lt;/p&gt;

&lt;p&gt;Many of the building blocks are already in place, and so the port should be complete still this week. You can track the work in &lt;a href=&quot;https://github.com/bergie/noflo/issues/63&quot;&gt;issue 63&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;A fragmented ecosystem&lt;/h2&gt;

&lt;p&gt;The current client-side JavaScript ecosystem is quite fragmented. While on general level any code can be used anywhere, there are many different approaches at packaging, code loading, and templating. In many ways this resembles the PHP landscape before &lt;a href=&quot;http://bergie.iki.fi/blog/composer_solves_the_php_code-sharing_problem/&quot;&gt;Composer solved the problem there&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On Node.js we haven't had this problem for a while, as &lt;a href=&quot;https://npmjs.org/&quot;&gt;NPM&lt;/a&gt; provides an excellent way to share and install code. With more than 27000 modules available, it is truly the default solution for JavaScript package management server-side. Some frameworks like Meteor tried to deviate from this by introducing their own package managers, but eventually &lt;a href=&quot;http://meteor.com/blog/2013/04/04/meteor-060-brand-new-distribution-system-app-packages-npm-integration&quot;&gt;came back to the fold&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Module definitions&lt;/h3&gt;

&lt;p&gt;There are many different ways for handling loading and encapsulation of JavaScript code. The &lt;a href=&quot;http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html&quot;&gt;module pattern&lt;/a&gt; is quite popular building block. Many also expose their code as &lt;a href=&quot;http://plugins.jquery.com/&quot;&gt;jQuery plugins&lt;/a&gt; even though that really only makes sense or DOM handling.&lt;/p&gt;

&lt;p&gt;Here is how you would define a jQuery plugin:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(function ($) {
  $.fn.somePlugin = function () {
    // some code here
  };
})(jQuery);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Some efforts towards standardization have been made, including the &lt;a href=&quot;http://requirejs.org/docs/whyamd.html&quot;&gt;Asynchronous Module Definition&lt;/a&gt; spec, and the synchronous &lt;a href=&quot;http://dailyjs.com/2010/10/18/modules/&quot;&gt;CommonJS module&lt;/a&gt; spec that Node.js also uses.&lt;/p&gt;

&lt;p&gt;Here is how an AMD wrapper for code looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;define('somePlugin', ['jquery'], function ($) {
  return function () {
    // some code here
  };
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The CommonJS definition for something similar would be the following. This will look familiar to Node.js developers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var $ = require('jquery');
exports.someFunction = function () {
  // some code here
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Harmony is the proposed next generation of the JavaScript language, and it includes a &lt;a href=&quot;http://wiki.ecmascript.org/doku.php?id=harmony:modules&quot;&gt;new module syntax&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module 'myModule' {
  import 'jquery' as $;
  export function someFunction () {
    // some code here
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It is no wonder many developers feel a bit lost on how they should expose their code or widgets!&lt;/p&gt;

&lt;p&gt;The Harmony module spec may eventually harmonize this, but it will take a while before you can actually ship code like that for even a reasonably majority of browsers.&lt;/p&gt;

&lt;h3&gt;Module installation and loading&lt;/h3&gt;

&lt;p&gt;Once you've picked the module pattern to follow, the next question is how to actually get your dependencies installed.&lt;/p&gt;

&lt;p&gt;The traditional way is to fetch &quot;known good&quot; versions of the libraries, add them to your project repository, and then just include each library with its own &lt;code&gt;script&lt;/code&gt; tag. But this means having to maintain all the libraries in your own project, and cluttering your repository and change log with them.&lt;/p&gt;

&lt;p&gt;A variant of this is loading common libraries from a Content Delivery Network &lt;a href=&quot;https://developers.google.com/speed/libraries/&quot;&gt;like Google&lt;/a&gt;. This has the advantage that your users won't have to download something like jQuery separately from each web server, and that you don't need to duplicate the library files in your own code repository. But at the same time, this relies on the CDN provider not breaking things, and complicates offline usage.&lt;/p&gt;

&lt;p&gt;And you still have to write &lt;code&gt;script&lt;/code&gt; tag for each of them.&lt;/p&gt;

&lt;h4&gt;Bower&lt;/h4&gt;

&lt;p&gt;Twitter's &lt;a href=&quot;http://twitter.github.io/bower/&quot;&gt;Bower package manager&lt;/a&gt; aims to help with dependency management. You declare the libraries your code needs in a &lt;code&gt;component.json&lt;/code&gt; file, run Bower, and you'll get the correct versions downloaded to your system.&lt;/p&gt;

&lt;p&gt;Bower only handles dependency resolution and downloading, and so you'll still be writing &lt;code&gt;script&lt;/code&gt; tags for all modules you installed. But at least this allows you to keep the library files out of your repository.&lt;/p&gt;

&lt;h4&gt;Require.js and volo&lt;/h4&gt;

&lt;p&gt;The &lt;a href=&quot;http://requirejs.org/&quot;&gt;Require.js&lt;/a&gt; project seeks to solve this by handling module loading for you in an automated manner. They even provide the &lt;a href=&quot;http://volojs.org/&quot;&gt;volo package manager&lt;/a&gt; for installing all the libraries you need.&lt;/p&gt;

&lt;p&gt;Require.js is a quite popular way of solving this, but means that you will need to follow the Asynchronous Module Definition specification with your code.&lt;/p&gt;

&lt;h4&gt;Component&lt;/h4&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/component/component&quot;&gt;Component&lt;/a&gt; is a newer solution for this started by TJ Holowaychuk of &lt;a href=&quot;http://expressjs.com&quot;&gt;Express&lt;/a&gt; and &lt;a href=&quot;http://visionmedia.github.io/mocha/&quot;&gt;Mocha&lt;/a&gt; fame.&lt;/p&gt;

&lt;p&gt;The system is explained a lot better in &lt;a href=&quot;http://tjholowaychuk.com/post/27984551477/components&quot;&gt;the introductory blog post&lt;/a&gt;, but in nutshell Component is a combination of a package manager and a module loading system based on CommonJS.&lt;/p&gt;

&lt;p&gt;With Component you can easily write and distribute reusable JavaScript modules, including user interface components that may include HTML templates and CSS. There is a &lt;a href=&quot;http://tjholowaychuk.com/post/37832588021/building-a-date-picker-component&quot;&gt;component writing tutorial&lt;/a&gt; available.&lt;/p&gt;

&lt;p&gt;The Component installer will pull all the dependencies for you, and construct a single, easy-to-include JavaScript file out of them and your own code. &lt;em&gt;If you want to think of it in that way, this is sort of similar to &lt;a href=&quot;http://getcomposer.org/doc/01-basic-usage.md#autoloading&quot;&gt;Composer generating an autoload file&lt;/a&gt; for PHP code&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;Which to choose?&lt;/h3&gt;

&lt;p&gt;Given the multitude of options available, it can be &lt;a href=&quot;http://stackoverflow.com/questions/14967521/what-is-the-difference-between-component-and-bower&quot;&gt;hard to choose&lt;/a&gt; which one to go with. Eventually a winner may emerge, but in the meanwhile, my approach is the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Component&lt;/strong&gt; for client-side libraries and widgets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NPM&lt;/strong&gt; for Node.js libraries&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;If I was just writing client-side code, Require.js and volo may have been just as good option, at least if I want to deal with AMD.&lt;/p&gt;

&lt;p&gt;However, the big advantage of Component is that it is based on CommonJS modules, which Node.js also uses. With it, I can share library code a lot more easily between browser and the server, the two main platforms of the &lt;a href=&quot;http://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;Universal Runtime&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CommonJS modules run nicely in the browser, on Node.js, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_server-side_JavaScript_solutions&quot;&gt;other server-side JavaScript runtimes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Writing a multi-platform library&lt;/h2&gt;

&lt;p&gt;Writing widgets with Component is covered nicely in the &lt;a href=&quot;http://tjholowaychuk.com/post/37832588021/building-a-date-picker-component&quot;&gt;building a date picker component&lt;/a&gt; tutorial, and so I'm focusing on how to build more general-purpose libraries here.&lt;/p&gt;

&lt;h3&gt;Getting Component&lt;/h3&gt;

&lt;p&gt;The first step with Component is getting the tooling in place. Component &amp;mdash; like most of the JavaScript dependency managers &amp;mdash; is written on top of &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;. It would be possible to implement the &lt;a href=&quot;https://github.com/component/component/wiki/Spec&quot;&gt;Component spec&lt;/a&gt; in other languages for easier integration in their native toolchain, but for now Node.js is what you must install.&lt;/p&gt;

&lt;p&gt;Once you have Node.js running, getting the Component tools is easy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo npm install -g component
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will give you the &lt;code&gt;component&lt;/code&gt; command. You can run it to see the functionality it provides.&lt;/p&gt;

&lt;h3&gt;Finding dependencies&lt;/h3&gt;

&lt;p&gt;The next step is to find the libraries you need. Quite a lot of libraries and widgets are already available, and can be found from &lt;a href=&quot;https://github.com/component/component/wiki/Components&quot;&gt;the Component Wiki&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also use the Component command to look up modules:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ component search underscore

component/underscore
url: https://github.com/component/underscore
desc: JavaScript's functional programming helper library.

nathan7/memoize
url: https://github.com/nathan7/memoize
desc: underscore's memoize
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, the components use a &quot;GitHub-like&quot; naming scheme of &lt;code&gt;&amp;lt;vendor&amp;gt;/&amp;lt;module&amp;gt;&lt;/code&gt;. This is again similar to vendor names in Composer:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The package name consists of a vendor name and the project's name. Often these will be identical - the vendor name just exists to prevent naming clashes. It allows two different people to create a library named json, which would then just be named igorw/json and seldaek/json.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Since &lt;a href=&quot;http://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; relies heavily on Node's &lt;a href=&quot;http://nodejs.org/api/events.html&quot;&gt;event API&lt;/a&gt;, we need to find an equivalent library for Component. After a quick look through &lt;code&gt;component search events&lt;/code&gt;, it turns out &lt;a href=&quot;https://github.com/component/emitter&quot;&gt;component/emitter&lt;/a&gt; does the job.&lt;/p&gt;

&lt;h3&gt;The component.json file&lt;/h3&gt;

&lt;p&gt;Each Component module must provide a &lt;code&gt;component.json&lt;/code&gt; file where you declare things like the name of the package, the version number, the software license, the files provided, and the possible dependencies. This is quite similar to the &lt;a href=&quot;http://package.json.nodejitsu.com/&quot;&gt;package.json file in NPM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm using a very simplified version of NoFlo's Graph class as the example here, so I can call the library &lt;code&gt;bergie/graph&lt;/code&gt;. Like most JavaScript libraries, this will be under the &lt;a href=&quot;http://en.wikipedia.org/wiki/MIT_License&quot;&gt;MIT license&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;graph&quot;,
  &quot;repo&quot;: &quot;bergie/graph&quot;,
  &quot;description&quot;: &quot;Simple graph class&quot;,
  &quot;license&quot;: &quot;MIT&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;scripts&quot;: [
    &quot;graph.js&quot;
  ],
  &quot;dependencies&quot;: {
    &quot;component/emitter&quot;: &quot;*&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;For Node.js support you'll also need a corresponding &lt;code&gt;package.json&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;graph&quot;,
  &quot;description&quot;: &quot;Simple graph class&quot;,
  &quot;main&quot;: &quot;./graph.js&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once the dependencies are declared, run the installation:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ component install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The example only uses Node.js's built-in libraries, so NPM installation is not yet needed. If you add third-party libraries, you need to install them also:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Module code&lt;/h3&gt;

&lt;p&gt;Writing a Component module is very similar to writing Node.js modules. Create the file we just declared in the JSON file and open it in your favourite editor.&lt;/p&gt;

&lt;p&gt;Since we're aiming for multi-platform code, the main difference is dealing with platform-specific differences. For example, the event emitter library in Node.js is called &lt;code&gt;events&lt;/code&gt;, and the Component equivalent is called &lt;code&gt;emitter&lt;/code&gt;.Luckily their APIs are exactly the same, so we only have to do loading conditionally:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var EventEmitter;
if (typeof process === 'object' &amp;amp;&amp;amp; process.title === 'node') {
  // Node.js
  EventEmitter = require('events').EventEmitter;
} else {
  // Browser
  EventEmitter = require('emitter');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This way, we have the correct event emitter implementation available for our code. Now we just create a constructor function to inherit from that:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// The constructor, just call &quot;super&quot;
function Graph () {
  this.nodes = [];
  EventEmitter.call(this);
}

// Set up inheritance
Graph.prototype = Object.create(EventEmitter.prototype);

// Define methods
Graph.prototype.addNode = function (name) {
  this.nodes.push(name);
  this.emit('node', name);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Once the code is there, we need to expose it as a CommonJS module:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module.exports = Graph;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Running the module in Node.js&lt;/h3&gt;

&lt;p&gt;For Node, this is all we need to do to be able to use our Graph as a module:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Include the module
var Graph = require('./graph');

// Instantiate
var g = new Graph();

// Hook into events
g.on('node', function (name) {
  console.log(&quot;Node added &quot; + name);
});

// Call a method
g.addNode('Foo');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running this should end up with message &lt;code&gt;Node added Foo&lt;/code&gt; shown on the console.&lt;/p&gt;

&lt;h3&gt;Running the module in browser&lt;/h3&gt;

&lt;p&gt;To be able to run the module in the browser, we need to run Component's build process.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ component build
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will generate a JavaScript file &lt;code&gt;build/build.js&lt;/code&gt; which provides CommonJS module loading support, and all the JavaScript code we've declared in the JSON file.&lt;/p&gt;

&lt;p&gt;Now you can include that file in your HTML, and start using the Graph module:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
    &amp;lt;script src=&quot;./build/build.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
      var Graph = require('graph/graph.js');
      var g = new Graph();
      g.on('node', function (name) {
        alert(&quot;Node added &quot; + name);
      });
      g.addNode('foo');
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Component can be used for solving the JavaScript code-sharing problem. They let you build full applications out of smaller, reusable modules. And thanks to the CommonJS module specification, it is quite easy to write these modules in away which enables them to be used also under Node.js and other JavaScript runtimes.&lt;/p&gt;

&lt;p&gt;This post, and the &lt;a href=&quot;http://tjholowaychuk.com/post/37832588021/building-a-date-picker-component&quot;&gt;date picker tutorial&lt;/a&gt; should give you enough information needed for starting to decouple your front-end applications, and to participate in the emerging &lt;a href=&quot;https://github.com/component/component/wiki/Components&quot;&gt;open source Component ecosystem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Even with more than &lt;a href=&quot;https://twitter.com/tjholowaychuk/status/316267708381528064&quot;&gt;800 components available&lt;/a&gt;, it is too early to declare Component the winner in the front-end dependency management space, but it is a well-designed system that works quite well.&lt;/p&gt;

&lt;p&gt;I will be utilizing Component for some of my &lt;a href=&quot;https://github.com/bergie&quot;&gt;JavaScript projects&lt;/a&gt; in the future.&lt;/p&gt;
</description>
      <pubDate>Thu, 11 Apr 2013 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fsharing-javascript-libraries-node-browser%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/sharing-javascript-libraries-node-browser/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/sharing-javascript-libraries-node-browser/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Create.js in 2013</title>
      <description>&lt;p&gt;It is now 2013, and the &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS project&lt;/a&gt;, started &lt;a href=&quot;http://bergie.iki.fi/blog/starting_the_interactive_knowledge_project/&quot;&gt;back in 2009&lt;/a&gt; to improve content management systems through semantic technologies, has ended. Alongside &lt;a href=&quot;http://stanbol.apache.org/&quot;&gt;Apache Stanbol&lt;/a&gt; and &lt;a href=&quot;http://viejs.org/&quot;&gt;VIE.js&lt;/a&gt;, the &lt;a href=&quot;http://createjs.org&quot;&gt;Create.js&lt;/a&gt; inline editing toolkit was one of the major outcomes of this European Union funded effort.&lt;/p&gt;

&lt;p&gt;This post outlines the current state of Create, and some of the things that will be happening around it in 2013.&lt;/p&gt;

&lt;h2&gt;Increased CMS adoption&lt;/h2&gt;

&lt;p&gt;Thanks to being picked up by major CMSs like &lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal 8&lt;/a&gt;, &lt;a href=&quot;http://neos.typo3.org/&quot;&gt;TYPO3 Neos&lt;/a&gt;, &lt;a href=&quot;http://midgard-project.org/&quot;&gt;Midgard&lt;/a&gt;, &lt;a href=&quot;http://cmf.symfony.com/&quot;&gt;Symfony CMF&lt;/a&gt; and &lt;a href=&quot;http://www.opencms.org/en/&quot;&gt;OpenCms&lt;/a&gt; for their inline editing needs, Create.js is experiencing very strong adoption. Many of these CMSs will be shipping a new major version during 2013.&lt;/p&gt;

&lt;p&gt;These releases will bring Create.js into millions of sites out there, giving users a friendlier and faster way to edit the web. By being built on the semantic interaction framework of VIE, this also means a significant expansion of the RDFa &lt;a href=&quot;http://www.w3.org/standards/semanticweb/data&quot;&gt;Linked Data&lt;/a&gt; base.&lt;/p&gt;

&lt;p&gt;This amount of new users will be staggering, meaning that we will need to put a lot of focus into stability and ease-of-use of the toolkit. To make life for new integrators and &lt;a href=&quot;http://www.ohloh.net/p/midgardcreate/contributors?sort=latest_commit&quot;&gt;contributors&lt;/a&gt; easier, we will also need to improve the &lt;a href=&quot;http://createjs.org/guide/&quot;&gt;documentation&lt;/a&gt; and test coverage. All of this is shown also by the fact that &lt;a href=&quot;https://github.com/bergie/create&quot;&gt;Create.js on GitHub&lt;/a&gt; has climbed from few hundred watchers a year ago to nearly 1400 today.&lt;/p&gt;

&lt;h2&gt;Any editor you want&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/&quot;&gt;first versions of Create.js&lt;/a&gt; were written exclusively with the &lt;a href=&quot;http://aloha-editor.org/&quot;&gt;Aloha Editor&lt;/a&gt; in mind. Later on we added support for &lt;a href=&quot;http://hallojs.org/&quot;&gt;Hallo.js&lt;/a&gt; in order to provide a simpler, MIT-licensed alternative. However, the needs of CMSs change and new promising editors are released.&lt;/p&gt;

&lt;p&gt;With this in mind, we received a contribution from the OpenCms team to have a more generic editor abstraction allowing integration of any new editors that CMSs may want to integrate. With it, the latest versions of Create.js support also &lt;a href=&quot;http://imperavi.com/redactor/&quot;&gt;Redactor&lt;/a&gt; and &lt;a href=&quot;http://ckeditor.com/&quot;&gt;CKEditor 4&lt;/a&gt; alongside Aloha and Hallo.&lt;/p&gt;

&lt;p&gt;The utility of this abstraction layer was proven recently when &lt;a href=&quot;http://buytaert.net/from-aloha-to-ckeditor&quot;&gt;Drupal switched&lt;/a&gt; from Aloha to CKEditor.&lt;/p&gt;

&lt;p&gt;Hallo.js:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-editors/hallo.png&quot; alt=&quot;Create.js with Hallo Editor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Aloha Editor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-editors/aloha.png&quot; alt=&quot;Create.js with Aloha Editor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;CKEditor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-editors/ckeditor.png&quot; alt=&quot;Create.js with CKEditor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Redactor:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-editors/redactor.png&quot; alt=&quot;Create.js with Redactor&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In addition to the editors we now support, integrators can use the reasonably simple &lt;a href=&quot;https://github.com/bergie/create/tree/master/src/editingWidgets&quot;&gt;property editor API&lt;/a&gt; to implement their own editors when needed. For example, Drupal provides a &lt;a href=&quot;http://drupalcode.org/project/edit.git/blob/06e86c82ab5412ef1f78aea343dbe0f9cbd16867:/js/createjs/editingWidgets/formwidget.js&quot;&gt;custom editor widget&lt;/a&gt; that utilizes forms rendered on the server side for editing more complex field types.&lt;/p&gt;

&lt;h2&gt;New default UI&lt;/h2&gt;

&lt;p&gt;As many of you probably know, Create.js can be used on two levels: as a full inline editing interface, or as a set of components for building your own editing UI.&lt;/p&gt;

&lt;p&gt;In the latter part of 2012, much of focus was put into the components themselves, as that is the way most CMSs leverage Create. But the default user interface is also important, and so I have been collaborating with the Berlin-based designer &lt;a href=&quot;http://marie-schweiz.de/&quot;&gt;Marie Schweiz&lt;/a&gt; to improve the user experience of stock Create.js. This work is still in the concept stage, but I'm quite happy with the direction we're headed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-ui-2013-editing.png&quot; alt=&quot;Editing text&quot; /&gt;&lt;/p&gt;

&lt;p&gt;One important concern to tackle with the new UI is handling of non-visible metadata and the other concerns raised by &lt;a href=&quot;http://www.lullabot.com/articles/inline-editing-and-cost-leaky-abstractions&quot;&gt;Lullabot's excellent critique&lt;/a&gt; of inline editing. Here you can see some of that in action:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-ui-2013-metadata.png&quot; alt=&quot;Editing geolocation&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Other important parts is to use colored indicators for showing what can be edited, and its state (published, untranslated, etc.), and to make the process of &lt;a href=&quot;http://bergie.iki.fi/blog/create-collections/&quot;&gt;adding new content&lt;/a&gt; clearer:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-ui-2013-create.png&quot; alt=&quot;Adding items&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clear visuals and bigger touch targets should also make the new UI friendlier for tablets and other new touchscreen devices.&lt;/p&gt;

&lt;h2&gt;New editing tools&lt;/h2&gt;

&lt;p&gt;The main purpose of Create.js is to enable inline editing of textual content, but even in the &lt;a href=&quot;http://bergie.iki.fi/blog/introducing_the_midgard_create_user_interface/&quot;&gt;original versions&lt;/a&gt; we had additional features like image handling and versioning that most CMSs need.&lt;/p&gt;

&lt;p&gt;Adding more functionality related to non-textual content is highly useful, and something that ought to go hand-in-hand with the new UI effort. In the new default UI we have a large overlay (seen in blue in the geolocation editor) that can be used for new interesting editing features, like better image pickers, or even editing images and videos to be inserted to a page.&lt;/p&gt;

&lt;p&gt;Another idea I've been toying around has been a more semantic way of handling tables. Instead of editing tables in the traditional WYSIWYG way, how about making queries to your CMS system and then presenting the data in tabular manner? &lt;a href=&quot;http://aloha-editor.org/guides/plugin_block.html&quot;&gt;Aloha's Blocks feature&lt;/a&gt; can give a lot of inspiration here.&lt;/p&gt;

&lt;h2&gt;Getting involved&lt;/h2&gt;

&lt;p&gt;In 2013 the development of Create.js should happen in a lot more community-driven manner. Given the massive adoption of the library, this shouldn't be a problem.&lt;/p&gt;

&lt;p&gt;If you're interested in getting involved, take a look at &lt;a href=&quot;https://github.com/bergie/create&quot;&gt;the repository on GitHub&lt;/a&gt;, file &lt;a href=&quot;https://github.com/bergie/create/issues?state=open&quot;&gt;issues&lt;/a&gt;, and send &lt;a href=&quot;http://github.com/guides/pull-requests&quot;&gt;pull requests&lt;/a&gt;. The most immediate concern is getting the &lt;a href=&quot;https://github.com/bergie/create/issues?milestone=1&amp;amp;page=1&amp;amp;state=open&quot;&gt;1.0.0 stable&lt;/a&gt; out of the door, which should be helped greatly by the recently-released &lt;a href=&quot;https://groups.google.com/d/topic/viejs/RYKfp0Fhuag/discussion&quot;&gt;VIE 2.1.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For discussing both development and integration of Create.js, the &lt;a href=&quot;http://groups.google.com/group/createjs&quot;&gt;Create.js Google Group&lt;/a&gt; and the &lt;code&gt;#iks&lt;/code&gt; IRC channel on FreeNode are the best options. The &lt;a href=&quot;https://github.com/bergie/create/blob/master/CHANGES.md&quot;&gt;Create.js change log&lt;/a&gt; is also an important thing to watch.&lt;/p&gt;
</description>
      <pubDate>Sun, 06 Jan 2013 00:00:00 -0800</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fcreatejs-in-2013%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/createjs-in-2013/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/createjs-in-2013/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Create.js hackathon in Berlin</title>
      <description>&lt;p&gt;Last week we at &lt;a href=&quot;http://www.iks-project.eu/&quot;&gt;IKS&lt;/a&gt; organized a two-day hackathon for developers interested in &lt;a href=&quot;http://createjs.org&quot;&gt;Create.js&lt;/a&gt;, &lt;a href=&quot;http://viejs.org&quot;&gt;VIE&lt;/a&gt;, and in new tools for editing websites semantically.&lt;/p&gt;

&lt;p&gt;The original agenda for the event can be found from the &lt;a href=&quot;http://wiki.iks-project.eu/index.php/DevWorkshops/VieBerlin&quot;&gt;event's wiki page&lt;/a&gt;, and I believe we got it covered quite well. I've been to quite a lot of hackfests, and usually the first day is mostly spent by people arriving, figuring out the WiFi setup, and getting to know the development tools. This time was different: people jumped straight into the code and started working.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-berlin-hackathon1.jpg&quot; alt=&quot;Create.js Berlin hackathon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The venue at &lt;a href=&quot;http://theseus-programm.de/de/tiz.php&quot;&gt;Theseus Innovationszentrum&lt;/a&gt;, arranged by &lt;a href=&quot;http://www.dfki.de/web&quot;&gt;DFKI&lt;/a&gt;, was a nice one. We had food, coffee, and fast connectivity. And the place even had toys like &lt;a href=&quot;http://youtu.be/A1QkA-yceic&quot;&gt;big touchscreen computers&lt;/a&gt; to try Create.js on. On the first evening we continued the event at the &lt;a href=&quot;http://c-base.org/&quot;&gt;c-base&lt;/a&gt; hackerspace, and the participants staying after Friday went to the &lt;a href=&quot;https://github.com/blog/1203-berlin-drinkup&quot;&gt;Berlin GitHub drinkup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-berlin-hackathon2.jpg&quot; alt=&quot;After-hackathon in c-base&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;More robust Hallo and Create&lt;/h2&gt;

&lt;p&gt;An important theme in the event was to improve both &lt;a href=&quot;http://hallojs.org/&quot;&gt;Hallo&lt;/a&gt; and Create. The Create.js theme got a lot nicer, and thanks to the contributions from &lt;a href=&quot;http://www.alkacon.com/en/&quot;&gt;Alkacon&lt;/a&gt; the next versions will run nicely also on older Internet Explorer and Opera versions.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-after-berlin-hackathon.png&quot; alt=&quot;Create.js after the hackathon&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Create's editor selection mechanism &lt;a href=&quot;https://github.com/bergie/create/issues/62&quot;&gt;was also rewritten&lt;/a&gt;. Now you can easily set up custom editor configurations for managing different content types. For instance:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Set a simpler editor for title fields
jQuery('body').midgardCreate('configureEditor', 'title', 'halloWidget', {
  plugins: {
    halloformat: {}
  }
});
jQuery('body').midgardCreate('setEditorForProperty', 'dcterms:title', 'title');

// Disable editing of author fields
jQuery('body').midgardCreate('setEditorForProperty', 'dcterms:author', null);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In addition to the other activities, documentation in the &lt;a href=&quot;http://createjs.org/guide/&quot;&gt;Create.js Integration Guide&lt;/a&gt; also got a lot better.&lt;/p&gt;

&lt;h2&gt;VIE and literals&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;http://viejs.org&quot;&gt;VIE&lt;/a&gt; semantic interaction library is the basis of everything we're doing in the &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;decoupled CMS&lt;/a&gt; space.&lt;/p&gt;

&lt;p&gt;Next big step for VIE is &lt;a href=&quot;https://github.com/bergie/VIE/issues/114&quot;&gt;better literals handling&lt;/a&gt;, which will allow a lot easier management of multilingual content. Several people were working on this in the hackathon, and I hope we'll be able to release the first beta of VIE 2.1 with this soon.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-berlin-hackathon4.jpg&quot; alt=&quot;After-hackathon in a biergarten&quot; /&gt;&lt;/p&gt;

&lt;p&gt;VIE provides a quite comprehensive &lt;a href=&quot;http://viejs.org/docs/2.0.0/src/Type.js.html&quot;&gt;entity type system&lt;/a&gt;, which most systems don't really utilize yet. To make its capabilities more apparent, I built an integration with the &lt;a href=&quot;https://github.com/powmedia/backbone-forms&quot;&gt;Backbone Forms&lt;/a&gt; library where you can autogenerate quite nice forms on for any type that VIE knows about. For instance, we can generate forms &lt;a href=&quot;http://viejs.org/widgets/forms/&quot;&gt;for Schema.org types&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This will be the key feature for implementing a &lt;a href=&quot;https://github.com/bergie/create/issues/59&quot;&gt;metadata editor&lt;/a&gt; in Create.js, and so it would be nice if CMSs would start providing their content type structure to VIE.&lt;/p&gt;

&lt;h2&gt;New CMS integrations&lt;/h2&gt;

&lt;p&gt;Several of the hackathon attendees came there to work on integrating Create.js with their CMSs. While &lt;a href=&quot;http://createjs.org/guide/&quot;&gt;the documentation&lt;/a&gt; is getting better, it is still good to be able to help developers implement the necessary steps into their systems.&lt;/p&gt;

&lt;p&gt;An interesting new integration is &lt;a href=&quot;http://drupal.org/project/create&quot;&gt;with Drupal&lt;/a&gt;, worked on by Roni Kantis. While Drupal has their own &lt;a href=&quot;http://drupal.org/project/spark&quot;&gt;Spark&lt;/a&gt; inline editing initiative, the Create.js module should show that cross-CMS collaboration in user interfaces is also possible. I hope to be able to demo this in &lt;a href=&quot;http://munich2012.drupal.org/program/sessions/decoupling-content-management&quot;&gt;DrupalCon Munich&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-berlin-hackathon3.jpg&quot; alt=&quot;Defining CreatePHP interfaces&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For PHP projects interested in Create.js, the &lt;a href=&quot;https://github.com/flack/createphp&quot;&gt;CreatePHP&lt;/a&gt; library should make things a lot easier. In the hackathon its interfaces were clarified quite a bit, and now it powers the inline editing capabilities in both &lt;a href=&quot;http://midgard-project.org/midcom/&quot;&gt;MidCOM&lt;/a&gt; and &lt;a href=&quot;http://cmf.symfony.com/&quot;&gt;Symfony CMF&lt;/a&gt;, with &lt;a href=&quot;http://typo3.org/news/article/typo3-phoenix-becomes-iks-early-adaptor/&quot;&gt;TYPO3&lt;/a&gt; coming soon.&lt;/p&gt;

&lt;p&gt;If you consider &lt;a href=&quot;http://bergie.iki.fi/blog/my_secret_agenda_for_php_content_management_systems/&quot;&gt;my secret plan for PHP content management systems&lt;/a&gt; from last summer, there is clearly some progress.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/createjs-symfony-after-berlin-hackathon.png&quot; alt=&quot;Create.js in Symfony CMF&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There was also work done on integrations into popular frameworks like Ruby on Rails and Django. I hope we'll hear more of these in the coming weeks.&lt;/p&gt;

&lt;h2&gt;More visibility for Create.js and Hallo&lt;/h2&gt;

&lt;p&gt;As more and more CMSs are embracing collaboration on the UI level, these projects are becoming quite popular. As I write this, Create.js has &lt;a href=&quot;https://github.com/bergie/create&quot;&gt;1062 watchers&lt;/a&gt; on GitHub, and Hallo &lt;a href=&quot;https://github.com/bergie/hallo&quot;&gt;has 664&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;While watchers don't necessarily mean more contributions, it is certainly nice to see views like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://bergie.iki.fi/files/github-coffeescript-noflo-hallo.png&quot; alt=&quot;Hallo and NoFlo on GitHub&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;WYSIWHAT&lt;/h2&gt;

&lt;p&gt;This week I also participated in the &lt;a href=&quot;https://www.sourcefabric.org/en/community/blog/1268/&quot;&gt;WYSIWHAT event&lt;/a&gt;, where &lt;a href=&quot;https://www.sourcefabric.org/en/&quot;&gt;Sourcefabric&lt;/a&gt; and &lt;a href=&quot;http://oerpub.org/&quot;&gt;OERPUB&lt;/a&gt; were discussing the approaches at rich-text editing of educational and large documents.&lt;/p&gt;

&lt;p&gt;The event is still ongoing, but it seems there is a lot of synergy between what we're doing with &lt;a href=&quot;http://viejs.org&quot;&gt;VIE&lt;/a&gt; and &lt;a href=&quot;http://createjs.org&quot;&gt;Create.js&lt;/a&gt; and their efforts. I'm certainly looking forward to collaborating with them in the future!&lt;/p&gt;
</description>
      <pubDate>Tue, 24 Jul 2012 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fcreatejs-berlin-hackathon%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/createjs-berlin-hackathon/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/createjs-berlin-hackathon/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Video: Decoupling Content Management</title>
      <description>&lt;p&gt;Our concept of &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;Decoupled Content Management&lt;/a&gt;, together with the &lt;a href=&quot;http://viejs.org/&quot;&gt;VIE&lt;/a&gt; and &lt;a href=&quot;http://createjs.org/&quot;&gt;Create.js&lt;/a&gt; is really taking off. I've spent &lt;a href=&quot;http://bergie.iki.fi/blog/decoupled_content_management_on_tour/&quot;&gt;in various conferences&lt;/a&gt; this summer speaking about them.&lt;/p&gt;

&lt;p&gt;Here is &lt;a href=&quot;http://vimeo.com/45633052&quot;&gt;a video&lt;/a&gt; from the talk I gave in the &lt;a href=&quot;http://wiki.iks-project.eu/index.php/Workshops/Salzburg2012&quot;&gt;IKS Salzburg Workshop&lt;/a&gt; last month. It is quite a lot shorter than the more comprehensive talks like the one in Symfony Live, but should introduce the ideas pretty well:&lt;/p&gt;

&lt;iframe src=&quot;http://player.vimeo.com/video/45633052&quot; width=&quot;500&quot; height=&quot;281&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;


&lt;p&gt;Those interested in the background of all this may also enjoy &lt;a href=&quot;http://vimeo.com/12914595&quot;&gt;this video&lt;/a&gt; where we're talking about the concepts behind Create.js together with the &lt;a href=&quot;http://aloha-editor.org/&quot;&gt;Aloha Editor&lt;/a&gt; team back in summer 2010 when things were just getting started.&lt;/p&gt;

&lt;p&gt;IKS has also published a video of &lt;a href=&quot;http://sebastian.germes.in/&quot;&gt;Sebastian Germesin's&lt;/a&gt; &lt;a href=&quot;http://vimeo.com/45639196&quot;&gt;VIE tutorial&lt;/a&gt; from the same event:&lt;/p&gt;

&lt;iframe src=&quot;http://player.vimeo.com/video/45639196&quot; width=&quot;500&quot; height=&quot;281&quot; frameborder=&quot;0&quot; webkitAllowFullScreen mozallowfullscreen allowFullScreen&gt;&lt;/iframe&gt;

</description>
      <pubDate>Thu, 12 Jul 2012 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2Fdecoupling-content-management-video%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/decoupling-content-management-video/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/decoupling-content-management-video/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Elegance matters</title>
      <description>&lt;blockquote&gt;CoffeeScript is to producing JavaScript what Markdown is for producing HTML. Elegance matters.&lt;/blockquote&gt;
</description>
      <pubDate>Sat, 19 Nov 2011 00:00:00 -0800</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2F13024475061%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/13024475061/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/13024475061/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>JavaScript in Qt5</title>
      <description>&lt;blockquote&gt;Qt 5 is bringing JS at the same level of support as C++&lt;/blockquote&gt;&amp;#8212;&lt;p&gt;&lt;a href=&quot;https://twitter.com/#!/quimgil/status/136870216494886912&quot;&gt;Quim Gil&lt;/a&gt;, Nokia&lt;/p&gt;

&lt;p&gt;Great news for mobile developers, as with this you can combine declarative user interfaces with the universal runtime&lt;/p&gt;
</description>
      <pubDate>Wed, 16 Nov 2011 00:00:00 -0800</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2F12888459096%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/12888459096/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/12888459096/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>ShareJS: library for Google Wave -style collaboration</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://sharejs.org/&quot;&gt;ShareJS&lt;/a&gt; is a CoffeeScript library for building Google Wave -style live collaboration features for web applications. MIT license, &lt;a href=&quot;https://github.com/josephg/ShareJS&quot;&gt;in GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a title=&quot;ShareJS launch talk&quot; target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/sineltor/sharejs-launch-talk&quot;&gt;ShareJS launch talk&lt;/a&gt;&lt;/strong&gt; &lt;iframe src=&quot;http://www.slideshare.net/slideshow/embed_code/7685895&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; frameborder=&quot;0&quot; height=&quot;355&quot; scrolling=&quot;no&quot; width=&quot;425&quot;&gt;&lt;/iframe&gt; View more &lt;a target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a target=&quot;_blank&quot; href=&quot;http://www.slideshare.net/sineltor&quot;&gt;Joseph Gentle&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 13 Oct 2011 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2F11389942172%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/11389942172/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/11389942172/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Jison: Building parsers in JavaScript</title>
      <description>&lt;a href=&quot;http://zaa.ch/post/918975802/jison-an-api-for-creating-parsers-in-javascript&quot;&gt;Jison: Building parsers in JavaScript&lt;/a&gt;&lt;br/&gt;&lt;p&gt;&lt;a href=&quot;http://jashkenas.github.com/coffee-script/&quot;&gt;CoffeeScript&lt;/a&gt;, for example, is parsed &lt;a href=&quot;http://jashkenas.github.com/coffee-script/documentation/docs/grammar.html&quot;&gt;using Jison&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Wed, 07 Sep 2011 00:00:00 -0700</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=http%3A%2F%2Fbergie.iki.fi%2Fblog%2F9915181265%2F&amp;user_id=bergie" type="text/html" />
      <link>http://bergie.iki.fi/blog/9915181265/</link>
      <guid isPermaLink="true">http://bergie.iki.fi/blog/9915181265/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
  </channel>
</rss>
