<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-us"><title>Taylan Pince - Blog Posts</title><link href="http://www.taylanpince.com/blog/" rel="alternate" /><id>http://www.taylanpince.com/blog/</id><updated>2012-09-15T12:24:26-04:00</updated><author><name>Taylan Pince</name></author><subtitle>Latest blog posts from taylanpince.com</subtitle><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/taylanpince-posts" /><feedburner:info uri="taylanpince-posts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry><title>Updates 2012</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/esLok9c_bAQ/" rel="alternate" /><updated>2012-09-15T12:24:26-04:00</updated><id>http://www.taylanpince.com/blog/posts/updates-2012/</id><summary type="html">&lt;p&gt;It seems like I only get to update this blog every year or so with a single &amp;#8220;updates&amp;#8221; post. I can&amp;#8217;t promise to do any better going forward, but I will at least put together a rundown of what has been happening in my life &amp;amp; career in the past couple of years.
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://hippofoundry.com"&gt;Hippo Foundry&lt;/a&gt;, which started out as just a name for my freelance and apps business, grew to be a small and talented development team spread across Europe and North America. My day to day job went from building apps on my own to working with a group of awesome web and mobile developers. Our growth was completely organic and even though it was an idea I had in the back of my mind for a while, I never expected it to happen so quickly.
&lt;/p&gt;
&lt;p&gt;Our focus has been mainly on client projects in the past few years. We launched the &lt;a href="http://itunes.apple.com/app/blogto/id435310228?mt=8"&gt;blogTO iPhone and iPad apps&lt;/a&gt;, worked with &lt;a href="http://www.projectnoah.org/"&gt;Project Noah&lt;/a&gt; on their revamped &lt;a href="http://itunes.apple.com/us/app/project-noah/id417339475?mt=8&amp;amp;ls=1"&gt;iPhone app&lt;/a&gt; and launched an awesome little chocolate app called &lt;a href="http://choco-locate.com/"&gt;Choco-locate&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Web team has been quite busy as well. We rebuilt &lt;a href="http://mobilicity.ca/"&gt;Mobilicity&amp;#8217;s marketing site&lt;/a&gt; and content management system from scratch, launched &lt;a href="http://patios.blogto.com/"&gt;Patio Guide&lt;/a&gt; and &lt;a href="http://style.blogto.com/"&gt;Street Style&lt;/a&gt; for blogTO and built a complete web solution for &lt;a href="http://gridloyalty.com/"&gt;Grid Loyalty&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Through all of this, we didn&amp;#8217;t forget our roots though. Last week, we launched our first game, a Tamagotchi-like pet simulator for iPhone called &lt;a href="http://bitly.com/bonziiapp"&gt;Bonzii&lt;/a&gt;. It&amp;#8217;s been in the works for almost two years, and we are really proud of it. Check it out and let us know what you think!
&lt;/p&gt;
&lt;p&gt;We are also working on new internal projects and we are committed to making well-designed and well-built applications that people will love to use.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/esLok9c_bAQ" height="1" width="1"/&gt;</summary><category term="hippofoundry" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/updates-2012/</feedburner:origLink></entry><entry><title>Building Universal Static Libraries Using Xcode</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/0mwN2__Y4bs/" rel="alternate" /><updated>2010-11-10T02:32:49-04:00</updated><id>http://www.taylanpince.com/blog/posts/building-universal-static-libraries-using-xcode/</id><summary type="html">&lt;p&gt;I spent a few hours today researching how to put together a framework bundle that can be used in multiple iOS applications with minimal hassle. As it turns out, this is not as simple as it sounds. There are several good articles on the subject out there, but the 4.0 SDK rendered pretty much all of them obsolete. So I wanted to share my current solution here.
&lt;/p&gt;

&lt;p&gt;Before going further, if you are not sure about why we need to use static libraries, what a universal library means, or how to put together your basic framework project, I would suggest working through at least a couple of these excellent articles on the subject:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     &lt;a href="http://accu.org/index.php/journals/1594"&gt;Creating a Framework for iPhone&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href="http://www.drobnik.com/touch/2010/04/universal-static-libraries/"&gt;Universal Static Libraries&lt;/a&gt;
 &lt;/li&gt;

 &lt;li&gt;
     &lt;a href="http://sites.google.com/site/michaelsafyan/coding/resources/how-to-guides/cross-compile-for-the-iphone/how-to-construct-iphone-framework-bundles-for-cross-compiled-iphone-libraries"&gt;How to Construct iPhone Framework Bundles&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main problem you will face after using any of these methods is that the option to pick &amp;#8220;iPhone Simulator&amp;#8221; as a Base SDK is removed with 4.0. This means that you cannot force your Simulator target to build for the i386 architecture. There is a hidden workaround for this though: In your simulator target&amp;#8217;s build settings, select &amp;#8220;Other&amp;#8230;&amp;#8221; among the Base SDK options, then put &amp;#8220;iphonesimulator&amp;#8221; into the text box that pops up. This will make the target use the latest Simulator SDK.
&lt;/p&gt;
&lt;p&gt;Unfortunately, this approach doesn&amp;#8217;t work so well in practice. When you are using an &amp;#8220;Aggregator&amp;#8221; target to build your static libraries, Xcode still insists on building only for the active architecture (Device or Simulator), ignoring your target&amp;#8217;s architecture setting.
&lt;/p&gt;
&lt;p&gt;There are several alternative solutions out there, including having a Makefile or using the command line to build the project instead of Xcode. But I really wanted to be able to build with a single command, without having to leave Xcode, so I made a slightly customized Aggregator target that uses a bash script to build the two targets properly, then organizes the final build into the standard framework directory structure. Here is the script:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;xcodebuild -configuration &lt;span class="s2"&gt;&amp;quot;${CONFIGURATION}&amp;quot;&lt;/span&gt; -target &lt;span class="s2"&gt;&amp;quot;${PRODUCT_NAME}Framework-Device&amp;quot;&lt;/span&gt; -sdk iphoneos&lt;br /&gt;xcodebuild -configuration &lt;span class="s2"&gt;&amp;quot;${CONFIGURATION}&amp;quot;&lt;/span&gt; -target &lt;span class="s2"&gt;&amp;quot;${PRODUCT_NAME}Framework-Simulator&amp;quot;&lt;/span&gt; -sdk iphonesimulator&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="nv"&gt;FRAMEWORK_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRODUCT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="nv"&gt;FRAMEWORK_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;${BUILD_DIR}/${PRODUCT_NAME}.framework&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="nv"&gt;FRAMEWORK_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;A&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -d &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;	&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cleaning existing framework...&amp;quot;&lt;/span&gt;&lt;br /&gt;	rm -rf &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;mkdir -p &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH&amp;quot;&lt;/span&gt;&lt;br /&gt;mkdir -p &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions&amp;quot;&lt;/span&gt;&lt;br /&gt;mkdir -p &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/$FRAMEWORK_VERSION&amp;quot;&lt;/span&gt;&lt;br /&gt;mkdir -p &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/$FRAMEWORK_VERSION/Resources&amp;quot;&lt;/span&gt;&lt;br /&gt;mkdir -p &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/$FRAMEWORK_VERSION/Headers&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;ln -s &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/$FRAMEWORK_VERSION&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/Current&amp;quot;&lt;/span&gt;&lt;br /&gt;ln -s &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/Current/Headers&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Headers&amp;quot;&lt;/span&gt;&lt;br /&gt;ln -s &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/Current/Resources&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Resources&amp;quot;&lt;/span&gt;&lt;br /&gt;ln -s &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/Current/${PRODUCT_NAME}&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/${PRODUCT_NAME}&amp;quot;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;lipo &lt;span class="s2"&gt;&amp;quot;${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PRODUCT_NAME}Framework-Device.a&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;&lt;br /&gt;	&lt;span class="s2"&gt;&amp;quot;${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PRODUCT_NAME}Framework-Simulator.a&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;&lt;br /&gt;	-create -output &lt;span class="s2"&gt;&amp;quot;$FRAMEWORK_PATH/Versions/$FRAMEWORK_VERSION/${PRODUCT_NAME}&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;In this customized target, I don&amp;#8217;t actually put any other target dependencies, since the dependent builds are handled by this bash script. First two lines use the xcodebuild command line tool to force a proper build, using the correct architectures and targets. The rest of the script creates the necessary framework structure, and the final command uses the lipo tool to combine the two static libraries into a single universal one.
&lt;/p&gt;
&lt;p&gt;After the Run Script build phase, I added a Copy Files phase to copy the necessary header files into the framework directory created here.
&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s about it. After this, you can import the generated framework bundle just like you import any other official Apple framework. It might also be possible to add this target as a dependency to your project&amp;#8217;s target, and have it automatically rebuild itself as necessary, but I haven&amp;#8217;t looked into it yet. Suggestions are always welcome.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/0mwN2__Y4bs" height="1" width="1"/&gt;</summary><category term="ios" /><category term="objc" /><category term="xcode" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/building-universal-static-libraries-using-xcode/</feedburner:origLink></entry><entry><title>Wide Angle Now Available</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/2NFzMuo63js/" rel="alternate" /><updated>2010-07-07T12:45:41-04:00</updated><id>http://www.taylanpince.com/blog/posts/wide-angle-now-available/</id><summary type="html">&lt;p&gt;My new iPad application for viewing news stories from around the world is now available on the App Store. I am really happy with this one, I hope you enjoy it too.
&lt;/p&gt;



&lt;p&gt;&lt;a href="http://hippofoundry.com/wide-angle/" rel="nofollow"&gt;Visit the bookmark &amp;raquo;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/2NFzMuo63js" height="1" width="1"/&gt;</summary><category term="hippofoundry" /><category term="ipad" /><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/wide-angle-now-available/</feedburner:origLink></entry><entry><title>Adding Geolocation Support to GeoDjango Admin</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/ulLl6nhqVYg/" rel="alternate" /><updated>2010-07-06T00:35:57-04:00</updated><id>http://www.taylanpince.com/blog/posts/adding-geolocation-support-to-geodjango-admin/</id><summary type="html">&lt;p&gt;&lt;a href="http://geodjango.org/"&gt;GeoDjango&lt;/a&gt; is awesome. It&amp;#8217;s one of those frameworks that does an amazing amount of heavy lifting for you behind the scenes so you can just focus on your implementation. There was one thing that has been bugging me about it since day one though: the map picker tool used in the administration area doesn&amp;#8217;t focus on your current location automatically. It simply gets initialized somewhere around Cameroon, and you have to pan and zoom your way around the world every time you want to add a single point, or polygon, most likely near where you are.
&lt;/p&gt;

&lt;p&gt;Adding geolocation support to this map has been surprisingly easy. Google Chrome, Firefox, and now Safari 5 all support geolocation, through &lt;a href="http://dev.w3.org/geo/api/spec-source.html"&gt;W3C Geolocation Standard&lt;/a&gt;. Google Maps API documentation includes &lt;a href="http://code.google.com/apis/maps/documentation/javascript/basics.html#Geolocation"&gt;a very handy JavaScript snippet&lt;/a&gt; that you can use to activate this feature, and it even has fallback support for browsers that have &lt;a href="http://code.google.com/apis/gears/api_geolocation.html"&gt;Google Gears&lt;/a&gt; installed, which has its own geolocation support.
&lt;/p&gt;
&lt;p&gt;Without further ado, let&amp;#8217;s get into the code. First, I switched the GeoDjango admin to use a Google Maps layer instead of the default Open Street Maps one. It&amp;#8217;s simply better in terms of visuals and readability, and people are much more used to it. I followed the &lt;a href="http://djangosnippets.org/snippets/1144/"&gt;snippet here&lt;/a&gt; and added the google.html and google.js files under templates/gis/admin.
&lt;/p&gt;
&lt;p&gt;After this, all I had to do was modify the google.js file to include geolocation support. The only gotcha here was using the transform call on OpenLayers.LonLat object to convert it into the correct projection format. Otherwise just passing the coordinates simply doesn&amp;#8217;t work.
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;gis/admin/openlayers.js&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="nx"&gt;base_layer&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Layer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Google&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Google Base Layer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;G_NORMAL_MAP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;br /&gt;    &lt;span class="s1"&gt;&amp;#39;sphericalMercator&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;});&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endblock&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt; &lt;span class="nx"&gt;controls&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kr"&gt;super&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;wkt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;zoomLevel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;    &lt;span class="c1"&gt;// Try W3C Geolocation method (Preferred)&lt;/span&gt;&lt;br /&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="nx"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;geolocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="p"&gt;}}.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setCenter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LonLat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;                &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;br /&gt;                &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;                    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Projection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EPSG:4326&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;br /&gt;                    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Projection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EPSG:900913&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;zoomLevel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="c1"&gt;// Location could not be found (probably denied by user)&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;});&lt;/span&gt;&lt;br /&gt;    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gears&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="c1"&gt;// Try Google Gears Geolocation&lt;/span&gt;&lt;br /&gt;        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;geo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gears&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;beta.geolocation&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        &lt;span class="nx"&gt;geo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="p"&gt;}}.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setCenter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;OpenLayers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LonLat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;                &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;br /&gt;                &lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;latitude&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;zoomLevel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;            &lt;span class="c1"&gt;// Location could not be found (probably denied by user)&lt;/span&gt;&lt;br /&gt;        &lt;span class="p"&gt;});&lt;/span&gt;&lt;br /&gt;    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;        &lt;span class="c1"&gt;// Browser doesn&amp;#39;t support Geolocation&lt;/span&gt;&lt;br /&gt;    &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endblock&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;There you go, this will focus on your current location (after asking for your permission, of course), if you don&amp;#8217;t have any points or polygons defined on the map. If you do, then it will simply focus on their boundaries.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/ulLl6nhqVYg" height="1" width="1"/&gt;</summary><category term="django" /><category term="geodjango" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/adding-geolocation-support-to-geodjango-admin/</feedburner:origLink></entry><entry><title>LCBO iPhone app now available</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/GD2wg1eL6y8/" rel="alternate" /><updated>2010-02-21T13:25:08-04:00</updated><id>http://www.taylanpince.com/blog/posts/lcbo-iphone-app-now-available/</id><summary type="html">&lt;p&gt;This is just a quick post to announce that a small project I completed last month, an iPhone app for finding liquor stores in Ontario, has been approved by Apple this past week and is now available on the iTunes Store. Go check it out, and let me know if you like it or not.
&lt;/p&gt;



&lt;p&gt;&lt;a href="http://hippofoundry.com/lcbo" rel="nofollow"&gt;Visit the bookmark &amp;raquo;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/GD2wg1eL6y8" height="1" width="1"/&gt;</summary><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/lcbo-iphone-app-now-available/</feedburner:origLink></entry><entry><title>Django Doc Wiki</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/lMcFkGQQwT8/" rel="alternate" /><updated>2010-01-20T01:06:13-04:00</updated><id>http://www.taylanpince.com/blog/posts/django-doc-wiki/</id><summary type="html">&lt;p&gt;I have been meaning to develop a simple Django-based wiki solution for a while. I prefer writing my notes and documentation in TextMate using Markdown, and keeping them in a public Git repo. However, I also need to share these files with other people every once in a while, and that&amp;#8217;s why I wanted to be able to easily display this content in a wiki-like web site, without having to duplicate data. That&amp;#8217;s how &lt;a href="http://github.com/taylanpince/django-doc-wiki"&gt;Django Doc Wiki&lt;/a&gt; was born today.
&lt;/p&gt;

&lt;p&gt;I am aware that there are many other Python based wiki solutions out there. &lt;a href="http://moinmo.in/"&gt;MoinMoinWiki&lt;/a&gt; seems like the most viable alternative, but it&amp;#8217;s still too complex for my needs. &lt;a href="http://code.google.com/p/django-wikiapp/"&gt;Django-wikiapp&lt;/a&gt; looks like a useful app as well, but it doesn&amp;#8217;t have any hooks for using it with a version control system outside the Django database.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/taylanpince/django-doc-wiki"&gt;Django Doc Wiki&lt;/a&gt; is an extremely simple solution, but it works well for me, so I am going to open source it in the hope that other people might have a use for it as well. It comes with two main features:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;Detect new files in a directory (through a cron job, script included) and updates to existing ones, remove deleted files
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;Support for Markdown formatting, SmartyPants and Pygments syntax highlighting (Markdown and SmartyPants included, Pygments should be installed separately)
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&amp;#8217;s pretty much it. I am especially proud of the clever manager and query set combo that can handle all the necessary checks in the background, without exposing any weird functionality to the view. I expect to work on this app a bit more for the next few days and polish a bit more, adding some more functionality.
&lt;/p&gt;
&lt;p&gt;In the meantime, you can grab it from &lt;a href="http://github.com/taylanpince/django-doc-wiki"&gt;GitHub&lt;/a&gt; or &lt;a href="http://wiki.taylanpince.com"&gt;see it running here&lt;/a&gt;.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/lMcFkGQQwT8" height="1" width="1"/&gt;</summary><category term="django" /><category term="wiki" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/django-doc-wiki/</feedburner:origLink></entry><entry><title>Changes in 2010</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/shi_5AByazc/" rel="alternate" /><updated>2010-01-13T11:35:25-04:00</updated><id>http://www.taylanpince.com/blog/posts/changes/</id><summary type="html">&lt;p&gt;I don&amp;#8217;t like making new year resolutions, but there will be some potentially big changes in my personal and professional lives in the upcoming months. I just wanted to write a quick post about my expectations and the reasons behind this decision.
&lt;/p&gt;

&lt;p&gt;I have been working as a developer for the past 10 years now, and I have always been very lucky to work with talented people and I learned a lot from every project that I worked on. However, working in an agency environment, or even a startup, means that I have to build someone else&amp;#8217;s vision, and that doesn&amp;#8217;t always coincide with my own.
&lt;/p&gt;
&lt;p&gt;I am interested in building quality products, whether it is for the web or a mobile platform, and my resolution for 2010 was to make this a reality. To that end, I will start freelancing within the next couple of weeks, and my aim is to pick projects that I am truly passionate about. I want to build killer iPhone apps, tailored web products and content management systems, and maybe even start learning the Android platform to extend my mobile skillset.
&lt;/p&gt;
&lt;p&gt;The more personal reason I wanted to make this change in my life was to start being location independent. I love travelling, and I want to be able to work from wherever I might be. I am also looking forward to getting out of the 9 to 5 cycle, which was never a good fit for me.
&lt;/p&gt;
&lt;p&gt;In any case, I am really excited about 2010, and I expect to be talking about some new projects here soon.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/shi_5AByazc" height="1" width="1"/&gt;</summary><category term="development" /><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/changes/</feedburner:origLink></entry><entry><title>Updates</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/gaTFA36Q5xI/" rel="alternate" /><updated>2010-01-04T03:21:30-04:00</updated><id>http://www.taylanpince.com/blog/posts/updates/</id><summary type="html">&lt;p&gt;I have been busy working on a few projects during the past few months. This is a quick summary post on what has been going on in my life recently.
&lt;/p&gt;

&lt;p&gt;Life has been quite hectic lately, with the work on &lt;a href="http://hippofoundry.com/movie-genie"&gt;Movie Genie&lt;/a&gt; going on, a new iPhone project in development, and a new job at Tall Tree Games building &lt;a href="http://apps.facebook.com/fishworld"&gt;Fish World&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;More recently, I managed to redesign and update this site with a better focus on my past work. I also decided to do more freelance work in 2010, so I have a few interesting projects lined up for the next couple of months, and accepting new offers for February and beyond. If you have anything in mind, &lt;a href="http://taylanpince.com/about/"&gt;drop me a line&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;I also &lt;a href="http://tumblr.taylanpince.com"&gt;started a tumblr blog&lt;/a&gt; to gather interesting art projects and essays that I come across. This is mainly for personal use, but feel free to check it out if you share my interests.
&lt;/p&gt;
&lt;p&gt;I expect to be talking more about future iPhone and open source projects here in the upcoming weeks.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/gaTFA36Q5xI" height="1" width="1"/&gt;</summary><category term="iphone" /><category term="web" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/updates/</feedburner:origLink></entry><entry><title>Movie Genie on Sale</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/nXzKzdt_LCA/" rel="alternate" /><updated>2009-08-29T03:05:39-04:00</updated><id>http://www.taylanpince.com/blog/posts/movie-genie-on-sale/</id><summary type="html">&lt;p&gt;To celebrate its 10,000th download, Movie Genie will be on sale until Monday, August 31st. Get it 50% off if you haven&amp;#8217;t yet!
&lt;/p&gt;



&lt;p&gt;&lt;a href="http://moviegenieapp.com/" rel="nofollow"&gt;Visit the bookmark &amp;raquo;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/nXzKzdt_LCA" height="1" width="1"/&gt;</summary><category term="iphone" /><category term="moviegenie" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/movie-genie-on-sale/</feedburner:origLink></entry><entry><title>Movie Genie and Big Picture Updated</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/MLDp8mV8qbk/" rel="alternate" /><updated>2009-07-23T09:34:24-04:00</updated><id>http://www.taylanpince.com/blog/posts/movie-genie-and-big-picture-updated/</id><summary type="html">&lt;p&gt;Updates for Movie Genie and Big Picture have been approved by Apple yesterday evening. While Big Picture only got a small bug fix release, Movie Genie 1.2.2 adds a number of new features that people have been waiting for:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     Episode listings for TV series
 &lt;/li&gt;

 &lt;li&gt;
     Award details, categorized by year
 &lt;/li&gt;

 &lt;li&gt;
     Quotes
 &lt;/li&gt;

 &lt;li&gt;
     User Reviews
 &lt;/li&gt;

 &lt;li&gt;
     Full Synopsis
 &lt;/li&gt;

 &lt;li&gt;
     Certifications
 &lt;/li&gt;

 &lt;li&gt;
     Parental Guides
 &lt;/li&gt;

 &lt;li&gt;
     Extended cast &amp;amp; crew data
 &lt;/li&gt;

 &lt;li&gt;
     Improved navigation interface
 &lt;/li&gt;

 &lt;li&gt;
     Optimized performance
 &lt;/li&gt;

 &lt;li&gt;
     Alphabetical sorting for favorites
 &lt;/li&gt;

 &lt;li&gt;
     Improved connection reliability
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am very excited about these new abilities of the app. For more info, head on over to &lt;a href="http://hippofoundry.com"&gt;Hippo Foundry&lt;/a&gt;.
&lt;/p&gt;



&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/MLDp8mV8qbk" height="1" width="1"/&gt;</summary><category term="hippofoundry" /><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/movie-genie-and-big-picture-updated/</feedburner:origLink></entry><entry><title>Django, Push Notifications, and Prowl</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/dIrNs-kWOxc/" rel="alternate" /><updated>2009-07-17T13:41:18-04:00</updated><id>http://www.taylanpince.com/blog/posts/django-push-notifications-and-prowl/</id><summary type="html">&lt;p&gt;One issue that I have had with this blog for a while has been the lack of 
   notifications when a new, legitimate comment is posted under one of my 
   articles. I don&amp;#8217;t get many comments, but when I do, I would like to be able 
   to respond right away. I don&amp;#8217;t like email notifications, so when 
   &lt;a href="https://prowl.weks.net/"&gt;Prowl&lt;/a&gt; was announced this week, I was excited about 
   the possibility of sending push notifications to my iPhone whenever a new 
   comment was posted. It turned out to be much easier than I anticipated, 
   thanks to Jacob Burch&amp;#8217;s &lt;a href="http://github.com/jacobb/prowlpy/tree/master"&gt;Prowlpy&lt;/a&gt; 
   module and Django&amp;#8217;s signals framework.
&lt;/p&gt;

&lt;p&gt;To setup push notifications for anything, you need to get these done first:
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;p&gt;Register for an account at the &lt;a href="https://prowl.weks.net/"&gt;Prowl&lt;/a&gt; site, then
      go to iTunes Store and buy Prowl for your iPhone/iPod Touch
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;After setting up your device, login to your account at the Prowl web site,
      click on Settings, and generate an API key
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;Download and install &lt;a href="http://github.com/jacobb/prowlpy/tree/master"&gt;Prowlpy&lt;/a&gt; 
      and &lt;a href="http://code.google.com/p/httplib2/"&gt;httplib2&lt;/a&gt;. I opted for simply 
      putting Prowlpy somewhere on my PYTHONPATH, and installing httplib2 through
      aptitude:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install python-httplib2
&lt;/code&gt;&lt;/pre&gt;
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now that you are ready, simply create a signals.py file under whichever Django 
   application you would like to use to send push notifications for, and use 
   something similar to this for sending out messages to the Prowl API:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.conf&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;br /&gt;    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.contrib.sites.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Site&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;prowl.prowlpy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Prowl&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;comment_notification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;        Connects to the Prowl API to send a push notification&lt;/span&gt;&lt;br /&gt;&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;prowl_api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Prowl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROWL_API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;            &lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_current&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prowl_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verify_key&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;br /&gt;                &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;                    &lt;span class="n"&gt;prowl_api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;br /&gt;                        &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;taylanpince.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;                        &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;New Comment&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;                        &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A new comment has been published under blog post: &lt;/span&gt;&lt;span class="si"&gt;%(title)s&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="si"&gt;%(link)s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;                            &lt;span class="s"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;                            &lt;span class="s"&gt;&amp;quot;link&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;http://&lt;/span&gt;&lt;span class="si"&gt;%(domain)s%(path)s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;br /&gt;                                &lt;span class="s"&gt;&amp;quot;domain&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;br /&gt;                                &lt;span class="s"&gt;&amp;quot;path&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_absolute_url&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;br /&gt;                            &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;                        &lt;span class="p"&gt;}&lt;/span&gt;&lt;br /&gt;                    &lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;                &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;br /&gt;                    &lt;span class="k"&gt;pass&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Obviously, you also need to put your Prowl API key that you got from your 
   account page earlier inside your settings.py file:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="n"&gt;PROWL_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR_API_KEY&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Finally, you have to link this signal to a model. In your models.py file, you 
   can have the model call this method as a pre_save signal:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;django.db.models.signals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pre_save&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;blog.signals&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;comment_notification&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;br /&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;br /&gt;      &lt;span class="o"&gt;...&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;    &lt;span class="n"&gt;pre_save&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comment_notification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;You could, of course, call this signal post_save as well. That&amp;#8217;s up to you. In 
   my case, I also do some spam filtering through the &lt;a href="http://akismet.com/"&gt;Akismet&lt;/a&gt; 
   API, so it makes more sense to handle all of that in a pre_save signal and 
   only send out a notification if a comment passes that check. I suggest you do 
   something similar - it wouldn&amp;#8217;t be fun to get push notifications for spam.
&lt;/p&gt;
&lt;p&gt;Finally, I had to fork the Prawlpy script and make some minor modifications to 
   make sure the content is encoded properly. Unless you comment out the following 
   lines in Prowlpy, you will get urlencoded strings in your notification:
&lt;/p&gt;
&lt;div class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;    &lt;span class="c"&gt;# URL-encode and string-ify keywords. Better type/content testing is needed here&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;    &lt;span class="n"&gt;priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;p&gt;And that&amp;#8217;s it, now I will always be on top of the comments posted here!
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/dIrNs-kWOxc" height="1" width="1"/&gt;</summary><category term="django" /><category term="iphone" /><category term="python" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/django-push-notifications-and-prowl/</feedburner:origLink></entry><entry><title>App Store Review Frustrations</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/CPwUrQERA9g/" rel="alternate" /><updated>2009-07-17T09:48:51-04:00</updated><id>http://www.taylanpince.com/blog/posts/app-store-review-frustrations/</id><summary type="html">&lt;p&gt;Two days ago, &lt;a href="http://hippofoundry.com/movie-genie"&gt;Movie Genie&lt;/a&gt;&amp;#8217;s main server, which provides all search results for the application, went down for about six hours, making it pretty much unusable to anyone. This was a dumb mistake on my part, since the issue was very easy to resolve, but I should have had the necessary precautions in place to warn me of the server downtime. I do have those running now, but it&amp;#8217;s too late, and within those six hours, Movie Genie&amp;#8217;s average rating went down from &lt;strong&gt;a full 5 stars to 2 or 3&lt;/strong&gt; in most countries.
&lt;/p&gt;

&lt;p&gt;This is, obviously, frustrating for me. I can&amp;#8217;t blame the users who wrote those reviews. It&amp;#8217;s human nature to not praise someone when they do a good job, but blame them the moment they fail. Movie Genie was downloaded by almost 3,000 people before this happened, and I had a total of thirty reviews from around the world, all of them ranging between 3 to 5 stars. While the servers were down, I got around &lt;strong&gt;fifteen 1-star reviews&lt;/strong&gt;. It doesn&amp;#8217;t matter that the app is working properly now, sale figures were &lt;strong&gt;down 50%&lt;/strong&gt; yesterday. I don&amp;#8217;t expect them to go up anytime soon.
&lt;/p&gt;
&lt;p&gt;My real frustration, though, is with &lt;strong&gt;Apple and the iTunes Store reviews&lt;/strong&gt;. Customer satisfaction has been the most important thing for me since I started selling on the store, exactly a month ago. I replied to every email within an hour, tried to solve every issue, give everyone who cared to contact me the amount of time and interest they deserved. Unfortunately, with these reviews, I have &lt;strong&gt;no way of contacting&lt;/strong&gt; my frustrated customers. I wish I could just send them an email and say: &amp;#8220;Please, just try the app one more time&amp;#8221;. But they are just nicknames on the iTunes Store with no contact information, and they probably will never launch the app again.
&lt;/p&gt;
&lt;p&gt;Even if they did, the process for modifying or deleting a review is so convoluted that they would never bother to take those unfair reviews back. I had a client who gave me a 1-star review contact me later. I convinced him that the problem was resolved, and he apologized for his unfair assessment. He told me that he emailed Apple so they can take down his review. I told him that Apple would never take his review down for him, that he had to do it himself, and gave him a step by step guide on how he can. He never responded back, and his review is still there.
&lt;/p&gt;
&lt;p&gt;So, there you have it. I am just frustrated, and I am not going to look at the Store rankings or reviews for a while. I&amp;#8217;ll just keep my head down, focus on building new apps.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/CPwUrQERA9g" height="1" width="1"/&gt;</summary><category term="apple" /><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/app-store-review-frustrations/</feedburner:origLink></entry><entry><title>Big Picture now available on the App Store</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/S1ePQm_CGu8/" rel="alternate" /><updated>2009-07-15T14:37:32-04:00</updated><id>http://www.taylanpince.com/blog/posts/big-picture-now-available-on-the-app-store/</id><summary type="html">&lt;p&gt;This is just a quick note to announce that my second iPhone app, Big Picture, has just been approved by Apple. This is a simple but elegant client for boston.com&amp;#8217;s &lt;a href="http://www.boston.com/bigpicture/"&gt;The Big Picture&lt;/a&gt; blog. To learn more about the app, follow the link.
&lt;/p&gt;



&lt;p&gt;&lt;a href="http://hippofoundry.com/big-picture/" rel="nofollow"&gt;Visit the bookmark &amp;raquo;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/S1ePQm_CGu8" height="1" width="1"/&gt;</summary><category term="bigpicture" /><category term="iphone" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/big-picture-now-available-on-the-app-store/</feedburner:origLink></entry><entry><title>Oggifier: A Simple GUI Wrapper for ffmpeg2theora</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/_z6Of_nJ0sE/" rel="alternate" /><updated>2009-07-03T19:07:43-04:00</updated><id>http://www.taylanpince.com/blog/posts/oggifier-gui-wrapper-ffmpeg2theora/</id><summary type="html">&lt;p&gt;With the release of Firefox 3.5 earlier this week, the discussion around HTML5 and its native support for video and audio tags suddenly gained speed. One of the major issues around these new features is the lack of proper video codecs that can be used. Apple&amp;#8217;s Safari supports H.264, but Firefox and other open source
   browsers can&amp;#8217;t, due to licensing problems. Their adopted open source format, OGG, seems like the way to go, but it&amp;#8217;s not that easy to generate, especially if you are on a Mac.
&lt;/p&gt;
&lt;p&gt;Yesterday, John Gruber from Daring Fireball &lt;a href="http://daringfireball.net/2009/07/ffmpeg2theora"&gt;published a lengthy post&lt;/a&gt; about possible solutions for OGG conversion on Mac, and his suggestion was to use Jan Gerber&amp;#8217;s excellent &lt;a href="http://v2v.cc/~j/ffmpeg2theora/"&gt;ffmpeg2theora&lt;/a&gt;. I thought I would spend some time and build a simple GUI wrapper for this tool so it would be more easily adopted by Mac users. Today I am releasing an early beta version of Oggifier, a simple GUI wrapper around ffmpeg2theora.
&lt;/p&gt;

&lt;img src="http://appcast.taylanpince.com/oggifier/badge.png" alt="Oggifier" /&gt;

&lt;p&gt;Apart from a clean and simple user interface, Oggifier provides two additional features that might be useful to people:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;&lt;p&gt;It comes bundled with the latest version of ffmpeg2theora, so you don&amp;#8217;t have to deal with installing it (even though Jan Gerber&amp;#8217;s package installer is perfect, dragging and dropping an app that handles everything for you is easier)
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;Oggifier supports automated updates through Andy Matuschak&amp;#8217;s &lt;a href="http://sparkle.andymatuschak.org/"&gt;Sparkle framework&lt;/a&gt;, which means that you will receive future updates to both Oggifier and the ffmpeg2theora automatically
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can get &lt;a href="http://appcast.taylanpince.com/oggifier/Oggifier.0.3.0.zip"&gt;Oggifier 0.3.0 here&lt;/a&gt;. Please let me know what you think in the comments. I am planning to add support for advanced ffmpeg2theora options within the next few weeks.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I just published version 0.3.0 that adds a simple preferences pane with support for automated conversion and optionally quitting after the process is complete.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/_z6Of_nJ0sE" height="1" width="1"/&gt;</summary><category term="mac" /><category term="objectivec" /><category term="oggifier" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/oggifier-gui-wrapper-ffmpeg2theora/</feedburner:origLink></entry><entry><title>Movie Genie is now available on the App Store!</title><link href="http://feedproxy.google.com/~r/taylanpince-posts/~3/StVxFufDwGg/" rel="alternate" /><updated>2009-06-16T10:08:53-04:00</updated><id>http://www.taylanpince.com/blog/posts/movie-genie-is-now-available-on-the-app-store/</id><summary type="html">&lt;p&gt;This is just a quick post to let everyone know that Apple has finally approved &lt;a href="http://moviegenieapp.com"&gt;Movie Genie&lt;/a&gt; yesterday night and it is now available on the &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=318807631&amp;amp;mt=8"&gt;iTunes Store&lt;/a&gt;. Contrary to what I expected, the approval process was painless, and Apple did a very good job of reviewing the app for possible defects.
&lt;/p&gt;
&lt;p&gt;I hope that people will enjoy this first app, I am very excited to be building on this platform. If you have any suggestions or comments, feel free to email me or leave your thoughts here.
&lt;/p&gt;



&lt;img src="http://feeds.feedburner.com/~r/taylanpince-posts/~4/StVxFufDwGg" height="1" width="1"/&gt;</summary><category term="iphone" /><category term="moviegenie" /><feedburner:origLink>http://www.taylanpince.com/blog/posts/movie-genie-is-now-available-on-the-app-store/</feedburner:origLink></entry></feed>
