<?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">
  <title>Dominiek - web, technology and startups</title>
  <id>tag:dominiek.com,2009:Kakuteru</id>
  <link href="http://dominiek.kakuteru.com/" type="text/html" rel="alternate" />
  
  <updated>2009-04-06T16:37:23Z</updated>
  <generator uri="http://dominiek.com/tag/maitako">Kakuteru</generator>
  <link rel="self" href="http://feeds.feedburner.com/dominiek" type="application/atom+xml" /><entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>The Failed Understanding of the Information Age</title>
    <content type="html">
      <![CDATA[<p><em>Note: this is a crazy rant I had lying around on my Notepad that I worked on in transit</em></p>
<p>It’s good to be back a while in my home country, the European-average Netherlands. Since last December I’m renting a pimping sublet in the center of Amsterdam. The owners are trying to pursue their dream in Hollywood (good luck!) and I’m guarding their purple walled pimpmobile. Unfortunately, they cancelled their <span class="caps">DSL</span> subscription last month which I found out only recently. As soon as I could I called the <span class="caps">DSL</span> company and asked to ‘take over their subscription’, but unfortunately that was a naive dream of mine. Procedure dictates that the <span class="caps">DSL</span> modem has to be sent back by the old customer, I would be treated as a new customer and receive a new <span class="caps">DSL</span> modem (probably the same one). No mechanic has to show up. Average time of delivery: five weeks.. <span class="caps">FIVE</span> <span class="caps">WEEKS</span>!?! Yes Sir, there is a mandatory one week ‘are you sure’ period mandated by the government and four weeks is “the normal waiting period”.</p>
<p>So now, as an internet refugee, I’m writing this in the library of the Utrecht University campus. Working here is awesome, there are huge tables and spaces. Beautiful modern architecture that inspires creativity. All funded by the government as part of their plan to make the Netherlands ‘Kennisland’ (Knowledge-land). All of this makes me think&#8230; Does the Dutch Government really understand the changes happening in the world? To them, a knowledge economy seems to mean moving away from relying on industrial output and stimulating a service industry with highly educated workers. But aren’t they missing something?</p>
<h2>The Age of Extremistan</h2>
<p>One of the biggest changes happening in our world today is the shift away from the physical (industrial era) to the informational (information era). Yes, it is now possible to generate tremendous amounts of value all virtual. How is that possible? Simply think about a car factory. The car factory started with big groups of humans assembling every little component, later things got automated more and more and now programming robots is much more valuable than touching any material objects. Factories are becoming more modular too, with generic purposes machines that can shape objects based on 3D <span class="caps">CAD</span>-designs. Now imagine the most generic purpose assembling device, yes! It&#8217;s the Star Trek Food Dispenser! :-] Science fiction or not, molecular manufacturing will be the end of the true end of the Industrial Age. It&#8217;s all nanotechnology from there. And as these changes happen, more and more physical objects will become informational.</p>
<p>As more and more things get informational, new laws apply. Information behaves very different than physical objects, but is unfortunately often treated the same. The current shake-up of the music industry is a great example of how traditional models of scarcity fail. Kevin Kelley explains it well in his essay that asserts that everything that can be copied will drop in value.</p>
<p>Nassim Nicholas Taleb in his book The Black Swan makes a distinction between Mediocrestan and Extremistan, respectively meaning the physical and informational worlds of probability. Extremistan has the tendency to be much more volatile, quicker changing and unpredictable.</p>
<h2>It’s the activity that matters</h2>
<p>One thing that bothers me about the collapse of the financial industry is that people scream ‘back to basic’, and shift their focus back to the tangible. Complex financial instruments are not necessarily bad, massive speculation without transparency IS.</p>
<p>People fail to understand that every industry is essentially a bubble and has a limited lifespan. The music industry is a great example. There was a time, in the beginning of it’s forming where a pop-artist could produce one hit song and live a luxury life for the rest of their life. After a while, this was becoming an expectation throughout the entire music industry. But now that money can no longer be charged for the actual content, the sector is imploding. In other words, you need to constantly work your ass off to make a buck. Perform, sign t-shirts, engage constantly&#8230;</p>
<p>Every industry has a lifespan that is based on technology, in it’s early stage people can make money in a highly scalable way (one day fly), but there comes a point where constant change (creative input) is necessary. Every industry!</p>
<p>And guess what, while the pace of innovation is speeding up, industries and companies will have ever shortening life spans. (Check out my crazy illustration below :)</p>
<p><img src="/assets/2009/4/6/industry_lifespan_s_curves.png" alt="" /></p>
<h2>What can organizations do?</h2>
<p>The real competitive advantage for any (corporate) entity is the ability to change. As things are speeding up and markets expand and contract more rapidly, it’s all about being agile. This means that larger organizations are at a disadvantage.</p>
<ul>
	<li>Move away from a monolithic structure to a fabric of smaller cells that work autonomously</li>
	<li>Give those cells more responsibility and shift to an ‘entrepreneurial workforce’</li>
	<li>Destroy the clustering of specialization, every cell should have multiple disciplines</li>
	<li>Provide the cells with extreme communication tools</li>
	<li>Abolish salaries, be more like an incubator</li>
	<li>Embrace new technology like never before</li>
</ul>
<h2>What can Governments do?</h2>
<p><img src="http://longnow.org/about/images/speed-layers-sm.png" alt="" /></p>
<p><em>(Image courtesy of the Long Now Foundation)</em></p>
<p>If Governments really want to succeed in the information era, they need to provide the tools for rapid change. Stimulate velocity at all costs. This will require radical change and cut-throat free market capitalism. Yeah, I said it!</p>
<ul>
	<li>Invest heavily in digitizing all public services, most importantly: Tax bureaucracy, Chamber of Commerce</li>
	<li>Make sure you can register and dissolve corporate entities within seconds (through an <span class="caps">API</span>)</li>
	<li>Invest heavily in both digital and physical infrastructure</li>
	<li>Reward taking risk and entrepreneurship, at cost of social welfare</li>
	<li>Give up taxes on many things. Already, the Dutch Government doesn’t tax ‘electronic services delivered to non-European countries’. Added informational value is hard to understand and will only get more complicated in the future.</li>
</ul>
<p>Coming from a European country and having written some of my crazy ideas here I realize that it’s going to be a bumpy road. Governments, especially European ones, will move incredibly slowly.</p>
<p>In a way that’s sad, because the changes our world is going through will require some serious governance. Bio and nano- technology can have monstrous consequences when not controlled correctly. Things might become crazy &#8211; sooner than we think :]</p>]]>
    </content>
    <updated>2009-04-06T16:37:23Z</updated>
    <category term="black swan" />
    <category term="business" />
    <category term="future" />
    <category term="technology" />
    <category term="nnt" />
    <category term="government" />
    <category term="economy" />
    <link href="http://dominiek.com/613643-the-failed-understanding-of-the-information-age" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>Kakuteru.com, Shake that Cocktail!</title>
    <content type="html">
      <![CDATA[<p>Hey everyone, it&#8217;s time for a little Kakuteru update. It&#8217;s been a couple of months since I&#8217;ve started building Kakuteru. Since then a lot has happened!</p>
<p><a href="http://www.flickr.com/photos/dominiekterheide/3045782502/"><img src="http://farm4.static.flickr.com/3239/3045782502_4fece23d5b.jpg?v=0" alt="" /></a></p>
<p>Last month, I&#8217;ve relocated back to Amsterdam to pursue one of my long-term goals: &#8216;the startup&#8217;. Together with <a href="http://twitter.com/ptegelaar">Peter Tegelaar</a>, I&#8217;ve rented a nice apartment in the centre of Amsterdam. Here we will work on our stealth project, <a href="http://reccoon.com/">Reccoon</a>. And for the time being, I will remain a Technical Advisor for <a href="http://iknow.co.jp">iKnow!</a> &#8211; the global learning platform (and remain highly involved).</p>
<p>Please note that Kakuteru is not my full-time engagement, however, I think there is a lot of potential for <a href="http://jisho.org/words?jap=%E4%B8%80%E7%9F%B3%E4%BA%8C%E9%B3%A5&amp;eng=&amp;dict=edict">issekinichou</a> &#8211; killing two birds with one stone. On some of my other projects, there are huge overlaps in terms of technical problem solving. I would like to do a write-up about issekinichou sometime soon, as I think it&#8217;s a very important strategic meme that helps deal with the ever increasing complexity of the world.</p>
<p>Okay, let&#8217;s get back to Kakuteru. First of all, I&#8217;m very satisfied with the enormous amount of excitement and buzz Kakuteru has generated in the web-tech crowd. Also,  I&#8217;ve got an overwhelming amount of invite requests and I just send out a batch of 400 invites (through <a href="http://twitter.com/mykakuteru">Twitter</a> and E-mail). But of course, Kakuteru is young and there is still a lot to be done. Let me outline some of the upcoming/desired changes.</p>
<h2>More Aggregation!</h2>
<p>Right now, Kakuteru&#8217;s backend lies solely on <a href="http://friendfeed.com">FriendFeed</a>. You cannot use Kakuteru unless you have a FriendFeed account. I want to change this. It&#8217;s not that I dislike FriendFeed, au contraire, I think their service kicks ass. For Kakuteru I&#8217;m missing something very important though: massive amounts of meta-data.</p>
<p><a href="http://www.flickr.com/photos/82948976@N00/404457553/"><img src="http://farm1.static.flickr.com/152/404457553_ec8ddd10e8_o.jpg" alt="" /></a></p>
<p>Luckily, I have to solve some of these aggregation problems for my personalization-focussed startup Reccoon. For Reccoon we&#8217;ve been toying with several ideas (as a business) and right now we&#8217;re investigating something that requires us to create a massive aggregation framework. I intend to plug Kakuteru into this framework so that more (semantic) data is available around activity objects and streamers.</p>
<p>Also, I&#8217;m looking very forward to the work of the <a href="http://activitystrea.ms/">DiSo project</a> and intend to fully support and adopt standards like the <a href="http://martin.atkins.me.uk/specs/activitystreams/atomactivity">Atom Activity Extensions</a>. There is a lot of cool innovation possible on the activity stream front.</p>
<p><em>Note: To my astonishment I&#8217;ve been blogging about some Activity-platform ideas before: <a href="http://dominiek.com/125-startup-opportunity-the-activity-platform">Startup Opportunity: the Activity Platform</a></em></p>
<h2>More Customization!</h2>
<p>Right now the default Kakuteru theme lacks charisma. So far you&#8217;re able to edit your <span class="caps">CSS</span> and add additional Javascript, also you can add your own domain, but I want to stimulate more radical creativity around lifestreams. This week I&#8217;ve added the ability to control the big layout blocks in Kakuteru, so it should be easy to re-arrange things and add extra content. Soon, I will also add the ability to customize individual activity-updates (e.g. photo, video, tweet).</p>
<p>Now, to add some kick-ass default themes, I have another trick in mind ;] (more about that soon!)</p>
<h2>An Open Venture</h2>
<p>As you might know, Kakuteru&#8217;s source is fully available on <a href="http://github.com/dominiek/kakuteru/tree/master">Github</a>. But I&#8217;d like to go beyond open source and make Kakuteru an Open Venture. I&#8217;m not sure how to accomplish this, but I&#8217;m willing to give ownership away if I think it makes strategic sense. So if you think you&#8217;re up to the challenge and help me make this a kick-ass side-venture, <a href="http://twitter.com/dominiek">contact me</a>!</p>
<p>Improvement suggestions? <a href="http://kakuteru.uservoice.com/">kakuteru.uservoice.com</a></p>]]>
    </content>
    <updated>2009-01-16T20:18:26Z</updated>
    <link href="http://dominiek.com/43233-kakuteru-com-shake-that-cocktail" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>XML to JSONML Client-side Proxy</title>
    <content type="html">
      <![CDATA[<p>When integrating with other web services, there are often shortcomings in third-party API&#8217;s. One of the most common ones I&#8217;ve had to deal with is the lack of JSON+callback support. To circumvent this problem, I wrote a tool that can use an API&#8217;s <span class="caps">XML</span> calls to do the same trick.</p>
<p>JSON+callback allows you to do loose integrations in Javascript, requiring no development on the server-side of things. This is really useful if you for example, quickly want to fetch Lastfm&#8217;s track information and render a player, like on <a href="http://dominiek.com/19478-trentem-ller-miss-you#disqus_thread">this Kakuteru page</a>. Lastfm didn&#8217;t support JSON+callback support in their <span class="caps">API</span> until recently. After a lot of <a href="http://www.last.fm/group/Last.fm+Web+Services/forum/21604/_/427670" title="including me">whining by developers</a>, they finally dadded support.</p>
<p>Still, services like Imeem, don&#8217;t support the <span class="caps">JSON</span> callback yet. So for those service, you can use this tool. Basically, it is a Adobe Flash based converter (written in ActionsScript 3) that converts the <span class="caps">XML</span> to a <a href="http://jsonml.org/"><span class="caps">JSONML</span></a> compatible Javascript Object (<span class="caps">JSON</span>).</p>
<p>All you have to do is put a <a href="http://github.com/dominiek/xml-to-json-proxy/tree/master/xml_json_proxy.swf">swf_to_json.swf</a> and a <a href="http://github.com/dominiek/xml-to-json-proxy/tree/master/xml_json_proxy.js">swf_to_json.js</a> file in your codebase, and use simple Javascript syntax to do remote calls:</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt>8<tt>
</tt>9<tt>
</tt><strong>10</strong><tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">    <span class="ta">&lt;script</span> <span class="an">type</span>=<span class="s"><span class="dl">&quot;</span><span class="k">text/javascript</span><span class="dl">&quot;</span></span> <span class="an">src</span>=<span class="s"><span class="dl">&quot;</span><span class="k">xml_json_proxy.js</span><span class="dl">&quot;</span></span><span class="ta">&gt;</span><span class="ta">&lt;/script&gt;</span><tt>
</tt>    <span class="ta">&lt;script</span> <span class="an">type</span>=<span class="s"><span class="dl">&quot;</span><span class="k">text/javascript</span><span class="dl">&quot;</span></span><span class="ta">&gt;</span><tt>
</tt>      function callback_on_error(code, message) {<tt>
</tt>        alert(code + ': '+ message);<tt>
</tt>      }<tt>
</tt>      function callback_on_success(url,　jsonml) {<tt>
</tt>        alert(jsonml);<tt>
</tt>      }<tt>
</tt>      proxy = new XMLJSONProxy('error_callback');<tt>
</tt>    <span class="ta">&lt;/script&gt;</span><tt>
</tt></pre></td>
</tr></table><p>Performing a <span class="caps">GET</span> call (<span class="caps">POST</span> support is yet to come):</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">    proxy.get('callback_on_success', 'http://url.of.call.xml/');<tt>
</tt></pre></td>
</tr></table><p>Check the <a href="http://github.com/dominiek/xml-to-json-proxy/tree/master"><span class="caps">XML</span> to <span class="caps">JSON</span> Github repository</a> for more documentation, example code and the source code.</p>
<p><em>Note: While developing this my stupid Flash <span class="caps">IDE</span> didn&#8217;t tell me that the crossdomain.xml was set to deny on video.google.com, so make sure that the crossdomain policy on the <span class="caps">API</span> side is set to open.</em></p>]]>
    </content>
    <updated>2009-01-01T21:13:31Z</updated>
    <link href="http://dominiek.com/19592-xml-to-jsonml-client-side-proxy" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>Privacy in an Information Abundant World</title>
    <content type="html">
      <![CDATA[<p>This weekend I&#8217;ve attended an interesting talk by <a href="http://www.plomlompom.de/">Christian Heller</a> titled <a href="http://mrtopf.de/blog/en/25c3-post-privacy-by-christian-heller/">Embracing Post-Privacy</a>. Here at the <a href="http://events.ccc.de/congress/2008/"><span class="caps">CCC</span> Congres in Berlin</a>, the speaker had a tough audience, since most of the visitors can be characterized as paranoid hacker rebels. Hearing about how we should go radically transparent and broadcast our life online infuriated many of them. I used to have the same mindset and I still hear it among many of my friends and colleagues: Google knows everything about you now!</p>
<p><a href="http://www.flickr.com/photos/cs___/140864246/"><img src="http://farm1.static.flickr.com/56/140864246_86dbdfc657.jpg?v=0" alt="" /></a></p>
<p>Christian gave me some nice new insights into the world of post-privacy. For example he talked about <a href="http://en.wikipedia.org/wiki/Equiveillance">Equiveillance</a> &#8211; the surveillance from both the bottom and the top. Which would for example allow you to point your HD camera at the officers who are also pointing their car-cams at you. Naturally, the practitioners of equiveillance experience a lot of frustrations since there are no laws that stimulate bi-directional surveillance (i.e. protecting those that want to record the other). I myself have been frustrated many times when I was not allowed to take pictures or video footage in a certain venue. Fortunately, looking at advancements in recording technology, we will soon have ubiquitous recording by tiny unseeable devices.</p>
<p>Often the‘googling employer&#8217; is used as an example to raise concerns about one&#8217;s publicly exposed life. Christian quite accurately states that if no information is available on googling, suspicion is increased. In my own hiring experiences, I&#8217;m well aware of <a href="http://dominiek.com/133-so-you-want-to-work-for-a-web-startup">the importance of a digital trail</a>. Additionally, small mistakes in the past become obsolete knowledge &#8211; obsoledge &#8211; pretty quickly thanks to the dynamics of information abundance: as (semantic) search technology increases, only the relevant and timely information surfaces. The same goes for identity theft: only the trustworthy information surfaces.</p>
<p>One thing I really missed in the presentation I enjoyed, was a breakdown of what privacy actually is. In my own wording, privacy is &#8216;the containment of information one doesn&#8217;t want to disclose fully&#8217;. When reading this sentence, some alarm bells go off with the words ‘containment of information’. The containment of information is something that goes against the grain of the current society. The nature of information is explained well in the book <a href="http://www.goodreads.com/book/show/4375.Revolutionary_Wealth">Revolutionary Wealth</a> by <a href="http://www.alvintoffler.net/">Alvin Toffler</a>. Basically, contrary to physical objects, information spreads as soon as you touch it. In business this has the effect of industries like the recording and movie industry collapsing because of business models that are dependent on the containment of information. As <a href="http://kk.org/">Kevin Kelly</a> likes to put it in <a href="http://www.changethis.com/53.01.BeyondFree">his essay Beyond Free</a>: the value is no longer in the things that can be copied by the internet&#8217;s copying machine, but rather in things that cannot be copied. Notable examples of new valuables that cannot be copied are &#8216;trust&#8217; and &#8216;relevancy&#8217;.</p>
<p>This is bad news for privacy. The odds are stacked against it, especially when private information is digitized &#8211; which will always be the case in the not so distant future. When thinking about privacy, an important factor is trust. People feel that they have privacy when they trust that certain information is contained within a small distance. Distance meaning the number of people that touch upon it. So if for example I would tell something intimate to my girlfriend, I trust that it doesn&#8217;t leak beyond her. The same is with physical rooms, I trust my house and would be more inclined to share my secrets there.</p>
<p style="float:left;"><a href="http://www.flickr.com/photos/yewenyi/170591928"><img src="http://farm1.static.flickr.com/56/170591928_c5f37dd84b_m.jpg" style="margin-right:1em;" alt="" /></a></p>
<p>So we know trust plays a key role in privacy. Also, it is something that cannot be copied, making it scarce and valuable in today&#8217;s world. In essence, being trustworthy, becomes a real competitive advantage in business &#8211; much more then it used to be. Hopefully, this will spark re-evaluation of current trust relationships between people and organizations. For example, I trust my bank in that I can access my money securely at all times, but I don&#8217;t trust them with my attention data. My bank has a 10 year log of all the transactions I did, what shops, what products, what locations. This data can be used to give me some awesome recommendations, but I&#8217;m not getting any. In fact, I don&#8217;t know what they are doing with this data and it sure as hell is not owned by me. So in a way, my bank doesn&#8217;t have my full trust like many other services I use. I wonder if this will change in the coming years, will people demand data portability and transparency?</p>
<p>Another piece of food-for-thought is relating trust to the attention economy. Many of the speculators on the attention economy have touched upon using attention &#8211; the measurable personalized relevance of information &#8211; as a currency to do transactions. Hence projects like &#8216;The Attention Trust&#8217; etc. Could other information-abundance concepts like trust also be measured and used for transactions?</p>
<p>Please give me some of your thoughts!</p>]]>
    </content>
    <updated>2008-12-29T23:11:08Z</updated>
    <link href="http://dominiek.com/15676-privacy-in-an-information-abundant-world" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>The Grim Future of Adobe Flash</title>
    <content type="html">
      <![CDATA[<p><img src="/assets/2008/11/24/Picture 17.png" style="float: right"></p>
<p>I don&#8217;t understand why people are still so fond of Flash and why there is the illusion that it can become a leading technology in building rich web applications. Let me give you some advice, don&#8217;t bet on the Adobe Flash suite to become widely accepted UI practice.</p>
<p>There is the notion that Flash was a big catalyst in enriching the user experience of today&#8217;s web. That notion is wrong. Yes, Flash has given birth to the Web-video transformation that has helped spawn giants like Youtube. Where previous pre-2000 startups have failed miserably with Java applets and high bandwidth costs &#8211; porn is now flooding the browsers thanks to Flash. Also, Flash has completely driven out Java as a UI-enricher and will continue to do so. Only <a href="http://www.wordle.net/">an idiot</a> would choose to use Java for their web application frontend. With some notable exceptions like sites like <a href="http://screentoaster.com">ScreenToaster.com</a> who use Java to capture the screen display.</p>
<h2>So why won&#8217;t Flash work as a UI solution?</h2>
<h3>1. Re-inventing the UI wheel</h3>
<p>Full flash sites are swimming against the stream of the operating system and browser. Browsers provide proven styles and interactions for countless of widely accepted UI metaphors like scrollbars, input boxes and buttons. Flash is in essence re-inventing the wheel here by duplicating that entire set and wrapping that into their sandbox. Have you ever tried using a full Flash site? Try <a href="http://seesmic.com">Seesmic.com</a>. For example the first thing you&#8217;ll notice is that you can&#8217;t use your scrollwheel to scroll down the page. In my case I cannot stroke my Macbook&#8217;s touchpad with two fingers (you know I want to).</p>
<p><img src="/assets/2008/11/24/Picture 15.png"></p>
<p>I do think that a lot of UI innovation is needed, especially since we&#8217;ve moved to information abundant web. But right now Flash is not providing anything new, they&#8217;re just providing another toolkit.</p>
<h3>2. <span class="caps">SEO</span></h3>
<p>All content is compiled into static non-human or machine readable .swf files. You need a Flash runtime to make real good sense out of the information. <a href="http://www.readwriteweb.com/archives/adobe_ichabod_flash_ajax.php">Ichabod</a> is a project that is supposed to provide a workaround for this problem. In the end of the day Flash was never intended to store content, it was yes, the HyperText Markup Language (<span class="caps">HTML</span>) files.</p>
<p>Unfortunately, loose integration like Javascript widgets like Disqus.com face the same challenges. However, they can be overcome in clever ways. In Disqus&#8217; case that&#8217;s exposing all comments in an aggregation area that can be indexed by the Google Bots.</p>
<h3>3. URL&#8217;s and <span class="caps">REST</span></h3>
<p>One of the first roadblocks for full Flash sites was the fact that the browser navigation controls didn&#8217;t work. When a user had clicked on the a link called &#8216;products&#8217; and wanted to go back, the back button would take him to the previous site instead of the previous path. This was later fixed by putting in a clever little hack. Now every page is marked in the browser history by putting in a <span class="caps">HTTP</span> anchor &#8216;#&#8217; statement. As for example this Seesmic <span class="caps">URL</span>: <a href="http://seesmic.com/#/video/7q7cStbvjk/watch">http://seesmic.com/#/video/7q7cStbvjk/watch</a>. Of course, the anchor tag is intended for &#8216;anchoring&#8217; to a position in page, not requesting the actual resource.</p>
<p>The anchor tag trick also goes against the entire nature of the web: HyperText Transfer Protocol. As defined in <span class="caps">REST</span>, resources on the web can be manipulated by using <span class="caps">GET</span>, <span class="caps">POST</span>, <span class="caps">PUT</span> and <span class="caps">DELETE</span> statements on certain paths. Full flash sites don&#8217;t do any of it.</p>
<h3>4. the Flash Community</h3>
<p>Macromedia&#8217;s Flash was made by a single company, now owned by Adobe. How can a technology like this compete against others that are debated and shaped every day by thousands of developers?</p>
<p>There is some open standards activity, but nothing compared to the W3C. And closed standards like <span class="caps">RTMP</span> are a big miss! Also, nothing is open source. Perhaps the Flex <span class="caps">IDE</span>? Great..</p>
<h3>5. Micro-fication of the Web</h3>
<p>Both the web and the world are getting more fragmented. Loosely connected components and organic structures are rising in favour of monolithic solutions and large organizations. When I was writing a little video conferencing prototype &#8211;  Confabio.com &#8211; I wrote the first version using Adobe Flex. Apart from being a very unproductive framework (e.g. Adobe&#8217;s implementation of <span class="caps">CSS</span>), it was a huge performance hog for my site. I thereafter switched to using Flash solely for video recording and playing which gave tremendous returns in quality. Flash was working together with <span class="caps">HTML</span> and Javascript and was using Comet (which uses Flash as a communication enabler) to get real-time Javascript pushes from the server. That is the future of the web, all these organic technologies working together like the web-services itself! <span class="caps">CSS</span>, <span class="caps">HTML</span>, Javascript, <span class="caps">JSON</span>, Comet, Flash all in the mix!</p>
<h2>So what will be Flash&#8217; future place?</h2>
<p>Flash video is here to stay, although Adobe should really consider opening up their video protocol standards to catalyse innovation. Also, recording of audio and video is something that is solely done by Flash at this point.</p>
<p>Real-time communication is also a big one. The web is switching from it&#8217;s asynchronous roots to a more synchronous organism. This means that new push technologies are needed. Two big ones right now in the frontend side of things are Comet and Long-polling. Long polling is a mechanism in Javascript which holds open a socket on the server for a long time. Comet is a more extreme version where a small Flash application serves as a proxy between browser and server. The proxy application holds open a <span class="caps">TCP</span> socket so that Javascript can be pushed from the server.</p>
<p><img src="/assets/2008/11/24/Picture 16.png"></p>
<p>Flash visualization is definitely here to stay, notable examples include <a href="http://code.google.com/apis/visualization/">Google&#8217;s Visualisation <span class="caps">API</span></a> and <a href="http://google.com/analytics">Google Analytics</a>. But also, more game-like experiences like <a href="http://labs.digg.com/bigspy/?spy">Digg&#8217;s spy tools</a> or <a href="http://www.diametunim.com/muse/">neat Last.fm visualization tools</a> (see illustration above). But don&#8217;t kid yourself, Javascript in combination with <span class="caps">CSS</span> can be pretty powerful for graphics as <span class="caps">CPU</span> power is increasing.</p>
<p>So if you look abstractly at the points just mentioned, it&#8217;s all about providing additional hardware access to the browsers. This is the big thing that is missing in Javascript browser support. <a href="http://phonegap.com/">Some frameworks</a> are already attempting to solve this for Javascript on interesting platforms like the iPhone, but we need much more innovation in this area. Right now Flash is the number one technology when it comes to bringing the browser closer to the hardware and Adobe <span class="caps">AIR</span> is in a position to take this to the next level. But positioning Adobe <span class="caps">AIR</span> as yet another UI toolkit for applications is fundamentally wrong. All Adobe <span class="caps">AIR</span> should be is the extra bit that&#8217;s missing in Flash &#8211; truly connecting the web frontend to the underlying hardware. Perhaps Google Gears can fill that gap if Adobe fails?</p>]]>
    </content>
    <updated>2008-11-24T17:10:36Z</updated>
    <link href="http://dominiek.com/363-the-grim-future-of-adobe-flash" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>Kakuteru, Semantic lifestreaming on Rails. Bye Mephisto!</title>
    <content type="html">
      <![CDATA[<p style="float:left;"><img src="http://farm4.static.flickr.com/3069/2645296790_eb6ba92852_m.jpg" style="margin-right: 1em;" alt="" /></p>
<p>For my blog, I have been using <a href="http://mephistoblog.com/">Mephisto</a> for several years now. It&#8217;s a fine piece of Ruby, but I found it extremely difficult to customize (has everything to do with their Liquid templating engine). For a while now I&#8217;ve been meaning to write my own hackable blogging software. However, Kakuteru has become much more than just blogging software.<br />
<br/><br/></p>
<p>Luckily I started mashing this together <em>after</em> witnessing an awesome presentation by <a href="http://yongfook.com/">Yongfook</a>. He developed <a href="http://sweetcron.com/">Sweetcron</a>, an open source Lifestreamer written in <span class="caps">PHP</span>. Sweetcron beautifully combines online micro activity with editorial blogging content. As you will notice, I ripped off Yongfook&#8217;s design almost completely (hence the attribution in the footer). Although greatly inspired by, Kakuteru is not just the RubyOnRails version of Sweetcron. Kakuteru is focussed on:</p>
<ul>
	<li>integrating Semantic and intelligent services</li>
	<li>improving Machine interoperability</li>
	<li>keeping in mind <span class="caps">SEO</span> by conforming to web standards, pinging blog aggregators and inviting social bookmarking</li>
</ul>
<h2>Basic Features</h2>
<ul>
	<li>Uses <a href="http://friendfeed.com">Friendfeed.com</a> as a core lifestream backend (tweets, video, photo and bookmarks currently supported)</li>
	<li>Uses <a href="http://disqus.com/">Disqus.com</a> to support comments on articles &amp; stream updates</li>
	<li>Articles can be written using Textile, Markdown or <span class="caps">HTML</span></li>
	<li>Published articles will display Tweet-this, <a href="http://digg.com">Digg</a> and <a href="http://addthis.com">Addthis.com</a> if voting is enabled</li>
	<li>&#8220;Me on other sites&#8221; are automatically gathered from Friendfeed</li>
</ul>
<h2>Semantic features</h2>
<ul>
	<li>Autotagging of tweets and articles using <a href="http://zemanta.com">Zemanta.com</a></li>
	<li>Built-in content recommendation engine (simple right now)</li>
	<li>Conforming to many Web Standards, <a href="http://microformats.org">Microformats</a> and <a href="http://microformats.org/wiki/microblogging-nanoformats">Nanoformats</a></li>
	<li>Pinging the Blogosphere through <a href="http://technorati.com/">Technorati</a> and many others</li>
</ul>
<h2>Open Source</h2>
<p>Kakuteru is open source. There are still many things that need to be done, so please contact me if you&#8217;re interested in collaborating. However, the first version is stable and has basic lifestreaming and semantic capabilities. Also, the blogging works since this is the first entry I&#8217;m writing on it :]</p>
<p><a href="http://github.com/dominiek/kakuteru/tree">Kakuteru Github source resitory</a></p>
<h2>Kakuteru.com</h2>
<p>There are many lifestreamers out there, but most of them don&#8217;t provide customization at a tech-savvy level. Also, most of them don&#8217;t reap the benefits of the upcoming semantic web. Kakuteru doesn&#8217;t do that either, but it tries to touch upon the folksemantic borders of the future web. Also, <span class="caps">SEO</span> and self-marketing are important aspects that are focussed on (which is the core value behind Sweetcron).</p>
<p>So yes, I&#8217;ve purchased <a href="http://kakuteru.com/">kakuteru.com</a> and pulled a branch where I can make adjustments to open up this service to anyone. This means that soon more early adopters can start reaping the benefits of Kakuteru!</p>
<center>
<p><img src="/assets/2008/10/7/Picture%204.png" alt="" /></p>
</center>]]>
    </content>
    <updated>2008-10-07T11:20:34Z</updated>
    <link href="http://dominiek.com/180-kakuteru-semantic-lifestreaming-on-rails-bye-mephisto" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>So you want to work for a Web Startup?</title>
    <content type="html">
      <![CDATA[<p><em>Note: this is a little rant I had laying around for a while.</em></p>
<p>Or are you the one doing the hiring of Tech talent for your startup? Here are some hinters on how I imagine some of the startups think. This is just coming from my experience, common sense and some collected thoughts &#8211; so please supply your own experiences in the comments.</p>
<h2>The Long Tail of Candidates</h2>
<p>For a startup it can be a matter of life and death to find the right hire. Think of it as getting a co-founder, it will be a very significant factor in the direction of your young little company. Also not unimportant, software developers vary incredibly in productivity. Some programmer&#8217;s are literally 10 to 100 times more productive than others. With productive I mean producing the actual value, not assembly-line lines of code. Smart developers help the product/service in many ways apart from implementing code.</p>
<p>Even though there is a shortage of tech-workers in many developing countries, there is definitely an infinite supply of smart people. Some of these people already might have some engagements, some might not. In general the former case is a lot more attractive.</p>
<h2>Resume 2.0</h2>
<p>If you supply a resume, make it one without the bullshit. Nobody is waiting to hear your undying loyalty to the company. Dare to make your resume creative and human, or get assimilated in the big blue collective. Also, most of the boring stuff can be found on your LinkedIn profile right?</p>
<p>More importantly, make sure that you always supply a link to an entry-point in your digital life. Your name <span class="caps">WILL</span> be googled and not more than 10 seconds will be spent to find out some sort of online presence. So make sure you line up your digital life. You are engaging people that live and breath (web) technology, if you don&#8217;t have a web presence, you&#8217;re out.</p>
<p>Actually, I&#8217;ve had many times myself that companies took note of me especially because of my blog. A blog serves as a big searchable backlog of results. It can be used to evaluate competence and will also be used to measure overlapping interests and mindsets. If you&#8217;re worried about separating out your personal life and professional life in this area, don&#8217;t bother engaging startups.</p>
<p>In essence, your chances diminish significantly without tangible published results.</p>
<h2>3 Second Rule</h2>
<p>Like when you try to engage a hot chick, the first 3 seconds really matter. The devil is in the details:</p>
<ul>
	<li>@hotmail.com originating applicants go straight to the trashcan for obvious reasons</li>
	<li>Always send a <span class="caps">PDF</span> file. Most startups work with Macs and <span class="caps">PDF</span> is well accepted on all platforms, even the iPhone. Don&#8217;t send a .doc file you moron!</li>
	<li>If you sent a text-only version of your resume, you better have some awesome <span class="caps">ASCII</span>-art in there.</li>
</ul>
<h2>Be yourself, Be a dick!</h2>
<p>&gt;&quot; I am the sikest internets programmer in the galaxy m8! I think you&#8217;se should give me the job now eh!&quot;</p>
<p>It&#8217;s always more likely you will get the correct response if you are yourself.(Even if it is not the one you are expecting) <br />
People like to know who they are dealing with and it is inevitable that they will find you out before too long.<br />
Don&#8217;t be shy! it is better if you show a bit of your personality. That&#8217;s what makes you you, and also what makes you stand out from others.</p>]]>
    </content>
    <updated>2008-09-03T13:30:00Z</updated>
    <link href="http://dominiek.com/133-so-you-want-to-work-for-a-web-startup" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>iPhone-App Development for Web Hackers</title>
    <content type="html">
      <![CDATA[<p style="float:right; margin-left: 0.8em">
<p><a href="http://flickr.com/photos/veroyama/2655405133"><img src="http://farm4.static.flickr.com/3106/2655405133_46f540d693_m.jpg" alt="" /></a></p>
</p>
<p>So here is my situation: I&#8217;ve been doing solely web development over the past two years and am still very busy working for a startup in Tokyo. The iPhone 3g just went out and I want to build a cool prototype that utilizes <em><span class="caps">GPS</span></em>. Over the past week I&#8217;ve spent a couple of hours here and there to make a little proof-of-concept application. I wasted some time running around in panic so hopefully this article will help to get you focussed.</p>
<p>Allright, this is what this prototype should be doing:</p>
<ul>
	<li>Being able to access location information.</li>
	<li>Show a map with a marker for the current location.</li>
	<li>Get relevant information about that current location and show that in an &#8216;info&#8217; tab.<br />
<br/><br/></li>
</ul>
<h2>Safari is so Amazing</h2>
<p>It seems that Safari on the iPhone can accommodate all user interface needs for a non-gaming application. Also, if you really want to do graphics stuff, there is some cool vector rendering <span class="caps">CSS</span> you can do.</p>
<p><a href="http://www.joehewitt.com/blog/">Joe Hewitt</a> wrote a little <a href="http://code.google.com/p/iui/"><span class="caps">CSS</span>/JavaScript pack called <span class="caps">IUI</span></a>. It makes your web applications in Safari look like native iPhone apps. Awesome!</p>
<p>If it was up to me, I would be coding everything in Safari. Server-side Rails, Ajax and accessing iPhone Hardware through Javascript &#8211; the wet dream of any Web Hacker. Unfortunately the latter is not (yet) possible, so we will have to build a <strong>hybrid web application</strong>.</p>
<p>iPhone Safari specific JavaScript capabilities:</p>
<ul>
	<li>Storing data locally through <span class="caps">SQL</span></li>
	<li>Get the physical orientation of the device.<br />
More in <a href="http://developer.apple.com/iphone/index.action">this video</a> (Click on &#8220;iPhone <span class="caps">SDK</span> for Web Developers&#8221;)<br />
<br/><br/></li>
</ul>
<h2>The Magic</h2>
<p>Bottom line is that we don&#8217;t want to waste time and keep on programming web. Since we want to access hardware information, we will have to get down and dirty with the iPhone <span class="caps">SDK</span>. Our goal: <strong>Render a Safari Component and push <span class="caps">GPS</span> information through JavaScript and <span class="caps">AJAX</span> to the web application.</strong></p>
<p><a href="http://flickr.com/photos/cacaobug/2098235071/"><img src="http://dominiek.com/assets/2008/7/19/Picture_13.png" alt="" /></a></p>
<h2>Programming Cocoa</h2>
<p><em>Note: I am very convinced that in order to learn any language, you should just jump in right away &#8211; don&#8217;t build useless example projects.</em></p>
<p>The Cocoa set of tools is called <em>Cocoa Touch</em> and provides all the UI and Data Access things you need. On the iPhone you program in Objective-C 2.0 whatever the fuck that might be :] Aahrgh, so I have been doing Ruby for the past two years and I have a vague memory of C++. Ah well, Objective-C is just another OO programming language, so it shouldn&#8217;t be that big a deal.</p>
<p>This video explains basic Objective-C syntax (forward to 3:00): http://developer.apple.com/iphone/index.action (Click on &#8220;iPhone Application Development &#8211; Getting Started&#8221;). It will explain a bit about Cocoa&#8217;s Model View Controller which might be useful.</p>
<h2>Don&#8217;t waste your time on Hello World</h2>
<p>When downloading HelloWorld and opening that in XCode (apple&#8217;s <span class="caps">IDE</span>) I got freaked out by the amount of code and files. Normally, when learning a new technology, I take examples and re-purpose them for my project. This will not work right away for Cocoa Touch.</p>
<p><em>Note: many coding screencasts use old versions of XCode or Interface Builder. Make sure your <span class="caps">SDK</span> is up to date and that the screencast you&#8217;re watching isn&#8217;t using older versions.</em></p>
<p>The catch is that you need to use a thing called <em>Interface Builder</em> to stitch together your Objective-C code with UI Components. So it&#8217;s better to watch a little screencast. <a href="http://iphonedevcentral.org/tutorials.php?page=ViewTutorial&amp;id=21&amp;uid=69971815">This Screencast</a> will show you how to add a couple of buttons and hook them up to a specific callback. The dude talks very slow so you can fast-forward every now and then.</p>
<p>After that <a href="http://iphonedevcentral.org/tutorials.php?page=ViewTutorial&amp;id=34&amp;uid=59068116">this screencast</a> will show you how to jack in the Magic UIWebView &#8211; our precious Safari. In this screencast they hook up two buttons (back and forward) to the UIWebView.</p>
<h2>Our  first Application</h2>
<p>Assuming you have downloaded the iPhone <span class="caps">SDK</span>. Mac programming is mostly done using an <span class="caps">IDE</span> called &#8216;XCode&#8217;. It can be found in the /Developer directory of your Mac.</p>
<p>Let&#8217;s create a new Project in XCode, I am using the name &#8216;Reccoon&#8217;, but I will refer to it as &#8216;MyProject&#8217;:</p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_6.png" alt="" /></p>
<p>Next, double-click on the Resources/MyProjectViewController.xib. This will open up the Interface Builder. Thereafter, cover the whole window with a safari UIWebView:</p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_3.png" alt="" /></p>
<p>To access that &#8216;web view&#8217; in the controller, we need to add a class attribute to the MyProjectViewController. This is called an &#8216;external outlet&#8217;:</p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_5.png" alt="" /></p>
<p>Also, you need to add some code in your MyProjectViewController.h to utilize it as you can see in the next piece of code.</p>
<h2>Hooking up CoreLocation</h2>
<p>Now let&#8217;s get some code from the <a href="http://developer.apple.com/iphone/library/samplecode/LocateMe/index.html">LocateMe example</a> that can be found in the iPhone Dev center and add MyCLController.* and the CoreLocation Framework:</p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_2.png" alt="" /></p>
<p>Set this code to your MyProjectViewController.h</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="iv">@interface</span> <span class="co">ReccoonViewController</span> : <span class="co">UIViewController</span> &lt;<span class="co">MyCLControllerDelegate</span>&gt; {<tt>
</tt>    <span class="co">IBOutlet</span> <span class="co">UIWebView</span> *webView;<tt>
</tt>}<tt>
</tt></pre></td>
</tr></table><p>The LocateMe example&#8217;s MyCLController has all kinds of funky debug output. We only want the Latitude and Longitude, so let&#8217;s modify a bit.</p>
<p>In MyCLController.h:<br />
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="rx"><span class="dl">/</span><span class="dl">/</span></span> <span class="co">This</span> protocol is used to send the text <span class="r">for</span> location <tt>
</tt><span class="rx"><span class="dl">/</span><span class="dl">/</span></span> updates back to another view controller<tt>
</tt><span class="iv">@protocol</span> <span class="co">MyCLControllerDelegate</span> &lt;<span class="co">NSObject</span>&gt;<tt>
</tt><span class="iv">@required</span><tt>
</tt>-(void)updateLatitude: (<span class="co">NSString</span> *)latitude andLongitude: (<span class="co">NSString</span> *)longitude;<tt>
</tt>-(void)newError:(<span class="co">NSString</span> *)text;<tt>
</tt><span class="iv">@end</span><tt>
</tt></pre><table class="CodeRay"><tr><br />
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt><br />
</tt>2<tt><br />
</tt>3<tt><br />
</tt>4<tt><br />
</tt>5<tt><br />
</tt>6<tt><br />
</tt>7<tt><br />
</tt></pre></td><br />
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="rx"><span class="dl">/</span><span class="dl">/</span></span> <span class="co">This</span> protocol is used to send the text <span class="r">for</span> location <tt><br />
</tt><span class="rx"><span class="dl">/</span><span class="dl">/</span></span> updates back to another view controller<tt><br />
</tt><span class="iv"><code>protocol&lt;/span&gt; &lt;span class="co"&gt;MyCLControllerDelegate&lt;/span&gt; &amp;lt;&lt;span class="co"&gt;NSObject&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class="iv"&gt;</code>required</span><tt><br />
</tt>-(void)updateLatitude: (<span class="co">NSString</span> *)latitude andLongitude: (<span class="co">NSString</span> *)longitude;<tt><br />
</tt>-(void)newError:(<span class="co">NSString</span> *)text;<tt><br />
</tt><span class="iv">@end</span><tt><br />
</tt></pre></td></p>
<p></tr></table><br />
</notextile></p>
<p>In MyCLController.m, replace the method: <em>locationManager didUpdateToLocation fromLocation</em>, with:</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt>8<tt>
</tt>9<tt>
</tt><strong>10</strong><tt>
</tt>11<tt>
</tt>12<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="rx"><span class="dl">/</span><span class="dl">/</span></span> <span class="co">Called</span> <span class="r">when</span> the location is updated<tt>
</tt>- (void)locationManager:(<span class="co">CLLocationManager</span> *)manager<tt>
</tt>        didUpdateToLocation:(<span class="co">CLLocation</span> *)newLocation<tt>
</tt>                   fromLocation:(<span class="co">CLLocation</span> *)oldLocation<tt>
</tt>{<tt>
</tt>  [<span class="pc">self</span>.delegate updateLatitude: <tt>
</tt>    [<span class="co">NSString</span> stringWithFormat:<span class="er">@</span><span class="s"><span class="dl">&quot;</span><span class="k">%lf</span><span class="dl">&quot;</span></span>, <tt>
</tt>                   fabs(newLocation.coordinate.latitude)] <tt>
</tt>                        andLongitude: <tt>
</tt>    [<span class="co">NSString</span> stringWithFormat:<span class="er">@</span><span class="s"><span class="dl">&quot;</span><span class="k">%lf</span><span class="dl">&quot;</span></span>, <tt>
</tt>                   fabs(newLocation.coordinate.longitude)]];<tt>
</tt>}<tt>
</tt></pre></td>
</tr></table><p>Now implement the necessary callbacks. (this code belongs before the @end in the ReccoonViewController.m)</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt>8<tt>
</tt>9<tt>
</tt><strong>10</strong><tt>
</tt>11<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }"><span class="c">#pragma mark ---- delegate methods for the MyCLController class ----</span><tt>
</tt><tt>
</tt>-(void)updateLatitude:(<span class="co">NSString</span> *)latitude andLongitude:(<span class="co">NSString</span> *) longitude {<tt>
</tt>  [webView stringByEvaluatingJavaScriptFromString:<tt>
</tt>    [<span class="co">NSString</span> stringWithFormat:<span class="er">@</span><span class="s"><span class="dl">&quot;</span><span class="k">update_position(%@, %@);</span><span class="dl">&quot;</span></span>, latitude, longitude]];<tt>
</tt>}<tt>
</tt><tt>
</tt>-(void)newError:(<span class="co">NSString</span> *)text {<tt>
</tt>  [<span class="pc">self</span> debug:<tt>
</tt>    [<span class="co">NSString</span> stringWithFormat:<span class="er">@</span><span class="s"><span class="dl">&quot;</span><span class="k">error: %@</span><span class="dl">&quot;</span></span>, text]];<tt>
</tt>}<tt>
</tt></pre></td>
</tr></table><p>As you might see in the updateLatitude function, a Javascript call is executed on the webView Safari browser. This means that you can do all your positioning and maps mashupping in Javascript:</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">function update_position(lat, lng) {<tt>
</tt>  /* We have escaped from Alcatraz! Now it's time for AJAX and JSON goodness :] */<tt>
</tt>}<tt>
</tt></pre></td>
</tr></table><h2>My Reccoon Prototype</h2>
<p>For my own purposes, I&#8217;ve made a little RubyOnRails project (pretty much all <span class="caps">HTML</span>) that uses the <a href="http://code.google.com/apis/maps/">Google Maps <span class="caps">API</span></a> and the <a href="http://geonames.org/">Geonames Wikipedia Reverse-Geocoding Service</a>. This utilizes <a href="http://code.google.com/p/iui/">the <span class="caps">IUI</span> toolkit</a>:</p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_7.png" alt="" /></p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_8.png" alt="" /></p>
<p><img src="http://dominiek.com/assets/2008/7/18/Picture_10.png" alt="" /></p>
<p><em>Note: in these screenshots I am simulating the location to be in Amsterdam (while I am still in Tokyo). The iPhone Simulator&#8217;s default <span class="caps">GPS</span> coordinates are somewhere in the western Chinese badlands.</em></p>
<h2>Conclusion</h2>
<p>Perhaps Cocoa development isn&#8217;t as scary as it seems, after the useful-results feedback loop started (getting into the flow) I was really enjoying it. This little prototype is just an example on how to quickly get some results for a demonstration application. I can imagine that more and more Cocoa programming is necessary when the product/service starts to evolve.</p>
<p>I know this article is a sloppy quick write-up, but if you find it useful please leave a digg :] Also, please place a comment below if you have any problems or questions &#8211; I will address them by updating this entry.</p>]]>
    </content>
    <updated>2008-07-19T07:58:00Z</updated>
    <link href="http://dominiek.com/132-iphone-app-development-for-web-hackers" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>Actual Contact Finder using the Social Graph API</title>
    <content type="html">
      <![CDATA[<p>This week I suddenly realized that one month ago, we implemented <a href="http://gmpg.org/xfn/"><span class="caps">XFN</span></a> on <a href="http://iknow.co.jp/">iknow.co.jp</a> &#8211; the startup I&#8217;m working for. I almost completely forgot about this and I needed some 20%-google-time distraction from my day to day tasks. So I thought about doing a quick search and jacking in a simple friend finder that uses the <a href="http://code.google.com/apis/socialgraph/docs/">Social Graph <span class="caps">API</span></a>. A friend finder meaning: <strong>you input your <span class="caps">SNS</span>-X username and you will get all <span class="caps">SNS</span>-X usernames that are your friends on <span class="caps">SNS</span>-Y, <span class="caps">SNS</span>-Z.</strong></p>
<p><img src="http://dominiek.com/assets/2008/6/5/Picture_8.png" alt="" /></p>
<p>To my amazement I couldn&#8217;t find any straightforward pieces of code actually doing this. All I could find was the usual pretty printed <span class="caps">JSON</span> outputs. So I rolled up my sleeves and did some Javascript hacking myself.</p>
<p><strong><a href="http://dominiek.com/assets/2008/6/5/socialgraph.html">Click here for a Demo</a></strong></p>
<p>I wrote a Javascript class that you can easily use to enable a friend-finder on your own <span class="caps">SNS</span> site. Basically there are two main parameters:</p>
<ul>
	<li>A regular expression determining the profile <span class="caps">URL</span> structure of an <span class="caps">SNS</span></li>
	<li>The profile <span class="caps">URL</span> of the person to recommend friends to, eg: twitter.com/dominiek</li>
</ul>
<p>The code should be fully customizable for your own <span class="caps">SNS</span>, feel free to use it however you want: (don&#8217;t forget to fetch <a href="http://dominiek.com/assets/2008/6/5/socialgraph.js">socialgraph.js</a>)</p>
<table class="CodeRay"><tr>
  <td class="line_numbers" title="click to toggle" onclick="with (this.firstChild.style) { display = (display == '') ? 'none' : '' }"><pre>1<tt>
</tt>2<tt>
</tt>3<tt>
</tt>4<tt>
</tt>5<tt>
</tt>6<tt>
</tt>7<tt>
</tt>8<tt>
</tt>9<tt>
</tt><strong>10</strong><tt>
</tt>11<tt>
</tt>12<tt>
</tt>13<tt>
</tt>14<tt>
</tt>15<tt>
</tt>16<tt>
</tt>17<tt>
</tt>18<tt>
</tt>19<tt>
</tt></pre></td>
  <td class="code"><pre ondblclick="with (this.style) { overflow = (overflow == 'auto' || overflow == '') ? 'visible' : 'auto' }">// callback:<tt>
</tt>function contact_found(username, is_new, on_site_name, on_profile_url) {<tt>
</tt>  // a user on this site was found and is a friend on_profile_url<tt>
</tt>  // this is also where the is_friend_already? check goes<tt>
</tt>}<tt>
</tt><tt>
</tt>// callback:<tt>
</tt>function contact_search_status(percentage) {<tt>
</tt>  // progress report, might take a while to query everything<tt>
</tt>}<tt>
</tt><tt>
</tt>// setup regexp for this SNS<tt>
</tt>var site_regexp = new RegExp(/http:\/\/www\.iknow\.co\.jp\/user\/([^\/]+)/);<tt>
</tt><tt>
</tt>// setup library and pass in callbacks (contact_search_status is optional)<tt>
</tt>var social_graph = new SocialGraph(site_regexp, contact_found, contact_search_status); <tt>
</tt><tt>
</tt>// recommend for user dominiek<tt>
</tt>social_graph.contacts_for('http://www.iknow.co.jp/user/dominiek'); <tt>
</tt></pre></td>
</tr></table><p>When doing a search, about 8 to 40 calls are done to the SocialGraph <span class="caps">API</span> to walk through all the data. That&#8217;s one of the reasons why I really love <span class="caps">JSON</span> &#8211; all of this stuff is done on the client side.</p>
<p>Please note that any profile <span class="caps">URL</span> used in gathering friends data has to be referred to or must refer some other <span class="caps">XFN</span> relationships. The more &#8216;me&#8217; and &#8216;contact&#8217; links, the better the results will be. <a href="http://iknow.co.jp/user/dominiek">iknow.co.jp</a> is actually a very good example of this.</p>
<p><i>Note: a fellow developer (Zev Blut) pointed out to me that instead of fooling around with too many regular expressions it&#8217;s good to look into <a href="http://code.google.com/apis/socialgraph/docs/canonical.html">Node Canonicalization</a></i></p>]]>
    </content>
    <updated>2008-06-05T13:14:00Z</updated>
    <link href="http://dominiek.com/131-actual-contact-finder-using-the-social-graph-api" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
  <entry>
    <id>tag:dominiek.com,2009-07-02:Kakuteru</id>
    <title>Open API: Architectural Choices and Considerations</title>
    <content type="html">
      <![CDATA[<p>Recently I&#8217;ve been working a lot on thinking out and building up the upcoming Data Services for <a href="http://iknow.co.jp/">iknow.co.jp</a>. I&#8217;ve composed a quick slideshow of all the architectural choices and considerations I&#8217;ve come across.</p>
<p>Building API&#8217;s for a web 2.0 / web 3.0 aspiring service is very different than providing a tight integrated <span class="caps">RPC</span> service for some corporate client. It requires completely different ways of thinking and embracing new standards.</p>
<center>
<div style="width:425px;text-align:left" id="__ss_434232"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=odsarchitecturalchoicesconsiderations-1212054809123535-8"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=odsarchitecturalchoicesconsiderations-1212054809123535-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/dominiekth/open-api-architectural-choices-considerations?src=embed" title="View Open API Architectural Choices Considerations on SlideShare">View</a> | <a href="http://www.slideshare.net/upload?src=embed">Upload your own</a></div></div>
</center>]]>
    </content>
    <updated>2008-05-29T09:49:00Z</updated>
    <link href="http://dominiek.com/130-open-api-architectural-choices-and-considerations" type="text/html" rel="alternate" />
    <author>
      <name>Dominiek ter Heide</name>
    </author>
  </entry>
</feed>
