<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Roads Less Taken</title><link>https://goran.krampe.se/posts/</link><description>Recent content in Posts on Roads Less Taken</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 21 Apr 2021 00:00:00 +0000</lastBuildDate><atom:link href="https://goran.krampe.se/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Elrond and NEAR</title><link>https://goran.krampe.se/2021/04/21/elrond-and-near/</link><pubDate>Wed, 21 Apr 2021 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2021/04/21/elrond-and-near/</guid><description>&lt;p>Back in 2018 I got into crypto currencies. I ended up focusing on &lt;a href="http://nano.org" target="_blank" rel="noopener noreferrer">Nano&lt;/a>
 and built &lt;a href="https://getcanoe.io" target="_blank" rel="noopener noreferrer">Canoe&lt;/a>
, a cross platform (mobile and desktop) wallet for Nano. Nano is &lt;strong>crazy fast&lt;/strong> (one or a few seconds) and has &lt;strong>zero fees&lt;/strong>. For payments it&amp;rsquo;s superb and the architecture of Nano is clear and simple. I still have a lot of respect for Nano, but&amp;hellip; 2020 taught me one thing - smart contracts are actually not just a gimmick.&lt;/p>
&lt;p>So for me, sorry, Nano is not a project &amp;ldquo;of the future&amp;rdquo;!&lt;/p>
&lt;p>I accidentally got involved in the DeFi world in the &lt;a href="https://cvault.finance" target="_blank" rel="noopener noreferrer">CORE&lt;/a>
 project, which runs on top of Ethereum. My contribution was just making a cross Discord/Telegram chatbot, &lt;a href="https://github.com/gokr/robocore" target="_blank" rel="noopener noreferrer">RoboCORE&lt;/a>
, and writing a bit about &amp;ldquo;floor price calculations&amp;rdquo; but the whole DeFi landscape convinced me that smart contracts are &lt;strong>an essential ingredient in a modern crypto currency platform&lt;/strong>.&lt;/p>
&lt;p>Real true scalability is also mandatory, which IMHO really has to boil down to sharding, even if novel faster consensus models are damn cool like Avalance has (the Snowflake consensus protocol).&lt;/p>
&lt;p>So back to googling and reading &amp;hellip; and there are two projects that so far stand out in my book:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://elrond.com" target="_blank" rel="noopener noreferrer">Elrond&lt;/a>
&lt;/li>
&lt;li>&lt;a href="https://near.org" target="_blank" rel="noopener noreferrer">NEAR protocol&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Spry Error Handling</title><link>https://goran.krampe.se/2021/04/21/spry-error-handling/</link><pubDate>Wed, 21 Apr 2021 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2021/04/21/spry-error-handling/</guid><description>&lt;p>Work on &lt;a href="https://sprylang.se" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
 continues&amp;hellip; in small spurts. :) One thing that I have pushed ahead of me for far too long is &lt;strong>error handling&lt;/strong>. People interested in Spry have been asking about it and yes, I decided to start getting a handle on it.&lt;/p>
&lt;p>In fact, I wrote this article &lt;strong>last year&lt;/strong> but forgot to get it done and published!&lt;/p>
&lt;p>Error handling is an interesting topic, earlier it wasn&amp;rsquo;t really much controversy around it but the advent of new techniques (Optionals etc) in combination with languages making&amp;hellip; &amp;ldquo;interesting&amp;rdquo; choices (I am looking at you Go) has made this subject fairly hot. So what do we want in Spry??&lt;/p></description></item><item><title>CORE floor price musings</title><link>https://goran.krampe.se/2020/11/01/floor-price-musings/</link><pubDate>Sun, 01 Nov 2020 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2020/11/01/floor-price-musings/</guid><description>&lt;p>I have already written &lt;a href="http://goran.krampe.se/categories/core" target="_blank" rel="noopener noreferrer">three different articles&lt;/a>
 explaining how CORE floor price can be calculated. But just a day or two back the CORE team decided that using the floor price concept in communcation doesn&amp;rsquo;t work out very well. Why? Because a LOT of people just can&amp;rsquo;t seem to understand it properly and keep perpetuating wrong conclusions around it. In short - people can&amp;rsquo;t understand math :)&lt;/p>
&lt;p>A list of common misconceptions are:&lt;/p>
&lt;ul>
&lt;li>Floor price is the &amp;ldquo;correct value&amp;rdquo; of CORE and that the current price then must be too high&lt;/li>
&lt;li>Floor price is some kind of approximation and the price can actually go lower&lt;/li>
&lt;li>Floor price is a technical analysis support level&lt;/li>
&lt;li>Floor price can change if another market starts trading CORE lower&lt;/li>
&lt;li>Floor price can never ever go down in USD value&lt;/li>
&lt;li>Floor price can never ever go down in ETH value&lt;/li>
&lt;/ul>
&lt;p>And a whole bucket of other misconceptions - just pile it on! Let us start with an explanation of what floor price &lt;strong>ACTUALLY IS&lt;/strong> and then go through the above list&amp;hellip;&lt;/p></description></item><item><title>CORE floor price over more pairs</title><link>https://goran.krampe.se/2020/10/29/floor-price-revisited/</link><pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2020/10/29/floor-price-revisited/</guid><description>&lt;p>In the previous article I explained the principles behind CORE&amp;rsquo;s floor price, the lowest price that CORE can reach. It&amp;rsquo;s a novel concept and a very interesting characteristic of CORE.&lt;/p>
&lt;p>I showed the mechanisms involved and how to calculate the floor price, if we only have &lt;strong>a single&lt;/strong> &lt;a href="https://info.uniswap.org/pair/0x32ce7e48debdccbfe0cd037cc89526e4382cb81b" target="_blank" rel="noopener noreferrer">trading pair&lt;/a>
 to worry about. I have also solved the equation for two trading pairs, that equation is currently used in RoboCORE with success.&lt;/p>
&lt;p>But how to handle three pairs or more? Complexity seemed to spin out of control, but&amp;hellip; it turns out &lt;strong>there is a simple solution!&lt;/strong>&lt;/p></description></item><item><title>CORE floor price short howto</title><link>https://goran.krampe.se/2020/10/29/floor-price-short-howto/</link><pubDate>Thu, 29 Oct 2020 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2020/10/29/floor-price-short-howto/</guid><description>&lt;p>In the previous &lt;a href="http://goran.krampe.se/2020/10/29/floor-price-revisited/" target="_blank" rel="noopener noreferrer">two&lt;/a>
 &lt;a href="http://goran.krampe.se/2020/10/28/floor-price-in-core/" target="_blank" rel="noopener noreferrer">articles&lt;/a>
 I explained the principles behind CORE&amp;rsquo;s floor price, the lowest price that CORE can reach and ended it all by explaining the &amp;ldquo;q method&amp;rdquo; that works for any number of CORE pairs. For lots of people that was possibly an overdose of math, so &amp;hellip; here is the super short and &lt;strong>lacking any explanations on why&lt;/strong> description on how to calculate floor price of CORE using the &amp;ldquo;q method&amp;rdquo;.&lt;/p></description></item><item><title>Everything you wanted to know about CORE floor price but was too afraid to ask</title><link>https://goran.krampe.se/2020/10/28/floor-price-in-core/</link><pubDate>Wed, 28 Oct 2020 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2020/10/28/floor-price-in-core/</guid><description>&lt;p>The last month I have gotten involved in a fairly new crypto currency project called &lt;a href="https://twitter.com/CORE_Vault" target="_blank" rel="noopener noreferrer">CORE&lt;/a>
, or &lt;a href="https://cvault.finance" target="_blank" rel="noopener noreferrer">cvault.finance&lt;/a>
. My main contribution is &lt;a href="https://github.com/gokr/robocore" target="_blank" rel="noopener noreferrer">RoboCORE&lt;/a>
 a chat bot operating on both Discord and Telegram serving the CORE community with various calculations and notifications.&lt;/p>
&lt;p>A concept central to CORE is what is known as &amp;ldquo;the floor price&amp;rdquo; and in developing RoboCORE I had to learn how to calculate it properly. This concept is a bit hard to grasp, so this article tries to clear up the fog!&lt;/p>
&lt;p>What is a floor price? It&amp;rsquo;s simply the lowest price CORE can ever reach. It&amp;rsquo;s not a floor in fiat, like the USD, but rather a floor &lt;strong>measured in ETH&lt;/strong> (or BTC), the assets CORE is traded against. So if those drop to zero in worth, then there is nothing CORE can do about that!&lt;/p></description></item><item><title>Revisiting Spry</title><link>https://goran.krampe.se/2020/06/05/revisiting-spry/</link><pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2020/06/05/revisiting-spry/</guid><description>&lt;p>After a period of slower progress I got reignited regarding &lt;a href="https://sprylang.se" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
. So far I have written &lt;a href="http://goran.krampe.se/categories/spry/" target="_blank" rel="noopener noreferrer">a lot of articles&lt;/a>
 about Spry, and during this time things have evolved and changed.&lt;/p>
&lt;p>So I am now trying to &amp;ldquo;clean house&amp;rdquo; on where Spry stands today. This sweep through the old articles is a first step, then I will update the language manual to be 100% in sync with the implementation.&lt;/p>
&lt;p>Let&amp;rsquo;s go through the articles from the beginning!&lt;/p></description></item><item><title>Writing Arduinobot in Nim</title><link>https://goran.krampe.se/2017/10/26/writing-arduinobot-in-nim/</link><pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2017/10/26/writing-arduinobot-in-nim/</guid><description>&lt;p>In the &lt;a href="https://project.ecraft2learn.eu/" target="_blank" rel="noopener noreferrer">eCraft2Learn project&lt;/a>
 which Evothings is participating in we were looking at various ways
&lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 is an awesome programming language and this article is a &lt;strong>whirlwind-copy-paste-into-your-terminal-as-you-read-thing&lt;/strong> to show how you install Nim, write a small program, compile it and package it in a very short time.&lt;/p>
&lt;p>To spice it up, for &lt;strong>no specific reason at all&lt;/strong>, we are doing it all inside a &lt;a href="http://linuxcontainers.org" target="_blank" rel="noopener noreferrer">Linux Container&lt;/a>
 - a fast virtual environment to work in. It&amp;rsquo;s just a nice way to have a clean environment and to ensure that you as a reader see the same results as I do.&lt;/p></description></item><item><title>Nim crash course in LXC</title><link>https://goran.krampe.se/2017/10/24/nim-crash-course-inside-lxc/</link><pubDate>Tue, 24 Oct 2017 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2017/10/24/nim-crash-course-inside-lxc/</guid><description>&lt;p>&lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 is an awesome programming language and this article is a &lt;strong>whirlwind-copy-paste-into-your-terminal-as-you-read-thing&lt;/strong> to show how you install Nim, write a small program, compile it and package it in a very short time.&lt;/p>
&lt;p>To spice it up, for &lt;strong>no specific reason at all&lt;/strong>, we are doing it all inside a &lt;a href="http://linuxcontainers.org" target="_blank" rel="noopener noreferrer">Linux Container&lt;/a>
 - a fast virtual environment to work in. It&amp;rsquo;s just a nice way to have a clean environment and to ensure that you as a reader see the same results as I do.&lt;/p></description></item><item><title>Benchmarking Spry vs Squeak</title><link>https://goran.krampe.se/2016/08/26/benchmarking-spry-vs-squeak/</link><pubDate>Fri, 26 Aug 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/08/26/benchmarking-spry-vs-squeak/</guid><description>&lt;p>&lt;a href="http://sprylang.org" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
 is evolving quite nicely during my night hours. Focusing on performance is however still premature, but I do want to verify that I am not barking up the wrong tree, like &amp;hellip; in the wrong forest even. So I make trivial benchmarks from time to time, just to see and learn.&lt;/p>
&lt;p>Some background on the Spry implementation may be interesting. Spry is implemented in Nim as a &lt;strong>direct AST interpreter&lt;/strong>, it&amp;rsquo;s not a JIT, in only about 2000 lines of code. It has a &lt;strong>recursive classic &amp;ldquo;naive&amp;rdquo; design&lt;/strong> and uses a &lt;strong>spaghetti stack of activation records&lt;/strong>, all allocated on the heap relying fully on Nim&amp;rsquo;s GC to do it&amp;rsquo;s work. It also relies on Nim&amp;rsquo;s method &lt;strong>dynamic dispatch&lt;/strong> in the interpreter loop for dispatching on the different AST nodes. Blocks are true closures and control structures like &lt;code>timesRepeat:&lt;/code> are implemented as primitives, normally &lt;strong>not cheating&lt;/strong>. Suffice to say, there are LOTS of things we can do to make Spry run faster!&lt;/p>
&lt;p>The philosophy of implementation is to keep Spry very small and &amp;ldquo;shallow&amp;rdquo; which means we rely as much as possible on the shoulders of others. In this case, primarily Nim and it&amp;rsquo;s superb features, performance and standard library.&lt;/p>
&lt;p>Enough jibbering, let&amp;rsquo;s do some silly damn lies - ehrm, I mean silly tests!&lt;/p></description></item><item><title>Is Spry a Smalltalk?</title><link>https://goran.krampe.se/2016/07/19/is-spry-a-smalltalk/</link><pubDate>Tue, 19 Jul 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/07/19/is-spry-a-smalltalk/</guid><description>&lt;p>I love &lt;a href="http://world.st" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
 and I have been in love with it since approximately 1994. I have used VisualWorks, VisualAge (IBM Smalltalk), Dolphin Smalltalk, GemStone, &lt;a href="http://squeak.org" target="_blank" rel="noopener noreferrer">Squeak&lt;/a>
 and &lt;a href="http://pharo.org" target="_blank" rel="noopener noreferrer">Pharo&lt;/a>
 quite a lot, and I was very active in the Squeak community for a long period.&lt;/p>
&lt;p>But the last few years, finally, I have started to feel the &amp;ldquo;burn&amp;rdquo;&amp;hellip; as in &lt;a href="http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html#29" target="_blank" rel="noopener noreferrer">&amp;ldquo;Let&amp;rsquo;s burn our disk packs!&amp;rdquo;&lt;/a>
. And last year I started doing something about it - and the result is &lt;a href="http://sprylang.org" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
. Spry is only at version 0.break-your-hd and several key parts are still missing, but its getting interesting already.&lt;/p>
&lt;p>&lt;strong>Now&amp;hellip; is Spry a Smalltalk? And what would that even mean?&lt;/strong>&lt;/p>
&lt;p>I think the reason I am writing this article is because I am feeling a slight frustration that not more people in the Smalltalk community find Spry interesting. :)&lt;/p>
&lt;p>And sure, who am I to think Spry is anything remotely interesting&amp;hellip; but I would have loved more interest. It may of course change when Spry starts being useful&amp;hellip; or perhaps the lack of interest is because it&amp;rsquo;s not &amp;ldquo;a Smalltalk&amp;rdquo;?&lt;/p>
&lt;h2 id="smalltalk-family">
 Smalltalk family
 &lt;a class="heading-link" href="#smalltalk-family">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The Smalltalk family of languages has a fair bit of variation, for example &lt;a href="http://www.selflanguage.org" target="_blank" rel="noopener noreferrer">Self&lt;/a>
 is clearly in this family, although it doesn&amp;rsquo;t even have classes, but it maintains a similar &amp;ldquo;feel&amp;rdquo; and shares several Smalltalk &amp;ldquo;values&amp;rdquo;. There have been a lot of Smalltalks over the years, even at PARC they made different variants before releasing Smalltalk-80.&lt;/p>
&lt;p>&lt;strong>So&amp;hellip; if we look at Spry, can it be considered a member of the Smalltalk family?&lt;/strong>&lt;/p>
&lt;p>There is an &lt;a href="http://wiki.squeak.org/squeak/172" target="_blank" rel="noopener noreferrer">ANSI standard&lt;/a>
 of Smalltalk - but not many people care about it, except for some vendors perhaps. I should note however that &lt;a href="http://www.seaside.st" target="_blank" rel="noopener noreferrer">Seaside&lt;/a>
 apparently (I think) has brought around a certain focus on the ANSI standard since every Smalltalk implementation on earth wants to be able to run Seaside and Seaside tries to enforce relying on the ANSI standard (correct me if I am wrong).&lt;/p>
&lt;p>Most Smalltalk implementations share a range of characteristics, and a lot of them also follow the ANSI standard, but they can still differ on pretty major points.&lt;/p>
&lt;p>My &lt;strong>personal take&lt;/strong> on things in Smalltalk that are pretty darn important and/or unique are:&lt;/p>
&lt;ol>
&lt;li>Everything is an object including meta levels&lt;/li>
&lt;li>A solid model for object oriented programming&lt;/li>
&lt;li>The image model&lt;/li>
&lt;li>100% live system&lt;/li>
&lt;li>The browser based IDE with advanced cross referencing, workspaces and debuggers&lt;/li>
&lt;li>The keyword syntax and message cascades&lt;/li>
&lt;li>Message based execution model&lt;/li>
&lt;li>Dynamic typing and polymorphism&lt;/li>
&lt;li>Closures everywhere with lightweight syntax and non local return&lt;/li>
&lt;li>Very capable Collections and a good standard library&lt;/li>
&lt;/ol>
&lt;p>Not all Smalltalks cover all 10. For example, there are several Smalltalks without the image model and without a browser based IDE. Self and Slate and other prototypical derivatives don&amp;rsquo;t have classes. Some Smalltalks have much less evolved class libraries for sure, and some are more shallow in the &amp;ldquo;turtle department&amp;rdquo;.&lt;/p>
&lt;p>In Spry we are deviating on a range of these points, but we are also definitely &lt;strong>matching some&lt;/strong> of them!&lt;/p></description></item><item><title>Fowltalk - a new Smalltalk</title><link>https://goran.krampe.se/2016/06/19/fowltalk/</link><pubDate>Sun, 19 Jun 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/06/19/fowltalk/</guid><description>&lt;p>In my quest making &lt;a href="http://sprylang.org" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
 I also learned about other efforts in the Nim community to construct Smalltalk-like dynamic languages. The most ambitious one may be &lt;a href="https://bitbucket.org/fowlmouth/idk" target="_blank" rel="noopener noreferrer">Fowltalk&lt;/a>
 by &amp;ldquo;fowl&amp;rdquo; who typically hangs out in the #nim channel on Freenode. Fowltalk started out written in Nim but since fowl wanted to learn more C++ it&amp;rsquo;s now written in C++17.&lt;/p>
&lt;p>At the moment he is rewriting the parser and code generator parts &lt;a href="https://bitbucket.org/fowlmouth/idk/src/2623f1e366d9a77f08feceda549bf0d9b3b9a72b/bootstrap.1?fileviewer=file-view-default" target="_blank" rel="noopener noreferrer">in the language itself&lt;/a>
, following a similar bootstrapping style as &lt;a href="http://piumarta.com/software/cola/" target="_blank" rel="noopener noreferrer">Ian Piumarta&amp;rsquo;s idst&lt;/a>
. For example, here is &lt;a href="https://bitbucket.org/fowlmouth/idk/src/2623f1e366d9a77f08feceda549bf0d9b3b9a72b/bootstrap.1?fileviewer=file-view-default#bootstrap.1-483" target="_blank" rel="noopener noreferrer">the method parsing keyword messages&lt;/a>
.&lt;/p></description></item><item><title>Spry Performance</title><link>https://goran.krampe.se/2016/05/24/spry-performance/</link><pubDate>Tue, 24 May 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/05/24/spry-performance/</guid><description>&lt;p>When writing Spry I am so far mainly ignoring performance. The general execution of Spry code will be a regular interpreter (although stackless I hope) and not a JIT. But that doesn&amp;rsquo;t prevent us from playing around and learning something!&lt;/p>
&lt;p>In this article I do some silly experiments around interpreter startup time and fooling around with 40 million element arrays. As usual, I am fully aware that the languages (Pharo Smalltalk, NodeJS, Python) I compare with a) have lots of other ways to do things b) may not have been used exactly as someone else would have done it. A truck load of salt required. Now&amp;hellip; let&amp;rsquo;s go!&lt;/p>
&lt;img src="https://goran.krampe.se/spry/thetruth.jpg" alt="The" style="display:block; margin:0 auto;"></description></item><item><title>Spry vs Allen</title><link>https://goran.krampe.se/2016/05/14/spry-vs-allen/</link><pubDate>Sat, 14 May 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/05/14/spry-vs-allen/</guid><description>&lt;p>Allen Wirfs-Brock &lt;a href="http://www.wirfs-brock.com/allen/posts/754" target="_blank" rel="noopener noreferrer">wrote down a bullet list&lt;/a>
 of what he thought actually made it possible for the Alan Kay team to &lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/" target="_blank" rel="noopener noreferrer">create Smalltalk&lt;/a>
, and many other ground breaking things, at Xerox PARC in the 70s. Let&amp;rsquo;s take a look at &lt;strong>his bullets one by one&lt;/strong> and see how it applies to Spry and my puny little effort around it :)&lt;/p>
&lt;img src="https://goran.krampe.se/spry/assume.jpg" alt="Assume" style="display:block; margin:0 auto;"></description></item><item><title>Spry Modules, part II</title><link>https://goran.krampe.se/2016/05/03/spry-modules-ii/</link><pubDate>Tue, 03 May 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/05/03/spry-modules-ii/</guid><description>&lt;p>In the &lt;a href="http://goran.krampe.se/2016/04/16/spry-modules" target="_blank" rel="noopener noreferrer">last article&lt;/a>
 I outlined a simple &lt;strong>model of modules&lt;/strong> and that is kinda implemented but needs a few fixes. The next step is how to find and combine modules and this is an area where I want to push the envelope a bit. Most popular package/module systems today are quite trivial in nature. Often it&amp;rsquo;s a command line tool that queries central catalog(s) and then proceeds by downloading code in the form of source files onto disk. Then the compiler or runtime environment finds and loads the code by simply looking for files on disk. There are several parts of this that are very primitive.&lt;/p>
&lt;p>When I built &lt;a href="http://map.squeak.org" target="_blank" rel="noopener noreferrer">SqueakMap&lt;/a>
 waaay back I was already then tainted with the idea of &lt;a href="https://gemtalksystems.com" target="_blank" rel="noopener noreferrer">shared object models&lt;/a>
 and one of the primary ideas in SqueakMap was to make sure each local Smalltalk environment got a full live object model of the catalog which then could be queried, viewed and reasoned about inside the Smalltalk environment. Much more powerful than a bunch of JSON files on disk. This led to the approach of downloading the full catalog in a serialized form - and then loading it into &lt;a href="http://www.squeak.org" target="_blank" rel="noopener noreferrer">Squeak&lt;/a>
.&lt;/p>
&lt;p>With &lt;a href="http://sprylang.org" target="_blank" rel="noopener noreferrer">Spry&lt;/a>
 I want us to create a simpler meta model - at least for starters - but with an even smarter infrastructure backing it&amp;hellip;&lt;/p></description></item><item><title>Spry Modules</title><link>https://goran.krampe.se/2016/04/16/spry-modules/</link><pubDate>Sat, 16 Apr 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/04/16/spry-modules/</guid><description>&lt;p>As discussed in &lt;a href="http://goran.krampe.se/2016/04/09/spry-image-model/" target="_blank" rel="noopener noreferrer">the previous article&lt;/a>
 I want Spry to have a trivially accessible persistence mechanism enabling something similar to the &lt;strong>Smalltalk image model&lt;/strong>, but based on a database. The memory organisation in Spry is basically nested Maps. After dwelling a bit on the inevitable hard question about &lt;strong>modules and namespaces&lt;/strong> I have decided on a design that I hope will turn out simple and reasonably powerful!&lt;/p>
&lt;img src="https://goran.krampe.se/spry/modules.jpg" alt="Modules" style="float:right; margin:0 0 1em 1em;">

&lt;p>Smalltalk has a Dictionary holding all the globals forming &amp;ldquo;the roots&amp;rdquo; of the object memory. In Smalltalk this Dictionary is also itself a global variable accessible as &lt;code>Smalltalk&lt;/code>, in other words &lt;code>Smalltalk == (Smalltalk at: #Smalltalk)&lt;/code>. The primary use of &lt;code>Smalltalk&lt;/code> is to hold all classes by name, so they are all reachable as globals. Obviously &lt;code>Smalltalk&lt;/code> can also hold any kind of object (not just classes) as a global.&lt;/p>
&lt;p>Spry also has such a top level Dictionary, but in Spry we call a Dictionary a &lt;code>Map&lt;/code> to be a little bit more aligned in terminology with other languages (and it&amp;rsquo;s shorter). This top level Map is the &lt;code>root&lt;/code> Map and it is accessible via the word &lt;code>root&lt;/code>. In Spry the &lt;code>root&lt;/code> word is actually bound to a primitive function returning this &lt;code>Map&lt;/code>, so in Spry we also have &lt;code>root == (root at: 'root)&lt;/code>.&lt;/p>
&lt;p>Ok, so Spry has a &lt;code>Map&lt;/code> of globals and one way of using Spry is simply by populating &lt;code>root&lt;/code> with words bound to functions making these functions globally accessible, it&amp;rsquo;s how I have done it so far. Yeah, yeah, I know, but for smaller systems it probably works just fine!&lt;/p>
&lt;p>But&amp;hellip;&lt;/p></description></item><item><title>Spry image model</title><link>https://goran.krampe.se/2016/04/09/spry-image-model/</link><pubDate>Sat, 09 Apr 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/04/09/spry-image-model/</guid><description>&lt;p>In developing Spry - &lt;a href="https://goran.krampe.se/ni-is-now-spry" >renamed from Ni&lt;/a>
 - I am getting closer to the &lt;strong>Really Fun Stuff&lt;/strong>.&lt;/p>
&lt;p>As a Smalltalker I dream &amp;ldquo;bigger&amp;rdquo; than just managing source code as text in files&amp;hellip;&lt;/p>
&lt;p>&lt;a href="http://www.azquotes.com/quote/847274" title="Kent Beck quote">&lt;img src="http://www.azquotes.com/picture-quotes/quote-i-mean-source-code-in-files-how-quaint-how-seventies-kent-beck-84-72-74.jpg" alt="I mean, source code in files; how quaint, how seventies! - Kent Beck" />
&lt;/a>&lt;/p>
&lt;p>Smalltalk uses the &amp;ldquo;image model&amp;rdquo; in which the system is alive and running all the time, the full development environment is also live together with your application, and we are in fact modifying object structures when we develop Smalltalk programs. We can also snapshot that object memory onto disk and fire it up somewhere else. Several Lisp implementations have used a similar approach I think.&lt;/p>
&lt;p>The image model has tons of really cool benefits, I don&amp;rsquo;t have time repeating all of them, but a modern implementation of the idea should take a few things into account that was not considered in the 1970s:&lt;/p>
&lt;ul>
&lt;li>The &amp;ldquo;image&amp;rdquo; in Spry will be buildable from source&lt;/li>
&lt;li>You should be able to use Spry without the image mechanism (you can already)&lt;/li>
&lt;li>Spry code will have a readable text format and file structure&lt;/li>
&lt;li>The image model does not have to be all or nothing, it can be partial&lt;/li>
&lt;li>The image mechanism will be a module for the Spry VM, so you can skip it entirely&lt;/li>
&lt;/ul>
&lt;p>Some argue that the image model has downsides - like being an &amp;ldquo;ivory tower&amp;rdquo; incapable of interacting with the outside world. The Smalltalk environments have indeed historically suffered a bit in varying degree, but we can easily find ways around those issues while still &lt;strong>reaping the awesomeness of a fully live&lt;/strong> programming environment, especially if we give the above items proper thought &lt;strong>from the start&lt;/strong>.&lt;/p>
&lt;p>With Spry I think I have a beginning to a novel approach&amp;hellip; as well as taking the above into account.&lt;/p></description></item><item><title>Ni renamed to Spry!</title><link>https://goran.krampe.se/2016/04/08/ni-is-now-spry/</link><pubDate>Fri, 08 Apr 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/04/08/ni-is-now-spry/</guid><description>&lt;p>When I started out implementing my own language in Nim I named it &amp;ldquo;Ni&amp;rdquo; without that much thought actually. It was a pun on &amp;ldquo;smaller than Nim&amp;rdquo; (obviously one letter shorter!) and of course with a &lt;a href="https://en.wikipedia.org/wiki/Knights_who_say_Ni" target="_blank" rel="noopener noreferrer">reference to Monty Python&lt;/a>
.&lt;/p>
&lt;p>But&amp;hellip; really, &lt;strong>the name &amp;ldquo;Ni&amp;rdquo; sucks&lt;/strong>. It&amp;rsquo;s hard to say in general and since it&amp;rsquo;s often mentioned together with Nim the confusion is obvious. And it also turned out to be less than optimal to google for.&lt;/p></description></item><item><title>Nim meets Arduino</title><link>https://goran.krampe.se/2016/02/25/nim-meets-arduino/</link><pubDate>Thu, 25 Feb 2016 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2016/02/25/nim-meets-arduino/</guid><description>&lt;p>I now work as the Team Lead at &lt;a href="http://evothings.com" target="_blank" rel="noopener noreferrer">Evothings&lt;/a>
 and our &lt;strong>open source&lt;/strong> product is a Workbench for creating &lt;strong>mobile HTML5 applications focused on IoT&lt;/strong>, by editing and running them &lt;strong>live on the mobile device&lt;/strong> inside our spiced up Cordova based &amp;ldquo;Evothings Viewer&amp;rdquo;.&lt;/p>
&lt;p>I am of course partial here - but the tool is really easy to use, doesn&amp;rsquo;t force you into any specific framework or editor, enables a very quick development cycle and has tons of examples, tutorials, docs and some special IoT focused libraries like for example around BLE (Bluetooth Low Energy). You can have your code running on your phone literally within 1-2 minutes and you don&amp;rsquo;t need to install XCode or the Android tools, you can even run it just fine from your trusty Linux laptop! Just &lt;a href="http://evothings.com/download" target="_blank" rel="noopener noreferrer">go for it&lt;/a>
. Ok, enough of the sales talk&amp;hellip;&lt;/p>
&lt;p>Since we are specializing in the IoT space we have our office filled to the brink with toys&amp;hellip; eh, I mean &lt;strong>IoT devices&lt;/strong> of all kinds from all different vendors. Two IoT communication standards are particularly important in this space, and that&amp;rsquo;s &lt;strong>BLE and MQTT&lt;/strong>. I have already written three &lt;a href="http://goran.krampe.se/2015/12/14/evothings-meets-phoenix/" target="_blank" rel="noopener noreferrer">blog&lt;/a>
 &lt;a href="https://evothings.com/evothings-does-mqtt-with-bluemix/" target="_blank" rel="noopener noreferrer">posts&lt;/a>
 &lt;a href="https://evothings.com/evothings-does-mqtt-with-vernemq-or-emqtt/" target="_blank" rel="noopener noreferrer">around&lt;/a>
 MQTT using Evothings. Now I am instead focusing on BLE and particularly the &lt;strong>embedded device side of the story&lt;/strong>.&lt;/p>
&lt;img src="https://goran.krampe.se/evothings/mediatek-linkit-one.png" alt="LinkIt-ONE" style="float:left; margin:0 1em 1em 0;">

&lt;p>This led me to round up a bunch of devices at the office that are fairly technically capable and have BLE support. The one I selected was the &lt;a href="http://www.seeedstudio.com/wiki/LinkIt_ONE" target="_blank" rel="noopener noreferrer">LinkIt ONE development board&lt;/a>
 from &lt;a href="http://labs.mediatek.com" target="_blank" rel="noopener noreferrer">MediaTek&lt;/a>
 &amp;amp; &lt;a href="http://www.seeedstudio.com" target="_blank" rel="noopener noreferrer">Seeed Studio&lt;/a>
. It&amp;rsquo;s an insanely feature packed little board (GSM/GPRS, GPS, Wifi, BLE, sound output, SD card) with decent computing power (ARM7 EJ-S, 16Mb flash, 4Mb RAM) while still remaining in the &amp;ldquo;medium&amp;rdquo; embedded space I would say, still ruling out plain Linux and regular tools. I consider the &lt;a href="https://www.raspberrypi.org">Raspberri Pi&lt;/a> or &lt;a href="http://getchip.com">C.H.I.P&lt;/a> and similar machines to be in the &amp;ldquo;large&amp;rdquo; embedded space, they are real computers and you can basically use whatever you like to develop on those.&lt;/p>
&lt;p>The medium and small devices can be programmed using for example &lt;a href="https://github.com/espruino" target="_blank" rel="noopener noreferrer">Espruino&lt;/a>
 or &lt;a href="http://micropython.org" target="_blank" rel="noopener noreferrer">Micropython&lt;/a>
 (two very interesting projects) but in many cases, for more demanding applications, &lt;strong>C/C++ is still king&lt;/strong> simply because of size and performance advantages. And also the fact that hardware vendor SDKs are typically in C/C++. But &lt;strong>could there be an alternative language out there?&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>A language that is just as fast and small that easily can use all these C/C++ SDKs?&lt;/li>
&lt;li>A language with a syntax similar to Python made to be easy to write and read?&lt;/li>
&lt;li>A language with soft realtime GC and a sane advanced type system with generics?&lt;/li>
&lt;li>A language with a good standard library and friendlier than C++?&lt;/li>
&lt;li>A language with compile time hygienic AST based macros written in the language itself?&lt;/li>
&lt;li>A language offering an imperative style and not forcing OO if you don&amp;rsquo;t want to?&lt;/li>
&lt;/ul>
&lt;p>Yep! Read on to find out&amp;hellip;&lt;/p></description></item><item><title>Evothings + Phoenix = Neato</title><link>https://goran.krampe.se/2015/12/14/evothings-meets-phoenix/</link><pubDate>Mon, 14 Dec 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/12/14/evothings-meets-phoenix/</guid><description>&lt;img src="https://goran.krampe.se/evothings/evothings.png" alt="Evothings" style="float:left; margin:0 1em 1em 0;">

&lt;p>I have just started working at &lt;a href="https://evothings.com" target="_blank" rel="noopener noreferrer">Evothings&lt;/a>
!&lt;/p>
&lt;p>It&amp;rsquo;s a fun gang making slick development tools and libraries for building mobile IoT apps. Evothings is pushing the envelope on &lt;strong>really easy mobile development&lt;/strong> focused on all the &lt;strong>new nifty IoT-devices&lt;/strong> flooding us over the next few years.&lt;/p>
&lt;img src="https://goran.krampe.se/elixir/phoenix-small.png" alt="Phoenix" style="float:right; margin:0 0 1em 1em;">

&lt;p>In &lt;a href="http://goran.krampe.se/2015/10/27/elixir-booming/" target="_blank" rel="noopener noreferrer">my last article&lt;/a>
 I predicted &lt;a href="http://www.elixir-lang.org" target="_blank" rel="noopener noreferrer">Elixir&lt;/a>
 to become &lt;strong>big&lt;/strong> and now that I am learning the Evothings tools I wanted to make an Evothings example that uses &lt;a href="http://phoenixframework.org" target="_blank" rel="noopener noreferrer">Phoenix&lt;/a>
, the Elixir web server framework, as a backend, using its channels mechanism for websocket communication.&lt;/p>
&lt;p>Coinciding with the release today of &lt;a href="https://evothings.com/announcing-evothings-2-0-beta-2-released/" target="_blank" rel="noopener noreferrer">Evothings Studio 2.0 beta 2&lt;/a>
 (yay!) I will show step-by-step how to:&lt;/p>
&lt;ol>
&lt;li>Install Evothings Studio locally. It&amp;rsquo;s just unpacking a zip :)&lt;/li>
&lt;li>Make sure we can run the &amp;ldquo;BLE Scan&amp;rdquo; example app and modify it.&lt;/li>
&lt;li>Get a Phoenix server up on a Debian/Ubuntu server on the internet.&lt;/li>
&lt;li>Modify the app and server to use Phoenix channels for publish/subscribe of scan data.&lt;/li>
&lt;li>Verify it all works!&lt;/li>
&lt;/ol>
&lt;p>Since not everyone has a Linux server up on the internet &lt;strong>you can skip step 3 and just use my public server :)&lt;/strong>&lt;/p>
&lt;p>Let&amp;rsquo;s go!&lt;/p></description></item><item><title>Elixir Booming</title><link>https://goran.krampe.se/2015/10/27/elixir-booming/</link><pubDate>Tue, 27 Oct 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/10/27/elixir-booming/</guid><description>&lt;p>It seems like the &lt;em>&amp;ldquo;damp cloth of Java&amp;rdquo;&lt;/em> that has been plastered all over the programming landscape the last 20 years is finally being lifted. I admit, I do &lt;strong>dislike Java &amp;hellip;immensely&lt;/strong>. And not only on technical grounds, but even more based on what I perceive as it&amp;rsquo;s community worshipping complexity for it&amp;rsquo;s own sake. Of course IMHO.&lt;/p>
&lt;p>These days new and &lt;strong>truly interesting languages&lt;/strong> are all over the place. &lt;a href="http://rust-lang.org" target="_blank" rel="noopener noreferrer">Rust&lt;/a>
 and &lt;a href="http://go-lang.org" target="_blank" rel="noopener noreferrer">Go&lt;/a>
 are two examples with a lot of momentum, although I personally choose &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 over both.&lt;/p>
&lt;p>And &lt;a href="http://pharo.org" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
 is still my &amp;ldquo;super productive dynamically typed&amp;rdquo; language of choice, but I just learned about a language that I &lt;strong>really&lt;/strong> think is going places&amp;hellip;&lt;/p></description></item><item><title>Adding objects to Ni!</title><link>https://goran.krampe.se/2015/09/25/adding-objects-to-ni/</link><pubDate>Fri, 25 Sep 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/09/25/adding-objects-to-ni/</guid><description>&lt;p>So&amp;hellip; Ni has almost reached the point where I can see objects appearing. The following describes the design I &lt;strong>currently&lt;/strong> have in mind, read it and tell me what you think so I can scrap it and start over ;)&lt;/p>
&lt;img src="https://goran.krampe.se/ni/ni.png" alt="Ni" style="float:right; margin:0 0 1em 1em;"></description></item><item><title>Ni design decisions!</title><link>https://goran.krampe.se/2015/09/23/ni-design-decisions/</link><pubDate>Wed, 23 Sep 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/09/23/ni-design-decisions/</guid><description>&lt;p>So&amp;hellip; my little Ni language got some attention since it was first &lt;a href="https://news.ycombinator.com/item?id=10235688" target="_blank" rel="noopener noreferrer">on Hackernews&lt;/a>
, then &lt;a href="http://www.theregister.co.uk/2015/09/18/we_are_the_knights_who_code_ni/" target="_blank" rel="noopener noreferrer">TheRegister&lt;/a>
, all over Twitter and also &lt;a href="https://www.reddit.com/r/programming/comments/3lfpym/ni_a_language_influenced_by_smalltalk_written_in/" target="_blank" rel="noopener noreferrer">Reddit&lt;/a>
.&lt;/p>
&lt;p>But I think it managed to come relatively unscathed out of it, although it &lt;strong>REALLY is pre-alpha-not-even-complete-eats-your-harddrive early&lt;/strong> and you know, I really have no idea if it ever will go the distance since it takes quite a bit of work to get a language to actually be used. But I am going to stick with it.&lt;/p>
&lt;p>Anyway, I have been experimenting with &amp;ldquo;arg words&amp;rdquo; and &amp;ldquo;lookup scoping&amp;rdquo; while thinking about how to add objects, and a few other things. This article doesn&amp;rsquo;t introduce how I want to do objects, but the next one does (I split it in two). This article however covers a bunch of loose ends and my ideas on how to tackle them in Ni. And I will try to make this understandable even if you don&amp;rsquo;t know Ni. ;)&lt;/p></description></item><item><title>Guts of Ni</title><link>https://goran.krampe.se/2015/09/22/guts-of-ni/</link><pubDate>Tue, 22 Sep 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/09/22/guts-of-ni/</guid><description>&lt;p>This article describes some core parts of the current implementation of the Ni (now known as &lt;a href="https://goran.krampe.se/spry" >Spry&lt;/a>
) language. It&amp;rsquo;s not a tutorial, introduction or manual. It&amp;rsquo;s in &lt;strong>fact kinda incoherent - but so is Ni&lt;/strong> :)&lt;/p></description></item><item><title>Who says Ni?</title><link>https://goran.krampe.se/2015/09/16/who-says-ni/</link><pubDate>Wed, 16 Sep 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/09/16/who-says-ni/</guid><description>&lt;p>Ni is my &lt;a href="https://goran.krampe.se/spry" >own little language&lt;/a>
 heavily influenced by &lt;a href="http://www.world.st" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
 but also other sources like Rebol, Forth, Lisp, Self and Nim. Ni is a bit strange, but it&amp;rsquo;s not academic and really meant to become something useful.&lt;/p>
&lt;p>So put on your helmet and let me take you to the shrubbery&amp;hellip;&lt;/p></description></item><item><title>Nim and super</title><link>https://goran.krampe.se/2015/05/06/nim-and-super/</link><pubDate>Wed, 06 May 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/05/06/nim-and-super/</guid><description>&lt;p>As I described in &lt;a href="https://goran.krampe.se/2014/10/29/nim-and-oo" >the&lt;/a>
 &lt;a href="https://goran.krampe.se/2014/10/31/nim-and-oo-part-ii" >earlier&lt;/a>
 &lt;a href="https://goran.krampe.se/2014/10/31/nim-and-oo-part-iii" >posts&lt;/a>
 Nim didn&amp;rsquo;t support &amp;ldquo;super calls&amp;rdquo; when using &lt;strong>methods&lt;/strong> instead of statically bound &lt;strong>procs and generics&lt;/strong>. My article caused a little bit of discussion around this on IRC and Andreas decided to implement the mechanism he already had planned - but had not fully decided a good name for.&lt;/p>
&lt;p>The other day Nim 0.11.2 &lt;a href="http://nim-lang.org/news.html#Z2015-05-04-version-0-11-2-released" target="_blank" rel="noopener noreferrer">was released&lt;/a>
 and it includes this mechanism. Let&amp;rsquo;s have a look how it works in my sample code&amp;hellip;&lt;/p></description></item><item><title>Nim</title><link>https://goran.krampe.se/2015/03/26/nim-voodoo/</link><pubDate>Thu, 26 Mar 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/03/26/nim-voodoo/</guid><description>&lt;p>Having been a die hard Smalltalker since 1994 I have finally found a new language and community that I am investing myself in. All the Ruby, Python, various JVM languages, C# and Mono etc - none has managed to capture my interest. Ruby and Python always felt like pale shadows of Smalltalk and I really don&amp;rsquo;t want to be tied to the Java eco system, no matter what. And so on and on, lots of languages looking interesting but not being able to withstand my deeper look. As a Smalltalker I probably have acquired a particular taste.&lt;/p>
&lt;p>Since a few months I am however deeply into Nim. I have written a slew of articles about Nim, and at our company we have decided to bet hard on it. So far I have written a little utility called blimp in Nim, and I have helped creating Urhonimo - the Nim wrapper of the Urho3D game engine.&lt;/p>
&lt;p>With a deeper understanding of Nim, although I am far from good at it, what is it that makes me recommend you to try it?&lt;/p></description></item><item><title>Nim visits GTUG Stockholm</title><link>https://goran.krampe.se/2015/03/26/nim-visits-gtug/</link><pubDate>Thu, 26 Mar 2015 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2015/03/26/nim-visits-gtug/</guid><description>&lt;p>Yesterday I had the pleasure of presenting the programming language &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 at the &lt;a href="https://sites.google.com/site/stockholmgtug/" target="_blank" rel="noopener noreferrer">Stockholm GTUG&lt;/a>
.
This evening we were around 50 people, I would guess mainly developers, listening to three presentations:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://rust-lang.org" target="_blank" rel="noopener noreferrer">Rust&lt;/a>
, by &lt;a href="https://www.linkedin.com/in/johanburell" target="_blank" rel="noopener noreferrer">Johan Burell, EVRY&lt;/a>
&lt;/li>
&lt;li>&lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
, by Göran Krampe, 3DICC&lt;/li>
&lt;li>&lt;a href="http://golang,org" target="_blank" rel="noopener noreferrer">Go&lt;/a>
, by &lt;a href="https://www.linkedin.com/in/marcusolsson1" target="_blank" rel="noopener noreferrer">Marcus Olsson, Citerus&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>Now, that&amp;rsquo;s a pretty fitting trio of languages! :) This article is a little followup because I failed to mention so much stuff&amp;hellip;&lt;/p></description></item><item><title>Nim seq</title><link>https://goran.krampe.se/2014/12/03/nim-seq/</link><pubDate>Wed, 03 Dec 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/12/03/nim-seq/</guid><description>&lt;p>One of the most important aspects in a language is how powerful and easy it is to use its collection/container types. At least that is my feeling coming from Smalltalk where the Collection classes and their rather rich protocols are used extensively and also cover String and Array and much more. If you peek into the current leading open source Smalltalk - &lt;a href="http://pharo.org" target="_blank" rel="noopener noreferrer">Pharo&lt;/a>
 - you can see &lt;code>Collection allSubclasses size&lt;/code> evaluate to &lt;strong>78&lt;/strong>. Of course, lots of those are special subclasses and not for general use, but fact remains that a strong language &lt;strong>needs a strong library of good collections&lt;/strong>.&lt;/p>
&lt;p>In Smalltalk I can for example run this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-smalltalk" data-lang="smalltalk">&lt;span class="line">&lt;span class="cl">&lt;span class="ss">#(&lt;/span>&lt;span class="m">1&lt;/span> &lt;span class="m">2&lt;/span> &lt;span class="m">3&lt;/span> &lt;span class="m">4&lt;/span> &lt;span class="m">5&lt;/span>&lt;span class="ss">)&lt;/span> &lt;span class="nf">select:&lt;/span> [&lt;span class="o">:&lt;/span>&lt;span class="nv">x&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nv">x&lt;/span> &lt;span class="nf">isOdd&lt;/span> ] &lt;span class="nf">thenCollect:&lt;/span> [&lt;span class="o">:&lt;/span>&lt;span class="nv">x&lt;/span> &lt;span class="o">|&lt;/span> &lt;span class="nv">x&lt;/span> &lt;span class="nf">*&lt;/span> &lt;span class="m">3&lt;/span> ]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This is actually a single method call taking two closures, one to perform a &amp;ldquo;filtering&amp;rdquo;, and one to perform a &amp;ldquo;map&amp;rdquo;. This is not a standard message in &amp;ldquo;good old&amp;rdquo; Smaltalk-80, but it has eventually been added since the usage pattern is so common. To me personally a &lt;strong>modern language needs similar power&lt;/strong> or I would go nuts. :)&lt;/p></description></item><item><title>Nim and OO, Part IV</title><link>https://goran.krampe.se/2014/11/30/nim-and-oo-part-iv/</link><pubDate>Sun, 30 Nov 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/11/30/nim-and-oo-part-iv/</guid><description>&lt;p>As I described in &lt;a href="https://goran.krampe.se/2014/10/29/nim-and-oo" >the&lt;/a>
 &lt;a href="https://goran.krampe.se/2014/10/31/nim-and-oo-part-ii" >earlier&lt;/a>
 &lt;a href="https://goran.krampe.se/2014/10/31/nim-and-oo-part-iii" >posts&lt;/a>
 Nim didn&amp;rsquo;t support &amp;ldquo;super calls&amp;rdquo; when using &lt;strong>methods&lt;/strong> instead of statically bound &lt;strong>procs and generics&lt;/strong>. My article caused a little bit of discussion around this on IRC and Andreas decided to implement the mechanism he already had planned - but had not fully decided a good name for.&lt;/p>
&lt;p>The other day this mechanism &lt;a href="https://github.com/Araq/Nimrod/commit/105a0616a9da7c9c85adfa488a1db42eb17daafb" target="_blank" rel="noopener noreferrer">entered the devel branch&lt;/a>
 which means it will be official in the next release of Nim, which I suspect will be out before the end of 2014. It should be noted that devel is mainly undergoing bug fixing, so unless you are paranoid it&amp;rsquo;s pretty usable. Now&amp;hellip; of course I had to try out super calls in my sample code&amp;hellip;&lt;/p></description></item><item><title>Squeak to Nim, come in Nim...</title><link>https://goran.krampe.se/2014/11/03/squeak-to-nim/</link><pubDate>Mon, 03 Nov 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/11/03/squeak-to-nim/</guid><description>&lt;p>In my exploration of &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 the turn has come to see how we can use Nim together with &lt;a href="http://squeak.org" target="_blank" rel="noopener noreferrer">Squeak&lt;/a>
.&lt;/p>
&lt;p>Squeak (and Pharo) has two basic mechanisms of interfacing with the C world:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="http://stephane.ducasse.free.fr/FreeBooks/CollectiveNBlueBook/greenberg.pdf" target="_blank" rel="noopener noreferrer">Squeak VM plugins&lt;/a>
. That pdf is old, but still fairly accurate I guess.&lt;/li>
&lt;li>&lt;a href="http://wiki.squeak.org/squeak/1414" target="_blank" rel="noopener noreferrer">Squeak FFI&lt;/a>
, Foreign Function Interface.&lt;/li>
&lt;/ul>
&lt;p>The VM plugins are basically a controlled way to introduce new &amp;ldquo;named&amp;rdquo; primitives in Smalltalk that can be invoked from Smalltalk. A plugin can be built either linked into the VM binary (statically) or as a dynamically loaded library (dll, so, dylib etc). When &amp;ldquo;all else fails&amp;rdquo; a plugin is the way to go, but they are a bit awkward to work with.&lt;/p>
&lt;p>Then we have the FFI which is a generic way to dynamically call dynamically loaded libraries. In other words, no compilation step needed - just type the correct Smalltalk line and the library will load and the calls work. Now&amp;hellip; sure, the FFI mechanism is a bit slower, since it needs to look at arguments and make the proper type conversions for the call. But the FFI is heavily used in the commercial Terf system, in fact, all the OpenGL calls are done through it. So its quite proven, and not that slow.&lt;/p>
&lt;p>&lt;strong>NOTE:&lt;/strong> There are in fact several FFIs today, the old one, the one called Alien and Pharo is brewing a new one called UFFI.&lt;/p>
&lt;p>Let&amp;rsquo;s see if we can use the good old FFI with Nim.&lt;/p></description></item><item><title>Nim and OO, Part II</title><link>https://goran.krampe.se/2014/10/31/nim-and-oo-part-ii/</link><pubDate>Fri, 31 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/31/nim-and-oo-part-ii/</guid><description>&lt;p>In the &lt;a href="https://goran.krampe.se/2014/10/29/nim-and-oo" >previous article&lt;/a>
 when I explored OO mechanisms in &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 I felt I dropped the ball a bit in my Fruit example. This is a followup.&lt;/p>
&lt;p>In that article we first implemented some Fruit &amp;ldquo;classes&amp;rdquo; mixing methods and procs. Then I presented a cleaned up version using methods only, and a teeny template in order to reuse a base method. This template was needed since Nim currently doesn&amp;rsquo;t have a &amp;ldquo;call-next-method-matching&amp;rdquo; for multimethods like Dylan or CLOS have. This is being discussed and I think all agree that there needs to be &lt;strong>some&lt;/strong> mechanism so that you can call a &amp;ldquo;next lesser match&amp;rdquo; of all matching multimethods.&lt;/p>
&lt;p>But I also wrote that the example &lt;strong>can be written perfectly well using generics and procs only&lt;/strong>, thus ensuring static binding and maximum speed. But the &amp;ldquo;super call&amp;rdquo; problem also existed for procs, and the template hack was just a hack. After more experimentation I now &lt;strong>think I found the proper Nim way&lt;/strong> to do this so let&amp;rsquo;s take a look&amp;hellip;&lt;/p></description></item><item><title>Nim and OO, Part III</title><link>https://goran.krampe.se/2014/10/31/nim-and-oo-part-iii/</link><pubDate>Fri, 31 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/31/nim-and-oo-part-iii/</guid><description>&lt;p>So previously in &lt;a href="https://goran.krampe.se/2014/10/31/nim-and-oo-part-ii" >Nim and OO Part II&lt;/a>
 we saw how we could solve the &amp;ldquo;super call&amp;rdquo; issue using only procs and generics in &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
. This means that all code is statically bound.&lt;/p>
&lt;p>But if you have read all these article you know I also tried the more appropriate mechanism for OO - so called &lt;strong>methods&lt;/strong>. In Nim a proc is a regular statically bound function, simple and fast. A &lt;strong>method&lt;/strong> on the other hand uses dynamic multimethod dispatch on the &lt;strong>runtime types&lt;/strong> of all object parameters. The easy way to do objects in Nim (with inheritance of behavior) is using methods - but of course, this means dynamic lookup that has a runtime cost, but quite small as we will see.&lt;/p>
&lt;p>Time for benchmarking!&lt;/p></description></item><item><title>Ubuntu Just Works</title><link>https://goran.krampe.se/2014/10/30/ubuntu-just-works/</link><pubDate>Thu, 30 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/30/ubuntu-just-works/</guid><description>&lt;p>A friend of mine is having a less optimal experience with Linux, and I realized I could jot down my experience for the last few years.&lt;/p>
&lt;p>I have been using Linux on my desktop for a long time now, about 10 years I think. Early I played &amp;ldquo;distro jumping&amp;rdquo; and used &lt;a href="http://www.lunar-linux.org" target="_blank" rel="noopener noreferrer">Lunar Linux&lt;/a>
 for quite some time on my older Zepto laptop.&lt;/p>
&lt;p>But at some point I just decided that, nah, source distros are huge time sinks. Not necessarily because they have issues, but because they are fun to tinker with. I also felt it was &amp;ldquo;smarter&amp;rdquo; to know a mainstream Linux well, so I decided to go for &amp;ldquo;least friction&amp;rdquo;, and moved to Ubuntu. When Unity hit I did contemplate using something else, at least an alternative shell, but decided to just &amp;ldquo;hang in there&amp;rdquo;, and now I tend to like it. Recently I upgraded to &lt;a href="http://www.ubuntu.com/desktop/developers" target="_blank" rel="noopener noreferrer">Ubuntu 14.04 LTS&lt;/a>
, it was pretty eventless.&lt;/p></description></item><item><title>Nim and OO</title><link>https://goran.krampe.se/2014/10/29/nim-and-oo/</link><pubDate>Wed, 29 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/29/nim-and-oo/</guid><description>&lt;p>&lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 is presented as an &lt;strong>imperative&lt;/strong> language. And yes, it has some of its roots in the Pascal line of languages, but it also has a set of powerful abstraction mechanisms making it very suitable for object oriented programming. And when I write &lt;em>&amp;ldquo;object oriented&amp;rdquo;&lt;/em> I am referring to a broader flexible sense of OO in which objects can be formulated with attached behavior, polymorphism between different objects, some kind of reuse model of code (inheritance etc) and some type of dynamic dispatch.&lt;/p>
&lt;p>Since I am a &lt;a href="http://www.squeak.org" target="_blank" rel="noopener noreferrer">long time&lt;/a>
 &lt;a href="http://pharo.org" target="_blank" rel="noopener noreferrer">Smalltalker&lt;/a>
 that is my main reference for &lt;em>&amp;ldquo;good OO&amp;rdquo;&lt;/em> and not the &amp;hellip; monstrous OO often seen in Java or C++. Its hard to explain the differences, but let me just say that OO in Smalltalk is elegant and natural, very much like in Ruby or Python - but ever so more streamlined. Smalltalk is a dynamically strongly typed reflective language with a heavily closure based style.&lt;/p>
&lt;p>In this article I will try to make &amp;ldquo;sense&amp;rdquo; out of how to do OO in Nim.&lt;/p></description></item><item><title>Nim Socket Server</title><link>https://goran.krampe.se/2014/10/25/nim-socketserver/</link><pubDate>Sat, 25 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/25/nim-socketserver/</guid><description>&lt;p>In learning &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 I decided to implement a trivial Socket server, very small, as an example. Its &lt;strong>not a useful HTTP server&lt;/strong> (it just returns a hard coded HTTP response so we can benchmark it using HTTP tools), and its &lt;strong>not async&lt;/strong> - there are other such examples in the Nim examples directory and in its stdlib. No, I wanted to write a more classical threaded socket server to see how easy that is - especially with the new APIs in Nim &lt;a href="https://github.com/Araq/Nimrod/tree/bigbreak" target="_blank" rel="noopener noreferrer">&amp;ldquo;bigbreak&amp;rdquo;&lt;/a>
 - and see how it performs.&lt;/p>
&lt;p>The new &amp;ldquo;bigbreak&amp;rdquo; branch that will become Nim 0.10.0 soon-ish has a bunch of new stuff in the networking area. Its replacing the single &lt;code>sockets&lt;/code> module with a low level &lt;code>rawsockets&lt;/code> module, and a higher level &lt;code>net&lt;/code> module. And there is a new &lt;code>selectors&lt;/code> module that abstracts over different modern IO polling mechanisms. This means that a single API will use &lt;strong>epoll on Linux, kqueue on BSD/OSX, old select on the other Unices and IO Completion ports on Windows&lt;/strong>. At the moment epoll, select on &amp;ldquo;other Unices&amp;rdquo; and IO Completion ports works. kqueue is on the todo.&lt;/p>
&lt;p>So without further ado&amp;hellip;&lt;/p></description></item><item><title>I missed Nim</title><link>https://goran.krampe.se/2014/10/20/i-missed-nim/</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/20/i-missed-nim/</guid><description>&lt;p>A year ago I wrote an article trying to round up &lt;a href="http://goran.krampe.se/2013/09/07/new-languages-this-century" target="_blank" rel="noopener noreferrer">new languages since year 2000&lt;/a>
 and what I think of them by just&amp;hellip; glancing at them, or otherwise playing with them. I ended up sifting out the 4 most interesting in my not so humble opinion - &lt;a href="http://golang.org" target="_blank" rel="noopener noreferrer">Go&lt;/a>
, &lt;a href="http://www.rust-lang.org" target="_blank" rel="noopener noreferrer">Rust&lt;/a>
, &lt;a href="http://dartlang.org" target="_blank" rel="noopener noreferrer">Dart&lt;/a>
 and &lt;a href="http://julialang.org" target="_blank" rel="noopener noreferrer">Julia&lt;/a>
. Now a year has passed and&amp;hellip;&lt;/p>
&lt;p>&lt;strong>I discover that I missed Nim(Nimrod)!&lt;/strong>&lt;/p>
&lt;p>&lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 was born somewhere around 2006-ish and is clearly a very serious language to consider, but is going suspiciously under the radar. Having reviewed this language more closely (and still doing so) I can safely say that &lt;strong>for me&lt;/strong> it actually easily &lt;strong>tops this list&lt;/strong>.&lt;/p>
&lt;p>I have already posted &lt;a href="http://goran.krampe.se/categories/nim" target="_blank" rel="noopener noreferrer">a few articles about Nim&lt;/a>
, but this one is meant as a &lt;em>followup&lt;/em> to &lt;a href="http://goran.krampe.se/2013/09/07/new-languages-this-century" target="_blank" rel="noopener noreferrer">that article&lt;/a>
 trying to make amends :).&lt;/p>
&lt;p>&lt;em>&lt;strong>NOTE:&lt;/strong> Technically &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 is still called &amp;ldquo;Nimrod&amp;rdquo; up to and including the &lt;a href="http://nim-lang.org/news.html#Z2014-10-19-version-0-9-6-released" target="_blank" rel="noopener noreferrer">0.9.6-release that was done yesterday&lt;/a>
. But for the upcoming 0.10.0 and onward its &lt;strong>Nim&lt;/strong>. Short and sweet.&lt;/em>&lt;/p></description></item><item><title>Nim wrapping C</title><link>https://goran.krampe.se/2014/10/16/nim-wrapping-c/</link><pubDate>Thu, 16 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/16/nim-wrapping-c/</guid><description>&lt;p>Nim has all the language mechanisms needed to smoothly interoperate with C and C++. The rather &lt;a href="https://github.com/Araq/Nimrod/tree/devel/lib/wrappers" target="_blank" rel="noopener noreferrer">large collection of wrapped C libraries&lt;/a>
 (and that&amp;rsquo;s only those in the standard libs) is also a testament to this fact. In this article I explain my personal findings testing out the waters of wrapping a simple C library.&lt;/p>
&lt;p>The basic approach to wrapping a simple C library is:&lt;/p>
&lt;ol start="0">
&lt;li>Install Nim.&lt;/li>
&lt;li>Install c2nim using Babel or manually clone c2nim from github and build it.&lt;/li>
&lt;li>Use c2nim to translate the C header file(s) to a so called Nim wrapper.&lt;/li>
&lt;li>Make a small test showing it works.&lt;/li>
&lt;li>Write a so called &lt;em>&amp;ldquo;impure&amp;rdquo;&lt;/em> intermediary library that uses the wrapper (next article)&lt;/li>
&lt;li>Make a test green and declare Victory (next article)&lt;/li>
&lt;/ol>
&lt;p>Okidoki&amp;hellip; (roll up sleeves)&lt;/p></description></item><item><title>Bootstrapping Nim(rod)</title><link>https://goran.krampe.se/2014/10/15/bootstrapping-nim/</link><pubDate>Wed, 15 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/15/bootstrapping-nim/</guid><description>&lt;p>Technically &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
 is still called &lt;a href="http://nimrod-lang.org" target="_blank" rel="noopener noreferrer">Nimrod&lt;/a>
 up to and including upcoming bugfix version 0.9.6. But then with the next version 0.10.0 it will be just &lt;strong>Nim&lt;/strong>. Currently Nimrod is at &lt;a href="http://nimrod-lang.org/news.html#Z2014-04-21-version-0-9-4-released" target="_blank" rel="noopener noreferrer">0.9.4&lt;/a>
. And oh, the current development version is 0.9.5 which will become 0.9.6 when released - the &amp;ldquo;odd and even&amp;rdquo; versioning scheme.&lt;/p>
&lt;p>Nim can be a bit funky to get started with, typically due to a slight lack of documentation in certain areas that may be obvious to Nimmers (or Nimsters? Knights who say Nim?). This article tries to fill a few mental holes in the first steps.&lt;/p>
&lt;p>Also, &lt;strong>Nimsters like to do it in Nim&lt;/strong> - and often the reasons for this are very good, like maintaining portability or minimizing dependencies. Just don&amp;rsquo;t expect the classic autoconf dance here. As a Smalltalker I am fully versed in the &lt;a href="http://en.wikipedia.org/wiki/Not_invented_here" target="_blank" rel="noopener noreferrer">NIH syndrome&lt;/a>
 - which of course doesn&amp;rsquo;t always have to be a bad thing. Thankfully Nimmers also seem to balance it with a strong tradition of &lt;a href="https://gcc.gnu.org" target="_blank" rel="noopener noreferrer">standing on the shoulders of giants&lt;/a>
.&lt;/p>
&lt;p>So building Nim isn&amp;rsquo;t &lt;strong>hard&lt;/strong>, but it&amp;rsquo;s also not &lt;strong>obvious&lt;/strong> what is going on. There are of course &lt;a href="http://nimrod-lang.org/download.html" target="_blank" rel="noopener noreferrer">binary installers&lt;/a>
 available too, but hey, we want to hack!&lt;/p></description></item><item><title>Cog vs LuaJIT2</title><link>https://goran.krampe.se/2014/10/13/cog-vs-luajit/</link><pubDate>Mon, 13 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/13/cog-vs-luajit/</guid><description>&lt;p>In the open source Smalltalk community we have a &lt;strong>pretty fast&lt;/strong> VM these days - its called &lt;a href="http://www.mirandabanda.org/cog/" target="_blank" rel="noopener noreferrer">Cog&lt;/a>
 and is written by the highly gifted and experienced &lt;a href="http://www.mirandabanda.org/cogblog/microbio/" target="_blank" rel="noopener noreferrer">Eliot Miranda&lt;/a>
 who also happens to be a really nice guy! Cog is fast and its also still improving with some more developers joining recently.&lt;/p>
&lt;p>Another &lt;strong>very fast&lt;/strong> VM is &lt;a href="http://luajit.org" target="_blank" rel="noopener noreferrer">LuaJIT2&lt;/a>
 for the &lt;a href="http://www.lua.org" target="_blank" rel="noopener noreferrer">Lua&lt;/a>
 language (version 5.1), also written by a single individual with extraordinary programming talent - Mike Pall. LuaJIT2 is often mentioned as the &lt;strong>fastest dynamically typed language&lt;/strong> (or VM) and even though Lua is similar to Smalltalk (well, its actually very similar to Javascript) its also clearly a different beast with other characteristics. If you start looking at the world of game development - then Lua appears &lt;strong>everywhere&lt;/strong>.&lt;/p></description></item><item><title>Here Comes Nim!</title><link>https://goran.krampe.se/2014/10/13/here-comes-nim/</link><pubDate>Mon, 13 Oct 2014 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2014/10/13/here-comes-nim/</guid><description>&lt;p>I just posted an article comparing some silly benchmarks between Cog Smalltalk and LuaJIT2. Now&amp;hellip; let&amp;rsquo;s take a look at one of the latest &amp;ldquo;Cool Kids&amp;rdquo; on the language front, Nimrod - or as it has been renamed - &lt;a href="http://nim-lang.org" target="_blank" rel="noopener noreferrer">Nim&lt;/a>
.&lt;/p></description></item><item><title>ESUG in Annecy Day 4</title><link>https://goran.krampe.se/2013/09/12/esug-in-annecy-day-4/</link><pubDate>Thu, 12 Sep 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/09/12/esug-in-annecy-day-4/</guid><description>&lt;p>It starts off with Cincom, Arden Thomas presenting their roadmap. He had a slide mentioning Jules Verne and I must ask him if he is aware of the influence from the books of Jules Verne - as Dan has explained, the ballon and the island in the &lt;a href="http://st-www.cs.illinois.edu/Graphics/bytebloon.jpg" target="_blank" rel="noopener noreferrer">classic Smalltalk logo&lt;/a>
 comes &lt;a href="http://wiki.squeak.org/squeak/3459" target="_blank" rel="noopener noreferrer">from the Mysterious Island book&lt;/a>
.&lt;/p></description></item><item><title>ESUG in Annecy Day 3</title><link>https://goran.krampe.se/2013/09/11/esug-in-annecy-day-3/</link><pubDate>Wed, 11 Sep 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/09/11/esug-in-annecy-day-3/</guid><description>&lt;p>Day three blurred a bit for me - lots of mingling and hacking intermixed with some nice presentations, but I missed quite a lot, I admit, like the presentation on new native UI stuff in VisualWorks and the &lt;a href="https://github.com/dalehenrich/tode" target="_blank" rel="noopener noreferrer">tODE&lt;/a>
 stuff from Dale Henrichs.&lt;/p></description></item><item><title>ESUG in Annecy Day 2</title><link>https://goran.krampe.se/2013/09/10/esug-in-annecy-day-2/</link><pubDate>Tue, 10 Sep 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/09/10/esug-in-annecy-day-2/</guid><description>&lt;p>Another day in &lt;a href="http://www.iae.univ-savoie.fr" target="_blank" rel="noopener noreferrer">IAE Universite Savoie Mont-Blanc&lt;/a>
 in Annecy.&lt;/p>
&lt;p>Only writing about stuff I attended :)&lt;/p></description></item><item><title>ESUG in Annecy Day 1</title><link>https://goran.krampe.se/2013/09/09/esug-in-annecy-day-1/</link><pubDate>Mon, 09 Sep 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/09/09/esug-in-annecy-day-1/</guid><description>&lt;p>Here we go! Time for a week of Smalltalking fun in &lt;a href="http://www.iae.univ-savoie.fr" target="_blank" rel="noopener noreferrer">IAE Universite Savoie Mont-Blanc&lt;/a>
 in Annecy.&lt;/p>
&lt;p>While &lt;a href="esug.org/wiki/pier/Conferences/2013" >ESUG&lt;/a>
 this year is not super big, I think &lt;strong>around 110 people&lt;/strong> or so, there were still quite a few arms raised when checking how many were here for the first time. The organisation seems impeccable, as always - thank you Stéphane Ducasse, Herve Verjus, Laurent Laffont and of course all volunteers!&lt;/p>
&lt;p>Enough chit-chat, let&amp;rsquo;s get on with the talks&amp;hellip;&lt;/p></description></item><item><title>New Languages After 2000</title><link>https://goran.krampe.se/2013/09/07/new-languages-after-2000/</link><pubDate>Sat, 07 Sep 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/09/07/new-languages-after-2000/</guid><description>&lt;p>I am sitting in a gate on an airport waiting to go to &lt;a href="http://www.esug.org/wiki/pier/Conferences/2013" target="_blank" rel="noopener noreferrer">ESUG&lt;/a>
 so I felt I should finally get this article out the door. In a presentation earlier this year I asked what has happened in the programming language area since year 2000? &lt;em>Not much&lt;/em> I felt and I couldn&amp;rsquo;t really name any interesting new language when thinking about it. But then I decided to look more closely and I can conclude I was at least partly wrong :)&lt;/p>
&lt;p>So prepare for a &lt;strong>long&lt;/strong> (too long) article digging through a whole bunch of languages trying to come up with the answer - &lt;em>Have any interesting programming languages appeared since year 2000?&lt;/em>&lt;/p>
&lt;p>(And at the end, how is the Smalltalk community doing?)&lt;/p></description></item><item><title>RethinkDB - Yet Another NoSQL?</title><link>https://goran.krampe.se/2013/07/16/rethinkdb-yet-another-nosql/</link><pubDate>Tue, 16 Jul 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/07/16/rethinkdb-yet-another-nosql/</guid><description>&lt;p>15-18 years ago my passion was in OODBs. As a Smalltalker &lt;a href="http://www.gemtalksystems.com" target="_blank" rel="noopener noreferrer">GemStone&lt;/a>
 was one of the most fascinating to work with, but as we all know OODBs never got really popular, despite their fantastic qualities. But the new NoSQL databases in many respects offer OODB-ish characteristics, although they of course also bring a whole new menu to the table.&lt;/p>
&lt;p>In my eternal quest for &amp;ldquo;database bliss&amp;rdquo; my next stop is &lt;a href="http://rethinkdb.com" target="_blank" rel="noopener noreferrer">RethinkDB&lt;/a>
, but let me tell you how I got here.&lt;/p></description></item><item><title>Going virtual from CLI</title><link>https://goran.krampe.se/2013/01/21/going-virtual-from-cli/</link><pubDate>Mon, 21 Jan 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/01/21/going-virtual-from-cli/</guid><description>&lt;p>Recently when I automated a development process I looked deeper at managing virtual environments and ended up using two really nice tools complementing &lt;a href="http://www.virtualbox.org" target="_blank" rel="noopener noreferrer">VirtualBox&lt;/a>
 in a slick way - &lt;a href="http://www.vagrantup.com" target="_blank" rel="noopener noreferrer">Vagrant&lt;/a>
 and &lt;a href="https://github.com/jedi4ever/veewee" target="_blank" rel="noopener noreferrer">Veewee&lt;/a>
. A lot of us use VirtualBox of course, but getting a new Ubuntu box up is still a bit of blablablabla&amp;hellip; What if it could be done &lt;em>all from the command line and easily automated&lt;/em>?&lt;/p></description></item><item><title>HyperDex on Ubuntu 12.10 from source</title><link>https://goran.krampe.se/2013/01/16/hyperdex-on-ubuntu-12.10-from-source/</link><pubDate>Wed, 16 Jan 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/01/16/hyperdex-on-ubuntu-12.10-from-source/</guid><description>&lt;p>So ok, I really like looking at new interesting NoSQL databases. Up until yesterday I felt &lt;a href="http://basho.com" target="_blank" rel="noopener noreferrer">Riak&lt;/a>
 was the most interesting one (have also coauthored &lt;a href="http://www.smalltalkhub.com/#!/~gokr/Phriak" target="_blank" rel="noopener noreferrer">Phriak&lt;/a>
 - a Riak binding for &lt;a href="http://www.pharo-project.org" target="_blank" rel="noopener noreferrer">Pharo Smalltalk&lt;/a>
) but after an evening of discussing choices of key/value backends for the &lt;a href="https://goran.krampe.se/categories/oak" >Oak&lt;/a>
 project I decided to &amp;ldquo;google a bit&amp;rdquo; and stumbled upon &lt;a href="http://hyperdex.org" target="_blank" rel="noopener noreferrer">HyperDex&lt;/a>
.&lt;/p></description></item><item><title>New SSD for my Lenovo X220</title><link>https://goran.krampe.se/2013/01/10/new-ssd-for-my-lenovo-x220/</link><pubDate>Thu, 10 Jan 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/01/10/new-ssd-for-my-lenovo-x220/</guid><description>&lt;p>After the &lt;a href="https://goran.krampe.se/2013/01/02/ssd-nightmare" >conundrum with my Intel 320 SSD&lt;/a>
 I did some googling and decided to invest a fair chunk of money in a really good SSD - the &lt;a href="http://www.anandtech.com/show/6328/samsung-ssd-840-pro-512gb-review" target="_blank" rel="noopener noreferrer">Samsung 840 Pro, 512GB&lt;/a>
. The 840 Pro seems to be the king of the hill right now and it&amp;rsquo;s only 7mm thick which is what I need for my X220 (although people have shoved 9mm drives into it with a bit of force).&lt;/p></description></item><item><title>Moving to SmalltalkHub</title><link>https://goran.krampe.se/2013/01/07/moving-to-smalltalkhub/</link><pubDate>Mon, 07 Jan 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/01/07/moving-to-smalltalkhub/</guid><description>&lt;p>As a long time Squeak/Pharo (Smalltalk) developer I have accumulated a set of packages that I have written or co-written and that have been published open source for others to use. Since quite a few years &lt;a href="http://www.squeaksource.com" target="_blank" rel="noopener noreferrer">SqueakSource&lt;/a>
 has been the natural hosting place, but it has reached the end of the road and it&amp;rsquo;s &lt;a href="http://news.squeak.org/2012/11/18/move-your-squeaksource-files/" target="_blank" rel="noopener noreferrer">high time to move on&lt;/a>
.&lt;/p></description></item><item><title>Never an Intel SSD again</title><link>https://goran.krampe.se/2013/01/02/never-an-intel-ssd-again/</link><pubDate>Wed, 02 Jan 2013 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2013/01/02/never-an-intel-ssd-again/</guid><description>&lt;p>When I bought my Lenovo X220 - which I have been &lt;strong>extremely pleased with&lt;/strong> to date - I chose an &lt;strong>Intel 320 160Gb SSD&lt;/strong> disk with it, in retrospect a &lt;strong>BAD MISTAKE&lt;/strong>. No idea why I didn&amp;rsquo;t find the warnings plastered all over the net at the time, and the problem was even acknowledged by Intel &lt;a href="http://www.techpowerup.com/149064/Intel-Acknowledges-SSD-320-Series-8-MB-Bug-.html" target="_blank" rel="noopener noreferrer">as early as july 2011&lt;/a>
. The disk has been working fine since april when I got it, until the last day of 2012&amp;hellip;&lt;/p></description></item><item><title>Oak</title><link>https://goran.krampe.se/2012/12/29/oak/</link><pubDate>Sat, 29 Dec 2012 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2012/12/29/oak/</guid><description>&lt;p>In a customer project right now I need to be able to work and evolve code fast, with a relatively complex model. And by &lt;em>fast&lt;/em> I mean that I want to cut away as much as possible of the efforts related to persistence. Generally this is what OODBs excel at.&lt;/p>
&lt;p>In the Squeak world we have &lt;a href="http://www.gemstone.com/products/gemstone" target="_blank" rel="noopener noreferrer">GemStone&lt;/a>
 (commercial), &lt;a href="http://wiki.squeak.org/squeak/3492" target="_blank" rel="noopener noreferrer">GOODS&lt;/a>
 and &lt;a href="http://wiki.squeak.org/squeak/2665" target="_blank" rel="noopener noreferrer">Magma&lt;/a>
 as &amp;ldquo;full fledged&amp;rdquo; OODBs. Last century :) I worked with GemStone (both Gemstone/S and /J) and its a great product - but I want something lightweight and open source. And simple. And hackable. And new. :)&lt;/p>
&lt;p>I also used Magma in the Gjallar project, and while I respect it highly - this time I want to try something with an &amp;ldquo;externally supported backend&amp;rdquo;. I also had a mixed performance experience, but this was &amp;ldquo;pre Cog&amp;rdquo; and Magma has also surely evolved lots since then, and I am not sure we did everything the way we should have either.&lt;/p>
&lt;p>SandstoneDB could also be interesting to look more closely at, but since I have been working with &lt;a href="http://www.nicolas-petton.fr" target="_blank" rel="noopener noreferrer">Nicolas Petton&lt;/a>
 on improving &lt;a href="http://smalltalkhub.com/#!/~gokr/Phriak" target="_blank" rel="noopener noreferrer">Phriak&lt;/a>
 (Riak interface for Pharo) it was natural to take a look at one of his &amp;ldquo;under the radar&amp;rdquo; projects - &lt;a href="http://www.smalltalkhub.com/#!/~NicolasPetton/Oak" target="_blank" rel="noopener noreferrer">Oak&lt;/a>
, an &amp;ldquo;OODBish&amp;rdquo; solution on top of Riak. At this point I have been doing much more than looking, in fact I am hacking on it! And oh, yeah, of course there are &lt;a href="http://wiki.squeak.org/squeak/512" target="_blank" rel="noopener noreferrer">lots more persistence options&lt;/a>
 available too.&lt;/p></description></item><item><title>Moved from Wordpress to Octopress</title><link>https://goran.krampe.se/2012/12/27/moved-from-wordpress-to-octopress/</link><pubDate>Thu, 27 Dec 2012 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2012/12/27/moved-from-wordpress-to-octopress/</guid><description>&lt;p>So… I kinda got tired of Wordpress. A bit too much for me, I want something more lightweight that “just works”. I also stumbled over some blog that had just moved over to Octopress and made it sound like “da shit” for coders. So be it! And so far so good.&lt;/p>
&lt;p>In short I did an XML export from inside Wordpress admin, created an account on Disqus, added the disqus plugin for Wordpress, exported over all comments, then “git cloned” Octopress onto my laptop, used exitwp (from github) to migrate my XML file from Wordpress, used rsync deploy over to my server and adjusted config in Octopress to use disqus (and thus pick up all old comments).&lt;/p></description></item><item><title>Literal arrays vs JSON vs STON vs Tirade</title><link>https://goran.krampe.se/2012/05/08/literal-arrays-vs-json-vs-ston-vs-tirade/</link><pubDate>Tue, 08 May 2012 00:11:22 +0000</pubDate><guid>https://goran.krampe.se/2012/05/08/literal-arrays-vs-json-vs-ston-vs-tirade/</guid><description>&lt;p>Recently there were a range of threads on the pharo-dev mailinglist discussing the textual format to use for Smalltalk source code metadata. The discussion veered off from the specific use case but basically four different formats were discussed and compared, of which one I am the author. And oh, sorry for the formatting of this article - I need to change theme on this blog for better readability.&lt;/p></description></item><item><title>Going Lenovo...</title><link>https://goran.krampe.se/2012/04/14/going-lenovo/</link><pubDate>Sat, 14 Apr 2012 01:02:06 +0000</pubDate><guid>https://goran.krampe.se/2012/04/14/going-lenovo/</guid><description>&lt;p>When I started my own company about a year ago I ended up buying an &lt;a href="http://www.notebookreview.com/default.asp?newsID=5866&amp;amp;review=asus&amp;#43;g73&amp;#43;g73jw" target="_blank" rel="noopener noreferrer">ASUS G73JW&lt;/a>
 gaming laptop - I took a deliberate decision to focus on raw power for decent money and totally ignoring portability. Generally it has served me well, although it does tend to make a lot of fan noise, at least under Ubuntu. It might work smoother in Windows, but I seldom boot into Windows.&lt;/p>
&lt;p>Needless to say though it is a &lt;strong>real ton of bricks&lt;/strong> (8.8 lbs = 4 kg) and including the truly fat power supply it simply weared my back down during 2011. I have been carrying this beast in a backpack every day - and my body eventually said &amp;ldquo;enough dammit!&amp;rdquo;. :)&lt;/p></description></item><item><title>Current Smalltalk obsessions...</title><link>https://goran.krampe.se/2012/02/07/current-smalltalk-obsessions/</link><pubDate>Tue, 07 Feb 2012 00:15:10 +0000</pubDate><guid>https://goran.krampe.se/2012/02/07/current-smalltalk-obsessions/</guid><description>&lt;p>These days I am, as usual, torn between several interesting technical projects.&lt;/p>
&lt;h1 id="amber">
 Amber
 &lt;a class="heading-link" href="#amber">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>The new &lt;a href="http://www.world.st" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
 called &lt;a href="http://www.amber-lang.net" target="_blank" rel="noopener noreferrer">Amber&lt;/a>
 (by Nicolas Petton) that compiles to javascript is pretty awesome and there are tons of interesting things one can do with it. My contributions so far include the beginning of a package model, a faster simpler chunk format exporter/importer, a command line compiler, a Makefile system so that Amber can be built fully from the command line and a bunch of &lt;a href="https://github.com/NicolasPetton/amber/tree/master/examples" target="_blank" rel="noopener noreferrer">examples&lt;/a>
 running on top of &lt;a href="http://nodejs.org" target="_blank" rel="noopener noreferrer">Nodejs&lt;/a>
 and &lt;a href="http://developer.palm.com" target="_blank" rel="noopener noreferrer">webOS&lt;/a>
, and a few other odds and ends.&lt;/p></description></item><item><title>ESUG day 4</title><link>https://goran.krampe.se/2011/08/25/esug-day-4/</link><pubDate>Thu, 25 Aug 2011 16:50:52 +0000</pubDate><guid>https://goran.krampe.se/2011/08/25/esug-day-4/</guid><description>&lt;p>This day started with some stress, Nicolas and I whipped up the last details of our co-presentation on &lt;a href="Http://jtalk-project.org" >Jtalk&lt;/a>
 (Nicolas decided to skip &lt;a href="Http://www.iliadproject.org" >Iliad&lt;/a>
) - and my Eris demo suddenly got b0rken. But I managed to fix it and our presentation was &lt;strong>very well&lt;/strong> received - it was great fun!&lt;/p>
&lt;p>Nicolas managed to do quite a few &amp;ldquo;on the fly&amp;rdquo; demonstrations of various Jtalk snippets etc, and running &lt;a href="Http://nicolas-petton.fr/presentations/esug2011" >the slides&lt;/a>
 in Jtalk was of course a killer thing. I explained how jtalkc is being run on top of Node.js and quickly proceeded into showing the &lt;a href="Http://github.com/gokr/jtalk/tree/master/nodejs/trivialserver" >TrivialServer&lt;/a>
 demo in Node.is - when Apache benchmark showed &lt;strong>1800 requests/second&lt;/strong> there was a spontaneous applause. :)&lt;/p></description></item><item><title>ESUG day 3</title><link>https://goran.krampe.se/2011/08/24/esug-day-3/</link><pubDate>Wed, 24 Aug 2011 10:07:30 +0000</pubDate><guid>https://goran.krampe.se/2011/08/24/esug-day-3/</guid><description>&lt;p>Suddenly it is Wednesday and we are already on day three at &lt;a href="Http://www.esug.org" >ESUG&lt;/a>
 - a superb software developer conference focused on &lt;a href="http://www.world.st" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
. Time flies. Yesterday I mainly hacked together with Nicolas Petton on &lt;a href="Http://www.jtalk-project.org" >Jtalk&lt;/a>
, really fun, unfortunately I missed a few interesting presentations, like Fuel and Bifrost etc.&lt;/p>
&lt;p>This day starts with Stéphane presenting &amp;ldquo;Humane assessment&amp;rdquo;. Mmm, got distracted by my Touchpad, but Stéphane is showing some cool visualizations right now, clearly useful for large systems and organisations that need understand their own &amp;ldquo;huge legacy software&amp;rdquo;. Hehe, the browsers shows visual queues on &amp;ldquo;bad designs&amp;rdquo; like marking methods as &amp;ldquo;BrainMethod&amp;rdquo; or marking a class as &amp;ldquo;God Class&amp;rdquo; - that is indeed very slick!&lt;/p></description></item><item><title>Touchpad finally in my hands, first day</title><link>https://goran.krampe.se/2011/08/23/touchpad-finally-in-my-hands-first-day/</link><pubDate>Tue, 23 Aug 2011 23:42:35 +0000</pubDate><guid>https://goran.krampe.se/2011/08/23/touchpad-finally-in-my-hands-first-day/</guid><description>&lt;p>Sooo&amp;hellip;. I actually managed to order a HP Touchpad 32Gb here in Edinburgh to be picked up at Comet within 48 hours. I ordered when it was still a whopping 429£, but when I went to pick it up I got it at the UK &lt;strong>discount price of 115&lt;/strong>, and I will get the VAT back too.&lt;/p>
&lt;p>The first hours were frustrating because I was in the ESUG conference and we only had a WiFi with a so called &amp;ldquo;captive portal&amp;rdquo; with a login form - and the first time you power up a Touchpad it wants to hook up to a Palm Profile, and does not want to do that using a WiFi with a captive portal.&lt;/p></description></item><item><title>ESUG 2011 in Edinburgh</title><link>https://goran.krampe.se/2011/08/11/esug-2011-in-edinburgh/</link><pubDate>Thu, 11 Aug 2011 11:59:57 +0000</pubDate><guid>https://goran.krampe.se/2011/08/11/esug-2011-in-edinburgh/</guid><description>&lt;p>Each year I try to attend at least one developer conference. Earlier OOPSLA was a given but it lost its appeal quite a few years back and now it is not even called OOPSLA anymore. As a die hard &lt;a href="http://www.world.st" target="_blank" rel="noopener noreferrer">Smalltalker&lt;/a>
 I instead attended the &lt;a href="http://www.esug.org/wiki/pier/Conferences" target="_blank" rel="noopener noreferrer">ESUG conference&lt;/a>
 in Brest 2009 and it was easily the most rewarding conference I ever have attended! Missed last year in Barcelona but this year I am going to &lt;a href="http://www.esug.org/wiki/pier/Conferences/2011" target="_blank" rel="noopener noreferrer">Edinburgh&lt;/a>
 for a week of Smalltalking.&lt;/p></description></item><item><title>WebOS 3.0 is coming - with Enyo!</title><link>https://goran.krampe.se/2011/07/09/webos-3-0-is-coming-with-enyo/</link><pubDate>Sat, 09 Jul 2011 01:27:37 +0000</pubDate><guid>https://goran.krampe.se/2011/07/09/webos-3-0-is-coming-with-enyo/</guid><description>&lt;p>A few weeks ago I joined the Early Access program that HP/Palm has been offering for a while and I have been toying with the new &lt;a href="http://developer.palm.com" target="_blank" rel="noopener noreferrer">WebOS 3.0&lt;/a>
 (SDK with emulator) that appeared in public on the 1st of july when the &lt;a href="http://www.hpwebos.com/us/products/pads/touchpad/index.html" target="_blank" rel="noopener noreferrer">HP Touchpads&lt;/a>
 hit the stores in the US. Since a week I also have a &lt;a href="http://www.hpwebos.com/us/products/phones/pre2/index.html" target="_blank" rel="noopener noreferrer">Palm Pre 2&lt;/a>
 phone running WebOS 2.1, hopefully to be upgraded later to 3.0.&lt;/p></description></item><item><title>Konsten att måla ett drev, del 2</title><link>https://goran.krampe.se/2011/05/17/konsten-att-mala-ett-drev-del-2/</link><pubDate>Tue, 17 May 2011 13:27:34 +0000</pubDate><guid>https://goran.krampe.se/2011/05/17/konsten-att-mala-ett-drev-del-2/</guid><description>&lt;p>Dags för andra delen i artikelserien om att måla ett drev. &lt;a href="http://goran.krampe.se/2011/05/01/konsten-att-mala-ett-drev-del-1/" target="_blank" rel="noopener noreferrer">Första delen&lt;/a>
 avhandlade mest teori om målningsprocessen. Nu är det dags för avmontering av drevet från skölden samt applicering av färgstripper.&lt;/p>
&lt;h2 id="demontering">
 Demontering
 &lt;a class="heading-link" href="#demontering">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>Dags att börja meka. Min ambition är att komma åt det mesta av drevets delar utan att gå så långt som att plocka isär det i alla sina beståndsdelar. Köpte Selocs manual - &lt;strong>&amp;ldquo;Volvo Penta Stern Drives 1992-2002 Repair Manual&amp;rdquo;&lt;/strong> - från &lt;a href="http://www.drev.se" target="_blank" rel="noopener noreferrer">www.drev.se&lt;/a>
 (finns en från Clymer också, vet ej vilken som är bäst) och följer instruktionen för att plocka av drevet.&lt;/p></description></item><item><title>Konsten att måla ett drev, del 1</title><link>https://goran.krampe.se/2011/05/01/konsten-att-mala-ett-drev-del-1/</link><pubDate>Sun, 01 May 2011 23:40:39 +0000</pubDate><guid>https://goran.krampe.se/2011/05/01/konsten-att-mala-ett-drev-del-1/</guid><description>&lt;p>Vi som kör inombordare i våra båtar har typiskt drev från Volvo Penta eller Mercruiser. Dreven är av aluminium, eller typiskt någon sorts aluminiumlegering och att måla aluminium är en tekniskt sett mycket intressant process och de flesta som gjort detta kan säkert vittna om att det inte funkar så bra, färgen lossnar helt enkelt efter ett tag. Det verkar gått så långt att många helt enkelt inte ens bryr sig om att försöka bygga upp en korrekt målning utan istället slänger på lite primer och antifouling direkt på aluminiumet och får göra om samma visa efter nåt år!&lt;/p></description></item><item><title>Tirade, supporting embedded text</title><link>https://goran.krampe.se/2011/04/15/tirade-supporting-embedded-text/</link><pubDate>Fri, 15 Apr 2011 01:22:58 +0000</pubDate><guid>https://goran.krampe.se/2011/04/15/tirade-supporting-embedded-text/</guid><description>&lt;p>Two years ago I ended up creating &lt;a href="http://goran.krampe.se/2009/03/16/tirade-a-file-format-for-smalltalkers/" target="_blank" rel="noopener noreferrer">Tirade&lt;/a>
 - a new &amp;ldquo;file format&amp;rdquo; for Smalltalkers. Or rather, a way to serialize stuff into a sequence of Smalltalk messages with literals as arguments. I have written a &lt;a href="http://goran.krampe.se/categories/tirade" target="_blank" rel="noopener noreferrer">few blog articles about Tirade&lt;/a>
 so I will not go into details in this one.&lt;/p>
&lt;p>One thing that has been disturbing with Tirade is that I wanted it to be the main format for serializing Deltas, the new implementation of &amp;ldquo;21st Century ChangeSets&amp;rdquo;. This means I want Tirade to handle Smalltalk source code in the best possible way. Ideally I would want the Tirade file to be editable in a text editor if I wanted, and not being broken by that.&lt;/p></description></item><item><title>Preaching Smalltalk inside a nuclear reactor</title><link>https://goran.krampe.se/2011/04/08/preaching-smalltalk-inside-a-nuclear-reactor/</link><pubDate>Fri, 08 Apr 2011 12:07:35 +0000</pubDate><guid>https://goran.krampe.se/2011/04/08/preaching-smalltalk-inside-a-nuclear-reactor/</guid><description>&lt;p>&amp;hellip;is what I did yesterday. It was the &lt;a href="http://sites.google.com/site/stockholmgtug" target="_blank" rel="noopener noreferrer">Stockholm GTUG&lt;/a>
 group having a loose and laid back meetup in a rather special venue - R1, &lt;a href="http://sv.wikipedia.org/wiki/R1_%28reaktor%29" target="_blank" rel="noopener noreferrer">Sweden&amp;rsquo;s first nuclear reactor&lt;/a>
! 27 meters below ground, kinda&amp;hellip; funky.&lt;/p>
&lt;p>Anyway, I tried doing an ultra compact version of several of my other presentations around &lt;a href="http://www.world.st" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
 and &lt;a href="http://www.seaside.st" target="_blank" rel="noopener noreferrer">Seaside&lt;/a>
 - didn&amp;rsquo;t really go 100% since I both had some technical issues (keyboard problems and projector issues too) and ended up taking more time than was planned. Hopefully noone got upset about that.&lt;/p></description></item><item><title>Node.js vs Nginx/Squeak, part 1</title><link>https://goran.krampe.se/2011/03/14/node-js-vs-nginxsqueak-part-1/</link><pubDate>Mon, 14 Mar 2011 16:55:58 +0000</pubDate><guid>https://goran.krampe.se/2011/03/14/node-js-vs-nginxsqueak-part-1/</guid><description>&lt;p>Hmmm, after seeing the &lt;a href="http://nodejs.org" target="_blank" rel="noopener noreferrer">Node.js&lt;/a>
 presentation at &lt;a href="http://swdc-central.com/dyncon2011/index.html" target="_blank" rel="noopener noreferrer">Dyncon 2011&lt;/a>
 I couldn&amp;rsquo;t help installing Nginx and Blackfoot (SimpleCGI) in a Squeak 4.2 image running on the Cog VM to make some performance tests! In fact I started doing that during the presentation. :)&lt;/p>
&lt;p>My first run on Nginx/Squeak looked quite unimpressive. Well, one client doing 1300 req/s to a small helloworld was decent although Node.js handled approximately 2x that. With Nginx we have a two tier solution so a factor of 2 is not really surprising in this trivial case. Top showed similar load, both solutions only seem to consume 8-9% of my CPU power on this box, but the Nginx/Squeak solution of course spreads load between them with approximately 1/3 or 1/4 on nginx.&lt;/p></description></item><item><title>Dyncon 2011, retrospect</title><link>https://goran.krampe.se/2011/03/14/dyncon-2011-retrospect/</link><pubDate>Mon, 14 Mar 2011 16:45:51 +0000</pubDate><guid>https://goran.krampe.se/2011/03/14/dyncon-2011-retrospect/</guid><description>&lt;p>So it&amp;rsquo;s monday and I am getting started with work but thought I should try writing a retrospective of &lt;a href="http://swdc-central.com/dyncon2011/" target="_blank" rel="noopener noreferrer">Dyncon 2011&lt;/a>
 during the day. In summary it was a nice and largish crowd (about 85), a spacious and good venue in the middle of the city (office of BWin/Ongame) with a great view from the 11th floor and a good &lt;a href="http://swdc-central.com/dyncon2011/speakers.html" target="_blank" rel="noopener noreferrer">lineup of speakers&lt;/a>
. Perhaps I am getting old though but having this many speakers doing 40 min presentations for two full days&amp;hellip; well, I kinda like to have time to sit down and chat with people and show stuff and so on. Not much time for that, and 40 minutes means that most presentations got stressed for time even though flying on a rather high level. But still, &lt;strong>a fun and interesting conference&lt;/strong>!&lt;/p></description></item><item><title>Dyncon 2011, day 2</title><link>https://goran.krampe.se/2011/03/13/dyncon-2011-day-2/</link><pubDate>Sun, 13 Mar 2011 14:04:11 +0000</pubDate><guid>https://goran.krampe.se/2011/03/13/dyncon-2011-day-2/</guid><description>&lt;p>Day one must have ended with lots of beer because people were quite late for day two. 15 minutes late Carl Lerche finally started his Ruby presentation. One thing I found interesting was Ruby Modules vs Monticello extension methods (in some ways I presume this is how Modules are often used - to extend other classes with behavior). Evidently &amp;ldquo;method extensions&amp;rdquo; to the class side in Ruby doesn&amp;rsquo;t work like extensions to the instance side, it does in Smalltalk of course :). Then Carl described ways to still do this, but it looked complex, and also explaining there are lots of &amp;ldquo;hooks&amp;rdquo; when messing with the MOP. Is that a good thing? If Rubyists use this a lot, then I presume utter hopeless confusion might occur.&lt;/p></description></item><item><title>Dyncon 2011, day 1</title><link>https://goran.krampe.se/2011/03/12/dyncon-2011-day-1/</link><pubDate>Sat, 12 Mar 2011 11:48:57 +0000</pubDate><guid>https://goran.krampe.se/2011/03/12/dyncon-2011-day-1/</guid><description>&lt;p>In place at &lt;a href="https://goran.krampe.se/http://swdc-central.com/dyncon2011/" >Dyncon 2011 &lt;/a>
at Bwin/Ongame in Stockholm. Quite a nice crowd and the day was started with Joe Armstrong presenting &lt;a href="http://www.erlang.org" target="_blank" rel="noopener noreferrer">Erlang&lt;/a>
. I had never seen Joe speak before and it was a fun and interesting presentation, although of course only &amp;ldquo;skimming&amp;rdquo; some areas. I found it fun that he referenced Alan Kay where he stressed that &amp;ldquo;it&amp;rsquo;s the messages&amp;rdquo;, given his earlier harsh view on OO. I couldn&amp;rsquo;t help starting to think about how some of Erlang&amp;rsquo;s concepts could easily be implemented in Smalltalk and what that could give.&lt;/p></description></item><item><title>No more coppar!</title><link>https://goran.krampe.se/2010/11/26/no-more-coppar/</link><pubDate>Fri, 26 Nov 2010 11:58:32 +0000</pubDate><guid>https://goran.krampe.se/2010/11/26/no-more-coppar/</guid><description>&lt;p>Our ADSL broke a week ago and the &lt;a href="http://www.kustbandet.com" target="_blank" rel="noopener noreferrer">operator&lt;/a>
 decided to NOT repair it, since they can&amp;rsquo;t see the economy in doing so.&lt;/p>
&lt;p>After pondering the options I decided to try 3G all the way. Since I already have a Telia USB modem (Option icon 505) I just needed a good wifi router that can use it.&lt;/p>
&lt;p>Ended up buying a &lt;a href="http://www.dovado.com/4GR.html" target="_blank" rel="noopener noreferrer">Dovado 4GR&lt;/a>
, really simple to set up and to upgrade firmware in. It is important to try different locations in the house though, got 3x more speed near the window on the second floor.&lt;/p></description></item><item><title>Skype interview with Dan Ingalls</title><link>https://goran.krampe.se/2010/09/10/skype-interview-with-dan-ingalls/</link><pubDate>Fri, 10 Sep 2010 08:49:54 +0000</pubDate><guid>https://goran.krampe.se/2010/09/10/skype-interview-with-dan-ingalls/</guid><description>&lt;p>Before the summer I had the opportunity to do a Skype interview with Dan &lt;a href="http://en.wikipedia.org/wiki/Daniel_Henry_Holmes_Ingalls,_Jr." target="_blank" rel="noopener noreferrer">Ingalls&lt;/a>
, the &amp;ldquo;Guido/Larry/Linus&amp;rdquo; of Smalltalk.&lt;/p>
&lt;p>The interview was part of a guest lecture I did at &lt;a href="http://dsv.su.se/" target="_blank" rel="noopener noreferrer">DSV&lt;/a>
 for the &lt;a href="http://people.dsv.su.se/~beatrice/DYPL" target="_blank" rel="noopener noreferrer">DYPL&lt;/a>
 course (dynamic programming languages) held by Beatrice Akerblom. In the end I only used a smaller quote because most of the topics in the interview ended up being more interesting to &amp;ldquo;true believers&amp;rdquo; than to Smalltalk newcomers.&lt;/p></description></item><item><title>Making a Skype interview...</title><link>https://goran.krampe.se/2010/05/07/making-a-skype-interview/</link><pubDate>Fri, 07 May 2010 14:00:08 +0000</pubDate><guid>https://goran.krampe.se/2010/05/07/making-a-skype-interview/</guid><description>&lt;p>I got the opportunity to make a Skype interview with &lt;a href="http://en.wikipedia.org/wiki/Daniel_Henry_Holmes_Ingalls,_Jr." target="_blank" rel="noopener noreferrer">Dan Ingalls&lt;/a>
, so I decided to try to record it. Had no idea it was not as easy as a &amp;ldquo;press record&amp;rdquo;-button. I am on Ubuntu, Karmic Koala. First of all I had serious trouble getting proper sound working with Skype, I ended up following the HOWTO in order to install Skype 2.1 beta - which uses PulseAudio ONLY. That took care of that issue, after a bit of fiddling in the &amp;ldquo;Preferences&amp;rdquo; dialog you get when right-clicking on your volume applet :)&lt;/p></description></item><item><title>Joe is wrong</title><link>https://goran.krampe.se/2009/06/26/joe-is-wrong/</link><pubDate>Fri, 26 Jun 2009 17:12:06 +0000</pubDate><guid>https://goran.krampe.se/2009/06/26/joe-is-wrong/</guid><description>&lt;p>I just read Joe Armstrong’s old &amp;ldquo;Why OO sucks&amp;rdquo; &lt;a href="http://www.sics.se/~joe/bluetail/vol1/v1_oo.html" target="_blank" rel="noopener noreferrer">article&lt;/a>
, Joe Armstrong being the inventor of &lt;a href="http://erlang.org/" target="_blank" rel="noopener noreferrer">Erlang&lt;/a>
. Granted, the article is from year 2000 I think, so perhaps I should cut him some slack… nah! :)&lt;/p>
&lt;p>First of all - no, I haven’t programmed in Erlang (yet), but quite a lot of other programming languages. My favorite language is the grand father OO language - &lt;a href="http://squeak.org/" target="_blank" rel="noopener noreferrer">Smalltalk&lt;/a>
. So sure, I am biased in favor of OO.&lt;/p></description></item><item><title>Tirade, first trivial use</title><link>https://goran.krampe.se/2009/04/20/tirade-first-trivial-use/</link><pubDate>Mon, 20 Apr 2009 00:43:55 +0000</pubDate><guid>https://goran.krampe.se/2009/04/20/tirade-first-trivial-use/</guid><description>&lt;p>Last night I started hooking &lt;a href="http://goran.krampe.se/2009/03/16/tirade-a-file-format-for-smalltalkers/" target="_blank" rel="noopener noreferrer">Tirade&lt;/a>
 into Deltas. Quick background: Deltas is &amp;ldquo;Changesets for the 21st century&amp;rdquo;, or in other words an intelligent patch system under development for Squeak. Tirade is a Smalltalk/Squeak centric &amp;ldquo;JSON&amp;rdquo;-kinda-thingy. I made Tirade in order to get a nice file format for Deltas. Just wanted to share how the first trivial code looks, and thus illustrate simple use of Tirade.&lt;/p>
&lt;p>I have a DSDelta (a Delta being almost like a ChangeSet). It consists of some metadata (a UUID, a Dictionary of properties and a TimeStamp) and a DSChangeSequence (which holds the actual DSChange instances). As a first shot I only implemented the metadata bit. So step by step:&lt;/p></description></item><item><title>Tirade, part 2</title><link>https://goran.krampe.se/2009/03/20/tirade-part-2/</link><pubDate>Fri, 20 Mar 2009 00:34:07 +0000</pubDate><guid>https://goran.krampe.se/2009/03/20/tirade-part-2/</guid><description>&lt;p>In an article recently I described &lt;a href="http://goran.krampe.se/2009/03/16/tirade-a-file-format-for-smalltalkers/" target="_blank" rel="noopener noreferrer">Tirade&lt;/a>
 - a new generic &amp;ldquo;file format&amp;rdquo; for Smalltalk/Squeak, or actually a sub language! Since that article I have refined Tirade a bit. Tirade consists today of 4 classes (parser, reader, writer, recorder) totalling &lt;strong>about 500 lines of code&lt;/strong>, excluding tests. Tests are &lt;strong>green in 3.10.2, pharo-10231, 3.9, 3.8 and 3.7&lt;/strong>. It does turn red in 3.6 due to old initialize behavior, some missing methods etc, probably easily fixed if anyone cares. There are no dependencies on other packages. Compared to using the old Compiler&amp;raquo;evaluate: it is about 5-7 times faster.&lt;/p></description></item><item><title>Tirade, a file format for Smalltalkers</title><link>https://goran.krampe.se/2009/03/16/tirade-a-file-format-for-smalltalkers/</link><pubDate>Mon, 16 Mar 2009 00:24:07 +0000</pubDate><guid>https://goran.krampe.se/2009/03/16/tirade-a-file-format-for-smalltalkers/</guid><description>&lt;p>In my revived work on &lt;a href="http://wiki.squeak.org/squeak/6001" target="_blank" rel="noopener noreferrer">Deltastreams&lt;/a>
 in Squeak I ended up facing the choice of native file format for Deltas. Matthew has made an advanced format called &lt;a href="http://www.squeaksource.com/InterleavedChangeSet.html" target="_blank" rel="noopener noreferrer">InterleavedChangeset&lt;/a>
 which manages to squeeze a binary representation of a Delta into a &lt;a href="http://wiki.squeak.org/squeak/1105" target="_blank" rel="noopener noreferrer">Changeset&lt;/a>
 file (which is in Smalltalk chunk format). An impressive feat, and it has the advantage of being backwards compatible in the sense that a Delta in this format can be filed in as a plain old Changeset into an old Squeak image.&lt;/p></description></item><item><title/><link>https://goran.krampe.se/2009/01/01/</link><pubDate>Thu, 01 Jan 2009 00:00:00 +0000</pubDate><guid>https://goran.krampe.se/2009/01/01/</guid><description>&lt;h1 id="the-guts-of-ni">
 The guts of Ni
 &lt;a class="heading-link" href="#the-guts-of-ni">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h1>
&lt;p>This article describes parts of the current design and implementation of the Ni language. It&amp;rsquo;s not a tutorial, introduction or manual. It&amp;rsquo;s in fact kinda incoherent - but so is Ni :)&lt;/p>
&lt;h2 id="the-parser">
 The parser
 &lt;a class="heading-link" href="#the-parser">
 &lt;i class="fa-solid fa-link" aria-hidden="true" title="Link to heading">&lt;/i>
 &lt;span class="sr-only">Link to heading&lt;/span>
 &lt;/a>
&lt;/h2>
&lt;p>The &lt;a href="https://github.com/gokr/ni/blob/master/src/niparser.nim" target="_blank" rel="noopener noreferrer">Ni parser&lt;/a>
 is a straight forward hand made &lt;del>recursive descent&lt;/del> parser. Hmmm, now that I look closer I realize its not recursive! Its just a very simple &lt;a href="https://github.com/gokr/ni/blob/master/src/niparser.nim#L477" target="_blank" rel="noopener noreferrer">while loop character by character&lt;/a>
 and maintaining some state. It should be easy to read and understand and given that the grammar is so simple, it hasn&amp;rsquo;t changed much lately. It could probably be made faster by using more procs and less methods, but it&amp;rsquo;s probably plenty fast since the grammar is so simple.&lt;/p></description></item></channel></rss>