<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Henri Bergius - Business</title>
    <description>Latest posts in category 'business'</description>
    <link>https://bergie.iki.fi</link>
    <language>en</language>
    <lastBuildDate>Tue, 05 May 2026 19:17:08 +0000</lastBuildDate>
    
    <item>
      
      <title>Publish your data on the BIG IoT marketplace</title>
      <description>&lt;p&gt;When building IoT systems, it is often useful to have access to data from the outside world to amend the information your sensors give you. For example, indoor temperature and energy usage measurements will be a lot more useful if there is information on the outside weather to correlate with.&lt;/p&gt;

&lt;p&gt;Thanks to the open data movement, there are many data sets available. However, many of these are hard to discover or available in obscure formats.&lt;/p&gt;

&lt;h2 id=&quot;the-big-iot-marketplace&quot;&gt;The BIG IoT marketplace&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://big-iot.eu/&quot;&gt;BIG IoT&lt;/a&gt; is an EU-funded research project to make datasets easier to share and discover between organizations. With it there is a common semantic standard for how datasets are served, and a &lt;a href=&quot;https://market.big-iot.org/allOfferings&quot;&gt;centralized marketplace&lt;/a&gt; for discovering and subscribing to data offerings.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;For data providers&lt;/strong&gt; this means they can focus on providing correct information, and let the marketplace handle API tokens, discoverability, and — for commercial datasets — billing&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;For data consumers&lt;/strong&gt; there is a single place and a single API to access multiple datasets. No need to handle different Terms of Usage or different API conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As an example, if you’re building a car navigation application, you can use BIG IoT to get access to multiple providers of routing services, traffic delay information, or parking spots. If a dataset comes online in a new city, it’ll automatically work with your application. No need for contract negotiations, just a query to find matching providers on-demand.&lt;/p&gt;

&lt;h2 id=&quot;flowhub-and-big-iot&quot;&gt;Flowhub and BIG IoT&lt;/h2&gt;

&lt;p&gt;Last summer &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; was one of the companies accepted into the BIG IoT &lt;a href=&quot;http://big-iot.eu/first-open-call/&quot;&gt;first open call&lt;/a&gt;. In it, we received some funding to make it possible to publish data from Flowhub and &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; on the marketplace. In &lt;a href=&quot;https://youtu.be/wYrw7RlV8Ng&quot;&gt;this video&lt;/a&gt; I’m talking about the project:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/wYrw7RlV8Ng&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;In the project we built three things:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/flowhub/bigiot-js&quot;&gt;BIG IoT JavaScript library&lt;/a&gt; – a Node.js library for publishing datasets in the BIG IoT marketplace&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/flowhub/bigiot-bridge&quot;&gt;Flowhub BIG IoT bridge&lt;/a&gt; – a set of NoFlo components for creating BIG IoT providers&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://market.big-iot.org/provider/Flowhub_UG-ParkingProductionNew&quot;&gt;Deutsche Bahn and Cologne parking offerings&lt;/a&gt; – a set of live examples of integrating existing IoT datasets with the marketplace using Flowhub&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;creating-a-data-provider&quot;&gt;Creating a data provider&lt;/h2&gt;

&lt;p&gt;While it is easy enough to use the &lt;a href=&quot;https://big-iot.github.io/&quot;&gt;BIG IoT Java library&lt;/a&gt; to publish datasets, the Flowhub integration we built it makes it even easier. You need your data source available on a message queue, a web API, or maybe a timeseries database. And then you need NoFlo and the &lt;a href=&quot;https://github.com/flowhub/bigiot-bridge&quot;&gt;flowhub-bigiot-bridge&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;The basic building block is the &lt;strong&gt;Provider&lt;/strong&gt; component. This creates a Node.js application server to serve your datasets, and registers them to the BIG IoT marketplace.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/800x/noflo-bigiot-provider.png&quot; alt=&quot;NoFlo BIG IoT Provider&quot; /&gt;&lt;/p&gt;

&lt;p&gt;What you need to do is to describe your data offering. For this, you can use the &lt;strong&gt;CreateOffering&lt;/strong&gt; component. You can use IIPs to categorize the data, and then a set of &lt;strong&gt;CreateDatatype&lt;/strong&gt; components to describe the input and output structure your offering uses.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/800x/noflo-bigiot-offering.png&quot; alt=&quot;NoFlo BIG IoT Offering config&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Finally, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;request&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;response&lt;/code&gt; ports of the Provider need to be hooked to your data source. The request outport will send packets with whatever input data your subscribers provided, and you need to send the resulting output data to the response port.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/800x/noflo-bigiot-request-response.png&quot; alt=&quot;Request-response loop with BIG IoT Provider&quot; /&gt;&lt;/p&gt;

&lt;p&gt;For real-world deployment, the Flowhub BIG IoT bridge repository also includes examples on how to test your offerings, and how to build and deploy them with Docker.&lt;/p&gt;

&lt;p&gt;Here’s how a full setup with two different parking datasets looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/800x/noflo-bigiot-parking-provider.png&quot; alt=&quot;NoFlo BIG IoT parking provider&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you’re participating in the &lt;a href=&quot;http://bcw.bosch-si.com/berlin/hackathon/&quot;&gt;Bosch Connected World hackathon&lt;/a&gt; in Berlin next week, we’ll be there with the BIG IoT team to help projects to utilize the BIG IoT datasets.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This project has received funding from the European Union’s Horizon 2020 research and innovation program under grant agreement No 688038.&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 12 Feb 2018 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fbig-iot%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/big-iot/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/big-iot/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <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>Forget about HTTP when building microservices</title>
      <description>&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Microservices&quot;&gt;Microservices&lt;/a&gt; — an architectural pattern we recommended in our &lt;a href=&quot;https://youtu.be/VQdl7J_24PA?list=PLIuD0578pkZ4Ciu9DNkRMG9yvFrEdVby7&quot;&gt;2012 International PHP Conference keynote&lt;/a&gt; — is pretty popular these days. There are many benefits to consider:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Independent development and release lifecycle for each microservice&lt;/li&gt;
  &lt;li&gt;Ensuring clear API boundaries between systems&lt;/li&gt;
  &lt;li&gt;Ability to use technologies most applicable for each area of a system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In an ideal world, microservices are a realization of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Unix_philosophy&quot;&gt;Unix philosophy&lt;/a&gt; as applied to building internet services: writing programs that do one thing, and do it well; writing programs that work together.&lt;/p&gt;

&lt;h2 id=&quot;just-use-a-message-queue&quot;&gt;Just use a message queue&lt;/h2&gt;

&lt;p&gt;However, when most people think about microservices, they think systems that communicate with each other using HTTP APIs. I think this is quite limited, and something that makes microservices a lot more fragile than they could be. &lt;a href=&quot;https://www.cloudamqp.com/blog/2014-12-03-what-is-message-queuing.html&quot;&gt;Message queues&lt;/a&gt; provide a much better solution. This is mentioned in Martin Fowler’s &lt;a href=&quot;https://martinfowler.com/articles/microservices.html&quot;&gt;Microservices article&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The second approach in common use is messaging over a lightweight message bus. The infrastructure chosen is typically dumb (dumb as in acts as a message router only) - simple implementations such as RabbitMQ or ZeroMQ don’t do much more than provide a reliable asynchronous fabric - the smarts still live in the end points that are producing and consuming messages; in the services.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we were building &lt;a href=&quot;https://thegrid.io/&quot;&gt;The Grid&lt;/a&gt;, we went with an architecture heavily reliant on microservices communicating using message queues. This gave us several useful capabilities:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Asynchronous processing&lt;/strong&gt;&lt;br /&gt;
If you have heavy back-end operations or peak load, a microservice might be swamped with work to be done. If your web server only needs to send work to a queue and not wait for result immediately, you have a lot more freedom on how to organize the work. Furthermore, you can split your service along different scalability characteristics — some systems may be network-bound, others CPU-bound etc&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Autoscaling&lt;/strong&gt;&lt;br /&gt;
Since the work to be performed by your microservices is kept in message queue, you can use the combination of the queue length and typical processing times to automatically determine how many instances of each service you need. Ideally you can use this to ensure that your processing times stay consistent regardless of how many users are on your system at a given time&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dead lettering&lt;/strong&gt;&lt;br /&gt;
It is possible to configure RabbitMQ to place any failed operations into a &lt;a href=&quot;https://www.rabbitmq.com/dlx.html&quot;&gt;dead letter queue&lt;/a&gt;. This gives you a full record of any failing operations, making it possible to inspect them manually, replay later, or produce new tests based on real-world failures&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt;&lt;br /&gt;
Sometimes you’re dealing with external HTTP APIs that are rate limited. Once a microservice starts hitting rate limits, you can keep new requests in a queue until the limit lifts again&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;In-flight updates&lt;/strong&gt;&lt;br /&gt;
A message queue can be configured so that non-acknowledged messages go back into the queue. This means that if one of your services crashes, or you deploy a new version of it, no work gets lost. When the service is back up again, it can pick up right where the previous instance left off&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;better-tooling&quot;&gt;Better tooling&lt;/h2&gt;

&lt;p&gt;HTTP is something all backend developers are familiar with. With message queues you have to deal with some new concepts, and hence new tools are also needed.&lt;/p&gt;

&lt;h3 id=&quot;msgflo&quot;&gt;MsgFlo&lt;/h3&gt;

&lt;p&gt;Client libraries for talking with common message queues exist for pretty much every language. However, this still means that you’ll have to handle things like message pre-fetch limits, acknowledging handled messages, and setting up queues yourself. And of course keeping track of what service talks to what can become a burden.&lt;/p&gt;

&lt;p&gt;We developed the &lt;a href=&quot;https://msgflo.org/&quot;&gt;MsgFlo&lt;/a&gt; tool to solve these problems. MsgFlo provides open source &lt;a href=&quot;https://github.com/msgflo&quot;&gt;client libraries&lt;/a&gt; for bunch of different programming languages, providing a simple model to handle message-related workflow.&lt;/p&gt;

&lt;p&gt;To give you an overview of the dataflow between services, MsgFlo also provides a way to define the whole system as a flow-based programming graph. This means you’ll see the whole system visually, and can change connections between services directly from graphical tools like &lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re using &lt;a href=&quot;https://heroku.com&quot;&gt;Heroku&lt;/a&gt;, MsgFlo can also generate the &lt;a href=&quot;https://devcenter.heroku.com/articles/procfile&quot;&gt;Procfile&lt;/a&gt; for you, meaning that the services you’ve defined in your graph get automatically registered with the platform.&lt;/p&gt;

&lt;h3 id=&quot;guv&quot;&gt;Guv&lt;/h3&gt;

&lt;p&gt;As mentioned above, queue-based microservices make autoscaling quite easy. If you’re on Heroku, then our &lt;a href=&quot;https://github.com/flowhub/guv&quot;&gt;Guv tool&lt;/a&gt; can be used to automate scaling operations for all of your background dynos.&lt;/p&gt;

&lt;p&gt;I wrote more about GuvScale in a &lt;a href=&quot;https://bergie.iki.fi/blog/guvscale-heroku-autoscaling/&quot;&gt;recent blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/guvscale-graph.jpg&quot; alt=&quot;Workload and scaling operations&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;p&gt;If you’d like to explore using message queues for your services a bit more, here are couple of good articles:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.runnable.com/post/150022242931/event-driven-microservices-using-rabbitmq&quot;&gt;Event-driven Microservices Using RabbitMQ&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.codeship.com/microservice-communication-queues/&quot;&gt;Microservice Communication with Queues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are also some MsgFlo example applications available:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/msgflo/msgflo-example-imageresize&quot;&gt;msgflo-example-imageresize&lt;/a&gt; is a web service for scaling images using autoscaled background workers&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/imgflo/imgflo-server&quot;&gt;imgflo-server&lt;/a&gt; is a web service that uses MsgFlo to send image processing jobs to background &lt;a href=&quot;https://en.wikipedia.org/wiki/GEGL&quot;&gt;GEGL&lt;/a&gt; or &lt;a href=&quot;https://noflojs.org&quot;&gt;NoFlo&lt;/a&gt; microservices&lt;/li&gt;
&lt;/ul&gt;
</description>
      <pubDate>Thu, 13 Apr 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fforget-http-microservices%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/forget-http-microservices/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/forget-http-microservices/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Introducing Flowhub UG - the Flow-Based Programming company</title>
      <description>&lt;p&gt;&lt;a href=&quot;https://flowhub.io&quot;&gt;Flowhub&lt;/a&gt; — the product made possible by our successful &lt;a href=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment/&quot;&gt;NoFlo Kickstarter&lt;/a&gt; — has now its own company dedicated to supporting and improving the visual programming environment.&lt;/p&gt;

&lt;p&gt;Last fall we bought the Flowhub and other flow-based programming assets from The Grid, and now after some paperwork we’re up and running as &lt;a href=&quot;https://flowhub.io/about&quot;&gt;Flowhub UG&lt;/a&gt;, a company registered in Berlin, Germany.&lt;/p&gt;

&lt;p&gt;We’re also now selling the new &lt;strong&gt;Pro&lt;/strong&gt; and &lt;strong&gt;Supporter&lt;/strong&gt; plans, and can also provide a dedicated &lt;strong&gt;on-premise&lt;/strong&gt; version of Flowhub. Please check out &lt;a href=&quot;https://plans.flowhub.io&quot;&gt;our Plans&lt;/a&gt; for more information:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://plans.flowhub.io/&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/flowhub-plans-2017-03.png&quot; alt=&quot;Flowhub Plans&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read more in &lt;a href=&quot;https://www.kickstarter.com/projects/noflo/noflo-development-environment/posts/998057&quot;&gt;the latest Kickstarter update&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Wed, 22 Mar 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fflowhub-ug%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/flowhub-ug/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/flowhub-ug/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>GuvScale - Autoscaling for Heroku worker dynos</title>
      <description>&lt;p&gt;I’m happy to announce that &lt;a href=&quot;https://guvscale.com&quot;&gt;GuvScale&lt;/a&gt; — our service for autoscaling Heroku background worker dynos — is now available &lt;a href=&quot;https://elements.heroku.com/addons/guvscale&quot;&gt;in a public beta&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re using &lt;a href=&quot;https://www.rabbitmq.com/&quot;&gt;RabbitMQ&lt;/a&gt; for distributing work to background dynos hosted by Heroku, GuvScale can monitor the queues for you and scale the number of workers up and down automatically.&lt;/p&gt;

&lt;p&gt;This gives two big benefits:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Consistent processing times&lt;/strong&gt; by scaling dynos up to meet peak load&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Cost savings&lt;/strong&gt; by reducing idle dynos. Don’t pay for computing capacity you don’t need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://elements.heroku.com/addons/guvscale&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/guvscale-heroku-elements.png&quot; alt=&quot;GuvScale on Heroku Elements&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We originally &lt;a href=&quot;http://www.jonnor.com/2015/11/guv-automatic-scaling/&quot;&gt;built the guv tool&lt;/a&gt; back in 2015, and it has been used since by &lt;a href=&quot;https://thegrid.io/&quot;&gt;The Grid&lt;/a&gt; to manage their &lt;a href=&quot;http://libregraphicsworld.org/blog/entry/artificial-intelligence-designs-websites-uses-open-technology-stack&quot;&gt;computationally intensive&lt;/a&gt; AI tasks. At The Grid we’ve had GuvScale make hundreds of thousands of scaling operations per month, running background dynos at more than 90% efficiency.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This has meant being able to produce sites at a consistent, predictable throughput regardless of how many users publish things at the same time, as well as not having to pay for idle cloud machines.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;There are many frameworks for splitting computational loads out of your main web process and into background dynos. If you’re working with Ruby, you’ve probably heard of &lt;a href=&quot;http://sidekiq.org/&quot;&gt;Sidekiq&lt;/a&gt;. For Python there is &lt;a href=&quot;http://www.celeryproject.org/&quot;&gt;Celery&lt;/a&gt;. And there is our &lt;a href=&quot;https://msgflo.org/&quot;&gt;MsgFlo&lt;/a&gt; flow-based programming framework for a more polyglot approach.&lt;/p&gt;

&lt;p&gt;If you’re already using one of these with RabbitMQ on Heroku (for example via the &lt;a href=&quot;https://www.cloudamqp.com&quot;&gt;CloudAMQP service&lt;/a&gt;), you’re ready to start autoscaling with GuvScale!&lt;/p&gt;

&lt;p&gt;First enable the &lt;a href=&quot;https://elements.heroku.com/addons/guvscale&quot;&gt;GuvScale add-on&lt;/a&gt;:&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;heroku addons:create guvscale
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Next you’ll need to create an OAuth token so that GuvScale can perform scaling operations for your app. Do this with the &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli&quot;&gt;Heroku CLI tool&lt;/a&gt;. First install the authorization add-on:&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;heroku plugins:install heroku-cli-oauth
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then create a token:&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;heroku authorizations:create &lt;span class=&quot;nt&quot;&gt;--description&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;GuvScale&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Copy the authentication token, and paste it to the GuvScale dashboard that you can access from your app’s &lt;em&gt;Resources&lt;/em&gt; tab in &lt;a href=&quot;https://dashboard.heroku.com/&quot;&gt;Heroku Dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once GuvScale has an OAuth token, it is ready to do scaling for you. You’ll have to provide some &lt;a href=&quot;https://devcenter.heroku.com/articles/guvscale#adding-a-guvscale-configuration&quot;&gt;scaling rules&lt;/a&gt;, either in the GuvScale dashboard, or via the &lt;a href=&quot;https://github.com/flowhub/heroku-guvscale&quot;&gt;heroku-guvscale CLI tool&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is an example for scaling a process that sends emails on the background:&lt;/p&gt;

&lt;div class=&quot;language-yaml 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;na&quot;&gt;emailsender&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# Dyno role to scale&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;queue&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;send-email&quot;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# The AMQP queue name&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;deadline&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;180&lt;/span&gt;       &lt;span class=&quot;c1&quot;&gt;# 3 minutes, in seconds&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;minimum&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# Minimum number of workers&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;maximum&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt;          &lt;span class=&quot;c1&quot;&gt;# Maximum number of workers&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;concurrency&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10&lt;/span&gt;     &lt;span class=&quot;c1&quot;&gt;# How many messages are processed concurrently&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;processing&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0.300&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;# 300 ms, in seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once GuvScale has been configured you can monitor its behavior in the dashboard.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/guvscale-graph.jpg&quot; alt=&quot;Workload and scaling operations&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Read more in the &lt;a href=&quot;https://devcenter.heroku.com/articles/guvscale&quot;&gt;Heroku Dev Center GuvScale tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;GuvScale is free during the public beta. &lt;a href=&quot;https://elements.heroku.com/addons/guvscale&quot;&gt;Get started now&lt;/a&gt;!&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Rescaling 3k images. From 0 servers to 25, back to 0 in &amp;lt;4 mins. 0 humans involved.&lt;a href=&quot;https://twitter.com/hashtag/devops?src=hash&quot;&gt;#devops&lt;/a&gt; &lt;a href=&quot;https://t.co/OSPMZtfrd9&quot;&gt;https://t.co/OSPMZtfrd9&lt;/a&gt; &lt;a href=&quot;https://t.co/s7Bog4hHLZ&quot;&gt;pic.twitter.com/s7Bog4hHLZ&lt;/a&gt;&lt;/p&gt;&amp;mdash; Jon Nordby (@jononor) &lt;a href=&quot;https://twitter.com/jononor/status/740652896254054401&quot;&gt;June 8, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://bergie.iki.fi//platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

</description>
      <pubDate>Mon, 20 Mar 2017 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fguvscale-heroku-autoscaling%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/guvscale-heroku-autoscaling/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/guvscale-heroku-autoscaling/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>The Grid: Web Design by Artificial Intelligence</title>
      <description>&lt;p&gt;As mentioned &lt;a href=&quot;http://bergie.iki.fi/blog/nemein-anders/&quot;&gt;last year&lt;/a&gt;, I’m working on a Artificial Intelligence that can do web design. It is called &lt;a href=&quot;https://thegrid.io/#6&quot;&gt;The Grid&lt;/a&gt;. Last week I gave a talk at &lt;a href=&quot;http://liftconference.com/lift16&quot;&gt;Lift Conference&lt;/a&gt; explaining how it all works.&lt;/p&gt;

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

&lt;p&gt;If you can’t see the video embed above, it is also available on &lt;a href=&quot;http://livestream.com/liftconference/events/4805866/videos/112147620&quot;&gt;the Livestream site&lt;/a&gt; and &lt;a href=&quot;https://youtu.be/v65HLBGLG_g&quot;&gt;YouTube&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Wed, 17 Feb 2016 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Flift-how-does-the-grid-work%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/lift-how-does-the-grid-work/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/lift-how-does-the-grid-work/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
    <item>
      
      <title>Nemein has a new home</title>
      <description>&lt;p&gt;When I flew to Tenerife to &lt;a href=&quot;https://www.flickr.com/photos/bergie/sets/72157649721117029/&quot;&gt;sail across the Atlantic&lt;/a&gt; in late November, there was excitement in the air. &lt;a href=&quot;http://nemein.com/&quot;&gt;Nemein&lt;/a&gt; — the software company I started in 2001 with &lt;a href=&quot;http://www.patidure.com/&quot;&gt;Henri Hovi&lt;/a&gt; and &lt;a href=&quot;http://www.haedong-kumdo.fi/&quot;&gt;Johannes Hentunen&lt;/a&gt;, and left later to build an &lt;a href=&quot;https://thegrid.io/#6&quot;&gt;AI-driven web publishing tool&lt;/a&gt; — was about to be sold.&lt;/p&gt;

&lt;p&gt;Today, I’m happy to tell that &lt;a href=&quot;https://www.andersinnovations.com/en/news/181/anders-innovations-inc-purchases-helsinki-based-software-company-grow-international-business/&quot;&gt;Nemein has been acquired&lt;/a&gt; by &lt;a href=&quot;https://www.andersinnovations.com/en/&quot;&gt;Anders Innovations&lt;/a&gt;, a fast-growing software company.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://d2vqpl3tx84ay5.cloudfront.net/nemein_anders.png&quot;&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/nemein_anders_small.png&quot; alt=&quot;Nemein joins Anders Innovations&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had a videoconference this morning with Nemein’s and Anders Inno’s CEOs Lauri and Tomi, and it seems the team Nemein has indeed found &lt;a href=&quot;https://www.andersinnovations.com/en/company/people/&quot;&gt;a good home&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://d2vqpl3tx84ay5.cloudfront.net/nemein_andersinno_lauri_tomi_small.jpg&quot; alt=&quot;Lauri and Tomi&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Technologically, the companies are a good fit. Both companies have a strong emphasis on building business systems on top of the &lt;a href=&quot;https://www.djangoproject.com/&quot;&gt;Django&lt;/a&gt; framework. To this mix, Nemein will also bring its long background with &lt;a href=&quot;http://midgard-project.org/&quot;&gt;Midgard CMS&lt;/a&gt; and mobile ecosystems like &lt;a href=&quot;http://bergie.iki.fi/blog/meego-diaspora/&quot;&gt;MeeGo&lt;/a&gt; and its successor, &lt;a href=&quot;http://bergie.iki.fi/blog/jolla-sailfish/&quot;&gt;Sailfish&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I wish the whole team at Anders Innovation the best, and hope they will be able to continue functioning as a champion of the &lt;a href=&quot;http://bergie.iki.fi/blog/decoupling_content_management/&quot;&gt;decoupled content management&lt;/a&gt; idea.&lt;/p&gt;

&lt;p&gt;Nemein has also been a valuable contributor to the &lt;a href=&quot;https://flowhub.io/&quot;&gt;Flowhub&lt;/a&gt; ecosystem, which I hope will continue.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.andersinnovations.com/en/news/181/anders-innovations-inc-purchases-helsinki-based-software-company-grow-international-business/&quot;&gt;Anders purchases Helsinki-based software company to grow international business&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://ts.fi/uutiset/talous/721924/Ohjelmistoyritys+Anders+Innovations+laajenee&quot;&gt;Turun Sanomat: Ohjelmistoyritys Anders Innovations laajenee&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.tivi.fi/kaikki_uutiset/anders+osti+itosaajia+ndash+quotratkaisimme+rekrytointiongelmatquot/a1041525&quot;&gt;TiVi: Anders osti it-osaajia — “ratkaisimme rekrytointiongelmat”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;For those interested in the background of Nemein, I wrote a longish story of the &lt;a href=&quot;http://bergie.iki.fi/blog/ten_years_of_nemein/&quot;&gt;company’s first ten years&lt;/a&gt; back in 2011. I also promise to write about &lt;a href=&quot;https://thegrid.io/#6&quot;&gt;The Grid&lt;/a&gt; soon!&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fnemein-anders%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/nemein-anders/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/nemein-anders/</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>Interview with J. Paul Morrison, the father of Flow-Based Programming</title>
      <description>&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/John_Paul_Morrison&quot;&gt;J. Paul Morrison&lt;/a&gt; invented &lt;a href=&quot;http://en.wikipedia.org/wiki/Flow-based_programming&quot;&gt;Flow-Based Programming&lt;/a&gt; while at IBM in 1969.&lt;/p&gt;

&lt;p&gt;I ran into the concept &lt;a href=&quot;http://bergie.iki.fi/blog/interview-noflo-origins/&quot;&gt;in 2011&lt;/a&gt; while trying to figure out a better way to create software. I read &lt;a href=&quot;http://amzn.com/1451542321&quot;&gt;his canonical book&lt;/a&gt; on the subject, and decided to try and implement it in JavaScript. Thus, &lt;a href=&quot;https://noflojs.org/&quot;&gt;NoFlo&lt;/a&gt; got started.&lt;/p&gt;

&lt;p&gt;It has been an honor to have Paul as a mentor in the process. In late June 2013 we flew to Toronto to meet him. What resulted was quite a thorough code review of NoFlo’s FBP implementation, and a video interview. The &lt;a href=&quot;https://youtu.be/up2yhNTsaDs&quot;&gt;interview with Paul&lt;/a&gt; is finally online. Enjoy!&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/up2yhNTsaDs&quot; frameborder=&quot;0&quot; gesture=&quot;media&quot; allow=&quot;encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;If you want to meet Paul in person, the next opportunity will be in the &lt;a href=&quot;http://www.meetup.com/Toronto-GTA-Flow-Based-Programming-Meetup/&quot;&gt;Toronto Flow-Based Programming meetup&lt;/a&gt; on September 11th. On the same week we also have &lt;a href=&quot;http://techup.ch/1209/webtuesday-noflo-flow-based-programming-for-javascript&quot;&gt;my NoFlo talk in Zurich&lt;/a&gt; on the 10th, and &lt;a href=&quot;http://2013.jsconf.eu/&quot;&gt;Forrest’s talk in Berlin&lt;/a&gt; on the 14th.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;In other news, the &lt;a href=&quot;http://www.kickstarter.com/projects/noflo/noflo-development-environment&quot;&gt;NoFlo Kickstarter campaign&lt;/a&gt; just hit 96%. Please help us get it funded so we can bring better flow-based tools to designers and programmers everywhere!&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Fri, 06 Sep 2013 00:00:00 +0000</pubDate>
      <atom:link rel="payment" href="https://flattr.com/submit/auto?url=https%3A%2F%2Fbergie.iki.fi%2Fblog%2Fpaul-morrison-interview%2F&amp;user_id=bergie" type="text/html" />
      <link>https://bergie.iki.fi/blog/paul-morrison-interview/</link>
      <guid isPermaLink="true">https://bergie.iki.fi/blog/paul-morrison-interview/</guid>
      <author>henri.bergius@iki.fi (Henri Bergius)</author>
    </item>
    
  </channel>
</rss>
