<?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-2417759645921975473</id><updated>2012-02-16T16:45:56.841+01:00</updated><category term='BASIC'/><category term='flash'/><category term='ecmascript'/><category term='html5'/><category term='web'/><category term='swing'/><category term='superpackages'/><category term='books'/><category term='gadgets'/><category term='as3'/><category term='soa'/><category term='domain names'/><category term='eclipse xtend'/><category term='maven'/><category term='selenium'/><category term='cobol'/><category term='rdbms'/><category term='algorithms'/><category term='mapreduce'/><category term='nintendo ds'/><category term='exceptions'/><category term='firefox'/><category term='audio'/><category term='jpf'/><category term='osgi'/><category term='git'/><category term='web 2.0'/><category term='spring'/><category term='haskell'/><category term='video'/><category term='dht'/><category term='email'/><category term='eclipse'/><category term='star trek'/><category term='bdd'/><category term='mdd'/><category term='c++'/><category term='closures'/><category term='xp'/><category term='utility'/><category term='scripting'/><category term='java7'/><category term='xml'/><category term='scala'/><category term='java'/><category term='ogg'/><category term='kaizen'/><category term='webdriver'/><category term='intellij'/><category term='cloud'/><category term='commodore 64'/><category term='web 1.0'/><category term='c64'/><category term='mvc'/><category term='db4o'/><category term='jpa'/><category term='delicious'/><category term='ria'/><category term='testing'/><category term='ubuntu'/><category term='architecture'/><category term='ide'/><category term='google'/><category term='jdbc'/><category term='javascript'/><category term='nabaztag'/><category term='syntherface'/><category term='hacking'/><category term='midi'/><category term='dijkstra'/><category term='graph db'/><category term='webstart'/><category term='db donkey'/><category term='social networking'/><category term='f#'/><category term='commons'/><category term='agile'/><category term='wicket'/><category term='neo4j'/><category term='kanban'/><category term='jogl'/><category term='tdd'/><category term='services'/><category term='e-reader'/><category term='canvas'/><category term='oodb'/><category term='hardware'/><category term='database'/><category term='linux'/><category term='apache'/><category term='ibatis'/><category term='javafx'/><category term='lean'/><category term='hibernate'/><category term='ajax'/><category term='programming'/><category term='applets'/><category term='music'/><category term='games'/><category term='e-books'/><category term='lisp'/><category term='jvm'/><category term='gae'/><category term='nas'/><category term='netbeans'/><category term='properties'/><category term='scrum'/><category term='sid'/><category term='sql'/><category term='unix'/><category term='functional programming'/><category term='orm'/><category term='ocaml'/><category term='dsp'/><title type='text'>Tasty Important</title><subtitle type='html'>The place where I put my thoughts on software development, so I can remove them from my mind.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-43221744331604755</id><published>2012-01-24T20:14:00.001+01:00</published><updated>2012-01-24T20:15:33.994+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming language designers: reclaim the bitwise operators!</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Considering that:&lt;br /&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;most programming work does not access the machine's hardware directly, and&lt;/li&gt;&lt;li&gt;using bit fields for memory optimizations is not necessary anymore in most cases, and&lt;/li&gt;&lt;li&gt;bitwise operators use several really enviable characters (~, &amp;amp;, ^, |, for example,) and&lt;/li&gt;&lt;li&gt;bit manipulation can be handled with a simple library and does not need to be built into a language,&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I say: stop copying these operators from new language to new language! They were an important part of the C programming language, which is to this day twiddling uncountable amounts of bits per second. For a new, non-system programming language, they are extremely out of place.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Finally we will be able use &amp;amp; and | for boolean operations instead of &amp;amp;&amp;amp; and || !&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/2417759645921975473-43221744331604755?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/43221744331604755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=43221744331604755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/43221744331604755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/43221744331604755'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2012/01/programming-language-designers-reclaim.html' title='Programming language designers: reclaim the bitwise operators!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7714236003774611847</id><published>2012-01-22T14:21:00.000+01:00</published><updated>2012-01-22T14:21:05.427+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Lost my religion</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;A few months ago, I was involved in a rather disastrous project. After consistently pointing out the problems we had, I was told by the person who should have been solving those problems to either quit complaining, or leave. Since I couldn't live with the constant frustration of clearly seeing issues but not being allowed to even talk about them, I left. It was a great relief, although I feel a little bad for that team, since it still has the same problems.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've been claiming to be an &lt;a href="http://www.blogger.com/"&gt;&lt;span id="goog_1488010791"&gt;&lt;/span&gt;Agile&amp;nbsp;guerrillero&lt;span id="goog_1488010792"&gt;&lt;/span&gt;&lt;/a&gt; for quite a few years now. If I enter your organisation, you will slowly see things change more and more into the Agile direction. A typical bottom-up person. Sadly, trying to get the disaster team on track with the guerrillero approach took so much of my energy that it dominated my life. That's not something I want to happen again. That made me rethink what I had been fighting for.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;A way to get my actual programming work done with the least amount of overhead and frustration.&lt;/i&gt; That's what it was. I called it Agile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The whole company has been transitioning to Agile for a while now. Well okay, everybody calls it Scrum here, because that's the only thing people hear all day, so much that most people can't tell Agile and Scrum apart. &lt;span class="Apple-style-span" style="font-size: xx-small;"&gt;Remind me to complain loudly about Scrum someday. &lt;/span&gt;The company and I are not talking about the same Agile. I'm certain that I understand the spirit of Agile, and that major parts of the company do not (yet) understand. But who am I? I cannot convert the company on my own when so many people are either completely uninterested, misled, or actively frustrating an Agile revolution.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But that's fine, since fighting for Agile &lt;i&gt;should never have been my goal.&lt;/i&gt; Getting rid of overhead and frustration; that's the goal, whether it's taking ideas from Agile, Lean, or even &lt;a href="http://en.wikipedia.org/wiki/Waterfall_model"&gt;waterfall&lt;/a&gt;. I don't need a revolution, and most companies do not want or need one anyway.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hereby cancel my membership of the &lt;a href="http://crankypm.com/2008/09/agile-software-development-is-no-silver-bullet/"&gt;Church of Agile&lt;/a&gt;.&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/2417759645921975473-7714236003774611847?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7714236003774611847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7714236003774611847' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7714236003774611847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7714236003774611847'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2012/01/lost-my-religion.html' title='Lost my religion'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5403948100476009498</id><published>2011-12-16T17:33:00.000+01:00</published><updated>2011-12-28T17:07:43.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ecmascript'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='canvas'/><title type='text'>Learning JavaScript</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;I'm currently learning JavaScript because, sadly, it's the language that runs the HTML5 canvas, the most accessible platform for games in the future.&lt;br /&gt;&lt;br /&gt;Learning JavaScript is a disaster. Just like when I was trying to learn ActionScript, I keep finding articles all over the web written by badly informed people. People who are so happy that they got something to work by copy/pasting stuff together from other places that they will post it on their blogs, announcing it as the new state of the art. Some will write complete sites with misleading and/or incomplete tutorials.&lt;br /&gt;&lt;br /&gt;Bah.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Addition: &lt;a href="http://dmitrysoshnikov.com/ecmascript/"&gt;this&lt;/a&gt; is the kind of article I want to see. It's concise, it's clear, it's correct.&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5403948100476009498?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5403948100476009498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5403948100476009498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5403948100476009498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5403948100476009498'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2011/12/learning-javascript.html' title='Learning JavaScript'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4775388240200747169</id><published>2011-12-06T18:53:00.001+01:00</published><updated>2011-12-28T17:47:48.918+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse xtend'/><title type='text'>Eclipse Xtend</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;There seems to be very little hype around the &lt;a href="http://www.eclipse.org/Xtext/xtend/"&gt;Eclipse Xtend&lt;/a&gt; programming language. That could be because it doesn't really stand out, and has an air of hobbyism about it.&lt;br /&gt;&lt;br /&gt;But Xtend is very different from every other new JVM language! Not because of the language it is, but because it offers a very good Eclipse plugin, and because it compiles to Java. Both of them make this language very easy to pick up. You can start using it at work right away.&lt;span style="font-size: xx-small;"&gt; Or, maybe wait for the Maven plugin.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Do yourself a favor and install it.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Update: looks like they kept their promise for a much improved version - it looks complete now!&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4775388240200747169?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4775388240200747169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4775388240200747169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4775388240200747169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4775388240200747169'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2011/12/eclipse-xtend.html' title='Eclipse Xtend'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5240037472790762291</id><published>2010-04-04T23:48:00.003+02:00</published><updated>2010-04-05T00:14:39.437+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='video'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='ogg'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><title type='text'>The state of Ogg on Java</title><content type='html'>&lt;a href="http://en.wikipedia.org/wiki/Ogg"&gt;Ogg Vorbis and Theora&lt;/a&gt; are great free audio and video formats. There are no great Java libraries for them, though.&lt;br /&gt;&lt;br /&gt;Ogg is the format for streaming data. It does not say anything about the data it may contain. Inside Ogg, we can have Vorbis - audio data like mp3, and/or Theora - video data, and/or more.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xiph.org/"&gt;Xiph,&lt;/a&gt; who made the specifications of all this stuff, started out with a few reference implementations of these in C.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jcraft.com/jorbis/"&gt;JOrbis&lt;/a&gt; is the most common implementation of Ogg and Vorbis. It's a very ugly port of the reference implementation, but is also quite complete.&lt;/li&gt;&lt;li&gt;&lt;a href="http://xiph.org/downloads/"&gt;vorbis-java&lt;/a&gt; is comparable to JOrbis, but even though it's hosted on Xiph's site, it seems to have been a one-off hack project of some guy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.j-ogg.de/"&gt;J-Ogg&lt;/a&gt; is mostly a clean implementation of Ogg, Vorbis, FLAC and Theora. The code looks nice, but the implementation isn't finished. Vorbis and FLAC are good enough for most cases, but Theora support does nothing much yet.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.theora.org/cortado/"&gt;Cortado&lt;/a&gt; is a collection of libraries - JOrbis in combination with some Fluendo stuff, like a Theora decoder. The most important thing is that this library is under active development (probably motivated because it's being used by &lt;a href="http://en.wikipedia.org/wiki/Special:Random"&gt;Wikipedia&lt;/a&gt;,) whereas the others haven't received any updates for years.&lt;/li&gt;&lt;/ul&gt;None of these options make me very happy. Still, Cortado should give the best overall options. &lt;span style="font-size:78%;"&gt;And none of these libraries are available on Maven. Hurray for dependency hell!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5240037472790762291?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5240037472790762291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5240037472790762291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5240037472790762291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5240037472790762291'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2010/04/state-of-ogg-on-java.html' title='The state of Ogg on Java'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1183711353170814475</id><published>2010-01-06T19:18:00.003+01:00</published><updated>2010-01-06T19:45:06.914+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e-reader'/><title type='text'>Some thoughts on e-readers</title><content type='html'>After having an e-reader for a month and using it a lot, I have gathered my experience with it here.&lt;br /&gt;&lt;br /&gt;Good points:&lt;br /&gt;+ you can store an unimaginable amount of books on it. Within a few hours, I had half a bookcase of books on it. That was before I added an SD card. &lt;span style="font-size:78%;"&gt;I'm not sure if I can still claim ownership of these books on librarything though, that would feel strange.&lt;/span&gt;&lt;br /&gt;+ it's very easy to carry along - especially my 5" reader. The screen size is not a problem, because all the text should be resizable. &lt;span style="font-size:78%;"&gt;In theory.&lt;/span&gt;&lt;br /&gt;+ the screen is well readable thanks to the e-ink technology. There is no backlight that shines in your eyes, and there is not much glare.&lt;br /&gt;&lt;br /&gt;Bad points:&lt;br /&gt;- Flipping pages is slow. E-readers are best for reading a book from start to end, and are less suited for browsing around in a book. A search function helps.&lt;br /&gt;- It's really obvious, but I never thought about this before I bought it: there is only one device. I read books in bed, in the living room, in public transportation, at work, on holiday, and I have to lug the one single e-reader everywhere. I think I'll buy a few more once they get cheaper.&lt;br /&gt;- The major point: file format support is really shitty. There are some formats that support reflowing well, but formats like PDF and plain text don't. The device tries, but often makes an unreadable mess out of it. As a programmer, I would say that it's logical to parse all file formats into a single general format, then pass that to the module that renders pages to the screen. Not even that is true. All file formats render differently, and have different abilities. Some can be zoomed five times, some resist zooming. Some can be rotated, some can't. Some have a table of contents that can be navigated, some don't. None of them show page numbers and the total page count correctly.&lt;br /&gt;&lt;br /&gt;Now, that last part may be partly the fault of my particular model, but I've seen more complaints about other devices.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;(Mine's a &lt;a href="http://mybebook.com/p11/bebook-mini-ereader/product_info.html"&gt;bebook mini,&lt;/a&gt; by the way. It's a rebranded &lt;a href="http://www.jinke.com.cn/Compagesql/English/embedpro/prodetail.asp?id=42"&gt;Jinke V5.&lt;/a&gt;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1183711353170814475?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1183711353170814475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1183711353170814475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1183711353170814475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1183711353170814475'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2010/01/some-thoughts-on-e-readers.html' title='Some thoughts on e-readers'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4149472748549548781</id><published>2009-12-24T18:54:00.003+01:00</published><updated>2009-12-24T19:05:42.796+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Who needs exception handling anyway?</title><content type='html'>Ok, disregard all my previous posts about exception handling. I think I finally understand why Scala doesn't really do a lot about it: it has constructs that handle the checked exception cases very well.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://old.nabble.com/Option...aly-bored-td26893316.html"&gt;Here's the discussion&lt;/a&gt; that made me realize this. The summary would be that with classes like Option and Either, it's possible to return the normal result of a method, and sometimes return something exceptional. Option lets you return the results or "none." Either lets you return one of two types of results, and &lt;a href="http://www.scala-lang.org/docu/files/api/scala/Either.html"&gt;the documentation&lt;/a&gt; already states how one of them is seen as the normal result, and the other the exceptional result.&lt;br /&gt;&lt;br /&gt;Scala supports these kinds of classes very well, so it seems that there's not much of a reason to demand checked exceptions anymore. The only runtime exceptions would be the ones that are considered fatal (out of memory) or programming errors (division by zero.) They can still be caught, but not many people would want to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4149472748549548781?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4149472748549548781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4149472748549548781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4149472748549548781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4149472748549548781'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/12/who-needs-exception-handling-anyway.html' title='Who needs exception handling anyway?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-9219467524501948132</id><published>2009-12-14T20:18:00.002+01:00</published><updated>2009-12-14T20:20:29.102+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='gae'/><title type='text'>Google App Engine</title><content type='html'>Don't you wonder what the ratio of serious apps vs. "OMFG the cloud is so cool! Let's try it!"-apps on Google App Engine is?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-9219467524501948132?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/9219467524501948132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=9219467524501948132' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9219467524501948132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9219467524501948132'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/12/google-app-engine.html' title='Google App Engine'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6186571568621955296</id><published>2009-11-11T22:20:00.001+01:00</published><updated>2009-11-11T22:21:34.618+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dht'/><category scheme='http://www.blogger.com/atom/ns#' term='mapreduce'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>A decent explanation of MapReduce</title><content type='html'>&lt;a href="http://www.cloudera.com/hadoop-training-basic"&gt;Here it is&lt;/a&gt;, it made me go "aha!"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6186571568621955296?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6186571568621955296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6186571568621955296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6186571568621955296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6186571568621955296'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/11/decent-explanation-of-mapreduce.html' title='A decent explanation of MapReduce'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2221881296160329587</id><published>2009-11-01T14:19:00.003+01:00</published><updated>2009-11-01T14:47:58.352+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><title type='text'>Compiling Increpare's Home on Ubuntu</title><content type='html'>&lt;span style="font-family:courier new;"&gt;sudo apt-get install liballegro4.2-dev&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;sudo apt-get install libaldmb1-dev&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;gcc main.cpp -ohome -lstdc++ -lalleg -lX11 -lXext -lXpm -ldumb -laldmb -lpthread&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;./home. Fail to initialize sound. Black screen. Crash to prompt. Argh!!!&lt;br /&gt;&lt;br /&gt;... Ran the Windows version with Wine. Only sound and a black screen. Then the whole screen distorts. Crash.&lt;br /&gt;&lt;br /&gt;... Ran the Windows version on Windows 7 in VirtualBox. Sound stutters, but at least it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2221881296160329587?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2221881296160329587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2221881296160329587' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2221881296160329587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2221881296160329587'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/11/compiling-increpares-home-on-ubuntu.html' title='Compiling Increpare&apos;s Home on Ubuntu'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1674935517829820072</id><published>2009-10-17T15:18:00.006+02:00</published><updated>2009-10-17T15:35:57.450+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Maven haters are tiresome</title><content type='html'>People who are still building their stuff with ant or something even more frivolous are wasting everyone's time, including their own. Fighting Maven is so "2007" - most people moved on. Stop being an autistic prick.&lt;br /&gt;&lt;br /&gt;Any person with a little experience with Maven will &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; go back to Ant. That's reality.&lt;br /&gt;&lt;br /&gt;Any person who uses Maven will &lt;span style="font-style: italic;"&gt;ignore&lt;/span&gt; any library that is not in a Maven repository. That's reality.&lt;br /&gt;&lt;br /&gt;Most people have moved on to Maven. &lt;span style="font-style: italic;"&gt;Most people are ignoring your library.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've just spent an hour trying to get &lt;a href="http://code.google.com/p/jmockit/"&gt;jmockit&lt;/a&gt; to build, because it looks like a really great mocking library, but I got tired figuring out correct version numbers of dependencies, making sense of all the crap that's in the subversion repository, wondering about all the little hacks that are in there... Just forget it, I'll be using the vastly inferior &lt;a href="http://easymock.org/"&gt;EasyMock&lt;/a&gt; instead. That means I can't introduce jmockit at work either, because everybody there is using Maven, just like every other Java developer I know.&lt;br /&gt;&lt;br /&gt;And here's an angry look at the Hamcrest people too: &lt;a href="http://code.google.com/p/hamcrest/issues/detail?id=12"&gt;this is childish behaviour,&lt;/a&gt; get your build up to shape and do your own releases. Don't be ignorant!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(or wait for &lt;a href="http://www.google.nl/search?q=maven+3"&gt;Maven 3&lt;/a&gt;)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1674935517829820072?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1674935517829820072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1674935517829820072' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1674935517829820072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1674935517829820072'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/10/maven-haters-are-tiresome.html' title='Maven haters are tiresome'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-778426494500157727</id><published>2009-09-26T17:32:00.003+02:00</published><updated>2009-09-26T18:05:19.589+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>First Wicket project: done!</title><content type='html'>&lt;a href="http://www.bel-me-niet.nl/"&gt;Bel me niet&lt;/a&gt; is a new construct in the Netherlands: every company, no matter how big or small, needs to check a central database to see if they can make commercial calls to people. They must allow everybody they call to opt out, and this information has to be sent to the central database.&lt;br /&gt;&lt;br /&gt;My first project was a simple application for the large financial institution I currently work for to query, submit, and filter phone numbers with a local copy of the central database. My task was to develop the web layer. Since the people on the project had had good previous experience with Wicket, it was chosen for this project too. I was quite happy, devout readers of this blog (all two of them) will know that I think most web development sucks wildly, and that Wicket is the only decent web development tool out there.&lt;br /&gt;&lt;br /&gt;The project was done in about ten working days. I had some experience, mostly because I read a lot about Wicket, including &lt;a href="http://manning.com/dashorst/"&gt;THE BOOK.&lt;/a&gt; With &lt;a href="http://wicket.apache.org/quickstart.html"&gt;the maven archetype&lt;/a&gt; I was up and running in about ten minutes, including fetching coffee and figuring out the correct package names. Running "Start.java", located between the unit tests, quickly started a Jetty server with the application running.&lt;br /&gt;&lt;br /&gt;After that, everything went quickly, with a few hiccups thanks to my newness. I was mapping fields to the model I got from the business layer, putting common stuff into subcomponents, writing clean HTML, never bothered by session management or the contents of requests. That's the best thing about Wicket: you program on a higher level than the wire protocol that is HTTP. You program with components. The visual components have a visible bit, stored in an HTML file, a logical bit, which is in the code, and a bunch of data they control, which is in a model. &lt;span style="font-size:78%;"&gt;(I won't call it MVC, since everything claims to be MVC nowadays, so the term is useless.)&lt;/span&gt; It's simple. Yes, there is a learning curve, since web developers are not used to thinking at a higher level about their application - it's all about GET and POST, right? Total control of every bit on the line? No, it is not. Let's put that on one line for people who only read the conclusion of a blog post, since I didn't really have a point anyway:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web development is not about loving the HTTP protocol.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;And Wicket is really cool!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-778426494500157727?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/778426494500157727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=778426494500157727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/778426494500157727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/778426494500157727'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/09/first-wicket-project-done.html' title='First Wicket project: done!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2442082467179703053</id><published>2009-08-12T20:40:00.003+02:00</published><updated>2009-08-12T20:59:02.652+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Book review: Flash CS4 Professional Advanced for Windows and Macintosh: Visual QuickPro Guide</title><content type='html'>I should have known from the ludicrous title that &lt;a href="http://www.amazon.co.uk/Flash-Professional-Advanced-Windows-Macintosh/dp/0321573501"&gt;this book&lt;/a&gt; is nearly worthless...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.gotoandlearn.com/play?id=87"&gt;&lt;span style="font-weight: bold;"&gt;Flash CS4&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Professional&lt;/span&gt;&lt;/a&gt; - yes, that's what the book is about.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Advanced&lt;/span&gt; - "Beginner" means you managed to install the Flash IDE. "Intermediate" means you started it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;for Windows and Macintosh&lt;/span&gt; - for platforms that run the Flash tools!&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Visual&lt;/span&gt; - it's not an audiobook.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;QuickPro&lt;/span&gt; - the author decided he was "pro" a little too quick.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Guide&lt;/span&gt; - you will be told exactly which keys to press in a bulleted list, even when writing a line of code.&lt;/li&gt;&lt;/ol&gt;Now I've bought "&lt;a href="http://www.amazon.co.uk/Essential-ActionScript-3-0-Colin-Moock/dp/0596526946"&gt;Essential Actionscript 3.0&lt;/a&gt;" - this better be good!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2442082467179703053?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2442082467179703053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2442082467179703053' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2442082467179703053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2442082467179703053'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/08/book-review-flash-cs4-professional.html' title='Book review: Flash CS4 Professional Advanced for Windows and Macintosh: Visual QuickPro Guide'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6007295770450893957</id><published>2009-08-02T13:24:00.004+02:00</published><updated>2009-08-02T13:46:07.325+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Timing in a game loop in AS3</title><content type='html'>&lt;a href="http://www.bit-101.com/blog/?p=910"&gt;This&lt;/a&gt; is the first useful article I read about timing in ActionScript 3.&lt;br /&gt;&lt;br /&gt;I guess that, when I stop reading and start coding, my main loop will be something like this:&lt;br /&gt;&lt;br /&gt;1. set the frame rate of the movie to something like 60.&lt;br /&gt;&lt;br /&gt;2. in on_enter_frame event on root of the display list:&lt;br /&gt;  - check the time elapsed since the last on_enter_frame&lt;br /&gt;  - see if that time is close to some multiple of 1/60. If so: round it to that.&lt;br /&gt;  - calculate how many frames have passed (hopefully 1, maybe more)&lt;br /&gt;  - run game logic for the amount of frames that have passed.&lt;br /&gt;  - do display update (if necessary?)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is very much like the game loops I used to write in &lt;a href="http://www.youtube.com/watch?v=5KJ__06kyxs"&gt;the nineties&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;1. set a video mode that runs at 60Hz.&lt;br /&gt;2. create an interrupt handler that runs at 60Hz, plus/minus a bit to keep synchronized to the vertical retrace (the point where the monitor moves the ray back to the top of the screen to build another image.) Make it increase the frame counter.&lt;br /&gt;3. Outside everything: wait for the frame counter to change.&lt;br /&gt;4. By how much did it change? That many times we need to run the game logic.&lt;br /&gt;5. Update the display once.&lt;br /&gt;6. goto 3.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(That interrupt handler was a drama to write. If only the &lt;a href="http://en.wikipedia.org/wiki/Video_Graphics_Array"&gt;VGA standard&lt;/a&gt; had a &lt;a href="http://www.c64-wiki.com/index.php/Raster_interrupt"&gt;raster interrupt&lt;/a&gt; like the &lt;a href="http://www.lemon64.com/"&gt;Commodore 64&lt;/a&gt; :-/ )&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6007295770450893957?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6007295770450893957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6007295770450893957' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6007295770450893957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6007295770450893957'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/08/timing-in-as3.html' title='Timing in a game loop in AS3'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5365240980018384620</id><published>2009-07-26T15:19:00.003+02:00</published><updated>2009-07-26T15:38:07.539+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='as3'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Actionscript 3: in the land of the blind...</title><content type='html'>Diving into the world of Flash games, I started learning ActionScript 3, which is the language behind the latest Flash implementations. It suffesr a bit from the "oh no, not another language!" syndrome, falling somewhere between Javascript's sloppiness and Java's strictness. I wasn't expecting a decent language like this in Flash, though. The previous times I looked at Flash, it had the most horrible language, with a gigantic amount of limitations everywhere, which put me off using it.&lt;br /&gt;&lt;br /&gt;Currently I'm trying to get a decent environment working. It seems one has to use the free Flex SDK to get anything to compile at all. There's a free Eclipe plugin &lt;span style="font-size:78%;"&gt;(man, I got so used to open source stuff that I'm getting really pissed off with the large amount of payware for Flash development!) &lt;/span&gt;called AXDT, which seems to be usable.&lt;br /&gt;&lt;br /&gt;There are many tutorials that are really very funny, because the programming style in them is so incredibly bad :D Look at the amount of variables &lt;a href="http://www.8bitrocket.com/newsdisplay.aspx?newspage=8141"&gt;this guy&lt;/a&gt; is declaring :D And &lt;a href="http://www.mrsunstudios.com/2008/08/tutorial-create-a-platform-game-in-as3/"&gt;this one&lt;/a&gt;: just dump a chunk of lousy code on your reader without much of an explanation, then tell them that it's really &lt;span style="font-weight: bold; font-style: italic;"&gt;intense!&lt;/span&gt; Beneath those tutorials, you'll see a lot of happy people, so it is as they say: in the land of the blind, one-eye is king ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5365240980018384620?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5365240980018384620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5365240980018384620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5365240980018384620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5365240980018384620'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/07/actionscript-3-in-land-of-blind.html' title='Actionscript 3: in the land of the blind...'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3989597032536799621</id><published>2009-07-26T15:04:00.003+02:00</published><updated>2009-07-26T15:19:23.781+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala: I'll see it when it gets there</title><content type='html'>For a while, I've been very interested in Scala. That came to a stop when I read &lt;a href="http://www.nabble.com/-scala--Library-Change-Request-td24615066.html"&gt;a particular thread&lt;/a&gt; on the mailing list. A remark about the name of a method got a lot of "humorous" remarks, showing that some people who are working on Scala really don't realize that Java, the language it likes to replace, is especially big in the enterprise market. Enterprise people happen to care about naming &lt;span style="font-style: italic;"&gt;a lot&lt;/span&gt;. It's not just about naming, it shows that these people haven't worked on the projects where Java is used at its best, and therefore miss the experience to make decisions for this target group.&lt;br /&gt;&lt;br /&gt;Well, that sucks. I'll spend my time on something else instead.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Only having runtime exceptions is another mistake, ofcourse) (and having an annotation called @cps. What is it? Characters Per Second?)&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/2417759645921975473-3989597032536799621?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3989597032536799621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3989597032536799621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3989597032536799621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3989597032536799621'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/07/scala-ill-see-it-when-it-gets-there.html' title='Scala: I&apos;ll see it when it gets there'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1505462098871589018</id><published>2009-07-02T22:55:00.002+02:00</published><updated>2009-07-02T23:23:39.791+02:00</updated><title type='text'>DZone does not know what refcards are</title><content type='html'>Reference cards are 1-page (or even smaller) collections of essential information, listed in a simple format. &lt;a href="http://images.google.nl/images?q=reference card"&gt;Google image search shows many examples.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;DZone thinks that reference cards are multi-page introductory texts to some kind of topics, almost like short commercials. They're using them to get more visitors to their site. I did visit the site, downloaded a few "refcardz," and never used them, simply because they are not reference cards.&lt;br /&gt;&lt;br /&gt;Ok, I'm done complaining now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1505462098871589018?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1505462098871589018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1505462098871589018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1505462098871589018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1505462098871589018'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/07/dzone-does-not-know-what-refcards-are.html' title='DZone does not know what refcards are'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3259928974365287499</id><published>2009-06-24T20:42:00.001+02:00</published><updated>2009-06-24T20:43:38.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><title type='text'>Woo! New Eclipse!</title><content type='html'>Just downloaded the yearly Eclipse release!&lt;br /&gt;&lt;br /&gt;The boot logo is still the same old ugly purple smears one :(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3259928974365287499?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3259928974365287499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3259928974365287499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3259928974365287499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3259928974365287499'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/woo-new-eclipse.html' title='Woo! New Eclipse!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7535625223028124186</id><published>2009-06-24T20:26:00.003+02:00</published><updated>2009-06-24T20:29:32.616+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>How do I subclass Exception in Scala?</title><content type='html'>Well, how? How can I do this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class LunchTimeException extends Exception {&lt;br /&gt; public LunchTimeException() {&lt;br /&gt;  super();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public LunchTimeException(String message) {&lt;br /&gt;  super(message);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public LunchTimeException(String message, Throwable throwable) {&lt;br /&gt;  super(message, throwable);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public LunchTimeException(Throwable throwable) {&lt;br /&gt;  super(throwable);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It was one of the first things I wanted to do, and I couldn't because of the weird requirement that all constructors simply call the main constructor. That means that you can only call one super constructor too :-/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7535625223028124186?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7535625223028124186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7535625223028124186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7535625223028124186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7535625223028124186'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/how-do-i-subclass-exception-in-scala.html' title='How do I subclass Exception in Scala?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7604326426864927473</id><published>2009-06-16T21:03:00.005+02:00</published><updated>2009-06-16T21:24:01.081+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='midi'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Using Ubuntu as a midi through</title><content type='html'>A week ago, I bought an &lt;a href="http://www.c-thru-music.com/cgi/?page=prod_axis-49"&gt;Axis-49.&lt;/a&gt; A brilliant (but ugly) &lt;a href="http://en.wikipedia.org/wiki/MIDI_keyboard"&gt;midi keyboard&lt;/a&gt; with hexagonal keys tuned to &lt;a href="http://www.c-thru-music.com/cgi/?page=layout_notemap"&gt;the harmonic table.&lt;/a&gt; It's very easy to make nice sound with it.&lt;br /&gt;&lt;br /&gt;Problem: I wanted to plug it into my &lt;a href="http://www.alesis.com/micron"&gt;Alesis Micron synthesizer.&lt;/a&gt; The Micron has a &lt;a href="http://en.wikipedia.org/wiki/Musical_Instrument_Digital_Interface"&gt;midi&lt;/a&gt; in, of course, but the Axis-49 has no midi out. It connects directly to a USB port, where the OS will recognize it as a midi in.&lt;br /&gt;&lt;br /&gt;Solution: connect the Axis to a PC with Ubuntu installed (or any Linux with &lt;a href="http://www.alsa-project.org/main/index.php/Main_Page"&gt;ALSA&lt;/a&gt; on it.) Connect the Micron to the same PC with a USB to midi cable. Then use ALSA's aconnect:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;danny@danny-ubuntu-laptop:~$ aconnect -io&lt;br /&gt;client 0: 'System' [type=kernel]&lt;br /&gt;  0 'Timer           '&lt;br /&gt;  1 'Announce        '&lt;br /&gt;client 14: 'Midi Through' [type=kernel]&lt;br /&gt;  0 'Midi Through Port-0'&lt;br /&gt;client 20: 'AXIS-49 USB Keyboard' [type=kernel]&lt;br /&gt;  0 'AXIS-49 USB Keyboard MIDI 1'&lt;br /&gt;client 24: 'USB Uno MIDI Interface' [type=kernel]&lt;br /&gt;  0 'USB Uno MIDI Interface MIDI 1'&lt;br /&gt;danny@danny-ubuntu-laptop:~$ aconnect 20:0 24:0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Boring hostname, eh?)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And now, ALSA sends the output from the Axis to the input from the Micron - happy playing :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7604326426864927473?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7604326426864927473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7604326426864927473' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7604326426864927473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7604326426864927473'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/using-ubuntu-as-midi-through.html' title='Using Ubuntu as a midi through'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7768412303561765803</id><published>2009-06-14T19:34:00.005+02:00</published><updated>2009-06-14T19:47:03.883+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>JavaFX &amp; Scala</title><content type='html'>How to make JavaFX really, really great:&lt;br /&gt;&lt;br /&gt;1. remove &lt;a href="http://www.sun.com/software/javafx/script/"&gt;JavaFX Script&lt;/a&gt;&lt;br /&gt;2. insert &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The JavaFX libraries are good, the tools are starting to get better, the platform is nice, it's all good, &lt;a href="http://tastyimportant.blogspot.com/2008/12/thought-on-experiments-with-javafx.html"&gt;except for that silly retarded language that tries to tie everything together.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(There seems to be a &lt;a href="http://lampsvn.epfl.ch/trac/scala/browser/scala-experimental/trunk/sfx"&gt;JavaFX clone hanging around in the Scala experimental repository&lt;/a&gt;, but it's completely vague what its status is. Well, not completely true, it seems that the plan is to recreate everything, including all JavaFX libraries, which is ofcourse a huge waste of time.)&lt;br /&gt;(&lt;a href="http://www.scala-lang.org/docu/files/api/scala/swing$content.html"&gt;Scala-swing&lt;/a&gt;, which is mostly a layer of useless confusion on top of Swing, could also benefit from a look at JavaFX.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7768412303561765803?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7768412303561765803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7768412303561765803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7768412303561765803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7768412303561765803'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/javafx-scala.html' title='JavaFX &amp; Scala'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6542719847905824799</id><published>2009-06-14T15:04:00.004+02:00</published><updated>2009-06-14T15:29:04.330+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Lesson learned from C++: define operators rarely</title><content type='html'>Lately I've seen several blogs that seem to love the support for user definable operators in Scala, &lt;a href="http://dev.day.com/microsling/content/blogs/main/scalajcr4.html"&gt;like this one&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now children, take this bit of advice from uncle Danny: C++ thought us&lt;span style="font-size:78%;"&gt; (or me at least) &lt;/span&gt;that defining new operators at every opportunity is going to make your code unreadable. Nobody knows what your #$&amp;amp;@ operator means until they read the documentation. A simple method name is more readable because it documents itself.&lt;br /&gt;&lt;br /&gt;Here's your free algorithm:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;X = your new functionality&lt;br /&gt;&lt;br /&gt;IF X is close in meaning to one of the common operators (+, -, +=, |, etc.) THEN&lt;br /&gt;  you &lt;b&gt;may&lt;/b&gt; use this operator for X&lt;br /&gt;ELSE IF X is a very common function when using your code THEN&lt;br /&gt;  you &lt;b&gt;may&lt;/b&gt; define a custom operator for X&lt;br /&gt;ELSE&lt;br /&gt;  &lt;b&gt;don't&lt;/b&gt; use an operator, just take an alphanumeric method name&lt;br /&gt;END IF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(The worst abuse of operator overloading I've seen was where a library redefined the * operator to do something completely random. I saw this when several programmers tried to make sense of some code that was using it. I couldn't even convince them that it was overloaded in a very, very bad way because it made so little sense!)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6542719847905824799?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6542719847905824799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6542719847905824799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6542719847905824799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6542719847905824799'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/lesson-learned-from-c-define-operators.html' title='Lesson learned from C++: define operators rarely'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-8417951336707822433</id><published>2009-06-10T20:38:00.001+02:00</published><updated>2009-06-10T20:40:45.388+02:00</updated><title type='text'>Programmer jokes</title><content type='html'>Why doesn't C++ have a garbage collector?&lt;br /&gt;&lt;br /&gt;Because there would be nothing left!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/234075/programmer-jokes-whats-your-best-one"&gt;Lots more over at Stack Overflow!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-8417951336707822433?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/8417951336707822433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=8417951336707822433' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8417951336707822433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8417951336707822433'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/programmer-jokes.html' title='Programmer jokes'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5703331579523128466</id><published>2009-06-03T21:22:00.002+02:00</published><updated>2009-06-03T21:27:56.668+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala is a trap!</title><content type='html'>One day, you're happily experimenting with &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; as a new Java.&lt;br /&gt;&lt;br /&gt;A month later, you're excitedly telling your colleagues about functional programming.&lt;br /&gt;&lt;br /&gt;Now it's year later, and you're programming in &lt;a href="http://www.haskell.org/"&gt;Haskell.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Scala is a trap set by Haskellers to show the imperatives the beauty of the functional world!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(I have yet to see that beauty, by the way)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5703331579523128466?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5703331579523128466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5703331579523128466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5703331579523128466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5703331579523128466'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/scala-is-trap.html' title='Scala is a trap!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7742691927161176495</id><published>2009-06-03T20:36:00.002+02:00</published><updated>2009-06-03T21:00:08.053+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='kanban'/><title type='text'>-&gt; Kanban</title><content type='html'>After doing iterative development for a while, and really diving into the subject matter, I've started to feel that iterative development introduces many artificial rough spots. Fitting work inside an iteration, having an end and start to an iteration, relying on so many factors to make it work right - that seems like a lot of trouble to go through.&lt;br /&gt;&lt;br /&gt;I really want to experiment with throwing out the iterations, and replacing them by Kanban. Simply visualize what you're working on to show progress and analyze problems, and limiting work in progress to make sure that things keep getting done on a regular basis. This feels much more like organizing a natural way of working, unlike the artificial fragmentation iterative development causes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7742691927161176495?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7742691927161176495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7742691927161176495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7742691927161176495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7742691927161176495'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/06/kanban.html' title='-&gt; Kanban'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5231389901405781798</id><published>2009-05-23T02:45:00.005+02:00</published><updated>2009-05-23T03:06:22.533+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Raw Java types and overriding in Scala</title><content type='html'>A Java class or interface may have a method like this:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public interface Bla {&lt;br /&gt;void bla(Map x);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can inherit from it in Scala like this, using &lt;span style="color: rgb(255, 0, 0);font-size:130%;" &gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;existential types&lt;/span&gt;&lt;/span&gt; woot woot woot &lt;span style="font-size:78%;"&gt;I don't know what the hell those are&lt;/span&gt;:&lt;br /&gt;&lt;pre name="code" class="scala"&gt;&lt;br /&gt;class X extends Bla {&lt;br /&gt;def bla(x: Map[_,_]):Unit {&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But what good is a Map[_,_] ? I really don't know, so for now I'm asInstanceOffing it to the map I want it to be :-/&lt;br /&gt;&lt;br /&gt;After that, it gets a Scala make-over by wrapping the Java map with a scala JCL wrapper.&lt;br /&gt;&lt;pre name="code" class="scala"&gt;&lt;br /&gt;class X extends Bla {&lt;br /&gt;def bla(x: Map[_,_]):Unit {&lt;br /&gt;  val wellTypedMap=x.asInstanceOf[Map[String, Int]]&lt;br /&gt;  val scalaMap=scala.collection.jcl.Map(wellTypedMap)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What am I supposed to do here? Go matching?&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Great, I just installed syntax highlighting here, and now I need to upgrade it for Scala support. Bleh, Javascript hacking required :( )&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5231389901405781798?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5231389901405781798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5231389901405781798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5231389901405781798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5231389901405781798'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/05/raw-java-types-and-overriding-in-scala.html' title='Raw Java types and overriding in Scala'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7025502893768873614</id><published>2009-05-11T21:56:00.004+02:00</published><updated>2009-05-22T14:21:09.972+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Tip: the IDE with the best Scala support</title><content type='html'>Not the Eclipse plugin: that kept going into a state of total confusion while I was programming.&lt;br /&gt;Not the Netbeans plugin: it can't handle a Java Maven project that depends on a Scala Maven project.&lt;br /&gt;&lt;br /&gt;IntelliJ IDEA has the best Scala support: things work most of the time! I think I'm going to convince my fine company to buy it for me.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Update: OK, I take everything back. IDEA has also started giving me trouble with a dependency written in Scala &gt;:(&lt;br /&gt;&lt;br /&gt;Update: Looks like &lt;a href="http://jetbrains.net/confluence/display/SCA/Getting+Started+with+IntelliJ+IDEA+Scala+Plugin"&gt;IDEA just doesn't support Maven Scala projects&lt;/a&gt; very well yet.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;My personal conclusion: None of the major IDE's have a stable Scala plugin, but the one from IntelliJ IDEA has the most features at the moment. Now to convince my company in this time of crisis :)&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/2417759645921975473-7025502893768873614?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7025502893768873614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7025502893768873614' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7025502893768873614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7025502893768873614'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/05/tip-ide-with-best-scala-support.html' title='Tip: the IDE with the best Scala support'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4860796380065646457</id><published>2009-05-09T21:45:00.004+02:00</published><updated>2009-05-09T22:07:54.844+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Spring component scanning from Java</title><content type='html'>To quickly wire up a command line application with Spring's annotated component scanning feature, put this in your main class:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;private static ApplicationContext initializeApplicationContext() {&lt;br /&gt;  final GenericApplicationContext context = new GenericApplicationContext();&lt;br /&gt;  final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);&lt;br /&gt;  scanner.scan("com.laamella.harakiri");&lt;br /&gt;  context.refresh();&lt;br /&gt;  return context;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's pretty basic: create an application context, create a scanner that's connected to the context, then make the scanner scan.&lt;br /&gt;&lt;br /&gt;I can't say that this is the one and only way to do it, but it works well. If you want to add some stuff to the context that the scanned components can use, you could use this:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;context.getBeanFactory().registerSingleton("beanId", someObject);&lt;br /&gt;&lt;/pre&gt;&lt;a href="http://www.stehno.com/node/22"&gt;A blog by Christopher Stehno gave me some ideas for this.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4860796380065646457?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4860796380065646457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4860796380065646457' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4860796380065646457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4860796380065646457'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/05/spring-component-scanning-from-java.html' title='Spring component scanning from Java'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4646548298240422066</id><published>2009-05-09T18:35:00.000+02:00</published><updated>2009-05-11T22:02:21.207+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Solving exception handling: the golden path is in the middle of the road</title><content type='html'>The bad thing about checked exceptions is their insistence on getting in the way everywhere. Endlessly declaring the thrown exceptions in method headers is ridiculous. However, &lt;a href="http://www.mindview.net/Etc/Discussions/CheckedExceptions"&gt;the programming masses are overreacting a little&lt;/a&gt; - there are more options than simply throwing runtime exceptions in disgust. Runtime exceptions introduce that uneasy feeling that something, somewhere, might be trying to kill your application with a well thrown runtime exception. I'm not imagining things, in the .NET world, there are actually tools (not for free, ofcourse) that analyze your software for dangerous exceptions, claiming that the tool will make your application robust! Still, checked exceptions are getting on everybody's nerves. What to do?&lt;br /&gt;&lt;br /&gt;Why not recycle the very hip concept of type inference and apply it to exceptions? Java actually already does this, since it knows exactly which checked exceptions you did not declare in your "throws"!&lt;br /&gt;&lt;br /&gt;So what happens when we make "throws" optional? Java will still figure out which exceptions are thrown for each and every method. Essentially, when not using "throws," all exception become runtime exceptions. So what use is all of this?&lt;br /&gt;&lt;br /&gt;Well, you get Nice Behaviour when you &lt;i&gt;do&lt;/i&gt; use throws! Here are our new rules:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;a method that &lt;b&gt;does not&lt;/b&gt; declare the exceptions it throws, will have those exceptions inferred.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a method that &lt;b&gt;does&lt;/b&gt; declare the exceptions it throws, can &lt;span style="font-weight: bold;"&gt;only &lt;/span&gt;throw those exceptions.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Point 1 will give us runtime exception behaviour. Point 2 will give us checked exception behaviour, but &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;without repeating ourselves over and over again.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(I was highly disappointed that Scala chose to dump checked exceptions. I wonder if a compiler plugin could be developed that does the above?)&lt;br /&gt;&lt;br /&gt;Some examples:&lt;br /&gt;&lt;h4&gt;A class without explicit throws&lt;/h4&gt;The compiler will figure them out.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class A {&lt;br /&gt; abc // inferred: throws X&lt;br /&gt; {&lt;br /&gt;  throw X&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; def // inferred: throws Y&lt;br /&gt; {&lt;br /&gt;  throw Y&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; jkl // inferred: throws Div0&lt;br /&gt; {&lt;br /&gt;  10/10&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now another obvious inference:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class B {&lt;br /&gt; uvw // inferred: throws X, Y&lt;br /&gt; {&lt;br /&gt;  A.abc&lt;br /&gt;  A.def&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;API's&lt;/h4&gt;&lt;br /&gt;When building an API/SDK/framework, you would like to define lines in your code (interfaces) which hide the exceptions behind it in API-specific exceptions. The API would like to define an exception barrier that only lets the API-specific exceptions through.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class C {&lt;br /&gt; xyz throws Z&lt;br /&gt; {&lt;br /&gt;  A.abc&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Error: X not mentioned&lt;br /&gt;No error for Z, which is not thrown anywhere, or maybe a warning.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Exception wrapping&lt;/h4&gt;&lt;br /&gt;Nothing special going on here:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class D {&lt;br /&gt; xyz throws Z&lt;br /&gt; {&lt;br /&gt;  try{&lt;br /&gt;   A.abc&lt;br /&gt;  }catch X {&lt;br /&gt;   throw Z(X)&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;throws void&lt;/h4&gt;&lt;br /&gt;If you want to make sure that a method throws no exceptions at all, use "throws void".&lt;br /&gt;This should also help with development: when you want to see which exceptions your method might throw,&lt;br /&gt;just make it "throws void," and the compiler will complain with errors.&lt;br /&gt;Most helpful would be if the compiler shows the source of the exception.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class E {&lt;br /&gt; rst throws void&lt;br /&gt; {&lt;br /&gt;  A.jkl&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Error: A.jkl throws Div0&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Entry points&lt;/h4&gt;&lt;br /&gt;Entry points for applications and api's should take care to define their exceptions well.&lt;br /&gt;main, for example, implicitly has "throws void", so no exception thrown anywhere in the&lt;br /&gt;whole application can ever escape.&lt;br /&gt;The compile errors will trigger a useful response: "oops, I think I forgot to handle X, and&lt;br /&gt;looking at the error, the most logical place to handle it seems to be B.uvw"&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class F {&lt;br /&gt; main&lt;br /&gt; {&lt;br /&gt;  B.uvw&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Error: A.jkl throws X through B.uvw.&lt;br /&gt;Error: A.def throws Y through B.uvw.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Die-hard runtime exceptions&lt;/h4&gt;&lt;br /&gt;For the real runtime exception lovers, we emulate them here:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;class G {&lt;br /&gt; main&lt;br /&gt; {&lt;br /&gt;  try{&lt;br /&gt;   A.abc&lt;br /&gt;   A.def&lt;br /&gt;  }catch(BaseException){&lt;br /&gt;   print stack trace&lt;br /&gt;   exit, interrupting your valuable banking service, preferably in the middle of the night.&lt;br /&gt;  }&lt;br /&gt; }&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/2417759645921975473-4646548298240422066?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4646548298240422066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4646548298240422066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4646548298240422066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4646548298240422066'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/solving-exception-handling-golden-path.html' title='Solving exception handling: the golden path is in the middle of the road'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5863490092077318648</id><published>2009-05-03T16:54:00.004+02:00</published><updated>2009-05-03T16:56:59.556+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Scala stops the screaming</title><content type='html'>Fin-nal-ly we're rid of the ALL_CAPS_CONSTANT_NAMES from... what is it... C? So we've been screaming for nearly forty years? I always thought it was one of the more ridiculously rigid design decisions in Java.&lt;br /&gt;&lt;br /&gt;ScalaUsesCamelCasingForConstants.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5863490092077318648?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5863490092077318648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5863490092077318648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5863490092077318648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5863490092077318648'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/05/scala-stops-screaming.html' title='Scala stops the screaming'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3727271303128917352</id><published>2009-05-01T21:12:00.008+02:00</published><updated>2009-05-01T21:30:37.627+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><title type='text'>The :CueCat bar code scanner and Ubuntu</title><content type='html'>A few days ago I received the &lt;a href="http://en.wikipedia.org/wiki/CueCat"&gt;:CueCat&lt;/a&gt; bar code reader I ordered from &lt;a href="http://www.librarything.com/cuecat"&gt;Librarything&lt;/a&gt;. Since information on this thing is scattered around the web, with a lot of outdated links among them, I'll quickly put my experience here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The :CueCat works out of the box with Ubuntu 9.04 (Jaunty Jackalope &lt;span style="font-size:78%;"&gt;for &lt;a href="http://www.subgenius.com/"&gt;Bob&lt;/a&gt;'s sake stop using dumb names&lt;/span&gt;.) Plug it into a USB port, move the cat over a bar code with the nose on the code and the ass in the air (needs a little practice) and it appears (encoded) on your screen as if the :CueCat was pressing the keys on your keyboard.&lt;/li&gt;&lt;li&gt;The output is encoded. LibraryThing happens to know how to decode it, but in general it would be nice to "declaw" it. That means messing with the hardware so the encoding stops working, turning the output of the :CueCat into a simple barcode. &lt;a href="http://cexx.org/cuecat.htm"&gt;This page&lt;/a&gt; has the method. After a bit of scratching with a knife, the pin that needed cutting came loose. I reassembled the :CueCat (don't lose the tiny lense that's in its mouth!) and everything still worked, and the encoding was gone.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get the USB version, not the PS/2 one.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mavin.com/index.php/products/usb-cuecat-single-units"&gt;Here's a shop&lt;/a&gt; that has them for $12, which is about €0.0001.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Now I still need a tool to remove price stickers from books without leaving a disgusting sticky spot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3727271303128917352?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3727271303128917352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3727271303128917352' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3727271303128917352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3727271303128917352'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/05/cuecat-bar-code-scanner-and-ubuntu.html' title='The :CueCat bar code scanner and Ubuntu'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3623730262906483214</id><published>2009-04-18T13:12:00.005+02:00</published><updated>2009-04-18T13:58:06.120+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Dynamic languages are unfit for Agile</title><content type='html'>Why are languages with late type checking cool? Because current languages with static type checking are too verbose. Really, it's nothing more complicated than that: current statically typed languages use ancient typing methods, and therefore need more hand holding.&lt;br /&gt;&lt;br /&gt;The late vs. early type checking wars should be about implementing better type checking.&lt;br /&gt;&lt;br /&gt;The reason that it has become a war, is because late type checking fans do not appreciate the very Agile fact that &lt;a href="http://www.agilecoach.co.uk/Articles/QualityCulture.html"&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;you want to find bugs as early as possible.&lt;/span&gt;&lt;/a&gt; Compilation with static type checking is a very important tool for this. Annoying as it may be, it will show you some of your mistakes before letting you run the program at all! Every programmer must learn how to use the tools available for his job to make his job easier - and the hard part is not at the beginning of a project, even if the setup of a project takes a month, or a library is buggy. The hard part is preventing the application from becoming a large, unmaintainable monstrosity after a few years.&lt;br /&gt;&lt;br /&gt;If a programming language designer has not taken the time to implement compile time type checking as complete as possible, or even worse - if the designer has ignored it completely, he is not fit for the job and is screwing you, the language user. &lt;a href="http://en.wikipedia.org/wiki/Technical_debt"&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Any project you do with this language will accumulate technical debt faster,&lt;/span&gt;&lt;/a&gt; something that you really want to avoid.&lt;br /&gt;&lt;br /&gt;The cool part about programming is not the language, it's being able to create cool stuff!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Yes, many languages offer features that enable you to express yourself better than in the mainstream statically typed languages. Those features have nothing to do with early or late type checking though, and could be implemented in any language.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3623730262906483214?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3623730262906483214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3623730262906483214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3623730262906483214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3623730262906483214'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/04/dynamic-languages-are-unfit-for-agile.html' title='Dynamic languages are unfit for Agile'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-9042835997329526920</id><published>2009-04-15T22:25:00.005+02:00</published><updated>2009-04-15T22:54:42.670+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='mdd'/><category scheme='http://www.blogger.com/atom/ns#' term='java7'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>What I've learned at J-Spring 2009</title><content type='html'>J-Spring is one of the two meetings &lt;a href="http://www.nljug.org/"&gt;the Dutch JUG&lt;/a&gt; organises, the other one being J-Fall.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Model-driven_development"&gt;Model Driven Design&lt;/a&gt; is nowadays done bottom-up.&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Model-driven_development"&gt;Model Driven Design&lt;/a&gt; does not really need a graphical model, DSL will do too. If you don't use DSLs, you're a boring old fart.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;My company's &lt;a href="http://en.wikipedia.org/wiki/Model-driven_development"&gt;Model Driven Design&lt;/a&gt; tool (&lt;a href="http://mod4j.org/"&gt;Mod4J&lt;/a&gt;) uses happy colors.&lt;/li&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework&lt;/a&gt; really needs one of those old school "under construction" gifs.&lt;/li&gt;&lt;li&gt;&lt;a href="https://appframework.dev.java.net/"&gt;Swing Application Framework&lt;/a&gt; is described as a zombie project, since it's officially dead, but still moving.&lt;/li&gt;&lt;li&gt;Swing really needs a complete rewrite.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/OSGi"&gt;OSGi&lt;/a&gt; is only about modularity inside a single JVM, but they're fixing that now.&lt;/li&gt;&lt;li&gt;An architect's job is to fiddle around with fun cutting edge technology.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once the second child is coming, it's time for a job near where you live.&lt;/li&gt;&lt;li&gt;&lt;a href="http://boardgamegeek.com/boardgame/36218"&gt;Dominion&lt;/a&gt; is a cool game.&lt;/li&gt;&lt;li&gt;Java 7 is under attack by &lt;a href="http://tastyimportant.blogspot.com/2008/11/runtime-exception-languages.html"&gt;Runtime Exception Language&lt;/a&gt; users, who are "fixing" "problems" in the Java language that I haven't seen since I learned to program half decently. I suggest they fix their programming skills instead.&lt;/li&gt;&lt;li&gt;Nobody cares about &lt;a href="http://javafx.com/"&gt;JavaFX.&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There's only one &lt;a href="http://www.chupachups.com/"&gt;Chupa Chup tower&lt;/a&gt; left, and we're getting it!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-9042835997329526920?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/9042835997329526920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=9042835997329526920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9042835997329526920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9042835997329526920'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/04/what-ive-learned-at-j-spring-2009.html' title='What I&apos;ve learned at J-Spring 2009'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6596086873397949928</id><published>2009-04-04T23:30:00.000+02:00</published><updated>2009-04-04T23:31:35.569+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Twitter on Scala? April 1st?</title><content type='html'>&lt;a href="http://www.technologyreview.com/blog/editors/23282/?nlid=1908"&gt;If it's true,&lt;/a&gt; it could be the big one for Scala!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6596086873397949928?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6596086873397949928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6596086873397949928' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6596086873397949928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6596086873397949928'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/04/twitter-on-scala-april-1st.html' title='Twitter on Scala? April 1st?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6926723883143429706</id><published>2009-03-25T00:09:00.003+01:00</published><updated>2009-03-25T00:26:13.069+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nabaztag'/><category scheme='http://www.blogger.com/atom/ns#' term='db4o'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='webdriver'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>What I've learned at the Apachecon Wicket meeting</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.db4o.com/"&gt;db4o&lt;/a&gt; is a fine database for projects where you don't mind losing data.&lt;span style="font-size:78%;"&gt; (The presenter said he couldn't get the db4o database running anymore after corrupting it.)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the Wicket committers have three &lt;a href="http://www.violet.net/_nabaztag-the-first-rabbit-connected-to-the-internet.html"&gt;Nabaztags&lt;/a&gt; on the job.&lt;span style="font-size:78%;"&gt; (I have one in the attic)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://behaviour-driven.org/Introduction"&gt;BDD&lt;/a&gt; is &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; with better words.&lt;/li&gt;&lt;li&gt;Testing web applications by playing click scripts seems to have matured.&lt;span style="font-size:78%;"&gt; (See &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; or &lt;a href="http://code.google.com/p/webdriver/"&gt;Webdriver.&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is very cool.&lt;span style="font-size:78%;"&gt; No wait, I already knew that.&lt;/span&gt; &lt;a href="http://stuq.nl/weblog/2009-03-24/amsterdam-wicket-meetup-2009"&gt;It combines well with Wicket.&lt;/a&gt;&lt;span style="font-size:78%;"&gt; I knew that too.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It can get very hot when the air conditioning is off.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6926723883143429706?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6926723883143429706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6926723883143429706' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6926723883143429706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6926723883143429706'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/what-ive-learned-at-apachecon-wicket.html' title='What I&apos;ve learned at the Apachecon Wicket meeting'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7606592026136973221</id><published>2009-03-19T22:37:00.004+01:00</published><updated>2009-03-19T22:47:58.892+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='dsp'/><title type='text'>Wicket in Action review</title><content type='html'>The &lt;a href="http://www.amazon.co.uk/Wicket-Action-Martijn-Dashorst/dp/1932394982"&gt;Wicket in Action&lt;/a&gt; book has been out for a few months now, and I received my copy a month ago or so. Here's my review:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;This book is so good that I felt I knew everything about Wicket when I was only halfway through the book! &lt;span style="font-size:85%;"&gt;So I stopped reading there.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(It's a bit sad, but the &lt;a href="http://www.amazon.co.uk/Pro-Wicket-Experts-Voice-Java/dp/1590597222"&gt;Pro Wicket&lt;/a&gt; book is quite outdated by now.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm currently toying with modular sound generation as part of a music sequencer, so I've ordered &lt;a href="http://www.amazon.co.uk/Digital-Signal-Processing-Scientists-Technology/dp/075067444X"&gt;a book on digital signal processing that is said to be readable by normal humans&lt;/a&gt;. For layout, I wanted a split pane that has a split horizontally and vertically. Is this such a strange wish? Only &lt;a href="http://d.hatena.ne.jp/a-san/20060211#p1"&gt;some Japanese person made one&lt;/a&gt;, and it's of rather low quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7606592026136973221?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7606592026136973221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7606592026136973221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7606592026136973221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7606592026136973221'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/wicket-in-action-review.html' title='Wicket in Action review'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3471049519152857796</id><published>2009-03-14T19:23:00.007+01:00</published><updated>2009-03-14T19:43:36.247+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><category scheme='http://www.blogger.com/atom/ns#' term='BASIC'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='commodore 64'/><title type='text'>Amazing Mazes: done for now</title><content type='html'>For the last month or two, I've been working on &lt;a href="http://matozoid.github.com/amazing/"&gt;Amazing Mazes&lt;/a&gt;, and have now reached the point of saturation. Most of what I wanted to do has been done: there are about 14 maze generating algorithms, and some random algorithms of varying quality. I'll leave it there on github. I don't know if anyone will ever use it, but at least Google will index it and show a decent implementation of all the maze generation algorithms that I could find.&lt;br /&gt;&lt;br /&gt;The whole project started with a small, and completely unreadable Commodore 64 BASIC program that I typed in from a magazine. It generated mazes, and I couldn't figure out how! It didn't even allocate memory for the maze, instead directly printing it to the screen. After refactoring it into Java, which was quite a task, it turned out to be a variant of the Eller algorithm, which is quite unreadable &lt;a href="http://homepages.cwi.nl/%7Etromp/maze.html"&gt;when done wrong&lt;/a&gt;, especially when you don't know what it's supposed to do. Anyway, I printed that program on my ultra-crappy &lt;a href="http://www.beastwithin.org/users/wwwwolf/album/img/nepa4.jpg"&gt;Brother HR-5C printer&lt;/a&gt;, somewhere in the eighties. Somehow, I never threw it away, and it always got stuck in one of the heaps of paper that I move from house to house. Recently, I found it again, and that started this whole project :) Mazes are no mystery to me anymore.&lt;span style="font-size:78%;"&gt; (It's a mystery that the paper survived though: the printer worked like a FAX, some kind of thermal crap process. It should have faded years ago.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oh, I've been trying &lt;a href="http://git-scm.com/"&gt;git&lt;/a&gt;! It's nice! It's confusing! It's nice! I like pushing! Someone should kick the nerds who made this for the feature creep! But it's nice! I'll be using it &lt;span style="font-size:78%;"&gt;for now&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(Yeah, the project has  a really crappy name.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3471049519152857796?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3471049519152857796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3471049519152857796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3471049519152857796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3471049519152857796'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/amazing-mazes-done-for-now.html' title='Amazing Mazes: done for now'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6496731868912772039</id><published>2009-03-06T13:27:00.012+01:00</published><updated>2009-05-09T21:45:25.545+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><title type='text'>Nice Spring exception!</title><content type='html'>&lt;p&gt;While at work, the following simple piece of configuration:&lt;br /&gt;&lt;/p&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;&amp;lt;/bean&gt;&lt;br /&gt;  &amp;lt;property name="location" value="classpath:application.properties"/&gt;&lt;br /&gt;&amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;made Spring throw this exception:&lt;/p&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean&lt;br /&gt;with name'org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0':Initialization of bean failed; nested exception isjava.lang.IllegalArgumentException: Method must not be null&lt;br /&gt;at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:480)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)atjava.security.AccessController.doPrivileged(AccessController.java:214)atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFact...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Well, the problem wasn't really exciting: we had multiple versions of the Spring libraries configured in pom.xml, so we had a mismatch in library expected and library found.&lt;/p&gt;&lt;p&gt;Hereby, this piece of knowledge has been donated to the &lt;a href="http://www.google.com/"&gt;Mighty Google Knowledge Base.&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6496731868912772039?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6496731868912772039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6496731868912772039' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6496731868912772039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6496731868912772039'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/nice-spring-exception.html' title='Nice Spring exception!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1697638510207045764</id><published>2009-03-06T10:28:00.003+01:00</published><updated>2009-03-06T10:35:25.537+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Let's have a WBJUS campaign :)</title><content type='html'>Let's get &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; the attention it deserves, and start throwing "Why bother? Just use Scala" around, like &lt;a href="http://cluonflux.com/article/34/why-bother-just-use-scala-continued"&gt;this person who doesn't seem to have a name!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1697638510207045764?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1697638510207045764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1697638510207045764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1697638510207045764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1697638510207045764'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/lets-have-wbjus-campaign.html' title='Let&apos;s have a WBJUS campaign :)'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5619889966374766681</id><published>2009-03-02T14:44:00.003+01:00</published><updated>2009-03-02T14:51:08.801+01:00</updated><title type='text'>Finally a decent license for my software</title><content type='html'>Being the nice guy that I am, I like to see people use the code that I put on the net without restriction. Until recently, there was no real license that basically said "go ahead, don't worry, do with this what you like, no strings attached," although the &lt;a href="http://sam.zoy.org/wtfpl/"&gt;WTFPL&lt;/a&gt; came close.&lt;br /&gt;&lt;br /&gt;Now we have the &lt;a href="http://wiki.creativecommons.org/CC0_FAQ"&gt;CC0&lt;/a&gt;, and I'm likely to attach it to whatever I produce, &lt;span style="font-size:78%;"&gt;which currently is &lt;/span&gt;&lt;a href="http://github.com/matozoid/amazing/tree/master"&gt;&lt;span style="font-size:78%;"&gt;the Amazing maze library&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:78%;"&gt;, by the way.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5619889966374766681?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5619889966374766681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5619889966374766681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5619889966374766681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5619889966374766681'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/03/finally-decent-license-for-my-software.html' title='Finally a decent license for my software'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-8050234175577463113</id><published>2009-02-18T16:26:00.007+01:00</published><updated>2012-01-24T20:16:08.346+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='graph db'/><category scheme='http://www.blogger.com/atom/ns#' term='db4o'/><category scheme='http://www.blogger.com/atom/ns#' term='jpa'/><category scheme='http://www.blogger.com/atom/ns#' term='ibatis'/><category scheme='http://www.blogger.com/atom/ns#' term='orm'/><category scheme='http://www.blogger.com/atom/ns#' term='neo4j'/><category scheme='http://www.blogger.com/atom/ns#' term='oodb'/><category scheme='http://www.blogger.com/atom/ns#' term='rdbms'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='jdbc'/><title type='text'>Persistency solution decision algorithm</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Here's my current strategy for picking a persistency solution:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;IF &lt;a href="http://en.wikipedia.org/wiki/RDBMS"&gt;rdbms&lt;/a&gt; is already in use THEN&lt;br /&gt;  IF problem is trivial THEN&lt;br /&gt;     &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/jdbc.html"&gt;Spring JDBC&lt;/a&gt;&lt;br /&gt;  ELSE&lt;br /&gt;     &lt;a href="http://ibatis.apache.org/"&gt;iBATIS&lt;/a&gt;&lt;br /&gt;ELSE&lt;br /&gt;  a graph DB&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Yes, &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;/JPA is missing. As far as I'm concerned, the &lt;a href="http://en.wikipedia.org/wiki/Object-Relational_impedance_mismatch"&gt;object/relational mismatch&lt;/a&gt; is troublesome enough to never choose an &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM&lt;/a&gt; at all. Face the facts: an &lt;a href="http://en.wikipedia.org/wiki/RDBMS"&gt;RDBMS&lt;/a&gt; works with rows of tuples, not graphs of objects, and it is tightly tied to its query language: &lt;a href="http://en.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;. The only correct way to map this is in the way &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/jdbc/"&gt;JDBC&lt;/a&gt; does. Trying to fix the mismatch gives complex solutions, and for what reason? There are other, simpler, faster, mature options now.&lt;br /&gt;&lt;br /&gt;I'm not decided yet if an &lt;a href="http://en.wikipedia.org/wiki/ODBMS"&gt;OODB&lt;/a&gt; like &lt;a href="http://www.db4o.com/"&gt;db40&lt;/a&gt; is better than a graph database like &lt;a href="http://neo4j.org/"&gt;neo4j&lt;/a&gt;. As someone who likes his code to be executed as is, without any byte code mangling, the indirection of graph databases looks more attractive. &lt;a href="http://en.wikipedia.org/wiki/ODBMS"&gt;OODB&lt;/a&gt;'s insist on persisting your objects directly, and magically reconstructing them again. Graph DB's are somewhat like a whole bunch of persisted property files with links between them, and those property files need a very shallow wrapper.&lt;br /&gt;&lt;br /&gt;Anyway, it's time we took RBDMSes off their pedestal!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-8050234175577463113?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/8050234175577463113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=8050234175577463113' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8050234175577463113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8050234175577463113'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/02/persistency-solution-decision-algorithm.html' title='Persistency solution decision algorithm'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5652141087897702922</id><published>2009-01-25T23:26:00.004+01:00</published><updated>2009-01-25T23:44:00.940+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social networking'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='web 1.0'/><title type='text'>Back to Web 1.0</title><content type='html'>For years, I've been subscribing to every fancy new site that arrived. I even described myself as a collector of social networking accounts. I guess I was a victim of web 2.0 hype. Now my personal information is all over the place, and I've started some damage control. It's time to go back to web 1.0 and unsubscribe from these sites.&lt;br /&gt;&lt;br /&gt;What have I gained? Tons of new friends, and many old friends that I lost somehow. All shallow contacts - once you log out, they are gone again. That's not worth it.&lt;br /&gt;&lt;br /&gt;What have I lost? My privacy! It's more important than you think, and it's ok to be paranoid about it. You do not want to be easy to find for the wrong people.&lt;br /&gt;&lt;br /&gt;But I'll keep a few around - a few sites with only impersonal tech stuff on it, and a site that has good privacy controls where I can share pictures with meaningful people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5652141087897702922?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5652141087897702922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5652141087897702922' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5652141087897702922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5652141087897702922'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/back-to-web-10.html' title='Back to Web 1.0'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4510700989478448245</id><published>2009-01-23T18:26:00.006+01:00</published><updated>2009-03-09T21:30:22.731+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Note to self: useful application layer setup</title><content type='html'>&lt;span style="font-size:130%;"&gt;Common application model&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Top level: view / control&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Middle level: business logic / business model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bottom level: data access / services&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The average application is centered around operations (business logic) on data  concerning the part of the real world that the application operates on (business model.) It will show that data to the application users with a view on the model. The user will use the controls, visible in the view, to execute the business logic. The data in the business model can be read and stored either by calling an external service (services,) or by directly accessing a data store (data access,) although it can be simplified by saying that "data access" is a service too.&lt;/p&gt;&lt;p&gt;The levels only have access to adjacent levels.&lt;/p&gt;&lt;p&gt;There was some blah about MVC here. After writing it, I found &lt;a href="http://heim.ifi.uio.no/%7Etrygver/themes/mvc/mvc-index.html"&gt;the original MVC documents, including new developments.&lt;/a&gt; It's a very interesting read!&lt;br /&gt;&lt;/p&gt;&lt;span style="font-size:130%;"&gt;Service model&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Top level: service interface&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Middle level: business logic / business model&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bottom level: data access / services&lt;/li&gt;&lt;/ul&gt;A service is just about the same, but the interface is not meant for humans, but other applications. This means that this interface should be strictly defined.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;General model&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Top level: client/user interface&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Middle level: additional logic and data composition&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bottom level: interface offered by existing services&lt;/li&gt;&lt;/ul&gt; And that's it! I think that every application layer structure I've ever seen could be fit into this model, except for the ones that were really crap :) &lt;span style="font-size:78%;"&gt;Most of them were.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4510700989478448245?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4510700989478448245/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4510700989478448245' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4510700989478448245'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4510700989478448245'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/note-to-self-useful-application-layer.html' title='Note to self: useful application layer setup'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-672496245297119965</id><published>2009-01-23T18:08:00.003+01:00</published><updated>2009-01-23T18:21:18.357+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='dht'/><category scheme='http://www.blogger.com/atom/ns#' term='delicious'/><title type='text'>Learning Distributed Hash Tables</title><content type='html'>At the time I'm writing this, you can see some links about distributed hash tables (DHT's) to the right, in the "saved links" block (provided by &lt;a href="http://delicious.com/"&gt;delicious&lt;/a&gt;, a site that was web 2.0 before that &lt;span style="font-size:78%;"&gt;meaningless&lt;/span&gt; term was invented, and now so ancient that it may be one of the first web 2.0 sites to lose its cool factor.) DHT's, as far as I can see, are easily distributable data stores, based on rather simple algorithms. Still, from &lt;a href="http://www.linuxjournal.com/article/6797"&gt;an explanation like the one in Linux Journal&lt;/a&gt;, I can only conclude that I must play with it myself before I really understand it.&lt;br /&gt;&lt;br /&gt;So that's what I will do :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(&lt;a href="http://delicious.com/"&gt;Delicious&lt;/a&gt; seems to bring in enough money to finally be able to buy the &lt;a href="http://delicious.com/"&gt;delicious.com&lt;/a&gt; domain, instead of &lt;a href="http://del.icio.us"&gt;icio.us&lt;/a&gt;. Where do they get that money from? I'm not giving them anything!)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-672496245297119965?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/672496245297119965/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=672496245297119965' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/672496245297119965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/672496245297119965'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/learning-distributed-hash-tables.html' title='Learning Distributed Hash Tables'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6623201429393074873</id><published>2009-01-15T16:50:00.003+01:00</published><updated>2009-01-15T16:59:33.736+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='services'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>SOA is dead</title><content type='html'>Hurray, I'm joining the SOA is dead crowd! All because of &lt;a href="http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html"&gt;this article!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm very happy that a word that means "Sexually Transmitted Disease" in Dutch is finally scrapped from IT vocabulary. Imagine the suppressed laughter every time someone mentions SOA.&lt;br /&gt;&lt;br /&gt;Here's my practical definition of SOA: a company hires expensive consultants from a large company, preferably IBM, to talk them into buying very expensive products with big hype words, and many powerpoint presentations. This the Architecture in which the consultants can deliver their Service to the customer. It shows that SOA does not benefit the customer :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6623201429393074873?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6623201429393074873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6623201429393074873' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6623201429393074873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6623201429393074873'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/soa-is-dead.html' title='SOA is dead'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2346137766143532195</id><published>2009-01-15T14:16:00.004+01:00</published><updated>2009-01-15T21:59:20.295+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utility'/><title type='text'>Best free diff tool</title><content type='html'>Just so you can cut your diff tool search short: &lt;a href="http://kdiff3.sourceforge.net/"&gt;kdiff3&lt;/a&gt; is the best diff tool ever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2346137766143532195?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2346137766143532195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2346137766143532195' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2346137766143532195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2346137766143532195'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/best-free-diff-tool.html' title='Best free diff tool'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1832517768364288687</id><published>2009-01-13T22:33:00.007+01:00</published><updated>2009-01-15T21:44:24.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='dijkstra'/><title type='text'>8 bit is dead</title><content type='html'>Every now and then, one of the people who showed up only as a line of text in video games of the eighties turns out to be dead. Most of these people are not much older than I am.&lt;br /&gt;&lt;br /&gt;These people, pathetic as it sounds, defined a large part of my childhood. Video games were much more of a mystery back then. Realistic graphics were nearly impossible, and every game would have another way to warp reality into something that could be shown on the screen. Sound was a mix of unrealistic sound effects, remixes of classical music, covers of pop music, and lots of improvisation. The basic rules of gaming were slowly being discovered, every new game an experiment, a few of them defining new ground, a lot of them being crap, and a few being magestically misunderstood forever. The creators, who were often not even named, were almost anonymous. They never appeared on radio or TV, there was no internet, magazines had only few interviews and fewer pictures. There were only the names on the title screen, and sometimes a scroll text that I read over and over again, as a message from Video Game God.&lt;br /&gt;&lt;br /&gt;When the internet came along, more and more information became available. It turned out that the video game gods weren't so godly after all. The &lt;a href="http://composers.c64.org/"&gt;C64 composer list&lt;/a&gt; was a big shock, for example. What a bunch of nerds/punks/old people! It turns out that most of the games were hacked together in bedrooms, the programmers and composers lived off really tight budget because there was almost no money in the video game industry, and that &lt;a href="http://en.wikipedia.org/wiki/Jeff_Minter"&gt;Jeff Minter&lt;/a&gt; was really serious when he wrote those scroll texts about how he loved llama's. Oh great.&lt;br /&gt;&lt;br /&gt;So now it turns out that video game gods are mortal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1832517768364288687?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1832517768364288687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1832517768364288687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1832517768364288687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1832517768364288687'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/8-bit-is-dead.html' title='8 bit is dead'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-1935283621142663019</id><published>2009-01-11T16:12:00.006+01:00</published><updated>2009-01-11T19:55:58.091+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='properties'/><category scheme='http://www.blogger.com/atom/ns#' term='commons'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='db donkey'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Commons Configuration</title><content type='html'>&lt;a href="http://www.blogger.com/2008/12/new-project-database-tool.html"&gt;DB Donkey, the straight forward SQL editor I'm still working on&lt;/a&gt;, reads all of its configuration from properties files. I wanted to avoid the non-enjoyable situation where you try to configure something through the GUI, but find that some things are not supported, and then find that the configuration files are not easily editable. So property files it is. &lt;span style="font-size:78%;"&gt;(I still consider XML a format for automated data exchange which happens to be more human readable than binary data. It certainly isn't a good configuration language for humans to use.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Today I found &lt;a href="http://commons.apache.org/configuration/index.html"&gt;Apache Commons Configuration&lt;/a&gt;, which managed to replace almost all of the code I had written to make Java's Properties class easier to work with! Very nice stuff!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Update: very nice, until you figure out that you should never call "load()" on a property file object, since that will mysteriously duplicate all property values.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-1935283621142663019?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/1935283621142663019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=1935283621142663019' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1935283621142663019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/1935283621142663019'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/commons-configuration.html' title='Commons Configuration'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-307989994305133719</id><published>2009-01-11T15:22:00.005+01:00</published><updated>2009-01-11T15:58:26.837+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='superpackages'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>Java 7 is boring!</title><content type='html'>When I look &lt;a href="http://tech.puredanger.com/java7"&gt;here&lt;/a&gt; for the list of probable new features in Java 7, I can't get excited at all. Most of it is superficial stuff to make Java more attractive to script kiddies. The only interesting things are happening on a lower level: the new modular Java kernel which is supposed to make the JVM load faster, and superpackages which will make it a lot easier to define the API for a library (ever been overwhelmed by the amount of classes that a new framework makes accessible, even though they are only meant for internal use? Alright, maybe superpackages are quite superficial too.) I'm glad they're leaving "closures" out, I haven't seen any implementation that comes close to being simple.&lt;br /&gt;&lt;br /&gt;Listen: Java is the language that trades brevity and expressiveness for the ability to get any dumbass a job in programming without breaking stuff all over the place. It should stay simple and solid, and should become simpler and more solid through time. A language like Scala is a very nice step up for the people with more experience, who feel limited by the language. Keep Java Simple, Stupid! &lt;span style="font-size:78%;"&gt;Start by removing the utterly useless primitive data types!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Oooooooh, what's this then: &lt;a href="http://cadmium.x9c.fr/"&gt;OCaml for Java!&lt;/a&gt; No, it won't be part of Java 7, because OCaml doesn't set up a web site based on a bunch of database tables in five seconds, so it makes script kiddies yawn.&lt;span style="font-size:78%;"&gt; (Not that I can use it, but it's quite high on my want-to-learn list, and seems aimed at better integration than &lt;a href="http://www.cs.rit.edu/%7Ebja8464/lambdavm/"&gt;Haskell and Java&lt;/a&gt;. The nice thing of using the JVM is being able to use the ludicrous amount of code already written for it, you know.)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-307989994305133719?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/307989994305133719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=307989994305133719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/307989994305133719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/307989994305133719'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/java-7-is-boring.html' title='Java 7 is boring!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6856037116857369962</id><published>2009-01-04T18:06:00.033+01:00</published><updated>2009-01-04T21:56:48.487+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='BASIC'/><category scheme='http://www.blogger.com/atom/ns#' term='nintendo ds'/><category scheme='http://www.blogger.com/atom/ns#' term='c64'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><title type='text'>Cheating in Dragon Quest IV, the programmer's way</title><content type='html'>Lots of my time has gone into a rather crappy "JRPG" called &lt;a href="http://www.metacritic.com/games/platforms/ds/dragonquest4chaptersofthechosen"&gt;"Dragon Quest IV"&lt;/a&gt; on the Nintendo DS lately. The leveling kept it fun for a while, until last night, just when I reached the supposedly final "boss" (a horrible game concept.) The damn bastard just wouldn't die, and kept on growing arms and heads (huh?) until all my characters were dead, even though I had no trouble getting through any other place in the game, and I was a few levels too high for this point in the game. I'm not a very good gamer since I really hate doing things twice, so a long battle like this would normally be a reason to quit the game and never look at it again.&lt;br /&gt;&lt;br /&gt;The nice thing is: I am playing it with an &lt;a href="http://www.google.nl/search?q=r4ds"&gt;R4DS card&lt;/a&gt;, which uses a Micro SD card to store games and save games. I'm a programmer - I can do everything I like with that save game. I could make the characters I play a lot stronger, and all the time I invested in this game wouldn't have been for nothing.  Normally the save games are stored on the game cartridge itself, so the game programmers probably wouldn't bother with any kind of encryption schemes, because the save games would be unreachable anyway, so let's find the data and kill the boss. That will teach him not to grow new legs when a programmer is around!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWDxh22PmYI/AAAAAAAABB4/EQoaanLutIw/s1600-h/dragonquest_on_sd_card.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWDxh22PmYI/AAAAAAAABB4/EQoaanLutIw/s200/dragonquest_on_sd_card.png" alt="" id="BLOGGER_PHOTO_ID_5287491526493968770" border="0" /&gt;&lt;/a&gt;This is what the contents of the SD card look like when inserted into my laptop running Ubuntu. As you can see, next to the game itself (the .nds file) is a .SAV file. Not surprisingly, that contains the save games. The game uses only a few kilobytes of the 512MB that the file is big, which saved me a lot of time. I copied it to my local drive, making a separate copy of it, in case my changes would corrupt the file.&lt;br /&gt;&lt;br /&gt;I assumed that R4DS just took the biggest possible save game size (512MB), then gave the games access to all of it, even if they just used a little of it. I also assumed that games normally use some kind of propietary binary format for saving games. Also, I assumed that the R4DS thing itself would not put anything in the file.&lt;br /&gt;&lt;br /&gt;So what's in it? For this, I wanted a decent hex editor, one that would also let me change and save files. A quick search turned up the &lt;a href="http://home.gna.org/bless/"&gt;Bless&lt;/a&gt; hex editor (which is a shitty religion-related name,) and &lt;a href="http://manpages.ubuntu.com/manpages/jaunty/en/man1/ghex2.1.html"&gt;ghex&lt;/a&gt;. Bless came highly recommended, but turned out to have a bug that prevented me from saving files, and started in insert mode, which is completely ridiculous for editing binary files. (Turns out that it's .NET software - forgive them, for they know not what they do.) So ghex it was, which turned out to be quite full-featured and stable.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWD3zi7lMRI/AAAAAAAABCA/svx8fuY0-oI/s1600-h/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+GHex.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 100px;" src="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWD3zi7lMRI/AAAAAAAABCA/svx8fuY0-oI/s200/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+GHex.png" alt="" id="BLOGGER_PHOTO_ID_5287498427455058194" border="0" /&gt;&lt;/a&gt;This is what I saw when I opened the save game with the hex editor (and expanded the screen to show 32 values in a row.) Lots of zero's, and "DQ4 ARTE". The game is Dungeon Quest 4, the title screen says something about "Arte Piazza," so this is clearly a simple header, something that the game could check to see if the save game area hasn't suddenly be replaced by a play from Shakespeare, or whatever. Nothing to see here, let's move on.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEAfmRe6rI/AAAAAAAABCI/zl1MqvIB0F4/s1600-h/img_0394.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEAfmRe6rI/AAAAAAAABCI/zl1MqvIB0F4/s200/img_0394.jpg" alt="" id="BLOGGER_PHOTO_ID_5287507980359494322" border="0" /&gt;&lt;/a&gt;This photo is from the Nintendo DS screen, which explains the crappy colors, and the reflection of the camera lens. It shows the saved games I have. They show the name of the main character (Narbrot, nice eh?), some random stats, and the time spent playing. That's 30 hours of missed sleep. The times are quite alike because of an experiment which is explained further down.&lt;br /&gt;&lt;br /&gt;There are actually four save games, the fourth is used when suspending the game for a longer time. So let's see if we can find a big area that repeats four times in the save game file. Why not search for "Narbrot" a few times - it has to be in the save game four time, how else would the game track the name for each save game?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWECVpQXWeI/AAAAAAAABCQ/VcQN4qbEiT0/s1600-h/Screenshot-GHex+%282642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV%29:+Find+Narbrot.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 67px;" src="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWECVpQXWeI/AAAAAAAABCQ/VcQN4qbEiT0/s200/Screenshot-GHex+%282642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV%29:+Find+Narbrot.png" alt="" id="BLOGGER_PHOTO_ID_5287510008384674274" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_3Cbrz5lGjlM/SWECrPaTwpI/AAAAAAAABCY/e-EA1Wvh6Sw/s1600-h/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+find+narbrot+1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 100px;" src="http://3.bp.blogspot.com/_3Cbrz5lGjlM/SWECrPaTwpI/AAAAAAAABCY/e-EA1Wvh6Sw/s200/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+find+narbrot+1.png" alt="" id="BLOGGER_PHOTO_ID_5287510379404182162" border="0" /&gt;&lt;/a&gt;Found! And found three more times at around $0860, $4460, $8060 and $BC60. There's a calculator in Ubuntu, and it's easily set to a mode in which it can convert hexadecimal to decimal and the other way around. Now, the most significant bytes of the addresses (the left byte,) is increasing with suspicious regularity, let's see what the steps are...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEEwnBGWXI/AAAAAAAABCg/pcLKxXt5sxI/s1600-h/Screenshot-Calculator+-+Scientific.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 312px; height: 320px;" src="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEEwnBGWXI/AAAAAAAABCg/pcLKxXt5sxI/s320/Screenshot-Calculator+-+Scientific.png" alt="" id="BLOGGER_PHOTO_ID_5287512670663498098" border="0" /&gt;&lt;/a&gt;$0860, $4460, $8060 and $BC60.&lt;br /&gt;&lt;br /&gt;08 hex = 8 decimal&lt;br /&gt;44 hex = 68 decimal&lt;br /&gt;80 hex = 128 decimal&lt;br /&gt;BC hex = 188 decimal&lt;br /&gt;&lt;br /&gt;So the Narbrot's are 60 times $0100 away from each other, which is 60 x 256 = 15360, which is 3C00 in hex again. So each save file has an identical size, and that size is a bit less than 4KB, for a total of around 16KB. That's a very efficient way to use a 512MB file ;-)&lt;br /&gt;&lt;br /&gt;Let's try changing some of Narbrot's lousy statistics:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWEHB2EnGXI/AAAAAAAABCo/NW6KbStMDlo/s1600-h/img_0396.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWEHB2EnGXI/AAAAAAAABCo/NW6KbStMDlo/s320/img_0396.jpg" alt="" id="BLOGGER_PHOTO_ID_5287515165785790834" border="0" /&gt;&lt;/a&gt;I tried to find the&lt;br /&gt;number 345 ($0159) first. That failed miserably because, as it turns out, the Nintendo DS works in &lt;a href="http://en.wikipedia.org/wiki/Endianness"&gt;little endian&lt;/a&gt; mode. There's an option for that in ghex, so I turned it on. A little more searching and there it is:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWEJfZP9ccI/AAAAAAAABC4/Q62RDFaXvL8/s1600-h/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+GHex-1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 159px;" src="http://2.bp.blogspot.com/_3Cbrz5lGjlM/SWEJfZP9ccI/AAAAAAAABC4/Q62RDFaXvL8/s320/Screenshot-2642+-+Dragon+Quest+-+The+Chapters+of+the+Chosen+%28E%29%28EXiMiUS%29.SAV+-+GHex-1.png" alt="" id="BLOGGER_PHOTO_ID_5287517872468095426" border="0" /&gt;&lt;/a&gt;The text at the cursor says 59 01, which is the value we're looking for. There are no more zeroes around it, so I guess the value is stored in two bytes. That would put the maximum at $FFFF, which is 65535. 65535 hit points, that sounds great! Next to it is BF 00, which is 191, which happens to be Narbrot's ma...something points. After that, there is 59 01 BF 00 again, and a good guess will be that one of these is the max value, and the other the current value.&lt;br /&gt;&lt;br /&gt;See the bigger pattern on the screen? Lots of FF, then lots of numbers, and then it repeats. It repeats about nine times, which is the number of character in the party. I guess that one of these blocks stores all the state for one character then. The HP and MP for the other players are probably at the same position in their respective blocks.&lt;br /&gt;&lt;br /&gt;Here's Torneko, the extremely unfunny comic relief guy who thinks his job is more important than his wife:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWEMUSWkQ1I/AAAAAAAABDA/EAprJZUoSjM/s1600-h/img_0397.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWEMUSWkQ1I/AAAAAAAABDA/EAprJZUoSjM/s320/img_0397.jpg" alt="" id="BLOGGER_PHOTO_ID_5287520980173079378" border="0" /&gt;&lt;/a&gt;And yes, a few character blocks further, I found 00 00 00 00 4F 01 00 00, 4F 01 being 335. Hmmm, it would be funny to give him lots of MP, which he can't use, because he lacks spells :-)&lt;br /&gt;&lt;br /&gt;Back to Narbrot. I typed FF FF over all four numbers I just found. Very subtle, I know. I copied the .sav file back to the SD disk and put it in the Nintendo DS. Alas, on starting the game, Dragon Quest sees that the save game has been tampered with, and deletes it! AAARGH! Well, maybe I was a little too rough. Let's try it again, but now I'll keep the values under 999, which is $03e7 hex. Damn! Detected again!&lt;br /&gt;&lt;br /&gt;How did it do that? Well, there seems to be some kind of &lt;a href="http://en.wikipedia.org/wiki/Checksum"&gt;checksum&lt;/a&gt; stored somewhere. But where, and in what way is it calculated? There's a trick for figuring that out: make two save games that differ only very little, then compare them. The differences should be the ones that you made, and another one: the checksum.&lt;br /&gt;This is what I did:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEQQiImTlI/AAAAAAAABDI/fsWPSu5x5-g/s1600-h/img_0395.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEQQiImTlI/AAAAAAAABDI/fsWPSu5x5-g/s320/img_0395.jpg" alt="" id="BLOGGER_PHOTO_ID_5287525313736494674" border="0" /&gt;&lt;/a&gt;The blue guy is the "save priest" who will save your game for you. Since the save games contain a "time played" field somewhere (30 hours in my case) I thought I would just wait around for a minute and press save again, and again. I should have three save games that only differ in time, and in checksum.&lt;br /&gt;&lt;br /&gt;Right, but how am I going to compare this? Not by hand, that would take long, and it would be very inaccurate. At first I wanted to write a nice program to do this for me, but it's such a common task that the tools must be out there somewhere. Let's find a binary diff utility. Google got me to &lt;a href="http://www.cjmweb.net/vbindiff/"&gt;vbindiff&lt;/a&gt;, and it's availble in Ubuntu, and it seems to work OK, and that makes it good enough, and.&lt;br /&gt;&lt;br /&gt;vbindiff wants to compare two &lt;span style="font-style: italic;"&gt;files&lt;/span&gt;. Oops! We only have one, and we want to compare parts of it. Let's turn the separate save games in the .sav file into real files. I thought that the dd tool (which always shows up in very complex, low level unix tasks) could help me here. A quick google gave me the man page (yeah yeah, "man dd" would have been more effective.) Looks like I can specify an input file (the .sav file,) an output file, a block size, I can skip a few blocks to the save game I want, then I can specify how many blocks the save game is in size.&lt;br /&gt;&lt;br /&gt;Now where exactly are the save games located? We've got the size ($3C00) but not the start position. Well, when looking through the file from the start with the hex editor, there's the DQ4 ARTE header I mentioned, followed by many, many zeroes, until we meet the word "arte" at $0400. Sounds like a header, and it's at a very nice, rounded address. Is this the start address? The next save game should be at $0400 + $3C00, which is $4000 according to the calculator. There we find another "arte". Just before it is a big block of filler FF's. It's pretty certain that these numbers are correct.&lt;br /&gt;&lt;br /&gt;The start addresses for the save games are: $0400, $4000, $7C00 and $B800. Since they all have the same least significant byte (00), I think that would be nice to use as the block size for dd. Take $100 for the block size, and the first save game will start after four blocks, the next after $40 (64 decimal,) and so on. $100 is 256 decimal. A save game is $3C00 bytes long, and that's $3C blocks, which is 60 decimal. So let's go dd:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dd if=awfullylongname.SAV of=savegame1.bin bs=256 skip=4 count=60&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dd if=awfullylongname.SAV of=savegame2.bin bs=256 skip=64 count=60&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;dd if=awfullylongname.SAV of=savegame3.bin bs=256 skip=124 count=60&lt;/span&gt;  &lt;span style="font-family:courier new;"&gt;dd if=awfullylongname.SAV of=savegame4.bin bs=256 skip=184 count=60&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That gives us four save game files! Now launch vbindiff on two of them:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEandRT9tI/AAAAAAAABDQ/G7KsBkb_JsY/s1600-h/Screenshot-vbindiff.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 254px;" src="http://4.bp.blogspot.com/_3Cbrz5lGjlM/SWEandRT9tI/AAAAAAAABDQ/G7KsBkb_JsY/s320/Screenshot-vbindiff.png" alt="" id="BLOGGER_PHOTO_ID_5287536702684133074" border="0" /&gt;&lt;/a&gt;Oooooh nice, differences in red, just what I wanted! There's a byte that has increased by 12, and (not all in the screenshot) there are a bunch of other fields that, when added together, have also increased by 12! So, is the first byte the checksum, a simple addition of all bytes in the save game? In that case, if I add 1 to the checksum, and 1 to the most significant byte of the maximum HP of Narbrot, the addition should still work, and the game should think that it is a valid save game, and Narbrot will have 256 hit points extra because I increased the most significant byte.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWEdojCL81I/AAAAAAAABDY/qgYwOy1IBBg/s1600-h/img_0399.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWEdojCL81I/AAAAAAAABDY/qgYwOy1IBBg/s320/img_0399.jpg" alt="" id="BLOGGER_PHOTO_ID_5287540019946058578" border="0" /&gt;&lt;/a&gt;Woops! I changed the wrong value, butyou get the idea :-) The checksum has been defeated, and I can now easily change HP and MP for all characters. The cheat is complete :-)&lt;br /&gt;&lt;br /&gt;Ofcourse, I could have done a lot more. To edit HP and MP freely, it would be useful to figure out which range of bytes are added to calculate the checksum (maybe all $3C00 bytes?) and how big the checksum is - we've now changed only one byte, but it's probably a two or four byte value. It would also be nice to improve the other statistics, but as far as I can see, the values on screen are not the same as in the save game file. Some trial and error is neccessary there. Editing the name of the main character is really easy - you can just overwrite it. The other names are missing, though. They are probably hard coded.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;(I've edited a few more save games in my life time. I think I started with an editor in BASIC for  save games for &lt;a href="http://www.lemon64.com/?mainurl=http%3A//www.lemon64.com/games/list.php%3Ftype%3Dpublisher%26name%3DStrategic%2520Simulations%2C%2520Inc."&gt;Champions of Krynn&lt;/a&gt; on the Commodore 64! No fancy hex editors and diff utilities then, just peeking and poking. Yes children, life was hard in the old days!) (I still couldn't win the damn gamn though, probably because all stats were stored in bytes, and I couldn't make them ludicrously high.)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;(I don't feel like proofreading such a long post, so just write a comment if something doesn't make sense, ok? No need to tell me I'm a moron.)&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6856037116857369962?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6856037116857369962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6856037116857369962' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6856037116857369962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6856037116857369962'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/cheating-in-dragon-quest-iv-programmers.html' title='Cheating in Dragon Quest IV, the programmer&apos;s way'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SWDxh22PmYI/AAAAAAAABB4/EQoaanLutIw/s72-c/dragonquest_on_sd_card.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2560562411052639930</id><published>2009-01-02T13:08:00.004+01:00</published><updated>2009-01-02T13:16:39.670+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='star trek'/><title type='text'>Haskell fan fiction?!?</title><content type='html'>&lt;a href="http://www.xent.com/pipermail/fork/Week-of-Mon-20070219/044101.html"&gt;And then there's Haskell...&lt;/a&gt; (from &lt;a href="http://lambda-the-ultimate.org/node/3133"&gt;this list&lt;/a&gt; on &lt;a href="http://lambda-the-ultimate.org/"&gt;Lambda the Ultimate&lt;/a&gt; where programming languages are compared to many other things.)&lt;br /&gt;&lt;br /&gt;Well, it's more tasteful than &lt;a href="http://www.thyla.com/fan-art.html"&gt;Kirk &amp;amp; Spock love stories.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2560562411052639930?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2560562411052639930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2560562411052639930' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2560562411052639930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2560562411052639930'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2009/01/haskell-fan-fiction.html' title='Haskell fan fiction?!?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3902144070203377571</id><published>2008-12-31T14:29:00.004+01:00</published><updated>2009-01-01T17:20:22.415+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><title type='text'>vi tutorial for vi haters</title><content type='html'>As a programmer, it's impossible to avoid vi, the once revolutionary unix text editor. Here are some tips that work on a reasonably standard keyboard:&lt;br /&gt;&lt;br /&gt;Tip 1: hitting escape a few times, followed by &lt;span style="font-weight: bold;font-family:courier new;" &gt;:x!&lt;/span&gt; or &lt;span style="font-weight: bold;font-family:courier new;" &gt;:q!&lt;/span&gt; will get you out of vi. That's "colon, x or q, exlamation mark." x will save the current file, q will abandon your current changes. The exclamation marks mean "I'm serious, vi, stop bothering me!" Try not to enter &lt;span style="font-family: courier new; font-weight: bold;"&gt;:X!&lt;/span&gt;, because this will encrypt your file on some very sadistic unix versions, turning it into a useless bunch of random bytes.&lt;br /&gt;&lt;br /&gt;Tip 2: vi has two modes: text typing mode and everything-else mode. To get back to everything-else mode, hit escape a few times. Actually, at any time when you want to do something, just press escape a few times before doing so. When you are in a complete panic because the cursor is jumping around and text appears and disappears whenever you type a key: press escape a few times. Really, just keep one finger on escape and hit it regularly.&lt;br /&gt;&lt;br /&gt;Tip 3: &lt;span style="font-family: courier new; font-weight: bold;"&gt;i&lt;/span&gt; will go to text typing mode from everything-else mode. The keys you press will end up as characters at the cursor position, which is how just about every other editor works. Sometimes they will be ignored or result in random crap appearing anywhere. Those are the advanced features that vi lovers keep telling you about.&lt;br /&gt;&lt;br /&gt;Tip 4: more recent vi's have reluctantly added support for cursor keys. If you're stuck with a more "elite" version of vi, try the &lt;span style="font-family: courier new; font-weight: bold;"&gt;h&lt;/span&gt;, &lt;span style="font-family: courier new; font-weight: bold;"&gt;j&lt;/span&gt;, &lt;span style="font-family: courier new; font-weight: bold;"&gt;k&lt;/span&gt; and &lt;span style="font-family: courier new; font-weight: bold;"&gt;l&lt;/span&gt; keys in anything-else mode.&lt;br /&gt;&lt;br /&gt;Tip 5: &lt;span style="font-family: courier new; font-weight: bold;"&gt;:u&lt;/span&gt; is undo. It has to be entered from everything-else mode.&lt;br /&gt;&lt;br /&gt;Tip 6: &lt;span style="font-family: courier new; font-weight: bold;"&gt;o&lt;/span&gt; in everything-else mode will add a new line below the line the cursor is on.&lt;br /&gt;&lt;br /&gt;Tip 7: &lt;span style="font-family: courier new; font-weight: bold;"&gt;dd&lt;/span&gt; in everything-else mode will delete the current line.&lt;br /&gt;&lt;br /&gt;Tip 8: &lt;span style="font-family: courier new; font-weight: bold;"&gt;A&lt;/span&gt; (that's shift-a) in everything-else mode will go to the end of the line and go into insert mode.&lt;br /&gt;&lt;br /&gt;Tip 9: &lt;span style="font-weight: bold; font-family: courier new;"&gt;x&lt;/span&gt; in everything-else mode will delete the character under the cursor (it's practically a delete key!)&lt;br /&gt;&lt;br /&gt;These, together with the terminal cut/copy/paste functionality of the OS, should get you through every vi task ever. Some might take very long, but nothing is impossible now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3902144070203377571?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3902144070203377571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3902144070203377571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3902144070203377571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3902144070203377571'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/vi-tutorial-for-vi-haters.html' title='vi tutorial for vi haters'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-6137279599145557812</id><published>2008-12-24T20:27:00.003+01:00</published><updated>2008-12-24T20:53:22.516+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ocaml'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='f#'/><title type='text'>Books</title><content type='html'>I've just received &lt;a href="http://www.amazon.co.uk/Wicket-Action-Martijn-Dashorst/dp/1932394982"&gt;Wicket in Action&lt;/a&gt;. A quick look at the contents makes me happy - it looks very thorough. I'll post a better review after I read it :-) The paper book comes with a PDF version for free!&lt;span style="font-size:78%;"&gt; Well, "comes with"... You can download it after going through some odd scheme where you have to type in codes that are supplied in a table in the book. Reminds me of old video game copy protection schemes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now I want to buy &lt;a href="http://www.amazon.co.uk/Real-World-Haskell-Code-Believe/dp/0596514980/"&gt;Real World Haskell&lt;/a&gt;, which is actually&lt;a href="http://book.realworldhaskell.org/read/"&gt; posted online in its entirety!&lt;/a&gt; You can even comment on every paragraph of the book and subscribe to RSS feeds of the comments! Very, very modern.&lt;br /&gt;&lt;br /&gt;I'm interested in the book because it might just make bridging the gap between imperative and functional a little easier, unlike &lt;a href="http://www.amazon.co.uk/Haskell-School-Expression-Functional-Programming/dp/0521644089"&gt;The Haskell School of Expression&lt;/a&gt;, which just left me with the feeling that Haskell is a language for masochists (&lt;a href="http://www.arkansasmistress.com/haskell-mistress"&gt;try this not-safe-for-work link for that.&lt;/a&gt;) &lt;a href="http://on-ruby.blogspot.com/2008/12/author-interview-real-world-"&gt;Here's an interesting interview with the writers of the book&lt;/a&gt;, which is posted on a Ruby blog for some reason.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;My girlfriend is learning &lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/"&gt;F#&lt;/a&gt;, which is really &lt;a href="http://sds.podval.org/ocaml-sucks.html"&gt;ocaml&lt;/a&gt;. I guess F# and &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; have the same goal, but why is Scala so much more complex then?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-6137279599145557812?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/6137279599145557812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=6137279599145557812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6137279599145557812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/6137279599145557812'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/books.html' title='Books'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2183715658317041299</id><published>2008-12-22T16:02:00.004+01:00</published><updated>2008-12-22T16:44:51.712+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><category scheme='http://www.blogger.com/atom/ns#' term='kaizen'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>The secret behind Agile</title><content type='html'>I find that the fastest way to explain Agile to Agile n00bs is as follows:&lt;br /&gt;&lt;br /&gt;"Don't just do what you do because you always did it that way. Analyze whatever you are doing, think actively, think about what could be improved. Then try to improve it, don't sit there and get frustrated because people tell you that it was always done that way, and that they don't wat to change it. If you want inspiration for how things can be improved, look at Agile methodologies like XP and Scrum. Have fun discovering better ways of working!"&lt;br /&gt;&lt;br /&gt;Well, I thought that was the basic definition of Agile, but it seems that I was explaining &lt;a href="http://en.wikipedia.org/wiki/Kaizen"&gt;Kaizen&lt;/a&gt;, or continuous improvement, which comes from Lean. An article like "&lt;a href="http://lizkeogh.com/2008/12/02/the-problem-with-scrum/"&gt;The Problem with Scrum&lt;/a&gt;" shows what happens if you leave the Kaizen out of your work. You can Scrum whatever you like, but if you resist Kaizen, it won't work.&lt;br /&gt;&lt;br /&gt;I would say that actively finding solutions for problems is a basic personality trait that people either have, or don't have. It's also what separates the people in the more static jobs (I'm thinking of maintenance, DBA'ers, enterprise consultants, government jobs) from the ones with more dynamic jobs (cutting edge developers, architects, people in small commercial companies. I think I might be showing some bias here ;-) ) Things get fundamentally difficult when mixing these two. The conflicts between keeping things stable as they are, and moving quickly into the future are neverending.&lt;br /&gt;&lt;br /&gt;It's not a question of which of these two is right. Both groups need to shape up and become more dynamic, because the whole world is, and the world is spinning faster every day.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2183715658317041299?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2183715658317041299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2183715658317041299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2183715658317041299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2183715658317041299'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/secret-behind-agile.html' title='The secret behind Agile'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4399918377154609000</id><published>2008-12-22T14:43:00.007+01:00</published><updated>2008-12-22T15:59:13.487+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='e-books'/><category scheme='http://www.blogger.com/atom/ns#' term='nas'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='gadgets'/><category scheme='http://www.blogger.com/atom/ns#' term='e-reader'/><title type='text'>e-readers</title><content type='html'>There are a lot of e-books hidden away on my NAS (a &lt;a href="http://netgear.com/Products/Storage/ReadyNASNVPlus.aspx"&gt;ReadyNAS NV+&lt;/a&gt;, recommended!) which never get read. Not surprising, since I'm way too distracted when trying to read them on a computer. There's mail to read, new subjects to research, it needs no explanation. In some situations, like traveling, sitting outside somewhere, or in a meeting, I wish I could read something, but I can't easily get a big book into that place. That's where an e-reader would come in handy.&lt;br /&gt;&lt;br /&gt;Basic must-haves for an e-reader are the easy-on-the-eyes screen, and the long battery life. (Long battery life should be mandatory for every bloody portable gadget!) This rules out reading ebooks on PDA's or laptops, which are too heavy anyway.&lt;br /&gt;&lt;br /&gt;After some Googling around, I found &lt;a href="http://www.forbes.com/2007/12/03/ebooks-kindle-digital-tech-personaltech-cx_ag_1203ebooks.html"&gt;a Forbes article&lt;/a&gt; with the past, present, and future of e-readers.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The ubiquitous Amazon Kindle - it looks like the cheapest of cheap crap from China. I wouldn't be found dead, holding this thing. It doesn't even support PDF!&lt;/li&gt;&lt;li&gt;A Sony Whatever - it's Sony. Don't buy it. They don't care about their customers. Yes, big companies rarely care about customers, but Sony actually lets their customers know.&lt;/li&gt;&lt;li&gt;iRex, Plastic Logic, Seiko Epson (what, did they merge? In 1985? Woops, I guess I missed that :-) ) e-readers: too big, too expensive, but nice note taking ability. It would be easier to buy a laptop if you want interaction like that.&lt;/li&gt;&lt;li&gt;iPhone Stanza Reader: why is that there? There are hundreds of applications like it! Better put every computer with Adobe Acrobat on the list too, eh? Why not add the "type" command from DOS?&lt;/li&gt;&lt;li&gt;Color and video support: yes, and we're also missing an mp3 player, a keyboard, a mouse, an HDTV screen, OpenGL support for games, a GPS unit, &lt;a href="http://www.usb.org/home"&gt;USB3 ports&lt;/a&gt; and a built-in &lt;a href="http://www.global.yamaha.com/design/tenori-on/"&gt;Tenori-on&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Polymer Vision Readius: well, I thought this one was the greatest thing ever, but &lt;a href="http://www.youtube.com/watch?v=TB7fUa4MZfM"&gt;in a recent video it looks like it has a million features built in&lt;/a&gt;, so it will probably be horribly expensive once it is available.&lt;/li&gt;&lt;/ul&gt;Please, make something like the Readius, but make it only read TXT and PDF, and make sure it costs no more than €100, please?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;I got distracted for 1187 seconds while writing this, because of the utterly silly game &lt;a href="http://armorgames.com/play/2893/achievement-unlocked"&gt;Achievement Unlocked&lt;/a&gt;!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4399918377154609000?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4399918377154609000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4399918377154609000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4399918377154609000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4399918377154609000'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/e-readers.html' title='e-readers'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-260792353886516889</id><published>2008-12-22T00:59:00.002+01:00</published><updated>2008-12-22T01:05:29.274+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>New project: database tool</title><content type='html'>Every time I need to create some SQL at work, I find myself looking for a simple tool that will let me edit a query, quickly run it, and see the results. There are many of these tools, but most of them lack one thing or another: some are nagware, some cost money (and why pay for something I can easily make myself,) some work with only one brand of database, some won't work at all, some are buggy, some are web based, and some are simply clumsy (all the web based ones are.)&lt;br /&gt;&lt;br /&gt;Therefore, I will build myself a simple Swing database tool that works with plain JDBC.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;I wonder how far I'll get ;-)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-260792353886516889?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/260792353886516889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=260792353886516889' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/260792353886516889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/260792353886516889'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/new-project-database-tool.html' title='New project: database tool'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7646306355022343032</id><published>2008-12-20T19:25:00.003+01:00</published><updated>2008-12-20T19:32:40.314+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><title type='text'>The one thing missing from email clients</title><content type='html'>A long, long time ago, my mail client was &lt;a href="http://en.wikipedia.org/wiki/Pine_%28e-mail_client%29"&gt;pine&lt;/a&gt;. I don't miss much of it that I can't get in newer mail client. Except for one thing: the bounce option - it simply fakes a message from your mail server, saying that your email account does not exist. Using it to tell spammers that their database is out of date might not work, but it worked very well for tactfully telling people that you really don't want to talk to them anymore ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7646306355022343032?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7646306355022343032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7646306355022343032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7646306355022343032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7646306355022343032'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/one-thing-missing-from-email-clients.html' title='The one thing missing from email clients'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-9080860078315041780</id><published>2008-12-15T22:52:00.002+01:00</published><updated>2008-12-15T22:58:00.368+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>Netbeans? Heheheh</title><content type='html'>&lt;a href="http://www.adam-bien.com/roller/abien/entry/google_trends_seems_like_netbeans"&gt;Adam Bien&lt;/a&gt;&lt;a href="http://www.adam-bien.com/roller/abien/entry/google_trends_seems_like_netbeans"&gt; sounds like he really wants Netbeans to be the most widely used IDE of them al&lt;/a&gt;l. I'm afraid that's just not very realistic. For me, it's the least usable of the big IDE's. The last time I used it, it had so many small problems that, when put together, they made one big problem: the IDE was getting in the way more than it was helping.&lt;br /&gt;&lt;br /&gt;One of the most annoying things was CTRL-F4 closing not only the code windows, but also the project window! And here I go, cleaning up my screen by holding CTRL-F4, then having to track down the option to turn the project window back on!&lt;br /&gt;&lt;br /&gt;Maybe in a few years, eh?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-9080860078315041780?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/9080860078315041780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=9080860078315041780' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9080860078315041780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9080860078315041780'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/netbeans-heheheh.html' title='Netbeans? Heheheh'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2257390974168078434</id><published>2008-12-11T22:26:00.001+01:00</published><updated>2008-12-11T22:28:04.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domain names'/><title type='text'>Stop het speculeren met domeinnamen</title><content type='html'>&lt;a href="http://stopdespeculatie.petities.nl"&gt;Teken de petitie tegen het speculeren met domeinnamen.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Domeinnamen zijn er om te gebruiken, niet om mee te handelen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2257390974168078434?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2257390974168078434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2257390974168078434' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2257390974168078434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2257390974168078434'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/stop-het-speculeren-met-domeinnamen.html' title='Stop het speculeren met domeinnamen'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-272053692187634479</id><published>2008-12-10T22:02:00.000+01:00</published><updated>2008-12-10T22:03:03.360+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='closures'/><category scheme='http://www.blogger.com/atom/ns#' term='cobol'/><title type='text'>Java closures</title><content type='html'>For the coming years, I'm pretty sure that I will regularly be asked to do some maintenance programming on an old piece of junk, written in Java. Actually, I'm already doing way more maintenance than I like. Java is truly turning into the new Cobol.&lt;br /&gt;&lt;br /&gt;The pattern can be seen in many other languages. First, they are new and fresh, they have interesting capabilities that haven't been seen before. Some languages like these will attract hordes of programmers to them. They will become famous, become the target of language wars, will get their own personal cheerleader team.&lt;br /&gt;&lt;br /&gt;Then, another language manages to copy everything they did, and improves on it. Uh oh! The need is felt to stay the best thing ever, and the Best Language Ever will have to start improving to keep up. This might work for a while, but after a few jumps outside their technological territory, languages will start to look... well, at least like a *different* language. And all the libraries and users are sitting around, looking at the new language, thinking "but hey, that's not the way we agreed to do things! What should we do? Change along with the language? But we can't, think of the *users*!" And that's where the long, slow fall of the language starts.&lt;br /&gt;&lt;br /&gt;So I'll just repeat what others have said before. Java is in the phase where it is trying to keep up. With closures, it will definitely become a different language. Closures will never gain much acceptance, because most people will stick to previous ways of programming. Don't do this to Java, don't mutilate the corpse! And most importantly: don't do this to me, I have to clean up this mess for the coming decades!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-272053692187634479?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/272053692187634479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=272053692187634479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/272053692187634479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/272053692187634479'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/java-closures.html' title='Java closures'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-4034599819383665974</id><published>2008-12-10T19:49:00.003+01:00</published><updated>2008-12-10T19:53:40.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='webstart'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='commodore 64'/><category scheme='http://www.blogger.com/atom/ns#' term='sid'/><title type='text'>JSIDPlay2!</title><content type='html'>This is by far the coolest webstart application I've seen: &lt;a href="http://jsidplay2.sourceforge.net/"&gt;JSIDPlay2&lt;/a&gt;, a Java SID player! (&lt;a href="http://en.wikipedia.org/wiki/MOS_Technology_SID"&gt;SID&lt;/a&gt; being the name of the sound chip of the &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt;, my favorite computer from 1983 through 1993.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-4034599819383665974?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/4034599819383665974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=4034599819383665974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4034599819383665974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/4034599819383665974'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/jsidplay2.html' title='JSIDPlay2!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2706781502172486419</id><published>2008-12-10T19:22:00.001+01:00</published><updated>2008-12-10T19:25:23.404+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><title type='text'>Haskell &amp; FP articles</title><content type='html'>&lt;div&gt;&lt;/div&gt;Maybe this blog should be called: "all the things I still have to do." Today: three papers/articles to read:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.md.chalmers.se/%7Erjmh/Papers/whyfp.html"&gt;Why functional programming matters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.haskell.org/haskellwiki/Why_Haskell_matters"&gt;Why Haskell matters&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paulgraham.com/avg.html"&gt;Beating the averages&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2706781502172486419?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2706781502172486419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2706781502172486419' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2706781502172486419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2706781502172486419'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/haskell-fp-articles.html' title='Haskell &amp; FP articles'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7776432036324663849</id><published>2008-12-10T18:46:00.005+01:00</published><updated>2008-12-10T19:31:49.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='applets'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Applet games</title><content type='html'>Ever since I got my first computer, I have been programming games as a hobby. Especially in the nineties this lead to some semi-acceptable results, although all of this has disappeared in a multitude of hard disk crashes since then.&lt;br /&gt;&lt;br /&gt;Lately, my aim is to make game applets. There are several problems with that:&lt;br /&gt;1. applet support in browsers is still crap.&lt;br /&gt;2. it's hard to figure out how to build a high performance multimedia applet well.&lt;br /&gt;&lt;br /&gt;JavaFX needs better browser support, and is trying to get this by releasing much improved browser plugins, so that should take care of the first problem in a few months to a year or so. JavaFX is also supposed to make it quite easy to create multimedia software in Java. Even games. No surprise that I was thinking to experiment with JavaFX.&lt;br /&gt;&lt;br /&gt;However, recently I found a library that seems to do what I need with a lot less noise: &lt;a href="http://www.interactivepulp.com/pulpcore/"&gt;Pulpcore&lt;/a&gt;. I'll be looking into it, it looks like it is a much more direct way to my goal.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7776432036324663849?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7776432036324663849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7776432036324663849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7776432036324663849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7776432036324663849'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/applet-games.html' title='Applet games'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7980311499978241111</id><published>2008-12-08T10:34:00.005+01:00</published><updated>2008-12-10T19:23:57.982+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile Thought Leader</title><content type='html'>1. "Agile Thought Leader" sounds like something from the novel &lt;a href="http://en.wikipedia.org/wiki/Nineteen_Eighty-Four"&gt;1984&lt;/a&gt;.&lt;br /&gt;2. You don't become an Agile Thought Leader by putting it on your CV. You actually have to make a difference in the Agile world. Just having a big ego is not enough, and it only devalues the term.&lt;br /&gt;&lt;br /&gt;Thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7980311499978241111?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7980311499978241111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7980311499978241111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7980311499978241111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7980311499978241111'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/agile-thought-leader.html' title='Agile Thought Leader'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-618310240273024972</id><published>2008-12-03T14:33:00.010+01:00</published><updated>2008-12-10T19:25:00.760+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Thought on experiments with JavaFX</title><content type='html'>The &lt;a href="http://www.ociweb.com/jnb/jnbDec2008.html"&gt;"Experiments with JavaFX"&lt;/a&gt; article has been getting some attention lately. Here are some thoughts I had while reading it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I'm very happy that the 1.0 release of the JavaFX SDK will be out tomorrow. The current situation with two compilers is not quite optimal ;)&lt;/li&gt;&lt;li&gt;Type inference is being used, very very nice! Inferring implicit information about source code takes the best of both worlds: short and solid code.&lt;/li&gt;&lt;li&gt;Using classes for the built-ins: good! Primitive types are a big wart on Java.&lt;/li&gt;&lt;li&gt;def/var/function - how random! Lots of confusion coming up with other languages!&lt;/li&gt;&lt;li&gt;String interpolation: nice, but isn't using { } a little dangerous?&lt;/li&gt;&lt;li&gt;Constants in all caps? Are they kidding? They're keeping that ancient, ugly C naming convention?&lt;/li&gt;&lt;li&gt;Default values for variables? Have they gone insane?!? I thought default values had been buried in the past after the great experience gained from BASIC and friends! When exactly is it useful to have an integer default to zero?&lt;/li&gt;&lt;li&gt;Some functional bits... Nice, but probably more to please the closure crowd than the functional programmers.&lt;/li&gt;&lt;li&gt;Sequences are nice, they look like Haskell lists :)&lt;/li&gt;&lt;li&gt;Object literals are one of the main points of JavaFX since it enables the declarative GUIs that the whole project was started for.&lt;/li&gt;&lt;li&gt;Bleh, "import" is still there. With a little imagination this could be inferenced too.&lt;/li&gt;&lt;li&gt;Checked exceptions seem to have turned into runtime exceptions? Another point where inference would take the best from both worlds, I'll post about that later.&lt;/li&gt;&lt;li&gt;mod, and, or, not? Why deviate from Java in such a trivial place, but not in other places?&lt;/li&gt;&lt;li&gt;Blocks, implicit return values, fancy for loops. Nice. It's also mostly standard stuff.&lt;/li&gt;&lt;li&gt;Data binding looks great! Hurray for easy model-view binding!&lt;/li&gt;&lt;li&gt;A sizeof operator? Why make that an operator, not a method on sequences?&lt;/li&gt;&lt;li&gt;Sequence comprehensions - nice, although I can't yet see why sequences get so much attention.&lt;/li&gt;&lt;li&gt;Triggers are very useful for GUI development. &lt;/li&gt;&lt;li&gt;I see JavaFX as a tool for GUI development. Defining classes does not need to be part of this, since all non-GUI code could be written in Java. Still, pretty complex class definitions are supported. That sounds like a waste of time, and not in line with the "simple" feeling of the rest of the language.&lt;/li&gt;&lt;li&gt;I don't know what to think of modules yet.&lt;/li&gt;&lt;li&gt;I miss the constant inference from the first versions of JavaFX Script. It's really ugly to specify ClassName.CONSTANT, taking up half the line with a constant name. Please bring inference back!&lt;/li&gt;&lt;li&gt;Ugh, that internationalization syntax is &lt;em&gt;ugly!&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Some of the best things are at the end: Multimedia support - I don't know what to think about that company that is supposed to supply codecs (or whatever) to Sun. Asynchronous communication with "bind" looks cool!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In short, the language seems to have grown quite a bit in the last two years. For me, the most important things were there from the start, and most of what has been added seem to be features to turn JavaFX Script into a Real Language. Contradicting this are a bunch of weird language design decisions that are not going to help anyone. You can almost see people pulling the project around: "no, it should be more like Ruby, no, more like Visual Basic, no no, like Java!"&lt;/p&gt;&lt;p&gt;I would have been quite happy with just a limited language for GUI building.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-618310240273024972?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/618310240273024972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=618310240273024972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/618310240273024972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/618310240273024972'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/thought-on-experiments-with-javafx.html' title='Thought on experiments with JavaFX'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-5202194763402923349</id><published>2008-12-01T11:25:00.003+01:00</published><updated>2008-12-10T19:26:13.793+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><title type='text'>Agile Project Leadership Network?</title><content type='html'>Having been certified as a Certified Scrum Master (by sitting in a room playing games for two days,) I was automatically a member of the Scrum Alliance. After getting certified, I didn't really need them for anything else but the fuzzy, warm group feeling, so when they started to ask for money, I quit. Anyway, I think that Scrum is a good start, but its focus on improvements might lead to abandoning parts of Scrum. When you do that, I guess you're going "generally Agile," and why stick with the Scrum Alliance then?&lt;br /&gt;&lt;br /&gt;Now I found the &lt;a href="http://www.apln.org/"&gt;ALPN&lt;/a&gt;. I haven't been able to look into it much, but it seems like a much more free and open organization. No Dutch Chapter yet, maybe &lt;a href="http://agileholland.com/"&gt;Agile Holland&lt;/a&gt; can pick that up?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-5202194763402923349?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/5202194763402923349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=5202194763402923349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5202194763402923349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/5202194763402923349'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/12/agile-project-leadership-network.html' title='Agile Project Leadership Network?'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2202611041389326209</id><published>2008-11-30T15:12:00.003+01:00</published><updated>2008-12-10T19:26:38.319+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jogl'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Using JOGL as a dependency in a Maven project</title><content type='html'>Maven is like a jungle: if you live in it for a while, you will find or make paths that lead to your goals. If, one day, you need something different, the jungle shows how hostile and raw it really is.&lt;br /&gt;&lt;br /&gt;So I took my machete to figure out a path to getting JOGL installed as a dependency. Here we go:&lt;a href="https://maven2-repository.dev.java.net/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://maven2-repository.dev.java.net/"&gt;Configure your pom.xml to search the java.net Maven 2 repository&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Go to&lt;a href="http://www.javagaming.org/index.php/topic,17839.0.html"&gt; an obscure corner of the java.net forums&lt;/a&gt; to see which dependency to use.&lt;/li&gt;&lt;/ol&gt;I'm not too happy that the dependencies are architecture dependent - I have a feeling that this will lead to problems for me in the future, since I want to deploy this application as an applet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2202611041389326209?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2202611041389326209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2202611041389326209' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2202611041389326209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2202611041389326209'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/using-jogl-as-dependency-in-maven.html' title='Using JOGL as a dependency in a Maven project'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-2443999388141378354</id><published>2008-11-30T13:25:00.004+01:00</published><updated>2008-12-10T19:27:29.860+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='webstart'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>JavaFX 1.0 release is imminent</title><content type='html'>Chris Oliver, spiritual father of the JavaFX project,&lt;a href="http://blogs.sun.com/chrisoliver/entry/javafx_1_0_now_you"&gt; wrote some pre-1.0 words.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I can't wait to try it out... once the Eclipse and Netbeans plugins are actually working, and the Java plugin for Firefox on Ubuntu doesn't crash the browser, and Webstart applications stop failing silently.&lt;br /&gt;&lt;br /&gt;That's quite a lot of crap that still has to be cleaned up!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-2443999388141378354?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/2443999388141378354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=2443999388141378354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2443999388141378354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/2443999388141378354'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/javafx-10-release-is-imminent.html' title='JavaFX 1.0 release is imminent'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-9381297760475601</id><published>2008-11-28T23:15:00.005+01:00</published><updated>2008-12-10T19:28:27.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='swing'/><category scheme='http://www.blogger.com/atom/ns#' term='midi'/><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='syntherface'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><title type='text'>Converting to Maven</title><content type='html'>Tonight I've turned &lt;a href="http://code.google.com/p/syntherface/"&gt;Syntherface&lt;/a&gt; into a Maven 2 project. It's also the first serious bit of programming done on my new laptop (a Compaq 6910p, don't buy it, it's &lt;span style="font-style: italic;"&gt;weak&lt;/span&gt;.)&lt;br /&gt;&lt;br /&gt;The laptop has Ubuntu installed. The amount of different "file open" dialogs is incredible! Where would we be without the freedom to duplicate functionality?&lt;br /&gt;&lt;br /&gt;Eclipse had no real trouble with the new maven structure, even though it needed some nudges in the right direction. Since Syntherface is a rather GUI heavy application, I use a visual GUI editor - the one in Netbeans. Now, Eclipse mostly tolerates Maven projects, but Netbeans embraced the Maven modules, showing lots of information and structure &lt;span style="font-style: italic;"&gt;in the right place&lt;/span&gt;, and making submodules really easy to traverse. As an IDE, Netbeans still sucks, ofcourse.&lt;br /&gt;&lt;br /&gt;After everything compiled again, I plugged in my USB to MIDI dongle, ran Syntherface, and everything worked, just like that! So even at MIDI interface level, Java is platform independent :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-9381297760475601?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/9381297760475601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=9381297760475601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9381297760475601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/9381297760475601'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/converting-syntherface.html' title='Converting to Maven'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-7485841383941445902</id><published>2008-11-28T14:22:00.001+01:00</published><updated>2008-12-10T19:29:08.505+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='exceptions'/><title type='text'>Runtime exception languages</title><content type='html'>A few days ago, I felt offended by someone talking about some languages as being "Agile." The argument seems to be that if you can throw something together quickly, it's Agile.&lt;br /&gt;&lt;br /&gt;I hereby suggest another name for these languages: Runtime Exception Languages. You save time upfront by typing less. Fun! Too bad that you lose time later on by tripping over bugs that weren't found by the non-existent compiler.&lt;br /&gt;&lt;br /&gt;Agile says "respond quickly to change." You need a versatile programming language to cope with that. I'm not saying Java is the answer, but simply claiming that Runtime Exception Languages are by default Agile is plain offensive!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-7485841383941445902?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/7485841383941445902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=7485841383941445902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7485841383941445902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/7485841383941445902'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/runtime-exception-languages.html' title='Runtime exception languages'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-8482726364735856814</id><published>2008-11-28T14:03:00.002+01:00</published><updated>2008-12-10T19:33:20.816+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='wicket'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Times must change</title><content type='html'>The world wide web was designed as a distributed hyperlinked network of HTML documents.&lt;br /&gt;&lt;br /&gt;If only  it had stayed that way. Web development is the worst thing that happened to the software development world. Jim Weaver has a very strong &lt;a href="http://www.typepad.com/t/trackback/2709996/36153646"&gt;statement about this on his blog.&lt;/a&gt; Personally, I draw the line at "Ajax" - this has become too absurd!&lt;br /&gt;&lt;br /&gt;We really, really need things to change. Ideally, the world would move on to true RIAs - the desktop applications of the nineties, distributed on the medium of today: the web, with a modern multi-tier architecture. I'm watching &lt;a href="http://www.sun.com/software/javafx/"&gt;JavaFX&lt;/a&gt; for that. Currently, it sucks, but it has the potential of running full powered Java desktop applications by simply clicking a link on a website. I'm ignoring everything that's based on Flash. Nothing good ever came from products that were designed to do A, but were later "improved" to do much, much more.&lt;br /&gt;&lt;br /&gt;Ofcourse, most of the world has taken on the mantra that every application must be a web application, just because everybody says so. Adaption of RIA's will therefore be slow. In the meantime, there's no better option for building web applications than using &lt;a href="http://wicket.apache.org/"&gt;Wicket&lt;/a&gt;. You can actually build all logic in Java, instead of enjoying incompatible browser-land.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-8482726364735856814?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/8482726364735856814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=8482726364735856814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8482726364735856814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/8482726364735856814'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/times-must-change.html' title='Times must change'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-3759884817412355679</id><published>2008-11-28T13:41:00.003+01:00</published><updated>2008-12-10T19:32:36.698+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='functional programming'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='intellij'/><category scheme='http://www.blogger.com/atom/ns#' term='db4o'/><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='neo4j'/><category scheme='http://www.blogger.com/atom/ns#' term='jpf'/><category scheme='http://www.blogger.com/atom/ns#' term='syntherface'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Currently investigating...</title><content type='html'>My main source of "energy" (quite a managerial way to use this word) is satisfying my curiosity. Therefore I'm constantly looking for new, interesting things. I'll list a bunch that are programming related here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Functional programming. There is a slow movement of including more and more functional features in mainstream languages. In the &lt;a href="http://www.java.com/en/"&gt;Java&lt;/a&gt; world, &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is attracting a lot of attention with a hybrid OO/functional approach. The risk that &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; takes is that most people will use mostly OO stuff, not knowing the power of functional programming. Because I normally use &lt;a href="http://www.java.com/en/"&gt;Java&lt;/a&gt; a lot (the job wants me to,) I've decided to look at it from the other side by learning &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Alternatives for relational databases. I've never liked them very much, and using them in modern software development always creates a bunch of crap in your code, be it configuration files, annotations, frameworks or whatever. Some nice alternatives I found are &lt;a href="http://neo4j.org/"&gt;neo4j&lt;/a&gt;, a graph oriented database, and &lt;a href="http://www.db4o.com/"&gt;db4o&lt;/a&gt;, an easy to use OO database. Things like couchdb - no thanks.&lt;/li&gt;&lt;li&gt;For my &lt;a href="http://www.ohloh.net/projects/syntherface"&gt;Syntherface&lt;/a&gt; project, I was looking for a way to manage plugins. I may have found that in &lt;a href="http://jpf.sourceforge.net/"&gt;JPF&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Colleagues are bragging about how great &lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt; is, and their demonstrations of this IDE are quite convincing. Still, it costs money. Eeeeek!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-3759884817412355679?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/3759884817412355679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=3759884817412355679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3759884817412355679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/3759884817412355679'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/currently-investigating.html' title='Currently investigating...'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2417759645921975473.post-396051293906181405</id><published>2008-11-28T13:35:00.000+01:00</published><updated>2008-11-28T13:38:29.578+01:00</updated><title type='text'>Hello World!</title><content type='html'>Having been programming since 1983 (I was 9,) and working in IT since 1998, there's a lot on my mind about software development in general. Ofcourse, just like all other bloggers, I feel that these thoughts are of interest to others. I will share them here!&lt;br /&gt;&lt;br /&gt;Subscribe, and you will receive knowledge!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2417759645921975473-396051293906181405?l=tastyimportant.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tastyimportant.blogspot.com/feeds/396051293906181405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2417759645921975473&amp;postID=396051293906181405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/396051293906181405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2417759645921975473/posts/default/396051293906181405'/><link rel='alternate' type='text/html' href='http://tastyimportant.blogspot.com/2008/11/hello-world.html' title='Hello World!'/><author><name>Danny</name><uri>http://www.blogger.com/profile/06851175607965844768</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='27' src='http://1.bp.blogspot.com/_3Cbrz5lGjlM/SS_0Qls9EVI/AAAAAAAAAvY/u77QsEIYkKs/S220/lol-monkey.jpg'/></author><thr:total>0</thr:total></entry></feed>
