<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jehiah Czebotar</title>
	
	<link>http://jehiah.cz</link>
	<description>HTML, CSS, Javascript and those other web things all mixed together</description>
	<lastBuildDate>Mon, 08 Feb 2010 19:45:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Jehiah" /><feedburner:info uri="jehiah" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Jehiah</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
		<title>Handling Internationalized Domain Names (IDN) in Python</title>
		<link>http://jehiah.cz/archive/handling-idn-in-python</link>
		<comments>http://jehiah.cz/archive/handling-idn-in-python#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:45:27 +0000</pubDate>
		<dc:creator>Jehiah</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jehiah.cz/?p=265</guid>
		<description><![CDATA[Internationalized Domain Names or IDN are domain names that contain non ascii characters. It's important to know how to handle these in an application because domain names themselves can actually only contain ascii. Punycode is the way the unicode characters gets encoded into ascii characters in a domain name.

Thankfully python has an encoding language IDNA [...]]]></description>
			<content:encoded><![CDATA[<p>Internationalized Domain Names or <a href="http://en.wikipedia.org/wiki/Internationalized_domain_names">IDN</a> are domain names that contain non ascii characters. It's important to know how to handle these in an application because domain names themselves can actually only contain ascii. <a href="http://en.wikipedia.org/wiki/Punycode">Punycode</a> is the way the unicode characters gets encoded into ascii characters in a domain name.</p>

<p>Thankfully python has an encoding language <a href="http://docs.python.org/library/codecs.html#module-encodings.idna">IDNA</a> built in that makes this easy.</p>

<div class="syntax_hilite"><div id="python-2">
<div class="python"><br />
&gt;&gt;&gt; a=<span style="color: #483d8b;">"xn--keh.ws"</span><br />
&gt;&gt;&gt; a.<span style="color: black;">decode</span><span style="color:#000000; font-weight:bold;">&#40;</span><span style="color: #483d8b;">"idna"</span><span style="color:#000000; font-weight:bold;">&#41;</span><br />
u<span style="color: #483d8b;">"<span style="color: #000099; font-weight: bold;">\u</span>2295.ws"</span><br />
&gt;&gt;&gt; <span style="color: #ff7700;font-weight:bold;">print</span> a.<span style="color: black;">decode</span><span style="color:#000000; font-weight:bold;">&#40;</span><span style="color: #483d8b;">"'idna"</span><span style="color:#000000; font-weight:bold;">&#41;</span><br />
⊕.<span style="color: black;">ws</span><br />
&gt;&gt;&gt; u<span style="color: #483d8b;">"⊕.ws"</span>.<span style="color: black;">encode</span><span style="color:#000000; font-weight:bold;">&#40;</span><span style="color: #483d8b;">"idna"</span><span style="color:#000000; font-weight:bold;">&#41;</span><br />
<span style="color: #483d8b;">"xn--keh.ws"</span><br />
&nbsp;</div>

<p></div></div></p>
]]></content:encoded>
			<wfw:commentRss>http://jehiah.cz/archive/handling-idn-in-python/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Housekeeping: RSS feeds fixed</title>
		<link>http://jehiah.cz/archive/housekeeping-rss-feeds-fixed</link>
		<comments>http://jehiah.cz/archive/housekeeping-rss-feeds-fixed#comments</comments>
		<pubDate>Sun, 07 Feb 2010 05:03:04 +0000</pubDate>
		<dc:creator>Jehiah</dc:creator>
				<category><![CDATA[All]]></category>

		<guid isPermaLink="false">http://jehiah.cz/?p=261</guid>
		<description><![CDATA[My apologies to those following my site via RSS feed; I had a snafu with wordpress after upgrading a few months ago, and it caused my RSS feeds to break.

if you are reading this, everything is working fine now.
]]></description>
			<content:encoded><![CDATA[<p>My apologies to those following my site via RSS feed; I had a snafu with wordpress after upgrading a few months ago, and it caused my RSS feeds to break.</p>

<p>if you are reading this, everything is working fine now.</p>
]]></content:encoded>
			<wfw:commentRss>http://jehiah.cz/archive/housekeeping-rss-feeds-fixed/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primer on bitly.tv</title>
		<link>http://jehiah.cz/archive/primer-on-bitly-tv</link>
		<comments>http://jehiah.cz/archive/primer-on-bitly-tv#comments</comments>
		<pubDate>Fri, 18 Dec 2009 04:18:50 +0000</pubDate>
		<dc:creator>Jehiah</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jehiah.cz/?p=256</guid>
		<description><![CDATA[At bit.ly today, we launched a new product called bitly.tv, and it is part of our new labs.bit.ly project. 

bitly.tv it's a great productivity waster if you are ever bored, but there are also interesting videos out on the web that it helps you find. Here are a few of the awesome videos i've found [...]]]></description>
			<content:encoded><![CDATA[<p>At bit.ly today, we launched a new product called <a href="http://bitly.tv/">bitly.tv</a>, and it is part of our new <a href="http://labs.bit.ly/">labs.bit.ly</a> project. </p>

<p>bitly.tv it's a great productivity waster if you are ever bored, but there are also interesting videos out on the web that it helps you find. Here are a few of the awesome videos i've found with it recently to get you started.</p>

<p><a href="http://bitly.tv/7JENqN">http://bitly.tv/7JENqN</a> - The ever popular Ukulele kid<br />
<a href="http://bitly.tv/B5p1a">http://bitly.tv/B5p1a</a> - Signs ( a cute 12 minute film)<br />
<a href="http://bitly.tv/6uicgn">http://bitly.tv/6uicgn</a> - A Surprised Kitty   </p>

<p>and you'll find lots of other stuff like</p>

<p><a href="http://bitly.tv/4O44So">http://bitly.tv/4O44So</a> -  A clip making fun of "enhance this" in movies<br />
<a href="http://bitly.tv/6DmVJr">http://bitly.tv/6DmVJr</a> - Fisherman bloopers<br />
<a href="http://bitly.tv/z2OTv">http://bitly.tv/z2OTv</a> - Trailer Cut #1 - a compilation of the best action movies into one trailer   </p>

<p>enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://jehiah.cz/archive/primer-on-bitly-tv/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easy iPhone Simulator Screenshots</title>
		<link>http://jehiah.cz/archive/iphone-simulator-screenshots</link>
		<comments>http://jehiah.cz/archive/iphone-simulator-screenshots#comments</comments>
		<pubDate>Wed, 07 Oct 2009 16:03:03 +0000</pubDate>
		<dc:creator>Jehiah</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://jehiah.cz/archive/iphone-simulator-screenshots</guid>
		<description><![CDATA[If you are a developer like me, you often need to take screenshots of your application for use on your website, in ads, or more often for upload to iTunes Connect for display in the AppStore.

For a long time I've just muddled through with option+shift+3 which allows you to take a screenshot of a specific [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a developer like me, you often need to take screenshots of your application for use on your website, in ads, or more often for upload to iTunes Connect for display in the AppStore.</p>

<p>For a long time I've just muddled through with option+shift+3 which allows you to take a screenshot of a specific region, and then i select the specific 480x320 pixels that i want from the iPhone Simulator to get my screenshot.</p>

<p>It's tedious to select exactly those pixels though, and far to often i find myself off by a pixel in size, or i select the wrong pixels. If i'm off by a pixel iTunes connect won't even allow me to upload the screenshot!</p>

<p>One way to take 'perfect' screenshots all the time is with a running device and to take them through the Xcode Organizer. This is still frustrating to me though because i have to switch back and forth between my computer and a physical device, and because it isn't as easy to set specific things like the the Agency text and the Date Time display with <a href="http://github.com/atebits/SimFinger">SimFinger</a>.</p>

<p>The solution I've come up with is to use the built in command line utility <code>screenshot</code> combined with <code>sips</code> (a command line image parser).</p>

<p>I use screenshot to take a screenshot of the whole iPhone Simulator (frame and all) then I use sips to strip out the frame to get just the device screen.</p>

<p>I've wrapped this in a script which also gives me an easy spot to name the screenshot. It ends up like this:</p>

<div class="syntax_hilite"><div id="code-4">
<div class="code"><br />
#!/bin/sh<br />
<br />
# script to screenshot the iPhone Simulator to the correct size<br />
# to upload to iTunes Connect<br />
# written by Jehiah Czebotar http:<span style="color:#FF9933; font-style:italic;">//jehiah.cz/</span><br />
<br />
OUTPUTDIR=~/Desktop<br />
TEMPFILE=iPhoneSimulatorScreenshot_`date +%Y%m%d_%H%M%S`.<span style="">png</span><br />
<br />
echo <span style="color:#CC0000;">"output filename:<span style="color:#000099; font-weight:bold;">\c</span>"</span><br />
read -e OUTPUTFILE<br />
<br />
# activate iPhone Simulator so its easy to click on <br />
osascript -e <span style="color:#CC0000;">'tell application &quot;iPhone Simulator&quot;'</span> -e <span style="color:#CC0000;">'activate'</span> -e <span style="color:#CC0000;">'end tell'</span><br />
<br />
# capture the screen<br />
screencapture -iowW $OUTPUTDIR/$TEMPFILE <br />
<br />
# resize to the apple upload size, 320x480<br />
sips -c <span style="color:#800000;">480</span> <span style="color:#800000;">320</span> $OUTPUTDIR/$TEMPFILE --out $OUTPUTDIR/$OUTPUTFILE<br />
&nbsp;</div>

<p></div></div></p>

<p>You can download the current version <a href="http://bitbucket.org/jehiah/jehiah-scripts/src/tip/sdk_screenshot.sh">on bitbucket</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jehiah.cz/archive/iphone-simulator-screenshots/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lessons from 12 Months in the AppStore</title>
		<link>http://jehiah.cz/archive/lessons-from-12-months-in-the-appstore</link>
		<comments>http://jehiah.cz/archive/lessons-from-12-months-in-the-appstore#comments</comments>
		<pubDate>Thu, 24 Sep 2009 13:16:10 +0000</pubDate>
		<dc:creator>Jehiah</dc:creator>
				<category><![CDATA[All]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[transit]]></category>

		<guid isPermaLink="false">http://jehiah.cz/archive/lessons-from-12-months-in-the-appstore</guid>
		<description><![CDATA[Let me getting it out there: Writing an iPhone app is asking for a whole mess of problems.

I'm proud of what I've accomplished for making transit easier in the past two years, but it's been a painful process. Lots has been said about the shortcomings of Apples AppStore, and more importantly Apples disregard for developers [...]]]></description>
			<content:encoded><![CDATA[<p>Let me getting it out there: Writing an iPhone app is asking for a whole mess of problems.</p>

<p>I'm proud of what I've accomplished for making transit easier in the past two years, but it's been a painful process. Lots has been said about the shortcomings of Apples AppStore, and more importantly Apples disregard for developers building on their platform. But I also want to share my story of how developing for the iPhone has gone. Hopefully others can learn from my trial and error.</p>

<p>When I first started working on my <a href="http://thenexttrain.com/iphone">theNextTrain</a> application <a href="http://jehiah.cz/archive/one-step-further">in 2008</a>, the AppStore was not live, so it was a guess as to how to best structure things. I wanted to publish schedules for every commuter railroad known to man, so I started with the few I had data for.</p>

<p>I had already been publishing schedules on <a href="http://thenexttrain.com/">theNextTrain.com</a> in the format I wanted, so I had all the logic nailed down; I just needed to code up a version in Objective C.</p>

<p>It seemed simple enough; I'd just put a sqlite db file in the application, and when I needed to update the schedules, I would just release a new version of the application with a new sqlite db file. Apple would then earn their 30% cut and quickly get it distributed to the right users.</p>

<p>Over a year later, this is still wishful thinking. </p>

<p>The AppStore still doesn't even use it's own push notification service to notify phones of pending updates.</p>

<p>Don't get me wrong, parts of this setup do work... or did work. At first pushing out a schedule took 2 or 3 days to be approved and show up in the AppStore, and users were (seemingly) quick to get them installed.</p>

<p>As the AppStore grew and users installed more Apps, users updated less and less frequently. A Typical update cycle for my application is now a month. It takes a whole freaking month for an update, once released by Apple, to get installed on most of my users.</p>

<p>As is now common knowledge, apple also takes it's sweet old time with their update queue.</p>

<p>actually, let's stop calling it a queue. it's not a queue. </p>

<p>I just had two apps released after 15 days in the approval process, and one immediately after that which was released after only 7 days. Meanwhile, I still have an application (the exact same as the first two except with different data file) which is STILL waiting for approval after  23 days. Have I heard from apple about it? of course not!</p>

<p>Now my application deals with schedules. Every update is time sensitive and critical. I get very little notice from agencies on when schedules are going to be updated. The total time I have to get updates pushed out from when I first learn about them and when they go into effect is between 0 and 14 days. Clearly well short the total of 45~55 days it currently takes to get schedules out to all my users.</p>

<p>That brings about the review problem. Users take the easy route and complain about lack of schedules. They don't bother contacting me; They don't bother leaving any contact information; They don't even bother looking for resolution, they just leave a poor rating and/or review and leave.</p>

<p>Can I respond to reviews and say, "hey, this has been in apples queue for 14 days; I know it's 1 day over due for you now, but I've done everything I can to stay up late and get this into apples approval queue."? </p>

<p>No. of course I can't respond; that would be easy. I can't reach out and say; hey I feel your pain. I can't let them know when the schedule is finally available.</p>

<p>When starting to write for the iPhone it seemed to make sense to have a different application for each agency as that would keep things simple for users. Each application would share the same code base right, so it couldn't be that bad right? answer:really bad. Managing 9 different applications that all have the same code base but different update cycles has turned out to be a nightmare. Managing user feedback and reviews on 9 different applications has also been a nightmare. It's hard enough to keep up on blogs with RSS feeds, but it's impossible to keep up on reviews on multiple applications.</p>

<p>Worse yet once I chose to go down that path of separate applications, Apple gave me no choice but to screw my users in order to switch to anything else. I have users that purchase my applications every day, and to merge them it means that some users will have just purchased a copy very very recently under the impression they would get schedule updates (which remember need to be delivered through application updates). I can't ever remove that application and continue to give these users what they expected when they purchased it.</p>

<p>I can't magically move all existing users of 9 applications into a new single merged application; apple, of course, gives me no user management ability.</p>

<p>I can't contact all users and say 'hey go download this new version on day x' because I don't even get a list of users and their iTunes contact info.</p>

<p>That leaves me with the difficulty of rolling my own tools to gather user contact info, my own notification systems.</p>

<p>And so it was that in February, after only a few months in the AppStore, I realized I could not add any new schedules until I merged my 9 applications, and I could not merge my 9 applications without infrastructure to handle over the air schedule syncing, and I could not get users onto a merged application until I rolled out my own notification systems.</p>

<p>Once the application development was well under way, and the server infrastructure for over the air schedule syncing was working, I set out to develop tools to facilitate a group of beta testers. This of course required ways to gather beta tester info, ways to manage and distribute beta applications, ways to distribute provisioning files, and ways to collect feedback and track and communicate known issues and their resolution, and hopefully enough tools to keep myself sane through the process. More work that I didn't really want to invest the time into, but work which needed to be done one way or another.</p>

<p>(sidenote: Apple appears not to like beta testing either as they recently further restricted the number of devices that you can test against; you can now only test against 100 unique devices in a year across all applications (it was previously 100 devices at any given point in time); heaven forbid you have a small group of say 50 testers that do something like upgrade to 3GS or say, break a phone and/or replace it once or twice)</p>

<p>Mind you, I have a day job too, but it's September now, 7 months after starting this version, and just TODAY I've finally pushed out this long awaited <a href="http://thenexttrain.com/iphone/appstore">version 2.0</a>  to the AppStore. </p>

<p>I've also gone out of my way and (at the risk of attracting users looking for a 'free' application, which I don't want), I've set the price to FREE for 3 days to give existing users a great opportunity to upgrade.</p>

<p>It will still be another month before all the old versions will be pulled from the AppStore as I want to be extra sure that all existing users have updated to get their notification messages about the end-of-life on their version, and the chance to upgrade (I'll probably another discount upgrade window next month).</p>

<p>whew, I'm glad to finally be moving on to the next chapter of my life. </p>

<p>Finally: nine individual versions are depreciated.<br />
Finally: I won't have to wait for Apple's approval queue to push out schedule changes.<br />
Finally: I will be able to measure schedule updates in hours instead of weeks.<br />
Finally: I will be able to add schedules for more transit agencies.<br />
Finally: I will be able to work on interesting features like realtime delays   </p>

<p>p.s. Huge shout out to the many beta testers that put up with version after version for 4 months of testing.</p>

<p>p.p.s hello again interwebs</p>
]]></content:encoded>
			<wfw:commentRss>http://jehiah.cz/archive/lessons-from-12-months-in-the-appstore/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.453 seconds -->
