<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Johan Nilsson</title>
 
 <link href="http://johannilsson.com/" />
 <updated>2012-02-08T13:48:39-08:00</updated>
 <id>http://johannilsson.com/</id>
 <author>
   <name>Johan Nilsson</name>
   <email>blog@markupartist.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/johannilsson" /><feedburner:info uri="johannilsson" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Why Ads In STHLM Traveling?</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/CKvPgezvQYw/ads-in-sthlm-traveling.html" />
   <updated>2011-09-03T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2011/09/03/ads-in-sthlm-traveling</id>
   <content type="html">&lt;img src='/images/sthlm-traveling-icon.png' alt='STHLM Traveling icon' style='float: right; padding: 15px' /&gt;
&lt;p&gt;&lt;a href='http://www.google.com/enterprise/cloud/appengine/'&gt;Google App Engine&lt;/a&gt; is a cloud service that deals with a lot of usually hard things to cope with like automatic scaling during high load, easy deploy and a lot of other things I&amp;#8217;ve come to like. I&amp;#8217;ve used App Engine as a backend for &lt;a href='https://market.android.com/details?id=com.markupartist.sthlmtraveling'&gt;STHLM Traveling&lt;/a&gt; since 2009, always knowing that it has been in beta and things can and most likely will change. The App Engine team have also announced that their price model will change when they leave beta.&lt;/p&gt;

&lt;p&gt;App Engine left beta a few days ago, but no one had guesed that the price will increase by this much. For STHLM Traveling this means that the &lt;strong&gt;monthly cost will increase from $0.5 to approximate $150&lt;/strong&gt;. I develop STHLM Traveling in my spare time and previous cost has been covered by my self and with donations, thank you all that have been donating!&lt;/p&gt;

&lt;p&gt;To try to cover some of the new costs I&amp;#8217;ve added ads on a few spots in the app. Hopefully they will not hide any functionality and be in the way for any use case. They might even show some interesting things to read while commuting, who knows?&lt;/p&gt;

&lt;p&gt;The plan is to have the ads for a period to see how much of the hosting costs can be covered and then evaluate what the next step will be. I&amp;#8217;ve also started the work to migrate away from App Engine to reduce the cost. During this period some of the functionality in the app may have to be disabled depending on how long it takes to migrate to a new platform.&lt;/p&gt;

&lt;p&gt;Please don&amp;#8217;t hesitate to ask if you have any question on this or other things on the app. I have many new things planned for the app and the app is still &lt;a href='https://github.com/johannilsson/sthlmtraveling'&gt;open source&lt;/a&gt; but the next thing on the agenda is the migration away from App Engine.&lt;/p&gt;

&lt;p&gt;Thank you for your patience and I hope you will understand why I needed to do this change.&lt;/p&gt;

&lt;h2 id='update'&gt;Update&lt;/h2&gt;

&lt;p&gt;I realized that just adding ads without an alternative was not a good way to do this. The latest version on Android Market has the ads disabled, the way forward is to focus on rebuilding and migrating the server.&lt;/p&gt;

&lt;p&gt;During this time I hope that the cost will be covered by donations. I accept donations using Pledgie or Flattr. If you or anyone you know want to sponsor the costs please don&amp;#8217;t hesitate to contact me. If you donate and I still decide to introduce a paid version I promise that you will get that app for free.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://www.pledgie.com/campaigns/6527'&gt;&lt;img src='http://www.pledgie.com/campaigns/6527.png?skin_name=chrome' border='0' alt='Click here to lend your support to: sthlmtraveling and make a donation at www.pledgie.com !' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href='http://flattr.com/thing/332993/STHLM-Traveling' target='_blank'&gt;&lt;img title='Flattr this' src='http://api.flattr.com/button/flattr-badge-large.png' border='0' alt='Flattr this' /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/CKvPgezvQYw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/09/03/ads-in-sthlm-traveling.html</feedburner:origLink></entry>
 
 <entry>
   <title>Authenticated API requests on Google App Engine</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/YxxbVIcDCic/authenticated-requests-on-app-engine.html" />
   <updated>2011-04-13T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2011/04/13/authenticated-requests-on-app-engine</id>
   <content type="html">&lt;p&gt;Ever wanted to do authenticated API requests on &lt;a href='http://code.google.com/appengine/'&gt;Google App Engine&lt;/a&gt; using the provided &lt;a href='http://code.google.com/intl/sv/appengine/docs/python/gettingstarted/usingusers.html'&gt;User Service&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;When we first released &lt;a href='http://droidgiro.se/'&gt;droidgiro&lt;/a&gt; we needed to do this, we later on migrated to another solution but that&amp;#8217;s another story. It&amp;#8217;s was really easy to add login functionality on a regular web using the User Service, but it turned out to be a bit harder to do it through the API. Last year I held an &lt;a href='http://www.slideshare.net/johannilsson/foss-sthlm-android-cloud-to-device-messaging'&gt;presentation&lt;/a&gt; about &lt;a href='http://code.google.com/intl/sv/android/c2dm/index.html'&gt;Android C2DM&lt;/a&gt; and using examples from that presentation I got it to work in a similar fashion with App Engine.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an example handler that demonstrates how to identify a logged in user.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='python'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;ExampleHandler&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;webapp&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;RequestHandler&lt;/span&gt;&lt;span class='p'&gt;):&lt;/span&gt;
    &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;post&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='bp'&gt;self&lt;/span&gt;&lt;span class='p'&gt;):&lt;/span&gt;
        &lt;span class='n'&gt;user&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;users&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;get_current_user&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;user&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;
            &lt;span class='bp'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;out&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;write&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;Welcome, &lt;/span&gt;&lt;span class='si'&gt;%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='n'&gt;user&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;nickname&lt;/span&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;span class='bp'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;error&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;401&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
            &lt;span class='bp'&gt;self&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;response&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;out&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;write&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;:(&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In the examples below I&amp;#8217;m using &lt;a href='http://curl.haxx.se/'&gt;cURL&lt;/a&gt; since I believe that&amp;#8217;s the easiest way to see what&amp;#8217;s actually is going on.&lt;/p&gt;

&lt;h2 id='development_environment'&gt;Development Environment&lt;/h2&gt;

&lt;p&gt;To obtain the necessary cookie for a user we first need to authenticate against the dev server. This script demonstrates how to authenticate the user &lt;code&gt;test@example.com&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl http://localhost:8080/_ah/login \
  -d &amp;quot;email=test@example.com&amp;amp;action=Log+In&amp;quot; \
  -c -&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will return something like.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;localhost	FALSE	/	FALSE	0	dev_appserver_login	&amp;quot;test@example.com:False:18580...&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Take the last value &lt;code&gt;test@example.com:False:18580...&lt;/code&gt; and construct a new request to our API.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -X POST http://localhost:8080/example \
  -b &amp;quot;dev_appserver_login=&amp;quot;test@example.com:False:18580...&amp;quot;; Path=/;&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will print the welcome message for the authenticated user.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Welcome, test@example.com.&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='production_environment'&gt;Production Environment&lt;/h2&gt;

&lt;p&gt;To do the same on a deployed app we first we need to authenticate against the Google &lt;a href='http://code.google.com/intl/en/apis/accounts/docs/AuthForInstalledApps.html'&gt;ClientLogin&lt;/a&gt; service. This is similar for what we do when using C2DM (and other Google services). The important part here is that we specify the &lt;code&gt;service&lt;/code&gt; name &lt;code&gt;ah&lt;/code&gt; for App Engine. I believe &lt;code&gt;source&lt;/code&gt; is optional but it&amp;#8217;s recommended to specify your app name together with the current version there. Apart from that we need to specify the &lt;code&gt;Email&lt;/code&gt; and &lt;code&gt;Password&lt;/code&gt; we want to login with. Google has also put together an &lt;a href='http://code.google.com/intl/sv/apis/gdata/articles/using_cURL.html'&gt;article&lt;/a&gt; of how to use cURL to interact with Google data services that brings some more light to this topic.&lt;/p&gt;

&lt;p&gt;The following script obtains the auth token from the Google ClientLogin service.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl https://www.google.com/accounts/ClientLogin \
  -d &amp;quot;Email=YOUR EMAIL HERE&amp;quot; \
  -d &amp;quot;Passwd=YOUR PASSWORD HERE&amp;quot; \
  -d &amp;quot;accountType=HOSTED_OR_GOOGLE&amp;quot; \
  -d &amp;quot;source=YOUR APP NAME HERE&amp;quot; \
  -d &amp;quot;service=ah&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will return something like.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SID=DQAAA...
LSID=DQAAA...
Auth=DQAAA...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Take the value of &lt;code&gt;Auth&lt;/code&gt;, &lt;code&gt;DQAAA...&lt;/code&gt; and use in the next request.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl http://example.appspot.com/_ah/login?auth=DQAAA...&amp;amp;continue=http%3A%2F%2Fexample.appspot.com \
  -c -&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will return the &lt;code&gt;ACSID&lt;/code&gt; cookie.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#HttpOnly_example.appspot.com	FALSE	/	FALSE	129...	ACSID	AJKiY...&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now we can post to our API similar to what we did on the dev server.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl http://example.appspot.com/example \
  -b &amp;quot;ACSID=AJKiY...&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will print the welcome message for the authenticated user.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Welcome, test.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There&amp;#8217;s no need to authenticate the user for each request we do. When we&amp;#8217;ve obtained the &lt;code&gt;ACSID&lt;/code&gt; we can reuse that until the token expires. When sending messages using C2DM the header &lt;code&gt;Update-Client-Auth&lt;/code&gt; is included when the token has expired. The new token should be used the next time a request is done to the API. I&amp;#8217;m not sure if that header is returned here though.&lt;/p&gt;

&lt;p&gt;That&amp;#8217;s it, happy hacking!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/YxxbVIcDCic" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/04/13/authenticated-requests-on-app-engine.html</feedburner:origLink></entry>
 
 <entry>
   <title>Help to create a list of apps using the Android Action Bar and the Pull to Refresh widget</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/PcGMbgVSsl0/help.html" />
   <updated>2011-03-27T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2011/03/27/help</id>
   <content type="html">&lt;p&gt;I want to put together a list of applications using the &lt;a href='https://github.com/johannilsson/android-actionbar'&gt;Android Action Bar&lt;/a&gt; or the &lt;a href='https://github.com/johannilsson/android-pulltorefresh'&gt;Android Pull to Refresh&lt;/a&gt; widget to see what designs others have come up with. It would also be fun for me to know if someone is actually using them :)&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s definitly optional but if you want to be featured please edit the &lt;a href='https://github.com/johannilsson/android-actionbar/wiki/Apps'&gt;Apps wiki page&lt;/a&gt; of Android Action Bar or the &lt;a href='https://github.com/johannilsson/android-pulltorefresh/wiki/Apps'&gt;Apps wiki page&lt;/a&gt; of Android Pull to Refresh. You can also send me the App name, Market link (if available) and a screenshot (optional) by email.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m also very interesting to know what&amp;#8217;s sucks and what&amp;#8217;s not with these widgets.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/PcGMbgVSsl0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/03/27/help.html</feedburner:origLink></entry>
 
 <entry>
   <title>Appening</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/9_RWhHW6glk/appening.html" />
   <updated>2011-03-20T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2011/03/20/appening</id>
   <content type="html">&lt;p&gt;A month ago I &lt;a href='http://twitter.com/#!/johanni/status/39321224500875264'&gt;tweeted&lt;/a&gt; about Appening (a 24 hour hackathon on public data in Sundsvall) and that I wanted to participate. A couple of hours later me &lt;a href='http://twitter.com/nollbit'&gt;Johan Mjönes&lt;/a&gt;, &lt;a href='http://twitter.com/jbripley'&gt;Joakim Bodin&lt;/a&gt;, &lt;a href='http://twitter.com/jonasbeckman'&gt;Jonas Beckman&lt;/a&gt; and &lt;a href='http://twitter.com/pakerfeldt'&gt;Patrik Åkerfeldt&lt;/a&gt; decided to participate.&lt;/p&gt;

&lt;h2 id='data'&gt;Data&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://www.forsakringskassan.se/'&gt;Försäkringskassan&lt;/a&gt; (Social Insurance), &lt;a href='http://bolagsverket.se/'&gt;Bolagsverket&lt;/a&gt; (Swedish Companies Registration Office) and &lt;a href='http://www.raa.se/'&gt;Riksantikvarieämbetet&lt;/a&gt; (The Swedish National Heritage Board) participated and held presentations on their available APIs. &lt;a href='http://www.flickr.com/photos/johannilsson/5543117687/' title='Appening 2011 by Johan Nilsson, on Flickr' style='float: right; padding: 15px'&gt;&lt;img src='http://farm6.static.flickr.com/5140/5543117687_6f41070938_m.jpg' height='180' alt='Appening 2011' width='240' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Försäkringskassan&lt;/strong&gt; mostly handle very sensitive data and could because of this not open up their data. Even though I believe I should have the possibility to export whatever data they have on me in their system. For the event they did their best and brought a server with mocked data about a fictive family for us to query and build new services upon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bolagsverket&lt;/strong&gt; didn&amp;#8217;t have any available APIs available for us instead we had to screen scrape their web to be able to build anything useful. However they provided us with login credentials for their service that they normally charge quite a lot of money for. &lt;a href='http://www.flickr.com/photos/johannilsson/5543696560/' title='Appening 2011 by Johan Nilsson, on Flickr' style='float: right; padding: 15px'&gt;&lt;img src='http://farm6.static.flickr.com/5133/5543696560_e900114484_m.jpg' height='180' alt='Appening 2011' width='240' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Riksantikvarieämbetet&lt;/strong&gt; presented a quite impressive and and well documented &lt;a href='http://www.ksamsok.se/api/'&gt;API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other data sources&lt;/strong&gt; was also available but not presented in detailed, instead they where listed on the &lt;a href='http://appening.se/data'&gt;Appening website&lt;/a&gt;. There was lot of data available from Sundsvall municipality, if the data would have been presented in a better way or by someone I&amp;#8217;m sure we would have seen this data used in some apps.&lt;/p&gt;

&lt;h2 id='avtryck'&gt;Avtryck&lt;/h2&gt;
&lt;img src='https://github.com/Avtryck/avtryck-projectweb/raw/master/appening/captures/8.png' width='300px' style='float: right; margin: 15px;' /&gt;
&lt;p&gt;We created the Android app Avtryck (roughly translated to mark). Our idea was to build a service where users could create routes by marking out points of cultural heritage with their own descriptions. By creating routes like this we allowed users to put the data into a context which we believe is more appealing. During the event we focused on the Android app and built a mocked API for fetching routes.&lt;/p&gt;

&lt;p&gt;Our presentation is available on &lt;a href='http://bambuser.com/node/1590759'&gt;Bambuser&lt;/a&gt;, around 3.40, slides is uploaded to &lt;a href='https://github.com/Avtryck/avtryck-projectweb/raw/master/appening/avtryck-slides.pdf'&gt;GitHub&lt;/a&gt; (PDF). More information about the project is available at our &lt;a href='https://github.com/Avtryck'&gt;organization on GitHub&lt;/a&gt;. During the event we also registered the domain &lt;a href='http://www.tidensavtryck.se/'&gt;tidensavtryck.se&lt;/a&gt; and we hope to continue the work on both the app the service so users can actually start to create routes. We also want to combine other data sources to create richer routes. A route I would like to see for the summer is the best &lt;a href='http://loppiskartan.se'&gt;flea markets&lt;/a&gt; around Stockholm combined with recommended &lt;a href='http://cafekartan.se'&gt;cafés&lt;/a&gt; along the route.&lt;/p&gt;

&lt;p&gt;Avtryck won prize for best idea, sponsored by &lt;a href='http://www.sundsvall42.se/'&gt;Sundsvall42&lt;/a&gt; and a prize from Riksantikvarieämbetet. Thank you! &lt;a href='http://www.flickr.com/photos/johannilsson/5543697186/' title='Appening 2011 by Johan Nilsson, on Flickr' style='float: right; padding: 15px'&gt;&lt;img src='http://farm6.static.flickr.com/5060/5543697186_a5ff5a34c6_m.jpg' height='180' alt='Appening 2011' width='240' /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;I was very impressed by what all teams presented during the event, all teams and their presentations will soon be available at the Appening website. Four out of seven teams used the data available from Riksantikvarieämbetet. I believe most of the teams decided to use this data because it was not only the most interesting data it was also the most structured and well documented data set available. I believe/hope that the other authorities that participated got inspired and will start working on open up their data soon.&lt;/p&gt;

&lt;p&gt;Thank you &lt;a href='http://www.miun.se/'&gt;Mittuniversitetet&lt;/a&gt;, &lt;a href='http://www.edelegationen.se/'&gt;E-delegationen&lt;/a&gt;, &lt;a href='http://www.sundsvall42.se/'&gt;Sundsvall42&lt;/a&gt; and &lt;a href='http://www.dosf.se/'&gt;Dragon Open Source Foundation&lt;/a&gt; for organizing this event.&lt;/p&gt;

&lt;p&gt;I hope Appening will be an annual event and that we will have more data sources available and authorities participating next year.&lt;/p&gt;

&lt;h2 id='other_posts_about_appening'&gt;Other posts about Appening&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://charlotteshj.wordpress.com/'&gt;Charlotte S H Jensen&lt;/a&gt; - &lt;a href='http://charlotteshj.wordpress.com/2011/03/20/hackday-hinsidan-masser-af-kulturarv-i-svensk-appening/'&gt;Hackday hinsidan: masser af kulturarv i svensk appening&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.citerus.se/'&gt;Citerus&lt;/a&gt; - &lt;a href='http://www.citerus.se/post/284669-citerus-i-vinnarlag-p-appening-2011'&gt;Citerus i vinnarlag på Appening 2011&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.k-blogg.se/'&gt;Riksantikvarieämbetets blogg&lt;/a&gt; - &lt;a href='http://www.k-blogg.se/2011/03/25/raa-pa-appening-i-sundsvall/'&gt;RAÄ på appening i Sundsvall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/9_RWhHW6glk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/03/20/appening.html</feedburner:origLink></entry>
 
 <entry>
   <title>Yet Another Blog</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/SIffIwcWZ6g/yab.html" />
   <updated>2011-03-16T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2011/03/16/yab</id>
   <content type="html">&lt;p&gt;Last Sunday I created a blog, and here it is.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s amazing to see how easy the tools has become to use. In just a couple of hours I created this blog using &lt;a href='http://jekyllrb.com/'&gt;Jekyll&lt;/a&gt;, &lt;a href='http://html5boilerplate.com/'&gt;HTML5 Boilerplate&lt;/a&gt;, &lt;a href='http://disqus.com/'&gt;Disqus&lt;/a&gt; comments, &lt;a href='http://robertnyman.com/'&gt;Robert Nymans&lt;/a&gt; javascript for &lt;a href='http://robertnyman.com/2010/11/28/javascript-badge-to-present-twitter-reactions-to-a-certain-url-in-your-own-web-site/'&gt;Twitter reactions&lt;/a&gt; and hosting using &lt;a href='http://pages.github'&gt;GitHub pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve previously blogged in different forms, first using static html files. Couple of years later using &lt;a href='http://textpattern.com/'&gt;Textpattern&lt;/a&gt; that I also created a &lt;a href='http://www.markupartist.com/files/'&gt;few plugins&lt;/a&gt; for. A move from one server to antoher caused me to lose the data but &lt;a href='http://waybackmachine.org/*/johan.galaxen.net'&gt;some pages is still available&lt;/a&gt; at the Internet Archive though. Then I decided to try &lt;a href='http://tumblr.com/'&gt;Tumblr&lt;/a&gt; but didn&amp;#8217;t have &lt;a href='http://blog.johannilsson.me/'&gt;anything interesting&lt;/a&gt; to post. My next jump was to &lt;a href='http://www.blogger.com/'&gt;Blogger&lt;/a&gt;, same story there &lt;a href='http://markupartist.blogspot.com/'&gt;two post&lt;/a&gt; so far which I imported here. So no promises that there will be any posts, but it&amp;#8217;s worth a try and it&amp;#8217;s back to static html files.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/SIffIwcWZ6g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/03/16/yab.html</feedburner:origLink></entry>
 
 <entry>
   <title>Android Pull To Refresh Update</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/DFwd-B0SxCI/android-pull-to-refresh-update.html" />
   <updated>2011-03-13T00:00:00-08:00</updated>
   <id>http://johannilsson.com/2011/03/13/android-pull-to-refresh-update</id>
   <content type="html">&lt;img src='/images/android-pull-to-refresh.png' alt='Android Pull To Refresh screenshots' width='550' /&gt;
&lt;p&gt;Today I pushed a few changes to the &lt;a href='https://github.com/johannilsson/android-pulltorefresh'&gt;Android Pull To Refresh&lt;/a&gt; project that actually makes it possible to use it in a project.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s still work to do and I wouldn&amp;#8217;t call it stable, but please test it and let me know how it runs. There&amp;#8217;s an example project distributed with the source and examples in the README that should get one up and running fairly quick.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m very greatful for the high quality contributions I&amp;#8217;ve got so far, thank you &lt;a href='https://github.com/eddieringle'&gt;Eddie Ringle&lt;/a&gt;, &lt;a href='https://github.com/synthable'&gt;Jason Knight&lt;/a&gt;, &lt;a href='https://github.com/mattg1981'&gt;mattg1981&lt;/a&gt; and &lt;a href='https://github.com/MantaMay'&gt;MantaMay&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/DFwd-B0SxCI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2011/03/13/android-pull-to-refresh-update.html</feedburner:origLink></entry>
 
 <entry>
   <title>Force Close and STHLM Traveling</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/7u3HjLrEfto/force-close-sthlm-traveling.html" />
   <updated>2010-01-28T00:00:00-08:00</updated>
   <id>http://johannilsson.com/2010/01/28/force-close-sthlm-traveling</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m really sorry that the latest release of STHLM Traveling has caused a force close when starting the application on some devices.&lt;/p&gt;

&lt;p&gt;This is actually a bug in Android that I and many others got to learn about the hard way. This is the short background of why some user is getting a force close. When uploading a application to Android Market you have the choice to enable copy protection for the application. I once activated this and recently removed it. What I did not know was that when the application has a database or writes files to disk something goes wrong and causes a force close on start up when switching the copy protection setting. The only solution to this problem is to first uninstall and then install the application again. Another downside off this is that you loose all saved data. From what I have understand the force close issue only affects devices that runs Android 1.5.&lt;/p&gt;

&lt;p&gt;While fiddling around with this copy protection setting I also noticed that some phone models and carriers did not list copy protected application in Android Market, this is also discussed in the Android developer group.&lt;/p&gt;

&lt;p&gt;Once again I&amp;#8217;m really sorry about all this. I hope it will not happen again.&lt;/p&gt;

&lt;p&gt;But now to something slightly more fun, the latest release of STHLM Traveling. I added a Swedish translation with great help by Jean Diarbakerli that did all the hard work with the translation. The application will automatically choose Swedish if you have selected this in the Android settings. Unfortunately Android does not have a official Swedish translation but some roms support this for example HTC Sense. For the rest off us we need to go to the settings menu in the STHLM Traveling and set the preferred language there. I also added history and shortcuts for departures.&lt;/p&gt;

&lt;p&gt;I would also like to thank all of you that has sent me crash reports, it has helped me a lot when trying to make this application as stable as possible.&lt;/p&gt;

&lt;p&gt;Get the latest version of STHLM Traveling from Android Market.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/7u3HjLrEfto" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2010/01/28/force-close-sthlm-traveling.html</feedburner:origLink></entry>
 
 <entry>
   <title>Crime Sweeper</title>
   <link href="http://feedproxy.google.com/~r/johannilsson/~3/FAoyBOZfJF8/crimesweeper.html" />
   <updated>2009-05-12T00:00:00-07:00</updated>
   <id>http://johannilsson.com/2009/05/12/crimesweeper</id>
   <content type="html">&lt;p&gt;Last weekend I participated in the first GTUG Stockholm Android Hackathon in Sweden hosted by Bwin Games. A part from all the hacking there was also two great presentations by Dirk Groten, CTO from Layar and Johan Burell all organized by Peter Svensson, Peter also did a great write up of the event at his blog.&lt;/p&gt;

&lt;p&gt;Before the hackathon me and my other team mates Albert Ramstedt, Joakim Kolsjö and Joakim Bodin had an idea to build something on top of the data from brottsplatsstockholm.se, the site it self scrapes the Swedish police departments website for crimes committed in Stockholm. I contacted Pär Thernström to ask if it was possible for him to provide us with a simple API. Pär was really nice and created the API just a couple of days after I first contacted him.&lt;/p&gt;

&lt;p&gt;Once we had the API, we had a short meeting to discuss what to build during the hackathon. First we thought of building a application that just listed recently committed crimes and show them on a map. But we thought that was kinda boring instead we come up with the idea to create a game.&lt;/p&gt;

&lt;p&gt;The game we decided to build is sort of a geocaching game. We plotted all the crime sites on a map and showed the players position on it. The player can then start the game at any time by pressing a start button. To get points the player need to visit as many crime sites as possible during a fixed time. For each visited site the player earned 10 points and the possibility to see which type of crime that was committed at that place. Players that dare to visit areas with a high crime rate will probably get more points.&lt;/p&gt;

&lt;p&gt;Here is a short screen cast demonstrating CrimeSweeper. Crime sites are listed as stars on the map.&lt;/p&gt;
&lt;object height='390' width='640'&gt;&lt;param name='movie' value='http://www.youtube.com/v/EMvLnbIK-zo&amp;hl=en_US&amp;feature=player_embedded&amp;version=3' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowScriptAccess' value='always' /&gt;&lt;embed src='http://www.youtube.com/v/EMvLnbIK-zo&amp;hl=en_US&amp;feature=player_embedded&amp;version=3' allowfullscreen='true' allowScriptAccess='always' type='application/x-shockwave-flash' height='390' width='640' /&gt;&lt;/object&gt;
&lt;p&gt;So will CrimeSweeper be released on Android Market? Not sure, first of we probably need to rewrite it to use a service for the game logic. This to be able to track movements and hits even if the player is doing something else with the phone. It would also be fun to extend it to not only use crime sites, perhaps a map with tourist points would be nice as well? And of course a high score list. Anyway the source is at GitHub if anyone feel to hack around with it.&lt;/p&gt;

&lt;p&gt;I really love hackathons it is truly amazing to see what people manage to build during just a couple of hours. This was the second hackathon I participated in. Last time was in Amsterdam at Hyves HQ. Me, Joakim Bodin and Johan Mjönes then built a Android app called Mystery Hangout. If you are interested you can find the source and a video demonstrating it at GitHub.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/johannilsson/~4/FAoyBOZfJF8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://johannilsson.com/2009/05/12/crimesweeper.html</feedburner:origLink></entry>
 
 
</feed>

