<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Calyx blog</title>
	<atom:link href="http://dev.calyx.hr/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://dev.calyx.hr/blog</link>
	<description>d.o.o. za razboj softvera i zaebanciu / an exercise in software development</description>
	<pubDate>Thu, 29 Apr 2010 14:41:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Memory leak problem in Java</title>
		<link>http://dev.calyx.hr/blog/?p=164</link>
		<comments>http://dev.calyx.hr/blog/?p=164#comments</comments>
		<pubDate>Thu, 29 Apr 2010 14:41:35 +0000</pubDate>
		<dc:creator>klax</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=164</guid>
		<description><![CDATA[I think that more-less everybody have by now been burned at least once by some memory leaks in Java. Although it sounds impossible (it is a managed language after all, isn&#8217;t it?), that actually happens quite often. The problem is usually with leaky abstractions - we, the developers are lead to belive that we don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>I think that more-less everybody have by now been burned at least once by some memory leaks in Java. Although it sounds impossible (it is a managed language after all, isn&#8217;t it?), that actually happens quite often. The problem is usually with leaky abstractions - we, the developers are lead to belive that we don&#8217;t really have to worry about memory - GC is taking care of that stuff, isn&#8217;t it? In reality, you actually do have to worry about memory. Even though the garbage collector will free all unreferenced memory chunks, you as a developer have to make sure that no chunks end up being referenced.
</p>
<p>
Usually, the culprits are either some action listeners that are left hanging, or some references in some long forgotten collections (Singletons really are evil sometimes!).
</p>
<p>
In our case, it was neither. Here are the symptoms: the application does a whole lot of calculation and uses some tree-like data structures to do the math. We feed it with a lot of data and the memory footprint at one moment in time is ~ 700megs (we&#8217;ve got ~ 1G of heap). Then we&#8217;re done. And it&#8217;s not yet freed. But that&#8217;s OK, since GC tends to be lazy. The problem occurs when you want to do the same operation twice - the second time time, JVM runs out of memory.
</p>
<p>
So, after a couple of days of tracing the leak (my first suspicion was that we had some sort of a leak in our tree-like structure), it can all boil down to this small code snippet:
</p>
<pre>
public class MemoryLeakTest {
    public static void main(String[] args) {
        for (int i = 0; i &lt; 1000; i++) {
            JDialog dialog = new JDialog() {
                int[] take4Megs = new int[1000000];
            };
           dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
           dialog.setVisible(true);
           dialog.setVisible(false);
        }
    }
}
</pre>
<p>Here, we create a JDialog instance that has one neat attachment to it - a 4meg worth of empty integer. Set up -Xmx64m for this test case and only after a few runs, you&#8217;ll run out of memory. How is it possible that I run out of memory here? There are no collections, all variables are locally scoped - GC should be picking JDialog up after each loop iteration (or at least after a few). However, it seems that this does not occur. The only thing that seems to fix the issue is calling dispose manually like this:</p>
<pre>
public class MemoryLeakTest {
    public static void main(String[] args) {
        for (int i = 0; i &lt; 1000; i++) {
            JDialog dialog = new JDialog() {
                int[] take4Megs = new int[1000000];
            };
           dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
           dialog.setVisible(true);
           dialog.setVisible(false);
           dialog.dispose();
        }
    }
}
</pre>
<p>Please note that the tested platform is JVM 1.6.0_19, Windows7 Ultimate (it also happens on XP). Here is what the Java documentation says about dispose:</p>
<blockquote><p>
&#8220;Releases all of the native screen resources used by this Window, its subcomponents, and all of its owned children. That is, the resources for these Components will be destroyed, any memory they consume will be returned to the OS, and they will be marked as undisplayable.&#8221;
</p></blockquote>
<p>Inspecting heap dumps of both cases revealed that if we don&#8217;t explicitly call dispose(), that JDialog (actually, MemoryLeakTest$1 instances) instances remain in memory (I guess Swing has some references to them - we obviously don&#8217;t have them) and are not garbage collected. However, doing dispose() seems to have cleaned up the system resources and removed those references in Swing because we can&#8217;t see a single dialog instance on the heap anymore. The worst thing here is that it seems that this behaviour is not documented in the documentation (dispose() docs don&#8217;t say anything about this - see http://java.sun.com/javase/6/docs/api/java/awt/Window.html#dispose() ).</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=164</wfw:commentRss>
		</item>
		<item>
		<title>ctrl+shift+t</title>
		<link>http://dev.calyx.hr/blog/?p=160</link>
		<comments>http://dev.calyx.hr/blog/?p=160#comments</comments>
		<pubDate>Sun, 06 Sep 2009 09:04:16 +0000</pubDate>
		<dc:creator>fressner</dc:creator>
		
		<category><![CDATA[Java]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[eclipse]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[shortcuts]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=160</guid>
		<description><![CDATA[I&#8217;m amazed at how little we know about the tools we use for our everyday work/leisure. For the past 3/4 days I&#8217;ve been amazed with the discovery of the ctrl+shift+T shortcut in Firefox. I&#8217;m not aware of when they added it to Firefox, but now I use it all the time!
The shortcut does a simple [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m amazed at how little we know about the tools we use for our everyday work/leisure. For the past 3/4 days I&#8217;ve been amazed with the discovery of the <em>ctrl+shift+T</em> shortcut in Firefox. I&#8217;m not aware of when they added it to Firefox, but now I use it all the time!</p>
<p>The shortcut does a simple thing - it reopens the last closed tab. If you press it more than once it will reopen the tab you closed before the last one etc. Since I&#8217;m quite a tab juggler while browsing the web (meaning I usually open 7 tabs at once, reorder them, then read them and close them) I often close a tab prematurely. Also, sometimes I realize there&#8217;s something I wanted to check on a tab that I just closed.</p>
<p>Before I used to go through the recently closed tabs menu option, or even the history one if I couldn&#8217;t find it in the recently closed tabs (and it could happen). Now all I need to do is click 3 buttons and the magic happens! Things like these really make me happy :)</p>
<p>While the previously mentioned shortcut might not be revolutionary and not be considered &#8220;important&#8221; for one&#8217;s daily work, there&#8217;s another example - the Eclipse IDE. I&#8217;ve been using Eclipse on a daily basis for almost 3 years now. And only a few months ago I became aware of the beautiful shortcuts <em>ctrl+shift+R</em> and <em>ctrl+O</em>. For those of you who aren&#8217;t aware of them - <em>ctrl+shif+R</em> opens a wildcard-search window for finding any resource (for example a class file) in your workspace. Similarly <em>ctrl+O</em> opens a wildcard search for the members/fields of the currently open class.</p>
<p>Finding a class in a project was a frustrating task before - I&#8217;d wildly scroll through the project tree trying to remember which package the class belongs to. Finding a method inside a class was usually easier, but frustrating nonetheless. Now I feel happy each time I use those shortcuts (which is probably a few hundred times a day). Happy and stupid because I didn&#8217;t use them before. I wonder how much time I&#8217;ve wasted on searching for classes manually - time which could have been spent in a more productive way. Nowadays I spend a few seconds on what took me a minute or more before - the most basic task during software development - finding the code you&#8217;re working at.</p>
<p>The unawareness of the capabilities of the tools we use daily is truly an amazing thing. I recall I tried to find such a functionality in Eclipse, but couldn&#8217;t find it in the menus so I assumed it wasn&#8217;t there. I even considered writing my own Eclipse plugin to help me find classes. I failed to realize, at the time, that <strong>I&#8217;m not the only one with that problem and that someone else probably already solved it</strong> - what&#8217;s more, the solution was already there.</p>
<p>The bottom line would be, I guess, that learning about software development doesn&#8217;t start with learning the programming language we use. It starts with learning about the tools we use for coding it - something we can forget and lose valuable time. For starters - try pressing <em>ctrl+shift+L</em> in Eclipse. I&#8217;m sure you&#8217;ll find something you didn&#8217;t know ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=160</wfw:commentRss>
		</item>
		<item>
		<title>Unix &#60;3</title>
		<link>http://dev.calyx.hr/blog/?p=159</link>
		<comments>http://dev.calyx.hr/blog/?p=159#comments</comments>
		<pubDate>Wed, 22 Apr 2009 12:45:21 +0000</pubDate>
		<dc:creator>klax</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=159</guid>
		<description><![CDATA[Everybody already knows how great file-handling tools *NIX operating systems have. I&#8217;m just constantly amazed with how much you can get done in a single command line. For example, imagine a process that does some data processing on a remote machine and logs all the communication between the client and the server machine in one [...]]]></description>
			<content:encoded><![CDATA[<p>Everybody already knows how great file-handling tools *NIX operating systems have. I&#8217;m just constantly amazed with how much you can get done in a single command line. For example, imagine a process that does some data processing on a remote machine and logs all the communication between the client and the server machine in one file. Now, imagine this process running for 30+ hours, producing a 220+ Mb log file.</p>
<p>After the process is done, your boss wants some kind of reporting - how many entries were processed, how many were processed sucessful, how many errors were there and which errors they were. Not much of a problem when working on a UNIX machine:</p>
<p><code>A:    cat out.txt | grep 'COMMAND SUCCESS' | wc -l<br />
B:    cat out.txt | grep 'COMMAND FAILED' | wc -l</code></p>
<p>&#8230; and just to make sure, lets check if A+B = C:</p>
<p><code>C:    cat in.txt | wc -l</code></p>
<p>Now, lets report on errors:</p>
<p><code>cat out.txt | grep 'ERROR_CODE:' | sort | uniq</code></p>
<p>returns a list of errors:</p>
<p><code>ERROR_CODE: 10065<br />
ERROR_CODE: 11245<br />
ERROR_CODE: 19543<br />
</code></p>
<p>and now just lets find out how many of each we got:</p>
<p><code>cat out.txt | grep 'ERROR_CODE: 10065' | wc -l<br />
cat out.txt | grep 'ERROR_CODE: 11245' | wc -l<br />
cat out.txt | grep 'ERROR_CODE: 19543' | wc -l<br />
</code></p>
<p>Email to the boss, and we&#8217;re done. All good? Great. But, another email comes in: &#8220;Could you please send me a list of all the IDs that caused an error #11245&#8243;. Sure, no problem:</p>
<p><code>cat out.txt | grep -B 7 'ERROR_CODE: 11245' | grep 'REQUEST_ID' | awk '{ print $2; }' | sed 's/REQUEST_ID:\([0-9*]\)/\1/g&#8217; &gt; ids.txt</code></p>
<p>Lets explain this one a bit:</p>
<ul>
<li>the initial request that was sent to the system was logged 7 lines before the ERROR_CODE (therefore the &#8220;-B 7&#8243;)</li>
<li>the line with the request had the following format:<br />
<code>START    REQUEST_ID:XXXXX    SOME_OTHER_STUFF</code><br />
(therefore the awk part)</li>
<li>with sed we just extracted the number from the request_id column</li>
</ul>
<p>Can it get any more powerful than this?</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=159</wfw:commentRss>
		</item>
		<item>
		<title>Guest author: Monitoring from afar</title>
		<link>http://dev.calyx.hr/blog/?p=158</link>
		<comments>http://dev.calyx.hr/blog/?p=158#comments</comments>
		<pubDate>Fri, 03 Apr 2009 21:42:58 +0000</pubDate>
		<dc:creator>mbudisic</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Software]]></category>

		<category><![CDATA[guest]]></category>

		<category><![CDATA[monitoring]]></category>

		<category><![CDATA[python]]></category>

		<category><![CDATA[script]]></category>

		<category><![CDATA[serverside]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=158</guid>
		<description><![CDATA[ Let&#8217;s just assume that you have some important stuff being done on your server. A computation running, like I do, something getting compiled for a long time, or whatever else you might need. You don&#8217;t want to be sitting all the time, sshed in and running tail -f dump.log So you think to yourself: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dev.calyx.hr/blog/wp-content/uploads/2009/04/remotespyfly.png"><img class="alignleft size-medium wp-image-157" style="2px;" src="http://dev.calyx.hr/blog/wp-content/uploads/2009/04/remotespyfly-300x232.png" alt="Remotespy sample output" width="300" height="232" /></a> Let&#8217;s just assume that you have some important stuff being done on your server. A computation running, like I do, something getting compiled for a long time, or whatever else you might need. You don&#8217;t want to be sitting all the time, sshed in and running <code>tail -f dump.log</code> So you think to yourself: &#8220;If only I could have this file posted to a website so I could just check it here and there from my cellphone&#8221;. That&#8217;s your wish (believe me &#8212; I can read minds). Well, I had the same wish a while back and this little script came out of it.</p>
<p>Of course, I like to at least try to code stuff up, instead of just writing to Santa. However, I usually go and try to generalize a bit. Let&#8217;s say that I want to monitor a few files or outputs of various commands at the same time. Moreover, let&#8217;s say I want to add these things as I go. Enter <a href="http://bitbucket.org/mbudisic/cl-goodies/src/tip/remotespy"><br />
remotespy</a>.</p>
<p>Remotespy is a script that parses a list of commands to run and compiles their output into a HTML webpage. The page is then saved to a local folder, e.g. public_html. Additionally, it can be scp-ed to a destination of your choice. This is useful if your &#8220;workhorse&#8221; server doesn&#8217;t have a http server setup, but you do have some other place to post your output to.</p>
<p>The syntax is simple:<br />
<code>remotespy COMMANDFILE HTMLFILE"</code><br />
The spirit of the command file is similar to the one of crontab scripts: every line represents a command that is run. Syntax of every<br />
line is:<br />
<code>TITLE ## COMMAND ## COMMENT</code></p>
<p>A sample script looks like this:<br />
<code>Hostname ## hostname<br />
OS ## uname -orpi ## OS version<br />
Disk ## df -h ## Free disk space<br />
Top ## top -b -n 1 -i ## Process state<br />
Vmstat ## vmstat ## Memory state</code></p>
<p>Every command is run as-is and its output captured and formatted into HTML. The HTML code is hardcoded in the script, but, script being a script, it can be easily edited. To make remotespy into a tool satisfying the initial desire of remote monitoring, it can be paired with cron and ssh to periodically run commands from the script and send the files to a (remote) public_html folder which is available to the internets. For the SCP upload to be useful, you should set up a ssh key pair between the source server (one running remotespy) and destination http server. These two articles can help if you don&#8217;t know how to do it yet:</p>
<ul>
<li><a href="http://www.linuxjournal.com/article/8600">http://www.linuxjournal.com/article/8600</a></li>
<li><a href="http://mindspill.net/computing/linux-notes/ssh-or-scp-without-password.html">http://mindspill.net/computing/linux-notes/ssh-or-scp-without-password.html</a></li>
</ul>
<p>The refresh meta tag is also set for the page so you don&#8217;t have to refresh the page manually to check if cron ran the command.</p>
<p>Remotespy was written in Python and tested on versions 2.4 - 2.6. I don&#8217;t know how far back the compatibility actually extends. I like to use it as it allows me to edit the command script without having to reinsert anything into cron. The HTML output is simple enough to be quickly read from mobile devices so I can check on my simulations state whenever I feel like it. You can find it in my Mercurial repository among other scripts I&#8217;ve written:<a href="http://bitbucket.org/mbudisic/cl-goodies/src/tip/remotespy"><br />
http://bitbucket.org/mbudisic/cl-goodies/src/tip/remotespy</a><br />
(The repo name was taken from el-goodies collection for Emacs).</p>
<p>Let me know if you have suggestions for improvements. Future versions should probably migrate from &#8220;commands&#8221; to &#8220;subprocess&#8221; Python module. Also, I might make remotespy into a daemon to make it cron-independent, but that&#8217;s a low-priority for me. This does the job well. If you would like to extend remotespy, please let me know, I&#8217;d love to hear from you. If once wasn&#8217;t enough, you can read this post at <a href="http://mbudisic.wordpress.com/2009/04/03/monitoring-from-afar/"><span>http://mbudisic.wordpress.com/2009/04/03/<span title="Click to edit this part of the permalink">monitoring-from-afar</span>/</span></a> too.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=158</wfw:commentRss>
		</item>
		<item>
		<title>Happy birthday, Calyx!</title>
		<link>http://dev.calyx.hr/blog/?p=156</link>
		<comments>http://dev.calyx.hr/blog/?p=156#comments</comments>
		<pubDate>Tue, 31 Mar 2009 13:37:11 +0000</pubDate>
		<dc:creator>klax</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=156</guid>
		<description><![CDATA[Exactly two years ago, a couple of geeks from Croatia decided to make a living off of being geeks. Calyx was born exactly two years ago. Actually, it was born a bit before that, but this is the legal birthday, so we celebrate it as the real one. Anyway, they say that your company has [...]]]></description>
			<content:encoded><![CDATA[<p>Exactly two years ago, a couple of geeks from Croatia decided to make a living off of being geeks. Calyx was born exactly two years ago. Actually, it was born a bit before that, but this is the legal birthday, so we celebrate it as the real one. Anyway, they say that your company has to survive for three years to be a &#8220;real&#8221; company, so I guess we just have one more to go :-) If we look at what we did in the last two years, I would say that a lot has been accomplished, but there is still much of the road ahead of us. We&#8217;re getting a bit stronger these days, so a new member should join the lot, but more on that in the days to come.</p>
<p>BTW, did you know that the next two suggestions for the company name were InCumulo and FooBar? Whoever can guess the explanation for those two names has a beer ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=156</wfw:commentRss>
		</item>
		<item>
		<title>Location-aware reminder service (Circulos Meos)</title>
		<link>http://dev.calyx.hr/blog/?p=153</link>
		<comments>http://dev.calyx.hr/blog/?p=153#comments</comments>
		<pubDate>Mon, 16 Mar 2009 14:37:30 +0000</pubDate>
		<dc:creator>asparagus</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=153</guid>
		<description><![CDATA[This is a service I would like to have:

I could browse the map, draw circles of various sizes and associate tasks to them.
Later, as I enter the designated areas (which is easily determined via GPS or cell tower info), I receive an SMS with the reminder.
Bonus: conditional reminders &#8211;&#62; &#8220;if(time &#62;= 6pm)&#8221; or &#8220;if(date &#62;= [...]]]></description>
			<content:encoded><![CDATA[<p>This is a service I would like to have:</p>
<p><a href="http://dev.calyx.hr/blog/wp-content/uploads/2009/03/map1.jpg"><img class="aligncenter size-full wp-image-155" src="http://dev.calyx.hr/blog/wp-content/uploads/2009/03/map1.jpg" alt="POIs" width="480" height="384" /></a></p>
<p>I could browse the map, draw circles of various sizes and associate tasks to them.</p>
<p>Later, as I enter the designated areas (which is easily determined via GPS or cell tower info), I receive an SMS with the reminder.</p>
<p>Bonus: conditional reminders &#8211;&gt; &#8220;if(time &gt;= 6pm)&#8221; or &#8220;if(date &gt;= 16.3.2009. and mySpeed &lt; 10 km/h)&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=153</wfw:commentRss>
		</item>
		<item>
		<title>folding@office</title>
		<link>http://dev.calyx.hr/blog/?p=143</link>
		<comments>http://dev.calyx.hr/blog/?p=143#comments</comments>
		<pubDate>Mon, 22 Dec 2008 17:07:37 +0000</pubDate>
		<dc:creator>asparagus</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<category><![CDATA[cpulimit]]></category>

		<category><![CDATA[fah]]></category>

		<category><![CDATA[folding@home]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=143</guid>
		<description><![CDATA[I&#8217;m fairly sure that readers of this blog are acquainted with the folding@home project.
Recently, we installed the F@H app on our 4-core Ubuntu server. In fact, we installed it 4 times, since it seems that&#8217;s the only way (we could find) to use all the CPU cores on 32-bit systems. Despite the fact that 16 [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m fairly sure that readers of this blog are acquainted with the <a href="http://folding.stanford.edu/" target="_blank">folding@home</a> project.</p>
<p>Recently, we installed the F@H app on our 4-core Ubuntu server. In fact, we installed it 4 times, since it seems that&#8217;s the only way (we could find) to use all the CPU cores on 32-bit systems. Despite the fact that 16 &#8220;FahCore_nn.exe&#8221; processes are always running, 12 of them sitting idly, the thing is working. All the cores are used, working units are crunched, we feel good for contributing every time we run the <em>top</em> or <em>ps</em> command :)</p>
<p>And then we started wearing t-shirts in winter.</p>
<p>All the CPUs are working at 100%, ventilators are working on full speed, the office is 10 degrees warmer. We tried to limit the worker processes to some CPU percentage only to find that <em>limits.conf</em> does not support it. Thankfully, Google pointed us to the <a href="http://cpulimit.sourceforge.net/" target="_self">cpulimit utility</a>.</p>
<p>It worked perfectly. At least until the day after, when some of the folding worker processes were again consuming 100% of CPU. So, on day 2, we learned that there is the &#8220;main&#8221; F@H process which fires &#8220;worker&#8221; F@H processes for each working unit. Once the job is done, the process is killed leaving a zombie <em>cpulimit</em> process that&#8217;s trying to limit a non-existing process.</p>
<p>Day 3: Perl :)</p>
<p>The only solution we could think of, for limiting dynamically generated processes to a certain amount of CPU percentage, was a periCRONically executed Perl script that kills hanging <em>cpulimit</em> processes and fires new ones. The input parameters are a string for matching the process name and a number indicating the CPU percentage. Works fine, but a hackish taste is left in my mouth.</p>
<p>Any ideas for something smoother? I cannot accept that Perl has to be used for every real-life problem :D</p>
<p>Btw, the perl script can be found <a href="http://dev.calyx.hr/goodies/cpulimiter.pl" target="_blank">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=143</wfw:commentRss>
		</item>
		<item>
		<title>Productivity boost, -40%</title>
		<link>http://dev.calyx.hr/blog/?p=140</link>
		<comments>http://dev.calyx.hr/blog/?p=140#comments</comments>
		<pubDate>Wed, 17 Dec 2008 12:03:48 +0000</pubDate>
		<dc:creator>asparagus</dc:creator>
		
		<category><![CDATA[Fun]]></category>

		<category><![CDATA[nintendo]]></category>

		<category><![CDATA[projector]]></category>

		<category><![CDATA[wii]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=140</guid>
		<description><![CDATA[On friday, we received the best Christmas present ever - the Nintendo Wii (thanks Hasi!).
On monday, you could already feel the eagerness of people (well, not really people, developers) coming to the office. But as of today, the eagerness went through the roof - we bought a projector! For code reviews.
The following video is the [...]]]></description>
			<content:encoded><![CDATA[<p>On friday, we received the best Christmas present ever - the Nintendo Wii (thanks Hasi!).</p>
<p>On monday, you could already feel the eagerness of people (well, not really people, developers) coming to the office. But as of today, the eagerness went through the roof - we bought a projector! For code reviews.</p>
<p>The following video is the projector&#8217;s version of a developer&#8217;s introduction, the beloved &#8220;Hello World!&#8221;:</p>
<p><a href="http://www.youtube.com/watch?v=orXKsZWmsMc"><img src="http://img.youtube.com/vi/orXKsZWmsMc/default.jpg" width="130" height="97" border=0></a></p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=140</wfw:commentRss>
		</item>
		<item>
		<title>ZaBaPlot</title>
		<link>http://dev.calyx.hr/blog/?p=135</link>
		<comments>http://dev.calyx.hr/blog/?p=135#comments</comments>
		<pubDate>Wed, 10 Dec 2008 14:27:35 +0000</pubDate>
		<dc:creator>asparagus</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=135</guid>
		<description><![CDATA[Fresh stuff from Calyx Labs!
Since our dissatisfaction with the e-banking web site we all use (described in a previous post) grows by the day, we decided to tackle the problem ourselves :)
To cut a long story short, our beloved e-banking web app lets you see your transactions for a certain period - and that&#8217;s about [...]]]></description>
			<content:encoded><![CDATA[<p>Fresh stuff from Calyx Labs!</p>
<p>Since our dissatisfaction with the e-banking web site we all use (described in a <a href="http://dev.calyx.hr/blog/?p=69" target="_blank">previous post</a>) grows by the day, we decided to tackle the problem ourselves :)</p>
<p>To cut a long story short, our beloved e-banking web app lets you see your transactions for a certain period - and that&#8217;s about it. No export to CSV/XLS possibility, no graphic representations.</p>
<p>That&#8217;s why we decided to build some kind of add-on which will help you visualize your data. We chose to implement it as a bookmarklet, using the JavaScript plotting library <a href="http://code.google.com/p/flot/" target="_blank">flot</a>. Here&#8217;s the result:</p>
<p>[caption id="attachment_136" align="aligncenter" width="480" caption="ZaBaPlot"]<a href="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/zabaplot.png"><img class="size-full wp-image-136" src="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/zabaplot.png" alt="ZaBaPlot" width="480" height="205" /></a>[/caption]</p>
<p>The functionality is rather limited - you can track your account balance, individual transactions and some kind of moving average. Zooming in/out is also possible. + the killer feature: tooltips with transaction details :)</p>
<p>The <a href="http://dev.calyx.hr/zabaview.js" target="_self">source code</a> is yours to do whatever you want.</p>
<p><a href="http://dev.calyx.hr/zabaplot/" target="_blank">Installation and usage guide.</a> (WARNING: Croatian language)</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=135</wfw:commentRss>
		</item>
		<item>
		<title>devteam.getMembers().add(new Developer(&#8221;Goran&#8221;));</title>
		<link>http://dev.calyx.hr/blog/?p=123</link>
		<comments>http://dev.calyx.hr/blog/?p=123#comments</comments>
		<pubDate>Mon, 01 Dec 2008 16:39:19 +0000</pubDate>
		<dc:creator>asparagus</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://dev.calyx.hr/blog/?p=123</guid>
		<description><![CDATA[Goran joined our dev team today. We had to upgrade the office, and God knows developers were not meant to use the hammer. As you can see in the picture below, Pablo was quite worried.




Luckily, everything turned out fine in the end. The office is upgraded, no reboot needed. Pablo is now satisfied.
[caption id="attachment_124" align="aligncenter" [...]]]></description>
			<content:encoded><![CDATA[<p style="center;">Goran joined our dev team today. We had to upgrade the office, and God knows developers were not meant to use the hammer. As you can see in the picture below, Pablo was quite worried.</p>
<p style="center;">
<dl>
<dt><a href="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/picassoneodabrava.jpg"><img class="size-full wp-image-122 aligncenter" src="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/picassoneodabrava.jpg" alt="Approval, we haz it" width="500" height="375" /></a></dt>
</dl>
<p>Luckily, everything turned out fine in the end. The office is upgraded, no reboot needed. Pablo is now satisfied.</p>
<p>[caption id="attachment_124" align="aligncenter" width="372" caption="Approval, we haz it!"]<a href="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/pablo_picasso_372x495.jpg"><img class="size-full wp-image-124" src="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/pablo_picasso_372x495.jpg" alt="Approval, we haz it!" width="372" height="495" /></a>[/caption]</p>
<p style="center;">p.s. A quite fascinating thing just happened. Venus aligned with the moon to form something looking extremely similar to the Turkish flag inverted horizontally.</p>
<p style="center;"><a href="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/omen.jpg"><img class="aligncenter size-full wp-image-133" title="Omen" src="http://dev.calyx.hr/blog/wp-content/uploads/2008/12/omen.jpg" alt="" width="457" height="426" /></a></p>
<p style="center;">This must be an omen, the One has come! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.calyx.hr/blog/?feed=rss2&amp;p=123</wfw:commentRss>
		</item>
	</channel>
</rss>
