<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>Torsten Curdt's weblog</title>
	
	<link>http://vafer.org/blog</link>
	<description>ramblings of a creative mind</description>
	<pubDate>Wed, 03 Dec 2008 01:48:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.5</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/tcurdt" type="application/rss+xml" /><item>
		<title>Java classpath and directories</title>
		<link>http://vafer.org/blog/20081203024812</link>
		<comments>http://vafer.org/blog/20081203024812#comments</comments>
		<pubDate>Wed, 03 Dec 2008 01:48:12 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=723</guid>
		<description><![CDATA[The java classpath and directories has always been quite a sad story. Of course you were always able to pass a directory of classes to the jvm like this:
java -classpath classes Main
But what you usually deal with these days are jars. Often quite a bunch of them. So fair enough - let&#8217;s add a directory [...]]]></description>
			<content:encoded><![CDATA[<p>The java classpath and directories has always been quite a sad story. Of course you were always able to pass a directory of classes to the jvm like this:</p>
<pre>java -classpath classes Main</pre>
<p>But what you usually deal with these days are jars. Often quite a bunch of them. So fair enough - let&#8217;s add a directory with jars as well:</p>
<pre>java -classpath classes:lib Main</pre>
<p>Up until java 5 all you got was a <em>ClassNotFoundException</em> because java did not search for jars but classes in there. It just ignored the jars. So what pretty much everyone ended up doing is providing yet another shell script to build up the classpath and pass it to the jvm via command line. Of course for bigger projects this let to&#8230;</p>
<pre>java -classpath lib/commons-logging-1.1.1.jar:lib/commons-jci-core-1.0.jar:commons-io-1.2.jar:lib/junit-3.8.2.jar:lib/maven-project-2.0.8.jar:lib/rhino-js-1.6.5.jar: ...</pre>
<p>I guess you see where I am going &#8230;an unmanageable mess of a command line. But thankfully times have changed. Starting with java 6 (mustang) <a href="http://blogs.sun.com/mr/entry/class_path_wildcards_in_mustang">you can now use wildcards</a> in the classpath:</p>
<pre>java -classpath classes:lib/'*' Main</pre>
<p>Naturally this means that the order of the jars is implicit. Which in turn means you need to be extra careful when there are classpath clashes. But in general I think this is a nice feature that should have been there from day one &#8230;and I just found out about it.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/473102008" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081203024812/feed</wfw:commentRss>
		</item>
		<item>
		<title>Perceived Performance</title>
		<link>http://vafer.org/blog/20081129080225</link>
		<comments>http://vafer.org/blog/20081129080225#comments</comments>
		<pubDate>Sat, 29 Nov 2008 07:02:25 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[flickr]]></category>

		<category><![CDATA[performance]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=710</guid>
		<description><![CDATA[While tuning your server for performance is a good thing it&#8217;s not the only thing you should look at. Lately my blog pages felt to be loading a bit slow. Looking at the Safari network timeline it&#8217;s obvious that the flickr badge is (at least sometimes) dog slow and prevents the page to build up. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/tcurdt/3063025613/" title="before by Torsten Curdt, on Flickr"><img src="http://farm4.static.flickr.com/3011/3063025613_9c0699174e_m.jpg" width="240" height="127" alt="before" /></a>While tuning your server for performance is a good thing it&#8217;s not the only thing you should look at. Lately my blog pages felt to be loading a bit slow. Looking at the Safari network timeline it&#8217;s obvious that the flickr badge is (at least sometimes) dog slow and prevents the page to build up. The perceived performance suffers. And this has nothing to do with my server at all.</p>
<p>As there really no need for the flickr badge to be up-to-date to the second. I am caching it locally now. A cron script gets a copy and writes it to disk.</p>
<pre>
$ cat /etc/cron.daily/flickr
#!/bin/sh
curl -s --max-time 120 --connect-timeout 60 \
 'http://www.flickr.com/badge_code_v2.gne?count=3&#038;display=latest&#038;size=s&#038;layout=h&#038;source=user&#038;user=88457640%40N00' \
 | grep -v "flickr_badge_beacon" \
 &gt; /path/to/cache/location/flickr.html
</pre>
<p>Then then it gets included like this</p>
<pre><code>
&lt;script type=&quot;text/javascript&quot;&gt;
&lt;?php readfile(&quot;/path/to/cache/location/flickr.html&quot;); ?&gt;
&lt;/script&gt;
</code></pre>
<p>As a result the load time decreased from <a href="http://flickr.com/photos/tcurdt/3063025613/">6.3s</a> down to <a href="http://flickr.com/photos/tcurdt/3063025779/">1.6s</a>. That&#8217;s almost 4x faster. At least in the user&#8217;s perception. <a href="http://developer.yahoo.com/yslow/">YSlow</a> is also a great plugin for firefox that helps exactly with this kind of optimizations.</p>
<p>Would probably be a good idea to turn this into a wordpress plugin.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/469075725" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081129080225/feed</wfw:commentRss>
		</item>
		<item>
		<title>Memory on the iPhone</title>
		<link>http://vafer.org/blog/20081128082605</link>
		<comments>http://vafer.org/blog/20081128082605#comments</comments>
		<pubDate>Fri, 28 Nov 2008 07:26:05 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=700</guid>
		<description><![CDATA[Now here is the question: How much memory does the iPhone have? How much memory is OK for applications to use? Curious as I am I did some research and wrote a little test project. This got me some odd results.
According to what you find on the net the iPhone has a total memory size [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/tcurdt/3063707056/" title="iPhone Memory by Torsten Curdt, on Flickr"><img src="http://farm4.static.flickr.com/3184/3063707056_ba6d7657f9_m.jpg" width="160" height="240" alt="iPhone Memory" /></a>Now here is the question: How much memory does the iPhone have? How much memory is OK for applications to use? Curious as I am I did some research and wrote a little test project. This got me some odd results.</p>
<p>According to what you <a href="http://furbo.org/2007/08/21/what-the-iphone-specs-dont-tell-you/">find on the net</a> the iPhone has a total memory size of 128 MB and your application should not use more than 46MB of it. But what happens exactly when you try to obtain more?</p>
<p>So I wrote a little application that continuously allocates more and more memory. In fact it mallocs/frees the memory on every timer tick.</p>
<p>Now this is where it gets odd. While the sysctl() calls do report something around 128MB of RAM I can malloc() way beyond this. In fact calling <em>malloc(700000000)</em> does not fail at all! When I run the application on just the iPhone it will stop at around 719MB. When I run it through Instruments the whole devices freezes at around 46MB. This has been reproduced on 2.1 and 2.2 on different devices.</p>
<pre><code>
- (void)tick
{
    allocated = allocated + size;

    if (allocatedPtr) {
        free(allocatedPtr);
    }

    allocatedPtr = malloc(allocated);

    if (!allocatedPtr) {
        NSLog(@"out of memory at %ld", allocated);
    ...
</code></pre>
<p>Later I found someone who stumbled across <a href="http://www.idevgames.com/forum/showthread.php?t=15820">the same thing</a>.</p>
<p>Lazyweb: what is going on here?</p>
<p>You can download the test application <a href="http://vafer.org/pub/cocoa/maxmemory.zip">here</a>. But as a disclaimer: you run this code on your own risk!</p>
<p><em><br />
<strong>Update:</strong></p>
<p>So afterall this means the result of malloc() has a different semantic of what I expected. Adding the following piece of code makes the program behave and gives the expected result.<br />
</em></p>
<pre><code>
    long *p = (long*)allocatedPtr;
    long count = allocated / sizeof(long);
    long i;
    for (i=0;i&lt;count;i++) {
        *p++ = 0x12345678;
    }
</code></pre>
<p><em>So it turns out if you allocate (and use!) around 46-50 MB in your iPhone application it will just get terminated.</em></p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/468084670" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081128082605/feed</wfw:commentRss>
		</item>
		<item>
		<title>Current page from Safari</title>
		<link>http://vafer.org/blog/20081127141820</link>
		<comments>http://vafer.org/blog/20081127141820#comments</comments>
		<pubDate>Thu, 27 Nov 2008 13:18:20 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[applescript]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[safari]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=339</guid>
		<description><![CDATA[Opening a web page in an external browser is easy in Cocoa.

 NSString *url = @"http://vafer.org/blog";
 [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];

If you want to get the URL of the current web page this is a little more complicated. In fact you need to talk to the browser. Safari (like many other applications) can be accessed easily [...]]]></description>
			<content:encoded><![CDATA[<p>Opening a web page in an external browser is easy in Cocoa.</p>
<pre><code>
 NSString *url = @"http://vafer.org/blog";
 [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]];
</code></pre>
<p>If you want to get the URL of the current web page this is a little more complicated. In fact you need to talk to the browser. Safari (like many other applications) can be accessed easily with AppleScript.</p>
<pre><code>
- (NSString*) safariURL
{
    NSDictionary *dict;
    NSAppleEventDescriptor *result;

    NSAppleScript *script = [[NSAppleScript alloc] initWithSource:
        @"\ntell application \"Safari\"\n\tget URL of document 1\nend tell\n"];

    result = [script executeAndReturnError:&#038;dict];

    [script release];

    if ((result != nil) &#038;&#038; ([result descriptorType] != kAENullEvent)) {
        return [result stringValue];
    }

    return nil;
}
</code></pre>
<p>It&#8217;s also pretty easy to add AppleScript support to you own Cocoa application. I thought I came across a screencast covering this topic but can&#8217;t find the link anymore. But check out the following resources if you want to get deeper into this: <a href="http://developer.apple.com/technotes/tn2006/tn2084.html">[1]</a> <a href="http://www.macgeekery.com/development/adding_basic_applescript_to_core_data_applications">[2]</a> <a href="http://developer.apple.com/documentation/applescript/conceptual/studiobuildingapps/chapter05/chapter_5_section_4.html">[3]</a> <a href="http://developer.apple.com/cocoa/applescriptforapps.html">[4]</a></p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/467303044" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081127141820/feed</wfw:commentRss>
		</item>
		<item>
		<title>Requests per Second from Log</title>
		<link>http://vafer.org/blog/20081121232846</link>
		<comments>http://vafer.org/blog/20081121232846#comments</comments>
		<pubDate>Fri, 21 Nov 2008 22:28:46 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[httpd]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=674</guid>
		<description><![CDATA[While this is not nearly as fancy as Theo&#8217;s realtime version with DTrace this little script extracts your requests per second (and minutes) from Apache log files. Useful if you didn&#8217;t have monitoring set up already and want to know about the amount of request you were getting - in retrospect. As you most likely [...]]]></description>
			<content:encoded><![CDATA[<p>While this is not nearly as fancy as <a href="http://us.apachecon.com/c/acus2008/sessions/5">Theo&#8217;s realtime version with DTrace</a> this little <a href="http://vafer.org/pub/scripts/requests.rb">script</a> extracts your requests per second (and minutes) from Apache log files. Useful if you didn&#8217;t have monitoring set up already and want to know about the amount of request you were getting - in retrospect. As you most likely will have a log file it&#8217;s easy to extract the data from there. I&#8217;ve just use the log file parser <a href="http://vafer.org/blog/20081031004022">from my other post</a> and added some grouping and counting.</p>
<pre><code>
parser = LogParser.new

current_key = 0
count = 0

while STDIN.gets
  line = $_

  parsed_data = parser.parse_line(line)  

  parsed_data[:datetime] =~ %r{(\d{2})/(\w{3})/(\d{4}):(\d{2}):(\d{2})}
  day, month, year, hour, minute = $1, $2, $3, $4, $5

  key = Time.mktime(year, month, day, hour, minute, 0).to_i

  if key != current_key

    if count > 0
        # timestamp, request/minute, requests/second
        printf "%d %d %d\n", key, count, count/60
    end

    count = 0
    current_key = key
  end

  count = count + 1
end
</code></pre>
<p>Now just pipe in the log data and you get a nice aggregation that can easily be injected into a <a href="http://oss.oetiker.ch/rrdtool/">round robin database</a> for example.</p>
<pre>
$ cat access.log | ./request.rb
</pre>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/461239943" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081121232846/feed</wfw:commentRss>
		</item>
		<item>
		<title>HttpServletRequest Examples</title>
		<link>http://vafer.org/blog/20081120230555</link>
		<comments>http://vafer.org/blog/20081120230555#comments</comments>
		<pubDate>Thu, 20 Nov 2008 22:05:55 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[java]]></category>

		<category><![CDATA[servlet]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=678</guid>
		<description><![CDATA[What was the semantic of the servlet request parameter again? I can&#8217;t remember how often I wrote code that produced something along the lines of the following.
The direct servlet mapping:

GET http://localhost:8080/statement
contextPath:
pathInfo:null
pathTranslated:null
requestUri:/statement
servletPath:/statement
queryString:null

With trailing slash:

GET http://localhost:8080/statement/
contextPath:
pathInfo:/
pathTranslated:/path/to/webapp
requestUri:/statement/
servletPath:/statement
queryString:null

With path component:

GET http://localhost:8080/statement/test
contextPath:
pathInfo:/test
pathTranslated:/path/to/webapp/test
requestUri:/statement/test
servletPath:/statement
queryString:null

With query string:

GET http://localhost:8080/statement/test?as=true
contextPath:
pathInfo:/test
pathTranslated:/path/to/webapp/test
requestUri:/statement/test
servletPath:/statement
queryString:as=true

Just for the records.
]]></description>
			<content:encoded><![CDATA[<p>What was the semantic of the servlet request parameter again? I can&#8217;t remember how often I wrote code that produced something along the lines of the following.</p>
<p>The direct servlet mapping:</p>
<pre>
GET http://localhost:8080/statement
contextPath:
pathInfo:null
pathTranslated:null
requestUri:/statement
servletPath:/statement
queryString:null
</pre>
<p>With trailing slash:</p>
<pre>
GET http://localhost:8080/statement/
contextPath:
pathInfo:/
pathTranslated:/path/to/webapp
requestUri:/statement/
servletPath:/statement
queryString:null
</pre>
<p>With path component:</p>
<pre>
GET http://localhost:8080/statement/test
contextPath:
pathInfo:/test
pathTranslated:/path/to/webapp/test
requestUri:/statement/test
servletPath:/statement
queryString:null
</pre>
<p>With query string:</p>
<pre>
GET http://localhost:8080/statement/test?as=true
contextPath:
pathInfo:/test
pathTranslated:/path/to/webapp/test
requestUri:/statement/test
servletPath:/statement
queryString:as=true
</pre>
<p>Just for the records.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/460066287" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081120230555/feed</wfw:commentRss>
		</item>
		<item>
		<title>ApacheCon US 2008 recap</title>
		<link>http://vafer.org/blog/20081119225156</link>
		<comments>http://vafer.org/blog/20081119225156#comments</comments>
		<pubDate>Wed, 19 Nov 2008 21:51:56 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[apachecon]]></category>

		<category><![CDATA[conferences]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=669</guid>
		<description><![CDATA[This year&#8217;s ApacheCon US was quite amazing - in several ways.
From the city point of view I am quite thankful that it gave me the opportunity to experience New Orleans - a little bit of the South. I wish I had seen more. Surprisingly the French Quarter just didn&#8217;t feel like the US at all. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/tcurdt/3016038088/" title="IMG_8701 by Torsten Curdt, on Flickr"><img src="http://farm4.static.flickr.com/3058/3016038088_1e3b996f01_m.jpg" width="160" height="240" alt="steamboat" /></a>This year&#8217;s <a href="http://www.us.apachecon.com/">ApacheCon US</a> was quite amazing - in several ways.</p>
<p>From the city point of view I am quite thankful that it gave me the opportunity to experience New Orleans - a little bit of the South. I wish I had seen more. Surprisingly the French Quarter just didn&#8217;t feel like the US at all. Overall I think it was also the best food I ever had during any of the ApacheCons. (Only counting dinners of course.) It was also very cool to experience the presidential elections - and how relieved people were about the results. Over the past years the socializing part of ApacheCon has become much more important to me. But this year I also didn&#8217;t want to miss some of <a href="http://vafer.org/blog/20081101000348">the talks</a>. Especially <a href="http://omniti.com/is/theo-schlossnagle">Theo Schlossnagle</a>&#8217;s talk about DTrace was just awesome. (<a href="http://vafer.org/blog/20080812182921">I did know DTrace is cool</a> - but this session blew me away). The video is supposed to be <a href="http://streaming.linux-magazin.de/en/index.htm">available soon</a>. The after hour activities were a bit less for me this time. I had quite some problems with jetlag - more than ever before. What a bad timing! <a href="http://grep.codeconsult.ch/2008/11/08/my-best-and-worst-apachecon-so-far-thanks-and-random-thoughts/">At least I wasn&#8217;t alone with this</a>. My presentation was at the very last slot and still some people showed up. Even more than expected. (The slides are available now on <a href="http://www.slideshare.net/tcurdt/slideshows">slideshare</a>.)</p>
<p>Unfortunately I didn&#8217;t take <a href="http://www.flickr.com/photos/tcurdt/map?&#038;fLat=29.9441&#038;fLon=-90.0568&#038;zl=4&#038;order_by=recent">as much pictures as hoped</a>. But the few are available in my <a href="http://flickr.com/photos/tcurdt/sets/72157609135968452/">ApacheCon US set on flickr</a>.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/458862257" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081119225156/feed</wfw:commentRss>
		</item>
		<item>
		<title>User Idle Detection</title>
		<link>http://vafer.org/blog/20081118145046</link>
		<comments>http://vafer.org/blog/20081118145046#comments</comments>
		<pubDate>Tue, 18 Nov 2008 13:50:46 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[cocoa]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=344</guid>
		<description><![CDATA[This question came up a couple of times recently. I came across this a while ago.
There is a function called CGSSecondsSinceLastInputEvent that is not defined in any headers. So while this is a private API it seems to work fine on Tiger and Leopard. Just declare the prototype and you can easily find out when [...]]]></description>
			<content:encoded><![CDATA[<p>This question came up a couple of times recently. I <a href="http://www.cocoabuilder.com/archive/message/cocoa/2007/6/4/184172">came across this</a> a while ago.</p>
<p>There is a function called <em>CGSSecondsSinceLastInputEvent</em> that is not defined in any headers. So while this is a private API it seems to work fine on Tiger and Leopard. Just declare the prototype and you can easily find out when the user last provided input. That is moved the mouse or pressed a key.<br />
<code>
<pre>
double CGSSecondsSinceLastInputEvent(long evType);
double idleTime = CGSSecondsSinceLastInputEvent(-1);
</pre>
<p></code><br />
Of course there is no guaranty this will work in future versions of OSX as well. So if you know an official way of doing that - please let me know.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/457195313" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081118145046/feed</wfw:commentRss>
		</item>
		<item>
		<title>Paypal Fee Calculation</title>
		<link>http://vafer.org/blog/20081117142630</link>
		<comments>http://vafer.org/blog/20081117142630#comments</comments>
		<pubDate>Mon, 17 Nov 2008 13:26:30 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[paypal]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=587</guid>
		<description><![CDATA[It&#8217;s a little awkward that paypal does not provide a &#8220;user friendly&#8221; way of calculating their fees. Anyone remotely capable of simple math can do it - but still. Let&#8217;s say you want to transfer a certain amount of money between two paypal accounts from one EU country to another.

x = amount that needs to [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s a little awkward that <a href="http://paypal.com">paypal</a> does not provide a &#8220;user friendly&#8221; way of calculating their fees. Anyone remotely capable of simple math can do it - but still. Let&#8217;s say you want to transfer a certain amount of money between two paypal accounts from one EU country to another.</p>
<pre>
x = amount that needs to be sent
y = amount that is to be received
a = fees in percent
b = fix transaction cost
</pre>
<p>So the after a simple transformation you get the formular you need</p>
<pre>
    y = x - x*a - b
<=> x = y + b / (1 - a)
</pre>
<p>Or you just head over to a <a href="http://ppcalc.com">third party paypal fees calculator</a>.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/455977728" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081117142630/feed</wfw:commentRss>
		</item>
		<item>
		<title>The iPhone Odyssey</title>
		<link>http://vafer.org/blog/20081116050833</link>
		<comments>http://vafer.org/blog/20081116050833#comments</comments>
		<pubDate>Sun, 16 Nov 2008 04:08:33 +0000</pubDate>
		<dc:creator>tcurdt</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[gadgets]]></category>

		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://vafer.org/blog/?p=607</guid>
		<description><![CDATA[Already a couple of months ago it was clear that somehow I need to get hold of the new iPhone 3G. Let me tell you - it was a long journey! When it came out everyone was just going crazy about it. Getting a new iPhone was -to say at least- challenging. Options were either [...]]]></description>
			<content:encoded><![CDATA[<p>Already a couple of months ago it was clear that somehow I need to get hold of the new iPhone 3G. Let me tell you - it was a long journey! When it came out everyone was just going crazy about it. Getting a new iPhone was -to say at least- challenging. Options were either waiting lists or out of stock. But I didn&#8217;t really want a locked phone anyway. And I wasn&#8217;t very fond of switching carriers. So the waiting began. How long can it take to jailbreak and unlock theses phones? But more importantly: Where could I get one without a contract?</p>
<p><strong>Holding off</strong><br />
Real life suppressed the desire for geek gadget mania. Vacation was coming up. <a href="http://vafer.org/blog/20080921212200">Destination Bali</a>. No computers, no gadgets - beside the camera. So there was no point in getting an iPhone before. I felt the urge: <em>I want one!</em> But I figured - it&#8217;s just the hype. That said - my previous phone had seen better days. On the way to Bali we stopped in Singapore. And I had to at least check. And there it was. At the airport. Unlocked and just there for me to buy. My precious gadget. But 900 EUR? Ouch! I knew there are a few (sane) countries in Europe where you get the phone without a contract for about 580 EUR. So just a few more weeks.</p>
<p><strong>Hope for the easy way</strong><br />
Back in Europe a friend offered me to ship me one from Italy. Shipping, money transfer, &#8230;it seemed easier to go with the one I found on Amazon Marketplace for 640 EUR (which is pretty much the same price in the end). In stock and everything. I had hope to hold it in my hands just after 1-2 days. Boy was I naive. The seller did not have many recommendations but given that it was under the Amazon umbrella I placed the order anyway. The 2 days turned into 2 weeks. And after a few emails it was clear. It&#8217;s not going to come anytime soon. After the first 5 negative ratings for goods that never arrived, it was quite obvious that this was a con. At least there was the insurance from Amazon Marketplace that covered it. And indeed after only a few weeks I got my money back.</p>
<p><strong>The second attempt</strong><br />
Instead of wining I turned to my pal in Italy. After such a long time availability was gladly no longer an issue. Shipping with UPS was a steep 54 EUR but at least it took no longer than a day. So at a total of about 630 EUR I got a properly unlocked iPhone 3G. End of story? Well &#8230;keep reading. Unboxing was the usual geek pleasure. Activation was no problem at all. I&#8217;ve setup wifi right away but also tried 3G to make sure it&#8217;s all working OK.</p>
<p><strong>The data plan</strong><br />
At this stage I was still on <a href="http://vafer.org/blog/20070927190833">my old time based data plan</a>. So after the test I deliberately removed the ATN settings again. I guess I was lucky that I finally left for the <a href="http://barcampberlin3.mixxt.org/">BarCamp in Berlin</a> and so also left the range of my wifi connection. At about three days later, sitting on the train I realized: <em>Dammit! Why do I have internet?!</em> Some research quickly explains the unexpected. In August 2008 O2 has changed their APN settings. You no longer need any settings at all! The iPhone switch only turns on/off the 3G but not EDGE/GPRS. In fact there is no such switch! (WTF!) Ergo I was online on my time based data plan for the whole 3 days. That&#8217;s a couple of hundred EUR. I was furious! Not sure whom to blame first. Apple for not having a switch to turn off data completely, O2 for not requiring any ATN settings at all or me for not verifying what falsely was listed on the provider&#8217;s web page. The only way to turn off GPRS/EDGE with O2 is to call them and have <strong>them</strong> turn if off for you.</p>
<p><strong>Sorted</strong><br />
I right away called up O2 and explained the situation. Of course the girl on the phone had no clue. <em>ATN? iPhone with O2?</em> But fortunately she passed me on to someone from the mobile data devision. He was very understanding and as I wanted to get volume based data plan anyway he said he will work this out for me. Next day (a Sunday!) I had my proper data plan. Today I got my bill. And indeed it was just a few bucks. *relief*</p>
<p><strong>The End!</strong><br />
&#8230;of this story is just the beginning of another. While the iPhone has still many quirks it is a big step forward. Having at least the ability to be online virtually everywhere is a big change. Not sure whether it&#8217;s always is for the better. But it surely fosters a transformation in how we live with the internet.</p>
<img src="http://feeds.feedburner.com/~r/tcurdt/~4/454550808" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://vafer.org/blog/20081116050833/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
