<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.7.6(BH)" -->
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Blog</title>
        <description></description>
        <link>http://teroheikkinen.iki.fi/blog/</link>
        <lastBuildDate>Fri, 30 Jul 2010 13:01:22 +0000</lastBuildDate>
        <generator>FeedCreator 1.7.6(BH)</generator>
        <item>
            <title>Why unit tests are cool</title>
            <link>http://teroheikkinen.iki.fi/blog/why_unit_tests_are_cool/</link>
            <description><![CDATA[
<div><br /></div>
<div>It has been a while since my last posting. Quite a lot of business and lack of personal time to write. There has been more important things like finishing up studies and master thesis.</div>
<div><br /></div>
<div>One could be thinking why write those unit tests. Especially if you have buggy free code or libraries what is the catch there. It's labourfull to make those tests. But still you are most likely to do some interesting test cases that you were not thinking while implementing your original solutions.</div>
<div><br /></div>
<div>I call these to "grey" areas. There might be cases where your function returns nothing or null when it should return true or false. This can happen quite often with PHP. You want to make simple function but then something goes wrong when the code above your basic function behaves badly.</div>
<div><br /></div>
<div>In fact when writing your unit test you should have very destructive mindset and write also those "should be impossible" combinations. And what should your function do when something "impossible" happens? Should it try and correct the situation?</div>
<div><br /></div>
<div>I've come to conclusion that strict approach is the best. Depending the programming language those grey areas are best addressed with for example exceptions. And why? The programmer above immediately gets feedback that something is going wrong thus preventing further damage. So put some informative message to that exception and be defencive.</div>
<div><br /></div>
<div>Write those unit tests!</div>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <pubDate>Sat, 03 Oct 2009 07:52:08 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1deaff1a694b858aff111deb0fe1bcbf6cd3b3c3b3c</guid>
        </item>
        <item>
            <title>Open source and govermental funding</title>
            <link>http://teroheikkinen.iki.fi/blog/1de27929b7c75a6279211deabc223b9e799009e009e/</link>
            <description><![CDATA[
<p>I've been recently thinking should Midgard project after it's transformation to a fundation apply for some govermental (<a href="http://www.tekes.fi/eng/">TEKES</a>) funding or something else from EU level.<br /><br />Currently Midgard is developed with normal work (testing and stomping mines) or with my spare time (weekend hacking sessions) from my part. But in the big picture lot's of developement is funded by companies that are really and only using Midgard for their living. <br /><br />R&amp;D costs are considerable and I think that there should be some funding programs that coming Midgard Foundation can apply financing from. Commercial products do it shouldn't we also?</p>
<p><a href="http://akseli.tekes.fi/opencms/opencms/OhjelmaPortaali/ohjelmat/INTO/fi/projektilistaus.html?filter=1">List of projects</a> funded by tekes (in finnish)</p>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <pubDate>Sun, 12 Apr 2009 18:49:09 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1de27929b7c75a6279211deabc223b9e799009e009e</guid>
        </item>
        <item>
            <title>New year comes with big changes</title>
            <link>http://teroheikkinen.iki.fi/blog/1ddf5466fe9d9a2f54611dda9b489c0f53d44424442/</link>
            <description><![CDATA[
<p>It has been a while since my last post. Mainly because great stress at school and my personal life. It has also been very interesting beginning of a new year. I bought my very own apartment and the company that I'm partner in bought majority of another company. That means that lots of new technology knowledge must be absorbed as quickly as possible.</p>
<p>
Good thing is that it broadens up a perspective about how to make different kind of web services for consumers. That knowledge comes through all layers from the very top to the very bottom of the code itself. I've encountered some innovative solutions as well as the problems that will be encountered when the amount of data and traffic goes to another level.
</p>
<p>
Year 2009 means lots for the midgard itself. New Vinland (Midgard 2.0) will be released. The possibility to use Midgard as content repository of your application has became a reality. It's quite easy to do midgard + python + guid application that you can replicate to net. Also new codebase gives possibility to make enhancements to Midgard Core itself to make it very versatile tool for developers. But most importantly, new Core gives possibility to rethink some design rationales behind all. As far as I know when data storage grows and it's usage intensifies rules change at the very level of data storage and abstraction. How Midgard scales to this? By the developer meeting at Linkköping I'll try to find out.
</p>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <pubDate>Sat, 07 Feb 2009 18:37:56 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1ddf5466fe9d9a2f54611dda9b489c0f53d44424442</guid>
        </item>
        <item>
            <title>Many aspects of testing</title>
            <link>http://teroheikkinen.iki.fi/blog/many_aspects_of_testing/</link>
            <description><![CDATA[
<p>Christmas is almost here but there's still yet another exam ahead. This time it's about testing and quality assurance of software. The fact is that it can be done with quite workfull way. For example we had a exercise where we had to test a java program with <a href="http://en.wikipedia.org/wiki/Black_box_testing">black box</a> methodology. When doing it properly it takes quite an effort.</p>
<p>But now when the sanity points and mental energy is almost gone after several exams there must be something wrong when reading dry text and I start laughing when stumbled following: "<a href="http://www.logigear.com/resources/articles_lg/soap_opera_testing.asp"><strong>Soap-opera testing</strong></a>"</p>
<p>Luckily christmas vacation is only two days away.</p>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <pubDate>Sun, 21 Dec 2008 19:39:35 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1ddcf9718fefa0ccf9711ddbb095f65416d788f788f</guid>
        </item>
        <item>
            <title>Caching thoughts</title>
            <link>http://teroheikkinen.iki.fi/blog/caching_thoughts/</link>
            <description><![CDATA[
<p><br />I've previously written something about caching and it complexity. A short while ago I've heard from <a href="http://bergie.iki.fi">Bergie</a> about interesting facts about <a href="http://www.danga.com/memcached/">memcache</a> and also been bitten by it first hand. <br /><br />It seems that with bigger sites with current MidCOM caching philosophy and level of atomicity are getting more heavier than just serving pages without any cache. It seems that if Memcached is heavily punished and if there's lots of keys in it it start so slow down and also reliability goes down. Basically it means that you don't always get data from cache or be able to store it in there resulting some database punishment and you can imagine what happens next.<br /><br />This comes again to MidCOM 3 and the way caching should be handled there. I've taken a close look about how <a href="http://framework.zend.com/">Zend Framework</a> <a href="http://framework.zend.com/manual/en/zend.cache.html">does it</a>. They are useing <a href="http://framework.zend.com/manual/en/zend.cache.theory.html#zend.cache.tags">tags</a> as possible cache identifiers. Basically MidCOM's cache works quite same way but in fact every cache entry get's autotagged by lots of guids. So that is basically the problem. <br /><br />One possible solution that I've pondered would be to give developer some additional tools to control caching in controllers. There could be some hint's for cache's level like if it's same for all users or per user basis. This helps caching to be done more intelligent way<br /><br />But in addition to this there should be a concept for cache invalidation logic. In some cases you need more atomicity than others and the problem was with too big guid indexes. What if developer has in addition to tagging possibility to attach some callbacks to tags. Basically it means that you have possibility to call cache invalidation per tag but then those callbacks could do some logic whether or not tag entry really needs to be invalidated.<br /><br />That would enable us to diminish the size of guid cache, put some intelligent invalidation where needed. Bit heavier process it is but if it's lighter than getting data and rendering it, then it's worth to explore.</p>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <category>Midcom 3</category>
            <pubDate>Sat, 22 Nov 2008 11:09:13 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1ddb885feecd828b88511ddb47813997cc149964996</guid>
        </item>
        <item>
            <title>How Midgard 2 talks between between machines</title>
            <link>http://teroheikkinen.iki.fi/blog/how_midgard_2_talks_between_between_machines/</link>
            <description><![CDATA[
<br />
I gave today a workshop about the basic functionalities of Midgard 2. One of them is the dbus signaling and it's possibilities. After that we hade quite intense hacking session with XMPP and Midgard 2. And what did we archive?<br /><br />
I described in one of my <a href="http://teroheikkinen.iki.fi/blog/view/midgard_workshop_at_fscons.html">blogposts</a> how easy it is to signal. So when some code is added, I can send serialized midgard objects via XMPP<br /><br />
Basically there's some normal code for initialization for the dbus and <a href="http://twistedmatrix.com">twisted</a> framework in python but the magic happens with<br /><br />
# initialization code<br />
....<br /><br />
def replicate:<br />
        # some preparing code for connection etc<br />
        msg = domish.Element(("jabber:client", "message"))<br />
        msg["to"] = "bergie@example.net"<br />
        body = msg.addElement("body", content = replicationpackage)<br />
        self.xmlstream.send(msg)<br /><br />
mbus = midgard.dbus("/mgdschema/midgard_page/create")<br />
mbus.connect("notified", replicate, "foo")<br /><br />
Now we need a working receiver and probably <a href="http://bergie.iki.fi">Bergie</a> is going to tell about is some more. This rocks we'll may have sooner than expected some P2P applications with Midgard.]]></description>
            <pubDate>Sat, 25 Oct 2008 16:30:48 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dda2b247bf8abca2b211dd8adf096bb96da3aaa3aa</guid>
        </item>
        <item>
            <title>Some documentation about installing Midgard 2</title>
            <link>http://teroheikkinen.iki.fi/blog/some_documentation_about_installing_midgard_2/</link>
            <description><![CDATA[
Required os: Ubuntu 8.04<br /><br />
Installing newest midgard is bit tricky. After all it's beta software so the installing scripts are not yet done.<br /><br />
1. Add following lines to your /etc/apt/sources.list<br />
deb http://download.opensuse.org/repositories/home:/midgardproject:/ragnaroek/xUbuntu_8.04/ ./<br />
# deb http://download.opensuse.org/repositories/home:/midgardproject:/vinland-dev/xUbuntu_8.04/ ./<br /><br />
2. apt-get update<br />
3. apt-get install midgard libgda3-3 libgda3-common php5-memcache libgda3-mysql git-core python-gobject python2.5-dbus php5-syck<br />
    - Ask yes for the midgard related questions<br />
4. datagard<br />
    - Enter your hostname when it's asked<br />
        - Otherwise you won't be able to access web interface<br />
    - Use default values except answer yes to MidCOM3 related question<br />
5. Download and install all packages from http://download.opensuse.org/repositories/home:/midgardproject:/vinland-dev/xUbuntu_8.04/ that are related to your system architecture<br />
6. Link /etc/midgard =&gt; /etc/midgard-2.0 and /usr/share/midgard =&gt; /usr/share/midgard-2.0<br /><br />
Now you got a midgard 2 installed on your system<br /><br />
6. git clone git://repo.or.cz/midcom.git (Installs MidCOM 3)<br />
7. edit /etc/midgard-2.0/apache/vhost/hostname<br />
    - add: php_value include_path .:/usr/share/php:/root/midcom        <br />
    - add: MidgardRootFile /root/midcom/midcom_core/httpd/midcom-root-midgard2.php<br />
    - Comment other MidgardRootFiles off<br /><br />
8. Ensure that line extension=midgard.so is present at /etc/php5/apache2/php.ini<br /><br />
9. Add following file<br />
/etc/dbus-1/system.d/midgard_dbus.conf<br />
with content<br /><br />
&lt;!-- This configuration file specifies the required security policies<br />
     for Midgard D-Bus service to work. --&gt;<br /><br />
&lt;!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"<br />
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"&gt;<br />
&lt;busconfig&gt;<br /><br />
  &lt;policy user="root"&gt;<br />
    &lt;allow own="org.midgardproject"/&gt;<br />
  &lt;/policy&gt;<br /><br />
  &lt;policy context="default"&gt;<br />
    &lt;allow own="org.midgardproject" /&gt; <br />
  &lt;/policy&gt;<br /><br />
&lt;/busconfig&gt;<br /><br />
10. pear install http://phptal.motion-twin.com/files/PHPTAL-1.1.13.tar.gz<br />
11.     pear channel-discover pear.phing.info<br />
    pear install phing/phing<br />
    pear channel-discover pear.phpunit.de<br />
    pear install phpunit/PHPUnit]]></description>
            <pubDate>Sat, 25 Oct 2008 10:58:13 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dda283d1b955e2a28311dd8d2c9dd20a5f25f425f4</guid>
        </item>
        <item>
            <title>Midgard workshop at FSCONS</title>
            <link>http://teroheikkinen.iki.fi/blog/midgard_workshop_at_fscons/</link>
            <description><![CDATA[
<p>
There will be a great <a href="http://www.midgard-project.org">Midgard</a> related workshop at <a href="http://www.fscons.org">FSCONS</a>. The focus of the workshop is to present the next generation of Midgard and great features that it offers.<br /><br />
What are those great features that are presented? Easiest and the most usable feature is the PHP &amp; Python support and <a href="http://blogs.nemein.com/people/piotras/">DBUS</a>. Let's make a short snippet of code for python and for PHP that do the same thing
</p>
<table border="1" cellpadding="5"><tbody><tr><td>
			<p>
			&lt;?php
			</p>
			<p>
			$cnc = new midgard_connection();
			</p>
			<p>
			$cnc-&gt;open('midgard');			
			</p>
			<p>
			$cnc-&gt;set_sitegroup('mysitegroup');
			</p>
			<p>
			?&gt;
			</p>
			</td>
			<td>
			<p>
			import _midgard as midgard
			</p>
			<p>
			import gobject
			</p>
			<p>
			import dbus.mainloop.glib			
			</p>
			<p>
			cnc = midgard.connection()			
			</p>
			<p>
			cnc.open('midgard')			
			</p>
			<p>
			cnc.set_sitegroup('mysitegroup)
			</p>
			</td>
		</tr></tbody></table><p>
<br />
Both snippets do the exactly same thing. Open up connection to Midgard and after that the whole power of Midgard and it's features is at your disposal.<br /><br />
Let's make another short snippet that continue those I wrote earlier.
</p>
<table border="1" cellspacing="0" cellpadding="5"><tbody><tr><td>
			<p>
			 
			</p>
			<p>
			&lt;?php
			</p>
			<p>
			$page = new midgard_page();
			</p>
			<p>
			$page-&gt;name = "Testing 123";
			</p>
			<p>
			$page-&gt;create();
			</p>
			<p>
			$page-&gt;name = "Final 123";
			</p>
			<p>
			$page-&gt;update();
			</p>
			<p>
			?&gt;
			</p>
			<p>
			 
			</p>
			</td>
			<td>
			<p>
			page = midgard.mgdschema.midgard_page()
			</p>
			<p>
			page.name = "Testing 456"
			</p>
			<p>
			page-&gt;create()
			</p>
			<p>
			page.name = "Final 456"
			</p>
			<p>
			page.update()
			</p>
			</td>
		</tr></tbody></table><p>
<br />
Again. Both do the very same thing. This same kind of data abstraction is available for C and soon for Mono (C#). But let's take this a bit further. What if I want have to put all latest articles to some index or search engine of my own?<br /><br />
Let's make one python snippet.
</p>
<p>
 
</p>
<table border="1"><tbody><tr><td>
			<p>
			 
			</p>
			<p>
			import _midgard as midgard
			</p>
			<p>
			import gobject
			</p>
			<p>
			import dbus.mainloop.glib
			</p>
			<p>
			import my_indexer
			</p>
			<p>
			def index(object, args):
			</p>
			<p>
			# LOTS OF MAGIC
			</p>
			<p>
			cnc = midgard.connection()
			</p>
			<p>
			cnc.open('midgard')
			</p>
			<p>
			cnc.set_sitegroup('mysitegroup)
			</p>
			<p>
			mbus = midgard.dbus("/midgard_article/create")
			</p>
			<p>
			mbus.connect("notified", index, "foo")
			</p>
			<p>
			mainloop = gobject.MainLoop()
			</p>
			<p>
			mainloop.run()
			</p>
			</td>
		</tr></tbody></table><br /><p>
As you can see it's that easy to make a python application that listens for creations off midgard_article objects. And this means all articles even if they are created at PHP - level. <a href="http://blogs.nemein.com/people/piotras/">Piotras</a> deserves big applause for this archievement!
</p>
<p>
When you play with PHP I suggest that you use MidCOM 3 component framework. It provides nice services that take full leverage of Midgard's services. But think what you can nowadays do behind the scenes with nice C, Mono or Python daemons. Sky is the limit! 
</p>]]></description>
            <category>midgard2</category>
            <pubDate>Tue, 21 Oct 2008 18:33:53 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd9f9ed02f2bb29f9e11ddb1795724bcbd2b022b02</guid>
        </item>
        <item>
            <title>New Midgard, new documentation</title>
            <link>http://teroheikkinen.iki.fi/blog/new_midgard-new_documentation/</link>
            <description><![CDATA[
<p>
The future Midgard + MidCOM release in the future needs also new documentation. Basically nowadays documentation is good if you are an experienced developer and are keen to understand how things work.
</p>
<p>
In a case for new employee for example the time required for learning must be shorter. And sometimes good more easily readable and structured documentation helps to clarify the thoughts of the new developer. It results better code and comprehension of the whole system.
</p>
<p>
I and <a href="http://bergie.iki.fi">Bergie</a> had a short chat about <a href="http://fscons.org/">FSCONS</a> Midgard workshop. The goal is that we have new documentation more or less done by the workshop. That's a good place to test if it works.
</p>
<p>
The initial skeleton of the documentation comes from the company that I work in (<a href="http://www.rohea.com">Rohea Oy</a>) training material. It has already been tested there once so lets see how well it works after complete rewrite. 
</p>]]></description>
            <pubDate>Wed, 15 Oct 2008 21:02:52 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd9afca178dbca9afc11dd88a145c87da1eba1eba1</guid>
        </item>
        <item>
            <title>Criminalized port scanning</title>
            <link>http://teroheikkinen.iki.fi/blog/criminalized_port_scanning/</link>
            <description><![CDATA[
Finland's Supreme Court made a decision spring 2003 about port scanning. A teenager had scanned local banks network without finding any holes. He did not manage even to try to break in to bank's systems.<br /><br />
Court sentenced teenager about trying to break in bank's systems. Also compensation for the bank was sentenced. Compensation was based on the expenses for the banks security audition that they "had to" take in order to be sure that their firewall is secure enough.<br /><br />
One may first think that this was right for the script kiddie that tried to mess around. Same kiddies tend to ddos whole network block down if they want to drop someone from the IRC for example. And same time true business damage occurs.<br /><br />
But there's one problem with the sentence. If you walk through a shopping mall during night and try every door. All are locked. By that same logic that court used, you are obliged to pay for the shop owners if they want to run security audition. <br /><br />
Interesting field of problem. But luckily when you are consultant and do the same thing. Port scan a machine and you'll get paid. Of course if the machine that you port scan is your customer's<br /><br />
If you are interested of the case is available <a href="http://www.finlex.fi/fi/oikeus/kko/kko/2003/20030036?search%5Btype%5D=pika&amp;search%5Bpika%5D=tietomurto">in the net</a> (in finnish).]]></description>
            <pubDate>Tue, 14 Oct 2008 12:44:45 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd99ede149d38699ed11ddb7d007729fc7a21fa21f</guid>
        </item>
        <item>
            <title>My first conference talk</title>
            <link>http://teroheikkinen.iki.fi/blog/my_first_conference_talk/</link>
            <description><![CDATA[
<p>
Yesterday a gave my very first <a href="http://www.openmind.fi/">conference</a> talk. It was exciting since I've never been at any conference and I did not have any idea what is the expected level of the talks.<br /><br />
With <a href="http://bergie.iki.fi">Bergie</a>'s help I was able to formulate a set of <a href="http://docs.google.com/Present?docid=dgvmnzz_1ftw2p4cw&amp;skipauth=true">slides</a>. Presentation itself could have been better but the audience was very challenging.<br /><br />
It was not good idea for the organizers to couple lightningtalks and coctails. Audience were talking themselves and were not taking attention to the performers. Personally I see that audience did not give very much respect for the talks. In fact most of the performances would been greatly better but the situation ruined many good flows.<br /><br />
But Bergie recorded my lightning talk and it's at <a href="http://www.youtube.com/watch?v=f9icCUuZObA">youtube</a>. At least the beginning of my talk got the audience's attention. 
</p>
<p>
 
</p>
<p></p>]]></description>
            <category>midgard2</category>
            <pubDate>Wed, 08 Oct 2008 11:56:29 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd9530244cac84953011ddaeb2c39f632b09000900</guid>
        </item>
        <item>
            <title>Software patents</title>
            <link>http://teroheikkinen.iki.fi/blog/software_patents/</link>
            <description><![CDATA[
This writing is the second one in the series based on the course of sw-legistlation that I'm taking at school.<br /><br />
After copyrights the most natural path to continue exploring the wonders of legistlation is naturally patents. Patents tend to raise opinions since it has been proven that most cases patents in software fields are just not working as intended.<br /><br />
Most of the problems come from USA and the threat that similar conventions are applied someday in EU. It seems that patents are applied just in case for almost everything. When this is combined to the fact that the financing of the patent agency is based on the amount of patents they approve we'll have some interesting problems. Also the personnel that make the decisions are not often qualified to the field that the patent addresses.<br /><br />
What is the result then. In the US only the best patents are taken to the court. And about 70% of the patents are nullified there. What is the big picture then? It has been said that about 10% of the patents are truly valid.<br /><br />
What is the difference between the Europe and US? Well in Europe patent is given "first  to file" basis and in the US it is "first to invent". You can tell what that means.<br /><br />
I personally consider patents as an arsenal of business cold war. Companies have plenty of patents for a fear factor. This leads to interesting cross licensing but also in the telecommunication field patents are used to regulate margets so that new and smaller players have trouble getting in. For example about every mobile communication standard has been patented.<br /><br />
Patents are controversial and seem to be a big mess. It remains to be seen how big mess it will become after EU decides to make some wise decisions. ]]></description>
            <pubDate>Sat, 27 Sep 2008 14:20:54 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd8c9f7ede32568c9f11dda1ca270656ac0d3d0d3d</guid>
        </item>
        <item>
            <title>Copyright in Software business</title>
            <link>http://teroheikkinen.iki.fi/blog/copyright_in_software_business/</link>
            <description><![CDATA[
I've started a introduction course about legistlation in software business. I'll write some articles based on the memos that I've written during lectures. This first article is about copyright. One remark: the issues I discuss may contain my personal opinions and are more or less based on finnish law.<br /><br />
Copyright itself is an interesting concept. It is used to protect the rights of the person who does the work. This is very straightforward with classical art (writings, paintings...) The very software code itself does contain some more or less interesting exceptions. <br /><br />
Code has copyright because it equates to work of art. Yes! all coders are artists! But  for who you work for? If you are a independent researcher, project worker or teacher at university or such your code that you do belongs to you and you only if you have not agreed otherwise. Also if you work as a private via your trade name it is not concidered as a standard working agreement so the copyrights will remain with you.<br /><br />
Naturally all technical plans and architectural charts are protected by copyright if they are unique and point one's creativity. But have you ever concidered if your detailed plans are stolen and someone makes implementation by using them? Months of carefull design is stolen and you know who did it and the he releases the software. Can you sue them? <br /><br />
This was quite suprising to know. No you cannot sue them. It's illegal to steal stuff but the implementation is completely legal since it is concidered as a separate work.<br /><br />
But what else is not protected? Implementations of some standard are not concidered as unique work. Even if you copy routines and code as it is and if that is the only way to implement the standard you are not making an infringement.<br /><br />
Last thing to point out is the copyright in opensource industry. There are some rules about screen of name and honour and requirement to give credits with good fashion. For example in Midgard Project the about screen and pear manifests implement quite well that requirement! However  there is one exception. In embedded systems you cannot demand that your name will be shown. So if you've made an OS speech synthetizier that is used in elevator, you cannod force them that it should shout your name for exampe once an hour.<br /><br />
Next lecture is about software patents. Let's see if there is anything to write about them,]]></description>
            <pubDate>Mon, 22 Sep 2008 20:51:04 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd88e82bee5e6488e811ddb7a0d56d563b043e043e</guid>
        </item>
        <item>
            <title>Source control matters</title>
            <link>http://teroheikkinen.iki.fi/blog/source_control_matters/</link>
            <description><![CDATA[
<p>
Recently I've been running problems when maintaining multiple concurrent branches or versions of software with subversion. Somehow the merging is a challenge since branches are not "real" branches but more or less just copies of folders. Also switching between branches in web developing can be more pain than gain.<br /><br />
As I started to play with MidCOM 3 I had to introduce myself to the <a href="http://git.or.cz/">git</a>. The first impression was quite bad since we used repo.repo.or.cz as our storage. My bad impression came mainly because of the commit problems. But now as I've studied git some more it seems more and more the tool that I would like to adapt to every software product I'm dealing with.<br /><br /><a href="http://bergie.iki.fi/blog/feature_branches_in_midgard_development_with_git.html">Bergie blogged</a> about the new idea where the "trunk" is stable and all new features, bugfixes, versions etc are made as new branches. First I felt a bit sceptical about this but now when I've studied and tried it a bit more I'm sold.<br /><br />
But lets take a look how does this work in your workgroup environtment? First of all instead of working in multiple branches things will not break up unexpected when you update. With one checkout morning checkout too often breaks things up. With branching you can leave it broken if it's your "personal" branch. 
</p>
<p>
Git gives good and fast possibilities for branching. Another great advantage is that you can easily hop into your collegue's branch just by "git checkout another_branch". Merging conventions may need a bit more studying and especially branch branching. These are in my opinion project or organization related conventions.  
</p>
<p>
Git could make a great improvement to software version controlling when compared to cvs or subversion. It however will need some thinking and adaptation to projects source control conventions if active branching and mergin has not been a used before.
</p>]]></description>
            <pubDate>Sat, 13 Sep 2008 09:45:55 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd8178c2dadcac817811ddb9dfa7257bf41d0b1d0b</guid>
        </item>
        <item>
            <title>Building a user level caching with dynamic content</title>
            <link>http://teroheikkinen.iki.fi/blog/building_a_user_level_caching_with_dynamic_content/</link>
            <description><![CDATA[
Caching can be the most essential part of website developement since it can greatly affect to the site responsiviness and how well does your site cope with sudden increase of hits.<br /><br />
Things are quite simple when you have just static content or dynamic content where all data is common to all users. But what if some part of your site requires per user tailored content. Things start to get immediately a lot more interesting.<br /><br />
Lets take a normal page. There are for example following parts: <br /><img src="http://teroheikkinen.iki.fi/midcom-serveattachmentguid-1dd80b830f44fe680b811dda74095d615ec5b8d5b8d/midcom3-cache.png" border="0" alt="MidCOM3-cache.png" title="MidCOM3-cache.png" /><br />
1. Header and the very beginnings of the page<br />
2. Some personalized content. User's latest messages etc.<br />
3. Latest news<br />
4. Latest comments<br />
5. The ending of the page<br /><br />
As a caching point of view this page should now be divided to three chunks.<br /><br />
1. Part #1 (public)<br />
2. Part #2 (private)<br />
3. Part #3-#5 (public)<br /><br />
So basically it means that when we got a request, caching engine should request those three chunks. There should be some logic around that kicks in at the second part. Perhaps if that code is not cached, then that code that generates it is fired.<br /><br />
The part two can as well be totally uncached if required so. But in the end the challenge comes how to invalidate those parts and how to keep cache as intelligent as possible. For example that private part can be same per each request. That's why for example cache keys cannot be totally request based. <br /><br />
Interesting challenge. Let's see how this all be done with MidCOM 3.]]></description>
            <category>Midcom3</category>
            <pubDate>Fri, 12 Sep 2008 10:36:13 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd80b69f160fca80b611dda042d359dd8f57d557d5</guid>
        </item>
        <item>
            <title>UI translations - Order to chaos</title>
            <link>http://teroheikkinen.iki.fi/blog/ui_translations-order_to_chaos/</link>
            <description><![CDATA[
For MidCOM 3 the work of implementing <a href="http://en.wikipedia.org/wiki/Gettext">gettext</a> support is almost done. Most of the translation requests come from TAL templating. Some may come directly from the PHP - code and that requires some nice i18n API function. <br /><br />
A quick bus trip thinking about the flow of the translation spawned a requirement of a new helper component for MidCOM 3 that is midcom.helper.translator. If fact it's functionality is quite simple. It provides three key functionalities<br /><ol><li>Collector that goes through every component's all PHP and <a href="http://phptal.motion-twin.com/">TAL</a> files and looks for certain function calls. It also reads translations that are already made. Then it writes the results to database in order to provide easier access for the translation UI itself</li>
	<li>The very UI for translations that makes it easy to browse and input translation entries. Especially strings that are not translated should be easily accessible</li>
	<li>Exporter functionality is required for writing .po files to corresponding component's locales folder and running <a href="http://en.wikipedia.org/wiki/Msgfmt">msgfmt</a> command to that translation file in order to generate the gettext binary</li>
</ol>
This should provide nice Web based UI for translations management. Of course when doing things in right way this functionality can also be exposed via Neutron, WebDAV, Samba or other coming possible UI - interfaces]]></description>
            <category>Midcom3</category>
            <pubDate>Tue, 09 Sep 2008 06:28:55 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd7e3893afabee7e3811dda156c3af219f47d447d4</guid>
        </item>
        <item>
            <title>MidCOM 3 supports now X-Sendfile</title>
            <link>http://teroheikkinen.iki.fi/blog/midcom_3_supports_now_x-sendfile/</link>
            <description><![CDATA[
<br />
Normally serving files directly from PHP can be quite resource consuming. X-Sendfile provides an alterntive way to serve files from PHP script. It's quite simple, you just send one more header line after setting your content type. <br /><br />
Apache's X-Sendfile module then intercepts the header and does it magic. Module also provides caching headers etc to the browser.<br /><br />
Setting things up is simple<br /><ol><li>Download the module from <a href="http://tn123.ath.cx/mod_xsendfile/">mod_xendfile's</a> page </li>
	<li>Compile and install it in your apache and do apache restart</li>
	<li>Add following line to your MidCOM 3's configuration<br />
	- enable_xsendfile: true</li>
</ol>
Then all attachments should be served via xsendfile. It's a bit faster and on the second load when the browser cache hits in, it's even faster.<br /><strong><br />
Pros:</strong>
<ul><li>Fast and low memory consuption when serving very large attachements</li>
	<li>Allow using ACL's before serving</li>
</ul><strong>Cons:</strong>
<ul><li>Not an official apache module. Needs some tweaking.</li>
	<li>File or any file is served without any intervention of Midgard or Midcom. So if you xsendfile directly, be careful!</li>
</ul>]]></description>
            <category>Midcom3</category>
            <pubDate>Mon, 01 Sep 2008 09:54:10 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd780beca069ec780b11ddb794a7dc62933c6c3c6c</guid>
        </item>
        <item>
            <title>Doing some lightweight test automatization</title>
            <link>http://teroheikkinen.iki.fi/blog/doing_some_lightweight_test_automatization/</link>
            <description><![CDATA[
<p>
Most of the time when you are building up a website you constantly
do some code and click testing. After you have finished up your work
most of the testcases you could figure out should work.
</p>
<p>
Of course
there are more elegant way to test things like writing unittest while
doing some test driven developement. But still it does not make the
functional testing go away. How the things work out within browser?
Does this javascript snippet that I wrote work? There are plenty of
places where things can go wrong.
</p>
<p>
I've been time to time tried to find out time to test what <a href="http://selenium.openqa.org/">Selenium</a>
can do. Selenium is a tool for browser level testing automatisation.
Basically it means that with selenium you can record the normal
clickings that you do add some checkings for example if some element or
text is present at the page. 
</p>
<p>
There is a <a href="http://selenium.openqa.org/movies/intro.mov">2 minute video</a>
that shows how easy it is to start. I already installed Selenium IDE to
my firefox and I'm quite sold. 
</p>]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <category>Midcom3</category>
            <pubDate>Sat, 23 Aug 2008 18:55:19 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd714507efe434714511ddbe7009a97c1766016601</guid>
        </item>
        <item>
            <title>How much more torque MidCOM 3 really gives?</title>
            <link>http://teroheikkinen.iki.fi/blog/how_much_more_torque_midcom_3_really_gives/</link>
            <description><![CDATA[
I've been lately done lots of work with MidCOM 3. Currently MidCOM 3 has most of the important things done like basic ACL, templating, authentication and internationalization with gettext.<br /><br />
So how well does it perform? So far there are some optimizations to the web applications code to be made that I'm currently doing. But I still decided to make a little benchmark MidCOM 2.8 (content cache + memcached + bytecodecache) versus MidCOM 3.0 (no cache. Even Midgard page cache is disabled)<br /><br />
I did not have time or a suitable machine available this time to test MidCOM 2.9 with autoloading. So that part remains in the dark at this point.<br /><br />
Both test machine has same CPU power available. Only difference is that MidCOM 3 is run only with 256MB of RAM. Another machine has over 2GB. Both machines have somewhat similar background load.<br /><h3>Results</h3>First in order to make worst possible MidCOM 2.8 run I made several independed requests with ab to get one single page after midcom-cache-invalidate.<br /><br />
Average request time with options ab -c 1 -n 1 done 10 times<br /><br /><strong>MidCOM 2.8</strong>: 5.516 seconds <br /><strong>MidCOM 3.0</strong>: 0.270 seconds<br /><br />
Results with ab -c 1 -n 10. With this options MidCOM 2.8's caches can truly kick in.<br /><br /><strong>
MidCOM 2.8:</strong><br />
Requests per second:    3.28 [#/sec] (mean)<br />
Time per request:       305.20 [ms] (mean)<br /><br /><strong>
MidCOM 3.0:</strong><br />
Requests per second:    3.59 [#/sec] (mean)<br />
Time per request:       278.70 [ms] (mean)<br /><br />
Quite impressive. The page I loaded has 3 dynamic loads. So when MidCOM 3 has its caching engine up and running and some bytecode caching it _is_ going to fly.<br /><br />
The MidCOM 3 itself should not get much more functionality to be run on every request with sufficent planning, implementation and taking leverage of intelligent autoloading.<br /><br />
As the Midgard 2 and MidCOM 3 release comes nearer I'll take more look of the results. So far, looking very good.]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <category>Midcom3</category>
            <pubDate>Wed, 20 Aug 2008 12:23:12 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd6eb2c1f6de9a6eb211dd882fd5eecdd2c411c411</guid>
        </item>
        <item>
            <title>What are the keypoints of business value generation with long term support?</title>
            <link>http://teroheikkinen.iki.fi/blog/what_are_the_keypoints_of_business_value_generation_with_long_term_support/</link>
            <description><![CDATA[
As the Midgard LTS stabilization approaches it's always good to start thinking the most important factors that generate value of the product. <br /><br />
Because we are dealing up with an open source product the business itself is totally service oriented since no license fees are collected. Nowadays mixed business models have emerged that contain both licence and service fees. But with both cases there are more or less unexpected expenses that just occur.<br /><br />
Basically in the long term most of the software service expenses come from repeating tasks like installing, upgrading, bug tracking etc. With coming Midgard LTS version installation part has been quite well tested. Upgrading and bug tracking should be reviewed and discussed. How do we do software configuration management? And what are the expectations that LTS version should fullfill?<br /><br />
Git and OBS are good starting point for the improvement. However there still some important keypoins to address like Configuration control, status accounting, reviewing of the components and the very LTS process management as a whole. This is the way now and in the future to make better value when providing consultancy services or web services built on Midgard LTS. Try and minimize the probability that something unexpected happens. That should provide us better chance to focus on relevant matters instead just trying to put out acute flames somewhere.]]></description>
            <author>tero.heikkinen@iki.fi (Tero Heikkinen)</author>
            <category>midgard</category>
            <pubDate>Tue, 12 Aug 2008 12:59:47 +0000</pubDate>
            <guid>http://teroheikkinen.iki.fi/midcom-permalink-1dd686e8afe575a686e11dd927a791bdfb13a113a11</guid>
        </item>
    </channel>
</rss>
