<?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:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>infoScoop Developer&#039;s Blog</title>
	<atom:link href="http://infoscoopjp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://infoscoopjp.wordpress.com</link>
	<description>infoScoopは大手企業で実績のあるOpenSocial対応の企業情報ポータルです。</description>
	<lastBuildDate>Tue, 07 May 2013 00:00:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='infoscoopjp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/82fa92ddcb204a9eca45cd9e52e08e9f?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>infoScoop Developer&#039;s Blog</title>
		<link>http://infoscoopjp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://infoscoopjp.wordpress.com/osd.xml" title="infoScoop Developer&#039;s Blog" />
	<atom:link rel='hub' href='http://infoscoopjp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Gmail Java IMAP Extensionを使ってGmailを既読にする</title>
		<link>http://infoscoopjp.wordpress.com/2013/04/18/gmail-java-imap-extension%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6gmail%e3%82%92%e6%97%a2%e8%aa%ad%e3%81%ab%e3%81%99%e3%82%8b/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/04/18/gmail-java-imap-extension%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6gmail%e3%82%92%e6%97%a2%e8%aa%ad%e3%81%ab%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 00:39:33 +0000</pubDate>
		<dc:creator>Shoji Nakata</dc:creator>
				<category><![CDATA[Gmail]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1332</guid>
		<description><![CDATA[以前、こちらのエントリでGmailをIMAPを使って読み込む手法を紹介しました。 Gmailのメールの本文を直 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1332&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>以前、こちらのエントリでGmailをIMAPを使って読み込む手法を紹介しました。</p>
<p><a href="http://infoscoopjp.wordpress.com/2011/12/21/gmail-msg-url/">Gmailのメールの本文を直接開くURLを取得する方法</a></p>
<p>今回は同じGmailのIMAP用ライブラリを使用して、Gmailの特定のメールを既読にする手法を紹介します。</p>
<p>では早速ソースコードです。</p>
<pre class="brush: java; title: ; notranslate">
package work;

import java.util.Properties;

import com.google.code.com.sun.mail.imap.IMAPSSLStore;
import com.google.code.javax.mail.Folder;
import com.google.code.javax.mail.Message;
import com.google.code.javax.mail.MessagingException;
import com.google.code.javax.mail.Session;
import com.google.code.javax.mail.Flags.Flag;
import com.google.code.javax.mail.search.GmailMessageIDTerm;

public class Sample {

	public static void main(String[] args) throws MessagingException{
		final String email = &quot;email@gmail.com&quot;; //メールアドレス
		final String password = &quot;password&quot;; //パスワード
		final String host = &quot;imap.gmail.com&quot;; //GmailのIMAPホスト名
		final String messageId = &quot;xxxxxxxxxxxxxxx&quot;;  //既読にするメールのID(16進数表記)

		Properties props = new Properties();
		props.setProperty(&quot;mail.store.protocol&quot;, &quot;imaps&quot;);
		Session session = Session.getDefaultInstance(props, null);
		IMAPSSLStore store = new IMAPSSLStore(session, null);
		Folder inbox = null;

		try {
			store.connect(host, email, password);
			inbox = store.getFolder(&quot;Inbox&quot;);
			inbox.open(Folder.READ_WRITE);

			GmailMessageIDTerm term
				= new GmailMessageIDTerm(Long.toString(Long.parseLong(messageId, 16)));
			Message[] messages = inbox.search(term); //対象のメッセージを検索
			if(messages != null){
				for(Message message : messages){
					if(message != null){
						message.setFlag(Flag.SEEN, true); //メッセージを既読にする
					}
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			if (inbox.isOpen()) {
				inbox.close(true);
			}
			if(store.isConnected()){
				store.close();
			}
		}
	}
}
</pre>
<p>なお、上記のコードはメッセージIDを使ったGmailの検索の例でもあります。<br />
GmailのメッセージIDは各メールを開いた際のURLの末尾にある16進数になります。</p>
<ul>
<li>例： <a href="https://mail.google.com/mail/u/0/?shva=1#inbox/" rel="nofollow">https://mail.google.com/mail/u/0/?shva=1#inbox/</a><span style="color:#ff0000;"><strong>18b94a75cff13147</strong></span></li>
</ul>
<p><span style="color:#000000;">で、実際に検索を行う際はこの16進数表記の文字列をロング値に変換してやる必要があるので注意が必要です。</span></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/gmail/'>Gmail</a>, <a href='http://infoscoopjp.wordpress.com/category/development/java/'>Java</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1332&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/04/18/gmail-java-imap-extension%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6gmail%e3%82%92%e6%97%a2%e8%aa%ad%e3%81%ab%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d861579ebfe77ab16a9523aeabe71b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nakata0919</media:title>
		</media:content>
	</item>
		<item>
		<title>IE9 iframeを用いたサイトのドキュメントモード</title>
		<link>http://infoscoopjp.wordpress.com/2013/03/19/ie9-iframe%e3%82%92%e7%94%a8%e3%81%84%e3%81%9f%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%89%e3%82%ad%e3%83%a5%e3%83%a1%e3%83%b3%e3%83%88%e3%83%a2%e3%83%bc%e3%83%89/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/03/19/ie9-iframe%e3%82%92%e7%94%a8%e3%81%84%e3%81%9f%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%89%e3%82%ad%e3%83%a5%e3%83%a1%e3%83%b3%e3%83%88%e3%83%a2%e3%83%bc%e3%83%89/#comments</comments>
		<pubDate>Tue, 19 Mar 2013 08:28:24 +0000</pubDate>
		<dc:creator>Shoji Nakata</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1323</guid>
		<description><![CDATA[IE9においてiframeを用いたサイトを構築する場合、フレーム内のドキュメントモードに注意する必要があります [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1323&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>IE9においてiframeを用いたサイトを構築する場合、フレーム内のドキュメントモードに注意する必要があります</p>
<p><a href="http://technet.microsoft.com/en-us/library/ff955402%28v=vs.85%29">iframe Handling (英語)</a>によると、IE9 では、iframe 内のドキュメント モードはトップ レベルの Web ページのドキュメント モードで決まります。トップ レベルの Web ページが IE9 標準モードでない場合、iframe内のサブドキュメントは<span style="color:#ff0000;"><strong>どのような指定をしても</strong></span> IE9の標準モードではレンダリングできません。</p>
<p>例えば以下の様なコンテンツを作成したとします。</p>
<h4>■ index.html</h4>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='utf-8'/&gt;

&lt;!-- ドキュメントモードにIE8標準モードを指定 --&gt;
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=8&quot;&gt;

&lt;title&gt;index&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
window.onload = function(){
var mode = document.documentMode;
document.body.innerHTML = &quot;Document mode: &quot; + mode;
};
&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;iframe id=&quot;ifrm&quot; src=&quot;contents.html&quot; /&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<h4>■ contents.html</h4>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='utf-8'/&gt;

&lt;!-- ドキュメントモードにIE9標準モードを指定 --&gt;
&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=9&quot;&gt;
&lt;title&gt;contents&lt;/title&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
window.onload = function(){
var mode = document.documentMode;
document.body.innerHTML = &quot;Document mode: &quot; + mode;
}
&lt;/script&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>上記の例ではindex.html内にiframeを配置し、その中にcontents.htmlを表示するような指定となっています。contents.htmlはmetaタグの指定によりIE9標準モードでのレンダリングを行うよう指定していますが、トップレベルであるindex.htmlはmetaタグの指定によりIE8標準モードでのレンダリングとなっています。このような状態でindex.htmlをIE9で表示すると、contetns.htmlはmetaタグの指定に関わらず、IE8標準モードでレンダリングされることになります。</p>
<p>このようにiframe内のコンテンツがコンテンツ制作者の意図しないドキュメントモードでレンダリングされないようにするため、サイト内にiframeを用いる場合はトップレベルのドキュメントモードをIE9標準モードとする必要があります。</p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/'>development</a>, <a href='http://infoscoopjp.wordpress.com/category/ie/'>IE</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1323&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/03/19/ie9-iframe%e3%82%92%e7%94%a8%e3%81%84%e3%81%9f%e3%82%b5%e3%82%a4%e3%83%88%e3%81%ae%e3%83%89%e3%82%ad%e3%83%a5%e3%83%a1%e3%83%b3%e3%83%88%e3%83%a2%e3%83%bc%e3%83%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7d861579ebfe77ab16a9523aeabe71b3?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nakata0919</media:title>
		</media:content>
	</item>
		<item>
		<title>jQuery MobileでマークアップHTMLを動的に作成するときに使うメソッドまとめ</title>
		<link>http://infoscoopjp.wordpress.com/2013/02/12/jquery-mobile%e3%81%a7%e3%83%9e%e3%83%bc%e3%82%af%e3%82%a2%e3%83%83%e3%83%97html%e3%82%92%e5%8b%95%e7%9a%84%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e3%81%a8%e3%81%8d%e3%81%ab%e4%bd%bf%e3%81%86/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/02/12/jquery-mobile%e3%81%a7%e3%83%9e%e3%83%bc%e3%82%af%e3%82%a2%e3%83%83%e3%83%97html%e3%82%92%e5%8b%95%e7%9a%84%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e3%81%a8%e3%81%8d%e3%81%ab%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 05:24:13 +0000</pubDate>
		<dc:creator>cmutoh</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1291</guid>
		<description><![CDATA[普通jQuery Mobileを利用するときは、枠はhtmlで書きます。 例：JQueryのlistviewの [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1291&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>普通jQuery Mobileを利用するときは、枠はhtmlで書きます。<br />
例：<a href="http://jquerymobile.com/demos/1.2.0/docs/lists/docs-lists.html" target="_blank">JQueryのlistviewの使い方</a></p>
<pre class="brush: jscript; title: ; notranslate">
&lt;ul data-role=&quot;listview&quot;&gt;
 &lt;li&gt;&lt;a href=&quot;acura.html&quot;&gt;Acura&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href=&quot;audi.html&quot;&gt;Audi&lt;/a&gt;&lt;/li&gt;
 &lt;li&gt;&lt;a href=&quot;bmw.html&quot;&gt;BMW&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p></em><br />
なかなか必要に迫られないかもしれないけど、上記のコードを<strong>javascriptで動的に作成したい</strong>ときは以下のようにします。</p>
<pre class="brush: jscript; title: ; notranslate">
$('&lt;ul/&gt;')
 .attr(&quot;data-role&quot;,&quot;listview&quot;)
 .append($('&lt;li&gt;&lt;a href=&quot;acura.html&quot;&gt;Acura&lt;/a&gt;&lt;li/&gt;')
 .append($('&lt;li&gt;&lt;a href=&quot;audi.html&quot;&gt;Audi&lt;/a&gt;&lt;li/&gt;')
 .append($('&lt;li&gt;&lt;a href=&quot;bmw.html&quot;&gt;BMW&lt;/a&gt;&lt;li/&gt;');
</pre>
<p></em></em><br />
でもこれだけだと、CSSのスタイルが適用されません。<br />
上記に加えてlistview()メソッドを呼ぶとスタイルが適用されます。</p>
<pre class="brush: jscript; title: ; notranslate">
$('&lt;ul/&gt;')
 .attr(&quot;data-role&quot;,&quot;listview&quot;)
 .append($('&lt;li&gt;&lt;a href=&quot;acura.html&quot;&gt;Acura&lt;/a&gt;&lt;li/&gt;')
 .append($('&lt;li&gt;&lt;a href=&quot;audi.html&quot;&gt;Audi&lt;/a&gt;&lt;li/&gt;')
 .append($('&lt;li&gt;&lt;a href=&quot;bmw.html&quot;&gt;BMW&lt;/a&gt;&lt;li/&gt;');
 .listview('refresh'); // &lt;- ここ！
</pre>
<p>jquery mobileには上記のようなメソッドがいくつかあります。<br />
結構公式ページでもその辺が全て一箇所でまとまってないので、まとめておきます。</p>
<h3>あらゆる要素に対して</h3>
<pre class="brush: jscript; title: ; notranslate">
$('&lt;/div&gt;').appendTo( &quot;.ui-page&quot; ).trigger( &quot;create&quot; ); // div 以外に対しても可
</pre>
<h3>navbarに対して</h3>
<p>公式ドキュメント内には使い方が載ってないのですが、できてしまいます。非公式なのかな。。</p>
<pre class="brush: jscript; title: ; notranslate">
$('&lt;div data-role=&quot;navbar&quot;/&gt;')
	.append($('&lt;ul/&gt;')
		.append($('&lt;li&gt;&lt;a href=&quot;a.html&quot;&gt;One&lt;/a&gt;&lt;/li&gt;'))
		.append($('&lt;li&gt;&lt;a href=&quot;b.html&quot;&gt;Two&lt;/a&gt;&lt;/li&gt;'))
	).navbar(); // &lt;- ここ！
</pre>
<h3>select に対して</h3>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#selectfoo&quot;).selectmenu(&quot;refresh&quot;) ;
</pre>
<h3>チェックボックスに対して</h3>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;input[type='checkbox']&quot;).checkboxradio(&quot;refresh&quot;);
</pre>
<h3>ラジオボタンに対して</h3>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;input[type='radio']&quot;).checkboxradio(&quot;refresh&quot;);
</pre>
<h3>スライダーに対して</h3>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;input[type='range']&quot;).slider(&quot;refresh&quot;);
</pre>
<h3>参考</h3>
<p><a href="http://jquerymobile.com/demos/1.2.0/docs/forms/docs-forms.html" rel="nofollow">http://jquerymobile.com/demos/1.2.0/docs/forms/docs-forms.html</a></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/jquery/'>jQuery</a>, <a href='http://infoscoopjp.wordpress.com/category/uncategorized/'>Uncategorized</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1291&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/02/12/jquery-mobile%e3%81%a7%e3%83%9e%e3%83%bc%e3%82%af%e3%82%a2%e3%83%83%e3%83%97html%e3%82%92%e5%8b%95%e7%9a%84%e3%81%ab%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b%e3%81%a8%e3%81%8d%e3%81%ab%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/f3f327ed9b4552a662dc6b6eef1b0fbe?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">cmutoh</media:title>
		</media:content>
	</item>
		<item>
		<title>GrailsでOpenIDのチュートリアル</title>
		<link>http://infoscoopjp.wordpress.com/2013/02/09/grails%e3%81%a7openid%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/02/09/grails%e3%81%a7openid%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab/#comments</comments>
		<pubDate>Sat, 09 Feb 2013 04:11:07 +0000</pubDate>
		<dc:creator>DiceK Mikami</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[OpenID]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1350</guid>
		<description><![CDATA[最近はコード書くよりRedmineとにらめっこしています。 こんにちわ、DiceK Mikamiです。 Gra [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1350&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>最近はコード書くよりRedmineとにらめっこしています。<br />
こんにちわ、DiceK Mikamiです。</p>
<p>Grailsの2.2.0がリリースされましたね。<br />
今回は2.2.0を使って、OpenID実装のチュートリアルを実践してみたいと思います。<br />
　<br />
　</p>
<h1>検証環境</h1>
<ul>
<li><strong>Java</strong>: JDK1.7.0</li>
<li><strong>Grails</strong>: <del>2.2.0</del>2.2.0 RC2</li>
</ul>
<p>&nbsp;</p>
<h1>プラグインのインストール</h1>
<p>OpenID環境の実装には、Spring Security OpenIDプラグインを利用します。<br />
このプラグインはSpring Security Coreを中核としたOpenID用プラグインです。<br />
さて、ここで一つ大問題があります。<br />
なんと現在（2013/02/07）、Spring　Security CoreがV2.2.0で動きません。<br />
ちゃんとチュートリアル通りに動かしても以下のようなエラーが返ってきます。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid02.png"><img src="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid02.png?w=630&#038;h=206" alt="grailsopenid02" width="630" height="206" class="alignnone size-full wp-image-1359" /></a><br />
なんでしょうか。<br />
私の環境が悪いのでしょうか。<br />
それとも日々の行いが悪いからでしょうか。<br />
へこみます。<br />
一体私が何をしたというのだ！</p>
<p>気を取り直して、ここでは2.2.0 RC2を使うことにします。（なぜかRC版では動くのです）<br />
さっそくコマンドプロンプトからアプリ作成します。</p>
<pre class="brush: plain; title: ; notranslate">
$ grails create-app openidsample
$ cd openidsample
</pre>
<p>次に、プラグインをインストールしていきましょう。<br />
と、いきたいところですが、しばしお待ちください。<br />
チュートリアルでは、サクッとプラグインをインストールしていますが、<b>この通りにやっても動きません。</b><br />
<font color="#ff0000"><b>ここはチュートリアルに掲載されていない重要な作業です！</b></font><br />
プラグインの中では、Google Guice2.0を利用しているのですが、セントラルリポジトリにありません。<br />
インストールページには、BootConfig.groovyにリポジトリを追加しろと記載されていますが、残念なことに<b>こんなことでは動かないのです。</b><br />
理由は不明ですが、どうやらリポジトリのURLが2.0のものではないようです。<br />
仕方ないので、自前でGoogle Guice2.0を用意しましょう。<br />
guice-2.0.jarというファイルが必要になりますので、<strong>「 guice-2.0.jar download 」</strong>とかで検索すればダウンロードサイトがヒットすると思います。<br />
そこからダウンロードしてください。<br />
ダウンロードしたguice-2.0.jarを以下の画像にあるフォルダに入れておきます。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid01.png"><img src="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid01.png?w=630" alt="grailsopenid01"   class="alignnone size-full wp-image-1360" /></a></p>
<p>このフォルダに入れておくとローカルライブラリとしてGrailsが勝手に処理してくれます。<br />
ここまでの作業が終わりましたら、プラグインをインストールします。</p>
<pre class="brush: plain; title: ; notranslate">
$ grails install-plugin spring-security-openid
</pre>
<p>spring-security-openidはspring-security-coreに依存しているんで、勝手にそちらもインストールしてくれます。<br />
余談ですが、私の環境ではインストールしてくれませんでした。ので、別途spring-security-coreをインストールしました。嫌われているのでしょうか。<br />
　<br />
　</p>
<h1>雛形の作成</h1>
<p>Grailsは最近の流行りよろしくほとんどがコマンドで作成できます。<br />
もう障害はないので、雛形をバリバリ作っていきます。</p>
<pre class="brush: plain; title: ; notranslate">
$ grails s2-quickstart com.openidsample User Role
$ grails s2-init-openid
$ grails s2-create-persistent-token com.openidsample.PersistentLogin
$ grails s2-create-openid com.openidsample.OpenID
</pre>
<p>ここで作成されるファイル群は、サーバ側のアカウント管理、OpenIDとの紐付け、トークン管理を行うクラスです。<br />
　<br />
　</p>
<h1>雛形の改良</h1>
<p>単純にコマンドだけでは、OpenIDとの紐付けは行ってくれませんので、OpenID用にカスタマイズする必要があります。</p>
<pre class="brush: plain; title: ; notranslate">
grails-app/domain/com/openidsample/User.groovy

package com.openidtest

class User {
	String username
	String password
	boolean enabled
	boolean accountExpired
	boolean accountLocked
	boolean passwordExpired

	// hasManyを追加する
	static hasMany = [openIds: OpenID]

	static constraints = {
		username blank: false, unique: true
		password blank: false
	}

	static mapping = {
		password column: '`password`'
	}

	ー後略ー
}
</pre>
<p>次に、BootStrap.configでロールなどを追加しておきます。</p>
<pre class="brush: plain; title: ; notranslate">
grails-app/conf/BootStrap.groovy

import com.openidsample.Role
import com.openidsample.User
import com.openidsample.UserRole

class BootStrap {
	def springSecurityService

	def init = { servletContext -&gt;
		String password = 'password'

		def roleAdmin = new Role(authority: 'ROLE_ADMIN').save()
		def roleUser = new Role(authority: 'ROLE_USER').save()

		def user = new User(username: 'user', password: password, enabled: true).save()
		def admin = new User(username: 'admin', password: password, enabled: true).save()

		UserRole.create user, roleUser
		UserRole.create admin, roleUser
		UserRole.create admin, roleAdmin, true
	}
}
</pre>
<p>一緒にユーザーも作っています。<br />
これはローカルサーバーのユーザーです。<br />
次にURLマッピングも若干変更します。<br />
これはSpring Security Coreが作成したログイン画面ではなく、OpenID用のログイン画面に遷移させるために行います。</p>
<pre class="brush: plain; title: ; notranslate">
grails-app/conf/UrlMappings.groovy

class UrlMappings {
	static mappings = {
		&quot;/login/auth&quot; { 
			controller = 'openId'
			action = 'auth' 
		}

		&quot;/login/openIdCreateAccount&quot; {
			controller = 'openId'
			action = 'createAccount'
		}

	ー後略ー
	}
}
</pre>
<p>　</p>
<h1>テスト用ファイルの作成</h1>
<p>次にテスト用にセキュアなページを作っておきます。</p>
<pre class="brush: plain; title: ; notranslate">
$ grails create-controller secure
</pre>
<p>内容は簡単にロールによって表示ページを分けるようにします。</p>
<pre class="brush: plain; title: ; notranslate">
grails-app/controllers/openidsample/SecureController.groovy

package openidsample

import grails.plugins.springsecurity.Secured

class SecureController {
	// 管理ユーザー用
	@Secured(['ROLE_ADMIN'])
	def admins = {
		render 'Logged in with ROLE_ADMIN'
	}

	// 一般ユーザー用
	@Secured(['ROLE_USER'])
	def users = {
		render 'Logged in with ROLE_USER'
	}
}
</pre>
<p>　</p>
<h1>実験</h1>
<p>ここまで作成しましたら、あとは実験してみます。</p>
<pre class="brush: plain; title: ; notranslate">
$ grails run-app
</pre>
<p>起動しましたら、 <a href="http://localhost:8080/openidsample/secure/users" rel="nofollow">http://localhost:8080/openidsample/secure/users</a> にブラウザからアクセスしてみましょう。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid03.png"><img src="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid03.png?w=630" alt="grailsopenid03"   class="alignnone size-full wp-image-1358" /></a></p>
<p>ログインできていないので、上画面のようなログインページが表示されると思います。<br />
今回はGoogleを利用しようと思いますので、テキストボックスにGoogleのOpenID用URLを入れてログインしましょう。</p>
<p><strong>Google OpenID用URL</strong>： <a href="https://www.google.com/accounts/o8/id" rel="nofollow">https://www.google.com/accounts/o8/id</a></p>
<p>指示の通り操作を行うと、ローカルサーバーのトップ画面に戻ってきます.<br />
途中でアカウントを作るように促されますが、これはローカルサーバーのアカウントとの紐付けを行うためのものです。<br />
再度 <a href="http://localhost:8080/openidsample/secure/users" rel="nofollow">http://localhost:8080/openidsample/secure/users</a> にブラウザからアクセスします。<br />
以下のような画面が表示されれば成功です。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid04.png"><img src="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid04.png?w=630&#038;h=139" alt="grailsopenid04" width="630" height="139" class="alignnone size-full wp-image-1357" /></a><br />
ひとまずチュートリアルとしてはこのような感じとなります。<br />
認証サーバーのURLは固定ですのでそれをボタンにしたり、紐づけたアカウントに管理権限をつけたりと言った改造を施せば簡単にOpenID連携をしたアプリを構築できると思います。<br />
プラグインがもう少し安定すれば実践でも使っていけるでしょう。<br />
　<br />
　</p>
<h1>参考URL</h1>
<p><a href="http://grails-plugins.github.com/grails-spring-security-openid/">http://grails-plugins.github.com/grails-spring-security-openid/</a></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/'>development</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1350&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/02/09/grails%e3%81%a7openid%e3%81%ae%e3%83%81%e3%83%a5%e3%83%bc%e3%83%88%e3%83%aa%e3%82%a2%e3%83%ab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/61a84a7ded651dc11728fe3b757f0cc7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">corestrike</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid02.png" medium="image">
			<media:title type="html">grailsopenid02</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid01.png" medium="image">
			<media:title type="html">grailsopenid01</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid03.png" medium="image">
			<media:title type="html">grailsopenid03</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/02/grailsopenid04.png" medium="image">
			<media:title type="html">grailsopenid04</media:title>
		</media:content>
	</item>
		<item>
		<title>EC2上のTomcatからRDSにSSL接続する方法</title>
		<link>http://infoscoopjp.wordpress.com/2013/01/25/rds-ssl/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/01/25/rds-ssl/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 03:00:54 +0000</pubDate>
		<dc:creator>hirokimura</dc:creator>
				<category><![CDATA[AWS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RDS]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1295</guid>
		<description><![CDATA[今回はAWSのEC2にインストールしたTomcatから、RDS（MySQL）にSSLで接続する方法を紹介します [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1295&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>今回はAWSのEC2にインストールしたTomcatから、RDS（MySQL）にSSLで接続する方法を紹介します。</p>
<p>準備</p>
<ul>
<li>EC2インスタンス（Linux） *1</li>
<li>RDSインスタンス *1</li>
<li>EC2インスタンスにTomcatをインストールしておく</li>
<li>RDSインスタンスのセキュリティグループで、EC2インスタンスからのアクセスを許可しておく</li>
</ul>
<p>以下のサイトを参考にして設定を行ったところ、SSL接続に成功しました。</p>
<blockquote><p>
<em>Amazon RDS に SSL 接続する （JDBC編）</em><br />
<a href="http://blog.cles.jp/item/5349" target="_blank">http://blog.cles.jp/item/5349</a>
</p></blockquote>
<p><span style="margin-top:10px;"></span><br />
以下手順です。</p>
<p>まずはMySQLのクライアントからRDSに接続します。<br />
以下のコマンドを実行して、任意のユーザからはSSL接続のみ許可します。</p>
<pre class="brush: plain; title: ; notranslate">
# mysql -u root -p -h ***.***.ap-northeast-1.rds.amazonaws.com
mysql&gt; GRANT ALL PRIVILEGES ON dbuser.* TO dbuser@&quot;%&quot; IDENTIFIED BY 'mysqlpassword' REQUIRE SSL;
</pre>
<p><span style="margin-top:10px;"></span><br />
次にAmazonから証明書を取得します。<br />
Amazonから配布される証明書はPEM形式であるため、JKS形式に変換する必要があるようです。</p>
<pre class="brush: plain; title: ; notranslate">
# wget https://rds.amazonaws.com/doc/mysql-ssl-ca-cert.pem
# /usr/java/default/bin/keytool -keystore amazon.jks -importcert -file mysql-ssl-ca-cert.pem
パスワードを2回入力（ここでは jkspassword とします）
・
・
・
Trust this certificate? [no]:  yes（yesと入力してEnter）
Certificate was added to keystore
#
</pre>
<p><span style="margin-top:10px;"></span><br />
作成したJKSファイルを任意のフォルダに移動します。</p>
<pre class="brush: plain; title: ; notranslate">
# mkdir /opt/jks
# mv amazon.jks /opt/jks
</pre>
<p><span style="margin-top:10px;"></span><br />
最後にTomcatのサーバーのserver.xmlまたはコンテキストファイルでDBとの接続設定をします。</p>
<pre class="brush: xml; title: ; wrap-lines: false; notranslate">
&lt;Resource name=&quot;jdbc/testDB&quot; auth=&quot;Container&quot;
           type=&quot;javax.sql.DataSource&quot;
           username=&quot;dbuser&quot;
           password=&quot;mysqlpassword&quot;
           driverClassName=&quot;com.mysql.jdbc.Driver&quot;
           url=&quot;jdbc:mysql://***.***.ap-northeast-1.rds.amazonaws.com:3306/dbName?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=true&amp;requireSSL=true&amp;verifyServerCertificate=true&amp;trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks&amp;trustCertificateKeyStoreType=JKS&amp;trustCertificateKeyStorePassword=jkspassword&quot;
/&gt;
</pre>
<p><span style="margin-top:10px;"></span><br />
SSLに関係しているURLのパラメータは以下です。</p>
<pre class="brush: bash; title: ; notranslate">
useSSL=true
requireSSL=true
verifyServerCertificate=true
trustCertificateKeyStoreUrl=file:///opt/jks/amazon.jks  #作成したJKSファイルのパス
trustCertificateKeyStoreType=JKS  #JKS形式を指定
trustCertificateKeyStorePassword=jkspassword  #JKS作成時に設定したパスワード
</pre>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/aws/'>AWS</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1295&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/01/25/rds-ssl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/407086406082bfae273afda3b50575ea?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">hirokimura</media:title>
		</media:content>
	</item>
		<item>
		<title>infoScoopをeXcaleにインストールしてみる</title>
		<link>http://infoscoopjp.wordpress.com/2013/01/10/infoscoop_excale/</link>
		<comments>http://infoscoopjp.wordpress.com/2013/01/10/infoscoop_excale/#comments</comments>
		<pubDate>Thu, 10 Jan 2013 08:27:25 +0000</pubDate>
		<dc:creator>DiceK Mikami</dc:creator>
				<category><![CDATA[tool]]></category>
		<category><![CDATA[eXcale]]></category>
		<category><![CDATA[infoscoop]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1229</guid>
		<description><![CDATA[新年あけましておめでとうございます。 性懲りもなく帰ってきました。 本日は表題の通り軽めの内容でお送りしたいと [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1229&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>新年あけましておめでとうございます。<br />
性懲りもなく帰ってきました。<br />
本日は表題の通り軽めの内容でお送りしたいと思います。<br />
　<br />
　</p>
<h2>eXcaleとは</h2>
<p>eXcaleとは、TIS株式会社によってアプリケーション開発者向けPaaSとして提供予定のクラウドサービスです。<br />
現在のところRuby、Java、PHP、Node.jsのアプリケーションを動作可能なプラットフォームとなっています。<br />
2013年4月に正式公開ですので、現在のところベータ運用されています。<br />
ベータ期間中はサインアップすれば無料で使えますので、折角ですのでinfoScoopをインストールしてみたいと思います。<br />
　<br />
　</p>
<h2>準備するもの</h2>
<ul>
<li>infoScoop OSS クイックスタート</li>
</ul>
<p>　</p>
<h2>セットアップ</h2>
<h3>1.eXcaleにアプリケーションを作成</h3>
<p>まずは、eXcaleに入れ物となるアプリケーションを作成します。<br />
<a href="http://infoscoopjp.files.wordpress.com/2013/01/excale01.png"><img src="http://infoscoopjp.files.wordpress.com/2013/01/excale01.png?w=300&#038;h=192" alt="" title="excale01" width="300" height="192" class="alignnone size-medium wp-image-1240" /></a><br />
ここで作成したアプリケーション名は、後々JNDI名（とアクセスURL）になりますので、慎重につけましょう。<br />
　</p>
<h3>2.infoscoop-3.1.0-quickstartの取得</h3>
<p>まずは、「infoscoop-3.1.0-quickstart」をダウンロードしてきます。<br />
ダウンロードしたファイルを展開し、以下のファイルを取得しておきます。</p>
<ul>
<li>init_infoscoop.ja.sql</li>
<li>apache-tomcat-6.0.28/webapps/infoscoop.war</li>
</ul>
<p>sqlファイルは初期データを投入するのに使います。<br />
クイックスタートを使うのは、このファイルがあるためです。<br />
　</p>
<h3>3.datasource.xmlを修正</h3>
<p>現状ではJNDI名がeXcaleで作成されたアプリケーション名と同じになってしまうので、変更します。<br />
通常版のremakewarを利用すればJNDI名を変更できますが、動かなかったので一部修正を含めて、泥臭い方法で修正します。</p>
<p>取得したwarファイルの拡張子をzipに変更し、適当な場所に展開します。（一般的なファイル展開ツールで展開することができます）<br />
展開したファイルに含まれているdatasource.xmlを修正します。</p>
<pre class="brush: plain; title: ; notranslate">
/WEB-INF/classes/datasource.xml

〜修正前〜
&lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;&gt;
	&lt;property name=&quot;jndiName&quot;&gt;
		&lt;value&gt;java:comp/env/jdbc/infoscoop&lt;/value&gt;
	&lt;/property&gt;
&lt;/bean&gt;

〜修正後〜
&lt;bean id=&quot;dataSource&quot; class=&quot;org.springframework.jndi.JndiObjectFactoryBean&quot;&gt;
      &lt;property name=&quot;jndiName&quot; value=&quot;jdbc/＜eXcaleに作成するアプリケーション名＞&quot; /&gt;
      &lt;property name=&quot;resourceRef&quot; value=&quot;true&quot; /&gt;
&lt;/bean&gt;
</pre>
<h3>4.web.xmlの修正</h3>
<p>次に、web.xmlも修正します。</p>
<pre class="brush: plain; title: ; notranslate">
/WEB-INF/web.xml

〜修正前〜
&lt;resource-ref&gt;
    &lt;res-ref-name&gt;&lt;!--start dataSource.jndiName--&gt;
		jdbc/infoscoop
	&lt;!--end dataSource.jndiName--&gt;&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;

〜修正後〜
&lt;resource-ref&gt;
    &lt;res-ref-name&gt;&lt;!--start dataSource.jndiName--&gt;
		jdbc/＜eXcaleに作成するアプリケーション名＞
	&lt;!--end dataSource.jndiName--&gt;&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;
</pre>
<h3>5.infoscoop.warの作成</h3>
<p>変更が終わりましたら、展開したフォルダを丸ごとzip圧縮します。<br />
その後、拡張子をwarに変更して、warファイルの慣性です。<br />
　</p>
<h3>6.作成したアプリケーションに初期データを投入</h3>
<p>　さて、早速デプロイといきたいところですが、アップロードすると自動的にデプロイまで行ってしまいますので、先に初期データを投入します。<br />
<a href="http://infoscoopjp.files.wordpress.com/2013/01/excale02.png"><img src="http://infoscoopjp.files.wordpress.com/2013/01/excale02.png?w=300&#038;h=192" alt="" title="excale02" width="300" height="192" class="alignnone size-medium wp-image-1241" /></a><br />
<a href="http://infoscoopjp.files.wordpress.com/2013/01/excale03.png"><img src="http://infoscoopjp.files.wordpress.com/2013/01/excale03.png?w=300&#038;h=192" alt="" title="excale03" width="300" height="192" class="alignnone size-medium wp-image-1242" /></a><br />
　</p>
<h3>7.warファイルのデプロイ</h3>
<p>最後に、warファイルをアップロードして完了です。<br />
<a href="http://infoscoopjp.files.wordpress.com/2013/01/excale04.png"><img src="http://infoscoopjp.files.wordpress.com/2013/01/excale04.png?w=300&#038;h=192" alt="" title="excale04" width="300" height="192" class="alignnone size-medium wp-image-1239" /></a><br />
5〜10分ほどでアクセスできるようになるかと思います。<br />
　<br />
　</p>
<h2>参考URL</h2>
<p><a href="http://www.tis.co.jp/">TIS株式会社</a><br />
<a href="https://www.excale.net/">eXcale</a><br />
<a href="http://www.infoscoop.org/">infoScoop OpenSource</a></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/tool/'>tool</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1229&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2013/01/10/infoscoop_excale/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/61a84a7ded651dc11728fe3b757f0cc7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">corestrike</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/01/excale01.png?w=300" medium="image">
			<media:title type="html">excale01</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/01/excale02.png?w=300" medium="image">
			<media:title type="html">excale02</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/01/excale03.png?w=300" medium="image">
			<media:title type="html">excale03</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2013/01/excale04.png?w=300" medium="image">
			<media:title type="html">excale04</media:title>
		</media:content>
	</item>
		<item>
		<title>GrailsからSolrを呼び出すサンプル</title>
		<link>http://infoscoopjp.wordpress.com/2012/12/31/grails-solr/</link>
		<comments>http://infoscoopjp.wordpress.com/2012/12/31/grails-solr/#comments</comments>
		<pubDate>Mon, 31 Dec 2012 09:00:32 +0000</pubDate>
		<dc:creator>DiceK Mikami</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[solr]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1211</guid>
		<description><![CDATA[今年も残すところあと6時間ほどになりました。 今年一年を振り返ると、苦しいこと、辛いこと、、、あれ、目から熱い [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1211&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>今年も残すところあと6時間ほどになりました。<br />
今年一年を振り返ると、苦しいこと、辛いこと、、、あれ、目から熱い水がこぼれてくるぞ。<br />
どうもこんにちわ、DiceK Mikamiです。</p>
<p>さて、今年最後のテーマは<strong>&#8220;Grailsを使って、Apache Solrで検索したデータを取得する&#8221;</strong>です。<br />
　<br />
　</p>
<h2>Apache Solrとは</h2>
<p>Apache Solrは、Apache Luceneをコアに持つJavaで書かれたオープンソースの検索エンジンです。国内外の大規模検索サービスで利用実績を持ちます。<br />
国内で言えばAmebaや価格.comなどで使われているそうです。<br />
Solrの特徴として、ファセット検索が挙げられます。<br />
ファセット検索（ファセットナビゲーション、ファセット分析とも）とは、様々なカテゴリー（例えば、分類や期間）を前もって用意しておき、それをユーザーが選択することで検索を行うと言うものです。<br />
また、その検索条件もヒット数などに基づいて提供されるので、“ハズレ”がありません。<br />
「検索したはいいけど1件もヒットしなかった」などということは、このファセット検索においてはありえないのです。<br />
Solrはこのファセット検索のインターフェースを持っています。<br />
　</p>
<h2>環境</h2>
<ul>
<li><strong>Grails</strong>: 2.2.0-RC1</li>
<li><strong>Java</strong>: 1.7.0_10-ea</li>
<li><strong>Apache Solr</strong>: 4.0.0</li>
<li><strong>solr-solrj</strong>: 4.0.0-BETA</li>
</ul>
<p>　</p>
<h2>サンプル</h2>
<p>さて、RESTインターフェースを持っているのであれば、AjaxリクエストなりHTTP Clientなりで接続すれば良い訳ですが、それではあまりにも面白くない。<br />
ということで、今回はSolrが持っているJavaクライアントsolrjを利用してみようと思います。<br />
イメージは下図のような感じです。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2012/12/solr-gails01.png"><img src="http://infoscoopjp.files.wordpress.com/2012/12/solr-gails01.png?w=630" alt="" title="solr-gails01"   class="alignnone size-full wp-image-1223" /></a><br />
　</p>
<h3>Mavenリポジトリから取得する設定</h3>
<p>Grailsには膨大な数のプラグインが存在します。<br />
もちろんその中にもsolrjはあるのですが、なんとも残念なことに古いものしかありません。<br />
ですので、BuildConfig.groovyに少し細工をしましょう。</p>
<pre class="brush: plain; title: ; notranslate">
/grails-app/conf/BuildConfig.groovy

dependencies {
    compile 'org.apache.solr:solr-solrj:4.0.0-BETA'
}
</pre>
<p>これで起動時にsolrjをMavenリポジトリからダウンロードしてくれます。<br />
（サンプルでは4.0.0-BETAとなっていますが、適宜gradleの記法にあわせて書き換えて下さい）<br />
　</p>
<h3>実際に利用する</h3>
<p>今回はコントローラーに実際のコードを入れてみます。</p>
<pre class="brush: plain; title: ; notranslate">
class SolrController {
    def index() {
        def url = 'http://localhost:8389/solr/collection1'
            
        // サーバーを作成
        SolrServer server = new HttpSolrServer(url)

        // パラメータを設定
        SolrQuery query = new SolrQuery()
        query.setParam('q','*:*')
        query.setParam('facet','true')
        query.setParam('facet.field','compName_s')
        
        //リクエスト
        QueryResponse resp = server.query(query)

        //レスポンスの処理
        ['queryResults': resp.getResults(), 'facetField': resp.getFacetFields()]
    }
}
</pre>
<p>たったこれだけでSolrから検索結果を取得できます。<br />
また、このサンプルではHttpリクエストを利用していますが、EmbeddedSolrServerクラス（ローカルにSolrがある場合に高速にアクセスする）やLBHttpSolrServerクラス（ロードバランスを考慮して、呼び出しSolrを選択する）といった複数の呼び出し形態がありますので、Solrがどのような構成で存在するかによって適切なクラスを利用できると言うのも魅力的です。<br />
今回はGrailsでの利用方法をサンプルとして紹介しましたが、ライブラリ自体はJavaですので、Javaアプリケーションにもすぐに取り込めるかと思います。<br />
参考までにGitHubにサンプルコードを公開いたします。<br />
　<br />
　<br />
最後になりましたが、今年一年、私の駄文にお付き合いいただきありがとうございました。<br />
懲りずに来年も書ければいいなぁなどと寒空を眺めております。<br />
ともあれ、皆様よいお年をお迎え下さい!!<br />
　</p>
<h2>参考URL</h2>
<p><a href="http://lucene.apache.org/solr/">Apache Solr</a><br />
<a href="http://mvnrepository.com/artifact/org.apache.solr/solr-solrj">Maven Repository &#8211; solrj</a><br />
<a href="http://www.mwsoft.jp/programming/lucene/solrj.html">Solrjサンプルコード集</a><br />
<a href="https://github.com/corestrike/SolrSample">サンプルコード（GitHub）</a></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/'>development</a>, <a href='http://infoscoopjp.wordpress.com/category/tool/'>tool</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1211&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2012/12/31/grails-solr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/61a84a7ded651dc11728fe3b757f0cc7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">corestrike</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/solr-gails01.png" medium="image">
			<media:title type="html">solr-gails01</media:title>
		</media:content>
	</item>
		<item>
		<title>Google乗換案内をちょっと便利にするRoute Searchガジェットの使い方</title>
		<link>http://infoscoopjp.wordpress.com/2012/12/25/route-search-gadget/</link>
		<comments>http://infoscoopjp.wordpress.com/2012/12/25/route-search-gadget/#comments</comments>
		<pubDate>Tue, 25 Dec 2012 07:00:44 +0000</pubDate>
		<dc:creator>hirokimura</dc:creator>
				<category><![CDATA[gadget]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1246</guid>
		<description><![CDATA[目的地に移動するときに、どんなサービスやアプリを使って経路や乗換を調べていますか？ 今回はGoogle乗換案内 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1246&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>目的地に移動するときに、どんなサービスやアプリを使って経路や乗換を調べていますか？<br />
今回はGoogle乗換案内をちょっと便利にするガジェットを紹介します。</p>
<p><img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search11.jpg?w=630" alt="route_search1"   class="alignnone size-full wp-image-1253" style="border:solid 1px gray;" /></p>
<h2 style="margin-top:15px;"><strong>Goolge乗換案内</strong></h2>
<p>Google乗換案内<br />
<a href="http://www.google.co.jp/intl/ja/landing/transit/" target="_blank">http://www.google.co.jp/intl/ja/landing/transit/</a></p>
<p>Google乗換案内は、Googleマップに組み込まれています。<br />
<a href="https://www.google.co.jp/maps?f=d" target="_blank">https://www.google.co.jp/maps?f=d</a></p>
<p>乗換案内というと出発・到着の駅名を入力するというイメージがあるかもしれませんが、<br />
Google乗換案内では、出発地・到着地に駅名の他に、住所や地名、建物を入力して経路検索ができます。</p>
<p>例えば、<br />
　出発：新宿区西新宿1-24-1<br />
　到着：品川駅<br />
や<br />
　出発：東京タワー<br />
　到着：スカイツリー<br />
のような検索ができます。</p>
<h2 style="margin-top:15px;"><strong>Route Searchガジェット</strong></h2>
<p>Route Searchガジェットは、ガジェット上で出発地・目的地・時刻を入力して検索ボタンをクリックすると、別タブでGoogleマップの画面が表示されるシンプルなガジェットです。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search8.jpg?w=630&#038;h=430" alt="route_search8" width="630" height="430" class="alignnone size-full wp-image-1275" /></p>
<p>また、Google乗換案内を便利にする以下の2つの機能があります。</p>
<p><strong> 1. 検索履歴</strong><br />
　1つ目は検索履歴です。<br />
　経路検索を使うときに毎回出発地と目的地を入力していませんか？<br />
　ガジェットから検索すると、出発地と目的地が履歴に保存されます。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search2.jpg?w=630" alt="route_search2"   class="alignnone size-full wp-image-1260" style="border:solid 1px gray;" /><br />
　次回から、入力フォームにフォーカスすると過去に検索したキーワード（駅名、地名、住所など）がプルダウンで表示されます。キーボードからの入力なしで検索できます。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search3.jpg?w=630" alt="route_search3"   class="alignnone size-full wp-image-1261" style="border:solid 1px gray;" /></p>
<p><strong> 2. ラベル</strong><br />
　2つ目はラベルです。　検索履歴に任意のラベルをつけることができます。<br />
　履歴を使って過去に検索した住所で検索しようとした場合、プルダウンに住所が表示されてもどこの住所なのかすぐにわかりません。<br />
　ここで、この住所にラベルをつけておきます。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search4.jpg?w=630" alt="route_search4"   class="alignnone size-full wp-image-1262" style="border:solid 1px gray;" /><br />
　右側の入力フォームをクリックすると、ラベル一覧が表示されます。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search5.jpg?w=630" alt="route_search5"   class="alignnone size-full wp-image-1263" style="border:solid 1px gray;" /><br />
　ラベルをクリックすると出発地・到着地のキーワードが自動で入力されます。<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search6.jpg?w=630" alt="route_search6"   class="alignnone size-full wp-image-1264" style="border:solid 1px gray;" /><br />
　よく行く場所はラベルをつけておくと、入力がとても楽になります。<br />
　</p>
<h2 style="margin-top:15px;"><strong>業務での利用シーン</strong></h2>
<p>下記の手順で便利にGoogle乗換案内を使うことができます。<br />
1. お客さんの会社の住所で検索する<br />
2. 1の履歴に会社名などのわかりやすいラベルをつける<br />
3. 1と2をよく行く会社・場所の分だけ繰り返す<br />
4. 自分の会社の住所で検索して、履歴にラベルをつける</p>
<p>入力例<br />
　出発：本社（ラベルから）<br />
　到着：ABC社（ラベルから）<br />
<img src="http://infoscoopjp.files.wordpress.com/2012/12/route_search11.jpg?w=630" alt="route_search7"   class="alignnone size-full wp-image-1265" style="border:solid 1px gray;" /></p>
<h2 style="margin-top:10px;"><strong>どこで使える？</strong></h2>
<p>infoScoop上で利用可能です。<br />
infoScoop for Google Appsを利用中であれば、管理画面から簡単にガジェットを追加できます。<br />
infoScoop Cloud EnterpriseやinfoScoop OpenSourceで利用する場合はお問い合わせください。</p>
<p>このガジェット以外にも便利なガジェットがinfoScoop Gadget Galleryに掲載されています。<br />
ぜひお試しください。</p>
<p>infoScoop Gadget Gallery<br />
<a href="http://www.infoscoop.info/gadget-gallery/" target="_blank">http://www.infoscoop.info/gadget-gallery/</a></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/gadget/'>gadget</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1246&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2012/12/25/route-search-gadget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/407086406082bfae273afda3b50575ea?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">hirokimura</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search11.jpg" medium="image">
			<media:title type="html">route_search1</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search8.jpg" medium="image">
			<media:title type="html">route_search8</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search2.jpg" medium="image">
			<media:title type="html">route_search2</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search3.jpg" medium="image">
			<media:title type="html">route_search3</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search4.jpg" medium="image">
			<media:title type="html">route_search4</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search5.jpg" medium="image">
			<media:title type="html">route_search5</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search6.jpg" medium="image">
			<media:title type="html">route_search6</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/route_search11.jpg" medium="image">
			<media:title type="html">route_search7</media:title>
		</media:content>
	</item>
		<item>
		<title>vert.xでWebSocketする</title>
		<link>http://infoscoopjp.wordpress.com/2012/12/15/vert-xwebsocket/</link>
		<comments>http://infoscoopjp.wordpress.com/2012/12/15/vert-xwebsocket/#comments</comments>
		<pubDate>Sat, 15 Dec 2012 03:44:59 +0000</pubDate>
		<dc:creator>DiceK Mikami</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[socketjs]]></category>
		<category><![CDATA[vert.x]]></category>
		<category><![CDATA[websocket]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1177</guid>
		<description><![CDATA[ある昼下がり、私は ラオウ PMからこうお達しを受けたのです。 「お前のような輩は、WebSocketを使った [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1177&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>ある昼下がり、私は <del datetime="2012-11-01T03:34:57+00:00">ラオウ</del> PMからこうお達しを受けたのです。</p>
<p><font size="3"><strong>「お前のような輩は、WebSocketを使った通知サーバーをつくればいい」</strong></font></p>
<p>このブログは、そんな指令を受けたプログラマー4時間分の記録である。<br />
こんにちわ、DiceK Mikamiです。<br />
　<br />
　</p>
<h1>今回の目的</h1>
<p>今回は、WebSocketを通知に利用できないかと言うところが出発点になります。<br />
WebSocketと言えばnode.jsですが、今回はそれ以外のやり方を模索したいと思います。<br />
具体的に実現したいことは以下のような図になります。</p>
<p><a href="http://infoscoopjp.files.wordpress.com/2012/12/vertx01.png"><img src="http://infoscoopjp.files.wordpress.com/2012/12/vertx01.png?w=630" alt="" title="vertx01"   class="alignnone size-full wp-image-1197" /></a></p>
<p>勘の良い方はお気づきと思いますが、Pusherと同じです。<br />
ただし、Pusherのようなクラウドサービスにも依存したくありませんし、node.jsはまだ利用したくないという命題がありますので、第3の道としてvert.xを利用します。<br />
　</p>
<h1>vert.xとは</h1>
<p>vert.xとは、「JVM上で動作する次世代の非同期でスケーラブルな並列処理アプリケーションのためのフレームワーク」だそうです。<br />
平たく言うと、「JVM上で動作するnode.js」だと思っていただいて問題ないかと思います。<br />
また、JVM上で動作するとありますが、開発者は複数の言語を利用することができます。<br />
例えば、RubyやPythonなどと言った流行りの言語でも利用できます。<br />
vert.xではSocketJSをサポートしており、これを使うことでWebSocketの利用を実現できます。<br />
　</p>
<h1>実装環境</h1>
<ul>
<li>vert.x: 1.3.0-final</li>
<li>Java: JDK1.7.0</li>
<li>Groovy: 2.0.5</li>
<p>　
</ul>
<h1>groovy実装を使う</h1>
<p>vert.xに含まれているサンプル「 eventbusburidge 」を改良して、実現したいと思います。<br />
groovyで実装した内容は以下のようになります。</p>
<pre class="brush: plain; title: ; notranslate">
import org.vertx.groovy.core.http.RouteMatcher

def server = vertx.createHttpServer()
def route = new RouteMatcher()

route.get('/') { req -&amp;gt;
	req.response.sendFile('notificationserver/index.html')
}

route.get('/vertxbus.js') { req -&amp;gt;
	req.response.sendFile('notificationserver/vertxbus.js')
}

route.post('/deliver') { req -&amp;gt;
	//Postで通知内容が送られてくることを想定
	req.bodyHandler { body -&amp;gt;
		String channel;
		String message;
		def params = body.toString();
		for(param in params.split('&amp;amp;')){
			def keyval = param.split('=');
			switch(keyval[0]) {
				case 'channel':
					//チャンネルを取得
					channel = keyval[1]	
					break
				case 'message':
					//メッセージを取得
					message = keyval[1]
					break
			}
		}

		//受け取ったら指定チャンネルに通知する
		vertx.eventBus.send(channel, [&amp;quot;message&amp;quot;: &amp;quot;${message}&amp;quot;]);
	}

	req.response.end();
}

def requestServer = server.requestHandler(route.asClosure())
def sockServer = vertx.createSockJSServer(server)
sockServer.bridge([prefix: '/notif'], [[:]], [[:]])
requestServer.listen(8080)
</pre>
<p>「 /deliver 」にPOST送信された内容を指定したチャネルに流し込むような形です。<br />
通知を受け取るためには、受け手は前もってそのチャネルをサブスクライブしておく必要があります。<br />
基本的な概念は非常にOpenAjaxHubに似ていると思います。<br />
　<br />
これ以外に通知が届かなかった場合の処理をどうするかや堅牢性を担保するための仕組みなどを組み込む必要がありますが、基本的には目的通りの動きになりました。<br />
　</p>
<h1>参考URL</h1>
<p><a href="http://vertx.io/" title="vert.x">vert.x</a><br />
<a href="https://github.com/sockjs" title="SockJS">SockJS</a><br />
<a href="http://pusher.com/" title="Pusher">Pusher</a><br />
<a href="http://infoscoopjp.wordpress.com/2012/06/11/infoscoop%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%81%A8openajax-hub/">infoScoopガジェットとOpenAjax Hub</a><br />
　<br />
<del datetime="2012-11-01T03:51:18+00:00">我がコードに一片の悔いなし!!</del>＜もういいよ<br />
<font color="#ff0000">注意：この記事の枕部分は脚色されています。</font></p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/'>development</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1177&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2012/12/15/vert-xwebsocket/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/61a84a7ded651dc11728fe3b757f0cc7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">corestrike</media:title>
		</media:content>

		<media:content url="http://infoscoopjp.files.wordpress.com/2012/12/vertx01.png" medium="image">
			<media:title type="html">vertx01</media:title>
		</media:content>
	</item>
		<item>
		<title>rbenv で JRuby をインストール</title>
		<link>http://infoscoopjp.wordpress.com/2012/11/24/rbenv-jruby/</link>
		<comments>http://infoscoopjp.wordpress.com/2012/11/24/rbenv-jruby/#comments</comments>
		<pubDate>Sat, 24 Nov 2012 02:01:40 +0000</pubDate>
		<dc:creator>DiceK Mikami</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[jruby on rails]]></category>
		<category><![CDATA[rbenv]]></category>

		<guid isPermaLink="false">http://infoscoopjp.wordpress.com/?p=1142</guid>
		<description><![CDATA[Rubyのようなバージョン間に互換性があまりない言語を利用するとなると簡単にバージョンを切り替えられる環境が欲 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1142&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Rubyのようなバージョン間に互換性があまりない言語を利用するとなると簡単にバージョンを切り替えられる環境が欲しくなります。<br />
RubyではRVMというバージョン切り替えシステムが導入できますが、最近の流行りはどうやらrbenvというもののようです。</p>
<blockquote><p>
<strong>rbenvとは</strong><br />
37signalsのsstephensonさんが作成したバージョン管理ツールです。<br />
RVMよりも軽量で、gemの管理とかは一切してくれません。<br />
が、それがいいという方々に大人気？のツールです。</p></blockquote>
<p>　<br />
今回は、このrbenvを利用して、JRubyをインストールしてみます。<br />
ついでに、gemの管理を行ってくれるrbenv-gemsetもインストールしてみます。<br />
　<br />
　</p>
<h1>検証環境</h1>
<p><strong>OS:</strong> Mac OSX Mountain Lion<br />
　<br />
　</p>
<h1>rbenvのインストール</h1>
<p>今回もHomebrewを使って、インストールします。<br />
もちろんHomebrewではなくても、yumとかMac Portsとかでも（多少のコマンドは違えど）インストールできます。<br />
でも、Windowsだけは勘弁な。</p>
<pre class="brush: plain; title: ; notranslate">
$ brew install rbenv
$ brew install rbenv-build
</pre>
<p>はい、サクッと余計なものもインストールしました。<br />
rbenv-buildです。<br />
これはrbenvを通してrubyをインストールする時に、ビルド→インストールを行ってくれるものです。<br />
これが入っていないとビルド→インストールをしてくれません。（自前でコマンドを叩くことになります）<br />
何も考えず、書かれるがままにインストールしましょう。<br />
次に、~/.bash_profileに以下を記述します。</p>
<pre class="brush: plain; title: ; notranslate">
eval &amp;quot;$(rbenv init -)&amp;quot;
</pre>
<p>最後に、以下をパスに追加しましょう。</p>
<pre class="brush: plain; title: ; notranslate">
$HOME/.rbenv/shims
</pre>
<p>これでrbenvがインストールされました。<br />
実際にインストールできたかはあとで行います。<br />
　<br />
　</p>
<h1>gccのインストール</h1>
<p>Mac Lion以降の場合、この処理が必要になります。<br />
この処理を行っていないと、どうやらRubyをビルドする際にエラーになるそうです。<br />
XCodeがインストールされており、かつCommand Line Toolsがインストールされている場合は、全く気にする必要はないのですが、Lion以降ではgccの種類が違うためエラーが起きるようです。<br />
Lionであれば、以下よりGCCのインストーラーを入手できます。</p>
<p><a href="https://github.com/kennethreitz/osx-gcc-installer">https://github.com/kennethreitz/osx-gcc-installer</a></p>
<p>Mountain Lionの場合は、素直にXCodeからインストールした方が幸せになれるかと思います。<br />
　<br />
　</p>
<h1>JRubyのインストール</h1>
<p>rbenv経由でJRubyをインストールしてみましょう。<br />
rbenvでインストールできるものの一覧は以下のコマンドで取得できます。</p>
<pre class="brush: plain; title: ; notranslate">
$ rbenv install -l
</pre>
<p>「jruby-＜バージョン番号＞」が一覧に表示されたかと思います。</p>
<pre class="brush: plain; title: ; notranslate">
$ rbenv install jruby-＜バージョン番号＞
$ rbenv rehash
</pre>
<p>これでインストール完了です。<br />
rehashコマンドによってrbenvの設定ファイルをリロードしています。<br />
面倒なことにこれはgemのインストールなどを行った時にも行わないといけません。<br />
rbenvコマンドを利用したら、rehashすると覚えておく必要があります。<br />
（rehashを自動的に行うためのスクリプトもありますが、ここでは割愛します）<br />
以下のコマンドで、実際にインストールできたかを確認できます。</p>
<pre class="brush: plain; title: ; notranslate">
$ rbenv versions
</pre>
<p>インストールしたRubyの一覧が取得できます。<br />
利用状態にあるものの先頭にはアスタリスクが表記されます。<br />
次に、インストールしたRubyを利用状態にします。</p>
<pre class="brush: plain; title: ; notranslate">
// グローバルで利用する
$ rbenv global ＜利用したいRuby＞

 // 特定ディレクトリで利用する
$ rbenv local ＜利用したいRuby＞

// システムインストールのRubyに戻す
$ rbenv global system
</pre>
<p>　</p>
<h1>rbenv-gemsetのインストール</h1>
<p>rbenvでgemsetを管理したい人向けのツールです。<br />
rbenvではインストールしたRubyごとにgemを管理しますが、それよりも細かい管理を行ってはくれません。<br />
ですので、それをカバーするためにrbenv-gemsetを導入します。</p>
<pre class="brush: plain; title: ; notranslate">
// インストール
$ brew install rbenv-gemset

// インストールの確認
$ rbenv gemset
</pre>
<p>バージョン情報が表示されれば、インストールできました。<br />
では、適当にgemsetを用意してみます。</p>
<pre class="brush: plain; title: ; notranslate">
// サンプルのためにディレクトリを作成
$ mkdir sample
$ cd sample

// rgemsetと言う名前で、gemsetを作成
$ rbenv gemset create ＜利用するRuby＞ rgemset

// sampleディレクトリでは、rgemsetを利用するように指定
$ echo rgemset &amp;gt; .rbenv-gemset

// アクティブになっているかを確認
$ rbenv gemset active

// 削除したい場合
$ rbenv gemset delete ＜利用するRuby＞ rgemset
</pre>
<p>　</p>
<h1>Railsをインストール</h1>
<p>折角なので、JRuby on Railsの環境を用意してみます。</p>
<pre class="brush: plain; title: ; notranslate">
// Railsのインストール
$ rbenv exec jgem install rails
$ rbenv rehash

// インストールの確認
$ rbenv exec jgem list
</pre>
<p>JRubyなのでjgemを使ってみました。<br />
「rbenv exec」コマンドを接頭辞として使うことでrbenv経由になります。<br />
あとは、普通に使ってOKです。</p>
<pre class="brush: plain; title: ; notranslate">
$ jruby -S rails new hoge -m http://jruby.org/rails3.rb
</pre>
<p>これで雛形は完成です。</p>
<br />カテゴリー:<a href='http://infoscoopjp.wordpress.com/category/development/'>development</a>, <a href='http://infoscoopjp.wordpress.com/category/tool/'>tool</a>  <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=infoscoopjp.wordpress.com&#038;blog=29267459&#038;post=1142&#038;subd=infoscoopjp&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://infoscoopjp.wordpress.com/2012/11/24/rbenv-jruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/61a84a7ded651dc11728fe3b757f0cc7?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">corestrike</media:title>
		</media:content>
	</item>
	</channel>
</rss>
