<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2954894206056939417</id><updated>2012-01-27T22:49:38.665+01:00</updated><category term='linux'/><category term='MUSQ'/><category term='scheme'/><category term='reading'/><category term='Go'/><category term='understand'/><category term='gravatar'/><category term='scala'/><category term='emacs'/><category term='hunchentoot'/><category term='erlang'/><category term='programming'/><category term='nickname'/><category term='maybe'/><category term='community'/><category term='conditions'/><category term='restarts'/><category term='OCaml'/><category term='lisp'/><category term='F#'/><category term='editors'/><category term='Pine'/><category term='Arch Linux'/><category term='xmonad'/><category term='Factor'/><category term='mplayer'/><category term='slime'/><category term='#lisp'/><category term='perhaps'/><category term='dell'/><category term='weitz'/><category term='comicgrab'/><category term='functional language'/><category term='iscsi'/><category term='twitter'/><category term='haskell'/><category term='studying'/><category term='vim'/><category term='summary'/><category term='guitar'/><category term='blogging'/><category term='learning'/><category term='work'/><category term='newbie'/><category term='san'/><title type='text'>Thoughts ! blog</title><subtitle type='html'>Stuff I'll probably regret having written when I'm older... ;-)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8205020701840112724</id><published>2011-08-31T20:33:00.000+02:00</published><updated>2011-08-31T20:33:57.976+02:00</updated><title type='text'>Apples and Oranges</title><content type='html'>In my last post I wrote I was going to do the rewrite of the game I was making together with Randy.&lt;br /&gt;I did the entire server in Erlang and it was a good version. Stable, reliable, all thanks to Erlang and the way it semi-forces you to do things the right way. Especially when using OTP, which I tried to do for everything.&lt;br /&gt;&lt;br /&gt;So which one do I like best? I still can't say. They both have their merits. I've had numerous discussions on IRC about Go and Erlang. Some like Go, some utterly despise it. But everyone agrees that there's something there.&lt;br /&gt;I still like it. In the year I didn't use it, Go grew and matured a lot. Picking it up again, I must say I'm impressed with the work that was done. So I'm not going to choose a winning language, I'm going to use them both. It'll be easy too, because I'll be using Erlang for my job in the near future. That makes Go my default Go-to language (I do love the bad puns) for all my hobby projects.&lt;br /&gt;&lt;br /&gt;I didn't give up on the whole language polyglot thing. Far from it, I'm waiting for Ada 2012 to come out so I can play with that. ;-)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8205020701840112724?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8205020701840112724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8205020701840112724' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8205020701840112724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8205020701840112724'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2011/08/apples-and-oranges.html' title='Apples and Oranges'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3225683249036721473</id><published>2010-12-02T08:43:00.000+01:00</published><updated>2010-12-02T08:43:10.451+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional language'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='Go'/><title type='text'>Should I stay or should I Go?</title><content type='html'>The last couple of months I've been playing around with Go. I got curious about the language because it had lightweight threads and message passing concurrency. Since the project (&lt;a href="http://bitbucket.org/gertm/musq/"&gt;MUSQ&lt;/a&gt;) I'm working on with a friend wasn't really working out for the both of us, we decided to change direction. For both of us it meant changing languages. Randy switched to completely doing the front-end in Javascript and HTML5 with the Canvas tag. I rewrote the back-end in Go to get a feel for the language.&lt;br /&gt;&lt;br /&gt;We're now 3 months in working with the new project. My thoughts on Go so far, I'll start with the negative points:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sometimes there's code bloat. Especially when working with side-effects and you have to catch/prepare for errors, you write a lot of "if err != nil { return bla, err }". After a while the source gets crowded with it and it gets a bit harder to read. Maybe I'm doing something wrong, but for now I can't really see another way to do it. (without using up more resources)&lt;/li&gt;&lt;/ul&gt;Hmm. That's it. Can't seem to think of anything else that _really_ bugs me.&lt;ul&gt;&lt;/ul&gt;&lt;div&gt;Things I need to get used to some more:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;No real OO. Sometimes Object Orientation is really the right way to go, and since I do a lot of it at work, it has shaped the way I think about certain things. This is not a problem, it's merely something I need to work on. The interfaces in Go are very powerful and can solve stuff quite elegantly.&lt;/li&gt;&lt;li&gt;No debugger. Ok I admit it, I'm spoiled working in VS.NET at work and using Erlang's tools. So for now in Go, it's debug print statements. It's not a big deal. If anything, it makes you think harder about what you wrote. But it slows the debugging process a bit.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Pointers. This is the first language I _really_ use with pointers. You can't do pointer arithmetic so you can't do the really ugly stuff, but still, they trip me up sometimes.&lt;/li&gt;&lt;li&gt;Mutable state everywhere, especially when using pointers. Of course, it's no different at work, but compared to Erlang,... it will need more discipline from me to write clean code.&lt;/li&gt;&lt;li&gt;No generics. But how often do I actually use that anyway? Go has a lot of built-in stuff (copy, append) that takes care of 90% of the situations where I would use them. Besides, I don't think the question is "Will Go get generics?", I think it's: "When will Go get generics?".&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;The good stuff:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;First class functions, closures, feels like a functional language! (no, really)&lt;/li&gt;&lt;li&gt;Message passing concurrency. I have to say, I like the way Go does this. Channels you can pass around, limit their reading/writing depending on the situation. Very nice. Makes for very clean code.&lt;/li&gt;&lt;li&gt;The library is awesome. I only need 1 external library (for Redis) but I'm writing my&amp;nbsp;&lt;a href="https://bitbucket.org/gertm/grds"&gt;own version&lt;/a&gt;&amp;nbsp;of that and I like it better.&lt;/li&gt;&lt;li&gt;Very high productivity. I'm amazed at how fast I can sometimes write code that works.&lt;/li&gt;&lt;li&gt;Easy to refactor. What a joy this is in Go. I've encountered situations where it would take me an hour to refactor properly in C#, but it only took 10 minutes in Go.&lt;/li&gt;&lt;li&gt;It's so simple. Go fits entirely in my head. This is really important to me. I'm pretty good at Erlang, but I doubt I know the entire language, let alone C#, I don't know half of it probably. In Go, there's no obscure language feature I haven't heard of, reading other people's code is very easy. This is of course because the language is so young, but still, it's very nice.&lt;/li&gt;&lt;li&gt;I understand the stuff in the mailing list. Yeah, go ahead, laugh. But for me, this is really nice. I can keep up with the language development and not feel completely overwhelmed by the academic stuff. Good for my self esteem! :-)&lt;/li&gt;&lt;li&gt;It gives me a feeling of being 'closer to the metal'. Closer in the sense of: I've never been this close before. All the previous languages I tried are very high level. Go forces me to think a bit differently about problems.&lt;/li&gt;&lt;/ul&gt;Go also made me think about functional programming. It's a bit strange to use languages that have no mutable state when the machine that runs it is&amp;nbsp;inherently about mutable state. Ok, a functional language will hide that from you, so you can focus on writing good code. I appreciate the value in this, but it comes at a cost. Either the performance will go down, or you have to be really great with the FP stuff so you can use Haskell properly.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any case, as with every new language I learn, after a while, Erlang starts calling out to me. So I've decided to port the current state of my project to Erlang to compare the two. The one I like best stays. So far, Go has the advantage, but that's because my Erlang is rusty ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3225683249036721473?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3225683249036721473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3225683249036721473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3225683249036721473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3225683249036721473'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/12/should-i-stay-or-should-i-go.html' title='Should I stay or should I Go?'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8824045107802859470</id><published>2010-08-01T20:30:00.000+02:00</published><updated>2010-08-01T20:30:09.684+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Update on my Haskell progress.</title><content type='html'>I've spent the better part of my holiday studying Haskell. It has been an enlightening experience. I think I understand monads now. At least I get why they are useful (and necessary in Haskell). &lt;br /&gt;The type system in Haskell is incredible. I wish all languages had one as powerful as that.&lt;br /&gt;&lt;br /&gt;The functional paradigm is awesome. I've learned so many things over the past years, I feel I've become a better programmer. My C# code I write at work is more and more functional in nature and I believe it's more clear and contains less bugs. (LINQ is monadic, and great!)&lt;br /&gt;&lt;br /&gt;But it's the 'pure' thing in Haskell that bugs me. Although it's fantastic for making sure no icky stuff is going to happen in your code, personally I don't really mind that my program has unpure things mixed with pure ones. (I like to chuck in a debug 'print' statement here and there). Of course, I can't prove my code is going to run correctly. But I don't really want that either, I just want to build stuff.&lt;br /&gt;&lt;br /&gt;For me, Erlang provides the perfect mix between functional and practical. So I'm going to stick to that probably. (But I'm notorious for changing my mind every week, so we'll have to see about that ;-) ) Erlang is easy enough to understand completely without straining my brain. It lacks some of the fancier functional stuff (and types unfortunately), but it makes up for that with OTP. I even like the syntax ;-).  Maybe I should try Prolog, or that new &lt;a href="http://www.mercury.csse.unimelb.edu.au/"&gt;Mercury&lt;/a&gt; language.  Oh, there I go changing my mind again...&lt;br /&gt;&lt;br /&gt;Anyway, my copy of 'Erlang Programming' arrived this week, I'm going to spend some quality time with it now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8824045107802859470?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8824045107802859470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8824045107802859470' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8824045107802859470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8824045107802859470'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/08/update-on-my-haskell-progress.html' title='Update on my Haskell progress.'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8004740909706396010</id><published>2010-07-12T18:33:00.000+02:00</published><updated>2010-07-12T18:33:55.683+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='OCaml'/><title type='text'>Another go at Haskell</title><content type='html'>My 2 weeks vacation is an ideal moment to squeeze in some Haskell again. I dismissed OCaml because of the GC and threading issues, but Haskell doesn't have those and is very similar to OCaml. I gave up on Haskell before because it seemed too hard. Maybe it is, I don't know, but having found the 'Haskell School of Expression' book got my interest up again. So far so good, I'm 95 pages in and all is well. ;-)&lt;br /&gt;That means for now my work on 'MUSQ' is on hold, but that certainly doesn't mean I gave up on it. I've got a whole notebook full of ideas for that game, I'm not going to let them go to waste. No more new-programming-language-resolutions this time. Just study Haskell some more and see if I can find value in it for me. And if I happen to pick a few new things up while I study, that'd be great ;-)&lt;br /&gt;Good thing there are a lot of good Haskell-resources online, it's certainly motivating to find a vibrant community in the field you're interested in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8004740909706396010?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8004740909706396010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8004740909706396010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8004740909706396010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8004740909706396010'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/07/another-go-at-haskell.html' title='Another go at Haskell'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2110191847806993646</id><published>2010-06-25T19:25:00.000+02:00</published><updated>2010-06-25T19:25:52.318+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='MUSQ'/><category scheme='http://www.blogger.com/atom/ns#' term='reading'/><title type='text'>Opened a BitBucket account</title><content type='html'>For all my hobby coding adventures I've now (well, some time ago, but only blogging now) opened a &lt;br /&gt;&lt;a href="http://bitbucket.org/gertm/"&gt;BitBucket account&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The main thing I'm working on now is a game called 'MUSQ'. It's a MUD-like text based adventure game that I'll write in Erlang. Development is slow, so don't expect hundreds of lines of code every week. ;-)&lt;br /&gt;&lt;br /&gt;I'm also reading 'Gödel, Escher, Bach' out of curiosity. I've heard so much about it, I want to know what it's all about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2110191847806993646?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2110191847806993646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2110191847806993646' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2110191847806993646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2110191847806993646'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/06/opened-bitbucket-account.html' title='Opened a BitBucket account'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3854569343316555110</id><published>2010-04-10T12:47:00.001+02:00</published><updated>2010-04-10T12:48:31.372+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Erlang setup for emacs -- helper function</title><content type='html'>I wrote a little function for my emacs setup so the Erlang stuff keeps working over different Erlang versions. I didn't want to update my config for every computer I have (a mix of 32 and 64 bit). It's written for Fedora because that's what I'm using, but I reckon it won't be much different on other distros.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;;; ==== ERLANG SETUP ====&lt;br /&gt;(defun erlang-setup ()&lt;br /&gt;  (if (and (file-exists-p "/usr/lib64/")&lt;br /&gt;    (file-exists-p "/usr/lib64/erlang"))&lt;br /&gt;      (setq erlang-basefolder "/usr/lib64/erlang")&lt;br /&gt;    (if (and (file-exists-p "/usr/lib/")&lt;br /&gt;      (file-exists-p "/usr/lib/erlang"))&lt;br /&gt; (setq erlang-basefolder "/usr/lib/erlang")))&lt;br /&gt;  (if erlang-basefolder&lt;br /&gt;      (progn&lt;br /&gt; (let ((lib-folder (concat erlang-basefolder "/lib")))&lt;br /&gt;   (dolist (fldr (directory-files lib-folder))&lt;br /&gt;     (if (and &lt;br /&gt;   (&gt; (length fldr) 6)&lt;br /&gt;   (string= (substring fldr 0 6) "tools-"))&lt;br /&gt;  (setq erlang-tools-dir (concat lib-folder (concat "/" fldr)))))&lt;br /&gt;   (setq load-path (cons (concat erlang-tools-dir "/emacs") load-path))&lt;br /&gt;   (setq erlang-root-dir erlang-basefolder)&lt;br /&gt;   (setq exec-path (cons (concat erlang-basefolder "/bin")  exec-path))&lt;br /&gt;   (require 'erlang-start)&lt;br /&gt;   (add-hook 'erlang-mode-hook 'highlight-parentheses-mode)))))&lt;br /&gt;&lt;br /&gt;(erlang-setup)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Emacs Lisp is kind of nice, I enjoyed writing this. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3854569343316555110?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3854569343316555110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3854569343316555110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3854569343316555110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3854569343316555110'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/04/erlang-setup-for-emacs-helper-function.html' title='Erlang setup for emacs -- helper function'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-1146444879451455370</id><published>2010-03-28T20:06:00.000+02:00</published><updated>2010-03-28T20:06:14.869+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comicgrab'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><title type='text'>Out with the new, in with the old!</title><content type='html'>Ok I'm sick of it now. Too many new languages in too little time.&lt;br /&gt;Getting to know all of these languages was fun, but now I actually want to make something.&lt;br /&gt;I ported my &lt;a href="http://code.google.com/p/comicgrab"&gt;comicgrab&lt;/a&gt; code to Erlang and I'm going to continue writing in Erlang. It has a nice growing community, lots of resources on the web, good documentation and books and most importantly these days; it doesn't give me a headache when I work with it for longer than an hour. &lt;br /&gt;I've blogged not so long ago that Erlang was 'too easy'. A lot of people misunderstood what I meant by that. I wanted a challenge in the form of 'solving an easy problem with a difficult to use tool'. &lt;br /&gt;Turns out all that does is give you a headache. So now I'm going to solve this not-so-easy-problem-when-you-think-about-it with an easy to use tool. Easier than all the other ones I've tried anyway. So out with all the new languages I won't use anyway, and in with the old Erlang I've already used for a couple of non-trivial things and have loved ever since.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-1146444879451455370?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/1146444879451455370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=1146444879451455370' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1146444879451455370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1146444879451455370'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/03/out-with-new-in-with-old.html' title='Out with the new, in with the old!'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-7094285284130154693</id><published>2010-03-26T16:51:00.001+01:00</published><updated>2010-03-26T16:52:15.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perhaps'/><category scheme='http://www.blogger.com/atom/ns#' term='maybe'/><title type='text'>The problem with language hopping</title><content type='html'>is that I never stay in one language long enough to really get to know it. I've tried so many of them and yet every time I want to try something shiny and new once I get a glimpse of what the language is all about. Erlang and Lisp, those two I've done some reasonable time in, but not enough to really be calling myself an Erlanger or a Lisper.&lt;br /&gt;&lt;br /&gt;Come to think of it, it's only in C# I can safely say I have 'experience' in. Even in that one I'm still learning new stuff (almost) every day. It's a language I was 'forced' to use at work, but as time goes by, I'm more and more enjoying it because I know it quite well. That's probably what it feels like to 'know' a language.&lt;br /&gt;&lt;br /&gt;Perhaps the more important thing is actually programming stuff that does something useful instead of looking for the holy grail of programming languages to write stuff in that does something useful. &lt;br /&gt;&lt;br /&gt;Maybe I should just switch to Mono and get stuff done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-7094285284130154693?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/7094285284130154693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=7094285284130154693' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7094285284130154693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7094285284130154693'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/03/problem-with-language-hopping.html' title='The problem with language hopping'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3324635335582304502</id><published>2010-02-18T16:18:00.001+01:00</published><updated>2010-02-18T16:31:05.117+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional language'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='Factor'/><title type='text'>Trying Factor</title><content type='html'>Yes, I caved. I picked up yet another language.&lt;br /&gt;&lt;br /&gt;This time it's &lt;a href="http://factorcode.org"&gt;Factor&lt;/a&gt;. It's a stack-based language, in the line of Forth and Joy. It's extremely well documented and there are tons of libraries considering how young the language is.&lt;br /&gt;&lt;br /&gt;Thinking stack-based is a completely new way of thinking for me, but I'm enjoying it so far.&lt;br /&gt;&lt;br /&gt;Of course I had to write my little twitter search application as a testcase. (nice test for libraries and easy of creating glue-code).&lt;br /&gt;&lt;br /&gt;I think it's one of the nicer once I've ever written..&lt;br /&gt;&lt;br /&gt;Without furter ado, here is it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;! Copyright (C) 2010 Gertm.&lt;br /&gt;! See http://factorcode.org/license.txt for BSD license.&lt;br /&gt;USING: accessors assocs http.client io json.reader kernel prettyprint&lt;br /&gt;sequences ;&lt;br /&gt;IN: twitsearch&lt;br /&gt;&lt;br /&gt;CONSTANT: searchurl "http://search.twitter.com/search.json?q="&lt;br /&gt;&lt;br /&gt;: make-json ( response data -- x ) nip json&gt; ;&lt;br /&gt;&lt;br /&gt;: get-tweet-hsh ( x -- x ) "results" swap at ;&lt;br /&gt;&lt;br /&gt;: search ( string -- x ) searchurl&lt;br /&gt;    prepend http-get nip json&gt; get-tweet-hsh ;&lt;br /&gt;&lt;br /&gt;: print-with-prefix ( prefix string -- ) append print ;&lt;br /&gt;&lt;br /&gt;: print-field ( hsh field prefix -- ) [ swap at ] dip print-with-prefix ;&lt;br /&gt;&lt;br /&gt;: print-from ( x -- ) "from_user" "From: " print-field ;&lt;br /&gt;&lt;br /&gt;: print-text ( x -- ) "text" "&gt;&gt; " print-field ;&lt;br /&gt;&lt;br /&gt;: tweet ( x -- ) [ print-from ] [ print-text ] bi ;&lt;br /&gt;&lt;br /&gt;: results ( x -- ) search [ tweet ] each ;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Thanks to the great guys in #concatenative on Freenode, I was able to clean it up a bit and learn some Factor idioms. (Slava, the creator of the language, was one of the guys helping out. Very cool!)&lt;br /&gt;&lt;br /&gt;In a way, Factor reminds me a lot of Lisp. I can't explain it yet, but I get the same feel when coding. To me this is a good thing, Lisp was the most fun language I've tried in the past.&lt;br /&gt;It's probably because Lisp was a big influence for Factor.&lt;br /&gt;&lt;br /&gt;Let's see how long this new-acquired Factor-Fad lasts ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3324635335582304502?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3324635335582304502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3324635335582304502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3324635335582304502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3324635335582304502'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/02/trying-factor.html' title='Trying Factor'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2547773691398898806</id><published>2010-02-10T10:16:00.001+01:00</published><updated>2010-02-10T10:16:59.490+01:00</updated><title type='text'>How to use OCamlnet's in_obj_channel and out_obj_channel</title><content type='html'>No, I still haven't given up on OCaml.. ;-)&lt;br /&gt;&lt;br /&gt;Here's a quick howto on how to go from server-ip and port to in_obj_channel and out_obj_channel.&lt;br /&gt;It's really quite simple, but this might save you half an hour of searching:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(* You need these two modules *)&lt;br /&gt;open Netchannels;;&lt;br /&gt;open Netpop;;&lt;br /&gt;&lt;br /&gt;(* this function opens a connection to a server with the &lt;br /&gt; * Pervasives.in_channel and out_channel&lt;br /&gt; *)&lt;br /&gt;let open_con server port =&lt;br /&gt;  let server_addr = Unix.inet_addr_of_string server in&lt;br /&gt;  let sockaddr = Unix.ADDR_INET(server_addr,port) in&lt;br /&gt;    Unix.open_connection sockaddr&lt;br /&gt;&lt;br /&gt;(* This converts Pervasives channels to &lt;br /&gt; * Netchannels.in_obj_channel and out_obj_channel &lt;br /&gt; *)&lt;br /&gt;let perv_to_obj (in_c,out_c) =&lt;br /&gt;  let oic = new input_channel in_c in&lt;br /&gt;  let ooc = new output_channel out_c in&lt;br /&gt;    (oic,ooc)&lt;br /&gt;&lt;br /&gt;(* the simply use both functions we just wrote to&lt;br /&gt; * connect with server and port, getting a tuple:&lt;br /&gt; * in_obj_channel * out_obj_channel as return value&lt;br /&gt; *)&lt;br /&gt;let open_obj_con server port =&lt;br /&gt;  let channels = open_con server port in&lt;br /&gt;    perv_to_obj channels&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I needed this because I want to write some POP3 stuff with the Netpop library.&lt;br /&gt;&lt;br /&gt;Hope this helps someone! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2547773691398898806?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2547773691398898806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2547773691398898806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2547773691398898806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2547773691398898806'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/02/how-to-use-ocamlnets-inobjchannel-and.html' title='How to use OCamlnet&apos;s in_obj_channel and out_obj_channel'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-5410896685652425288</id><published>2010-01-01T14:33:00.001+01:00</published><updated>2010-01-01T14:35:03.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional language'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='F#'/><category scheme='http://www.blogger.com/atom/ns#' term='OCaml'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Lessons learned from learning new programming languages</title><content type='html'>2009 has been quite the year for me when it comes to programming languages. I've managed to start learning a couple of them, some more seriously than others. I still get some non-trivial stuff out in most of them. I'll give a little rundown of them and my thoughts on them. Please note that these are purely personal views, but I would appreciate any feedback that would make using these languages a better experience.&lt;br /&gt;&lt;br /&gt;In chronological order I've worked with and tried:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Common Lisp (actually started that in 2008)&lt;/li&gt;&lt;li&gt;Haskell&lt;/li&gt;&lt;li&gt;Erlang&lt;/li&gt;&lt;li&gt;Scala&lt;/li&gt;&lt;li&gt;F#&lt;/li&gt;&lt;li&gt;OCaml&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Common Lisp&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Those of you who are following this blog know that I've started with Lisp over a year ago. It's been a very pleasant and enriching experience. I love the parentheses because they just 'disappear' when you get the hang of them. I've toyed with macros and though I didn't get all that far with them, I can see the potential that's there. I've even 'missed' that potential in other languages I've used since then. The SLIME environment in Emacs is awesome, makes for a great programming experience. But then there's the libraries in Common Lisp. I've blogged about this before, but since then some new ways of doing libraries in CL seem to have emerged. Though I fear the original problem of the libraries is still there because there's so many ways of managing libraries and mixing them together makes stuff even worse. This is my only real gripe with CL. If the libraries were just a little better and contained in one central place...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Haskell&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This is/was the hot new thing. Reddit/Hacker News are filled with posts about Haskell. So I decided to learn it. The syntax is very clear, it's easy to read once you understand it. (no I'm not contradicting myself in that sentence)&lt;br /&gt;Good community, great IRC channel (important for me), lots of libraries are more strong points. Pattern matching! My god, I cannot live without it anymore. List comprehensions... what a joy!&lt;br /&gt;I was so excited about Haskell, until I tried to write something useful. I get the whole safety and purity thing, I think it's great, but it gets in the way of actually creating programs that you use. Maybe I haven't studied it long enough (this might be the theme of this blog post now that I think of it) but it's a little too hard to make stuff in right away. I think I understand Monads, but that in itself isn't a great sign, because I'm not entirely sure. Probably, with (a lot?) more effort I'd be able to use Haskell as my primary language. Is that effort worth it to me? Not at this time no.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Erlang&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;What a breeze. Compared to Haskell, this was so easy to learn. Of course, learning a lot of the functional idioms with Haskell has helped a lot. I'd imagine Erlang being a lot harder to learn for someone with absolutely no experience with functional programming.&lt;br /&gt;The syntax is a bit strange, but you get used to it quickly. A lot of libraries out of the box, tons of useful stuff in there. The Emacs mode does exactly what it needs to do to facilitate coding. Erlang is made for fault-tolerance and concurrency and those things are spectacularly easy to do with it. I made a little test program (rss feed grabber) with the supervisor behaviour and let it run on my server. I actually forgot about it and when I logged back in after a week and a half, it was still running happily. My internet went down a couple of times, but the little program did exactly what it needed to do and was still doing it.&lt;br /&gt;So what do I not like about Erlang? I'm not sure. It's like it's so easy to use, the challenge of writing 'clever' code is gone. Haskell is too much of a challenge, it feels like Erlang is not enough of a challenge.&lt;br /&gt;I've written a couple of non-trivial things with Erlang, including a couple of web-apps with Yaws. No complaints, everything works like I want it to. But there was no challenge. This is a good thing of course, because the goal is to write stuff that you're going to use later on. Then why do I lack the feeling that I've accomplished something? I love doing things that are a little harder, but Erlang has a strange way of making almost everything easy. If I ever start a programming business, Erlang would be my language of choice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scala&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I didn't do a lot of Scala. It's subjective and perhaps stupid, but I just don't like how Scala presents itself on my screen. I've never liked curly braces to start with and Scala's syntax looks so forced. Scala does have a lot of potential, I'll have to admit. It has all the features you can dream of, it's fast and with the JVM as the platform, you can use it almost anywhere. I just don't like how it looks.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;F# and OCaml&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm taking these two as one, since they're so similar. I'm only starting out with OCaml &amp;nbsp;but I like what I see so far. The syntax is nice enough for me. Most of the functional stuff I know from the previous languages are available, without being paranoid about purity. For now, it seems to me that OCaml is halfway between Erlang and Haskell when it comes to 'challenge' level. So I wonder if it's worth it to keep learning. Use OCaml at home and F# at work, that's the plan. Not sure if they will beat the practicality of Erlang. OCaml is faster, but speed is not the main requirement. Having fun while writing stuff is the main goal for me really, now that I think of it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I'm going to have to stop jumping from one language to the other and focus on a single one. That's the only way I'll really 'know' that language. Problem is I can't decide because I'm afraid to make the wrong choice. I did learn a lot of new concepts and idioms, so I feel this journey was fruitful nonetheless. But it's time to settle down and really get to know one language. But which one?&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Maybe &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;I can try Factor&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;or even Perl.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Clean looks nice,&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;or what about...&lt;/span&gt;&lt;span style="font-size: x-small;"&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-5410896685652425288?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/5410896685652425288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=5410896685652425288' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/5410896685652425288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/5410896685652425288'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2010/01/lessons-learned-from-learning-new.html' title='Lessons learned from learning new programming languages'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2970914025825557838</id><published>2009-12-22T16:41:00.002+01:00</published><updated>2009-12-22T17:24:48.462+01:00</updated><title type='text'>On a different note...</title><content type='html'>You guys are probably already bored of hearing what language I'm trying now.&lt;div&gt;But this one deserves a little bit of attention!  I gave up on Scala, it's just not for me, it doesn't feel right. While a friend chose it as his main language for all his hobby projects, it's really not for me. It just doesn't feel right.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I did however, try F# and I'm getting quite fond of it. Resembling Haskell and OCaml, I find it to be almost everything I was looking for in a language:&lt;/div&gt;&lt;div&gt;Not too hard to use, functional and practical. The downside is that I don't have access to Visual Studio on Linux, but since I'm going to use F# mainly for projects at work, it doesn't bother me that much.&lt;/div&gt;&lt;div&gt;The interop between C# and F# is great. I can make a library in one language and load it in the other language. No fuss, no witchcraft, it just works.&lt;/div&gt;&lt;div&gt;Considering my job is 90% C#, F# is very promising for me. I can re-use all the libraries I've written and use new ones I write in F# in my old code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So in the near future, if I need new functionality or a new library at work, I'm going to see if I can't write it in F#. That way I can do both functional programming and my work ;-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2970914025825557838?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2970914025825557838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2970914025825557838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2970914025825557838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2970914025825557838'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/12/on-different-note.html' title='On a different note...'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-1938117786422970524</id><published>2009-10-09T17:39:00.003+02:00</published><updated>2009-10-09T17:56:02.638+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional language'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='erlang'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='scheme'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>This is getting ridiculous</title><content type='html'>It seems like my never ending journey through functional programming languages has taken yet another turn.&lt;br /&gt;&lt;br /&gt;Together with a colleague I'm going to start working on a 'Street Fighter'-ish game. We've been both very fond of this (and play it a lot) and decided to make one ourselves.&lt;br /&gt;&lt;br /&gt;The first thing programmers will debate is what programming language to use.&lt;br /&gt;Ofcourse my suggestion was Erlang (since that's what I'm currently using and loving), but we both quickly realized that Erlang might not be the best choice for this. Since we're probably going to use 3D, we need all the speed we can get.&lt;br /&gt;Both of us are big fans of functional programming and are toying around with various languages (Lisp, Haskell, Erlang, Scheme...) we quickly agreed on doing this in a functional language.&lt;br /&gt;So what do we need? A fast language with good libraries. Ofcourse, Haskell came to mind. It fits both those requirements. Scheme perhaps? Nah, too slow for this kind of thing. Another candidate is Scala. It's also fast, it's multi-paradigm, and last but not least, it has the java libs which are positively huge. Clojure maybe? It's a lisp-1, we both have experience with Lisp so that could be cool. It also has the java libs. It's dynamicly typed, which is nice but could have an impact on performance. (I really should get benchmarks for this).&lt;br /&gt;&lt;br /&gt;To make a short story even shorter: we decided to use Scala.&lt;br /&gt;The decision wasn't hard to take. Scala has all the features we need, it has the speed needed for this kind of thing and all the libraries we'd ever want and then some...&lt;br /&gt;&lt;br /&gt;So there you have it. I'm going to learn yet another language. &lt;br /&gt;&lt;br /&gt;"Learn a new language every year!", is what a lot of big names say. Well, every 2 months is more like what I'm doing. I feel like it's time to settle down. I want to pick 1 good language that I like and grok. Not have a dozen languages I barely know. This project will be good experience, in whatever language it is. It's probably going to be bigger than anything I've ever written, including the stuff I code for work. That's probably the most gaping hole in my short carreer as a programmer. I've never worked on a large project. I hope this will be a nice introduction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-1938117786422970524?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/1938117786422970524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=1938117786422970524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1938117786422970524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1938117786422970524'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/10/this-is-getting-ridiculous.html' title='This is getting ridiculous'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2817271530053328353</id><published>2009-09-15T20:30:00.004+02:00</published><updated>2009-09-15T20:40:53.491+02:00</updated><title type='text'>Finished my 'hello world' in Erlang.</title><content type='html'>All it took was 3 days of catching up on Erlang programming and 17 lines of code and tadaaa.. I have the little twitter search app I wanted to make.&lt;br /&gt;&lt;br /&gt;Erlang is really nice. It was fairly easy to write the little twitter app, with a little help from a JSON lib I found. (mochijson2 also used in CouchDB, so I hear)&lt;br /&gt;I'm going to miss pattern matching when I code in some other language. It makes things so much easier and clearer.&lt;br /&gt;&lt;br /&gt;I haven't had this much fun programming since I made my last web-app in Lisp.&lt;br /&gt;&lt;br /&gt;Next up: re-write that same web-app in Erlang.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The little app probably has lots of room for improvements, refactoring, cleaning up and is probably not the best Erlang style, but it works! :D&lt;br /&gt;I'm very impressed with how easy this was to write.&lt;br /&gt;&lt;br /&gt;I called it 'twitt' so the filename would be 'twitt.erl'..&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-module(twitt).&lt;br /&gt;-compile(export_all).&lt;br /&gt;&lt;br /&gt;get_search(Search) -&gt;&lt;br /&gt;    application:start(inets),&lt;br /&gt;    {ok,{_,_,Json}} = &lt;br /&gt;      http:request("http://search.twitter.com/search.json?q="++Search),&lt;br /&gt;    show_tweets(make_tweetlist(Json)).&lt;br /&gt;&lt;br /&gt;get_entries_from_json({struct,[Results|_]}) -&gt;&lt;br /&gt;    Results;&lt;br /&gt;get_entries_from_json(_) -&gt;&lt;br /&gt;    fail.&lt;br /&gt;&lt;br /&gt;make_tweetlist(Json) -&gt;&lt;br /&gt;    element(2,get_entries_from_json(mochijson2:decode(Json))).&lt;br /&gt;&lt;br /&gt;print_tweet({struct,[{_,_Image},{_,_Created},&lt;br /&gt;{_,From},{_,_ToUId},{_,Text},{_,_Id},{_,_FromUId},{_,_IsoLang},{_,_Source}]}) -&gt;&lt;br /&gt;    io:format("From: ~p~n-- ~p~n",[binary_to_list(From),binary_to_list(Text)]);&lt;br /&gt;print_tweet(_) -&gt; fail.&lt;br /&gt;&lt;br /&gt;show_tweets(TweetList) -&gt;&lt;br /&gt;    [ print_tweet(X) || X &lt;- TweetList ].&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2817271530053328353?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2817271530053328353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2817271530053328353' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2817271530053328353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2817271530053328353'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/09/finished-my-hello-world-in-erlang.html' title='Finished my &apos;hello world&apos; in Erlang.'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2705419517096241200</id><published>2009-09-10T11:46:00.002+02:00</published><updated>2009-09-10T11:51:55.351+02:00</updated><title type='text'>No more headaches.</title><content type='html'>I'm giving up on Haskell.&lt;br /&gt;It's too hard. I just want to write applications that do stuff. Not theorize about how they work and proving whether they work and all that.&lt;br /&gt;Not a bad word about it otherwise though. It's a great language to read, because once you know the syntax, it's actually very easy to read.&lt;br /&gt;&lt;br /&gt;It was a good eye-opener for me. but I'm not convinced I need something more practical.&lt;br /&gt;&lt;br /&gt;Sticking with functional programming languages though, I'm now going to give Erlang a try. Wish me luck!&lt;br /&gt;&lt;br /&gt;(this is turning out to be the quest for the holy gr..programming language. It doesn't exist, but I'm going to look for it anyway! :p)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2705419517096241200?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2705419517096241200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2705419517096241200' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2705419517096241200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2705419517096241200'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/09/no-more-headaches.html' title='No more headaches.'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8601199248219787927</id><published>2009-08-16T19:20:00.005+02:00</published><updated>2009-09-10T11:53:12.292+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='xmonad'/><title type='text'>Diving in even deeper.</title><content type='html'>I'm almost finished with 'Learn You a Haskell For Great Good'. (gotta love the name)&lt;br /&gt;After this it's on to 'Real World Haskell'. I ordered it in dead-tree form and hope to have it before I finish the first book.&lt;br /&gt;To further soak myself in Haskell, I've decided to switch to XMonad as my window manager. The fact that I had a lot of trouble getting StumpWM running on my freshly reinstalled laptop (x86_64 this time) helped a lot ofcourse.&lt;br /&gt;(I'm staying on the stumpwm IRC channel though, I love those guys ;-) )&lt;br /&gt;'The Pragmatic Programmer' tells us to learn a new language every year. Well for me, that's about true in the last couple of years. But frankly, I'm not looking to learn a couple dozen new languages, I'm trying to find one I really like and can be used for practical problems.&lt;br /&gt;Haskell isn't really a language that seems very practical at first glance. But little by little, it's practical side is showing and I'm guessing there's a lot more to come. I'll give it a while. If I can't get stuff done with it, I'll continue my search :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8601199248219787927?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8601199248219787927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8601199248219787927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8601199248219787927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8601199248219787927'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/08/diving-in-even-deeper.html' title='Diving in even deeper.'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-4657936630629211024</id><published>2009-08-08T21:08:00.003+02:00</published><updated>2009-08-16T19:33:42.711+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Picking up Haskell</title><content type='html'>I've been reading so much about Haskell lately, it started to annoy me. When that happens I felt like I had two options:&lt;br /&gt;&lt;br /&gt;1. Ban everything Haskell from my newsfeeds.&lt;br /&gt;2. Learn it just to see what the fuss is about.&lt;br /&gt;&lt;br /&gt;Obviously I've chosen the latter.&lt;br /&gt;It's not that I don't like Lisp anymore, far from it! But a couple of blog posts have made me think about learning a 'current' functional language. Something shiny, something that can cope with all the buzzwords (concurrency and whatnot)...&lt;br /&gt;&lt;br /&gt;So I decided to give it a go. I've been reading the excellent, excellent &lt;a href="http://learnyouahaskell.com/"&gt;Learn You a Haskell For Great Good&lt;/a&gt;. (I cannot emphasize enough how good this book is. It's not even finished yet but I already tried to pre-order the print version of it.)&lt;br /&gt;&lt;br /&gt;At first glance, Haskell seems very complicated. All those little arrows, double colons, pipes,.. very syntax heavy. Using Lisp for about a year now I've grown very fond of almost no syntax at all.&lt;br /&gt;Still, I decided to give it a chance and started reading. After a couple of pages I was already going "Hmm this isn't so bad afterall...".&lt;br /&gt;They had me at list comprehensions and pattern matching. It's like reading a mathematical definition. Only, you can execute it too! Haskell is filled with flashy words too.. currying, partial application, functors, monads. While I haven't had the (I assume) pleasure to read up on monads, all the other words are just a fancy name for a fairly straightforward concept...&lt;br /&gt;Also, Haskell forces you to think functionally, while Lisp only encouraged it. I've caught myself several times writing  in an imperative fashion in Lisp. (Old habits I guess...).&lt;br /&gt;I'm really looking forward to be proficient in a functional language.&lt;br /&gt;&lt;br /&gt;Anyway, long story short, I really like Haskell so far. I've already seen glimpses of how it can also be practical.&lt;br /&gt;I must admit I'm more excited about learning Haskell then I was about learning Lisp. And I already thought Lisp was the best thing since sliced bread.&lt;br /&gt;&lt;br /&gt;We'll see how it goes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-4657936630629211024?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/4657936630629211024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=4657936630629211024' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4657936630629211024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4657936630629211024'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/08/picking-up-haskell.html' title='Picking up Haskell'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8810711290809038185</id><published>2009-07-28T17:37:00.004+02:00</published><updated>2009-08-16T19:34:47.791+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Rewriting a function</title><content type='html'>I just rewrote some functionality in some code I do to make it prettier in the source code:&lt;br /&gt;&lt;br /&gt;With a macro:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defmacro with-replace-all (regex new &amp;amp;rest body)&lt;br /&gt;`(cl-ppcre:regex-replace-all ,regex ,@body ,new))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;With a recursive function (this is the 'rewrite')&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun replace-all (old-new-list text)&lt;br /&gt;(if (not old-new-list)&lt;br /&gt;  text&lt;br /&gt;  (let ((old-new (car old-new-list)))&lt;br /&gt;(replace-all (cdr old-new-list) (cl-ppcre:regex-replace-all (car old-new) text (cadr old-new))))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The original function that used the macro: (removed the html for easy editing in blogger)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun color-format (str)&lt;br /&gt;(with-replace-all "\\(" "html stuff.."&lt;br /&gt;(with-replace-all "\\]" "html stuff.."&lt;br /&gt;(with-replace-all "\\[" "html stuff.."&lt;br /&gt;(with-replace-all "\\)" "html stuff.."&lt;br /&gt;(with-replace-all "\(\".*?\"\)" "html stuff.."&lt;br /&gt;(with-replace-all "," "html stuff.."&lt;br /&gt;(with-replace-all "\\|\(gt[[_xA-Z0-9]+\)" "more html stuff.."&lt;br /&gt;(with-replace-all "\([^\\]] gt[_xA-Z0-9]+\)" "more html stuff.."&lt;br /&gt;(with-replace-all "\(gtV(\\d+?)x(\\d+?)x(\\w*)\)" "more html stuff.."&lt;br /&gt; str))))))))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Not very pretty, is it?&lt;br /&gt;&lt;br /&gt;The new function that uses the rewritten function:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun new-color-format (str)&lt;br /&gt;(replace-all '(("\(gtV(\\d+?)x(\\d+?)x(\\w*)\)" "html..")&lt;br /&gt;  ("\([^\\]] gt[_xA-Z0-9]+\)" "html..")&lt;br /&gt;  ("\\|\(gt[[_xA-Z0-9]+\)" "html..")&lt;br /&gt;  ("," "html..")&lt;br /&gt;  ("\(\".*?\"\)" "html..")&lt;br /&gt;  ("\\)" "html..")&lt;br /&gt;  ("\\[" "html..")&lt;br /&gt;  ("\\]" "html..")&lt;br /&gt;  ("\\(" "html.."))&lt;br /&gt;       str))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It looks a little better, there are less dangling parens at the end, I was pleased with myself.&lt;br /&gt;Until I did this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (time (color-format "[-1] gtTerminalInit(0);"))&lt;br /&gt;Evaluation took:&lt;br /&gt;0.001 seconds of real time&lt;br /&gt;0.000000 seconds of total run time (0.000000 user, 0.000000 system)&lt;br /&gt;0.00% CPU&lt;br /&gt;&lt;b&gt;219,648 processor cycles&lt;/b&gt;&lt;br /&gt;4,016 bytes consed&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (time (new-color-format "[-1] gtTerminalInit(0);"))&lt;br /&gt;Evaluation took:&lt;br /&gt;0.001 seconds of real time&lt;br /&gt;0.000000 seconds of total run time (0.000000 user, 0.000000 system)&lt;br /&gt;0.00% CPU&lt;br /&gt;&lt;b&gt;1,389,540 processor cycles&lt;/b&gt;&lt;br /&gt;15,984 bytes consed&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Recursion is nice, but it's 6 times as much work for the CPU?&lt;br /&gt;&lt;br /&gt;Please help me out here if I made mistakes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8810711290809038185?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8810711290809038185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8810711290809038185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8810711290809038185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8810711290809038185'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/07/rewriting-function.html' title='Rewriting a function'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2910895160313713750</id><published>2009-06-29T17:48:00.004+02:00</published><updated>2009-07-28T20:25:57.176+02:00</updated><title type='text'>My next platform</title><content type='html'>I'm not sure what it's going to be, but I know the next platform for a programming project is going to be emacs.&lt;br /&gt;It has all the stuff you need to write all sorts of applications. Entire mail clients are written in it, you can ftp from it, there's stuff to organize your life like org-mode, calendars, calculators, games, I could go on until my fingers hurt.&lt;br /&gt;&lt;br /&gt;Ofcourse Emacs Lisp isn't Common Lisp but I doubt I'll really notice that much difference. There is however the difference in scope. I'm quite curious to see how that turns out to influence my coding.&lt;br /&gt;&lt;br /&gt;I've been trying to get all of my 'stuff' into emacs, but it's not working out exactly as I want. I'm using it for IRC, twitter and org-mode at the moment. I'm still struggling with email. I've worked with gnus for a while and while it's not that bad, it's not exactly smooth sailing either. Maybe I need to read up in the manual a bit first.&lt;br /&gt;&lt;br /&gt;This programming project is probably going to be something for my GTD in emacs. I've been looking for a way to do the 43 folders thingy, but can't find anything really useful in emacs. Maybe I'll try my hand at creating one myself.&lt;br /&gt;&lt;br /&gt;Emacs already is my number one tool in Linux, perhaps it'll be my number one programming platform in the future?&lt;br /&gt;&lt;br /&gt;Edit: I'm also considering StumpWM as a platform. The nice thing is, it's real CL!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2910895160313713750?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2910895160313713750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2910895160313713750' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2910895160313713750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2910895160313713750'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/06/my-next-platform.html' title='My next platform'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-534454162308736186</id><published>2009-06-11T20:48:00.004+02:00</published><updated>2009-06-12T08:43:45.930+02:00</updated><title type='text'>My little Gnus and Gmail howto</title><content type='html'>I've been looking for a while to centralize all my common tasks in emacs.&lt;br /&gt;So far I've been able to do these:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IRC with ERC&lt;/li&gt;&lt;li&gt;Twitter with twit.el&lt;/li&gt;&lt;li&gt;Email with Gnus&lt;/li&gt;&lt;/ul&gt;The ERC and twitter part are easy, but if you're interested, drop me a line and I'll make another post. (I made ERC behave just enough like irssi to make the transition painless for me)&lt;br /&gt;&lt;br /&gt;Gnus is great because it comes with emacs. No extra installing needed.&lt;br /&gt;I use a Gmail account for almost everything I do, so it's only logical I'd use that one in Gnus. There are lots of nice tutorials online on how to configure Gnus with Gmail or with IMAP. I had to read a couple and get the best parts from each to get my own config.&lt;br /&gt;I made a little file that loads only when it exists. This is handy for sharing my config over multiple computers.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(if (file-exists-p "~/.emacs.d/local.el")&lt;br /&gt;    (load "~/.emacs.d/local.el"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This file contains the Gnus config:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;; LOCAL FILE FOR LOADING LOCAL STUFF!                                                                                                                         &lt;br /&gt;&lt;br /&gt;;; got this line from one of the tutorials. Seemed interesting enough&lt;br /&gt;(setq gnus-invalid-group-regexp "[:`'\"]\\|^$")&lt;br /&gt;&lt;br /&gt;;; standard way of getting imap going&lt;br /&gt;(setq gnus-select-method &lt;br /&gt;         '(nnimap "gmail"&lt;br /&gt;          (nnimap-address "imap.gmail.com")&lt;br /&gt;          (nnimap-server-port 993)&lt;br /&gt;          (nnimap-stream ssl)))&lt;br /&gt;&lt;br /&gt;;; set up smtp so we can send from gmail too:&lt;br /&gt;(setq message-send-mail-function 'smtpmail-send-it&lt;br /&gt;      smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))&lt;br /&gt;      smtpmail-auth-credentials '(("smtp.gmail.com" 587 "myemailaddy@gmail.com" nil))&lt;br /&gt;      smtpmail-default-smtp-server "smtp.gmail.com"&lt;br /&gt;      smtpmail-smtp-server "smtp.gmail.com"&lt;br /&gt;      smtpmail-smtp-service 587)&lt;br /&gt;&lt;br /&gt;;;http://www.emacswiki.org/cgi-bin/wiki/GnusGmail                                                                                                              &lt;br /&gt;;;http://linil.wordpress.com/2008/01/18/gnus-gmail/                                                                                                            &lt;br /&gt;&lt;br /&gt;(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)&lt;br /&gt;&lt;br /&gt;;; Threads are nice!&lt;br /&gt;(setq gnus-summary-thread-gathering-function&lt;br /&gt;      'gnus-gather-threads-by-subject)&lt;br /&gt;&lt;br /&gt;(setq gnus-posting-styles&lt;br /&gt;       '((".*"&lt;br /&gt;          (name "Gert M")&lt;br /&gt;          ("X-URL" "http://gertm.blogspot.com/"))))&lt;br /&gt;&lt;br /&gt;(setq user-full-name "Gert")&lt;br /&gt;(setq user-mail-address "myemailaddy@gmail.com")&lt;br /&gt;(setq send-mail-function 'smtpmail-send-it)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When loading Gnus the first time, in the folder window press 'S s' and type in the names of the folders you want to see.&lt;br /&gt;&lt;br /&gt;That's all there is to it.&lt;br /&gt;&lt;br /&gt;Now I just need to learn how to configure this more to my liking.&lt;br /&gt;&lt;br /&gt;Hope this helps someone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Update: &lt;/span&gt;&lt;br /&gt;In the folder view, checking for new mail on a group is done with M-g&lt;br&gt;&lt;br /&gt;If you set the level of the groups you want to check regularly, you can check them together: &lt;br&gt;&lt;br /&gt;In the group view, put the cursor on a group and do:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;S l 1   &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to put it to level 1. After you've done this for a couple of groups do this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1 g&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will check for new message on all groups with level 1.&lt;br /&gt;&lt;br /&gt;I'll update here some more after I find new interesting stuff!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-534454162308736186?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/534454162308736186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=534454162308736186' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/534454162308736186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/534454162308736186'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/06/my-little-gnus-and-gmail-howto.html' title='My little Gnus and Gmail howto'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-1958940117906709679</id><published>2009-05-09T19:17:00.005+02:00</published><updated>2009-05-10T17:20:05.540+02:00</updated><title type='text'>Trying out Midori and loving it</title><content type='html'>&lt;div&gt;&lt;div&gt;Firefox has been giving me hard times the last weeks with frequent lockups (albeit short ones) on Google Reader and screwups on YouTube (sound not playing, video garbled).&lt;/div&gt;&lt;div&gt;I've thought about Opera, but not too long. It's a good browser and all, but I was eager to try something new, something based on WebKit.&lt;/div&gt;&lt;div&gt;I searched for the available options and Midori came out on top since I only have GTK installed (and wasn't going to get Qt).&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.twotoasts.de/index.php?/pages/midori_summary.html"&gt;Midori&lt;/a&gt; is a GTK browser based on WebKit. I've been testing it these past couple of days and I must say, I'm growing quite fond of it.&lt;div&gt;It's fast and responsive, has a lot of great features and is quite simple to configure. &lt;/div&gt;&lt;div&gt;&lt;div&gt;The sad thing is though, lots of sites have built-in checks to see if the browser you're using is capable of displaying their special feature correctly.&lt;/div&gt;&lt;div&gt;For example: I was surfing amazon.com and I wanted to take a look inside one of the books. I got redirected to a page that told me my browser wasn't capable of doing this. I realize these sites do this in order to ensure maximum compatibility for their users, but I really wanted to see if Midori could do this. So I switched the 'Identify as' to 'internet explorer', shuddered lightly and reloaded the page. &lt;/div&gt;&lt;div&gt;It worked perfectly. I'm probably going to set the 'report as' to Firefox as a default, just to keep it in the right circles.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Too bad this way Midori won't get the love it deserves in the browser stats.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-1958940117906709679?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/1958940117906709679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=1958940117906709679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1958940117906709679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1958940117906709679'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/05/trying-out-midori-and-loving-it.html' title='Trying out Midori and loving it'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3822698567175206361</id><published>2009-05-07T17:22:00.004+02:00</published><updated>2009-05-08T17:06:41.993+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='studying'/><category scheme='http://www.blogger.com/atom/ns#' term='summary'/><category scheme='http://www.blogger.com/atom/ns#' term='blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='understand'/><title type='text'>Blogging as a way of better understanding.</title><content type='html'>Reading documentation can be a real pain sometimes. 50 lines in, the mind can wander to other places. IM/Twitter/RSS feeds are calling... they're so much more fun to read than documentation.&lt;br /&gt;&lt;br /&gt;I'm going to try to use this blog to make recaps of documentation I'm reading.  By blogging (writing in general) and thus 'actively reading', I hope to be more efficient at reading docs.&lt;br /&gt;&lt;br /&gt;I guess it's like studying, where I used to make summaries of all my courses. Those really helped me understanding what the course was about.&lt;br /&gt;&lt;br /&gt;But I'm no longer in school and I've got web 2.0 now, I guess I'll try it this way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3822698567175206361?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3822698567175206361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3822698567175206361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3822698567175206361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3822698567175206361'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/05/blogging-as-way-of-better-understanding.html' title='Blogging as a way of better understanding.'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2107055989924928688</id><published>2009-05-07T16:47:00.015+02:00</published><updated>2009-05-11T14:48:31.513+02:00</updated><title type='text'>Installing and configuring Bacula on Gentoo</title><content type='html'>The backup system I wrote at work has one major shortcoming. It can't write multiple volumes. Instead of extending it so it supports that, I've decided to install Bacula on the fileserver and let that handle the tape backups.&lt;br /&gt;&lt;br /&gt;This blog post is a report of how I installed and configured &lt;a href="http://www.bacula.org/en/"&gt;Bacula&lt;/a&gt; on the server.&lt;br /&gt;(I'm going to add to this post as I go, because I'll probably not be able to do this all in one day.)&lt;br /&gt;It'll also be a small recap of the Bacula documentation as I go over it. Mostly for future reference in case I need to repeat this installation.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Installing&lt;/h3&gt;Well what can I say, it's Gentoo, so it was basicly just 'emerge bacula'.&lt;br /&gt;I did however add this line to /etc/portage/package.use:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;app-backup/bacula bacula-console sqlite3 readline&lt;/blockquote&gt;To have the (for my installation) correct options installed.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Configuring&lt;/h3&gt;Before actually configuring, knowing what to configure could help.&lt;br /&gt;Reading up on the &lt;a href="http://www.bacula.org/en/dev-manual/Getting_Started_with_Bacula.html#QuickStartChapter"&gt;Quickstart&lt;/a&gt; documentation helped a lot here.&lt;br /&gt;Bacula uses its own terminology:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;FileSet: What files to backup&lt;/li&gt;&lt;li&gt;Client: Who to backup. This is the servers where the files are.&lt;/li&gt;&lt;li&gt;Schedule: When to backup&lt;/li&gt;&lt;li&gt;Pool: where does the backup go?&lt;/li&gt;&lt;li&gt;Volume: the actual tape. A collection of tapes is a pool.&lt;/li&gt;&lt;/ul&gt;In Gentoo, the Bacula configuration files go in: /etc/bacula/&lt;br /&gt;&lt;br /&gt;First thing that needed to be done was to edit the &lt;span style="font-weight: bold;"&gt;bconsole.conf&lt;/span&gt; file.&lt;br /&gt;There isn't really a lot there, the default seemed good.&lt;br /&gt;&lt;pre&gt;Director {&lt;br /&gt;Name = fileserver-dir&lt;br /&gt;DIRport = 9101&lt;br /&gt;address = fileserver&lt;br /&gt;Password = "&lt;my&gt;thepassword"   # not really :)&lt;br /&gt;}&lt;/my&gt;&lt;/pre&gt;&lt;br /&gt;Only thing I needed to change was the password. (The default is set to something crazy for security).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next, edit the &lt;span style="font-weight: bold;"&gt;bacula-sd.conf&lt;/span&gt; file.&lt;br /&gt;I have a Dell TL2000 so I needed to make an 'Autochanger' and a 'Device'.&lt;br /&gt;&lt;pre&gt;Autochanger {&lt;br /&gt;Name = Autochanger&lt;br /&gt;Device = LTO-3&lt;br /&gt;Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"&lt;br /&gt;Changer Device = /dev/sg5&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Device {&lt;br /&gt;Name = LTO-3&lt;br /&gt;Media Type = LTO-3&lt;br /&gt;Archive Device = /dev/st0&lt;br /&gt;Changer Command = "/usr/libexec/bacula/mtx-changer %c %o %S %a %d"&lt;br /&gt;Changer Device = /dev/sg5&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;With this configuration I ran the 'btape' tool and issued the 'test' command.&lt;br /&gt;All tests successful.. yay!&lt;br /&gt;&lt;br /&gt;Now, in the Director configuration file: &lt;span style="font-weight: bold;"&gt;bacula-dir.conf&lt;/span&gt; I had to make jobs/clients/etc...&lt;br /&gt;There's a pretty nice default example in there, so it was just basicly editing of the examples to get it to work.&lt;br /&gt;&lt;br /&gt;Some things you need to pay attention to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;making sure all the passwords are correct helps lots ;-)&lt;/li&gt;&lt;li&gt;Choose the correct storage, configure it in the bacula-sd.conf&lt;/li&gt;&lt;li&gt;restart the appropriate daemon when you've changed it's configuration file.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;Labeling the tapes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The tapes I use in the TL-2000 library all have barcode stickers on them. It would be very convenient if I could use those names in bacula aswell. Fortunately, there are console commands for this:&lt;br /&gt;&lt;blockquote&gt;label barcode&lt;br /&gt;update slots&lt;br /&gt;cleaning prefix&lt;br /&gt;&lt;/blockquote&gt;If afterwards tapes (volumes) need to be put in a different pool, use &lt;span style="font-weight: bold;"&gt;update volume&lt;/span&gt; to change the pool of the volume.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Creating the filesets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Filesets on my server are quite simple:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;FileSet {&lt;br /&gt;  Name = "datadir"&lt;br /&gt;  Include {&lt;br /&gt;    Options {&lt;br /&gt;      signature = MD5&lt;br /&gt;    }&lt;br /&gt;    File = /data&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;For every folder you wish to backup.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Schedules&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These define when a backup needs to run.&lt;br /&gt;One of my schedules looks like this:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;Schedule {&lt;br /&gt;  Name = "daily_4"&lt;br /&gt;  Run = Level=Full mon-fri at 4:00&lt;br /&gt;}&lt;/blockquote&gt;Should be self-explanatory.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Jobs&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These are the most important ones. They define what is backed up, how and when.&lt;br /&gt;The one for the weekly backups looks like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;Job {&lt;br /&gt;  Name = "weekday"&lt;br /&gt;  JobDefs = "DefaultJob"&lt;br /&gt;  Level = Full&lt;br /&gt;  FileSet = "dailyFiles"&lt;br /&gt;  Schedule = "daily_4"&lt;br /&gt;  Pool = "Default"&lt;br /&gt;}&lt;/blockquote&gt;Where JobDefs is this:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt; JobDefs {&lt;br /&gt;   Name = "DefaultJob"&lt;br /&gt;   Type = Backup&lt;br /&gt;   Client = fileserver-fd&lt;br /&gt;   Storage = Tape&lt;br /&gt;   Messages = Standard&lt;br /&gt;   Priority = 10&lt;br /&gt;   Write Bootstrap = "%c_%n.bsr"&lt;br /&gt; }&lt;/blockquote&gt;&lt;br /&gt;It's a very small configuration, but it will be enough for the kind of backups I want to take. Ofcourse this example isn't the only job/fileset/schedule I configured.&lt;br /&gt;&lt;br /&gt;It's running in test right now, I'll update here with the results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2107055989924928688?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2107055989924928688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2107055989924928688' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2107055989924928688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2107055989924928688'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/05/installing-and-configuring-bacula-on.html' title='Installing and configuring Bacula on Gentoo'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-9174990506564140897</id><published>2009-04-28T20:33:00.003+02:00</published><updated>2009-04-28T20:44:19.393+02:00</updated><title type='text'>Am I too late?</title><content type='html'>Lately I've been reading lots of Hacker News, Reddit/programming and a myriad of other blogs all covering programming topics.&lt;br /&gt;When reading HN, a great deal of the posts is about startups. Young people starting their own business writing code which will solve some problem we didn't know we had. I really envy them. They get to work on their personal little project all day and they get paid for it. Well that last bit isn't really true unless the startup actually succeeds.&lt;br /&gt;I don't think the business world in Belgium is ready for this kind of thing. No, I really should rephrase that: I haven't encountered anyone who could be interested in (partially) funding an Internet startup. Maybe I'm just in the wrong place or I'm not networking enough.&lt;br /&gt;Then again when I think of it a little harder, why would I even start a startup? I have a good job, a boss who lets me do my thing (within boundaries), great colleagues. I'm not in a position right now to be taking any big financial risks. Just bought a house, got married, the wife isn't really a fan of me doing something like that, and I completely understand.&lt;br /&gt;Am I too late doing this kind of thing?&lt;br /&gt;Maybe when I just got my bachelor's degree, when I was looking for a job, I could have worked on something instead of goofing off and playing video games with friends.&lt;br /&gt;&lt;br /&gt;The itch to produce something is still there though. Maybe I can project this desire on my work...&lt;br /&gt;&lt;br /&gt;My job right now is a one man project, writing software that automaticly tests the software my colleagues write. It's based on our internal SDK of one application, which I use to test the other application we make (client/server type of thing). I do all of my coding in C# at work, apart from a little side project for reporting for which I use Common Lisp (see my blog &lt;a href="http://gertm.blogspot.com/2009/03/lisp-for-web.html"&gt;post&lt;/a&gt; about this). While C# is not my favorite programming language, it gets the work done. Most of the other coders, especially my direct colleagues write in C++.&lt;br /&gt;The thing that struck me the most when I started this job was, while I thought I was a great coder when I got out of school, I'm miles away from my coworkers. I don't even come close. While I can hold my own in a technical discussion and grasp most of the concepts of what they're doing, I'm nowhere near the level of skill they have when it comes to actually writing code. At least that's what it seems like.&lt;br /&gt;Granted, I haven't been 'professionally' coding for very long and I know I still have much to learn about, well, everything. Yet the same question pops up: Am I too late? I'm close to 30, should I have sharpened my coding skills earlier, never played online games or simply taken up another job that required me coding from day 1? Nearly all of my free time goes to learning more about programming, concepts, theories, language, yet I feel like it'll all be in vain. It's too little, too late. Did I blow my opportunity to be a 'great hacker' as Paul Graham calls it?&lt;br /&gt;I could always join an open source project and start hacking on that, learning the chops as I go. Skill difference could be a problem again though.&lt;br /&gt;&lt;br /&gt;OK, enough with the self-pity, here are the good sides to the situation.&lt;br /&gt;I don't really have a deadline for my project at work. I can take time to figure new stuff out, ask my colleagues for help and just keep at it till I get it right.&lt;br /&gt;For a lot of little things, I'm not bound to one toolkit. I can choose whatever tool (language) I want for the stuff I write. It's really nice to have this kind of freedom. (Of course I have to be able to defend why I would choose that tool.)&lt;br /&gt;The atmosphere at work is great, my boss encourages me to learn new things and improve my coding.&lt;br /&gt;&lt;br /&gt;All in all I'd say I'm in a good place to become at least a better hacker. If I'll be able to make an impact in the community of hackers, that's another question. Then again, how many coders can do that?&lt;br /&gt;So yeah, maybe I am too late. But it can't hurt to try!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-9174990506564140897?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/9174990506564140897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=9174990506564140897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/9174990506564140897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/9174990506564140897'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/04/am-i-too-late.html' title='Am I too late?'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-6042171429435039879</id><published>2009-04-23T22:38:00.008+02:00</published><updated>2009-12-28T19:29:29.844+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='hunchentoot'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='weitz'/><title type='text'>Sticking with it</title><content type='html'>I've been trying to get TweetDeck to work but Adobe AIR and &lt;a href="http://stumpwm.nongnu.org/"&gt;StumpWM&lt;/a&gt; don't like eachother.  Since I'm not giving up the &amp;lt;plug&amp;gt;best wm ever&amp;lt;/plug&amp;gt;, TweetDeck is not an option.&lt;br /&gt;&lt;br /&gt;So what does a programmer do when he can't get the features he wants? Right, he codes it himself! I'll call it 'TweetSheet' for now. (it's not the best of names, but atleast it sounds better than TwitterSh.. well you know)&lt;br /&gt;Learning a new language always comes with lots and lots of practice and this will be a good exercise for my Lisp skills. I've reached a point where I don't even think about using another language for coding anything. (Except work-related stuff, where C# is usually the choice I'm urged to make.)&lt;br /&gt;&lt;br /&gt;It's going to be a TweetDeck-inspired web application featuring a columned view. For this I'll be using the awesome &lt;a href="http://www.weitz.de/hunchentoot/"&gt;Hunchentoot&lt;/a&gt; webserver and a couple of other tools &lt;a href="http://www.weitz.de/"&gt;Edi Weitz&lt;/a&gt; wrote: &lt;a href="http://www.weitz.de/drakma/"&gt;Drakma&lt;/a&gt; and &lt;a href="http://www.weitz.de/cl-who/"&gt;CL-WHO&lt;/a&gt;. For the JSON stuff there's &lt;a href="http://common-lisp.net/project/cl-json/"&gt;cl-json&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Not long ago I was thinking of writing a blog post to complain about the bad state of the Common Lisp libraries. I was even tempted to ditch CL and try Clojure. (Because of the Java libs available.)&lt;br /&gt;Assembling my toolkit for writing this Twitter app, I must say I'm quite impressed with the libraries I found. Weitz' stuff is very easy to use and a pleasure to work with since it's documented nicely. The cl-json lib doesn't work with SBCL 1.0.27 but a quick browsing through their mailing list shows that they're aware of the problem and it'll be fixed soon. So for now I stick to .24 of SBCL.&lt;br /&gt;&lt;br /&gt;The basic Twitter search was up and running in no time. More time was spent getting the HTML and CSS right than writing the actual code to handle the json replies. While I'm praising Lisp tools, I'll add another one: &lt;a href="http://wigflip.com/"&gt;wigflip.com&lt;/a&gt; by Zach Beane. The rounded corners I use for the tweet-boxes are made with the 'cornershop' part of the wigflip site. (thank you Zach!)&lt;br /&gt;&lt;br /&gt;Here's a little preview of how it looks like now:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_8VSsxKqTADk/SfDa4-cQrCI/AAAAAAAAABw/OfEdwUe5H3o/s1600-h/tweetsheet.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5327999031548357666" src="http://2.bp.blogspot.com/_8VSsxKqTADk/SfDa4-cQrCI/AAAAAAAAABw/OfEdwUe5H3o/s320/tweetsheet.png" style="cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;If this little project ever grows big enough to be meaningfull, I'll open up a Google Code page or something so people can help out. I'll be happy to share the source with anybody who asks, even if it was just to get some pointers on how to improve things.&lt;br /&gt;&lt;br /&gt;I'm not giving up on Lisp. A language doesn't survive for 50 years if it sucks. I'm even starting to see now where other languages (like .NET) are getting their ideas from. Sure, the Lisp library collection is not like CPAN or Java, but the important ones are there, and I'm sure the ones that aren't there won't be hard to implement.&lt;br /&gt;&lt;br /&gt;So yes, I'm sticking with Lisp!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-6042171429435039879?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/6042171429435039879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=6042171429435039879' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6042171429435039879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6042171429435039879'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/04/sticking-with-it.html' title='Sticking with it'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_8VSsxKqTADk/SfDa4-cQrCI/AAAAAAAAABw/OfEdwUe5H3o/s72-c/tweetsheet.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-1458394106316969859</id><published>2009-04-13T09:16:00.001+02:00</published><updated>2009-05-10T11:37:36.077+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='community'/><category scheme='http://www.blogger.com/atom/ns#' term='#lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='restarts'/><category scheme='http://www.blogger.com/atom/ns#' term='conditions'/><title type='text'>Conditions, restarts and great people</title><content type='html'>I've been studying conditions and restarts in lisp for a bit now. I've read the chapter in &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt; about it but didn't quite get it right away.&lt;br /&gt;So I asked around in #lisp on freenode for some help. I initially got other links (a &lt;a href="http://chaitanyagupta.com/lisp/restarts.html"&gt;tutorial&lt;/a&gt; and a &lt;a href="http://www.nhplace.com/kent/Papers/Condition-Handling-2001.html"&gt;paper&lt;/a&gt; by Pitman) with a lot of information. The first link assumes already some knowledge of the topic and the second one was such a large read that I was a bit discouraged. "Is this really so hard?", I thought to myself.&lt;br /&gt;&lt;br /&gt;I went back to PCL and read the chapter again, this time making the examples in my editor as I went along. (I really should have done that from the start)&lt;br /&gt;Not getting the example to work frustrated me, it sounded great on paper and it was well explained but I just couldn't get it to work.&lt;br /&gt;&lt;br /&gt;So I ask on #lisp again, pasted some code to the pastebin and waited for a reaction. A few people initially reacted with 'oh you need restart-case'.&lt;br /&gt;While entirely correct, I didn't get it because I was sure I tried that example and while the restart-case on itself worked, I removed it again when I went over the next examples. Then Peter Seibel (who also idles in the #lisp channel) saw that I was struggling and started giving me pointers on what to re-read in his book. After about half an hour of reviewing the code, I figured it out, fixed the bug and got it to work.&lt;br /&gt;&lt;br /&gt;This is always a good starting point when I'm learning stuff. I follow examples and type in the code, see that it works and then figure out why it is working. Peter's examples in his book confused me a bit, the naming of the functions made me lose track of what was happening. (Don't get me wrong, I'm not blaming anybody but myself here) After several tries, I was pretty sure I got it down and knew how to use conditions with restarts.&lt;br /&gt;&lt;br /&gt;A couple of hours later, I got a query on IRC from &lt;a href="http://paulgresham.com/"&gt;Paul Gresham&lt;/a&gt; who gave me a very simple and wonderful example:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;br /&gt;&lt;pre&gt;(declaim (optimize debug))&lt;br /&gt;(defpackage :condition-fun (:use :cl))&lt;br /&gt;(in-package :condition-fun)&lt;br /&gt;&lt;br /&gt;;; This tutorial focuses on very simple restarts. Lisp can do a&lt;br /&gt;;; lot more, but the constructs here are already incredibly&lt;br /&gt;;; powerful.&lt;br /&gt;;; This tutorial does not look at defining conditions as we&lt;br /&gt;;; want to focus only on restarts.&lt;br /&gt;&lt;br /&gt;;; Imagine this is your cool API. We have two implementations. The&lt;/pre&gt;&lt;pre&gt;;; first is typical, nasty code that just sticks Nil in and&lt;/pre&gt;&lt;pre&gt;;; essentially ignores the error. The second is much better, it&lt;br /&gt;;; provides three restarts for our clients to use.&lt;br /&gt;&lt;br /&gt;(defun nasty-fun (data)&lt;br /&gt;"Oh bugger! what to do about div-by-zero. Screw it, just return Nil!"&lt;br /&gt;(loop for d in data collect&lt;br /&gt;       (handler-case (/ (random 1000) d)&lt;br /&gt;         (division-by-zero () nil))))&lt;br /&gt;&lt;br /&gt;(defun much-nicer-fun (data)&lt;br /&gt;"We allow our parent to decide what to do about div by zero."&lt;br /&gt;(loop    for d in data collect&lt;br /&gt;       (restart-case (/ (random 1000) d)&lt;br /&gt;         (use-nil () nil)&lt;br /&gt;         (use-zero () 0)&lt;br /&gt;         (use-value (value) value))))&lt;br /&gt;&lt;br /&gt;;; What this means is that the calling program can effect low level&lt;br /&gt;;; errors inside our API. They can choose what to do about it, to&lt;br /&gt;;; correct the error in a way meaningful to them and continue&lt;br /&gt;;; processing. Don't get stuck here, work through the next steps&lt;br /&gt;;; then you'll understand.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;; Imagine this is some client code using your cool API&lt;br /&gt;&lt;br /&gt;(defvar *data* '(2 3 4 0 6 2 0 9))&lt;br /&gt;;;                     ^     ^  Uh-oh!&lt;br /&gt;&lt;br /&gt;(defun critical-fun-that-hates-nil (data)&lt;br /&gt;"We're only hire professionals and expect them to return&lt;br /&gt;us good stuff even if we send them garbage."&lt;br /&gt;(loop for d in data collect&lt;br /&gt;     (* (random 1000) d)))&lt;br /&gt;&lt;br /&gt;(defun important-programme1 ()&lt;br /&gt;"If this dies the client loses US$1BN."&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (nasty-fun *data*)))&lt;br /&gt;&lt;br /&gt;;; Ok let's give the option to manually recover. Experiment&lt;br /&gt;;; with the different restarts at the prompt.&lt;br /&gt;(defun important-programme2 ()&lt;br /&gt;"The previous version would lose a lot of money each time&lt;br /&gt;it's run. We need more control"&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (much-nicer-fun *data*)))&lt;br /&gt;&lt;br /&gt;(defun important-programme3 ()&lt;br /&gt;"Great! Now we have to employ someone to sit there&lt;br /&gt;selecting the restart everytime, lets automate that&lt;br /&gt;with a dynamic function."&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (handler-bind ((division-by-zero&lt;br /&gt;                 #'(lambda (x) (invoke-restart 'use-zero))))&lt;br /&gt;   (much-nicer-fun *data*))))&lt;br /&gt;&lt;br /&gt;(defun use-zero-please (x)&lt;br /&gt;"Provide a function for the restart for readability purposes."&lt;br /&gt;(declare (ignore x))&lt;br /&gt;(invoke-restart 'use-zero))&lt;br /&gt;&lt;br /&gt;(defun important-programme4 ()&lt;br /&gt;"The dev's at the client only write VB code and&lt;br /&gt;can't understand this lambda stuff, make clearer&lt;br /&gt;so they can read our code"&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (handler-bind ((division-by-zero #'use-zero-please))&lt;br /&gt;   (much-nicer-fun *data*))))&lt;br /&gt;&lt;br /&gt;(defun important-programme5 ()&lt;br /&gt;"Wow, our client is happy, so happy, they now want to specify&lt;br /&gt;a their own value as zero is causing them to lose money."&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (handler-bind ((division-by-zero #'(lambda (x)&lt;br /&gt;                                      (invoke-restart 'use-value 1))))&lt;br /&gt;   (much-nicer-fun *data*))))&lt;br /&gt;&lt;br /&gt;;; Oh but it's not readable again. This time we need a function&lt;br /&gt;;; that creates a function for our client. Yes, we're writing&lt;br /&gt;;; code that writes code for them!&lt;br /&gt;&lt;br /&gt;(defun use-value-please (value)&lt;br /&gt;"Don't worry they won't know this actually returns a function,&lt;br /&gt;it'll look ok to them!"&lt;br /&gt;#'(lambda (x)&lt;br /&gt;    (declare (ignore x)) ;; because this is a simple tutorial!!&lt;br /&gt;    (invoke-restart 'use-value value)))&lt;br /&gt;&lt;br /&gt;(defun important-programme6 ()&lt;br /&gt;"Allow the value to be specified"&lt;br /&gt;(critical-fun-that-hates-nil&lt;br /&gt; (handler-bind ((division-by-zero (use-value-please 10)))&lt;br /&gt;   (much-nicer-fun *data*))))&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;This made me get it. It's very clear to me now how it works. I'm sure it will still take some time and effort to really grok this but now I'm confident I can do it.&lt;br /&gt;&lt;br /&gt;Thanks to #lisp, Peter Seibel and Paul Gresham, I'm one step closer to 'lisp enlightenment' ;-)&lt;br /&gt;I'm really appreciating the community for the help!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Who said people in #lisp weren't nice? Oh right that was me. Well I take it back!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-1458394106316969859?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/1458394106316969859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=1458394106316969859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1458394106316969859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1458394106316969859'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/04/conditions-restarts-and-great-people.html' title='Conditions, restarts and great people'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-4448857451674661165</id><published>2009-04-03T09:11:00.000+02:00</published><updated>2009-04-11T17:34:57.317+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nickname'/><category scheme='http://www.blogger.com/atom/ns#' term='gravatar'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Jumping on the bandwagon a little later than most people...</title><content type='html'>I'm not always as eager to join shiny new things on the internet. Problem with that is.. all the good nicknames or aliases are already used. The names I use most frequently are usually taken. It would have been good to be able to use the same alias as I use here, 'Gertm' or my old IRC nickname 'Cel'...&lt;br /&gt;Creating my &lt;a href="http://gravatar.com/"&gt;gravatar&lt;/a&gt; account, I picked 'G3rtm' .. not so bad.&lt;br /&gt;Oh, well, that'll teach me to maybe try something new a little faster in the future.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Update: I quite like the 'G3rtm' alias afterall. I'm also using it for my twitter account now.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-4448857451674661165?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/4448857451674661165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=4448857451674661165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4448857451674661165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4448857451674661165'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/04/jumping-on-bandwagon-little-later-than.html' title='Jumping on the bandwagon a little later than most people...'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-94668352250707528</id><published>2009-03-20T09:13:00.000+01:00</published><updated>2009-03-20T09:26:06.905+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arch Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Pine'/><title type='text'>Revisiting Pine and switching to Arch Linux</title><content type='html'>I just recently installed Pine again. I was searching for a nice console mail program for a while now.&lt;br /&gt;I tried mutt and gnus for a while. Neither of those could really please me. Stupid little default things I can't get my head around, like mutt and not being able to use the arrow keys when viewing a mail. Well you can use them, but they don't do what I'd expect them to do (ie. scrolling down). I've googled a bit for rebinding mutt keys, but it's too much hassle. I just want it to work properly. I've installed pine again and it's much much more intuitive. For me atleast.&lt;br /&gt;And setting up my gmail was ridiculously easy. I found a good link here: &lt;a href="http://http://www.ii.com/internet/messaging/pine/pc/#gmailIMAP"&gt;http://www.ii.com/internet/messaging/pine/pc/#gmailIMAP&lt;/a&gt;. Just followed their instructions and gmail was up and running in seconds.&lt;br /&gt;I really like pine, it does the job very well.&lt;br /&gt;&lt;br /&gt;Recently I've been changing opinions about my PC usage. Stuff just has to work. I don't feel like configuring programs for hours anymore. I used to love that kind of things.&lt;br /&gt;I've switched Linux distros aswell. I'm all for configurability and want to be in control of my OS so I used Gentoo for about 5 or 6 years, can't remember exactly. But tinkering with config files, having to recompile my kernel every time it updates, waiting for stuff to compile every time I want to install something just to see what it is... Syncing the portage tree takes quite a while...&lt;br /&gt;So I've decided to give Arch Linux a go. So far so good, I've been using it for a couple of weeks now and I must say, I'm really loving it. It's fast, easy to work with and it gives me the power to customize everything I want. Also, the precompiled and optimized i686 kernel enables all my hardware of my laptop to just work.&lt;br /&gt;It's probably my own lack of skill that I couldn't get some small things to work with my Gentoo kernel, but now it saves me the hassle of having to go verify every damn kernel option I need every time there's a kernel update. (I've had mishaps with make oldconfig.)&lt;br /&gt;Ofcourse there are like a bazillion kernel modules loaded when I boot now, I'll probably have to tweak that a little because I surely don't need all of them. Still, performance didn't go down. (if it did, I'm not noticing)&lt;br /&gt;Giving users the power (obligation?) to optimize can result in badly optimized and slower systems. I believe the Arch Linux folks did a great job of optimizing their default kernel. I'm going to stick with it for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-94668352250707528?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/94668352250707528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=94668352250707528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/94668352250707528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/94668352250707528'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/03/revisiting-pine-and-switching-to-arch.html' title='Revisiting Pine and switching to Arch Linux'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-6209513356982430929</id><published>2009-03-03T10:15:00.000+01:00</published><updated>2009-03-03T10:20:51.127+01:00</updated><title type='text'>Lisp for the web</title><content type='html'>It's been quite a while since I blogged here.&lt;br /&gt;I've started using Hunchentoot for a little reporting site I needed at work.&lt;br /&gt;Since my boss doesn't tell me how things need to be written or in what language, I have the freedom of choosing my own tools:&lt;br /&gt;&lt;br /&gt;Hunchentoot + clwho + clsql&lt;br /&gt;&lt;br /&gt;I have to say, it's quite the combination. Easy to write in, readable code and just plain fun to do.&lt;br /&gt;I've always used PHP for web based things. That's in the past now. Ofcourse it'll be harder to find a web hosting company who will install hunchentoot for me, if I'd ever want to use it for a site of my own. For now, that's not the issue, since the only thing I have that comes close to a site is this blog.&lt;br /&gt;&lt;br /&gt;Bottom line: Thank you Hunchentoot developers, thank you clwho and clsql developers, you made my life a little bit better when it comes to web building ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-6209513356982430929?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/6209513356982430929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=6209513356982430929' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6209513356982430929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6209513356982430929'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2009/03/lisp-for-web.html' title='Lisp for the web'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-7022201137227010240</id><published>2008-12-03T18:05:00.000+01:00</published><updated>2009-04-13T10:41:42.294+02:00</updated><title type='text'>My first macro</title><content type='html'>I wrote a little macro to execute shell programs in sbcl.&lt;br /&gt;The macro code is probably not that hard to do, but I'm starting to understand what the possibilities are with writing macros.&lt;br /&gt;&lt;br /&gt;here's the code:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defun split-by-one-space (string)&lt;br /&gt;  "Returns a list of substrings of string&lt;br /&gt;   divided by ONE space each.&lt;br /&gt;   Note: Two consecutive spaces will be seen as&lt;br /&gt;   if there were an empty string between them.&lt;br /&gt;   -- found this in the Common Lisp Cookbook."&lt;br /&gt;  (loop for i = 0 then (1+ j)&lt;br /&gt;    as j = (position #\Space string :start i)&lt;br /&gt;    collect (subseq string i j)&lt;br /&gt;    while j))&lt;br /&gt;&lt;br /&gt;(defmacro process-command ((command) &amp;body body)&lt;br /&gt; `(let ((proc (sb-ext:run-program (car (split-by-one-space ,command))&lt;br /&gt;    (cdr (split-by-one-space ,command)) :output :stream)))&lt;br /&gt;    (unwind-protect&lt;br /&gt;      (progn&lt;br /&gt;        (with-open-stream (files (sb-ext:process-output proc))&lt;br /&gt;         (loop :for line = (read-line files nil nil) :while line&lt;br /&gt;               :do (progn ,@body))))&lt;br /&gt;    (process-close proc))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So i can process the command I need in the same block.&lt;br /&gt;Great fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-7022201137227010240?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/7022201137227010240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=7022201137227010240' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7022201137227010240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7022201137227010240'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/12/my-first-macro.html' title='My first macro'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-7435666576347861534</id><published>2008-10-30T21:36:00.000+01:00</published><updated>2008-10-30T21:47:13.543+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='newbie'/><title type='text'>Crawling out of newbie-dom</title><content type='html'>Learning new stuff and joining new communities have always been things I've liked to do. I've worked my way up to a respectable level in several games in which I'm now considered to be an 'oldbie'. The rise from totally new and clueless to respected is a journey I've done a couple of times and enjoyed it every time. I'm doing this with my guitar and I'm doing the same thing with learning lisp. The only difference now is, I'm not sure I'll ever get out of being a newbie. The question is if  that's a bad thing. With both areas (music and programming lisp) I'm facing a challenge that might take me more than just a couple of years to reach a decent level. Maybe I won't get bored of those to like I did with the games I played or other computer languages I explored.&lt;br /&gt;The lisp community does not seem very newbie friendly though. I'm kind of scared to ask stuff on Freenode's #lisp. I found #cl-gardeners,  which seems to be exactly what I need. Too bad there aren't as many folks there as I'd like to be. In any case, I'm going to try and explore every newbie-helping lisp related site and maybe post some small things (that seem important to me, from a newbie point of view) on this blog. A small attempt to contribute to the community.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(now if someone would read my blog, this stuff could be meaningfull ;-) )&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-7435666576347861534?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/7435666576347861534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=7435666576347861534' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7435666576347861534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7435666576347861534'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/10/crawling-out-of-newbie-dom.html' title='Crawling out of newbie-dom'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-7474382696602126380</id><published>2008-10-19T13:28:00.000+02:00</published><updated>2008-10-30T21:56:54.632+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mplayer'/><title type='text'>When mplayer suddenly tells you...</title><content type='html'>your computer is too slow to play some movie, don't panic.&lt;br /&gt;I recently had this and spent a few hours looking for the cause.&lt;br /&gt;Just before this happened I ran a 'emerge -avuND world' as I do regularly.&lt;br /&gt;(It's part of my update script.)&lt;br /&gt;One of the updates was the new Firefox 3 so I was looking in that direction. After a bit of googling and browsing the Gentoo forums, I remembered that there was a kernel upgrade in my update script.&lt;br /&gt;With a new kernel I usually just run 'make oldconfig' and build the kernel.&lt;br /&gt;Most of you are now already cringing in disgust. Yes well, I learned my lesson. The CPU was set to 'Pentium 3' while I really have a Core 2 duo.&lt;br /&gt;Setting this to the right value and recompiling the kernel solved my problems.&lt;br /&gt;I'll never just 'make oldconfig &amp;amp;&amp;amp; make' again! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-7474382696602126380?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/7474382696602126380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=7474382696602126380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7474382696602126380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/7474382696602126380'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/10/when-mplayer-suddenly-tells-you.html' title='When mplayer suddenly tells you...'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3799752270938672538</id><published>2008-09-09T14:19:00.000+02:00</published><updated>2008-10-30T21:57:16.527+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dell'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='san'/><category scheme='http://www.blogger.com/atom/ns#' term='iscsi'/><title type='text'>Gentoo Linux iSCSI and the Dell MD3000i</title><content type='html'>Finally, I managed to get my MD3000i working with Gentoo Linux. Because customer support at Dell doesn't give you support for anything else but RHEL and SuSE-EL, I had to figure this out for myself.&lt;br /&gt;&lt;br /&gt;Here's how I did it:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I configured the MD3000i with 2 virtual disks. (It has 4 TB onboard). 2 of about 2TB and one with the remaining space.&lt;/li&gt;&lt;li&gt;I emerged open-iscsi. With this version (at the time of writing) it didn't work, so I downloaded the latest version from the official site and installed that. Then to make sure portage wouldn't overwrite this installation I masked open-iscsi in /etc/portage/package.mask&lt;/li&gt;&lt;li&gt;I configured /etc/iscsi/initiatorname.iscsi. (make sure you have a name that the iSCSI system will accept. The examples online will give you enough information on how to do this.)&lt;/li&gt;&lt;li&gt;Now I was able to discover the array and log in. When doing a discovery and auto mount of all the discovered disks, I received timeouts and a whole bunch of error messages. That's because it was trying to connect on all available listen ports on the SAN. But I only had connection to 1 of them so I wrote a little bash script (1 line) that only connects to 1 specific listen port/ip.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family:courier new;"&gt;iscsiadm --mode node --targetname iqn.blablabla --portal 192.bla.bla.bla:3260 --login&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;With this, the only thing I got was 1 extra device (/etc/sdc) and when I ran fdisk it showed me that it was 20MB. Not really what I was expecting from a SAN with 4TB total storage. Some googling and I found that the MD3000i makes a default 'configuration' or whatever disk if you use the standard wizards. So in the Host-To-Virtual-Disk-Mappings look for the drives with 'Accessible by' set to 'Access'. Remove them.&lt;/li&gt;&lt;li&gt;Now I was able to mount 2 of my 3 disks. The second one gave me Buffer I/O errors. Seems that the discovered drives are all the drives available on the system. But I was connecting to the right port/ip and all my Virtual disks were accessible by me... More googling and I read something about 'preferred RAID controllers'. So I opened the 'Dell Modular Disk Storage Manager' and started looking. I found it in: Modify -&gt; 'Change Virtual Disk Ownership/Preferred Path'. The second disk of the 3 was set to the other RAID controller (which I didn't connect to). So setting that to the same one as the other 2 fixed the problem.&lt;/li&gt;&lt;li&gt;I used parted to create GPT partitions on the disk and there we go.&lt;/li&gt;&lt;/ol&gt;This might not be the way you want your Dell MD3000i SAN to be set up, but for me this was perfect.&lt;br /&gt;If I run in to other problems/oddities, I will update this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3799752270938672538?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3799752270938672538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3799752270938672538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3799752270938672538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3799752270938672538'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/09/gentoo-linux-iscsi-and-dell-md3000i.html' title='Gentoo Linux iSCSI and the Dell MD3000i'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-3828667148909590109</id><published>2008-08-13T14:53:00.000+02:00</published><updated>2008-10-30T21:57:29.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='guitar'/><title type='text'>Practise sheets for the guitar neck</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_8VSsxKqTADk/SKLaqaAjwhI/AAAAAAAAAAU/g9z-IPKzi90/s1600-h/neck3.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_8VSsxKqTADk/SKLaqaAjwhI/AAAAAAAAAAU/g9z-IPKzi90/s320/neck3.png" alt="" id="BLOGGER_PHOTO_ID_5233986139028963858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_8VSsxKqTADk/SKLaURZhCKI/AAAAAAAAAAM/yI-z_axz95g/s1600-h/neck4.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_8VSsxKqTADk/SKLaURZhCKI/AAAAAAAAAAM/yI-z_axz95g/s200/neck4.png" alt="" id="BLOGGER_PHOTO_ID_5233985758760601762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I made some practise sheets I'll be using myself for learning the notes on the guitar neck.&lt;br /&gt;I hope they're useful.&lt;br /&gt;&lt;br /&gt;The first one is not a neck, it's just a schematic of a guitar neck, but with the 7 shapes of the guitar modes linked to eachother. This is great for filling in with numbers or note names, to learn the relations of the notes.&lt;br /&gt;&lt;br /&gt;Second one: Empty neck, put the open strings on top of the diagram and then fill in the rest.&lt;br /&gt;This will be a good exercise, in a few weeks I should be able to find the notes quickly on my guitar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-3828667148909590109?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/3828667148909590109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=3828667148909590109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3828667148909590109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/3828667148909590109'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/08/practise-sheets-for-guitar-neck.html' title='Practise sheets for the guitar neck'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_8VSsxKqTADk/SKLaqaAjwhI/AAAAAAAAAAU/g9z-IPKzi90/s72-c/neck3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-8139841379271688821</id><published>2008-07-28T14:00:00.000+02:00</published><updated>2008-07-28T14:02:07.200+02:00</updated><title type='text'>Moving</title><content type='html'>I just moved to my new house a week ago, still busy unboxing stuff. Not much time for anything else right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-8139841379271688821?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/8139841379271688821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=8139841379271688821' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8139841379271688821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/8139841379271688821'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/07/moving.html' title='Moving'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-4653837523760645187</id><published>2008-07-11T15:00:00.000+02:00</published><updated>2009-04-13T10:43:33.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>My first little program in lisp!</title><content type='html'>Hurray!&lt;br /&gt;I made something semi useful in lisp. It's an EDID parser to make monitor.ini files for the company I work for. The monitor.ini describes the parameters our embedded controllers need to control the screen they're connected to.&lt;br /&gt;I haven't even finished reading 'Practical Common Lisp' entirely, but I'm really starting to like Lisp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-4653837523760645187?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/4653837523760645187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=4653837523760645187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4653837523760645187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/4653837523760645187'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/07/my-first-little-program-in-lisp.html' title='My first little program in lisp!'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-2946460602598406197</id><published>2008-06-28T21:02:00.000+02:00</published><updated>2008-06-28T21:07:03.149+02:00</updated><title type='text'>Working in the new house</title><content type='html'>I've been working all week in the house I bought with my wife. This should have been a week of vacation, relaxation.&lt;br /&gt;In the next couple of weeks I'll be working 8 hours at work and working another 3-4 hours in my new house. We move in about 3 weeks, so everything has to be finished.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-2946460602598406197?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/2946460602598406197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=2946460602598406197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2946460602598406197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/2946460602598406197'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/06/working-in-new-house.html' title='Working in the new house'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-6520401672174044332</id><published>2008-06-16T14:32:00.000+02:00</published><updated>2008-06-16T14:37:11.546+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slime'/><category scheme='http://www.blogger.com/atom/ns#' term='editors'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>I never thought I'd..</title><content type='html'>learn Emacs.&lt;br /&gt;I've been a devout vi/vim follower for years, but I'm currently learning Emacs. If I want to use SLIME properly, I need to be able to use Emacs.&lt;br /&gt;I've never been a fan of Emacs, but to be honest, I never really tried using it properly. This time I am using it properly and I have to say, I'm liking it so far.&lt;br /&gt;Some stuff I wanted to do in vim that weren't easy (but possible ofcourse) now seem easy in Emacs. Maybe I never thouroughly learned vim like I should have..&lt;br /&gt;In any case, I'm not going to switch camps in the 'vim-emacs' flamewars. I'm just going to watch the crossfire from a distance. ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-6520401672174044332?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/6520401672174044332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=6520401672174044332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6520401672174044332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/6520401672174044332'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/06/i-never-thought-id.html' title='I never thought I&apos;d..'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-5855947078478158714</id><published>2008-06-12T22:55:00.001+02:00</published><updated>2008-06-12T22:58:34.395+02:00</updated><title type='text'>The Happening</title><content type='html'>I just went to see 'The Happening'.&lt;br /&gt;&lt;br /&gt;Let's just say it had a really good trailer. The movie is a bit dissapointing.&lt;br /&gt;Shame really, I really like Mark Wahlberg's acting. The dialogues in the movie are poor at times.&lt;br /&gt;Maybe I expected too much...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-5855947078478158714?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/5855947078478158714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=5855947078478158714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/5855947078478158714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/5855947078478158714'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/06/happening.html' title='The Happening'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2954894206056939417.post-1091399404110328842</id><published>2008-06-10T20:08:00.000+02:00</published><updated>2008-07-15T11:50:16.147+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Trying something different</title><content type='html'>I'm going to try and learn LISP. Yeah, some people will call me nuts, others will encourage me. I've been looking for a new challenge. I've used a couple of other programming languages and got tired of most of them. Python is really nice, I like it for simple things, but it has a kind of weird logic for some stuff. I can't get my head around it. I used C# for work for quite a while. It's basicly a Microsoftish java if you ask me, it's not bad, but if you start to use threads it turns into a pile of ****.&lt;br /&gt;LISP is supposed to be really different and really powerful. I'm reading the 'Practical Common LISP' book from &lt;span style="text-decoration: underline;"&gt;&lt;a href="http://www.gigamonkeys.com/book/"&gt;Peter Seibe&lt;/a&gt;l&lt;/span&gt;. A couple of chapters in, my head starts to hurt. I've been stuck in programming habits for a long time. None of those habits will apply to LISP apparently.&lt;br /&gt;This is the first programming language tutorial that actually made me break sweat just by reading it. I wonder if I'm even capable of handling programming in LISP. We'll see, I'm not going to give up easy on this. I didn't give up on vim when I first tried that and it's been my favorite (and only) editor for years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2954894206056939417-1091399404110328842?l=gertm.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gertm.blogspot.com/feeds/1091399404110328842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2954894206056939417&amp;postID=1091399404110328842' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1091399404110328842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2954894206056939417/posts/default/1091399404110328842'/><link rel='alternate' type='text/html' href='http://gertm.blogspot.com/2008/06/trying-something-different.html' title='Trying something different'/><author><name>Gert</name><uri>http://www.blogger.com/profile/08698771721345877614</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://2.bp.blogspot.com/_8VSsxKqTADk/SUJywolTKAI/AAAAAAAAAAs/3a_-eoqcCbM/S220/pasfoto.png'/></author><thr:total>0</thr:total></entry></feed>
