<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>tdtshのブログ&#187; java</title>
	<atom:link href="http://www.tdtsh.com/blog/archives/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.tdtsh.com/blog</link>
	<description>ソーシャルメディアとか スレートとか Google App Engine とかの事の備忘録</description>
	<lastBuildDate>Tue, 07 Feb 2012 05:03:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/category/java/feed" />
		<item>
		<title>eclipse の viPlugin と キーバインドの変更</title>
		<link>http://www.tdtsh.com/blog/archives/1441</link>
		<comments>http://www.tdtsh.com/blog/archives/1441#comments</comments>
		<pubDate>Fri, 04 Nov 2011 07:28:39 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[macbookair]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1441</guid>
		<description><![CDATA[Windows機でテキスト書くときはgvimです。 なので、つい j とか k とか Ctrl+FとかCtrl+B とか打ってしまいます。 その点、GoogleのWEBサービスはGMailをはじめショートカットがVimm [...]]]></description>
			<content:encoded><![CDATA[<p>Windows機でテキスト書くときはgvimです。<br />
なので、つい j とか k とか Ctrl+FとかCtrl+B とか打ってしまいます。<br />
その点、GoogleのWEBサービスはGMailをはじめショートカットがVimmerにやさしいのですきです。</p>
<p>最近は Macbook Air を触ることが多いですが、面倒くさくて gvim 入れてないです。<br />
もっぱら eclipse を頑張って使っていこうとしています。<br />
なので、eclipse もなるべく vim ライクなキーバインドにしたい訳です。</p>
<p>eclipseの場合は、<a href="http://www.viplugin.com/viplugin/" target="_blank">viPlugin</a>を使えば、マァそこそこいけます。<br />
もう数年無料のままで使ってましたが、いい加減ちゃんとしようと思ってランセンス料を支払いました。<br />
PayPalで一瞬でした。15ユーロだったかな？支払い後、作者からPayPalに登録してあるメールアドレス宛にライセンスキーが送られてきます。<br />
サイトのFAQには2日位かかると書いていますが、結構すぐ送ってくれました。</p>
<p>送られてきた[viPlugin.licence] を、eclipseのインストールディレクトリ(Mac は私の環境では /Applications/eclipse/ )に配置してeclipseを起動すればOKです。</p>
<p>あとは、eclipse のキーバインドでvimと衝突しているものを、適宜書き換えていく感じです。<br />
[設定] &#8211; [一般] &#8211; [キー] で変更できます。<br />
気がついた所では、Ctrl+F が検索に割り当てられているんで、Ctrl+Bと共にページ送りに設定した位です。<br />
少しづつ良い感じに仕上げていこうと思います。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1441" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1441/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1441" />
	</item>
		<item>
		<title>GAE/J で Python の bulkloader をつかってみる</title>
		<link>http://www.tdtsh.com/blog/archives/1359</link>
		<comments>http://www.tdtsh.com/blog/archives/1359#comments</comments>
		<pubDate>Tue, 16 Aug 2011 11:46:29 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[クラウド]]></category>
		<category><![CDATA[開発環境]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1359</guid>
		<description><![CDATA[&#160; Java版のbulkloaderが出ると信じて待つこと1年以上、for businessもスベッてしまい、いまだその気配もなく。 痺れを切らして、普段 GAE/Jな私が、Python版のbulkloader [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;<br />
Java版のbulkloaderが出ると信じて待つこと1年以上、for businessもスベッてしまい、いまだその気配もなく。</p>
<p>痺れを切らして、普段 GAE/Jな私が、<a href="http://code.google.com/intl/ja/appengine/docs/python/tools/uploadingdata.html" target="_blank">Python版のbulkloader</a>を使ってみました。</p>
<p>普段GAE/Jなので、<a href="http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html" target="_blank">スタートガイド Python 開発環境 / Google code</a>を参考に、環境作りからはじめます。</p>
<p>&nbsp;</p>
<h4>Pythonをインストール</h4>
<p><a href="http://www.python.org/download/" target="_blank">Download &#8211; Python</a>から手繰り、私の場合はWindows (未だにXPデス)なので、Windows x86 MSI Installer なんをインストールします。最新は2.7.2の様です。<br />
Macなら最初から入っていますし、Linuxも大概のディストリビューションで最初から入っています。</p>
<p>&nbsp;</p>
<h4>Google App Engine SDK for Python をインストール</h4>
<p>GAE/JなヒトでもPython版SDKを既に入れている方もいるかもしれませんが、入れてないヒトは入れましょう。</p>
<p><a href="http://code.google.com/intl/ja/appengine/downloads.html" target="_blank">Google App Engine SDK のダウンロード</a>から、Google App Engine SDK for Pythonをインストールします。最新は1.5.2でした。</p>
<p>とりあえずCドライブ直下に置きました。<br />
インストールディレクトリは c:\appengine-python-sdk-1.5.2 となりました。<br />
これを環境変数PATHに追加しときます。</p>
<p>&nbsp;</p>
<h4>GAE/J側の準備</h4>
<p>既存プロジェクトの web.xmlを編集し、GAE/J側のRemoteApiServletを有効化？します。</p>
<pre>
	&lt;servlet&gt;
		&lt;servlet-name&gt;remoteapi&lt;/servlet-name&gt;
		&lt;servlet-class&gt;com.google.apphosting.utils.remoteapi.RemoteApiServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;remoteapi&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/remote_api&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
</pre>
<p>勿論この後デプロイします。</p>
<p>&nbsp;</p>
<h4>設定ファイル (yaml) を作成</h4>
<p>cmd.exe を起動し、appcfg.py で create_bulkloader_config を実行します。</p>
<pre>
cd c:\appengine-python-sdk-1.5.2
appcfg.py create_bulkloader_config --url=http://{appId}.appspot.com/remote_api --application={appId} --filename=config.yml
</pre>
<p>High Replicationの場合は、&#8211;application の引数のアタマに s~ をつけないといけないみたいです。<br />
こんな風に。</p>
<pre>
cd c:\appengine-python-sdk-1.5.2
appcfg.py create_bulkloader_config --url=http://{appId}.appspot.com/remote_api --application=s~{appId} --filename=config.yml
</pre>
<p>自動生成されたconfig.yml には、そのとき appengine側に存在する kind のスキーマを反映したものになっているようです。</p>
<p>アップロード/ダウンロードするkindが限定されている場合などは、このymlファイルを編集して対象kindだけのymlファイルを作っても良い。</p>
<p>自動生成されたymlファイルは、TODO: の記述がいくつかあり、ココを適宜修正する必要があります。<br />
最低でもconnector (と connector_options )を編集します。</p>
<pre>
  connector: # TODO: Choose a connector here: csv, simplexml, etc...
  connector_options:
    # TODO: Add connector options here--these are specific to each connector.
↓
  connector: csv
  connector_options:
    encoding: utf-8
</pre>
<p>&nbsp;</p>
<h4>CSVアップロード</h4>
<p>ダウンロードするには、こんな感じ。</p>
<pre>
appcfg.py download_data --filename=test2.csv --config_file=test.yml --url=http://{appId}.appspot.com/remote_api --application=s~{appId} --kind={ClassNameOfKind} -v
</pre>
<p>アップロードはこんな感じ。</p>
<pre>
appcfg.py upload_data --filename=test.csv --config_file=test.yml --url=http://{appId}.appspot.com/remote_api --application=s~{appId} --kind={ClassNameOfKind} -v
</pre>
<h4>参考にさせて頂いた先人の知恵</h4>
<p><a href="http://pomu0325.blogspot.com/2011/02/gae-bulkloadergaej.html" target="_blank">pomu0325: [GAE] bulkloaderをGAE/Jで使う</a></p>
<p><a href="http://d.hatena.ne.jp/zetta1985/20100119/1263911416" target="_blank">Javaプログラマの為のGAE/py bulkloader &#8211; GAE/py環境設定 &#8211; - 高卒文系プログラマの日常 by zetta1985</a></p>
<p><a href="http://isann.blog2.fc2.com/blog-category-0.html" target="_blank">きのふよりけふ、けふよりあした　 未分類</a></p>
<p><a href="http://d.hatena.ne.jp/noriboz/20110121/1295571732" target="_blank">CSVファイルのデータをアップロードする方法 &#8211; 気楽に開発メモ</a></p>
<p><a href="http://ikaisays.com/2010/06/10/using-the-bulkloader-with-java-app-engine/" target="_blank">Using the bulkloader with Java App Engine &#8211; Ikai Lan says</a></p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1359" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1359/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1359" />
	</item>
		<item>
		<title>Google App Engine の Backends で 長時間、大規模な処理が可能に</title>
		<link>http://www.tdtsh.com/blog/archives/1272</link>
		<comments>http://www.tdtsh.com/blog/archives/1272#comments</comments>
		<pubDate>Thu, 12 May 2011 02:30:19 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1272</guid>
		<description><![CDATA[Google App Engine 1.5.0 で、Backendsなるものが使える様になったそうですね。 Backends: Until now all App Engine applications have bee [...]]]></description>
			<content:encoded><![CDATA[<p>Google App Engine 1.5.0 で、Backendsなるものが使える様になったそうですね。</p>
<blockquote><p>
	Backends: Until now all App Engine applications have been running on short-lived dynamic instances that we spin up and down in response to application requests.<br />
	This is great for building scalable web applications, but has a number of limitations if you are looking to build larger, long-lived, and/or memory intensive infrastructure.<br />
	With 1.5.0, we are introducing Backends which will allow developers to do precisely this!<br />
	Backends are developer-controlled, long-running, addressable sets of instances which are as large as the developer specifies.<br />
	There are no request deadlines, they can be started and stopped (or dynamically start when called), they can use between 128M and 1G of memory and proportional CPU. </p>
<p><a href="http://googleappengine.blogspot.com/2011/05/app-engine-150-release.html" target="_blank">Google App Engine Blog: App Engine 1.5.0 Release</a>
</p></blockquote>
<p>意訳はこんな感じでしょうか。</p>
<blockquote><p>
バックエンド：<br />
今までは、すべてのApp Engineのアプリケーションは、アプリケーションのリクエストに応じて spin up と spin down する短命で動的なインスタンス上で実行されています。</p>
<p>これはスケーラブルなWebアプリケーションを構築するための素晴らしい仕組みですが、大規模、長寿命、および/または メモリを集中的に使用するインフラストラクチャを構築したい場合には制限となります。 </p>
<p>1.5.0からは、我々は「バックエンド」を導入することで、開発者が正確にこれを行うにできるようになるようにしました！</p>
<p>バックエンドは、開発者が制御でき、長時間実行可能で、URLを指定でき、開発者が大きさを指定できるインスタンスです。</p>
<p>リクエストのデッドラインはありません。<br />
起動、停止が可能です（またはリクエスト時に動的起動ができます）<br />
128M～1Gのメモリとそれに見合ったCPUを使用することができます。
</p></blockquote>
<p>判ったような判らんような。<br />
アドホックに大規模な処理を行いたい場合とかに使えるかも。</p>
<p><a href="http://www.ventureaccess.com/service/tech_sample.phtml" target="_blank">NEW YORK TIMES が過去記事の電子化を行うとき、自社見積もりでは14年かかる所を、Amazon EC2で24時間以内、240ドルでできた</a>、と言う話が、数年前にAmazon EC2の説明をするときよく引き合いにだされていました。</p>
<p>「PDF化」は兎も角として、大量のリソースを使って大量処理みたいな事をappengineで出来る様になるという理解でいいのかな。</p>
<p>GAEもどんどん出来る事が増えてきましたね。</p>
<p>■参考サイト<br />
<a href="http://code.google.com/intl/ja/appengine/docs/java/backends/overview.html" target="_blank">Backends Java API Overview &#8211; Google App Engine &#8211; Google Code</a></p>
<p><a href="http://d.hatena.ne.jp/kagigotonet/20110511/1305103829" target="_blank">Google APP Engine の新機能Backendsの解説 &#8211; TechTalkManiacs</a></p>
<p><a href="http://elekmole.blogspot.com/2011/05/backends-java.html" target="_blank">今は昔のkonjak翻訳 φ(・ω・? )…: Backends (Java)</a></p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1272" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1272/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1272" />
	</item>
		<item>
		<title>openid4java で OpenID OP のサンプルを動かしてみる</title>
		<link>http://www.tdtsh.com/blog/archives/1208</link>
		<comments>http://www.tdtsh.com/blog/archives/1208#comments</comments>
		<pubDate>Thu, 17 Mar 2011 10:43:01 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[OpenID]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1208</guid>
		<description><![CDATA[openid4javaのサンプルを動かしてみる 事前にJDKとmeven2のインストールが必要です。 openid4javaのDownloadsから、[openid4java-full-0.9.5.593.tar.gz] [...]]]></description>
			<content:encoded><![CDATA[<h4>openid4javaのサンプルを動かしてみる</h4>
<p>事前にJDKとmeven2のインストールが必要です。</p>
<p><a href="http://code.google.com/p/openid4java/" target="_blank">openid4java</a>の<a href="http://code.google.com/p/openid4java/downloads/list" target="_blank">Downloads</a>から、[openid4java-full-0.9.5.593.tar.gz]をダウンロードし、C:\<br />
にでも解凍する。</p>
<p>CMD.exe を起動し以下を実行。</p>
<pre>
cd c:\openid4java-full-0.9.5.593\samples\simple-openid
mvn jetty:run
</pre>
<pre>

http://localhost:8080/simple-openid
</pre>
<p>をブラウズすると、OpenID RPのテストが出来ます。Yahoo OpenID なり mixiIDなりで試します。</p>
<p>OpenID プロバイダを試すには、上記URLにて、これ</p>
<pre>

http://localhost:8080/simple-openid/user.jsp
</pre>
<p>を入力します。</p>
<p>次回はコレを参考に、OpenID プロバイダを作ってみようと思います。</p>
<p>
&nbsp;</p>
<p>参考サイト</p>
<p><a href="http://www.ibm.com/developerworks/jp/java/library/j-openid/" target="_blank">Java Web アプリケーションのための OpenID: 第1回 / IBM</a></p>
<p><a href="http://www.ibm.com/developerworks/jp/java/library/j-openid2/" target="_blank">Java Web アプリケーションのための OpenID: 第2回 / IBM</a></p>
<p><a href="http://d.hatena.ne.jp/travelershouse/20100711/1278810757" target="_balnk">WinstoneでOpenID4Java &#8211; 不悔必省</a></p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1208" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1208/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1208" />
	</item>
		<item>
		<title>eclipse の Google App Engine プロジェクトを実行した時リモートから見たい</title>
		<link>http://www.tdtsh.com/blog/archives/1157</link>
		<comments>http://www.tdtsh.com/blog/archives/1157#comments</comments>
		<pubDate>Thu, 03 Mar 2011 05:06:40 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[slim3]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1157</guid>
		<description><![CDATA[良く忘れるので、メモ。 eclipseを起動 プロジェクトを右クリック [実行(R)] &#8211; [実行の構成(N)] をクリック 実行構成の左ペインより[Web アプリケーション] &#8211; [プロジェクト [...]]]></description>
			<content:encoded><![CDATA[<p>良く忘れるので、メモ。</p>
<ol>
<li>
eclipseを起動
</li>
<li>
プロジェクトを右クリック
</li>
<li>
[実行(R)] &#8211; [実行の構成(N)] をクリック
</li>
<li>
実行構成の左ペインより[Web アプリケーション] &#8211; [プロジェクト名]をクリック
</li>
<li>
[(x)=引数]タブをクリック
</li>
<li>
- [プログラムの引数]に[--address=0.0.0.0 ]を追記する
</li>
<ul>
<li>	BEFORE<br />
		&#8211;port=8888 C:\path\to\workspace\yourproject\war
</li>
<li>	AFTER<br />
		&#8211;port=8888 &#8211;address=0.0.0.0 C:\path\to\\workspace\yourproject\war
</li>
</ul>
</ol>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1157" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1157/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1157" />
	</item>
		<item>
		<title>slim3のバージョンアップをする (1.0.7から1.0.8に更新)</title>
		<link>http://www.tdtsh.com/blog/archives/1154</link>
		<comments>http://www.tdtsh.com/blog/archives/1154#comments</comments>
		<pubDate>Wed, 02 Mar 2011 11:04:00 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[slim3]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1154</guid>
		<description><![CDATA[この手順は私が行ったことの記録として書いたものですので、誤りを含んでいる可能性があります。 実際の手順は、Slim3 日本語サイト(非公式)などを良く確認して行ってください。 ダウンロード slim3プロジェクト から、 [...]]]></description>
			<content:encoded><![CDATA[<p>この手順は私が行ったことの記録として書いたものですので、誤りを含んでいる可能性があります。</p>
<p>実際の手順は、<a href="http://sites.google.com/site/slim3documentja/documents/how-to-upgrade" target="_blank">Slim3 日本語サイト(非公式)</a>などを良く確認して行ってください。</p>
<h4>ダウンロード</h4>
<p><a href="http://code.google.com/p/slim3/downloads/list" target="_blank">slim3プロジェクト</a> から、slim3の最新版( 2011年3月2日現在 slim3-blank-1.0.8.zip ) をダウンロードして解凍する。</p>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<h4>jarファイルを置換</h4>
<p><b>slim3を置換</b><br />
下記のファイルをを削除し</p>
<pre>
	yourproject/war/WEB-INF/lib/slim3-1.0.7.jar
</pre>
<p>解凍したslim3のものをプロジェクト内のディレクトリにペーストする</p>
<pre>
	yourproject/war/WEB-INF/lib/slim3-1.0.8.jar
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>slim3-genを置換</b><br />
下記のファイルをを削除し</p>
<pre>
	yourproject/lib/slim3-gen-1.0.7.jar
</pre>
<p>解凍したslim3のものをプロジェクト内のディレクトリにペーストする</p>
<pre>
	yourproject/lib/slim3-gen-1.0.8.jar
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<p><b>slim3-*-sourceを置換</b><br />
下記のファイルをを削除し</p>
<pre>
	yourproject/libsrc/slim3-1.0.7-sources.jar
	yourproject/libsrc/slim3-gen-1.0.7-sources.jar
</pre>
<p>解凍したslim3のものをプロジェクト内のディレクトリにペーストする</p>
<pre>
	yourproject/libsrc/slim3-1.0.8-sources.jar
	yourproject/libsrc/slim3-gen-1.0.8-sources.jar
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<h4>ビルドパスの変更</h4>
<p>eclipseを起動し、yourprojectプロジェクトを右クリック &#8211; [ビルド・パス(B)] &#8211; [ビルド・パスの構成(C)]をクリック</p>
<p>プロジェクトのプロパティー [Java のビルド・パス]が開くので、[ライブラリー(L)]タブを選択</p>
<p>下記を選択し[除去(R)]をクリック</p>
<pre>
	war/WEB-INF/lib/slim3-1.0.7.jar
</pre>
<p>左ペインの yourprojectプロジェクト の下記を右クリック</p>
<pre>
	war/WEB-INF/lib/slim3-1.0.8.jar
</pre>
<p>[ビルド・パス(B)] &#8211; [ビルド・パスに追加(A)]をクリック</p>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<h4>アノテーション処理のファクトリパスを変更</h4>
<p>パッケージ・エクスプローラにてyourprojectプロジェクトを選択する</p>
<p>[プロジェクト(P)] &#8211; [プロパティー(P)]をクリックする</p>
<p>[Javaコンパイラー] &#8211; [注釈処理] &#8211; [ファクトリーパス]をクリックする</p>
<p>[JAR の追加(J)]をクリックする</p>
<p>[JARの選択]ダイアログにて、[yourproject] &#8211; [lib] &#8211; [slim3-gen-1.0.8.jar]を選択し、[適用(A)]をクリックする</p>
<p>[OK]をクリックする</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1154" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1154/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1154" />
	</item>
		<item>
		<title>CentOS 5.5 のserifフォントで「葉」のグリフがおかしい</title>
		<link>http://www.tdtsh.com/blog/archives/1023</link>
		<comments>http://www.tdtsh.com/blog/archives/1023#comments</comments>
		<pubDate>Wed, 01 Dec 2010 04:26:07 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[インフラ]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=1023</guid>
		<description><![CDATA[CentOS 5.5 で動かしているサーブレットコンテナで、つまりjavaで、論理フォントにserifを指定して日本語を扱っている時に気がついたんですが、「葉」が文字化けみたいになっちゃいます。 こんなん ※背景は気にし [...]]]></description>
			<content:encoded><![CDATA[<p>CentOS 5.5 で動かしているサーブレットコンテナで、つまりjavaで、論理フォントにserifを指定して日本語を扱っている時に気がついたんですが、「葉」が文字化けみたいになっちゃいます。</p>
<blockquote><p>
こんなん<br />
<img src="http://www.tdtsh.com/blog/wp-content/uploads/2010/12/01_葉が文字化け.jpg" alt="葉がおかしい" title="葉がおかしい" width="118" height="123" class="aligncenter size-full wp-image-1025" /></p></blockquote>
<p>※背景は気にしないでください</p>
<p>で、そのCentOSでFirefoxを立ち上げてみたら、やっぱり「葉」がおかしい。<br />
どうやら、さざなみ明朝の「葉」のグリフがおかしいみたい。<br />
ちゃんと調べてないけど他にもあるかもしれない。</p>
<p>良い機会だから、もう少しマシなフォントを入れたのでメモしておきます。</p>
<p>
&nbsp;<br />
</p>
<hr />
<h4>IPAフォントをインストール</h4>
<p><a href="http://ossipedia.ipa.go.jp/ipafont/" target="_blank">http://ossipedia.ipa.go.jp/ipafont/</a> から IPAfont00302.zip をダウンロードして、</p>
<p>unzip IPAfont00302.zip<br />
cp ./IPAfont00302/*.ttf /usr/share/fonts/japanese/TrueType/<br />
fc-cache -fv</p>
<p>fc-list | grep IPA<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
#	IPAゴシック,IPAGothic:style=Regular<br />
#	IPA Pゴシック,IPAPGothic:style=Regular<br />
#	IPA明朝,IPAMincho:style=Regular<br />
#	IPA P明朝,IPAPMincho:style=Regular<br />
#&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>
&nbsp;<br />
</p>
<hr />
<p>
&nbsp;<br />
</p>
<hr />
<h4>jdkにでIPAフォントを使う</h4>
<p>これがハマリました。</p>
<p>JDK は 6u16 で、yum でインストールせず、 Sunのサイト、今は<br />
<a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Oracleのサイト</a>からダウンロードした jdk-6u16-linux-i586.bin で、過去の習慣から /usr/local/j2sdk/ でシンボリックリンク貼ってます。</p>
<p>fallback ディレクトリにリンクを貼ればいいらしいんで、やってみたんですが文字化け？は解消されませんでした。</p>
<p>mkdir -p /usr/local/j2sdk/jre/lib/fonts/fallback/<br />
ln -s /usr/share/fonts/japanese/TrueType/ipa*.ttf /usr/local/j2sdk/jre/lib/fonts/fallback/</p>
<p>で、fontconfig.properties.src を編集すれば良いらしいんで、やってみました。</p>
<pre>
vim /usr/local/j2sdk/jre/lib/fontconfig.properties.src
#--------------------------------------------------------------------
dialog.plain.japanese=IPA Gothic
dialog.bold.japanese=IPA Gothic
dialog.italic.japanese=IPA Gothic
dialog.bolditalic.japanese=IPA Gothic
sansserif.plain.japanese=IPA PGothic
sansserif.bold.japanese=IPA PGothic
sansserif.italic.japanese=IPA PGothic
sansserif.bolditalic.japanese=IPA PGothic
serif.plain.japanese=IPA PMincho
serif.bold.japanese=IPA PMincho
serif.italic.japanese=IPA PMincho
serif.bolditalic.japanese=IPA PMincho
monospaced.plain.japanese=IPA Gothic
monospaced.bold.japanese=IPA Gothic
monospaced.italic.japanese=IPA Gothic
monospaced.bolditalic.japanese=IPA Gothic
dialoginput.plain.japanese=IPA Gothic
dialoginput.bold.japanese=IPA Gothic
dialoginput.italic.japanese=IPA Gothic
dialoginput.bolditalic.japanese=IPA Gothic

# Search Sequences
#sequence.allfonts=latin-1
sequence.allfonts.x-euc-jp-linux=japanese,latin-1
sequence.allfonts.UTF-8.ja=japanese,latin-1
sequence.fallback=japanese

# Exclusion Ranges

# Font File Names
filename.IPA_Gothic=/usr/share/fonts/japanese/TrueType/ipag.ttf
filename.IPA_PGothic=/usr/share/fonts/japanese/TrueType/ipagp.ttf
filename.IPA_Mincho=/usr/share/fonts/japanese/TrueType/ipam.ttf
filename.IPA_PMincho=/usr/share/fonts/japanese/TrueType/ipamp.ttf
filename.Sazanami_Gothic=/usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf
filename.Sazanami_Mincho=/usr/share/fonts/japanese/TrueType/sazanami-mincho.ttf
#--------------------------------------------------------------------
</pre>
<p>が、コレでもダメでした。</p>
<p><a href="http://download.oracle.com/javase/1.5.0/docs/guide/intl/fontconfig.html">ここで</a>よくよく確認すると、設定ファイルは読み込む優先順位があるらしいじゃないですか。</p>
<p>なので、他のfontconfigファイルを移動して、編集したやつだけの状態にしたら、いけました。こんな方法で良いのかしら・・</p>
<p>mkdir -p /usr/local/j2sdk/jre/lib/old_fontconfig<br />
mv /usr/local/j2sdk/jre/lib/fontconfig.* /usr/local/j2sdk/jre/lib/old_fontconfig<br />
cp /usr/local/j2sdk/jre/lib/old_fontconfig/fontconfig.properties.src /usr/local/j2sdk/jre/lib/fontconfig.properties</p>
<p>
&nbsp;<br />
</p>
<hr />
<h4>一応CentOSのローカルでも使える様に</h4>
<pre>
vi /etc/fonts/conf.d/65-nonlatin.conf
#--------------------------------------------------------------------
&lt;fontconfig&gt;
	&lt;alias&gt;
		&lt;family&gt;serif&lt;/family&gt;
		&lt;prefer&gt;
			&lt;family&gt;IPAPMincho&lt;/family&gt;
			...
		&lt;/prefer&gt;
	&lt;/alias&gt;
	&lt;alias&gt;
		&lt;family&gt;sans-serif&lt;/family&gt;
		&lt;prefer&gt;
			&lt;family&gt;IPAPGothic&lt;/family&gt;
			...
		&lt;/prefer&gt;
	&lt;/alias&gt;
#--------------------------------------------------------------------
&lt;/fontconfig&gt;&lt;/pre&gt;
</pre>
<p>
&nbsp;<br />
</p>
<hr />
<h4>参考サイト</h4>
<p><a href="http://dev.j-de.net/blog/CentOS%20%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88">Blog: CentOSへの日本語フォントのインストール &#8211; Jade Developers</a></p>
<p><a href="http://wiki.livedoor.jp/linux_java_install/d/%A5%D5%A5%A9%A5%F3%A5%C8">フォント &#8211; Linux に Java(JRE 1.5) をインストールする方法 &#8211; livedoor Wiki（ウィキ）</a></p>
<p><a href="http://d.hatena.ne.jp/cloudcomputing/20091117/1258464666">centos上でブラウザのフォントを変えたい &#8211; cloudcomputingはおいしいよ</a></p>
<p><a href="http://tmcosmos.org/linux/centos/co5.html">CentOS 5 インストール個人的ノート</a></p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/1023" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/1023/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/1023" />
	</item>
		<item>
		<title>ROMEでRSSフィードを解析して簡易RSSリーダServletを作る</title>
		<link>http://www.tdtsh.com/blog/archives/941</link>
		<comments>http://www.tdtsh.com/blog/archives/941#comments</comments>
		<pubDate>Thu, 07 Oct 2010 15:10:56 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=941</guid>
		<description><![CDATA[javaでRSSフィードを解析したい時には、ROMEプロジェクトが便利です。 インストール]]></description>
			<content:encoded><![CDATA[<p>javaでRSSフィードを解析したい時には、ROMEプロジェクトが便利です。</p>
<h4>インストール</h4>
<p><a href="https://rome.dev.java.net/ target="_blank">Project ROME</a>からrome-1.0.jarをダウンロードして、クラスパスに配備します。</p>
<h4>Servletを作る</h4>
<p>やっつけ仕事でServletを作ってみます。<br />
<a href="http://blog.smartnetwork.co.jp/staff/node/19">先人の知恵</a>を参考にさせて頂きました。</p>
<p>ROMEプロジェクトと他人のコードという巨人の肩にのって、楽して遠方を見るのです。<br />
コピペプログラミングとも言います。</p>
<p><code></p>
<pre>
package my.package;

import java.net.URL;
import java.util.List;
import java.io.PrintWriter;
import java.io.IOException;

import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RSSReaderServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request,
						HttpServletResponse response)
		throws ServletException, IOException {

		String url = request.getParameter("url");
		if (url == null) {
			url = "http://www.j-cast.com/index.xml";
		}
		try {
			URL feedUrl = new URL(url);
			SyndFeedInput input = new SyndFeedInput();
			SyndFeed feed = input.build(new XmlReader(feedUrl.openStream()));
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter pw = response.getWriter();
			pw.print("&lt;html&gt;\n");
			pw.print("&lt;head&gt;\n");
			pw.print("&lt;title&gt; "+feed.getTitle()+"/ 簡易RSSリーダ&lt;/title&gt;\n");
			pw.print("&lt;/head&gt;\n");
			pw.print("&lt;body&gt;\n");
			pw.print("&lt;table&gt;\n");
			List&lt;SyndEntry&gt; entries = (List)feed.getEntries();
			for (SyndEntry entry : entries) {
				pw.print("&lt;tr&gt;\n");
				pw.print("&lt;td&gt;&lt;a href='"+entry.getUri()+"'&gt;"+entry.getTitle()+"&lt;/a&gt;&lt;/td&gt;\n");
				pw.print("&lt;td&gt;"+entry.getPublishedDate().toString()+"&lt;/td&gt;\n");
				pw.print("&lt;td&gt;"+entry.getDescription().getValue()+"&lt;/td&gt;\n");
				pw.print("&lt;/tr&gt;\n");
			}
			pw.print("&lt;/table&gt;\n");
			pw.print("&lt;/body&gt;\n");
			pw.print("&lt;/html&gt;\n");
			pw.close();
		} catch (Exception e) {
			//
		}
		return;
	}

}
</pre>
<p></code></p>
<p>うん、簡単です。</p>
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/941" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/941/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/941" />
	</item>
		<item>
		<title>java の AntiSamyでサニタイズ、任意のHTMLタグを許可しscriptタグとかを無効化</title>
		<link>http://www.tdtsh.com/blog/archives/883</link>
		<comments>http://www.tdtsh.com/blog/archives/883#comments</comments>
		<pubDate>Tue, 24 Aug 2010 11:08:25 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[slim3]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=883</guid>
		<description><![CDATA[一般公開するWEBサービスを作る場合、慣れてないと手がかかるのがセキュリティへの配慮です。 Google App Engineとか使っている時点でSQLインジェクションとかディレクトリ・トラバーサルとかOSコマンド・イン [...]]]></description>
			<content:encoded><![CDATA[<p>一般公開するWEBサービスを作る場合、慣れてないと手がかかるのがセキュリティへの配慮です。</p>
<p>Google App Engineとか使っている時点でSQLインジェクションとかディレクトリ・トラバーサルとかOSコマンド・インジェクションとか関係ありませんが、セッションハイジャックとかアプリケーションの作りに依存する部分は他のフレームワークと同じです。</p>
<p>気をつけたいのがXSS（クロスサイト・スクリプティング）です。</p>
<p>HTMLタグ不許可な場合は簡単なんですが、昨今のWEBサービスではブログをはじめフォームにHTMLタグを入力できる様なサービスが増えてきたので大変です。</p>
<p>良い子のウェブプログラマはIPAのガイドライン、<a href="http://www.ipa.go.jp/security/vuln/documents/website_security.pdf">安全なウェブサイトの作り方 (PDFファイル、2.09MB） </a>を参考にします。</p>
<p>同ガイドラインでは根本解決策を「入力されたHTMLテキストから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する」としています。<br />
そんなもん自力で書いてられません。</p>
<p>そこで、OWASP（Open Web Application Security Project）謹製の<a href="http://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project">AntiSamy</a>を使いたいと思います。</p>
<p>
&nbsp;<br />
<br />
&nbsp;</p>
<hr />
<h4>ダウンロード</h4>
<p><a href="http://code.google.com/p/owaspantisamy/downloads/list">Google Code</a>から antisamy-bin.1.4.1.jar をダウンロードします。</p>
<p>設定はポリシーファイルで行います。テンプレが用意されていますのでダウンロードします。<br />
<a href="http://java.keicode.com/lib/owasp-antisamy.php">ここ</a>を参考に、antisamy-ebay.xml をダウンロードしました。</p>
<p>
&nbsp;<br />
<br />
&nbsp;</p>
<hr />
<h4>インストール</h4>
<p>基本的にjarファイルをクラスパスに置くだけ、の筈ですが、私の環境ではそれだけでは動きませんでした。(slim3 1.0.5、Eclipse 3.5、google app engine for java 1.3.6)<br />
いろんなクラスが見つからないと怒られます。</p>
<p><a href="http://code.google.com/p/owaspantisamy/downloads/list">先ほどのGoogle Code</a>でAll downloadsをSearch すると、antisamy-required-libs-1.2.zip が出てきます。こいつをダウンロードして解党し、依存性があるであろうjar達をクラスパスに置いたら動きました。</p>
<p>
&nbsp;<br />
<br />
&nbsp;</p>
<hr />
<h4>使い方</h4>
<p>またもや<a href="http://java.keicode.com/lib/owasp-antisamy.php">ここ</a>を参考にしてください。</p>
<p>一応書いときます。</p>
<pre>
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
...
	public static final String PATH_ANTISAMY_POLICY = "WEB-INF/antisamy-ebay-1.4.1.xml";
...
	public static String doSamy(String str)
		throws PolicyException, ScanException
	{
		Policy policy = Policy.getInstance(PATH_ANTISAMY_POLICY);
		AntiSamy as = new AntiSamy();
		CleanResults cr = as.scan(str, policy);
		return cr.getCleanHTML();
	}
...
</pre>
<p>
&nbsp;<br />
<br />
&nbsp;</p>
<hr />
<h4>Youtubeを動かしたい</h4>
<p>Youtubeのタグが弾かれる事に気がつきました。</p>
<p>一番なんでもアリのポリシーファイル（antisamy-anythinggoes-1.4.1.xml）に変えてもダメです。</p>
<p>色々ググっているウチに、先人の知恵を発見。<br />
<a href="https://www.codemagi.com/blog/post/127">AntiSamy Policy to allow YouTube Videos</a></p>
<p>無事Youtubeも動くようになりました。</p>
<p>FireFoxのプラグイン<a href="https://addons.mozilla.org/ja/firefox/addon/7598/">XSS ME</a>でテストしてみましたが、機嫌よくサニタイズしている様に見えます。</p>
<p>満足です。</p>
<p>
&nbsp;<br />
<br />
&nbsp;</p>
<hr />
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/883" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/883/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/883" />
	</item>
		<item>
		<title>OpenID RP を Google App Engine (java) で (dyuproject)</title>
		<link>http://www.tdtsh.com/blog/archives/587</link>
		<comments>http://www.tdtsh.com/blog/archives/587#comments</comments>
		<pubDate>Thu, 18 Mar 2010 06:02:19 +0000</pubDate>
		<dc:creator>tdtsh</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[OpenID]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.tdtsh.com/blog/?p=587</guid>
		<description><![CDATA[&#160; 前回も書きましたが、GAE/J上ではSocketが使えない。故にopenid4javaはGAEでは使えない。 でも、dyuprojectは動くし、動かした上にコードを公開されている方もいる。 どうやらGAE [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;<br />
<a href="http://www.tdtsh.com/blog/archives/346">前回</a>も書きましたが、GAE/J上ではSocketが使えない。故にopenid4javaはGAEでは使えない。</p>
<p>でも、<a href="http://code.google.com/p/dyuproject/">dyuproject</a>は動くし、<a href="http://d.hatena.ne.jp/knj77/20100211/1265884534">動かした上にコードを公開されている方</a>もいる。</p>
<p>どうやらGAE/Jの URLフェッチ API を使っている模様。そりゃそれしか方法はないですよね。</p>
<p>私は職業プログラマでは無いので、車輪の再開発どころか、なるべくコードは書きたくないんです。<br />
早速、dyprojectにトライしてみましょう。<br />
&nbsp;<br />
&nbsp;</p>
<hr />
<h4>dyuproject-openid-1.1.6-jarjar.jar のダウンロード</h4>
<p><a href="http://code.google.com/p/dyuproject/">dyuproject</a>の<a href="http://code.google.com/p/dyuproject/downloads/list">Downloads</a>から、<a href="http://dyuproject.googlecode.com/files/dyuproject-1.1.6.zip">dyuproject-1.1.6.zip</a>をダウンロードします。</p>
<p>JavaDocとか他のライブラリとかデモが不要なら、<a href="http://dyuproject.googlecode.com/files/dyuproject-openid-1.1.6-jarjar.jar">dyuproject-openid-1.1.6-jarjar.jar</a> でもいいです。<br />
&nbsp;<br />
&nbsp;</p>
<hr />
<h4>eclipseのGAEプロジェクトへライブラリを追加する</h4>
<p>ダウンロードしたzipファイルの、/dist に、dyuproject-openid-1.1.6-jarjar.jar はあります。<br />
それを、eclipse の /war/WEB-INF/lib/にコピーします。</p>
<p>eclipseを起動して、war/WEB-INF/lib/ の下にコピーしたjarファイルを右クリックして、[ビルド・バス(B)] &#8211; [ビルド・パスに追加(A)]をクリックします。</p>
<p>念のため、プロジェクトの[参照ライブラリー]に追加されている事を確認します。<br />
&nbsp;<br />
&nbsp;</p>
<hr />
<h4>/WEB-INF/web.xml に追記する</h4>
<p><a href="http://code.google.com/p/dyuproject/wiki/QuickStartOpenid">QuickStartOpenid &#8211; dyuproject</a>のんを参考にしながら書きます。<br />
ちょっとだけ手を加え (ログアウト用サーブレットを追加とか) ましたが、基本的に同じです。</p>
<pre>
&lt;filter&gt;
    &lt;filter-name&gt;openid-filter&lt;/filter-name&gt;
    &lt;filter-class&gt;com.dyuproject.openid.OpenIdServletFilter&lt;/filter-class&gt;
    &lt;init-param&gt;
        &lt;param-name&gt;forwardUri&lt;/param-name&gt;
        &lt;param-value&gt;/&lt;/param-value&gt;
    &lt;/init-param&gt;
&lt;/filter&gt; 

&lt;filter-mapping&gt;
    &lt;filter-name&gt;openid-filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/openid-login&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

&lt;filter-mapping&gt;
    &lt;filter-name&gt;openid-filter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/openid-logout&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;openid-servlet&lt;/servlet-name&gt;
    &lt;servlet-class&gt;my.package.OpenIdLoginServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;openid-servlet&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/openid-login&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;

&lt;servlet&gt;
    &lt;servlet-name&gt;openid-logout&lt;/servlet-name&gt;
    &lt;servlet-class&gt;my.package.OpenIdLogoutServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;

&lt;servlet-mapping&gt;
    &lt;servlet-name&gt;openid-logout&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/openid-logout&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;
</pre>
<h4>ログイン用サーブレットを作る</h4>
<p><a href="http://code.google.com/p/dyuproject/wiki/QuickStartOpenid">QuickStartOpenid &#8211; dyuproject</a>のサンプルコードにほんに少しだけ異常系を付け足しただけです。</p>
<pre>
package my.package;

import com.dyuproject.openid.RelyingParty;
import com.dyuproject.openid.ext.AxSchemaExtension;
import com.dyuproject.openid.OpenIdUser;

public class OpenIdLoginServlet extends HttpServlet {

    static {
        RelyingParty.getInstance()
        .addListener(new AxSchemaExtension()
            .addExchange("email")
            .addExchange("nickname")
            .addExchange("fullname")
            .addExchange("gender")
            .addExchange("postcode")
            .addExchange("country")
            .addExchange("language")
        );
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        OpenIdUser user = (OpenIdUser) request.getAttribute(OpenIdUser.ATTR_NAME);
        if (user != null) {
            String identity = user.getIdentity();
            HttpSession session = request.getSession();
            session.setAttribute("identity", identity);
            Map<String,String> axschema = AxSchemaExtension.get(user);
            if (axschema != null &#038;&#038; axschema.size() > 0) {
                session.setAttribute("email", axschema.get("email"));
                session.setAttribute("nickname", axschema.get("nickname"));
            } else {
                session.setAttribute("email", "unknown");
                session.setAttribute("nickname", identity);
            }
        } else {
            //
        }
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));
    }

}
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<h4>ログアウト用サーブレットを作る</h4>
<p><a href="http://code.google.com/p/dyuproject/wiki/QuickStartOpenid">QuickStartOpenid &#8211; dyuproject</a>にはサンプルが無かったけど、ログインしっぱなしじゃ困るから、ログアウト用サーブレットも作ります。</p>
<pre>
package my.package;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;
import javax.servlet.RequestDispatcher;

public class OpenIdLogoutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        HttpSession session = request.getSession(false);
        session.invalidate();
        response.sendRedirect(response.encodeRedirectURL(request.getParameter("redirect_url")));

    }
}
</pre>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<h4>動かす</h4>
<p>あとはHTMLでいいので、OpenIDプロバイダのURLを引数 &#8220;openid_identifier&#8221;にセットして、サーブレットに渡すAタグなり、フォームなりを書いて実行します。</p>
<p>mixi OpenIDならこんな感じですね。</p>
<pre>
&lt;a href="openid-login?openid_identifier=https://mixi.jp"&gt;mixiでログインします&lt;/a&gt;
</pre>
<p>なんて簡単なんでしょう。</p>
<p>サンプルコードでは、mixi、Google、Yahoo!、openid.ne.jp は動きました。<br />
hatena はうまくいきませんでした。なんでだろう。</p>
<p>nickNameが取れたのはmixiだけでした。</p>
<p>&nbsp;<br />
&nbsp;</p>
<hr />
<div id="fb-root"></div>
   <script>
   window.fbAsyncInit = function() {
   FB.init({appId: "135970219784621", status: true, cookie: true,
		 xfbml: true});
	};
 (function() {
  var e = document.createElement("script"); e.async = true;
 e.src = document.location.protocol +
   "//connect.facebook.net/jv_ID/all.js";
 document.getElementById("fb-root").appendChild(e);
}());
</script><span class = ""  style = "  "><fb:like href="http://www.tdtsh.com/blog/archives/587" send = "false" layout="standard" show_faces="false" width="" action="like" colorscheme="light" font="" /></span>]]></content:encoded>
			<wfw:commentRss>http://www.tdtsh.com/blog/archives/587/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://www.tdtsh.com/blog/archives/587" />
	</item>
	</channel>
</rss>

