<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soft thinking</title>
	<atom:link href="http://www.fireflake.com/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fireflake.com/tech</link>
	<description>Thinking about computer programming.</description>
	<lastBuildDate>Fri, 09 Oct 2009 08:44:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>What does J mean?</title>
		<link>http://www.fireflake.com/tech/2009/10/09/what-does-j-mean/</link>
		<comments>http://www.fireflake.com/tech/2009/10/09/what-does-j-mean/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 08:43:21 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Funny]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[0x4A]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[J]]></category>
		<category><![CDATA[smiley]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=221</guid>
		<description><![CDATA[Anyone else been confused by random Js in their e-mails? I have received many e-mails that often end up with a J at the end of a line, often where one thought a smiley would fit right in. At first I suspected that it was a particular company that had an internal way of typing [...]]]></description>
			<content:encoded><![CDATA[<p>Anyone else been confused by random Js in their e-mails? I have received many e-mails that often end up with a J at the end of a line, often where one thought a smiley would fit right in. At first I suspected that it was a particular company that had an internal way of typing jokes since I couldn&#8217;t find anything about the abbreviation J as Internet slang. Since I never asked at first it felt silly to ask later on when many Js had passed. One day however I started receiving Js from other companys as well! I got more confused. How could these companies, with employees who where not particullary Internet savvy, have the same unbeknownst to me style of Internet slang? The clue lies in the character code for J, 0&#215;4A.</p>
<p style="text-align: center;"><img class="size-full wp-image-222 aligncenter" title="charactermap" src="/tech/wp-content/uploads/charactermap.gif" alt="charactermap" width="594" height="495" /></p>
<p style="text-align: left;">It turns out that J and a Wingdings smiley share the same character code 0&#215;4A. What was happening was that the persons where most likely typing a smiley which the e-mail system, Microsoft Exchange, automatically converted to a Wingdings smiley. I also examined the source code of the e-mail and found this to be true:</p>
<p><code> &lt;span style=3D'font-s=ize:11.0pt;font-family:Wingdings;color:#1F497D'&gt;J&lt;/span&gt;</code></p>
<p>Unfortunately neither my e-mail client nor gmail showed me the J in Wingdings, rather just a plain old J. So next time you see a random J, don&#8217;t get confused, it&#8217;s most likely a smiley!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F10%2F09%2Fwhat-does-j-mean%2F&amp;linkname=What%20does%20J%20mean%3F"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/10/09/what-does-j-mean/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Barrelfish</title>
		<link>http://www.fireflake.com/tech/2009/09/25/barrelfish/</link>
		<comments>http://www.fireflake.com/tech/2009/09/25/barrelfish/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 11:54:27 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[barrelfish]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[multi-core]]></category>
		<category><![CDATA[os]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=219</guid>
		<description><![CDATA[Slashdot informs me of Barrelfish, a new experimental operating system being developed in collaboration between ETH Zurich and Microsoft Research, Cambridge. And all I can think of is, somwhere some hacker is thinking &#8220;like shooting fish in a barrel&#8220;.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://tech.slashdot.org/story/09/09/24/238251/Microsoft-Releases-Prototype-of-Research-OS-Barrelfish">Slashdot</a> informs me of <a href="http://www.barrelfish.org/">Barrelfish</a>, a new experimental operating system being developed in collaboration between ETH Zurich and Microsoft Research, Cambridge. And all I can think of is, somwhere some hacker is thinking &#8220;<a href="http://en.wiktionary.org/wiki/like_shooting_fish_in_a_barrel">like shooting fish in a barrel</a>&#8220;.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F09%2F25%2Fbarrelfish%2F&amp;linkname=Barrelfish"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/09/25/barrelfish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone specific pages</title>
		<link>http://www.fireflake.com/tech/2009/09/22/iphone-specific-pages/</link>
		<comments>http://www.fireflake.com/tech/2009/09/22/iphone-specific-pages/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 14:10:57 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[page]]></category>
		<category><![CDATA[viewport]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=217</guid>
		<description><![CDATA[I recently learned some tips and tricks for developing webpages for the iPhone. There is really only one major difference that must be there for it to work properly. The viewport-meta.
&#60;meta name=&#8221;viewport&#8221; content=&#8221;width=320; user-scalable=true&#8221; /&#62;
This meta-tag explains to the iPhone what dimensions the page is intended to be viewed in. If this tag is not [...]]]></description>
			<content:encoded><![CDATA[<p>I recently learned some tips and tricks for developing webpages for the iPhone. There is really only one major difference that <em>must </em>be there for it to work properly. The viewport-meta.</p>
<p>&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=320; user-scalable=true&#8221; /&gt;</p>
<p>This meta-tag explains to the iPhone what dimensions the page is intended to be viewed in. If this tag is not supplied the iPhone will assume a width of 980 pixels. This way, even if you have made a page with &#8220;small&#8221; content it would still be scaled unless you also supplied the viewport-command.</p>
<p>If on iPhone, remember viewport!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F09%2F22%2Fiphone-specific-pages%2F&amp;linkname=iPhone%20specific%20pages"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/09/22/iphone-specific-pages/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Source Advertising?</title>
		<link>http://www.fireflake.com/tech/2009/09/21/open-source-advertising/</link>
		<comments>http://www.fireflake.com/tech/2009/09/21/open-source-advertising/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 13:50:00 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Open Source]]></category>
		<category><![CDATA[advertising]]></category>
		<category><![CDATA[commercial]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=215</guid>
		<description><![CDATA[In an interesting take on making advertising Slashdot reports of an &#8220;open source commercial&#8221;. Linux proponent Ken Starks created voice material for radio advertising that can be re-used by anyone who want to make their own Linux-commercial.
]]></description>
			<content:encoded><![CDATA[<p>In an interesting take on making advertising <a href="http://linux.slashdot.org/story/09/09/20/209211/Forkable-Linux-Radio-Ad-Now-On-the-Air-In-Texas">Slashdot reports</a> of an &#8220;open source commercial&#8221;. Linux proponent Ken Starks created voice material for radio advertising that can be re-used by anyone who want to make their own Linux-commercial.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F09%2F21%2Fopen-source-advertising%2F&amp;linkname=Open%20Source%20Advertising%3F"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/09/21/open-source-advertising/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to avoid a page being cached</title>
		<link>http://www.fireflake.com/tech/2009/06/16/how-to-avoid-a-page-being-cached/</link>
		<comments>http://www.fireflake.com/tech/2009/06/16/how-to-avoid-a-page-being-cached/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 08:06:53 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Expires]]></category>
		<category><![CDATA[no-cache]]></category>
		<category><![CDATA[Pragma]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=210</guid>
		<description><![CDATA[All web programmers have probably had trouble with browsers caching pages it ought not to. So what can we do about it? Well in good old HTTP 1.0 we had a nice header that simply said:
Pragma: no-cache
Easy huh? Yes. Probably to easy. If not browsers then sure some proxy server will dissobey that simple command [...]]]></description>
			<content:encoded><![CDATA[<p>All web programmers have probably had trouble with browsers caching pages it ought not to. So what can we do about it? Well in good old HTTP 1.0 we had a nice header that simply said:</p>
<p>Pragma: no-cache</p>
<p>Easy huh? Yes. Probably to easy. If not browsers then sure some proxy server will dissobey that simple command and require that we explain it to them more thoroughly. This brings on the next HTTP-command:</p>
<p>Expires: -1</p>
<p>Acctually any invalid date format will do, the meaning should be interpreted as &#8220;this page have ceased to be&#8221; [mental image of John Cleese banging a parrot on the desk]. Only problem is still some missbehaving browsers and proxys interpret this as &#8220;well you might have written an erranous date, so we play nice and cache the page for you still&#8221;. Cue HTTP 1.1 and we have another header:</p>
<p>Cache-control: no-cache</p>
<p>Oh, remember this directive? Easy huh? Heard it before. Yes, it&#8217;s to easy to be true as well. The problem with this one is that some missbehaving reverse-proxys apparently fails to deliver these pages through the proxy in what seems to be their inability to forward it since they are not allowed to save it. At least in my case it was a reverse proxy that seemed to think very little of pages it wasn&#8217;t allowed to keep. We had to give it &#8220;Cache-control: private&#8221; in order for it to acctually pass the page on. The obvious problem with this is that it no longer prehibits the end user agent (as opposed to a in the middle proxy) to cache the page.</p>
<p>Now all available headers have failed in some way, add to this that someone using HTTP 1.0 might try and send a cache-control which will fail due to it not being part of 1.0 or in reverse someone using 1.1 sending Pragma header which might be ignored due to being replaced by cache-control in 1.1.</p>
<p>What is a programmer to do? Well, since proxys have made me not rely on normal HTTP headers the next step is into HTML and the http-equiv META tags. Let&#8217;s blast the browser with everything we have:</p>
<p>&lt;meta http-equiv=&#8221;Expires&#8221; content=&#8221;-1&#8243;&gt;<br />
&lt;meta http-equiv=&#8221;Pragma&#8221; content=&#8221;no-cache&#8221;&gt;<br />
&lt;meta http-equiv=&#8221;Cache-Control&#8221; content=&#8221;no-cache&#8221;&gt;</p>
<p>Now no proxy should ever interfere with our headers. The problem with cache-control and pragma remains so if you use HTTP 1.0 the former is ignored and in 1.1 the latter. If we include both we are safe, at least until they decide to probably change the whole thing in a future 1.2 version. We also send the expires tag which should make its way all the way to the browser without being cached. Hopefully at least one of these will be treated with respect by the browser, this is even partly recommended in an old <a href="http://support.microsoft.com/kb/234067">KB-article from Microsoft</a>. Still http-equiv is not as safe as real HTTP headers, it requires the browsers to support them. Some support them better <a href="http://support.microsoft.com/kb/222064/">than others</a> (the article is old but still sends my head spinning in dissbelief).</p>
<p>Being dissillusioned by the current state of cache control (not the header, the subject) I ended up doing what probably most people are doing allready. Appending a random 10 character string to every call I ever make effectivly fooling the browser that this information might be improtant and making it update the page properly. Just append it to the back of every GET and include a random field in every POST.</p>
<p>http://www.fireflake.com/?cache=ds4R3HYh4</p>
<p>http://www.fireflake.com/?cache=BawqEw42cf</p>
<p>Not the same page. Obviously. Please don&#8217;t tell any browser developer this or they might include a &#8220;random cache of everything in the known universe&#8221;-feature in their next build.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F06%2F16%2Fhow-to-avoid-a-page-being-cached%2F&amp;linkname=How%20to%20avoid%20a%20page%20being%20cached"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/06/16/how-to-avoid-a-page-being-cached/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Serialize vs Database normalization</title>
		<link>http://www.fireflake.com/tech/2009/04/30/php-serialize-vs-database-normalization/</link>
		<comments>http://www.fireflake.com/tech/2009/04/30/php-serialize-vs-database-normalization/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 05:43:23 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reflections]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Edgar F Codd]]></category>
		<category><![CDATA[ER]]></category>
		<category><![CDATA[normal form]]></category>
		<category><![CDATA[normalization]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[serialize]]></category>
		<category><![CDATA[unserialize]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=203</guid>
		<description><![CDATA[I&#8217;ve recently started developing plugins for Wordpress in PHP. Being an old school Perl programmer PHP comes very easy and MySQL is still same old MySQL. PHP don&#8217;t have many advantages over Perl in general except one very good one: simplicity. I have always tried to write simple code, not simple in the sense that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve recently started developing plugins for Wordpress in PHP. Being an old school Perl programmer PHP comes very easy and MySQL is still same old MySQL. PHP don&#8217;t have many advantages over Perl in general except one very good one: simplicity. I have always tried to write simple code, not simple in the sense that it doesn&#8217;t accomplish complex tasks rather in the sense that while being a huge and complex system it is still built with easy to understand blocks of code. With that being said, there are a few shortcuts I rather not take.</p>
<p>The reason I write this is that in all the PHP applications and PHP documentation I&#8217;ve come across regarding serialize() nobody ever mentions database normalization.</p>
<p><strong>PHP Serialize</strong></p>
<p>I found <a href="http://se.php.net/serialize">the serialize() function in PHP</a> quite useful, it takes a datastructure and creates a string representation of that structure. This string can later be use with <a href="http://se.php.net/manual/en/function.unserialize.php">unserialize()</a> to return it to the old structure. An example:</p>
<blockquote>
<pre>$fruits = array (
"fruits"  =&gt; array("a" =&gt; "orange", "b" =&gt; "banana"),
"numbers" =&gt; array(1, 2, 3),
);

echo print_r($fruits);</pre>
</blockquote>
<p>The above code creates an array and prints the result. The output of the above will be:</p>
<blockquote>
<pre>Array
(
    [fruits] =&gt; Array
        (
            [a] =&gt; orange
            [b] =&gt; banana
        )

    [numbers] =&gt; Array
        (
            [0] =&gt; 1
            [1] =&gt; 2
            [2] =&gt; 3
        )
)</pre>
</blockquote>
<p>Now if you use serialize on this object the following would happen:</p>
<blockquote>
<pre>$fruits = serialize($fruits);

echo print_r($fruits);</pre>
</blockquote>
<p>Output:</p>
<blockquote>
<pre>1a:2:{s:6:"fruits";a:2:{s:1:"a";s:6:"orange";s:1:"b";s:6:"banana";}s:7:"numbers";a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}}1Array</pre>
</blockquote>
<p>A long line of strange numbers, just what the programmer wanted! This data is perfect for transfering or saving the state of a data structure for later use. Calling unserialize() on the above string would return it to the same array that we first had.</p>
<p><strong>Database Design</strong></p>
<p>Most applications use a <a href="http://en.wikipedia.org/wiki/Relational_database">relational database</a> for storing information. A relational database stores all data in tables of rows and columns (or relations of tuples and attributes if you use the original non-SQL names). To make a database work efficiently the design of those tables, rows and columns are pivotal. Any student of database design have probably been forced to read all of the different levels of <a href="http://en.wikipedia.org/wiki/Database_normalization">database normalization</a>. The normalization process, invented by Edgar F. Codd, involves searching for inefficient database design and correcting it.</p>
<p>The very first rule of database normalization called the first normal form (1NF) stipulates that &#8220;the table is a faithful representation of a relation and that it is free of repeating groups.&#8221; [<a href="http://en.wikipedia.org/wiki/First_normal_form">wikipedia</a>]. This means that there should be no duplicate rows and no column should contain multiple values.</p>
<p><strong>Serialization meets 1NF</strong></p>
<p>What happens if you insert the above serialized data into a column of a row in a database? Well put shortly you get a stored datastructure that can be easily accessed by your application by calling it with the keys for that particular row. The table would probably look something like this:</p>
<table border="0">
<caption> ArrayTable</caption>
<tbody>
<tr>
<th>key</th>
<th>value</th>
</tr>
<tr>
<td>1</td>
<td>1a:2:{s:6:&#8221;fruits&#8221;;a:2:{s:1:&#8221;a&#8221;;s:6:&#8221;orange&#8221;;s:1:&#8221;b&#8221;;s:6:&#8221;banana&#8221;;}s:7:&#8221;numbers&#8221;;a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}}1Array</td>
</tr>
<tr>
<td>2</td>
<td>1a:2:{s:6:&#8221;fruits&#8221;;a:2:{s:1:&#8221;a&#8221;;s:6:&#8221;apples&#8221;;s:1:&#8221;b&#8221;;s:6:&#8221;banana&#8221;;}s:7:&#8221;numbers&#8221;;a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}}1Array</td>
</tr>
</tbody>
</table>
<p>As long as you will never ever search for anything inside the value field this is all good and well (but still goes against my better teachings of database normalization). Take for example the problem of locating all stuctures containing apples or even worse something as simple as ordering the rows by fruit! The structure makes such &#8220;simple&#8221; tasks very hard.</p>
<p>The use of serialization to encode values into the database might be very tempting. It makes saving complex structures easy without having to worry about database design. Saving data in serialized form is however very inefficient from a database design standpoint, the data should have been stored in separate tables reflecting their internal structure.</p>
<p>As I said in the beginning simplicity is the highest virtue of programming for me, serialize is a simple neat solution for a small problem. What should be remembered though is that serialize is not a swizz army knife that should be used for all the database storage. If you ever think that you will need to search through or handle the information stored, do youself a favour and make it a proper table from the start. In the long run making those tables will be easier than later having to convert all those structures and complex code handling them.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F04%2F30%2Fphp-serialize-vs-database-normalization%2F&amp;linkname=PHP%20Serialize%20vs%20Database%20normalization"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/04/30/php-serialize-vs-database-normalization/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wordpress as a simple CRM</title>
		<link>http://www.fireflake.com/tech/2009/04/14/wordpress-as-a-simple-crm/</link>
		<comments>http://www.fireflake.com/tech/2009/04/14/wordpress-as-a-simple-crm/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 08:33:46 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Company]]></category>
		<category><![CDATA[CRM]]></category>
		<category><![CDATA[Customer]]></category>
		<category><![CDATA[Relations]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=184</guid>
		<description><![CDATA[I recently started a new business where I really want to focus on taking care of the customer needs, being proactive rather than reactive to them. As such I need a simple Customer Relations Management (CRM) tool to keep track of my promises and contacts. There are probably many simple CRM tools available but I [...]]]></description>
			<content:encoded><![CDATA[<p>I recently started a new business where I really want to focus on taking care of the customer needs, being proactive rather than reactive to them. As such I need a simple Customer Relations Management (CRM) tool to keep track of my promises and contacts. There are probably many simple CRM tools available but I decided to try out Wordpress as a CRM tool.</p>
<p>First I installed Wordpress on an internal server with no external connection. I set the firewall to block that server from traffic with the outside network and then I started to do my internal &#8220;company blog&#8221;. To structure things I decided to follow some simple rules:</p>
<ul>
<li>I make one post for every type of contact (e-mail / phone / order etc) I do every day, if several contacts to the same company / person occurs the same day they still only get one.</li>
<li>Several types of contact to the same company / person will get multiple posts the same day</li>
<li>Categories are other authorities, companies and/or persons</li>
<li>Tags are techniques, events, frameworks etc.</li>
</ul>
<p>On average I get three to four posts every day, usually covering a broad area. Some days there are big events which often are reflected in the blog/CRM by only having one post for that day. Amounts of posts per day is therefore irrelevant. I keep the posts very short, they are mainly thought of as references to other information like an e-mail or something else. If it was a phone conversation I usually take down a few simple sentances of what the discussion was about.</p>
<p>Three months later I now use this internal blog alot! It helps me keep track of events that I might have forgotten about. When I had a tax issue recently I could quickly click the &#8220;tax authority&#8221; category and see which days I had communicated with them and leave as a reference in my future communication.</p>
<p>One thing that also helps me is the simplicity of clicking a category to bring up all the communication with that customer. When someone calls I quickly click their category and all my previous conversations with them are recorded. It helps me quickly remember what we where talking about, just like a CRM should.</p>
<p>There are of course limitations, WordPress was never intended to be used this way. There are no way to search for inactive customers for example, should the need for this arise a plugin for WordPress could most certainly easily be developed. Furthermore you need to be very careful about where you install the software so you do not publish all your information on the Internet. I run my business alone but this setup would work very nice also with a few employees I would imagine. Everyone could be an author in the same blog and you can access what the other persons are working on should a customer call when they are out.</p>
<p>The simplicity of WordPress makes this a great choice for me!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F04%2F14%2Fwordpress-as-a-simple-crm%2F&amp;linkname=Wordpress%20as%20a%20simple%20CRM"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/04/14/wordpress-as-a-simple-crm/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>VISA PIN numbers stolen</title>
		<link>http://www.fireflake.com/tech/2009/04/01/visa-pin-numbers-stolen/</link>
		<comments>http://www.fireflake.com/tech/2009/04/01/visa-pin-numbers-stolen/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 17:19:05 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[American Express]]></category>
		<category><![CDATA[April]]></category>
		<category><![CDATA[Fool]]></category>
		<category><![CDATA[Hacked]]></category>
		<category><![CDATA[Hacker]]></category>
		<category><![CDATA[Haha]]></category>
		<category><![CDATA[MasterCard]]></category>
		<category><![CDATA[PIN]]></category>
		<category><![CDATA[Unsafe]]></category>
		<category><![CDATA[VISA]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=193</guid>
		<description><![CDATA[In one of the worst hacker attacks against on-line resources a hacker managed to get a full listing of all the PIN-numbers associated with VISA credit cards. Apparently also MasterCard and American Express have been compromised. This undermines the whole system of PIN code and credit card to ensure the safety of you money. Since [...]]]></description>
			<content:encoded><![CDATA[<p>In one of the worst hacker attacks against on-line resources a hacker managed to get a full listing of all the PIN-numbers associated with VISA credit cards. Apparently also MasterCard and American Express have been compromised. This undermines the whole system of PIN code and credit card to ensure the safety of you money. Since the list allready have been published on the Internet I link it here as a confirmation that the full list is out!</p>
<p><a href="http://www.fireflake.com/tech/wp-content/uploads/pin.txt">VISA PIN codes</a></p>
<p>Follow the link and use CTRL + F to search the file for your own PIN number, it&#8217;s there!</p>
<p>A new system for handling transaction verification will be needed, meanwhile we need to keep our eyes open watch out bank accounts!</p>
<p><strong>EDIT: April Fools! This was of course an April Fools joke. The file contains all numbers from 0000 to 9999 so obviously all PIN numbers are included.</strong></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F04%2F01%2Fvisa-pin-numbers-stolen%2F&amp;linkname=VISA%20PIN%20numbers%20stolen"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/04/01/visa-pin-numbers-stolen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The fall of free web services?</title>
		<link>http://www.fireflake.com/tech/2009/03/26/the-fall-of-free-web-services/</link>
		<comments>http://www.fireflake.com/tech/2009/03/26/the-fall-of-free-web-services/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 09:24:52 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Reflections]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[filefront]]></category>
		<category><![CDATA[Future]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Jeff Bezoz]]></category>
		<category><![CDATA[last.fm]]></category>
		<category><![CDATA[spotify]]></category>
		<category><![CDATA[TED]]></category>
		<category><![CDATA[Youtube]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=189</guid>
		<description><![CDATA[In recent news YouTube have reported they are removing copyrighted music from their service, Last.fm are starting to charge for their on-line radio station and FileFront just reported they have decided to close their servers. Is it the beginning of the end of the legally free on-line services we see? Granted illegal(?) services like thepiratebay.com [...]]]></description>
			<content:encoded><![CDATA[<p>In recent news <a href="http://entertainment.slashdot.org/article.pl?sid=09/03/25/2231239&amp;art_pos=3">YouTube have reported they are removing copyrighted music</a> from their service, <a href="http://slashdot.org/article.pl?sid=09/03/25/0132235">Last.fm are starting to charge</a> for their on-line radio station and <a href="http://games.slashdot.org/article.pl?sid=09/03/26/0443239&amp;art_pos=2">FileFront just reported they have decided to close their servers</a>. Is it the beginning of the end of the legally free on-line services we see? Granted illegal(?) services like <a href="http://thepiratebay.org/">thepiratebay.com</a> and similar networks still flourish despite being subject of a legal action in Sweden. With the recession of the world economy these services have a hard time to find investors that have money left to spend. Many times I&#8217;ve though to myself how these business can ever make money being almost totally free. Is the user demographics and associated commercial a high enough source of income to fund the large systems needed to host these popular services?</p>
<p>Someone once said that while we are all on the Internet today they prediceted that in the future we will be part of different sub-networks with login and identifications. The main infrastructure of the Internet will simply be left as an &#8220;illegal wasteland&#8221; of the digital era in which you only move about with caution.  This makes me think what if we are at the turning point right now? With the free services on decline this might be the time that more traditional business models starts to act on the Internet. Services like <a href="http://www.spotify.com/">Spotify</a> is an example of what I mean. A service that uses the Internet as infrastructure but is charges for access where you are no longer an anonymous user.</p>
<p>Last year I posted about <a href="http://www.fireflake.com/tech/2008/07/02/jeff-bezoz-talking-about-the-internet/">Jeff Bezoz talking about the future of the Internet on TED</a>. This talk is several years old and highlights the enormous potential for invention on a new medium like the Internet. Today we have alot of new technology based on the Internet as a service, his pioneering talk turned out to be sign of things to come. Today we have much higher ground to build business on the Internet from and with the well funded free services going down there should be much potential new business oppertunities.</p>
<p>Twenty years ago the Internet was mostly for Universities. Ten years ago the dotcom-boom came and passed. Today we stand on top of all the technology and business knowledge of the Internet and there simply have to be alot of oppertunities.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F03%2F26%2Fthe-fall-of-free-web-services%2F&amp;linkname=The%20fall%20of%20free%20web%20services%3F"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/03/26/the-fall-of-free-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Canonical links, SEO news</title>
		<link>http://www.fireflake.com/tech/2009/02/19/canonical-links-seo-news/</link>
		<comments>http://www.fireflake.com/tech/2009/02/19/canonical-links-seo-news/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 14:21:20 +0000</pubDate>
		<dc:creator>Magnus Lindgren</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[canonical]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://www.fireflake.com/tech/?p=185</guid>
		<description><![CDATA[Google, Yahoo and Microsoft have togheter announced the support of a new tag for web development where you can specify your canonical links. The point of this is to enable webmasters themselves to &#8220;point out&#8221; which page contains the original copy of certain information in case multiple copies are shown on the same page. In [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-186" style="border: 0pt none; margin: 5px;" title="google" src="/tech/wp-content/uploads/google.jpg" alt="google" width="143" height="57" />Google, Yahoo and Microsoft have togheter announced the support of a new tag for web development where you can specify your <a href="http://en.wikipedia.org/wiki/Canonical">canonical</a> links. The point of this is to enable webmasters themselves to &#8220;point out&#8221; which page contains the original copy of certain information in case multiple copies are shown on the same page. In essence, if multiple links into the website can display the same content you now have the ability to point the search engine to the page that you would rather have indexed.</p>
<p>The code is quite simple, on each page where the information can be found simply add the following tag:</p>
<p>&lt;link rel=&#8221;canonical&#8221; href=&#8221;http://www.example.com/destination.php&#8221; /&gt;</p>
<p>This will inform the search engine of which of the pages is the true origin of the information and which are only redundant copies. For more detailed explenation of the new tag visit the <a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html">Official Google Webmaster Central</a>.</p>
<p>I bet many CMS authors right now are digging into their code to add support for this new convention.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.fireflake.com%2Ftech%2F2009%2F02%2F19%2Fcanonical-links-seo-news%2F&amp;linkname=Canonical%20links%2C%20SEO%20news"><img src="http://www.fireflake.com/tech/wp-content/plugins/add-to-any/share_save_120_16.gif" width="120" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.fireflake.com/tech/2009/02/19/canonical-links-seo-news/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
