<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkUBRH0_fSp7ImA9WhRaE0Q.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736</id><updated>2012-02-16T14:17:35.345+01:00</updated><category term="strategy" /><category term="games" /><category term="privacy" /><category term="china" /><category term="redundancy" /><category term="philosophy" /><category term="java" /><category term="flashcardfriday" /><category term="photography" /><category term="twitter" /><title>Networking programmer David</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.movnet.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.movnet.org/" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/NetworkingProgrammerDavid" /><feedburner:info uri="networkingprogrammerdavid" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Dk8DSHg4eCp7ImA9WxJSF0Q.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-919146229240253241</id><published>2009-05-08T08:53:00.012+02:00</published><updated>2009-05-08T17:01:19.630+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-08T17:01:19.630+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SgPXGkYU0eI/AAAAAAAAAD4/FBNfW14gjA8/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SgPXGkYU0eI/AAAAAAAAAD4/FBNfW14gjA8/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5333342891581690338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;Flash card Friday&lt;/a&gt;, on time. Without further ado, here are the lessons learned this week:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Bounded wildcards should not be used for fields&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;mentioned PECS before&lt;/a&gt;, and this relates to it. Maybe you've be tempted by the sweet sugar that is bounded wildcard generics. You need to be careful though. So far, I've only found one good usage area for them, and that is method arguments. It would however, in my opinion, be a mistake to use them for:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Return values. They clutter the API in unnecessary ways, and it's &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;not Java 5 compatible&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Field or variable types. Try it. You'll run into trouble.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Of course, I may be wrong about these things, so let me know if you disagree.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Google App Engine datastore not suited for massive amounts of data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This week, I developed a small &lt;a href="http://code.google.com/appengine/"&gt;GAE&lt;/a&gt; application that scrapes a website for apartment listings. In no time I had found thousands of entries, each saved as an entity in the GAE datastore. Awesome.&lt;br /&gt;&lt;br /&gt;Then I found myself in a bit of a pickle. The datastore API only permits fetching of at most 1000 entities per fetch call. Ok, I thought, so I guess I can just get the next 1000 after that. Nope, the offset also has a limit of 1000. But, I can actually iterate over the query object! Great? Well, unfortunately, the time one is allowed to spend in datastore API calls is quite limited, so the iteration times out in a few seconds.&lt;br /&gt;&lt;br /&gt;I'd love to hear how people manage large amounts (&gt;10k) of entities in the GAE datastore.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Good ideas often bring additional benefits&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Something I've noticed when watching skilled coders refactor is that their changes often include additional benefits. Their explanations often sound something like this:&lt;br /&gt;&lt;br /&gt;- Well, if we do it this way instead, then we don't need this list at all. &lt;span style="font-style: italic;"&gt;And also, those classes can make use of this thing now, so we can remove that old thing.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;- If we change this method signature we will get a cleaner API. &lt;span style="font-style: italic;"&gt;That other class can then make use of this instead, further decreasing our dependence on that other sucky API.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note the sentences in italics. These are the extra perks you get when you're doing a good job refactoring your code. In fact, if your refactoring &lt;span style="font-style: italic;"&gt;doesn't&lt;/span&gt; bring any extra benefits, maybe you should rethink it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Note: It's not a coincidence that my examples described refactoring making code leaner. That's the way it should be done :)&lt;/span&gt;&lt;br /&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/6090682633286391736-919146229240253241?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/BE59IK6_SYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/919146229240253241/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/05/flash-card-friday.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/919146229240253241?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/919146229240253241?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/BE59IK6_SYU/flash-card-friday.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SgPXGkYU0eI/AAAAAAAAAD4/FBNfW14gjA8/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/05/flash-card-friday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkACQns4fyp7ImA9WxJSF04.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7786132957752622752</id><published>2009-05-07T22:56:00.000+02:00</published><updated>2009-05-08T00:19:23.537+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-08T00:19:23.537+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Thoughts on inspiration</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SgNRuqWuvII/AAAAAAAAADw/rgcA-aYNrL0/s1600-h/plane.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SgNRuqWuvII/AAAAAAAAADw/rgcA-aYNrL0/s400/plane.jpg" alt="" id="BLOGGER_PHOTO_ID_5333196245822258306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Back in the day, when I was a naïve youngster, I used to think that good ideas came from thinking. Don't get me wrong, that's definitely part of the recipe. It's only that, just thinking doesn't get you very far. Lately, I have realized something:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;Inspiration does not come from within.&lt;/blockquote&gt;I get inspired by talking and listening to other people. By watching a good movie. By reading an interesting article. By observing. Those are the times I get good ideas.&lt;br /&gt;&lt;br /&gt;Occasionally I find myself in the mood for starting a new project, be it small or big. I sit and try to come up with a good idea - it could be something to code, something to sell, or something to do. Rarely that thinking amounts to anything. If you experience the same thing, I have one tip. Stop thinking. Go catch a movie. Grab a beer with a friend. You'll know a good idea when you have one. Meanwhile, relax. Watched water does not boil.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-7786132957752622752?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/YfaJhB77cJs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7786132957752622752/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/05/thoughts-on-inspiration.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7786132957752622752?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7786132957752622752?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/YfaJhB77cJs/thoughts-on-inspiration.html" title="Thoughts on inspiration" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SgNRuqWuvII/AAAAAAAAADw/rgcA-aYNrL0/s72-c/plane.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/05/thoughts-on-inspiration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cGSHY7eCp7ImA9WxJSF0Q.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7800870681084015441</id><published>2009-04-28T23:43:00.004+02:00</published><updated>2009-05-08T17:03:49.800+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-08T17:03:49.800+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday: 3.5 weeks late</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SfGDdOn_eyI/AAAAAAAAADo/e3KOOeC6RhY/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SfGDdOn_eyI/AAAAAAAAADo/e3KOOeC6RhY/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5328184372321286946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Haven't done the &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;flash card Friday&lt;/a&gt; for a while now. Been busy with stuff. But now it's finally time to get the words of wisdom rolling again. Here's a fresh batch of goodies for y'all:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;When testing a number of components in a failing setup, it is most likely that two of them are incompatible with each other&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes you're testing a setup with three different databases, three different app servers and three different operating systems. Testing all 27 combinations takes time. Often when something fails, it is because two components were not compatible with each other. We can therefore make sure we test all pairs of components instead. That way, we will only have 9 test cases. This reduces the time it takes for us to run the tests, while still retaining relatively good coverage. This technique is called all-pairs testing.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Introducing tests that fail is a good thing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have been introducing more and more high-level automated tests at work lately. Some days ago I was working on a particular test that kept failing, and I was becoming aggravated. The actual feature I was testing had been in the product for quite a while. Damnit, I thought, I'm wasting a bunch of time on getting a test working for something that already works.&lt;br /&gt;&lt;br /&gt;As it turns out, the feature I was testing actually had a bug, and my failing test was simply exposing the bug. So, having tests that fail is a good thing. Aggravating none the less though.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Balsamiq mockups are awesome&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lately, at work, we've been improving our user interface a lot. This process often involves communicating ideas from/to the product owner. Roughly a month ago, a team member introduced us to &lt;a href="http://www.balsamiq.com/"&gt;Balsamiq&lt;/a&gt;. It's a tool for creating user interface &lt;a href="http://en.wikipedia.org/wiki/Mockup#Systems_engineering"&gt;mockups&lt;/a&gt; in no time. The mockups end up looking like cartoon drawings, without any flashy features such as fancy colors, fonts, and styles.&lt;br /&gt;&lt;br /&gt;A good thing about this is that users don't get hung up on the details, such as font sizes and millimeter placement of buttons, but can instead focus on the actual functionality of the GUI. The tool is also dead simple to use, and a mockup for nearly any interface can be created in five minutes. It integrates nicely with JIRA &amp;amp; Confluence too. Do check it out.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Drive requirements top down&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When adding new features to a system, it might help to start from the user interface. This is the user's view of the system, and we should strive to root all requirements in user needs. Starting out with the UI sketches helps drive the useful requirements. It might turn out that the really cool backend feature actually wasn't needed at all, because there is no real use case for it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Be careful with the minimized tag form in XHTML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The XHTML specification states that elements with non-empty DTD definitions should not use the minimized form (e.g. &lt;span style="font-family:courier new;"&gt;&amp;lt;div /&amp;gt;&lt;/span&gt;). This is interesting, as it's perfectly valid XML. I have however run into problems when collapsing divs without content. Note that line breaks cannot have any content, so they may be collapsed to &lt;span style="font-family:courier new;"&gt;&amp;lt;br /&amp;gt;&lt;/span&gt;. See the XHTML specification, section C.3, for more info.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Beware of the OOM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recently learned that a Java program that runs out of memory actually can exit without an OutOfMemoryError (OOM) exception. This is due to the fact that the JVM does not have enough memory to allocate the exception. Tomcat solves this in an interesting way. At startup they allocate memory that can be freed should an OOM occur. That way, there is enough memory to shut down gracefully. Odd solution, but I guess it works.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;JSON JSP tags&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JSON is a wonderful thing, and sees many uses today, sometimes far away from JavaScript. If you're looking to get data from your server-side model into your client-side JavaScript data model for your dynamic interface, and are using JSP to render your view, then you should definitely check out the &lt;a href="http://json-taglib.sourceforge.net/"&gt;json-taglib&lt;/a&gt; project. It offers a simple set of tags to generate JSON objects and arrays from your server-side model. That's it.&lt;br /&gt;&lt;br /&gt;Now, you may be using richer frameworks for dealing with client-side JavaScript data models. If so, I'd love to hear about them.&lt;br /&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/6090682633286391736-7800870681084015441?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/-K_99M3dRug" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7800870681084015441/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/04/flash-card-friday-35-weeks-late.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7800870681084015441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7800870681084015441?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/-K_99M3dRug/flash-card-friday-35-weeks-late.html" title="Flash card Friday: 3.5 weeks late" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SfGDdOn_eyI/AAAAAAAAADo/e3KOOeC6RhY/s72-c/catb.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://blog.movnet.org/2009/04/flash-card-friday-35-weeks-late.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MMRXczeCp7ImA9WxVaGUg.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-3440742935192255782</id><published>2009-04-17T08:58:00.000+02:00</published><updated>2009-04-17T10:04:44.980+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-17T10:04:44.980+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Dreams</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/Segz2fpMU8I/AAAAAAAAADg/lwuafImBwTc/s1600-h/tenniscourts.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 228px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/Segz2fpMU8I/AAAAAAAAADg/lwuafImBwTc/s400/tenniscourts.jpg" alt="" id="BLOGGER_PHOTO_ID_5325563570665837506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last night I had a dream. I usually don't remember my dreams, but this one I recall vividly. It involved people in current time, teenagers I think, somehow traveling to the future, possibly to a parallel dimension. There, they are chased by bad guys. A good guy then stages their death in a parking garage and takes them to an underground safe house. There, a metal elevator door is surrounded by a crowd of people, waiting for it to arrive. When it does, they instead gather around, revealing that they were not random people, but also good guys. The teens are instructed to strip all their clothing and step into the elevator. I particularly remember one ranking good guy touching the inner wooden panel of the elevator, saying something I don't remember, but looking as if he had never touched a wooden wall previously in his life. As if it was a relic from a lost age.&lt;br /&gt;&lt;br /&gt;The elevator is eventually activated, and the old metal doors close with a creaking sound. Through a small round window in the side of the elevator shaft the cage is seen descending. A mechanical noise is heard, and then everything goes quiet. The good guys look at each other as if they'd accomplished something great.&lt;br /&gt;&lt;br /&gt;Back in the present, I just have this image of someone, possibly the teenagers, looking at a signal map of some kind. I remember that they looked at a point with a bunch of small arrows out of it, each with a number. They didn't know which one led anywhere. I however somehow knew that -11 led to the other world - probably something I learned at the beginning of the dream.&lt;br /&gt;&lt;br /&gt;I woke up from this dream with an odd feeling. I can't really describe it, but it's a combination of joy, meaninglessness, sorrow, and mainly, respect. People in different times and places had once helped each other, but would never meet again. Gazing at the stars above, they could only remember the time they had shared. That was their memento.&lt;br /&gt;&lt;br /&gt;It's strange how dreams can affect you. Walking to the subway, I somehow felt different, if only for a while. I knew the world was the same as yesterday. People looked the same. The car exhausts smelled the same. Yet it was different for a moment. There's so much more to the human mind than we think.&lt;br /&gt;&lt;br /&gt;Have you experienced something like this? Please share your own dreams.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-3440742935192255782?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/Sf9nxXgHuZo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/3440742935192255782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/04/dreams.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/3440742935192255782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/3440742935192255782?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/Sf9nxXgHuZo/dreams.html" title="Dreams" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/Segz2fpMU8I/AAAAAAAAADg/lwuafImBwTc/s72-c/tenniscourts.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/04/dreams.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAARns8cSp7ImA9WxVaF00.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-6254579570109940526</id><published>2009-04-14T08:11:00.000+02:00</published><updated>2009-04-14T12:09:07.579+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-14T12:09:07.579+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="photography" /><category scheme="http://www.blogger.com/atom/ns#" term="redundancy" /><title>Quick and dirty redundancy, anyone?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SeRCbXdP7yI/AAAAAAAAADY/TIV5-8clm40/s1600-h/massage.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 249px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SeRCbXdP7yI/AAAAAAAAADY/TIV5-8clm40/s400/massage.jpg" alt="" id="BLOGGER_PHOTO_ID_5324453697379364642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I spent this weekend out in the archipelago with my girlfriend. I brought my camera, and ended up shooting quite a lot of pictures, it being a nice day and all. Pretty soon, my memory card was all filled up with 12MP JPG+RAW files.&lt;br /&gt;&lt;br /&gt;Now, some people would call me a pack rat. I simply don't like throwing things away. Especially not pretty (or so I tell myself) pictures. So I thought to myself, where should I store these pictures? Quickly, as the techie I am, I came up with some different alternatives:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Stash them on my servers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is perhaps the most natural alternative for a geek. "Just rsync the stuff to your server!" Yeah. This is a good idea, if it weren't for two things. 1) Servers require work and maintenance. 2) My current servers have like 40GB of disk space left. Replacing the drives takes time and money. Thus, goto 1.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Keep them on the memory card and get a new one&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As stupid as this may sound, it's actually an appealing idea. Modern memory cards hold data for centuries, and the interface is very standard. Thus no irretrievable data later on. The practicality of just popping one card out and popping a new one in shouldn't be underestimated either. The downside is that it's ridiculously expensive to do this, in comparison to a hard drive based approach.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Put them on my brand new USB drive (WD passport)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recently, I bought a USB hard drive. Kind of ashamed to say it's my first one. (What, I've used my RAID1-configured servers in the past, don't judge me.) This drive is a Western Digital Passport drive, and it's &lt;commercial&gt;unbelievably cute. Come to think of it, I've actually been carrying it around my jacket breast pocket for half a week without even thinking about it. That's how small and light it is. And it runs off the USB power, so all you need is a USB cable.&lt;/commercial&gt;&lt;br /&gt;&lt;br /&gt;Anyway, an alternative would be to store the images on the external drive. However, having experience with IBM DeathStars and the like, I'm aware of the potential flakiness of mechanical drives. And this leads us to the topic at hand.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What if you could plug any number of USB drives into your computer, and then run a command that made sure that all files on all connected drives were stored redundantly. A post-write kind of redundancy, if you will. That way, you could write your data to the drives when ever you want to, and at a certain point plug them all into your laptop and add the redundancy. In a simple implementation, if a drive fails, you'd have to plug all drives into your computer to recover all data. I don't know if this would be useful, and I don't know if such a solution already exists. In either case, let me know what you think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-6254579570109940526?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/PeDL-ji-ynQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/6254579570109940526/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/04/quick-and-dirty-redundancy-anyone.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6254579570109940526?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6254579570109940526?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/PeDL-ji-ynQ/quick-and-dirty-redundancy-anyone.html" title="Quick and dirty redundancy, anyone?" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SeRCbXdP7yI/AAAAAAAAADY/TIV5-8clm40/s72-c/massage.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://blog.movnet.org/2009/04/quick-and-dirty-redundancy-anyone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEDRX46fSp7ImA9WxVaEUk.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-8594482987406066262</id><published>2009-04-07T23:44:00.000+02:00</published><updated>2009-04-07T23:44:34.015+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-07T23:44:34.015+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Don't ask for more than you need</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdvG3qlPjdI/AAAAAAAAADQ/squOyKd3xsk/s1600-h/3st_guy.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 236px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdvG3qlPjdI/AAAAAAAAADQ/squOyKd3xsk/s400/3st_guy.jpg" alt="" id="BLOGGER_PHOTO_ID_5322066044293975506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The other day I was browsing a site for photography, when I came across an &lt;a href="http://www.scandinavianphoto.se/product/item.aspx?iid=1595865"&gt;item&lt;/a&gt; (Swedish) without a description. Instead, there was a short text instructing me to e-mail the site administrators, kindly notifying them that the item was missing a description.&lt;br /&gt;&lt;br /&gt;Another time I was browsing another site (I think it was some page at sun.com) when a small popup inquired for some feedback. Did I like the site. It would be great if I left a comment, notifying them of my site experience.&lt;br /&gt;&lt;br /&gt;These are just two examples of when a different interface would work better, in my opinion. &lt;span style="font-style: italic;"&gt;A simple one-button interface can actually be good.&lt;/span&gt; The photography site could simply have had a button saying "Report this". Sun's site could have had a button with the descriptive text "Click if you like the page." And possibly also "Click multiple times for better feedback."&lt;br /&gt;&lt;br /&gt;Simplicity should never be underestimated. In fact, this concept already has a lot of traction. Digg is a typical example. Facebook's Like links for the facetweets are of the same kind. Morale of story: a simpler interface might gain you more user feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-8594482987406066262?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/f4mHsYwyUnA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/8594482987406066262/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/04/dont-ask-for-more-than-you-need.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/8594482987406066262?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/8594482987406066262?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/f4mHsYwyUnA/dont-ask-for-more-than-you-need.html" title="Don't ask for more than you need" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdvG3qlPjdI/AAAAAAAAADQ/squOyKd3xsk/s72-c/3st_guy.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/04/dont-ask-for-more-than-you-need.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cMQ34-fCp7ImA9WxJSF0Q.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-1102260799971153811</id><published>2009-04-03T23:50:00.001+02:00</published><updated>2009-05-08T17:04:42.054+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-08T17:04:42.054+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdWmYmPd16I/AAAAAAAAADI/oa9-mKWHZ8M/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdWmYmPd16I/AAAAAAAAADI/oa9-mKWHZ8M/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5320341476320597922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's flash card Friday. For some reason, this week didn't really yield any good lessons learned. I have half an item written down, but I'll include it in next week's batch instead.&lt;br /&gt;&lt;br /&gt;Meanwhile, some words of wisdom:&lt;br /&gt;&lt;br /&gt;       You are not your job. You are not how much money you have in the bank. You are not the car you drive. You are not the contents of your wallet. You are not your fucking khakis. You're the all-singing, all-dancing crap of the world.&lt;br /&gt;&lt;br /&gt;Except for the last thing. But seriously. At the end of they day, what are you accomplishing? What really matters to you? Might be hard to answer, but it's worth thinking about. To quote Tyler Durden again, this is your life, and its ending one minute at a time.&lt;br /&gt;&lt;br /&gt;How's that for a dip into the platitudes? Please return your seat backs to their full upright position.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-1102260799971153811?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/yADelzeQLIA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/1102260799971153811/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/04/flash-card-friday.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/1102260799971153811?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/1102260799971153811?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/yADelzeQLIA/flash-card-friday.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SdWmYmPd16I/AAAAAAAAADI/oa9-mKWHZ8M/s72-c/catb.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.movnet.org/2009/04/flash-card-friday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIMR3o4eCp7ImA9WxVbEkk.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-8269474952808143139</id><published>2009-03-27T22:30:00.001+01:00</published><updated>2009-03-28T13:49:46.430+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-28T13:49:46.430+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SczAtdfE2mI/AAAAAAAAACM/B62rHzPrxF0/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SczAtdfE2mI/AAAAAAAAACM/B62rHzPrxF0/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5317837147259329122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Welcome to this week's flash card Friday. Read about the concept &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;here&lt;/a&gt;. Now on to the lessons learned. Almost exclusively tech stuff:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Class usage should be done via an interface, while management can be done via the implementation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Say you have a public interface called DataProvider, and an implementation called DataProviderImpl. As the interface name suggests, the API only provides data. So how does the implementation acquire the data it provides?&lt;br /&gt;&lt;br /&gt;Now say you have a DataProducer object (no interface), which pushes data into the DataProviderImpl. The producer object would then use specific methods on the provider implementation class. A bad alternative would be to clutter the DataProvider interface with methods for putting the data into the provider.&lt;br /&gt;&lt;br /&gt;Long story short, usage of a class should be done via a public interface. Management of implementations can be done via implementation-specific methods. Maybe this is clear to you; maybe not. I'm just saying.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Use exception classes for the right purpose&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Java, and many other languages, have a lot of different exception classes in the standard library. &lt;span style="font-style: italic;"&gt;Use them.&lt;/span&gt; If your method checks the arguments, and finds that one is exceptionally invalid, throw an InvalidArgumentException. The standard library is your oyster.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Don't be afraid to say "I like that." when discussing/designing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When partaking in design discussions, don't hesitate to give praise to ideas you like. If somebody proposes something you like, then say so. The opposite applies too. You can't be too verbose.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;@Override is nice, but unfortunately flawed&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The @Override annotation is a Java annotation that is not used enough (by code I read and write, I suppose). It simply tells the compiler that the annotated method overrides a method in a superclass. If that is not true, then the code will not compile. That way, if somebody changes the superclass' method name so that the annotated method no longer overrides it, the compilation will fail, which is good. We always want to fail fast. However, as of Java 6 the @Override annotation also applies to methods implementing an interface method. This results in Java 6 compatible code not compiling with Java 5, as @Override is not allowed for interface methods then. As my friend @&lt;a href="http://journal.thobe.org/"&gt;thobe&lt;/a&gt; suggested, they should have used an @Implements annotation instead. I agree.&lt;br /&gt;&lt;br /&gt;So basically, what the @Override annotation provides is really good, but it's flawed nature should be taken into account. On another note, Java 7 will add tons of compile time checking annotations, providing a lot more "contract verification" capabilities.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;If you're having troube identifying the responsibility/logic of your class, you should probably split it into multiple classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you find yourself having trouble getting a grasp of , or writing tests for, a class, then your design may be too complex. Could you split the class' responsibility over multiple smaller classes? It will most likely make it easier to test - and think about.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;TDD may encourage programming by coincidence&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have this theory that &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; among beginners encourages &lt;a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/coincidence"&gt;programming by coincidence&lt;/a&gt;. The TDD steps are 1. red bar 2. green bar 3. refactor. Beginners often simplify this to 1. write test case 2. write code to make test case pass. The coincidental, probing style of programming then arises when the beginner simply tries to make the test pass, without thinking about what the code really should do. The green bar presented when the test eventually passes provides them with positive feedback, making them think that their current behavior is good.&lt;br /&gt;&lt;br /&gt;Eventually, they'll learn that the refactoring step is very important, and that without it, TDD produces very bad code. Later on, TDD becomes a tool for developing software in a behavior-driven way, driving requirements from the outside in.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Mockito is a decent mocking framework&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A popular Java &lt;a href="http://en.wikipedia.org/wiki/Mock_object"&gt;mocking&lt;/a&gt; framework is &lt;a href="http://easymock.org/"&gt;EasyMock&lt;/a&gt;. The latest version (2.4) is a LOT better than the previous ones in terms of syntax. &lt;a href="http://mockito.org/"&gt;Mockito&lt;/a&gt;, an EasyMock fork, steps it up a notch though. At first, I didn't really think the Mockito API would make things much better. Once I actually started to use it a bit, I realized that it actually produces much cleaner tests, with much clearer intentions. &lt;a href="http://code.google.com/p/mockito/wiki/MockitoVSEasyMock"&gt;Here's&lt;/a&gt; a comparison to EasyMock.&lt;br /&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/6090682633286391736-8269474952808143139?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/2GTI0YqzswA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/8269474952808143139/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/flash-card-friday_27.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/8269474952808143139?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/8269474952808143139?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/2GTI0YqzswA/flash-card-friday_27.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SczAtdfE2mI/AAAAAAAAACM/B62rHzPrxF0/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/flash-card-friday_27.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cBRXw7fCp7ImA9WxVUGU4.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-6126762849302364346</id><published>2009-03-24T23:37:00.002+01:00</published><updated>2009-03-24T23:50:54.204+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T23:50:54.204+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="games" /><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><title>Relaxing by doing</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YP0yXc5Yb2o/ScgPXI83gxI/AAAAAAAAACE/RGGpuV5mMMc/s1600-h/hugging.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 200px;" src="http://2.bp.blogspot.com/_YP0yXc5Yb2o/ScgPXI83gxI/AAAAAAAAACE/RGGpuV5mMMc/s400/hugging.jpg" alt="" id="BLOGGER_PHOTO_ID_5316516250325058322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last night I had dinner with my family at a nice restaurant. It's located at a famous relaxation center/spa in Stockholm called &lt;a href="http://www.yasuragi.se/"&gt;Yasuragi&lt;/a&gt;. It's inspired by Japanese relaxation ideals, and they offer all kinds of treatments and activities. &amp;lt;advertisement&amp;gt;&lt;br /&gt;&lt;br /&gt;Here and there in the facility they had couches aimed a couple of flat screen TVs on a wall, displaying a "living" landscape. Flowers in the foreground would move in the wind, and in the distance, a canoe on a lake would occasionally change direction. I guess it was supposed to have a calming effect on the viewer.&lt;br /&gt;&lt;br /&gt;While watching the artificial nature live its slow-paced life, I immediately thought, what could you do to make this application more interesting? People in Yasuragi bath robes and slippers just sat and watched the screens. You'd think that they would become bored eventually. Given a game controller, I pondered, how could the setting be made more interesting and stimulating? Could it be made into something resembling part game?&lt;br /&gt;&lt;br /&gt;One of the first games I thought of was &lt;a href="http://en.wikipedia.org/wiki/Rez"&gt;Rez&lt;/a&gt;. It's an abstract game, joining music with cool graphics. Another fitting game would be &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"&gt;Conway's Game of Life&lt;/a&gt;. After thinking about things for a while, I came up with some conditions for a successful relaxation game:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;It should have appealing graphics and sound&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The graphics should not strain the player's eyes too much. Poorly executed graphics work can completely ruin a game, no matter how good the idea is. Sound is not absolutely essential, but it definitely enhances the experience. Even the non-interactive landscape had sounds.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;It should not bore the player too quickly&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A person wanting to relax with a game should obviously not become bored too soon. This is a tricky aspect, as the game should be challenging, yet not requiring too much thought.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;It should have a very low startup and shutdown time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A person wanting to relax wants to be able to get into the game within a few seconds. Long load times may instead kill the need for procrastination, and may result in the person actually doing something productive. That's not what we're aiming for here.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;It should not be too intensive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Many people find it hard to relax when trying to make it to the next level of an intensive game. One should be able to play a relaxation game without breaking a sweat.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Meaning can be added to a game by adding sharing capabilities&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Relaxation games often feel meaningless, and may incur feelings of wasting time on the player. In order to minimize the risk of this, the game could offer the option of sharing the person's playing with other people. This could be done via multiplayer modes, or post-game sharing of created content/high scores/whatever.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I have yet to come up with a game that fulfills these criteria. When I do, I'm going to sell it to the Yasuragi spa and make a fortune. Actually, in all seriousness, a lot of locations could benefit from people being able to relax in some interactive way, e.g. airports, shopping centers, hospitals, etc. If you have game suggestions, please comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-6126762849302364346?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/wCVuL1p1OPE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/6126762849302364346/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/active-relaxation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6126762849302364346?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6126762849302364346?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/wCVuL1p1OPE/active-relaxation.html" title="Relaxing by doing" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YP0yXc5Yb2o/ScgPXI83gxI/AAAAAAAAACE/RGGpuV5mMMc/s72-c/hugging.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/active-relaxation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EDR3kzeSp7ImA9WxVUFUQ.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7476871821021508592</id><published>2009-03-20T23:57:00.003+01:00</published><updated>2009-03-21T00:27:56.781+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-21T00:27:56.781+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScQY6aPbICI/AAAAAAAAAB8/OPr-qsETIk8/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScQY6aPbICI/AAAAAAAAAB8/OPr-qsETIk8/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5315400851959521314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This week I have even fewer realizations than last time, but some weeks you just strike out. Here are my two points from this week, one techy and one semi-non-techy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Think &lt;/span&gt;&lt;span style="font-style: italic;"&gt;not &lt;/span&gt;&lt;span style="font-style: italic;"&gt;only about what a class should do, but also about what it should &lt;/span&gt;not&lt;span style="font-style: italic;"&gt; do&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's easy to get caught up in a class' responsibilities. Something that is often overlooked is what it shouldn't do. Take a step back and think about the class' name, and its role in the system. Should it really be doing everything it currently is?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Make list of points to read every day&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Something I'm going to try is to maintain a list of maybe 4-5 lessons learned at work. These are action points that I'll read every morning, and I'll also keep on a note with them next to my screen. Also, it's easy to just note down lessons learned, but it's a whole other matter to actually apply them. By keeping a highly relevant but short list of items, you can focus on those.&lt;br /&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/6090682633286391736-7476871821021508592?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/vu0Xcx6_5dE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7476871821021508592/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/flash-card-friday_20.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7476871821021508592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7476871821021508592?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/vu0Xcx6_5dE/flash-card-friday_20.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScQY6aPbICI/AAAAAAAAAB8/OPr-qsETIk8/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/flash-card-friday_20.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcCSXY8eSp7ImA9WxVUFU0.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-2547859409152463801</id><published>2009-03-19T23:01:00.000+01:00</published><updated>2009-03-20T00:07:48.871+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-20T00:07:48.871+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><title>Remnants from the 90's: Banks</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScLKhs6MSVI/AAAAAAAAAB0/MN_juMk4i1s/s1600-h/doorhandle.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 267px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScLKhs6MSVI/AAAAAAAAAB0/MN_juMk4i1s/s400/doorhandle.jpg" alt="" id="BLOGGER_PHOTO_ID_5315033190590335314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few days ago, while brushing my teeth before heading to work, I thought about my personal economy. I have long been wondering where my hard-earned kronor (Swedish currency) go. Some months I am able to put about half my salary into savings, and others I end up spending most of it on God-knows-what. By keeping track of my expenses for a few months, I was hoping to be able to analyze my spending better, and perhaps identify actions I could take to increase my savings.&lt;br /&gt;&lt;br /&gt;Then I remembered a well-known fact - &lt;span style="font-style: italic;"&gt;banks suck&lt;/span&gt;. All they provide me with is a list of transactions sorted by date, with a lousy descriptive text. How the hell am I going to get any usable statistics out of that? Trying to be constructive, I tried to figure out what the banks should change in order to improve the usability of their systems. The first thought that popped into my head was, they should learn from Google.&lt;br /&gt;&lt;br /&gt;Google has this nifty tool/service called Google Analytics. It offers website owners a rich set of tools and metrics, with which they can see exactly which parts of their site to improve or change. I would love similar services from my bank. I would like modern and smooth dynamic pages, showing clear and concise data. I would like to see timelines and graphs of my spending. I would like to be able to view calculated averages, and perhaps set up goals and savings plans. All in a clean and sober UI; not the clunky Times New Roman &amp;lt;table&amp;gt; they have now. If a bank executed this well, I'm positive that they would attract a lot of customers that way. Banks, &lt;span style="font-style: italic;"&gt;it's not the 90's any more&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Secondly, as a programmer, I would naturally like to be able to keep track of and manage my funds in other ways than through a GUI. Most online service providers offer APIs for managing and using their services. Why shouldn't banks? I would love it if I could write a program that could transfer funds to any account in the world, without going through some third-party service provider like PayPal. Sure, there are some security and support issues here. What if I accidentally overshoot the &lt;a href="http://xkcd.com/323/"&gt;Ballmer Peak&lt;/a&gt; and multiply my computations by 1,000? Suddenly my bank account is flushed, and I'm broke. Should the bank compensate me then? In either case, it would be nice to see a bank try this kind of a service out.&lt;br /&gt;&lt;br /&gt;If I had to choose one, I'd definitely want the UI improvements. Other things I'd like are longer opening hours, and better customer service. The banks should realize that they wouldn't exist without our money. They should take better care of their customers. Come to think of it, most businesses should. Actually, if you run a business, just send your customers an e-mail expressing how grateful you are to have them as customers. I guarantee you it will pay off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-2547859409152463801?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/UmLNw3HlJiA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/2547859409152463801/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/remnants-from-90s-banks.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/2547859409152463801?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/2547859409152463801?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/UmLNw3HlJiA/remnants-from-90s-banks.html" title="Remnants from the 90's: Banks" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/ScLKhs6MSVI/AAAAAAAAAB0/MN_juMk4i1s/s72-c/doorhandle.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/remnants-from-90s-banks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMMR3gycSp7ImA9WxVUEkk.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-780495554838676906</id><published>2009-03-17T00:29:00.000+01:00</published><updated>2009-03-17T00:51:26.699+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-17T00:51:26.699+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="privacy" /><title>Intellectual property dinosaurs</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YP0yXc5Yb2o/Sb2AT07GWxI/AAAAAAAAABs/4qAYx1JW7Rc/s1600-h/yank_internet.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 210px;" src="http://1.bp.blogspot.com/_YP0yXc5Yb2o/Sb2AT07GWxI/AAAAAAAAABs/4qAYx1JW7Rc/s400/yank_internet.jpg" alt="" id="BLOGGER_PHOTO_ID_5313544213479447314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For years, the media industry has been labeling downloading of songs and movies as theft. This is a complicated issue, as the whole legal part of it is disputed. However, there are probably few who think that downloading copyrighted songs without paying is right. After all, there is no free lunch, or is there?&lt;br /&gt;&lt;br /&gt;Something's fishy here. First off, if somebody downloads an album, that person could be fined thousands of dollars per song, potentially resulting in penalties of hundreds of thousands of dollars. Why is this? Is it because the person acquired the song without paying for it, or is it because the person partakes in the distribution? Some might argue the former case. I have yet to understand the difference between it, and shoplifting a CD, which usually doesn't result in much more than a minor fine. The media industry is acting hurt, crying on the floor, grabbing all the money they can get. Boo hoo.&lt;br /&gt;&lt;br /&gt;Now, some people say, let's find ways of circumventing the new intellectual property (IP) laws. Unfortunately, that's just avoiding the problem. The IP laws &lt;span style="font-style: italic;"&gt;are&lt;/span&gt; the problem. Ultimately, they need to be reverted, or we won't be safe. Really.&lt;br /&gt;&lt;br /&gt;You see, the IP laws generally require some form of evidence of copyright infringement to be presented. What passes as evidence these days? How can the prosecution actually prove that the defendant downloaded a song? Sure, most evidence can be fabricated. Cops can plant drugs on people. Fingerprints can be placed on objects. But that all relies on the fact that the public legal guardians, such as police officers and prosecutors, are not looking out for any other interests than the law. In Sweden, private companies can however present evidence they have collected themselves. There is nothing keeping these companies from manipulating evidence in their own favor.&lt;br /&gt;&lt;br /&gt;Maybe we need a new word. Downloading a song is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; theft, as the media industry would like to have us believe. You are not stealing a song from anyone. However, it's not harmless either, as you are probably less likely to buy the song in a store if you can download it for free instead. Perhaps we need a word symbolizing something between theft and downloading. No physical things are stolen, but the number of potential customers still decreases. Any suggestions?&lt;br /&gt;&lt;br /&gt;In the end, we all need to be reasonable. Having a media industry that makes its earnings by suing its customers is not sustainable. The giant industry machine has to adapt to the digital age, with "open" movements gaining more and more ground. At the same time, people need to realize that everything isn't free. It does make sense that songwriters should get paid. It's just that the current financial models don't work. The scary part is that the media industry doesn't try to solve the problem in the corporate playing field, but in the governmental one. Ultimately it will file. As does everything that doesn't adapt to change. Like the mammoth. Or the dinosaurs, except they died in a fireball. Much like we will, if we don't stand up for our liberties and rights.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-780495554838676906?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/U4JtKTIkZ48" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/780495554838676906/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/intellectual-property-dinosaurs.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/780495554838676906?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/780495554838676906?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/U4JtKTIkZ48/intellectual-property-dinosaurs.html" title="Intellectual property dinosaurs" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_YP0yXc5Yb2o/Sb2AT07GWxI/AAAAAAAAABs/4qAYx1JW7Rc/s72-c/yank_internet.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/intellectual-property-dinosaurs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMDR3Y_eip7ImA9WxVVGUs.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-5464909465575924256</id><published>2009-03-13T18:10:00.001+01:00</published><updated>2009-03-13T18:14:36.842+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T18:14:36.842+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="philosophy" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SboYdACiNHI/AAAAAAAAABc/5LEk3TFPr58/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SboYdACiNHI/AAAAAAAAABc/5LEk3TFPr58/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5312585596942824562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It's flash card Friday. You might already know what that means - if you don't, read &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This week's list of items is the shortest one yet. I only have four items:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Often, developers are so close to the code, yet so far away from changing it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When working with product code, you get all kinds of interesting "improvement" ideas. However, in medium-large size companies, it is generally the customer requirements that drive the new features, and I guess that's actually a good thing.  "-But why don't we implement A? It's really cool. -Because the customers want B. -Damnit. Ok."&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;All product requirements and features should be use case driven&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes a feature feels like a really useful thing, but can't really be tied to a specific usage scenario. In that case, it's best to actually remove the feature. If you wind up needing it later, you'll realize that then, via a use case you previously did not support.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Have fun&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Life's too short to beat around the bush. If you like biking, pump those tires. If you like Paris, go ahead and book a short trip the next weekend. If you like programming, stay home tonight, get a beer and some snacks (candy, chocolate, fruit, whatever), and hack away into the night (preferably with a buddy). If you like watching TV series, download the new season of Lost. Personally [1], I'm going to order an AVR programmer kit and soldering tools, and build something cool. &lt;span style="font-style: italic;"&gt;Treat yourself to some passion.&lt;/span&gt; You're worth it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Using PPTP from behind NAT is tricky&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PPTP is a protocol used for implementing virtual private networks (VPNs). It runs on top of PPP inside GRE, with a parallell TCP control connection. GRE is a transport layer protocol, and thus runs straight on top of IP. Now, for run-of-the-mill NAT, UDP or TCP is necessary as NAT needs port numbers in order to differentiate between hosts. GRE however has no port number concept. Therefore, NAT cannot determine which internal host the packets should go to. It can however be achieved if NAT is combined with packet inspection of the control protocol packets.&lt;br /&gt;&lt;br /&gt;The fix on Cisco ASA/PIX firewalls of version 6.3 or later is to enable the fixup feature. This is done by either issuing the command fixup protocol pptp 1723, or configuring the port from the administration GUI. You can read more &lt;a href="http://www.cisco.com/en/US/products/hw/vpndevc/ps2030/products_configuration_example09186a0080094a5a.shtml"&gt;here&lt;/a&gt;. [&lt;span class="content"&gt;&lt;/span&gt;2]&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;--&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;[1] &lt;/span&gt;&lt;span style="font-size:100%;"&gt;I'm just gonna order the stuff this weekend. I'll &lt;span style="font-style: italic;"&gt;spend&lt;/span&gt; the weekend cleaning and doing laundry. But you get the point.&lt;br /&gt;[2] Sorry for all the TLAs. (pun intended)&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/6090682633286391736-5464909465575924256?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/LmUy_xY8Um4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/5464909465575924256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/flash-card-friday_13.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/5464909465575924256?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/5464909465575924256?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/LmUy_xY8Um4/flash-card-friday_13.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SboYdACiNHI/AAAAAAAAABc/5LEk3TFPr58/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/flash-card-friday_13.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEERX89eip7ImA9WxVVF0Q.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7924364046441821117</id><published>2009-03-10T22:36:00.038+01:00</published><updated>2009-03-11T18:30:04.162+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-11T18:30:04.162+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="privacy" /><title>Three strikes: the floating turd that just won't flush</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_YP0yXc5Yb2o/SbbfPNyEp1I/AAAAAAAAABU/tBFYFL8qDVg/s1600-h/circuitboard.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 300px;" src="http://1.bp.blogspot.com/_YP0yXc5Yb2o/SbbfPNyEp1I/AAAAAAAAABU/tBFYFL8qDVg/s400/circuitboard.jpg" alt="" id="BLOGGER_PHOTO_ID_5311678263020791634" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nowadays, I can't go a week without reading about people's rights online being violated in new ways. Most of you have probably heard about the Pirate Bay trial. A couple of weeks ago I posted an &lt;a href="http://blog.movnet.org/2009/02/privacy-goes-down-drain-once-again.html"&gt;entry&lt;/a&gt; about the new IPRED law that was passed in Sweden. Recently &lt;a href="http://tech.slashdot.org/article.pl?sid=09/03/10/177252"&gt;Slashdot reported&lt;/a&gt; on South Korea passing a "three strikes" type law of the same kind as &lt;a href="http://arstechnica.com/tech-policy/news/2008/11/three-strikes-p2p-rule-inches-closer-to-law-in-france.ars"&gt;the French one&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Their concept is simple. Get caught with sharing copyrighted material illegally three times in a row, and you lose your right to Internet access for a while. Never before have people been this dependent on something. I'm having trouble coming up with a good analogy. Prison is the closest thing I can think of to yanking somebody's Internet connection. And hell, sometimes even prisoners have Internet access! But only criminals go to prison, right? Think again. The new laws open up for private companies to go after regular people like you and me.&lt;br /&gt;&lt;br /&gt;A big problem is that the interpretation of the proof of copyright infringement is often left for a judge to interpret. Sometimes, no real proof at all is needed. In Sweden, screenshots and false allegations (prosecution didn't understand technology used) &lt;a href="http://www.svd.se/nyheter/inrikes/artikel_465959.svd"&gt;proved&lt;/a&gt; (in Swedish) to be enough evidence to get a search warrant when hosting provider PRQ was &lt;a href="http://www.thelocal.se/article.php?ID=3963&amp;amp;date=20060601"&gt;raided&lt;/a&gt; by Swedish police and media companies in 2006. And as we all know, screenshots are easily fabricated. This poses a huge risk to due process of law. &lt;span style="font-style: italic;"&gt;The lawmakers and judges of tomorrow need to be able to see through the sea of propaganda bullshit out there. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Would be nice with a kind of digital &lt;span style="font-style: italic;"&gt;habeas corpus&lt;/span&gt;. A detained person may through habeas corpus demand to have charges presented against him or her in a court of law. In a similar fashion, nobody's DSL should be yanked due to silly claims from media groups. We would never put a person behind bars based solely on that kind of evidence. Actually, if a person's crimes are severe enough to warrant removal of Internet access, then they probably should be doing time instead.&lt;br /&gt;&lt;br /&gt;There is a bigger picture here, and that is the fact that most new laws related to restricting people's online rights come from the intellectual property (IP) side - the media companies. In efforts to limit illegal online distribution of music and movies, they manage to lobby through laws solely benefiting their agenda. Many of the IP laws actually incriminate large shares of the countries' populations immediately, and don't do them any good at all. It's regrettable that the media industry's relentless lobbying is paying off.&lt;br /&gt;&lt;br /&gt;Zooming out even more, the Internet as a whole is slowly veering away from its once free and open nature. &lt;a href="http://en.wikipedia.org/wiki/Network_neutrality"&gt;Net neutrality&lt;/a&gt; is constantly &lt;a href="http://tech.slashdot.org/article.pl?sid=09/02/28/1719202"&gt;being&lt;/a&gt; &lt;a href="http://news.slashdot.org/article.pl?sid=09/03/09/2323214"&gt;questioned&lt;/a&gt;. Some ISPs block file sharing sites such as BitTorrent trackers. It's a slippery slope when ISPs start butting into what users do online; nobody should do that.&lt;br /&gt;&lt;br /&gt;Would you like a guard at the news paper stand, preventing you from buying those demoralizing Playboy magazines? He's there for &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; safety. Your safety always comes first, he tells you. He knows better, and is doing you a favor by preventing you from getting exposed to the decadent magazines. In fact, you will enjoy the car magazines even more, now that your mind is not poisoned by the lightly dressed ladies. I'm positive that even the most law-abiding citizen would not tolerate this. The Internet is for everybody. Period.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-7924364046441821117?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/nPIQMYOWvTM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7924364046441821117/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/three-strikes-floating-turd-that-just.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7924364046441821117?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7924364046441821117?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/nPIQMYOWvTM/three-strikes-floating-turd-that-just.html" title="Three strikes: the floating turd that just won't flush" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_YP0yXc5Yb2o/SbbfPNyEp1I/AAAAAAAAABU/tBFYFL8qDVg/s72-c/circuitboard.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/three-strikes-floating-turd-that-just.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04GQ3w9eip7ImA9WxVVFk0.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7144046224160191439</id><published>2009-03-09T00:01:00.001+01:00</published><updated>2009-03-09T13:32:02.262+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-09T13:32:02.262+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="strategy" /><category scheme="http://www.blogger.com/atom/ns#" term="china" /><title>Conquering China</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SbRRwagMFJI/AAAAAAAAABM/UXfkTu_Mj5Q/s1600-h/cake.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 197px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SbRRwagMFJI/AAAAAAAAABM/UXfkTu_Mj5Q/s400/cake.jpg" alt="" id="BLOGGER_PHOTO_ID_5310959752766559378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Last week I had a discussion with my friend and colleague @&lt;a href="http://twitter.com/kaixie"&gt;kaixie&lt;/a&gt;. He recently signed up on Twitter, and I explained the concept to him, with the whole evolution of blogging and everything. As you might have guessed, Kai is Chinese, and somehow we got into talking about the tech climate in China.&lt;br /&gt;&lt;br /&gt;As some of you might know, the &lt;a href="http://www.google.com/"&gt;Almighty Google&lt;/a&gt; is not the biggest search engine in China; &lt;a href="http://www.baidu.com/"&gt;Baidu&lt;/a&gt; is (for certain reasons, granted). &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt; is not the biggest auction site in China; &lt;a href="http://www.taobao.com/"&gt;Taobao&lt;/a&gt; is. &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; is not the most popular video sharing site in China; &lt;a href="http://www.youku.com/"&gt;YouKu&lt;/a&gt; is. TechCrunch had a &lt;a href="http://www.techcrunch.com/2009/02/24/chinas-social-network-qzone-is-big-but-is-it-really-the-biggest/"&gt;post&lt;/a&gt; about the &lt;a href="http://www.tencent.com/"&gt;Tencent&lt;/a&gt; network recently, which runs the most popular Internet community in China, providing both the insanely popular QQ messenger (300m+ users), and the Qzone personal web spaces. Why have so few of the big western [1] tech companies made it big in China?&lt;br /&gt;&lt;br /&gt;Whenever a good idea is launched in the west, some Chinese company manages to clone it before the western company gets any Chinese deployments going. Some would argue that the Chinese people have an &lt;a href="http://en.wikipedia.org/wiki/Not_Invented_Here"&gt;NIH&lt;/a&gt; mindset. Others say that the cultural differences make expanding to China difficult. Whatever the reasons, it's tough for western companies to make it big in China. I read an interesting albeit old &lt;a href="http://searchengineland.com/chinese-eye-tracking-study-baidu-vs-google-11477"&gt;article&lt;/a&gt; comparing Google to Baidu. I think most of the points made there still hold up.&lt;br /&gt;&lt;br /&gt;A bold western company aiming high should &lt;span style="font-style: italic;"&gt;launch operations in the west and east simultaneously&lt;/span&gt;. Twitter did not do this. In 10 minutes, Kai pointed out six different Chinese Twitter clones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jiwai.de/"&gt;叽歪de&lt;/a&gt;: Means &lt;span style="font-style: italic;"&gt;nag&lt;/span&gt; in Chinese.&lt;/li&gt;&lt;li&gt;&lt;a href="http://fanfou.com/"&gt;饭否&lt;/a&gt;: Means something like &lt;span style="font-style: italic;"&gt;Have you had a meal&lt;/span&gt;. Chinese small talk.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.laigula.com/"&gt;来咕拉&lt;/a&gt;: Means &lt;span style="font-style: italic;"&gt;meaningless&lt;/span&gt;  in Chinese.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.buboo.tw/"&gt;巴布&lt;/a&gt;: Is the sound of a kind of bird.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.zuosa.com/"&gt;做啥&lt;/a&gt;: Means &lt;span style="font-style: italic;"&gt;What are you doing?&lt;/span&gt;  in Chinese.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ilaodao.cn/"&gt;爱唠叨&lt;/a&gt;: Means &lt;span style="font-style: italic;"&gt;nagging&lt;/span&gt;  in Chinese.&lt;/li&gt;&lt;/ul&gt;My point isn't that the Chinese are the only ones that clone stuff, because they're not. We too have tons of western Twitter clones. My point is that it will be extremely hard for Twitter to expand to China, as a number of Chinese services are already controlling that nische.&lt;br /&gt;&lt;br /&gt;Maybe Twitter don't want to expand to China; that's fine. A company that wants to expand to China should however consider the following things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you launch a good feature in the west, a Chinese company will do the same thing. A week after Facebook releases a new feature, the Chinese equivalents have the same feature. Therefore, &lt;span style="font-style: italic;"&gt;start planning Chinese deployments simultaneously&lt;/span&gt;, if you want to expand there.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Consider &lt;span style="font-style: italic;"&gt;cultural differences&lt;/span&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Chinese websites look different.&lt;/span&gt; User behavior patterns are different. Western users would probably find an English site with Chinese design straining to use.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Monetize your services in Chinese ways.&lt;/span&gt; For example, almost any customization of the QQ messenger costs money. There's a whole market for avatars for QQ profile pictures. Western users wouldn't pay a cent for anything, unless it actually cost something, like Skype Out. Know your users. Culturally too.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The QQ messenger also has a built-in status system, giving users extra status for God-knows-what.  &lt;span style="font-style: italic;"&gt;Leverage the power of rewards.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Don't underestimate the NIH factor, and try to brand your company well.&lt;/span&gt; There must be many Chinese companies that can make a lucrative business out of helping western companies expand to China.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;If you think I'm wrong about something, let me know in a comment. That way, we'll actually both end up knowing more. Hope you found this interesting. Don't let somebody else eat your cake.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;[1] I'm gonna go ahead and say western. You know what I mean.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-7144046224160191439?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/a3fSjFhJaIc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7144046224160191439/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/conquering-china.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7144046224160191439?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7144046224160191439?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/a3fSjFhJaIc/conquering-china.html" title="Conquering China" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SbRRwagMFJI/AAAAAAAAABM/UXfkTu_Mj5Q/s72-c/cake.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/conquering-china.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMGQX49fSp7ImA9WxVVE0g.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-7747685698425948946</id><published>2009-03-06T09:28:00.026+01:00</published><updated>2009-03-06T17:20:20.065+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-06T17:20:20.065+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SbD2LF7QReI/AAAAAAAAABE/C8M1nGDUz4Q/s1600-h/catb.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 276px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SbD2LF7QReI/AAAAAAAAABE/C8M1nGDUz4Q/s400/catb.jpg" alt="" id="BLOGGER_PHOTO_ID_5310014631099516386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok people, it's that time of the week again. I know you've all been itching for the next batch of lessons learned. If you're not familiar with the flash card Friday concept, read my &lt;a href="http://blog.movnet.org/2009/02/flash-card-friday.html"&gt;introductory post&lt;/a&gt; on it.&lt;br /&gt;&lt;br /&gt;So here's this Friday's list, in chronological order as always:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;URI.relativize is useful&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Useful method I came across. See &lt;a href="http://java.sun.com/javase/6/docs/api/java/net/URI.html#relativize%28java.net.URI%29"&gt;javadocs&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Method currying in Java?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;When working with &lt;a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html"&gt;EL&lt;/a&gt;, it is possible to bind custom functions into the expression language. The problem is that a method that is bound as a function into EL has to be declared static. Now, what if I want to be able to parametrize the function I'm binding? For example, say I want to have a function that increases its numeric argument by N, where N is configurable when I bind the function.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Since the method is static, it cannot be parameterized in the same way as an instance method could be via a constructor for its instance. Using a class variable N would not work, as changing it would change the behavior of all previous binds.&lt;br /&gt;&lt;br /&gt;With the new Hotspot feature AnonymousClassLoader (see &lt;a href="http://blogs.sun.com/jrose/entry/anonymous_classes_in_the_vm"&gt;jrose&lt;/a&gt; and @&lt;a href="http://blog.headius.com/2008/09/first-taste-of-invokedynamic.html"&gt;headius&lt;/a&gt; for more info), it could probably be done. Then you would simply have a "template" class that you would load anonymously, while modifying N in the class you load. Sure, this is kind of an ugly solution to an ugly problem. But sometimes it's just fun to play around.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Always give people the benefit of the doubt.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When somebody lets you down, always always always give them the benefit of the doubt. Maybe it was a one-time thing. Maybe they had legitimate reasons for their actions. Maybe you'll actually find out about the reason if you give them another chance. And maybe you'll realize some of your own mistakes and shortcomings in the process.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Code navigator plugin in IntelliJ IDEA is cool.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There's a pretty cool plugin called Code Navigator for IDEA. It can, among other things, be used to display UML diagrams of selected code. They can then be saved to SVG files. Pretty useful. It can also be used to navigate code graphically.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Apply gaming strategies in real life.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A while back, I was trying to get my &lt;a href="http://www.blizzard.com/starcraft/"&gt;StarCraft&lt;/a&gt; skills going again. When reading various strategy forums, I came across these steps for improving your game:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Have a plan.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure you have a plan over your major strategy for this game. Don't do anything by chance.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Always be doing something.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Never sit around doing nothing. Then you are wasting time. There is always something you can do, be it shuffle units around, scout, or expand your base.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Adapt.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Even though you start out with a plan, your opponent actually reacts to your actions. You need to do the same. Adapt your plan to what your opponent does.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Macro+micro.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Learn how to build your base and micro-manage your units in battle.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;After having read those tips, I thought about them for a while. It struck me that all but the last one were applicable to many situations, real life being one. In fact, in almost everything you take on, I think the first three rules apply. Haven't figured out how to fit in/interpret the last one yet though. Any ideas?&lt;br /&gt;&lt;br /&gt;As for my gaming career, I gave it up a week later due to lack of time. It's a hell of a fun game though. Probably the best RTS in the world. *waits for carlsberg c&amp;amp;d*&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Surprisingly often, reading the documentation actually answers your question.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More often than not, when I'm looking for a programming answer, it's actually right there in the documentation. It baffles me every time. My reflex is to Google for it, but increasingly, I've been going straight to the docs instead. I'm liking it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Learning by doing vs. learning by reading docs.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you get to the docs, there are two different kinds of people. The first kind looks for the classes and methods that you probably should use. The other kind jumps straight to the examples. I'm probably 70% of the second kind.&lt;br /&gt;&lt;br /&gt;I like to learn by example. It can become a bad habit though; I liken it to a short attention span. You want your example with the working stuff NOW. However, it's good to actually read the APIs once in a while too. Preferably, every time, even if it's after doing the example. Somehow, relying on examples feels less professional. Is it?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Don't negate variable names.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It's so annoying to read code with boolean variable names such as &lt;span style="font-family:courier new;"&gt;notAccepted&lt;/span&gt;. It's so easy to get lost in such code, especially when combined with a bunch of branching based on those variables.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Be weary of abstract classes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a number of reasons why abstract classes should not be used as public APIs for people to implement. One big reason is that they restrict inheritance. Often, they are used as a poor-man's mixin based inheritance, except that you will only be able to have one mixin.&lt;br /&gt;&lt;br /&gt;A legitimate use case for abstract classes could be to provide a default implementation of some methods. The abstract class should however still implement an interface. In general, users should not be locked into your implementation unless there's a really good reason.&lt;br /&gt;&lt;br /&gt;Another use case is the template method pattern, where the general class logic is fixed, but each step can be customized. Just be weary of the pitfalls.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;When having weird issues with ivy, always remove local ivy repo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A number of times now I have been scratching my head, wondering why I'm not getting a certain dependency downloaded by &lt;a href="http://ant.apache.org/ivy/"&gt;ivy&lt;/a&gt;. Most of the times, I have a local ivy repository with locally deployed stuff lying around. I need to make a habit of always removing that directory before proceeding with any further troubleshooting.&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/6090682633286391736-7747685698425948946?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/Zg-8wfU2Zb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/7747685698425948946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/flash-card-friday.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7747685698425948946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/7747685698425948946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/Zg-8wfU2Zb0/flash-card-friday.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SbD2LF7QReI/AAAAAAAAABE/C8M1nGDUz4Q/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/flash-card-friday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMHQ34_eCp7ImA9WxVVEEs.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-292604195951086630</id><published>2009-03-03T08:13:00.001+01:00</published><updated>2009-03-03T09:20:32.040+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T09:20:32.040+01:00</app:edited><title>The art of elevatoring</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SazW_PmLFEI/AAAAAAAAAA8/gZMovyNbGI4/s1600-h/cat_pc7.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 247px;" src="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SazW_PmLFEI/AAAAAAAAAA8/gZMovyNbGI4/s400/cat_pc7.jpg" alt="" id="BLOGGER_PHOTO_ID_5308854442769716290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a short post from my old blog, published on May 9, 2008, but I just had to migrate it here:&lt;br /&gt;&lt;blockquote&gt;I read a surprisingly interesting &lt;a href="http://www.newyorker.com/reporting/2008/04/21/080421fa_fact_paumgarten"&gt;article&lt;/a&gt; on elevators the other day. It was centered around the story of Nicholas White, who got stuck in an elevator for 41 hours without food or water. Highly recommended piece for some random reading.&lt;/blockquote&gt;Swedish blogger &lt;a href="http://swartz.typepad.com/"&gt;Oscar Swartz&lt;/a&gt; once wrote a &lt;a href="http://swartz.typepad.com/texplorer/2008/03/lrdag-med-lyft.html"&gt;blog entry&lt;/a&gt; about having been very surprised by how interesting an article about a seemingly mundane topic as industrial cranes turned out to be. I had the same sensation when I read the piece about Mr. White, stuck in the elevator. It was liberating to sink into a completely different world for an hour - the world of elevators. Try it. You'll like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-292604195951086630?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/bAGePgt7DJY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/292604195951086630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/03/this-is-short-post-from-my-old-blog.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/292604195951086630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/292604195951086630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/bAGePgt7DJY/this-is-short-post-from-my-old-blog.html" title="The art of elevatoring" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SazW_PmLFEI/AAAAAAAAAA8/gZMovyNbGI4/s72-c/cat_pc7.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/03/this-is-short-post-from-my-old-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UDQHg6eyp7ImA9WxVWGU8.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-5271511818100724393</id><published>2009-02-27T10:00:00.028+01:00</published><updated>2009-03-01T18:41:11.613+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-01T18:41:11.613+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="flashcardfriday" /><title>Flash card Friday</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SafrtvpiEsI/AAAAAAAAAA0/3evQla-Rf5E/s1600-h/catb.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5307469856996725442" style="width: 300px; cursor: pointer; height: 276px;" alt="" src="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SafrtvpiEsI/AAAAAAAAAA0/3evQla-Rf5E/s400/catb.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have started this habit of writing down lessons I learn on flash cards. I try to get one card written every day, with at least one item on each card. Every Friday I will now try and publish that week's insights. My comments may range from technical stuff about coding and networking, to more general insights about everyday life. Now, some of you might say, this is common sense, or, that's soo obvious. I don't care. Even if you don't learn anything, it's always good to reiterate. If you think I'm wrong about something you should definitely comment. That way, at the end of the day, at least one of us will be enlightened.&lt;br /&gt;&lt;br /&gt;So here's the first list:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Don't start efforts without a plan&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sometimes it's very tempting to just get in the saddle and get going. Problem is, if you're not sure about where you're going, why should you go at all? This applies to coding as well as general planning. It is so easy to waste time doing things that you really don't know why you are doing, or that you don't know that you actually will need. &lt;a href="http://www.pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmer&lt;/a&gt; refers to this as programming by coincidence. When something is planned poorly, resources are easily wasted. You know that uneasy feeling when things are slowly gliding out of your control? Watch closely for that feeling, because it indicates that something is wrong. Do you know why are doing what you are doing?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;When in doubt, zoom out&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The previous bullet sort of relates to this one. When you feel that you are questioning what you are doing, and can't get the nitty gritty details to fit together nicely, &lt;span style="font-style: italic;"&gt;zoom out&lt;/span&gt;. Take a step back and ask yourself and your colleagues, what are we actually doing? Why? Is there a simpler solution? If you can't get things to fit nicely, and feel that you must incorporate some kind of "hacks" to get your solution working, then you are probably going down a bad road. Forget the details, take a deep breath, ask the big questions. Hell you might even realize that you don't need this thing at all.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Java 5 can't compile method calls on return values from methods returning bounded wildcard types&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Given the following pseudo code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Base {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;public void bar() { ... }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Zoo {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;public &lt;e&gt;E foo() { ... }&lt;/e&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Zoo z = new Zoo();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Trying to compile the following line with Java 5 would yield a compile-time error:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;z.foo().bar();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is sort of stupid, because the object returned by &lt;span style="font-family:courier new;"&gt;foo()&lt;/span&gt; will always be a &lt;span style="font-family:courier new;"&gt;Base&lt;/span&gt; object (or a subclass of &lt;span style="font-family:courier new;"&gt;Base&lt;/span&gt;), so it should be able to perform the compilation. I don't know what actually happens at bytecode level though, but I'm guessing &lt;span style="font-family:courier new;"&gt;invokevirtual&lt;/span&gt; will be used. Java 6 will however compile it fine. A good way of avoiding this problem is to never use generics in public API return values. It just makes it complicated for the user to use, and doesn't really add any extra functionality.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;PECS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;PECS stands for Provider Extends, Consumer Super. It's from Effective Java, 2nd Edition, and it states the rules for when one should use &lt;span style="font-family:courier new;"&gt;extends&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;super&lt;/span&gt; with bounded wildcards. It only applies to method arguments, as wildcard types should not be used as return types. If a method argument produces data for the method to use, then the argument should be defined using &lt;span style="font-family:courier new;"&gt;extends&lt;/span&gt;. If it instead consumes data that the method feeds it, it should be defined using &lt;span style="font-family:courier new;"&gt;super&lt;/span&gt;. Google for more details.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;ip helper-address + ip directed-broadcast enable forwarding of broadcast packets to another network&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you need to extend the broadcast domain of one network to another, it is possible. This might be useful is a service is broadcasting messages on a local network, and devices at a remote location need to listen to those messages too. Using Cisco equipment, this can be achieved by first sending the broadcast traffic to the other network by using the &lt;span style="font-style: italic;"&gt;ip helper-address&lt;/span&gt; command, and then re-broadcasting it there by using the &lt;span style="font-style: italic;"&gt;ip directed-broadcast&lt;/span&gt; command. You can control which ports are forwarded by using the &lt;span style="font-style: italic;"&gt;ip forward-protocol udp 12345&lt;/span&gt; command, which now will only forward port 12345. A hack? Yes. Potentially useful? Yes.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Java's -classpath does not work with -jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I guess it's a well-known fact, but I didn't know it. When running a JAR file with &lt;span style="font-family:courier new;"&gt;java -jar file.jar&lt;/span&gt;, you can't specify any class path arguments to the JVM. Either the class path must be defined in the manifest file, or the JAR file must be added to the class path via command line and the application launched via the main class on the command line. Anybody have an explanation for this behavior?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Stay tuned for next week's lessons learned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-5271511818100724393?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/TUe6Wdk0iDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/5271511818100724393/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/flash-card-friday.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/5271511818100724393?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/5271511818100724393?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/TUe6Wdk0iDs/flash-card-friday.html" title="Flash card Friday" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SafrtvpiEsI/AAAAAAAAAA0/3evQla-Rf5E/s72-c/catb.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/flash-card-friday.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cNSX85fyp7ImA9WxVWF0k.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-4627178818134602357</id><published>2009-02-25T22:54:00.008+01:00</published><updated>2009-02-27T16:38:18.127+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-27T16:38:18.127+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="privacy" /><title>Privacy goes down the drain, once again</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SaXLblg4eiI/AAAAAAAAAAs/jpcKnwGsii8/s1600-h/bathtub.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 200px;" src="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SaXLblg4eiI/AAAAAAAAAAs/jpcKnwGsii8/s400/bathtub.jpg" alt="" id="BLOGGER_PHOTO_ID_5306871410712934946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As thousands of other blogs probably have noted today, the &lt;a href="http://en.wikipedia.org/wiki/IPRED"&gt;IPRED&lt;/a&gt; law was passed in the Swedish parliament. This despite it meeting widespread criticism from nearly everybody, except for the right-wing parties, which now have a majority in the parliament. Naturally all the media interest groups like IFPI applaud this move.&lt;br /&gt;&lt;br /&gt;What the IPRED law says, in brief, is that private entities, such as corporations, may request personal information from ISPs about the owner of an IP address. All they need to do is to provide plausible evidence to a court, which will then order the ISP to provide the information. Now, there do not seem to be any strict rules as to what passes as plausible. This is up to the court to decide. And the media organizations work hard to drill their moral "values" into the leaders of the country.&lt;br /&gt;&lt;br /&gt;The right-wing government we have today kind of won the election because people were fed up with the left-wing socialists. People wanted lower taxes, and all the other promises that they were given. Unfortunately, I have to say that when it comes to carrying out the will of the people, this government is doing a crap-ass job at it. It should however be noted that most of the parliament actually voted &lt;span style="font-style: italic;"&gt;for&lt;/span&gt; the law, which sort of upholds the common belief that most politicians suck.&lt;br /&gt;&lt;br /&gt;So now what? I think at least these two things must happen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We will need tools providing a sufficient level of anonymity in file sharing. These will come pretty soon. &lt;a href="http://oneswarm.cs.washington.edu/"&gt;OneSwarm&lt;/a&gt; might be an option.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Someone needs to show the people in charge what can actually be done with this law. The politicians' children surely download music and/or movies. They should get to taste their own medicine.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This new law can also be abused for blackmail. Say you set up a site with some really graphic pornographic material, and then get somebody to access the site. Via IPRED, you get that person's personal information, and can then blackmail him/her with your logs + IPRED results. Scary. Now, in reality, the courts will probably filter these requests. But do we want to leave these kinds of decisions to human filters? I think not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-4627178818134602357?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/7TCh-Idr6P0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/4627178818134602357/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/privacy-goes-down-drain-once-again.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/4627178818134602357?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/4627178818134602357?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/7TCh-Idr6P0/privacy-goes-down-drain-once-again.html" title="Privacy goes down the drain, once again" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_YP0yXc5Yb2o/SaXLblg4eiI/AAAAAAAAAAs/jpcKnwGsii8/s72-c/bathtub.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/privacy-goes-down-drain-once-again.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EGQ3g6eCp7ImA9WxVWFUg.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-3828892785172990164</id><published>2009-02-25T08:50:00.000+01:00</published><updated>2009-02-25T09:47:02.610+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-25T09:47:02.610+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><title>I'm being followed</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SaTts_cFeFI/AAAAAAAAAAk/OJETYrRKpVQ/s1600-h/hand_on_wall.jpg"&gt;&lt;img style="cursor: pointer; width: 234px; height: 300px;" src="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SaTts_cFeFI/AAAAAAAAAAk/OJETYrRKpVQ/s400/hand_on_wall.jpg" alt="" id="BLOGGER_PHOTO_ID_5306627618148546642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;About a week ago, I stepped up my Twitter usage and started following a couple of bloggers I like, like &lt;a href="http://www.chrisbrogan.com/"&gt;Chris Brogan&lt;/a&gt; and &lt;a href="http://www.kaushik.net/avinash/"&gt;Avinash Kaushik&lt;/a&gt;. A couple of hours after following them, I was suddenly followed by seven people I don't know at all.&lt;br /&gt;&lt;br /&gt;I asked my friend &lt;a href="http://twitter.com/emileifrem"&gt;Emil&lt;/a&gt; of &lt;a href="http://neo4j.org/"&gt;Neo4j&lt;/a&gt; fame about it, and apparently they were either spambots or people using a recommendation engine. I checked out the followers, and their tweets and pictures looked genuine, and they had plenty of followers themselves, which left the recommendations case. None of them introduced themselves or anything though, so I don't know what to think. I'll have to do a follow-up on this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-3828892785172990164?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/Ity6Y6Lwlt0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/3828892785172990164/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/im-being-followed.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/3828892785172990164?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/3828892785172990164?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/Ity6Y6Lwlt0/im-being-followed.html" title="I'm being followed" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_YP0yXc5Yb2o/SaTts_cFeFI/AAAAAAAAAAk/OJETYrRKpVQ/s72-c/hand_on_wall.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/im-being-followed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMARHg_fyp7ImA9WxVWFE8.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-6154331540067603376</id><published>2009-02-23T22:14:00.000+01:00</published><updated>2009-02-23T23:00:45.647+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-23T23:00:45.647+01:00</app:edited><title>Logo massproduction</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaMTnNzOmGI/AAAAAAAAAAU/V8d_kwklURQ/s1600-h/thinkpad_logo.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 220px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaMTnNzOmGI/AAAAAAAAAAU/V8d_kwklURQ/s400/thinkpad_logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5306106350412929122" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A friend of mine is running a small venture called &lt;a href="http://mobile1up.com/"&gt;Mobile 1UP&lt;/a&gt;, selling iPhone games online. He has gained a lot of attention with his ports of Game &amp;amp; Watch to the iPhone. Now he's looking to spice up the logo of the publishing brand.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://logotournament.com"&gt;logotournament.com&lt;/a&gt;. The concept is simple. Provide a specification for your desired logotype, and set a prize amount and time limit. People then submit entries, which you can rank and comment on. When the time is up, you select a logo and pay that designer the set amount.&lt;br /&gt;&lt;br /&gt;It's a great concept. Given decent compensation, the logo suggestions will come rolling in. By ranking the logos and providing comments, all designers will try to adapt their style to what you might like. Some may try something new, as a wildcard. This reminds me a lot of genetic programming, which I find very interesting. I think this is a good way of evolving a logo in a time-boxed way. Check out the &lt;a href="http://logotournament.com/contests/mobile_1up"&gt;Mobile 1UP logo tournament&lt;/a&gt; for an idea of how it works. And hell, if you're good at logos, why not take a shot at earning $400?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-6154331540067603376?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/GFLCr7BfMrQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/6154331540067603376/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/logo-massproduction.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6154331540067603376?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6154331540067603376?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/GFLCr7BfMrQ/logo-massproduction.html" title="Logo massproduction" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaMTnNzOmGI/AAAAAAAAAAU/V8d_kwklURQ/s72-c/thinkpad_logo.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/logo-massproduction.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YFQ387eCp7ImA9WxVWF0k.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-6598987017398391860</id><published>2009-02-22T12:08:00.001+01:00</published><updated>2009-02-27T16:38:32.100+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-27T16:38:32.100+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="games" /><title>Half-Life 2 IRL?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaFCdNdg53I/AAAAAAAAAAM/9slKqYUwy3E/s1600-h/flowers_set.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 200px;" src="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaFCdNdg53I/AAAAAAAAAAM/9slKqYUwy3E/s400/flowers_set.jpg" alt="" id="BLOGGER_PHOTO_ID_5305594905616246642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Last night I was visiting my family at home, when my brother showed me a YouTube video. Now, you need to know that I'm a big fan of the Half-Life games series. The games, and especially the later ones, really embody that atmosphere of a post-apocalyptic world, where small people do big things.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;Anyway, &lt;a href="http://www.youtube.com/watch?v=q1UPMEmCqZo"&gt;the clip&lt;/a&gt; he showed me was titled "&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Escape From City 17 - Part One". For those of you who haven't played the games, City 17 is a city in ruins, under the control of the evil Combine. According to the video description, the directors, who call themselves The&lt;/span&gt; Purchase Brothers, only had a $500 budget. Now, the video may not be long, but it's pretty impressive. (The video has racked up 1.75 million views in 10 days, so they must be doing something right.) The cinematic technology of today sure opens up film making for a whole new group of people. Watch the clip, and see for yourself.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-6598987017398391860?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/_7fCR91rBAA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/6598987017398391860/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/half-life-2-irl.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6598987017398391860?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/6598987017398391860?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/_7fCR91rBAA/half-life-2-irl.html" title="Half-Life 2 IRL?" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_YP0yXc5Yb2o/SaFCdNdg53I/AAAAAAAAAAM/9slKqYUwy3E/s72-c/flowers_set.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/half-life-2-irl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0INRHc4eip7ImA9WxVWEkk.&quot;"><id>tag:blogger.com,1999:blog-6090682633286391736.post-768100753114370359</id><published>2009-02-21T20:41:00.000+01:00</published><updated>2009-02-21T20:46:35.932+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-21T20:46:35.932+01:00</app:edited><title>New blog</title><content type="html">Hi folks,&lt;br /&gt;&lt;br /&gt;For those of you who used to read my old blog when I actually wrote something there, welcome back. For you new readers, welcome too, I guess. My old blog (&lt;a href="http://movnet.org/weblog"&gt;http://movnet.org/weblog&lt;/a&gt;) was written in a sort of haphazardly manner. I'm going to try and make this new blog more structured and focused on technology. Can't guarantee that the occasional random rant won't slip in though. Enjoy, and stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6090682633286391736-768100753114370359?l=blog.movnet.org' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/NetworkingProgrammerDavid/~4/IJreP7hfi4c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.movnet.org/feeds/768100753114370359/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.movnet.org/2009/02/new-blog.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/768100753114370359?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6090682633286391736/posts/default/768100753114370359?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/NetworkingProgrammerDavid/~3/IJreP7hfi4c/new-blog.html" title="New blog" /><author><name>David</name><uri>http://www.blogger.com/profile/12512616521660670588</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.movnet.org/2009/02/new-blog.html</feedburner:origLink></entry></feed>

