<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>zignar.net</title>
    <link href="https://zignar.net/index.xml" rel="self" />
    <link href="https://zignar.net" />
    <id>https://zignar.net/index.xml</id>
    <author>
        <name>Mathias Fußenegger</name>
    </author>
    <updated>2025-09-23T00:00:00Z</updated>
    <entry>
      <title>Profiling Cheatsheet</title>
      <link href="https://zignar.net/2025/09/23/profiling-cheatsheet" />
      <id>https://zignar.net/2025/09/23/profiling-cheatsheet</id>
      <published>2025-09-23T00:00:00Z</published>
      <updated>2025-09-23T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short overview - or reference - on how I tend to do quick
application profiling.</p>
]]></summary>
    </entry>
    <entry>
      <title>Dealing with flaky tests</title>
      <link href="https://zignar.net/2025/06/26/dealing-with-flaky-tests" />
      <id>https://zignar.net/2025/06/26/dealing-with-flaky-tests</id>
      <published>2025-06-26T00:00:00Z</published>
      <updated>2025-09-15T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In my work I’m often dealing with flaky tests due to race conditions.
Here are a few things I’ve picked up along the way that can help to deal
with them.</p>
]]></summary>
    </entry>
    <entry>
      <title>The Debug Adapter Protocol is a REPL protocol in disguise</title>
      <link href="https://zignar.net/2025/06/23/debug-adapter-protocol-is-a-repl-protocol" />
      <id>https://zignar.net/2025/06/23/debug-adapter-protocol-is-a-repl-protocol</id>
      <published>2025-06-23T00:00:00Z</published>
      <updated>2025-06-23T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A couple months back I created <a
href="https://codeberg.org/mfussenegger/nluarepl">nluarepl</a>. It’s a
REPL for the Neovim Lua interpreter with a little twist: It’s using the
Debug Adapter Protocol. And before that, I worked on <a
href="https://codeberg.org/mfussenegger/hprofdap">hprofdap</a>. Also a
kind of a REPL using DAP that lets you inspect Java heap dumps
(<code>.hprof</code> files) using OQL.</p>
<p>As the name might imply, a REPL isn’t the main use case for the Debug
Adapter Protocol (DAP). From the <a
href="https://microsoft.github.io/debug-adapter-protocol/">DAP
page</a>:</p>
<blockquote>
<p>The idea behind the Debug Adapter Protocol (DAP) is to abstract the
way how the debugging support of development tools communicates with
debuggers or runtimes into a protocol.</p>
</blockquote>
<p>But it works surprisingly well for a REPL interface to a language
interpreter too.</p>
]]></summary>
    </entry>
    <entry>
      <title>No-Config Python debugging using Neovim</title>
      <link href="https://zignar.net/2025/03/02/no-config-python-debugging-using-neovim" />
      <id>https://zignar.net/2025/03/02/no-config-python-debugging-using-neovim</id>
      <published>2025-03-02T00:00:00Z</published>
      <updated>2025-03-02T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A little while ago Microsoft released <a
href="https://github.com/microsoft/vscode-python-debugger/wiki/No%E2%80%90Config-Debugging">No
Config Debugging</a> functionality in their vscode python extension.</p>
<p>This got me curious - wondering if it can be replicated in Neovim.
Turns out it can be. This post shows how.</p>
]]></summary>
    </entry>
    <entry>
      <title>Template files for nvim</title>
      <link href="https://zignar.net/2024/11/20/template-files-for-nvim" />
      <id>https://zignar.net/2024/11/20/template-files-for-nvim</id>
      <published>2024-11-20T00:00:00Z</published>
      <updated>2024-11-20T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Over the years I’ve picked up various tweaks for my <code>nvim</code>
configuration. One of them is template file support. This article is a
short introduction to what they are, how do they work and how I recently
extended them to support snippet expansion.</p>
]]></summary>
    </entry>
    <entry>
      <title>Debugging Lua in Neovim</title>
      <link href="https://zignar.net/2023/06/10/debugging-lua-in-neovim" />
      <id>https://zignar.net/2023/06/10/debugging-lua-in-neovim</id>
      <published>2023-06-10T00:00:00Z</published>
      <updated>2023-06-10T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this post I want to show you how you can debug Lua scripts with
Neovim and <a
href="https://codeberg.org/mfussenegger/nvim-dap">nvim-dap</a>. Both
regular Lua, but also Lua that uses Neovim as Lua interpreter. The
latter is interesting if you want to debug Neovim plugin test cases
written using <a
href="https://lunarmodules.github.io/busted/">busted</a></p>
]]></summary>
    </entry>
    <entry>
      <title>Debugging Neovim with Neovim and nvim-dap</title>
      <link href="https://zignar.net/2023/02/17/debugging-neovim-with-neovim-and-nvim-dap" />
      <id>https://zignar.net/2023/02/17/debugging-neovim-with-neovim-and-nvim-dap</id>
      <published>2023-02-17T00:00:00Z</published>
      <updated>2023-02-17T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Recently a change got merged in Neovim that decoupled its TUI from
the main process. A side effect of the change is that debugging it
became a bit more troublesome. It now forks itself and you end up with
two processes. Depending on what you want to debug you need to attach to
that second process.</p>
<p>I thought this might be an interesting use-case for more advanced
features of nvim-dap. This post explores using it to automate attaching
to the second process.</p>
<p>Even if you’ll never debug Neovim you may find this interesting as it
could give you some ideas on what you can do with a hackable
debugger.</p>
<p>This post uses nvim-dap features of the upcoming 0.5 release. If
you’re on 0.4 you’ll have to switch to the development branch. (If you
are from the future, use 0.5+)</p>
]]></summary>
    </entry>
    <entry>
      <title>Using Neovim as Lua interpreter with Luarocks</title>
      <link href="https://zignar.net/2023/01/21/using-Luarocks-as-lua-interpreter-with-luarocks" />
      <id>https://zignar.net/2023/01/21/using-Luarocks-as-lua-interpreter-with-luarocks</id>
      <published>2023-01-21T00:00:00Z</published>
      <updated>2023-01-21T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short article covering how you can use Neovim as Lua
interpreter for <a href="https://luarocks.org/">Luarocks</a> and <a
href="https://lunarmodules.github.io/busted/">busted</a>.</p>
]]></summary>
    </entry>
    <entry>
      <title>Structuring Neovim Lua plugins</title>
      <link href="https://zignar.net/2022/11/06/structuring-neovim-lua-plugins" />
      <id>https://zignar.net/2022/11/06/structuring-neovim-lua-plugins</id>
      <published>2022-11-06T00:00:00Z</published>
      <updated>2022-11-06T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is an introduction to the various ways you can structure a
Neovim plugin and their trade-offs.</p>
]]></summary>
    </entry>
    <entry>
      <title>Testing Neovim LSP plugins</title>
      <link href="https://zignar.net/2022/10/26/testing-neovim-lsp-plugins" />
      <id>https://zignar.net/2022/10/26/testing-neovim-lsp-plugins</id>
      <published>2022-10-26T00:00:00Z</published>
      <updated>2022-10-26T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short introduction in how you can test a Neovim plugin
which extends the LSP functionality. This approach requires Neovim 0.8
or later.</p>
]]></summary>
    </entry>
    <entry>
      <title>New LSP features in Neovim 0.8</title>
      <link href="https://zignar.net/2022/10/01/new-lsp-features-in-neovim-08" />
      <id>https://zignar.net/2022/10/01/new-lsp-features-in-neovim-08</id>
      <published>2022-10-01T00:00:00Z</published>
      <updated>2022-10-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Neovim 0.8 got released the other day, time to write about some of
the LSP changes.</p>
]]></summary>
    </entry>
    <entry>
      <title>Using tshark to monitor PostgreSQL traffic</title>
      <link href="https://zignar.net/2022/09/24/using-tshark-to-monitor-pg-traffic" />
      <id>https://zignar.net/2022/09/24/using-tshark-to-monitor-pg-traffic</id>
      <published>2022-09-24T00:00:00Z</published>
      <updated>2022-09-24T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>As part of my work on <a
href="https://github.com/crate/crate">CrateDB</a> I occasionally have to
debug its PostgreSQL wire protocol implementation. One tool that has
been incredibly helpful for that is <a
href="https://www.wireshark.org/docs/man-pages/tshark.html">tshark</a>,
which is part of <a href="https://www.wireshark.org/">Wireshark</a>.</p>
]]></summary>
    </entry>
    <entry>
      <title>A tree sitting in your editor</title>
      <link href="https://zignar.net/2022/09/02/a-tree-sitting-in-your-editor" />
      <id>https://zignar.net/2022/09/02/a-tree-sitting-in-your-editor</id>
      <published>2022-09-02T00:00:00Z</published>
      <updated>2022-09-02T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short introduction to the <a
href="https://tree-sitter.github.io/tree-sitter/">tree-sitter</a>
integration in <a href="http://neovim.io/">Neovim</a> based on a
use-case I had: To find content in a <code>TOML</code> file close to the
cursor position and then launch an application using this
information.</p>
]]></summary>
    </entry>
    <entry>
      <title>Can you write a CLI using Java?</title>
      <link href="https://zignar.net/2022/05/14/can-you-write-a-cli-using-java" />
      <id>https://zignar.net/2022/05/14/can-you-write-a-cli-using-java</id>
      <published>2022-05-14T00:00:00Z</published>
      <updated>2022-05-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A recent conversation got me curious about how people feel about
writing command line applications in Java.</p>
<p>I knew that Java for many isn’t the first choice when thinking of
building a CLI, but I was curious if people consider it an option at
all. I started a poll on Twitter. Only 19 people participated, but the
outcome was quite clear:</p>
<p><em>Java is a good choice to write command line applications</em></p>
<table>
<thead>
<tr>
<th>Option</th>
<th style="text-align: right;">Votes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Agree</td>
<td style="text-align: right;">5.3%</td>
</tr>
<tr>
<td>Disagree</td>
<td style="text-align: right;">68.4%</td>
</tr>
<tr>
<td>No way, are you crazy</td>
<td style="text-align: right;">26.3%</td>
</tr>
</tbody>
</table>
<p>If you asked me several years ago I’d have had a similar reaction,
but in 2022 I’m not so sure anymore.</p>
]]></summary>
    </entry>
    <entry>
      <title>Reading science papers on a Remarkable</title>
      <link href="https://zignar.net/2022/01/27/reading-science-papers-on-a-remarkable" />
      <id>https://zignar.net/2022/01/27/reading-science-papers-on-a-remarkable</id>
      <published>2022-01-27T00:00:00Z</published>
      <updated>2022-01-27T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A while ago I damaged my old tablet and got a <a
href="https://remarkable.com/">Remarkable 2</a> as replacement. One of
the use-cases for my old tablet was reading science papers. The
remarkable can read PDFs and EPUB files and with a 10.3” screen it’s one
of the larger eink devices on the market.</p>
<p>Computer science papers often use a 2-column layout, small font and
large margins. It’s possible to read, but despite the screen size it
wasn’t the most pleasant experience. It would be more convenient if we
could re-arrange and re-flow the text.</p>
<p>Turns out we can.</p>
]]></summary>
    </entry>
    <entry>
      <title>A boring statusline for Neovim</title>
      <link href="https://zignar.net/2022/01/21/a-boring-statusline-for-neovim" />
      <id>https://zignar.net/2022/01/21/a-boring-statusline-for-neovim</id>
      <published>2022-01-21T00:00:00Z</published>
      <updated>2022-01-21T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>There a dozen of statusline plugins for neovim: <a
href="https://github.com/tjdevries/express_line.nvim">express_line</a>,
<a href="https://github.com/glepnir/galaxyline.nvim">galaxyline</a>, <a
href="https://github.com/hoob3rt/lualine.nvim">lualine</a>, <a
href="https://github.com/beauwilliams/statusline.lua">statusline</a>, <a
href="https://github.com/windwp/windline.nvim">windline</a> and possibly
more. Each with different goals and feature sets. This article isn’t
about any of them, instead we look at the built-in
<code>statusline</code> option and how you can use it to create a boring
but functional status line.</p>
]]></summary>
    </entry>
    <entry>
      <title>Building a web 3.0 Twitter clone</title>
      <link href="https://zignar.net/2021/12/25/web-30-twitter" />
      <id>https://zignar.net/2021/12/25/web-30-twitter</id>
      <published>2021-12-25T00:00:00Z</published>
      <updated>2021-12-25T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I am pretty certain that the whole web 3.0 story is a mind-bogglingly
stupid idea, but I like to challenge my own views. I thought one way to
do that is to explore how I’d build a web 3.0 twitter clone. This post
is this exploration. I’ll try to suppress my bias as best I can.</p>
]]></summary>
    </entry>
    <entry>
      <title>Help people help you and put in some effort</title>
      <link href="https://zignar.net/2021/12/03/help-people-help-you-and-put-in-some-effort" />
      <id>https://zignar.net/2021/12/03/help-people-help-you-and-put-in-some-effort</id>
      <published>2021-12-03T00:00:00Z</published>
      <updated>2021-12-03T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This article is for you if you either:</p>
<ul>
<li>Created an issue or bug report that boils down to “<em>XY</em>
doesn’t work. Help me”</li>
<li>Entered a chat room and wrote “<em>XY</em> doesn’t work. Help
me”</li>
<li>Trying to get help but nobody is answering</li>
</ul>
]]></summary>
    </entry>
    <entry>
      <title>Why Haskell became my favorite scripting language</title>
      <link href="https://zignar.net/2021/07/09/why-haskell-became-my-favorite-scripting-language" />
      <id>https://zignar.net/2021/07/09/why-haskell-became-my-favorite-scripting-language</id>
      <published>2021-07-09T00:00:00Z</published>
      <updated>2021-07-09T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I started learning Haskell a couple of years ago. My usual reason to
learn a programming language is because I have a concrete use-case - a
project I want to contribute to. With Haskell it was different. My
primary motivation wasn’t a concrete use-case, but instead I thought
studying the language would be worth it for the sake of learning. It
does things different than other mainstream languages and I wanted to
become familiar with concepts I hadn’t seen before.</p>
<p>Writing a couple of iterations of “Hello World” applications wasn’t
going to get me far. Utilizing it in a project at work wasn’t an option
- instead I started using it for my ad-hoc and utility scripts. Before,
Python was my go-to language for such things, but Haskell ended up
replacing it. In this article I will show why.</p>
]]></summary>
    </entry>
    <entry>
      <title>The Circuit Breaker mechanism in CrateDB</title>
      <link href="https://zignar.net/2021/06/17/the-circuit-breaker-mechanism-in-cratedb" />
      <id>https://zignar.net/2021/06/17/the-circuit-breaker-mechanism-in-cratedb</id>
      <published>2021-06-17T00:00:00Z</published>
      <updated>2021-06-17T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this article we’ll take a look at the circuit breaker mechanism in
CrateDB. CrateDB uses circuit breakers to prevent a node from running
out of memory or stalling due to high garbage collection load.</p>
]]></summary>
    </entry>
    <entry>
      <title>Group By query execution in CrateDB</title>
      <link href="https://zignar.net/2021/06/04/group-by-query-execution-in-cratedb" />
      <id>https://zignar.net/2021/06/04/group-by-query-execution-in-cratedb</id>
      <published>2021-06-04T00:00:00Z</published>
      <updated>2021-06-04T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this post we’ll look at how CrateDB distributes GROUP BY queries.
This is the fourth post in a series about CrateDB internals.</p>
<p>I assume that you’ve read the <a
href="/2021/05/15/how-cratedb-plans-and-executes-queries">first</a> and
<a
href="/2021/05/20/distributed-select-statement-execution-in-cratedb">second</a>
post of the series. You may also be interested in the <a
href="/2021/05/28/query-then-fetch-execution-in-cratedb">third</a> post,
but it is not necessary to read it to follow this article.</p>
]]></summary>
    </entry>
    <entry>
      <title>Query Then Fetch execution in CrateDB</title>
      <link href="https://zignar.net/2021/05/28/query-then-fetch-execution-in-cratedb" />
      <id>https://zignar.net/2021/05/28/query-then-fetch-execution-in-cratedb</id>
      <published>2021-05-28T00:00:00Z</published>
      <updated>2021-05-28T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is the third post in a series about CrateDB internals. This time
I’ll introduce the <em>Query Then Fetch</em> execution strategy. Similar
to the previous posts, this focuses on the distribution aspect.</p>
<p>Make sure to read the <a
href="/2021/05/15/how-cratedb-plans-and-executes-queries">first</a> and
<a
href="/2021/05/20/distributed-select-statement-execution-in-cratedb">second</a>
post of the series.</p>
]]></summary>
    </entry>
    <entry>
      <title>Distributed SELECT statement execution in CrateDB</title>
      <link href="https://zignar.net/2021/05/20/distributed-select-statement-execution-in-cratedb" />
      <id>https://zignar.net/2021/05/20/distributed-select-statement-execution-in-cratedb</id>
      <published>2021-05-20T00:00:00Z</published>
      <updated>2021-05-20T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is the second post of a series about CrateDB internals. In the
<a href="/2021/05/15/how-cratedb-plans-and-executes-queries">first
post</a> I introduced relational algebra, the optimizer and outlined how
the execution works on a very high level. In this post I’ll explore the
execution of a simple <code>SELECT</code> statement in more detail. This
post focuses on the distribution aspect of the query execution.</p>
]]></summary>
    </entry>
    <entry>
      <title>How CrateDB plans and executes queries</title>
      <link href="https://zignar.net/2021/05/15/how-cratedb-plans-and-executes-queries" />
      <id>https://zignar.net/2021/05/15/how-cratedb-plans-and-executes-queries</id>
      <published>2021-05-15T00:00:00Z</published>
      <updated>2021-05-15T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This post is the first of a series that explains how CrateDB executes
queries. This first post focuses on the optimizer, logical plan and
execution plan.</p>
]]></summary>
    </entry>
    <entry>
      <title>Neovim completion plugin building blocks</title>
      <link href="https://zignar.net/2021/05/14/neovim-completion-pluign-building-blocks" />
      <id>https://zignar.net/2021/05/14/neovim-completion-pluign-building-blocks</id>
      <published>2021-05-14T00:00:00Z</published>
      <updated>2021-05-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this post I’ll show you the basic building blocks of a completion
plugin for Neovim.</p>
]]></summary>
    </entry>
    <entry>
      <title>Avoid shallow functions</title>
      <link href="https://zignar.net/2021/05/14/avoid-shallow-functions" />
      <id>https://zignar.net/2021/05/14/avoid-shallow-functions</id>
      <published>2021-05-14T00:00:00Z</published>
      <updated>2021-05-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Over the last couple of years I developed an intuition that shallow
functions can be problematic and here I’d like to share some thoughts on
why.</p>
]]></summary>
    </entry>
    <entry>
      <title>Are you asking too many questions, or not enough?</title>
      <link href="https://zignar.net/2021/04/15/are-you-asking-too-many-questions-or-not-enough" />
      <id>https://zignar.net/2021/04/15/are-you-asking-too-many-questions-or-not-enough</id>
      <published>2021-04-15T00:00:00Z</published>
      <updated>2021-04-15T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Two scenarios that may sound familiar:</p>
<ul>
<li><p>You’re in an office space and there is this one person who always
asks questions that they could answer on their own by spending two
minutes using <del>Google</del> DuckDuckGo. He feels super productive
because he’s getting answers quickly, but the senior who has to answer
starts getting annoyed by all the micro interruptions. It makes it hard
for her to focus.</p></li>
<li><p>A new person joins a team, and they hardly ask any questions.
Instead, they spend hours trying to figure out everything on their
own.</p></li>
</ul>
]]></summary>
    </entry>
    <entry>
      <title>Triggering Jenkins jobs from the command line</title>
      <link href="https://zignar.net/2021/02/25/triggering-jenkins-jobs-from-the-command-line" />
      <id>https://zignar.net/2021/02/25/triggering-jenkins-jobs-from-the-command-line</id>
      <published>2021-02-25T00:00:00Z</published>
      <updated>2021-02-25T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>It occurred to me that many people do not know that it is possible to
trigger <a href="https://www.jenkins.io/">Jenkins</a> jobs from the
command line. But it is possible and all you need is a SSH client. Here
is a short introduction on how to get it working.</p>
]]></summary>
    </entry>
    <entry>
      <title>Arguing about taste</title>
      <link href="https://zignar.net/2021/01/22/arguing-about-taste" />
      <id>https://zignar.net/2021/01/22/arguing-about-taste</id>
      <published>2021-01-22T00:00:00Z</published>
      <updated>2021-01-22T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Yellow is the best color.</p>
]]></summary>
    </entry>
    <entry>
      <title>Elastic moving to SSPL and making money with open source</title>
      <link href="https://zignar.net/2021/01/16/elastic-moving-to-sspl-and-making-money-with-open-source" />
      <id>https://zignar.net/2021/01/16/elastic-moving-to-sspl-and-making-money-with-open-source</id>
      <published>2021-01-16T00:00:00Z</published>
      <updated>2021-01-16T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A couple of days ago Elastic <a
href="https://www.elastic.co/blog/licensing-change">announced</a> that
they’re moving their Apache 2.0 licensed code in Elasticsearch and
Kibana to be dual licensed under the <a
href="https://www.mongodb.com/licensing/server-side-public-license">Server
Side Public License</a> (SSPL) and the Elastic License.</p>
]]></summary>
    </entry>
    <entry>
      <title>Working on the right task and managing energy levels</title>
      <link href="https://zignar.net/2021/01/01/working-on-the-right-task-and-managing-energy-levels" />
      <id>https://zignar.net/2021/01/01/working-on-the-right-task-and-managing-energy-levels</id>
      <published>2021-01-01T00:00:00Z</published>
      <updated>2021-01-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Over the last couple of years I’ve often heard that somebody
shouldn’t spend time doing X, but rather focus on doing Y. Here I
explore three reasons that may explain why people work on the “wrong”
tasks.</p>
]]></summary>
    </entry>
    <entry>
      <title>Adding the pg_catalog.pg_am system table to CrateDB</title>
      <link href="https://zignar.net/2020/12/09/adding-the-pg-catalog-pg-am-table-to-cratedb" />
      <id>https://zignar.net/2020/12/09/adding-the-pg-catalog-pg-am-table-to-cratedb</id>
      <published>2020-12-09T00:00:00Z</published>
      <updated>2020-12-09T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this article I’ll show you how I added the
<code>pg_catalog.pg_am</code> system table to CrateDB.</p>
]]></summary>
    </entry>
    <entry>
      <title>Why you should keep a clean git history</title>
      <link href="https://zignar.net/2020/11/14/why-you-should-keep-a-clean-git-history" />
      <id>https://zignar.net/2020/11/14/why-you-should-keep-a-clean-git-history</id>
      <published>2020-11-14T00:00:00Z</published>
      <updated>2020-11-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>There are still many software projects that don’t care about keeping
a clean git history. I think that is a pity. Here I show you a couple of
reasons explaining why it is beneficial to keep a clean git history.</p>
]]></summary>
    </entry>
    <entry>
      <title>Neovim under the hood - Understanding the language server client</title>
      <link href="https://zignar.net/2020/10/27/neovim-under-the-hood-understanding-the-language-server-client" />
      <id>https://zignar.net/2020/10/27/neovim-under-the-hood-understanding-the-language-server-client</id>
      <published>2020-10-27T00:00:00Z</published>
      <updated>2020-10-27T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short introduction to the language server-client
architecture in Neovim and how to customize the diagnostics display.</p>
]]></summary>
    </entry>
    <entry>
      <title>Setup Neovim for Java Development Part 2</title>
      <link href="https://zignar.net/2020/10/17/setup-Neovim-for-java-development-2" />
      <id>https://zignar.net/2020/10/17/setup-Neovim-for-java-development-2</id>
      <published>2020-10-17T00:00:00Z</published>
      <updated>2020-10-17T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is an updated version of <a
href="https://zignar.net/2019/11/21/setup-neovim-for-java-development/">an
older article</a> about setting up Neovim for Java development.</p>
]]></summary>
    </entry>
    <entry>
      <title>Generating Data Sets Using mkjson</title>
      <link href="https://zignar.net/2020/05/01/generating-data-sets-using-mkjson" />
      <id>https://zignar.net/2020/05/01/generating-data-sets-using-mkjson</id>
      <published>2020-05-01T00:00:00Z</published>
      <updated>2020-05-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>As a developer working on a database, I often need access to a data
set to test various features. Initially, I created <a
href="https://codeberg.org/mfussenegger/cr8#insert-fake-data">cr8
insert-fake-data</a> to solve this problem.
<code>cr8 insert-fake-data</code> reads the schema of a table and then
utilizes the <a href="https://github.com/joke2k/faker">faker</a> library
to generate random records that match the table’s schema and inserts
them.</p>
<p><a href="https://codeberg.org/mfussenegger/cr8#insert-fake-data">cr8
insert-fake-data</a> is easy to use and often accomplishes exactly what
I need. However, in some cases, it is not as flexible as I need it to
be, which led me to create <a
href="https://codeberg.org/mfussenegger/mkjson">mkjson</a>, another tool
to generate random records.</p>
]]></summary>
    </entry>
    <entry>
      <title>From synchronous planning to Hammock Driven Development</title>
      <link href="https://zignar.net/2020/03/22/from-synchronous-planning-to-hammock-driven-development" />
      <id>https://zignar.net/2020/03/22/from-synchronous-planning-to-hammock-driven-development</id>
      <published>2020-03-22T00:00:00Z</published>
      <updated>2020-03-22T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I was first introduced to Hammock Driven Development several years
ago, watching <a href="https://www.youtube.com/watch?v=f84n5oFoZBc">Rich
Hickey’s talk</a>. The idea stuck with me ever since.</p>
]]></summary>
    </entry>
    <entry>
      <title>Install scripts: A maybe not so good idea</title>
      <link href="https://zignar.net/2020/03/10/install-scripts-a-not-so-good-idea" />
      <id>https://zignar.net/2020/03/10/install-scripts-a-not-so-good-idea</id>
      <published>2020-03-10T00:00:00Z</published>
      <updated>2020-03-10T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Many software projects offer a script to install the application with
a single command. For CrateDB we have one as well and I think it was a
mistake to create one.</p>
]]></summary>
    </entry>
    <entry>
      <title>Building Features Nobody Asked For</title>
      <link href="https://zignar.net/2020/02/17/building-features-nobody-asked-for" />
      <id>https://zignar.net/2020/02/17/building-features-nobody-asked-for</id>
      <published>2020-02-17T00:00:00Z</published>
      <updated>2020-02-17T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Over the last couple of years, several acquaintances approached me
for help with an issue they had with their phone. Each time the phone
ran some kind of customized Android. Sometimes it was heavily modified.
Compared to stock Android the modifications made the user experience
worse. That left me puzzled. Why do companies put so much effort into
features that end up deteriorating the product?</p>
<p>They don’t do it intentionally - at least I’d hope - but why does
that happen? I think I have an answer: They become too disconnected from
their users.</p>
]]></summary>
    </entry>
    <entry>
      <title>Asynchronous Planning Poker</title>
      <link href="https://zignar.net/2020/02/01/asynchronous-planning-poker" />
      <id>https://zignar.net/2020/02/01/asynchronous-planning-poker</id>
      <published>2020-02-01T00:00:00Z</published>
      <updated>2020-02-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>For a while now we’ve experimented with asynchronous planning poker.
Here I want to share how it works and why we started using it instead of
traditional synchronous planning poker.</p>
]]></summary>
    </entry>
    <entry>
      <title>Asynchronous Communication And The Curse Of Knowledge</title>
      <link href="https://zignar.net/2020/01/25/asynchronous-communication-and-the-curse-of-knowledge" />
      <id>https://zignar.net/2020/01/25/asynchronous-communication-and-the-curse-of-knowledge</id>
      <published>2020-01-25T00:00:00Z</published>
      <updated>2020-01-25T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Curse_of_knowledge">The curse
of knowledge</a> is a cognitive bias that occurs when an individual
unknowingly assumes that the others have the background to
understand.</p>
]]></summary>
    </entry>
    <entry>
      <title>Setup Neovim for Java development</title>
      <link href="https://zignar.net/2019/11/21/setup-neovim-for-java-development" />
      <id>https://zignar.net/2019/11/21/setup-neovim-for-java-development</id>
      <published>2019-11-21T00:00:00Z</published>
      <updated>2019-11-21T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>A writeup of how I’ve setup Neovim for Java development</p>
<p>(There is a <a
href="https://zignar.net/2020/10/17/setup-neovim-for-java-development-2/">newer
version of this article available</a>)</p>
]]></summary>
    </entry>
    <entry>
      <title>Running Steamlink on Arch Linux ARM</title>
      <link href="https://zignar.net/2019/11/10/steamlink-on-archlinuxarm" />
      <id>https://zignar.net/2019/11/10/steamlink-on-archlinuxarm</id>
      <published>2019-11-10T00:00:00Z</published>
      <updated>2019-11-10T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Here is a short guide how to install steamlink on a Raspberry PI
running Arch Linux ARM.</p>
]]></summary>
    </entry>
    <entry>
      <title>Are sprint commitments necessary?</title>
      <link href="https://zignar.net/2019/02/09/are-sprint-commitments-necessary" />
      <id>https://zignar.net/2019/02/09/are-sprint-commitments-necessary</id>
      <published>2019-02-09T00:00:00Z</published>
      <updated>2019-02-09T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I’ve had a draft called “Is scrum the best we can do” lying around
for months and the chance to finish it is tiny. So I decided to extract
parts of it: Some thoughts on whether sprint commitments are beneficial
or not.</p>
<p>TL;DR: Maybe, it depends.</p>
]]></summary>
    </entry>
    <entry>
      <title>Performance Theory 101 for insert throughput scaling with CrateDB</title>
      <link href="https://zignar.net/2019/01/28/insert-throughput-scaling" />
      <id>https://zignar.net/2019/01/28/insert-throughput-scaling</id>
      <published>2019-01-28T00:00:00Z</published>
      <updated>2019-01-28T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>This is a short introduction on how to apply a bit of performance
theory in the context of tuning insert throughput performance in
CrateDB.</p>
]]></summary>
    </entry>
    <entry>
      <title>Premature optimization isn’t the root of all evil</title>
      <link href="https://zignar.net/2016/04/07/premature-optimization-isnt-the-root-of-all-evil" />
      <id>https://zignar.net/2016/04/07/premature-optimization-isnt-the-root-of-all-evil</id>
      <published>2016-04-07T00:00:00Z</published>
      <updated>2016-04-07T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Ask a question regarding the performance characteristic of some piece
of code on the Internet and you’ll end up reading an answer along the
lines of “premature optimization is the root of all evil”.</p>
<p>I’m starting to get sick of reading those answers. Optimizations
aren’t evil.</p>
]]></summary>
    </entry>
    <entry>
      <title>(Abusing) Elasticsearch as a Framework</title>
      <link href="https://zignar.net/2016/03/18/abusing-elasticsearch-as-a-framework" />
      <id>https://zignar.net/2016/03/18/abusing-elasticsearch-as-a-framework</id>
      <published>2016-03-18T00:00:00Z</published>
      <updated>2016-03-18T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Or how Crate uses Elasticsearch.</p>
<p>Most people who know Elasticsearch think of it as a search engine,
and they’re probably correct. But we at <a
href="https://crate.io/">Crate</a> think about it a bit differently and
use it as a framework.</p>
<p>In this post I’ll try to explain how that works.</p>
]]></summary>
    </entry>
    <entry>
      <title>Home Audio Using HifiBerry And Raspberry Pi</title>
      <link href="https://zignar.net/2016/03/01/home-audio-hifi-berry-and-raspberry-pi" />
      <id>https://zignar.net/2016/03/01/home-audio-hifi-berry-and-raspberry-pi</id>
      <published>2016-03-01T00:00:00Z</published>
      <updated>2016-03-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this post I’ll describe how to set up the audio system that has
been doing its work happily in my living room for about a year now.</p>
]]></summary>
    </entry>
    <entry>
      <title>IPython %magic</title>
      <link href="https://zignar.net/2016/01/16/ipython-magic" />
      <id>https://zignar.net/2016/01/16/ipython-magic</id>
      <published>2016-01-16T00:00:00Z</published>
      <updated>2016-01-16T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p><a href="http://ipython.org/">IPython</a> is a more powerful
interactive shell for python.</p>
<p>In this post I’ll explore some of my favorite IPython features.</p>
]]></summary>
    </entry>
    <entry>
      <title>Sniffing HTTPS traffic of a virtualbox guest VM using mitmproxy</title>
      <link href="https://zignar.net/2015/12/31/sniffing-vbox-traffic-mitmproxy" />
      <id>https://zignar.net/2015/12/31/sniffing-vbox-traffic-mitmproxy</id>
      <published>2015-12-31T00:00:00Z</published>
      <updated>2015-12-31T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this article I’ll show you how HTTPS traffic from a <a
href="https://www.virtualbox.org/">virtualbox</a> guest vm can be routed
through <a href="http://mitmproxy.org/">mitmproxy</a> in order to sniff
HTTPS traffic.</p>
<p>This might be useful, for example, if you wanted to figure out how a
JSON API works that you know an application that you’ve installed
uses.</p>
]]></summary>
    </entry>
    <entry>
      <title>Building SQL Auto Completion - Funday at CrateIO</title>
      <link href="https://zignar.net/2014/10/07/building-an-sql-auto-completion" />
      <id>https://zignar.net/2014/10/07/building-an-sql-auto-completion</id>
      <published>2014-10-07T00:00:00Z</published>
      <updated>2014-10-07T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>At Crate we’ve recently introduced something that we call “Funday”.
It is probably similar to what Google has been doing with their “20%”
time. In this Post I will take a deep dive into the Crate core and
explain how I used that time to build an auto completion mechanism for
SQL statements. ]]></summary>
    </entry>
    <entry>
      <title>Getting started with D-Bus using Python and systemd</title>
      <link href="https://zignar.net/2014/09/08/getting-started-with-dbus-python-systemd" />
      <id>https://zignar.net/2014/09/08/getting-started-with-dbus-python-systemd</id>
      <published>2014-09-08T00:00:00Z</published>
      <updated>2014-09-08T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In this post I’ll take a look at how to get started with D-Bus using
Python and systemd. ]]></summary>
    </entry>
    <entry>
      <title>Running Crate Data on CoreOS and Docker</title>
      <link href="https://zignar.net/2014/09/02/crate-data-on-core-os" />
      <id>https://zignar.net/2014/09/02/crate-data-on-core-os</id>
      <published>2014-09-02T00:00:00Z</published>
      <updated>2014-09-02T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Recently I’ve been playing around with <a
href="https://coreos.com/">CoreOS</a> which is a fairly new Linux
distribution. Opposed to other new distributions that keep popping up
CoreOS brings some interesting new ideas and does a whole lot different
than conventional distributions.</p>
]]></summary>
    </entry>
    <entry>
      <title>Linux on a MacBook Air 2012</title>
      <link href="https://zignar.net/2012/12/20/linux-on-a-macbook-air" />
      <id>https://zignar.net/2012/12/20/linux-on-a-macbook-air</id>
      <published>2012-12-20T00:00:00Z</published>
      <updated>2012-12-20T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>It’s now almost two months since I’ve got my MacBook Air. Time to
write up a little review. ]]></summary>
    </entry>
    <entry>
      <title>Install Python, Pip and Virtualenv on Windows</title>
      <link href="https://zignar.net/2012/06/17/install-python-on-windows" />
      <id>https://zignar.net/2012/06/17/install-python-on-windows</id>
      <published>2012-06-17T00:00:00Z</published>
      <updated>2012-06-17T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Installing Python on Windows isn’t rocket science. Here are 3 easy
steps to get a complete Python environment on a Windows machine.
]]></summary>
    </entry>
    <entry>
      <title>Sending a fax using Linux, a fritzbox and VOIP</title>
      <link href="https://zignar.net/2012/04/16/capifax" />
      <id>https://zignar.net/2012/04/16/capifax</id>
      <published>2012-04-16T00:00:00Z</published>
      <updated>2012-04-16T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Sending a fax using capifax is actually pretty easy, except it isn’t.
]]></summary>
    </entry>
    <entry>
      <title>ActiveSync on Linux using z-push, nginx and an imap backend</title>
      <link href="https://zignar.net/2012/04/14/z-push" />
      <id>https://zignar.net/2012/04/14/z-push</id>
      <published>2012-04-14T00:00:00Z</published>
      <updated>2012-04-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Want to extend your private IMAP server with push email functionality
for your smartphone? Then <a
href="http://z-push.sourceforge.net/soswp/">Z-Push</a> might be exactly
what you need. ]]></summary>
    </entry>
    <entry>
      <title>Going Paperless</title>
      <link href="https://zignar.net/2012/04/08/going-paperless" />
      <id>https://zignar.net/2012/04/08/going-paperless</id>
      <published>2012-04-08T00:00:00Z</published>
      <updated>2012-04-08T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>It’s 2012 and I still keep folders full of papers. Time to change
that. ]]></summary>
    </entry>
    <entry>
      <title>Good ideas aren’t as important as you think they are</title>
      <link href="https://zignar.net/2012/03/21/good-ideas-arent-as-important-as-you-think-they-are" />
      <id>https://zignar.net/2012/03/21/good-ideas-arent-as-important-as-you-think-they-are</id>
      <published>2012-03-21T00:00:00Z</published>
      <updated>2012-03-21T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Yesterday I’ve had an interesting although short conversation with a
long time friend. One of those conversations that are usually
accompanied with a couple of beers where you talk about life, the
universe and everything. ]]></summary>
    </entry>
    <entry>
      <title>EF 4.1 - Loading related Entities on type mismatch</title>
      <link href="https://zignar.net/2012/02/20/ef-4.1-loading-related-entities-on-type-mismatch" />
      <id>https://zignar.net/2012/02/20/ef-4.1-loading-related-entities-on-type-mismatch</id>
      <published>2012-02-20T00:00:00Z</published>
      <updated>2012-02-20T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>While working with Entity Framework has improved quite a bit since
it’s first release, sometimes I still encounter some behaviors that are
rather strange. Consider the following model. A simple one-to-many
relationship. One item can be in many reports. ]]></summary>
    </entry>
    <entry>
      <title>Baancomplete 0.2</title>
      <link href="https://zignar.net/2012/02/14/baancomplete-0.2" />
      <id>https://zignar.net/2012/02/14/baancomplete-0.2</id>
      <published>2012-02-14T00:00:00Z</published>
      <updated>2012-02-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I just pushed version 0.2 to <a
href="https://github.com/mfussenegger/baancomplete">github</a> and <a
href="http://www.vim.org/scripts/script.php?script_id=3754">vim.org</a>.
]]></summary>
    </entry>
    <entry>
      <title>Our inability to make decisions</title>
      <link href="https://zignar.net/2012/01/31/our-inability-to-make-decisions" />
      <id>https://zignar.net/2012/01/31/our-inability-to-make-decisions</id>
      <published>2012-01-31T00:00:00Z</published>
      <updated>2012-01-31T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>In an <a
href="https://zignar.net/2011/12/15/too-many-choices-considered-harmful">earlier
post</a> I mentioned that we are bad at making rational decisions. Well,
I’ve found a <a
href="http://www.ted.com/talks/dan_ariely_asks_are_we_in_control_of_our_own_decisions.html">presentation</a>
from Dan Ariely that gives some more details about that. So for anyone
who got curios after reading my post. Go ahead and watch it.
]]></summary>
    </entry>
    <entry>
      <title>I use this #2</title>
      <link href="https://zignar.net/2012/01/28/i-use-this-_2" />
      <id>https://zignar.net/2012/01/28/i-use-this-_2</id>
      <published>2012-01-28T00:00:00Z</published>
      <updated>2012-01-28T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I promised that there would be another post about my windows
environment. I keep my word, so here you go. ]]></summary>
    </entry>
    <entry>
      <title>I use this #1</title>
      <link href="https://zignar.net/2012/01/14/i-use-this" />
      <id>https://zignar.net/2012/01/14/i-use-this</id>
      <published>2012-01-14T00:00:00Z</published>
      <updated>2012-01-14T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Great tools enable programmers to build great stuff. I think every
programmer should invest at least some time into his toolbox. Read on if
you’re interesting in what I use. This post is about my linux setup,
there will be another post about my windows environment. ]]></summary>
    </entry>
    <entry>
      <title>Too many choices considered harmful</title>
      <link href="https://zignar.net/2011/12/28/too-many-choices-considered-harmful" />
      <id>https://zignar.net/2011/12/28/too-many-choices-considered-harmful</id>
      <published>2011-12-28T00:00:00Z</published>
      <updated>2011-12-28T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I think it was in the book <a
href="http://www.amazon.de/Made-Stick-Survive-Others-Unstuck/dp/0812982002/ref=sr_1_1?ie=UTF8&amp;qid=1323972742&amp;sr=8-1">Made
to Stick</a> where they proposed the idea that given too many choices we
tend to make poor decisions. And “too many” can be as few as three. As a
software developer that has to constantly make tiny, little or major
decisions I tend to agree with that idea. ]]></summary>
    </entry>
    <entry>
      <title>Copy data from Mysql to Postgres Part 2</title>
      <link href="https://zignar.net/2011/11/01/copy-data-from-mysql-to-postgres-part-2" />
      <id>https://zignar.net/2011/11/01/copy-data-from-mysql-to-postgres-part-2</id>
      <published>2011-11-01T00:00:00Z</published>
      <updated>2011-11-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I showed you in <a
href="https://zignar.net/2011/10/24/copy-data-from-mysql-to-postgres-using-sqlalchemy">my
last post</a> how to move data from mysql to postgres by using
sqlalchemy. But that technique requires sqlalchemy metadata. What if you
don’t have them? ]]></summary>
    </entry>
    <entry>
      <title>Copy data from Mysql to Postgres using SqlAlchemy</title>
      <link href="https://zignar.net/2011/11/01/copy-data-from-mysql-to-postgres-using-sqlalchemy" />
      <id>https://zignar.net/2011/11/01/copy-data-from-mysql-to-postgres-using-sqlalchemy</id>
      <published>2011-11-01T00:00:00Z</published>
      <updated>2011-11-01T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>As I mentioned <a
href="https://zignar.net/2011/10/20/migrations:-xen,-wheezy,-postgres-and-python3">earlier</a>
I had somehow to move my data from Mysql to Postgres. There is a <a
href="http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL">Wiki
full of documentation</a> on how to do that. But before falling back to
a finished solution I wanted to get my hands dirty by utilizing
sqlalchemy. ]]></summary>
    </entry>
    <entry>
      <title>Chocolatey - A package manager for windows</title>
      <link href="https://zignar.net/2011/10/23/chocolatey-a-package-manager-for-windows" />
      <id>https://zignar.net/2011/10/23/chocolatey-a-package-manager-for-windows</id>
      <published>2011-10-23T00:00:00Z</published>
      <updated>2011-10-23T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>For a change I got something for windows users today. ]]></summary>
    </entry>
    <entry>
      <title>Migrations Xen, Wheezy, Postgres and Python3</title>
      <link href="https://zignar.net/2011/10/22/migrations:-xen,-wheezy,-postgres-and-python3" />
      <id>https://zignar.net/2011/10/22/migrations:-xen,-wheezy,-postgres-and-python3</id>
      <published>2011-10-22T00:00:00Z</published>
      <updated>2011-10-22T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>The last couple of days I have been busy migrating my vserver.
]]></summary>
    </entry>
    <entry>
      <title>Syntax highlighting for less</title>
      <link href="https://zignar.net/2011/09/25/syntaxhighlightingforless" />
      <id>https://zignar.net/2011/09/25/syntaxhighlightingforless</id>
      <published>2011-09-25T00:00:00Z</published>
      <updated>2011-09-25T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>Sometimes I happen to come across things that I didn’t know I need
until I see them. One of these things is the ability to have syntax
highlighting within less. The package that makes this possible is <a
href="http://www.gnu.org/software/src-highlite">src-highlite</a>. Under
Archlinux it is packaged as source-highlight. ]]></summary>
    </entry>
    <entry>
      <title>Baancomplete</title>
      <link href="https://zignar.net/2011/09/20/baancomplete" />
      <id>https://zignar.net/2011/09/20/baancomplete</id>
      <published>2011-09-20T00:00:00Z</published>
      <updated>2011-09-20T00:00:00Z</updated>
      <summary type="html"><![CDATA[<p>I just published the first version of a vim plugin that was my pet
project for the last two weeks. It adds omni-completion for the baan
scripting language. ]]></summary>
    </entry>
</feed>
