<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Go on Living Systems_</title>
    <link>https://livesys.se/tags/go/</link>
    <description>Recent content in Go on Living Systems_</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 03 Sep 2024 11:15:02 +0200</lastBuildDate>
    <atom:link href="https://livesys.se/tags/go/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Rewrite of Scicommander in Go with much improved algorithm</title>
      <link>https://livesys.se/posts/rewrite-of-scicommander-in-go/</link>
      <pubDate>Tue, 03 Sep 2024 11:15:02 +0200</pubDate>
      <guid>https://livesys.se/posts/rewrite-of-scicommander-in-go/</guid>
      <description>&lt;p&gt;When I presented a poster about&#xA;&lt;a href=&#34;https://github.com/samuell/scicommander&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SciCommander&lt;/a&gt;&#xA; at the &lt;a href=&#34;https://livesys.se/posts/scicommander-0.3/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Swedish bioinformatics workshop&lt;/a&gt;&#xA; last year,&#xA;I got a lot of awesome feedback from some great people including Fredrik&#xA;Boulund, Johannes Alneberg and others, of which I unfortunately lost the names&#xA;(please shout out if you read this!).&lt;/p&gt;&#xA;&lt;p&gt;(For those new to SciCommander, it is my attempt at creating a tool that can&#xA;track complete provenance reports also for ad-hoc shell commands, not just&#xA;those included in a pipeline. The grand plan is also to integrate this&#xA;provenance tracking with those of popular pipelines, to enable seamless&#xA;provenance report generation across pipelines and ad-hoc commands).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why didn&#39;t Go get a breakthrough in bioinformatics (yet)?</title>
      <link>https://livesys.se/posts/golang-for-bioinformatics/</link>
      <pubDate>Mon, 13 May 2024 17:05:00 +0200</pubDate>
      <guid>https://livesys.se/posts/golang-for-bioinformatics/</guid>
      <description>&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;gopherbinfie.jpg&#34; alt=&#34;A gopher doing&#xA;bioinformatics&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;As we are - &lt;a href=&#34;https://a16z.com/the-century-of-biology/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;according to some expert&#xA;opinions&lt;/a&gt;&#xA; - living in the&#xA;Century of Biology, I found it interesting to reflect on Go&amp;rsquo;s usage&#xA;within the field.&lt;/p&gt;&#xA;&lt;p&gt;Go has some great features that make it really well suited for biology,&#xA;such as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A relatively simple language that can be learned in a short time&#xA;even for people without a CS background. This is super important&#xA;aspect for biologists.&lt;/li&gt;&#xA;&lt;li&gt;Fantastic support for cross-compilation into all major computer&#xA;architectures and operating systems, as static, self-sufficient&#xA;executables making it extremely simple to deploy tools, something&#xA;that can&amp;rsquo;t be said about the currently most popular bio language,&#xA;Python.&lt;/li&gt;&#xA;&lt;li&gt;Fantastic support for concurrency and writing code as a set of&#xA;parallell operations that streams data between them. Again, as&#xA;opposed to Python. More on that later.&lt;/li&gt;&#xA;&lt;li&gt;A large standard library that contains a lot of common needs, even&#xA;for writing user interfaces and web servers.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Go has in fact garnered some use for bioinformatics tools over the years, with&#xA;some indications that its use is increasing. Examples of popular tools and&#xA;toolkits are &lt;a href=&#34;https://github.com/shenwei356/seqkit&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SeqKit&lt;/a&gt;&#xA; (a veritable &lt;em&gt;swiss&#xA;army knife&lt;/em&gt; for bioinformatics), the &lt;a href=&#34;https://github.com/biogo/biogo&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;BioGo&#xA;toolkit&lt;/a&gt;&#xA;, the &lt;a href=&#34;https://github.com/pbenner/gonetics&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gonetics&#xA;package&lt;/a&gt;&#xA; and lately the &lt;a href=&#34;https://github.com/vertgenlab/gonomics&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gonomics&#xA;package&lt;/a&gt;&#xA; and finally the&#xA;&lt;a href=&#34;https://github.com/bebop/poly&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Poly&lt;/a&gt;&#xA; package for synthetic biology. And this&#xA;is besides heavy use in infrastructure-oriented projects like the&#xA;&lt;a href=&#34;https://www.benthos.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Benthos&lt;/a&gt;&#xA; stream processing tool, the &lt;a href=&#34;https://github.com/grailbio/reflow&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Reflow pipeline&#xA;tool&lt;/a&gt;&#xA; and &lt;a href=&#34;https://pachyderm.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Pachyderm orchestration&#xA;suite&lt;/a&gt;&#xA;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Crystal: Go-like concurrency with easier syntax</title>
      <link>https://livesys.se/posts/crystal-concurrency-easier-syntax-than-golang/</link>
      <pubDate>Sat, 05 Sep 2020 15:36:00 +0200</pubDate>
      <guid>https://livesys.se/posts/crystal-concurrency-easier-syntax-than-golang/</guid>
      <description>&lt;p&gt;I have been playing around a lot with concurrency in Go over the years,&#xA;resulting in libraries such as &lt;a href=&#34;https://scipipe.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SciPipe&lt;/a&gt;&#xA;,&#xA;&lt;a href=&#34;http://flowbase.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;FlowBase&lt;/a&gt;&#xA; and&#xA;&lt;a href=&#34;https://github.com/rdfio/rdf2smw/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;rdf2smw&lt;/a&gt;&#xA;. My main motivation for&#xA;looking into Go has been the possibility to use it as a more performant,&#xA;scaleable and type-safe alternative to Python for data heavy scripting&#xA;tasks in bioinformatics and other fields I&amp;rsquo;ve been dabbling in.&#xA;Especially as it makes it so easy to write concurrent and parallel code&#xA;in it. Be warned that this context is surely giving me some biases.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Viewing Go test coverage in the browser with one command</title>
      <link>https://livesys.se/posts/go-test-coverage-in-browser/</link>
      <pubDate>Thu, 20 Aug 2020 23:47:00 +0200</pubDate>
      <guid>https://livesys.se/posts/go-test-coverage-in-browser/</guid>
      <description>&lt;p&gt;Go has some really nice tools for running tests and analyzing code. One&#xA;of these functionalities is that you can generate coverage information&#xA;when running tests, that can later be viewed in a browser using the&#xA;&lt;code&gt;go tool cover&lt;/code&gt; command. It turns out though, since doing it requires&#xA;executing multiple commands after each other, it might be hard to&#xA;remember the exact commands.&lt;/p&gt;&#xA;&lt;p&gt;To this end, I created a bash alias that does everything in one command,&#xA;&lt;code&gt;gocov&lt;/code&gt;. It looks like this (to be placed in your &lt;code&gt;~/.bash_aliases&lt;/code&gt; file&#xA;or similar:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Structured Go-routines or framework-less Flow-Based Programming in Go</title>
      <link>https://livesys.se/posts/structured-go-routines-or-framework-less-flow-based-programming-in-go/</link>
      <pubDate>Sat, 02 Mar 2019 13:52:00 +0100</pubDate>
      <guid>https://livesys.se/posts/structured-go-routines-or-framework-less-flow-based-programming-in-go/</guid>
      <description>&lt;p&gt;I was so happy the other day to find someone else who found the great&#xA;benefits of a little pattern for how to structure pipeline-heavy&#xA;programs in Go, which I described in a few posts before. I have been&#xA;surprised to not find more people using this kind of pattern, which has&#xA;been so extremely helpful to us, so I thought to take this opportunity&#xA;to re-iterate it again, in the hopes that more people might get aware of&#xA;it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parsing DrugBank XML (or any large XML file) in streaming mode in Go</title>
      <link>https://livesys.se/posts/parsing-drugbank-xml-or-any-large-xml-file-in-streaming-mode-in-go/</link>
      <pubDate>Thu, 15 Mar 2018 15:19:00 +0100</pubDate>
      <guid>https://livesys.se/posts/parsing-drugbank-xml-or-any-large-xml-file-in-streaming-mode-in-go/</guid>
      <description>&lt;p&gt;I had a problem in which I thought I needed to parse the full&#xA;&lt;a href=&#34;https://www.drugbank.ca&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;DrugBank&lt;/a&gt;&#xA; dataset, which comes as a &lt;a href=&#34;https://www.drugbank.ca/releases/5-0-11/downloads/all-full-database&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;(670MB) XML file&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;(For open access papers describing DrugBank, see: &lt;!-- raw HTML omitted --&gt;[1]&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;[2]&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;[3]&lt;!-- raw HTML omitted --&gt; and &lt;!-- raw HTML omitted --&gt;[4]&lt;!-- raw HTML omitted --&gt;).&lt;!-- raw HTML omitted --&gt; It turned out what I needed was available as CSV&#xA;files under &amp;ldquo;&lt;a href=&#34;https://www.drugbank.ca/releases/latest#structures&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Structure External&#xA;Links&lt;/a&gt;&#xA;&amp;rdquo;. There is probably&#xA;still some other uses of this approach though, as the XML version of DrugBank&#xA;seems to contain a lot more information in a single format. And in any case,&#xA;this forced me to figure out how to parse large XML files in a streaming&#xA;fashion in Go, as older tools like&#xA;&lt;a href=&#34;http://xmlstar.sourceforge.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;XMLStarlet&lt;/a&gt;&#xA; chokes for many minutes upon the&#xA;DrugBank file (trying to read it all into memory?), killing any attempt at an&#xA;iterative development cycle. And, it turns out Go&amp;rsquo;s support for streaming XML&#xA;parsing is just great!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Equation-centric dataflow programming in Go</title>
      <link>https://livesys.se/posts/equation-centric-dataflow-programming-in-go/</link>
      <pubDate>Wed, 27 Dec 2017 14:05:00 +0100</pubDate>
      <guid>https://livesys.se/posts/equation-centric-dataflow-programming-in-go/</guid>
      <description>&lt;h2 id=&#34;mathematical-notation-and-dataflow-programming&#34;&gt;Mathematical notation and dataflow programming&lt;/h2&gt;&#xA;&lt;p&gt;Even though computations done on computers are very often based on some&#xA;type of math, it is striking that the notation used in math to express&#xA;equations and relations is not always very readily converted into&#xA;programming code. Outside of purely &lt;a href=&#34;https://en.wikipedia.org/wiki/Symbolic_programming&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;symbolic&#xA;programming&lt;/a&gt;&#xA;&#xA;languages like &lt;a href=&#34;http://www.sagemath.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;sage math&lt;/a&gt;&#xA; or the&#xA;(proprietary) &lt;a href=&#34;https://www.wolfram.com/language&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Wolfram language&lt;/a&gt;&#xA;,&#xA;there seem to always be quite a divide between the mathematical notation&#xA;and the numerical implementation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go is growing in bioinformatics workflow tools</title>
      <link>https://livesys.se/posts/golang-growing-in-bioinformatics-workflows/</link>
      <pubDate>Fri, 10 Nov 2017 12:54:00 +0100</pubDate>
      <guid>https://livesys.se/posts/golang-growing-in-bioinformatics-workflows/</guid>
      <description>&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;gopher_thinking_workflows.png&#34; alt=&#34;Gopher thinking with logos of different workflow tools in the air&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;TL;DR: We wrote a post on gopherdata.io, about the growing ecosystem of&#xA;Go-based workflow tools in bioinformatics. &lt;a href=&#34;https://gopherdata.io/post/more_go_based_workflow_tools_in_bioinformatics/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go read it&#xA;here&lt;/a&gt;&#xA;&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It is interesting to note how Google&amp;rsquo;s &lt;a href=&#34;https://golang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go programming&#xA;language&lt;/a&gt;&#xA; seems to increase in popularity in&#xA;bioinformatics.&lt;/p&gt;&#xA;&lt;p&gt;Just to give a sample of some of the Go based bioinformatics tools I&amp;rsquo;ve&#xA;stumbled upon, there is since a few years back, the &lt;a href=&#34;https://github.com/biogo/biogo&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;biogo&#xA;library&lt;/a&gt;&#xA;, providing common functionality&#xA;for bioinformatics tasks. It was recently reviewed in two great blog&#xA;posts (&lt;a href=&#34;https://medium.com/@boti_ka/a-gentle-introduction-to-b%C3%ADogo-part-i-65dbd40e31d4&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;part&#xA;I&lt;/a&gt;&#xA;,&#xA;&lt;a href=&#34;https://medium.com/@boti_ka/a-gentle-introduction-to-b%C3%ADogo-part-ii-1f0df1cf72f0&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;part&#xA;II&lt;/a&gt;&#xA;).&#xA;Further, Brent Pedersen also wrote a little collection of Go based&#xA;bioinfo tools, compiled down into a single static binary, called&#xA;&lt;a href=&#34;https://github.com/brentp/goleft&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;goleft&lt;/a&gt;&#xA;, and finally, I there is the&#xA;&lt;a href=&#34;https://github.com/exascience/elprep&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;elprep tool&lt;/a&gt;&#xA;, used to prepare&#xA;.sam/.bam/.cram files for variant calling, which was published in a&#xA;&lt;a href=&#34;http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0132868&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;PLoS one&#xA;paper&lt;/a&gt;&#xA;.&#xA;Just a few examples.&lt;/p&gt;</description>
    </item>
    <item>
      <title>(Almost) ranging over multiple Go channels simultaneously</title>
      <link>https://livesys.se/posts/range-over-multiple-go-channels/</link>
      <pubDate>Thu, 05 Oct 2017 10:23:00 +0200</pubDate>
      <guid>https://livesys.se/posts/range-over-multiple-go-channels/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;Thus, optimally, one would want to use Go&amp;rsquo;s handy &lt;strong&gt;range&lt;/strong&gt; keyword for&#xA;looping over multiple channels, since &lt;strong&gt;range&lt;/strong&gt; takes care of closing&#xA;the for-loop at the right time (when the inbound channel is closed). So&#xA;something like this (&lt;strong&gt;N.B:&lt;/strong&gt; non-working code!):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;a&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a90d91&#34;&gt;range&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;chA&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;chB&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;chC&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;doSomething&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;a&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;b&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;c&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unfortunately this is not possible, and probably for good reason (how&#xA;would it know whether to close the loop when the first, or all of the&#xA;channels are closed? etc).&lt;/p&gt;</description>
    </item>
    <item>
      <title>First production run with SciPipe - A Go-based scientific workflow tool</title>
      <link>https://livesys.se/posts/first-production-workflow-run-with-scipipe/</link>
      <pubDate>Thu, 28 Sep 2017 19:32:00 +0200</pubDate>
      <guid>https://livesys.se/posts/first-production-workflow-run-with-scipipe/</guid>
      <description>&lt;p&gt;Today marked the day when we ran the very first production workflow with&#xA;&lt;a href=&#34;http://scipipe.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SciPipe&lt;/a&gt;&#xA;, the &lt;a href=&#34;https://golang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go&lt;/a&gt;&#xA;-based&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Scientific_workflow_system&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;scientific workflow&#xA;tool&lt;/a&gt;&#xA; we&amp;rsquo;ve&#xA;been working on over the last couple of years. Yay! :)&lt;/p&gt;&#xA;&lt;p&gt;This is how it looked (no fancy GUI or such yet, sorry):&lt;/p&gt;&#xA;&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;terminal_411.png&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;The first result we got in this very very first job was a list of counts&#xA;of ligands (chemical compounds) in the &lt;a href=&#34;https://jcheminf.springeropen.com/articles/10.1186/s13321-017-0203-5&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ExcapeDB&#xA;dataset&lt;/a&gt;&#xA;&#xA;(&lt;a href=&#34;https://zenodo.org/record/173258&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;download here&lt;/a&gt;&#xA;) interacting with the&#xA;44 protein/gene targets &lt;a href=&#34;http://dx.doi.org/10.1038/nrd3845&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;identified by Bowes et&#xA;al&lt;/a&gt;&#xA; as a good baseline set for&#xA;identifying hazardous side-effects effects in the body (that is, any&#xA;chemical compounds binding these proteins, will never become an approved&#xA;drug).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Notes on launching kubernetes jobs from the Go API</title>
      <link>https://livesys.se/posts/launching-kubernetes-jobs-from-the-go-api-notes-from-a-beginner/</link>
      <pubDate>Wed, 15 Feb 2017 00:01:00 +0100</pubDate>
      <guid>https://livesys.se/posts/launching-kubernetes-jobs-from-the-go-api-notes-from-a-beginner/</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is &lt;a href=&#34;https://medium.com/@saml/launching-kubernetes-jobs-from-the-go-api-notes-from-a-beginner-2b34fbc502c0&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;also published on&#xA;medium&lt;/a&gt;&#xA;&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;My current work at &lt;a href=&#34;http://pharmb.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pharmb.io&lt;/a&gt;&#xA; entails adding&#xA;&lt;a href=&#34;http://kubernetes.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;kubernetes&lt;/a&gt;&#xA; support to my light-weight Go-based&#xA;scientific workflow engine,&#xA;&lt;a href=&#34;https://github.com/scipipe/scipipe&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;scipipe&lt;/a&gt;&#xA; (kubernetes, or &lt;em&gt;k8s&lt;/em&gt; for&#xA;short, is Google&amp;rsquo;s open source project for orchestrating container based&#xA;compute clusters), which should take scipipe from a simple &amp;ldquo;run it on&#xA;your laptop&amp;rdquo; workflow system with HPC support still in the work, to&#xA;something that can power scientific workflows on any set of networked&#xA;computers that can run kubernetes, which is quite a few (AWS, GCE,&#xA;Azure, your Raspberry Phi cluster etc etc).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Combining the best of Go, D and Rust?</title>
      <link>https://livesys.se/posts/the-best-of-go-d-and-rust/</link>
      <pubDate>Sat, 11 Jun 2016 14:24:00 +0200</pubDate>
      <guid>https://livesys.se/posts/the-best-of-go-d-and-rust/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been following the development of &lt;a href=&#34;http://dlang.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;D&lt;/a&gt;&#xA;,&#xA;&lt;a href=&#34;http://golang.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go&lt;/a&gt;&#xA; and &lt;a href=&#34;https://www.rust-lang.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Rust&lt;/a&gt;&#xA; (and also&#xA;&lt;a href=&#34;http://www.freepascal.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;FreePascal&lt;/a&gt;&#xA; for &lt;a href=&#34;https://github.com/NBISweden/mdc-file-export&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;some use&#xA;cases&lt;/a&gt;&#xA;) for some years&#xA;(&lt;a href=&#34;http://saml.rilspace.org/moar-languagez-gc-content-in-python-d-fpc-c-and-c&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;been into some benchmarking for bioinfo&#xA;tasks&lt;/a&gt;&#xA;),&#xA;and now we finally have three (four, with fpc) stable statically&#xA;compiled languages with some momentum behind them, meaning they all are&#xA;past 1.0.&lt;/p&gt;&#xA;&lt;p&gt;While I have went with Go for &lt;a href=&#34;http://scipipe.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;current projects&lt;/a&gt;&#xA;, I&#xA;still have a hard time &amp;ldquo;totally falling in love&amp;rdquo; with any single of&#xA;these languages. They all fulfill different subsets of my wishlist for&#xA;an optimal compiled data munging language.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I would like to write Go programs</title>
      <link>https://livesys.se/posts/how-i-would-like-to-write-golang/</link>
      <pubDate>Sat, 18 Jul 2015 02:34:00 +0200</pubDate>
      <guid>https://livesys.se/posts/how-i-would-like-to-write-golang/</guid>
      <description>&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;selection_301.png&#34; alt=&#34;&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Some time ago I got a &lt;a href=&#34;http://blog.gopheracademy.com/composable-pipelines-pattern&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;post published on&#xA;GopherAcademy&lt;/a&gt;&#xA;,&#xA;outlining in detail how I think a &lt;a href=&#34;http://www.jpaulmorrison.com/fbp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;flow-based&#xA;programming&lt;/a&gt;&#xA; inspired syntax can&#xA;strongly help to create clearer, easier-to-maintain, and more&#xA;declarative Go programs.&lt;/p&gt;&#xA;&lt;p&gt;These ideas have since became clearer, and we (&lt;a href=&#34;http://twitter.com/ola_spjuth&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Ola&#xA;Spjuth&lt;/a&gt;&#xA;&amp;rsquo;s &lt;a href=&#34;http://www.farmbio.uu.se/research/researchgroups/pb/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;research group at&#xA;pharmbio&lt;/a&gt;&#xA;) have&#xA;successfully used them to make the workflow syntax for&#xA;&lt;a href=&#34;https://github.com/spotify/luigi&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Luigi&lt;/a&gt;&#xA; (Spotify&amp;rsquo;s great workflow&#xA;engine by &lt;a href=&#34;http://twitter.com/fulhack&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Erik Bernhardsson&lt;/a&gt;&#xA; &amp;amp; co)&#xA;workflows easier, as implemented in the &lt;a href=&#34;https://github.com/samuell/sciluigi#readme&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SciLuigi helper&#xA;library&lt;/a&gt;&#xA;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Patterns for composable concurrent pipelines in Go</title>
      <link>https://livesys.se/posts/patterns-for-composable-concurrent-pipelines-in-go/</link>
      <pubDate>Mon, 01 Jun 2015 14:54:00 +0200</pubDate>
      <guid>https://livesys.se/posts/patterns-for-composable-concurrent-pipelines-in-go/</guid>
      <description>&lt;p&gt;I realize I didn&amp;rsquo;t have a link to my blog on &lt;a href=&#34;http://gopheracademy.com&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gopher&#xA;Academy&lt;/a&gt;&#xA;, on patterns for compoasable&#xA;concurrent pipelines in Go(lang), so here it goes:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://blog.gopheracademy.com/composable-pipelines-pattern&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;blog.gopheracademy.com/composable-pipelines-pattern&lt;/a&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;selection_212.png&#34; alt=&#34;Gopher academy screenshot&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>The smallest pipeable go program</title>
      <link>https://livesys.se/posts/smallest-pipeable-go-program/</link>
      <pubDate>Thu, 18 Dec 2014 20:43:00 +0100</pubDate>
      <guid>https://livesys.se/posts/smallest-pipeable-go-program/</guid>
      <description>&lt;p&gt;Edit: My original suggested way further below in the post is no way the&#xA;&amp;ldquo;smallest pipeable&amp;rdquo; program, instead see this example (Credits: &lt;a href=&#34;https://plus.google.com/&amp;#43;AxelWagner_Merovius&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Axel Wagner&lt;/a&gt;&#xA;):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;io&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000&#34;&gt;io&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Copy&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Stdout&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Stdin&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip; or (credits: &lt;a href=&#34;https://twitter.com/rogpeppe&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Roger Peppe&lt;/a&gt;&#xA;):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;import&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;bufio&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a90d91&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a90d91&#34;&gt;for&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;scan&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;bufio&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;NewScanner&lt;/span&gt;(&lt;span style=&#34;color:#000&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Stdin&lt;/span&gt;); &lt;span style=&#34;color:#000&#34;&gt;scan&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Scan&lt;/span&gt;(); {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#c41a16&#34;&gt;&amp;#34;%s\n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#000&#34;&gt;scan&lt;/span&gt;.&lt;span style=&#34;color:#000&#34;&gt;Text&lt;/span&gt;())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ah, I just realized that the &amp;ldquo;smallest pipeable&amp;rdquo;&#xA;&lt;a href=&#34;http://golang.org&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go&lt;/a&gt;&#xA;(lang) program is rather small, if using my&#xA;&lt;a href=&#34;https://github.com/samuell/glow&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;little library of minimalistic streaming components&lt;/a&gt;&#xA;.&#xA;Nothing more than:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Profiling and creating call graphs for Go programs</title>
      <link>https://livesys.se/posts/profiling-and-call-graphs-for-golang/</link>
      <pubDate>Thu, 08 Aug 2013 01:13:00 +0200</pubDate>
      <guid>https://livesys.se/posts/profiling-and-call-graphs-for-golang/</guid>
      <description>&lt;p&gt;In trying to get my head around the code of the very interesting&#xA;&lt;a href=&#34;https://github.com/trustmaster/goflow&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GoFlow&lt;/a&gt;&#xA; library, (for flow-based&#xA;programming in Go), and the accompanying &lt;a href=&#34;https://github.com/samuell/blow&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;flow-based bioinformatics&#xA;library&lt;/a&gt;&#xA; I started hacking on, I needed&#xA;to get some kind of visualization (like a call graph) &amp;hellip; something&#xA;like this:&lt;/p&gt;&#xA;&lt;p&gt;&lt;p class=&#34;image&#34;&gt;&#xA;    &lt;img src=&#34;basecompl_blow_callgraph_1.png&#34; alt=&#34;Call graph&#34;  /&gt;&#xA;&lt;/p&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;(And in the end, that is what I got &amp;hellip; read on &amp;hellip; ) :)&lt;/p&gt;&#xA;&lt;p&gt;I then found out about the go tool pprof command, for which the Go team&#xA;published a &lt;a href=&#34;http://blog.golang.org/profiling-go-programs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;blog post&lt;/a&gt;&#xA; on&#xA;&lt;a href=&#34;http://blog.golang.org/profiling-go-programs&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;&#xA;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
