<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/templates/default/atom.css" type="text/css" ?>

<feed version="0.3" 
   xmlns="http://purl.org/atom/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://blog.notdot.net/rss.php?version=atom0.3" rel="service.feed" title="Nick's blog" type="application/x.atom+xml" />
    <link href="http://blog.notdot.net/"                        rel="alternate"    title="Nick's blog" type="text/html" />
    <link href="http://blog.notdot.net/rss.php?version=2.0"     rel="alternate"    title="Nick's blog" type="application/rss+xml" />
    <title mode="escaped" type="text/html">Nick's blog</title>
    <tagline mode="escaped" type="text/html">Because repeating myself sucks.</tagline>
    <id>http://blog.notdot.net/</id>
    <modified>2008-11-19T21:55:08Z</modified>
    <generator url="http://www.s9y.org/" version="1.2">Serendipity 1.2 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>
    <info mode="xml" type="text/html">
        <div xmlns="http://www.w3.org/1999/xhtml">You are viewing an ATOM formatted XML site feed. Usually this file is inteded to be viewed in an aggregator or syndication software. If you want to know more about ATOM, please visist <a href="http://atomenabled.org/">Atomenabled.org</a></div>
    </info>

    <entry>
        <link href="http://blog.notdot.net/archives/49-Getting-O2-Irelands-Mobile-Broadband-working-in-OSX-10.5.html" rel="alternate" title="Getting O2 Ireland's &quot;Mobile Broadband&quot; working in OSX 10.5" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-07-29T15:11:42Z</issued>
        <created>2008-07-29T15:11:42Z</created>
        <modified>2008-11-19T21:55:08Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=49</wfw:comment>
        <slash:comments>2</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=49</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/49-guid.html</id>
        <title mode="escaped" type="text/html">Getting O2 Ireland's &quot;Mobile Broadband&quot; working in OSX 10.5</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                O2 Ireland proudly advertise  that their mobile broadband offering works for both Windows and Mac. Then they proceed to offer only windows instructions, with no hint of how to get it working on a mac. This is, obviously, less than helpful. To complicate things, the generic instructions for getting Huawei modems working in OSX aren't entirely sufficient: The PIN on the sim card has to be disabled first, and the Huawei app for setting the APN doesn't seem to work in 10.5. So here are the instructions, in a nutshell:<br />
<br />
1. Find a windows computer with administrator priveliges. Plug in the modem and follow the installation instructions. When prompted, enter your pin, then select Tools -> Pin Options -> Disable Pin. Enter your pin again. If you're trying these directions for a network other than O2 Ireland, this would be a good time to check the settings for the APN name, too.<br />
<br />
Yes, I know it sucks to have to use a PC to set it up. It might be possible to do this by putting the 3G sim into a cellphone and disabling the PIN using that - I haven't tried, but it seems like it should work.<br />
<br />
2. Follow the rest of the instructions <a href="http://blog.evandavey.com/2008/02/how-to-connect-huawei-e220-usb-modem.html">here</a>, with the following addenda:<br />
- You may not need to add the device as described. In my case, it automatically added itself to the network preferences panel, and just needed configuring.<br />
- The E220 drivers work fine if you have an E270, too.<br />
- If you're using O2 Ireland, the APN you want to enter is "open.internet". 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/48-I-can-has-job.html" rel="alternate" title="I can has job?" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-07-09T22:03:28Z</issued>
        <created>2008-07-09T22:03:28Z</created>
        <modified>2008-11-19T22:04:42Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=48</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=48</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/48-guid.html</id>
        <title mode="escaped" type="text/html">I can has job?</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I just came across <a href="http://lolcode.com/news/ichc-werk">this job opening</a>. I'd like to think I'm <a href="http://blog.notdot.net/archives/32-LOLCode.net-Now-your-LOLCats-can-use-the-CLR!.html">uniquely suited</a> for the position.<br /><br /><br />
Unfortunately, I don't live in the US or Canada, and I'm quite happy with my current job at Google. Oh well. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/47-Nearly-all-DHT-implementations-vulnerable-to-merge-bug..html" rel="alternate" title="Nearly all DHT implementations vulnerable to 'merge' bug." type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-06-15T12:34:09Z</issued>
        <created>2008-06-15T12:34:09Z</created>
        <modified>2008-11-19T22:04:52Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=47</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=47</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/47-guid.html</id>
        <title mode="escaped" type="text/html">Nearly all DHT implementations vulnerable to 'merge' bug.</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                As DHT implementations proliferate and harmonise, the prospect of multiple widely-deployed applications using the same or compatiable DHT implementations is increasingly becoming a reality. There are a large and increasing number of DHT libraries out there, such as <a href="http://entangled.sourceforge.net/">Entangled</a> , and <a href="http://freepastry.org/">FreePastry</a>, being used by an increasing number of applications.<br />
<br />
However, most of these implementations are vulnerable to a simple but subtle bug: They have no way of distinguishing one DHT network from another. Although each application's DHT network or networks start off separate, if, by chance or deliberate action a node from a different but compatiable DHT is introduced, the 'self healing' property of DHTs will ensure that, sooner or later, the two networks become merged into a single DHT.<br />
<br />
This is not a problem for single-purpose DHT implementations such as those used by <a href="http://bittorrent.org/">BitTorrent</a> or <a href="http://en.wikipedia.org/wiki/Overnet">Overnet</a>, since they generally establish a single DHT with all compatiable clients participating in any case. Nor is this a problem for networks designed with heterogenous applications in mind, such as <a href="http://cspace.in/">CSpace</a>. However, this still leaves a number of DHT libraries that don't fall into either of these categories.<br />
<br />
If DHTs from two distinct applications using compatiable implementations become merged, the outcome depends to a large extent on how those applications make use of the DHT. If they use compatiable parameters and only make use of the basic DHT store/retrieve/find-node functionality, the impact may be minimal, though differences in persistence time and maximum size for stored elements can still lead to issues. If the DHTs have different parameters, such as the number of nodes to replicate inserted data to, the result may be subtly broken - a DHT that no longer fulfils the guarantees the software expects from it.<br />
<br />
If the two applications expect very different things from their DHTs, though, such as a varying set of RPCs supported, the result could be a complete breakdown in the usefulness of the DHT. If your application expects that the vast majority of participating nodes will support its custom doFoo RPC (not an unreasonable expectation when you control the application), and suddenly half the nodes don't, the probability is that the application's behaviour will be severely degraded, at best.** This amounts to an entirely accidental Denial of Service attack on both applications involved.<br />
<br />
The solution is relatively simple, of course - simply add an application identifier or 'magic number' to the DHT protocol, and require each application to specify an identifier unique to it. Then, the DHT library can simply discard packets with IDs it doesn't recognise.<br />
<br />
In a quick survey of current DHT implementations, at least the following seem to be vulnerable:<br />
<ul><br />
<li><a href="http://entangled.sourceforge.net/">Entangled</a></li><br />
<li><a href="http://khashmir.sourceforge.net/">KHashmir</a></li><br />
<li><a href="http://www.thomas.ambus.dk/plan-x/routing/">Plan-X</a></li><br />
<li><a href="http://www.heim-d.uni-sb.de/~heikowu/SharkyPy/">SharkyPy</a></li><br />
<li><a href="http://open-chord.sourceforge.net/">Open Chord</a></li><br />
<li><a href="http://current.cs.ucsb.edu/projects/chimera/">Chimera</a></li><br />
</ul><br />
<a href="http://freepastry.org/">Freepastry</a> is notable in that it does provide for a 'magic number' facility. However, this is buried deep in the protocol stack, and is not required in order to create a Freepastry DHT instance.<br />
<br />
I'm not aware of this bug occurring yet, but with increasing use of DHTs, it seems to me to be all but inevitable that it will occur at some point. Further, restoring normal behaviour after it has occurred is likely to be extremely difficult, likely requiring starting an entirely new DHT instance and moving all existing clients over to it.<br />
<br />
** Please forgive my overuse of generalities. As I'm speaking of a general bug shared across many libraries and implementations, it's hard to be specific about the impact. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/46-SMTP-to-HTTP-gateway-for-your-App-Engine-and-other-apps!.html" rel="alternate" title="SMTP to HTTP gateway for your App Engine (and other) apps!" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-06-14T21:23:13Z</issued>
        <created>2008-06-14T21:23:13Z</created>
        <modified>2008-11-19T22:32:11Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=46</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=46</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/46-guid.html</id>
        <title mode="escaped" type="text/html">SMTP to HTTP gateway for your App Engine (and other) apps!</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                In response to a comment in the freenode.net/#appengine channel by someone wishing their App Engine app could receive email, I put together <a href="http://www.smtp2web.com/">smtp2web</a>, a simple service that accepts mail for an address (or your entire domain), and sends it via HTTP POST to a URL you specify. If you're running in a restricted environment such as App Engine, this means you can now receive email. Even if you're not, this is a lot simpler to use than writing your own SMTP server (or adding custom handlers to most existing servers).<br />
<br />
Someone's <a href="http://almaer.com/blog/smtp2webcom-bridge-smtp-to-http-let-app-engine-accept-email">already blogged about it</a>, too. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/45-Read-this-Little-Brother-by-Cory-Doctorow.html" rel="alternate" title="Read this: Little Brother by Cory Doctorow" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-06-02T13:46:35Z</issued>
        <created>2008-06-02T13:46:35Z</created>
        <modified>2008-11-19T22:32:55Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=45</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=45</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/45-guid.html</id>
        <title mode="escaped" type="text/html">Read this: Little Brother by Cory Doctorow</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Last night, having finally found my <a href="http://www.bookeen.com/">Cybook</a> again, I downloaded <a href="http://www.craphound.com/">Cory Doctorow</a>'s latest novel, <a href="http://craphound.com/littlebrother/">Little Brother</a>. Like all his other works, it's available for <a href="http://craphound.com/littlebrother/download/">free download</a> under a creative commons license, and like all his other books, it's excellent.<br />
<br />
Unlike his other books, Little Brother is <strong>scary</strong>. Not scary in a "something's creeping up behind you" sort of way, but scary in a "completely plausible, yet utterly terrifying" way. The book is set in the (very) near future, and is focused around some of the most surveiled people in society - no, not prison inmates, high-school children. Imagine George Orwell's 1984, only a lot more immediate. Though disturbing enough to begin with, describing as it does worrying yet (alas) completely plausible intrusions in the name of 'security', everything takes a turn for the worse when a terrorist attack sends security paranoia into overdrive.<br />
<br />
This is not a light hearted, "fun" novel. Though I don't live in the US, what happens there in the name of the "war on terror" affects me and everyone else. Starting as it did from a plausible and worryingly immediate beginning, the plot developments followed the same pattern, making it hard to criticise any of them as particularly unlikely. The result - something as bad in its way as any tin-pot dicatorship in a third world country - drives home just where this absurd path leads.<br />
<br />
It's not all doom and gloom, though. The actions of the protagonist in fighting back against the absurdities and stupidities of modern security theater are things that anyone with access to <a href="http://www.instructables.com/member/w1n5t0n/">instructables</a> and a hell of a lot of guts can do, and the use of social networking and the internet to organise a large group of people around a common goal is simultaneously realistic and encouraging.<br />
<br />
I started reading this as an ebook last night, and by the time I was halfway through, had ordered 4 copies off <a href="http://www.amazon.com/Little-Brother-Cory-Doctorow/dp/0765319853/">Amazon</a> - this is a book I want to show to as many people as I can. Though it's aimed at teens, it's excellent reading for anyone socially aware and with a bent for technology.<br />
<br />
I only hope that we can do our best to make this novel age as badly as possible. I sincerely hope that my (thus-far hypothetical) children someday read this book and scoff at how ridiculous it is. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/44-Response-from-Gohop.html" rel="alternate" title="Response from Gohop" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-04-10T00:00:00Z</issued>
        <created>2008-04-10T00:00:00Z</created>
        <modified>2008-11-19T22:31:37Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=44</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=44</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/44-guid.html</id>
        <title mode="escaped" type="text/html">Response from Gohop</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I did eventually get a response from Gohop - my apologies for not posting it sooner. Here's the response:<br />
<div class="bb-code-title">QUOTE:</div><div class="bb-quote"><br />
Dear Mr. Johnson,<br />
 <br />
Thank you for your email received, the contents of which have been noted and passed to our IT department for investigation.<br />
 <br />
Firstly, may I say how disappointing it is for us to be made aware of any aspects of our customers holiday that fail to reach complete satisfaction.  Gohop.ie are a privately owned and Irish operated Travel Agency and we rely heavily on goodwill and repeat clients, the comments we receive from our customers are treated with the utmost respect.  We pride ourselves in devising good quality and good prices but above all high customer service.<br />
 <br />
Naturally we are most concerned to learn of your dissatisfaction with the organization of your seat assignments.  We always Endeavour to secure the best seating as requested from our clients, despite this however, subject to seat allocation at time of booking, the system in this case booked the next available alternatives, seating you apart.   I would like to advise you at this point that this is the first problem of its kind we have come across and are most certainly not aware of airline check-in staff having difficulty with us in the past for this or any other reason.<br />
 <br />
Rest assured however that any issues brought to our attention which may affect the enjoyment of any flights sold are fully investigated, as a result we are currently removing the seat assignment facility from our website this week until this matter is fully investigated and resolved.  It is only through emails such as your containing constructive criticism that enables us to ensure a continued raising of our overall standards.<br />
 <br />
In conclusion I am sorry that on this occasion you felt that your return journey was not entirely satisfactory and I do hope you will consider affording us the opportunity of attending to your travel needs again in the not too distant future when we are fully confident that all arrangements made on your behalf will meet with your entire satisfaction, allowing us the opportunity to restore your faith in our company.<br />
 <br />
Assuring you of our very best intentions in this regard.<br />
 <br />
Your sincerely,<br />
 <br />
Hilary Dunne<br />
Reservations Manager<br />
Gohop.com<br />
</div><br />
<br />
Not entirely to my satisfaction, since they haven't promised to do anything, really - just offered an apology.<br />
<br />
Edit: Also worth noting is that she claims that "the system in this case booked the next available alternatives, seating you apart", which contradicts what the arline told us - that our tickets weren't group-coded in the first place, so 'the system' didn't know it should be trying to seat us together at all. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/43-Dont-use-gohop.ie-to-book-your-flights!.html" rel="alternate" title="Don't use gohop.ie to book your flights!" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-04-02T16:38:17Z</issued>
        <created>2008-04-02T16:38:17Z</created>
        <modified>2008-05-21T15:32:31Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=43</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=43</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/43-guid.html</id>
        <title mode="escaped" type="text/html">Don't use gohop.ie to book your flights!</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Here's the email I just sent gohop:<br />
<blockquote>Hello,<br />
<br />
Recently, my fiance and I booked tickets back to our home country of New Zealand for our wedding using gohop.ie. We encountered some issues on the way there - auto check-in systems only brought up one reservation, seats had to be re-arranged, etc, but were not fully aware of the scope of the issues until our trip back to Dublin.<br />
<br />
Our flight from Auckland, NZ to London was fully booked, and when we checked in, we discovered that our seats were not adjacent - not even in the same row, as a matter of fact. The cause of this, it turns out, is that gohop does not group code tickets purchased through your site. Your company, it appears, is somewhat infamous amongst airline checkin personnel because of this - as soon as I mentioned gohop, I got a resigned sigh and a nod of understanding.<br />
<br />
Despite efforts well above and beyond the call of duty by airline staff - including asking other people to accept alternate seats - a process which delayed the departure of the entire plane due to us and others not having suitable seats, they were unable to find us adjacent seats. As a result, my wife and I had an extremely unpleasant first leg of our trip. Despite the second leg being just as busy, the airline somehow managed to find us seats that were adjacent, mitigating the unpleasantness somewhat.<br />
<br />
Group coding is something that nearly every other travel agency - online and off - seems to manage just fine, and it's an essential component for anyone booking a party of more than one person. Adjacent seating on a long plane journey for a small party is hardly a big ask. I was not notified when booking tickets that this would not be the case, leading to problems at every stage of our journey. I would like to learn why you are unable to do this, and what you intend to do about this lack. At the very least you have a responsibility to make your customers aware that you don't provide something most people would regard as a basic service.<br />
<br />
Because of your inability to group-code, my wife and I had an extremely unpleasant return from our honeymoon. At a time where most people hope for a seat upgrade, we were not even able to sit beside one another. Many other people besides ourselves were inconvenienced - airline staff had to spend significant time attempting to fix seating arrangements, and the entire plane was delayed as they attempted to reseat people. Until this problem is resolved, I intend to avoid a repeat of this experience by avoiding using your service, and suggesting everyone I know do the same.<br />
<br />
Regards,<br />
<br />
Nicholas Johnson</blockquote><br />
<br />
Update: I got a <a href="http://blog.notdot.net/archives/44-Response-from-Gohop.html"  class="bb-url">response</a> 8 days later.<br />
 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/42-Married!.html" rel="alternate" title="Married!" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-04-02T16:22:31Z</issued>
        <created>2008-04-02T16:22:31Z</created>
        <modified>2008-11-19T22:31:26Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=42</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=42</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/42-guid.html</id>
        <title mode="escaped" type="text/html">Married!</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Just a quick update: Yes, I did get back from Switzerland (with a new passport), eventually.<br />
<br />
I also went back to NZ, got married to my (now) wife Hayley, and had a wonderful honeymoon. After a horrid flight back (about which more later), we're now back in Ireland and ready to go back to work.<br />
<br />
Photos of the wedding will be forthcoming in a week or two for anyone who cares. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/41-Stuck-in-Switzerland.html" rel="alternate" title="Stuck in Switzerland" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2008-01-01T20:17:46Z</issued>
        <created>2008-01-01T20:17:46Z</created>
        <modified>2008-11-19T22:31:22Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=41</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=41</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/41-guid.html</id>
        <title mode="escaped" type="text/html">Stuck in Switzerland</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                (Though of all the places to be stuck, this isn't a bad one)<br />
<br />
I've been on holiday in Switzerland with my SO for the past few days, staying with a friend. Just after christmas, however, we took the train up to Zermatt to spend the night and see the matterhorn. However, on the train from Losanne to Visp, my bag was stolen. The bag containing my Passport and my Work Permit, not to mention my work laptop, the new watch I bought just the day before, and a bunch of other things. <br />
<br />
To top it off, it looks like we're <u>not</u> covered by travel insurance (I thought we were). <br />
<br />
And now I can't leave until I get a new passport issued and mailed to me. Fortunately, this only takes 3 days (plus postage) if I pay for expedited processing, but the passport office doesn't open until the 3rd.<br />
<br />
Also on the plus side, I got some nice photos of the fantastic fireworks show in Zurich for new year, which I hope to post soon, and I'm able to work out of our Zurich office while I wait for my passport. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/40-Cryptographically-secure-IOUs-without-a-trusted-third-party.html" rel="alternate" title="Cryptographically secure IOUs without a trusted third-party" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-11-09T22:20:13Z</issued>
        <created>2007-11-09T22:20:13Z</created>
        <modified>2007-11-10T17:09:49Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=40</wfw:comment>
        <slash:comments>1</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=40</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/40-guid.html</id>
        <title mode="escaped" type="text/html">Cryptographically secure IOUs without a trusted third-party</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Recently, a friend and I were discussing peer-to-peer systems, and the difficulty of tracking obligations, and of reliably reporting a peer's actions while making fraud difficult or impossible. A subset of this problem is P2P currency: I want to be able to write someone a promissory note or IOU in such a way that they can transfer it to other parties (presumably to eventually be redeemed by them), but without them being able to duplicate it (or rather, in such a way that duplicates are detectable, and the identity of the peer to duplicate it can be determined). So our hypothetical peer-to-peer currency requires the following attributes:<ul><li><b>Non-deniability</b> - The issuer must not be able to plausibly claim they did not issue the IOU. He must also be unable to claim the note has already been redeemed unless he can prove it somehow.</li><li><b>Transferability</b> - The current owner of a note must be able to transfer it to a new owner, without requiring the involvement of the original issuer, or any trusted third-party.</li><li><b>Accountability</b> - If the note is modified or duplicated, it must be possible to determine who tampered with it.</li></ul>The solution, it turns out, is relatively simple. First, assume every peer has its own public/private keypair, which serves as its identity. Further assume that every peer knows every other peer's public key, or has some way to determine it. <br />
<br />
To issue a note, the issuer creates a new note, with a header specifying the identity of the issuer, the value of the note, the time it was issued, and any other details - for example, the note may have an expiration date.<br />
<br />
Whenever the current owner of the note wishes to transfer it to a new owner, he appends the identity of the new owner to the note and signs the whole thing with his public key. Every note will have at least one owner and signature appended, as the original issuer does this when giving the IOU to its original recipient.<br />
<br />
A note's validity can be checked by verifying the 'chain of custody' described by the identities and signatures, which must follow the pattern id(issuer), id(a), sig(issuer), id(b), sig(a), id(c), sig(b), ... Further, any peer can prove to any other peer that they own a particular (valid IOU) by simply sending it to them - notes need not be kept secret, as they are useless to anyone other than the person whose identity is last in the chain of custody. Thus, peers considering an exchange can simply send each other all their notes so they can be examined and offers made.<br />
<br />
If a peer wishes to try and duplicate a note, they must either invalidate the chain of custody, rendering the note useless, or duplicate it, appending a different identity in each case and signing it. When the note is discovered to have been duplicated - eg, at the point when someone attempts to redeem a note a second time - the identity of the fraudster can be determined by comparing the chains of custody and identifying the last peer the two notes have in common.<br />
<br />
The value of a note to a peer in a system where fraud may be attempted is not the face value of a note, however. The value to a peer is the face value of the note, multiplied by the probability that it believes each peer in the chain was honest and did not duplicate the note, multiplied by other factors, such as a consideration for how close the note is to expiry, if that is implemented. Since this means that notes with longer chains of custody are worth less than those with shorter ones, it should be possible, if the original issuer is online, for a peer to send the note back to the issuer, requesting a 'new' one with a blank chain of custody (but the same value and expiry date) in return. This way, trust can be enhanced without requiring the original issuer to be online at all times.<br />
<br />
It is also worth noting that in cases when a peer attempts to redeem or renew a note, only to be told by the issuer that that note has already been redeemed, and that their copy is worthless, that the peer need not take the issuer's word for it - they can demand a copy of the note that was redeemed, which serves as both proof and a means of identifying the culprit.<br />
<br />
One major issue that this system does <u>not</u> solve is that any peer can invent as many cryptographic identities as they wish, and if they wish to commit fraud, they can use those identities to do so. Analysis techniques can likely be used to track down the actual culprit in scenarios like this, but this could be arbitrarily difficult to do. Alternately, a trusted third party issuer could be required for certificates only, or the peer's identity could be based on their IP address or other identifying factor, limiting the number of identities they can invent.<br />
<br />
Finally, it's worth noting that the system proposed here is very similar to that used to endorse checks in the real world.<br />
<br />
Feedback on this algorithm is much appreciated. Ideas on how a practical peer-to-peer transfer or storage system could practically use such an algorithm are also appreciated! 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/39-Update-on-Anagram-Trees.html" rel="alternate" title="Update on Anagram Trees" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-10-20T03:01:31Z</issued>
        <created>2007-10-20T03:01:31Z</created>
        <modified>2008-11-19T22:30:51Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=39</wfw:comment>
        <slash:comments>7</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=39</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/39-guid.html</id>
        <title mode="escaped" type="text/html">Update on Anagram Trees</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <a href="http://blog.notdot.net/archives/38-Damn-Cool-Algorithms,-Part-3-Anagram-Trees.html ">Original Post</a><br />
<br />
One nice thing about working at Google is that you are surrounded by very smart people. I told one of my coworkers about the anagram tree idea, and he immediately pointed out that reordering the alphabet so that the least frequently used letters come first would reduce the branching factor early in the tree, which has the effect of reducing the overall size of the tree substantially. While this seems obvious in retrospect, it's kind of unintuitive - usually we try to <u>increase</u> the branching factor of n-ary trees to make them shallower and require fewer operations, rather than trying to reduce it.<br />
<br />
Trying it out with an ordering determined by looking at the branching factor for each letter produces results that bear this out: Memory is reduced by about a third, and the number of internal nodes is reduced to 858,858 from 1,874,748, a reduction of more than 50! Though I haven't benchmarked it, difficult lookups are substantially faster, too.<br />
<br />
The next logical development to try is to re-evaluate the order of the alphabet on a branch-by-branch basis. While I doubt this will have a substantial impact, it seems worth a try, so I'll give it a go and update with results.<br />
<br />
Edit: Re-evaluating the symbol to choose on a branch-by-branch basis had a bigger impact than I anticipated: The tree created with my sample dictionary now has a mere 661,659 internal nodes. Here's the procedure for creating a tree using this method:<br />
<br />
Assuming you have:<ul><li>A dictionary</li><li>A set of symbols that have not yet been used (initially set to the alphabet)</li></ul><ol><li>If the symbol set is empty, this is a leaf node - store the dictionary in the node and return.</li><li>Find the symbol from the set that, if used, will result in the smallest number of branches (that is, the symbol that has the least variation in number of occurrences).</li><li>Mark the current node with the chosen symbol</li><li>Partition the dictionary into sub-dictionaries based on how many occurrences of the chosen symbol they have</li><li>For each sub-dictionary, recurse with the sub-dictionary and the set less the symbol you selected.</li></ol>Implemented in Python, this is actually substantially larger in memory and on disk than the previous approach, likely due to overhead with using classes instead of tuples as the nodes. In statically-typed languages, however, the overhead should be substantially outweighed by the benefit of the reduction in node count.<br />
<br />
Note that the result of this alternate method is that while the letter to branch on is different for every node, following nodes from any leaf to the root of the tree always results in a valid permutation of the alphabet used.<br />
<br />
Edit 2: The code for a Python implementation incorporating these ideas can be found <a href="http://blog.notdot.net/uploads/subsettree.pys">here</a>. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/38-Damn-Cool-Algorithms,-Part-3-Anagram-Trees.html" rel="alternate" title="Damn Cool Algorithms, Part 3: Anagram Trees" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-10-19T03:00:50Z</issued>
        <created>2007-10-19T03:00:50Z</created>
        <modified>2008-11-19T22:30:34Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=38</wfw:comment>
        <slash:comments>20</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=38</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/38-guid.html</id>
        <title mode="escaped" type="text/html">Damn Cool Algorithms, Part 3: Anagram Trees</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I hesitate to call this algorithm "damn cool", since it's something I invented* it myself, but I think it <u>is</u> rather cool, and it fits the theme of my algorithms posts, so here it is anyway.<br />
<br />
When it comes to finding anagrams of words, a frequent approach is to use an <a href="http://en.wikipedia.org/wiki/Anagram_dictionary">anagram dictionary</a> - simply put, sort the letters in your word to provide a unique key that all anagrams of a word have in common. Another approach is to generate a letter-frequency histogram for each letter in your word. (Both these approaches are more or less equivalent, in fact.) These approaches make the problem of finding exact single-word anagrams for strings very efficient - O(1) if you use a hashtable. <br />
<br />
However, the problem of finding subset anagrams - a word that contains a subset of the letters in a string - is still rather inefficient, requiring either a brute force O(n) search through the dictionary, or looking up every substring of the sorted input string, which is O(2^l) with the number of letters in the input string. Finding subset anagrams is significantly more interesting, too, as it has applications in finding multi-word anagrams, as well as being applicable to problem domains such as scrabble.<br />
<br />
However, with a little more effort, and the above observation that we can generate a histogram that uniquely represents a given set of letters, we can generate a tree structure that makes looking up subset anagrams much more efficient. To build the tree, we follow this simple procedure:<br />
<br />
Assume we have the following information:<ul><li>A lexicon or dictionary of words to populate the tree with</li><li>An alphabet for words in the lexicon</li><li>The tree we are building</li><li>A current node</li></ul>For each term in the lexicon:<ol><li>Generate a letter-frequency histogram for the term.</li><li>Set the current node to the root of the tree.</li><li>For each symbol in the alphabet:<ol><li>Get the frequency of the current symbol in the current term. Call it <i>f</i></li><li>Set the current node to the f<sup>th</sup> child node of the current node, creating it if it doesn't exist</li></ol></li><li>Append the current term to the list of words on the current (leaf) node</li></ol><br />
The result of following this simple procedure is a fixed-height tree, 27 nodes deep, with all the words in the leaf nodes, and each internal tier of the tree corresponding to a symbol from the alphabet. Here's an (abbreviated) example:<br />
<img width='464' height='477' style="border: 0px; padding-left: 5px; padding-right: 5px;" src="http://blog.notdot.net/uploads/anagramtree.png" alt="" /><br />
<br />
Once the tree is built, we find subset anagrams for an input string as follows:<br />
<br />
Assume we have the following information:<ul><li>The tree we built using the above procedure.</li><li>The alphabet we used above.</li><li>A frontier set, initially empty.</li></ul><ol><li>Initialize the frontier set to contain the root of the tree.</li><li>Generate a letter-frequency histogram for the input string.</li><li>For each symbol in the alphabet:<ol><li>Get the frequency of the current symbol in the input string. Call it <i>f</i>.</li><li>For each node in the current frontier set, add the subnodes numbered 0 through f to the  new frontier set.</li></ol></li><li>The frontier set now consists of leaf nodes, containing all the subset anagrams of the input string.</li></ol><br />
Runtime analysis of this algorithm is rather difficult, for me, at least. Intuitively and in practice, it's a lot faster than either of the brute-force approaches, but quantifying that in big-O notation is something that's escaped me. As an upper bound, it cannot be less efficient than O(n) - only a constant factor worse than the brute-force approach. As a lower bound, a lookup in which the frontier set always has one node, lookup time is proportional to the length of the alphabet, or O(1). The average case depends on how large a subset of the dictionary the input string selects. Quantifying by the size of the output, approximately O(m) operations are required. If anyone knows how to determine more solid bounds for runtime, please do let me know in the comments.<br />
<br />
One disadvantage of this approach is that there is substantial memory overhead. Using my Python implementation of the algorithm, and importing /usr/share/dict/words, which is approximately 2MB on this machine results in over 300MB of memory consumed. Using the Pickle module to serialize to disk, the output file is over 30MB, and compresses with gzip down to about 7MB. I suspect part of the large memory overhead is due to the minimum size of Python's dictionaries; I will modify the implementation to use lists and update this post if I can make it more efficient.<br />
<br />
Here's a few stats on the tree generated that may be of interest:<br />
Total words: 234,936<br />
Leaf nodes: 215,366<br />
Internal nodes: 1,874,748<br />
<br />
From this we can see that the average cardinality of internal nodes is very low - not much more than 1. A breakdown of the number of nodes in each tier helps clarify this:<br />
<table><tr><th>Tier</th><th>Number of nodes</th></tr><tr><td>0</td><td> 1</td></tr><tr><td>1</td><td> 7</td></tr><tr><td>2</td><td> 25</td></tr><tr><td>3</td><td> 85</td></tr><tr><td>4</td><td> 203</td></tr><tr><td>5</td><td> 707</td></tr><tr><td>6</td><td> 1145</td></tr><tr><td>7</td><td> 1886</td></tr><tr><td>8</td><td> 3479</td></tr><tr><td>9</td><td> 8156</td></tr><tr><td>10</td><td> 8853</td></tr><tr><td>11</td><td> 10835</td></tr><tr><td>12</td><td> 19632</td></tr><tr><td>13</td><td> 28470</td></tr><tr><td>14</td><td> 47635</td></tr><tr><td>15</td><td> 73424</td></tr><tr><td>16</td><td> 92618</td></tr><tr><td>17</td><td> 94770</td></tr><tr><td>18</td><td> 125018</td></tr><tr><td>19</td><td> 156406</td></tr><tr><td>20</td><td> 182305</td></tr><tr><td>21</td><td> 195484</td></tr><tr><td>22</td><td> 200031</td></tr><tr><td>23</td><td> 203923</td></tr><tr><td>24</td><td> 205649</td></tr><tr><td>25</td><td> 214001</td></tr></table><br />
The cardinality of nodes towards the top of the tree is fairly high, but the tree quickly flattens out, and the last four tiers of the tree account for almost half of the total nodes. This suggests one possible space optimisation: Removing the last few tiers of the tree and concatenating their leaf nodes together. When performing lookups, check the selected nodes to ensure they are actually subset anagrams of the input string.<br />
<br />
* It's possible I'm simply rediscovering something that's well known in the computer science community, or perhaps mentioned in a computer science paper 30 years ago. Significant searching hasn't turned up anyone using an algorithm like this, or anything else more efficient than the brute-force approaches outlined.<br />
<br />
Edit: The source to my initial implementation is <a href="http://blog.notdot.net/uploads/anagramfinder.pys">here</a>.<br />
<br />
Edit: Converting my Python implementation to use lists reduced memory consumption by roughly half. I'll post figures for the pickled tree and the source code when I have the opportunity.<br />
<br />
Edit: More updates can be found <a href="http://blog.notdot.net/archives/39-Update-on-Anagram-Trees.html">here</a>. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/37-Damn-Cool-Algorithms,-Part-2-Secure-permutations-with-block-ciphers.html" rel="alternate" title="Damn Cool Algorithms, Part 2: Secure permutations with block ciphers" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-09-30T00:34:26Z</issued>
        <created>2007-09-30T00:34:26Z</created>
        <modified>2008-11-20T08:46:03Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=37</wfw:comment>
        <slash:comments>3</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=37</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/37-guid.html</id>
        <title mode="escaped" type="text/html">Damn Cool Algorithms, Part 2: Secure permutations with block ciphers</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                It's been too long since I blogged about anything much, and way too long since I posted the first <a href="http://blog.notdot.net/archives/30-Damn-Cool-Algorithms,-Part-1-BK-Trees.html">Damn Cool Algorithms</a> post, which I promised would be a series. So here's part 2.<br />
<br />
To start, I'm assuming you know what a <a href="http://en.wikipedia.org/wiki/Permutation">permutation</a> is - basically a shuffling of a sequence of items in a particular order. A permutation of the range 1-10, for example, is {5,2,1,6,8,4,3,9,7,10}. A secure permutation is one in which an attacker, given any subset of the permutation, cannot determine the order of any other elements. A simple example of this would be to take a cryptographically secure pseudo-random number generator, seed it with a secret key, and use it to shuffle your sequence.<br />
<br />
What if you want to generate a really, really big permutation - one so big precomputing and storing it isn't practical or desirable? Furthermore, what if you want it to be a secure permutation? There's a really neat trick we can pull with block ciphers that allows us to generate a secure permutation over any range of numbers without first having to precompute it.<br />
<br />
A <a href="http://en.wikipedia.org/wiki/Block_cipher">block cipher</a>, for anyone that isn't familiar with them, is a common cryptographic primitive. It takes blocks of ciphertext of some fixed lengths - 64 or 128 bits is common - and encrypts it. Given the same key and the same block of plaintext, it will always generate the same block of ciphertext. Messages larger than a single block are encrypted using one of a number of <a href="http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation">modes of operation</a>, allowing messages much larger than a single block to be encrypted and decrypted securely. When using a block cipher for encryption, choice of the mode of operation is critical. For the purposes of generating a secure permutation, however, we're only going to be encrypting a single block at a time, so we don't have to worry about modes of operation.<br />
<br />
If you look at how a block cipher operates - taking any block of a given length (think of blocks as very large numbers here) and converting it uniquely to another block, such that it can be converted back again, a block cipher is already a secure permutation. If we progressively encrypt larger numbers (1, 2, 3, and so on), we get out a random seeming sequence of output numbers that is guaranteed not to repeat as long as we don't repeat our input. It's easy to prove this to yourself: If it repeated, then you would have two input numbers with a single output number, and it would thus be impossible to decrypt uniquely. So the same properties that a block cipher requires are the properties that make it useful to us.<br />
<br />
All very well, you say, but what if I want a permutation over a range that isn't a power of two? This is where the clever trick comes in. Take a block cipher that's got a block length slightly larger than you want. Use it as described above, encrypting progressively higher numbers in a sequence to generate elements in the permutation. Whenever the output of the encryption is outside the range you want for your permutation, just encrypt it again. Repeat until you get a number within the range you want. Again, we're guaranteed uniqueness by the block cipher, and we're also guaranteed (by exhaustion) that we will eventually get a number within the desired range.<br />
<br />
Obviously, there are some factors that need to be taken into consideration before pursuing this route. You want to select a block cipher that is not much larger than the range you wish to generate a permutation over - preferably the next power of two. The ratio of the cipher's range to the permutation's range defines the average amount of work you will have to perform, so if the cipher has a range four times that of your permutation, you'll need to do an average of four encryptions for each value. Since most block ciphers are 64, 128, or more bits, this can be problematic. For this purpose, I've found the <a href="http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm">TEA</a> cipher to be particularly adaptable. It is easy to create variants that are 32, 64, 128 or more bits long, and from there, the bitshifts in the main loop are easily adjusted to produce a cipher with a length that's any power of 4, without needing to shorten the key to the point where it's easily brute-forced.<br />
<br />
It's also worth noting that although this technique is aimed at generating very large secure permutations, it is equally useful for a permutation that doesn't need to be secure or secret - your secret key simply becomes your random seed for the permutation. There are many situations in which this can be useful - what you essentially have is a mapping function from index to permutation value, so you can calculate the value of any subset of the permutation that you wish.<br />
<br />
Finally, bear in mind that due to the factorial explosion of the number of possible permutations, the keyspace of your cipher is almost certainly going to be much smaller than the number of possible permutations. For most purposes this probably does not matter, since the number of possible permutations is too large to enumerate anyway, but if your key is sufficiently short, it allows the possibility of an attacker doing an exhaustive search of your keyspace to find the permutation that generates the subsequence of the permutation he has access to.<br />
<br />
Update: Yossi Oren points to <a href="http://www.cs.ucdavis.edu/~rogaway/papers/subset.pdf">this excellent paper</a> in the comments. It covers exactly what I describe here (only much more comprehensively, of course). 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/36-Apartments-in-Dublin.html" rel="alternate" title="Apartments in Dublin" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-09-09T09:52:39Z</issued>
        <created>2007-09-09T09:52:39Z</created>
        <modified>2008-11-20T08:46:10Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=36</wfw:comment>
        <slash:comments>4</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=36</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/36-guid.html</id>
        <title mode="escaped" type="text/html">Apartments in Dublin</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                Yesterday morning, someone from the relocation company came by to pick me up and take me on a bit of a tour of Dublin, with an emphasis on the sort of neighbourhoods I might like to live in. There's a fairly wide variety of housing available here in Dublin, though if you want a garden you're more or less out of luck unless you're particularly wealthy.<br />
<br />
One particular place that impressed me, however, were the apartments at the Gasworks - the same facility the Google offices are on. There's a lot of apartment buildings there, all fairly nice, but the really impressive one is the old Gasometer. Basically, they took a <a href="http://en.wikipedia.org/wiki/Gasometer">gasometer</a>, demolished everything but the frame, then built an apartment building inside it. It's pretty big:<br />
<a href='http://blog.notdot.net/uploads/gasworks-1.jpg'><img width='110' height='59' style="border: 0px; padding-left: 5px; padding-right: 5px;" src="http://blog.notdot.net/uploads/gasworks-1.serendipityThumb.jpg" alt="" /></a><br />
<br />
What's really impressive, though, is what they've done inside. The building is shaped like a torus, with a large open area in the middle. They've planted a large tree in the center, and the end effect is that you have almost a sanctuary-type environment inside. My pictures really don't do it justice, especially with the overcast weather we're having, but here they are anyway:<br />
<br />
<a href='http://blog.notdot.net/uploads/gasworks-tree-1.jpg'><img width='86' height='110' style="float: left; border: 0px; padding-left: 5px; padding-right: 5px;" src="http://blog.notdot.net/uploads/gasworks-tree-1.serendipityThumb.jpg" alt="" /></a> <a href='http://blog.notdot.net/uploads/gasworks-tree-2.jpg'><img width='73' height='110' style="float: left; border: 0px; padding-left: 5px; padding-right: 5px;" src="http://blog.notdot.net/uploads/gasworks-tree-2.serendipityThumb.jpg" alt="" /></a> <a href='http://blog.notdot.net/uploads/gasworks-tree-3.jpg'><img width='110' height='73' style="border: 0px; padding-left: 5px; padding-right: 5px;" src="http://blog.notdot.net/uploads/gasworks-tree-3.serendipityThumb.jpg" alt="" /></a><br />
<br />
<br />
<br />
None of the apartments are inhabited yet - I presume there's some finishing work yet to be done. I really hope they're renting them about the time we need one - it looks like it'd be a really cool place to live. 
            </div>
        </content>

        
    </entry>
    <entry>
        <link href="http://blog.notdot.net/archives/35-First-week-at-Google-Dublin.html" rel="alternate" title="First week at Google Dublin" type="text/html" />
        <author>
            <name>Arachnid</name>
            <email>nospam@example.com</email>
        </author>
    
        <issued>2007-09-09T09:50:20Z</issued>
        <created>2007-09-09T09:50:20Z</created>
        <modified>2008-11-19T22:53:33Z</modified>
        <wfw:comment>http://blog.notdot.net/wfwcomment.php?cid=35</wfw:comment>
        <slash:comments>0</slash:comments>
        <wfw:commentRss>http://blog.notdot.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=35</wfw:commentRss>
    
        <id>http://blog.notdot.net/archives/35-guid.html</id>
        <title mode="escaped" type="text/html">First week at Google Dublin</title>
        <content type="application/xhtml+xml" xml:base="http://blog.notdot.net/">
            <div xmlns="http://www.w3.org/1999/xhtml">
                I just finished my first week at Google Dublin. It's been a blast.<br />
<br />
The first couple of days of general induction are a bit slow, but once you meet your team, stuff really speeds up. The sheer amount of information I've been exposed to and had to learn this week is astounding.<br />
<br />
I'm really looking forward to next week, not to mention going down to Mountain View for more training. 
            </div>
        </content>

        
    </entry>
</feed>