<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
  
    <language>en-us</language>
    
      <title>Updates Feed from niw.at</title>
      <link>http://niw.at/</link>
      <description>Updates of works, articles and blogs from niw.at by Yoshimasa Niwa</description>
    
    
      
        <pubDate>Sun, 05 Dec 2010 00:00:00 GMT</pubDate>
        <lastBuildDate>Sun, 05 Dec 2010 00:00:00 GMT</lastBuildDate>
      
    

    
      
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.niw.at/niwat_en" /><feedburner:info uri="niwat_en" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
          <title>Growl Plugin for Reeder for Mac</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0343/growl_for_reeder.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0343/growl_for_reeder_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A few days ago, the amazing &lt;a href="http://google.com/reader"&gt;Google Reader&lt;/a&gt; client, &lt;a href="http://reederapp.com/"&gt;Reeder&lt;/a&gt; is coming to Mac!
Originally, Reeder is working on iPhone and iPod, which is the one of the best iPhone, iPad applications.&lt;/p&gt;

&lt;p&gt;Currently Reeder for Mac is released as beta version and I love this but something I need is still missing. Yes, I wanted to have &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; desktop notifications like &lt;a href="http://niw.at/articles/2009/04/26/temporary-growl-plugin-for-tweetie-for-mac/"&gt;what I did for Tweetie&lt;/a&gt; last year!&lt;/p&gt;

&lt;p&gt;I made a plugin for Reeder to enable Growl desktop notifications then it works good so far. When we&amp;#8217;ve got unread articles on Reeder for Mac, it will notify us. Don&amp;#8217;t miss the hot news! Of course in future, Reeder for Mac itself may support desktop notification though.&lt;/p&gt;&lt;h2&gt;Download and Install&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0353/GrowlReeder-0.1.6.zip"&gt;GrowlReeder-0.1.6.zip (114Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;Installing &lt;a href="http://reederapp.com"&gt;Reeder for Mac&lt;/a&gt;. You may found the current Reeder for Mac from &lt;a href="http://twitter.com/reederapp"&gt;their tweets&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you didn&amp;#8217;t install SIMBL yet, install &lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt; prior to use this plugin.&lt;/li&gt;
&lt;li&gt;Download GrowlReeder plugin from this page, then unpack the package.&lt;/li&gt;
&lt;li&gt;Quit Reeder for Mac if running. Create a folder located at &lt;code&gt;(Your Home)/Library/Application Support/SIMBL/Plugins&lt;/code&gt;, then copy &lt;code&gt;GrowlReeder.bundle&lt;/code&gt; into it.&lt;/li&gt;
&lt;li&gt;Run Reeder for Mac with Growl desktop notifications :)&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;One thing&amp;#8230;&lt;/h2&gt;

&lt;p&gt;&lt;del&gt;If you have many unread articles on your Google reader account, this plugin send tons of Growl notifications when you&amp;#8217;re running Reeder for Mac at first time.
In that case, run Reeder for Mac first then load all unread articles then install this plugin.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Addressed this issue on version 0.1.1.&lt;/p&gt;

&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.1.6&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support latest Reeder for Mac Version 1.1.4&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.5&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support latest Reeder for Mac Version 1.1.3&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0352/GrowlReeder-0.1.5.zip"&gt;GrowlReeder-0.1.5.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.4&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support latest Reeder for Mac Version 1.1.2&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0351/GrowlReeder-0.1.4.zip"&gt;GrowlReeder-0.1.4.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.3&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support latest Reeder for Mac Version 1.1.1&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0350/GrowlReeder-0.1.3.zip"&gt;GrowlReeder-0.1.3.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support Reeder for Mac Version 1.0 Draft 14&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0349/GrowlReeder-0.1.2.zip"&gt;GrowlReeder-0.1.2.zip (114Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limit the max number of notifications at once.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0348/GrowlReeder-0.1.1.zip"&gt;GrowlReeder-0.1.1.zip (117Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0347/GrowlReeder-0.1.0.zip"&gt;GrowlReeder-0.1.0.zip (115Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Source Code&lt;/h2&gt;

&lt;p&gt;You can get the source code from my &lt;a href="http://github.com/niw/growl_reeder"&gt;github repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;GrowlReeder is under &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/TREbdyESkGI" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 05 Dec 2010 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/TREbdyESkGI/</link>
        <feedburner:origLink>http://niw.at/articles/2010/12/05/growl-plugin-for-reeder-for-mac/</feedburner:origLink></item>
      
        <item>
          <title>Call Native API from Google Chrome Extension on Mac OS X</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0339/open_with_default.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0339/open_with_default_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;While the last WWDC, Apple released new &lt;a href="http://www.apple.com/safari/whats-new.html"&gt;extension feature for their Safari web browser&lt;/a&gt;. The competitor Google already released Google Chrome and it also has &lt;a href="https://chrome.google.com/extensions/"&gt;the extension feature&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Actually I&amp;#8217;m using Safari as a default web browser but sometimes I&amp;#8217;m using Google Chrome. In this use case, I need to send some URL to the Safari &amp;#8211; a default application which is defined in the preferences to open URL on Mac OS X.
I googled extensions then found there are no good extension to do that. If we don&amp;#8217;t have it, we just create it!&lt;/p&gt;

&lt;p&gt;To do this, we need to launch application from Google Chrome but it requires to call native code which Mac OS X provides. Fortunately, Google Chrome extension has &lt;a href="http://code.google.com/chrome/extensions/npapi.html"&gt;a way to run native code&lt;/a&gt; inside extension, making a NPAPI plugin like FlashPlayer then including it to background HTML of the extension.
This article describe how to build an extension using NPAPI plugin to call native code inside it.&lt;/p&gt;

&lt;h2&gt;Getting Started&lt;/h2&gt;

&lt;p&gt;I push all source codes to &lt;a href="http://github.com/niw/open_with_default"&gt;my github repository&lt;/a&gt; so that you can download, tweak and make good things.
It includes XCode project, some configurations and plugin source code, extension JavaScript and HTML code.
If you already have git command, just clone whole repository from github.
If not, just take it as Zip or Tar from Download Source button on github and inflate it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% git clone git://github.com/niw/open_with_default
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Prepare to Use Experimental APIs&lt;/h2&gt;

&lt;div class="alert"&gt;
UPDATE 7/28/2010: This section is obsolete. The APIs to add items are out from experimental APIs, we can use it without any options. Just download Google Chrome from &lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;DevChannel&lt;/a&gt; then run it!
&lt;/div&gt;


&lt;p&gt;This extension adds an item into the the context menus of the links. We need to use &lt;a href="http://code.google.com/chrome/extensions/trunk/experimental.html"&gt;experimental APIs&lt;/a&gt; which is not enabled in the current released Google Chrome.
You need to update your Google Chrome from their &lt;a href="http://www.chromium.org/getting-involved/dev-channel"&gt;DevChannel&lt;/a&gt;.
Then when launching it, we need to use &lt;code&gt;--enable-experimental-extension-apis&lt;/code&gt; option. You can add it from Terminal.app like&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% open /Applications/Google\ Chrome.app --args --enable-experimental-extension-apis
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Build It then Test It!&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;OpenWithDefault.xcodeproj&lt;/code&gt; then select Build from the menu to build the extension. The unpacked extension are placed in &lt;code&gt;Extension&lt;/code&gt; folder.
As previous section, run Google Chrome downloaded from DevChannel then open &amp;#8220;Extension&amp;#8221; page.
Enable &amp;#8220;Developer mode&amp;#8221; then click &amp;#8220;Load unpacked extension&amp;#8221;, select &lt;code&gt;Extension&lt;/code&gt; folder to load it in Google Chrome.&lt;/p&gt;

&lt;p&gt;You will see the &amp;#8220;Open with Default&amp;#8221; item in the context menu of the links, then select it to send URL to the default application, like Safari.&lt;/p&gt;

&lt;h2&gt;Load NPAPI Plugins to Extension&lt;/h2&gt;

&lt;p&gt;To make a basic Google Chrome extension, please read &lt;a href="http://code.google.com/chrome/extensions/trunk/getstarted.html"&gt;this article&lt;/a&gt;.
NPAPI Plugins are like Flash Player, we load it to &lt;code&gt;background.html&lt;/code&gt; using &lt;code&gt;&amp;lt;embed&amp;gt;&lt;/code&gt;. &lt;code&gt;type&lt;/code&gt; is defined when creating the NPAPI plugin.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;body onload="init()"&amp;gt;
&amp;lt;embed type="application/x-open-with-default" id="pluginId"&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then, call method defined in the plugin using &lt;code&gt;id&lt;/code&gt; from JavaScript.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var plugin = document.getElementById("pluginId");
plugin.open("http://twitter.com/");
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This &lt;code&gt;open&lt;/code&gt; is the method provided from the NPAPI plugin we&amp;#8217;re creating.&lt;/p&gt;

&lt;h2&gt;Create NPAPI Plugin&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/NPAPI"&gt;NPAPI&lt;/a&gt;(Netscape Plugin Application Programming Interface) is a C API set to create plugins for web browsers. And the plugin can provide some methods to JavaScript world via NPAPI so that we can call native API inside the extension.&lt;/p&gt;

&lt;p&gt;On Mac OS X, we need to create a Bundle which end with &lt;code&gt;.plugin&lt;/code&gt; with special &lt;code&gt;Info.plist&lt;/code&gt;. This is an important part of the sample &lt;code&gt;Info.plist&lt;/code&gt; in this extension.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;key&amp;gt;WebPluginMIMETypes&amp;lt;/key&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;application/x-open-with-default&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;WebPluginTypeDescription&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;A Plugin for Chrome Extension&amp;lt;/string&amp;gt;
    &amp;lt;/dict&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;key&amp;gt;WebPluginName&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;${PRODUCT_NAME}&amp;lt;/string&amp;gt;
&amp;lt;key&amp;gt;WebPluginDescription&amp;lt;/key&amp;gt;
&amp;lt;string&amp;gt;A Plugin for Chrome Extension&amp;lt;/string&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We need to use same MIME type as used in &lt;code&gt;type&lt;/code&gt; attribute of &lt;code&gt;embed&lt;/code&gt; tag, in this case &lt;code&gt;application/x-open-with-default&lt;/code&gt;.
And then defined some required functions to initialize and register the plugin via NPAPI.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;NPError NP_Initialize(NPNetscapeFuncs* browserFuncs) {  
    npnfuncs = browserFuncs;
    return NPERR_NO_ERROR;
}

NPError NP_GetEntryPoints(NPPluginFuncs* pluginFuncs) {
    // Register entry points to initialize this plugin.
    pluginFuncs-&amp;gt;version = (NP_VERSION_MAJOR &amp;lt;&amp;lt; 8) | NP_VERSION_MINOR;
    pluginFuncs-&amp;gt;size = sizeof(pluginFuncs);
    pluginFuncs-&amp;gt;newp = NPP_New;
    pluginFuncs-&amp;gt;destroy = NPP_Destroy;
    pluginFuncs-&amp;gt;getvalue = NPP_GetValue;
    return NPERR_NO_ERROR;
}

void NP_Shutdown(void) {
    // No operations here, but this method is required.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We need define all these three functions, even we do nothing in &lt;code&gt;NP_Shutdown&lt;/code&gt;. In &lt;code&gt;NP_GetEntryPoints&lt;/code&gt;, we need to register at least these 3 functions, &lt;code&gt;newp&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt; and &lt;code&gt;getvalue&lt;/code&gt;.
&lt;code&gt;newp&lt;/code&gt; and &lt;code&gt;destroy&lt;/code&gt; will be called when this plugin is loaded, unloaded on the page. &lt;code&gt;getvalue&lt;/code&gt; will be called when user call this plugin from JavaScript.&lt;/p&gt;

&lt;h2&gt;Create Plugin Class for JavaScript&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;getvalue&lt;/code&gt; function, in this case &lt;code&gt;NPP_GetValue&lt;/code&gt;, we get an instance of the plugin class which user can use from JavaScript like the code described above section.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// If we didn't create any plugin instance, we create it.
if(!plugin_instance) {
    plugin_instance = npnfuncs-&amp;gt;createobject(instance, &amp;amp;plugin_class);
    npnfuncs-&amp;gt;retainobject(plugin_instance);
}
*(NPObject **)value = plugin_instance;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This &lt;code&gt;plugin_class&lt;/code&gt; is a definition of the object which is shown in the JavaScript, and we need to increment the reference count of the plugin instance. in the &lt;code&gt;destroy&lt;/code&gt;, in this case &lt;code&gt;NPP_Destroy&lt;/code&gt;, we decrease it so that NPAPI release the memory for this object when the plugin is unloaded.&lt;/p&gt;

&lt;p&gt;When user call some methods to this object like &lt;code&gt;open&lt;/code&gt;, in this case &lt;code&gt;plugin_invoke&lt;/code&gt; which is defined in &lt;code&gt;plugin_class&lt;/code&gt; will be called with name of the method, arguments. in this function, we can do anything what we want to do in the native world, of course calling native API like opening the URL with default application.&lt;/p&gt;

&lt;p&gt;The method name is passed as &lt;code&gt;NPIdentifier&lt;/code&gt;, and arguments are passed as array of &lt;code&gt;NPVariant&lt;/code&gt;.
We can convert these variables into normal UTF-8 strings etc.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Convert from NPIdentifier to UTF-8 string
NPUTF8 *name = npnfuncs-&amp;gt;utf8fromidentifier(methodName);

// Convert NPVariant to UTF-8 string
if(NPVARIANT_IS_STRING(args[0])) {
    NPString str = NPVARIANT_TO_STRING(args[0]);
    // do something with str.UTF8Characters and str.UTF8Length
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Making Extension using Native API&lt;/h2&gt;

&lt;p&gt;Actually making extensions using NPAPI plugins is not easy but powerful. We can extend Google Chrome like adding some native feature like lookup Dictionary.app etc.
Hopefully, this extension must be the good example and helps you to create another good extensions. Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/FKkNUen9D2k" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 18 Jun 2010 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/FKkNUen9D2k/</link>
        <feedburner:origLink>http://niw.at/articles/2010/06/18/call-native-api-from-google-chrome-extension-on-mac-os-x/</feedburner:origLink></item>
      
        <item>
          <title>Using OpenCV on iPhone</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3472/3351972997_d2803aedcf_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3472/3351972997_de85ffbc9c_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3574/3352798974_12dec156fb_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3574/3352798974_c976586f6d_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;OpenCV is a library of computer vision developed by Intel, we can easily detect faces using this library for example.
I&amp;#8217;d note how to use it with iOS SDK, including the building scripts and a demo application.
Here I attached screen shots from the demo applications.&lt;/p&gt;

&lt;h2&gt;Support Latest OpenCV and iOS SDK&lt;/h2&gt;

&lt;p&gt;Updated the project, support OpenCV 2.2.0, iOS SDK 4.3, Xcode 4 (Updated 04/17/2011.)&lt;/p&gt;

&lt;h2&gt;Getting Started&lt;/h2&gt;

&lt;p&gt;All source codes and resources are opened and you can get them from &lt;a href="http://github.com/niw/iphone_opencv_test"&gt;my github repository&lt;/a&gt;.
It includes pre-compiled OpenCV libraries and headers so that you can easily start to test it.
If you already have git command, just clone whole repository from github.
If not, just take it by zip or tar from download link on github and inflate it.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% git clone git://github.com/niw/iphone_opencv_test.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After getting source codes, open OpenCVTest.xcodeproj with Xcode, then build it.
You will get a demo application on both iPhone Simulator and iPhone device.&lt;/p&gt;&lt;h2&gt;Building OpenCV library from source code&lt;/h2&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm4.static.flickr.com/3582/3351973079_749d5126cf_o.png"&gt;&lt;img src="http://farm4.static.flickr.com/3582/3351973079_be4530ac26_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;You can also make OpenCV library from source code using cross environment compile with gcc.
I added some support script so that you can easy to do so.
The important point is that iOS SDK doesn&amp;#8217;t support dynamic link like &amp;#8220;.framework&amp;#8221;.
We have to make it as static link library and link it to your application statically.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Building OpenCV requiers &lt;a href="http://www.cmake.org/"&gt;CMake&lt;/a&gt;. You can easily install it by using &lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt; or &lt;a href="http://www.macports.org/"&gt;MacPorts&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# Using Homebrew
% brew install cmake
# Using MacPorts
% sudo port install cmake -gui
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you&amp;#8217;ve already installed recent Java update, you may be asked to install &lt;code&gt;javadeveloper_10.6_10m3261.dmg&lt;/code&gt;.
This is weird but cmake needs jni.h which is removed from recent Java update, you can download it from &lt;a href="https://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?bundleID=20719"&gt;here for Mac OS X 10.6&lt;/a&gt; which may require you to subscribe Apple Developer Connection.
Yes, Apple is now &lt;a href="http://www.macrumors.com/2010/10/21/apple-discontinuing-java-installation-packages-for-mac-os-x/"&gt;going to deprecate Java on MacOS X&lt;/a&gt; (Updated 10/30/2010).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting source code from sourceforge. I tested with &lt;a href="http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.2/OpenCV-2.2.0.tar.bz2/download"&gt;OpenCV-2.2.0.tar.bz2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extract downloaded archive on the top of demo project directory&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% tar xjvf OpenCV-2.2.0.tar.bz2
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apply patch for iOS SDK&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd OpenCV-2.2.0
% patch -p1 &amp;lt; ../OpenCV-2.2.0.patch
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Following next steps to build OpenCV static library for simulator.
All files are installed into &lt;code&gt;opencv_simulator&lt;/code&gt; directory.
When running &lt;code&gt;make&lt;/code&gt; command, you&amp;#8217;ve better assign &lt;code&gt;-j&lt;/code&gt; option and number according to number of your CPU cores.
Without &lt;code&gt;-j&lt;/code&gt; option, it takes a long time.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd .. # Back to the top of demo project directory.
% mkdir build_simulator
% cd build_simulator
% ../opencv_cmake.sh Simulator ../OpenCV-2.2.0
% make -j 4
% make install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Following next steps to build OpenCV static library for device
All files are installed into &lt;code&gt;opencv_device&lt;/code&gt; directory.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;% cd .. # Back to the top of demo project directory.
% mkdir build_device
% cd build_device
% ../opencv_cmake.sh Device ../OpenCV-2.2.0
% make -j 4
% make install
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Build support script&lt;/h2&gt;

&lt;p&gt;Build support script &lt;code&gt;opencv_cmake.sh&lt;/code&gt; has some options to build OpenCV with iOS SDK.
Try &lt;code&gt;--help&lt;/code&gt; option to get the all options of it.&lt;/p&gt;

&lt;h2&gt;Converting images between UIImage and IplImage&lt;/h2&gt;

&lt;p&gt;OpenCV is using IplImage structure for processing, and iOS SDK using UIImage object to display it on the screen.
This means, we need a converter between UIImage and IplImage. Thankfully, we can do with iOS SDK APIs.&lt;/p&gt;

&lt;p&gt;Creating IplImage from UIImage is like this.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// NOTE you SHOULD cvReleaseImage() for the return value when end of the code.
- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
  // Getting CGImage from UIImage
  CGImageRef imageRef = image.CGImage;

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // Creating temporal IplImage for drawing
  IplImage *iplimage = cvCreateImage(
    cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
  );
  // Creating CGContext for temporal IplImage
  CGContextRef contextRef = CGBitmapContextCreate(
    iplimage-&amp;gt;imageData, iplimage-&amp;gt;width, iplimage-&amp;gt;height,
    iplimage-&amp;gt;depth, iplimage-&amp;gt;widthStep,
    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
  );
  // Drawing CGImage to CGContext
  CGContextDrawImage(
    contextRef,
    CGRectMake(0, 0, image.size.width, image.size.height),
    imageRef
  );
  CGContextRelease(contextRef);
  CGColorSpaceRelease(colorSpace);

  // Creating result IplImage
  IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
  cvCvtColor(iplimage, ret, CV_RGBA2BGR);
  cvReleaseImage(&amp;amp;iplimage);

  return ret;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Don&amp;#8217;t forget release IplImage after using it by cvReleaseImage!&lt;/p&gt;

&lt;p&gt;And creating UIImage from IplImage is like this.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// NOTE You should convert color mode as RGB before passing to this function
- (UIImage *)UIImageFromIplImage:(IplImage *)image {
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // Allocating the buffer for CGImage
  NSData *data =
    [NSData dataWithBytes:image-&amp;gt;imageData length:image-&amp;gt;imageSize];
  CGDataProviderRef provider =
    CGDataProviderCreateWithCFData((CFDataRef)data);
  // Creating CGImage from chunk of IplImage
  CGImageRef imageRef = CGImageCreate(
    image-&amp;gt;width, image-&amp;gt;height,
    image-&amp;gt;depth, image-&amp;gt;depth * image-&amp;gt;nChannels, image-&amp;gt;widthStep,
    colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
    provider, NULL, false, kCGRenderingIntentDefault
  );
  // Getting UIImage from CGImage
  UIImage *ret = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
  CGDataProviderRelease(provider);
  CGColorSpaceRelease(colorSpace);
  return ret;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ok, now you can enjoy with OpenCV with iPhone!&lt;/p&gt;

&lt;h2&gt;Using OpenCV library in your own project&lt;/h2&gt;

&lt;p&gt;The demo application which you can download from my repository is well configured to use these libraries.
If you wanted to use OpenCV libraries on your own project, you should need to adding next configurations on it.
You can see these settings on the Xcode project of this demo application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;libopencv_core.a&lt;/code&gt; etc, from OpenCV lib directory for either simulators or devices.
Actually Xcode doesn&amp;#8217;t care which one is for devices or simulators at this point because it is selected by the library search path.&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;Accelerate.framework&lt;/code&gt; which is used internally from OpenCV library.&lt;/li&gt;
&lt;li&gt;Select your active build target, then open the build tab in the info panel by Get Info menu.

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;-lstdc++&lt;/code&gt; and &lt;code&gt;-lz&lt;/code&gt; to Other Linker Flags&lt;/li&gt;
&lt;li&gt;Add path to OpenCV &lt;code&gt;include&lt;/code&gt; directory to Header Search Paths for both simulators and devices.&lt;/li&gt;
&lt;li&gt;Add path to OpenCV &lt;code&gt;lib&lt;/code&gt; directory to Library Search Paths for both simulators and devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;04/17/2011 - Support OpenCV 2.2.0 + iOS SDK 4.3 + Xcode 4, Thank you for all your comments!&lt;/li&gt;
&lt;li&gt;10/30/2010 - Updates for recent changes on the repository and the development environment, Thank you for your comments!&lt;/li&gt;
&lt;li&gt;08/22/2010 - Support OpenCV 2.1.0 + iOS SDK 4.0&lt;/li&gt;
&lt;li&gt;12/21/2009 - Support Snow Leopard + iPhone SDK 3.1.2, Thank you Hyon!&lt;/li&gt;
&lt;li&gt;11/15/2009 - Support OpenCV 2.0.0 + iPhone SDK 3.x&lt;/li&gt;
&lt;li&gt;03/14/2009 - Release this project with OpenCV 1.0.0 + iPhone SDK 2.x&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Donation&lt;/h2&gt;

&lt;p&gt;If you would like to help this project, please feel free to donate via &lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt; using the followin form. Thank you for your donation!&lt;/p&gt;

&lt;p&gt;&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="KL9EHATHFQYW2" /&gt;
&lt;input type="hidden" name="item_name" value="iPhone OpenCV Test Donation" /&gt;
&lt;input type="hidden" name="item_number" value="IPHONE_OPENCV_TEST-DONATION" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="USD" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="US" /&gt;
Amount in USD &lt;input type="text" name="amount" value="10.00" size="6" /&gt;
&lt;input type="submit" name="submit" value="Donate" /&gt;
&lt;/form&gt;&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://github.com/niw/iphone_opencv_test"&gt;This sample&lt;/a&gt; is under &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/xgpm8fSvHh4" height="1" width="1"/&gt;</description>
          <pubDate>Sat, 14 Mar 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/xgpm8fSvHh4/</link>
        <feedburner:origLink>http://niw.at/articles/2009/03/14/using-opencv-on-iphone/</feedburner:origLink></item>
      
        <item>
          <title>Express Yoyaku on iPhone</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0249/expy_login.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0249/expy_login_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I sometimes use Sinkansen ticketing service named &lt;a href="http://expy.jp/"&gt;Express Yoyaku&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I think there are many guys who use this service frequently for their business or travel.
We can use this ticketing service from iPhone&amp;#8217;s Safari, but it seems crappy and the screen will be cropped suddenly.&lt;/p&gt;

&lt;p&gt;So, I made a bookmarklet which allows you to use it more comfortable.
This bookmarklet includes next features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works as a bookmark to the login screen&lt;/li&gt;
&lt;li&gt;Auto filling user id and password&lt;/li&gt;
&lt;li&gt;Patching the crappy screen items like bottom bar etc.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;App for iPhone is available from App Store&lt;/h2&gt;

&lt;div style="float: right; margin-left: 10px;"&gt;
&lt;a href="http://dotswitch.net/services/rapidy/"&gt;&lt;img src="http://niw.at/page_attachments/0000/0323/Icon_120_icon.png" size="icon" /&gt;&lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;A special iPhone app for Express Yoyaku, &lt;a href="http://dotswitch.net/services/rapidy/"&gt;Rapidy&lt;/a&gt; is now available from App Store! I keep this entry and bookmarklet here though. Enjoy!&lt;/p&gt;

&lt;h2&gt;Update bookmarklet to support current Express Yoyaku site (Updates March 24, 2011)&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve changed this bookmarklet you can create on this page to support current Express Yoyaku site which has been updated around mid March.
If you already have created this bookmarklet, please remove it then make it here again.&lt;/p&gt;&lt;h2&gt;Making and adding the bookmarklet for Express Yoyaku&lt;/h2&gt;

&lt;p&gt;You can make and add this bookmarklet on the next panel.&lt;/p&gt;

&lt;script type="text/javascript"&gt;
var expy = {
  bookmarklet: function(userid, password, type, autologin) {
    return 'javascript:(function(){'
    + 'var USERID="' + userid + '",PASSWORD="' + password + '",TYPE=' + type + ',AUTOLOGIN=' + (autologin ? 'true' : 'false') + ';'
    + 'var w=window,d=document,h=d.location.href,u=undefined;'
    + 'if(h.match(/expy\\.jp\\/member\\/login/)){'
    +   'var f=d.forms[TYPE+2],i=f.getElementsByTagName("input");'
    +   'i[0].value=USERID;'
    +   'i[1].value=PASSWORD;'
    +   'if(PASSWORD&amp;&amp;AUTOLOGIN){f.submit()};'
    + '}else if(h.match(/shinkansen1\\.jr-central\\.co\\.jp\\/RSV_P/)){'
    +   'if(!w.expyfix)'
    +     'w.expyfix=setInterval(function(){var f=w.frames[0];'
    +       'if(f){'
    +         'f.onresize=u;'
    +         'var ff=f.frames[0];'
    +         'if(ff){'
    +           'ff.onresize=u;'
    +           'var a=ff.document.getElementsByClassName("padding");'
    +           'for(var i=0;i&lt;a.length;i++)a[i].setAttribute("style","position:static;");'
    +           'var s=[["bottom","top:0;left:0"],'
    +             '["content","width:auto;height:auto"],'
    +             '["side","height:auto"],'
    +             '["guide","width:auto"],'
    +             '["top","display:none"]];'
    +           'for(var i in s){'
    +             'var e = ff.document.getElementById(s[i][0]);'
    +             'if(e)e.setAttribute("style", s[i][1]);'
    +           '}'
    +         '}'
    +       '}'
    +     '},200)'
    + '}else d.location="http://expy.jp/member/login";'
    + '})()';
  },
  updateLinks: function(form, instruction, iphone_link_id, pc_link_id) {
    var userid = $(form["userid"]).getValue();
    var password = $(form["password"]).getValue();
    var type = $(form["type"]).getValue();
    var autologin = $(form["autologin"]).getValue();

    var bookmarklet = expy.bookmarklet(userid, password, type, autologin);
    $(iphone_link_id).setAttribute('href', 'about:?' + bookmarklet);
    $(pc_link_id).setAttribute('href', bookmarklet);

    $(form).hide();
    $(instruction).show();
  }
};
&lt;/script&gt;




&lt;div style="padding: 10px; background: #eee;"&gt;
  &lt;form id="expy_form" onsubmit="expy.updateLinks(this, 'expy_instruction', 'expy_iphone_link', 'expy_pc_link'); return false;"&gt;
    &lt;h3&gt;Step 1. Creating the bookmarklet&lt;/h3&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;td&gt;Type of your credit card&lt;/td&gt;&lt;td&gt;&lt;select name="type"&gt;
        &lt;option value="1" selected&gt;Express Card&lt;/option&gt;
        &lt;option value="2"&gt;J-WEST Card&lt;/option&gt;
      &lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;User ID&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="userid" /&gt; (optional)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Passwrod&lt;/td&gt;&lt;td&gt;&lt;input type="password" name="password" /&gt; (optional)&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;Auto login&lt;/td&gt;&lt;td&gt;&lt;input type="checkbox" name="autologin" /&gt;&lt;/td&gt;&lt;/tr&gt;
      &lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;input type="submit" value="Create the bookmarklet" /&gt;&lt;/td&gt;&lt;/tr&gt;
    &lt;/table&gt;

    &lt;h3&gt;Notice&lt;/h3&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;span style="color: #c00;"&gt;Express Yoyaku from JR is Japanese only service, there is no option to use it in English.&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span style="color: #c00;"&gt;Use this AT YOUR OWN RISK, WE MAKE NO WARRANTY.&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;&lt;span style="color: #c00;"&gt;This bookmarklet has a chance to be disabled because of the changes on Express Yoyaku.&lt;/span&gt;&lt;/li&gt;
      &lt;li&gt;If you put your user id and/or password, you can use the autofill function on the login form.&lt;/li&gt;
      &lt;li&gt;You can use the autofill function with only user id.&lt;/li&gt;
      &lt;li&gt;If you put both your user id and password, and check the auto login, the bookmarklet will send your user id and password automatically.&lt;/li&gt;
      &lt;li&gt;The user id and password you put here are not sent any outside of this panel.&lt;/li&gt;
      &lt;li&gt;Using the autofill function with your password allows you to use Express Yoyaku easy but I don&amp;#8217;t offer you to do this because of the high security risk.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/form&gt;
  &lt;div id="expy_instruction" style="display: none;"&gt;
    &lt;h3&gt;Step 2a. Adding bookmarklet on iPhone&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Tap &lt;a href="#" id="expy_iphone_link" target="_blank"&gt;this special link&lt;/a&gt;. You will get a new window.&lt;/li&gt;
      &lt;li&gt;On the window opened, bookmark it with &amp;#8220;Express Yoyaku&amp;#8221; as its title, then close the window.&lt;/li&gt;
      &lt;li&gt;Tab the bookmark icon on the toolbar then edit this bookmarklet.&lt;/li&gt;
      &lt;li&gt;Tap and scroll the address to the prefix &amp;#8220;about:?&amp;#8221;, then remove this 7 characters and save it.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;h3&gt;Step 2b. Adding bookmarklet on Mac or PC then sync it with iPhone&lt;/h3&gt;
    &lt;ol&gt;
      &lt;li&gt;Add &lt;a href="#" id="expy_pc_link"&gt;this link&lt;/a&gt; with &amp;#8220;Express Yoyaku&amp;#8221; as its title.&lt;/li&gt;
      &lt;li&gt;Sync it with your iPhone.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;div style="text-align: right;"&gt;
      &lt;a href="#" onclick="$('expy_form').show(); $('expy_instruction').hide(); return false;"&gt;Back&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;How to use it?&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First of all, create and add the bookmarklet using the panel on this page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the bookmarklet, you will get the login form.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the bookmarklet again. The bookmarklet autofills your user id and password into the login form.
If you create the bookmarklet with auto login option, you will atomically login.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will get the main screen of Express Yoyaku tickting service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the bookmarklet more again. The patch was applied on the Express Yoyaku and you will get the toolbar is placed on top of the page.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;div style="text-align: center; margin: 10px 0;"&gt;
  &lt;table style="margin: auto;"&gt;
    &lt;tr&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0249/expy_login.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0249/expy_login_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0253/expy_bookmark.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0253/expy_bookmark_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0257/expy_loginpanel.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0257/expy_loginpanel_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Login form&lt;/td&gt;
      &lt;td&gt;Open the bookmarklet&lt;/td&gt;
      &lt;td&gt;Autofill&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0261/expy_main.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0261/expy_main_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0265/expy_applied.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0265/expy_applied_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td style="width: 200px;"&gt;&lt;a href="http://niw.at/page_attachments/0000/0269/expy_booking.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0269/expy_booking_thumb.png" size="thumb" /&gt;&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Main screen&lt;br /&gt;of Express Yoyaku&lt;/td&gt;
      &lt;td&gt;Apply the patch&lt;/td&gt;
      &lt;td&gt;Ticketing screen&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;
&lt;/div&gt;


&lt;h2&gt;Donation&lt;/h2&gt;

&lt;p&gt;Now, I publish &lt;a href="http://dotswitch.net/services/rapidy/"&gt;an iPhone Apps&lt;/a&gt; on App Store!
Thank you for your donation!&lt;/p&gt;

&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;March 24, 2011

&lt;ul&gt;
&lt;li&gt;Update to support latest Express Yoyaku site.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jun 3, 2009

&lt;ul&gt;
&lt;li&gt;Update the information about iPhone Apps again.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Apr 13, 2009

&lt;ul&gt;
&lt;li&gt;Update the information about iPhone Apps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jan 19, 2009

&lt;ul&gt;
&lt;li&gt;Fix the problem with login form inside the tickting screen&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jan 16, 2009

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/GnGr11-oJFk" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 16 Jan 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/GnGr11-oJFk/</link>
        <feedburner:origLink>http://niw.at/articles/2009/01/16/express-yoyaku-on-iphone/</feedburner:origLink></item>
      
        <item>
          <title>Zoommy, A Stylish Image Zooming JavaScript</title>
          <description>&lt;p&gt;Today, I release a new image zooming javascript &amp;#8220;Zoommy&amp;#8221; which already I use on this webpage.
Zoommy automatically makes a normal anchor tag into a stylish, delicious and fashionable zoom interface which you can see somewhere on the web!&lt;/p&gt;

&lt;p&gt;Zoommy is tested and works on Safari, Firefox, IE7 and IE6 on both MacOS X and Windows.
Zoommy was strongy inspired from &lt;a href="http://www.apple.com/"&gt;Apple webpage&lt;/a&gt; and &lt;a href="http://www.cabel.name/2008/02/fancyzoom-10.html"&gt;FancyZoom&lt;/a&gt;.
You can use this as an alternative of &lt;a href="http://www.huddletogether.com/projects/lightbox/"&gt;Lightbox.js&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;Demo&lt;/h2&gt;

&lt;p&gt;Zoommy automatically change the next code into a delicious image link! (zoomminizing!)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;In addition, Zoommy also automically change the images chain into a slideshow gallery!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['mySlideShow']" title="Montmartre, Paris, France"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['mySlideShow']" title="Raffles Hotel, Singapore"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['mySlideShow']" title="Karuizawa, Nagano, Japan"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['mySlideShow']" title="Montmartre, Paris, France"&gt;
&lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['mySlideShow']" title="Raffles Hotel, Singapore"&gt;
&lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['mySlideShow']" title="Karuizawa, Nagano, Japan"&gt;
&lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;Download&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0313/zoommy-0.1.0.zip"&gt;zoommy-0.1.0.zip (95Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Getting Started&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Copy dependencies into your web site&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  Zoommy depends on &lt;a href="http://www.prototypejs.org/"&gt;Prototype.js&lt;/a&gt; &lt;strong&gt;version 1.6.x&lt;/strong&gt; and &lt;a href="http://script.aculo.us/"&gt;script.aculo.us&lt;/a&gt; version 1.8.x.
  If your website already use these libraries, like a &lt;a href="http://www.rubyonrails.org/"&gt;Ruby on Rails&lt;/a&gt; project, These files does not need to copy.
  Sorry that Zoommy is currently incompatible Prototype.js version 1.5.x, please check your version of prototype.js.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;javascripts/prototype.js&lt;/li&gt;
&lt;li&gt;&lt;p&gt;javascripts/effects.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy next files into your web site&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;images/zoommy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;javascripts/zoommy.js&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;  For your imformation, zoommy.js is compacted script, zoommy_pack.js is more compacted one and zoommy_src.js is original script before compaction.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adding include tags to your web pages&amp;#8217; header&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  The tag for prototype.js and effects.js does not need if they are already there.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;head&amp;gt;
    ....
    &amp;lt;script type="text/javascript" src="javascripts/prototype.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type="text/javascript" src="javascripts/effects.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type="text/javascript" src="javascripts/zoommy.js"&amp;gt;&amp;lt;/script&amp;gt;
    ....
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;Additional configuration if needed&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;  If you want to use the paths for images used in Zoommy(files coped in previous section 2) as your own relative path, You should put the next tag into header of each html page.
  &lt;strong&gt;imagePath&lt;/strong&gt; option should be relative pafh from the html or site wide absolute path to the images.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;lt;head&amp;gt;
    ....
    &amp;lt;script type="text/javascript"&amp;gt;
    zoommy_config = {imagePath: 'relative/path/to/zoommy/image/from/html'};
    &amp;lt;/script&amp;gt;
    ....
&lt;/code&gt;&lt;/pre&gt;

&lt;ol&gt;
&lt;li&gt;All done, then open your web page!&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Customize&lt;/h2&gt;

&lt;h3&gt;Adding a title&lt;/h3&gt;

&lt;p&gt;  You can show the title of image when zooming. Just adding the &lt;strong&gt;title=&amp;#8221;&lt;em&gt;(title of image)&lt;/em&gt;&amp;#8221;&lt;/strong&gt; attribute to the anchor tag.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" title="Blue sky and Sunshine!!"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" title="Blue sky and Sunshine!!"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;Making slideshow galleries&lt;/h3&gt;

&lt;p&gt;  Adding &lt;strong&gt;rel=&amp;#8221;zoommy[&amp;#8217;&lt;em&gt;(name of slideshow)&lt;/em&gt;&amp;#8217;]&amp;#8221;&lt;/strong&gt; attirbute to anchor tag, Zoommy groups images with same name and changes them into a slideshow gallery.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&amp;lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['travel around the world']"&amp;gt;
  &amp;lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2337/2457818492_fd9f9b7f0f_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2411/2458159794_84884f683b.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2411/2458159794_84884f683b_s.jpg" /&gt;
&lt;/a&gt;
&lt;a href="http://farm3.static.flickr.com/2106/2483739956_89be523894.jpg" rel="zoommy['travel around the world']"&gt;
&lt;img src="http://farm3.static.flickr.com/2106/2483739956_89be523894_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;Excluding from Zoomminize&lt;/h3&gt;

&lt;p&gt;  You can keep the anchors without Zoommy by adding &lt;strong&gt;rel=&amp;#8221;nozoommy&amp;#8221;&lt;/strong&gt; attribute to the tags.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" target="_blank" rel="nozoommy"&amp;gt;
  &amp;lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;div class="demo"&gt;
&lt;a href="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a.jpg" target="_blank" rel="nozoommy"&gt;
&lt;img src="http://farm4.static.flickr.com/3033/2457505175_37b8fffc2a_s.jpg" /&gt;
&lt;/a&gt;
&lt;/div&gt;


&lt;h3&gt;Disabling Zoommy badges&lt;/h3&gt;

&lt;p&gt;  As default, Zoommy add zoom badges to the thumbnail images inside the anchor tags on the top left corner.
  You can strip these badges by adding &lt;strong&gt;noBadge: true&lt;/strong&gt; option to the configuration code inside head tag.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
....
&amp;lt;script type="text/javascript"&amp;gt;
zoommy_config = {
    noBadge: true
};
&amp;lt;/script&amp;gt;
....
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Adjusting Z-Index of Zoommy&lt;/h3&gt;

&lt;p&gt;  If you want to use Zoommy with another fancy scripts or libraries, you may adding the &lt;strong&gt;baseZIndex&lt;/strong&gt; option to the configuration code for specification the Z-Index ordering.
  Default bottom, base Z-Index Zoommy uses are 900.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;head&amp;gt;
....
&amp;lt;script type="text/javascript"&amp;gt;
zoommy_config = {baseZIndex: 10000};
&amp;lt;/script&amp;gt;
....
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;FAQ&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Q. Some anchor tag doesn&amp;#8217;t not change into Zoommy? Why?&lt;/p&gt;

&lt;p&gt;A. Zoommy changes the anchor tags which href attribute ends with &amp;#8220;.png&amp;#8221;, &amp;#8220;.gif&amp;#8221;, &amp;#8220;.jpg&amp;#8221; or &amp;#8220;.jpeg&amp;#8221;, or which rel attribute start with &amp;#8220;zoommy&amp;#8221;.
 This means that you may add &lt;strong&gt;rel=&amp;#8221;zoommy&amp;#8221;&lt;/strong&gt; to anchor tag if its href attribute doesn&amp;#8217;t end with these extensions like CGI.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &amp;lt;a href="/path/to/image?var=value" rel="zoommy"&amp;gt;
    &amp;lt;img src="/path/to/thumbnail" /&amp;gt;
  &amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Change log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1.0.1

&lt;ul&gt;
&lt;li&gt;First release.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Donation&lt;/h2&gt;

&lt;p&gt;  If you would like to help the Zoommy project, please feel free to donate via &lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt; using the followin form. Thank you for your donation!&lt;/p&gt;

&lt;h3&gt;Support Zoommy&lt;/h3&gt;

&lt;p&gt;&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="KL9EHATHFQYW2" /&gt;
&lt;input type="hidden" name="item_name" value="Zoommy Donation" /&gt;
&lt;input type="hidden" name="item_number" value="ZOOMMY-DONATION" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="USD" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="US" /&gt;
Amount in USD &lt;input type="text" name="amount" value="10.00" size="6" /&gt;
&lt;input type="submit" name="submit" value="Donate" /&gt;
&lt;/form&gt;&lt;/p&gt;

&lt;h2&gt;Source Code&lt;/h2&gt;

&lt;p&gt;Now, I publish this project in open source.
You can get the whole source code from my &lt;a href="http://github.com/niw/zoommy"&gt;github repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;  Zoommy is under &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/yqVF90ezu7A" height="1" width="1"/&gt;</description>
          <pubDate>Thu, 05 Feb 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/yqVF90ezu7A/</link>
        <feedburner:origLink>http://niw.at/articles/2009/02/05/zoommy/</feedburner:origLink></item>
      
        <item>
          <title>TerminalColoreopard, Change Terminal.app ANSI Color on Leopard</title>
          <description>&lt;h1&gt;Introducing TerminalColoreopard!&lt;/h1&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0333/color_palette.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0333/color_palette_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0329/additional_menu.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0329/additional_menu_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Terminal.app on Leopard supports full ANSI color and multi color profile and many encodings and treat japanese correctly but, one thing &amp;#8211; the changing the ANSI color is missing.
When we use the Tiger, we can change the ANSI colors on Terminal.app using &lt;a href="http://www.culater.net/software/TerminalColors/TerminalColors.php"&gt;Terminal Colors Plugin&lt;/a&gt;.
But this nice plugin cannot work with Leopard one.
I tried to write same one for Leopard and now, I present it as beta version.&lt;/p&gt;

&lt;h2&gt;Snow Leopard Support&lt;/h2&gt;

&lt;p&gt;I uploaded 64bit TerminalColoreopard plugin for Snow Leopard, Mac OS X 10.6.x. It requires to install the newest version of &lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt; prior to use this plugin. If you&amp;#8217;re using Leopard, 10.5.x, please use previous version of TerminalColoreopard.&lt;/p&gt;&lt;h2&gt;Download and Install&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0338/TerminalColoreopard-0.2.6.dmg"&gt;TerminalColoreopard-0.2.6.dmg (175Kbyte, Snow Leopard Only)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;Download the package&lt;/li&gt;
&lt;li&gt;Double click to mount one.&lt;/li&gt;
&lt;li&gt;If you have never install the &lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt; which TerminalColoreopard need to work, double click SIMBL.pkg to install it.&lt;/li&gt;
&lt;li&gt;You confirm the Terminal.app does not work now. If not, you should quit one.&lt;/li&gt;
&lt;li&gt;Copy the TerminalColoreopard.bundle into (Your Home)/Library/Application Support/SIMBL/Plugins. If there are no destination, you should create one.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Defects&lt;/h2&gt;

&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="http://niw.at/page_attachments/0000/0213/terminal_screen.png"&gt;&lt;img src="http://niw.at/page_attachments/0000/0213/terminal_screen_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ul&gt;
&lt;li&gt;Currently the color settings are shared any color profile.&lt;/li&gt;
&lt;li&gt;Even if you change the color using the palette, it will not affect the screen quickly. You currently refresh the screen manually.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Road to 1.0&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;del&gt;Fix the defects&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Add the installer.pkg&lt;/li&gt;
&lt;li&gt;Add the preset of color set like Tango Colors or something&lt;/li&gt;
&lt;li&gt;Move color pane into the original preference dialog&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.2.6&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support Mac OS X 10.6.3, Snow Leopard only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.5 Beta&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support Snow Leopard and 64bit version of Terminal.app, Snow Leopard only.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.4&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the runtime error when you&amp;#8217;re using bright color&lt;/li&gt;
&lt;li&gt;You can change even bright colors.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0327/TerminalColoreopard-0.2.4.dmg"&gt;TerminalColoreopard-0.2.4.dmg (105Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.3&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix the bug which I didn&amp;#8217;t commit but was included in 0.2.2&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0314/TerminalColoreopard-0.2.3.dmg"&gt;TerminalColoreopard-0.2.3.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.2&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix memory leak bug&lt;/li&gt;
&lt;li&gt;Add black and white color buttons&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0299/TerminalColoreopard-0.2.2.dmg"&gt;TerminalColoreopard-0.2.2.dmg (64Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support MacOS X 10.5.2 software update&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0167/TerminalColoreopard-0.2.1.dmg"&gt;TerminalColoreopard-0.2.1.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.2.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix missing dmg background&lt;/li&gt;
&lt;li&gt;Remove black and white color settings because we cannot change these color, it seems be depended on the configuration of Terminal.app itself.&lt;/li&gt;
&lt;li&gt;Change the way to hack and overwrite the methods in Terminal.app&lt;/li&gt;
&lt;li&gt;Adjust color configuration panel GUI&lt;/li&gt;
&lt;li&gt;Open the source&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0162/TerminalColoreopard-0.2.0.dmg"&gt;TerminalColoreopard-0.2.0.dmg (63Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;li&gt;&lt;a href="http://niw.at/page_attachments/0000/0155/TerminalColoreopard-0.1.0.dmg"&gt;TerminalColoreopard-0.1.0.dmg (100Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Donation&lt;/h2&gt;

&lt;p&gt;  If you would like to help the TerminalColoreopard project, please feel free to donate via &lt;a href="http://www.paypal.com"&gt;PayPal&lt;/a&gt; using the following form.&lt;/p&gt;

&lt;div style="background: #fff; padding: 10px; margin: 10px 0;"&gt;
&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;
&lt;input type="hidden" name="cmd" value="_xclick" /&gt;
&lt;input type="hidden" name="business" value="KL9EHATHFQYW2" /&gt;
&lt;input type="hidden" name="item_name" value="TerminalColoreopard Donation" /&gt;
&lt;input type="hidden" name="no_note" value="1" /&gt;
&lt;input type="hidden" name="currency_code" value="USD" /&gt;
&lt;input type="hidden" name="return" value="http://niw.at/articles/2007/11/02/TerminalColoreopard/" /&gt;
&lt;input type="hidden" name="tax" value="0" /&gt;
&lt;input type="hidden" name="lc" value="US" /&gt;
Amount in USD &lt;input type="text" name="amount" value="10.00" size="6" /&gt;
&lt;input type="submit" name="submit" value="Donate" /&gt;
&lt;/form&gt;
&lt;/div&gt;


&lt;p&gt;Thank you for your donation!&lt;/p&gt;

&lt;h2&gt;Source Code&lt;/h2&gt;

&lt;p&gt;Now, I publish this project in open source.
You can get the whole source code from my &lt;a href="http://github.com/niw/terminal_coloreopard"&gt;github repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;TerminalColoreopard is under &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/rhOY36zqV_E" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 02 Nov 2007 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/rhOY36zqV_E/</link>
        <feedburner:origLink>http://niw.at/articles/2007/11/02/TerminalColoreopard/</feedburner:origLink></item>
      
        <item>
          <title>Add previews, language selector to Google on Safari</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0193/googlethumbnails.png"&gt;&lt;img src="/page_attachments/0000/0193/googlethumbnails_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0185/googlelanguagecodeselector.png"&gt;&lt;img src="/page_attachments/0000/0185/googlelanguagecodeselector_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There are cool tool which allows us to change the website to what you want to do, named: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;GreaseMonkey&lt;/a&gt;. Unfortunately, this tool could not work on Safari itself. But the genius guy developed the same tool for Safari named &lt;a href="http://8-p.info/greasekit/"&gt;GreaseKit&lt;/a&gt;. This tool is commonly compatible with GreaseMonkey and some user scripts can work on it without any change. But some user scripts I found on &lt;a href="http://userscripts.org"&gt;userscripts.org&lt;/a&gt; do not work well on Safari with GreaseKit. Then, I scratched user scripts which work like these scripts with GreaseKit.&lt;/p&gt;&lt;h1&gt;Add previews to Google search results&lt;/h1&gt;

&lt;p&gt;This user scripts add the thumbnail previews from &lt;a href="http://ackroyd.de/googlepreview/"&gt;google preview&lt;/a&gt; to the Google search results.&lt;/p&gt;

&lt;h2&gt;Download&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;&lt;a href="http://github.com/niw/userscripts/raw/6a97423e31ae9a9b1c9286525442c426d06301fc/googlethumbnails.user.js"&gt;googlethumbnails.user.js (0.2.1, hosted on GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0.2.1

&lt;ul&gt;
&lt;li&gt;Support &lt;a href="http://autopagerize.net/"&gt;AutoPagerize&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.2 (rather 0.2.0)

&lt;ul&gt;
&lt;li&gt;Follow the changes on google&lt;/li&gt;
&lt;li&gt;Change open.thumbshots.org to googlepreview.com&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0285/googlethumbnails-0.2.user.js"&gt;googlethumbnails-0.2.user.js (2Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.1

&lt;ul&gt;
&lt;li&gt;Follow the changes on google&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0184/googlethumbnails-0.1.1.user.js"&gt;googlethumbnails-0.1.1.user.js (1Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.0

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0181/googlethumbnails-0.1.0.user.js"&gt;googlethumbnails-0.1.0.user.js (1Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;Add language selector to Google search field&lt;/h1&gt;

&lt;p&gt;This user scripts add the language selector (known as hl parameter) to the search filed of Google.
Currently this script has only Japanese, English selection but you can add any other language code by changing the this user script code
around the &amp;#8220;var langs = {&amp;#8230;&amp;#8221;&lt;/p&gt;

&lt;h2&gt;Download&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;&lt;a href="http://github.com/niw/userscripts/raw/c5cc5bf7dd6fb3a55779bd1c82066190b9550d83/googlelanguagecodeselector.user.js"&gt;googlelanguagecodeselector.user.js (0.2.1, Hosted on GitHub)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;0.2.1

&lt;ul&gt;
&lt;li&gt;Follow the changes on Google, they added &amp;#8220;-webkit-appearance: button;&amp;#8221; to the buttons&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.2.0

&lt;ul&gt;
&lt;li&gt;Add button mode and make it as default&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0337/googlelanguagecodeselector-0.2.0.user.js"&gt;googlelanguagecodeselector-0.2.0.user.js (3Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.1

&lt;ul&gt;
&lt;li&gt;Follow the changes on Google&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0183/googlelanguagecodeselector-0.1.1.user.js"&gt;googlelanguagecodeselector-0.1.1.user.js (2Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;0.1.0

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0180/googlelanguagecodeselector-0.1.0.user.js"&gt;googlelanguagecodeselector-0.1.0.user.js (3Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;How to use them?&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;First you should install &lt;a href="http://www.culater.net/software/SIMBL/SIMBL.php"&gt;SIMBL&lt;/a&gt; to enable GreaseKit.&lt;/li&gt;
&lt;li&gt;Follow &lt;a href="http://8-p.info/greasekit/"&gt;this install instruction&lt;/a&gt;, install the GreaseKit plugin.&lt;/li&gt;
&lt;li&gt;Download these user scripts and drag and drop into Safari or, just click the download link then install it.&lt;/li&gt;
&lt;li&gt;Then, open &lt;a href="http://google.com/"&gt;Google.com&lt;/a&gt;. Enjoy!&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/KoEK8_R1p9c" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 22 Feb 2008 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/KoEK8_R1p9c/</link>
        <feedburner:origLink>http://niw.at/articles/2008/02/22/add-previews-language-selector-to-google-on-safari/</feedburner:origLink></item>
      
        <item>
          <title>How to enable the popup window on UIWebView</title>
          <description>&lt;p&gt;UIWebView is most important UIKit class of &lt;a href="http://http://developer.apple.com/iphone/"&gt;iPhone SDK&lt;/a&gt;, as you know, it includes all methods and functions of Mobile Safari.
Though, I doesn&amp;#8217;t accept the &amp;#8220;open new window&amp;#8221; or &amp;#8220;popup window&amp;#8221; of the link.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;a href="somehere" target="_blank" /&amp;gt;Open this link in new window&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If this kind of link are shown in the UIWebView and user clicks it, nothing happens. Of course UIWebView is high-abstracted class and we SDK developer can invoke only a few methods, so there is not complete but good solution for this problem.
The key methods are&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
- (void)webViewDidFinishLoad:(UIWebView *)webView
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Hook all events of popup window&lt;/h2&gt;

&lt;p&gt;At first, we hooks all events of opening the new window from the current web page.
How to do that? We can use JavaScript.
The key concept is hooking all popup request and rewrite them to normal requests with special url in JavaScript then hooking these requests again in Objective-C and show the popup by ourselves.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (void)webViewDidFinishLoad:(UIWebView *)webView {
  [webView stringByEvaluatingJavaScriptFromString:/* string of next JavaScript */];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Than pass next JavasScript to stringByEvaluatingJavaScriptFromString.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
var tags = document.getElementsByTagName("a");
for(var i=0; i &amp;lt; tags.length; i++) {
  var tag = tags[i];
  var t = tag.getAttribute("target");
  var h = tag.getAttribute("href");
  if(/* check the target and href */) {
    tag.setAttribute("target", "");
    tag.setAttribute("href", /* make a special url from href */);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;When the webViewDidFinishLoad is invoked, we run a javascript to hook all anchor tags and remove the target attribute and replace href attribute to the special one. also, we need another hooks for form and javascript events.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
var tags = document.getElementsByTagName("form");
for(var i=0; i &amp;lt; tags.length; i++) {
  var tag = tags[i];
  var submit = tag.submit;
  tag.submit = function() {
    var t = tag.target;
    var a = tag.action;
    if(/* check target and action */) {
      tag.target = "";
      tag.action = /* make special url from action */
    }
    return submit.apply(this, arguments);
  };
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This hook should work in many situations. This code though doesn&amp;#8217;t work for all situations, especially, the form has a submit event listener.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
window.open = function(url) {
  if(/* check the url */) {
    var t = document.createElement("a");
    t.setAttribute("href", /* make a special url */);
    var e = document.createEvent("MouseEvent");
    e.initMouseEvent("click");
    t.dispatchEvent(e);
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This hook is quite strange because we make a hidden anchor tag and click behind the screen to invoke the HTTP request with a special url so that we can hook the popup event inside Objective-C code.&lt;/p&gt;

&lt;h2&gt;Hook the popup event inside Objective-C&lt;/h2&gt;

&lt;p&gt;Okay, now we back to the Objective-C world. Now we can get the event of popup in the delegate of UIWebView.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  if(navigationType == UIWebViewNavigationTypeLinkClicked || navigationType == UIWebViewNavigationTypeFormSubmitted) {
    NSURL *url = [request URL];
    if(/* check the url is special or not */) {
      NSString *urlstr = /* convert special url to normal url */;
      NSMutableURLRequest *req = [request mutableCopyWithZone:nil];
      [req setURL:[NSURL URLWithString:urlstr]];

      if(/* is popup window close? */) {
        /* open a popup window */
      }
      [popupWebView loadRequest:req];
      return NO;
    }
  }
  return YES;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yes, we can get all HTTP request of normal anchor tag at this absolute long name delegate method.
Checking the request URL and if it is special one created inside our hook code of JavaScript, we convert it to normal URL and make a NSURLRequest then pass it to the popup window.
By these hooks, we can open a popip window with UIWebView!&lt;/p&gt;

&lt;h2&gt;How to make the special URL&lt;/h2&gt;

&lt;p&gt;Good question, I didn&amp;#8217;t mention this problem. Actuaylly, this is quite difficult, because we want to preserve the base urls of the requests.
We couldn&amp;#8217;t replace some safe part of the URL like schema or hostname etc. When we replace them, the base urls of the requesta may be discarded and we cannot create the new request inside webView:shouldStartLoadWithRequest:navigationType.
My idea is appending special hash to the end of the URL. This is not safe for all situations but should work well in many situations.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:javascript
function makeSpecialURL(url) {
  return url + (url.match(/#/) ? "_open" : "#open");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;then inside webView:shouldStartLoadWithRequest:navigationType we can strip the additional hash.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;language:objc
if([[url fragment] hasSuffix:@"open"]) {
  NSString *urlstr = [[url absoluteString] substringToIndex:[[url absoluteString] length] - 5];
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h2&gt;Another methods?&lt;/h2&gt;

&lt;p&gt;I hope we can solve this problem using hidden API or delegate(webView:createWebViewWithRequest:), but there are no way to solve this problem inside the SDK documented area except using JavaScript hooks. This is hard and not so good implementation but I hope it helps your applications on iPhone!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/KD5VngypwLU" height="1" width="1"/&gt;</description>
          <pubDate>Fri, 06 Feb 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/KD5VngypwLU/</link>
        <feedburner:origLink>http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/</feedburner:origLink></item>
      
        <item>
          <title>Temporary, Growl Plugin for Tweetie for Mac</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0316/tweetie_with_growl.png"&gt;&lt;img src="/page_attachments/0000/0316/tweetie_with_growl_thumb.png" size="thumb" /&gt;&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Now, I&amp;#8217;m using amazing awesome &lt;a href="http://twitter.com/niw"&gt;twitter&lt;/a&gt; client, &lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie for Mac&lt;/a&gt; thouth, I can&amp;#8217;t wait a growl-enabled Tweetie for Mac&amp;#8230;!&lt;/p&gt;

&lt;h2&gt;Hacking with TweetieHack!&lt;/h2&gt;

&lt;p&gt;I made a quick hack plugin to enable &lt;a href="http://growl.info/"&gt;Growl&lt;/a&gt; feature for Tweetie for Mac!&lt;/p&gt;

&lt;p&gt;As you know, the author of Tweetie for mac said: we are planing to implement it on Tweetie.app so, It is very temporal plugin so far.
Enjoy!&lt;/p&gt;

&lt;h2&gt;Update of TweetieHack&lt;/h2&gt;

&lt;p&gt;The latest TweetieHack 0.2.0 supports Tweetie 1.1 and enhances its Growl notification. It puts tweeters&amp;#8217; name to notification title, show up to 5 recent tweets with tweeters&amp;#8217; icon, etc.&lt;/p&gt;

&lt;p&gt;As next section, enabling Growl notification is completed by Tweetie itself but I decide to update this plugin for who want to use TweetieHack like notification with Tweetie 1.1. (Update May 10, 2009)&lt;/p&gt;&lt;h2&gt;Update of Tweetie&lt;/h2&gt;

&lt;p&gt;Tweetie 1.1 has Growl ability! This plugin is no longer needed for enabling Growl notification.&lt;/p&gt;

&lt;p&gt;You can enable Growl notification from &amp;#8220;Nofitication Options&amp;#8230;&amp;#8221; button inside Account panel of Preferences. (Update May 5, 2009)&lt;/p&gt;

&lt;h2&gt;Download and Install&lt;/h2&gt;

&lt;ul class="download clearfix"&gt;
  &lt;li&gt;
    &lt;a href="/page_attachments/0000/0322/TweetieHack-0.2.0.dmg"&gt;TweetieHack-0.2.0.dmg (124Kbyte)&lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;


&lt;ol&gt;
&lt;li&gt;Installing &lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie for Mac&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Download the package&lt;/li&gt;
&lt;li&gt;Double click to mount it, then follow the instructions.&lt;/li&gt;
&lt;li&gt;If you didn&amp;#8217;t install SIMBL yet, double click SIMBL.pkg icon to install it prior to use this plugin.&lt;/li&gt;
&lt;li&gt;Quit Tweetie if it is running. Create a folter located at Your Home/Library/Application Support/SIMBL/Plugins, then copy TweetieHack.bundle into it.&lt;/li&gt;
&lt;li&gt;Click Tweetie application icon with Ctrl button, then select Get Info menu item. You&amp;#8217;ll see Tweetie info panel. Turn Open in 32 bit mode on, then close the panel (This step is &lt;strong&gt;not required if you are using Tweetie 1.2&lt;/strong&gt; which returns in 32 bit mode.)&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;Change Log&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;0.2.0 &amp;#8211; Only for Tweetie 1.1 and later&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support Tweetie 1.1, Enhance Tweetie&amp;#8217;s Growl notification&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.2 &amp;#8211; Only for Tweetie 1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support notification of direct messages, change the way to hook events of Tweetie.app&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0321/TweetieHack-0.1.2.dmg"&gt;TweetieHack-0.1.2.dmg (71Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.1&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Addressed an issue of counting tweets, notify number of unread tweets&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0320/TweetieHack-0.1.1.dmg"&gt;TweetieHack-0.1.1.dmg (55Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;0.1.0&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First release&lt;/li&gt;
&lt;li&gt;&lt;a href="/page_attachments/0000/0315/TweetieHack-0.1.0.dmg"&gt;TweetieHack-0.1.0.dmg (55Kbyte)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Source Code&lt;/h2&gt;

&lt;p&gt;Now, I publish this project in open source.
You can get the whole source code from my &lt;a href="http://github.com/niw/tweetie_hack"&gt;github repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;License&lt;/h2&gt;

&lt;p&gt;TweetieHack is under &lt;a href="http://en.wikipedia.org/wiki/MIT_License"&gt;MIT License&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/AkR-bzgzpJ0" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 26 Apr 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/AkR-bzgzpJ0/</link>
        <feedburner:origLink>http://niw.at/articles/2009/04/26/temporary-growl-plugin-for-tweetie-for-mac/</feedburner:origLink></item>
      
        <item>
          <title>Force to eject the stuck disc from MacBook Pro</title>
          <description>&lt;ul class="images"&gt;
  &lt;li&gt;&lt;a href="http://farm3.static.flickr.com/2140/2457444284_a492697067.jpg"&gt;&lt;img src="http://farm3.static.flickr.com/2140/2457444284_a492697067_s.jpg" /&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;When I got my &lt;a href="http://www.apple.com/macbookpro/"&gt;MacBook Pro(17inch, Late 2007)&lt;/a&gt;, I was totally troubled with its optical disc drive.
I inserted the Leopard install DVD into MacBook Pro which has slot loading optical disc drive, then booted up the Mac with C key to boot from DVD.&lt;/p&gt;

&lt;p&gt;At that time, I could understand what was happen. The DVD disc seems to be spinning and the drive seems to try to read it, but something prevented to do.&lt;/p&gt;

&lt;p&gt;It was not changed even if I turned off and on the power. By this way the disc ware stuck inside the Mac.&lt;/p&gt;&lt;p&gt;Of course, I can boot it up from HDD but, the disc was not mounted and I could not eject by eject key.&lt;/p&gt;

&lt;p&gt;I thought that the firmware on disc drive tried to check whether the disc was loaded or not and something prevented to done that phase, the drive could not eject it. I also tried to eject by pressing F12 or eject or trackpad button with power button (see the &lt;a href="http://docs.info.apple.com/article.html?artnum=88275"&gt;apple&amp;#8217;s FAQ&lt;/a&gt;), it did not help me.&lt;/p&gt;

&lt;p&gt;The disc were still there.&lt;/p&gt;

&lt;h1&gt;Force to eject!&lt;/h1&gt;

&lt;p&gt;At first, I make the path to access the hidden eject button by disassembling the MacBook Pro. We can find the way to do &lt;a href="http://www.ifixit.com/Guide/Mac/MacBook-Pro-17-Inch-Core-Duo/Optical-Drive-Replacement/87/10/"&gt;on the web&lt;/a&gt;. Follow this guide you can open the upper case then, the disc drive will be revealed.&lt;/p&gt;

&lt;p&gt;Next step is bit hard. You should NOT disconnect the cable connected the upper case. Then, plug the AC power and power on by power button.&lt;/p&gt;

&lt;p&gt;After the disc drive spins up, you try to connect the two of four small dots printed on the flat cable which are place front left side of the disc drive using the clip or something electricity conducting. The disc will suddenly be ejected when you connect the small dots.&lt;/p&gt;

&lt;p&gt;These small dots seem the pattens for implementing the eject button. (and the button is not fixed on the MacBook Pro&amp;#8230;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/niwat_en/~4/4qCPjXilRHY" height="1" width="1"/&gt;</description>
          <pubDate>Sun, 25 Jan 2009 00:00:00 GMT</pubDate>
          <link>http://feeds.niw.at/~r/niwat_en/~3/4qCPjXilRHY/</link>
        <feedburner:origLink>http://niw.at/articles/2009/01/25/force-to-eject-the-stuck-disc-from-macbook-pro/</feedburner:origLink></item>
      
    
  
  </channel>
</rss>

