<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20344598</id><updated>2011-08-17T12:03:38.925+09:00</updated><category term='C++'/><category term='Python'/><category term='technology'/><category term='Cell'/><category term='Tips'/><category term='scala'/><category term='Webkit'/><category term='Ruby'/><category term='Javascript'/><category term='Rails'/><category term='OpenID'/><category term='Erlang'/><title type='text'>Young risk taker.</title><subtitle type='html'>l'essentiel est invisible pour les yeux</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rakuto.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default?start-index=101&amp;max-results=100'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>239</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20344598.post-1872181278250654355</id><published>2009-07-22T18:36:00.002+09:00</published><updated>2009-07-22T18:40:21.455+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>[Tips] ターミナルからシリアルポート接続</title><content type='html'>Z-Termっていまいち使い勝手がよくない。&lt;br /&gt;Mac環境下では、Z-Termを利用してシリアル接続していたが、通常のターミナルからscreenコマンドにボーレート引数を渡せばシリアル接続できる事を知りこれは便利。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% screen /dev/tty.XXXXXXX 115200&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-1872181278250654355?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1872181278250654355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1872181278250654355'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/07/tips.html' title='[Tips] ターミナルからシリアルポート接続'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-681099861941965298</id><published>2009-04-07T01:22:00.006+09:00</published><updated>2009-04-07T11:04:04.694+09:00</updated><title type='text'>第二種電気工事士の受験</title><content type='html'>今日は、第二種電気工事士の締切日でした。&lt;br /&gt;試験日がWWDCの日程とダブルブッキングしている事もしらず、申し込みを完了させている人もいましたが、受験料を振込み無事申し込み完了。第二種電気工事士を取得して、キャリアパスを変更しようと考え中。&lt;br /&gt;&lt;br /&gt;そう、&lt;a href="http://www.mrzigbee.me/"&gt;Mr.ZigBee&lt;/a&gt;なるブログを始めました。&lt;br /&gt;ZigBeeメン目指します。&lt;br /&gt;&lt;br /&gt;Posted by&lt;a href="http://www.mrzigbee.me/"&gt; ZigBee Man&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-681099861941965298?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/681099861941965298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/681099861941965298'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/04/blog-post.html' title='第二種電気工事士の受験'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-3408755314688840726</id><published>2009-03-16T22:03:00.002+09:00</published><updated>2009-03-16T22:10:12.188+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala] オブジェクトの初期化のシンタックスシュガー</title><content type='html'>Scalaでは、オブジェクトの作成〜オブジェクトのメソッド呼び出しによる初期化のための、シンタックスシュガーが用意されている。コンストラクタでオブジェクトを作成して、その後オブジェクトのメソッドを呼び出してオブジェクトを初期化する事はよく例を一つ紹介。&lt;br /&gt;&lt;br /&gt;Jettyのハンドラーの初期化をシンタックスシュガーでコーディングした例。ブロック内のスコープは、オブジェクト内でのスコープと同じになるので、メソッドを呼ぶ事ができる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;before:&lt;br /&gt;val handler = new ResourceHandler&lt;br /&gt;handler.setResourceBase("/webapp")&lt;br /&gt;&lt;br /&gt;after:&lt;br /&gt;val handler = new ResourceHandler { setResourceBase("/webapp) }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;ほんの少し気持いい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-3408755314688840726?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3408755314688840726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3408755314688840726'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/03/scala.html' title='[Scala] オブジェクトの初期化のシンタックスシュガー'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-213851278920939717</id><published>2009-03-11T15:17:00.009+09:00</published><updated>2009-03-12T12:06:15.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala Tips] Java型からScalaのラッパー型への明示的変換を仲介してくれるライブラリ</title><content type='html'>Scalaでは、Javaの型の多くをラップしたクラスにて再定義している。&lt;br /&gt;&lt;br /&gt;byte型 -&gt; scala.Byte&lt;br /&gt;short型 -&gt; scala.Short&lt;br /&gt;int型 -&gt; scala.Int&lt;br /&gt;など。&lt;br /&gt;&lt;br /&gt;そのため、ScalaからJavaのライブラリを利用していると、ライブラリのAPIの返り値がJavaの型で、Scalaのラッパークラスではないので変換が必要な事がよくある。例えば、java.util.List型は、ScalaのSeq[A]を継承していないので、enumerableではない。&lt;br /&gt;&lt;br /&gt;このため、Scalaの標準ライブラリ中にいくつかの明示的な変換規則を定義してある。例えば、java.util.List[T]からList型への変換などは、scala.collection.jcl.Conversion.convertListを読みこむだけで、後はScalaの言語仕様の明示的な型変換機構により自動的に変換してくれる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;var primNumberList = new java.util.ArrayList[Int](3)&lt;br /&gt;primNumberList.add(1)&lt;br /&gt;primNumberList.add(3)&lt;br /&gt;primNumberList.add(5)&lt;br /&gt;&lt;br /&gt;// ScalaのSeq[A]を実装していないのでイテレーターとして扱えない&lt;br /&gt;primNumberList.foreach { println(_) } // ERROR: エラー&lt;br /&gt;&lt;br /&gt;// implicit conversionの読みこみ&lt;br /&gt;import scala.collection.jcl.Conversions.convertList&lt;br /&gt;primNumberList.foreach { println(_) }&lt;br /&gt;1&lt;br /&gt;3&lt;br /&gt;5&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;java.util.ListからList型への変換以外にも、java.util.MapからMap, java.util.SetからSetなど、多数の明示的変換が定義されているので、必要に応じて読みこむと使用できる。&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;package scala.collection.jcl&lt;br /&gt;&lt;br /&gt;object Conversions {&lt;br /&gt;  implicit def convertSet[T](set : java.util.Set[T]) = Set(set)&lt;br /&gt;  implicit def convertList[T](set : java.util.List[T]) = Buffer(set)&lt;br /&gt;  implicit def convertSortedSet[T](set : java.util.SortedSet[T]) = SortedSet(set)&lt;br /&gt;  implicit def convertMap[T,E](set : java.util.Map[T,E]) = Map(set)&lt;br /&gt;  implicit def convertSortedMap[T,E](set : java.util.SortedMap[T,E]) = SortedMap(set)&lt;br /&gt;  &lt;br /&gt;  implicit def unconvertSet[T](set : SetWrapper[T]) = set.underlying&lt;br /&gt;  implicit def unconvertCollection[T](set : CollectionWrapper[T]) = set.underlying&lt;br /&gt;  implicit def unconvertList[T](set : BufferWrapper[T]) = set.underlying&lt;br /&gt;  implicit def unconvertSortedSet[T](set : SortedSetWrapper[T]) = set.underlying&lt;br /&gt;  implicit def unconvertMap[T,E](set : MapWrapper[T,E]) = set.underlying&lt;br /&gt;  implicit def unconvertSortedMap[T,E](set : SortedMapWrapper[T,E]) = set.underlying&lt;br /&gt;  &lt;br /&gt;}     &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-213851278920939717?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/213851278920939717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/213851278920939717'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/03/scala-tips-javascala.html' title='[Scala Tips] Java型からScalaのラッパー型への明示的変換を仲介してくれるライブラリ'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-6615859119949981917</id><published>2009-03-05T23:06:00.005+09:00</published><updated>2009-03-08T20:10:23.621+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala] タプルやシンボル式へ対応したDreadLocks 0.2の公開</title><content type='html'>&lt;a href="http://dreadlocks.scalalites.org/"&gt;DreadLocks&lt;/a&gt; 0.2を公開しました。今回のアップデートでは、テンプレート中のScala構文中でのタプルとシンボルへの対応とScalaInterpreterの実装をリファクタリングし事が主な変更点です。現在、対応している構文は、if-elseif-elseでの条件分岐、算術式の計算、変数へのメソッドの呼び出し、iterableなSeqやmapに対するループ等です。&lt;br /&gt;&lt;br /&gt;Jarファイルは、&lt;a href="http://github.com/rakuto/dreadlocks/downloads"&gt;dreadlocks-0.2.1.jar&lt;/a&gt;からダウンロード。&lt;br /&gt;&lt;br /&gt;以下のような、タプルの要素への参照を含むforeachのループが書けます。&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;dreadlocks.txt&lt;br /&gt;&lt;/span&gt;&lt;pre class="scala"&gt;&lt;br /&gt;Hamburger Cafe:&lt;br /&gt;&amp;lt;?sc cafes.foreach { cafe =&gt; ?&amp;gt;&lt;br /&gt; * ${cafe._1} in ${cafe._2}&lt;br /&gt;&amp;lt;?sc } ?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Test.scala&lt;/span&gt;&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;val tmpl     = examplTmplateFile("foreach2.shtml")&lt;br /&gt;val source   = Source.fromFile(tmpl).getLines.mkString&lt;br /&gt;val template = Template(source)&lt;br /&gt;val context  = Context("cafes" -&amp;gt; List(("Authentic", "Akasaka, Tokyo"), ("FELLOWS", "Komazawa, Tokyo")))&lt;br /&gt;val output   = template.render(context)&lt;br /&gt;Console.println(output)&lt;br /&gt;// Hamburger Cafe:&lt;br /&gt;//  * Authentic in Akasaka, Tokyo&lt;br /&gt;//  * FELLOWS in Komazawa, Tokyo&lt;br /&gt;//&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-6615859119949981917?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6615859119949981917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6615859119949981917'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/03/scala-dreadlocks-02.html' title='[Scala] タプルやシンボル式へ対応したDreadLocks 0.2の公開'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-1726564468743088413</id><published>2009-03-04T21:48:00.007+09:00</published><updated>2009-03-05T13:18:11.018+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala] Sala用ベンチマーク測定ライブラリBenchmarkSuite</title><content type='html'>&lt;a href="http://scalalites.org/"&gt;BenchmarkSuite&lt;/a&gt; - Scalaのベンチマークライブラリ&lt;br /&gt;ページ中段BenchmarkSuiteより&lt;a href="http://github.com/rakuto/benchmark-suite/tree/master"&gt;GitHub&lt;/a&gt;へリンクしています。&lt;br /&gt;&lt;br /&gt;Jarファイルは、&lt;a href="http://cloud.github.com/downloads/rakuto/benchmark-suite/BenchmarkSuite-1.0.jar"&gt;BenchmarkSuite-1.0.jar&lt;/a&gt;から。&lt;br /&gt;&lt;br /&gt;知ってるんだから。Scalaに標準のベンチマークライブラリscala.testing.Benchmark...が、測定したい対象の度にBenchmarkクラスを継承して実装しないといけないなど、APIがかなり硬派! LLでなまった体には正直キツイです。そこで、コードブロックを対象にベンチマークを測定するライブラリが、BenchmarkSuiteです。現在の所、実行時間のみ計測できるとてもシンプルなライブラリです。&lt;br /&gt;&lt;br /&gt;使い方は、次の通りです。Benchmark.runに引数を一つ持つブロックを渡し、ブロック引数に対して、reportメソッドを呼ぶだけです。ラベルや実行回数を指定できます。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; import org.scalalites.benchmark.Benchmark&lt;br /&gt;&lt;br /&gt; Benchmark.run("Benchmark of ack:") { b =&amp;gt;&lt;br /&gt;   def ack(x: Int, y: Int): Int = x match {&lt;br /&gt;     case 0 =&amp;gt; y + 1&lt;br /&gt;     case _ =&amp;gt; y match { case 0 =&amp;gt; ack(x - 1, 1); case _ =&gt; ack(x - 1, ack(x, y - 1))}&lt;br /&gt;   }&lt;br /&gt;   // run over the test named "ack(3, 2) x 50" 50 times&lt;br /&gt;   b.report("ack(3, 4) x 10", 10)  { ack(3, 4) }&lt;br /&gt;&lt;br /&gt;   // If you don't pass second argument run benchmark once.&lt;br /&gt;   b.report("ack(3, 2)")  { ack(3, 2) }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Output&lt;br /&gt; // Benchmark of ack:&lt;br /&gt; //  ack(3, 4) x 10 : 4.730000 sec (avg. 0.473000 sec)&lt;br /&gt; //  ack(3, 2) x 1  : 0.029000 sec&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://raku.to/?p=9"&gt;[Scala] Released Scala’s BenchmarkSuite Library&lt;/a&gt;(for English users)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-1726564468743088413?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1726564468743088413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1726564468743088413'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/03/scala-salabenchmarksuite.html' title='[Scala] Sala用ベンチマーク測定ライブラリBenchmarkSuite'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2967572090350089230</id><published>2009-03-03T23:39:00.004+09:00</published><updated>2009-03-04T22:04:03.679+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala] ScalaベースのテンプレートエンジンDreadLocks 0.1をリリース</title><content type='html'>&lt;span style="font-weight:bold;"&gt;&lt;a href="http://dreadlocks.scalalites.org/"&gt;DreadLocks&lt;/a&gt; - Scalaベースのテンプレートエンジン&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scalaのテンプレートエンジンを探していたけど見つからなかったので、&lt;a href="http://dreadlocks.scalalites.org/"&gt;DreadLocks&lt;/a&gt;テンプレートエンジンを実装しました。現在は、基本的なScalaの構文のみサポートしています。完全なScalaプログラムのサポートと高速化が次のリリースの目標としています(foreachやif文は実装済み)。ソースコードは、GitHub &lt;a href="http://github.com/rakuto/dreadlocks/tree/master"&gt;dreadlocks/trunk&lt;/a&gt;で、今後のマイルストーンとロードマップは、&lt;a href="http://twitter.com/scalalites"&gt;Twitter&lt;/a&gt;や&lt;a href="http://"&gt;Google Groups&lt;/a&gt;で確認できるので、よければどうぞ。&lt;br /&gt;&lt;br /&gt;簡単なサンプルコードは、以下の通り。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;hamburgers.txt:&lt;br /&gt;    Delicious hamburger restraunts in Japan:&lt;br /&gt;    &amp;lt;?sc restraunts.foreach { restraunt =&amp;gt; ?&amp;gt;&lt;br /&gt;        * ${restraunt}&lt;br /&gt;    &amp;lt;?sc } ?&amp;gt;&lt;br /&gt;&lt;br /&gt;    Side menus:&lt;br /&gt;    &amp;lt;?sc if(haveSideMenu) { ?&amp;gt;&lt;br /&gt;        * ${sideMenus("potato")}&lt;br /&gt;        * ${sideMenus("coleslaw")}&lt;br /&gt;    &amp;lt;?sc } ?&amp;gt;&lt;br /&gt;&lt;br /&gt;Hamburgers.scala&lt;br /&gt;    import org.scalalites.dreadlocks._&lt;br /&gt;    // You can specify instance of java.io.File, scala.io.Source or String to constructor of Template class.&lt;br /&gt;    val source   = Source.fromFile("template_variable.shtml")&lt;br /&gt;    val template = Template(source)&lt;br /&gt;    val context  = Context("restraunts" -&amp;gt; List("Baker Bounce", "Great Burger", "FELLOWS"),&lt;br /&gt;                           "haveSideMenu" -&amp;gt; true,&lt;br /&gt;                           "sideMenus" -&amp;gt; HashMap("potato" -&amp;gt; "French fries", "coleslaw" -&amp;gt; "Coleslaw"))&lt;br /&gt;&lt;br /&gt;    val output = template.render(context)&lt;br /&gt;    // Console.println(output)&lt;br /&gt;    // Delicious hamburger restraunts in Japan:&lt;br /&gt;    //   * Baker Bounce&lt;br /&gt;    //   * Great Burger&lt;br /&gt;    //   * FELLOWS&lt;br /&gt;    //&lt;br /&gt;    // Side menus:&lt;br /&gt;    //   * French fries&lt;br /&gt;    //   * Coleslaw&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;高速化と完全なScala構文のサポートを引き続き目指します。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://raku.to/?p=3"&gt;Released DreadLocks-0.1 template engine for Scala programmers&lt;/a&gt; (in english)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-2967572090350089230?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2967572090350089230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2967572090350089230'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/03/scala-scaladreadlocks-01.html' title='[Scala] ScalaベースのテンプレートエンジンDreadLocks 0.1をリリース'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4095897111378361310</id><published>2009-02-14T21:13:00.006+09:00</published><updated>2009-02-14T21:49:36.809+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>[Scala] ヒアドキュメントと正規表現</title><content type='html'>scalaの言語仕様に用意されているヒアドキュメントを使用すれば、エスケープシーケンスをエスケープする必要が無いため正規表現が簡単に書ける。&lt;br /&gt;&lt;br /&gt;before&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;var bwh = "90.60.88"&lt;br /&gt;val pat = new Regex("\\d+")&lt;br /&gt;pat.findAllIn(bwg) foreach println&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;なお、Stringクラスの"r"メソッドでStringクラスのインスタンスから正規表現のパターンオブジェクトを構築できる。&lt;br /&gt;&lt;br /&gt;after&lt;br /&gt;&lt;pre class="scala"&gt;&lt;br /&gt;"""\d+""".r.findAllIn("90.60.58") foreach println&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4095897111378361310?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4095897111378361310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4095897111378361310'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2009/02/scala.html' title='[Scala] ヒアドキュメントと正規表現'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-1818245227873918326</id><published>2008-12-03T21:36:00.003+09:00</published><updated>2008-12-04T11:42:26.525+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>[C++] Library for serialization of boost::subgraph</title><content type='html'>Oops, long time no post.&lt;br /&gt;&lt;br /&gt;Boost has powerful Graph library named BGL(Boost Graph Library), and serialization libraries, however the library for serialization of boost::subgraph doesn't exist, so i implement simple library to do that.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/rakuto/boost_subgraph_serialize/tree/master"&gt;boost_subgraph_serialize &lt;/a&gt;was commited on Github, so you can check out them with git.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% git clone git://github.com/rakuto/boost_subgraph_serialize.git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/rakuto/boost_subgraph_serialize/tree/master/subgraph_serialize_test.cpp"&gt;subgraph_serialize_test.cpp&lt;/a&gt;&lt;br /&gt;Demo that serialize boost::subgraph.&lt;br /&gt;&lt;pre class="cpp"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *  Serialization of boost::subgraph&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *  Created by Rakuto Furutani &amp;lt;xri://rakuto/&amp;gt; (rakuto+nospam@gmail.com)&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * output:&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * original:&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 0 &amp;lt;--&amp;gt; 1 2 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 1 &amp;lt;--&amp;gt; 0 4 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 2 &amp;lt;--&amp;gt; 0 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 3 &amp;lt;--&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 4 &amp;lt;--&amp;gt; 5 5 1 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 5 &amp;lt;--&amp;gt; 4 4 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * children num: 1&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * from file:&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 0 &amp;lt;--&amp;gt; 1 2 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 1 &amp;lt;--&amp;gt; 0 4 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 2 &amp;lt;--&amp;gt; 0 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 3 &amp;lt;--&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 4 &amp;lt;--&amp;gt; 5 5 1 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * 5 &amp;lt;--&amp;gt; 4 4 &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * children num: 1&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;fstream&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/graph/subgraph.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/graph/graph_utility.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;// arhivers&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/archive/binary_iarchive.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/archive/binary_oarchive.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;subgraph_serialize.h&amp;quot;&lt;/span&gt;â€¨&lt;br /&gt;&lt;span class="synStatement"&gt;using&lt;/span&gt; &lt;span class="synType"&gt;namespace&lt;/span&gt; boost;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;typedef&lt;/span&gt; property&amp;lt;vertex_name_t, &lt;span class="synType"&gt;char&lt;/span&gt;&amp;gt; VertexProperty;&lt;br /&gt;&lt;span class="synType"&gt;typedef&lt;/span&gt; property&amp;lt;edge_index_t, &lt;span class="synType"&gt;uint32_t&lt;/span&gt;, &lt;br /&gt; property&amp;lt;edge_weight_t, &lt;span class="synType"&gt;uint32_t&lt;/span&gt;&amp;gt; &amp;gt; EdgeProperty;&lt;br /&gt;&lt;span class="synType"&gt;typedef&lt;/span&gt; subgraph&amp;lt;adjacency_list&amp;lt;listS, vecS, undirectedS, VertexProperty, EdgeProperty&amp;gt; &amp;gt; Graph;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;const&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt;* DAT_FILE_NAME = &lt;span class="synConstant"&gt;&amp;quot;subgraph.dat&amp;quot;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt; &lt;span class="synType"&gt;enum&lt;/span&gt; {A, B, C, D, E, F, N};&lt;br /&gt; &lt;span class="synType"&gt;const&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt;* node_names = &lt;span class="synConstant"&gt;&amp;quot;ABCDEF&amp;quot;&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt; &lt;span class="synComment"&gt;// create root graph&lt;/span&gt;&lt;br /&gt; Graph root(N);&lt;br /&gt; property_map&amp;lt;Graph, vertex_name_t&amp;gt;::type vertex_names = get(vertex_name_t(), root);&lt;br /&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt;(&lt;span class="synType"&gt;uint32_t&lt;/span&gt; i = &lt;span class="synConstant"&gt;0&lt;/span&gt;; i &amp;lt; N; ++i) vertex_names[i] = node_names[i]; &lt;br /&gt; add_edge(A, B, EdgeProperty(&lt;span class="synConstant"&gt;1&lt;/span&gt;), root);&lt;br /&gt; add_edge(A, C, EdgeProperty(&lt;span class="synConstant"&gt;2&lt;/span&gt;), root);&lt;br /&gt; add_edge(E, F, EdgeProperty(&lt;span class="synConstant"&gt;3&lt;/span&gt;), root);&lt;br /&gt; &lt;br /&gt; &lt;span class="synComment"&gt;// create sub graph&lt;/span&gt;&lt;br /&gt; &lt;span class="synType"&gt;enum&lt;/span&gt; {B1, E1, F1}; &lt;span class="synComment"&gt;// refering to vertices in sub_g1&lt;/span&gt;&lt;br /&gt; Graph&amp;amp; sub_g1 = root.create_subgraph();&lt;br /&gt; add_vertex(B, sub_g1);&lt;br /&gt; add_vertex(E, sub_g1);&lt;br /&gt; add_vertex(F, sub_g1); &lt;br /&gt; add_edge(E1, F1, sub_g1);&lt;br /&gt; add_edge(B1, E1, sub_g1);&lt;br /&gt; &lt;br /&gt; std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;original:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&lt;br /&gt; print_graph(root);&lt;br /&gt; std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;children num: &amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; root.num_children() &amp;lt;&amp;lt; std::endl;&lt;br /&gt; &lt;br /&gt; &lt;span class="synComment"&gt;// serialize and save graph&lt;/span&gt;&lt;br /&gt; std::ofstream ofs(DAT_FILE_NAME, std::ios::out | std::ios::binary);&lt;br /&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt;(!ofs.is_open()) {&lt;br /&gt;  std::cerr &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;Can't open &amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; DAT_FILE_NAME &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot; file.&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;  &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;EXIT_FAILURE&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; archive::binary_oarchive oa(ofs);&lt;br /&gt; oa &amp;lt;&amp;lt; root;&lt;br /&gt; ofs.close();&lt;br /&gt; &lt;br /&gt; &lt;span class="synComment"&gt;// Try to restore saved graph&lt;/span&gt;&lt;br /&gt; Graph g;&lt;br /&gt; std::ifstream ifs(DAT_FILE_NAME, std::ios::in | std::ios::binary);&lt;br /&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt;(!ifs.is_open()) {&lt;br /&gt;  std::cerr &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;Can't open &amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; DAT_FILE_NAME &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot; file.&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;  &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;EXIT_FAILURE&lt;/span&gt;;  &lt;br /&gt; }&lt;br /&gt; archive::binary_iarchive ia(ifs);&lt;br /&gt; ia &amp;gt;&amp;gt; g;&lt;br /&gt; &lt;br /&gt; std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synSpecial"&gt;\n&lt;/span&gt;&lt;span class="synConstant"&gt;from file:&amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; std::endl;&lt;br /&gt; print_graph(g); &lt;br /&gt; std::cout &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;&amp;quot;children num: &amp;quot;&lt;/span&gt; &amp;lt;&amp;lt; g.num_children() &amp;lt;&amp;lt; std::endl;&lt;br /&gt; &lt;br /&gt; &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;EXIT_SUCCESS&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/rakuto/boost_subgraph_serialize/tree/master/subgraph_serialize.h"&gt;subgraph_serialize.h&lt;/a&gt;&lt;br /&gt;Implementation of serialazation of boost::subgraph.&lt;br /&gt;&lt;pre class="cpp"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *  Serialization of boost::subgraph&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *  Created by Rakuto Furutani &amp;lt;xri://rakuto/&amp;gt; (rakuto+nospam@gmail.com)&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#ifndef SUBGRAPH_SELIALIZE_H&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define SUBGRAPH_SELIALIZE_H&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/graph/adj_list_serialize.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/graph/adjacency_list.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;boost/graph/subgraph.hpp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;namespace&lt;/span&gt; boost {&lt;br /&gt;&lt;span class="synType"&gt;namespace&lt;/span&gt; serialization {&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;class&lt;/span&gt; Archive, &lt;span class="synType"&gt;class&lt;/span&gt; Graph&amp;gt;&lt;br /&gt;&lt;span class="synType"&gt;inline&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; save(Archive&amp;amp; ar,      &lt;br /&gt;     &lt;span class="synType"&gt;const&lt;/span&gt; subgraph&amp;lt;Graph&amp;gt; graph, &lt;br /&gt;     &lt;span class="synType"&gt;const&lt;/span&gt; &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; &lt;span class="synComment"&gt;/* file_version*/&lt;/span&gt;) &lt;br /&gt;{&lt;br /&gt; &lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;typename&lt;/span&gt; subgraph&amp;lt;Graph&amp;gt;::vertex_descriptor Vertex;&lt;br /&gt; &lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;typename&lt;/span&gt; subgraph&amp;lt;Graph&amp;gt;::const_children_iterator ChildrenIter;&lt;br /&gt;&lt;br /&gt; &lt;span class="synComment"&gt;// serialize global verticies and edges&lt;/span&gt;&lt;br /&gt; &lt;span class="synType"&gt;size_t&lt;/span&gt; num_children = graph.num_children();&lt;br /&gt; &lt;span class="synType"&gt;bool&lt;/span&gt; root = graph.is_root();&lt;br /&gt; ar &amp;lt;&amp;lt; BOOST_SERIALIZATION_NVP(root);&lt;br /&gt; ar &amp;lt;&amp;lt; BOOST_SERIALIZATION_NVP(num_children);&lt;br /&gt; ar &amp;lt;&amp;lt; BOOST_SERIALIZATION_NVP(graph.m_graph);&lt;br /&gt; ChildrenIter ci, ci_end;&lt;br /&gt; tie(ci, ci_end) = graph.children();&lt;br /&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt;(; ci != ci_end; ++ci) {&lt;br /&gt;  ar &amp;lt;&amp;lt; *ci;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;span class="synType"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;class&lt;/span&gt; Archive, &lt;span class="synType"&gt;class&lt;/span&gt; Graph&amp;gt;&lt;br /&gt;&lt;span class="synType"&gt;inline&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; load(&lt;br /&gt;     Archive&amp;amp; ar,&lt;br /&gt;     subgraph&amp;lt;Graph&amp;gt;&amp;amp; graph,&lt;br /&gt;     &lt;span class="synType"&gt;const&lt;/span&gt; &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; &lt;span class="synComment"&gt;/* file_version */&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt; &lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;typename&lt;/span&gt; subgraph&amp;lt;Graph&amp;gt;::vertex_descriptor Vertex;&lt;br /&gt; &lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;typename&lt;/span&gt; Graph::vertex_iterator VertexIter;&lt;br /&gt; Graph g;&lt;br /&gt; &lt;span class="synType"&gt;bool&lt;/span&gt; root;&lt;br /&gt; &lt;span class="synType"&gt;size_t&lt;/span&gt; num_children;&lt;br /&gt; ar &amp;gt;&amp;gt; BOOST_SERIALIZATION_NVP(root);&lt;br /&gt; ar &amp;gt;&amp;gt; BOOST_SERIALIZATION_NVP(num_children);&lt;br /&gt; ar &amp;gt;&amp;gt; BOOST_SERIALIZATION_NVP(g);&lt;br /&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt;(root) {&lt;br /&gt;  graph.m_graph = g;&lt;br /&gt; } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&lt;br /&gt;  VertexIter vi, vi_end;&lt;br /&gt;  tie(vi, vi_end) = vertices(g);&lt;br /&gt;  graph.create_subgraph(vi, vi_end);&lt;br /&gt; }&lt;br /&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt;(&lt;span class="synType"&gt;size_t&lt;/span&gt; i = &lt;span class="synConstant"&gt;0&lt;/span&gt;; i &amp;lt; num_children; ++i) {&lt;br /&gt;  ar &amp;gt;&amp;gt; BOOST_SERIALIZATION_NVP(graph);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;template&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;class&lt;/span&gt; Archive, &lt;span class="synType"&gt;class&lt;/span&gt; Graph&amp;gt;&lt;br /&gt;&lt;span class="synType"&gt;inline&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; serialize(&lt;br /&gt;       Archive&amp;amp; ar,&lt;br /&gt;       boost::subgraph&amp;lt;Graph&amp;gt;&amp;amp; graph,&lt;br /&gt;       &lt;span class="synType"&gt;const&lt;/span&gt; &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; file_version) &lt;br /&gt;{&lt;br /&gt; boost::serialization::split_free(ar, graph, file_version);&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;} &lt;span class="synComment"&gt;// namespace serialization&lt;/span&gt;&lt;br /&gt;} &lt;span class="synComment"&gt;// namespace boost&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Theses codes aren't tested enough, if you find bugs please email me(rakuto+nospam@gmail.com).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-1818245227873918326?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1818245227873918326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1818245227873918326'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/12/c-library-for-serialazation-of.html' title='[C++] Library for serialization of boost::subgraph'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-7755941954590018923</id><published>2008-10-13T17:55:00.003+09:00</published><updated>2008-10-13T18:15:45.724+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webkit'/><title type='text'>SFX VM 命令コード作成とバイトコードのプリティプリントのメモ</title><content type='html'>Revision 37555時点で、106の命令コードが実装されていて、103の命令コードについてドキュメントがコメント形式で与えられている。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;命令コードドキュメントの生成&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;% cd /path/to/WebKit/JavaScriptCore&lt;br /&gt;% perl docs/make-bytecode-docs.pl VM/Machine.cpp docs/bytecode.html&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;バイトコードプリティプリント&lt;/span&gt;&lt;br /&gt;DEBUGモードでビルドした時のみ、バイトコードを表示するための-dオプションが有効です。&lt;br /&gt;&lt;br /&gt;date_test.js&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;var d = new Date();&lt;br /&gt;print(d.getFullYear(), 1 + d.getMonth(), d.getDate());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% ./JavaScriptCore/build/Debug/jsc -d date_test.js&lt;br /&gt;18 instructions; 388 bytes at 0x905b50; 1 parameter(s); 18 callee register(s)&lt;br /&gt;&lt;br /&gt;[   0] enter&lt;br /&gt;[   1] mov               r-14, r0&lt;br /&gt;[   4] mov               r2, r0&lt;br /&gt;[   7] resolve_global    r3, [object global], Date(@id0)&lt;br /&gt;[  13] get_by_id         r4, r3, prototype(@id1)&lt;br /&gt;[  21] construct         r-14, r3, r4, 5, 1, 14&lt;br /&gt;[  28] construct_verify  r-14, r5&lt;br /&gt;[  31] resolve_func      r2, r3, print(@id2)&lt;br /&gt;[  35] get_by_id         r6, r-14, getFullYear(@id3)&lt;br /&gt;[  43] call              r5, r6, r-14, 7, 1, 16&lt;br /&gt;[  50] mov               r7, r1&lt;br /&gt;[  53] get_by_id         r8, r-14, getMonth(@id4)&lt;br /&gt;[  61] call              r9, r8, r-14, 9, 1, 18&lt;br /&gt;[  68] add               r6, r7, r9&lt;br /&gt;[  73] get_by_id         r8, r-14, getDate(@id5)&lt;br /&gt;[  81] call              r7, r8, r-14, 9, 1, 18&lt;br /&gt;[  88] call              r2, r3, r2, 4, 4, 16&lt;br /&gt;[  95] end               r2&lt;br /&gt;&lt;br /&gt;Identifiers:&lt;br /&gt;  id0 = Date&lt;br /&gt;  id1 = prototype&lt;br /&gt;  id2 = print&lt;br /&gt;  id3 = getFullYear&lt;br /&gt;  id4 = getMonth&lt;br /&gt;  id5 = getDate&lt;br /&gt;&lt;br /&gt;Constants:&lt;br /&gt;   r0 = undefined&lt;br /&gt;   r1 = 1&lt;br /&gt;&lt;br /&gt;StructureIDs:&lt;br /&gt;  [   7] resolve_global: 0x0&lt;br /&gt;  [  13] get_by_id: 0x0&lt;br /&gt;  [  35] get_by_id: 0x0&lt;br /&gt;  [  53] get_by_id: 0x0&lt;br /&gt;  [  73] get_by_id: 0x0&lt;br /&gt;&lt;br /&gt;2008 10 13&lt;br /&gt;End: undefined&lt;br /&gt;LEAK: 135 StructureID&lt;br /&gt;%                                                                              &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-7755941954590018923?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7755941954590018923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7755941954590018923'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/10/sfx-vm.html' title='SFX VM 命令コード作成とバイトコードのプリティプリントのメモ'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-3667823278649736106</id><published>2008-10-09T22:40:00.006+09:00</published><updated>2008-10-12T17:55:45.166+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Webkit'/><title type='text'>5倍速いSquirrelFish Extremeの正規表現エンジンWREC</title><content type='html'>「recursive callを得意とするV8が、recursive callに比重をおいた、V8 Benchmark Suiteで速い!速い!と語られるのはフェアではない」&lt;br /&gt;&lt;br /&gt;今回、正規表現のみに焦点を当ててJavaScriptエンジンを比較してみた。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;環境&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SpiderMonkey - 1.7.0 2007-10-03&lt;/li&gt;&lt;li&gt;SFX - Revision: 37445&lt;/li&gt;&lt;li&gt;v8 - Revision: 389&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;SFX(SquirrerlFish Extreme)に新しく搭載されたWREC("the WebKit Regular Expression Compiler")、Safari 3に搭載されているJavaScript Coreに比べて、なんと5倍も速い。正規表現の実行が占める実行時間が、Webアプリケーション全体の実行時間の3%ほどだとすれば、WRECは、2.4%ほどの高速化に貢献している。&lt;br /&gt;&lt;br /&gt;V8, SFX, SpiderMonkey, Safari 3で&lt;a href="http://www2.webkit.org/perf/sunspider-0.9/regexp-dna.html"&gt;regexp-dna.html&lt;/a&gt;をベースに作成したベンチマークスクリプトでベンチマークを計測した。スループット(1分間の実行回数)を算出しているので、グラフが大きい方が高性能。(5回測定した結果の中央値を利用)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_h3yjP15uxZ4/SO7YsY2WETI/AAAAAAAAAOA/OIPkM90ZDY4/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_h3yjP15uxZ4/SO7YsY2WETI/AAAAAAAAAOA/OIPkM90ZDY4/s400/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png" alt="" id="BLOGGER_PHOTO_ID_5255376072284180786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SFXが、Safari 3の6.44倍も速いという結果がでた!!公式に発表されている結果では、5倍だからそれよりも速い!が、String.prototype.replaceメソッドの実装に差があるため、この結果はフェアではない。regex-dna.jsを修正し、実行した結果は次の通り。&lt;br /&gt;&lt;br /&gt;実行結果&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_h3yjP15uxZ4/SO7buLVeNiI/AAAAAAAAAOI/4yruNT7fQ88/s1600-h/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_h3yjP15uxZ4/SO7buLVeNiI/AAAAAAAAAOI/4yruNT7fQ88/s400/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+2.png" alt="" id="BLOGGER_PHOTO_ID_5255379401551263266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;公式の発表に近い、Safari 3の5.19倍速いという結果がでたので、概ね正しそうだ。&lt;br /&gt;&lt;br /&gt;regexp-dna.jsの修正内容は、次のとおり。&lt;br /&gt;&lt;pre class="diff"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;  dnaInput = dnaInput.replace(k, subs[k], "g")&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;---&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;gt;  dnaInput = dnaInput.replace(new RegExp(k, 'g'), subs[k]);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;String.prototype.replaceの実装の差&lt;/span&gt;&lt;br /&gt;ECMAScript262によるString.prototype.replace(searchValue, replaceValue)の定義では、第三引数は受付けないが、MozillaのSpiderMonkeyでは、第一引数に文字列が渡された場合に、第三引数に正規表現フラグを指定できるように拡張している。&lt;br /&gt;&lt;br /&gt;もうひとつ。SpiderMonkey(js), SFX(jsc), v8(v8-shell)でString.prototype.replace関数の比較をすると、SFXの実装だけ明らかに他の2つとは異なることがわかる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% js&lt;br /&gt;js&gt; 'aaaaa'.replace('a', '_$&amp;amp;_', 'g') # SpiderMonkeyでは、gフラグが有効&lt;br /&gt;_a__a__a__a__a_&lt;br /&gt;&lt;br /&gt;% v8-shell&lt;br /&gt;V8 version 0.2.5&lt;br /&gt;&gt; 'aaaaa'.replace('a', '_$&amp;amp;_', 'g') # v8では、gフラグは無効&lt;br /&gt;_a_aaaa&lt;br /&gt;&lt;br /&gt;% jsc&lt;br /&gt;&gt; 'aaaaa'.replace('a', '_$&amp;amp;_', 'g') # SFXでも、gフラグは無効&lt;br /&gt;_$&amp;amp;_aaaa&lt;br /&gt;&gt;'aaaaa'.replace(/a/, '_$&amp;amp;_', 'g')&lt;br /&gt;_a_aaaa&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;WRECでは、第一引数が通常の文字列の場合は、通常の文字列置換が行われ、第二引数の置換テキスト($&amp;)が展開されない。SFX中では、"WebKit/JavaScriptCore/kjs/StringPrototype.cpp"にString.prototype.replaceの実装があるが、文字列を探索して、マッチした以前の部分、置換する文字列、マッチした後の文字列を連結して返している。&lt;br /&gt;&lt;br /&gt;WebKit/JavaScriptCore/kjs/StringPrototype.cpp&lt;br /&gt;&lt;pre class="cpp"&gt;&lt;br /&gt;JSValue* stringProtoFuncReplace(ExecState* exec, JSObject*, JSValue* thisValue, &lt;span class="synType"&gt;const&lt;/span&gt; ArgList&amp;amp; args)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="synComment"&gt;// 引数の処理&lt;/span&gt;&lt;br /&gt;   &lt;span class="synStatement"&gt;if&lt;/span&gt; (pattern-&amp;gt;isObject(&amp;amp;RegExpObject::info)) {&lt;br /&gt;     &lt;span class="synComment"&gt;// 第一引数がRegExpオブジェクトのケースの処理&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="synComment"&gt;// 第一引数が文字列の場合&lt;/span&gt;&lt;br /&gt;    &lt;span class="synComment"&gt;// First arg is a string&lt;/span&gt;&lt;br /&gt;    UString patternString = pattern-&amp;gt;toString(exec);&lt;br /&gt;    &lt;span class="synType"&gt;int&lt;/span&gt; matchPos = source.find(patternString);&lt;br /&gt;    &lt;span class="synType"&gt;int&lt;/span&gt; matchLen = patternString.size();&lt;br /&gt;    &lt;span class="synComment"&gt;// Do the replacement&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;if&lt;/span&gt; (matchPos == -&lt;span class="synConstant"&gt;1&lt;/span&gt;)&lt;br /&gt;        &lt;span class="synStatement"&gt;return&lt;/span&gt; sourceVal;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;if&lt;/span&gt; (callType != CallTypeNone) {&lt;br /&gt;        ArgList args;&lt;br /&gt;        args.append(jsSubstring(exec, source, matchPos, matchLen));&lt;br /&gt;        args.append(jsNumber(exec, matchPos));&lt;br /&gt;        args.append(sourceVal);&lt;br /&gt;&lt;br /&gt;        replacementString = call(exec, replacement, callType, callData, exec-&amp;gt;globalThisValue(), args)-&amp;gt;toString(exec);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; jsString(exec, source.substr(&lt;span class="synConstant"&gt;0&lt;/span&gt;, matchPos) + replacementString + source.substr(matchPos + matchLen));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;String.prototype.replaceの第一引数が文字列の場合に、単純な文字列置換をおこないパフォーマンスを向上する最適化は、SpiderMonkeyでもとりこまれる予定だ。(See &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=432525"&gt;Bug 432525&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WRECでは、グルーピングは未実装&lt;/span&gt;&lt;br /&gt;シンプル!軽量!速い!と3拍子そろったWRECだけど、グルーピングの機能は実装しておらず、グルーピング付きのパターンが指定された時は、PCREに処理を任せることになるため、実行速度が低下する。&lt;br /&gt;&lt;br /&gt;&lt;pre class="cpp"&gt;&lt;br /&gt;&lt;span class="synType"&gt;bool&lt;/span&gt; WRECParser::parseParentheses(JmpSrcVector&amp;amp;)&lt;br /&gt;{&lt;br /&gt;    &lt;span class="synComment"&gt;// &lt;/span&gt;&lt;span class="synTodo"&gt;FIXME&lt;/span&gt;&lt;span class="synComment"&gt;: We don't currently backtrack correctly within parentheses in cases such as&lt;/span&gt;&lt;br /&gt;    &lt;span class="synComment"&gt;// &amp;quot;c&amp;quot;.match(/(.*)c/) so we fall back to PCRE for any regexp containing parentheses.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    m_err = TempError_unsupportedParentheses;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;false&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;regepx-dna.htmlのベンチマークでグルーピングありとなしを比べると実行速度の差が明らかになる。実行時間が変更前の140%になったSpiderMonkeyに比べて、SFXは、680%もの増加となった。&lt;br /&gt;&lt;br /&gt;変更前&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;  dnaInput = dnaInput.replace(/g*t/g, subs[k]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% jsc regexp-dna.js&lt;br /&gt;285 (msec)&lt;br /&gt;&lt;br /&gt;% js regepx-dna.js&lt;br /&gt;1789 (msec)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;変更後 (SFXでは、680%の速度低下)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;  dnaInput = dnaInput.replace(/(g*)t/g, subs[k]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% jsc regexp-dna.js&lt;br /&gt;1942 (msec)&lt;br /&gt;&lt;br /&gt;% js regexp-dna.js&lt;br /&gt;2501 (msec)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-3667823278649736106?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3667823278649736106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3667823278649736106'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/10/5squirrelfish-extremewrec.html' title='5倍速いSquirrelFish Extremeの正規表現エンジンWREC'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h3yjP15uxZ4/SO7YsY2WETI/AAAAAAAAAOA/OIPkM90ZDY4/s72-c/%E3%83%94%E3%82%AF%E3%83%81%E3%83%A3+1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-8283789467560159033</id><published>2008-09-11T12:57:00.007+09:00</published><updated>2008-09-11T18:25:30.360+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Pythonでデコ•メソッドキャッシュ (memcached)</title><content type='html'>おっPythonハカーを多数抱える、煩悩駆動開発で有名な&lt;a href="http://glucose.jp/"&gt;glucose.jp&lt;/a&gt;のお手伝いをする機会があり、４年ぶりにPythonを書いた。2.3以来だったので、2.5を眺めているとデコレーターと呼ばれる機能が導入されていた。&lt;br /&gt;&lt;br /&gt;デコレーターとクロージャーを組み合わせれば、メソッドの挙動を自由にカスタマイズすることができる。この機能を使用して、関数の結果をmemcachedでキャッシュする機能を付与するデコレーターを作ってみた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;あらかじめ、CACHE変数をmemcachedクライアントで初期化しておく必要がある。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;挙動&lt;/span&gt;&lt;br /&gt;ソースは、少々ややこしいけど、実行の仕組みは単純。&lt;br /&gt;&lt;br /&gt;Step 1:&lt;br /&gt;@cached構文実行時に、ack関数に対して、cached関数が実行され、ack関数がdecorated_funcを呼び出した結果でack関数が置換される。(返り値は、callableなオブジェクトでないといけない。)&lt;br /&gt;&lt;br /&gt;Step 2:&lt;br /&gt;decorated_func関数の呼び出し時の引数は、元のack関数。decorated_func関数の内部では、func_with_cacheが定義されており、ack関数に渡した引数を渡して実行される。この関数が、関数呼び出しの結果のキャッシュをチェックする本体となる。&lt;br /&gt;&lt;br /&gt;&lt;pre class="python" style="height: 650px"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Decorate methods with capability for caching result&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# &lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# @author   Rakuto Furutani &amp;lt;http://raku.to/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# @version  0.1.0&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;import&lt;/span&gt; cPickle&lt;br /&gt;&lt;span class="synPreProc"&gt;import&lt;/span&gt; memcache&lt;br /&gt;&lt;span class="synPreProc"&gt;import&lt;/span&gt; time&lt;br /&gt;&lt;span class="synPreProc"&gt;import&lt;/span&gt; md5&lt;br /&gt;&lt;br /&gt;__all__ = ['&lt;span class="synConstant"&gt;cached&lt;/span&gt;', '&lt;span class="synConstant"&gt;init&lt;/span&gt;']&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;TODO&lt;/span&gt;&lt;span class="synComment"&gt;: CACHE variable and function for initialize move to scope in Devkit.cache.*&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# You must define global variable named 'CACHE' with instance of memcache client.&lt;/span&gt;&lt;br /&gt;CACHE = None&lt;br /&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;init&lt;/span&gt;(cache_client):&lt;br /&gt;  """&lt;span class="synConstant"&gt; We should initialize this library with this method&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;        examples:&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            CACHE = memcache.Client(['127.0.0.1:11211'], debug=0) &lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            methods_cache.init(CACHE)&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;    &lt;/span&gt;"""&lt;br /&gt;  &lt;span class="synStatement"&gt;global&lt;/span&gt; CACHE&lt;br /&gt;  CACHE = cache_client&lt;br /&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;cached&lt;/span&gt;(d_args):&lt;br /&gt;  """&lt;span class="synConstant"&gt; Decorate method with caching capability for caching&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;        All result call the function are cached with cache key generated by function name and parameters.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;        examples:&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            @cached({'ttl': 3600})&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            def havy_complex_func(args):&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;                # do something&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            # Return whether result call real function or cached result&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            havy_complex_func()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            # You can specify cache key name explicitly&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            @cached({'ttl': 3600, 'key': 'foo_bar'})&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            def foo_bar():&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;                # doo something&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            # You can also decorate one without ttl parameter&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            @cached&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;            def havy_complex_func(args):&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;                # do something&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;    &lt;/span&gt;"""&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;cache_key&lt;/span&gt;(func, args):&lt;br /&gt;      """&lt;span class="synConstant"&gt;Generate unique cache key with funcion name and arguments&lt;/span&gt;"""&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; "&lt;span class="synConstant"&gt;%s_%s&lt;/span&gt;" % (func.__name__, md5.new(str(args)).hexdigest())&lt;br /&gt;&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;call_and_cache&lt;/span&gt;(func, args, key):&lt;br /&gt;      ret = func(*args)&lt;br /&gt;      data = {'&lt;span class="synConstant"&gt;ttl&lt;/span&gt;': (time.time() + d_args['&lt;span class="synConstant"&gt;ttl&lt;/span&gt;'] &lt;span class="synStatement"&gt;if&lt;/span&gt; '&lt;span class="synConstant"&gt;ttl&lt;/span&gt;' &lt;span class="synStatement"&gt;in&lt;/span&gt; d_args &lt;span class="synStatement"&gt;else&lt;/span&gt; None), '&lt;span class="synConstant"&gt;d&lt;/span&gt;': ret}&lt;br /&gt;      CACHE.set(key, cPickle.dumps(data))&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; ret&lt;br /&gt;&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;decorated_func&lt;/span&gt;(func):&lt;br /&gt;      &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;func_with_cache&lt;/span&gt;(*args):&lt;br /&gt;          key = d_args['&lt;span class="synConstant"&gt;key&lt;/span&gt;'] &lt;span class="synStatement"&gt;if&lt;/span&gt; ('&lt;span class="synConstant"&gt;key&lt;/span&gt;' &lt;span class="synStatement"&gt;in&lt;/span&gt; d_args) &lt;span class="synStatement"&gt;else&lt;/span&gt; cache_key(func, args)&lt;br /&gt;          cached_val = CACHE.get(key)&lt;br /&gt;          &lt;span class="synStatement"&gt;if&lt;/span&gt; cached_val &lt;span class="synStatement"&gt;is&lt;/span&gt; &lt;span class="synStatement"&gt;not&lt;/span&gt; None:&lt;br /&gt;              cached_val = cPickle.loads(cached_val)&lt;br /&gt;              &lt;span class="synStatement"&gt;if&lt;/span&gt; (cached_val['&lt;span class="synConstant"&gt;ttl&lt;/span&gt;'] &lt;span class="synStatement"&gt;is&lt;/span&gt; &lt;span class="synStatement"&gt;not&lt;/span&gt; None) &lt;span class="synStatement"&gt;and&lt;/span&gt; (cached_val['&lt;span class="synConstant"&gt;ttl&lt;/span&gt;'] &amp;gt;= time.time()):&lt;br /&gt;                  &lt;span class="synStatement"&gt;return&lt;/span&gt; cached_val['&lt;span class="synConstant"&gt;d&lt;/span&gt;']&lt;br /&gt;          &lt;span class="synStatement"&gt;return&lt;/span&gt; call_and_cache(func, args, key)&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; func_with_cache&lt;br /&gt;  &lt;span class="synStatement"&gt;return&lt;/span&gt; decorated_func&lt;br /&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; __name__ == '&lt;span class="synConstant"&gt;__main__&lt;/span&gt;':&lt;br /&gt;  &lt;span class="synPreProc"&gt;import&lt;/span&gt; sys&lt;br /&gt;  &lt;span class="synPreProc"&gt;import&lt;/span&gt; time&lt;br /&gt;&lt;br /&gt;  sys.setrecursionlimit(10000)&lt;br /&gt;&lt;br /&gt;  &lt;span class="synComment"&gt;# Define memcache client&lt;/span&gt;&lt;br /&gt;  CACHE = memcache.Client(['&lt;span class="synConstant"&gt;127.0.0.1:11211&lt;/span&gt;'], debug=0)&lt;br /&gt;&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;_internal_ack&lt;/span&gt;(m, n):&lt;br /&gt;      &lt;span class="synStatement"&gt;if&lt;/span&gt; m == 0:&lt;br /&gt;          result = n + 1&lt;br /&gt;      &lt;span class="synStatement"&gt;elif&lt;/span&gt; n == 0:&lt;br /&gt;          result = ack(m - 1, 1)&lt;br /&gt;      &lt;span class="synStatement"&gt;else&lt;/span&gt;:&lt;br /&gt;          result = ack(m - 1, ack(m, n -1))&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; result&lt;br /&gt;&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;ack&lt;/span&gt;(m, n):&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; _internal_ack(m, n)&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;@&lt;/span&gt;&lt;span class="synIdentifier"&gt;cached&lt;/span&gt;({'&lt;span class="synConstant"&gt;ttl&lt;/span&gt;': 3600})&lt;br /&gt;  &lt;span class="synStatement"&gt;def&lt;/span&gt; &lt;span class="synIdentifier"&gt;ack_with_cache&lt;/span&gt;(m, n):&lt;br /&gt;      &lt;span class="synStatement"&gt;return&lt;/span&gt; _internal_ack(m, n)&lt;br /&gt;&lt;br /&gt;  t = time.time()&lt;br /&gt;  ret = ack(3, 4)&lt;br /&gt;  &lt;span class="synStatement"&gt;print&lt;/span&gt;("&lt;span class="synConstant"&gt;ack(3, 4) returned %d - %s sec&lt;/span&gt;" % (ret, str(time.time() - t)))&lt;br /&gt;&lt;br /&gt;  ack_with_cache(3, 4) &lt;span class="synComment"&gt;# cached once&lt;/span&gt;&lt;br /&gt;  t = time.time()&lt;br /&gt;  ret = ack_with_cache(3, 4)&lt;br /&gt;  &lt;span class="synStatement"&gt;print&lt;/span&gt;("&lt;span class="synConstant"&gt;ack(3, 4) returned %d with cached - %s sec&lt;/span&gt;" % (ret, str(time.time() - t)))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;実行結果&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ack(3, 4) returned 125 - 0.00920796394348 sec&lt;br /&gt;ack(3, 4) returned 125 with cached - 0.000248908996582 sec&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;まとめ&lt;/span&gt;&lt;br /&gt;来月から、shn@glucose.jpによるおっPython連載がオライリーで始まるらしい。代表取締役としての世間体と、煩悩の狭間で、どこまで書いていいのか悩んでいるようだ。結論をそれに帰着するという路線と合わせて、”ゆるかわPython”なるコンセプトを提案し、２０代後半女性Pythonianを増やす革命者になるという路線も考えているようだ。&lt;br /&gt;&lt;br /&gt;記事の影響により、glucose発の女性Pythonハカー誕生なるか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-8283789467560159033?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/8283789467560159033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/8283789467560159033'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/09/python.html' title='Pythonでデコ•メソッドキャッシュ (memcached)'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4418533647712647783</id><published>2008-08-29T10:21:00.001+09:00</published><updated>2008-08-29T10:38:45.030+09:00</updated><title type='text'>iPhoneのセキュリティ向上のために設定しておくべき事</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_h3yjP15uxZ4/SLdS3O8xo1I/AAAAAAAAAGI/MyC7Ni2FSaY/s1600-h/passcode.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/_h3yjP15uxZ4/SLdS3O8xo1I/AAAAAAAAAGI/MyC7Ni2FSaY/s400/passcode.jpg" alt="" id="BLOGGER_PHOTO_ID_5239747800328151890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;脆弱性。&lt;br /&gt;&lt;br /&gt;将来において改善されそうなiPhoneの仕様 or バグの一つが話題になっている。パスコードロックがかかっている画面から緊急電話をクリックした画面でホームボタンをダブルクリックすると「よく使う項目」にアクセスできてしまう。(表示された画面のキャンセルボタンも機能しないし、おそらくバグ)&lt;br /&gt;&lt;br /&gt;脆弱性回避のために、&lt;br /&gt;設定 -&gt; 一般 -&gt; ホームボタンで、「よく使う項目にチェックされているフィールドを、「ホーム」にしておく。&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;パスコードロックの画面では、スクリーンショット機能は起動できないが、緊急電話をかけるための画面では、スクリーンショット機能が利用できた。(ただし、実際は、壁紙しか映らなかった。)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;関連記事&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://venturebeat.com/2008/08/27/the-iphone-202-security-flaw-and-its-temporary-fix/%20"&gt;The iPhone 2.0.2 security flaw — and its temporary fix&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cultofmac.com/major-security-hole-in-iphone-firmware/2626"&gt;Major Security Hole in iPhone Firmware — And How To Fix It&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4418533647712647783?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4418533647712647783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4418533647712647783'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/08/iphone.html' title='iPhoneのセキュリティ向上のために設定しておくべき事'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_h3yjP15uxZ4/SLdS3O8xo1I/AAAAAAAAAGI/MyC7Ni2FSaY/s72-c/passcode.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2685763931796149606</id><published>2008-08-26T10:40:00.006+09:00</published><updated>2008-08-26T12:32:59.077+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><title type='text'>ワイヤレス共振エネルギー・リンク(WREL)と物体プログラミング</title><content type='html'>「机に座り、起動時間が３分程かかる窓のアイコンを眺めつつ、ただ待つ。モデムのスイッチを入れて、PPP接続アシスタントを立ち上げ、青いeのアイコンをクリックする。さぁ、インターネットを始めるぞ！」１３年程前か。そんな時代が、随分と懐かしく感じる。&lt;br /&gt;&lt;br /&gt;iPhoneの登場が、私達のオフラインでいる時間を無情にも奪う。Firmware 2.0.2でも、電波状況は(まだ)悪いけど、場所を選ばすにSafariが立ち上がり、Google Readerを読めるのはとても魅力的だ。オンラインでいる時間が増えるから、ライフストリーミング系のアプリケーションが盛り上がるわけだ。パーベイシブコンピューティング、インターネットは場所を選ばず利用できるようになりつつある。原丈人氏の言葉で言えば、PUC(パーベイシブユビキタスコミュニケーション)だろうか。GPS, WiFiをiPhone上で使っていて、電池の減りがいつも気になる。iPhoneは、バッテリーの交換が出来ないのに。&lt;br /&gt;&lt;br /&gt;瀧内氏と飲んでいる時にも、よく盛り上がる話題の一つが、ワイヤレス給電だ。&lt;br /&gt;WiFi同様に、電力が場所を選ばずに利用できる時代、町中に"パワースポット"が普及するのはいつ頃だろうか？といった内容の話をする。人体に影響を与えず、利用料に応じて課金される従量制。そんな電力スポットの登場が待ち遠しい。&lt;br /&gt;&lt;br /&gt;インテル・デベロッパー・フォーラム（IDF）Fall 2008で、MITで研究されているWREL(Resonant Energy Link)のデモが公開された。&lt;br /&gt;&lt;br /&gt;via &lt;a href="http://www.intel.co.jp/jp/intel/pr/press2008/080822.htm"&gt;2050 年までに人間と機械はより一層近づくと講演&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;ノートブック PC を持って空港や部屋に入るだけで、バッテリーが消耗するどころか充電されるとしたら…。MIT の物理学者の理論をもとに、インテルではワイヤレス共振エネルギー・リンク（Wireless Resonant Energy Link：WREL）の研究を行っています。ラトナーは、電源プラグも電線も使わずに、60 ワットの電球を点灯してみせました。60 ワットは、標準的なノートブック PC の消費電力を上回る電力です。&lt;br /&gt;&lt;br /&gt;WREL の素晴らしい点は、電力をワイヤレスで安全かつ効率的に供給できることです。この技術は強結合共振器を使用します。訓練された歌手が声でガラスを割ることができるのとよく似た原理です。これはガラスの固有振動数で音響エネルギーが吸収されることと同じ様に、受信側の共振器の固有振動数と共振することで、エネルギーは効率よく吸収されます。このテクノロジーをノートブック PC などに搭載すれば、送信側の共振器から数十センチの距離に近づけることでバッテリーを充電することが可能になります。&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_h3yjP15uxZ4/SLNkEp1vXAI/AAAAAAAAAGA/CCLgQfgLxag/s1600-h/DSC_0382.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_h3yjP15uxZ4/SLNkEp1vXAI/AAAAAAAAAGA/CCLgQfgLxag/s400/DSC_0382.JPG" alt="" id="BLOGGER_PHOTO_ID_5238640822675528706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;WRELは、MITの物理学者&lt;a href="http://web.mit.edu/physics/facultyandstaff/faculty/marin_soljacic.html"&gt;Marin Soljacic&lt;/a&gt;氏らの研究をベースにしている。関連記事は次の通り。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://web.mit.edu/newsoffice/2007/wireless-0607.html%20"&gt;Goodby Wires&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;このプレスリリースには、&lt;a href="http://d.hatena.ne.jp/keyword/%A5%DB%A5%A4%A5%DD%A5%A4%A5%AB%A5%D7%A5%BB%A5%EB?kid=160674"&gt;ポイポイカプセル&lt;/a&gt;を思い起こさせるような一節がある。「物体もプログラム可能に：形を変えるコンピューター」と題して、次のように記載されている。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;インテルではまた、何百万個もの「catom」と呼ばれる微小なマイクロロボットによって、自在に形状を変えることができる素材の研究を進めています。この素材をコンピューティング機器の筐体やディスプレイ、キーボードの製造に使うことにより、ユーザー固有の形状にすることができます。例えばノートブック PC ならば、ポケットに入れるときは小さくなり、携帯電話として使用するときは受話器の形になり、インターネットを閲覧したり映画を見るときは、大きく薄くなってキーボードも現れる、といったことが可能になります。&lt;/blockquote&gt;&lt;br /&gt;インテル面白いなぁ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-2685763931796149606?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2685763931796149606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2685763931796149606'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/08/wrel.html' title='ワイヤレス共振エネルギー・リンク(WREL)と物体プログラミング'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_h3yjP15uxZ4/SLNkEp1vXAI/AAAAAAAAAGA/CCLgQfgLxag/s72-c/DSC_0382.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-68450927126211619</id><published>2008-08-08T16:48:00.001+09:00</published><updated>2008-08-08T17:11:36.912+09:00</updated><title type='text'>robots.txt 2.0の書き方</title><content type='html'>海の向こうで話題になっていた時は、その圧倒的な力に感心する程度であったが、実際に日本でもGoogle Street Viewが、リアルクローラーを走らせているとなるとプライバシーが気になる。公共の道路で撮影された映像には、著作権は存在しなく、まずい画像については、モザイクやユーザからの投稿で対応していくとの事だが、土地所有者や人にもrobot.txtを書く権利を与えてくれてもいいだろう。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.guiabuscadores.com/blog/imagenes/googlevan.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://www.guiabuscadores.com/blog/imagenes/googlevan.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;via &lt;a href="http://www.guiabuscadores.com/2007/117/#10658%20"&gt;Robots.txt 2.0&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;「ベッドルームの撮影はお断り」との事だ。&lt;br /&gt;クローラーがVanでなくて、小型偵察機や昆虫のような大きさまで小さくなった時には、どうなるのだろうか。拡張現実社会の到来にむけて、実世界におけるrobots.txtの書き方を真剣に考えるべき時である。&lt;br /&gt;&lt;br /&gt;撮影された画像に著作権が無いとすれば、Google Street View上に広告を配信することは可能なんだろうか？ネタ画像を探そうと、みんながどこを探しまわっているかは、だいたい想像がつく。何よりGoogleには、Google Street View上での膨大なユーザのアクティビティログが残っている。ユーザが良く訪れる場所に広告を出して、「一部、拡張現実です」と明記している事はいけないのだろうか？&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/gp/product/4104596035?ie=UTF8&amp;amp;tag=drecomblog08-22&amp;amp;linkCode=as2&amp;amp;camp=247&amp;amp;creative=1211&amp;amp;creativeASIN=4104596035"&gt;ザッツ監視社会&lt;/a&gt;はどのような世界なのか？&lt;br /&gt;覗いてみたい方は、大統領暗殺の濡れ衣を着せられた一人の男の物語、ゴールデンスランバーを一読してみると良い。街中に設置されたセキュリティポットは、犯罪をおかさない善良な市民にとってはいいかもしれない。しかし、この男は、"見えない力"によりオズワルドに仕立てられた男なのだ。&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=drecomblog08-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=4104596035&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Google.govなんてくそくらえ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-68450927126211619?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/68450927126211619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/68450927126211619'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/08/robotstxt-20.html' title='robots.txt 2.0の書き方'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4185285116825478572</id><published>2008-07-18T18:25:00.005+09:00</published><updated>2008-07-19T12:12:10.378+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><title type='text'>OpenID動向 - Trusted Data Exchangeがユーザ属性ポータビリティの切り札になるか？</title><content type='html'>第三回 Liberty Alliance 技術セミナーで&lt;a href="http://www.sakimura.org/modules/xhld0/"&gt;=nat&lt;/a&gt;さんの基調講演を公聴してきて、OpenID関連の動向を仕入れたのでメモ。&lt;br /&gt;&lt;br /&gt;OPとRP間で属性情報を交換するための拡張として、SREGやAXがあるが、AXも今ひとつ普及するに至っていない。(myopenid.comとVeriSignだけ？)また、プライバシポリシーや利用規約の問題もあり、日本企業では、ユーザ属性をサードパーティに公開出来ない事も多い。&lt;br /&gt;&lt;br /&gt;基本的に、AXとSREGの違いは、&lt;br /&gt;&lt;ul&gt;&lt;li&gt;交換可能な属性をコミュニティベースで提案&amp;amp;決定する&lt;/li&gt;&lt;li&gt;属性を識別するために、プリミティブな値でなく、ネームスペースURIを使う&lt;/li&gt;&lt;li&gt;OPに要求する属性の個数が指定可能&lt;/li&gt;&lt;li&gt;RPがOPに対して属性の保存をする事が可能。(ただし、使われているプロバイダは知らない。)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;が挙げられるが、根本的な問題は、OpenIDのユーザ属性として、クレジットカード番号や電話番号などプライバシー性の高い情報を使う事など、気が狂っていると思われている事だ。AXへの本格的な以降が進まないのは、結局OpenIDで扱うユーザ属性は、ニックネームやメールアドレスのみで、SREGで十分に事が足りているからではないだろうか。&lt;br /&gt;&lt;br /&gt;さて、単純なユーザ属性の交換と、OP側でのユーザの許可の仕組みしか提供していないAXに代わる仕様として、&lt;span style="font-weight: bold;"&gt;&lt;a href="http://iiw.idcommons.net/index.php/Trusted_Data_Exchange"&gt;Trusted Data Exchange&lt;/a&gt;&lt;/span&gt;が=natさん、=masakiさん (NRI)から提出されている。&lt;br /&gt;&lt;br /&gt;TXのコンセプトには次のような物が含まれる。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;契約ベースの属性提供&lt;/li&gt;&lt;li&gt;XML Encryption/XML Signatureによる暗号化•書名&lt;/li&gt;&lt;li&gt;非同期な属性提供 (非否認性を持った契約ベース)&lt;/li&gt;&lt;li&gt;RPの信憑性を判断するReputation Platform (現状のホワイトリストに代わる)&lt;/li&gt;&lt;/ul&gt;仕様は既に、&lt;a href="http://wiki.openid.net/Trusted_Data_Exchange"&gt;提案済み&lt;/a&gt;で、仕様が取り込まれる方向で話が進んでいる様子。OpenIDによるログインフォームは、会員登録の敷居を下げる。結果的に、サービスを利用する敷居が下がり、クレジットカートや住所などの個人情報が信頼できないRPに渡る可能性が高くなる。ユーザ属性ポータビリティには、Reputation Platformの構築は、急務であると言える。&lt;br /&gt;&lt;br /&gt;年内に取り込まれるだろうか？&lt;br /&gt;&lt;br /&gt;もう一つの最新動向は、PAPEの仕様拡張。PAPEと言えば、OpenIDの認証強度を明示するためのOpenID拡張だが、採用するセキュリティモデルを明示的に指定するための仕様を提案しているとの事。現状のPAPEでは、NISTの定めるセキュリティモデルを指定できるだけであるが、日本のFISCの基準を採用する際には、次のように指定できるとの事だ。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;openid.pape.auth_level.fisc:2&lt;br /&gt;openid.pape.auth_level.ns.fisc: http://www.fisc.or.jp/ex/authlevel&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;See also: &lt;a href="http://www.machu.jp/diary/20080718.html#p01"&gt;まちゅダイアリー - SAML と OpenID と CardSpace&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4185285116825478572?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4185285116825478572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4185285116825478572'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/07/openid-trusted-data-exchange.html' title='OpenID動向 - Trusted Data Exchangeがユーザ属性ポータビリティの切り札になるか？'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-7290608678408339146</id><published>2008-07-15T10:28:00.001+09:00</published><updated>2008-07-15T10:49:34.287+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>[Rails] Gears on Rails helps developers to write fully offline functionnal web applications</title><content type='html'>Google anounced about &lt;a href="http://code.google.com/p/gearsonrails/"&gt;Gears on Rails&lt;/a&gt;, see &lt;a href="http://google-code-updates.blogspot.com/2008/07/take-your-rails-application-offline.html"&gt;Take your Rails application offline with the Gears on Rails project&lt;/a&gt;. We can listen to &lt;a href="http://google-developer-podcast.googlecode.com/files/gearsonrails-googledeveloperpodcast.mp3"&gt;audio interview&lt;/a&gt;. This is Rails plugin to manipulate offline data from RoR.We can install GoR as Rails plugin is as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% sudo gem install json_pure&lt;br /&gt;% rails gor_demo &amp;&amp; cd gor_demo&lt;br /&gt;% ruby script /plugin install http://gearsonrails.googlecode.com/svn/trunk/acts_as_local&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It need to add acts_as_local method in your controller in order to use it.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  acts_as_local &lt;span class="synIdentifier"&gt;:except&lt;/span&gt; =&amp;gt; [&lt;span class="synIdentifier"&gt;:hello&lt;/span&gt;]&lt;br /&gt;  &lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;create_local&lt;/span&gt;&lt;br /&gt;    &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;      post = Post.build(params(&amp;quot;post&amp;quot;));&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;      Post.create_local(post);&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;      window.location.reload( false );&lt;/span&gt;&lt;br /&gt;&lt;span class="synConstant"&gt;    &lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sorry, I never use &lt;a href="http://code.google.com/p/gearsonrails/"&gt;GoR&lt;/a&gt; yet, but It seems interesting, so i may use it. See &lt;a href="http://code.google.com/p/gearsonrails/"&gt;Gears on Rails&lt;/a&gt; in order to see how to write view and controller for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-7290608678408339146?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7290608678408339146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7290608678408339146'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/07/gears-on-rails-helps-developers-to.html' title='[Rails] Gears on Rails helps developers to write fully offline functionnal web applications'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-7033136724778753512</id><published>2008-07-14T22:08:00.002+09:00</published><updated>2008-07-16T10:03:53.008+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>[Erlang tips] Sometimes to call mnesia:wait_for_tables is required</title><content type='html'>Hmm..,&lt;br /&gt;I spent three hours for a Mnesia's strange error message, so write tips about error I'm confused. The tables on Mnesia often  need a time to prepare their tables, and if tables aren't available, then we'll see storange error message.&lt;br /&gt;&lt;br /&gt;% db_test.erl&lt;br /&gt;&lt;pre class="erlang"&gt;&lt;br /&gt;write_db_test() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;start(),   &lt;span class="synComment"&gt;% Start the server, mnesia and create required tables.&lt;/span&gt;&lt;br /&gt;?assertMatch({ok, &lt;span class="synSpecial"&gt;_&lt;/span&gt;}, &lt;span class="synIdentifier"&gt;mnesia&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;transaction&lt;/span&gt;(&lt;span class="synStatement"&gt;fun&lt;/span&gt;() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; #person{&lt;span class="synSpecial"&gt;name&lt;/span&gt;&lt;span class="synStatement"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"rakuto"&lt;/span&gt;}))&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You may see the error is as follows:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{badmatch,{aborted,{no_exists,ready_queue}}}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It seems it need to call mnesia:wait_for_tables.&lt;br /&gt;&lt;br /&gt;% db_test.erl&lt;br /&gt;&lt;pre class="erlang"&gt;&lt;br /&gt;write_db_test() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;start(),   &lt;span class="synComment"&gt;% Start the server, mnesia and create required tables.&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;mnesia&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;wait&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;for&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;tables&lt;/span&gt;([person], 3000),&lt;br /&gt;?assertMatch({ok, &lt;span class="synSpecial"&gt;_&lt;/span&gt;}, &lt;span class="synIdentifier"&gt;mnesia&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;transaction&lt;/span&gt;(&lt;span class="synStatement"&gt;fun&lt;/span&gt;() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; #person{&lt;span class="synSpecial"&gt;name&lt;/span&gt;&lt;span class="synStatement"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"rakuto"&lt;/span&gt;}))&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I think that error message "{no_exists, table_name}" is not human friendly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-7033136724778753512?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7033136724778753512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7033136724778753512'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/07/erlang-tips-sometimes-to-call.html' title='[Erlang tips] Sometimes to call mnesia:wait_for_tables is required'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-5633772260594237919</id><published>2008-07-04T18:55:00.002+09:00</published><updated>2008-07-04T20:45:07.448+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>[Erlang] How to package an application with erlware(faxien and sinan commands)</title><content type='html'>We usually need to package system and repositories in order to create a big application. &lt;a href="http://www.erlware.org/"&gt;Erlware&lt;/a&gt; is a repository for Erlang programs and it provides softaware to create a package and release it to the world. There are pretty cool, it is just thing I want to. This entry introduces that how to create an application as package and install to system.&lt;br /&gt;&lt;br /&gt;I create a HAVAL bindings for Erlang in order to learn how to create linked-in driver.&lt;br /&gt;See &lt;a href="http://rakuto.blogspot.com/2008/06/tutorial-for-how-to-create-erlang.html"&gt;Tutorial for how to create Erlang linked-in driver.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In this entry, I introduce how to create an application provides API for HAVAL bindings for Erlang. We need to install &lt;a href="http://code.google.com/p/faxien/"&gt;Faxien&lt;/a&gt; and &lt;a href="http://code.google.com/p/sinan/"&gt;Sinan&lt;/a&gt; previously.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;0. Dicied a names of application and start to development a pakcage.&lt;/span&gt;&lt;br /&gt;Create required directories for the application.&lt;br /&gt;&lt;pre&gt;% mkdir haval &amp;amp;&amp;amp; cd haval &amp;amp;&amp;amp; mkdir -p cmds doc bin lib&lt;br /&gt;% ls .&lt;br /&gt;bin/  cmds/  doc/  lib/  releases/&lt;br /&gt;%&lt;br /&gt;&lt;/pre&gt;Create directories for HAVAL bindings.&lt;br /&gt;&lt;pre&gt;% mkdir -p lib/haval &amp;amp;&amp;amp; cd lib/hava &amp;amp;&amp;amp; mkdir src ebin include priv/lib&lt;br /&gt;&lt;/pre&gt;Configuration file named "_build.cfg" for this application.&lt;br /&gt;&lt;pre&gt;% cat &gt; _build.cfg&lt;br /&gt;project : {&lt;br /&gt;name  : haval&lt;br /&gt;vsn   : "1.0.0"&lt;br /&gt;},&lt;br /&gt;&lt;br /&gt;repositories : ["http://repo.erlware.org/pub", "http://repo.martinjlogan.com/pub"]&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;1. Create an application&lt;/span&gt;&lt;br /&gt;Create a HAVAL bindings for Erlang in this entry. This includes following source codes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/rakuto/erlang_haval/tree/master/lib/haval/src/haval.erl"&gt;haval.erl&lt;/a&gt; - Source provides API for HAVAL bindings&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/rakuto/erlang_haval/tree/master/lib/haval/src/haval_server.erl"&gt;haval_server.erl &lt;/a&gt;- Server to handle the shared library of HAVAL linked-in driver.&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/rakuto/erlang_haval/tree/master/lib/haval/src/haval_sup.erl"&gt;haval_sup.erl&lt;/a&gt; - Supervisor&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/rakuto/erlang_haval/tree/master/lib/haval/src/haval_app.erl"&gt;haval_app.erl&lt;/a&gt; - An application&lt;/li&gt;&lt;/ul&gt;HAVAL bindings is provides as linked-in driver, these source are in lib/haval/c_src directory.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Makefile&lt;/li&gt;&lt;li&gt;config.h&lt;/li&gt;&lt;li&gt;haval.c&lt;/li&gt;&lt;li&gt;haval.h&lt;/li&gt;&lt;li&gt;haval_drv.o&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;2. Build the shared library&lt;/span&gt;&lt;br /&gt;HAVAL bindings requires shared library named "erl_drv.so", we may think want to integrate building task for linked-in driver to the package manager(Faxien). But unfortunately I don't know that, so I need to research for handling shared library.&lt;br /&gt;&lt;br /&gt;All sources are &lt;a href="http://github.com/rakuto/erlang_haval/tree/master"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Do make task manually here.&lt;br /&gt;&lt;pre&gt;% cd lib/haval/c_src&lt;br /&gt;% make  # Copy haval_drv.so haval/priv/lib&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;3. Build the application.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;It 'sinan' command is used for building the application. We need to run background server with 'sinserv' command before compile them.&lt;br /&gt;&lt;pre&gt;% sinserv # Placed in "/usr/local/erlware/release_packages/sinan-0.10.0.12/bin/sinserv" in my enviroment&lt;br /&gt;&lt;/pre&gt;Build the application with 'sinan' command. We can see help when '+help' command is passed.&lt;br /&gt;&lt;pre&gt;% sinan +help&lt;br /&gt;sinan [args] [task]&lt;br /&gt;local args (+) and server args. local args may be any of the following&lt;br /&gt;  +url  :  The url to connect to and control&lt;br /&gt;  +help :  This help message&lt;br /&gt;&lt;br /&gt;Server args are much more complex. There are always sane defaults so&lt;br /&gt;you shouldn't need them, but you may. To get information about server&lt;br /&gt;args read the sinan documentation.&lt;br /&gt;%&lt;br /&gt;% sinan # Default task is build&lt;br /&gt;starting run&lt;br /&gt;[check_depends] start&lt;br /&gt;[check_depends] stop&lt;br /&gt;[build] start&lt;br /&gt;[build] Building ~/haval-1.0.0/lib/haval/src/haval_server.erl&lt;br /&gt;[build] Building ~/haval-1.0.0/lib/haval/src/haval_sup.erl&lt;br /&gt;[build] Building ~/haval-1.0.0/lib/haval/src/haval_app.erl&lt;br /&gt;[build] Building ~/haval-1.0.0/lib/haval/src/haval.erl&lt;br /&gt;[build] stop&lt;br /&gt;run complete&lt;br /&gt;% ls _build/development/apps/haval-1.0.0  # Generated following sources&lt;br /&gt;c_src/   ebin/    include/ priv/    src/&lt;br /&gt;%&lt;br /&gt;&lt;/pre&gt;Create a package for release. This package is generated underneath "_build/development/apps/" directory.&lt;br /&gt;&lt;pre&gt;% sinan release&lt;br /&gt;starting run&lt;br /&gt;[check_depends] start&lt;br /&gt;[check_depends] stop&lt;br /&gt;[build] start&lt;br /&gt;[build] stop&lt;br /&gt;[release] start&lt;br /&gt;[release] stop&lt;br /&gt;run complete&lt;br /&gt;%&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4. Install the application locally.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Some of tasks are required in order to install the application. At first, we need to prepare the directory for released package, copy "_build/development/release" to "releases/haval-1.0.0/" and copy "_build/development/haval-1.0.0" to "releases/haval-1.0.0".&lt;br /&gt;&lt;pre&gt;% mkdir releases/haval-1.0.0/ &amp;amp;&amp;amp; mkdir lib&lt;br /&gt;% cp -r _build/development/release releases/haval-1.0.0/&lt;br /&gt;% cp -r _build/development/apps/haval-1.0.0 releases/haval-1.0.0/lib&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Install the application locally, there will be deployed on "/usr/local/erlware/release_packages/haval-1.0.0/". We can use 'faxien' command in order to handle the packages (local and remote). Please execute "faxien help commands" for more details.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% faxien install-release releases/haval-1.0.0&lt;br /&gt;ok&lt;br /&gt;% ls /usr/local/erlware/release_packages/haval-1.0.0/&lt;br /&gt;LICENCE  README   lib/     release/&lt;br /&gt;&lt;/pre&gt;Run and test.&lt;br /&gt;&lt;pre&gt;% erl&lt;br /&gt;Erlang (BEAM) emulator version 5.6.2 [source] [smp:2] [async-threads:0] [kernel-poll:false]&lt;br /&gt;&lt;br /&gt;Eshell V5.6.2  (abort with ^G)&lt;br /&gt;1&gt; haval:start().&lt;br /&gt;ok&lt;br /&gt;2&gt; haval:haval_string("test").&lt;br /&gt;"593C9AED973BB51A3C852FB4E051D7C26686B9468B4E405350CB6805DC1B99E6"&lt;br /&gt;3&gt; haval:haval_file("_build.cfg").&lt;br /&gt;"5A114E356FBB0CCCED8C7574B7A71780C8F33D3A9B37B8642126B78429B2988F"&lt;br /&gt;4&gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;5. Test the application&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;We can use &lt;a href="https://support.process-one.net/doc/display/CONTRIBS/EUnit"&gt;EUnit&lt;/a&gt; for testing the application, and do test with following command:&lt;br /&gt;&lt;pre&gt;% sinan test&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-5633772260594237919?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5633772260594237919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5633772260594237919'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/07/erlang-how-to-package-application-with.html' title='[Erlang] How to package an application with erlware(faxien and sinan commands)'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4373672278645481296</id><published>2008-07-01T11:33:00.002+09:00</published><updated>2008-07-01T12:59:20.217+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Manipulate Erlang binary term format in C/C++ with ei library</title><content type='html'>Erlang includes &lt;a href="http://www.erlang.org/doc/man/ei.html"&gt;ei&lt;/a&gt; library for handling Erlang binary term format. This entry introduces how to use this library.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Pass the one string to C driver from Erlang.&lt;/span&gt;&lt;br /&gt;It's pretty simple case, and pass one string argument to C driver from Erlang. It should be passed port_control/3 or erlang:port_control/3 after &lt;span style="font-weight:bold;"&gt;all arguments should be encoded as binary&lt;/span&gt;. The "index" variable are used for pointing position in the buffer.&lt;br /&gt;&lt;br /&gt;% echo.erl&lt;br /&gt;&lt;pre class="erlang"&gt;&lt;br /&gt;&lt;span class="synType"&gt;-define&lt;/span&gt;(DRV_ECHO, &lt;span class="synConstant"&gt;1&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;echo(Str) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; control(?DRV_ECHO, Str)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;control(Cmd, Data) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; [{port, Port}| &lt;span class="synSpecial"&gt;_&lt;/span&gt;] &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;lookup&lt;/span&gt;(echo_table, port),&lt;br /&gt; Bin &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;term_to_binary&lt;/span&gt;(Data), &lt;span class="synComment"&gt;% XXX: All arguments will be encoded as binary term format.&lt;/span&gt;&lt;br /&gt; Res &lt;span class="synStatement"&gt;=&lt;/span&gt; port_control(Port, Cmd, Bin),&lt;br /&gt; &lt;span class="synIdentifier"&gt;binary_to_term&lt;/span&gt;(Res)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;% echo_drv.c&lt;br /&gt;&lt;pre class="c"&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define DRV_ECHO &lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; control(ErlDrvData drv_data, &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; command, &lt;span class="synType"&gt;char&lt;/span&gt; *buf,&lt;br /&gt;                  &lt;span class="synType"&gt;int&lt;/span&gt; len, &lt;span class="synType"&gt;char&lt;/span&gt; **buf, &lt;span class="synType"&gt;int&lt;/span&gt; rlen) {&lt;br /&gt; &lt;span class="synType"&gt;int&lt;/span&gt; index, type, size, arity ,ver;&lt;br /&gt; &lt;span class="synType"&gt;char&lt;/span&gt; *arg1;&lt;br /&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;switch&lt;/span&gt;(command) {&lt;br /&gt; &lt;span class="synStatement"&gt;case&lt;/span&gt; DRV_ECHO:&lt;br /&gt;   &lt;span class="synComment"&gt;// It must call ei_decode_version at the beginning when argument is Erlang binary term format.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// All ei_xxx functions return 0 if it will be success, else return -1&lt;/span&gt;&lt;br /&gt;   ei_decode_version(buf, &amp;amp;index, &amp;amp;ver); &lt;span class="synComment"&gt;// Value of 'index' will become 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// Get size of string in order to allocate buffer for argument&lt;/span&gt;&lt;br /&gt;   ei_get_type(buf, &amp;amp;index, &amp;amp;type, &amp;amp;size); &lt;span class="synComment"&gt;// value of 'type' equal ERL_STRING_EXT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// Allocate memory for buffer&lt;/span&gt;&lt;br /&gt;   arg1 = &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt;[size + &lt;span class="synConstant"&gt;1&lt;/span&gt;]; &lt;span class="synComment"&gt;// Extra bite is required for NULL string.&lt;/span&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;/* do something */&lt;/span&gt;   &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Type of Erlang term&lt;/span&gt;&lt;br /&gt;It can obtain type of Erlang term with result of ei_get_type function. All value of types are defined in ei.h.&lt;br /&gt;&lt;pre class="c"&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_SMALL_INTEGER_EXT &lt;/span&gt;&lt;span class="synConstant"&gt;'a'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_INTEGER_EXT       &lt;/span&gt;&lt;span class="synConstant"&gt;'b'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_FLOAT_EXT         &lt;/span&gt;&lt;span class="synConstant"&gt;'c'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_ATOM_EXT          &lt;/span&gt;&lt;span class="synConstant"&gt;'d'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_REFERENCE_EXT     &lt;/span&gt;&lt;span class="synConstant"&gt;'e'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_NEW_REFERENCE_EXT &lt;/span&gt;&lt;span class="synConstant"&gt;'r'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_PORT_EXT          &lt;/span&gt;&lt;span class="synConstant"&gt;'f'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_PID_EXT           &lt;/span&gt;&lt;span class="synConstant"&gt;'g'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_SMALL_TUPLE_EXT   &lt;/span&gt;&lt;span class="synConstant"&gt;'h'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_LARGE_TUPLE_EXT   &lt;/span&gt;&lt;span class="synConstant"&gt;'i'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_NIL_EXT           &lt;/span&gt;&lt;span class="synConstant"&gt;'j'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_STRING_EXT        &lt;/span&gt;&lt;span class="synConstant"&gt;'k'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_LIST_EXT          &lt;/span&gt;&lt;span class="synConstant"&gt;'l'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_BINARY_EXT        &lt;/span&gt;&lt;span class="synConstant"&gt;'m'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_SMALL_BIG_EXT     &lt;/span&gt;&lt;span class="synConstant"&gt;'n'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_LARGE_BIG_EXT     &lt;/span&gt;&lt;span class="synConstant"&gt;'o'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_NEW_FUN_EXT       &lt;/span&gt;&lt;span class="synConstant"&gt;'p'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_FUN_EXT           &lt;/span&gt;&lt;span class="synConstant"&gt;'u'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_NEW_CACHE         &lt;/span&gt;&lt;span class="synConstant"&gt;'N'&lt;/span&gt;&lt;span class="synPreProc"&gt; &lt;/span&gt;&lt;span class="synComment"&gt;/* c nodes don't know these two */&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define ERL_CACHED_ATOM       &lt;/span&gt;&lt;span class="synConstant"&gt;'C'&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Pass the List&lt;/span&gt;&lt;br /&gt;It should call ei_decode_list_header function when parse the list term. It must be called when parse the list term.&lt;br /&gt;&lt;br /&gt;% echo_list.erl&lt;br /&gt;&lt;pre class="erlang"&gt;&lt;br /&gt;&lt;span class="synType"&gt;-define&lt;/span&gt;(DRV_ECHO_LIST, &lt;span class="synConstant"&gt;1&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;echo(List) &lt;span class="synStatement"&gt;when&lt;/span&gt; is_list(List) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; control(?DRV_ECHO_LIST, List)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;control(Cmd, Data) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; [{port, Port}| &lt;span class="synSpecial"&gt;_&lt;/span&gt;] &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;lookup&lt;/span&gt;(echo_list_table, port),&lt;br /&gt; Bin &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;term_to_binary&lt;/span&gt;(Data), &lt;span class="synComment"&gt;% XXX: All arguments will be encoded as binary term format.&lt;/span&gt;&lt;br /&gt; Res &lt;span class="synStatement"&gt;=&lt;/span&gt; port_control(Port, Cmd, Str),&lt;br /&gt; &lt;span class="synIdentifier"&gt;binary_to_term&lt;/span&gt;(Res)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;% echo_drv.c&lt;br /&gt;&lt;pre class="c"&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define DRV_ECHO &lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; control(ErlDrvData drv_data, &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; command, &lt;span class="synType"&gt;char&lt;/span&gt; *buf,&lt;br /&gt;                  &lt;span class="synType"&gt;int&lt;/span&gt; len, &lt;span class="synType"&gt;char&lt;/span&gt; **buf, &lt;span class="synType"&gt;int&lt;/span&gt; rlen) {&lt;br /&gt; &lt;span class="synType"&gt;int&lt;/span&gt; index, type, size, arity ,ver;&lt;br /&gt; &lt;span class="synType"&gt;char&lt;/span&gt; *arg1;&lt;br /&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;switch&lt;/span&gt;(command) {&lt;br /&gt; &lt;span class="synStatement"&gt;case&lt;/span&gt; DRV_ECHO_LIST:&lt;br /&gt;   &lt;span class="synComment"&gt;// It must call ei_decode_version at the beginning when argument is Erlang binary term format.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// All ei_xxx functions return 0 if it will be success, else return -1&lt;/span&gt;&lt;br /&gt;   ei_decode_version(buf, &amp;amp;index, &amp;amp;ver); &lt;span class="synComment"&gt;// Value of 'index' will become 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// Get size of string in order to allocate buffer for argument&lt;/span&gt;&lt;br /&gt;   ei_get_type(buf, &amp;amp;index, &amp;amp;type, &amp;amp;size);&lt;br /&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;// Check the type&lt;/span&gt;&lt;br /&gt;   &lt;span class="synStatement"&gt;if&lt;/span&gt;(type == ERL_LIST_EXT) {&lt;br /&gt;     &lt;span class="synComment"&gt;// It must be called at the begginning when hanle the list term.&lt;/span&gt;&lt;br /&gt;     ei_decode_list_header(buf, &amp;amp;index, &amp;amp;arity);&lt;br /&gt;    &lt;br /&gt;     printf(&lt;span class="synConstant"&gt;"number of elements: &lt;/span&gt;&lt;span class="synSpecial"&gt;%d\n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;, arity);&lt;br /&gt;    &lt;br /&gt;     &lt;span class="synComment"&gt;// Check the type of first element in the list &lt;/span&gt;&lt;br /&gt;     ei_get_type(buf, &amp;amp;index, &amp;amp;type, &amp;amp;size);&lt;br /&gt;    &lt;br /&gt;     swithc(type) {&lt;br /&gt;     &lt;span class="synStatement"&gt;case&lt;/span&gt; ERL_SMALL_INTEGER_EXT:&lt;br /&gt;     &lt;span class="synStatement"&gt;case&lt;/span&gt; ERL_INTEGER_EXT:&lt;br /&gt;       &lt;span class="synComment"&gt;// do something&lt;/span&gt;&lt;br /&gt;       &lt;span class="synStatement"&gt;break&lt;/span&gt;;&lt;br /&gt;     &lt;span class="synStatement"&gt;case&lt;/span&gt; ERL_STRING_EXT:&lt;br /&gt;       &lt;span class="synComment"&gt;// do something&lt;/span&gt;&lt;br /&gt;       &lt;span class="synStatement"&gt;break&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4373672278645481296?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4373672278645481296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4373672278645481296'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/07/manipulate-erlang-binary-term-format-in.html' title='Manipulate Erlang binary term format in C/C++ with ei library'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-7377719472678998745</id><published>2008-06-30T02:08:00.004+09:00</published><updated>2008-06-30T10:38:00.498+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Tutorial for how to create Erlang linked-in driver.</title><content type='html'>Erlang provides mechanism to communicate between Erlang and other programs written by C/C++ or other. This entry introduce how to create simple linked-in driver. Create shared library and Erlang interface to use Erlang's linked-in driver.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Goal: To create HAVAL bindings for Erlang.&lt;/span&gt;&lt;br /&gt;&lt;a href="http:///"&gt;HAVAL&lt;/a&gt; is fast cryptographic hash algorithm is invented by Yuliang Zheng, Josef Pieprzyk, and Jennifer Seberry in 1992. This library is pretty simple, so this is good choice for this tutorial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Step 0: Files&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;config.h (Generated by configure script in HAVAL package)&lt;br /&gt;haval.h&lt;br /&gt;haval.c&lt;br /&gt;haval.erl&lt;br /&gt;haval_drv.cc&lt;br /&gt;Makefile&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;haval.c and haval.h are included &lt;a href="http://labs.calyptix.com/haval-1.1.tar.gz"&gt;haval-1.1.tar.gz&lt;/a&gt; (C source code).&lt;br /&gt;&lt;br /&gt;You can checkout these sample sources with Git. see &lt;a href="http://github.com/rakuto/erlang_haval/tree/master"&gt;haval_erlang&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% git clone git://github.com/rakuto/erlang_haval.git erlang_haval&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Step 1: Create Erlang's interface&lt;/span&gt;&lt;br /&gt;Erlang provides port mechanism in order to communicate between Erlang and other loaded shared object. See also &lt;a href="http://www.kazmier.com/computer/port-howto/"&gt;Writing an Erlang Port using OTP Principles&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="erlang" style="height: 600px;"&gt;&lt;br /&gt;&lt;span class="synType"&gt;-module&lt;/span&gt;(haval)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-author&lt;/span&gt;(&lt;span class="synType"&gt;'Rakuto Furutani &amp;lt;xri://=rakuto&amp;gt;'&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;-define&lt;/span&gt;(DRV_INFO, &lt;span class="synConstant"&gt;1&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-define&lt;/span&gt;(DRV_HAVAL_STRING, &lt;span class="synConstant"&gt;2&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-define&lt;/span&gt;(DRV_HAVAL_FILE, &lt;span class="synConstant"&gt;3&lt;/span&gt;)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;-export&lt;/span&gt;([start&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;, stop&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;])&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-export&lt;/span&gt;([info&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;, haval_string&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;, haval_file&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;])&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-ifdef&lt;/span&gt;(debug)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-export&lt;/span&gt;([test&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;0&lt;/span&gt;, test&lt;span class="synStatement"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;])&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-endif&lt;/span&gt;&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%%&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%% Public interface&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%%&lt;/span&gt;&lt;br /&gt;start() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; start(&lt;span class="synConstant"&gt;"haval_drv"&lt;/span&gt;),&lt;br /&gt; ok&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;start(SharedLib) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;case&lt;/span&gt; &lt;span class="synIdentifier"&gt;erl&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;ddll&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;load&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;driver&lt;/span&gt;(&lt;span class="synConstant"&gt;"."&lt;/span&gt;, SharedLib) &lt;span class="synStatement"&gt;of&lt;/span&gt;&lt;br /&gt;   ok &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; ok;&lt;br /&gt;   {error, already_loaded} &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; ok;&lt;br /&gt;   &lt;span class="synSpecial"&gt;_&lt;/span&gt; &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="synStatement"&gt;exit&lt;/span&gt;({error, could_not_load_driver})&lt;br /&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt;,&lt;br /&gt; register_lib(SharedLib)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;stop() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; [{port, Port}| &lt;span class="synSpecial"&gt;_&lt;/span&gt;] &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;lookup&lt;/span&gt;(haval_table, port),&lt;br /&gt; Port &lt;span class="synStatement"&gt;!&lt;/span&gt; {close, &lt;span class="synIdentifier"&gt;self&lt;/span&gt;()},&lt;br /&gt; ok&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%% TODO: Implement this function return the information for module&lt;/span&gt;&lt;br /&gt;info() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt; ok&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%% Caluculate a value of HAVAL from string&lt;/span&gt;&lt;br /&gt;haval_string(Str) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;binary_to_term&lt;/span&gt;(control(?DRV_HAVAL_STRING, Str))&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%% Caluculate a value of HAVAL from file&lt;/span&gt;&lt;br /&gt;haval_file(FileName) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;binary_to_term&lt;/span&gt;(control(?DRV_HAVAL_FILE, FileName))&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;-ifdef&lt;/span&gt;(debug)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;test() &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;start&lt;/span&gt;(),&lt;br /&gt; Str &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synConstant"&gt;"I love Erlang."&lt;/span&gt;,&lt;br /&gt; FileName &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synConstant"&gt;"haval.erl"&lt;/span&gt;,&lt;br /&gt; Hash1 &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;string&lt;/span&gt;(Str),&lt;br /&gt; Hash2 &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;file&lt;/span&gt;(FileName),&lt;br /&gt; &lt;span class="synIdentifier"&gt;io&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;format&lt;/span&gt;(&lt;span class="synConstant"&gt;"HAVAL(&lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt;) = &lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synSpecial"&gt;~n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;, [Str, Hash1]),&lt;br /&gt; &lt;span class="synIdentifier"&gt;io&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;format&lt;/span&gt;(&lt;span class="synConstant"&gt;"HAVAL(&lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt;) = &lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synSpecial"&gt;~n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;, [FileName, Hash2]),&lt;br /&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;stop&lt;/span&gt;(),&lt;br /&gt; &lt;span class="synIdentifier"&gt;halt&lt;/span&gt;()&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;test([Str|&lt;span class="synSpecial"&gt;_&lt;/span&gt;]) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;start&lt;/span&gt;(),&lt;br /&gt; Hash &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;string&lt;/span&gt;(Str),&lt;br /&gt; &lt;span class="synIdentifier"&gt;io&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;format&lt;/span&gt;(&lt;span class="synConstant"&gt;"HAVAL(&lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt;) = &lt;/span&gt;&lt;span class="synSpecial"&gt;~p&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synSpecial"&gt;~n&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;, [Str, Hash]),&lt;br /&gt; &lt;span class="synIdentifier"&gt;haval&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;stop&lt;/span&gt;(),&lt;br /&gt; &lt;span class="synIdentifier"&gt;halt&lt;/span&gt;()&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;-endif&lt;/span&gt;&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%%&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%% Internal functions&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;%%&lt;/span&gt;&lt;br /&gt;register_lib(SharedLib) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; Port &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;open_port&lt;/span&gt;({&lt;span class="synIdentifier"&gt;spawn&lt;/span&gt;, SharedLib}, []),&lt;br /&gt; Tab &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;new&lt;/span&gt;(haval_table, [set, protected, named_table]),&lt;br /&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;insert&lt;/span&gt;(Tab, {port, Port})&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;control(Cmd, Data) &lt;span class="synStatement"&gt;-&amp;gt;&lt;/span&gt;&lt;br /&gt; [{port, Port}| &lt;span class="synSpecial"&gt;_&lt;/span&gt;] &lt;span class="synStatement"&gt;=&lt;/span&gt; &lt;span class="synIdentifier"&gt;ets&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;lookup&lt;/span&gt;(haval_table, port),&lt;br /&gt; &lt;span class="synIdentifier"&gt;erlang&lt;/span&gt;&lt;span class="synSpecial"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;port&lt;/span&gt;&lt;span class="synSpecial"&gt;_&lt;/span&gt;&lt;span class="synIdentifier"&gt;control&lt;/span&gt;(Port, Cmd, Data)&lt;span class="synSpecial"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Step 2: Create C/C++ shared library&lt;/span&gt;&lt;br /&gt;Shared library writted by C++ is loaded by Erlang interface when call erl_ddll::load_driver/2. This driver uses &lt;a href="http://www.erlang.org/doc/man/ei.html"&gt;ei&lt;/a&gt; library in order to manipulate Erlang binary term. &lt;br /&gt;&lt;br /&gt;&lt;pre class="c"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * HAVAL (cryptographic hash function) bindings for Erlang&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * @author  Rakuto Furutani &amp;lt;xri://=rakuto&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; * @date    2008/06/28&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;stdarg.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;&amp;lt;new&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"ei.h"&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"erl_driver.h"&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"erl_interface.h"&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;extern&lt;/span&gt; &lt;span class="synConstant"&gt;"C"&lt;/span&gt; {&lt;br /&gt;&lt;span class="synComment"&gt;// Define constant for haval.h&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define PASS &lt;/span&gt;&lt;span class="synConstant"&gt;3&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define NUMBER_OF_BLOCKS &lt;/span&gt;&lt;span class="synConstant"&gt;5000&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define FPTLEN &lt;/span&gt;&lt;span class="synConstant"&gt;256&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#ifndef LITTLE_ENDIAN&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define LITTLE_ENDIAN &lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#include &lt;/span&gt;&lt;span class="synConstant"&gt;"haval.h"&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;// Functions are provided by this driver&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define DRV_INFO          &lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define DRV_HAVAL_STRING  &lt;/span&gt;&lt;span class="synConstant"&gt;2&lt;/span&gt;&lt;span class="synPreProc"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;#define DRV_HAVAL_FILE    &lt;/span&gt;&lt;span class="synConstant"&gt;3&lt;/span&gt;&lt;span class="synPreProc"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/* Driver Interface Declarations */&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; ErlDrvData start_haval_driver(ErlDrvPort port, &lt;span class="synType"&gt;char&lt;/span&gt; *command);&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; stop_haval_driver(ErlDrvData drv_data);&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; control(ErlDrvData drv_data, &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; command, &lt;span class="synType"&gt;char&lt;/span&gt; *buf,&lt;br /&gt;                   &lt;span class="synType"&gt;int&lt;/span&gt; len, &lt;span class="synType"&gt;char&lt;/span&gt; **rbuf, &lt;span class="synType"&gt;int&lt;/span&gt; rlen);&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; haval_to_hex(&lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt;*, &lt;span class="synType"&gt;char&lt;/span&gt;*);&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; ErlDrvBinary* ei_x_to_new_binary(&lt;span class="synType"&gt;const&lt;/span&gt; ei_x_buff*);&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/* Driver Entry */&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; ErlDrvEntry haval_driver_entry = {&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; start_haval_driver,&lt;br /&gt; stop_haval_driver,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;"haval_drv"&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; control,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span class="synConstant"&gt;NULL&lt;/span&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;typedef&lt;/span&gt; &lt;span class="synType"&gt;struct&lt;/span&gt; _drv_data {&lt;br /&gt; ErlDrvPort port;&lt;br /&gt;} drv_data_t;&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;/* DRIVER INTERFACE */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; ErlDrvData start_haval_driver(ErlDrvPort port, &lt;span class="synType"&gt;char&lt;/span&gt; *command)&lt;br /&gt;{&lt;br /&gt; drv_data_t *data;&lt;br /&gt;&lt;br /&gt; data = (drv_data_t*) driver_alloc(&lt;span class="synStatement"&gt;sizeof&lt;/span&gt;(drv_data_t));&lt;br /&gt; data-&amp;gt;port = port;&lt;br /&gt; set_port_control_flags(port, PORT_CONTROL_FLAG_BINARY);&lt;br /&gt; &lt;span class="synStatement"&gt;return&lt;/span&gt; (ErlDrvData) data;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; stop_haval_driver(ErlDrvData drv_data)&lt;br /&gt;{&lt;br /&gt; driver_free((&lt;span class="synType"&gt;char&lt;/span&gt;*) drv_data);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; control(ErlDrvData drv_data, &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;int&lt;/span&gt; command, &lt;span class="synType"&gt;char&lt;/span&gt; *buf, &lt;span class="synType"&gt;int&lt;/span&gt; len, &lt;span class="synType"&gt;char&lt;/span&gt; **rbuf, &lt;span class="synType"&gt;int&lt;/span&gt; rlen)&lt;br /&gt;{&lt;br /&gt; &lt;span class="synType"&gt;int&lt;/span&gt; ret = -&lt;span class="synConstant"&gt;1&lt;/span&gt;;&lt;br /&gt; &lt;span class="synType"&gt;char&lt;/span&gt; hex[(FPTLEN &amp;gt;&amp;gt; &lt;span class="synConstant"&gt;3&lt;/span&gt;) &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;1&lt;/span&gt;];&lt;br /&gt; &lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt; fingerprint[FPTLEN &amp;gt;&amp;gt; &lt;span class="synConstant"&gt;3&lt;/span&gt;];&lt;br /&gt; &lt;span class="synType"&gt;char&lt;/span&gt; *arg1;&lt;br /&gt; ei_x_buff x_buff;&lt;br /&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;try&lt;/span&gt;  {&lt;br /&gt;   &lt;span class="synComment"&gt;// argument&lt;/span&gt;&lt;br /&gt;   arg1 = &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt;[len + &lt;span class="synConstant"&gt;1&lt;/span&gt;];&lt;br /&gt;   strncpy(arg1, buf, len);&lt;br /&gt;   strcat(arg1, &lt;span class="synConstant"&gt;"ï¿½0"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;   ei_x_new_with_version(&amp;amp;x_buff);&lt;br /&gt;   &lt;span class="synStatement"&gt;switch&lt;/span&gt;(command) {&lt;br /&gt;   &lt;span class="synStatement"&gt;case&lt;/span&gt; DRV_INFO:&lt;br /&gt;     ei_x_encode_string(&amp;amp;x_buff, &lt;span class="synConstant"&gt;"info"&lt;/span&gt;);&lt;br /&gt;     ret = &lt;span class="synStatement"&gt;sizeof&lt;/span&gt;(&lt;span class="synConstant"&gt;"info"&lt;/span&gt;) * &lt;span class="synStatement"&gt;sizeof&lt;/span&gt;(&lt;span class="synType"&gt;char&lt;/span&gt;);&lt;br /&gt;     &lt;span class="synStatement"&gt;break&lt;/span&gt;;&lt;br /&gt;   &lt;span class="synStatement"&gt;case&lt;/span&gt; DRV_HAVAL_STRING:&lt;br /&gt;     haval_string(arg1, fingerprint);&lt;br /&gt;     haval_to_hex(&amp;amp;fingerprint[&lt;span class="synConstant"&gt;0&lt;/span&gt;], &amp;amp;hex[&lt;span class="synConstant"&gt;0&lt;/span&gt;]);&lt;br /&gt;     ret = &lt;span class="synStatement"&gt;sizeof&lt;/span&gt;(hex);&lt;br /&gt;     ei_x_encode_string(&amp;amp;x_buff, hex);&lt;br /&gt;     &lt;span class="synStatement"&gt;break&lt;/span&gt;;&lt;br /&gt;   &lt;span class="synStatement"&gt;case&lt;/span&gt; DRV_HAVAL_FILE:&lt;br /&gt;     &lt;span class="synStatement"&gt;if&lt;/span&gt;(!haval_file(arg1, fingerprint)) {&lt;br /&gt;       haval_to_hex(&amp;amp;fingerprint[&lt;span class="synConstant"&gt;0&lt;/span&gt;], &amp;amp;hex[&lt;span class="synConstant"&gt;0&lt;/span&gt;]);&lt;br /&gt;       ret = &lt;span class="synStatement"&gt;sizeof&lt;/span&gt;(hex);&lt;br /&gt;       ei_x_encode_string(&amp;amp;x_buff, hex);&lt;br /&gt;     } &lt;span class="synStatement"&gt;else&lt;/span&gt; {&lt;br /&gt;       erl_err_sys(&lt;span class="synConstant"&gt;"haval_file"&lt;/span&gt;);&lt;br /&gt;     }&lt;br /&gt;     &lt;span class="synStatement"&gt;break&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="synStatement"&gt;if&lt;/span&gt;(ret &amp;gt; &lt;span class="synConstant"&gt;0&lt;/span&gt;) *rbuf = &lt;span class="synStatement"&gt;reinterpret_cast&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;char&lt;/span&gt;*&amp;gt;(ei_x_to_new_binary(&amp;amp;x_buff));&lt;br /&gt;   ei_x_free(&amp;amp;x_buff);&lt;br /&gt; } &lt;span class="synStatement"&gt;catch&lt;/span&gt;(std::bad_alloc) {&lt;br /&gt;   erl_err_sys(&lt;span class="synConstant"&gt;"can not allocate memory"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span class="synStatement"&gt;return&lt;/span&gt; ret;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; &lt;span class="synType"&gt;void&lt;/span&gt; haval_to_hex(&lt;span class="synType"&gt;unsigned&lt;/span&gt; &lt;span class="synType"&gt;char&lt;/span&gt; *fingerprint, &lt;span class="synType"&gt;char&lt;/span&gt; *hex)&lt;br /&gt;{&lt;br /&gt; &lt;span class="synStatement"&gt;for&lt;/span&gt;(&lt;span class="synType"&gt;int&lt;/span&gt; i=&lt;span class="synConstant"&gt;0&lt;/span&gt;; i &amp;lt; FPTLEN &amp;gt;&amp;gt; &lt;span class="synConstant"&gt;3&lt;/span&gt;; ++i) {&lt;br /&gt;   sprintf(&amp;amp;hex[i &amp;lt;&amp;lt; &lt;span class="synConstant"&gt;1&lt;/span&gt;], &lt;span class="synConstant"&gt;"&lt;/span&gt;&lt;span class="synSpecial"&gt;%02X&lt;/span&gt;&lt;span class="synConstant"&gt;"&lt;/span&gt;, fingerprint[i]);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;// Init the driver&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;extern&lt;/span&gt; &lt;span class="synConstant"&gt;"C"&lt;/span&gt; DRIVER_INIT(haval_drv)&lt;br /&gt;{&lt;br /&gt; &lt;span class="synStatement"&gt;return&lt;/span&gt; &amp;amp;haval_driver_entry;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;// Utilities&lt;/span&gt;&lt;br /&gt;&lt;span class="synType"&gt;static&lt;/span&gt; ErlDrvBinary* ei_x_to_new_binary(&lt;span class="synType"&gt;const&lt;/span&gt; ei_x_buff *x_buff)&lt;br /&gt;{&lt;br /&gt; ErlDrvBinary *bin = driver_alloc_binary(x_buff-&amp;gt;index);&lt;br /&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt;(bin != &lt;span class="synConstant"&gt;NULL&lt;/span&gt;) {&lt;br /&gt;   memcpy(bin-&amp;gt;orig_bytes, x_buff-&amp;gt;buff, x_buff-&amp;gt;index);&lt;br /&gt; }&lt;br /&gt; &lt;span class="synStatement"&gt;return&lt;/span&gt; bin;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Step 3: Compile all sources&lt;/span&gt;&lt;br /&gt;Create Makefile for build.&lt;br /&gt;FYI: If you want to build linked-in driveron Mac OS, see &lt;a href="http://rakuto.blogspot.com/2008/06/compile-erlang-linked-in-driver-on-mac_28.html"&gt;Compile Erlang linked-in driver on Mac OSX (Darwin)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="make"&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;.PHONY:&lt;/span&gt; clean&lt;br /&gt;&lt;span class="synStatement"&gt;.SUFFIXES:&lt;/span&gt; .o .c .cc .erl .beam&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;OS&lt;/span&gt;= &lt;span class="synIdentifier"&gt;${shell uname}&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;CC&lt;/span&gt;=gcc&lt;br /&gt;&lt;span class="synIdentifier"&gt;CXX&lt;/span&gt;=g++&lt;br /&gt;&lt;span class="synIdentifier"&gt;CXXFLAGS&lt;/span&gt;=-Wall -g&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Erlang&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ERL_INCLUDE &lt;/span&gt;= -I/usr/local/lib/erlang/usr/include&lt;br /&gt;&lt;span class="synIdentifier"&gt;ERL_LIBS    &lt;/span&gt;= -L/usr/local/lib/erlang/usr/lib &lt;span class="synSpecial"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;              &lt;/span&gt;-lerts&lt;br /&gt;&lt;span class="synIdentifier"&gt;EI_INCLUDE  &lt;/span&gt;= -I/usr/local/lib/erlang/lib/erl_interface-3.5.6/include&lt;br /&gt;&lt;span class="synIdentifier"&gt;EI_LIBS     &lt;/span&gt;= -L/usr/local/lib/erlang/lib/erl_interface-3.5.6/lib &lt;span class="synSpecial"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;              &lt;/span&gt;-lei &lt;span class="synSpecial"&gt;\&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;              &lt;/span&gt;-lerl_interface&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;TARGET_LIB &lt;/span&gt;= haval_drv.so&lt;br /&gt;&lt;span class="synPreProc"&gt;ifeq&lt;/span&gt; (&lt;span class="synIdentifier"&gt;$(OS)&lt;/span&gt;, Darwin)&lt;br /&gt;&lt;span class="synIdentifier"&gt;  EXTRA_OPTIONS &lt;/span&gt;= -fno-common -bundle -undefined suppress -flat_namespace&lt;br /&gt;&lt;span class="synPreProc"&gt;endif&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ALL:&lt;/span&gt; &lt;span class="synIdentifier"&gt;$(TARGET_LIB)&lt;/span&gt; haval.beam&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;.erl.beam:&lt;/span&gt;&lt;br /&gt;&lt;span class="synError"&gt;        erlc -W -Ddebug $&amp;lt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;.c.o:&lt;/span&gt;&lt;br /&gt;&lt;span class="synError"&gt;        $(CC) $(CFLAGS) -c $&amp;lt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;.cc.o:&lt;/span&gt;&lt;br /&gt;&lt;span class="synError"&gt;        $(CXX) $(CXXFLAGS) $(ERL_INCLUDE) $(EI_INCLUDE) -c $&amp;lt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;haval_drv.so:&lt;/span&gt; haval.o haval_drv.o&lt;br /&gt;       &lt;span class="synIdentifier"&gt;$(CXX)&lt;/span&gt; -o &lt;span class="synIdentifier"&gt;$@&lt;/span&gt; &lt;span class="synIdentifier"&gt;$^&lt;/span&gt; &lt;span class="synIdentifier"&gt;$(ERL_LIBS)&lt;/span&gt; &lt;span class="synIdentifier"&gt;$(EI_LIBS)&lt;/span&gt; &lt;span class="synIdentifier"&gt;$(EXTRA_OPTIONS)&lt;/span&gt; -fpic -O2&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;clean:&lt;/span&gt;&lt;br /&gt;&lt;span class="synError"&gt;        rm -f *.beam *.o *.so&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Step 4: Run and test&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% erl -noshell -run haval test&lt;br /&gt;HAVAL("I love Erlang.") = "3AECEDF5133ED147C704A25C2CCA9A994FBB984FBCB22C1A523F31963E418498"&lt;br /&gt;HAVAL("haval.erl") = "E006098555DFF788E73C7A263615DF60CC82396B1BCE7AEB5FB7050C376F2B03"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-7377719472678998745?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7377719472678998745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7377719472678998745'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/06/tutorial-for-how-to-create-erlang.html' title='Tutorial for how to create Erlang linked-in driver.'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-1566946255542746521</id><published>2008-06-28T17:31:00.001+09:00</published><updated>2008-06-28T22:08:52.448+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Compile Erlang linked-in driver on Mac OSX (Darwin)</title><content type='html'>In order to compile the Erlang linked-in driver on Darwin, we must specify some options when it will be linked. If you don't specify these options, you might see errors is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;% gcc -o my_drv.dymlib my_drv.c -dynamiclib -fpic&lt;br /&gt;&lt;br /&gt;/usr/bin/ld: Undefined symbols:&lt;br /&gt;_driver_alloc&lt;br /&gt;_driver_free&lt;br /&gt;_driver_output&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That's invalid, so it must specify some options below in order to create the shared object.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% gcc -o my_drv.so my_drv.c -bundle -flat_namespace -udefined suppress&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;see README in source code of Erlang/OTP for more details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-1566946255542746521?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1566946255542746521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/1566946255542746521'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/06/compile-erlang-linked-in-driver-on-mac_28.html' title='Compile Erlang linked-in driver on Mac OSX (Darwin)'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-3442214596769659201</id><published>2008-06-27T14:51:00.001+09:00</published><updated>2008-06-27T18:57:52.247+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Asynchronous driver in Erlang using driver_async</title><content type='html'>Erlang provides some mechanism is to communicate other language, this can be used for to reuse module, speed things up (Erlang is ten times as slow as slow than C), to access OS resource and so on. The below mechanism are provided.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.erlang.org/doc/apps/erl_interface/ei_users_guide.html#1"&gt;Pipe Drivers&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;The "pipe drivers" enables bi-directional communication. The external process can be implemented in C or any language, and it can use &lt;a href="http://www.erlang.org/doc/apps/erl_interface/ref_man_erl_interface_frame.html"&gt;erl_interface&lt;/a&gt; and &lt;a href="http://www.erlang.org/doc/man/ei.html"&gt;ei&lt;/a&gt; library in order to manipulate data of Erlang as ETERM.&lt;br /&gt;&lt;br /&gt;Benefit:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Frexible, it can use some types data.&lt;/li&gt;&lt;li&gt;Any language&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Demerit:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Communication overhead&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.erlang.org/doc/apps/erts/part_frame.html"&gt;Linked-in Drivers&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;A driver in Erlang is a library written in C/C++, that is linked to the Erlang emulator and called from erlang. A driver can be dynamically loaded, as a shared library (known as a DLL on windows), or statically loaded, linked with the emulator when it is compiled and linked.&lt;br /&gt;&lt;br /&gt;Benefit:&lt;br /&gt;* Faster than "Pipe Drivers"&lt;br /&gt;&lt;br /&gt;Demerit:&lt;br /&gt;* Not frexible, to pass the complex data between C/C++ and Erlang is difficult. (see also &lt;a href="http://www.erlang.org/doc/man/ei.html"&gt;ei&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Asynchonous Linked-in Driver&lt;/span&gt;&lt;br /&gt;The "Linked-in Drivers" is faster than "Pipe Drivers", but it can not scale with a lot of process, since it run synchronously. So If you'd like to take advantage of platforms with multiple CPUs, then you must run some Erlang virtual machine since it run on single thread.&lt;br /&gt;&lt;br /&gt;It sounds like great!, but we should care the some problems, multi-thread problem and so on.&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.erlang.org/doc/apps/erts/driver.html#6.5"&gt;6.5 Sample asynchronous driver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.erlang.org/doc/apps/erts/driver.html#6.6"&gt;6.6 An asynchronous driver using driver_async&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Next, I'll write an entry about how to create asynchronous driver.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-3442214596769659201?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3442214596769659201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3442214596769659201'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/06/asynchronous-driver-in-erlang-using.html' title='Asynchronous driver in Erlang using driver_async'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-5429089641850896567</id><published>2008-06-18T20:23:00.000+09:00</published><updated>2008-06-18T21:34:49.580+09:00</updated><title type='text'>[EC2] mount /dev/sdc device since /dev/sdb is not available</title><content type='html'>AWS team announced about persistent storage, see below the link.&lt;br /&gt;&lt;br /&gt;http://www.allthingsdistributed.com/2008/04/persistent_storage_for_amazon.html&lt;br /&gt;&lt;br /&gt;That's looks like pretty cool, but it's closed beta now, so we should use S3 or EC2 ephemeral storage (aka. Instance Storage). The 160GB storage is available on  m1.large  AMI, and some below devices are available.&lt;br /&gt;&lt;blockquote&gt;/dev/sda1 Formatted and mounted as root (/) on all instance types&lt;br /&gt;/dev/sda2 Formatted and mounted as /mnt on small instances&lt;br /&gt;/dev/sda3 Formatted and mounted as /swap on small instances&lt;br /&gt;/dev/sdb Formatted and mounted as /mnt on large and extra large instances&lt;br /&gt;/dev/sdc Available on large and extra large instances; not mounted&lt;br /&gt;/dev/sdd Available on extra large instances; not mounted&lt;br /&gt;/dev/sde Available on extra large instances; not mounted &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;ATTENTION: The /dev/sdb isn't mounted to /mnt on m1.large AMI, see below a link for more details.&lt;br /&gt;But the /dev/sdb device looks like that isn't mounted to /mnt. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% df -h&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/dev/sda1             9.9G  8.6G  801M  92% /&lt;br /&gt;tmpfs                 3.8G     0  3.8G   0% /lib/init/rw&lt;br /&gt;udev                   10M   10M     0 100% /dev&lt;br /&gt;tmpfs                 3.8G  4.0K  3.8G   1% /dev/shm&lt;br /&gt;%&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;/dev/sdb is recognized in /etc/fstab, but it isn't mounted.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# Default /etc/fstab&lt;br /&gt;# Supplied by: ec2-ami-tools-1.3-20041&lt;br /&gt;/dev/sda1 /     ext3    defaults 1 1&lt;br /&gt;/dev/sdb  /mnt  ext3    defaults 0 0&lt;br /&gt;none      /dev/pts devpts  gid=5,mode=620 0 0&lt;br /&gt;none      /proc proc    defaults 0 0&lt;br /&gt;none      /sys  sysfs   defaults 0 0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% sudo mount /mnt&lt;br /&gt;mount: /dev/sdb is not a valid block device &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So we should initialize device to use as file system.&lt;br /&gt;At first, optimize virtual devices before use them in production.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;dd if=/dev/zero of=/dev/sdb bs=1M &lt;br /&gt;dd if=/dev/zero of=/dev/sdc bs=1M &lt;br /&gt;dd if=/dev/zero of=/dev/sdd bs=1M (m1.xlarge only) &lt;br /&gt;dd if=/dev/zero of=/dev/sde bs=1M (m1.xlarge only) &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create a file system and mount it, and mounted /dev/sdc device is available now.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mkfs -t ext3 /dev/sdc&lt;br /&gt;mount -t ext3 /dev/sdc /www&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/dev/sda1             9.9G  8.2G  1.2G  88% /&lt;br /&gt;tmpfs                 3.8G     0  3.8G   0% /lib/init/rw&lt;br /&gt;udev                   10M   10M     0 100% /dev&lt;br /&gt;tmpfs                 3.8G  4.0K  3.8G   1% /dev/shm&lt;br /&gt;/dev/sdc              414G  6.7G  386G   2% /www&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-5429089641850896567?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5429089641850896567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5429089641850896567'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/06/ec2-mount-devsdc-device-since-devsdb-is.html' title='[EC2] mount /dev/sdc device since /dev/sdb is not available'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-6846215884627578190</id><published>2008-06-17T13:06:00.005+09:00</published><updated>2008-06-17T14:05:58.671+09:00</updated><title type='text'>グラデーションブックスで本を探そう。amazonのおすすめ本ばかり読んでいたら世界が広がらない。</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://gradationbooks.com/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px;" src="http://farm1.static.flickr.com/34/101350718_9de00d200c.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Photo via &lt;a href="http://www.flickr.com/photos/proserpina_/101350718/"&gt;Flickr&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://gradationbooks.com/"&gt;グラデーションブックス&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;amazonの本ランキングや、楽天ブックスの本ランキングは、読者に新しい発見や本をブラウズする楽しみをもたらしているだろうか？実は、深いつながりがある、経済学の本と、最近話題のKYについて書いた本を一緒にリコメンドするだろうか？&lt;a href="http://ja.wikipedia.org/wiki/%E5%B3%B6%E5%B6%BC%E7%94%9F%E7%89%A9%E5%AD%A6"&gt;島嶼http://www.blogger.com/img/gl.link.gif生物学&lt;/a&gt;と企業の経営について、二つの本を結びつける事ができるだろうか？&lt;br /&gt;&lt;br /&gt;先日、クローズアップ現代「&lt;a href="http://www.nhk.or.jp/gendai/kiroku2008/0806-1.html#wed"&gt;ランキンhttp://www.blogger.com/img/gl.link.gifグ依存が止まらない&lt;/a&gt;」で、出版業界が抱える問題にスポットを当てた特集が放送された。とても素晴らしいまとめ記事が&lt;a href="http://d.hatena.ne.jp/beniya/20080604#10445"&gt;2008-06-04 今日の「クローズアップ現代」&lt;/a&gt;にある。&lt;br /&gt;&lt;blockquote&gt;出版ニュース社の清田代表は、「ランキングで売れているからそれでいいというわけではない。出版の世界は奥が深いし、多様なものがあって、いろんな面白い本がある。むしろ、売れない本、売りにくい本こそ、いい本があって、埋もれてしまっている状況だ」&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;そのような状況の中、本を扱うサイト「&lt;a href="http://gradationbooks.com/"&gt;グラデーションブックス&lt;/a&gt;」がオープンした。サイトの運営元である、澁川直子氏の言葉を引用する。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;「従来の目的型検索やリコメンデーションサービスでは出会うことができな&lt;br /&gt;かった、思いもよらない本を見つけ出せる喜びを提供できればと思います。」&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;amazonのリコメンドでは、思いもよらなかった発見が無い。極端な言い方をしてしまえば、amazonのオススメ本ばかり読んでいては、世界観が広がらない。だからこそ、人は、本屋に足を運び、本を買う。本好きの知人から、面白い本について教えてもらう。憧れている人が読んでいる本を、自分も読む。&lt;br /&gt;&lt;br /&gt;上記に引用したブログ中にも書かれている通り、ランキングを見て本を購入する読者は、年に本を数冊しか読まないユーザである。たくさんの本を読んでいる人は、複数のジャンルを超えて、面白い本を発見し、つながりを見つけ出す英知を持っている。年間数冊しか読まない読者も、年間２００冊読む読者と同じように、面白い本に出会えるサイトが、グラデーションブックスであるような気がしている。&lt;br /&gt;&lt;br /&gt;技術本やビジネス本などの実用書しか読まなかった私も、このサービスをきっかけに小説やミステリーを読み出してみた。そんな、きっかけを与えてくれた面白い本を集めてくれている本棚をいくつかリンク。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gradationbooks.com/booklovers/3"&gt;chibinaoさん&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gradationbooks.com/booklovers/10"&gt;Junさん&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gradationbooks.com/booklovers/8"&gt;yukoさん&lt;/a&gt;&lt;br /&gt;&lt;a href="http://gradationbooks.com/booklovers/12"&gt;Saitoさん&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-6846215884627578190?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6846215884627578190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6846215884627578190'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/06/amazon.html' title='グラデーションブックスで本を探そう。amazonのおすすめ本ばかり読んでいたら世界が広がらない。'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-263789838206820593</id><published>2008-05-19T11:07:00.001+09:00</published><updated>2008-05-19T11:16:51.142+09:00</updated><title type='text'>[rails] RSpec matchers for render(:nothing =&gt; true)</title><content type='html'>This is matchers for render(:nothing =&gt; true).&lt;br /&gt;&lt;br /&gt;Add some code into spec/spec_helper.rb is as follows:&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Matchers for render(:nothing =&amp;gt; true)&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;RenderNothing&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;initialize&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;matches?&lt;/span&gt;(controller)&lt;br /&gt;    &lt;span class="synIdentifier"&gt;@actual&lt;/span&gt; = controller.rendered_file&lt;br /&gt;    &lt;span class="synIdentifier"&gt;@actual&lt;/span&gt; == &lt;span class="synConstant"&gt;nil&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;failure_message&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;render_nothing expected (render :nothing =&amp;gt; true), got &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@actual.inspect}&amp;quot;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;negative_failure_message&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;render_nothing expected (render :nothing =&amp;gt; true) not to equal &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@actual.inspect}&amp;quot;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;render_nothing&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;RenderNothing&lt;/span&gt;.new&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Use render_nothing.&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;it &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;should not render anything&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt; &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;  post &lt;span class="synIdentifier"&gt;:destroy&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;br /&gt;  response.should render_nothing&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-263789838206820593?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/263789838206820593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/263789838206820593'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/05/rails-rspec-matchers-for-rendernothing.html' title='[rails] RSpec matchers for render(:nothing =&gt; true)'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4296978208047587486</id><published>2008-05-18T12:37:00.000+09:00</published><updated>2008-05-18T12:43:00.121+09:00</updated><title type='text'>[rails] RSpec render_layout expects render specified layout file</title><content type='html'>Original idea via &lt;a href="http://rubyforge.org/pipermail/rspec-users/2007-October/004026.html"&gt;http://rubyforge.org/pipermail/rspec-users/2007-October/004026.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Add some code into your spec/spec_helper.rb is as follows:&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;RenderLayout&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;initialize&lt;/span&gt;(expected)&lt;br /&gt;    &lt;span class="synIdentifier"&gt;@expected&lt;/span&gt; = &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;layouts/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; + expected&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;matches?&lt;/span&gt;(controller)&lt;br /&gt;    &lt;span class="synIdentifier"&gt;@actual&lt;/span&gt; = controller.layout&lt;br /&gt;    &lt;span class="synIdentifier"&gt;@actual&lt;/span&gt; == &lt;span class="synIdentifier"&gt;@expected&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;failure_message&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;render_layout expected &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@expected.inspect}&lt;/span&gt;&lt;span class="synConstant"&gt;, got &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@actual.inspect}&amp;quot;&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@expected&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@acutual&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;negative_failure_message&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;render_layout expected &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@expected.inspect}&lt;/span&gt;&lt;span class="synConstant"&gt; not to equal &lt;/span&gt;&lt;span class="synSpecial"&gt;#{@actual.inspect}&amp;quot;&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@expected&lt;/span&gt;, &lt;span class="synIdentifier"&gt;@actual&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;render_layout&lt;/span&gt;(expected)&lt;br /&gt;  &lt;span class="synIdentifier"&gt;RenderLayout&lt;/span&gt;.new(expected)&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;your_controller_spec.rb&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;it &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;should render 'application' layout file&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt; &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;   get &lt;span class="synIdentifier"&gt;:index&lt;/span&gt;&lt;br /&gt;   response.should render_layout(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;application&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4296978208047587486?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4296978208047587486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4296978208047587486'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/05/rails-rspec-renderlayout-expects-render.html' title='[rails] RSpec render_layout expects render specified layout file'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-6785399156837705715</id><published>2008-05-06T18:42:00.006+09:00</published><updated>2008-05-06T21:40:49.621+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>[rails] Running Erubis on Edge Rails</title><content type='html'>ActionView class was refactoring on Edge Rails, see &lt;a href="http://dev.rubyonrails.org/ticket/10437"&gt;Ticket #10437&lt;/a&gt; for more details. The template engines are integrated into new ActionView::Template class, but we have to modify some scripts in order to run &lt;a href="http://www.kuwata-lab.com/erubis/"&gt;Erubis&lt;/a&gt; on Edge Rails.&lt;br /&gt;&lt;h3&gt;0. Install Erubis and Edge Rails&lt;br /&gt;&lt;/h3&gt;&lt;pre&gt;% sudo gem install erubis&lt;br /&gt;% cd /path/to/rails_app/ &amp;amp;&amp;amp; rake rails::freeze:edge&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;1. Create a template handler for Erubis.&lt;/h3&gt;Copy and paste below code at &lt;span style="font-weight: bold;"&gt;#{RAILS_ROOT}/lib/erubis_rails_helper.rb&lt;/span&gt;.&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;erubis&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;erubis/preprocessing&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;Erubis&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;Eruby&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;include&lt;/span&gt; &lt;span class="synIdentifier"&gt;ErboutEnhancer&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;FastEruby&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;include&lt;/span&gt; &lt;span class="synIdentifier"&gt;ErboutEnhancer&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;ActionView&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;TemplateHandlers&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;Erubis&lt;/span&gt; &amp;lt; &lt;span class="synIdentifier"&gt;TemplateHandler&lt;/span&gt;&lt;br /&gt; &lt;span class="synPreProc"&gt;include&lt;/span&gt; &lt;span class="synIdentifier"&gt;Compilable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="synComment"&gt;# Erubis engine class&lt;/span&gt;&lt;br /&gt; cattr_accessor &lt;span class="synIdentifier"&gt;:engine_class&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;@@engine_class&lt;/span&gt; = ::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Eruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="synComment"&gt;# Properties&lt;/span&gt;&lt;br /&gt; cattr_accessor &lt;span class="synIdentifier"&gt;:init_properties&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;@@init_properties&lt;/span&gt; = {}&lt;br /&gt;&lt;br /&gt; &lt;span class="synComment"&gt;# Enable preprocessing if true&lt;/span&gt;&lt;br /&gt; cattr_accessor &lt;span class="synIdentifier"&gt;:preprocessing&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;@@preprocessing&lt;/span&gt; = &lt;span class="synConstant"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;compile&lt;/span&gt;(template)&lt;br /&gt;   &lt;span class="synStatement"&gt;if&lt;/span&gt; preprocessing&lt;br /&gt;     preprocessor = ::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;::&lt;span class="synIdentifier"&gt;PreprocessingEruby&lt;/span&gt;.new(template, init_properties)&lt;br /&gt;     template = preprocessor.evaluate(&lt;span class="synIdentifier"&gt;@view&lt;/span&gt;)&lt;br /&gt;   &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;   engine_class.new(template, init_properties).src&lt;br /&gt; &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Template&lt;/span&gt;.register_default_template_handler &lt;span class="synIdentifier"&gt;:erb&lt;/span&gt;, &lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;TemplateHandlers&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Template&lt;/span&gt;.register_template_handler &lt;span class="synIdentifier"&gt;:rhtml&lt;/span&gt;, &lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;TemplateHandlers&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;2. Configure settings of Erubis in enviroment.rb.&lt;/h3&gt;&lt;span&gt;Append below scripts in config/enviroment.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;erubis_rails_helper&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;TemplateHandlers&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;.engine_class = &lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FastEruby&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;ActionView&lt;/span&gt;::&lt;span class="synIdentifier"&gt;TemplateHandlers&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Erubis&lt;/span&gt;.preprocessing = &lt;span class="synConstant"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;Restart the web server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-6785399156837705715?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6785399156837705715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/6785399156837705715'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/05/rails-running-erubis-on-edge-rails.html' title='[rails] Running Erubis on Edge Rails'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-3402282834454339018</id><published>2008-05-03T13:56:00.002+09:00</published><updated>2008-05-04T11:20:02.423+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>[rails] released jrails_in_place_editing</title><content type='html'>The jrails_in_place_editing is implementation of inplace editor with jQuery, so this plugin is dependent on &lt;a href="http://ennerchi.com/projects/jrails"&gt;jRails&lt;/a&gt;. This uses &lt;a href="http://www.davehauenstein.com/blog/"&gt;David Hauenstein&lt;/a&gt;'s jQuery inplace editor plugin. Thank you.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;INSTALL (Note: Edge Rails)&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;./script/plugin install git://github.com/rakuto/jrails_in_place_editing.git&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;USAGE&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;  &lt;span class="synComment"&gt;# Controller&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;BlogController&lt;/span&gt; &amp;lt; &lt;span class="synIdentifier"&gt;ApplicationController&lt;/span&gt;&lt;br /&gt;      in_place_edit_for &lt;span class="synIdentifier"&gt;:post&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:title&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synComment"&gt;# Customize the action that update the value&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;BlogController&lt;/span&gt; &amp;lt; &lt;span class="synIdentifier"&gt;ApplicationController&lt;/span&gt;&lt;br /&gt;    &lt;span class="synComment"&gt;# set_#{object}_#{title}&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;set_post_title&lt;/span&gt;&lt;br /&gt;      post = &lt;span class="synIdentifier"&gt;Post&lt;/span&gt;.find(params[&lt;span class="synIdentifier"&gt;:id&lt;/span&gt;]) &lt;br /&gt;      post.title = params[&lt;span class="synIdentifier"&gt;:value&lt;/span&gt;]&lt;br /&gt;      post.save&lt;br /&gt;&lt;br /&gt;      &lt;span class="synComment"&gt;# It should render a text &lt;/span&gt;&lt;br /&gt;      render &lt;span class="synIdentifier"&gt;:text&lt;/span&gt; =&amp;gt; post.title&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;span class="synComment"&gt;# View&lt;/span&gt;&lt;br /&gt;  &amp;lt;%= in_place_editor_field &lt;span class="synIdentifier"&gt;:post&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:title&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synComment"&gt;# Pass some options&lt;/span&gt;&lt;br /&gt;  &amp;lt;%= in_place_editor_field &lt;span class="synIdentifier"&gt;:post&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:title&lt;/span&gt;, {}, {&lt;span class="synIdentifier"&gt;:field_type&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;textarea&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:textarea_cols&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;25&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:textarea_rows&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;10&lt;/span&gt;}%&amp;gt;&lt;br /&gt;  &amp;lt;%= in_place_editor_field &lt;span class="synIdentifier"&gt;:post&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:title&lt;/span&gt;, {}, {&lt;span class="synIdentifier"&gt;:field_type&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;textarea&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:textarea_rows&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;10&lt;/span&gt;}%&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For more details, see jrails_inplace_editing/javascripts/jquery.inplace.js&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-3402282834454339018?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3402282834454339018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/3402282834454339018'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/05/rails-released-jrailsinplaceediting.html' title='[rails] released jrails_in_place_editing'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-71910460812403329</id><published>2008-04-29T17:03:00.003+09:00</published><updated>2008-04-29T17:13:14.827+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Rails'/><title type='text'>Edge Rails: Describes Gem Dependencies</title><content type='html'>So far today, Gem dependencies might be written with Capistrano, but we can write Gem dependencies in config/environemt.rb with Edge Rails, and it will be installed with Rake task.&lt;br /&gt;&lt;br /&gt;# in config/enviroment.rb&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;config.gem &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;hpricot&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;config.gem &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;aws/s3&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;gt;= 0.4.0&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;config.gem &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;aws-s3&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:lib&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;aws/s3&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:version&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;gt;= 0.4.0&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:source&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;http://code.whytheluckystiff.net&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Install all required Gems.&lt;br /&gt;&lt;pre&gt;rake gems:install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Cool&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-71910460812403329?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/71910460812403329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/71910460812403329'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/edge-rails-describes-gem-dependencies.html' title='Edge Rails: Describes Gem Dependencies'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-372399127096375294</id><published>2008-04-26T00:23:00.006+09:00</published><updated>2008-04-27T17:25:23.020+09:00</updated><title type='text'>OpenID再利用問題</title><content type='html'>&lt;blockquote&gt;ドメインの更新忘れもOpenIDにおける脆弱性の一つ。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;URLやXRIを入力するだけで、Yadisプロトコルに基づきOpenIDプロバイダーやi-Brokerを発見し、認証が行えるシステムは、とてもシンプルでありながら、WWWの分散アーキテクチャの上に構築された強力なエコシステムだ。しかし、問題は、私達自身の識別子として利用可能なURLやXRIは、永遠ではないことだ。&lt;br /&gt;&lt;br /&gt;もしも、私達が利用しているOpenIDプロバイダがドメインの更新を忘れて、第三者にドメインが取得された場合、私達のアカウントがこの第三者により不正に使用される可能性が出てくる。myOpenIDや、多くのプロバイダでは、単純なルールに基づいた、Human FriendlyなOP-Local Identifierを提供してくれているが、ユーザは、セキュリティ的、高可用性の両方の側面からRelying Partyでのユーザ登録に、OP-Local Identifierを使用すべきではない。&lt;br /&gt;&lt;br /&gt;もう少し、現実的に起こりえそうな問題は、OpenIDプロバイダにより特定のアカウントの持ち主が変更されたケースである。初めは、Aというユーザが、a.example.comというOP-Local Identifierを保持していたが、Aが退会して同じOP-Local IdentifierがBというユーザに渡った場合、Bは、AがOP-Local Identifierを用いて会員登録したRPにサインインして登録された情報に自由にアクセスすることができる。&lt;br /&gt;&lt;br /&gt;もう一つの問題は、自分のHPのURLを識別子として利用した場合のリスクである。この場合、自分がドメインの更新を忘れて(または意図的に)、ドメインが第三者の手に渡ると、Relying Party上に残した私達の情報が、第三者に再利用される可能性が生まれる。&lt;br /&gt;&lt;br /&gt;どちらの問題も、OPでのアカウントのExpireや移行がRPと同期できないために発生する問題である。&lt;br /&gt;既存のOpenIDライブラリ(といっても、ruby-openidしか見ていない)では、OpenID URLの変更とアクティベーションのサンプルはついていないが、RPはこの機能を用意すべきだろう。&lt;br /&gt;&lt;br /&gt;OpenID再利用問題一つとっても認証をOpenIDのみに踏み切るには、まだまだリスクが高い。&lt;br /&gt;&lt;br /&gt;P.S.&lt;br /&gt;念のため補足すると、XRIでは再利用の問題が起きない。これは、XRIが取得される度にi-Numberと呼ばれる全世界で一意な値を割り当てるからである。XRIでは、このi-NumberがClaimed Identifier(aka XRDS::XRD::CanonicalEquivID)になるからである。&lt;br /&gt;&lt;br /&gt;myOpenIDなどユーザのセキュリティに対して十分な対応をしているプロバイダでは、一度取得されたアカウントは、退会した後も再利用される事は無いのでここに書いた問題は発生しない。ただし、退会後のアカウントについて明記していないプロバイダは要注意である。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-372399127096375294?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/372399127096375294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/372399127096375294'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/openid_26.html' title='OpenID再利用問題'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2922616732422472142</id><published>2008-04-23T23:03:00.009+09:00</published><updated>2008-04-25T00:57:21.034+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>DRY routing with form generated by Rails helper methods, shouldn't write routings directly in Javascript code.</title><content type='html'>The routing solution in Rails is pretty powerful, so we can modify routing easiliy.  This facility may become cause of bugs.  If we wanna submit data asynchronously with Javascript, then we have to write some routing paths in source of Javascript directly. It's not DRY and it doesn't  work together with Rails routing solution.&lt;br /&gt;&lt;br /&gt;So we think example code which post a comment to the article. We have two resources, articles, comments.&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;map.resources &lt;span class="synIdentifier"&gt;:articles&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:has_many&lt;/span&gt; =&amp;gt; [&lt;span class="synIdentifier"&gt;:comments&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, I guess most people use helper methods which built in rails.&lt;br /&gt;&lt;pre class="eruby"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synComment"&gt;# The generated path (aka action) is same as &amp;quot;/articles/:article_id/comments&amp;quot; %&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;% remote_for_for([&lt;span class="synIdentifier"&gt;@article&lt;/span&gt;, &lt;span class="synIdentifier"&gt;Comment&lt;/span&gt;.new]) &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;f&lt;/span&gt;| &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt;     f.text_field &lt;span class="synIdentifier"&gt;:body&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt;     submit_tag &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Post&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It's just simple, not a problem. &lt;br /&gt;&lt;br /&gt;Imagine create a basket like shopping card, it supports drag and drop user interface. We can drag products or image into basket. This example has routings is as follows:&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;map.resource &lt;span class="synIdentifier"&gt;:basket&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:has_many&lt;/span&gt; =&amp;gt; [&lt;span class="synIdentifier"&gt;:items&lt;/span&gt;]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And we have to implement drag and drop user interface, following code is sample implementation with jQuery.  It has URL where submits item data. If someone will change Rails routings, this code will be sucks. &lt;br /&gt;&lt;br /&gt;&lt;pre class="javascript"&gt;&lt;br /&gt;$(&lt;span class="synIdentifier"&gt;function&lt;/span&gt;()&lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;  &lt;span class="synComment"&gt;// &lt;/span&gt;&lt;span class="synTodo"&gt;FIXME&lt;/span&gt;&lt;span class="synComment"&gt;:  It's not DRY&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;var&lt;/span&gt; ADD_ITEMS_TO_BASKET_PATH = &lt;span class="synConstant"&gt;'/basket/items'&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;  $(&lt;span class="synConstant"&gt;'img.draggableItem'&lt;/span&gt;).draggable();&lt;br /&gt;  $(&lt;span class="synConstant"&gt;'#basket'&lt;/span&gt;).droppable(&lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;     drop: &lt;span class="synIdentifier"&gt;function&lt;/span&gt;(e) &lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;        $.ajax(&lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;           url: ADD_ITEM_TO_BASKET_PATH,&lt;br /&gt;           type: &lt;span class="synConstant"&gt;'post'&lt;/span&gt;,&lt;br /&gt;           success: &lt;span class="synIdentifier"&gt;function&lt;/span&gt;()&lt;span class="synIdentifier"&gt;{}&lt;/span&gt; &lt;br /&gt;        &lt;span class="synIdentifier"&gt;}&lt;/span&gt;);&lt;br /&gt;      &lt;span class="synIdentifier"&gt;}&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;}&lt;/span&gt;);&lt;br /&gt;&lt;span class="synIdentifier"&gt;}&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So I guess we should use forms generated by Rails helper methods, and It set form's visibility is hidden.  You set a required data into fields, and submit the form.&lt;br /&gt;&lt;br /&gt;In Rails view:&lt;br /&gt;&lt;pre class="eruby"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; remote_form_for([&lt;span class="synIdentifier"&gt;@basket&lt;/span&gt;, &lt;span class="synIdentifier"&gt;Item&lt;/span&gt;.new], &lt;span class="synIdentifier"&gt;:html&lt;/span&gt; =&amp;gt; {&lt;span class="synIdentifier"&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;add_to_basket&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:style&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;display:none&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;}) &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;f&lt;/span&gt;| &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt;   f.hidden_field &lt;span class="synIdentifier"&gt;:id&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt;   submit_tag &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Add an item&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In Javascript:&lt;br /&gt;&lt;pre class="javascript"&gt;&lt;br /&gt;$(&lt;span class="synIdentifier"&gt;function&lt;/span&gt;()&lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;  $(&lt;span class="synConstant"&gt;'img.draggableItem'&lt;/span&gt;).draggable();&lt;br /&gt;  $(&lt;span class="synConstant"&gt;'#basket'&lt;/span&gt;).droppable(&lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;     drop: &lt;span class="synIdentifier"&gt;function&lt;/span&gt;(e, ui) &lt;span class="synIdentifier"&gt;{&lt;/span&gt;&lt;br /&gt;         &lt;span class="synIdentifier"&gt;var&lt;/span&gt; itemId = itemId(e.target);&lt;br /&gt;         &lt;span class="synIdentifier"&gt;var&lt;/span&gt; form = $(&lt;span class="synConstant"&gt;'#add_to_basket'&lt;/span&gt;);&lt;br /&gt;         form.find(&lt;span class="synConstant"&gt;'&amp;gt; input[name=&amp;quot;item[id]&amp;quot;]'&lt;/span&gt;).val(itemId);&lt;br /&gt;         $(&lt;span class="synConstant"&gt;'#add_to_basket &amp;gt; input[type=&amp;quot;submit&amp;quot;]'&lt;/span&gt;).click();&lt;br /&gt;     &lt;span class="synIdentifier"&gt;}&lt;/span&gt;&lt;br /&gt;   &lt;span class="synIdentifier"&gt;}&lt;/span&gt;);&lt;br /&gt;&lt;span class="synIdentifier"&gt;}&lt;/span&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this case, we don't need to write any routings directly in Javascript, so It's DRY.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-2922616732422472142?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2922616732422472142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2922616732422472142'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/dry-routing-with-form-generated-by.html' title='DRY routing with form generated by Rails helper methods, shouldn&apos;t write routings directly in Javascript code.'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-5532499952568178313</id><published>2008-04-21T08:52:00.003+09:00</published><updated>2008-04-21T09:44:23.854+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>rubyonrails.org isn't available now?</title><content type='html'>It might forget to update a domain name, so we can't see rubyonrails.org.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;% whois rubyonrails.org&lt;br /&gt;Last Updated On:20-Apr-2008 18:08:51 UTC&lt;br /&gt;Expiration Date:19-Apr-2009 22:40:29 UTC&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We can access rubyonrails.com, .net instead of .org.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;See also&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.ruby-forum.com/topic/150274"&gt;http://www.ruby-forum.com/topic/150274&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-5532499952568178313?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5532499952568178313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5532499952568178313'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/rubyonrailsorg-isnt-available-now.html' title='rubyonrails.org isn&apos;t available now?'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2517831246717375882</id><published>2008-04-20T10:40:00.007+09:00</published><updated>2008-04-22T01:25:50.382+09:00</updated><title type='text'>瀧内メソッドで開催された第０回OpenID勉強会に第一回はない</title><content type='html'>第０回OpenID勉強会が開催されました。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_h3yjP15uxZ4/SAqqg1n0gjI/AAAAAAAAAFQ/AmJpT4pQgpg/s1600-h/P1000162.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_h3yjP15uxZ4/SAqqg1n0gjI/AAAAAAAAAFQ/AmJpT4pQgpg/s400/P1000162.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5191149001624551986" /&gt;&lt;/a&gt;&lt;br /&gt;写真は、&lt;a href="http://blog.s21g.com/articles/534"&gt;OpenID勉強会レポート&lt;/a&gt;より拝借。&lt;br /&gt;&lt;br /&gt;全くのノープラン、セッションの詳細無しにも関わらず、２０人ものOpenID野郎達が集まりました。&lt;br /&gt;Identity界隈には、男しかいないのでしょうか。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;参加者&lt;/strong&gt;&lt;br /&gt;全体的に、LL使いの人達が多く集まったようでした。プログラマではない方も２名いて、企業におけるOpenID導入における苦労話や、Yahoo!の中のアカウントをOpenID化する際のセキュリティポリシーに対する考えなどを話してもらえました。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;全員参加型勉強会では、20人/セッションまで&lt;/strong&gt;&lt;br /&gt;今回もComet勉強会を彷彿とさせる、&lt;a href="http://blog.s21g.com/articles/534"&gt;瀧内メソッド&lt;/a&gt;により内容の充実した勉強会が開催できました。全員参加型のセッションが開催できるのは、このメソッドの良い所。しかし、最大の欠点が、続く第１回OpenID勉強会を開催するとすれば話す事が無い事。こちらもComet勉強会を彷彿とさせます。次回開催できるとすれば、OpenIDに限らず、より話を広げて、Digital Identity全体、Social Webなどの話になるかもしれません。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;勉強会に来るプログラマには、ブラックボックスを刺激しろ&lt;/b&gt;&lt;br /&gt;勉強会に足を運ぶプログラマたちは、「なぜかよくわからないけど動作している」といったブラックボックスが気になっているのではないでしょうか。OpenIDにおいても、ライブラリが充実しているので、「詳細がわからないけど、使えている。」「時間がなくて、動作原理やスペックを追えていない。」というプログラマが多いはず。勉強会中にも出ていた、「仕様書をしっかりと読み、動作原理を理解する事は、自信につながる」という話。今日から、「俺、OpenID知ってるぜ」と人に言えるようになったかも？しれません。&lt;br /&gt;&lt;br /&gt;セッションの方は、&lt;a href="http://d.hatena.ne.jp/ZIGOROu/s"&gt;ZIGOROu&lt;/a&gt;さんの飛び入りセッション２本も入り、とても充実。ありがとうございました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;懇親会は、６時間の長丁場&lt;/b&gt;&lt;br /&gt;ピッチャーも10杯以上は出たのでは？という６時間の長丁場。懇親会は、勉強会第二ラウンド。こちらでは、OpenIDに止まらず、色々な話ができました。&lt;br /&gt;&lt;br /&gt;今後のOpenID界隈の話は、次の場所で開催していますので、ご参加ください。&lt;br /&gt;&lt;div id="skype-publicchat" style="background: white url(http://download.skype.com/share/publicchat/background.png) left bottom repeat-x !important; font: 11px/16px Arial, Helvetica, sans-serif !important;border: 1px solid #009de9 !important;"&gt;&lt;h1 style="padding: 50px 10px 9px 10px !important;margin: 0 !important;font: 12px/16px Arial, Helvetica, sans-serif !important;font-weight: bold !important;color: #999999 !important; background: transparent url(http://download.skype.com/share/publicchat/snippet_head_blue.png) left top no-repeat !important;"&gt;&lt;a style="color: #006699 !important;text-decoration: none !important;" href="http://www.skype.com/go/joinpublicchat?chat&amp;amp;skypename=rfurutani&amp;amp;topic=OpenID%E5%8B%89%E5%BC%B7%E4%BC%9A&amp;amp;blob=oGnqa7t7RVLgYlXhISC0DDZQgPu6wR68gxztrujfE5uW9nleBF11S0GuV28UuQVtK6hSdakSMV-fDNo6t01tgI0-uKVwDBhFAIDygS1rC2jPW6CPgvERLCK7FtOIoOsjCcpM-vA-Ac2rBe3J2HJ1A8huoCPy"&gt;OpenID勉強会&lt;/a&gt; hosted by &lt;a style="color: #006699 !important;text-decoration: none !important;" href="skype:rfurutani?info"&gt;rfurutani&lt;/a&gt;.&lt;/h1&gt;&lt;p style="margin: 0 10px 10px 10px!important;"&gt;&lt;a href="http://www.skype.com/go/joinpublicchat?chat&amp;amp;skypename=rfurutani&amp;amp;topic=OpenID%E5%8B%89%E5%BC%B7%E4%BC%9A&amp;amp;blob=oGnqa7t7RVLgYlXhISC0DDZQgPu6wR68gxztrujfE5uW9nleBF11S0GuV28UuQVtK6hSdakSMV-fDNo6t01tgI0-uKVwDBhFAIDygS1rC2jPW6CPgvERLCK7FtOIoOsjCcpM-vA-Ac2rBe3J2HJ1A8huoCPy" style="color: #006699 !important; background: transparent url(http://download.skype.com/share/publicchat/chat_icon.png) left center no-repeat !important;padding-left: 20px !important;display: block !important;"&gt;Join now&lt;/a&gt;&lt;/p&gt;&lt;hr style="margin: 5px 10px !important;height: 1px !important;background: #cccccc !important;border: none;" /&gt;&lt;p style="margin: 0 10px 10px 10px!important;"&gt;&lt;small style="font-size: 9px; color: #515151 !important;"&gt;Chat about what's on your mind. &lt;a href="http://www.skype.com/go/publicchats" style="font-size: 9px; color: #006699 !important;"&gt;More about public chats&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://groups.google.com/group/openid-ja"&gt;http://groups.google.com/group/openid-ja&lt;/a&gt;&lt;br /&gt;IRC: #openid-ja@freenode&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Special Thanks&lt;/strong&gt; &lt;br /&gt;&lt;a href="http://www.drecom.co.jp/"&gt;Drecom&lt;/a&gt; (会場提供)&lt;br /&gt;&lt;a href="http://blog.s21g.com/articles/534"&gt;Genki&lt;/a&gt; (オーナー)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;See also&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://blog.s21g.com/articles/534"&gt; OpenID勉強会レポート &lt;/a&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/ZIGOROu/20080420/1208677456"&gt;id:ZIGOROu - OpenID勉強会に行って来ました&lt;/a&gt;&lt;br /&gt;&lt;a href="http://onk.blog.drecom.jp/archive/141"&gt;onk-san - OpenID 勉強会に行ってきました。&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.matake.jp/archives/openid.html"&gt;matake-san - OpenID勉強会@ドリコム恵比寿オフィス&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-2517831246717375882?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2517831246717375882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2517831246717375882'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/openid.html' title='瀧内メソッドで開催された第０回OpenID勉強会に第一回はない'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h3yjP15uxZ4/SAqqg1n0gjI/AAAAAAAAAFQ/AmJpT4pQgpg/s72-c/P1000162.JPG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-210452790946709641</id><published>2008-04-14T22:05:00.009+09:00</published><updated>2008-04-16T10:22:08.845+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><title type='text'>OP Identifier and Claimed Identifier, easier OpenID Identifier.</title><content type='html'>It might be less well know, we can sign in with only OP Identifier(myopenid.com, yahoo.com etc.) into RP respond to OpenID authentication. For example, I have a myOpenID account in &lt;a href="http://rakuto.myopenid.com/"&gt;Rakuto Furutani&lt;/a&gt;. So I can sign in my OpenID URL (aka OP-Local Identifier), but I can also sign in into RP with only a OP's host name.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_h3yjP15uxZ4/SANfSHgXKGI/AAAAAAAAAFI/OaUYsCgzvr0/s1600-h/Rails+OpenID+Example+Relying+Party-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_h3yjP15uxZ4/SANfSHgXKGI/AAAAAAAAAFI/OaUYsCgzvr0/s400/Rails+OpenID+Example+Relying+Party-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5189095960518010978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Why can we sign in with only a OP's host name(aka OP Identifier)?&lt;br /&gt;&lt;br /&gt;1. First the OpenID library obtain Yadis Document from OP Identifier, It can emulate with curl script. This specification is part of a Yadis Specification.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% curl -H "Accept: application/xrds+xml" http://www.myopenid.com/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Take a response as XRDS&lt;br /&gt;&lt;pre class="xml"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="synType"&gt;xml version&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="synType"&gt; encoding&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="synComment"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;xrds&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;XRDS&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;    &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;xrds&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;xri://$xrds&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;    &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;xri://$xrd*($v*2.0)&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;XRD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Service &lt;/span&gt;&lt;span class="synType"&gt;priority&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://specs.openid.net/auth/2.0/server&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/sreg/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;URI &lt;/span&gt;&lt;span class="synType"&gt;priority&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;http://www.myopenid.com/server&lt;span class="synIdentifier"&gt;&amp;lt;/URI&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Service&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/XRD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;xrds&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;XRDS&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The OpenID client can obtain OP Endpoint URL, "http://www.myopenid.com/server", and the client is initiate the OpenID Authentication request with obtained OP Endopoint URL.  If authentication will be success, take a response(aka Positive Assertion). It includes such as some paramters is as follows:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{"openid.claimed_id"=&gt;"http://rakuto.myopenid.com/",&lt;br /&gt; "openid.mode"=&gt;"id_res",&lt;br /&gt; "openid.return_to"=&gt;"http://localhost:3000/consumer/complete",&lt;br /&gt; "openid.sig"=&gt;"4fAHQGtaUgCjsrMAfue/Qi+k32w=",&lt;br /&gt; "openid.ns"=&gt;"http://specs.openid.net/auth/2.0",&lt;br /&gt; "openid.op_endpoint"=&gt;"http://www.myopenid.com/server",&lt;br /&gt; "openid.response_nonce"=&gt;"2008-04-14T13:27:18ZCEGxaV",&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; "openid.identity"=&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt; "openid.assoc_handle"=&gt;"{HMAC-SHA1}{4e02f931}{EAZGvE==}",&lt;br /&gt; "openid.signed"=&gt;&lt;br /&gt;  "assoc_handle,claimed_id,identity,mode,ns,op_endpoint,response_nonce,return_to,signed"}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The client library can obtain Claimed ID from openid.identity, and it can also obtain our XRDS.&lt;br /&gt;&lt;pre class="xml"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="synType"&gt;xml version&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="synType"&gt; encoding&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="synComment"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;xrds&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;XRDS&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;    &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;xrds&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;xri://$xrds&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;    &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;openid&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://openid.net/xmlns/1.0&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;    &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;xri://$xrd*($v*2.0)&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;XRD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Service &lt;/span&gt;&lt;span class="synType"&gt;priority&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://specs.openid.net/auth/2.0/signon&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/sreg/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/extensions/sreg/1.1&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://schemas.openid.net/pape/policies/2007/06/phishing-resistant&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/srv/ax/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;URI&amp;gt;&lt;/span&gt;http://www.myopenid.com/server&lt;span class="synIdentifier"&gt;&amp;lt;/URI&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;LocalID&amp;gt;&lt;/span&gt;http://rakuto.myopenid.com/&lt;span class="synIdentifier"&gt;&amp;lt;/LocalID&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Service&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Service &lt;/span&gt;&lt;span class="synType"&gt;priority&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/signon/1.1&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/sreg/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/extensions/sreg/1.1&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://schemas.openid.net/pape/policies/2007/06/phishing-resistant&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/srv/ax/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;URI&amp;gt;&lt;/span&gt;http://www.myopenid.com/server&lt;span class="synIdentifier"&gt;&amp;lt;/URI&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;openid&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Delegate&amp;gt;&lt;/span&gt;http://rakuto.myopenid.com/&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;openid&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Delegate&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Service&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Service &lt;/span&gt;&lt;span class="synType"&gt;priority&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/signon/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/sreg/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/extensions/sreg/1.1&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://schemas.openid.net/pape/policies/2007/06/phishing-resistant&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;Type&amp;gt;&lt;/span&gt;http://openid.net/srv/ax/1.0&lt;span class="synIdentifier"&gt;&amp;lt;/Type&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;URI&amp;gt;&lt;/span&gt;http://www.myopenid.com/server&lt;span class="synIdentifier"&gt;&amp;lt;/URI&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;openid&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Delegate&amp;gt;&lt;/span&gt;http://rakuto.myopenid.com/&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;openid&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Delegate&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Service&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/XRD&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;xrds&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;XRDS&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;If you use URL as OpenID Identifier, then you don't need to input "http://" and your Claimed Identifier because It's client library's work. Your Claimed Identifier is obtained by RP, so you just have to input your OPs host name.&lt;br /&gt;&lt;br /&gt;e.g.) myopenid.com or yahoo.com etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-210452790946709641?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/210452790946709641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/210452790946709641'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/op-identifier-and-claim-identifier.html' title='OP Identifier and Claimed Identifier, easier OpenID Identifier.'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h3yjP15uxZ4/SANfSHgXKGI/AAAAAAAAAFI/OaUYsCgzvr0/s72-c/Rails+OpenID+Example+Relying+Party-1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-330997281178450955</id><published>2008-04-02T10:23:00.002+09:00</published><updated>2008-04-02T11:30:01.159+09:00</updated><title type='text'>4/19 OpenID勉強会のお知らせ</title><content type='html'>via &lt;a href="http://blog.s21g.com/articles/496"&gt;OpenID勉強会のお知らせ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OpenID勉強会を開催します。&lt;br /&gt;ドリコムさんの御好意により会場を貸していただけるようです。&lt;br /&gt;ありがとうございます！&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;日時：　4/19（土）　13:30～18：00&lt;/li&gt;&lt;li&gt;場所：　株式会社ドリコム　ミーティングルーム　（地図）　&lt;/li&gt;&lt;li&gt;準備: OpenIDの基礎知識。ノートPC、e-mobileがあるとなお良いです&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;以下のオープンチャットで、OpenID勉強会に関する雑談を開催しています。対岸の人達が面白くしてくれるだろうでは、残念すぎます。国内から世界に盛り上げましょう。今後必要になるOpenID Extension、 SOAPとOpenDI、ユーザ属性の交換とOP間での同期、OpenIDの未来予測、OpenIDとビジネス、Openである事とDataWeb、 地球規模で一意な識別子XRI、クロスドメインアプリケーション、などなどアツくアツく語り合いましょう。&lt;br /&gt;&lt;br /&gt;&lt;div id="skype-publicchat" style="border: 1px solid rgb(0, 157, 233) ! important; background: white url(http://download.skype.com/share/publicchat/background.png) repeat-x scroll left bottom ! important; -moz-background-clip: -moz-initial ! important; -moz-background-origin: -moz-initial ! important; -moz-background-inline-policy: -moz-initial ! important; font-family: Arial,Helvetica,sans-serif ! important; font-style: normal ! important; font-variant: normal ! important; font-weight: normal ! important; font-size: 11px ! important; line-height: 16px ! important; font-size-adjust: none ! important; font-stretch: normal ! important;"&gt;&lt;h1 style="margin: 0pt ! important; padding: 50px 10px 9px ! important; background: transparent url(http://download.skype.com/share/publicchat/snippet_head_blue.png) no-repeat scroll left top ! important; font-family: Arial,Helvetica,sans-serif ! important; font-style: normal ! important; font-variant: normal ! important; font-size: 12px ! important; line-height: 16px ! important; font-size-adjust: none ! important; font-stretch: normal ! important; font-weight: bold ! important; color: rgb(153, 153, 153) ! important; -moz-background-clip: -moz-initial ! important; -moz-background-origin: -moz-initial ! important; -moz-background-inline-policy: -moz-initial ! important;"&gt;&lt;a style="color: rgb(0, 102, 153) ! important; text-decoration: none ! important;" href="http://www.skype.com/go/joinpublicchat?chat&amp;amp;skypename=rfurutani&amp;amp;topic=OpenID%E5%8B%89%E5%BC%B7%E4%BC%9A&amp;amp;blob=n83LhOfy-I49apAovMgPKPcbsaypxAi71ItdsiukpIO_0n74O0OzLv6B0KfffgMZ3yffuGe1YH-9HKjoTe9pUMYt9FuO0EobGwyievO35w"&gt;OpenID勉強会&lt;/a&gt; hosted by &lt;a style="color: rgb(0, 102, 153) ! important; text-decoration: none ! important;" href="skype:rfurutani?info"&gt;rfurutani&lt;/a&gt;.&lt;/h1&gt;&lt;p style="margin: 0pt 10px 10px ! important;"&gt;&lt;a href="http://www.skype.com/go/joinpublicchat?chat&amp;amp;skypename=rfurutani&amp;amp;topic=OpenID%E5%8B%89%E5%BC%B7%E4%BC%9A&amp;amp;blob=n83LhOfy-I49apAovMgPKPcbsaypxAi71ItdsiukpIO_0n74O0OzLv6B0KfffgMZ3yffuGe1YH-9HKjoTe9pUMYt9FuO0EobGwyievO35w" style="background: transparent url(http://download.skype.com/share/publicchat/chat_icon.png) no-repeat scroll left center ! important; color: rgb(0, 102, 153) ! important; -moz-background-clip: -moz-initial ! important; -moz-background-origin: -moz-initial ! important; -moz-background-inline-policy: -moz-initial ! important; padding-left: 20px ! important; display: block ! important;"&gt;Join now&lt;/a&gt;&lt;/p&gt;&lt;hr style="border: medium none ; margin: 5px 10px ! important; background: rgb(204, 204, 204) none repeat scroll 0% 50% ! important; height: 1px ! important; -moz-background-clip: -moz-initial ! important; -moz-background-origin: -moz-initial ! important; -moz-background-inline-policy: -moz-initial ! important;"&gt;&lt;p style="margin: 0pt 10px 10px ! important;"&gt;&lt;small style="font-size: 9px; color: rgb(81, 81, 81) ! important;"&gt;Chat about what's on your mind. &lt;a href="http://www.skype.com/go/publicchats" style="font-size: 9px; color: rgb(0, 102, 153) ! important;"&gt;More about public chats&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-330997281178450955?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/330997281178450955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/330997281178450955'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/04/4openid.html' title='4/19 OpenID勉強会のお知らせ'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-4239574547274694573</id><published>2008-03-27T22:39:00.003+09:00</published><updated>2008-03-28T09:26:51.266+09:00</updated><title type='text'>AWS EC2 announced that release Elastic IP which includes Static IP support and more !!</title><content type='html'>Wow!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1346"&gt;Feature Guide: Amazon EC2 Elastic IP Addresses&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Amazon announced about Elastic IP. This solution is included static IP support and more. Many developers who use EC2 may become happy! The Elastic IP is associated with our account, not a paticular account, and Amazon EC2 enables us to engineer around problems with our instance or software by programmatically remapping your Elastic IP address to a replacement instance. &lt;br /&gt;&lt;br /&gt;For details, see &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1346"&gt;Feature Guide: Amazon EC2 Elastic IP Addresses&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thanks AWS team!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-4239574547274694573?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4239574547274694573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/4239574547274694573'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/03/awx-ec2-announced-that-release-elastic.html' title='AWS EC2 announced that release Elastic IP which includes Static IP support and more !!'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-5479929245798306765</id><published>2008-03-24T00:44:00.007+09:00</published><updated>2008-04-14T22:54:02.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><title type='text'>[ruby] Why does StoreRequest of OpenID Attribute Exchange (AX) attract our heart? (and DEMO of AX StoreRequest with ruby-openid)</title><content type='html'>AX StoreRequest message is defined in &lt;a href="http://openid.net/specs/openid-attribute-exchange-1_0-08.html"&gt;OpenID Attribute Exchange 1.0&lt;/a&gt;. It can store personal identity information to the OpenID Provider from RP. It's exciting specification because we use many services on WWW, and input variety of many personal identity in sites.&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;We can aggregate our personal identity automatically with AX StoreRequest message! Additionally, updated personal identity is synced AX's update_uri property across the all services!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Demo that sent AX StoreRequest message, and dispatch AX StoreResponse message with ruby-openid as follows.&lt;br /&gt;&lt;br /&gt;At first, we need to extend ruby-openid to handle AX StoreRequest and StoreResponse usefully.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;openid_ax_ext.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rubygems&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;openid/extension&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;openid/message&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;OpenID&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;AX&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;StoreRequest&lt;/span&gt;&lt;br /&gt;      &lt;span class="synComment"&gt;# Extract a StoreRequest from an OpenID message&lt;/span&gt;&lt;br /&gt;      &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;self.from_openid_request&lt;/span&gt;(oid_req)&lt;br /&gt;        message = oid_req.message &lt;br /&gt;        ax_args = message.get_args(&lt;span class="synIdentifier"&gt;NS_URI&lt;/span&gt;)&lt;br /&gt;        &lt;span class="synStatement"&gt;return&lt;/span&gt; &lt;span class="synConstant"&gt;nil&lt;/span&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt; ax_args.empty?&lt;br /&gt;        req = new&lt;br /&gt;        req.parse_extension_args(ax_args)&lt;br /&gt;        req&lt;br /&gt;      &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;StoreResponse&lt;/span&gt;&lt;br /&gt;      &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;self.from_success_response&lt;/span&gt;(success_response)&lt;br /&gt;        resp = &lt;span class="synConstant"&gt;nil&lt;/span&gt;&lt;br /&gt;        ax_args = success_response.message.get_args(&lt;span class="synIdentifier"&gt;NS_URI&lt;/span&gt;)&lt;br /&gt;        resp = ax_args.key?(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;error&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;) ? new(&lt;span class="synConstant"&gt;false&lt;/span&gt;, ax_args[&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;error&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;]) : new&lt;br /&gt;      &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;app/controller/consumer_controller.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# in ConsumerController#start&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# AX StoreRequest message&lt;/span&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; params[&lt;span class="synIdentifier"&gt;:use_ax_store&lt;/span&gt;]&lt;br /&gt;  ax_store_req = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreRequest&lt;/span&gt;.new&lt;br /&gt;  ax_store_req.set_values(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;%w(&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto@example.com rakuto@example2.com&lt;/span&gt;&lt;span class="synSpecial"&gt;)&lt;/span&gt;)&lt;br /&gt;  ax_store_req.set_values(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;%w(&lt;/span&gt;&lt;span class="synConstant"&gt;1985-03-12&lt;/span&gt;&lt;span class="synSpecial"&gt;)&lt;/span&gt;)&lt;br /&gt;  ax_store_req.set_values(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/IM/Skype&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;%w(&lt;/span&gt;&lt;span class="synConstant"&gt;rfurutani&lt;/span&gt;&lt;span class="synSpecial"&gt;)&lt;/span&gt;)&lt;br /&gt;  oidreq.add_extension(ax_store_req)&lt;br /&gt;  oidreq.return_to_args[&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;did_ax_store&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;] = &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;y&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, OP handles the request included StoreRequest message.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;app/controller/server_controller.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# in ServerController#start&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Check the AX StoreRequest&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;@ax_store_req&lt;/span&gt; = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreRequest&lt;/span&gt;.from_openid_request(oidreq)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And OP must save personal identity sent from RP.&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Extract Personal Identity from request and save it.&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Check the StoreaRequest for AX&lt;/span&gt;&lt;br /&gt;ax_store_resp = &lt;span class="synConstant"&gt;nil&lt;/span&gt;&lt;br /&gt;ax_store_req = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreRequest&lt;/span&gt;.from_openid_request(oidreq)&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; ax_store_req&lt;br /&gt; &lt;span class="synStatement"&gt;begin&lt;/span&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;# I think all user's attribute should be saved, but table structure of RDBMS VERY statically.&lt;/span&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;# So we need to respond StoreResponse mode is 'store_response_failure'.&lt;/span&gt;&lt;br /&gt;   &lt;span class="synComment"&gt;# In a nut shell, we may use XMLDB by now!&lt;/span&gt;&lt;br /&gt;   ax_store_req.data.each &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;type_uri, values&lt;/span&gt;|&lt;br /&gt;     &lt;span class="synStatement"&gt;case&lt;/span&gt; type_uri&lt;br /&gt;     &lt;span class="synStatement"&gt;when&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;       &lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;XXX&lt;/span&gt;&lt;span class="synComment"&gt;: This is dummy&lt;/span&gt;&lt;br /&gt;       user.emails.concat(values)&lt;br /&gt;     &lt;span class="synStatement"&gt;when&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;       &lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;XXX&lt;/span&gt;&lt;span class="synComment"&gt;: This is dummy&lt;/span&gt;&lt;br /&gt;       user.birth_date = &lt;span class="synIdentifier"&gt;Date&lt;/span&gt;.parse(values.first)&lt;br /&gt;     &lt;span class="synStatement"&gt;when&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/IM/Skype&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;       &lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;XXX&lt;/span&gt;&lt;span class="synComment"&gt;: This is dummy&lt;/span&gt;&lt;br /&gt;       &lt;span class="synComment"&gt;# Just one&lt;/span&gt;&lt;br /&gt;       user.skype_id = values.first&lt;br /&gt;     &lt;span class="synStatement"&gt;else&lt;/span&gt;&lt;br /&gt;       ax_store_resp = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreResponse&lt;/span&gt;.new(&lt;span class="synConstant"&gt;false&lt;/span&gt;, &lt;span class="synSpecial"&gt;"#{type_uri}&lt;/span&gt;&lt;span class="synConstant"&gt; isn't supported Type URI in this service.&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;)&lt;br /&gt;     &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;   &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;   user.save&lt;br /&gt; &lt;span class="synStatement"&gt;rescue&lt;/span&gt; &lt;span class="synIdentifier"&gt;Error&lt;/span&gt; =&amp;gt; e&lt;br /&gt;   ax_store_resp = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreResponse&lt;/span&gt;.new(&lt;span class="synConstant"&gt;false&lt;/span&gt;, e.message)&lt;br /&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;oidresp.add_extension(ax_store_resp || &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreResponse&lt;/span&gt;.new)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is the sample view for AX StoreRequest added the checkbox enable it.&lt;br /&gt;&lt;pre class="eruby"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt; flash[&lt;span class="synIdentifier"&gt;:ax_store_results&lt;/span&gt;] &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;'error'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; flash[&lt;span class="synIdentifier"&gt;:ax_store_results&lt;/span&gt;] &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;elsif&lt;/span&gt; params[&lt;span class="synIdentifier"&gt;:did_ax_store&lt;/span&gt;] -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;'alert'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;     Your Personal identity has saved.&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;verify-form&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;form&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;method&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;get&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;accept&lt;/span&gt;&lt;span class="synIdentifier"&gt;-&lt;/span&gt;&lt;span class="synType"&gt;charset&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;        &lt;/span&gt;&lt;span class="synType"&gt;action&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; url_for &lt;span class="synIdentifier"&gt;:action&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;start&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;Identifier:&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;openid&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;openid_identifier&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;value&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;Verify&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;immediate&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;immediate&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;immediate&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Use immediate mode&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_sreg&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_sreg&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;  &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_sreg&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request registration data&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_pape&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_pape&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_pape&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request phishing-resistent auth policy (PAPE)&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;force_post&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;force_post&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;force_post&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Force the transaction to use POST by adding 2K of extra d&lt;br /&gt;ata&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request registration data with AX&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;checkbox&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax_store&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax_store&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;use_ax_store&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request store attributes with AX&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;form&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Confirmation of stored personal identities.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;app/views/server/decide.rhtml&lt;/span&gt;&lt;br /&gt;&lt;pre class="eruby"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;XXX&lt;/span&gt;&lt;span class="synComment"&gt;: Part of axschema  -%&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;% axschema_map = {&lt;br /&gt;  &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Birthdate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/IM/Skype&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Skype&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;} -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synComment"&gt;# Is StoreRequest included in request? -%&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;% &lt;span class="synStatement"&gt;if&lt;/span&gt; &lt;span class="synIdentifier"&gt;@store_req&lt;/span&gt; -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;attention&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;p&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;And do you accept following data sent from RP?&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;p&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;dl&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synIdentifier"&gt;@store_req&lt;/span&gt;.data.each &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;k,v&lt;/span&gt;| -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;dt&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; axschema_map[k] -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;:&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;dt&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;dd&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; h v.join(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;, &lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;) -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;dd&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;dl&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; -&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally,  request is coming back to RP, so We need to handle success response.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;app/controllers/consumer_controller.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# in ConsumerController#complete&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# for AX store&lt;/span&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; params[&lt;span class="synIdentifier"&gt;:did_ax_store&lt;/span&gt;]&lt;br /&gt;ax_store_resp = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;StoreResponse&lt;/span&gt;.from_success_response(oidresp)&lt;br /&gt;flash[&lt;span class="synIdentifier"&gt;:ax_store_results&lt;/span&gt;] = ax_store_resp.error_message &lt;span class="synStatement"&gt;unless&lt;/span&gt; ax_store_resp.succeeded?&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Screenshot&lt;/span&gt;&lt;br /&gt;These screenshot are capture output of above code.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_h3yjP15uxZ4/R-aEklmsLqI/AAAAAAAAAEs/QFwxzEsujpU/s1600-h/Rails+OpenID+Example+Relying+Party.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_h3yjP15uxZ4/R-aEklmsLqI/AAAAAAAAAEs/QFwxzEsujpU/s400/Rails+OpenID+Example+Relying+Party.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5180974185440882338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Confirmation of stored personal identities.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_h3yjP15uxZ4/R-aFyVmsLrI/AAAAAAAAAE0/BjuJ1I86WXE/s1600-h/OpenID+Server+Example.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_h3yjP15uxZ4/R-aFyVmsLrI/AAAAAAAAAE0/BjuJ1I86WXE/s400/OpenID+Server+Example.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5180975521175711410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;This future is pretty interesting, but it isn't suppoted even myOpenID now.  In the future, I think many OP supports AX StoreRequest. I wish!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-5479929245798306765?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5479929245798306765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5479929245798306765'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/03/ruby-why-does-storerequest-of-openid.html' title='[ruby] Why does StoreRequest of OpenID Attribute Exchange (AX) attract our heart? (and DEMO of AX StoreRequest with ruby-openid)'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_h3yjP15uxZ4/R-aEklmsLqI/AAAAAAAAAEs/QFwxzEsujpU/s72-c/Rails+OpenID+Example+Relying+Party.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-7069639633762075100</id><published>2008-03-22T14:16:00.011+09:00</published><updated>2008-04-14T22:54:02.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><title type='text'>[ruby] myOpenID and OpenID Attributes Exchange, myOpenID isn't supported Type URI described  in http://axschema.org/</title><content type='html'>JanRain's myOpenID is popular OpenID provider, supports SSL, SREG, some persona, authentication with Information Card, OpenID Attributes Exchange (but only some attributes), Pavatar and so on. JanRain also offers &lt;a href="http://openidenabled.com/ruby-openid/"&gt;ruby-openid&lt;/a&gt; that implements OpenID 2.0 with Ruby.&lt;br /&gt;&lt;br /&gt;myOpenID supports only some attributes that can be exchange with OpenID Attribute Exchange, but you should care about Type URI, because myOpenID doesn't support Type URI described on "http://www.axschema.org/types/". &lt;span style="font-weight:bold;"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;You should specify Type URI with "http://schema.openid.net/" instead.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sample code that fetch some attributes from myOpenID is as follows. At first, you need to initialize your persona. My persona for work is "&lt;a href="http://rakuto.myopenid.com/"&gt;Rakuto Furutani&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ConsumerController#start in /path/to/rails_openid/app/controller/consumer_controller.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# AX&lt;/span&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; params[&lt;span class="synIdentifier"&gt;:use_ax&lt;/span&gt;]&lt;br /&gt;&lt;span class="synComment"&gt;# Builds Fetch Request of Attributes Exchange&lt;/span&gt;&lt;br /&gt;ax_req     = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FetchRequest&lt;/span&gt;.new&lt;br /&gt;requested_attrs = [ [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/namePerson&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;name&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;true&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/namePerson/friendly&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;nickname&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;true&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/web/default&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;web_default&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/postalCode/home&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;postal_code&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/person/gender&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;gender&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/country/home&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;country&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;],&lt;br /&gt;                   [&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/pref/language&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;language&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;]]&lt;br /&gt;&lt;br /&gt;requested_attrs.each {|&lt;span class="synIdentifier"&gt;a&lt;/span&gt;| ax_req.add(&lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AttrInfo&lt;/span&gt;.new(a[&lt;span class="synConstant"&gt;0&lt;/span&gt;], a[&lt;span class="synConstant"&gt;1&lt;/span&gt;], a[&lt;span class="synConstant"&gt;2&lt;/span&gt;] || &lt;span class="synConstant"&gt;false&lt;/span&gt;))}&lt;br /&gt;oidreq.add_extension(ax_req)&lt;br /&gt;oidreq.return_to_args[&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;did_ax&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;] = &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;y&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;pp oidreq&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Customize a view&lt;/span&gt;&lt;br /&gt;/path/to/rails_openid/app/views/consumer/index.rhtml&lt;br /&gt;&lt;pre class="eruby"&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt; flash[&lt;span class="synIdentifier"&gt;:ax_results&lt;/span&gt;]&lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;'alert'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; flash[&lt;span class="synIdentifier"&gt;:ax_results&lt;/span&gt;] &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synSpecial"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="synStatement"&gt;end&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"verify-form"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;form&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;method&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"get"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;accept&lt;/span&gt;&lt;span class="synIdentifier"&gt;-&lt;/span&gt;&lt;span class="synType"&gt;charset&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"UTF-8"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;        &lt;/span&gt;&lt;span class="synType"&gt;action&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synSpecial"&gt;&amp;lt;%=&lt;/span&gt; url_for &lt;span class="synIdentifier"&gt;:action&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;start&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synSpecial"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt; Identifier:&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"text"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;class&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"openid"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"openid_identifier"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"submit"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;value&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"Verify"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"checkbox"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"immediate"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"immediate"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"immediate"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Use immediate mode&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"checkbox"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_sreg"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_sreg"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_sreg"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request registration data&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"checkbox"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_pape"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_pape"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_pape"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request phishing-resistent auth policy (PAPE)&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"checkbox"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"force_post"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"force_post"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"force_post"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Force the transaction to use POST by adding 2K of extra data&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;br&lt;/span&gt;&lt;span class="synIdentifier"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;input&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;type&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"checkbox"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;name&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_ax"&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;id&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_ax"&lt;/span&gt;&lt;span class="synIdentifier"&gt; /&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;for&lt;/span&gt;&lt;span class="synIdentifier"&gt;=&lt;/span&gt;&lt;span class="synConstant"&gt;"use_ax"&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;Request registration data with AX (Attribute Exchange)&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;label&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;form&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synStatement"&gt;div&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;ConsumerController#complete in /path/to/rails_openid/app/controllers/consumer_controller.rb&lt;/span&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synStatement"&gt;if&lt;/span&gt; params[&lt;span class="synIdentifier"&gt;:did_ax&lt;/span&gt;]&lt;br /&gt;  ax_resp = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FetchResponse&lt;/span&gt;.from_success_response(oidresp)&lt;br /&gt;  pp ax_resp&lt;br /&gt;&lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Screenshot&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_h3yjP15uxZ4/R-SWRlmsLpI/AAAAAAAAAEY/b4_mCN7y05M/s1600-h/Rails+OpenID+Example+Relying+Party.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_h3yjP15uxZ4/R-SWRlmsLpI/AAAAAAAAAEY/b4_mCN7y05M/s400/Rails+OpenID+Example+Relying+Party.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5180430700279246482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We can fetch some attribtues from myOpenID, above code's output is as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OpenID::Consumer::CheckIDRequest instance&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::Consumer::CheckIDRequest:0x33543fc&lt;/span&gt;&lt;br /&gt;@anonymous=false,&lt;br /&gt;@assoc=&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::Association:0x3354500&lt;/span&gt;&lt;br /&gt;@assoc_type=&lt;span class="synConstant"&gt;"HMAC-SHA1"&lt;/span&gt;,&lt;br /&gt;@handle=&lt;span class="synConstant"&gt;"{HMAC-SHA1}{47dd30ef}{WTRsAg==}"&lt;/span&gt;,&lt;br /&gt;@issued=Sun Mar 16 14:38:35 +0000 2008,&lt;br /&gt;@lifetime=1209600,&lt;br /&gt;@secret=&lt;span class="synConstant"&gt;"\005F6\246W\032\220\233]\002V$j\034ï¿½ï¿½jï¿½!1"&lt;/span&gt;&amp;gt;,&lt;br /&gt;@endpoint=&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::OpenIDServiceEndpoint:0x33602b0&lt;/span&gt;&lt;br /&gt;@canonical_id=nil,&lt;br /&gt;@claimed_id=&lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;@display_identifier=nil,&lt;br /&gt;@local_id=&lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;@server_url=&lt;span class="synConstant"&gt;"http://www.myopenid.com/server"&lt;/span&gt;,&lt;br /&gt;@type_uris=&lt;br /&gt; [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0/signon"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://openid.net/sreg/1.0"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://openid.net/extensions/sreg/1.1"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://schemas.openid.net/pape/policies/2007/06/phishing-resistant"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;],&lt;br /&gt;@used_yadis=true&amp;gt;,&lt;br /&gt;@message=&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::Message:0x3354334&lt;/span&gt;&lt;br /&gt;@args=&lt;br /&gt; {[&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.gender"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/person/gender"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"if_available"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"country,web_default,language,birthDate,postal_code,nickname,gender"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.language"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/pref/language"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.postal_code"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/postalCode/home"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"mode"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"fetch_request"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.birthDate"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/birthDate"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.country"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/country/home"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.nickname"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/namePerson/friendly"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.name"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/namePerson"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"required"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"name,email"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.web_default"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/web/default"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.email"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/email"&lt;/span&gt;},&lt;br /&gt;@namespaces=&lt;br /&gt; &lt;span class="synComment"&gt;#&amp;lt;OpenID::NamespaceMap:0x33542d0&lt;/span&gt;&lt;br /&gt;  @alias_to_namespace=&lt;br /&gt;   {&lt;span class="synConstant"&gt;"ax"&lt;/span&gt;=&amp;gt;&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;,&lt;br /&gt;    :null_namespace=&amp;gt;&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;},&lt;br /&gt;  @namespace_to_alias=&lt;br /&gt;   {&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;=&amp;gt;:null_namespace,&lt;br /&gt;    &lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;=&amp;gt;&lt;span class="synConstant"&gt;"ax"&lt;/span&gt;}&amp;gt;,&lt;br /&gt;@openid_ns_uri=&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;&amp;gt;,&lt;br /&gt;@return_to_args={&lt;span class="synConstant"&gt;"did_ax"&lt;/span&gt;=&amp;gt;&lt;span class="synConstant"&gt;"y"&lt;/span&gt;}&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;OpenID::Consumer::SuccessResponse instance&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::Consumer::SuccessResponse:0x32800c0&lt;/span&gt;&lt;br /&gt;@endpoint=&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::OpenIDServiceEndpoint:0x32bea28&lt;/span&gt;&lt;br /&gt;@canonical_id=nil,&lt;br /&gt;@claimed_id=&lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;@display_identifier=nil,&lt;br /&gt;@local_id=&lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;@server_url=&lt;span class="synConstant"&gt;"http://www.myopenid.com/server"&lt;/span&gt;,&lt;br /&gt;@type_uris=&lt;br /&gt; [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0/signon"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://openid.net/sreg/1.0"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://openid.net/extensions/sreg/1.1"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;"http://schemas.openid.net/pape/policies/2007/06/phishing-resistant"&lt;/span&gt;,&lt;br /&gt;  &lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;&lt;/span&gt;],&lt;br /&gt;@used_yadis=true&amp;gt;,&lt;br /&gt;@identity_url=&lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;@message=&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::Message:0x3296f78&lt;/span&gt;&lt;br /&gt;@args=&lt;br /&gt; {[&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.gender"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/person/gender"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"sig"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"5aziAIn3yMlbxq8XFaF8hKG4GCk="&lt;/span&gt;,&lt;br /&gt;  [:bare_namespace, &lt;span class="synConstant"&gt;"did_ax"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"y"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.language"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/pref/language"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.gender"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"mode"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"id_res"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"mode"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"fetch_response"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.postal_code"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/postalCode/home"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.gender.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"M"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"op_endpoint"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://www.myopenid.com/server"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"response_nonce"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"2008-03-22T04:51:54ZT0280h"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.birthDate"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/birthDate"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.name.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"Rakuto Furutani"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.postal_code"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"0"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.nickname.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"rakuto"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.country"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/country/home"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.name"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.web_default"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.nickname"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/namePerson/friendly"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"return_to"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://localhost:3001/consumer/complete?did_ax=y"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"assoc_handle"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"{HMAC-SHA1}{47dd30ef}{WTRsAg==}"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.email"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"0"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.name"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/namePerson"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.nickname"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.country"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"identity"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"signed"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"assoc_handle,ax.count.birthDate,ax.count.country,ax.count.email,ax.count.gender,ax.count.language,ax.count.name,ax.count.nickname,ax.count.postal_code,ax.count.web_default,ax.mode,ax.type.birthDate,ax.type.country,ax.type.email,ax.type.gender,ax.type.language,ax.type.name,ax.type.nickname,ax.type.postal_code,ax.type.web_default,ax.value.birthDate.1,ax.value.country.1,ax.value.gender.1,ax.value.language.1,ax.value.name.1,ax.value.nickname.1,ax.value.web_default.1,claimed_id,identity,mode,ns,ns.ax,op_endpoint,response_nonce,return_to,signed"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.language"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.language.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"JA"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.web_default.1"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://raku.to/"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.birthDate.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1985-03-12"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.web_default"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/web/default"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"type.email"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://schema.openid.net/contact/email"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"value.country.1"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"JP"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"claimed_id"&lt;/span&gt;]=&amp;gt;&lt;br /&gt;   &lt;span class="synConstant"&gt;"http://rakuto.myopenid.com/"&lt;/span&gt;,&lt;br /&gt;  [&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;, &lt;span class="synConstant"&gt;"count.birthDate"&lt;/span&gt;]=&amp;gt;&lt;span class="synConstant"&gt;"1"&lt;/span&gt;},&lt;br /&gt;@namespaces=&lt;br /&gt; &lt;span class="synComment"&gt;#&amp;lt;OpenID::NamespaceMap:0x329680c&lt;/span&gt;&lt;br /&gt;  @alias_to_namespace=&lt;br /&gt;   {&lt;span class="synConstant"&gt;"ax"&lt;/span&gt;=&amp;gt;&lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;,&lt;br /&gt;    :null_namespace=&amp;gt;&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;},&lt;br /&gt;  @namespace_to_alias=&lt;br /&gt;   {&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;=&amp;gt;:null_namespace,&lt;br /&gt;    &lt;span class="synConstant"&gt;"http://openid.net/srv/ax/1.0"&lt;/span&gt;=&amp;gt;&lt;span class="synConstant"&gt;"ax"&lt;/span&gt;}&amp;gt;,&lt;br /&gt;@openid_ns_uri=&lt;span class="synConstant"&gt;"http://specs.openid.net/auth/2.0"&lt;/span&gt;&amp;gt;,&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;@signed_fields=&lt;br /&gt;[&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.assoc_handle"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.birthDate"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.country"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.email"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.gender"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.language"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.name"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.nickname"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.postal_code"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.count.web_default"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.mode"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.birthDate"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.country"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.email"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.gender"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.language"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.name"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.nickname"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.postal_code"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.type.web_default"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.birthDate.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.country.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.gender.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.language.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.name.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.nickname.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ax.value.web_default.1"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.claimed_id"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.identity"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.mode"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ns"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.ns.ax"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.op_endpoint"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.response_nonce"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.return_to"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;,&lt;br /&gt;&lt;/span&gt;&lt;span class="synConstant"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;"openid.signed"&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;]&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Extracted attributes from response - OpenID::AX::FetchResponse instance&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::AX::FetchResponse:0x3254a4c&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;@data&lt;/span&gt;=&lt;br /&gt;{&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/namePerson&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;Rakuto Furutani&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/country/home&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;JP&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/web/default&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://raku.to/&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/pref/language&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;JA&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;1985-03-12&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/contact/postalCode/home&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/namePerson/friendly&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;],&lt;br /&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://schema.openid.net/person/gender&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;=&amp;gt;[&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;M&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;]},&lt;br /&gt;&lt;span class="synIdentifier"&gt;@mode&lt;/span&gt;=&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;fetch_response&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;,&lt;br /&gt;&lt;span class="synIdentifier"&gt;@ns_alias&lt;/span&gt;=&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;ax&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;,&lt;br /&gt;&lt;span class="synIdentifier"&gt;@ns_uri&lt;/span&gt;=&lt;span class="synSpecial"&gt;"&lt;/span&gt;&lt;span class="synConstant"&gt;http://openid.net/srv/ax/1.0&lt;/span&gt;&lt;span class="synSpecial"&gt;"&lt;/span&gt;,&lt;br /&gt;&lt;span class="synIdentifier"&gt;@update_url&lt;/span&gt;=&lt;span class="synConstant"&gt;nil&lt;/span&gt;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion about myOpenID&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Supports only some attributes that can be exchanged with AX.&lt;/li&gt;&lt;li&gt;Doesn't support openid.ax.update_url yet.&lt;/li&gt;&lt;li&gt;Doesn't support Type URI described in &lt;a href="http://www.axschema.org/types/"&gt;axschema&lt;/a&gt;, you should specify Type URI with "http://schema.openid.net/"  namespace.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-7069639633762075100?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7069639633762075100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/7069639633762075100'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/03/ruby-fetch-some-attributes-from.html' title='[ruby] myOpenID and OpenID Attributes Exchange, myOpenID isn&apos;t supported Type URI described  in http://axschema.org/'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h3yjP15uxZ4/R-SWRlmsLpI/AAAAAAAAAEY/b4_mCN7y05M/s72-c/Rails+OpenID+Example+Relying+Party.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2141331303373287613</id><published>2008-03-17T17:02:00.007+09:00</published><updated>2008-03-25T12:08:03.208+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>[ruby] released jrails_auto_complete</title><content type='html'>Programming using jQuery is more fun than protoype.js, but Ruby on Rails depend on Prototype.js and script.aculo.us strongly. jRails is solution that use jQuery on RoR platform but jRails doesn't have some plugins, auto_complete, in_place_editor and so on. So I release jrails_auto_complete rails plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;INSTALL&lt;/span&gt; &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;% cd /path/to/rails_app&lt;br /&gt;% ./script/plugin install http://svn.raku.to/throwaway/jrails_auto_complete/&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;USAGE&lt;/span&gt;&lt;br /&gt;Basically, usage of jrails_auto_complete is same as &lt;a href="http://svn.rubyonrails.org/rails/plugins/auto_complete/"&gt;auto_complete&lt;/a&gt; plugin. But some options isn't supported yet. For details, see jrails_auto_complete/lib/auto_complete_macro_helper.rb.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DEPENDENCIES&lt;/span&gt;&lt;br /&gt;This programm is depended on jrails. First, you need to install &lt;a href="http://ennerchi.com/"&gt;jrails&lt;/a&gt; plugin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;NOTE&lt;/span&gt;&lt;br /&gt;I can't test it enough. If you found the bugs, let me know.&lt;br /&gt;Thanks&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-2141331303373287613?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2141331303373287613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/2141331303373287613'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/03/ruby-jrailsautocomplete-is-rails-plugin.html' title='[ruby] released jrails_auto_complete'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-5048411273649076074</id><published>2008-03-17T00:27:00.013+09:00</published><updated>2008-04-14T22:54:02.653+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenID'/><title type='text'>[ruby] Fetch and Store some attributes with OpenID Attributes Exchange 1.0</title><content type='html'>We have many profiles about ourselves in web applications, communities, organization, and so on. My profile in mixi and my profile in  Facebook are different, my Blogger's profile and my HP's profile are different too. This problem more and more annoy us.&lt;br /&gt;&lt;a href="http://openid.net/specs/openid-attribute-exchange-1_0-08.html"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OpenID Atrributes Exchange 1.0&lt;/span&gt;&lt;/a&gt; is an OpenID service extension for exchanging identity information between endpoint(Relying Party and OpenID Provider). We can think some scenarios. For example, we want to disclose about name to all services, but we think want to only disclose email or credit card number to the specified service.&lt;br /&gt;&lt;br /&gt;As you know, OpenID has protocol for light-weight profile exchange. This protocols is known as &lt;a href="http://openid.net/specs/openid-simple-registration-extension-1_1-01.html"&gt;OpenID Simple Registration Extension 1.1&lt;/a&gt; (SREG), but SREG is obsolete now. The downside of SREG is that it only supported limited number of attributes. You should use OpenID Attributes Exchange for exchanging identity.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What can we do with OpenID Attribute Exchange?&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fetch some values -- (use fetch_request)&lt;/li&gt;&lt;li&gt;Store some values -- (use store_request)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What kind of attributes do we use with OpenID Attribute Exchange?&lt;/span&gt;&lt;br /&gt;You can see exchanging identity in &lt;a href="http://www.axschema.org/types/"&gt;OpenID Attribute Exchange | Attribute Type&lt;/a&gt;. If the parameter you want doesn't exist, then you define new parameter. For details, see &lt;a href="http://www.axschema.org/#new-attribute"&gt;How do I define new attributes?&lt;/a&gt;. The attributes specified with Type URI unlike SREG.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;a href="http://axschema.org/namePerson/friendly/"&gt;http://axschema.org/namePerson/friendly &lt;/a&gt;=&gt; Alias/Username&lt;br /&gt;&lt;a href="http://axschema.org/contact/email/"&gt;http://axschema.org/contact/email&lt;/a&gt; =&gt; Email&lt;br /&gt;&lt;a href="http://axschema.org/contact/IM/Skype/"&gt;http://axschema.org/contact/IM/Skype &lt;/a&gt;=&gt; Skype IM&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Sample code with Attribute Exchange implementaion with ruby-openid as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;requirements:&lt;/span&gt;&lt;br /&gt;ruby-openid 2.0.4&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The side of Relying Party&lt;/span&gt;&lt;br /&gt;This example requires "nickname", "email" are required and "birth_date" and "phone" is obtained if available it. The code is beggining of OpenID Authentication. (ConsumerController#begin etc)&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# NOTE: in your controller that start login with OpenID Authentication&lt;/span&gt;&lt;br /&gt;consumer = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Consumer&lt;/span&gt;.new(session, store)&lt;br /&gt;oid_req = consumer.begin(params[&lt;span class="synIdentifier"&gt;:openid_identifier&lt;/span&gt;])&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# An attribute exchange 'fetch_request' message&lt;/span&gt;&lt;br /&gt;ax_req = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FetchRequest&lt;/span&gt;.new&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# OpenID::AX::AttrInfo.new(type_uri, extension_alias=nil, required=nil)&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Specify required attributes with Attribute Exchange&lt;/span&gt;&lt;br /&gt;attr_nickname   = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AttrInfo&lt;/span&gt;.new(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/namePerson/friendly&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;nick&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;true&lt;/span&gt;)&lt;br /&gt;attr_email      = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AttrInfo&lt;/span&gt;.new(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;true&lt;/span&gt;)&lt;br /&gt;attr_birth_date = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AttrInfo&lt;/span&gt;.new(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;birth_date&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;false&lt;/span&gt;)&lt;br /&gt;attr_phone      = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AttrInfo&lt;/span&gt;.new(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/phone/default&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;phone&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synConstant"&gt;false&lt;/span&gt;)&lt;br /&gt;[attr_nickname, attr_email, attr_birth_date, attr_phone].each {|&lt;span class="synIdentifier"&gt;a&lt;/span&gt;| ax_req.add(a)}&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# add extension with Attribute Exchange object&lt;/span&gt;&lt;br /&gt;oid_req.add_extension(ax_req)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The side of OpenID Provider&lt;/span&gt;&lt;br /&gt;You can extract extension fields from request with OpenID::AX::FetchRequest.from_openid_request method, and add some values with OpenID::AX::FetchResponse#parse_extension_args method. You can specify values with array. (value.ALIAS_NAME.1, value.ALIAS_NAME.2 etc).&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;oid_resp =  oid.answer(&lt;span class="synConstant"&gt;true&lt;/span&gt;, &lt;span class="synConstant"&gt;nil&lt;/span&gt;, identity)&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# XXX: In a real application, these attributes are user-specific&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# and the use should be asked for permission to release these attributes&lt;/span&gt;&lt;br /&gt;ax_req = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FetchRequest&lt;/span&gt;.from_openid_request(oidreq)&lt;br /&gt;ax_args = { &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;mode&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;             =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;fetch_response&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;update_url&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;       =&amp;gt; url_for(&lt;span class="synIdentifier"&gt;:controller&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;user&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:action&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;update&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;1&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;),&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;type.nick&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;        =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/namePerson/friendly&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;value.nick&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;       =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;type.email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;       =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/contact/email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;value.email.1&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;    =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto@nospam.gmail.com&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;.sub(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;nospam.&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;''&lt;/span&gt;),&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;value.email.2&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;    =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto@example.com&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;type.birth_date&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;  =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://axschema.org/birthDate&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;value.birth_date&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;1985-03-12&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;       &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;count.email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;      =&amp;gt; &lt;span class="synConstant"&gt;2&lt;/span&gt;}&lt;br /&gt;ax_resp = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;AX&lt;/span&gt;::&lt;span class="synIdentifier"&gt;FetchResponse&lt;/span&gt;.new&lt;br /&gt;ax_resp.parse_extension_args(ax_args)&lt;br /&gt;ax_args = ax_resp.get_extension_args(ax_req) &lt;span class="synComment"&gt;# for validation&lt;/span&gt;&lt;br /&gt;ax_resp.parse_extension_args(ax_args)&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# pp ax_resp.get_extension_args(ax_req)&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# {"count.email"=&amp;gt;"2",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "type.email"=&amp;gt;"http://axschema.org/contact/email",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "value.email.1"=&amp;gt;"rakuto@gmail.com",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "count.birth_date"=&amp;gt;"1",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "count.nick"=&amp;gt;"1",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "value.email.2"=&amp;gt;"rakuto@example.com",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "value.birth_date.1"=&amp;gt;"1985-03-12",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "mode"=&amp;gt;"fetch_response",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "type.nick"=&amp;gt;"http://axschema.org/namePerson/friendly",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "type.birth_date"=&amp;gt;"http://axschema.org/birthDate",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "value.nick.1"=&amp;gt;"rakuto",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "update_url"=&amp;gt;"http://localhost:3000/user/update/1",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "type.phone"=&amp;gt;"http://axschema.org/contact/phone/default",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  "count.phone"=&amp;gt;"0"}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;oid_resp.add_extension(ax_res)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The side of Relying Party&lt;/span&gt;&lt;br /&gt;Last come, the request returned to Relying Party. This code is part of end of OpenID authentication. (ConsumerController#complete etc)&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;consumer = &lt;span class="synIdentifier"&gt;OpenID&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Consumer&lt;/span&gt;.new(session, store)&lt;br /&gt;current_url = url_for(&lt;span class="synIdentifier"&gt;:action&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;complete&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:only_path&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;false&lt;/span&gt;)&lt;br /&gt;parameters = params.reject{|&lt;span class="synIdentifier"&gt;k,v&lt;/span&gt;|request.path_parameters[k]}&lt;br /&gt;oid_resp = consumer.complete(parameters, current_url)&lt;br /&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Dump the exchanged attributes&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# pp OpenID::AX::FetchResponse.from_success_response(oid_resp)&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&amp;lt;OpenID::AX::FetchResponse:0x33527a0&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  @data=&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  {"http://axschema.org/contact/email"=&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#    ["rakuto@gmail.com", "rakuto@examhttp://www.blogger.com/img/gl.link.gifple.com"],&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#   "http://axschema.org/birthDate"=&amp;gt;["1985-03-12"],&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#   "http://axschema.org/namePerson/friendly"=&amp;gt;["rakuto"]},&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  @mode="fetch_response",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  @ns_alias="ax",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  @ns_uri="http://openid.net/srv/ax/1.0",&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  @update_url="http://localhost:3000/user/update/1"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://openid.net/specs/openid-attribute-exchange-1_0-08.html#OpenID.axschema"&gt;OpenID Attributes Exchange&lt;/a&gt; is simple, but pretty interesting. Next time, I'm going to introduce "store_request" mode for storing value if value dont't exists.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20344598-5048411273649076074?l=rakuto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5048411273649076074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20344598/posts/default/5048411273649076074'/><link rel='alternate' type='text/html' href='http://rakuto.blogspot.com/2008/03/ruby-fetch-and-store-some-attributes.html' title='[ruby] Fetch and Store some attributes with OpenID Attributes Exchange 1.0'/><author><name>rakuto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_h3yjP15uxZ4/SduAKT3hUbI/AAAAAAAAAdw/HguH5V7Aq-M/S220/P9200039.JPG'/></author></entry><entry><id>tag:blogger.com,1999:blog-20344598.post-2270171679921363084</id><published>2008-03-15T23:25:00.005+09:00</published><updated>2008-03-25T12:08:03.209+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>[ruby] mixi2foaf.rb generates FOAF with friends network in mixi.</title><content type='html'>&lt;a href="http://mixi.jp/"&gt;mixi&lt;/a&gt; is the biggest social network site in Japan. There are more users than ten million. Many people have friends networks in mixi, and mixi announced about respond OpenID and OpenSocial API, but they are very slow!! I heard that mixi is going to release OpenID API about Sep. It's too late compared to Facebook.&lt;br /&gt;&lt;br /&gt; The Friend of a Friend(FOAF) is creating a Web of machine-readable pages describing people, the links between them and the things they create and do. I have created program to extract the friend links from mixi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usage:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;% svn co http://svn.raku.to/throwaway/mixi2foaf.rb&lt;br /&gt;% ruby mixi2foaf.rb &lt;span style="font-style:italic;"&gt;email&lt;/span&gt; &lt;span style="font-style:italic;"&gt;password&lt;/span&gt; &amp;gt; foaf.rdf&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;NOTE: Customize your profile&lt;/span&gt;&lt;br /&gt;You need to customize profile about yourself, for details see mixi2foaf.rb.&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# &lt;/span&gt;&lt;span class="synTodo"&gt;FIXME&lt;/span&gt;&lt;span class="synComment"&gt;: Edit your profile&lt;/span&gt;&lt;br /&gt;  mixi.me = &lt;span class="synIdentifier"&gt;FOAF&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Person&lt;/span&gt;.new({&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:rdf_id&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:name&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Rakuto Furutani&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:nick&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:openid&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;=rakuto&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:mbox_sha1sum&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto@nospam.gmail.com&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;.sub(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;nospam.&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;''&lt;/span&gt;),&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:jabberID&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rakuto@nospam.gmail.com&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;.sub(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;nospam.&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;, &lt;span class="synSpecial"&gt;''&lt;/span&gt;),&lt;br /&gt;    &lt;span class="synIdentifier"&gt;:msnChatID&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;Strawberry_au_rait@hotmail.com&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;  })&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Example:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;% ruby mixi2foaf.rb rakuto@gmail.com ********* &amp;gt; foaf.rdf&lt;br /&gt;[Traverse] http://mixi.jp/show_friend.pl?id=4588051&lt;br /&gt;[Traverse] http://mixi.jp/show_friend.pl?id=3805395&lt;br /&gt;...&lt;br /&gt;%&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;foaf.rdf&lt;/span&gt;&lt;br /&gt;&lt;pre class="xml" style="height:600px"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="synType"&gt;xml version&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="synType"&gt; encoding&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class="synComment"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;rdf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;RDF &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;wot&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://xmlns.com/wot/0.1/&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;rdf&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;foaf&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://xmlns.com/foaf/0.1/&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;lang&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xml&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;lang&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;dc&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://purl.org/dc/elements/1.1/&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;rdfs&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://www.w3.org/2000/01/rdf-schema#&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;dcterms&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://purl.org/dc/terms/&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt; &lt;/span&gt;&lt;span class="synType"&gt;xmlns&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;http://www.w3.org/foaf/0.1/&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Person &lt;/span&gt;&lt;span class="synType"&gt;rdf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synType"&gt;ID&lt;/span&gt;=&lt;span class="synConstant"&gt;&amp;quot;rakuto&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;nick&amp;gt;&lt;/span&gt;rakuto&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;nick&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;jabberID&amp;gt;&lt;/span&gt;rakuto@gmail.com&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;jabberID&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;mbox_sha1sum&amp;gt;&lt;/span&gt;bf8892066afd2ea3eef4f3c1fd834eed96ba1c39&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;mbox_sha1sum&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;openid&amp;gt;&lt;/span&gt;=rakuto&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;openid&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;msnChatID&amp;gt;&lt;/span&gt;Strawberry_au_rait@hotmail.com&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;msnChatID&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;rdf_id&amp;gt;&lt;/span&gt;rakuto&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;rdf_id&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;foaf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/80/51/4588051_99567334.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12376&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/53/95/3805395_1723386446.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12376&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23398&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12355&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/40/38/3064038_2463714862.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12355&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12454&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12466&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12512&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;genki&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/5/69/2560569_1803584202.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;genki&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#19990&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30000&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35895&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#21306&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12410&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/65/15/2276515_15823768.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12410&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12454&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#28363&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36032&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#19978&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37089&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12414&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12419&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/12/57/2231257_4177973050.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12414&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12419&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12510&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12460&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12466&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12512&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20853&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24235&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23019&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36335&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12403&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12367&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/74/81/2227481_2218119710.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12403&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12367&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12454&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12524&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12499&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#32654&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12539&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12480&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12456&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27743&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24029&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#21306&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12405&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/12/13/2221213_1175337526.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12405&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12387&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12385&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12524&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12499&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12383&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12397&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/27/88/2112788_3718693077.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12383&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12397&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/54/23/2025423_3963467882.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/17/46/2001746_3424328848.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12454&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12392&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12375&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12355&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/5/38/1410538_2487809269.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12392&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12375&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12355&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23398&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12510&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12460&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12462&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12515&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#28363&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36032&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12394&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#9734&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12444&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;+.&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/96/1/1339601_3143320574.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12394&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#9734&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12444&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;+.&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12354&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12451&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt; ? &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12453&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt; &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27096&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/37/71/883771_3362183383.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12354&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12451&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt; ? &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12453&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt; &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27096&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#32654&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12539&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12480&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12456&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12407&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://img.mixi.jp/img/basic/common/noimage_member180.gif&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12407&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12426&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;cuzic&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/66/22/516622_1304637750.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;cuzic&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23398&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12486&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12524&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12499&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#22823&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38442&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#22823&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38442&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12490&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12288&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12458&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12465&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/43/66/344366_692701929.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12490&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12288&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12458&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12465&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12454&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12466&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12512&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38263&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23822&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20304&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#19990&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20445&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;ankoparty&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/29/2/292902_3069630518.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;ankoparty&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#22524&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29577&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;hiroko&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/73/65/47365_319217593.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;hiroko&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35251&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25126&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#28363&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36032&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#22823&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27941&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12416&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/33/41/3341_118115164.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12356&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12416&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12506&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#65312&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/32/37/3237_54519266.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#65312&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#28363&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36032&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26647&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12354&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12420&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/22/88/2288_1047374038.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12354&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12420&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#39321&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24029&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12363&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12364&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12431&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12392&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/7/44/744_785912264.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12392&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12502&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12405&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12415&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/5/2/502_1466901064.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12402&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12391&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12405&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12415&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12473&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12509&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12484&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#32676&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#39340&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26704&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29983&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12371&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12400&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12370&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/4/74/474_3993761079.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12371&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12400&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12370&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12510&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12460&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#21281&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24535&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://img.mixi.jp/img/basic/common/noimage_member180.gif&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#21281&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24535&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26053&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#34892&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#22823&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38442&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24220&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30000&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/1/12/112_3714846406.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12422&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12365&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30011&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12362&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37202&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#35501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26360&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12510&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12460&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12452&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12479&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12493&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26481&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#20140&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37117&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27743&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#25144&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24029&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#21306&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12425&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12383&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;img&amp;gt;&lt;/span&gt;http://member.img.mixi.jp/photo/member/0/6/6_814100255.jpg&lt;span class="synIdentifier"&gt;&amp;lt;/img&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;nick&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12358&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12425&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12383&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12373&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12435&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/nick&amp;gt;&lt;/span&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;topic_interest&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#38899&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#27005&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#37969&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#36062&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12459&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12521&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12458&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12465&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12539&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12496&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12489&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#26009&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#29702&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12523&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12513&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12464&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12501&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12449&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12483&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12471&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12519&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12450&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12540&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12488&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;,  &lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12510&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12531&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#12460&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/topic_interest&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="synIdentifier"&gt;&amp;lt;based_near&amp;gt;&lt;/span&gt;&lt;span class="synType"&gt;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23500&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#23665&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#30476&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#28369&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24029&lt;/span&gt;&lt;span class="synType"&gt;;&amp;amp;&lt;/span&gt;&lt;span class="synStatement"&gt;#24066&lt;/span&gt;&lt;span class="synType"&gt;;&lt;/span&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/based_near&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;br /&gt;  &lt;span class="synIdentifier"&gt;&amp;lt;/knows&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="synSpecial"&gt;rdf&lt;/span&gt;&lt;span class="synComment"&gt;:&lt;/span&gt;&lt;span class="synIdentifier"&gt;RDF&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="ruby" style="height:600px"&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Generate FOAF (Friend Of A Friend) from mixi &amp;lt;http://mixi.jp/&amp;gt;.&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# mixi is the biggest social network site in Japan.&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# == FOAF&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#  FOAF Vocabulary Specification 0.91 &amp;lt;http://xmlns.com/foaf/spec/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;# Author: Rakuto Furutani &amp;lt;http://raku.to/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="synComment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rubygems&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;mechanize&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;active_support&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synComment"&gt;# For builder.rb&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;uri&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;logger&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;iconv&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;cgi&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;require&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;digest/sha1&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;$KCODE&lt;/span&gt; = &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;u&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span class="synIdentifier"&gt;$logger&lt;/span&gt; = &lt;span class="synIdentifier"&gt;Logger&lt;/span&gt;.new(&lt;span class="synIdentifier"&gt;STDERR&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span class="synPreProc"&gt;module &lt;/span&gt;&lt;span class="synType"&gt;FOAF&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;Person&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;attr_accessor&lt;/span&gt; &lt;span class="synIdentifier"&gt;:rdf_id&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:name&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:nick&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:jabberID&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:aimChatID&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:msnChatID&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:mbox&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:description&lt;/span&gt;,&lt;br /&gt;                  &lt;span class="synIdentifier"&gt;:mbox_sha1sum&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:openid&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:dateOfBirth&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:jabberID&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:aimChatID&lt;/span&gt;, &lt;span class="synIdentifier"&gt;:msnChatID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;initialize&lt;/span&gt;(attrs)&lt;br /&gt;      attrs.each &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;k, v&lt;/span&gt;|&lt;br /&gt;        &lt;span class="synStatement"&gt;instance_eval&lt;/span&gt; &lt;span class="synSpecial"&gt;%Q{&lt;/span&gt;&lt;span class="synConstant"&gt;self.&lt;/span&gt;&lt;span class="synSpecial"&gt;#{k}&lt;/span&gt;&lt;span class="synConstant"&gt; = '&lt;/span&gt;&lt;span class="synSpecial"&gt;#{v}&lt;/span&gt;&lt;span class="synConstant"&gt;'&lt;/span&gt;&lt;span class="synSpecial"&gt;}&lt;/span&gt;&lt;br /&gt;      &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;Base&lt;/span&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;attr_accessor&lt;/span&gt; &lt;span class="synIdentifier"&gt;:me&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synIdentifier"&gt;XML_NS&lt;/span&gt; = {&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xml:lang&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;      =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;en&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;         =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://www.w3.org/foaf/0.1/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:foaf&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;    =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://xmlns.com/foaf/0.1/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:rdf&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;     =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:rdfs&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;    =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://www.w3.org/2000/01/rdf-schema#&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:dc&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;      =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://purl.org/dc/elements/1.1/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:dcterms&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://purl.org/dc/terms/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;,&lt;br /&gt;      &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;xmlns:wot&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;     =&amp;gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://xmlns.com/wot/0.1/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;initialize&lt;/span&gt;(username, password)&lt;br /&gt;      &lt;span class="synIdentifier"&gt;@username&lt;/span&gt; = username&lt;br /&gt;      &lt;span class="synIdentifier"&gt;@password&lt;/span&gt; = password&lt;br /&gt;      &lt;span class="synIdentifier"&gt;@agent&lt;/span&gt; = &lt;span class="synIdentifier"&gt;WWW&lt;/span&gt;::&lt;span class="synIdentifier"&gt;Mechanize&lt;/span&gt;.new&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;login&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;to_foaf&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="synPreProc"&gt;class &lt;/span&gt;&lt;span class="synType"&gt;Mixi&lt;/span&gt; &amp;lt; &lt;span class="synIdentifier"&gt;Base&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;initialize&lt;/span&gt;(username, password) &lt;br /&gt;      &lt;span class="synIdentifier"&gt;@base_uri&lt;/span&gt; = &lt;span class="synIdentifier"&gt;URI&lt;/span&gt;.parse(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;http://mixi.jp/&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;)&lt;br /&gt;      &lt;span class="synStatement"&gt;super&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;login!&lt;/span&gt;&lt;br /&gt;      top = &lt;span class="synIdentifier"&gt;@agent&lt;/span&gt;.get(&lt;span class="synIdentifier"&gt;@base_uri&lt;/span&gt;)&lt;br /&gt;      login_form = top.forms.first&lt;br /&gt;      login_form.fields.name(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;email&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;).value = &lt;span class="synIdentifier"&gt;@username&lt;/span&gt;&lt;br /&gt;      login_form.fields.name(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;password&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;).value = &lt;span class="synIdentifier"&gt;@password&lt;/span&gt;&lt;br /&gt;      &lt;span class="synStatement"&gt;raise&lt;/span&gt; &lt;span class="synIdentifier"&gt;Exception&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;login failed&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt; login_form.submit.meta.empty?&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;to_foaf&lt;/span&gt;(xmlns={})&lt;br /&gt;      login!&lt;br /&gt;      &lt;span class="synIdentifier"&gt;@friends&lt;/span&gt; = extract_friends!&lt;br /&gt;      xm = &lt;span class="synIdentifier"&gt;Builder&lt;/span&gt;::&lt;span class="synIdentifier"&gt;XmlMarkup&lt;/span&gt;.new(&lt;span class="synIdentifier"&gt;:indent&lt;/span&gt; =&amp;gt; &lt;span class="synConstant"&gt;2&lt;/span&gt;)&lt;br /&gt;      xm.instruct!&lt;br /&gt;&lt;br /&gt;      foaf = xm.rdf &lt;span class="synIdentifier"&gt;:RDF&lt;/span&gt;, &lt;span class="synIdentifier"&gt;XML_NS&lt;/span&gt;.merge(xmlns) &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;        &lt;span class="synComment"&gt;# About me&lt;/span&gt;&lt;br /&gt;        xm.foaf &lt;span class="synIdentifier"&gt;:Person&lt;/span&gt;, &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;rdf:ID&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt; =&amp;gt; &lt;span class="synIdentifier"&gt;@me&lt;/span&gt;.rdf_id &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;          (&lt;span class="synIdentifier"&gt;@me&lt;/span&gt;.public_methods - &lt;span class="synIdentifier"&gt;Object&lt;/span&gt;.public_methods).find_all {|&lt;span class="synIdentifier"&gt;meth&lt;/span&gt;| meth =~ &lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class="synConstant"&gt;[^=]$&lt;/span&gt;&lt;span class="synSpecial"&gt;/&lt;/span&gt;}.each &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;meth&lt;/span&gt;|&lt;br /&gt;            &lt;span class="synStatement"&gt;if&lt;/span&gt; v = &lt;span class="synIdentifier"&gt;@me&lt;/span&gt;.__send__(meth)&lt;br /&gt;              &lt;span class="synStatement"&gt;case&lt;/span&gt; meth&lt;br /&gt;              &lt;span class="synStatement"&gt;when&lt;/span&gt; &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;mbox_sha1sum&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;br /&gt;                xm.foaf meth.to_sym, &lt;span class="synIdentifier"&gt;Digest&lt;/span&gt;::&lt;span class="synIdentifier"&gt;SHA1&lt;/span&gt;.hexdigest(v)&lt;br /&gt;              &lt;span class="synStatement"&gt;else&lt;/span&gt;&lt;br /&gt;                xm.foaf meth.to_sym, v&lt;br /&gt;              &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;            &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;          &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span class="synStatement"&gt;end&lt;/span&gt; &lt;span class="synStatement"&gt;if&lt;/span&gt; &lt;span class="synIdentifier"&gt;@me&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="synComment"&gt;# Extract friends information&lt;/span&gt;&lt;br /&gt;        &lt;span class="synIdentifier"&gt;@friends&lt;/span&gt;.each &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;f&lt;/span&gt;|&lt;br /&gt;          xm.knows &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;            xm.Person &lt;span class="synStatement"&gt;do&lt;/span&gt;&lt;br /&gt;              xm.name f[&lt;span class="synIdentifier"&gt;:name&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:name&lt;/span&gt;)&lt;br /&gt;              xm.gender f[&lt;span class="synIdentifier"&gt;:gender&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:gender&lt;/span&gt;)&lt;br /&gt;              xm.img f[&lt;span class="synIdentifier"&gt;:image&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:image&lt;/span&gt;)&lt;br /&gt;              xm.homepage f[&lt;span class="synIdentifier"&gt;:homepage&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:url&lt;/span&gt;)&lt;br /&gt;              xm.nick f[&lt;span class="synIdentifier"&gt;:name&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:name&lt;/span&gt;)&lt;br /&gt;              xm.topic_interest f[&lt;span class="synIdentifier"&gt;:hobby&lt;/span&gt;].join(&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;, &lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;) &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:hobby&lt;/span&gt;)&lt;br /&gt;              xm.based_near f[&lt;span class="synIdentifier"&gt;:home_town&lt;/span&gt;] &lt;span class="synStatement"&gt;if&lt;/span&gt; f.key?(&lt;span class="synIdentifier"&gt;:home_town&lt;/span&gt;)&lt;br /&gt;            &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;          &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;      &lt;span class="synStatement"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synStatement"&gt;private&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="synPreProc"&gt;def &lt;/span&gt;&lt;span class="synIdentifier"&gt;extract_friends!&lt;/span&gt;&lt;br /&gt;      &lt;span class="synComment"&gt;# Obtain my friend list&lt;/span&gt;&lt;br /&gt;      friend_list_page = &lt;span class="synIdentifier"&gt;@agent&lt;/span&gt;.get(&lt;span class="synIdentifier"&gt;@base_uri&lt;/span&gt; + &lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;list_friend.pl&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;)&lt;br /&gt;      &lt;span class="synStatement"&gt;while&lt;/span&gt; &lt;span class="synConstant"&gt;true&lt;/span&gt;&lt;br /&gt;        friends = (friend_list_page.parser/&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;div.iconList03 ul li div&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;).inject([]) &lt;span class="synStatement"&gt;do&lt;/span&gt; |&lt;span class="synIdentifier"&gt;ret, div&lt;/span&gt;|&lt;br /&gt;          returning ret &lt;span class="synStatement"&gt;do&lt;/span&gt; &lt;br /&gt;            &lt;span class="synStatement"&gt;begin&lt;/span&gt;&lt;br /&gt;              ret &amp;lt;&amp;lt; {&lt;br /&gt;                &lt;span class="synIdentifier"&gt;:name&lt;/span&gt; =&amp;gt; (div/&lt;span class="synSpecial"&gt;'&lt;/span&gt;&lt;span class="synConstant"&gt;span&lt;/span&gt;&lt;span class="synSpecial"&gt;'&lt;/span&gt;).inner_text.strip.toutf8.match(&lt;span class="synSpecial"&gt;/&lt;/span&gt;&lt;span class=
