<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Henri Bergius - Bestof</title>
    <description>Latest posts in category 'bestof'</description>
    <link>https://bergie.iki.fi</link>
    <language>en</language>
    <lastBuildDate>Tue, 05 May 2026 19:17:08 +0000</lastBuildDate>
    
    <item>
      
      <title>Building an IoT dashboard with NASA Open MCT</title>
      <description>&lt;p&gt;One important aspect of any Internet of Things setup is being able to collect and visualize data for analysis. Seeing trends in sensor readings over time can be useful for identifying problems, and for coming up with new ways to use the data.&lt;/p&gt;

&lt;p&gt;We wanted an easy solution for this for the &lt;a href=&quot;https://c-base.org&quot;&gt;c-base&lt;/a&gt; IoT setup. Since the &lt;a href=&quot;https://en.wikipedia.org/wiki/C-base#Mythological_self-image_of_the_c-base&quot;&gt;c-base backstory&lt;/a&gt; is that of a crashed space station, using space technology for this made sense.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/c-base-iot-openmct.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/c-base-iot-openmct-small.png&quot; alt=&quot;OpenMCT view on c-base&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://nasa.github.io/openmct/&quot;&gt;NASA Open MCT&lt;/a&gt; is a framework for building web-based mission control tools and dashboards that they’ve released as open source. It is intended for bringing together tools and both historical and real-time data, as can be seen in their &lt;a href=&quot;https://openmct-demo.herokuapp.com/&quot;&gt;Mars Science Laboratory dashboard demo&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;c-beam-telemetry-server&quot;&gt;c-beam telemetry server&lt;/h2&gt;

&lt;p&gt;As a dashboard framework, Open MCT doesn’t really come with batteries included. You get a bunch of widgets and library functionality, but out of the box there is no integration with data sources.&lt;/p&gt;

&lt;p&gt;However, they do provide a &lt;a href=&quot;https://github.com/nasa/openmct-tutorial&quot;&gt;tutorial project&lt;/a&gt; for integrating data sources. We started with that, and built the &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server&quot;&gt;cbeam-telemetry-server&lt;/a&gt; project which gives a very easy way to integrate Open MCT with an existing IoT setup.&lt;/p&gt;

&lt;p&gt;With the c-beam telemetry server we combine Open MCT with the &lt;a href=&quot;https://www.influxdata.com/&quot;&gt;InfluxDB&lt;/a&gt; timeseries database and the &lt;a href=&quot;http://mqtt.org/&quot;&gt;MQTT&lt;/a&gt; messaging bus. This gives a “turnkey” setup for persisting and visualizing IoT information.&lt;/p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting started&lt;/h2&gt;

&lt;p&gt;The first step is to install the c-beam telemetry server. If you want to do a manual setup, first install a MQTT broker, InfluxDB and Node.js. Optionally you can also install CouchDB for sharing custom dashboard layouts between users.&lt;/p&gt;

&lt;p&gt;Then just clone the c-beam telemetry server repo:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;git clone https://github.com/c-base/cbeam-telemetry-server.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Install the dependencies and build Open MCT with:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now you should be able to start the service with:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;running-with-docker&quot;&gt;Running with Docker&lt;/h3&gt;

&lt;p&gt;There is also an easier way to get going: we provide pre-built Docker images of the c-beam telemetry server for both &lt;a href=&quot;https://hub.docker.com/r/cbase/cbeam-telemetry-server/&quot;&gt;x86&lt;/a&gt; and &lt;a href=&quot;https://hub.docker.com/r/cbase/raspberrypi3-cbeam-telemetry-server/&quot;&gt;ARM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are also docker-compose configuration files for both environments. To install and start the whole service with all its dependencies, grab the &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server/blob/master/docker-compose.yml&quot;&gt;docker-compose.yml file&lt;/a&gt; (or the &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server/blob/master/docker-compose-raspberrypi3.yml&quot;&gt;Raspberry Pi 3 version&lt;/a&gt;) and start with:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;docker-compose up &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We’re building these images as part of our continuous integration pipeline (&lt;a href=&quot;https://blog.hypriot.com/post/setup-simple-ci-pipeline-for-arm-images/&quot;&gt;ARM build with this recipe&lt;/a&gt;), so they should always be reasonably up-to-date.&lt;/p&gt;

&lt;h3 id=&quot;configuring-your-data&quot;&gt;Configuring your data&lt;/h3&gt;

&lt;p&gt;The next step is to create a JavaScript &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server/tree/master/config&quot;&gt;configuration file&lt;/a&gt; for your Open MCT. This is where you need to provide a “dictionary” listing all data you want your dashboard to track.&lt;/p&gt;

&lt;p&gt;Data sets are configured like the following (configuring a temperature reading tracked for the 2nd floor):&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;floor2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Dictionary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;2nd floor&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;floor2&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;floor2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addMeasurement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;temperature&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;floor2_temperature&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;units&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;degrees&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;topic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;bitraf/temperature/1&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can have multiple dictionaries in the same Open MCT installation, allowing you to group related data sets. Each measurement needs to have a name and a unit.&lt;/p&gt;

&lt;h3 id=&quot;getting-data-in&quot;&gt;Getting data in&lt;/h3&gt;

&lt;p&gt;In the example above we also supply a MQTT topic to read the measurement from. Now sending data to the dashboard is as easy as writing numbers to that MQTT topic. On command-line that would be done with:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;mosquitto_pub &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; bitraf/temperature/1 &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; 27.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;If you were running the telemetry server when you sent that message, you should’ve seen it appear in the appropriate dashboard.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/bitraf-temperature-graph.jpeg&quot; alt=&quot;Bitraf temperature graph with Open MCT&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are MQTT libraries available for most programming languages, making it easy to connect existing systems with this dashboard.&lt;/p&gt;

&lt;p&gt;The telemetry server is also compatible with our &lt;a href=&quot;https://msgflo.org/&quot;&gt;MsgFlo framework&lt;/a&gt;, meaning that you can also configure the connections between your data sources and Open MCT visually in &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This makes it possible to utilize the existing MsgFlo libraries for implementing data sources. For example, with &lt;a href=&quot;https://github.com/msgflo/msgflo-arduino&quot;&gt;msgflo-arduino&lt;/a&gt; you can transmit sensor data from Tiva-C or NodeMcu microcontrollers to the dashboard.&lt;/p&gt;

&lt;h3 id=&quot;status-and-how-you-can-help&quot;&gt;Status and how you can help&lt;/h3&gt;

&lt;p&gt;The c-beam telemetry server is currently in production use in a couple of hackerspaces, and seems to run quite happily.&lt;/p&gt;

&lt;p&gt;We’d love to get feedback from other deployments!&lt;/p&gt;

&lt;p&gt;If you’d like to help with the project, here are couple of areas that would be great:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Adding tests to the project&lt;/li&gt;
  &lt;li&gt;Implementing &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server/issues/54&quot;&gt;downsampling of historical data&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Figuring out ways to control IoT devices via the dashboard (so, to write to MQTT instead of just reading)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please file issues or make pull requests &lt;a href=&quot;https://github.com/c-base/cbeam-telemetry-server&quot;&gt;to the repository&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Thu, 05 Oct 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnasa-openmct-iot-dashboard%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/nasa-openmct-iot-dashboard/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/nasa-openmct-iot-dashboard/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>NoFlo: six years of JavaScript dataflow</title>
      <description>&lt;p&gt;Quite a bit of time has passed since my &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-two-years/&quot;&gt;two years of NoFlo&lt;/a&gt; post, and it is time to take another look at the state of the &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo ecosystem&lt;/a&gt;. To start with the basics, NoFlo is a JavaScript implementation of &lt;a href=&quot;https://en.wikipedia.org/wiki/Flow-based_programming&quot;&gt;Flow-Based Programming&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In computer programming, flow-based programming (FBP) is a programming paradigm that defines applications as networks of “black box” 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. FBP is thus naturally component-oriented.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With NoFlo software is built by creating graphs that contain reusable components and define the program logic by determining how these components talk to each other.&lt;/p&gt;

&lt;p&gt;I started the NoFlo open source project six years ago in Mountain View, California. My aim was to improve the JavaScript programming experience by bringing the FBP paradigm to the ecosystem. At the time the focus was largely on web API servers and &lt;a href=&quot;https://en.wikipedia.org/wiki/Extract,_transform,_load&quot;&gt;extract, transform, load&lt;/a&gt; (ETL) programs, but the scope has since expanded quite a bit:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;NoFlo is not a web framework or a UI toolkit. It is a way to coordinate and reorganize data flow in any JavaScript application. As such, it can be used for whatever purpose JavaScript can be used for. We know of NoFlo being used for anything from building &lt;a href=&quot;https://thegrid.io&quot;&gt;web servers&lt;/a&gt; and build tools, to coordinating events inside &lt;a href=&quot;https://flowhub.io&quot;&gt;GUI applications&lt;/a&gt;, &lt;a href=&quot;http://meemoo.org/blog/2015-01-14-turtle-power-to-the-people&quot;&gt;driving&lt;/a&gt; &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-ardrone/&quot;&gt;robots&lt;/a&gt;, or building Internet-connected &lt;a href=&quot;https://bergie.iki.fi/blog/ingress-table/&quot;&gt;art installations&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;flowhub&quot;&gt;Flowhub&lt;/h2&gt;

&lt;p&gt;Four years ago I wrote how &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-two-years/#ui-is-the-missing-part&quot;&gt;UI was the missing part&lt;/a&gt; of NoFlo. Later the same year we launched a &lt;a href=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;Kickstarter campaign&lt;/a&gt; to fix this.&lt;/p&gt;

&lt;p&gt;Our promise was to &lt;em&gt;design a new way to build software &amp;amp; manage complexity - a visual development environment for all&lt;/em&gt;.&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment/widget/video.html&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot;&gt; &lt;/iframe&gt;

&lt;p&gt;This was wildly successful, being at the time the 5th highest funded software crowdfunding campaign. The result — &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; — was released to the public &lt;a href=&quot;https://bergie.iki.fi/blog/flowhub-kickstarter-delivery/&quot;&gt;in 2014&lt;/a&gt;. Big thanks to &lt;a href=&quot;https://noflojs.org/kickstarter/&quot;&gt;all of our backers&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Here is how &lt;a href=&quot;https://www.fastcompany.com/3016289/how-an-arcane-coding-method-from-1970s-banking-software-could-save-the-sanity-of-web-develop&quot;&gt;Fast Company wrote about NoFlo&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;If NoFlo succeeds, it could herald a new paradigm of web programming. Imagine a world where anyone can understand and build web applications, and developers can focus on programming efficient components to be put to work by this new class of application architects. In a way, this is the same promise as the “learn to code” movement, which wants to teach everyone to be a programmer. Just without the programming.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With Flowhub you can manage full NoFlo projects in your browser. This includes writing components in JavaScript or CoffeeScript, editing graphs and subgraphs, running and introspecting the software, and creating unit tests. You can keep your project in sync with the GitHub integration.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/station-announcer.png&quot; alt=&quot;Live programming NoFlo in Flowhub&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;celebrating-six-years-of-noflo&quot;&gt;Celebrating six years of NoFlo&lt;/h3&gt;

&lt;p&gt;Earlier this year we &lt;a href=&quot;https://bergie.iki.fi/blog/flowhub-ug/&quot;&gt;incorporated Flowhub in Germany&lt;/a&gt;. Now, to celebrate six years of NoFlo we’re offering a &lt;em&gt;perpetual 30% discount&lt;/em&gt; on &lt;a href=&quot;http://plans.flowhub.io/&quot;&gt;Flowhub plans&lt;/a&gt;. To lock in the discount, subscribe to a Flowhub plan before June 12th 2017 using the code &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;noflo6&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;ecosystem&quot;&gt;Ecosystem&lt;/h2&gt;

&lt;p&gt;While NoFlo itself has by no means taken over the world yet, the overall ecosystem it is part of is looking very healthy. Sure, &lt;a href=&quot;https://medium.com/@ericclemmons/javascript-fatigue-48d4011b6fc4&quot;&gt;JavaScript fatigue&lt;/a&gt; is real, but at the same time it has gone through a pretty dramatic expansion.&lt;/p&gt;

&lt;h3 id=&quot;javascript&quot;&gt;JavaScript&lt;/h3&gt;

&lt;p&gt;As I wrote around the time I started NoFlo, JavaScript has indeed become &lt;a href=&quot;https://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;a universal runtime&lt;/a&gt;. It is used on web browsers, &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;server-side&lt;/a&gt;, as well as for building mobile and desktop applications. And with NoFlo you can target all those platforms with a single programming model and toolchain.&lt;/p&gt;

&lt;p&gt;The de-facto standard for sharing JavaScript libraries — NPM has become &lt;a href=&quot;http://www.modulecounts.com/&quot;&gt;the most popular software repository&lt;/a&gt; for open source modules. Apart from the hundreds of thousands of other packages, you can also get &lt;a href=&quot;https://www.npmjs.com/browse/keyword/noflo&quot;&gt;prebuild NoFlo components&lt;/a&gt; from NPM to cover almost any use case.&lt;/p&gt;

&lt;h3 id=&quot;dataflow&quot;&gt;Dataflow&lt;/h3&gt;

&lt;p&gt;After a long period of semi-obscurity, our Kickstarter campaign greatly increased the awareness in FBP and &lt;a href=&quot;https://en.wikipedia.org/wiki/Dataflow&quot;&gt;dataflow programming&lt;/a&gt;. Several open source projects expanded the reach of FBP to other platforms, like &lt;a href=&quot;http://microflo.org/&quot;&gt;MicroFlo&lt;/a&gt; to microcontroller programming, or &lt;a href=&quot;https://github.com/phpflo/phpflo&quot;&gt;PhpFlo&lt;/a&gt; to data conversion pipelines in PHP. To support more of these with common tooling, we standardized the &lt;a href=&quot;https://flowbased.github.io/fbp-protocol/&quot;&gt;FBP protocol&lt;/a&gt; that allows IDEs like Flowhub manage flow-based programs across different runtimes.&lt;/p&gt;

&lt;p&gt;Dataflow also saw uptake in the bigger industry. &lt;a href=&quot;https://facebook.github.io/flux/&quot;&gt;Facebook’s Flux architecture&lt;/a&gt; brought flow-based programming to reactive web applications. &lt;a href=&quot;https://www.tensorflow.org/&quot;&gt;Google’s TensorFlow&lt;/a&gt; made dataflow the way to build machine learning applications. And &lt;a href=&quot;https://cloud.google.com/dataflow/&quot;&gt;Google’s Cloud Dataflow&lt;/a&gt; uses these techniques for stream processing.&lt;/p&gt;

&lt;h2 id=&quot;tooling-for-flow-based-programming&quot;&gt;Tooling for flow-based programming&lt;/h2&gt;

&lt;p&gt;One big area of focus for us has been improving the tooling around NoFlo, as well as the other FBP systems. The &lt;a href=&quot;https://flowbased.github.io/fbp-protocol/&quot;&gt;FBP protocol&lt;/a&gt; has been a big enabler for both building better tools, and for collaboration between different FBP and dataflow systems.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fbp-protocol.png&quot; alt=&quot;FBP protocol&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here are some of the tools currently available for NoFlo developers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; — browser-based visual programming &lt;strong&gt;IDE&lt;/strong&gt; for NoFlo and other flow-based systems&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/noflo/noflo-nodejs&quot;&gt;noflo-nodejs&lt;/a&gt; — command-line interface for running NoFlo programs on &lt;strong&gt;Node.js&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/noflo/noflo-browser-app&quot;&gt;noflo-browser-app&lt;/a&gt; — template for building &lt;strong&gt;browser applications&lt;/strong&gt; in NoFLo&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://msgflo.org&quot;&gt;MsgFlo&lt;/a&gt; — for running NoFlo and other FBP runtimes as a &lt;strong&gt;distributed system&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/flowbased/fbp-spec&quot;&gt;fbp-spec&lt;/a&gt; — &lt;strong&gt;data-driven tests&lt;/strong&gt; for NoFlo and other FBP environments&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/flowbased/flowtrace&quot;&gt;flowtrace&lt;/a&gt; — tool for &lt;strong&gt;retroactive debugging&lt;/strong&gt; of NoFlo programs. Supports visual replay with Flowhub&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;noflo-08&quot;&gt;NoFlo 0.8&lt;/h2&gt;

&lt;p&gt;NoFlo 0.8, &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-0-8/&quot;&gt;released in March this year&lt;/a&gt; is probably our most important release so far. It introduced a &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-process-api/&quot;&gt;new component API&lt;/a&gt; and greatly clarified the &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-0-8/#component-and-network-lifecycle&quot;&gt;component and network lifecycle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/a17b8582-fc33-11e5-9826-a722b90913ce.png&quot; alt=&quot;NoFlo 0.8 program lifecycle&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With this release, it is easier than ever to build well-behaved NoFlo components and to deal with the mixture of asynchronous and synchronous data processing. It also brings NoFlo a lot closer to the &lt;a href=&quot;http://www.jpaulmorrison.com/fbp/&quot;&gt;classical FBP concepts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As part of the release process, we also fully overhauled the &lt;a href=&quot;https://noflojs.org/documentation/&quot;&gt;NoFlo documentation&lt;/a&gt; and wrote a new &lt;a href=&quot;https://noflojs.org/tutorials/canadianness/&quot;&gt;data transformations tutorial&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;To find out more about NoFlo 0.8, watch my recent &lt;a href=&quot;https://youtu.be/x_nhh3yg-Cs?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;NoFlo talk from Berlin Node.js meetup&lt;/a&gt;:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/x_nhh3yg-Cs?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;road-to-10&quot;&gt;Road to 1.0&lt;/h2&gt;

&lt;p&gt;In addition to providing lots of new APIs and functionality, NoFlo 0.8 also acts as the transitional release as we head towards the big &lt;em&gt;1.0 release&lt;/em&gt;. In this version we marked many old APIs &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-0-8/#deprecated-features&quot;&gt;as deprecated&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;NoFlo 1.0 will essentially be 0.8, but with all the deprecated APIs removed. If you haven’t done so already, now is a good time to upgrade your NoFlo projects to 0.8 and make sure everything runs without deprecation warnings.&lt;/p&gt;

&lt;p&gt;We intend to release NoFlo 1.0 later this summer once more of &lt;a href=&quot;http://github.com/noflo&quot;&gt;our open source component libraries&lt;/a&gt; have been updated to utilize the new features.&lt;/p&gt;
</description>
      <pubDate>Mon, 05 Jun 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnoflo-six-years%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/noflo-six-years/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/noflo-six-years/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Working on an Android tablet, 2017 edition</title>
      <description>&lt;p&gt;Back in 2013 I was &lt;a href=&quot;https://bergie.iki.fi/blog/working-on-android/&quot;&gt;working exclusively on an Android tablet&lt;/a&gt;. Then with the &lt;a href=&quot;https://bergie.iki.fi/blog/noflo-kickstarter-launch/&quot;&gt;NoFlo Kickstarter&lt;/a&gt; I needed a device with a desktop browser. What followed were brief periods working on a Chromebook, on a 12” MacBook, and even an iPad Pro.&lt;/p&gt;

&lt;p&gt;But from April 2016 onwards I’ve been again working with an Android device. Some people have asked me about my setup, and so here is an update.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_travelers_notebook.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_travelers_notebook_small.jpg&quot; alt=&quot;Information technology&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;why-work-on-a-tablet&quot;&gt;Why work on a tablet?&lt;/h2&gt;

&lt;p&gt;When I started on this path in 2013, using a tablet for “real work” was considered crazy. While every story on tablet productivity still brings out the people claiming &lt;em&gt;it is not a real computer for real work&lt;/em&gt;, using &lt;em&gt;tablets for real work&lt;/em&gt; is becoming more and more common.&lt;/p&gt;

&lt;p&gt;A big contributor to this has been the plethora of work-oriented tablets and convertibles released since then. Microsoft’s popular &lt;a href=&quot;https://en.m.wikipedia.org/wiki/Microsoft_Surface&quot;&gt;Surface Pro line&lt;/a&gt; brought the PC to tablet form factor, and Apple’s &lt;a href=&quot;https://en.m.wikipedia.org/wiki/IPad_Pro&quot;&gt;iPad Pro devices&lt;/a&gt; gave the iPad a keyboard.&lt;/p&gt;

&lt;p&gt;Here are couple of great posts talking about how it feels to work on an iPad:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://mattgemmell.com/rediscovering-the-ipad/&quot;&gt;Rediscovering the iPad&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.macworld.com/article/3130710/ios/when-traveling-my-ipad-is-essential-and-my-mac-is-the-add-on.html&quot;&gt;When traveling, my iPad is essential and my Mac is the add-on&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.macstories.net/stories/one-year-of-ipad-pro/&quot;&gt;A Computer for Everything: One Year of iPad Pro&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://brooksreview.net/2016/12/evovling-ipad-desktop-usage/&quot;&gt;Evolving iPad Desktop Usage&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.learningbyshipping.com/my-tablet-has-stickers-8f7ab9022ebd#.vqpn9n2fi&quot;&gt;My Tablet Has Stickers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all the activity going on, one could claim using a tablet for work has been normalized. But why work on a tablet instead of a “real computer”? Here are some reasons, at least for me:&lt;/p&gt;

&lt;h3 id=&quot;free-of-legacy-cruft&quot;&gt;Free of legacy cruft&lt;/h3&gt;

&lt;p&gt;Desktop operating systems have become clunky. Window management. File management. Multiple ways to discover, install, and uninstall applications. Broken notification mechanisms.&lt;/p&gt;

&lt;p&gt;With a tablet you can bypass pretty much all of that, and jump into a simpler, cleaner interface designed for the modern connected world.&lt;/p&gt;

&lt;p&gt;I think this is also the reason driving some developers back to Linux and &lt;a href=&quot;http://swaywm.org&quot;&gt;tiling window managers&lt;/a&gt; — cutting manual tweaking and staying focused.&lt;/p&gt;

&lt;h3 id=&quot;amazing-endurance&quot;&gt;Amazing endurance&lt;/h3&gt;

&lt;p&gt;Admittedly, laptop battery life has increased a lot since 2013. But with some manufacturers using this an excuse to ship thinner devices, tablets still win the endurance game.&lt;/p&gt;

&lt;p&gt;With my current work tablet, I’m customarily getting 12 or more hours of usage. This means I can power through the typical long days of a startup founder without having to plug in. And when traveling, I really don’t have to care where power sockets are located on trains, airplanes, and conference centers.&lt;/p&gt;

&lt;p&gt;Low power usage also means that I can really get a lot of more runtime by utilizing the &lt;a href=&quot;http://www.macworld.com/article/3034575/hardware/anker-powercore-20100-review-a-top-performing-usb-c-battery-pack.html&quot;&gt;mobile battery pack&lt;/a&gt; I originally bought to use with my phone. While I’ve never actually had to try this, back-of-the-envelope math claims I should be able to get a full workweek from the combo without plugging in.&lt;/p&gt;

&lt;h3 id=&quot;work-and-play&quot;&gt;Work and play&lt;/h3&gt;

&lt;p&gt;The other aspect of using a tablet is that it becomes a very nice content consumption device after I’m done working. Simply disconnect the keyboard and lean back, and the same device you used for writing software becomes a great e-reader, video player, or a gaming machine.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_spacex.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_spacex_small.jpg&quot; alt=&quot;Livestreaming a SpaceX launch&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This combined with the battery life has meant that I’ve actually stopped carrying a Kindle with me. While an e-ink screen is still nicer to read, not needing an extra device has its benefits, especially for a frequent one-bag traveller.&lt;/p&gt;

&lt;h2 id=&quot;the-setup&quot;&gt;The setup&lt;/h2&gt;

&lt;p&gt;I’m writing this on a &lt;a href=&quot;https://en.m.wikipedia.org/wiki/Pixel_C&quot;&gt;Pixel C&lt;/a&gt;, a 10.2” Android tablet made by Google. I got the device last spring when there were developer discounts available at ramp-up to the Android 7 release, and have been using it full-time since.&lt;/p&gt;

&lt;h3 id=&quot;software&quot;&gt;Software&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/android_homescreen_2017.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/android_homescreen_2017_small.png&quot; alt=&quot;My Android homescreen&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Surprisingly little has changed in my software use &lt;a href=&quot;https://bergie.iki.fi/blog/working-on-android/&quot;&gt;since 2013&lt;/a&gt; — I still spend the most of the time writing software in either &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; or terminal. Here are the apps I use on daily basis:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.sonelli.juicessh&quot;&gt;JuiceSSH&lt;/a&gt; for mosh access to my remote development servers&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.termux&quot;&gt;Termux&lt;/a&gt; for local and offline development&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; for visual programming&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.thegrid.app&quot;&gt;The Grid&lt;/a&gt; for updating my various websites&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.Slack&quot;&gt;Slack&lt;/a&gt;, &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.talk&quot;&gt;Hangouts&lt;/a&gt;, and &lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.apps.inbox&quot;&gt;Inbox by Gmail&lt;/a&gt; for communications&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.google.android.apps.docs&quot;&gt;Google Drive&lt;/a&gt; and the associated applications for budgeting and planning&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.android.chrome&quot;&gt;Chrome&lt;/a&gt; for web&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking back to the situation in early 2013, the biggest change is that &lt;strong&gt;Slack&lt;/strong&gt; has pretty much killed work email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Termux&lt;/strong&gt; is a new app that has done a lot to improve the local development situation. By starting the app you get a very nice Linux chroot environment where a lot of software is only a quick &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install&lt;/code&gt; away.&lt;/p&gt;

&lt;p&gt;Since much of my non-Flowhub work is done in &lt;em&gt;tmux&lt;/em&gt; and &lt;em&gt;vim&lt;/em&gt;, I get the exactly same working environment on both local chroot and cloud machines by simply installing &lt;a href=&quot;https://github.com/bergie/dotfiles&quot;&gt;my dotfiles&lt;/a&gt; on each of them.&lt;/p&gt;

&lt;h3 id=&quot;keyboard&quot;&gt;Keyboard&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_laptop.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_laptop_small.jpg&quot; alt=&quot;Laptop tablet&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I’m on the road I’m using the &lt;a href=&quot;http://www.anandtech.com/show/9972/the-google-pixel-c-review/7&quot;&gt;Pixel C keyboard&lt;/a&gt;. This doubles as a screen protector, and provides a reasonable laptop-like typing environment. It attaches to the tablet with very strong magnets and allows a good amount of flexibility on the screen angles.&lt;/p&gt;

&lt;p&gt;However, when stationary, no laptop keyboard compares to a real mechanical keyboard. When I’m in the office I use a &lt;a href=&quot;http://www.cultofmac.com/290750/filco-minila-air-bluetooth-keyboard-review/&quot;&gt;Filco MiniLa Air&lt;/a&gt;, a bluetooth keyboard with quiet-ish Cherry MX brown switches.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_desktop.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_desktop_small.jpg&quot; alt=&quot;Desktop tablet&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tenkeyless (60%) keyboard is extremely comfortable to type on. However, the sturdy metal case means that it is a little too big and heavy to carry on a daily basis.&lt;/p&gt;

&lt;p&gt;In practice I’ve only taken the mechanical keyboard with me when there has been a longer trip where I know that I’ll be doing a lot of typing. To solve this, I’m actually &lt;a href=&quot;https://www.instagram.com/p/BP0lNxJDng_/?taken-by=henribergius&quot;&gt;looking to build&lt;/a&gt; a more compact custom mechanical keyboard so I could always have it with me. (&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href=&quot;http://bergie.iki.fi/blog/atreus-build-log/&quot;&gt;here is the keyboard I built&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id=&quot;comparison-with-ios&quot;&gt;Comparison with iOS&lt;/h2&gt;

&lt;p&gt;So, why work on Android instead of getting an iPad Pro? I’ve actually worked on both, and here are my reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Communications between apps&lt;/strong&gt;: while iOS has extensions now, the ability to send data from an app to another is still a hit-or-miss. Android had intents from day one, meaning pretty much any app can talk to any other app&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Standard charging&lt;/strong&gt;: all of my other devices charge with the same USB-C chargers and cables. iPads still use the proprietary Lightnight plug, requiring custom dongles for everything&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Standard accessories&lt;/strong&gt;: this boils down to USB-C just like charging. With Android I can plug in a network adapter or even a mouse, and it’ll just work&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Ecosystem lock-in&lt;/strong&gt;: we’re moving to a world where everything — from household electronics to cars — is either locked to the Apple ecosystem or following standards. I don’t want to be locked to a single vendor for everything digital&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Browser choice&lt;/strong&gt;: with iOS you only get one web renderer, the rather dated Safari. On Android I can choose between Chrome, Firefox, or any other browser that has been ported to the platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, iOS has its own benefits. Apple has a stronger stance on privacy than Google. And there is more well-made tablet software available for iPads than Android. But when almost everything I use is available on the web, this doesn’t matter that much.&lt;/p&gt;

&lt;h2 id=&quot;the-future&quot;&gt;The future&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_cbase.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/android-tablet-2017/pixel_c_cbase_small.jpg&quot; alt=&quot;Hacking on the c-base patio&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a software developer working on Android tablets, the weakest point of the platform is still that there are &lt;em&gt;no browser developer tools&lt;/em&gt; available. This was a problem in 2013, and it is still a problem now.&lt;/p&gt;

&lt;p&gt;From my conversations with some Chrome developers, it seems Google has very little interest in addressing this. However, there is a bright spot: the new breed of convertible Chromebooks being released now. And they run Android apps:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.wired.com/2016/09/chromebooks-totally-transform-laptop-design/&quot;&gt;How Chromebooks Are About to Totally Transform Laptop Design&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chromeunboxed.com/detachable-chromebooks-pixel-c-and-the-future-of-chrome-os/&quot;&gt;Detachable Chromebooks, Pixel C And The Future Of Chrome OS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://arstechnica.com/gadgets/2017/02/samsungs-chromebook-pro-a-thoughtful-marriage-of-android-and-chrome-os/&quot;&gt;Samsung’s Chromebook Pro gives me hope in Chrome OS—thanks to Android’s help&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chrome OS is another clean, legacy free, modern computing interface. With these new devices you get the combination of a full desktop browser and the ability to run all Android tablet software.&lt;/p&gt;

&lt;p&gt;The Samsung Chromebook Pro/Plus mentioned above is definitely interesting. A high-res 12” screen and a digital pen which I see as something very promising for &lt;a href=&quot;https://flowhub.io&quot;&gt;visual programming&lt;/a&gt; purposes.&lt;/p&gt;

&lt;p&gt;However, given that I already have a great mechanical keyboard, I’d love a device that shipped without an attached keyboard. We’ll see what kind of devices get out later this year.&lt;/p&gt;
</description>
      <pubDate>Fri, 10 Feb 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fworking-on-android-2017%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/working-on-android-2017/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/working-on-android-2017/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Sailing across the Atlantic</title>
      <description>&lt;p&gt;Exactly a year ago today we flew from Berlin to Tenerife to depart on a sailing trip across the Atlantic on the Finnish &lt;a href=&quot;http://www.staf.fi/&quot;&gt;sail training schooner T/S Helena&lt;/a&gt;. &lt;a href=&quot;https://thegrid.io/#6&quot;&gt;The Grid&lt;/a&gt; had just reached 10.000 founding members, and it was time to charge batteries before the next big push towards the beta.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-from-bow.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-from-bow.jpg&quot; alt=&quot;Helena somewhere mid-Atlantic&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had sailed on Helena once before, on a &lt;a href=&quot;https://www.flickr.com/photos/bergie/albums/72157627151152865&quot;&gt;weekend trip in the Turku archipelago&lt;/a&gt;. But crossing the Atlantic would be a more interesting adventure. For a month this two-masted tall ship would be our home on the ocean.&lt;/p&gt;

&lt;h2 id=&quot;departure&quot;&gt;Departure&lt;/h2&gt;

&lt;p&gt;Arriving to the harbour, Helena was easy to find moored next to a Czech “pirate ship”. We registered with the captain and got assigned to the first watch, and then went out for a dinner dinner and some wine with some friends from Berlin who happened to be holidaying on the island.&lt;/p&gt;

&lt;p&gt;The next day was busy with provisioning the ship and getting to know the rest of the crew. Every possible nook and cranny would be filled with fruits, fresh produce, water, and other things needed on the long trip.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-meal.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-meal.jpg&quot; alt=&quot;First meal on board&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The ship’s electricity system also needed some repairs, causing delays with the departure. But at the last moment to catch the high tide, on the evening of November 24th, Helena sounded the three long blasts on the foghorn and we were on the way!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-departure.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-departure.jpg&quot; alt=&quot;Departure from Tenerife&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Almost immediately after leaving port, we encountered the larger waves of the ocean. This caused some discomfort for many of our students. Our first watch was on kitchen duty, and there were several moments where there was a need to get out of the fumes and out in the fresh air to get one’s bearings.&lt;/p&gt;

&lt;p&gt;But human beings being as adaptable as they are, by the next day any signs of seasickness would be gone from pretty much everybody, and the whole group could enjoy the adventure ahead.&lt;/p&gt;

&lt;h2 id=&quot;ts-helena&quot;&gt;T/S Helena&lt;/h2&gt;

&lt;p&gt;Built in 1992, the steel hulled schooner &lt;a href=&quot;https://fi.wikipedia.org/wiki/Kuunari_Helena&quot;&gt;T/S Helena&lt;/a&gt; is the main training ship of the &lt;a href=&quot;http://www.staf.fi/&quot;&gt;Finnish Sail Training Association&lt;/a&gt;. Displacing 110 tons and with length of 38 meters, it is not a small sailboat.&lt;/p&gt;

&lt;p&gt;It has a capacity of accommodating 28 crew members and students, as has undertaken many epic adventures on its journey. Cape Horn following the trail of frigate &lt;a href=&quot;https://en.wikipedia.org/wiki/Suomen_Joutsen&quot;&gt;Suomen Joutsen&lt;/a&gt;, north to &lt;a href=&quot;https://en.wikipedia.org/wiki/Svalbard&quot;&gt;Svalbard&lt;/a&gt;, and many many Atlantic crossings.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.staf.fi/Tietoja_meist%C3%A4/Kuunari_Helena&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-floorplan.jpg&quot; alt=&quot;Helena floor plan&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside the ship we’d have cabins for each of the four watches, and a separate area for the professional crew. Also, several restrooms, a shower room, and a kitchen and lounging area.&lt;/p&gt;

&lt;p&gt;While the primary means of moving the ship is by sail, it is also outfitted with a powerful engine, as well as an auxiliary power unit for producing electricity and making drinking water.&lt;/p&gt;

&lt;h2 id=&quot;life-on-board&quot;&gt;Life on board&lt;/h2&gt;

&lt;p&gt;While underway, the life on board of Helena is dominated by the traditional naval &lt;a href=&quot;https://en.wikipedia.org/wiki/Watch_system&quot;&gt;watch system&lt;/a&gt;, where the crew is divided into four watches, each with their own cabin.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/steering-helena.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/steering-helena.jpg&quot; alt=&quot;Steering Helena&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The watch on deck duty handles all the sailing tasks of steering the ship, adding or removing sails, as well as navigation and monitoring the radio and AIS. The watch on standby makes and serves the meals, as well as keeping the ship clean.&lt;/p&gt;

&lt;p&gt;When on free watch there is time to sleep, read, and relax on the deck. The cabins are quite a tight fit, and so on the nice warm tropical nights many preferred to sleep inside the sail stash on the deck.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-cabin.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-cabin.jpg&quot; alt=&quot;First watch cabin&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alongside the normal duties there were lessons on sailing theory, navigation, safety equipment, knots, and other matters. Various students had also been tasked with giving lectures on the islands of Cape Verde and Barbados where we were stopping, as well as on marine life.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-lesson.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-lesson.jpg&quot; alt=&quot;Barbados lecture&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The three warm meals of the day were obviously a highlight, with the crews ending up in friendly competition on what kind of epic meals could be made of the supplies. And this being a Finnish institution, on Thursday the lunch is always pea soup and pancakes.&lt;/p&gt;

&lt;p&gt;As always, when food is good, everything goes smoother. The last cooking shift of my First Watch ended on a high note, when we prepared rum-marinated swordfish with garlic mashed potatoes.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-kitchen.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-kitchen.jpg&quot; alt=&quot;In the kitchen&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Along the way provisions would of course dwindle, and once all fresh fruit and bread had been consumed, the kitchen shift would also start to include baking bread.&lt;/p&gt;

&lt;p&gt;While the space is tight on the ship, and you’re rubbing elbows with other crew members pretty much everywhere onboard, there are still some places that are more secluded and fitting for relaxation. Especially the bowsprit has proven to be a place where one can focus on meditation and the open ocean.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-bowsprit.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-bowsprit.jpg&quot; alt=&quot;Bowsprit&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing that I didn’t consider before the trip is how sticky everything would be through the constant presence of sea salt and sweat. The cabins were hot, and since there were issues with the water maker, we had to wash ourselves and do laundry with sea water.&lt;/p&gt;

&lt;p&gt;In these conditions we’d often freshen up with a “prison shower” where the whole crew lined up and were washed with the firehose. But a highlight was definitely when while becalmed we were able to stop the ship and go for a swim in the middle of the Atlantic. Only five kilometers deep below…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-swimbreak.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-swimbreak.jpg&quot; alt=&quot;Swim break&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;night-sailing&quot;&gt;Night sailing&lt;/h2&gt;

&lt;p&gt;One of the most memorable parts of the trip were the nights when our watch was on deck duty. Steering the big ship by stars, just like ancient Phoenicians.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-night.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-night.jpg&quot; alt=&quot;Night sailing on the Atlantic&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or when somebody else was manning the wheel just enjoying the constant shooting stars of the Geminid meteor shower, the play of moonlight on the sails and the sea, and even an occasional dolphin jumping by the ship, lit with phytoplankton.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-night-navigation.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-night-navigation.jpg&quot; alt=&quot;Night navigation&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-route&quot;&gt;The route&lt;/h2&gt;

&lt;p&gt;Starting from Tenerife, we followed the traditional &lt;a href=&quot;https://en.wikipedia.org/wiki/Volta_do_mar&quot;&gt;Age of Sail route&lt;/a&gt; along the coast of Africa to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Cape_Verde&quot;&gt;Cape Verde&lt;/a&gt; islands, where we stopped for some provisions and recreation in the sleepy town of &lt;a href=&quot;https://en.wikipedia.org/wiki/Mindelo&quot;&gt;Mindelo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-mindelo-arrival.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-mindelo-arrival.jpg&quot; alt=&quot;Arrival to Mindelo&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After Cape Verde we headed west across the ocean, setting out sights for the island of Barbados.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-sunset.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-sunset.jpg&quot; alt=&quot;Sunset near Barbados&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After some sightseeing and sail repairs, the route continued past the Sail Rock to the &lt;a href=&quot;https://en.wikipedia.org/wiki/Tobago_Cays&quot;&gt;Tobago Cays&lt;/a&gt; marine park, where we stopped to enjoy a very nice lobster dinner on the beach.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-pitons.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-pitons.jpg&quot; alt=&quot;Piton mountains, Saint Lucia&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then the trip continued northwards to St. Lucia, stopping in Marigot Bay for a farewell dinner.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-marigot.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-marigot.jpg&quot; alt=&quot;Marigot Bay&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our final port of call was Le Marin on the French colony of Martinique. So, in a way we did a very long sailing trip to get from Spain to France!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-ceremony.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-ceremony.jpg&quot; alt=&quot;Crossing-over ceremony&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A traditional “crossing of the Atlantic” ceremony was held and then it was time to leave the ship and return to being a pedestrian traveler.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-dinghy.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-dinghy.jpg&quot; alt=&quot;Leaving Helena&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;christmas-in-the-caribbean&quot;&gt;Christmas in the Caribbean&lt;/h2&gt;

&lt;p&gt;It didn’t feel sensible to fly home directly, and so we decided to spend the Christmas on Martinique. This ended up being a very relaxed few days with nice cheese and wine and a candlelit balcony, as the power went out from the part of the island where we were on.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/martinique-wine.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/martinique-wine.jpg&quot; alt=&quot;Wine on Martinique&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since our flights were from St. Lucia, we ended up finding an Australian catamaran that we were able to commission to take us across. After the strict routines of a sail training vessel, it was quite a culture shock to get on a recreational sailboat.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/catamaran.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/catamaran.jpg&quot; alt=&quot;Back towards Saint Lucia&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We still got our last glimpse of Helena on the trip by accident. As we were watching the sun set behind the &lt;a href=&quot;https://en.wikipedia.org/wiki/Pitons&quot;&gt;Piton&lt;/a&gt; mountains from our hotel balcony in Soufriere, the ship glid majestically across the bay, getting ready to anchor somewhere outside of the marina.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/helena-across-the-bay.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/sailing-across-the-atlantic/small/helena-across-the-bay.jpg&quot; alt=&quot;Helena across the bay&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that was another crew, embarking on an adventure of their own. For us it was time to fly home and prepare for another hectic &lt;a href=&quot;https://medium.com/@brianaxe/the-grid-an-unconventional-startup-b823f544449d&quot;&gt;Grid meetup in Hawaii&lt;/a&gt;.&lt;/p&gt;

</description>
      <pubDate>Sun, 22 Nov 2015 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fsailing-across-the-atlantic%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/sailing-across-the-atlantic/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/sailing-across-the-atlantic/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Flowhub public beta: a better interface for Flow-Based Programming</title>
      <description>&lt;p&gt;Today I’m happy to announce the &lt;a href=&quot;http://flowhub.io#app-scope&quot;&gt;public beta&lt;/a&gt; of the &lt;a href=&quot;http://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; interface for Flow-Based Programming. This is the latest step in the adventure that started with &lt;a href=&quot;http://bergie.iki.fi/blog/inspiration-for-fbp-ui/&quot;&gt;some UI sketching&lt;/a&gt; early last year, went through our &lt;a href=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;successful Kickstarter&lt;/a&gt; — and now — thanks to our &lt;a href=&quot;https://noflojs.org/kickstarter/&quot;&gt;1 205 backers&lt;/a&gt;, it is available to the public.&lt;/p&gt;

&lt;h2 id=&quot;getting-started&quot;&gt;Getting Started&lt;/h2&gt;

&lt;p&gt;This post will go into more detail on how the new Flowhub interface works in a bit, but for those who want to dive straight in, here are the relevant links:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.flowhub.io&quot;&gt;Hosted web version of Flowhub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/flowhub/aacpjichompfhafnciggfpfdpfododlk&quot;&gt;Flowhub Chrome App&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to read the &lt;a href=&quot;http://flowhub.io/documentation/&quot;&gt;Getting Started guides&lt;/a&gt; and check out the &lt;a href=&quot;http://flowhub.io/documentation/flowhub-faq/&quot;&gt;Flowhub FAQ&lt;/a&gt;. There is also a &lt;a href=&quot;http://flowhub.io/#video&quot;&gt;new video available&lt;/a&gt;:&lt;/p&gt;

&lt;iframe width=&quot;640&quot; height=&quot;360&quot; src=&quot;https://bergie.iki.fi//www.youtube.com/embed/8Dos61_6sss&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Both the web version and the Chrome app are built following the &lt;a href=&quot;http://offlinefirst.org/&quot;&gt;offline first&lt;/a&gt; philosophy, and keep everything you need stored locally inside your browser. The Chrome app and the upcoming iOS and Android builds will enable us to later introduce capabilities that are not possible inside regular browsers, like talking directly to &lt;a href=&quot;http://microflo.org/&quot;&gt;MicroFlo&lt;/a&gt; runtimes over USB or Bluetooth. But other than that they’re similar in features and user experience.&lt;/p&gt;

&lt;h2 id=&quot;new-user-interface&quot;&gt;New User Interface&lt;/h2&gt;

&lt;p&gt;If you read the &lt;a href=&quot;http://bergie.iki.fi/blog/noflo-update/&quot;&gt;NoFlo Update from last October&lt;/a&gt;, you might notice that the new Flowhub user interface looks and feels quite different from it.
&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-main.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-main-small.png&quot; alt=&quot;Main screen of new Flowhub UI&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-menu.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-menu-small.png&quot; alt=&quot;Graph editing in new Flowhub UI&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This new design was implemented to improve touch-screen friendliness, as well as to give Flowhub a more focused, unique look. It also allowed us to follow some interesting UX paths that I’ll explain next.&lt;/p&gt;

&lt;h3 id=&quot;zooming&quot;&gt;Zooming&lt;/h3&gt;

&lt;p&gt;One typical problem in visual programming tools is that they can become quite cluttered with information. To solve this, we utilized the concept of &lt;a href=&quot;http://en.wikipedia.org/wiki/Zooming_user_interface&quot;&gt;Zooming User Interfaces&lt;/a&gt;, which allow us to show a clear overview of a program when zoomed out, and reveal all kinds of detail about it when zoomed in.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-zoom-out-small.png&quot; alt=&quot;Zoomed out&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-zoom-in-small.png&quot; alt=&quot;Zoomed in&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Zooming works with two-finger scroll on typical desktop computers, or with the pinch gesture on touch-enabled devices.&lt;/p&gt;

&lt;h3 id=&quot;pie-menu&quot;&gt;Pie Menu&lt;/h3&gt;

&lt;p&gt;Another interface concept that we used to make interactions faster and more contextual is &lt;a href=&quot;http://en.wikipedia.org/wiki/Pie_menu&quot;&gt;Pie Menus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, you can easily navigate to subgraphs and component source code with the menu:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-menu-navigation-small.png&quot; alt=&quot;Navigating with the Pie Menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you have selected multiple nodes, you can use the menu to group them or move them to a new subgraph:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-menu-group-small.png&quot; alt=&quot;Group selections with the Pie Menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The menu can also be used for removing edges or nodes:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-menu-edge-small.png&quot; alt=&quot;Deleting an edge with the Pie Menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can activate the pie menu in the graph editor with a right mouse click, or with a long press on touch-enabled devices.&lt;/p&gt;

&lt;h3 id=&quot;component-editor&quot;&gt;Component Editor&lt;/h3&gt;

&lt;p&gt;Another new major feature is in-app component editing. If your runtime supports it, you can at any time create or modify &lt;a href=&quot;https://noflojs.org/documentation/components/&quot;&gt;custom components&lt;/a&gt; for your project and they’ll become immediately available for your graphs.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-new-component-small.png&quot; alt=&quot;Creating a new component&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-component-editor-small.png&quot; alt=&quot;Component Editing&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The programming languages available for component creation depend on the runtime. With NoFlo these are JavaScript and CoffeeScript. With another runtime they might be C, Java, or Python.&lt;/p&gt;

&lt;h3 id=&quot;offline-first&quot;&gt;Offline First&lt;/h3&gt;

&lt;p&gt;While some claim that &lt;a href=&quot;http://signalvnoise.com/posts/347-youre-not-on-a-fucking-plane-and-if-you-are-it-doesnt-matter&quot;&gt;in reality you’re never offline&lt;/a&gt;, the reality is that there are many situations where Internet connectivity is either not available, unreliable, or simply expensive. Think of a typical conference or a hackathon for instance.&lt;/p&gt;

&lt;p&gt;Because of this — and to give software developers the privacy they deserve — Flowhub has been designed to work “offline first”. All your graphs, projects, and custom components are stored locally in your browser’s &lt;a href=&quot;http://en.wikipedia.org/wiki/Indexed_Database_API&quot;&gt;Indexed Database&lt;/a&gt; and only transmitted over the network when you wish to push to a GitHub project, or interact with a remote runtime.&lt;/p&gt;

&lt;p&gt;We’re following a very similar UI concept as &lt;a href=&quot;https://kindle.amazon.com/&quot;&gt;Amazon Kindle&lt;/a&gt; in that you can download projects locally to your device, or browse the ones you have available in the cloud:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-projects-small.png&quot; alt=&quot;Local and remote projects&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At any point you can push your changes to a graph or a component to GitHub:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-push-small.png&quot; alt=&quot;Pushing to GitHub&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Runtime discovery happens through a central service, but once you know the address of your FBP runtime, the communications between it and your browser will happen directly. This makes it easy to work with Node.js projects running on your own machine even when offline.&lt;/p&gt;

&lt;h2 id=&quot;cross-platform-full-stack&quot;&gt;Cross-platform, Full-stack&lt;/h2&gt;

&lt;p&gt;When we launched the &lt;a href=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;NoFlo UI Kickstarter&lt;/a&gt;, we were initially only thinking about how to support NoFlo in different environments. But in the course of development we ended up defining a &lt;a href=&quot;https://noflojs.org/documentation/protocol/&quot;&gt;network protocol for FBP&lt;/a&gt; that enabled us to move past just a single FBP environment and towards supporting all of them. This is what prompted the &lt;a href=&quot;http://bergie.iki.fi/blog/flowhub/&quot;&gt;Flowhub rebranding&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since then, the number of supported FBP environments has been growing. Here is a list of the ones I’m aware of:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;browsers&lt;/li&gt;
      &lt;li&gt;Node.js&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://bergie.iki.fi/blog/flowhub-gnome-dx/&quot;&gt;GNOME desktop&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://microflo.org/&quot;&gt;MicroFlo&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;microcontrollers&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.jonnor.com/2014/04/imgflo-0-1-an-image-processing-server-and-flowhub-runtime/&quot;&gt;ImgFlo&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;image processing with &lt;a href=&quot;http://www.gegl.org/&quot;&gt;GEGL&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jonnor/protoflo&quot;&gt;ProtoFlo&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Python&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope that the developers of other FBP environments like &lt;a href=&quot;http://sourceforge.net/projects/flow-based-pgmg/&quot;&gt;JavaFBP&lt;/a&gt; and &lt;a href=&quot;https://github.com/trustmaster/goflow&quot;&gt;GoFlow&lt;/a&gt; add support for the FBP protocol soon so that they can also utilize the Flowhub interface.&lt;/p&gt;

&lt;h2 id=&quot;open-source-vs-paid&quot;&gt;Open Source vs. Paid&lt;/h2&gt;

&lt;p&gt;As promised in our Kickstarter, the &lt;a href=&quot;https://github.com/noflo/noflo-ui&quot;&gt;NoFlo Development Environment&lt;/a&gt; is an open source project available under the MIT license.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://flowhub.io/&quot;&gt;Flowhub&lt;/a&gt; is a branded and supported instance of that with some additional network services like the Runtime Registry.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-ui-vs-flowhub.png&quot; alt=&quot;NoFlo UI vs. Flowhub&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://flowhub.io/preorder/&quot;&gt;Flowhub plans&lt;/a&gt; allow us to continue development of this Flow-Based Programming toolset, as well as to provide the various network services needed for making the experience smooth.&lt;/p&gt;

&lt;p&gt;Just like &lt;a href=&quot;https://github.com/pricing&quot;&gt;with GitHub&lt;/a&gt;, Flowhub provides &lt;em&gt;a free environment for anybody working on public and open source projects&lt;/em&gt;. Private projects need &lt;a href=&quot;http://flowhub.io/preorder/&quot;&gt;a paid plan&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;kickstarter--pre-ordered-plans&quot;&gt;Kickstarter &amp;amp; Pre-Ordered Plans&lt;/h3&gt;

&lt;p&gt;It is likely that many readers of this post already supported our Kickstarter or pre-ordered a Flowhub plan. Since Flowhub is still in beta, &lt;em&gt;we haven’t activated your plans yet&lt;/em&gt;. So for now, everybody is using Flowhub with the free plan.&lt;/p&gt;

&lt;p&gt;We will be rolling out the paid plans and Kickstarter rewards towards the end of the beta testing period.&lt;/p&gt;

&lt;p&gt;Feel free to already log in and start using Flowhub, however! The plan will be added to your account when we feel the software is ready for it.&lt;/p&gt;

&lt;h2 id=&quot;examples&quot;&gt;Examples&lt;/h2&gt;

&lt;p&gt;Here are some examples of things you can build with Flowhub targeting web browsers:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.flowhub.io/#example/7804187&quot;&gt;Photo booth&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.flowhub.io/#example/7135158&quot;&gt;Animated clock&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.flowhub.io/#example/1319c76fe006fb34c9c9&quot;&gt;Canvas pattern generator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a more comprehensive cross-platform project, see my &lt;a href=&quot;http://bergie.iki.fi/blog/ingress-table/&quot;&gt;Building an Ingress Table with Flowhub&lt;/a&gt; post.&lt;/p&gt;

&lt;p&gt;There is also an &lt;a href=&quot;http://meemoo.org/blog/2014-05-06-summer-of-code-2014/&quot;&gt;ongoing Google Summer of Code project&lt;/a&gt; to port various &lt;a href=&quot;http://meemoo.org/hack-our-apps/&quot;&gt;Meemoo apps&lt;/a&gt; to Flowhub. This will hopefully result in a lot more demos.&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;The main purpose of this public beta is to allow our backers and other FBP enthusiasts an early access to the Flowhub user interface. Now we will focus on stabilization and bug fixing, aided by the &lt;a href=&quot;https://github.com/noflo/noflo-ui/issues?state=open&quot;&gt;NoFlo UI issue tracker&lt;/a&gt;. We’re also gathering feedback from beta testers in form of user surveys and will utilize those to prioritize both bug fixing and feature work.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-florence-small.jpg&quot; alt=&quot;Flowhub team testing the UI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Right now the main areas of focus are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/noflo/noflo-ui/issues/218&quot;&gt;Improving the GitHub integration&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Landing the &lt;a href=&quot;https://github.com/noflo/noflo-ui/issues/53&quot;&gt;graph autolayout feature&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/noflo/noflo-ui/issues/45&quot;&gt;Compatibility with upcoming Chrome 35&lt;/a&gt; and its native HTML5 Custom Elements support&lt;/li&gt;
  &lt;li&gt;Implementing real-time collaboration over WebRTC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We hope to release the stable version of Flowhub in summer 2014.&lt;/p&gt;
</description>
      <pubDate>Wed, 07 May 2014 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fflowhub-beta%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/flowhub-beta/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/flowhub-beta/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Building an Ingress Table with Flowhub</title>
      <description>&lt;p&gt;The &lt;a href=&quot;http://c-base.org/&quot;&gt;c-base space station&lt;/a&gt; — a culture carbonite and a hackerspace — is the focal point of Berlin’s thriving tech scene. It is also the place where many of the city’s &lt;a href=&quot;http://www.ingress.com/&quot;&gt;Ingress&lt;/a&gt; agents converge after an evening of hectic raiding or farming.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-cbase-pacman.png&quot; alt=&quot;An Ingress event at c-base&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In February we came with an idea on combining our dual passions of open source software and Ingress in a new way. &lt;a href=&quot;http://jonnor.com/&quot;&gt;Jon Nordby&lt;/a&gt; from &lt;a href=&quot;https://bitraf.no/&quot;&gt;Bitraf hackerspace&lt;/a&gt; in Oslo had recently shown off the &lt;a href=&quot;http://bergie.iki.fi/blog/full-stack-fbp/&quot;&gt;new full-stack development capabilities&lt;/a&gt; of &lt;a href=&quot;http://flowhub.io/&quot;&gt;Flowhub&lt;/a&gt; made possible by integrating my &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; flow-based programming framework for JavaScript and his &lt;a href=&quot;http://microflo.org/&quot;&gt;MicroFlo&lt;/a&gt; giving similar abilities to microcontroller programming. So why not use them to build something awesome?&lt;/p&gt;

&lt;p&gt;Since Flowhub is nearing a public beta, this would also give us a way to showcase some of the possibilities, as well as stress-test Flow-Based Programming in a Internet-connected hardware project. Often hackerspace projects tend to stretch from months to infinity; our experiences with &lt;a href=&quot;http://bergie.iki.fi/blog/noflo-ardrone/&quot;&gt;NoFlo and flying drones&lt;/a&gt; already showed that with FBP we can easily parallelize development, challenging some of the central dogmas of &lt;a href=&quot;http://en.wikipedia.org/wiki/The_Mythical_Man-Month&quot;&gt;the Mythical Man Month&lt;/a&gt;. It was worth a try to see if this would allow us to compress the time needed for such a project from a couple of months to a long weekend.&lt;/p&gt;

&lt;h2 id=&quot;introducing-the-ingress-table&quot;&gt;Introducing the Ingress Table&lt;/h2&gt;

&lt;p&gt;Before the actual hackathon we had two meetings with the project team. There were many decisions to be made, starting from the size and shape of the table to the features it should have. Looking at the different tables in the c-base main hall we settled on a square table of slightly less than 1m&lt;sup&gt;2&lt;/sup&gt;, as that would fit nicely in the area, and still seat the magical number of eight Ingress agents or other c-base regulars.&lt;/p&gt;

&lt;p&gt;The tabletop would be a map of c-base and the surrounding area, and it would show the status of the portals nearby, as well as alert people sitting at it of attacks and other Ingress events of interest. Essentially, it’d be a physical world equivalent of &lt;a href=&quot;http://www.ingress.com/intel?ll=52.513243,13.416667&amp;amp;z=17&quot;&gt;the Intel Map&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-cbase-map.png&quot; alt=&quot;Intel Map of the area&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We considered integrating a regular screen to have maximum flexibility in the face of the changing world of Ingress, but eventually decided that most people at c-base already spend much of their waking hours looking at a screen, and so we’d do something more ambient and just use a set of physical lights.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-exploded.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-exploded-small.jpg&quot; alt=&quot;Exploded view&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-assembled.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-assembled-small.jpg&quot; alt=&quot;Assembled view&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hardware and software also needed some thought, especially since some of the parts needed might have long shipping times. Eventually we settled on the combination of a &lt;a href=&quot;http://beagleboard.org/Products/BeagleBone+Black&quot;&gt;BeagleBone Black&lt;/a&gt; ARM computer as the brains of the system, and a &lt;a href=&quot;http://www.ti.com/tool/ek-tm4c123gxl&quot;&gt;LaunchPad Tiva&lt;/a&gt; as the microcontroller running the hardware. The computer would run NoFlo on Linux, and we’d flash the microcontroller with MicroFlo.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-bbb-small.jpg&quot; alt=&quot;Our BeagleBone Black&quot; /&gt;&lt;/p&gt;

&lt;p&gt;By the time of arriving to c-base, many Ingress agents have their phones and battery packs depleted, and so we incorporated eight USB power ports into the table design. Simply plug in your own cable and you can charge your device while enjoying the beer and the chat.&lt;/p&gt;

&lt;p&gt;Once the plans had been set, a flurry of preparations began. We would need lots of things, ranging from wood and glass parts for the table shell, to various different electronics and computer parts for the insides. And some of these would have to be ordered from China. Would they arrive in time?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-render.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-render-small.jpg&quot; alt=&quot;Design gender of the table&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I spent the two weeks before the hackathon doing a project in Florence, and it was quite interesting to coordinate the logistics remotely. Thankfully our Berlin team did a stellar job of tracking missing shipments and collecting the things we needed!&lt;/p&gt;

&lt;h2 id=&quot;the-hackathon&quot;&gt;The hackathon&lt;/h2&gt;

&lt;p&gt;I landed in Berlin in the early evening of Friday, March 14th. After negotiating the rush hour public transport of the Tegel airport, I arrived to the space station to see most of our team already there, unpacking and getting the supplies ready for the hackathon.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-wood.png&quot; alt=&quot;Buying the materials&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At this point we essentially had only the raw materials available. Planks of wood, plates of glass and plastic. And a lot of electronics components. No assembly had yet been done, and no lines of code had been written or graphs drawn for the project.&lt;/p&gt;

&lt;p&gt;We quickly organized the hackathon into three tracks: hardware, software, and electronics. The hardware team got themselves busy building the table shell, as that would need to be finished early so that the paint would have time to dry before we’d start assembling the electronics into it. Over the next day they’d often call the other teams over to help in holding or moving things, and also for the very important task of test-sitting the table to figure out the optimal trade-off between table height and legroom.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-legroom-measurement1.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-legroom-measurement1-small.jpg&quot; alt=&quot;Legroom measurements&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-legroom-measurement2.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-legroom-measurement2-small.jpg&quot; alt=&quot;Legroom measurements&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While the hardware guys were working, we started designing the software part of it. Some basic decisions had to be taken on how we’d get the data, and how we would filter and transform the raw portal statuses to commands to the actual lights in the table.&lt;/p&gt;

&lt;p&gt;Eventually we settled on a NoFlo graph that would poll the portal data in, and run it through a set of transformations to find the detect the data points of interest, like portals that have changed owners or are under attack. In parallel we would run some animation loops to create a more organic, shifting feel to the whole map by having the light shining through the streets be constantly shifting and moving.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-graph.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-graph-small.png&quot; alt=&quot;The main Ingress Table NoFlo graph&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(and yes, the graph you see above is the actuall running code of the table)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab-small.jpg&quot; alt=&quot;Software team at robolab&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab2.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab2-small.jpg&quot; alt=&quot;Software team at robolab&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since the electronics wouldn’t be working for a while still, we decided to build also a &lt;em&gt;Ingress Table Emulator&lt;/em&gt; in HTML and NoFlo. This would give us something to test the data and our graphs while the other teams where still working on their things. This proved to be a very useful thing, as this way we were able to watch a big Ingress battle through our simulated blinking lights already in the Saturday evening, and see our emulated table go through pretty much all the different states we were interested in.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-software-team1.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-software-team1-small.jpg&quot; alt=&quot;The software team at work&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-software-team2.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-software-team2-small.jpg&quot; alt=&quot;The software team at work&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the table shell had been built and the paint was drying, the hardware team started preparing the other things like the map layer, the glass top, and the USB chargers.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-painted.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-painted-small.jpg&quot; alt=&quot;Watching the paint dry&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-map-sticker.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-map-sticker-small.jpg&quot; alt=&quot;Attaching the map sticker&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For electronics we noticed that we had still some parts missing from the inventory, and so I had to do a quick supply run on Saturday. But once we got those, the team got into calculations and soldering.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-electronics1.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-electronics1-small.jpg&quot; alt=&quot;Electronics work&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-electronics2.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-electronics2-small.jpg&quot; alt=&quot;Electronics work&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every project has its setbacks, and in this case it came in the form of running pre-released software. It turned out that the LaunchPad port of MicroFlo still had some issues, and so most of Sunday was spent debugging the communications protocol and tuning the components. But the end result is a much better improved MicroFlo, and eventually we got the major moment of triumph of seeing the street lights start animating for the first time. LED strips controlled by a LaunchPad Tiva, in turn controlled by animation loops running in a NoFlo graph on Node.js.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-food.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-food-small.jpg&quot; alt=&quot;Food time&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab3.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-robolab3-small.jpg&quot; alt=&quot;Figuring out communications problems&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Monday evening we convened at c-base for the final push. Street lights were ready, but there were still some issues with getting the table connected wirelessly to the space station network. And we would still need to implement the MicroFlo component for the portal lights. The latter resulting in an epic parallel programming and debugging session between Jon in Norway and Uwe in Berlin. But by the end of the evening we were able to test the full system for the first time, and carry the table to its new home.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-test2.gif&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-test2-small.gif&quot; alt=&quot;Testing the lights&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-test1.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-test1-small.jpg&quot; alt=&quot;The table running in the main hall&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was time to celebrate. For an Ingress table, this meant sitting around the table enjoying cold beers, while hacking a level 8 blue portal and watching the lights change across the board as agents ventured out.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/ingress-table-test-small.jpg&quot; alt=&quot;Ingress Table in production&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(We’re still in the process of collecting media about the project. The table will look a lot more awesome in video, and I hope I’ll be able to add some of those to this post soon)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;moving-ahead&quot;&gt;Moving ahead&lt;/h2&gt;

&lt;p&gt;Having the first running version of the table is of course a big milestone. Now we should monitor it for some time (over beer, of course) and make adjustments as necessary. There are some things that obviously need to be changed with the brightness of the lights based on the location of the table in the main hall. And of course we’ll only know about the full system’s robustness once it has a bit more mileage.&lt;/p&gt;

&lt;p&gt;Since we already have a HTML emulator of the table, it might be fun to release that to the public at some point. That way agents who are not at the c-base main hall could also see what is going on with this simple interface.&lt;/p&gt;

&lt;p&gt;An interesting area of development is also to see how the table could integrate better with the rest of the space station. There are various screens ranging from the awesome &lt;a href=&quot;https://twitter.com/c_v_e_n/status/416268846056869888&quot;&gt;Mate Light&lt;/a&gt; to smaller screens and gauges everywhere. And all of that is pretty much networked and available. Maybe we could visualize some events of interest in other parts of the station. This shows of the “Internet of Things” is never finished.&lt;/p&gt;

&lt;p&gt;So far &lt;a href=&quot;http://en.wikipedia.org/wiki/Niantic_Labs&quot;&gt;Niantic Labs&lt;/a&gt; — the makers of Ingress — have limited the availability of a portal data API to few selected parties, and so for now we had to work with a third-party to get the information needed. We hope this table will be another step in convincing Niantic of the creative potential that an official, open Ingress API would unleash.&lt;/p&gt;

&lt;p&gt;I’d like to give big thanks especially to everybody who participated in hackathon — whether on location or remotely from Oslo — as well as to those who were cheering us on. I’m also grateful to &lt;a href=&quot;http://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; for sponsoring the project. And of course to &lt;a href=&quot;http://c-base.org&quot;&gt;c-base&lt;/a&gt; for being an awesome place where such things can happen.&lt;/p&gt;

&lt;p&gt;The full source code for the Ingress Table can be found from &lt;a href=&quot;https://github.com/c-base/ingress-table&quot;&gt;https://github.com/c-base/ingress-table&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ijon also &lt;a href=&quot;http://www.ijon.me/2014/03/18/ingresstisch/?lang=en&quot;&gt;has a blog post about the project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://flowhub.io&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-promo.jpg&quot; alt=&quot;Flowhub - Make code playful&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
      <pubDate>Tue, 18 Mar 2014 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fingress-table%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/ingress-table/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/ingress-table/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Full-Stack Flow-Based Programming</title>
      <description>&lt;p&gt;The idea of &lt;a href=&quot;http://coding.smashingmagazine.com/2013/11/21/introduction-to-full-stack-javascript/&quot;&gt;Full-Stack Development&lt;/a&gt; is quite popular at the moment — building things that run both the browser and the server side of web development, usually utilizing similar languages and frameworks.&lt;/p&gt;

&lt;p&gt;With Flow-Based Programming and the emerging &lt;a href=&quot;http://flowhub.io/&quot;&gt;Flowhub&lt;/a&gt; ecosystem, we can take this even further. Thanks to the &lt;a href=&quot;https://noflojs.org/documentation/protocol/&quot;&gt;FBP network protocol&lt;/a&gt; we can build and monitor graphs spanning multiple devices and flow-based environments.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jonnor.com/&quot;&gt;Jon Nordby&lt;/a&gt; gave a &lt;a href=&quot;https://fosdem.org/2014/schedule/event/deviot02/&quot;&gt;Flow-Based Programming talk in FOSDEM&lt;/a&gt; Internet of Things track last weekend. His demo was running a FBP network comprising of three different environments that talk together. You can &lt;a href=&quot;http://mirrors.dotsrc.org/fosdem/2014/AW1121/Sunday/Flowbased_programming_for_heterogeneous_systems.webm&quot;&gt;find the talk online&lt;/a&gt;.&lt;/p&gt;

&lt;video controls=&quot;&quot; src=&quot;http://mirrors.dotsrc.org/fosdem/2014/AW1121/Sunday/Flowbased_programming_for_heterogeneous_systems.webm&quot;&gt;&lt;/video&gt;

&lt;p&gt;Here are some screenshots of the different graphs.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://microflo.org/&quot;&gt;MicroFlo&lt;/a&gt; running on an Arduino Microcontroller and monitoring a temperature sensor:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-microcontroller.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-microcontroller-small.png&quot; alt=&quot;MicroFlo on Arduino&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; running on Node.js and communicating with the Arduino over a serial port:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-server-embedded.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-server-embedded-small.png&quot; alt=&quot;NoFlo on Node.js&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NoFlo running in browser and communicating with the Node.js process over WebSockets:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-browser.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-browser-small.png&quot; alt=&quot;NoFlo on browser&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(click to see the full-size picture)&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;taking-this-further&quot;&gt;Taking this further&lt;/h2&gt;

&lt;p&gt;While this setup already works, as you can see the three graphs are still treated separately. The next obvious step will be to utilize the &lt;a href=&quot;https://noflojs.org/&quot;&gt;subgraph features&lt;/a&gt; of NoFlo UI and allow different nodes of a graph represent different runtime environments.&lt;/p&gt;

&lt;p&gt;This way you could introspect the data passing through all the wires in a single UI window, and “zoom in” to see each individual part of the system.&lt;/p&gt;

&lt;p&gt;The FBP ecosystem is growing all the time, with different runtimes popping up for different languages and use cases. While NoFlo’s JavaScript focus makes it part of the &lt;a href=&quot;http://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;Universal Runtime&lt;/a&gt;, there are many valid scenarios where other runtimes would be useful, especially on mobile, embedded, and desktop.&lt;/p&gt;

&lt;h2 id=&quot;work-to-be-done&quot;&gt;Work to be done&lt;/h2&gt;

&lt;p&gt;Interoperability between them is an area we should focus on. The &lt;a href=&quot;https://noflojs.org/documentation/protocol/&quot;&gt;network protocol&lt;/a&gt; needs more scrutiny to ensure all scenarios are covered, and more of the FBP/dataflow systems need to integrate it.&lt;/p&gt;

&lt;p&gt;Some steps are already being taken in this direction. After Jon’s session in FOSDEM we had a nice meetup discussing better integration between MicroFlo on microcontrollers, NoFlo on browser and server, and &lt;a href=&quot;https://github.com/djdeath&quot;&gt;Lionel Landwerlin’s&lt;/a&gt; work on porting &lt;a href=&quot;http://bergie.iki.fi/blog/noflo-and-gnome/&quot;&gt;NoFlo to the GNOME desktop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/fullstack-meetup.jpg&quot; alt=&quot;Full-stack FBP discussions at FOSDEM 2014&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you’re interested in collaborating, please &lt;a href=&quot;https://noflojs.org/support/&quot;&gt;get in touch&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by &lt;a href=&quot;http://www.flickr.com/photos/forresto/12268512046/&quot;&gt;Forrest Oliphant&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 06 Feb 2014 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Ffull-stack-fbp%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/full-stack-fbp/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/full-stack-fbp/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Flowhub</title>
      <description>&lt;p&gt;We just opened the &lt;a href=&quot;http://flowhub.io/&quot;&gt;Flowhub&lt;/a&gt; website for pre-orders. Flowhub is the collaborative development environment for &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; and other flow-based programming systems.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-small.png&quot; alt=&quot;Flowhub&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once it launches for general use, Flowhub is the fruition of the project initiated by our successful &lt;a href=&quot;http://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;NoFlo Development Environment&lt;/a&gt; Kickstarter from last August.&lt;/p&gt;

&lt;p&gt;Flowhub will provide a development environment for your flow-based programs, allowing you to collaborate and build things inside the same interface whether you’re targeting the client-side or the server-side of the web world. And thanks to the efforts on &lt;a href=&quot;https://github.com/noflo/noflo/issues/107&quot;&gt;creating a standard protocol&lt;/a&gt; for flow-based runtimes, Flowhub will be able to work with other environments as well. To get a glimpse of this potential, take a look at Jon Nordby’s work on &lt;a href=&quot;http://www.jonnor.com/2013/11/microflo-0-2-0-visual-arduino-programming/&quot;&gt;Arduino programming with NoFlo UI&lt;/a&gt; and what Lionel Landwerlin is doing with NoFlo in the &lt;a href=&quot;http://bergie.iki.fi/blog/noflo-and-gnome/&quot;&gt;Linux desktop development world&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is the main reason why we went with a more generic name for the new service. &lt;em&gt;Flowhub&lt;/em&gt; aims to be the central hub for any flow-based development, not just the &lt;a href=&quot;http://bergie.iki.fi/blog/the_universal_runtime/&quot;&gt;JavaScript-centric world&lt;/a&gt; where my NoFlo runtime is focused. Our Kickstarter sparked a lot of interest in flow-based programming in general, as evidenced by the various new FBP runtimes, and the &lt;a href=&quot;http://www.kickstarter.com/projects/1712125778/dataflow-and-reactive-programming-systems&quot;&gt;upcoming book&lt;/a&gt; on the subject.&lt;/p&gt;

&lt;p&gt;While NoFlo is and will remain our main focus, we should embrace the different ideas and different projects out there. One of the key points of FBP is everything can be modeled as a black box with input and output ports. With this level of abstraction, and a standard communications protocol, the different systems will be able to work together. Flowhub can be the central point for enabling that.&lt;/p&gt;

&lt;h2 id=&quot;collaboration-as-a-service&quot;&gt;Collaboration as a service&lt;/h2&gt;

&lt;p&gt;NoFlo is open source, and so is the &lt;a href=&quot;https://github.com/noflo/noflo-ui&quot;&gt;development environment&lt;/a&gt; we’re building for it. For developing things on your own, this is pretty much all you’ll need, especially if you’re willing to set up things like the NoFlo environment for Node.js yourself.&lt;/p&gt;

&lt;p&gt;The role of Flowhub as a service is analogous to what GitHub provides for traditional software development. Anybody can serve git repositories and issue trackers on their own, but having a third party to take care of that gives a much simpler, smoother experience. And even more importantly, having a central point where multiple projects reside enables much better collaboration and discovery between teams and projects.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-preorder-small.png&quot; alt=&quot;Flowhub plans&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is the essence of what Flowhub will provide:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hosted version of the NoFlo UI, able to communicate with multiple different FBP runtimes whether running on client or server&lt;/li&gt;
  &lt;li&gt;Integration with GitHub’s version control and issue tracking capabilities&lt;/li&gt;
  &lt;li&gt;Peer-to-peer environment for team collaboration based on &lt;a href=&quot;http://www.webrtc.org/&quot;&gt;WebRTC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Hosted environment for running server-side NoFlo programs and their &lt;a href=&quot;https://github.com/noflo/noflo-test&quot;&gt;tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As promised in our Kickstarter, the service will open to the public in the early summer of 2014. Our &lt;a href=&quot;https://noflojs.org/kickstarter/&quot;&gt;Kickstarter backers&lt;/a&gt; will gain an early access and have already service plans provided for them. With our &lt;a href=&quot;http://flowhub.io/preorder/&quot;&gt;Flowhub pre-order campaign&lt;/a&gt;, those who missed the Kickstarter opportunity have still a way to get in with early adopter pricing.&lt;/p&gt;

&lt;h2 id=&quot;new-technologies-and-a-new-ui&quot;&gt;New technologies and a new UI&lt;/h2&gt;

&lt;p&gt;Like NoFlo itself, Flowhub is also an exploration of various new technologies. From the layout technologies and the use of &lt;a href=&quot;http://www.w3.org/TR/components-intro/&quot;&gt;Web Components&lt;/a&gt;, and the flow-based payment processing infrastructure handling both &lt;a href=&quot;http://bergie.iki.fi/blog/bitcoin-medium-of-exchange/&quot;&gt;Bitcoin&lt;/a&gt; and credit card transactions that we built in &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; — there are many things being dogfooded on the service.&lt;/p&gt;

&lt;p&gt;At this stage of the game there are sure to be some rough edges, but by the time Flowhub opens to the public there should’ve been enough time at both our end, and with web browsers to mature to the point where these things provide a smooth experience.&lt;/p&gt;

&lt;p&gt;The user interface &lt;a href=&quot;http://bergie.iki.fi/blog/noflo-update/&quot;&gt;we showed in September&lt;/a&gt;, and user-tested in the &lt;a href=&quot;https://plus.google.com/events/cenb1vcbrv2k5tufkog73ped89k&quot;&gt;NodeCopter NoFlo event&lt;/a&gt; has since seen quite a lot of improvement based on what we’ve learned. The new version has been rebuilt ground-up with &lt;a href=&quot;http://www.polymer-project.org/&quot;&gt;Polymer&lt;/a&gt; and &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt;, and is a lot more efficient and touch-friendly.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-team-small.jpg&quot; alt=&quot;Flowhub team testing the new UI&quot; /&gt;&lt;/p&gt;

&lt;p&gt;It is still not perfect, but having used it on various devices from small tablets through laptops to huge touch-screen PCs, I feel we’re definitely on the right track. Having a user interface where you can &lt;em&gt;see the connections and data flows of your software&lt;/em&gt; in real time, and can &lt;em&gt;rewire any part&lt;/em&gt; when needed is incredibly powerful. And once &lt;a href=&quot;https://github.com/noflo/noflo-ui/issues/8&quot;&gt;component editing&lt;/a&gt; is working fully with the runtimes, I can’t really see myself wanting to go back to text-only development.&lt;/p&gt;

&lt;p&gt;Here is a sneak peek (click to see a bigger version):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-ui-photobooth.jpg&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-ui-photobooth-small.png&quot; alt=&quot;New NoFlo UI in action&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To see more of what we’re building, visit &lt;a href=&quot;http://flowhub.io&quot;&gt;flowhub.io&lt;/a&gt;, play with the demo we have there, and make sure to watch the intro video. &lt;a href=&quot;http://flowhub.io/preorder/&quot;&gt;Preorder today&lt;/a&gt; to help fund the hosted and open source version of Flowhub!&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 12 Dec 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fflowhub%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/flowhub/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/flowhub/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Bitcoin as a Medium of Exchange</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://www.bitcoins.com/&quot;&gt;Bitcoin&lt;/a&gt; — the decentralized digital currency — has been making a lot of headlines lately. Much of this is driven by the &lt;a href=&quot;http://www.economist.com/news/leaders/21590901-it-looks-overvalued-even-if-digital-currency-crashes-others-will-follow-bitcoin&quot;&gt;current investment boom&lt;/a&gt; around it that has raised the exchange rates over the 1000 USD mark. But really, looking at Bitcoin as a medium for currency or asset speculation is a bad idea. Instead, we should see it purely as a &lt;a href=&quot;http://en.wikipedia.org/wiki/Medium_of_exchange&quot;&gt;medium of exchange&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/bitcoin-accepted-here-small.png&quot; alt=&quot;Bitcoin Accepted Here&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;not-a-great-holder-of-value&quot;&gt;Not a great holder of value&lt;/h2&gt;

&lt;p&gt;Much of the press stories about Bitcoin see it as a speculative investment free of currency manipulation by central banks. By its nature, it is a &lt;a href=&quot;https://en.bitcoin.it/wiki/Deflationary_spiral&quot;&gt;deflationary currency&lt;/a&gt;, given that the global supply of Bitcoins is capped. As long as there is interest in Bitcoin, it means the prices are bound to go up. But at the same time, this is a threat to the currency. Deflation disincentivizes people from spending their money, as tomorrow the value is likely to be higher.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/bitcoin-chart-2013-11-small.png&quot; alt=&quot;Bitcoin exchange rates 2013&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a big difference to &lt;a href=&quot;http://en.wikipedia.org/wiki/Fiat_money&quot;&gt;fiat currencies&lt;/a&gt; where central banks generally act to ensure that there is a little bit of inflation, giving people incentives to spend, invest, and keep the economy running.&lt;/p&gt;

&lt;p&gt;Traditional currencies are given a value by the fact that there is a government requiring taxes to be paid in them. This creates a demand in the currency, as people have to acquire units of that currency somehow, usually by selling goods and services. So, &lt;em&gt;the value of a currency is built on the power of a state to tax its subjects in that currency&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The other traditional holder of value, gold, also differs from Bitcoins in the sense that at least you can make &lt;a href=&quot;http://en.wikipedia.org/wiki/Gold#Applications&quot;&gt;some useful things out of it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In contrast, the value of Bitcoin without an economy backing it up is exactly zero. &lt;em&gt;Without an active network of miners, and business transactions that create a demand for them, there is not much you could do with a Bitcoin.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Given this setting, Bitcoin as a investment mechanism resembles a &lt;a href=&quot;http://en.wikipedia.org/wiki/Ponzi_scheme&quot;&gt;ponzi scheme&lt;/a&gt; where people make speculative investments in them in hopes of being able to pass them on to the next fool when the prices go up.&lt;/p&gt;

&lt;p&gt;This is obviously not sustainable in the long term. But luckily there are things you can do with Bitcoin that still make them interesting if you &lt;em&gt;deal with them as a medium of exchange and not a long-term holder of value.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;great-tool-for-conducting-transactions&quot;&gt;Great tool for conducting transactions&lt;/h2&gt;

&lt;p&gt;Now that we’ve established that Bitcoins are not the best thing to put your life savings into, or to stash under your mattress, what is it exactly that makes them interesting?&lt;/p&gt;

&lt;h3 id=&quot;mobile-money&quot;&gt;Mobile money&lt;/h3&gt;

&lt;p&gt;Bitcoin is a way of making transactions quickly, safely, and without middlemen. A lot of the articles written about it compare it to gold, but in my view a much closer comparison is &lt;a href=&quot;http://en.wikipedia.org/wiki/M-Pesa&quot;&gt;M-Pesa&lt;/a&gt;, the operator-driven mobile payment network that powers &lt;a href=&quot;http://qz.com/57504/31-of-kenyas-gdp-is-spent-through-mobile-phones/&quot;&gt;over 30% of the Kenyan economy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/m-pesa-cell-phone.jpg&quot; alt=&quot;M-Pesa in action&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;M-Pesa on a phone, by &lt;a href=&quot;http://pixelballads.wordpress.com/2012/01/14/mobile-technology-and-the-unbanked-m-pesa-part-3/&quot;&gt;Pixel Ballads&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When you see people paying with their mobile phones in a African street market, you know they’ve leapfrogged us in technology.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bitcoin has the exactly same advantages as M-Pesa: you can send it to anywhere with minimal costs and delays, you can keep it on your phone, and anybody can ask for a payment through it. Unlike M-Pesa, Bitcoin is truly decentralized and doesn’t rely on a mobile operator to act as the “central bank”.&lt;/p&gt;

&lt;p&gt;Unlike M-Pesa, Bitcoin currently requires an internet-connected smartphone with a wallet application. This limits its usefulness in the world outside of the rich countries (though &lt;a href=&quot;http://techcrunch.com/2012/12/10/50-android-smartphones-are-disrupting-africa-much-faster-than-you-think-says-wikipedias-jimmy-wales/&quot;&gt;cheap Android phones&lt;/a&gt; are changing the situation). It would be a huge boost for mobile commerce with Bitcoins if there was a service that enabled paying and requesting Bitcoin over SMS.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The one to make Bitcoin work over SMS will be rich&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last summer I was talking with Joerg Patzer, the owner of &lt;a href=&quot;http://www.room77.de/&quot;&gt;Room 77&lt;/a&gt;, a restaurant in Berlin that has been &lt;a href=&quot;http://www.theguardian.com/technology/2013/apr/26/bitcoins-gain-currency-in-berlin&quot;&gt;one of the early adopters of Bitcoin&lt;/a&gt;. At the time about 10% of the his sales happened in Bitcoin, and the number has been constantly growing since. He told that he even pays some of his suppliers in Bitcoin, and only converts some of it to euros, solely because &lt;em&gt;you can’t pay taxes in Bitcoin&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Patzer buys the beer for Room 77 from the nearby Rollberg brewery, owned and run by qualified brew and malt meister Wilko Bereit. He pays for the barrels with Bitcoins&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Joerg also told me an interesting case where there was a group of tourists having a dinner in his restaurant. A friend of theirs that wasn’t able to make the trip insisted on paying the bill remotely from Israel. This is something that would be hard to do with the traditional credit cards or currencies. Paying in Bitcoin is quite straightforward:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;He taps the amount he owes Room 77 into the virtual Bitcoin wallet on his Android phone and, aligning it with a code on the bar’s device, presses a button to process the payment. A theatrical “kerching” sound follows and Gallas is grinning from ear to ear. “It could hardly be easier,” he insisted.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/bitcoin-wallet-small.png&quot; alt=&quot;Bitcoin Wallet in action&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Requesting a payment using Bitcoin Wallet for Android&lt;/em&gt;&lt;/p&gt;

&lt;h3 id=&quot;global-currency-for-the-internet&quot;&gt;Global currency for the internet&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/bitcoin-nodes-globe-small.png&quot; alt=&quot;Bitcoin nodes around the world&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://blockchain.info/nodes-globe&quot;&gt;Map of global Bitcoin nodes&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Requesting Bitcoins is as easy as providing &lt;a href=&quot;https://en.bitcoin.it/wiki/URI_Scheme&quot;&gt;a URL&lt;/a&gt;. This could be presented as a link on the web, or shared to mobile devices via &lt;a href=&quot;http://en.wikipedia.org/wiki/QR_code&quot;&gt;QR Codes&lt;/a&gt;. For example, clicking &lt;a href=&quot;bitcoin:1L1imk8ehERDQSjDYUQ3v7gsstXJxTkr8m?amount=0.0001&amp;amp;label=Bergie&quot;&gt;this link&lt;/a&gt; on a device with a Bitcoin wallet would enable you to send me Bitcoins worth around 0.1 EUR (on today’s exchange rates). No need for dealing with payment gateways or complicated protocols.&lt;/p&gt;

&lt;p&gt;Ease of paying, no middle men, minimal transaction fees, and no risk of chargebacks make a lot of interesting business scenarios possible online. Consider for example &lt;a href=&quot;http://en.wikipedia.org/wiki/Micropayment&quot;&gt;micropayments&lt;/a&gt; for online content. This is something that would make online publishing viable without the current ad-driven models, but has been held back by the risks and costs associated with credit card payments. Wider adoption of Bitcoin would suddenly make this a very realistic way of asking for money for the things you do online.&lt;/p&gt;

&lt;h3 id=&quot;other-clever-uses&quot;&gt;Other clever uses&lt;/h3&gt;

&lt;p&gt;Since Bitcoins can be exchanged in miniscule amounts, and there is a &lt;a href=&quot;https://blockchain.info/&quot;&gt;public record kept&lt;/a&gt; on each transaction, they enable all kinds of new use cases.&lt;/p&gt;

&lt;p&gt;One such service that I ran into yesterday is &lt;a href=&quot;http://www.proofofexistence.com/&quot;&gt;Proof of Existence&lt;/a&gt;, a tool for storing the fact that you were in possession of a document at a given time, and that it hasn’t been revised since based on microtransactions stored in the Bitcoin block chain. This is a mechanism known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Trusted_timestamping&quot;&gt;trusted timestamping&lt;/a&gt; that could be useful for things we currently utilize &lt;a href=&quot;http://en.wikipedia.org/wiki/Notary&quot;&gt;notaries&lt;/a&gt; for. The &lt;a href=&quot;https://news.ycombinator.com/item?id=6809929&quot;&gt;Hacker News thread&lt;/a&gt; on this listed some interesting use cases, like verifying scientific priority on new inventions, i.e. that you had written a document describing a new invention at a given time even if you publish it only later.&lt;/p&gt;

&lt;p&gt;We could also use Bitcoin for &lt;a href=&quot;http://en.wikipedia.org/wiki/Cost-based_anti-spam_systems&quot;&gt;solving the spam problem&lt;/a&gt;. Emails could be “stamped” with a Bitcoin microtransaction, and email servers could be configured to reject messages that don’t have a valid payment attached to them. This would enable bringing decentralization back to the internet as we could again use distributed systems like email and XMPP without having to resort to the walled gardens like Facebook to keep them spammers away.&lt;/p&gt;

&lt;p&gt;Another interesting approach was to use &lt;a href=&quot;https://en.bitcoin.it/wiki/SatoshiDice&quot;&gt;Bitcoin transactions for making bets&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;how-to-get-started&quot;&gt;How to get started&lt;/h2&gt;

&lt;p&gt;A good way to &lt;a href=&quot;http://www.bitcoins.com/getting-started&quot;&gt;get started&lt;/a&gt; with Bitcoin is to read &lt;a href=&quot;http://www.wired.com/wiredenterprise/2013/11/bitcoin-survival-guide/&quot;&gt;Wired’s Bitcoin survival guide&lt;/a&gt; or the materials available on &lt;a href=&quot;http://www.bitcoins.com/&quot;&gt;Bitcoins.com&lt;/a&gt;. Install a &lt;a href=&quot;http://www.bitcoins.com/directory&quot;&gt;Bitcoin wallet application&lt;/a&gt; on your mobile device. Then get some Bitcoin either by &lt;a href=&quot;https://localbitcoins.com/&quot;&gt;buying locally&lt;/a&gt;, from an &lt;a href=&quot;http://www.bitcoins.com/directory#exchanges&quot;&gt;online exchange&lt;/a&gt; or by selling goods or services for Bitcoin.&lt;/p&gt;

&lt;p&gt;This is all you need to get going. Now you just need to find a way to spend them, for example in &lt;a href=&quot;http://www.shopify.com/blog/10446157-shopify-merchants-can-now-accept-bitcoin&quot;&gt;online shops&lt;/a&gt;, by &lt;a href=&quot;https://www.namecheap.com/support/payment-options/bitcoin.aspx&quot;&gt;buying domains&lt;/a&gt;, or in shops and restaurants that accept them, like &lt;a href=&quot;http://bitcoinkiez.de/&quot;&gt;many do in my neighborhood&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: I’m a programmer, not an economist. There are better people to take investment advice from. I do hold &lt;a href=&quot;https://blockchain.info/address/1L1imk8ehERDQSjDYUQ3v7gsstXJxTkr8m&quot;&gt;a little bit of Bitcoin&lt;/a&gt;, giving me some vested interest in the matter. Not the kind of amount that would make it an investment, but just the right amount for being able to buy a few nice dinners, especially at the Berlin prices. Generally, I try to keep the amount I have in BTC low enough to be equivalent of what I might be comfortable with carrying in cash.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 28 Nov 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fbitcoin-medium-of-exchange%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/bitcoin-medium-of-exchange/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/bitcoin-medium-of-exchange/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Why did I reimplement Jekyll using NoFlo</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt; is a delightful piece of software. A Ruby application that turns your Markdown and HTML files to a nicely constructed static website. Since the generated site is static, you can deploy and serve it from anywhere with no security or performance concerns. As a matter of fact, &lt;a href=&quot;http://bergie.iki.fi/&quot;&gt;this site&lt;/a&gt; is &lt;a href=&quot;http://bergie.iki.fi/colophon/&quot;&gt;built&lt;/a&gt; with Jekyll.&lt;/p&gt;

&lt;p&gt;For websites that don’t need to offer dynamic functionality this is in many ways the culmination of &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;Decoupled Content Management&lt;/a&gt; — you can write the post using whatever editor, use GitHub as the content repository, and deploy the pages to any web server you want.&lt;/p&gt;

&lt;p&gt;If you’ve been to &lt;a href=&quot;http://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;our Kickstarter project&lt;/a&gt; you probably know that I’ve reimplemented Jekyll using the &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; flow-based programming environment. &lt;em&gt;If I’m so happy with Jekyll as it is, why would I do such a thing?&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;introducing-noflo-jekyll&quot;&gt;Introducing noflo-jekyll&lt;/h2&gt;

&lt;p&gt;Before I go to the reasons, let me briefly introduce the project itself: &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll&quot;&gt;noflo-jekyll&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just like any flow-based program, the NoFlo reimplementation of Jekyll is built out of a graph. Here is how the main graph of the application looks like when loaded via the NoFlo UI prototype:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-jekyll.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/noflo-jekyll-small.png&quot; alt=&quot;NoFlo Jekyll main graph&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quite a few of the boxes you see in that graph are actually &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/graphs&quot;&gt;subgraphs&lt;/a&gt;. Since the UI is still under work, the subgraphs have been defined in the more text editor friendly &lt;a href=&quot;https://noflojs.org/documentation/fbp/&quot;&gt;.fbp syntax&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In total at the current version the graphs contain &lt;strong&gt;107 nodes&lt;/strong&gt;. Most of these running a component from the extensive &lt;a href=&quot;https://noflojs.org/library/&quot;&gt;NoFlo component libraries&lt;/a&gt;, but there are also &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/components&quot;&gt;&lt;strong&gt;4 custom components&lt;/strong&gt;&lt;/a&gt; built for this project. These components put together are under 500 lines of code, and everything else is using 100% reusable code from existing libraries. Not bad compared to the size of the original Jekyll code base at over 16k LoC!&lt;/p&gt;

&lt;p&gt;You can grab the &lt;a href=&quot;https://npmjs.org/package/noflo-jekyll&quot;&gt;first release of noflo-jekyll&lt;/a&gt; right now from NPM. Please refer to &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#readme&quot;&gt;the README&lt;/a&gt; on how to use it.&lt;/p&gt;

&lt;h2 id=&quot;where-this-is-coming-from&quot;&gt;Where this is coming from&lt;/h2&gt;

&lt;p&gt;When I started working with the rest of &lt;a href=&quot;https://www.facebook.com/thegridio&quot;&gt;The Grid&lt;/a&gt; team last year, Jekyll development had practically stopped. It looked like nothing was happening in that community. Since Jekyll was something we very much wanted to utilize for various projects, the situation looked a little bit risky.&lt;/p&gt;

&lt;p&gt;Since we’re very much a NoFlo shop, it felt natural to take Jekyll as sort of a specification, and reimplement it using FBP techniques. Initially this was an internal effort, but then we decided, very much in the nature of &lt;a href=&quot;http://tom.preston-werner.com/2011/11/22/open-source-everything.html&quot;&gt;GitHub’s “open source (nearly) everything”&lt;/a&gt; philosophy, that this should be opened as well.&lt;/p&gt;

&lt;p&gt;I got noflo-jekyll into a running state in about a week, and then moved my attention to other things we needed to build. And so the finishing touches and a public release were postponed to a better day.&lt;/p&gt;

&lt;p&gt;As it happens, &lt;a href=&quot;http://blog.parkermoore.de/2013/05/06/jekyll-1-dot-0-released/&quot;&gt;Jekyll development resumed&lt;/a&gt; pretty soon after that. But there are still many reasons why noflo-jekyll can be quite cool.&lt;/p&gt;

&lt;h2 id=&quot;benefits-of-the-noflo-port&quot;&gt;Benefits of the NoFlo port&lt;/h2&gt;

&lt;p&gt;Here are some reasons why especially Node.js developers should care about this project:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Pure JavaScript&lt;/strong&gt;, no need for Ruby or other runtimes in your environment. Especially handy if you’re using &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; for site generation&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Other data sources&lt;/strong&gt;, in NoFlo everything is just a flow of data. You could easily plug in other data sources than the file system. For example, database query results&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different converters&lt;/strong&gt;, don’t want to use Markdown? Just plug in your own mark-up processor component&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Different template engines&lt;/strong&gt;, don’t want to use Liquid? Just plug in your own template processor component&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Use as library or executable&lt;/strong&gt;, this Jekyll implementation is just a NoFlo graph. You can use it in &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#usage-in-noflo-graphs&quot;&gt;other NoFlo applications&lt;/a&gt;, as &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#command-line-usage&quot;&gt;a Node.js module&lt;/a&gt;, or as &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#command-line-usage&quot;&gt;a command-line executable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, as with any reimplementation of a application being actively developed, there are also some &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll#known-issues-and-differences-with-ruby-jekyll&quot;&gt;potential caveats&lt;/a&gt; to observe.&lt;/p&gt;

&lt;h2 id=&quot;a-noflo-example&quot;&gt;A NoFlo example&lt;/h2&gt;

&lt;p&gt;Most of the existing NoFlo applications out there are dealing with various business processes, and so very little of that is available out in the open. As such, &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll&quot;&gt;noflo-jekyll&lt;/a&gt; can probably show how to build bigger systems out of flow-based graphs, and also how to connect them with the rest of the Node.js ecosystem.&lt;/p&gt;

&lt;p&gt;noflo-jekyll is now available under the MIT license for your static site generation needs. But as it happens, it wasn’t the only interesting NoFlo example to be released this week. You may want to also check out how to &lt;a href=&quot;https://github.com/kenhkan/noflo-woute#readme&quot;&gt;handle HTTP requests in NoFlo&lt;/a&gt; with the Woute module. There is even &lt;a href=&quot;https://github.com/kenhkan/noflo-woute/tree/master/examples/echo_server&quot;&gt;an example project&lt;/a&gt; available.&lt;/p&gt;

&lt;h2 id=&quot;keeping-up-with-jekyll&quot;&gt;Keeping up with Jekyll&lt;/h2&gt;

&lt;p&gt;To realize the benefits of flow-based static site generation, it is quite important to keep the NoFlo reimplementation up-to-speed with things changing in Jekyll-land.&lt;/p&gt;

&lt;p&gt;Because of this, the most important part of our automated tests is comparing results between a site generated by the original Jekyll program, and the NoFlo version. This means that when new features are added to Jekyll, we can follow the &lt;a href=&quot;http://www.jamesshore.com/Blog/Red-Green-Refactor.html&quot;&gt;red-green-refactor&lt;/a&gt; style of test-driven development, and add these features to the &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/tree/master/test/fixtures&quot;&gt;test site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’ve been happily building &lt;a href=&quot;http://bergie.iki.fi/&quot;&gt;my blog&lt;/a&gt; and the &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo site&lt;/a&gt; with this for a while, and except for some minor templating and Markdown handling differences between the Node.js and Ruby versions of those libraries, things are looking solid. If you find something that doesn’t work with the site or templates you have, please &lt;a href=&quot;https://github.com/the-grid/noflo-jekyll/issues&quot;&gt;let us know&lt;/a&gt;!&lt;/p&gt;
</description>
      <pubDate>Mon, 12 Aug 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnoflo-jekyll%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/noflo-jekyll/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/noflo-jekyll/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
  </channel>
</rss>
