<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.fraction.jp/log/category/46/">
    <title>Program/Java -- BONNOH FRACTION 14</title>
    <link>http://www.fraction.jp/log/category/46/</link>
    <description>世の中に寝るより楽はなかりけり&lt;br /&gt;浮世の馬鹿は起きて働く</description>
    
    <dc:creator>Yuanying</dc:creator>
	<dc:date>2018-06-18T09:39:56+09:00</dc:date>
	<admin:generatorAgent rdf:resource="http://webby.rubyforge.org/?v=0.9.4"/>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2008/12/25/Java_" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/12/12/Building_a_JNI_Universal_Application_with_Xcode_30" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/11/16/MacOSX104_gcc" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/10/15/Wizard_Selection_Page" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/08/30/Change_blog_backend_to_Rails_from_Java" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/06/1153" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/05/1131" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/04/1111" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2007/04/1109" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect">
    <title>Nike+ と Garmin Connect を同期したい</title>
    <link>http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect</link>
    <description>最近、JogNote に少し興味を持ってるのだが、問題はすでにランの記録は Garmin Connect で管理しているのでいちいち JogNote に入力したくないって事。JogNote は JogNote で Nike+ からのデータインポートには対応してるのだけれども、Garmin Connect はナニソレ？って感じ。とすると、遠回りな方法になるが、Garmin Connect と Nike+ を同期Nike+ と JogNote を同期ということになる。とはいっても、結局問題が、Garm...</description>
    <content:encoded><![CDATA[
        <p>
<img  src='/log/2011/03/48km.jpg'
      width='270' 
      height='360' 
      alt=''  />
</p>


<p>最近、<a href="http://www.jognote.com/">JogNote</a> に少し興味を持ってるのだが、
問題はすでにランの記録は Garmin Connect で管理しているのでいちいち JogNote に入力したくないって事。</p>

<p>
<img  src='/log/2011/03/nikeplus_dashboard.jpg'
      width='371' 
      height='148' 
      alt=''  />
</p>


<p>JogNote は JogNote で Nike+ からのデータインポートには対応してるのだけれども、
Garmin Connect はナニソレ？って感じ。</p>

<p>とすると、遠回りな方法になるが、</p>

<ol>
<li>Garmin Connect と Nike+ を同期</li>
<li>Nike+ と JogNote を同期</li>
</ol>


<p>ということになる。</p>

<p>とはいっても、結局問題が、Garmin Connect と JogNote の同期から、
どうやって Garmin Connect と Nike+ を同期するのかって事になるだけな訳だが。</p>

<h2>Nike+ API</h2>

<p>少し調べてみると、一応 Nike+ には非公式ながらも Web API が存在するらしい。</p>

<p>そして、そのものずばりの <a href="http://awsmithson.com/tcx2nikeplus/">Garmin Forerunner tcx file to Nike+ Converter &amp; Uploader</a>
というサービスを発見。しかもオープンソース。</p>

<ul>
<li><a href="https://github.com/angusws/tcx2nikeplus">angusws/tcx2nikeplus - GutHub</a></li>
</ul>


<p>言語が Ruby だったら…、と悔やまれるが Java で書かれている。
わざわざ Java から Ruby に書き直すのも面倒なのでこのサービスをそのまま使うことにする。</p>

<p>毎回毎回 Garmin Connect にデータをアップロードしてからこのサービスをぽちぽちするのも面倒なので、
Garmin Connect の RSS からアップロードしてないデータをアップロードするスクリプトを書いて cron に登録することにした。</p>

<ul>
<li><a href="https://gist.github.com/886519">ガーミンコネクトのデータを Nike+ と同期するスクリプト。 -- Gist</a></li>
</ul>


<p>Ruby 1.8.7 @ Mac OSX 10.6 でのみ動作確認済み。</p>

    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:subject>トライアスロン</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-03-28T10:17:51+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2008/12/25/Java_">
    <title>久しぶりに Java を使った</title>
    <link>http://www.fraction.jp/log/archives/2008/12/25/Java_</link>
    <description>特にネタとかないので、久しぶりに Java を使って意外に快適だったので報告などを。以前は Maven と Eclipse の連携が微妙だったため、Eclipse 使ってるとライブラリの管理とかメンドクセーなあとか思ってたんですが、いつの間にかすごい快適。普通に WTP と Maven のウェブプロジェクトが同期するし！Maven Integration for Eclipse、おすすめ。あとさらにびっくりしたのが、ライブラリのソースコードの自動ダウンロード。メニューから「Download Sou...</description>
    <content:encoded><![CDATA[
        <p>特にネタとかないので、久しぶりに Java を使って意外に快適だったので報告などを。</p>

<p>以前は Maven と Eclipse の連携が微妙だったため、
Eclipse 使ってるとライブラリの管理とかメンドクセーなあとか思ってたんですが、
いつの間にかすごい快適。</p>

<p>普通に WTP と Maven のウェブプロジェクトが同期するし！</p>

<p><a href="http://m2eclipse.codehaus.org/">Maven Integration for Eclipse</a>、おすすめ。</p>

<p>あとさらにびっくりしたのが、ライブラリのソースコードの自動ダウンロード。</p>

<p><img src="/log/2008/12/maven.png" width="400" height="255" alt="maven.png" /></p>

<p>メニューから「Download Sources」を選ぶとあら不思議、
依存関係のある jar ファイルにソースコードをアタッチしてくれて、
ライブラリのソースコードを Eclipse から確認できるよ！！！</p>

<p>あとは、この MacBook で Java 6 が動けば…。ってか買い替え？</p>

    ]]></content:encoded>
    <dc:subject>独り言</dc:subject>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2008-12-25T03:11:38+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/12/12/Building_a_JNI_Universal_Application_with_Xcode_30">
    <title>Building a JNI Universal Application with Xcode 3.0</title>
    <link>http://www.fraction.jp/log/archives/2007/12/12/Building_a_JNI_Universal_Application_with_Xcode_30</link>
    <description>アップルにある「Building a JNI Universal Application with Xcode」というドキュメントがちょっと古くてXcode 3.0(Leopard)だとうまくチュートリアルの通りに進まなかったのでメモ。Creating the Initial Applicationまず、最初からつまづく。なんといってもNew Projectに「Java Swing Application」が見当たらない。出来上がりのアプリケーションから察するにXcode 3.0では単純に「Jav...</description>
    <content:encoded><![CDATA[
        <p>アップルにある「<a href='http://developer.apple.com/java/jniuniversal.html'>Building a JNI Universal Application with Xcode</a>」というドキュメントがちょっと古くてXcode 3.0(Leopard)だとうまくチュートリアルの通りに進まなかったのでメモ。</p>
<h2>Creating the Initial Application</h2>
<p>まず、最初からつまづく。なんといってもNew Projectに「Java Swing Application」が見当たらない。出来上がりのアプリケーションから察するにXcode 3.0では単純に「Java Application」と名前を変えているらしい。</p>
<p><img src="/log/2007/12/jni01.png" width="320" height="268" alt="jni01.png" /></p>
<h2>プロジェクトの構成</h2>
<p>そして一番の問題がプロジェクトがほとんどAnt-basedになっちゃってること。</p>
<p><img src="/log/2007/12/jni02.png" width="400" height="191" alt="jni02.png" /></p>
<p>そのせいで新規にビルドフェーズをXcode上から追加できない。全部自分でbuild.xmlをいじらなくちゃいけない模様。</p>
<p>まあJava開発者ならAntの方が使いやすいだろうという配慮なんだけど私には余計なお世話でした…。</p>
<p>まあとりあえず<a href='http://developer.apple.com/java/jniuniversal.html'>Building a JNI Universal Application with Xcode</a>通りにnativeメソッドをJavaのソースコードに追加して、ライブラリをロードするところまで進める。</p>
<h3>Adding the Native Method Declaration and Call</h3>
<pre>public native String getMyFullName();</pre>
<h3>Loading the Dynamic Library</h3>
<pre>static { System.loadLibrary( "MyFirstJNILib" ); }</pre>

<h2>Creating the Header File</h2>
<p>さて、ここら辺からドキュメントが役立たずになってきますよ。</p>
<p>今回はヘッダファイルを作るのに(ドキュメントにあるJavaHeadersターゲットは作成せずに、)antタスクのjavahを使います。javahでヘッダファイルを作るためにいくつかの変数をbuild.xmlに追加します。</p>
<h3>build.xml</h3>
<p>initターゲットとjarターゲットを修正。</p>
<pre><code class='prettyprint'>	&lt;!-- Initialization target, for any prelimary setup needed to build --&gt;
	&lt;target name="init" description="Preparation"&gt;
		<strong>&lt;!-- Get properties from environment --&gt;
		&lt;property environment="env"/&gt;	
		&lt;property name="curr_build_dir" location="build/${env.CONFIGURATION}"/&gt;
		&lt;property name="curr_header_dir" location="build/${env.CONFIGURATION}/Headers"/&gt;</strong>

		&lt;mkdir dir="${curr_build_dir}"/&gt;
		&lt;mkdir dir="${curr_header_dir}"/&gt;	

		&lt;mkdir dir="${src}"/&gt;
		&lt;mkdir dir="${lib}"/&gt;
	&lt;/target&gt;

	&lt;target name="jar" depends="compile" description="Build jar"&gt;
		&lt;mkdir dir="${jars}"/&gt;
		&lt;jar jarfile="${jars}/${ant.project.name}.jar" basedir="${bin}" manifest="${resources}/Manifest"&gt;
			&lt;!-- Inject resources --&gt;
			&lt;fileset dir="${resources}/"
				excludes="${resources}/Manifest"
			/&gt;
			&lt;!-- Merge library jars into final jar file --&gt;
			&lt;zipgroupfileset refid="lib.jars"/&gt;
		&lt;/jar&gt;

		<strong>&lt;!-- generate the header files --&gt;
		&lt;javah classpath=""${jars}/${ant.project.name}.jar" outputfile="${curr_header_dir}/MyFirstJNILib.h"&gt;
			&lt;class name="MyLeopardJNIProject"/&gt;
		&lt;/javah&gt;</strong>
	&lt;/target&gt;</code></pre>
<p>propertyとjavacタスクを追加したよ。</p>
<p>とりあえずここまででビルドしてみると、うまくいってれば<code>build/${env.CONFIGURATION}/Headers</code>フォルダに<code>MyFirstJNIProject.h</code>ができているはず。</p>
<h2>Adding the JNI Library Target</h2>
<p>ここのセクションはいくつかの相違点以外は基本的にそのまま。</p>
<h3>相違点</h3>
<ul><li>ヘッダ検索パスの追加</li><li>ヘッダファイルのincludeの指定の仕方</li><li>MyFirstJNILibターゲットのDependenciesにJavaHeadersを<strong>追加しない</strong></li><li>build.xmlにターゲットを追加する</li></ul>
<h3>ヘッダ検索パスの追加</h3>
<p>ドキュメントではヘッダ検索パスとして<code>$(SDKROOT)/System/Library/Frameworks/JavaVM.framework/Headers</code>を追加していたが、さらに"${TARGET_BUILD_DIR}/Headers"も追加する。</p>
<p><img src="/log/2007/12/jni03.png" width="400" height="226" alt="jni03.png" /></p>
<h3>ヘッダファイルのincludeの指定の仕方</h3>
<p>MyFirstJNILib.cはMyFirstJNILib.hをincludeするが、MyFirstJNILib.hはヘッダ検索パスを前項で追加したため、<code>#include "MyFirstJNILib.h"</code>ではなく、以下のように指定する。</p>
<pre>#include &lt;MyFirstJNILib.h&gt;</pre>
<h3>build.xmlにターゲットを追加する</h3>
<p>追加したMyFirstJNILibターゲットをAntからコンパイルするようにbuild.xmlを編集する。</p>
<p>まず、build.xmlの最初の方にネイティブコードをコンパイルするための変数を追加。</p>
<h4>property追加</h4>
<pre><code class="prettyprint">...
	&lt;property name="application.resources" location="${dist}/${ant.project.name}.app/Contents/Resources"/&gt;
	&lt;property name="application.resources.java" location="${dist}/${ant.project.name}.app/Contents/Resources/Java"/&gt;

    <strong>&lt;property name="native.target" value="MyFirstJNILib"/&gt;
    &lt;property name="native.project" value="MyLeopardJNIProject.xcodeproj"/&gt;
    &lt;property name="native.library" value="libMyFirstJNILib.jnilib"/&gt;
    &lt;property name="env.CONFIGURATION" value="Release"/&gt;</strong>

	&lt;!-- lib directory should contain any pre-built jar files needed to build the project
		 AppleJavaExtensions.jar is included to allow the built jars to run cross-platform if you depend on Apple eAWT or eIO classes.
		 See http://developer.apple.com/samplecode/AppleJavaExtensions/index.html for more information --&gt;
...</code></pre>
<h4>ネイティブコードのコンパイル</h4>
<p>ネイティブコードをXcodeを利用してコンパイルするターゲットを追加。</p>
<pre><code class="prettyprint">	&lt;!-- Note: this target requires that Xcode Tools be installed --&gt;
	&lt;target name="nativelib" depends="jar"&gt;
		&lt;exec executable="/usr/bin/xcodebuild"&gt;
			&lt;arg line="-project ${native.project}"/&gt;
			&lt;arg line="-target ${native.target}"/&gt;
			&lt;arg line="-configuration ${env.CONFIGURATION}"/&gt;
		&lt;/exec&gt;		
        &lt;copy file="${curr_build_dir}/${native.library}" toDir="${jars}" failonerror="true" verbose="true"/&gt;
	&lt;/target&gt; </code></pre>
<h4>パッケージング</h4>
<p>packageターゲットの依存関係にnativelibターゲットを追加し、*.jnilibをリソースとして追加するタスクを追加する。</p>
<pre><code class="prettyprint">	&lt;target name="package" depends="nativelib" description="Make a double-clickable Mac OS X application"&gt;
		&lt;mkdir dir="${dist}"/&gt;
		&lt;mkdir dir="${application.resources.java}"/&gt;
		&lt;mkdir dir="${application.macos}"/&gt;
		&lt;!-- copy jars --&gt;
		&lt;copy toDir="${application.resources.java}"&gt;
			&lt;fileset dir="${jars}"&gt;
				&lt;include name="*.jar"/&gt;
				&lt;include name="*.jnilib" /&gt;
			&lt;/fileset&gt;
		&lt;/copy&gt;</code></pre>
<h2>実行</h2>
<p>以上で設定終わり。「ビルドして進行」ボタンを押せばJNIを利用したSwingアプリケーションができあがってるはず。</p>
<h2>感想</h2>
<p>LeopardになってからJavaが蔑ろにされてる気が…。</p>
<p>ところでJavaでJNI使ってる人ってまだいるのかしらん？</p>
<h2>ダウンロード</h2>
<p>念のため今回作ってみたプロジェクト。</p>
<ul><li><a href="/log/2007/12/MyLeopardJNIProject.zip">MyLeopardJNIProject.zip</a></li></ul>
    ]]></content:encoded>
    <dc:subject>Apple</dc:subject>
    <dc:subject>Program/Java</dc:subject>
    <dc:subject>Program/Cocoa</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-12-12T04:38:01+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/11/16/MacOSX104_gcc">
    <title>MacOSX10.4 gccで共有ライブラリを作る</title>
    <link>http://www.fraction.jp/log/archives/2007/11/16/MacOSX104_gcc</link>
    <description>Macでjni用の共有ライブラリをコンパイルする時のメモ。gcc -dynamiclib -o libbar.jnilib -I /System/Library/Frameworks/JavaVM.framework/Headers bar.c参考2007-03-03 - がおがおMacOSX(Tiger)におけるJNIを利用したネイティブコード実行方法 « ryan’s blog...</description>
    <content:encoded><![CDATA[
        <p>Macでjni用の共有ライブラリをコンパイルする時のメモ。</p>
<pre>gcc -dynamiclib -o libbar.jnilib -I /System/Library/Frameworks/JavaVM.framework/Headers bar.c</pre>
<h2>参考</h2>
<ul><li><a href="http://d.hatena.ne.jp/misuzukamio/20070303#p1">2007-03-03 - がおがお</a></li><li><a href="http://ryan5500.wordpress.com/2007/08/15/macosxtiger%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bjni%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%83%8D%E3%82%A4%E3%83%86%E3%82%A3%E3%83%96%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%E6%96%B9/">MacOSX(Tiger)におけるJNIを利用したネイティブコード実行方法 « ryan’s blog</a></li></ul>

    ]]></content:encoded>
    <dc:subject>Apple</dc:subject>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-11-16T06:51:37+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/10/15/Wizard_Selection_Page">
    <title>複数のウィザードを選択するウィザード</title>
    <link>http://www.fraction.jp/log/archives/2007/10/15/Wizard_Selection_Page</link>
    <description>概要Eclipse プラグイン作成時、複数のウィザードを選択できるウィザードを実装する際のメモ。IWizard実装の参考org.eclipse.ui.internal.dialogs.NewWizardウィザードを選択するページの実装方法org.eclipse.jface.wizard.WizardSelectionPageorg.eclipse.ui.internal.dialogs.WorkbenchWizardSelectionPageorg.eclipse.ui.internal.dial...</description>
    <content:encoded><![CDATA[
        <h2>概要</h2>
<p>Eclipse プラグイン作成時、複数のウィザードを選択できるウィザードを実装する際のメモ。</p>
<h2>IWizard実装の参考</h2>
<ul><li>org.eclipse.ui.internal.dialogs.NewWizard</li></ul>
<h2>ウィザードを選択するページの実装方法</h2>
<ul><li>org.eclipse.jface.wizard.WizardSelectionPage</li><ul><li>org.eclipse.ui.internal.dialogs.WorkbenchWizardSelectionPage</li><ul><li>org.eclipse.ui.internal.dialogs.NewWizardSelectionPage</li></ul></ul></ul>

    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-10-15T03:46:34+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/08/30/Change_blog_backend_to_Rails_from_Java">
    <title>ブログのバックエンドをJavaからRailsに</title>
    <link>http://www.fraction.jp/log/archives/2007/08/30/Change_blog_backend_to_Rails_from_Java</link>
    <description>ブログのバックエンドをJavaからRailsに変更した。なんでJavaからRailsに？どちらもHTMLを静的に生成するタイプで自作のブログウェアなんだけど、Javaで作った方は開発環境のインストールやらなにやらが面倒すぎて改善する気がなくなっちゃったので、スパムの対応やらバグ修正が後手後手になりつつあり、心機一転、Railsで開発し直した。どのくらい開発環境をインストールするのが面倒か？私はしょっちゅう使用マシンを変更したり、OSの再インストールしたり、別のマシンを使ったりしているので、その度に...</description>
    <content:encoded><![CDATA[
        <p><img src="/log/2007/08/rana_prunus.png" width="320" height="200" alt="rana_prunus.png" /></p>
<p>ブログのバックエンドをJavaからRailsに変更した。</p>
<h2>なんでJavaからRailsに？</h2>
<p>どちらもHTMLを静的に生成するタイプで<strong>自作</strong>のブログウェアなんだけど、Javaで作った方は開発環境のインストールやらなにやらが面倒すぎて改善する気がなくなっちゃったので、スパムの対応やらバグ修正が後手後手になりつつあり、心機一転、Railsで開発し直した。</p>
<h2>どのくらい開発環境をインストールするのが面倒か？</h2>
<p>私はしょっちゅう使用マシンを変更したり、OSの再インストールしたり、別のマシンを使ったりしているので、その度に開発環境をゼロからインストールし直す必要がある。なので開発環境のインストールのしやすさは開発スピードとやる気に直結する大きな問題なのだ。</p>
<p>ちなみに以下の場合は、私がブログのバックエンドを開発するためにインストールしていた開発環境であって、また別の場合にはJavaの方が簡単な場合も多々あるだろう。たぶん。</p>
<h3>Javaの場合</h3>
<ol><li>最新のJavaのインストール</li><li>Mavenのインストール</li><li>Tomcatのインストール</li><li>MySQLのインストール</li><li>Eclipseのインストール</li><ol><li>WTPのインストール</li><li>Maven用Eclipseプラグインのインストール</li><li>Subclipseのインストール</li></ol></ol>
<h3>Railsの場合</h3>
<ol><li>MacPortsのインストール</li><li>MySQLのインストール</li><li>Subversionのインストール</li><li>rubyのインストール</li><li>gemのインストール</li><ol><li>railsのインストール</li><li>依存ライブラリのインストール</li></ol><li>TextMateのインストール</li></ol>
<h2>まとめ</h2>
<p>なんか書き出してみるとたいしてステップ数は変わらない罠。けどなんでJavaの場合あんなに気が重く感じるのだろう？</p>
<p>大きな違いはRailsの場合はその作業のほとんどをターミナル上からコマンドで行ってるってことなんだろうな。MavenにしろTomcatにしろEclipseにしろEclipseプラグインにしろ、全部バラバラのUIからマウス使って作業してる。</p>
<p>Javaの場合もそのインストール行程を全部スクリプトかなんかにまとめちゃっても良いのかもしれないけど、それをメンテするのも結構なコストかかるんだよね。</p>

    ]]></content:encoded>
    <dc:subject>Rana</dc:subject>
    <dc:subject>Program/Java</dc:subject>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-08-30T06:44:00+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/06/1153">
    <title>ListViewerとモデルの内容を同期する</title>
    <link>http://www.fraction.jp/log/archives/2007/06/1153</link>
    <description>概要JFace Data Bindingを使ってJFaceのListViewerの表示内容をListの内容が変わる度に変更する。実装org.eclipse.swt.widgets.List list = ...// SWTのListウィジェットをJFaceのViewerでラップする。ListViewer listViewer = new ListViewer(list);// ObservableList用のコンテントプロバイダをセットする。ObservableListContentProvide...</description>
    <content:encoded><![CDATA[
        <h2>概要</h2>
<p>JFace Data Bindingを使ってJFaceのListViewerの表示内容をListの内容が変わる度に変更する。</p>
<h2>実装</h2>
<pre><code class='prettyprint'>
org.eclipse.swt.widgets.List list = ...
// SWTのListウィジェットをJFaceのViewerでラップする。
ListViewer listViewer = new ListViewer(list);

// ObservableList用のコンテントプロバイダをセットする。
ObservableListContentProvider contentProvider = 
				new ObservableListContentProvider();
listViewer.setContentProvider(contentProvider);

// 表示するデータ。
ObservableList domain = new WritableList();

// 表示するデータをViewerにセットする。
listViewer.setInput(domain);
</code></pre>
<p>これでdomain.add()やdomain.remove()する度にlistViewerにdomainの変更が通知されて表示内容が更新される。</p>

    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-06-14T02:18:18+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/05/1131">
    <title>JSON文字列とJavaオブジェクトとの相互変換</title>
    <link>http://www.fraction.jp/log/archives/2007/05/1131</link>
    <description>前置きJSON文字列とJavaオブジェクトとの相互変換することができるJSON-libは、Java以外のアプリケーションとインターネット経由であれこれデータをやりとりするのになかなかシンプルで良い。gihyo.jpの記事で出ている例のようにクライアントのJavaScriptとやりとりするサーバを開発するときなどはそのままスムーズに利用することができる。しかし、今度はJavaでJSON形式で公開されているWebAPIを利用する際にたまに歯がゆい思いをすることがある。{    first_name: ...</description>
    <content:encoded><![CDATA[
        <h2>前置き</h2>
<p>JSON文字列とJavaオブジェクトとの相互変換することができる<a href='http://json-lib.sourceforge.net/'>JSON-lib</a>は、Java以外のアプリケーションとインターネット経由であれこれデータをやりとりするのになかなかシンプルで良い。</p>
<p><a href="http://gihyo.jp/dev/serial/01/awdp/0002">gihyo.jpの記事</a>で出ている例のようにクライアントのJavaScriptとやりとりするサーバを開発するときなどはそのままスムーズに利用することができる。</p>
<p>しかし、今度はJavaでJSON形式で公開されているWebAPIを利用する際にたまに歯がゆい思いをすることがある。</p>
<pre>{
    first_name: 'Yuan',
    last_name: 'Ying'
    age: 17
}</pre>
<p>例えば、上のようなJSONオブジェクトを返すWebAPIをJavaのクライアントから利用したかった場合、</p>
<pre><code class="prettyprint">class Person {
    private String firstName;
    private String lastName;
    private int age;
    // and setter and getter...
}</code></pre>
<p>上記のようなPersonクラスにマッピングしたくなるのが人情というものだろう。</p>
<p>けどそのままではうまくいかないハズ。</p>
<h2>CamelCase</h2>
<p>なぜなら、JSONオブジェクトのプロパティはアンダースコアで単語と単語を分けているが、PersonクラスのプロパティはCamelCase形式だから。なのでPersonクラスを以下のように書き換えればうまくいく。</p>
<pre><code class="prettyprint">class Person {
    private String first_name;
    private String last_name;
    private int age;
    // and setter and getter...
}</code></pre>
<p><strong>けどすっごくダサイ</strong>。</p>

<h2>JavaIdentifierTransformer</h2>
<p>JSON-libではそんな場合に備えて<code>net.sf.json.util.JavaIdentifierTransformer</code>というクラスが用意されている。このクラスはJSONオブジェクトをJavaクラスに変換する際にプロパティ名も変換してくれる。</p>
<p>デフォルトでは5つの変換方法が定義されていて、利用する際には以下のようにJSONUtilsクラスに登録する必要がある。</p>
<pre><code class="prettyprint">JSONUtils.setJavaIdentifierTransformer(JavaIdentifierTransformer.CAMEL_CASE);

JSONObject json = ...;
Person person = JSONObject.toBean( json, Person.class, classMap ); </code></pre>
<p>上記のようにアンダースコアなプロパティ名をCamelCase形式変換してくれるJavaIdentifierTransformerはデフォルトでは用意されていないので自分で用意する必要がある。</p>
<pre><code class="prettyprint">import net.sf.json.util.JavaIdentifierTransformer;

/**
 * @author yuanying
 *
 */
public class CamelCaseJavaIdentifierTransformer extends
		JavaIdentifierTransformer {

	/* (non-Javadoc)
	 * @see net.sf.json.util.JavaIdentifierTransformer#transformToJavaIdentifier(java.lang.String)
	 */
	@Override
	public String transformToJavaIdentifier(String str)       {
         if( str == null ){
            return null;
         }

         String str2 = shaveOffNonJavaIdentifierStartChars( str );

         char[] chars = str2.toCharArray();
         int pos = 0;
         StringBuffer buf = new StringBuffer();
         boolean toUpperCaseNextChar = false;
         while( pos < chars.length ){
            if( !Character.isJavaIdentifierPart( chars[pos] )
            	  || (chars[pos] == '_')
                  || Character.isWhitespace( chars[pos] ) ){
               toUpperCaseNextChar = true;
            }else{
               if( toUpperCaseNextChar ){
                  buf.append( Character.toUpperCase( chars[pos] ) );
                  toUpperCaseNextChar = false;
               }else{
                  buf.append( chars[pos] );
               }
            }
            pos++;
         }
         return buf.toString();
      }
}</code></pre>
<h2>バグ発見</h2>
<p>上記のクラスを試してみると、うまくいかない。何故か知らんが<a href='http://ja.wikipedia.org/wiki/%E3%81%AC%E3%82%8B%E3%81%BD'>ぬるぽ</a>が出る。</p>
<p>仕方なしにJSON-libのソースを読んでみるに、JSON-lib 1.1の<code>net.sf.json.JSONObject</code>の513行目と598行目にバグがあるとしか思えない。</p>
<p>以下のように直す。</p>
<pre><code class="prettyprint">
Class type = (Class) props.get( name );
// FIX Class type = (Class) props.get( key );</code></pre>
<p>これでうまくいった。</p>
    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-05-16T06:29:27+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/04/1111">
    <title>PluginRegistryで遊ぶ</title>
    <link>http://www.fraction.jp/log/archives/2007/04/1111</link>
    <description>概要IPluginModelBaseを利用して、MANIFEST.MFファイルやplugin.xmlを弄る。問題点Eclipseでプラグインを開発するためのプラグイン、もしくはEclipseRCPを開発するためのプラグイン(Eclipse使ってるとメタな視点が多くなるのは気のせいか…)を開発しようとすると、どうしてもplugin.xmlやMANIFEST.MFファイルを弄って、Javaのコード上から拡張の宣言やプラグインの依存関係を追加する必要が出てくる。Eclipse SDK3.2以前のバージョ...</description>
    <content:encoded><![CDATA[
        <p><img src='/log/2007/04/plugin_registry.jpg' width='350' height='245'/></p>
<h2>概要</h2>
<p>IPluginModelBaseを利用して、MANIFEST.MFファイルやplugin.xmlを弄る。</p>
<h2>問題点</h2>
<p>Eclipseでプラグインを開発するためのプラグイン、もしくはEclipseRCPを開発するためのプラグイン(Eclipse使ってるとメタな視点が多くなるのは気のせいか…)を開発しようとすると、どうしてもplugin.xmlやMANIFEST.MFファイルを弄って、Javaのコード上から拡張の宣言やプラグインの依存関係を追加する必要が出てくる。</p>
<p>Eclipse SDK3.2以前のバージョンにおいて、plugin.xmlやMANIFEST.MFを弄ろうとすると以下の方法しかなかった。</p>
<ul><li>自分でplugin.xmlのXMLをパースしたり、MANIFEST.MFをパーすする。</li><li>PDEのinternalなパッケージ内にあるIPluginModelBaseインタフェースの実装を利用する。</li></ul>
<p>一番目の方法はplugin.xmlの構造が変わったりバージョンが変わったりするのにビクビクすることになるし、二番目の方法もまた未公開のAPIを利用することになるのでバージョンが変わるたびにそのAPIがいつなくなるのかビクビクすることになるのでよろしくない。</p>
<h2>解決策</h2>
<p>Eclipse3.3になってPDEにMANIFEST.MFやplugin.xmlを弄るためのクラスであるIPluginModelBaseを取得するためのクラスである、PluginRegistryが加わった。このクラスを使うと安全にプラグインを弄ることができる。</p>
<pre><code class="prettyprint">
// pluginを弄るプロジェクトを取得する。
IProject project =...;
// プロジェクトからpluginモデルを取得する。
IPluginModelBase pluginModel = PluginRegistry.findModel(project);
IPluginBase plugin = pluginModel.getPluginBase();

// pluginに org.jalcedo.lingr というIDのプラグインを依存するプラグインとして追加する。
IPluginImport importNode = pluginModel.getPluginFactory().createImport();
importNode.setId("org.jalcedo.lingr");
plugin.add(importNode);</code></pre>

    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-04-20T01:55:47+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2007/04/1109">
    <title>Eclipseのプラグインを共有する</title>
    <link>http://www.fraction.jp/log/archives/2007/04/1109</link>
    <description>概要いくつかの理由があって、Eclipseのバージョンを複数同時利用している場合、それぞれのEclipseで同じプラグインを共有することができる。わざわざ毎回EclipseをインストールするたびにEclipseniプラグインを新たにインストールする必要はない模様。私の場合Eclipseのプラグインを開発していると、複数のEclipseのバージョンで動作の確認を行う必要がある。例えば私は現在自分のPCに以下のバージョンのEclipseをインストールしている。Eclipse 3.2.1Eclipse ...</description>
    <content:encoded><![CDATA[
        <h2>概要</h2>
<p>いくつかの理由があって、Eclipseのバージョンを複数同時利用している場合、それぞれのEclipseで同じプラグインを共有することができる。わざわざ毎回EclipseをインストールするたびにEclipseniプラグインを新たにインストールする必要はない模様。</p>
<h2>私の場合</h2>
<p>Eclipseのプラグインを開発していると、複数のEclipseのバージョンで動作の確認を行う必要がある。例えば私は現在自分のPCに以下のバージョンのEclipseをインストールしている。</p>
<ol><li>Eclipse 3.2.1</li><li>Eclipse 3.2.2</li><li>Eclipse 3.3M4</li><li>Eclipse 3.3M5</li><li>Eclipse 3.3M6</li></ol>
<p>開発しているプラグインが例えばWTPやDTPに依存していた場合、すべてのEclipseにWTPとDTPをインストールしなければならない。また、Subversionのレポジトリからソースコードをダウンロードしようとした場合、<a href='http://subclipse.tigris.org/'>Subclipse</a>をインストールしたりと、細い回線を利用していたらかなりダウンロードに時間がかかる。しかも同じものを5回も！</p>
<p>いったんダウンロードしたらそれをコピーしてそれぞれのEclipseにインストールすればいいじゃんという意見もあるかもしれないけど、それはそれで、同じものを5個もコピーするなんてHDDの無駄すぎる。てか<a href='http://www.rubyist.net/~matz/20051129.html#p01'>DRY</a>じゃないよ。</p>
<h2>Extension Location</h2>
<p>ということで、EclipseのExtension Locationという仕組みを利用してやる。</p>
<p>メニューの「Help」-「Software Updates」-「Manage Configuration」を選択するとダイアログが現れる。ここでコンテキストメニューの「Add」-「Extension Location」を選択してExtension Locationを追加してやればOK。これを同時利用しているEclipse全部に設定してやる。(勿論追加する場所はすべてのEclipseで同じパスにしておく必要がある。)</p>
<p><img src='/log/2007/04/extension-location.png' width='320' height='220'/></p>
<h2>Plug-inの追加</h2>
<p>そしてプラグインの追加の際に、そのExtension Locationに該当のプラグインをインストールしてやれば、そのExtension Locationを参照しているEclipse間でプラグインを共有できる。</p>
<p><img src='/log/2007/04/install-plugins.png' width='300' height='254'/></p>
<p>Update Siteからインストールする場合は、ウィザードの最後で「Change Location」ボタンを押すことでそのプラグインをインストールする場所が選択できるので、ここから共有するプラグインをExtension Locationに指定する。</p>
<p>Change Locationはプラグインごと(Featureごと)指定する必要があるので注意。複数のプラグインをインストールして共有したい場合は、それぞれのプラグインを選択してChange Locationしてやる必要がある。</p>

    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2007-04-16T02:10:12+09:00</dc:date>
  </item>
</rdf:RDF>
