<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

 <title>Librador</title>
 
 <link href="http://www.librador.com" />
 <updated>2009-11-06T20:16:21+01:00</updated>
 <id>http://www.librador.com/</id>
 
 <author>
   <name>Martin Vilcans</name>
   
 </author>
 

 
 <link rel="self" href="http://feeds.feedburner.com/Librador" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
   <title>Which browser is this?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/vSYPEuUCci4/" />
   <updated>2009-11-06T00:00:00+01:00</updated>
   <id>http://www.librador.com/2009/11/06/Which-browser-is-this</id>
   <content type="html">&lt;p&gt;Can you guess which web browser boasts the following features?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Personal annotations with GUI annotation entry dialog; annotations can later be edited or deleted, and hyperlinks to existing annotations are inlined into subsequent accesses of an annotated document. (Note: any document from any server via any access method can be annotated.)&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Audio (voice) annotations with GUI for controlling recording process.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Annotating web pages is a useful feature. I personally don&amp;#8217;t feel much need for audio annotations, but you may if you&amp;#8217;re a doctor or a dyslectic. Or if you&amp;#8217;re browsing on a device without a proper keyboard, like mobile phone or tablet PC (which seem to be on their way to a comeback).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for accessing documents and data through Gopher, WAIS, World Wide Web, FTP, NNTP/Usenet news, Techinfo, TeXinfo, Telnet, tn3270, Archie, NCSA DMF, local files, and other sources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That&amp;#8217;s an impressive list of protocols, but I miss XMPP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No config or resource file installation required; self-contained executable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good for running from a USB stick!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transparent and automatic uncompression of compressed (.Z) and gzip&amp;#8217;d (.z) files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nice feature, although zip support would be useful too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inlined images in formatted (HTML) text: X bitmaps and GIF images can be included anywhere inside a document, and can act as hyperlink anchors. Image files themselves can be located anywhere on the network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What!? Is the &lt;code&gt;img&lt;/code&gt; tag a feature worthy of being on a feature list?&lt;/p&gt;

&lt;p&gt;Yes, it is. Or at least it &lt;em&gt;was&lt;/em&gt; when this browser was released. Support for the &lt;code&gt;img&lt;/code&gt; tag was new back then. I recommend &lt;a href='http://diveintomark.org/archives/2009/11/02/why-do-we-have-an-img-element'&gt;this post by Mark Pilgrim&lt;/a&gt; about the history of the &lt;code&gt;img&lt;/code&gt; tag. The answer to the question is:&lt;/p&gt;

&lt;p&gt;These are the relase notes for the &lt;strong&gt;beta version of Mosaic 0.10&lt;/strong&gt;. Released in 1993.&lt;/p&gt;

&lt;p&gt;There are a few features on the list that modern browsers don&amp;#8217;t support. Document annotations are one. Here&amp;#8217;s another:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrated with NCSA Collage and NCSA DTM to broadcast documents into real-time networked workgroup collaboration sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&amp;#8217;m not sure exactly what this is, but collaborative document editing was a feature that the web was designed for from the start. That&amp;#8217;s why the HTTP protocol includes a PUT verb. Unfortunately collaborative editing didn&amp;#8217;t take off until the Wiki was invented.&lt;/p&gt;

&lt;p&gt;Below are some of my favourites that new browser&amp;#8217;s wouldn&amp;#8217;t boast about in their feature lists.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully 8-bit clean for formatted and plain text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today you can&amp;#8217;t trust all applications to support Unicode. Back in the days, you couldn&amp;#8217;t even trust them to support 8-bit character sets. (&lt;a href='/2009/05/13/7-bit-characters-today/'&gt;And there still is software that doesn&amp;#8217;t!&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Friendly X/Motif user interface.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Color and monochrome default X resource settings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ah, support for monochrome displays! Good for the Kindle!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Multiple independent toplevel windows.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Hotlist/bookmark capability &amp;#8211; keep list of interesting documents, add/remove items, list is persistent across sessions.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;In-document search capability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Windows! Bookmarks! &amp;#8220;Find&amp;#8221; command! Not that impressive by today&amp;#8217;s standards.&lt;/p&gt;

&lt;p&gt;The original Usenet post is &lt;a href='http://groups.google.com/group/alt.hypertext/msg/7fde2f6d4d5dc4e7'&gt;available on Google Groups&lt;/a&gt;, but since &lt;a href='http://www.wired.com/epicenter/2009/10/usenet/'&gt;Google don&amp;#8217;t seem to care much for the Usenet archive&lt;/a&gt;, I&amp;#8217;m posting a copy below. Have fun and be amazed both at how much has happened since back then, and how much &lt;em&gt;hasn&amp;#8217;t&lt;/em&gt; happened.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Newsgroups: comp.infosystems.gopher,comp.infosystems.wais,comp.infosystems,alt.hypertext,comp.windows.x
Path: sparky!uunet!wupost!zaphod.mps.ohio-state.edu!uwm.edu!linac!uchinews!ux1.cso.uiuc.edu!news.cso.uiuc.edu!128.174.5.61!marca
From: ma...@ncsa.uiuc.edu (Marc Andreessen)
Subject: NCSA Mosaic for X 0.10 available.
Date: Mon, 15 Mar 1993 03:56:00 GMT
Message-ID: &amp;lt;MARCA.93Mar14225600@wintermute.ncsa.uiuc.edu&amp;gt;
Sender: use...@news.cso.uiuc.edu (Net Noise owner)
X-Md4-Signature: b3b784c3820df435ac2ef2cc3f6f802f
Organization: Nat&amp;#39;l Center for Supercomputing Applications
Lines: 154

Beta version 0.10 of Mosaic, NCSA&amp;#39;s X/Motif-based networked
information systems browser, including full source code and binaries
(for SunOS 4.x, SGI IRIX 4.x, AIX 3.2, and DEC Ultrix), is now at
ftp.ncsa.uiuc.edu in /Web/xmosaic:

file://ftp.ncsa.uiuc.edu/Web/xmosaic/xmosaic-0.10.tar.Z
                         .../xmosaic/binaries-0.10/xmosaic-sun.Z
                         .../xmosaic/binaries-0.10/xmosaic-sgi.Z
                         .../xmosaic/binaries-0.10/xmosaic-ibm.Z
                         .../xmosaic/binaries-0.10/xmosaic-dec.Z

NCSA Mosaic provides a consistent and easy-to-use hypermedia-based
interface into a wide variety of information sources, including
Gopher, WAIS, World Wide Web, NNTP/Usenet news, Techinfo, TeXinfo,
FTP, local filesystems, Archie, telnet, tn3270, and others.  A list of
changes made since version 0.9 follows this canonical features list:

 o Support for accessing documents and data through Gopher, WAIS,
   World Wide Web, FTP, NNTP/Usenet news, Techinfo, TeXinfo,
   Telnet, tn3270, Archie, NCSA DMF, local files, and other sources.
 o Friendly X/Motif user interface.
 o Color and monochrome default X resource settings.
 o Multiple independent toplevel windows.
 o History list per window (both &amp;#39;where you&amp;#39;ve been&amp;#39; and &amp;#39;where you
   can go&amp;#39;).
 o Global history with previously visited locations visually distinct;
   global history is persistent across sessions.
 o Hotlist/bookmark capability -- keep list of interesting documents,
   add/remove items, list is persistent across sessions.
 o Personal annotations with GUI annotation entry dialog; annotations
   can later be edited or deleted, and hyperlinks to existing annotations
   are inlined into subsequent accesses of an annotated document. (Note:
   any document from any server via any access method can be
   annotated.)
 o Audio (voice) annotations with GUI for controlling recording process
   (SGI and Sun only).
 o Support for recognizing and handling GIF, JPEG, TIFF, audio, AIFF,
   DVI, MPEG, MIME, XWD, RGB, PostScript documents and forking
   off appropriate viewers.
 o Transparent and automatic uncompression of compressed (.Z) and
   gzip&amp;#39;d (.z) files.
 o Inlined images in formatted (HTML) text: X bitmaps and GIF images
   can be included anywhere inside a document, and can act as hyperlink
   anchors. Image files themselves can be located anywhere on the
   network.
 o Binary transfer mode, for pulling down arbitrary binary files and
   saving them to local disk without viewing them.
 o In-document search capability.
 o Fully 8-bit clean for formatted and plain text.
 o Options for new window per document (aka TurboGopher interface)
   -- always, or via middle mouse button.
 o On-the-fly font and hyperlink style selection.
 o Many common document and data source choices accessible via
   menubar.
 o Keyword search capability (for WAIS, Gopher, Archie, etc.).
 o Cut and paste formatted text into other X windows.
 o Smart handling of documents too big for single X window -- virtual
   document pages via inlined hypertext.
 o Save/mail/print documents in several formats.
 o Online hypertext help and FAQ list.
 o No config or resource file installation required; self-contained
   executable.
 o Extremely customizable.
 o Integrated with NCSA Collage and NCSA DTM to broadcast
   documents into real-time networked workgroup collaboration
   sessions.

A list of changes made from version 0.9 to version 0.10 follows:

 o Support for &amp;lt;IMG&amp;gt; tag: inlined images in HTML documents.
    o Handles X bitmap and GIF formats so far.
    o New resource, colorsPerInlinedImage, can be used to restrict
      color use of inlined images -- default is 50.
    o Image files can be located anywhere on the net (pointed to by
      URL); image data is cached in memory for fast display and
      reuse.
    o Example of inlined bitmap: 
      &amp;lt;IMG SRC=&amp;quot;file://foobar.com/foobar.xbm&amp;quot;&amp;gt;
    o Example of inlined image serving as anchor: 
      &amp;lt;A HREF=&amp;quot;http://foobar.com/ref.html&amp;quot;&amp;gt; 
      &amp;lt;IMG SRC=&amp;quot;file://foobar.com/blagh.gif&amp;quot;&amp;gt; &amp;lt;/A&amp;gt;
 o Better support for acting as binary file retrieval client.
    o Each window can either be in binary transfer mode or not;
      resource binaryTransferMode controls startup value (default
      is &amp;#39;False&amp;#39;, and you probably don&amp;#39;t want to change this). A
      toggle button in the Options menu allows changing on the fly.
    o If a window is not in binary trasfer mode, data files with
      unrecognized types will be displayed in the window as either
      plain text or HTML (depending on the server type), as before.
    o If a window is in binary transfer mode, data files with
      unrecognized types will be dumped to a local file after being
      transferred over as binary data.
    o Regardless of whether a window is in binary transfer mode or
      not, files with recognizes types (images, sound, etc.) will be
      handled as usual, and uncompression will be transparent as
      usual.
    o The whole point of all this is to allow the user to select on the
      fly how a given file of an unrecognized type is to be handled.
    o Because files are currently typed by filename extension,
      binary transfer mode should generally be kept off, otherwise
      it will screw up things like WAIS searches pretty badly. Also,
      since Gopher does things differently from everyone else,
      things are different there too.
    o Setting one of the multimedia resources to the text string
      &amp;quot;dump&amp;quot; will cause files of that type to be dumped to local
      disk as though in binary transfer mode.
    o See http://hoohoo.ncsa.uiuc.edu:80/mosaic-docs/file-typing-issues.html 
      for a more thorough discussion of these issues.
 o Audio annotations for Sun&amp;#39;s with /usr/demo/SOUND/record (or
   something similar) are now enabled. Resources
   recordCommandLocation and recordCommand are used to specify the
   command used to record sound; theoretically, this approach can be
   used on any platform with appropriate hardware and software,
   although SGI Indigo &amp;amp; Sun Sparcstation are the only two that I know
   of.
 o Search capability within documents: enter search term, scrollbar
   jumps to match and match is highlighted; repeat as desired.
 o Enhanced support for various Gopher types, including binary files
   and CSO phonebooks (sorry, phonebooks aren&amp;#39;t supported yet, but at
   least now an error message shows up).
 o Spaces converted to +&amp;#39;s in keyword queries now.
 o Scrollbar arrows now increment a reasonable amount when viewing
   large documents.
 o Anonymous FTP password is now always u...@host.domain,
   enabling access to every strange FTP server out there that I know of.
 o Pattern-matching to determine file type based on file name now uses
   caseless string compare.
 o Better default visited anchor color for non-SGI color displays.
 o Messages from libwww now show up in pop-up dialogs like they
   should.
 o Telnet never gets asked to use unrecognized -l flag.
 o Tar files are now always retrieved to local disk (and not displayed).
 o Replacement (and better) Archie interface.
 o Mail Developers window is cleared on each use.
 o New resource trackVisitedAnchors; can be used to turn off tracking
   of visited anchors altogether.
 o Better transparent uncompression support:
    o Gzipped (.z) files are now recognized and uncompressed on
      the fly (as well as .Z files, as before).
    o New resources uncompressCommand (default &amp;#39;uncompress&amp;#39;)
      and gunzipCommand (default &amp;#39;gunzip&amp;#39;).
 o As usual, little bugfixes and cleanups.

Finally, thanks *again* to everyone who&amp;#39;s been contributing comments
and bug reports -- keep &amp;#39;em coming!

Cheers,
Marc

--
Marc Andreessen
Software Development Group
National Center for Supercomputing Applications
ma...@ncsa.uiuc.edu&lt;/code&gt;&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=vSYPEuUCci4:RBBbRI36Guo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=vSYPEuUCci4:RBBbRI36Guo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=vSYPEuUCci4:RBBbRI36Guo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=vSYPEuUCci4:RBBbRI36Guo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=vSYPEuUCci4:RBBbRI36Guo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=vSYPEuUCci4:RBBbRI36Guo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/vSYPEuUCci4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/11/06/Which-browser-is-this/</feedburner:origLink></entry>
 
 <entry>
   <title>Styling undefined tag names in HTML</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/bmhJOJ53mmE/" />
   <updated>2009-10-20T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML</id>
   <content type="html">&lt;p&gt;Realization after &lt;a href='http://www.molly.com/'&gt;Molly Holzschlag&lt;/a&gt;&amp;#8217;s presentation about HTML5 at today&amp;#8217;s &lt;a href='http://robertnyman.com/geekmeet/'&gt;Geek meet&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can use any tag name in HTML, and it will be part of the DOM and can be styled.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, the following HTML:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Some text in &amp;lt;red&amp;gt;another colour&amp;lt;/red&amp;gt;!&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;styled with the following CSS:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;red { color: red; }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&amp;#8230;gives the following result:&lt;/p&gt;
&lt;span class='image'&gt;&lt;a href='/images/blog/red-element.png'&gt;&lt;img src='/images/blog/red-element.png' height='32' alt='' width='245' /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;I have always somehow assumed that elements with unknown names (such as &lt;code&gt;red&lt;/code&gt;) were stripped out and ignored by the browser, but obviously they aren&amp;#8217;t (at least not in Firefox).&lt;/p&gt;

&lt;p&gt;The nice thing with this is that you can already start using elements that are defined in HTML5 but that old browsers don&amp;#8217;t recognize:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;header&amp;gt;
    &amp;lt;h1&amp;gt;My cat&amp;#39;s home page&amp;lt;/h1&amp;gt;
&amp;lt;/header&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;red&amp;gt;Meow!&amp;lt;/red&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;footer&amp;gt;
    &amp;lt;p&amp;gt;© 2009 My Cat&amp;lt;/p&amp;gt;
&amp;lt;/footer&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here the content of the &lt;code&gt;header&lt;/code&gt; and &lt;code&gt;footer&lt;/code&gt; elements will be displayed and can be styled with CSS, even if the browser doesn&amp;#8217;t know the semantics of them. Newer browsers and search engines can use them to provide a better user experience.&lt;/p&gt;

&lt;p&gt;This may be old news to some, and I just realized it today! Well, I don&amp;#8217;t claim to be an HTML expert either. I don&amp;#8217;t know if any of this is standards-compliant &lt;del&gt;and I've only tested it on Firefox&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update Oct 21st&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It works in Chrome as well.&lt;/p&gt;

&lt;p&gt;In Internet Explorer (I tested IE6 and IE7), the &lt;code&gt;&amp;lt;red&amp;gt;&lt;/code&gt; element is part of the DOM and I can retrieve it with &lt;code&gt;document.getElementsByTagName(&amp;#39;red&amp;#39;)&lt;/code&gt;. I can set its style, but IE&amp;#8217;s rendering engine ignores it.&lt;/p&gt;

&lt;p&gt;As &lt;a href='http://robertnyman.com/'&gt;Robert Nyman&lt;/a&gt; mentioned in the comments, &lt;a href='http://ejohn.org/blog/html5-shiv/'&gt;there is a workaround&lt;/a&gt;. It is as simple as it is unexpected. Just create elements of the types you need with Javascript:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
document.createElement(&amp;quot;header&amp;quot;);
document.createElement(&amp;quot;footer&amp;quot;);
document.createElement(&amp;quot;red&amp;quot;);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just creating elements, even without inserting them into the document seems to do some magic that kicks IE into handling the previously undefined elements.&lt;/p&gt;

&lt;p&gt;&lt;a href='/data/unknown-elements.html'&gt;Test file&lt;/a&gt; (includes the IE hack)&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bmhJOJ53mmE:M_exi8klvjg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bmhJOJ53mmE:M_exi8klvjg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=bmhJOJ53mmE:M_exi8klvjg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bmhJOJ53mmE:M_exi8klvjg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=bmhJOJ53mmE:M_exi8klvjg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bmhJOJ53mmE:M_exi8klvjg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/bmhJOJ53mmE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/10/20/Styling-undefined-tag-names-in-HTML/</feedburner:origLink></entry>
 
 <entry>
   <title>“Better than nothing” error handling</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/sR-p7Ei6H3w/" />
   <updated>2009-10-17T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/10/17/Better-than-nothing-error-handling</id>
   <content type="html">&lt;p&gt;In my current project for a client, we have a script that launches a web server. The final lines of its output looks like this. Sensitive information (to a paranoid client) has been edited out and the important parts are highlighted.&lt;/p&gt;
&lt;span class='image'&gt;&lt;a href='/images/blog/run_apache.png'&gt;&lt;img src='/images/blog/run_apache_640x317.png' height='317' alt='' width='640' /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;The script runs Apache httpd as the final step. In this configuration Apache requires the F: drive to be mapped to a specific network share. The nice thing about the script is that it tells you exactly that, so if you get the &lt;em&gt;DocumentRoot must be a directory&lt;/em&gt; error you know what the problem is. (The fact that the error message itself is not very informative is Apache&amp;#8217;s fault.)&lt;/p&gt;

&lt;p&gt;Granted, it would be better if the Apache configuration didn&amp;#8217;t need a specific network share to be mapped. Or at least that the script created the drive mapping automatically.&lt;/p&gt;

&lt;p&gt;But this kind of simple error &amp;#8220;handling&amp;#8221; is so much better than not handling the problem at all, which would waste time as each developer would have to try to find out its cause without any hints.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=sR-p7Ei6H3w:yPN_8bvoHBU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=sR-p7Ei6H3w:yPN_8bvoHBU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=sR-p7Ei6H3w:yPN_8bvoHBU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=sR-p7Ei6H3w:yPN_8bvoHBU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=sR-p7Ei6H3w:yPN_8bvoHBU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=sR-p7Ei6H3w:yPN_8bvoHBU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/sR-p7Ei6H3w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/10/17/Better-than-nothing-error-handling/</feedburner:origLink></entry>
 
 <entry>
   <title>Object orientation — not as natural as we thought?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/DQsaiKtpaUo/" />
   <updated>2009-09-29T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/09/29/Object-orientation-not-as-natural-as-we-thought</id>
   <content type="html">&lt;p&gt;Back in 1999 or so I held a course in object oriented (OO) programming and design. I remember myself saying that an important idea of OO is that it reflects how we humans think. We think of the world as consisting of objects and how they interact. That maps well with OO&amp;#8217;s view of a system as a set of objects that send messages to each other. So in theory, OO should feel natural to us humans. It should be easy to express our thoughts as objects that pass messages to each other.&lt;/p&gt;

&lt;p&gt;So how come object oriented programs are so riddled with classes that are nothing but shallow wrappers for functions? Those classes don&amp;#8217;t represent a natural object in the problem domain. They are just clumsy object oriented shells around a functional or procedural design. If you have programmed Java you know what I mean; those classes that typically have names ending in -Handler or -Manager. Their sole purpose is to provide &lt;em&gt;functionality&lt;/em&gt; and would be better implemented as &lt;em&gt;functions&lt;/em&gt;. Java doesn&amp;#8217;t allow free functions. Instead, a function has to be a member of a class, so typical Java code contains lots of pointless classes that just serve as function wrappers.&lt;/p&gt;

&lt;p&gt;Now some people say that this is not &amp;#8220;proper&amp;#8221; object orientation, and they would be right. But think about it. Even though Java has practically forced us to design computer systems based on objects and classes for over a decade now, we still resist. We think of our systems as — at least partially — consisting of functions and not just objects. It seems like our minds are not so naturally inclined to solve problems by dividing them into objects after all.&lt;/p&gt;

&lt;p&gt;OO is a powerful tool, but it probably shouldn&amp;#8217;t be the one and only paradigm that you use in a system. You should be able to mix procedural, functional and OO style in a pragmatic way. Steve Yegge&amp;#8217;s old well written rant about the &lt;a href='http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html'&gt;Kingdom of Nouns&lt;/a&gt; says this in more clever and amusing way than I can, so I&amp;#8217;ll leave it at that.&lt;/p&gt;

&lt;p&gt;Instead of Java, I&amp;#8217;d recommend programming language that allows multi-paradigm programming. Either that, or use &lt;em&gt;proper&lt;/em&gt; OO. Whatever that is. One thing&amp;#8217;s obvious: It&amp;#8217;s not something that comes naturally to us.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=DQsaiKtpaUo:KgdzmiQMw_s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=DQsaiKtpaUo:KgdzmiQMw_s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=DQsaiKtpaUo:KgdzmiQMw_s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=DQsaiKtpaUo:KgdzmiQMw_s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=DQsaiKtpaUo:KgdzmiQMw_s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=DQsaiKtpaUo:KgdzmiQMw_s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/DQsaiKtpaUo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/09/29/Object-orientation-not-as-natural-as-we-thought/</feedburner:origLink></entry>
 
 <entry>
   <title>Backing up DVDs in Ubuntu</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/9wd0MX4lpNk/" />
   <updated>2009-09-25T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/09/25/Backing-up-DVDs-in-Ubuntu</id>
   <content type="html">&lt;p&gt;We&amp;#8217;re in the middle of the episode where Bamse and his friends are trying to get rid of the huge dragon that has claimed his place right beside grandmother&amp;#8217;s house. The dragon cries for more of grandmother&amp;#8217;s meatballs, but she can&amp;#8217;t make enough of them. The dragon breathes fire and makes annoying noises. This is too much even for nice old granny. Bamse and his friends decide to visit Skalman. He is smart (although quite a bit excentric). He must know how to get rid of the dragon.&lt;/p&gt;

&lt;p&gt;But then the DVD stops.&lt;/p&gt;

&lt;p&gt;My son is almost two and a half and understands that DVDs can be broken. He just doesn&amp;#8217;t understand that he&amp;#8217;s the one who breaks them by not handling them very well.&lt;/p&gt;

&lt;p&gt;So right now I&amp;#8217;m making backups of the rest of his movies.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m using Ubuntu 9.04 for this, and here&amp;#8217;s my notes about it in case I forget and/or someone else is interested. It may work in other Linux distributions or other versions of Ubuntu, but I haven&amp;#8217;t tested that.&lt;/p&gt;

&lt;p&gt;I use command-line programs because they are quicker to run over and over compared to GUI applications.&lt;/p&gt;

&lt;p&gt;First, I installed &lt;code&gt;vobcopy&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install vobcopy&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vobcopy can decrypt DVDs while copying, and needs &lt;code&gt;libdvdcss&lt;/code&gt; for that. Since CSS decryption code may not be allowed in some countries, it is not included in Ubuntu&amp;#8217;s default repositories. It is still simple to install &lt;code&gt;libdvdcss&lt;/code&gt;. Just run the following command (first checking that it&amp;#8217;s legal where you live of course).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /usr/share/doc/libdvdread4/install-css.sh&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now I can copy the DVD to the hard disk with the following command:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vobcopy -m -t bamse&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The -m flag to &lt;code&gt;vobcopy&lt;/code&gt; creates a clone of the whole DVD. The -t flag sets the name of the directory that vobcopy creates, in this case &lt;code&gt;bamse&lt;/code&gt;. (The default name is the same as the DVD&amp;#8217;s volume name, which is sometimes cryptic and not unique.)&lt;/p&gt;

&lt;p&gt;I can play the movie by opening the &lt;code&gt;bamse/VIDEO_TS&lt;/code&gt; directory in &lt;a href='http://www.videolan.org/vlc/'&gt;VNC&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With backups in place, I don&amp;#8217;t have to worry so much when my son handles his DVDs. I&amp;#8217;ll get back to this subject the first time I burn a DVD from a backup. Meanwhile, I&amp;#8217;ll check if it is somehow possible to repair a broken DVD, or at least backup the chapters that still work. In the episode after the one with the dragon, the dragon is gone, so probably Skalman figured out a way to get rid of it. I honestly don&amp;#8217;t mind so much if I never figure out how he did it.&lt;/p&gt;

&lt;p&gt;Information sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.andrews-corner.org/burning.html'&gt;CD and DVD Writing from the Linux Command Line&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html'&gt;Linux Tutorial: Burning a CD or DVD&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='https://help.ubuntu.com/community/RestrictedFormats'&gt;Community Ubuntu Documentation: RestrictedFormats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=9wd0MX4lpNk:wqjkEUDeIkw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=9wd0MX4lpNk:wqjkEUDeIkw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=9wd0MX4lpNk:wqjkEUDeIkw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=9wd0MX4lpNk:wqjkEUDeIkw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=9wd0MX4lpNk:wqjkEUDeIkw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=9wd0MX4lpNk:wqjkEUDeIkw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/9wd0MX4lpNk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/09/25/Backing-up-DVDs-in-Ubuntu/</feedburner:origLink></entry>
 
 <entry>
   <title>200 text messages a day: Young people's mobile habits</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/LL7uJYJZnRw/" />
   <updated>2009-08-26T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/08/26/200-text-messages-a-day-Young-peoples-mobile-habits</id>
   <content type="html">&lt;p&gt;How do you have the time to send 200 SMS messages in a day? Assuming a healthy eight hours of sleep, 200 text messages in a day means sending at least one every five minutes. This is a typical day for 13 year old Marina, who was interviewed by &lt;a href='http://tomorrowstory.se/'&gt;The Tomorrow Story&lt;/a&gt; for a report on young people&amp;#8217;s mobile habits. (&lt;a href='http://www.tomorrowstory.se/files/Unga_Mobilvanor.pdf'&gt;Available as a PDF in Swedish&lt;/a&gt;.) According to the report, Marina&amp;#8217;s affection to SMS is not extreme, and typical for her age group.&lt;/p&gt;

&lt;p&gt;So they like Short Messaging Service, but that is low-tech. What new mobile technology do the young people of today use? The report paints a picture of the teenagers as a conservative bunch, tech-wise. None of them uses MMS. Very few access the web from their phones. They are not interested in mobile television. They don&amp;#8217;t install applications. It seems like the young generation would be happy with &amp;#8220;old folk&amp;#8221; mobiles with only phone and SMS functionality.&lt;/p&gt;

&lt;p&gt;There is one technology that they use more than I had expected: Bluetooth. This makes sense since kids tend to have their friends at a close distance. They see each other every day in school, so they can wait until they meet to transfer the music or photo they want their friends to have. On the other hand, they text to someone a few meters away instead of waiting until class is over, so they&amp;#8217;re not consistently patient.&lt;/p&gt;

&lt;p&gt;When young people&amp;#8217;s behaviour starts getting mysterious, you&amp;#8217;re getting old, so I&amp;#8217;ll better stop before I start to sound like a whining old man. But 200 text messages a day — sheesh!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=LL7uJYJZnRw:HgXq0p-OoAU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=LL7uJYJZnRw:HgXq0p-OoAU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=LL7uJYJZnRw:HgXq0p-OoAU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=LL7uJYJZnRw:HgXq0p-OoAU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=LL7uJYJZnRw:HgXq0p-OoAU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=LL7uJYJZnRw:HgXq0p-OoAU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/LL7uJYJZnRw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/08/26/200-text-messages-a-day-Young-peoples-mobile-habits/</feedburner:origLink></entry>
 
 <entry>
   <title>Jekyll: Blogging like a hacker</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/_JHOC7V-dG8/" />
   <updated>2009-08-17T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/08/17/Jekyll-blogging-like-a-hacker</id>
   <content type="html">&lt;p&gt;I wrote &lt;a href='/2005/05/26/PS3-and-parallell-programming/'&gt;the first post&lt;/a&gt; on this site in 2005 using &lt;a href='http://www.s9y.org'&gt;Serendipity&lt;/a&gt;. While Serendipity is a completely adequate blogging engine, I have been annoyed by a few things. All of them would apply to any popular blogging engine, which is why I wanted something different. I have now found a tool that takes a very different approach.&lt;/p&gt;

&lt;p&gt;Before I go into that, let&amp;#8217;s list the things that didn&amp;#8217;t feel right with a &amp;#8220;classical&amp;#8221; blogging engine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Serendipity is written in PHP. This is good since there are plenty of ISPs that can host PHP sites. Unfortunately I&amp;#8217;m no PHP hacker myself, so it is not easy for me to change the internal workings of the site.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;I have more interesting things to do than keeping up with the latest versions of the software. It is especially worrying if I don&amp;#8217;t have the time to install security patches. This would apply no matter what blogging engine i chose. As long as there is server-side code, there is a risk of security holes.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;I&amp;#8217;m a programmer. I&amp;#8217;m used to working with text files. I can manipulate them with tools for version control, utilities like grep and sed, programming languages like Python and Ruby and any text editor of my liking. Entering text into a form on a web page may be easier for a non-programmer, but I have other usability requirements. (Also, with a web form text can easily get lost. I&amp;#8217;ve been &lt;a href='/2008/12/02/Saved-by-tcpdump/'&gt;saved by tcpdump&lt;/a&gt; more than once.)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enter &lt;a href='http://jekyllrb.com/'&gt;Jekyll&lt;/a&gt;. It works on very simple premises. A blog post is a file. Plain and simple. It&amp;#8217;s not hidden in a database on your ISPs server. You can edit and manipulate the file with any tools you like. You can write the code in HTML if you want, but most of the time I prefer &lt;a href='http://daringfireball.net/projects/markdown/'&gt;Markdown&lt;/a&gt; which is also supported (or in fact encouraged).&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s what the file for this blog post looks like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;---
layout: post
title: &amp;quot;Jekyll: Blogging like a hacker&amp;quot;
tags:
  - jekyll
  - blogging
---
I wrote [the first post](/2005/05/26/PS3-and-parallell-programming/) on this
site in 2005 using [Serendipity](http://www.s9y.org). While Serendipity
is a completely adequate blogging engine, I have been annoyed by a few things.
All of them would apply to any popular blogging engine, which is why I
wanted something different. I have now found a tool that takes
a very different approach.

Before I go into that, let&amp;#39;s list the things that didn&amp;#39;t feel right with a
&amp;quot;classical&amp;quot; blogging engine:

1. Serendipity is written in PHP. This is good since there are plenty of ISPs
that can host PHP sites. Unfortunately I&amp;#39;m no PHP hacker myself, so it is not
easy for me to change the internal workings of the site.

2. I have more interesting things to do than keeping up with the latest versions
of the software. It is especially worrying if I don&amp;#39;t have the time to install
security patches. This would apply no matter what blogging engine i chose. As
long as there is server-side code, there is a risk of security holes.

3. I&amp;#39;m a programmer. I&amp;#39;m used to working with text files. I can manipulate them
with tools for version control, utilities like grep and sed, programming
languages like Python and Ruby and any text editor of my liking. Entering text
into a form on a web page may be easier for a non-programmer, but I have other
usability requirements. (Also, with a web form text can easily get lost. I&amp;#39;ve
been [saved by tcpdump](/2008/12/02/Saved-by-tcpdump/) more than once.)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Static pages, like my &lt;a href='/contact/'&gt;contact page&lt;/a&gt; are generated from similar files. When I run the &lt;em&gt;jekyll&lt;/em&gt; command, Jekyll reads all the files and generates static HTML files that can then be uploaded to the ISP. This means no server-side code and no security vulnerabilities. A blog is basically a bunch of static pages, so for a blog with low update frequency, there should be no need to store the posts in a database. And for a high traffic site, static files is very likely to give better performance.&lt;/p&gt;

&lt;p&gt;The comments are the only dynamic part of this site. For those I use &lt;a href='http://disqus.com'&gt;Disqus&lt;/a&gt;. It is convenient not to have to worry about spam protection and server-side security holes. Hopefully the Disqus people have more time on their hands to handle that.&lt;/p&gt;

&lt;p&gt;The downside of Jekyll is that is is a fairly new project which is far from 1.0 status yet. Features are added, changed and even removed and some functionality is limited. That said, &lt;a href='http://github.com/'&gt;Github&lt;/a&gt; uses it in production to generate hosted pages.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in Jekyll, visit &lt;a href='http://jekyllrb.com/'&gt;the site&lt;/a&gt; or the &lt;a href='http://github.com/mojombo/jekyll/tree/master'&gt;project page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I based the theme on my site on &lt;a href='http://quotedprintable.com/pages/scribbish'&gt;Scribbish&lt;/a&gt;, which is a blog theme originally designed for &lt;a href='http://wiki.github.com/fdv/typo/'&gt;Typo&lt;/a&gt;. My port is available &lt;a href='http://github.com/vilcans/scribbish-jekyll/tree/master'&gt;here&lt;/a&gt;, but it currently requires &lt;a href='http://github.com/vilcans/jekyll/tree/master'&gt;my fork of Jekyll&lt;/a&gt;, which adds some functionality that I need. I&amp;#8217;m pushing for those changes to be included in the mainline Jekyll code.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it. Let me know what you think of my new site!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_JHOC7V-dG8:Ly-yMvA4FfI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_JHOC7V-dG8:Ly-yMvA4FfI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_JHOC7V-dG8:Ly-yMvA4FfI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_JHOC7V-dG8:Ly-yMvA4FfI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_JHOC7V-dG8:Ly-yMvA4FfI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_JHOC7V-dG8:Ly-yMvA4FfI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/_JHOC7V-dG8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/08/17/Jekyll-blogging-like-a-hacker/</feedburner:origLink></entry>
 
 <entry>
   <title>How to enable remote desktop on headless Mac</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/wk4e9q9j1Q0/" />
   <updated>2009-06-14T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/06/14/How-to-enable-remote-desktop-on-headless-Mac</id>
   <content type="html">&lt;p&gt;The graphics card on my old PowerMac G5 gave up, so my Mac is now &lt;em&gt;headless&lt;/em&gt;. That is, it runs fine, but it can&amp;#8217;t display anything on the screen. It&amp;#8217;s still possible to log on to it through SSH, but I needed to use GUI applications. Getting a replacement graphics card proved to be difficult, so I needed to find another way.&lt;/p&gt;

&lt;p&gt;Macs support remote desktop logins through Apple Remote Desktop, which is just a different name for &lt;a href='http://en.wikipedia.org/wiki/Vnc'&gt;VNC&lt;/a&gt;. The only problem was that I had not enabled desktop sharing before the graphics card broke down, and all the instructions I could find were about how to enable it in the Mac&amp;#8217;s System Preferences. And I can&amp;#8217;t access the System Preferences since it&amp;#8217;s a GUI application!&lt;/p&gt;

&lt;p&gt;With the help of &lt;a href='http://support.apple.com/kb/HT2370?viewlocale=en_US'&gt;this Apple Support article&lt;/a&gt;, I could enable the VNC server. The VNC clients I tried reported errors like &amp;#8220;No matching security types&amp;#8221; and &amp;#8220;Server did not offer supported security type&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Finally I got it to work. The trick is to enable &amp;#8220;legacy mode&amp;#8221; and set a password. This is the command that did the trick:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart -activate -configure -access -on -restart -agent -privs -all -clientopts -setvnclegacy -vnclegacy -yes -setvncpw -vncpw somesecretpassword&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I guess there are security implications with this, but as long as I don&amp;#8217;t expose the VNC server to untrusted computers, I guess I&amp;#8217;m fine. Both &lt;a href='http://projects.gnome.org/vinagre/'&gt;Vinagre&lt;/a&gt; (the VNC client that comes with Ubuntu) and &lt;em&gt;xtightvncviewer&lt;/em&gt; now work. The &lt;em&gt;vncviewer&lt;/em&gt; command still doesn&amp;#8217;t connect properly for what seems to be some other reason.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=wk4e9q9j1Q0:HCP-TqD1vMA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=wk4e9q9j1Q0:HCP-TqD1vMA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=wk4e9q9j1Q0:HCP-TqD1vMA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=wk4e9q9j1Q0:HCP-TqD1vMA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=wk4e9q9j1Q0:HCP-TqD1vMA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=wk4e9q9j1Q0:HCP-TqD1vMA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/wk4e9q9j1Q0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/06/14/How-to-enable-remote-desktop-on-headless-Mac/</feedburner:origLink></entry>
 
 <entry>
   <title>How to create a Git repository from a Subversion working copy</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/zFDgRWPEj5I/" />
   <updated>2009-06-11T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/06/11/How-to-create-a-Git-repository-from-a-Subversion-working-copy</id>
   <content type="html">&lt;p&gt;Sometimes I want to add the files handled by one version control system into another. Typically I have checked out files from a read-only &lt;a href='http://subversion.tigris.org'&gt;Subversion&lt;/a&gt; repository and want to add all files to a &lt;a href='http://git-scm.com/'&gt;Git&lt;/a&gt; repository, so I can work with them locally.&lt;/p&gt;

&lt;p&gt;The following command has worked for me, and perhaps you&amp;#8217;ll find it useful. Just change to the directory where you have your Subversion working copy. Then create a Git repository in the same directory:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The Git workspace will be in the same directory as the Subversion working copy. This works fine since they store their metadata in different directories (&lt;em&gt;.git&lt;/em&gt; and &lt;em&gt;.svn&lt;/em&gt; respectively).&lt;/p&gt;

&lt;p&gt;Now, to add all files that are under Subversion control to the Git repository, execute:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;svn ls -R | grep -v &amp;#39;/$&amp;#39; | xargs git add&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;em&gt;svn ls -R&lt;/em&gt; command lists all files and directories, the grep command removes the directory names from the list, and then all the file names are sent as parameters to the &lt;em&gt;git add&lt;/em&gt; command. Of course, this only works if you have those commands installed. It should work fine under Linux, OS X or other Unix variants. I haven&amp;#8217;t tested it with Windows ports of the same commands.&lt;/p&gt;

&lt;p&gt;Now that the files have been added, just commit them:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git commit -m &amp;quot;Files from Subversion revision XXXX&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Of course, you could have cloned the Subversion repository with the &lt;a href='http://www.kernel.org/pub/software/scm/git/docs/git-svn.html'&gt;git svn clone&lt;/a&gt; command to the begin with, but at least one person I know (me) isn&amp;#8217;t always that foresighted.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=zFDgRWPEj5I:g2mDdvpsUQQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=zFDgRWPEj5I:g2mDdvpsUQQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=zFDgRWPEj5I:g2mDdvpsUQQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=zFDgRWPEj5I:g2mDdvpsUQQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=zFDgRWPEj5I:g2mDdvpsUQQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=zFDgRWPEj5I:g2mDdvpsUQQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/zFDgRWPEj5I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/06/11/How-to-create-a-Git-repository-from-a-Subversion-working-copy/</feedburner:origLink></entry>
 
 <entry>
   <title>7-bit characters today</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/Otyf_lXi5DQ/" />
   <updated>2009-05-13T00:00:00+02:00</updated>
   <id>http://www.librador.com/2009/05/13/7-bit-characters-today</id>
   <content type="html">&lt;p&gt;I got this error message when I tried to log on to my bank today:&lt;/p&gt;
&lt;span class='image'&gt;&lt;a href='/images/blog/nordea.png'&gt;&lt;img src='/images/blog/nordea.png' height='318' alt='' width='624' /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;It&amp;#8217;s in Swedish but note the strange use of curly braces and pipe characters. Back in the eighties it was common to have national code pages where certain seldom used characters in the ASCII set were replaced by national characters. For Swedish, the mapping included:&lt;/p&gt;

&lt;p&gt;{ (left curly brace) mapped to ä (lower case a with umlaut)&lt;/p&gt;

&lt;p&gt;} (right curly brace) mapped to å (lower case a with circle above)&lt;/p&gt;

&lt;p&gt;| (pipe) mapped to ö (lower case o with umlaut)&lt;/p&gt;

&lt;p&gt;It was common that software didn&amp;#8217;t map correctly to the national characters. Many users learned to read the braces and pipes fluently instead. I can&amp;#8217;t remember the last time I saw this character mapping used. It must have been 15 years ago or so. Until today.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Otyf_lXi5DQ:ePi3y_fnlAc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Otyf_lXi5DQ:ePi3y_fnlAc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=Otyf_lXi5DQ:ePi3y_fnlAc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Otyf_lXi5DQ:ePi3y_fnlAc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=Otyf_lXi5DQ:ePi3y_fnlAc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Otyf_lXi5DQ:ePi3y_fnlAc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/Otyf_lXi5DQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/05/13/7-bit-characters-today/</feedburner:origLink></entry>
 
 <entry>
   <title>Meme time: Wikipedia album generator</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/VT3Iy2g1NH4/" />
   <updated>2009-02-26T00:00:00+01:00</updated>
   <id>http://www.librador.com/2009/02/26/Meme-time-Wikipedia-album-generator</id>
   <content type="html">&lt;p&gt;I think it originated &lt;a href='http://www.buzzfeed.com/peggy/wikipedia-names-your-band'&gt;here&lt;/a&gt;. Anyway, here are the rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to Wikipedia. Hit &lt;a href='http://en.wikipedia.org/wiki/Special:Random'&gt;random&lt;/a&gt;. The first random wikipedia article you get is the name of your band.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Go to &lt;a href='http://www.quotationspage.com/random.php3'&gt;Random quotations&lt;/a&gt;. The last four or five words of the very last quote of the page is the title of your first album.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Go to flickr and click on &lt;a href='http://www.flickr.com/explore/interesting/7days'&gt;explore the last seven days&lt;/a&gt; Third picture, no matter what it is, will be your album cover.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Use photoshop or similar to put it all together. Preferably in a square format layout, like a nice old-timey vinyl album cover.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here&amp;#8217;s my result.&lt;/p&gt;
&lt;span class='image'&gt;&lt;a href='/images/blog/john_frank_small.jpg'&gt;&lt;img src='/images/blog/john_frank_small_400x400.jpg' height='400' alt='' width='400' /&gt;&lt;/a&gt;&lt;/span&gt;
&lt;p&gt;&lt;a href='http://www.flickr.com/photos/carshamus/3310424951/'&gt;Original photo by CarLee.&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VT3Iy2g1NH4:Q0pHQ1r1cvI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VT3Iy2g1NH4:Q0pHQ1r1cvI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=VT3Iy2g1NH4:Q0pHQ1r1cvI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VT3Iy2g1NH4:Q0pHQ1r1cvI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=VT3Iy2g1NH4:Q0pHQ1r1cvI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VT3Iy2g1NH4:Q0pHQ1r1cvI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/VT3Iy2g1NH4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/02/26/Meme-time-Wikipedia-album-generator/</feedburner:origLink></entry>
 
 <entry>
   <title>The frame rate of the universe</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/nHOgmEBSy2U/" />
   <updated>2009-01-16T00:00:00+01:00</updated>
   <id>http://www.librador.com/2009/01/16/The-frame-rate-of-the-universe</id>
   <content type="html">&lt;p&gt;

    I stumbled upon &lt;a href="http://www.newscientist.com/article/mg20126911.300-our-world-may-be-a-giant-hologram.html?full=true"&gt;this
article&lt;/a&gt; which presents the hypothesis that the universe is a 3D projection of a 2D
surface, like a giant hologram. I like to read about modern physics. It is so weird and I can't say
I really understand very much of it. But the descriptions provoke strange and fascinating images
and thoughts in my head. Like this one:&lt;/p&gt;&lt;p&gt;The article mentions the &lt;a href="http://en.wikipedia.org/wiki/Planck_length"&gt;Planck length&lt;/a&gt;, which as I understand it is
the smallest distance there is. It's extremely small: 1.6 × 10&lt;sup&gt;-35&lt;/sup&gt; meters, which makes
it billions and billions of times smaller than an atom (or even a proton). I'm used to thinking
about computer graphics, so I imagine the Planck length as the size of one "pixel" of the universe.
Nothing can be smaller than a pixel. (The pixels of the universe are small, I calculate the
resolution to correspond to 2.19 × 10&lt;sup&gt;33&lt;/sup&gt; DPI.) The radius of the observable universe is
4.4 × 10&lt;sup&gt;26&lt;/sup&gt; meters. If we want to fit the universe into a box, its sides would have to
be twice that size. That is 5.4 × 10&lt;sup&gt;61&lt;/sup&gt; Planck lengths. So that's the width, height and
depth of the universe in pixels. Quite a good resolution. (Actually since they are 3D cubes instead
of 2D squares, I should call them voxels instead of pixels. All 1.61 × 10&lt;sup&gt;185&lt;/sup&gt; of
them.)&lt;/p&gt;&lt;p&gt;There is also the &lt;a href="http://en.wikipedia.org/wiki/Planck_time"&gt;Planck time&lt;/a&gt;
which is the time it takes for light to travel one Planck length. As light is fast and the Planck
length is tiny (tiniest there is!), you can image that it's a very short period of time. Certainly.
The Planck time is 5.39 × 10&lt;sup&gt;-44&lt;/sup&gt; seconds. No measurable time can be shorter than that
according to quantum physics. Thinking about graphics again, this is like a limit on the frame rate
of the universe. Inverting the Planck time, I get 1.855 × 10&lt;sup&gt;43&lt;/sup&gt;. So by my surely
incorrect logic, we get the value of the universe's frame rate:&lt;/p&gt;&lt;p&gt;One thousand eight hundred
and fifty-five billion billion billion billion frames per second.&lt;/p&gt;&lt;p&gt;I'll say that
again:&lt;/p&gt;&lt;p&gt;18.55 septillion FPS!&lt;/p&gt;&lt;p&gt;Video cameras won't be perfect until they can record at
that speed.&lt;/p&gt;&lt;p&gt;I hope I got the calculations right, but I'm pretty sure my interpretation of the
quantum physics behind this are way off. It's still fascinating to think of the universe as a
computer simulation. Modern physics make it seem more like a video game than ever.&lt;br /&gt;


&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nHOgmEBSy2U:po7y417pmaI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nHOgmEBSy2U:po7y417pmaI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=nHOgmEBSy2U:po7y417pmaI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nHOgmEBSy2U:po7y417pmaI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=nHOgmEBSy2U:po7y417pmaI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nHOgmEBSy2U:po7y417pmaI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/nHOgmEBSy2U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/01/16/The-frame-rate-of-the-universe/</feedburner:origLink></entry>
 
 <entry>
   <title>What are the oldest files in your home directory?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/Fp7G-e42x3U/" />
   <updated>2009-01-08T00:00:00+01:00</updated>
   <id>http://www.librador.com/2009/01/08/What-are-the-oldest-files-in-your-home-directory</id>
   <content type="html">&lt;p&gt;

    &lt;a href="http://www.b-list.org/weblog/2009/jan/03/meme/"&gt;James Bennett replies&lt;/a&gt; to &lt;a href="http://blog.doughellmann.com/2009/01/new-year-meme-what-are-oldest-files-in.html"&gt;Doug
Hellman's follow up&lt;/a&gt; on &lt;a href="http://rhodesmill.org/brandon/2009/new-years-meme/"&gt;Brandon
Craig Rhodes' idea&lt;/a&gt; "What are the oldest files in your home directory?". Of course I couldn't
resist doing the same. I won't repeat the procedure for how I found my oldest files, since the
posts above tell you how if you want to repeat the experiment.&lt;/p&gt;&lt;p&gt;Before I go on listing my
oldest files, I'll tell you what files you unfortunately won't find listed here. It must have been
around 1998 when I received an old cardboard box with the old cassette tapes containing the old
games me and my brother made for the &lt;a href="http://en.wikipedia.org/wiki/ZX_Spectrum" title="Sinclair ZX Spectrum - Wikipedia, the free encyclopedia"&gt;ZX Spectrum&lt;/a&gt; 8-bit computer back
in the mid 80's. The tapes were like ordinary audio cassettes, and I used some DOS software that
could read the Spectrum's format through the PC's sound card. Unfortunately the tapes had
deteriorated to the point where most of the files were unreadable. The games I got to run were
quite embarassingly bad, so I thought they were better kept in fondness in my memory instead of in
the light of a present-day emulator. I throw the box with the tapes away.&lt;/p&gt;&lt;p&gt;Anyway, I found
some pretty old files whose timestamps have survived several computer generations. Here we
go:&lt;/p&gt;&lt;p&gt;&lt;code&gt;1995-08-07 ./gammalt/pre-2000/exjobb/INLEDNIN.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/GENOM.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/KUNSKAP.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/REFERENS.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/ANALYS.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/BEGREPPS.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/GENOMFÖR.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/PLAN.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/SAMMAN.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/XJOBB2.DOC&lt;br /&gt;
1995-08-07 ./gammalt/pre-2000/exjobb/BILAGOR.DOC&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
These files are the documentation for the degree project I did with a friend back in university. We
investigated the implications of moving from a classical two-tier client/server architecture to a
three tier GUI/functionality/database model. Nobody builds two-tier systems any more, so I guess
the three-tier model won. Reading a few pages, I notice how much else that hasn't changed. What we
discuss in this document is what today goes under names such as SOA, RIA and Ajax, and the issues
we bring up are still relevant. So much for the misconception that what you learn in university is
out of date by the time you graduate.&lt;/p&gt;&lt;p&gt;Note that we split the document into several files to
keep Word from choking on the size of it. I doubt you even can do that in the latest version of
Word.&lt;/p&gt;&lt;p&gt;&lt;span class="image"&gt;&lt;a href="/images/blog/LASER4.JPG"&gt;&lt;img src="/images/blog/LASER4_270x400.JPG" width="270" height="400" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;code&gt;1995-12-13 ./gammalt/pre-2000/bildmanipulation/LASER4.JPG&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
This file must be even older than what the timestamp says. It is my first experiment with
manipulating images with Photoshop. I took the original photo with my good old Minolta 9xi analog
camera (or perhaps it was even the bad old 3xi) and scanned the print on the university's flatbed
scanner. Not the best way to go for image quality I guess, but it was not like any normal person
had a digital camera back in '95. The university had a small computer lab with a few Macs where i
snuck in to learn Photoshop and this was the result.&lt;/p&gt;&lt;p&gt;&lt;code&gt;1996-02-28
./gammalt/pre-2000/august/annan diskett/BRUNNEN.WPS&lt;br /&gt;
1996-03-03 ./gammalt/pre-2000/august/annan diskett/BRUNNEN.GEN&lt;br /&gt;
1996-03-03 ./gammalt/pre-2000/august/annan diskett/BRUNNEN.TXT&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Those are some of the files for a children's book I was writing with a friend. We even had meetings
with publishers about it, but it never was published, in part because of the discrepancy between
the childish story and characters and the more mature humour.&lt;/p&gt;&lt;p&gt;&lt;span class="image"&gt;&lt;a href="/images/blog/balls.jpg"&gt;&lt;img src="/images/blog/balls_533x400.jpg" width="533" height="400" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;code&gt;1997-06-25 ./Documents/povscn/balls/BBall.inc&lt;br /&gt;
1997-06-25 ./Documents/povscn/balls/Chalk.inc&lt;br /&gt;
1997-06-25 ./Documents/povscn/balls/Room.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/BLamp.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/ChalkBox.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/ChalkLine.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/Cue.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/TableFrame.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/Window.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/BTable.inc&lt;br /&gt;
1997-06-27 ./Documents/povscn/balls/Ruler.inc&lt;br /&gt;
1997-06-29 ./Documents/povscn/balls/Protractor.inc&lt;br /&gt;
1997-06-30 ./Documents/povscn/balls/balls.txt&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
These are source files for the &lt;a href="http://www.povray.org"&gt;POV-Ray&lt;/a&gt; raytracer and consist my
entry for the june 1997 issue of the &lt;a href="http://www.irtc.org"&gt;Internet Raytracing
Competition&lt;/a&gt; (on hiatus since 2006). See the &lt;a href="http://www.irtc.org/stills/1997-06-30/view.html"&gt;viewing page&lt;/a&gt; for that month's
competition. I have older POV-Ray source files hidden in a zip file somewhere, but the files above
are unpacked because I used them for something back in 2005.&lt;/p&gt;&lt;p&gt;I found more interesting old
files, some that I had forgotten about. There is enough stuff for another blog post strolling down
memory lane, but this is enough for now.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Fp7G-e42x3U:YmkeEFm_nOs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Fp7G-e42x3U:YmkeEFm_nOs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=Fp7G-e42x3U:YmkeEFm_nOs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Fp7G-e42x3U:YmkeEFm_nOs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=Fp7G-e42x3U:YmkeEFm_nOs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=Fp7G-e42x3U:YmkeEFm_nOs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/Fp7G-e42x3U" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2009/01/08/What-are-the-oldest-files-in-your-home-directory/</feedburner:origLink></entry>
 
 <entry>
   <title>Saved by tcpdump</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/_dVVbffkfOY/" />
   <updated>2008-12-02T00:00:00+01:00</updated>
   <id>http://www.librador.com/2008/12/02/Saved-by-tcpdump</id>
   <content type="html">&lt;p&gt;Have you ever written a long post on a forum or a blog, clicked the submit button and got an error message back? Perhaps there was some temporary glitch in the server so your long thoughtful post wasn&amp;#8217;t saved, but all too often it&amp;#8217;s because your session has expired and you&amp;#8217;re requested to log in again. If you click the back button in this situation there is a risk that you will come back to the empty text box you started out with and there is no way to get your post back.&lt;/p&gt;

&lt;p&gt;What I have learned to do in these situations is that instead of clicking the back button, I refresh the page. The browser will ask whether you are sure that you want to post the same data again, so the data is obviously still there in the browser&amp;#8217;s memory. If you go ahead and try to post again, you may succeed (you do risk a double post if the first post was successful although it looked like there was an error). If the server keeps on giving errors, I have a trick that is quite primitive. I start a network sniffer before I click the refresh button. (If you didn&amp;#8217;t know, a network sniffer is a piece of software that saves everything that is transferred over the computer&amp;#8217;s network card.) &lt;a href='http://www.wireshark.org'&gt;Wireshark&lt;/a&gt; is a GUI software that works well. Unix-like systems (including Linux and MacOS X) have a command-line utility called &lt;a href='http://www.tcpdump.org/'&gt;tcpdump&lt;/a&gt;. You can invoke tcpdump like this to capture everything that goes over port 80 (the default port for web traffic):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo tcpdump -s 0 -A -i en0 port 80 &amp;gt; dump.txt&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will save the data in the file dump.txt. (You may have to replace &lt;em&gt;en0&lt;/em&gt; with whatever the name of your network card is.)&lt;/p&gt;

&lt;p&gt;Open dump.txt in a text editor and you should be able to find the text. It will be &lt;a href='http://en.wikipedia.org/wiki/Percent-encoding'&gt;URL encoded&lt;/a&gt; (spaces are shown as &amp;#8221;+&amp;#8221; and other characters as &amp;#8220;%21&amp;#8221; etc.), but a good text editor should be able to unescape it. (In &lt;a href='http://macromates.com/'&gt;TextMate&lt;/a&gt; you&amp;#8217;ll find URL Unescape in the HTML bundle.) Then you can just save your witty, informative and well-written text to retry the post.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d be interested to know if there&amp;#8217;s a simpler solution but this one works very well and has saved me a few times.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_dVVbffkfOY:Hhga6Rq8Lxw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_dVVbffkfOY:Hhga6Rq8Lxw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_dVVbffkfOY:Hhga6Rq8Lxw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_dVVbffkfOY:Hhga6Rq8Lxw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_dVVbffkfOY:Hhga6Rq8Lxw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_dVVbffkfOY:Hhga6Rq8Lxw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/_dVVbffkfOY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/12/02/Saved-by-tcpdump/</feedburner:origLink></entry>
 
 <entry>
   <title>The “one simple step rule” of development environments</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/_0SXCEnlHzc/" />
   <updated>2008-12-01T00:00:00+01:00</updated>
   <id>http://www.librador.com/2008/12/01/The-one-simple-step-rule-of-development-environments</id>
   <content type="html">&lt;p&gt;

    There are many ways to set up a development environment when creating software. With a
development environment I mean all the tools that the developers use to create the software,
including the physical machines, operating systems, IDEs, build scripts, issue trackers, version
control systems etc. Being a contractor I get to see a lot of different setups. If you're a new
developer on a project that has been active for a while, it shouldn't take more than an hour from
when you sit down in the chair on your first day to the moment when you have a working environment
and can edit and run code. Unfortunately many projects underestimate how important this is. I've
been in projects where weeks have gone by before some developers had the complete setup. Sometimes
the hindrance is a slow authorization process by some remote IT support department which won't let
you access parts of the system. Sometimes setting up the system requires deep knowledge of how the
system works, and as a new developer it's cumbersome to troubleshoot a complex architecture with
several interdependent components (GUI client, client-side logic layer, app server, web server,
database, you name it). Sometimes it takes days to learn just how to build the damn
thing.&lt;/p&gt;&lt;p&gt;There is a lot of time wasted on these things in software projects. The best thing to
do to avoid such a situation is to have as a rule, from the very beginning of the project, that it
should be possible to create a working development environment from scratch in one simple step.
Typically the single step is to write a single command, whereby the build system will set up the
environment properly, download the code from the version control system and create a complete
working system. After editing code it should be just as easy to make and run a new build, but that
goes without saying. Having a short edit/run cycle is essential and a one-step build process is a
requirement for implementing automated &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;continuous
integration&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It is important to have the "one simple step" rule in mind from the outset
of the project. It may take a little time to create an environment that supports it and with some
esoteric development kits it may actually be a bit difficult. Still, it is an investment that pays
off in saved time and frustration, and it is much more difficult to create a good development
environment for a moderately complex project that has been going on for a while (not to mention
projects that have been around for a few years). I wouldn't recommend creating the mother of all
development environments from the outset. You can begin with a simple build system and add
functionality to it as it is needed. Just keep the "one simple step" rule in mind.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_0SXCEnlHzc:aNlIKHcrt8U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_0SXCEnlHzc:aNlIKHcrt8U:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_0SXCEnlHzc:aNlIKHcrt8U:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_0SXCEnlHzc:aNlIKHcrt8U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=_0SXCEnlHzc:aNlIKHcrt8U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=_0SXCEnlHzc:aNlIKHcrt8U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/_0SXCEnlHzc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/12/01/The-one-simple-step-rule-of-development-environments/</feedburner:origLink></entry>
 
 <entry>
   <title>Are we in the 21st century yet?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/gUTMkxfvanA/" />
   <updated>2008-11-30T00:00:00+01:00</updated>
   <id>http://www.librador.com/2008/11/30/Are-we-in-the-21st-century-yet</id>
   <content type="html">&lt;p&gt;

    I went to the city of Västerås today. It's a one hour train ride from Stockholm. The &lt;a href="http://www.sj.se/"&gt;railroad company&lt;/a&gt; has received a lot of criticism for their
incomprehensible pricing scheme, but apparently that has changed. As far as I can remember it from
the last time I used it, the online booking system has been improved as well. But the coolest thing
is that it's possible to order and pay for the ticket on the web site and receive the ticket as a
text message to your phone. On the train I just showed the message to the ticket-collector. He used
a device with a small camera, like the one on mobile phones, to scan the display of my phone. It
took a few attempts for the OCR to get it, but hey, this really felt like science fiction. 10 years
ago it would have been. It felt a bit like we have finally arrived in the 21st century.&lt;/p&gt;&lt;p&gt;But
when I came to Västerås and tried to use &lt;a href="http://www.google.com/gmm/"&gt;Google Maps
Mobile&lt;/a&gt; with lousy GPRS coverage to find my way in the chilly wet semi-suburban streets, I felt
like I was back in the 1990s.

&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=gUTMkxfvanA:RA-aD4NB9Hs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=gUTMkxfvanA:RA-aD4NB9Hs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=gUTMkxfvanA:RA-aD4NB9Hs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=gUTMkxfvanA:RA-aD4NB9Hs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=gUTMkxfvanA:RA-aD4NB9Hs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=gUTMkxfvanA:RA-aD4NB9Hs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/gUTMkxfvanA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/11/30/Are-we-in-the-21st-century-yet/</feedburner:origLink></entry>
 
 <entry>
   <title>Increase the frame rate or be boring and conservative?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/910SLZRw1WY/" />
   <updated>2008-10-24T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/10/24/Increase-the-frame-rate-or-be-boring-and-conservative</id>
   <content type="html">&lt;p&gt;

    The BBC has published a &lt;a href="http://www.bbc.co.uk/rd/pubs/whp/whp-pdf-files/WHP169.pdf"&gt;research white paper&lt;/a&gt; about
high frame-rate television. According to their experiments, a higher frame rate becomes necessary
to avoid juttering or smearing of moving objects as the resolution and size of the TV screen
increases.&lt;/p&gt;&lt;p&gt;As an old &lt;a href="http://en.wikipedia.org/wiki/Demo"&gt;demo&lt;/a&gt; coder, I tend to
frown upon the jerky motion of sub-50 frames per second graphics. Many a hard-core gamer would tell
you that they wouldn't play a game running at only 30 fps. BBC's research shows that even at 100
fps, there is room for improvement. Still, motion pictures are trudging on in their old 24 fps that
was set as a standard when sound film was introduced in the 1920's. As BBC's research shows, the
perceived image quality can be increased tremendously by increasing the frame rate.&lt;/p&gt;&lt;p&gt;There
&lt;em&gt;are&lt;/em&gt; suggestions to improve the frame rate of motion pictures, but since video has always
had higher frame rates than film, those suggestions are typically met with a large number of
filmmakers saying, "It looks like video!"&lt;/p&gt;&lt;p&gt;So what? It's not like video is a dirty
word.&lt;/p&gt;&lt;p&gt;Currently, there is a new generation of filmmakers growing up that never has and never
will shoot on film. In a few years, digital acquisition and projection will have more or less
killed canned celluloid. Why should filmmakers stick to the limitations of film? Sure, video gives
a different look than film and 100 fps gives a different look than 24 fps. But thinking
&lt;em&gt;different&lt;/em&gt; means &lt;em&gt;worse&lt;/em&gt; is conservative in a very boring way.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=910SLZRw1WY:daoIaOHaZsc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=910SLZRw1WY:daoIaOHaZsc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=910SLZRw1WY:daoIaOHaZsc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=910SLZRw1WY:daoIaOHaZsc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=910SLZRw1WY:daoIaOHaZsc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=910SLZRw1WY:daoIaOHaZsc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/910SLZRw1WY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/10/24/Increase-the-frame-rate-or-be-boring-and-conservative/</feedburner:origLink></entry>
 
 <entry>
   <title>When Harry met Bettan screening at Uppsala Short Film Festival</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/nouzJlh1ACM/" />
   <updated>2008-10-16T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/10/16/When-Harry-met-Bettan-screening-at-Uppsala-Short-Film-Festival</id>
   <content type="html">&lt;p&gt;

    I was invited to direct a short film this summer. Of course with a budget very close to zero,
but enough to cover most expenses and with a writer/producer who could take care of lots of the
practical things around making it. The first public screening will be at the &lt;a href="http://www.shortfilmfestival.com/"&gt;Uppsala International Short Film Festival&lt;/a&gt;. (The site
isn't designed for deep links, but &lt;a href="http://www.underhuset.nu/shortfilmfestival/ukffSve/progBlock.lasso?programId=283"&gt;here's a
link to the screening&lt;/a&gt;.) The film is called "När Harry mötte Bettan" (When Harry met Bettan)
and tells the story of a bitter young woman working in a video store and a romantic movie loving
nerd who also happens to be a bouncer at a local night club. The movie is in Swedish, but time will
tell if we'll release a subtitled version.&lt;/p&gt;&lt;p&gt;Here are two world exclusive stills from the
film:&lt;/p&gt;&lt;p&gt;&lt;span class="image"&gt;&lt;a href="/images/blog/bodyguard.jpg"&gt;&lt;img src="/images/blog/bodyguard_640x360.jpg" width="640" height="360" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;span class="image"&gt;&lt;a href="/images/blog/tjejerna.jpg"&gt;&lt;img src="/images/blog/tjejerna_640x360.jpg" width="640" height="360" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;



&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nouzJlh1ACM:JJvCF8nidMg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nouzJlh1ACM:JJvCF8nidMg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=nouzJlh1ACM:JJvCF8nidMg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nouzJlh1ACM:JJvCF8nidMg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=nouzJlh1ACM:JJvCF8nidMg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=nouzJlh1ACM:JJvCF8nidMg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/nouzJlh1ACM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/10/16/When-Harry-met-Bettan-screening-at-Uppsala-Short-Film-Festival/</feedburner:origLink></entry>
 
 <entry>
   <title>Quality + Quantity = Information Overload</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/VJenURs0VF0/" />
   <updated>2008-10-01T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/10/01/Quality-+-Quantity-Information-Overload</id>
   <content type="html">&lt;p&gt;

    People say that the key to writing a popular blog is to post often and regularly. If there is
truth in this, I guess I'm not representing the typical feed subscriber as I have unsubscribed from
blogs with interesting well-written content simply because they posted too frequently and I
couldn't cope with the volume. If a feed is never updated, you forget that you're subscribed to it
and it does you no harm, so there's no reason to cancel the subscription. Frequently updated feeds
on the other hand make you feel stressed when you can't keep up with the information flow. This is
a problem with the quality of the posts, but not in the way you'd normally think (that quantity has
a negative impact on quality and vice versa). Quite the opposite: If the posts aren't good, you
simply unsubscribe. It's unsubscribing to a stream of interesting/amusing/insightful posts that
poses a problem. You get the feeling that you'll miss something, so you don't want to press that
unsubscribe button. Quantity coupled with quality is what causes information overload.&lt;/p&gt;&lt;p&gt;To
avoid information overload from quality and quantity, subscribe to &lt;a href="http://feeds.feedburner.com/librador"&gt;my feed&lt;/a&gt; instead. I won't update often, I promise.
As for the quality, I'll leave that for other people to judge.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VJenURs0VF0:H6AATuZHYKY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VJenURs0VF0:H6AATuZHYKY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=VJenURs0VF0:H6AATuZHYKY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VJenURs0VF0:H6AATuZHYKY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=VJenURs0VF0:H6AATuZHYKY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=VJenURs0VF0:H6AATuZHYKY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/VJenURs0VF0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/10/01/Quality-%2B-Quantity-Information-Overload/</feedburner:origLink></entry>
 
 <entry>
   <title>The PowerMac G5's power button</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/YAXH6BSlTXA/" />
   <updated>2008-06-26T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/06/26/The-PowerMac-G5s-power-button</id>
   <content type="html">&lt;p&gt;

    When I first got my PowerMac G5 several years ago, my first impression of the power button on
it was bad. It's a clear example of form over function. It looks nice, but since the button is flat
and level with the computer's front surface, it's difficult to find it by just feeling. I need to
bend down to see the button to be able to find it.&lt;/p&gt;&lt;p&gt;But then I realized that even though it's
annoying that I find it difficult to find the button, this also means that my son can't find it
either and put the computer to sleep while I'm trying to use it.&lt;/p&gt;&lt;p&gt;Well, not any more. :-) My
hack solution was to tape a piece of plastic over the button. Ugly but effective. Function over
form.&lt;/p&gt;
&lt;p&gt;&lt;span class="image"&gt;&lt;a href="/images/blog/powermac_button_2.jpg"&gt;&lt;img src="/images/blog/powermac_button_2.jpg" width="400" height="300" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;br /&gt;
&lt;span class="image"&gt;&lt;a href="/images/blog/powermac_button_1.jpg"&gt;&lt;img src="/images/blog/powermac_button_1.jpg" width="400" height="300" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=YAXH6BSlTXA:c8t5N6r5B38:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=YAXH6BSlTXA:c8t5N6r5B38:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=YAXH6BSlTXA:c8t5N6r5B38:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=YAXH6BSlTXA:c8t5N6r5B38:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=YAXH6BSlTXA:c8t5N6r5B38:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=YAXH6BSlTXA:c8t5N6r5B38:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/YAXH6BSlTXA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/06/26/The-PowerMac-G5s-power-button/</feedburner:origLink></entry>
 
 <entry>
   <title>Set maximum threads in Blender!</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/eLojZwOM6mo/" />
   <updated>2008-06-14T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/06/14/Set-maximum-threads-in-Blender!</id>
   <content type="html">&lt;p&gt;

    &lt;span class="image"&gt;&lt;a href="/images/blog/blender_threads.png"&gt;&lt;img src="/images/blog/blender_threads.png" width="506" height="246" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

&lt;br /&gt;
I recently discovered that &lt;a href="http://www.blender.org"&gt;Blender&lt;/a&gt; (the open source 3D
modeler, renderer and steep learning curve kitchen sink) only uses one CPU by default. It is
possible to change the number of threads that Blender should use in the render settings. I expected
the optimal number of threads would be the same as the number of CPUs. My good old Mac G5 has two
CPUs, but eight threads (the maximum) actually renders a little faster than two. The big difference
is seen between one and two threads though.  Your mileage may vary of course, but if you're a
Blender user who hasn't seen this setting before, try tweaking it!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=eLojZwOM6mo:689_2OV1v6g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=eLojZwOM6mo:689_2OV1v6g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=eLojZwOM6mo:689_2OV1v6g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=eLojZwOM6mo:689_2OV1v6g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=eLojZwOM6mo:689_2OV1v6g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=eLojZwOM6mo:689_2OV1v6g:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/eLojZwOM6mo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/06/14/Set-maximum-threads-in-Blender%21/</feedburner:origLink></entry>
 
 <entry>
   <title>3D Movies - Mainstream or Gimmick?</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/K-erP06Zme0/" />
   <updated>2008-04-26T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/04/26/3D-Movies-Mainstream-or-Gimmick</id>
   <content type="html">&lt;p&gt;So, now I have watched samples of the latest trend in the motion picture industry: three
dimensional (stereoscopic) movies. The main part of the reason for this trend is probably that
there currently is no affordable way to view 3D movies at home, so they are a way to lure people
back into the cineplex. 3D movies have been around since the 1890's (source: &lt;a href="http://en.wikipedia.org/wiki/3-D_film#Early_patents_and_tests"&gt;Wikipedia&lt;/a&gt;), and there have
been several waves of 3D movies since then, but 3D hasn't caught on as the standard way of doing
movies, like sound and colour once did. It is still a gimmick for just a handful of
films.&lt;/p&gt;&lt;p&gt;The current digital 3D movies have far better image quality than previous
technologies. I went to a 3D screening at the "inspiration weekend for filmmakers" &lt;a href="http://www.sfi.se/"&gt;Drömfabriken&lt;/a&gt; (site in Swedish!) this week, and the talks before they
actually showed the movie clips sounded very promising. One person thought that 3D movies are here
to stay this time. And the clips they showed looked good. I could see no ghosting (where you see a
little of the right eye image in your left eye and vice versa), and the colour reproduction was
excellent. The main technical problem I saw was that the 3D effect was more or less exaggerated.
The image had more depth than what it would look like in real life. This causes double vision
sometimes, and looks unrealistic all the time. The reason for the exaggerated 3D effect is probably
that the "eyes" of the camera they used for filming were further apart than human eyes are, so it's
a problem that can be solved by just moving them closer together. But if you do not exaggerate the
3D effect, the image would look quite flat.&lt;/p&gt;&lt;p&gt;When you're looking at stuff in the real world,
you do not actually have that much sense of depth at distances that are greater than a few meters.
Stereoscopic vision is most useful at close distances. At larger distances, other parts of the
brain do the work of figuring out how far away objects are. So, if you move the 3D camera's "eyes"
closer together to get a realistic 3D effect, you don't get much of a 3D effect at all except for
closeups. So why would the film production go through all the trouble of filming in stereo
&lt;i&gt;and&lt;/i&gt; forcing the viewers to wear those ugly glasses for such a subtle effect?&lt;/p&gt;&lt;p&gt;I think
the glasses is the reason that 3D movies won't go mainstream this time around either. You just
don't want to make out in the back of the theatre wearing alien goggles. Since one driving force
behind 3D movies is to get the audience into the theatres, it's ironic that the first &lt;a href="http://www.wired.com/science/discoveries/news/2006/08/71627"&gt;3D displays that don't require
glasses&lt;/a&gt; are suited only for home use. The technology wouldn't work in a cinema. (This has to do
with the fact that these 3D displays have a small "sweet spot". They don't allow for a wide viewing
angle.)&lt;/p&gt;&lt;p&gt;So, was I impressed by the 3D screening? No. It didn't feel very fresh or new, but it
still is a cool effect, no doubt about it. It has always been. I just don't see it going mainstream
any time soon. James Cameron (director of Aliens, The Terminator, Titanic and upcoming 3D feature
&lt;a href="http://www.imdb.com/title/tt0499549/"&gt;Avatar&lt;/a&gt;) has a different opinion &lt;a href="http://www.variety.com/VR1117983864.html"&gt;in this interesting article&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=K-erP06Zme0:gNT3fpoGi4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=K-erP06Zme0:gNT3fpoGi4Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=K-erP06Zme0:gNT3fpoGi4Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=K-erP06Zme0:gNT3fpoGi4Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=K-erP06Zme0:gNT3fpoGi4Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=K-erP06Zme0:gNT3fpoGi4Y:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/K-erP06Zme0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/04/26/3D-Movies-Mainstream-or-Gimmick/</feedburner:origLink></entry>
 
 <entry>
   <title>Dojo and Conventions in Programming Languages</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/mdX7KFAgZNE/" />
   <updated>2008-04-02T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/04/02/Dojo-and-Conventions-in-Programming-Languages</id>
   <content type="html">&lt;p&gt;I went to the &lt;a href="http://www.webmontag.de/doku.php?id=01.04.2008_stockholm"&gt;Web Monday&lt;/a&gt;
event yesterday. This was the third time this was arranged in Stockholm, but it was the first time
for me. This time, only a handful of people attended, probably because lots of people from
Stockholm went skiing last week and spent this week at home with a broken leg. It was a nice event
nevertheless. I mean: Discussing software and web development, listening to interesting short
presentations, eating pizza, drinking beer, watching 256 byte demos and YouTube clips, what more
can you ask for?&lt;/p&gt;&lt;p&gt;&lt;a href="http://unclescript.blogspot.com/" title="Script Uncle"&gt;Peter
Svensson&lt;/a&gt; held &lt;a href="http://docs.google.com/Present?docid=dfxgjqrf_77cjrd7gct" title="Dojo
1.1 Custom Widgets presentation"&gt;a presentation about Dojo&lt;/a&gt;. The &lt;a href="http://dojotoolkit.org/"&gt;Dojo Toolkit&lt;/a&gt; is a framework for making internet applications
with JavaScript and Ajax. I have no experience with it, except for a quick look after which I
decided that it was a bit too complex for my requirements at the time. Peter noticed me frown at
one slide, which wasn't because of the presentation, or even the Dojo Toolkit itself, and I'll try
to explain why.&lt;/p&gt;&lt;p&gt;I had a problem with this code:&lt;br /&gt;
&lt;pre&gt;dojo.declare("myclass", null,
{
  var1: "",
  var2: 17,
  constructor: function(arg)
  {
    this.var1 = foo;
  }
});
var myobj = new myclass(4711);&lt;/pre&gt;
&lt;p&gt;This is how you declare a class (named
&lt;em&gt;myclass&lt;/em&gt;) with two data members (&lt;em&gt;var1&lt;/em&gt; and &lt;em&gt;var2&lt;/em&gt;) and a constructor. The
funny thing is that this way of declaring a class is a part of Dojo. JavaScript is so dynamic and
flexible that it's possible to implement object orientation in different ways, so Dojo has its own
way of doing it. That is my problem. While it's definitely nice for a language to be dynamic and
flexible, I would prefer a standard way to do such basic things as declaring a class.&lt;/p&gt;&lt;p&gt;The
standard way to do something in a programming language can be enforced by rules in the language.
For example, Java, C++, Python and probably lots of other languages have a &lt;em&gt;class&lt;/em&gt; keyword
for declaring a class. That is simply the one you use when you declare a class in those languages.
(In Python it's certainly possible to create a class with other constructs if you really want to,
but you practically never do.)&lt;/p&gt;&lt;p&gt;The standard way to do something can also be just a
convention; the way you typically do it. Java has a standard way to document code, called &lt;a href="http://java.sun.com/j2se/javadoc/"&gt;Javadoc&lt;/a&gt;. Since this was part of the Java development
kit from the very beginning, all Java code uses those conventions, even though they are not
enforced by the language itself. Java has benefited a lot from conventions of this kind. Standards
for naming is another example where Java has succeeded very well. So, even if the JavaScript
language doesn't enforce a specific way to declare a class, there is much to gain by having a
convention for doing it. If everyone follows the convention, you avoid a lot of confusion and
interoperability problems.&lt;/p&gt;&lt;p&gt;Dojo's way of declaring a class looks nice. Dojo also has other
features that seem to make programming easier (such as a package system using the &lt;em&gt;require&lt;/em&gt;
and &lt;em&gt;provide&lt;/em&gt; functions). So I have no problem with that. The problem is that there is no
standard way of doing these things in JavaScript so Dojo needs to implement its conventions.
Perhaps the Dojo conventions deserve to be &lt;em&gt;the&lt;/em&gt; way of doing things in JavaScript, but
unfortunately there are no standard conventions yet.&lt;/p&gt;&lt;p&gt;Now, I haven't programmed very much in
JavaScript (so far), so perhaps I have no clue of what I'm talking about here. Perhaps this is not
a problem. But until I get proven wrong, I'm skeptic about a language that has no standard way of
doing very basic things. It makes me think of C++, where every other project declares its own
string class. It is plain silly.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=mdX7KFAgZNE:g12eTyAfBTU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=mdX7KFAgZNE:g12eTyAfBTU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=mdX7KFAgZNE:g12eTyAfBTU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=mdX7KFAgZNE:g12eTyAfBTU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=mdX7KFAgZNE:g12eTyAfBTU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=mdX7KFAgZNE:g12eTyAfBTU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/mdX7KFAgZNE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/04/02/Dojo-and-Conventions-in-Programming-Languages/</feedburner:origLink></entry>
 
 <entry>
   <title>Happy About C Programmers</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/bWClw8GG95Q/" />
   <updated>2008-04-01T00:00:00+02:00</updated>
   <id>http://www.librador.com/2008/04/01/Happy-About-C-Programmers</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m so happy that so many people program in C. Old and ugly as C is, I have two main reasons to like it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The C language is very portable. Since the C specification is simple, stable and (as far as I can tell) properly implemented in all compilers, you never run into compiler-specific issues with C code. Also, every operating environment on the planet has a C compiler.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;C code has great performance. This comes naturally from the fact that C is a relatively low-level language (and to a certain extent that C programmers tend to be speed freaks).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this reason, I like to use library code written in C (and there&amp;#8217;s a lot of C libraries out there). Also, I like the fact that I can download the source for a C project and be quite sure that it will compile and run. But &lt;em&gt;I&lt;/em&gt; wouldn&amp;#8217;t want to program in C. The language is complicated and tedious, so it takes a lot of care to write code that works and is safe. If I want speed-critical code, I&amp;#8217;d write it in C++. (News flash for the ignorant: C and C++ are two different languages. There is no such thing as &amp;#8220;C/C++&amp;#8221;.) The performance of C++ code is more or less the same as for C, but C++ is a more expressive language. (Another news flash: You do not &lt;em&gt;have&lt;/em&gt; to do object oriented programming in C++ if you don&amp;#8217;t want to, as it supports procedural programming as well.) The problem with C++ is related to bullet #1 above. C++ is far from as portable as C. Different compilers implement the standard differently, and there are lots of subtle differences and bugs in the compilers. Also, there is normally no guarantee that binary code from different compilers will work with each other.&lt;/p&gt;

&lt;p&gt;So I enjoy the portability of C, but I wouldn&amp;#8217;t like to write in C myself. I&amp;#8217;m just glad that there are lots of C programmers out there.&lt;/p&gt;

&lt;p&gt;On the web side, the same goes for PHP. I don&amp;#8217;t know much about PHP, but what I&amp;#8217;ve seen has been ugly. But there are lots of good products written in PHP that I can use, and there are plenty of hosts that support PHP, so I&amp;#8217;m glad that there are PHP programmers too.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bWClw8GG95Q:CpXRrVVZbrQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bWClw8GG95Q:CpXRrVVZbrQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=bWClw8GG95Q:CpXRrVVZbrQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bWClw8GG95Q:CpXRrVVZbrQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=bWClw8GG95Q:CpXRrVVZbrQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=bWClw8GG95Q:CpXRrVVZbrQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/bWClw8GG95Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/04/01/Happy-About-C-Programmers/</feedburner:origLink></entry>
 
 <entry>
   <title>Make3D Creates 3D Models from Photos</title>
   <link href="http://feedproxy.google.com/~r/Librador/~3/E1EHAdvDe6E/" />
   <updated>2008-02-28T00:00:00+01:00</updated>
   <id>http://www.librador.com/2008/02/28/Make3D-Creates-3D-Models-from-Photos</id>
   <content type="html">&lt;p&gt;&lt;span class="image"&gt;&lt;a href="/images/blog/Make3D.jpg"&gt;&lt;img src="/images/blog/Make3D.jpg" width="233" height="175" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;

I &lt;a href="/2007/12/06/Fotowoosh-released-as-Facebook-app/" title="Fotowoosh released as Facebook app  - Librador"&gt;tried out Fotowoosh&lt;/a&gt; a while ago and came
to the result that it was a cool technology, but not good enough to do anything useful with. Now a
competing product called &lt;a href="http://make3d.stanford.edu"&gt;Make3D&lt;/a&gt; has appeared. They both
basically do the same thing, which is to take a photograph as input and calculate a textured 3D
model from it. Make3D has a different kind of algorithm which &lt;a href="http://news-service.stanford.edu/news/2008/january23/make-012308.html"&gt;sounds impressive&lt;/a&gt;.
Unfortunately as far as I can tell, the results aren't much better than those of Fotowoosh. Take a
look at &lt;a href="http://make3d.stanford.edu/images/showuser/12748" title="Martin's images on
Make3D"&gt;my test images&lt;/a&gt;. The results are still cool, but not good enough to be very
useful.&lt;/p&gt;&lt;p&gt;The big difference between Fotowoosh and Make3D is the web site. Fotowoosh is
implemented as a Facebook application (!) that renders a movie where the camera moves in a preset
path around the 3D model. Make3D instead lets you move the camera around freely, and also allows
you download the 3D model in VRML format so you can import it into a 3D application and actually do
something with it. It is also possible to "fix" an image by drawing the planes by hand, helping the
Make3D algorithm do its job. I wasn't able to improve the results with this functionality.&lt;/p&gt;&lt;p&gt;It
will be interesting to follow the future development of these applications. Currently they are
still a curiosity with limited use, but hopefully the algorithms will be improved and we'll get
useful results.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Librador?a=E1EHAdvDe6E:UmXV9EvTbUE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=E1EHAdvDe6E:UmXV9EvTbUE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=E1EHAdvDe6E:UmXV9EvTbUE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=E1EHAdvDe6E:UmXV9EvTbUE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?i=E1EHAdvDe6E:UmXV9EvTbUE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Librador?a=E1EHAdvDe6E:UmXV9EvTbUE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Librador?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Librador/~4/E1EHAdvDe6E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://www.librador.com/2008/02/28/Make3D-Creates-3D-Models-from-Photos/</feedburner:origLink></entry>
 

</feed>
