<?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-25238059</id><updated>2012-01-31T08:53:08.582+09:00</updated><category term='Flash'/><category term='Scala'/><category term='Performance'/><category term='gosen'/><category term='HIVE'/><category term='Hadoop'/><category term='Nginx'/><category term='GAE/J'/><category term='BigQuery'/><category term='AppEngine'/><category term='Perl'/><category term='ZABBIX'/><category term='Android'/><category term='PgQ'/><category term='haXe'/><category term='Solr'/><category term='rhino'/><category term='EC2'/><category term='mahout'/><category term='google'/><category term='LDAP'/><title type='text'>まだブロ</title><subtitle type='html'>日々ちょろちょろと調べてみたことなどを書いてゆきます．
ちょっと名前を変えました。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tf0054.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default?start-index=101&amp;max-results=100'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>480</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-25238059.post-8388161857520407387</id><published>2011-09-18T21:07:00.000+09:00</published><updated>2011-09-18T21:07:43.559+09:00</updated><title type='text'>Cygwin+Hiveで必要になる修正(File.separatorも!)</title><content type='html'>Hive内部では、当然HDFSのPath操作を各種行っているのだけど、、そのセパレータ(HDFSなら"/"であるべき)を、File.separatorシステム変数から取得している。Cygwinではこれが"￥"になってしまうので、修正として&lt;a href="http://tf0054.blogspot.com/2010/10/hadoopv0210hive.html"&gt;先にで紹介した&lt;/a&gt;ものだけでなく、ql/io/HiveFileFormatUtils.javaのdoGetPartitionDescFromPath()も変更が必要だった。&lt;pre&gt;&lt;br /&gt;  private static PartitionDesc doGetPartitionDescFromPath(&lt;br /&gt;&lt;br /&gt;&lt;b&gt;-snip-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;    if (part == null) {&lt;br /&gt;      String dirStr = dir.toString();&lt;br /&gt;      //int dirPathIndex = dirPath.lastIndexOf(File.separator);&lt;br /&gt;      //int dirStrIndex = dirStr.lastIndexOf(File.separator);&lt;br /&gt;      int dirPathIndex = dirPath.lastIndexOf("/");&lt;br /&gt;      int dirStrIndex = dirStr.lastIndexOf("/");&lt;br /&gt;      while (dirPathIndex &gt;= 0 &amp;&amp; dirStrIndex &gt;= 0) {&lt;br /&gt;        dirStr = dirStr.substring(0, dirStrIndex);&lt;br /&gt;        dirPath = dirPath.substring(0, dirPathIndex);&lt;br /&gt;        //first try full match&lt;br /&gt;        part = pathToPartitionInfo.get(dirStr);&lt;br /&gt;        if (part == null) {&lt;br /&gt;          // LOG.warn("exact match not found, try ripping input path's theme and authority");&lt;br /&gt;          part = pathToPartitionInfo.get(dirPath);&lt;br /&gt;        }&lt;br /&gt;        if (part != null) {&lt;br /&gt;          break;&lt;br /&gt;        }&lt;br /&gt;        //dirPathIndex = dirPath.lastIndexOf(File.separator);&lt;br /&gt;        //dirStrIndex = dirStr.lastIndexOf(File.separator);&lt;br /&gt;        dirPathIndex = dirPath.lastIndexOf("/");&lt;br /&gt;        dirStrIndex = dirStr.lastIndexOf("/");&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    return part;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;というか、File.separatorでgrepすると多数あるので、、、他にも危ないところはありそう。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8388161857520407387?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8388161857520407387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8388161857520407387'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2011/09/cygwinhive.html' title='Cygwin+Hiveで必要になる修正(File.separatorも!)'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8773426818282748452</id><published>2011-06-20T02:57:00.000+09:00</published><updated>2011-06-20T02:58:22.802+09:00</updated><title type='text'>GW-SC150Nの動き</title><content type='html'>この無線→有線コンバータは、とても便利なんだけど、どうも説明書などが詳細まで書かれていないので判然としないので調べてみた。&lt;br /&gt;&lt;br /&gt;①自分自身は上位の(無線LANの)クラスCの".249"となる&lt;br /&gt;②この249は上位から払い出されたものではなく勝手に使う&lt;br /&gt;③自分の有線LAN配下には自身がDHCPサーバとなりIPを払い出す(※)&lt;br /&gt;④但し払い出すIPのクラスC部分は上位の(無線LANの)ものを使う&lt;br /&gt;⑤故に有線と上位(＝無線LAN)で同じ第四オクテットを払い出しうる&lt;br /&gt;&lt;br /&gt;ということか。&lt;br /&gt;&lt;br /&gt;上位で見ていても有線上のMACが見えて来ないので、(※)ではNATしている＝全て自分(GW-SC150N)が通信していることにすることは確認できた気がする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8773426818282748452?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8773426818282748452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8773426818282748452'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2011/06/gw-sc150n.html' title='GW-SC150Nの動き'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8648777782199939303</id><published>2011-01-09T03:29:00.006+09:00</published><updated>2011-01-09T03:38:38.616+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Googleの検索機能をAPI的に使える!?</title><content type='html'>Googleドキュメントにuploadした文書は、"&lt;a href="http://code.google.com/intl/ja/apis/documents/docs/3.0/developers_guide_java.html#GettingStarted"&gt;Google Documents List Data API&lt;/a&gt;"経由で全文検索ができるらしい。これをJavascriptからやってみました(Rhino)。&lt;br /&gt;&lt;pre class="prettyprint"&gt;/*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;FullTextSearch&lt;br /&gt;&amp;nbsp;*&amp;nbsp;http://bit.ly/i4QaUO&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;importPackage(com.google.gdata.client.docs);&lt;br /&gt;importPackage(com.google.gdata.client);&lt;br /&gt;importPackage(com.google.gdata.data.docs);&lt;br /&gt;importPackage(java.util);&lt;br /&gt;importPackage(java.util.logging);&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;getDocsService(applicationName,&amp;nbsp;username,&amp;nbsp;password){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;service&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DocsService(applicationName)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service.setUserCredentials(username,&amp;nbsp;password)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;service;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;username&amp;nbsp;=&amp;nbsp;'xxxx@gmail.com';&lt;br /&gt;var&amp;nbsp;password&amp;nbsp;=&amp;nbsp;'xxxx';&lt;br /&gt;var&amp;nbsp;client&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;getDocsService('fts-test-1',&amp;nbsp;username,&amp;nbsp;password);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;feedUri&amp;nbsp;&amp;nbsp;=&amp;nbsp;new&amp;nbsp;java.net.URL('https://docs.google.com/feeds/default/private/full/');&lt;br /&gt;var&amp;nbsp;query&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DocumentQuery(feedUri);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;qStr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&amp;quot;first&amp;quot;;&amp;nbsp;//&amp;nbsp;検索文字列&lt;br /&gt;query.setFullTextQuery(qStr);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;feed&amp;nbsp;=&amp;nbsp;client.getFeed(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;query,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;java.lang.Class.forName(&amp;quot;com.google.gdata.data.docs.DocumentListFeed&amp;quot;)&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;print(&amp;nbsp;feed&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;if(feed){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;entries&amp;nbsp;=&amp;nbsp;feed.getEntries();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;entries.size();i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&amp;quot;-&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;entries.get(i).getTitle().getPlainText());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(entries.size());&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;もちろん元ネタは、ぶいてくさんの「&lt;a href="http://blog.virtual-tech.net/2010/01/google-app-engine-gdrive.html"&gt;すごいのはGDriveより全文検索でしょ！？&lt;/a&gt;」です。カスタム検索という機能は提供されていましたが、検索結果としてHTMLが返されたりと、プログラムから使える感じではなかったのですが、これは便利そうです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8648777782199939303?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8648777782199939303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8648777782199939303'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2011/01/googleapi.html' title='Googleの検索機能をAPI的に使える!?'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-365166253407263692</id><published>2011-01-02T23:03:00.008+09:00</published><updated>2011-01-02T23:23:21.193+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><title type='text'>JavaからJavascriptを使うとき</title><content type='html'>以下では、組込み変数のenvironmentなどがない環境での実行になってしまう。&lt;br /&gt;&lt;pre class="prettyprint"&gt;Context cx = Context.enter();&lt;br /&gt;Scriptable scope = new ImporterTopLevel(cx);&lt;br /&gt;Object obj = cx.evaluateReader(scope, reader, "JsScript", 1, null);&lt;/pre&gt;&lt;br /&gt;これは以下のように、GlobalオブジェクトでContectを初期化することで(それら変数が入った)シェルと同様の環境で実行させることができる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;Global global = new Global();&lt;br /&gt;Context cx = ContextFactory.getGlobal().enterContext();&lt;br /&gt;global.init(cx);&lt;br /&gt;Scriptable scope = cx.initStandardObjects(global);&lt;br /&gt;Object obj = cx.evaluateReader(scope, reader, "JsScript", 1, null);&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.devcomments.com/Embedding-EnvJs-how-to-get-the-Rhino-Shell-functions-at15779.htm"&gt;EnvJSの過去ML&lt;/a&gt;で知りました。&lt;br /&gt;なお、ここのGlobalは&lt;font color="blue"&gt;org.mozilla.javascript.tools.shell.Global&lt;/font&gt;です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-365166253407263692?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/365166253407263692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/365166253407263692'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2011/01/javajavascript.html' title='JavaからJavascriptを使うとき'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8975737262669862588</id><published>2010-12-21T03:49:00.011+09:00</published><updated>2010-12-21T04:02:58.193+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mahout'/><title type='text'>mahoutでkmeans!</title><content type='html'>以下HADOOP_CLASSPATHを設定して、&lt;br /&gt;&lt;br /&gt;$&amp;nbsp;export&amp;nbsp;HADOOP_CLASSPATH=dependency/mahout-math-0.4.jar:dependency/mahout-core-0.4.jar:dependency/mahout-utils-0.4.jar:dependency/google-collections-1.0-rc2.jar:dependency/gson-1.3.jar:dependency/mahout-collections-1.0.jar:dependency/commons-cli-2.0-mahout.jar&lt;br /&gt;&lt;br /&gt;以下を実行。なぜかKMeansはhadoopがローカルで待ち受けていないと動かない様子。&lt;br /&gt;&lt;br /&gt;$&amp;nbsp;~/hadoop-0.20.2/bin/hadoop&amp;nbsp;jar&amp;nbsp;mahout-examples-0.4.jar&amp;nbsp;org.apache.mahout.clustering.display.&lt;font color="blue"&gt;DisplayKMeans&lt;/font&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0tSGvTIRZ7U/TQ-lTEcWH4I/AAAAAAAAAcY/KoY4Q_qnCk4/s1600/k-Means%2BClusters%2B%25285%2525%2Bof%2Bpopulation%2529_2010-12-21_03-49-31.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://4.bp.blogspot.com/_0tSGvTIRZ7U/TQ-lTEcWH4I/AAAAAAAAAcY/KoY4Q_qnCk4/s320/k-Means%2BClusters%2B%25285%2525%2Bof%2Bpopulation%2529_2010-12-21_03-49-31.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5552838612599840642" /&gt;&lt;/a&gt;&lt;br /&gt;以下は、Hadoopが待ち受けていなくても動きますが、クラスがpublic宣言されていないのでソースを書きかえる必要がありました。&lt;br /&gt;&lt;br /&gt;$&amp;nbsp;~/hadoop-0.20.2/bin/hadoop&amp;nbsp;jar&amp;nbsp;mahout-examples-0.4.jar&amp;nbsp;org.apache.mahout.clustering.display.&lt;font color="blue"&gt;DisplayCanopy&lt;/font&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0tSGvTIRZ7U/TQ-nftGj94I/AAAAAAAAAcg/lpPNSa7-SIc/s1600/Canopy%2BClusters%2B%25285%2525%2Bof%2Bpopulation%2529_2010-12-21_03-57-18.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/TQ-nftGj94I/AAAAAAAAAcg/lpPNSa7-SIc/s320/Canopy%2BClusters%2B%25285%2525%2Bof%2Bpopulation%2529_2010-12-21_03-57-18.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5552841028696012674" /&gt;&lt;/a&gt;&lt;br /&gt;mahoutにGUIが付いていることは、意外にしられていないのでは、と思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8975737262669862588?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8975737262669862588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8975737262669862588'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/12/mahoutkmeans.html' title='mahoutでkmeans!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0tSGvTIRZ7U/TQ-lTEcWH4I/AAAAAAAAAcY/KoY4Q_qnCk4/s72-c/k-Means%2BClusters%2B%25285%2525%2Bof%2Bpopulation%2529_2010-12-21_03-49-31.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4019366084361345888</id><published>2010-12-07T02:01:00.011+09:00</published><updated>2010-12-07T09:35:40.623+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mahout'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>mahoutでTSP!</title><content type='html'>mahoutの中には、TSP(Travelling Salesman Problem / 巡回セールスマン問題)の&lt;a href="https://cwiki.apache.org/MAHOUT/traveling-salesman.html"&gt;例&lt;/a&gt;が入っています。一応GUIも付いてます。でも、なぜかsrc版からコンパイルしないと動きません。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0tSGvTIRZ7U/TP0Xz9bCknI/AAAAAAAAAcQ/IaY6H-lvdSk/s1600/Travelling%2BSalesman%2BFrame_2010-12-07_02-00-24.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 255px;" src="http://1.bp.blogspot.com/_0tSGvTIRZ7U/TP0Xz9bCknI/AAAAAAAAAcQ/IaY6H-lvdSk/s320/Travelling%2BSalesman%2BFrame_2010-12-07_02-00-24.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5547616497419063922" /&gt;&lt;/a&gt;&lt;br /&gt;うーん。。地味。もっと派手なのかと思ったのですが(AWT入ってるからバイナリのやつだと動かないのかな)。ちなみにmahoutはTESTを回すと準備にかなり時間がかかるので、&lt;pre&gt;$ mvn install -Dmaven.test.skip=true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;とやるのが良いようです。そして以下で起動。&lt;pre&gt;$ ~/hadoop-0.20.2/bin/hadoop jar examples/target/mahout-examples-0.4-job.jar org.apache.mahout.ga.watchmaker.travellingsalesman.TravellingSalesman&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;しかし、Hadoopでやらせる(チェックをつける)と、outputパスがもうあるから書けないよ！と文句を言われるのだけど、これはどうすればよいのだろう。&lt;br /&gt;&lt;a href="http://www.jarvana.com/jarvana/view/org/apache/mahout/mahout-core/0.4/mahout-core-0.4-javadoc.jar!/org/apache/mahout/ga/watchmaker/MahoutEvaluator.html"&gt;MahoutEvaluator.java&lt;/a&gt;の中でoutputって定義してあるから、複数回(Generationの分だけ)この評価を回したら、そらバッティングすると思うんだけど。。？(これはHDFS上のホームディレクトリというか、/user/～/outputとかのようにできる)&lt;br /&gt;このディレクトリを、ランダム文字列付きとして実行したら最後まで動くことは動いた。&lt;br /&gt;&lt;br /&gt;なお、cygwinなどでローカル実行するときは、Generationを(デフォルトの100から)低い数字にしておかないと大変な時間がかかるので注意。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4019366084361345888?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4019366084361345888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4019366084361345888'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/12/mahouttsp.html' title='mahoutでTSP!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_0tSGvTIRZ7U/TP0Xz9bCknI/AAAAAAAAAcQ/IaY6H-lvdSk/s72-c/Travelling%2BSalesman%2BFrame_2010-12-07_02-00-24.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3384293797565866487</id><published>2010-11-10T01:20:00.003+09:00</published><updated>2010-11-21T17:11:03.283+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>rhinoから"Google Storage"にupload!</title><content type='html'>GSUtil というコマンドラインツールが用意されているものの、Python(?Rubyだっけ)なので使っていなかった、が、以下ソースでuploadに成功。&lt;br /&gt;"&lt;a href="http://webos-goodies.jp/archives/using_ruby_with_google_storage_for_developers_api.html"&gt;WebOS Goodies&lt;/a&gt;"さんの情報を参考にしました。ありがとうございます！&lt;br /&gt;&lt;pre class="prettyprint"&gt;importPackage(javax.crypto);&lt;br /&gt;importPackage(javax.crypto.spec);&lt;br /&gt;importPackage(org.apache.commons.codec.binary);&lt;br /&gt;&lt;br /&gt;importPackage(org.apache.commons.httpclient);&lt;br /&gt;importPackage(org.apache.commons.httpclient.methods);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;ACCESS_KEY&amp;nbsp;=&amp;nbsp;'GOOG4C72MAOUMK7xxx3Z';&lt;br /&gt;var&amp;nbsp;SECRET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'xy4jTrxxxxuTZEtqUItfZIViVUF3xEKx4xxxp';&lt;br /&gt;var&amp;nbsp;HOST&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'commondatastorage.googleapis.com';&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;strDate&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;getDate();&lt;br /&gt;var&amp;nbsp;strPath&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;'/test/start.txt';&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;headers&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;//&amp;nbsp;&amp;nbsp;'Content-Length':&amp;nbsp;'0',&lt;br /&gt; 'Content-Type':&amp;nbsp;'text/plain',&lt;br /&gt; 'Date':&amp;nbsp;strDate,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'User-Agent':&amp;nbsp;'Jakarta&amp;nbsp;Commons-HttpClient/3.1',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Host':&amp;nbsp;'commondatastorage.googleapis.com'&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;rhino&amp;nbsp;+&amp;nbsp;Java&amp;nbsp;package/class&lt;br /&gt;//&amp;nbsp;http://d.hatena.ne.jp/terurou/20100918/1284791541&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;http://www.fireproject.jp/feature/uzumi/httpclient/logging.html&lt;br /&gt;java.lang.System.setProperty(&amp;quot;org.apache.commons.logging.Log&amp;quot;,&amp;nbsp;&amp;quot;org.apache.commons.logging.impl.SimpleLog&amp;quot;);&lt;br /&gt;java.lang.System.setProperty(&amp;quot;org.apache.commons.logging.simplelog.showdatetime&amp;quot;,&amp;nbsp;&amp;quot;true&amp;quot;);&lt;br /&gt;java.lang.System.setProperty(&amp;quot;org.apache.commons.logging.simplelog.log.httpclient.wire.header&amp;quot;,&amp;nbsp;&amp;quot;debug&amp;quot;);&lt;br /&gt;java.lang.System.setProperty(&amp;quot;org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient&amp;quot;,&amp;nbsp;&amp;quot;debug&amp;quot;);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;httpclient&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HttpClient();&lt;br /&gt;&lt;br /&gt;if(false){&amp;nbsp;&lt;br /&gt; var&amp;nbsp;httpget&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GetMethod(&amp;quot;http://commondatastorage.googleapis.com&amp;quot;&amp;nbsp;+&amp;nbsp;strPath);&amp;nbsp;&lt;br /&gt; httpget.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Date&amp;quot;,strDate));&lt;br /&gt; httpget.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Authorization&amp;quot;,getAuthHeader('GET',&amp;nbsp;headers,strPath)));&lt;br /&gt; &lt;br /&gt; var&amp;nbsp;statusCode&amp;nbsp;=&amp;nbsp;httpclient.executeMethod(httpget);&amp;nbsp;&amp;nbsp;&lt;br /&gt; print(httpget.getStatusLine());&lt;br /&gt;}else{&lt;br /&gt; var&amp;nbsp;httpput&amp;nbsp;=&amp;nbsp;new&amp;nbsp;PutMethod(&amp;quot;http://commondatastorage.googleapis.com&amp;quot;&amp;nbsp;+&amp;nbsp;'/tf0054'+strPath);&lt;br /&gt; var&amp;nbsp;jstrTmp&amp;nbsp;=&amp;nbsp;&amp;quot;Hello&amp;nbsp;this&amp;nbsp;is&amp;nbsp;a&amp;nbsp;test&amp;nbsp;in&amp;nbsp;one&amp;nbsp;line&amp;nbsp;that&amp;nbsp;is&amp;nbsp;longer&amp;nbsp;12345677890\n&amp;quot;;&lt;br /&gt;&lt;br /&gt; httpput.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Authorization&amp;quot;,getAuthHeader('PUT',&amp;nbsp;headers,&amp;nbsp;strPath)));&lt;br /&gt; httpput.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Date&amp;quot;,strDate));&lt;br /&gt; httpput.setRequestHeader(new&amp;nbsp;Header(&amp;quot;x-goog-acl&amp;quot;,&amp;quot;public-read&amp;quot;));&lt;br /&gt; httpput.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Content-Type&amp;quot;,&amp;quot;text/plain&amp;quot;));&lt;br /&gt; httpput.setRequestHeader(new&amp;nbsp;Header(&amp;quot;Content-Length&amp;quot;,&amp;quot;&amp;quot;&amp;nbsp;+&amp;nbsp;jstrTmp.length));&lt;br /&gt; httpput.setRequestBody(jstrTmp);&lt;br /&gt; &lt;br /&gt; httpclient.executeMethod(httpput); &lt;br /&gt; print(httpput.getResponseBodyAsString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;getAuthHeader(strMethod,&amp;nbsp;headers,&amp;nbsp;strPath){&lt;br /&gt;&lt;br /&gt; function&amp;nbsp;getHmacSign(strTmp){&lt;br /&gt;  var&amp;nbsp;strType&amp;nbsp;=&amp;nbsp;'HmacSHA1';&lt;br /&gt;  var&amp;nbsp;jstrTmp&amp;nbsp;=&amp;nbsp;new&amp;nbsp;java.lang.String(strTmp);&lt;br /&gt;  var&amp;nbsp;jstrSec&amp;nbsp;=&amp;nbsp;new&amp;nbsp;java.lang.String(SECRET);&lt;br /&gt;  var&amp;nbsp;mac&amp;nbsp;=&amp;nbsp;Mac.getInstance(strType);&lt;br /&gt;  mac.init(new&amp;nbsp;SecretKeySpec(jstrSec.getBytes(),&amp;nbsp;strType));&lt;br /&gt;  return&amp;nbsp;new&amp;nbsp;java.lang.String(Base64.encodeBase64(mac.doFinal(jstrTmp.getBytes())),&amp;quot;UTF-8&amp;quot;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; var&amp;nbsp;strHeaders&amp;nbsp;=&amp;nbsp;strMethod&amp;nbsp;+&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br /&gt; strHeaders&amp;nbsp;+=&amp;nbsp;&amp;quot;\n&amp;quot;;&amp;nbsp;//&amp;nbsp;Content-MD5&amp;nbsp;value&lt;br /&gt; for(var&amp;nbsp;i&amp;nbsp;in&amp;nbsp;headers){&lt;br /&gt;  if(i.toLowerCase()&amp;nbsp;==&amp;nbsp;'date'&amp;nbsp;||&amp;nbsp;i.toLowerCase()&amp;nbsp;==&amp;nbsp;'content-type'){&lt;br /&gt;   strHeaders&amp;nbsp;+=&amp;nbsp;headers[i]&amp;nbsp;+&amp;nbsp;&amp;quot;\n&amp;quot;;&lt;br /&gt;  }&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;   //&amp;nbsp;strHeaders&amp;nbsp;+=&amp;nbsp;i.toLowerCase()+':'+headers[i]+&amp;quot;\r\n&amp;quot;;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; strHeaders&amp;nbsp;+=&amp;nbsp;&amp;quot;x-goog-acl:public-read\n&amp;quot;;&lt;br /&gt; strHeaders&amp;nbsp;+=&amp;nbsp;'/tf0054'&amp;nbsp;+&amp;nbsp;strPath;&lt;br /&gt; print(&amp;quot;&amp;gt;&amp;quot;+strHeaders);&lt;br /&gt; return&amp;nbsp;'GOOG1&amp;nbsp;'&amp;nbsp;+&amp;nbsp;ACCESS_KEY&amp;nbsp;+&amp;nbsp;':'&amp;nbsp;+&amp;nbsp;getHmacSign(strHeaders);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function&amp;nbsp;getDate(){&lt;br /&gt; var&amp;nbsp;d&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Date(new&amp;nbsp;Date().getTime());&lt;br /&gt; return&amp;nbsp;d.toGMTString().replace(/UTC/,'GMT');&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;適当なソースですが、ご参考までに。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3384293797565866487?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3384293797565866487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3384293797565866487'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/11/rhinogoogle-storageupload.html' title='rhinoから&quot;Google Storage&quot;にupload!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-411468189316502277</id><published>2010-11-03T02:40:00.023+09:00</published><updated>2010-11-10T01:27:14.977+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BigQuery'/><title type='text'>BigQueryを試してみた</title><content type='html'>Googleさんから&lt;a href="http://code.google.com/intl/ja/apis/bigquery/"&gt;BigQuery&lt;/a&gt;の利用OKがメール出来たので、(公開されている&lt;a href="http://code.google.com/intl/ja/apis/bigquery/docs/getting-started.html#hellobq2"&gt;お試し手順&lt;/a&gt;に沿って)自らuploadしたデータに検索ができる、までを確認しました。&lt;br /&gt;&lt;br /&gt;また、このときPythonが手元にない環境だったので、先に作ったcygwin環境のシェル+curlでお手軽に試せることも分かりました。&lt;br /&gt;&lt;center&gt;- - -&lt;/center&gt;&lt;font color="blue"&gt;①操作用Tokenを取得&lt;/font&gt;&lt;br /&gt;curl -X POST -d accountType=HOSTED_OR_GOOGLE -d Email=tf0054@gmail.com -d Passwd=&lt;font color="red"&gt;xxx&lt;/font&gt; -d service=ndev -d source=google-bigquery-manualimport-1 -H "Content-Type: application/x-www-form-urlencoded" https://www.google.com/accounts/ClientLogin&lt;br /&gt;&lt;br /&gt;xxxの部分はご自分のpwに変えて下さい。このcurlコマンド実行で得られるレスポンスにある、AUTH=yyyのyyy部分ががTokenになります。けっこう長いです。&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;②各種操作用シェルスクリプトを保存&lt;/font&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/ja/apis/bigquery/docs/libraries.html#curl"&gt;Librariesのページ&lt;/a&gt;にあるシェルをファイルに落とします。&lt;br /&gt;&lt;br /&gt;check_import_status.sh&lt;br /&gt;createtable.sh&lt;br /&gt;delete_table.sh&lt;br /&gt;import.sh&lt;br /&gt;query.sh&lt;br /&gt;&lt;br /&gt;このとき、curlからhttpsアクセスをするので、(私の環境では)各シェルの中にあるcurlのオプションに、"-k"を足す必要がありました。&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;③SSAのサンプルデータをダウンロード＆配置&lt;/font&gt;&lt;br /&gt;本家には日本からアクセスできなさそう？なので、&lt;a href="filebin.ca/jrewcn/yob1880.txt"&gt;ココ&lt;/a&gt;からダウンロードし、以下絵の感じに「tf0054/yob1880.txt」として&lt;a href="https://sandbox.google.com/storage/#"&gt;管理画面&lt;/a&gt;からupload。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://sandbox.google.com/storage/#"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 90px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/TNBRKTz3PCI/AAAAAAAAAWQ/Kgv4wKAB-nI/s320/big1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535013179596684322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;font color="blue"&gt;④テーブルを作成&lt;/font&gt;&lt;br /&gt;$&amp;nbsp;./createtable.sh&amp;nbsp;tf0054/tables/babynames&lt;br /&gt;&lt;br /&gt;上の&lt;a href="https://sandbox.google.com/storage/#"&gt;GoogleStorage管理画面&lt;/a&gt;キャプチャのとおりですが、ここの階層にあるディレクトリは自動的に掘られるようです(上記tablesなど)。&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;⑤データをインポート&lt;/font&gt;&lt;br /&gt;$&amp;nbsp;./import.sh&amp;nbsp;tf0054/tables/babynames&amp;nbsp;tf0054/yob1880.txt&lt;br /&gt;&lt;br /&gt;これまでにGoogleStorageへ上げたデータがあれば、それをBigQueryで見られるようにする(BigQueryの管理下に置く)ことができました。&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;⑥インポート処理状況を確認&lt;/font&gt;&lt;br /&gt;$&amp;nbsp;./check_import_status.sh&amp;nbsp;tf0054/tables/babynames&amp;nbsp;b85867e864bf1259&lt;br /&gt;&lt;br /&gt;先のインポートコマンド投入時にもらえるレスポンスに、ジョブIDがもらえるのでそれを最終パラメータにします。&lt;br /&gt;&lt;br /&gt;&lt;font color="blue"&gt;⑦セレクトしてみる&lt;/font&gt;&lt;br /&gt;$&amp;nbsp;./query.sh&amp;nbsp;&amp;quot;SELECT&amp;nbsp;name,count&amp;nbsp;FROM&amp;nbsp;&lt;font color="red"&gt;[&lt;/font&gt;tf0054/tables/babynames&lt;font color="red"&gt;]&lt;/font&gt;&amp;nbsp;WHERE&amp;nbsp;gender&amp;nbsp;=&amp;nbsp;'F'&amp;nbsp;ORDER&amp;nbsp;BY&amp;nbsp;count&amp;nbsp;DESC&amp;nbsp;LIMIT&amp;nbsp;5;&amp;quot;&lt;br /&gt;&lt;br /&gt;テーブル名はカギ括弧に括って記述し、さらにGoogleStorage的にはフルパスで参照する感じになりました。&lt;br /&gt;&lt;center&gt;- - -&lt;/center&gt;&lt;br /&gt;レスポンスがJSONでもらえるだけど、見た目には分かりずらい。Parseエラーなどになっていないことを随時確認しましょう。例えば⑦の結果は以下です。&lt;br /&gt;&lt;br /&gt;{&amp;quot;result&amp;quot;:{&amp;quot;kind&amp;quot;:&amp;quot;bigquery#queryResults&amp;quot;,&amp;quot;fields&amp;quot;:[{&amp;quot;id&amp;quot;:&amp;quot;name&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;string&amp;quot;},{&amp;quot;id&amp;quot;:&amp;quot;COUNT&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;integer&amp;quot;}],&amp;quot;rows&amp;quot;:[{&amp;quot;f&amp;quot;:[{&amp;quot;v&amp;quot;:&amp;quot;Mary&amp;quot;},{&amp;quot;v&amp;quot;:&amp;quot;7065&amp;quot;}]},{&amp;quot;f&amp;quot;:[{&amp;quot;v&amp;quot;:&amp;quot;Anna&amp;quot;},{&amp;quot;v&amp;quot;:&amp;quot;2604&amp;quot;}]},{&amp;quot;f&amp;quot;:[{&amp;quot;v&amp;quot;:&amp;quot;Emma&amp;quot;},{&amp;quot;v&amp;quot;:&amp;quot;2003&amp;quot;}]},{&amp;quot;f&amp;quot;:[{&amp;quot;v&amp;quot;:&amp;quot;Elizabeth&amp;quot;},{&amp;quot;v&amp;quot;:&amp;quot;1939&amp;quot;}]},{&amp;quot;f&amp;quot;:[{&amp;quot;v&amp;quot;:&amp;quot;Minnie&amp;quot;},{&amp;quot;v&amp;quot;:&amp;quot;1746&amp;quot;}]}]}}&lt;br /&gt;&lt;br /&gt;何やら&lt;a href="http://www.publickey1.jp/blog/10/mapreducebigquerysql.html"&gt;可能性を感じ&lt;/a&gt;ますが、Hadoop上のHIVE、みたいな位置づけですね(でも、だとするとGoogleStorageがHadoopにあたるものとなる、、、のでしょうか)。また、対応できているSQL(?)の情報も&lt;a href="http://code.google.com/intl/ja/apis/bigquery/docs/query-reference.html"&gt;公開&lt;/a&gt;されていました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-411468189316502277?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/411468189316502277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/411468189316502277'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/11/bigquery.html' title='BigQueryを試してみた'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0tSGvTIRZ7U/TNBRKTz3PCI/AAAAAAAAAWQ/Kgv4wKAB-nI/s72-c/big1.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3412670714196277284</id><published>2010-11-02T23:48:00.004+09:00</published><updated>2010-11-02T23:53:57.578+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>JavascriptでHIVEを操作する(JDBC@Thrift)</title><content type='html'>rhinoを使って、JavascriptからHIVEを操作してみるテスト。普通にできた(あたりまえ)。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/*&lt;br /&gt;  http://wiki.apache.org/hadoop/Hive/HiveClient#Thrift_Java_Client&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;importPackage(java.sql);&lt;br /&gt;importPackage(java.lang);&lt;br /&gt;&lt;br /&gt;Class.forName(&amp;quot;org.apache.hadoop.hive.jdbc.HiveDriver&amp;quot;);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;tableName&amp;nbsp;=&amp;nbsp;&amp;quot;testHiveDriverTable&amp;quot;;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;make&amp;nbsp;connection&lt;br /&gt;var&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;DriverManager.getConnection(&amp;quot;jdbc:hive://localhost:10000/default&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);&lt;br /&gt;var&amp;nbsp;stmt&amp;nbsp;=&amp;nbsp;conn.createStatement();&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;init&lt;br /&gt;stmt.executeQuery(&amp;quot;drop&amp;nbsp;table&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName);&lt;br /&gt;stmt.executeQuery(&amp;quot;create&amp;nbsp;table&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;(key&amp;nbsp;int,&amp;nbsp;value&amp;nbsp;string)&amp;quot;);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;show&amp;nbsp;tables&lt;br /&gt;var&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;&amp;quot;show&amp;nbsp;tables&amp;nbsp;'&amp;quot;&amp;nbsp;+&amp;nbsp;tableName&amp;nbsp;+&amp;nbsp;&amp;quot;'&amp;quot;;&lt;br /&gt;print(&amp;quot;Running:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;sql);&lt;br /&gt;var&amp;nbsp;resp&amp;nbsp;=&amp;nbsp;stmt.executeQuery(sql);&lt;br /&gt;if&amp;nbsp;(resp.next())&amp;nbsp;{&lt;br /&gt; print(resp.getString(1));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;describe&amp;nbsp;table&lt;br /&gt;sql&amp;nbsp;=&amp;nbsp;&amp;quot;describe&amp;nbsp;extended&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName;&lt;br /&gt;print(&amp;quot;Running:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;sql);&lt;br /&gt;resp&amp;nbsp;=&amp;nbsp;stmt.executeQuery(sql);&lt;br /&gt;while&amp;nbsp;(resp.next())&amp;nbsp;{&lt;br /&gt; print(resp.getString(1)&amp;nbsp;+&amp;nbsp;&amp;quot;\t&amp;quot;&amp;nbsp;+&amp;nbsp;resp.getString(2));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;load&amp;nbsp;data&amp;nbsp;into&amp;nbsp;table&lt;br /&gt;var&amp;nbsp;filepath&amp;nbsp;=&amp;nbsp;&amp;quot;/tmp/a.txt&amp;quot;;&lt;br /&gt;sql&amp;nbsp;=&amp;nbsp;&amp;quot;load&amp;nbsp;data&amp;nbsp;local&amp;nbsp;inpath&amp;nbsp;'&amp;quot;&amp;nbsp;+&amp;nbsp;filepath&amp;nbsp;+&amp;nbsp;&amp;quot;'&amp;nbsp;into&amp;nbsp;table&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName;&lt;br /&gt;print(&amp;quot;Running:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;sql);&lt;br /&gt;resp&amp;nbsp;=&amp;nbsp;stmt.executeQuery(sql);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;select&amp;nbsp;*&amp;nbsp;query&lt;br /&gt;sql&amp;nbsp;=&amp;nbsp;&amp;quot;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName;&lt;br /&gt;print(&amp;quot;Running:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;sql);&lt;br /&gt;resp&amp;nbsp;=&amp;nbsp;stmt.executeQuery(sql);&lt;br /&gt;while&amp;nbsp;(resp.next())&amp;nbsp;{&lt;br /&gt; print(String(resp.getInt(1))&amp;nbsp;+&amp;nbsp;&amp;quot;\t&amp;quot;&amp;nbsp;+&amp;nbsp;resp.getString(2));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;regular&amp;nbsp;hive&amp;nbsp;query&lt;br /&gt;sql&amp;nbsp;=&amp;nbsp;&amp;quot;select&amp;nbsp;count(1)&amp;nbsp;from&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;tableName;&lt;br /&gt;print(&amp;quot;Running:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;sql);&lt;br /&gt;resp&amp;nbsp;=&amp;nbsp;stmt.executeQuery(sql);&lt;br /&gt;while&amp;nbsp;(resp.next())&amp;nbsp;{&lt;br /&gt; print(resp.getString(1));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;一応、走らせるときのbuild.xmlもサンプルとして。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;lt;path&amp;nbsp;id=&amp;quot;clspath&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;fileset&amp;nbsp;dir=&amp;quot;build/jar&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;!--&amp;nbsp;メインの読込み&amp;nbsp;--&amp;gt;&lt;br /&gt;   &amp;lt;include&amp;nbsp;name=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/fileset&amp;gt;&lt;br /&gt;  &amp;lt;fileset&amp;nbsp;dir=&amp;quot;${hive.dir}&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;!--&amp;nbsp;HIVEのjarを読込み&amp;nbsp;--&amp;gt;&lt;br /&gt;   &amp;lt;include&amp;nbsp;name=&amp;quot;**/*.jar&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/fileset&amp;gt;&lt;br /&gt;  &amp;lt;fileset&amp;nbsp;dir=&amp;quot;${hadoop.dir}&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;!--&amp;nbsp;Hadoopのjarを読込み&amp;nbsp;--&amp;gt;&lt;br /&gt;   &amp;lt;include&amp;nbsp;name=&amp;quot;*.jar&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/fileset&amp;gt;&lt;br /&gt; &amp;lt;/path&amp;gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--&amp;nbsp;blog-gae&amp;gt;ant&amp;nbsp;rhino-run&amp;nbsp;-Dfile.encoding=UTF-8&amp;nbsp;-Dscript=&amp;quot;env0.js&amp;quot;&amp;nbsp;--&amp;gt;&lt;br /&gt; &amp;lt;target&amp;nbsp;name=&amp;quot;rhino-run&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;echo&amp;nbsp;message=&amp;quot;Running&amp;nbsp;${script}&amp;quot;/&amp;gt;&amp;nbsp;&lt;br /&gt;  &amp;lt;java&amp;nbsp;fork=&amp;quot;yes&amp;quot;&lt;br /&gt;   classname=&amp;quot;org.mozilla.javascript.tools.shell.Main&amp;quot;&lt;br /&gt;   failonerror=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;classpath&amp;gt;&lt;br /&gt;    &amp;lt;path&amp;nbsp;refid=&amp;quot;clspath&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;    &amp;lt;pathelement&amp;nbsp;path=&amp;quot;js.jar&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;   &amp;lt;/classpath&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;nbsp;value=&amp;quot;${script}&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;  &amp;lt;/java&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;HIVEの力なんだけど、とても簡単にM/Rが動くのは素晴らしい、と思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3412670714196277284?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3412670714196277284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3412670714196277284'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/11/javascripthivejdbcthrift.html' title='JavascriptでHIVEを操作する(JDBC@Thrift)'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4285293718655415600</id><published>2010-10-31T02:50:00.007+09:00</published><updated>2011-09-11T21:42:15.959+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>cygwinでHadoop(v0.21.0)＋HIVEを動かす</title><content type='html'>FileのAppendもできるようになったとのこともあり、Hadoopがv0.21.0な状態でHIVEを使いたかったのだが、やってみると結構苦労したのでメモ。cygwinをまじめに使うのも初めてで、、これも意外に大変。。&lt;br /&gt;&lt;br /&gt;①&lt;a href="http://issues.apache.org/jira/browse/HIVE-1612"&gt;HIVE-1612&lt;/a&gt;に掲示されたパッチを対応するtrunkソースに当てる。&lt;br /&gt;&lt;br /&gt;②&lt;a href="http://yoshimov.com/?page=Hadoop%2FHive%A4%F2Windows%BE%E5%A4%C7%BC%C2%B9%D4%A4%B9%A4%EB(0.5.0)"&gt;よしもふさんのページ&lt;/a&gt;を参考にql/exec/Utilities.javaのgetMapRedWorkメソッドを修正(多少本体側も変更されているので以下参考)。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;MapredWork&amp;nbsp;getMapRedWork&amp;nbsp;(Configuration&amp;nbsp;job)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MapredWork&amp;nbsp;gWork&amp;nbsp;=&amp;nbsp;null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;synchronized(gWorkMap)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gWork&amp;nbsp;=&amp;nbsp;gWorkMap.get(getHiveJobID(job));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(gWork&amp;nbsp;==&amp;nbsp;null)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;synchronized&amp;nbsp;(Utilities.class)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(gWork&amp;nbsp;!=&amp;nbsp;null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(gWork);&lt;br /&gt; &amp;nbsp;&amp;nbsp;Path&amp;nbsp;planPath&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Path(HiveConf.getVar(job,&amp;nbsp;HiveConf.ConfVars.PLAN));&lt;br /&gt; &amp;nbsp;&amp;nbsp;FileSystem&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;planPath.getFileSystem(job);&lt;br /&gt; &amp;nbsp;&amp;nbsp;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;fs.open(planPath);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MapredWork&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;deserializeMapRedWork(in,&amp;nbsp;job);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gWork&amp;nbsp;=&amp;nbsp;ret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gWork.initialize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gWorkMap.put(getHiveJobID(job),&amp;nbsp;gWork);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(gWork);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException&amp;nbsp;(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;③ql/Context.javaのgetLocalScratchDirメソッドを修正(以下ひどい修正なので参考までに)。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;public&amp;nbsp;String&amp;nbsp;getLocalScratchDir(boolean&amp;nbsp;mkdir)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileSystem&amp;nbsp;fs&amp;nbsp;=&amp;nbsp;FileSystem.getLocal(conf);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;URI&amp;nbsp;uri&amp;nbsp;=&amp;nbsp;fs.getUri();&lt;br /&gt;   return&amp;nbsp;&amp;quot;/tmp&amp;quot;;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;getScratchDir(uri.getScheme(),&amp;nbsp;uri.getAuthority(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mkdir,&amp;nbsp;localScratchDir);&lt;br /&gt;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(IOException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException&amp;nbsp;(e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&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/25238059-4285293718655415600?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4285293718655415600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4285293718655415600'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/10/hadoopv0210hive.html' title='cygwinでHadoop(v0.21.0)＋HIVEを動かす'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-817503052918972701</id><published>2010-09-10T01:33:00.004+09:00</published><updated>2010-09-10T01:42:07.716+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><title type='text'>Solrクエリのパーサ2</title><content type='html'>以下を忘れいたので、GINによるSolrクエリパーサを改訂しました。&lt;br /&gt;&lt;br /&gt;・NOT&lt;br /&gt;・レンジクエリ(pub_date:[2009-10-01T00:00:00Z+TO+*])&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//&amp;nbsp;Solrクエリパーサの作成(LL) v0.2&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサジェネレータを読込み&lt;br /&gt;load('work\\mod_gin.js');&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサを作成(EBNFで文法を定義)&lt;br /&gt;//&amp;nbsp;JS_STRINGはダブルクウォートで括らなくてはならないのでTermを定義して使う&lt;br /&gt;//&amp;nbsp;Termで+記号は定義せず+desc/+ascを別書きとする(+OR+等とかぶるため全体がターム扱いとなる)&lt;br /&gt;//&amp;nbsp;Rangeには[]で括って作られるレンジクエリ用の記述を入れて別出し&lt;br /&gt;var&amp;nbsp;calc&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Gin.Grammar({&lt;br /&gt; Solr:&amp;nbsp;/&amp;nbsp;Object&amp;nbsp;(&amp;nbsp;'&amp;amp;'&amp;nbsp;Object&amp;nbsp;)*&amp;nbsp;/,&lt;br /&gt; Object:&amp;nbsp;/&amp;nbsp;(&amp;nbsp;Value&amp;nbsp;'='&amp;nbsp;Factor&amp;nbsp;)&amp;nbsp;/,&lt;br /&gt; Factor:&amp;nbsp;/&amp;nbsp;Value&amp;nbsp;(&amp;nbsp;','&amp;nbsp;Factor&amp;nbsp;|&amp;nbsp;'+AND+'&amp;nbsp;Factor&amp;nbsp;|&amp;nbsp;'+OR+'&amp;nbsp;Factor&amp;nbsp;|&amp;nbsp;'+NOT+'&amp;nbsp;Factor&amp;nbsp;)*&amp;nbsp;/,&lt;br /&gt; Value:&amp;nbsp;/&amp;nbsp;Term&amp;nbsp;|&amp;nbsp;'('&amp;nbsp;Factor&amp;nbsp;')'&amp;nbsp;/,&lt;br /&gt; Term:&amp;nbsp;/&amp;nbsp;&amp;lt;[a-zA-Z0-9_.]+&amp;gt;&amp;nbsp;':['&amp;nbsp;Range&amp;nbsp;']'&amp;nbsp;|&amp;nbsp;&amp;lt;[a-zA-Z0-9_.:]+(\+desc|\+asc)?&amp;gt;&amp;nbsp;/,&lt;br /&gt; Range:&amp;nbsp;/&amp;nbsp;&amp;lt;[a-zA-Z0-9_.+*\-]+&amp;gt;&amp;nbsp;/&lt;br /&gt;},&amp;nbsp;&amp;quot;Solr&amp;quot;,&amp;nbsp;Gin.SPACE);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;検証するSolrクエリ&lt;br /&gt;var&amp;nbsp;strInput&amp;nbsp;=&amp;nbsp;'start=0&amp;amp;q=AREA_CD:050+OR+DISP:1+AND+HAN_CD:011)+AND+EKI_CD:26610+AND+pub_date:[2009-10-01T00:00:00Z+TO+*]&amp;amp;sort=EKI_CD+asc,HAN_CD+desc&amp;amp;wt=javabin&amp;amp;rows=0&amp;amp;version=2.2';&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサのデバッグを行うときは以下のコメントを復活&lt;br /&gt;var&amp;nbsp;input&amp;nbsp;=&amp;nbsp;[&lt;br /&gt; //&amp;nbsp;'q=((AAA:1+AND+BBB:2))&amp;amp;start=1',&lt;br /&gt; //&amp;nbsp;'&amp;quot;q&amp;quot;=((&amp;quot;AAA:x&amp;quot;+AND+&amp;quot;BBB:2&amp;quot;)+AND+&amp;quot;CCC:3&amp;quot;)&amp;amp;&amp;quot;start&amp;quot;=1&amp;amp;&amp;quot;var&amp;quot;=1.1',&lt;br /&gt; //&amp;nbsp;'&amp;quot;q&amp;quot;=(&amp;quot;DDD&amp;quot;+OR+(&amp;quot;AAA&amp;quot;+AND+&amp;quot;BBB&amp;quot;)+AND+&amp;quot;CCC&amp;quot;)&amp;amp;&amp;quot;sort&amp;quot;=&amp;quot;test+desc&amp;quot;,&amp;quot;kkk+asc&amp;quot;&amp;amp;&amp;quot;start&amp;quot;=1',&lt;br /&gt; strInput&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;検証！&lt;br /&gt;for&amp;nbsp;(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;input.length;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt; var&amp;nbsp;match&amp;nbsp;=&amp;nbsp;calc.parse(input[i]);&lt;br /&gt; if&amp;nbsp;(match&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;match.full){&lt;br /&gt;  print(&amp;quot;AST:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;match.value.toSource());&lt;br /&gt; }else{&lt;br /&gt;  print(input[i]);&lt;br /&gt;  print(&amp;quot;Sentence&amp;nbsp;was&amp;nbsp;wrong.&amp;quot;);&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/25238059-817503052918972701?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/817503052918972701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/817503052918972701'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/09/ginsolr-not-pubdate2009-10-01t000000zto.html' title='Solrクエリのパーサ2'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1321436237376363775</id><published>2010-08-09T18:42:00.006+09:00</published><updated>2010-09-10T01:43:38.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><title type='text'>Solrクエリのパーサ1</title><content type='html'>"&lt;a href="http://nanto.asablo.jp/blog/2007/09/12/1793275"&gt;Days on the Moon&lt;/a&gt;"さんのブログを参考に、Solrのクエリを整形(Lint)する目的でパーサを作る実験中です。&lt;br /&gt;&lt;br /&gt;以下、なんとなく通った版です(GINはmod_gin.jsとリネームし、&lt;a href="http://www.mozilla.org/rhino/"&gt;rhino&lt;/a&gt;で起動)。&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;//&amp;nbsp;Solrクエリパーサの作成(LL) v0.1&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサジェネレータを読込み&lt;br /&gt;load('work\\mod_gin.js');&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサを作成(EBNFで文法を定義)&lt;br /&gt;//&amp;nbsp;JS_STRINGはダブルクウォートで括らなくてはならないのでTermを定義して使う&lt;br /&gt;//&amp;nbsp;Termで+記号は定義せず+desc/+ascを別書きとする(+OR+等とかぶるため全体がターム扱いとなる)&lt;br /&gt;//&amp;nbsp;Termには数字は入ってこない想定(Valueに$REALがあるため)&lt;br /&gt;var&amp;nbsp;calc&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Gin.Grammar({&lt;br /&gt; Solr:&amp;nbsp;/&amp;nbsp;Object&amp;nbsp;(&amp;nbsp;'&amp;amp;'&amp;nbsp;Object&amp;nbsp;)*&amp;nbsp;/,&lt;br /&gt; Object:&amp;nbsp;/&amp;nbsp;(&amp;nbsp;Value&amp;nbsp;'='&amp;nbsp;Factor&amp;nbsp;)&amp;nbsp;/,&lt;br /&gt; Factor:&amp;nbsp;/&amp;nbsp;Value&amp;nbsp;(&amp;nbsp;','&amp;nbsp;Factor&amp;nbsp;|&amp;nbsp;'+AND+'&amp;nbsp;Factor&amp;nbsp;|&amp;nbsp;'+OR+'&amp;nbsp;Factor&amp;nbsp;)*&amp;nbsp;/,&lt;br /&gt; Value:&amp;nbsp;/&amp;nbsp;$REAL&amp;nbsp;|&amp;nbsp;Term&amp;nbsp;|&amp;nbsp;'('&amp;nbsp;Factor&amp;nbsp;')'&amp;nbsp;/,&lt;br /&gt; Term:&amp;nbsp;/&amp;nbsp;&amp;lt;[a-zA-Z0-9:_.]+(\+desc|\+asc)?&amp;gt;&amp;nbsp;/&lt;br /&gt;},&amp;nbsp;&amp;quot;Solr&amp;quot;,&amp;nbsp;Gin.SPACE);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;検証するSolrクエリ&lt;br /&gt;var&amp;nbsp;strInput&amp;nbsp;=&amp;nbsp;'start=0&amp;amp;q=(AREA_CD:050+OR+DISP:1+AND+HAN_CD:011)+AND+EKI_CD:26610&amp;amp;sort=EKI_CD+asc,HAN_CD+desc&amp;amp;wt=javabin&amp;amp;rows=0&amp;amp;version=2.2';&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;パーサのデバッグを行うときは以下のコメントを復活&lt;br /&gt;var&amp;nbsp;input&amp;nbsp;=&amp;nbsp;[&lt;br /&gt; //&amp;nbsp;'q=((AAA:1+AND+BBB:2))&amp;amp;start=1',&lt;br /&gt; strInput&lt;br /&gt;];&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;検証！&lt;br /&gt;for&amp;nbsp;(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;input.length;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt; var&amp;nbsp;match&amp;nbsp;=&amp;nbsp;calc.parse(input[i]);&lt;br /&gt; if&amp;nbsp;(match&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;match.full){&lt;br /&gt;  print(&amp;quot;AST:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;match.value.toSource());&lt;br /&gt; }else{&lt;br /&gt;  print(input[i]);&lt;br /&gt;  print(&amp;quot;Sentence&amp;nbsp;was&amp;nbsp;wrong.&amp;quot;);&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/25238059-1321436237376363775?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1321436237376363775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1321436237376363775'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/08/days-on-moon-solrlint-ginmodgin.html' title='Solrクエリのパーサ1'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7736903534546545123</id><published>2010-07-19T22:54:00.004+09:00</published><updated>2010-07-19T23:21:56.065+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rhino'/><title type='text'>rhinoでe4xを使う</title><content type='html'>Windowsのantでスクリプト実行をしていたのだけど、何故かant経由だと&lt;a href="http://builder.japan.zdnet.com/sp/scripting-on-java-kickstart/story/0,3800084107,20366909,00.htm"&gt;e4x&lt;/a&gt;がうまく使えなかった。javaコマンドで直接起動する分には問題ない。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D:\work\blog-gae&gt;java -cp war\WEB-INF\lib\js.jar org.mozilla.javascript.tools.shell.Main work\e4x.js&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;以下そのときのantのターゲット。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target name="rhino-run"&amp;gt;&lt;br /&gt;    &amp;lt;property name="classes" value="war/WEB-INF/lib/js.jar:war/WEB-INF/lib/mailapi.jar:war/WEB-INF/lib/smtp.jar"/&amp;gt;&lt;br /&gt;    &amp;lt;echo message="Running ${script}"/&amp;gt;&lt;br /&gt;    &amp;lt;java classname="org.mozilla.javascript.tools.shell.Main"&lt;br /&gt;        classpath="${classes}"&lt;br /&gt;        failonerror="true"&amp;gt;&lt;br /&gt;        &amp;lt;arg value="${script}" /&amp;gt;&lt;br /&gt;    &amp;lt;/java&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そのときのe4xテストスクリプトは以下。&lt;br /&gt;&lt;pre class="prettyprint"&gt;//&amp;nbsp;var&amp;nbsp;a&amp;nbsp;=&amp;nbsp;require(&amp;quot;test0.js&amp;quot;);&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;'&amp;lt;a&amp;gt;&amp;lt;b&amp;gt;&amp;lt;c&amp;gt;aaaa&amp;lt;/c&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;b&amp;gt;&amp;lt;c&amp;gt;bbbb&amp;lt;/c&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;';&lt;br /&gt;&lt;br /&gt;var&amp;nbsp;xml&amp;nbsp;=&amp;nbsp;new&amp;nbsp;XML(i);&lt;br /&gt;&lt;br /&gt;//print(xml.a.b.c[1].toString());&lt;br /&gt;//print(xml.a.b.c[1]);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;何故か先頭要素を省いたものが正解&lt;br /&gt;print(xml.b.c[1]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;エラーは以下のとおり。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D:\work\blog-gae&gt;ant rhino-run -Dscript="work\e4x.js"&lt;br /&gt;Buildfile: build.xml&lt;br /&gt;&lt;br /&gt;rhino-run:&lt;br /&gt;  [echo] Running work\e4x.js&lt;br /&gt;  [java] js: uncaught JavaScript runtime exception: ReferenceError: "XML" is  not defined.&lt;br /&gt;  [java]&lt;br /&gt;&lt;br /&gt;BUILD FAILED&lt;br /&gt;D:\work\blog-gae\build.xml:141: Java returned: 3&lt;br /&gt;&lt;br /&gt;Total time: 1 second&lt;br /&gt;D:\work\blog-gae&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これは(やはり)classpathの問題のようで、以下のスクリプト(&lt;a href="http://d.hatena.ne.jp/m-hiyama/20090119/1232326111"&gt;コチラ&lt;/a&gt;を参考)でclasspathを出してみると、&lt;br /&gt;&lt;pre class="prettyprint"&gt;var&amp;nbsp;strConf&amp;nbsp;=&amp;nbsp;&amp;quot;java.class.path&amp;quot;;&lt;br /&gt;var&amp;nbsp;cwd&amp;nbsp;=&amp;nbsp;environment[strConf];&lt;br /&gt;cwd&amp;nbsp;=&amp;nbsp;cwd.replace(/;/g,&amp;nbsp;&amp;quot;\n&amp;quot;);&lt;br /&gt;print(strConf&amp;nbsp;+&amp;nbsp;&amp;quot;&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;cwd);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;antのものばかりで、肝心のjs.jarが出ない。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D:\work\blog-gae&amp;gt;ant&amp;nbsp;rhino-run&amp;nbsp;-Dscript=&amp;quot;work\env0.js&amp;quot;&lt;br /&gt;Buildfile:&amp;nbsp;build.xml&lt;br /&gt;&lt;br /&gt;rhino-run:&lt;br /&gt;&amp;nbsp;&amp;nbsp;[echo]&amp;nbsp;Running&amp;nbsp;work\env0.js&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;java.class.path&amp;nbsp;=&amp;nbsp;D:\work\apache-ant-1.7.1\bin\..\lib\ant-launcher.j&lt;br /&gt;ar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;d:\Documents&amp;nbsp;and&amp;nbsp;Settings\00962724\.ant\lib\ivy-2.0.0-rc2.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\apache-ant-1.7.1\lib\ant-antlr.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\apache-ant-1.7.1\lib\ant-apache-bcel.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\apache-ant-1.7.1\lib\ant-apache-bsf.jar&lt;br /&gt;snip&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\apache-ant-1.7.1\lib\xercesImpl.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\apache-ant-1.7.1\lib\xml-apis.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;C:\Program&amp;nbsp;Files\Java\jdk1.6.0_18\lib\tools.jar&lt;br /&gt;&lt;br /&gt;BUILD&amp;nbsp;SUCCESSFUL&lt;br /&gt;Total&amp;nbsp;time:&amp;nbsp;1&amp;nbsp;second&lt;br /&gt;D:\work\blog-gae&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;そこで、上記ターゲットにantを実行しているjvmとは別のvmで実行するようforkを入れると、&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;target&amp;nbsp;name=&amp;quot;rhino-run&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;property&amp;nbsp;name=&amp;quot;classes&amp;quot;&amp;nbsp;value=&amp;quot;war/WEB-INF/lib/js.jar:war/WEB-INF/lib/mailapi.jar:war/WEB-INF/lib/smtp.jar&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;echo&amp;nbsp;message=&amp;quot;Running&amp;nbsp;${script}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;java&amp;nbsp;&lt;font color="red"&gt;fork=&amp;quot;yes&amp;quot;&lt;/font&gt;&amp;nbsp;classname=&amp;quot;org.mozilla.javascript.tools.shell.Main&amp;quot;&amp;nbsp;classpath=&amp;quot;${classes}&amp;quot;&amp;nbsp;failonerror=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;arg&amp;nbsp;value=&amp;quot;${script}&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/arg&amp;gt;&lt;br /&gt;&amp;lt;/java&amp;gt;&lt;br /&gt;&amp;lt;/echo&amp;gt;&amp;lt;/property&amp;gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;うまくjs.jarが動くようになり、&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D:\work\blog-gae&amp;gt;ant&amp;nbsp;rhino-run&amp;nbsp;-Dscript=&amp;quot;work\env0.js&amp;quot;&lt;br /&gt;Buildfile:&amp;nbsp;build.xml&lt;br /&gt;&lt;br /&gt;rhino-run:&lt;br /&gt;&amp;nbsp;&amp;nbsp;[echo]&amp;nbsp;Running&amp;nbsp;work\env0.js&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;java.class.path&amp;nbsp;=&amp;nbsp;D:\work\blog-gae\war\WEB-INF\lib\js.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\blog-gae\war\WEB-INF\lib\mailapi.jar&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;D:\work\blog-gae\war\WEB-INF\lib\smtp.jar&lt;br /&gt;&lt;br /&gt;BUILD&amp;nbsp;SUCCESSFUL&lt;br /&gt;Total&amp;nbsp;time:&amp;nbsp;3&amp;nbsp;seconds&lt;br /&gt;D:\work\blog-gae&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e4xが正常に動作した。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;D:\work\blog-gae&amp;gt;ant&amp;nbsp;rhino-run&amp;nbsp;-Dscript=&amp;quot;work\e4x.js&amp;quot;&lt;br /&gt;Buildfile:&amp;nbsp;build.xml&lt;br /&gt;&lt;br /&gt;rhino-run:&lt;br /&gt;&amp;nbsp;&amp;nbsp;[echo]&amp;nbsp;Running&amp;nbsp;work\e4x.js&lt;br /&gt;&amp;nbsp;&amp;nbsp;[java]&amp;nbsp;bbbb&lt;br /&gt;&lt;br /&gt;BUILD&amp;nbsp;SUCCESSFUL&lt;br /&gt;Total&amp;nbsp;time:&amp;nbsp;1&amp;nbsp;second&lt;br /&gt;D:\work\blog-gae&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;検索すると意外にrhinoのバージョン問題か、などいろいろでるけど、1.7R1で正常に使えています&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7736903534546545123?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7736903534546545123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7736903534546545123'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/07/rhinoe4x.html' title='rhinoでe4xを使う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-9046299888664587547</id><published>2010-05-18T18:41:00.004+09:00</published><updated>2010-05-19T01:09:53.217+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mahout'/><title type='text'>Mahotをウェブアプリで使う</title><content type='html'>Jteamというサイトに、&lt;a href="http://blog.jteam.nl/2010/04/15/mahout-taste-part-two-getting-started/"&gt;サンプルアプリが公開されていた&lt;/a&gt;のでメモ。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;sampleのzipファイル(&lt;a href="http://blog.jteam.nl/wp-content/uploads/2010/04/taste-getting-started.zip"&gt;taste-getting-started.zip&lt;/a&gt;)をダウンロードして展開&lt;/li&gt;&lt;li&gt;Mavenを使って"mvn install"&lt;/li&gt;&lt;li&gt;ミネソタ大学の&lt;a href="http://www.grouplens.org/node/12"&gt;grouplens&lt;/a&gt;というラボから評価用データセット(&lt;a href="http://www.grouplens.org/system/files/ml-data_0.zip"&gt;ml-data_0.zip&lt;/a&gt;)を入手&lt;br /&gt;&lt;/li&gt;&lt;li&gt;どこかに立てたMySQLにテーブルを作る(taste-getting-started\src\main\resources\sql\initialize_movielens_db.sqlにて)&lt;br /&gt;　・この中でmovielensという名前でデータベースやユーザが作られる&lt;br /&gt;　・しかしこのとき作られるユーザはlocalhost縛りになるので注意('@%'に要変更)&lt;br /&gt;　・ロードするu.itemは変なディレクトリにあることになっているので要変更&lt;/li&gt;&lt;li&gt;taste-getting-started\src\main\webapp\WEB-INF\persistence-context.xmlの接続情報を変更&lt;/li&gt;&lt;li&gt;Mavenを使って"mvn jetty:run"&lt;/li&gt;&lt;/ol&gt;意外に簡単なのですが、あるべきMoviePage.htmlが入ってなく、、、かつ映画名が良く分からないので、それがレコメンドとして正しいのかの判断が不明です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-9046299888664587547?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9046299888664587547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9046299888664587547'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/05/mahot.html' title='Mahotをウェブアプリで使う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6429273096298806543</id><published>2010-03-22T09:18:00.005+09:00</published><updated>2010-03-22T09:29:14.397+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>appenginejsのアプリ初期化過程</title><content type='html'>最初のリクエストが飛んできたときに、&lt;a href="http://www.appenginejs.org/"&gt;appenginejs&lt;/a&gt;に同梱されている&lt;a href="http://github.com/gmosx/appengine/blob/master/java/src/org/appenginejs/JSGIServlet.java"&gt;JSGIServlet.java&lt;/a&gt;で行われていることをまとめておきます。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;コンテキストが作られる&lt;br /&gt;&lt;/li&gt;&lt;li&gt;narwhalの(engine個別の/ここではrhinoの)bootstrap.jsが実行される&lt;br /&gt;　ここでNARWHAL_HOMEはWEB-INF/packages/narwhalと決め打ち&lt;br /&gt;　その中で(NARWHAL_HOMEの)narwhal.jsが実行され環境が作られる&lt;/li&gt;&lt;li&gt;jackのservletハンドラ(proessメソッド)がrequireされる&lt;br /&gt;　アプリは(serviceメソッドから呼ばれ)このハンドラ内で実際に実行される&lt;/li&gt;&lt;li&gt;アプリのWEB-INF/src/jackconfig.jsがrequireされる&lt;br /&gt;　(web.xmlの)appとenvironmentに合わせた変数がexportされる&lt;/li&gt;&lt;li&gt;上記exportされた変数(environmentとapp)を使ってアプリが初期化される&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/25238059-6429273096298806543?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6429273096298806543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6429273096298806543'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/03/appenginejs.html' title='appenginejsのアプリ初期化過程'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8789949890982672422</id><published>2010-03-08T01:55:00.005+09:00</published><updated>2010-03-13T03:31:36.744+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>hotデプロイなGAE開発!</title><content type='html'>appenginejsでは、war\WEB-INF\jackconfig.jsの中でlocalとhostedという2つの稼働方法をexportしている。&lt;br /&gt;&lt;br /&gt;そして、同ディレクトリにあるweb.xmlの中でenvironmentという名前で指定して利用するのだが、&lt;FONT COLOR="Blue"&gt;これをlocalにしておけば、ソース修正が(jettyの再起動を行わずとも)反映できる&lt;/FONT&gt;ようになる。&lt;br /&gt;&lt;br /&gt;なお、jackconfig.jsというファイル、何かの設定ファイルのようだけどなんのことはなく、このファイルが、jack経由でJettyで実行されているだけである(このファイルのexports.app)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8789949890982672422?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8789949890982672422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8789949890982672422'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/03/hotgae.html' title='hotデプロイなGAE開発!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6383881880596747868</id><published>2010-03-07T02:26:00.008+09:00</published><updated>2010-03-08T01:52:00.835+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>appenginejsでtimezone</title><content type='html'>&lt;a href="http://tf0054-05.appspot.com/"&gt;blog-gae&lt;/a&gt;でのtimezone設定のやり方が分からず、ずっと時間表示がUTCだった。&lt;br /&gt;調べてみると起動するservletである&lt;a href="http://github.com/tlrobinson/jack-servlet/"&gt;jack-servlet&lt;/a&gt;を最新ソースではこの設定が可能になっていたので差し替え。&lt;br /&gt;&lt;br /&gt;ソースを落としたら、D:\work\blog-gaeに展開して、&lt;pre&gt;ant runserver&lt;/pre&gt;とするだけで、開発用サーバが8080ポートで上がります。ちなみに、WEB-INF\packages\narwhal\lib\sandbox.jsの6行目にある以下を修正すれば、配置場所は変更可能です(Windowsのディレクトリ記述がうまくパースできないようなので、このファイルは無理に改造しています)。&lt;pre&gt;var zzWork = 'd:\\work\\blog-gae\\war\\WEB-INF\\';&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-6383881880596747868?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6383881880596747868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6383881880596747868'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/03/appenginejstimezone.html' title='appenginejsでtimezone'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3524725445235792482</id><published>2010-03-06T22:47:00.003+09:00</published><updated>2010-03-07T02:30:41.438+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>blog-gae</title><content type='html'>&lt;a href="http://www.appenginejs.org/"&gt;appenginejs&lt;/a&gt;のサンプルが動いたので、&lt;a href="http://tf0054-05.appspot.com/blog-gae.zip"&gt;ソース&lt;/a&gt;を上げました。&lt;br /&gt;GAEって、普通にzipファイルを上げたらダウンロードできるようになるんですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3524725445235792482?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3524725445235792482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3524725445235792482'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/03/blog-gae.html' title='blog-gae'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5160507420037072280</id><published>2010-02-23T02:08:00.008+09:00</published><updated>2010-02-23T02:32:49.008+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>appenginejsでrunInTransaction!!</title><content type='html'>&lt;A HREF=http://www.appenginejs.org/"&gt;appenginejs&lt;/A&gt;で、どうしても出来なかった同一トランザクションでのdb登録がやっとできた。GAEでは同一トランザクションでのデータ更新は、&lt;br /&gt;・同じエンティティグループのエンティティ群しかダメ&lt;br /&gt;・(そのためには先に作ってる同一に入れたい)エンティティからキーをもらう必要あり&lt;br /&gt;このための記述が、昔はModelをnewするときの第一引数にキーを渡す方式だった(よう)だが、&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;FONT COLOR="red"&gt;×&lt;/FONT&gt;(昔)&lt;pre&gt;&lt;/i&gt;var objCom = new Comment(msg.key(),{&lt;br /&gt; msgRef:msg.key(),&lt;br /&gt; content: "This is test comment"&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;今のバージョンではプロパティに&lt;FONT COLOR="blue"&gt;parent&lt;/FONT&gt;と切ってそこにキーを渡すことになっている。&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;FONT COLOR="red"&gt;○&lt;/FONT&gt;(今)&lt;pre&gt;&lt;/i&gt;var objCom = new Comment({&lt;br /&gt; parent:msg.key(),&lt;br /&gt; msgRef:msg.key(),&lt;br /&gt; content: "This is test comment"&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで、以下のような一括更新が成功するようになる！！&lt;br /&gt;&lt;pre&gt;db.runInTransaction(function() {&lt;br /&gt; db.put([objCom,msg]);&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちなみに、&lt;br /&gt;&lt;FONT COLOR="blue"&gt;agl0ZjAwNTQtMDZyDQsSB01lc3NhZ2UYCQw&lt;/FONT&gt;&lt;br /&gt;というキーを与えたら、&lt;br /&gt;&lt;FONT COLOR="blue"&gt;agl0ZjAwNTQtMDZyGgsSB01lc3NhZ2UYCQw&lt;/FONT&gt;&lt;FONT COLOR="red"&gt;LEgdDb21tZW50GAoM&lt;/FONT&gt;&lt;br /&gt;というキーを持った(同一エンティティグループに入った)エンティティができている。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5160507420037072280?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5160507420037072280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5160507420037072280'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/02/appenginejsrunintransaction.html' title='appenginejsでrunInTransaction!!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8942349684815592754</id><published>2010-02-13T01:07:00.004+09:00</published><updated>2010-02-15T01:18:58.665+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><title type='text'>App Engine JavaScript SDK</title><content type='html'>GAEのアプリを&lt;a href="http://www.appenginejs.org/"&gt;Javascriptで書けるSDK"appenginejs"&lt;/a&gt;というのがあるのだけど、公開されているサンプルアプリ(&lt;a href="http://www.nitrojs.org/appenginejs/blog-gae.tar.gz"&gt;blog-gae&lt;/a&gt;)をWindowsで動かすのにえらく苦労したのでメモ。&lt;br /&gt;&lt;br /&gt;"app is not function"とかエラーがでるがこれはウソ。&lt;br /&gt;で、やることは大きく2つ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;パスがうまく取り込めないので置換する(配置場所に合わせて適宜変えて下さい)。&lt;/span&gt;&lt;br /&gt;変更するファイルは"blog-gae\war\WEB-INF\packages\narwhal\lib\sandbox.js"の1つだけ。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    loader.find = function (topId) {&lt;br /&gt; if(topId.match(/\-gae/)){&lt;br /&gt; var zztmp = new Array();&lt;br /&gt;  //zztmp = topId.match(/([^\\]+)$/);&lt;br /&gt;  zztmp = topId.match(/INF\\(.+)$/);&lt;br /&gt;  topId  = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];&lt;br /&gt; }&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;    self.find = function (topId) {&lt;br /&gt; if(topId.match(/\-gae/)){&lt;br /&gt;  var zztmp = new Array();&lt;br /&gt;  zztmp = topId.match(/INF\\(.+)$/);&lt;br /&gt;  topId  = 'd:\\work\\blog-gae\\war\\WEB-INF\\'+zztmp[1];&lt;br /&gt; }&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"\blog-gae\war\WEB-INF\src"は本来classesへのシンボリックリンク。&lt;/span&gt;&lt;br /&gt;なのだけど、Windowsなのでこれはclassesをsrcという別名でコピーしておく。&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/25238059-8942349684815592754?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8942349684815592754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8942349684815592754'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/02/app-engine-javascript-sdk.html' title='App Engine JavaScript SDK'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4841128617604192586</id><published>2010-01-11T23:46:00.003+09:00</published><updated>2010-01-11T23:59:34.232+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haXe'/><title type='text'>[haXe] aswingを使う(ウィンドウ内に描画)</title><content type='html'>同様にhaXeにてaswingのウィンドウ内に絵を描く(linetoなど)には、FrameのContainerをとって、そこに、絵が描かれたGroudDecoratorをBackgroundDecoratorとしてセット、するみたいです。。。&lt;a href="http://thiswind.flashseer.org/?p=22"&gt;中国のaswingサイトに例&lt;/a&gt;がありました。&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0s8U7YyfCI/AAAAAAAAAJE/QyOnCJ9AT7Y/s1600-h/as.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 270px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0s8U7YyfCI/AAAAAAAAAJE/QyOnCJ9AT7Y/s320/as.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5425496506334608418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;import&amp;nbsp;flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.aswing.ASColor;&lt;br /&gt;import&amp;nbsp;org.aswing.Component;&lt;br /&gt;import&amp;nbsp;org.aswing.Container;&lt;br /&gt;import&amp;nbsp;org.aswing.JFrame;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.Graphics2D;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.IBrush;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.SolidBrush;&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;FillTest&amp;nbsp;extends&amp;nbsp;Sprite&lt;br /&gt;{&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;new()&lt;br /&gt; {&lt;br /&gt;  super();&lt;br /&gt;  var&amp;nbsp;frame:JFrame&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JFrame(this);&lt;br /&gt;  frame.setSizeWH(400,&amp;nbsp;370);&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;c:Container&amp;nbsp;=&amp;nbsp;frame.getContentPane();&lt;br /&gt;  c.setBackgroundDecorator(new&amp;nbsp;MyCanvas());&lt;br /&gt;&lt;br /&gt;  frame.show();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.aswing.GroundDecorator;&lt;br /&gt;import&amp;nbsp;flash.display.Shape;&lt;br /&gt;import&amp;nbsp;org.aswing.Component;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.Graphics2D;&lt;br /&gt;import&amp;nbsp;org.aswing.geom.IntRectangle;&lt;br /&gt;import&amp;nbsp;flash.display.DisplayObject;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.IBrush;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.SolidBrush;&lt;br /&gt;import&amp;nbsp;org.aswing.ASColor;&lt;br /&gt;import&amp;nbsp;org.aswing.graphics.GradientBrush;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;flash.geom.Matrix;&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;MyCanvas&amp;nbsp;implements&amp;nbsp;GroundDecorator&amp;nbsp;{&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;shape:Shape;&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;H_GAP:UInt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;V_GAP:UInt;&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;WIDTH:UInt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;HEIGHT:UInt;&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;new()&lt;br /&gt; {&lt;br /&gt;  shape&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Shape();&lt;br /&gt;&lt;br /&gt;  H_GAP&amp;nbsp;=&amp;nbsp;10;&lt;br /&gt;  V_GAP&amp;nbsp;=&amp;nbsp;10;&lt;br /&gt;&lt;br /&gt;  WIDTH&amp;nbsp;=&amp;nbsp;100;&lt;br /&gt;  HEIGHT&amp;nbsp;=&amp;nbsp;100;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;updateDecorator(com:Component,&amp;nbsp;g:Graphics2D,&amp;nbsp;bounds:IntRectangle):Void&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;g2:Graphics2D&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Graphics2D(this.shape.graphics);&lt;br /&gt;  g2.clear();&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;rectBounds:IntRectangle&amp;nbsp;=&amp;nbsp;new&amp;nbsp;IntRectangle();&lt;br /&gt;&lt;br /&gt;  //fill&amp;nbsp;solid&amp;nbsp;rect&lt;br /&gt;&lt;br /&gt;  rectBounds.x&amp;nbsp;=&amp;nbsp;bounds.x&amp;nbsp;+&amp;nbsp;H_GAP;&lt;br /&gt;  rectBounds.y&amp;nbsp;=&amp;nbsp;bounds.y&amp;nbsp;+&amp;nbsp;V_GAP;&lt;br /&gt;  rectBounds.width&amp;nbsp;=&amp;nbsp;WIDTH;&lt;br /&gt;  rectBounds.height&amp;nbsp;=&amp;nbsp;HEIGHT;&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;solidBrush:IBrush&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SolidBrush(ASColor.RED);&lt;br /&gt;  g2.fillRectangle(solidBrush,&amp;nbsp;rectBounds.x,&amp;nbsp;rectBounds.y,&amp;nbsp;rectBounds.width,&amp;nbsp;rectBounds.height);&lt;br /&gt;&lt;br /&gt;  //fill&amp;nbsp;liner&amp;nbsp;grandient&amp;nbsp;rect&lt;br /&gt;&lt;br /&gt;  rectBounds.y&amp;nbsp;+=&amp;nbsp;HEIGHT;&amp;nbsp;//&amp;nbsp;move&amp;nbsp;shape&amp;nbsp;rect&lt;br /&gt;  rectBounds.y&amp;nbsp;+=&amp;nbsp;V_GAP;&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;colors:Array&amp;lt;UInt&amp;gt;&amp;nbsp;=&amp;nbsp;[0x000000,&amp;nbsp;0xFF0000,&amp;nbsp;0x00FF00,&amp;nbsp;0x0000FF,&amp;nbsp;0x000000];&lt;br /&gt;  var&amp;nbsp;alphas:Array&amp;lt;Int&amp;gt;&amp;nbsp;=&amp;nbsp;[0,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;1,&amp;nbsp;0];&lt;br /&gt;  var&amp;nbsp;ratios:Array&amp;lt;Int&amp;gt;&amp;nbsp;=&amp;nbsp;[0x00,&amp;nbsp;0x3F,&amp;nbsp;0x7E,&amp;nbsp;0xBD,&amp;nbsp;0xFF];&lt;br /&gt;  var&amp;nbsp;matrix:Matrix&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Matrix();&lt;br /&gt;&lt;br /&gt;  matrix.createGradientBox(rectBounds.width,&amp;nbsp;rectBounds.height,&amp;nbsp;0,&amp;nbsp;rectBounds.x,&amp;nbsp;rectBounds.y);&lt;br /&gt;  var&amp;nbsp;linear:IBrush&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GradientBrush(GradientBrush.LINEAR,&amp;nbsp;colors,&amp;nbsp;alphas,&amp;nbsp;ratios,&amp;nbsp;matrix);&lt;br /&gt;&lt;br /&gt;  g.fillRectangle(linear,&amp;nbsp;rectBounds.x,&amp;nbsp;rectBounds.y,&amp;nbsp;rectBounds.width,&amp;nbsp;rectBounds.height);&lt;br /&gt;&lt;br /&gt;  //fill&amp;nbsp;radial&amp;nbsp;grandient&lt;br /&gt;&lt;br /&gt;  rectBounds.y&amp;nbsp;+=&amp;nbsp;HEIGHT;&amp;nbsp;//&amp;nbsp;move&amp;nbsp;shape&amp;nbsp;rect&lt;br /&gt;  rectBounds.y&amp;nbsp;+=&amp;nbsp;V_GAP;&lt;br /&gt;&lt;br /&gt;  matrix.createGradientBox(rectBounds.width,&amp;nbsp;rectBounds.height,&amp;nbsp;0,&amp;nbsp;rectBounds.x,&amp;nbsp;rectBounds.y);&lt;br /&gt;  var&amp;nbsp;radial:IBrush&amp;nbsp;=&amp;nbsp;new&amp;nbsp;GradientBrush(GradientBrush.RADIAL,&amp;nbsp;colors,&amp;nbsp;alphas,&amp;nbsp;ratios,&amp;nbsp;matrix);&lt;br /&gt;&lt;br /&gt;  g.fillRectangle(radial,&amp;nbsp;rectBounds.x,&amp;nbsp;rectBounds.y,&amp;nbsp;rectBounds.width,&amp;nbsp;rectBounds.height);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;getDisplay(c:Component):DisplayObject&amp;nbsp;{&lt;br /&gt;  return&amp;nbsp;this.shape;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;普通にSpriteをJFrameなどにaddChildもできますが、これでは折りたたんだときに表示が残るので。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4841128617604192586?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4841128617604192586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4841128617604192586'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/01/haxe-aswing_11.html' title='[haXe] aswingを使う(ウィンドウ内に描画)'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0s8U7YyfCI/AAAAAAAAAJE/QyOnCJ9AT7Y/s72-c/as.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6474397013925869557</id><published>2010-01-11T02:34:00.006+09:00</published><updated>2010-01-11T02:45:25.864+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haXe'/><title type='text'>[haXe] aswingを使う</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0oSKtj0TyI/AAAAAAAAAI8/5mjkvX_eJGU/s1600-h/aswing.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 300px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0oSKtj0TyI/AAAAAAAAAI8/5mjkvX_eJGU/s320/aswing.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5425168676358999842" /&gt;&lt;/a&gt;&lt;br /&gt;haXe(v2.04)でaswing(1_5というパック?)を使う例。&lt;br /&gt;&lt;pre class="prettyprint"&gt;/**&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Sample002.as&lt;br /&gt;&amp;nbsp;*&amp;nbsp;Thanks!!&amp;nbsp;-&amp;gt;&amp;nbsp;http://www.matzmtok.com/blog/?p=18&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.aswing.event.InteractiveEvent&amp;nbsp;;&lt;br /&gt;import&amp;nbsp;org.aswing.ASColor;&lt;br /&gt;import&amp;nbsp;org.aswing.Container;&lt;br /&gt;import&amp;nbsp;org.aswing.EmptyLayout;&lt;br /&gt;import&amp;nbsp;org.aswing.JSlider;&lt;br /&gt;import&amp;nbsp;org.aswing.JWindow;&lt;br /&gt;import&amp;nbsp;org.aswing.SoftBoxLayout;&lt;br /&gt;import&amp;nbsp;org.aswing.ButtonGroup;&lt;br /&gt;import&amp;nbsp;org.aswing.BoxLayout;&lt;br /&gt;import&amp;nbsp;org.aswing.BorderLayout;&lt;br /&gt;import&amp;nbsp;org.aswing.JLabel;&lt;br /&gt;import&amp;nbsp;org.aswing.JFrame;&lt;br /&gt;import&amp;nbsp;org.aswing.JPanel;&lt;br /&gt;import&amp;nbsp;org.aswing.JButton;&lt;br /&gt;import&amp;nbsp;org.aswing.JRadioButton;&lt;br /&gt;&lt;br /&gt;import&amp;nbsp;org.aswing.geom.IntPoint;&lt;br /&gt;import&amp;nbsp;org.aswing.geom.IntDimension;&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;Sample002&amp;nbsp;extends&amp;nbsp;JWindow{&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;rbX:JRadioButton;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;rbY:JRadioButton;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;group:ButtonGroup;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;zzlayout:BoxLayout;&lt;br /&gt; private&amp;nbsp;var&amp;nbsp;frame:JFrame;&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;var&amp;nbsp;bg:ButtonGroup;&lt;br /&gt; public&amp;nbsp;var&amp;nbsp;title:String;&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;new()&amp;nbsp;{&lt;br /&gt;  super(flash.Lib.current,&amp;nbsp;true);&lt;br /&gt;  title&amp;nbsp;=&amp;nbsp;'Example&amp;nbsp;of&amp;nbsp;BoxLayout';&lt;br /&gt;  initUI();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;function&amp;nbsp;initUI():Void&amp;nbsp;{&lt;br /&gt;  setBackground(new&amp;nbsp;ASColor(0xffffff));&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;rbPanel:JPanel&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JPanel();&lt;br /&gt;  rbX&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JRadioButton('BoxLayout.X_AXIS');&lt;br /&gt;  rbY&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JRadioButton('BoxLayout.Y_AXIS');&lt;br /&gt;  zzlayout&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BoxLayout();&lt;br /&gt;  rbX.addSelectionListener(onRadioChanged);&lt;br /&gt;  rbY.addSelectionListener(onRadioChanged);&lt;br /&gt;  rbX.setSelected(true);&lt;br /&gt;  group&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ButtonGroup();&lt;br /&gt;  group.append(rbX);&lt;br /&gt;  group.append(rbY);&lt;br /&gt;&lt;br /&gt;  rbPanel.append(new&amp;nbsp;JLabel('方向'));&lt;br /&gt;  rbPanel.append(rbX);&lt;br /&gt;  rbPanel.append(rbY);&lt;br /&gt;  rbPanel.setLocation(new&amp;nbsp;IntPoint(0,&amp;nbsp;0));&lt;br /&gt;  rbPanel.setSize(new&amp;nbsp;IntDimension(400,&amp;nbsp;30));&lt;br /&gt;&lt;br /&gt;  getContentPane().append(rbPanel);&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;gapPanel:JPanel&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JPanel();&lt;br /&gt;  gapPanel.append(new&amp;nbsp;JLabel('間隔'));&lt;br /&gt;&lt;br /&gt;  var&amp;nbsp;slider:JSlider&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JSlider(JSlider.HORIZONTAL,&amp;nbsp;0,&amp;nbsp;30,&amp;nbsp;0);&lt;br /&gt;  slider.addStateListener(onSliderChange);&lt;br /&gt;  gapPanel.append(slider);&lt;br /&gt;&lt;br /&gt;  gapPanel.setLocation(new&amp;nbsp;IntPoint(0,&amp;nbsp;20));&lt;br /&gt;  gapPanel.setSize(new&amp;nbsp;IntDimension(400,&amp;nbsp;30));&lt;br /&gt;  gapPanel.setBackground(new&amp;nbsp;org.aswing.ASColor(0xFF00FF));&amp;nbsp;//&amp;nbsp;効かない?&lt;br /&gt;  gapPanel.setToolTipText(&amp;quot;xxxTIPxxx&amp;quot;);&lt;br /&gt;  getContentPane().append(gapPanel);&lt;br /&gt;&lt;br /&gt;  frame&amp;nbsp;=&amp;nbsp;new&amp;nbsp;JFrame(this,&amp;nbsp;title);&lt;br /&gt;  getContentPane().append(frame);&lt;br /&gt;&lt;br /&gt;  frame.getContentPane().setLayout(zzlayout);&lt;br /&gt;  frame.setLocation(new&amp;nbsp;IntPoint(30,&amp;nbsp;50));&lt;br /&gt;  frame.setSize(new&amp;nbsp;IntDimension(250,&amp;nbsp;150));&lt;br /&gt;&lt;br /&gt;  //&amp;nbsp;たくさん並べるとよしなに幅や高さを等分してくれる&lt;br /&gt;  frame.getContentPane().append(new&amp;nbsp;JButton('Button&amp;nbsp;1'));&lt;br /&gt;  frame.getContentPane().append(new&amp;nbsp;JButton('Button&amp;nbsp;2'));&lt;br /&gt;  frame.getContentPane().append(new&amp;nbsp;JButton('Button&amp;nbsp;3'));&lt;br /&gt;  frame.getContentPane().append(new&amp;nbsp;JButton('Button&amp;nbsp;4'));&lt;br /&gt;&lt;br /&gt;  frame.show();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;onRadioChanged(e:InteractiveEvent):Void&amp;nbsp;{&lt;br /&gt;  var&amp;nbsp;rb:JRadioButton&amp;nbsp;=&amp;nbsp;cast(e.target,JRadioButton);&lt;br /&gt;&lt;br /&gt;  switch(rb){&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rbX:&lt;br /&gt;    zzlayout.setAxis(BoxLayout.X_AXIS);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;rbY:&lt;br /&gt;    zzlayout.setAxis(BoxLayout.Y_AXIS);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;    trace(&amp;quot;cannot&amp;nbsp;change&amp;nbsp;layout!&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;  updateLayout();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public&amp;nbsp;function&amp;nbsp;onSliderChange(e:InteractiveEvent):Void&amp;nbsp;{&lt;br /&gt;  var&amp;nbsp;s:JSlider&amp;nbsp;=&amp;nbsp;cast(e.target,JSlider);&lt;br /&gt;  zzlayout.setGap(s.getValue());&lt;br /&gt;  updateLayout();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private&amp;nbsp;function&amp;nbsp;updateLayout():Void&amp;nbsp;{&lt;br /&gt;  frame.getContentPane().setLayout(zzlayout);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これを、以下のように呼び出す。&lt;br /&gt;&lt;pre class="prettyprint"&gt;import&amp;nbsp;org.aswing.geom.IntPoint;&lt;br /&gt;import&amp;nbsp;org.aswing.geom.IntDimension;&lt;br /&gt;&lt;br /&gt;class&amp;nbsp;Main&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;function&amp;nbsp;main()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;    var&amp;nbsp;app:Sample002&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Sample002();&lt;br /&gt;    app.setLocation(new&amp;nbsp;IntPoint(0,&amp;nbsp;0));&lt;br /&gt;    app.setSize(new&amp;nbsp;IntDimension(500,&amp;nbsp;500));&lt;br /&gt;    app.show();&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;flash.Lib.current.addChild(new&amp;nbsp;Sample002());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちなみに、haxeコマンドに与えるcompile.hxmlはこんな感じ。&lt;br /&gt;&lt;pre class="prettyprint"&gt;-swf-header 500:500:20:FFFFFF&lt;br /&gt;-swf Main.swf&lt;br /&gt;-cp hxclasses&lt;br /&gt;-swf-lib concat.swf&lt;br /&gt;-swf-version 9&lt;br /&gt;-main Main&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/25238059-6474397013925869557?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6474397013925869557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6474397013925869557'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/01/haxe-aswing.html' title='[haXe] aswingを使う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0tSGvTIRZ7U/S0oSKtj0TyI/AAAAAAAAAI8/5mjkvX_eJGU/s72-c/aswing.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8567998924072779648</id><published>2010-01-06T03:14:00.005+09:00</published><updated>2010-01-06T03:19:28.147+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haXe'/><title type='text'>[haXe] haxelibが変?</title><content type='html'>haXeでは、swfにしたアセットライブラリは、"-swf-lib"オプションに指定するのだが、これが1つしか受け付けられない様子。画像ファイルのswfとflコンポーネントのswfを同時に使いたかったので、この2つのアセットswfを纏める方法。&lt;br /&gt;&lt;br /&gt;以下xmlを用意(ここではconcat.xmlとした)。&lt;br /&gt;&lt;blockquote&gt;&amp;lt;movie&amp;nbsp;width=&amp;quot;320&amp;quot;&amp;nbsp;height=&amp;quot;240&amp;quot;&amp;nbsp;framerate=&amp;quot;12&amp;quot;&amp;nbsp;version=&amp;quot;9&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;frame&amp;gt;&amp;lt;library&amp;gt;&lt;br /&gt;&amp;lt;clip&amp;nbsp;id=&amp;quot;foo&amp;quot;&amp;nbsp;import=&amp;quot;spectrum.swf&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;clip&amp;nbsp;id=&amp;quot;foo&amp;quot;&amp;nbsp;import=&amp;quot;component.swf&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/library&amp;gt;&amp;lt;/frame&amp;gt;&lt;br /&gt;&amp;lt;/movie&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;そして、swfmillを実行。&lt;br /&gt;&lt;blockquote&gt;&amp;gt; swfmill.exe simple concat.xml concat.swf&lt;/blockquote&gt;&lt;br /&gt;意外に簡単！xmlのwidthとかは適当で良いようです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8567998924072779648?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8567998924072779648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8567998924072779648'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2010/01/haxe-haxelib.html' title='[haXe] haxelibが変?'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4045409823088424330</id><published>2009-12-06T05:18:00.004+09:00</published><updated>2010-01-02T05:27:57.583+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haXe'/><title type='text'>[haXe] haxelibが変?</title><content type='html'>haXeでは、haxelibコマンドを使ってライブラリを簡単にインストールすることができるハズだが、Windows環境ではhscriptがうまく入れられなった。メッセージはこちら。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;In project: Unexpected element tag&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;この原因は2つある模様。&lt;br /&gt;&lt;br /&gt;1つはhaxelibのバグ。本家では&lt;a href="http://n2.nabble.com/Compiling-new-haxelib-must-be-missing-something-td3956806.html"&gt;解決済&lt;/a&gt;なので、最新ソースをCVSで取得後、コンパイルすることで無事入るようになります(一応、このコンパイル後haxelib.exeを&lt;a href="http://mantis.divers-high.com/work/public/haxelib.zip"&gt;置いておきます&lt;/a&gt;)。&lt;br /&gt;&lt;br /&gt;2つめはｍライブラリパスの問題なようで、以下設定をすることで動くようになるハズ。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;set HAXE_LIBRARY_PATH=c:\Program Files\Motion-Twin\haxe\std&lt;/blockquote&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/25238059-4045409823088424330?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4045409823088424330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4045409823088424330'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/12/haxe-haxelib.html' title='[haXe] haxelibが変?'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1944439477655073072</id><published>2009-11-24T04:11:00.003+09:00</published><updated>2009-11-24T04:13:45.794+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>[HIVE] Solrのexample/books.csvを</title><content type='html'>以下スキーマで(Solrのexamplesにある)books.csvをHIVEに取り込むことができる。&lt;br /&gt;&lt;br /&gt;create&amp;nbsp;table&amp;nbsp;books&amp;nbsp;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;id&amp;nbsp;STRING,&lt;br /&gt;&amp;nbsp;&amp;nbsp;cat&amp;nbsp;STRING,&lt;br /&gt;&amp;nbsp;&amp;nbsp;name&amp;nbsp;STRING,&lt;br /&gt;&amp;nbsp;&amp;nbsp;price&amp;nbsp;DOUBLE,&lt;br /&gt;&amp;nbsp;&amp;nbsp;inStock&amp;nbsp;BOOLEAN,&lt;br /&gt;&amp;nbsp;&amp;nbsp;author_t&amp;nbsp;STRING,&lt;br /&gt;&amp;nbsp;&amp;nbsp;series_t&amp;nbsp;STRING,&lt;br /&gt;&amp;nbsp;&amp;nbsp;sequence&amp;nbsp;INT,&lt;br /&gt;&amp;nbsp;&amp;nbsp;genre_s&amp;nbsp;STRING)&lt;br /&gt;&amp;nbsp;ROW&amp;nbsp;FORMAT&amp;nbsp;DELIMITED&amp;nbsp;FIELDS&amp;nbsp;TERMINATED&amp;nbsp;BY&amp;nbsp;','&lt;br /&gt;&amp;nbsp;LINES&amp;nbsp;TERMINATED&amp;nbsp;BY&amp;nbsp;'\n';&lt;br /&gt;&lt;br /&gt;取りこむのは以下コマンド。&lt;br /&gt;LOAD&amp;nbsp;DATA&amp;nbsp;INPATH&amp;nbsp;'/tmp/books.csv'&amp;nbsp;overwrite&amp;nbsp;into&amp;nbsp;table&amp;nbsp;books&amp;nbsp;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1944439477655073072?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1944439477655073072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1944439477655073072'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/solrexamplesbooks.html' title='[HIVE] Solrのexample/books.csvを'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7753808157269672845</id><published>2009-11-09T01:21:00.005+09:00</published><updated>2009-11-09T02:37:24.461+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>[HIVE] 日本語が。。。</title><content type='html'>jdkのエンコードのせいだと思うのだけど(コマンドラインでUTF8は見えるから)、HIVEのコンソールでは日本語が使えない。直接cygwinのコマンドラインでなら使えるので、まぁいいのだけど。&lt;br /&gt;&lt;br /&gt;$&amp;nbsp;/cygdrive/d/work/apache-hive/build/dist/bin/hive&amp;nbsp;-hiveconf&amp;nbsp;hadoop.bin.path=&amp;quot;bash&amp;nbsp;/cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop&amp;quot;&amp;nbsp;-e&amp;nbsp;&amp;quot;FROM&amp;nbsp;zip&amp;nbsp;z&amp;nbsp;insert&amp;nbsp;overwrite&amp;nbsp;directory&amp;nbsp;'/tmp/gina3'&amp;nbsp;SELECT&amp;nbsp;z.zip,&amp;nbsp;z.pref,&amp;nbsp;z.city,&amp;nbsp;z.town&amp;nbsp;&amp;nbsp;WHERE&amp;nbsp;z.ver&amp;nbsp;=&amp;nbsp;'2008-12-26'&amp;nbsp;AND&amp;nbsp;z.town&amp;nbsp;REGEXP&amp;nbsp;'銀座';&amp;quot;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.atmarkit.co.jp/fdb/single/s_hive/hive_06.html"&gt;@ITの記事&lt;/a&gt;を参考に練習中。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7753808157269672845?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7753808157269672845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7753808157269672845'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/hive_09.html' title='[HIVE] 日本語が。。。'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5173452340250117621</id><published>2009-11-08T02:30:00.000+09:00</published><updated>2009-11-24T02:32:09.618+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>[HIVE] HIVE上からHDFS操作</title><content type='html'>HIVE上からファイルを見るには。&lt;br /&gt;&lt;br /&gt;hive&amp;gt;&amp;nbsp;dfs&amp;nbsp;&amp;nbsp;-ls&amp;nbsp;/tmp;&lt;br /&gt;Found&amp;nbsp;10&amp;nbsp;items&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-24&amp;nbsp;02:27&amp;nbsp;/tmp/00962724&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-03&amp;nbsp;03:24&amp;nbsp;/tmp/cy&lt;br /&gt;-rw-r--r--&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2740&amp;nbsp;2009-11-23&amp;nbsp;23:44&amp;nbsp;/tmp/FirstTest.jar&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-09&amp;nbsp;01:21&amp;nbsp;/tmp/gina3&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-09&amp;nbsp;01:13&amp;nbsp;/tmp/ginza&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-24&amp;nbsp;02:25&amp;nbsp;/tmp/hadoop-00962724&lt;br /&gt;&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-09&amp;nbsp;01:21&amp;nbsp;/tmp/hive-00962724&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-09&amp;nbsp;00:16&amp;nbsp;/tmp/localfiles&lt;br /&gt;drwxr-xr-x&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;2009-11-09&amp;nbsp;01:08&amp;nbsp;/tmp/prefff.dat&lt;br /&gt;-rw-r--r--&amp;nbsp;&amp;nbsp;&amp;nbsp;1&amp;nbsp;00962724&amp;nbsp;mkgroup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6687150&amp;nbsp;2009-11-22&amp;nbsp;21:54&amp;nbsp;/tmp/sample.war&lt;br /&gt;hive&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5173452340250117621?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5173452340250117621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5173452340250117621'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/hive-hivehdfs.html' title='[HIVE] HIVE上からHDFS操作'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3001512069714244321</id><published>2009-11-07T03:07:00.000+09:00</published><updated>2009-11-24T03:08:45.024+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><title type='text'>[HIVE] HQLの関数を確認</title><content type='html'>意外に説明が充実してる。&lt;br /&gt;&lt;br /&gt;hive&amp;gt;&amp;nbsp;DESCRIBE&amp;nbsp;FUNCTION&amp;nbsp;EXTENDED&amp;nbsp;substr;&lt;br /&gt;OK&lt;br /&gt;substr(str,&amp;nbsp;pos[,&amp;nbsp;len])&amp;nbsp;-&amp;nbsp;returns&amp;nbsp;the&amp;nbsp;substring&amp;nbsp;of&amp;nbsp;str&amp;nbsp;that&amp;nbsp;starts&amp;nbsp;at&amp;nbsp;pos&amp;nbsp;and&amp;nbsp;is&lt;br /&gt;&amp;nbsp;of&amp;nbsp;length&amp;nbsp;len&lt;br /&gt;pos&amp;nbsp;is&amp;nbsp;a&amp;nbsp;1-based&amp;nbsp;index.&amp;nbsp;If&amp;nbsp;pos&amp;lt;0&amp;nbsp;the&amp;nbsp;starting&amp;nbsp;position&amp;nbsp;is&amp;nbsp;determined&amp;nbsp;by&amp;nbsp;counting&lt;br /&gt;&amp;nbsp;backwards&amp;nbsp;from&amp;nbsp;the&amp;nbsp;end&amp;nbsp;of&amp;nbsp;str.&lt;br /&gt;Example:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&amp;nbsp;SELECT&amp;nbsp;substr('Facebook',&amp;nbsp;5)&amp;nbsp;FROM&amp;nbsp;src&amp;nbsp;LIMIT&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;'book'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;gt;&amp;nbsp;SELECT&amp;nbsp;substr('Facebook',&amp;nbsp;-5)&amp;nbsp;FROM&amp;nbsp;src&amp;nbsp;LIMIT&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;'ebook'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;gt;&amp;nbsp;SELECT&amp;nbsp;substr('Facebook',&amp;nbsp;5,&amp;nbsp;1)&amp;nbsp;FROM&amp;nbsp;src&amp;nbsp;LIMIT&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;'b'&lt;br /&gt;Time&amp;nbsp;taken:&amp;nbsp;0.156&amp;nbsp;seconds&lt;br /&gt;hive&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3001512069714244321?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3001512069714244321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3001512069714244321'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/hive-hql.html' title='[HIVE] HQLの関数を確認'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1815530980594366414</id><published>2009-11-06T01:53:00.008+09:00</published><updated>2009-11-06T02:08:58.088+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>[HIVE] select出来た!</title><content type='html'>cygwinだと、HIVEからhadoopを呼び出すところで失敗する。なのでこのためにはhiveconfオプションにて、hadoopのまるママの実行文を書いておくべし。&lt;br /&gt;&lt;br /&gt;00962724@XXX&amp;nbsp;/cygdrive/d/work/apache-hive/build/dist/conf&lt;br /&gt;$&amp;nbsp;/cygdrive/d/work/apache-hive/build/dist/bin/hive&amp;nbsp;-hiveconf&amp;nbsp;hadoop.bin.path=&lt;nobr&gt;&lt;FONT COLOR="RED"&gt;&amp;quot;bash&amp;nbsp;/cygdrive/d/work/apache-hadoop-0.19.2/bin/hadoop&amp;quot;&lt;/FONT&gt;&lt;/nobr&gt;&amp;nbsp;-e&amp;nbsp;&amp;quot;SELECT&amp;nbsp;a.foo&amp;nbsp;FROM&amp;nbsp;invites&amp;nbsp;a&amp;nbsp;WHERE&amp;nbsp;a.ds='2008-08-15';&amp;quot;&lt;br /&gt;&lt;br /&gt;また、以下のようなエラーがでるときはmetadataが壊れていた様子。&lt;br /&gt;&lt;br /&gt;Job&amp;nbsp;Submission&amp;nbsp;failed&amp;nbsp;with&amp;nbsp;exception&amp;nbsp;'java.lang.NullPointerException(null)'&lt;br /&gt;&lt;br /&gt;"drop table"して(このコマンドも失敗したけど、その後"show tables"してテーブルが無いようなら"create table"してloadすれば、うまく動くようになった！&lt;br /&gt;&lt;br /&gt;Hive&amp;nbsp;history&amp;nbsp;file=/tmp/00962724/hive_job_log_00962724_200911060205_2037141967.txt&lt;br /&gt;Total&amp;nbsp;MapReduce&amp;nbsp;jobs&amp;nbsp;=&amp;nbsp;1&lt;br /&gt;Number&amp;nbsp;of&amp;nbsp;reduce&amp;nbsp;tasks&amp;nbsp;is&amp;nbsp;set&amp;nbsp;to&amp;nbsp;0&amp;nbsp;since&amp;nbsp;there's&amp;nbsp;no&amp;nbsp;reduce&amp;nbsp;operator&lt;br /&gt;09/11/06&amp;nbsp;02:05:32&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Number&amp;nbsp;of&amp;nbsp;reduce&amp;nbsp;tasks&amp;nbsp;is&amp;nbsp;set&amp;nbsp;to&amp;nbsp;0&amp;nbsp;since&amp;nbsp;there's&amp;nbsp;no&amp;nbsp;reduce&amp;nbsp;operator&lt;br /&gt;09/11/06&amp;nbsp;02:05:32&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Using&amp;nbsp;org.apache.hadoop.hive.ql.io.HiveInputFormat&lt;br /&gt;09/11/06&amp;nbsp;02:05:32&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Processing&amp;nbsp;alias&amp;nbsp;a&lt;br /&gt;09/11/06&amp;nbsp;02:05:32&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Adding&amp;nbsp;input&amp;nbsp;file&amp;nbsp;file:/user/hive/warehouse/invites/ds=2008-08-15&lt;br /&gt;09/11/06&amp;nbsp;02:05:34&amp;nbsp;INFO&amp;nbsp;jvm.JvmMetrics:&amp;nbsp;Initializing&amp;nbsp;JVM&amp;nbsp;Metrics&amp;nbsp;with&amp;nbsp;processName=JobTracker,&amp;nbsp;sessionId=&lt;br /&gt;09/11/06&amp;nbsp;02:05:34&amp;nbsp;WARN&amp;nbsp;mapred.JobClient:&amp;nbsp;Use&amp;nbsp;GenericOptionsParser&amp;nbsp;for&amp;nbsp;parsing&amp;nbsp;the&amp;nbsp;arguments.&amp;nbsp;Applications&amp;nbsp;should&amp;nbsp;implement&amp;nbsp;Tool&amp;nbsp;for&amp;nbsp;the&amp;nbsp;same.&lt;br /&gt;09/11/06&amp;nbsp;02:05:34&amp;nbsp;INFO&amp;nbsp;mapred.FileInputFormat:&amp;nbsp;Total&amp;nbsp;input&amp;nbsp;paths&amp;nbsp;to&amp;nbsp;process&amp;nbsp;:&amp;nbsp;1&lt;br /&gt;Job&amp;nbsp;running&amp;nbsp;in-process&amp;nbsp;(local&amp;nbsp;Hadoop)&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Job&amp;nbsp;running&amp;nbsp;in-process&amp;nbsp;(local&amp;nbsp;Hadoop)&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;mapred.FileInputFormat:&amp;nbsp;Total&amp;nbsp;input&amp;nbsp;paths&amp;nbsp;to&amp;nbsp;process&amp;nbsp;:&amp;nbsp;1&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;mapred.MapTask:&amp;nbsp;numReduceTasks:&amp;nbsp;0&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;maximum&amp;nbsp;memory&amp;nbsp;=&amp;nbsp;1040515072&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;conf&amp;nbsp;classpath&amp;nbsp;=&amp;nbsp;[file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/,&amp;nbsp;file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar,&amp;nbsp;file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;thread&amp;nbsp;classpath&amp;nbsp;=&amp;nbsp;[file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/,&amp;nbsp;file:/D:/work/apache-hive/build/dist/lib/hive_exec.jar,&amp;nbsp;file:/D:/tmp/hadoop-00962724/hadoop-unjar3921453707640367881/classes]&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;Adding&amp;nbsp;alias&amp;nbsp;a&amp;nbsp;to&amp;nbsp;work&amp;nbsp;list&amp;nbsp;for&amp;nbsp;file&amp;nbsp;/user/hive/warehouse/invites/ds=2008-08-15/kv2.txt&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;dump&amp;nbsp;TS&amp;nbsp;struct&amp;lt;foo:int,bar:string,ds:string&amp;gt;&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&lt;br /&gt;&amp;lt;MAP&amp;gt;Id&amp;nbsp;=10&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TS&amp;gt;Id&amp;nbsp;=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;FIL&amp;gt;Id&amp;nbsp;=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;FIL&amp;gt;Id&amp;nbsp;=2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SEL&amp;gt;Id&amp;nbsp;=3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;FS&amp;gt;Id&amp;nbsp;=4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Parent&amp;gt;Id&amp;nbsp;=&amp;nbsp;3&amp;nbsp;&amp;lt;\Parent&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\FS&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Parent&amp;gt;Id&amp;nbsp;=&amp;nbsp;2&amp;nbsp;&amp;lt;\Parent&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\SEL&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Parent&amp;gt;Id&amp;nbsp;=&amp;nbsp;1&amp;nbsp;&amp;lt;\Parent&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\FIL&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Parent&amp;gt;Id&amp;nbsp;=&amp;nbsp;0&amp;nbsp;&amp;lt;\Parent&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\FIL&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\Children&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Parent&amp;gt;Id&amp;nbsp;=&amp;nbsp;10&amp;nbsp;&amp;lt;\Parent&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;\TS&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;\Children&amp;gt;&lt;br /&gt;&amp;lt;\MAP&amp;gt;&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;10&amp;nbsp;MAP&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;0&amp;nbsp;TS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;Operator&amp;nbsp;0&amp;nbsp;TS&amp;nbsp;initialized&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;Initializing&amp;nbsp;children&amp;nbsp;of&amp;nbsp;0&amp;nbsp;TS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;child&amp;nbsp;1&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;1&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Operator&amp;nbsp;1&amp;nbsp;FIL&amp;nbsp;initialized&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;children&amp;nbsp;of&amp;nbsp;1&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;child&amp;nbsp;2&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;2&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Operator&amp;nbsp;2&amp;nbsp;FIL&amp;nbsp;initialized&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initializing&amp;nbsp;children&amp;nbsp;of&amp;nbsp;2&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;Initializing&amp;nbsp;child&amp;nbsp;3&amp;nbsp;SEL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;3&amp;nbsp;SEL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;SELECT&amp;nbsp;struct&amp;lt;foo:int,bar:string,ds:string&amp;gt;&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;Operator&amp;nbsp;3&amp;nbsp;SEL&amp;nbsp;initialized&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;Initializing&amp;nbsp;children&amp;nbsp;of&amp;nbsp;3&amp;nbsp;SEL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Initializing&amp;nbsp;child&amp;nbsp;4&amp;nbsp;FS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Initializing&amp;nbsp;Self&amp;nbsp;4&amp;nbsp;FS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Writing&amp;nbsp;to&amp;nbsp;temp&amp;nbsp;file:&amp;nbsp;FS&amp;nbsp;file:/tmp/hive-00962724/1005059804/_tmp.10001/_tmp.attempt_local_0001_m_000000_0&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Operator&amp;nbsp;4&amp;nbsp;FS&amp;nbsp;initialized&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;4&amp;nbsp;FS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;3&amp;nbsp;SEL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;2&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;1&amp;nbsp;FIL&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;0&amp;nbsp;TS&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;Initialization&amp;nbsp;Done&amp;nbsp;10&amp;nbsp;MAP&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;forwarding&amp;nbsp;1&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;forwarding&amp;nbsp;1&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;forwarding&amp;nbsp;1&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;forwarding&amp;nbsp;1&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;forwarding&amp;nbsp;1&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;ExecMapper:&amp;nbsp;processing&amp;nbsp;1&amp;nbsp;rows:&amp;nbsp;used&amp;nbsp;memory&amp;nbsp;=&amp;nbsp;2369824&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;forwarding&amp;nbsp;10&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;forwarding&amp;nbsp;10&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;forwarding&amp;nbsp;10&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;forwarding&amp;nbsp;10&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;forwarding&amp;nbsp;10&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;ExecMapper:&amp;nbsp;processing&amp;nbsp;10&amp;nbsp;rows:&amp;nbsp;used&amp;nbsp;memory&amp;nbsp;=&amp;nbsp;2388056&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;forwarding&amp;nbsp;100&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;forwarding&amp;nbsp;100&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;forwarding&amp;nbsp;100&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;forwarding&amp;nbsp;100&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;forwarding&amp;nbsp;100&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:35&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;ExecMapper:&amp;nbsp;processing&amp;nbsp;100&amp;nbsp;rows:&amp;nbsp;used&amp;nbsp;memory&amp;nbsp;=&amp;nbsp;2388056&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;forwarded&amp;nbsp;500&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;DESERIALIZE_ERRORS:0&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;forwarded&amp;nbsp;500&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;forwarded&amp;nbsp;500&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;PASSED:500&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;FILTERED:0&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;forwarded&amp;nbsp;500&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;PASSED:500&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;FILTERED:0&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;forwarded&amp;nbsp;500&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;4&amp;nbsp;finished.&amp;nbsp;closing...&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;4&amp;nbsp;forwarded&amp;nbsp;0&amp;nbsp;rows&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Committed&amp;nbsp;to&amp;nbsp;output&amp;nbsp;file:&amp;nbsp;file:/tmp/hive-00962724/1005059804/_tmp.10001/attempt_local_0001_m_000000_0&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.SelectOperator:&amp;nbsp;3&amp;nbsp;Close&amp;nbsp;done&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;2&amp;nbsp;Close&amp;nbsp;done&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FilterOperator:&amp;nbsp;1&amp;nbsp;Close&amp;nbsp;done&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.TableScanOperator:&amp;nbsp;0&amp;nbsp;Close&amp;nbsp;done&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.MapOperator:&amp;nbsp;10&amp;nbsp;Close&amp;nbsp;done&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;ExecMapper:&amp;nbsp;ExecMapper:&amp;nbsp;processed&amp;nbsp;500&amp;nbsp;rows:&amp;nbsp;used&amp;nbsp;memory&amp;nbsp;=&amp;nbsp;2459320&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.TaskRunner:&amp;nbsp;Task:attempt_local_0001_m_000000_0&amp;nbsp;is&amp;nbsp;done.&amp;nbsp;And&amp;nbsp;is&amp;nbsp;in&amp;nbsp;the&amp;nbsp;process&amp;nbsp;of&amp;nbsp;commiting&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.LocalJobRunner:&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.TaskRunner:&amp;nbsp;Task&amp;nbsp;attempt_local_0001_m_000000_0&amp;nbsp;is&amp;nbsp;allowed&amp;nbsp;to&amp;nbsp;commit&amp;nbsp;now&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.FileOutputCommitter:&amp;nbsp;Saved&amp;nbsp;output&amp;nbsp;of&amp;nbsp;task&amp;nbsp;'attempt_local_0001_m_000000_0'&amp;nbsp;to&amp;nbsp;file:/tmp/hive-00962724/384798627&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.LocalJobRunner:&amp;nbsp;file:/user/hive/warehouse/invites/ds=2008-08-15/kv2.txt:0+5791&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;mapred.TaskRunner:&amp;nbsp;Task&amp;nbsp;'attempt_local_0001_m_000000_0'&amp;nbsp;done.&lt;br /&gt;2009-11-06&amp;nbsp;02:05:36,156&amp;nbsp;map&amp;nbsp;=&amp;nbsp;100%,&amp;nbsp;&amp;nbsp;reduce&amp;nbsp;=&amp;nbsp;0%&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;2009-11-06&amp;nbsp;02:05:36,156&amp;nbsp;map&amp;nbsp;=&amp;nbsp;100%,&amp;nbsp;&amp;nbsp;reduce&amp;nbsp;=&amp;nbsp;0%&lt;br /&gt;Ended&amp;nbsp;Job&amp;nbsp;=&amp;nbsp;job_local_0001&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.ExecDriver:&amp;nbsp;Ended&amp;nbsp;Job&amp;nbsp;=&amp;nbsp;job_local_0001&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Moving&amp;nbsp;tmp&amp;nbsp;dir:&amp;nbsp;file:/tmp/hive-00962724/1005059804/_tmp.10001&amp;nbsp;to:&amp;nbsp;file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate&lt;br /&gt;09/11/06&amp;nbsp;02:05:36&amp;nbsp;INFO&amp;nbsp;exec.FileSinkOperator:&amp;nbsp;Moving&amp;nbsp;tmp&amp;nbsp;dir:&amp;nbsp;file:/tmp/hive-00962724/1005059804/_tmp.10001.intermediate&amp;nbsp;to:&amp;nbsp;file:/tmp/hive-00962724/1005059804/10001&lt;br /&gt;OK&lt;br /&gt;Time&amp;nbsp;taken:&amp;nbsp;27.86&amp;nbsp;seconds&lt;br /&gt;&lt;br /&gt;00962724@XXX&amp;nbsp;/cygdrive/d/work/apache-hive/build/dist/conf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1815530980594366414?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1815530980594366414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1815530980594366414'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/hive-select.html' title='[HIVE] select出来た!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-9092823441886810424</id><published>2009-11-05T01:15:00.006+09:00</published><updated>2009-11-09T00:40:33.586+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HIVE'/><category scheme='http://www.blogger.com/atom/ns#' term='Hadoop'/><title type='text'>[HIVE] 準備が結構。。。</title><content type='html'>Hadoopも、JavaのScalaと同様に楽をしたいため&lt;a href="http://hadoop.apache.org/hive/"&gt;HIVE&lt;/a&gt;を使おうと思って準備。したのだけど結構はまったのでメモ。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;・Hadoopをインストール&lt;/span&gt;&lt;br /&gt;HIVEにするといってもHadoopは事前に入れておく必要がある様子。このときおとなしくcygwinを入れるべし。中でdfとか使うのでbash.exeなどを入れていても(それだけでは)途中でこける。&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;・HIVEをインストール&lt;/span&gt;&lt;br /&gt;&lt;a href="http://journal.mycom.co.jp/articles/2008/12/03/apacheivy/index.html"&gt;ivy&lt;/a&gt;(というmavenみたいな構成管理ツール)が曲者。というかtrunkをsvnで取ってきたのだけど、中でもう古い、たとえばv0.19.0みたいなHadoopをdownloadしようとしてしまう。なので以下2ファイルを書き替える必要があった。&lt;br /&gt;apache-hive\shims\ivy.xml&lt;br /&gt;apache-hive\shims\build.xml&lt;br /&gt;これらの中で、使いたいHadoopバージョンだけを残せばOK(私はv0.19.2だけを入れました)。あと、普通に入れると途中のHadoopダウンロードが遅いので、&lt;br /&gt;D:\work&gt;ant -Dhadoop.mirror="http://www.meisei-u.ac.jp/mirror/apache/dist" -Dhadoop.version=0.19.2 package&lt;br /&gt;のとおり、ダウンロードサイトを指定すると吉。&lt;br /&gt;&lt;br /&gt;補足：&lt;br /&gt;cygwinのv1.7をUTF8化する方法は&lt;a href="http://vmi.jp/software/cygwin/cygwin-wcwidth.html"&gt;こちら&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-9092823441886810424?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9092823441886810424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9092823441886810424'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/11/hive.html' title='[HIVE] 準備が結構。。。'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1151488303215284986</id><published>2009-10-25T16:59:00.004+09:00</published><updated>2009-10-25T17:04:36.695+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Solr] tikaを簡単に</title><content type='html'>curlを2回つなげると、簡単にウェブページを検索対象にできる。&lt;br /&gt;&lt;br /&gt;konpyuta:~/work&amp;nbsp;tf0054$&amp;nbsp;curl&amp;nbsp;-s&amp;nbsp;http://lucene.apache.org/tika/&amp;nbsp;|&amp;nbsp;curl&amp;nbsp;'http://localhost:8983/solr/update/extract?literal.id=doc5&amp;amp;literal.url=doc5&amp;amp;commit=true'&amp;nbsp;-F&amp;nbsp;&amp;quot;myfile=@-&amp;quot;&lt;br /&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;response&amp;gt;&lt;br /&gt;&amp;lt;lst&amp;nbsp;name=&amp;quot;responseHeader&amp;quot;&amp;gt;&amp;lt;int&amp;nbsp;name=&amp;quot;status&amp;quot;&amp;gt;0&amp;lt;/int&amp;gt;&amp;lt;int&amp;nbsp;name=&amp;quot;QTime&amp;quot;&amp;gt;76&amp;lt;/int&amp;gt;&amp;lt;/lst&amp;gt;&lt;br /&gt;&amp;lt;/response&amp;gt;&lt;br /&gt;konpyuta:~/work&amp;nbsp;tf0054$&amp;nbsp;&lt;br /&gt;&lt;br /&gt;ちなみに、&lt;a href="http://www.big.or.jp/~crane/cocoa/0800_internet/curl/"&gt;curlの"-F"オプション&lt;/a&gt;で指定ファイルをPOSTすることができる(ココでは前のcurlから受け取ったSTDINを流すために"-"で受けている)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1151488303215284986?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1151488303215284986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1151488303215284986'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/10/solr-tika.html' title='[Solr] tikaを簡単に'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4076122479464060340</id><published>2009-10-03T02:17:00.007+09:00</published><updated>2009-10-03T03:57:37.626+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Android] BlueLoggerを公開しました</title><content type='html'>まだまだお恥ずかしいレベルですが、AndroidでBluetooth通信を使って疑似的に「すれちがい通信」ぽいことを行うアプリを作ってADC2に出していたので、マーケットにも&lt;a href="http://jp.androlib.com/android.application.com-digipepper-bluelogger-qFwz.aspx"&gt;公開&lt;/a&gt;してみました(もちろんScalaで書いています)。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_0tSGvTIRZ7U/SsY1zFxTAxI/AAAAAAAAAIk/k1xBaqshJwk/s1600-h/device.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 214px; height: 320px;" src="http://4.bp.blogspot.com/_0tSGvTIRZ7U/SsY1zFxTAxI/AAAAAAAAAIk/k1xBaqshJwk/s320/device.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5388053156033921810" /&gt;&lt;/a&gt;&lt;br /&gt;Twitter連携としては「&lt;a href="http://code.google.com/p/droidsensor/"&gt;すれちがったー&lt;/a&gt;」さんが抜群のバランス感なのでアレですが、一応Twidroidを入れてあると連携してTweetも打てます。&lt;br /&gt;&lt;br /&gt;ただ、、いかんせんHT-03A同士で実験をしていないので、、お互いうまく発見できるか分かりません。。が。ぜひ使えたら、また使えなかったりバグっていたら教えて下さい!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4076122479464060340?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4076122479464060340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4076122479464060340'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/10/android-bluelogger.html' title='[Android] BlueLoggerを公開しました'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_0tSGvTIRZ7U/SsY1zFxTAxI/AAAAAAAAAIk/k1xBaqshJwk/s72-c/device.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8638247861383267282</id><published>2009-09-24T05:09:00.002+09:00</published><updated>2009-09-24T05:13:40.610+09:00</updated><title type='text'>[Linux] フィード取得の偽装に関して</title><content type='html'>blogspotユーザのフィード(atomで吐いている)を解析、画像のソースを本文に引っ付けて戻す事で、その記事ページに行かなくてもリーダ上で画像を見られるようにしたい。のだけど、atomで&amp;lt;img&amp;nbsp;src=&amp;quot;〜&amp;quot;&amp;gt;〜&amp;lt;/img&amp;gt;をきちんと処理してもらうには、どうすれば良いのか分からない。。。atom:contentでcdata付けてみたけどダメ。あ、cdata付けるからだめなのかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8638247861383267282?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8638247861383267282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8638247861383267282'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/09/linux.html' title='[Linux] フィード取得の偽装に関して'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6166470826146006616</id><published>2009-09-10T04:45:00.003+09:00</published><updated>2009-09-10T04:55:12.200+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><category scheme='http://www.blogger.com/atom/ns#' term='gosen'/><title type='text'>[Solr] GoSenをまた修正!</title><content type='html'>Luceneが2.9-rc2になったからか、またSolrでgosenが動かなくなっていたので修正しました。&lt;br /&gt;&lt;a href="http://mantis.divers-high.com/work/public/lucene-ja/lucene-ja-gosen-1.0.2.zip"&gt;lucene-ja-gosen-1.0.2.zip&lt;/a&gt;として置いておきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-6166470826146006616?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6166470826146006616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6166470826146006616'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/09/solr-gosen.html' title='[Solr] GoSenをまた修正!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1862871434363185160</id><published>2009-08-29T03:47:00.003+09:00</published><updated>2009-08-29T03:53:41.547+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Android] サブメニューの作成</title><content type='html'>androidでメニューをXMLで書くときの、サブメニュー(クリックしたら更にその中から表示されるメニュー。選択肢だけが画面中央にでる)は以下のように書きます。&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;menu&amp;nbsp;xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Sort&amp;quot;&amp;nbsp;android:title=&amp;quot;ソート&amp;quot;&lt;br /&gt;  android:icon=&amp;quot;@android:drawable/ic_menu_more&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;menu&amp;gt;&amp;nbsp;&lt;br /&gt;   &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Sort_1&amp;quot;&amp;nbsp;android:title=&amp;quot;すれ違い日時&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;   &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Sort_2&amp;quot;&amp;nbsp;android:title=&amp;quot;すれ違い回数&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/menu&amp;gt;&amp;nbsp;&lt;br /&gt; &amp;lt;/item&amp;gt;&lt;br /&gt; &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Input&amp;quot;&amp;nbsp;android:title=&amp;quot;入力&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt; &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Stop&amp;quot;&amp;nbsp;android:title=&amp;quot;停止&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt; &amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/main_Exit&amp;quot;&amp;nbsp;android:title=&amp;quot;終了&amp;quot;&lt;br /&gt;  android:icon=&amp;quot;@android:drawable/ic_menu_close_clear_cancel&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;/menu&amp;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/25238059-1862871434363185160?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1862871434363185160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1862871434363185160'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/08/android.html' title='[Android] サブメニューの作成'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1144020100890974068</id><published>2009-08-27T02:05:00.004+09:00</published><updated>2009-09-15T03:06:24.017+09:00</updated><title type='text'>[Scala] Antでfscを</title><content type='html'>Scalaはコンパイルが遅いので(Javaに比べて遅いかどうかは、Java開発をほぼしたことがないので不明)、Antでscalacタスクではなくfscタスクを使えるようにした。段どりは以下。&lt;br /&gt;&lt;br /&gt;・&lt;a href="http://www.scala-lang.org/docu/files/tools/fsc.html"&gt;fsc&lt;/a&gt;だけをコマンドで実行し常駐させる(helpが出る)&lt;br /&gt;・上がったデーモンのポート番号を調べる(※1)&lt;br /&gt;・それをファイルに書く(※2)&lt;br /&gt;・build.xmlのfscタスクでそれを指定(serverオプションにて)&lt;br /&gt;&lt;br /&gt;(※1)は以下にポート番号でファイルができるのでそれを見ます。&lt;br /&gt;d:\scala-2.7.5.final\var\scala-devel\scalac-compile-server-port&lt;br /&gt;&lt;br /&gt;不思議なことに、fscのデーモンさんはPCをスタンバイにすると死んでしまうようなので、そうなると(※2)を毎回やらなくてはならず不便。。&lt;br /&gt;&lt;br /&gt;今日&lt;a href="http://osima.jp/memo/using_javascript_in_ant.html"&gt;AntでJavascript実行&lt;/a&gt;ができることに気がついたので、(※1)も(※2)も、それで何とかできると思います。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;今のところ致し方無い。そもそもWindowsじゃなければ、こんな面倒なことはないのだけど。&lt;br /&gt;&lt;br /&gt;追伸2：&lt;br /&gt;以下でポート番号を動的にantから取れそうです(参考にさせて頂いた&lt;a href="http://d.hatena.ne.jp/m-hiyama/20090119/1232326111"&gt;ページ&lt;/a&gt;)。&lt;br /&gt;&lt;pre class="prettyprint"&gt; &amp;lt;target&amp;nbsp;name=&amp;quot;fileList&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;script&amp;nbsp;language=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;   &amp;lt;![CDATA[&lt;br /&gt;&lt;br /&gt;    ls();&lt;br /&gt;&lt;br /&gt;    function&amp;nbsp;ls()&amp;nbsp;{&lt;br /&gt;     var&amp;nbsp;curDir&amp;nbsp;=&amp;nbsp;(new&amp;nbsp;java.io.File(&amp;quot;/scala-2.7.5.final/var/scala-devel/scalac-compile-server-port&amp;quot;));&lt;br /&gt;     var&amp;nbsp;list&amp;nbsp;=&amp;nbsp;curDir.listFiles();&lt;br /&gt;     for&amp;nbsp;(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;list.length;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt;      print(baseName(list[i].toString()));&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function&amp;nbsp;baseName(path)&amp;nbsp;{&lt;br /&gt;     //&amp;nbsp;var&amp;nbsp;sep&amp;nbsp;=&amp;nbsp;environment[&amp;quot;file.separator&amp;quot;];&lt;br /&gt;     var&amp;nbsp;sep&amp;nbsp;=&amp;nbsp;&amp;quot;\\&amp;quot;;&lt;br /&gt;     var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;path.lastIndexOf(sep);&lt;br /&gt;     return&amp;nbsp;path.substring(i&amp;nbsp;+&amp;nbsp;1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;   ]]&amp;gt;&lt;br /&gt;  &amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;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/25238059-1144020100890974068?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1144020100890974068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1144020100890974068'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/08/scala-antfsc.html' title='[Scala] Antでfscを'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-67816739891038642</id><published>2009-08-17T01:20:00.003+09:00</published><updated>2009-09-03T01:21:07.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Scala] AndroidのHandlerとか</title><content type='html'>Scalaでのコーディングにおいては、特別な処理をしないなら&lt;a href="http://www.scala-lang.org/docu/files/api/scala/concurrent/ops$object.html"&gt;ops&lt;/a&gt;の&lt;a href="http://d.hatena.ne.jp/unageanu/20080617"&gt;future&lt;/a&gt;メソッドで別スレッドで処理を実行、結果は(Android的に正しく)Handlerのpostでメインスレッドに戻すのが正解な気がしています。&lt;br /&gt;&lt;br /&gt;、、と思っていたのですが、(futureで作ったかにかかわらないと思うけど)スレッド側でExceptionしててもログに出ない様子？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-67816739891038642?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/67816739891038642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/67816739891038642'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/08/scala-androidhandler.html' title='[Scala] AndroidのHandlerとか'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-2381843357302664064</id><published>2009-08-09T03:17:00.004+09:00</published><updated>2009-08-09T03:26:12.055+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Scala] UriMatcher</title><content type='html'>ScalaでAndroidプログラミングをして、&lt;a href="http://developer.android.com/reference/android/content/UriMatcher.html"&gt;UriMatcher&lt;/a&gt;のmatchメソッドが使えず困った。&lt;br /&gt;結局、matchが予約語だからバッククオート(`)で括ればOKでした。&lt;br /&gt;&lt;br /&gt;ふつう、URLのマッチをとってそれを(Scalaだから)さらにmatchでcaseしてゆく、、ので確かに、書きながらややこしいなぁ、とは思っていましたが。&lt;br /&gt;&lt;br /&gt;今はAndroid的売り(だと思う)ContentProviderを作ろうとしておりハマり中。マニフェストへ記述したら、なぜかClassNotFoundといわれてアプリごと起動不能に。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-2381843357302664064?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2381843357302664064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2381843357302664064'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/08/scala-urimatcher.html' title='[Scala] UriMatcher'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4003111995257944363</id><published>2009-07-19T22:58:00.003+09:00</published><updated>2009-07-19T23:02:37.196+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] JavaからScalaを</title><content type='html'>JavaからScalaで作ったクラスを使うサンプル。簡単すぎてか、以外にサンプルが無かったので載せてみる。&lt;br /&gt;&lt;pre class="prettyprint"&gt;konpyuta:~/work/j2s asummer$ cat javaMain.java &lt;br /&gt;class javaMain {&lt;br /&gt;  public static void main(String[] args){&lt;br /&gt;    scalaConv objScala = new scalaConv(args[0]);&lt;br /&gt;    System.out.println(objScala.getResult());&lt;br /&gt;    System.out.println(objScala);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;konpyuta:~/work/j2s asummer$ cat scalaConv.scala &lt;br /&gt;class scalaConv(tmpStr:String){&lt;br /&gt;  val tmpPre = "xxx&gt;";&lt;br /&gt;  def getResult = {&lt;br /&gt;    tmpPre + tmpStr;&lt;br /&gt;  }&lt;br /&gt;  override def toString = {&lt;br /&gt;    tmpPre + tmpStr;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;konpyuta:~/work/j2s asummer$ javac javaMain.java &lt;br /&gt;konpyuta:~/work/j2s asummer$ scalac scalaConv.scala&lt;br /&gt;konpyuta:~/work/j2s asummer$ java -cp ~/work/scala/lib/scala-library.jar:. javaMain test&lt;br /&gt;xxx&gt;test&lt;br /&gt;xxx&gt;test&lt;br /&gt;konpyuta:~/work/j2s asummer$ &lt;/pre&gt;おもいきりシームレス。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4003111995257944363?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4003111995257944363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4003111995257944363'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/07/scala-javascala.html' title='[Scala] JavaからScalaを'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5944322826939174412</id><published>2009-07-14T12:53:00.003+09:00</published><updated>2009-07-14T13:08:00.128+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Scala] HT-03AのUSB接続…</title><content type='html'>HT-03AをPCにUSBでつなげる際、普通にやるディスクドライブとして自動認識されてしまい、少しはまります。こんな時は、&lt;a href="http://groups.google.co.jp/group/android-developers/msg/bbff8436bfd23ce0"&gt;Android開発者MLに流れていたメッセージ&lt;/a&gt;を参考に、&lt;br /&gt;　・レジストリを消して&lt;br /&gt;　・端末で"設定＞アプリケーション＞開発＞デバッグ"をONに&lt;br /&gt;することで、無事SDK(r2)のUSBドライバにて接続し、デバイス番号が確認できるところまで進みました。でも、もしかすると初めて端末を接続する前に、端末のデバッグをONにしておけばよかったのかも、と思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5944322826939174412?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5944322826939174412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5944322826939174412'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/07/scala-ht-03ausb.html' title='[Scala] HT-03AのUSB接続…'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5380761635143611395</id><published>2009-07-07T00:09:00.007+09:00</published><updated>2009-07-14T13:05:11.073+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>[Scala] Androidアプリ!(センサーの実験など)</title><content type='html'>せっかくAndroid端末を&lt;a href="http://googlejapan.blogspot.com/2009/06/google-developer-day-2009-japan.html"&gt;GDD&lt;/a&gt;でもらったので、&lt;a href="http://d.hatena.ne.jp/yamashina/20090613/1244901811"&gt;yamashitaさん&lt;/a&gt;のアプリを以下改造しました。&lt;br /&gt;・せっかくなので売りのセンサーを使って(これは元から)&lt;br /&gt;・自前式では動きが気に食わなかったので物理エンジンを入れて&lt;br /&gt;・最近お気に入りの&lt;a href="http://ja.wikipedia.org/wiki/Scala"&gt;Scala&lt;/a&gt;で焼き直し&lt;br /&gt;・SDKも1.5にして&lt;br /&gt;そして、せっかくなので(汚いソースままですが)公開しておこうと思います(&lt;a href="http://code.google.com/p/ideathon/source/browse/#svn/trunk/20090704/MoveCircle"&gt;MoveCircle&lt;/a&gt;)。&lt;br /&gt;&lt;br /&gt;物理エンジンは&lt;a href="http://www.cove.org/ape/"&gt;APE&lt;/a&gt;が&lt;a href="http://blog.akaiho.com/2009/04/android%E3%81%A7%E7%89%A9%E7%90%86%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3/"&gt;ある程度Androidに移植されていた(testape2d.zip)&lt;/a&gt;ので取り込んでいます)。&lt;br /&gt;&lt;br /&gt;でも、SDK1.5のセンサーって、今は&lt;a href="http://code.google.com/p/openintents/wiki/SensorSimulator"&gt;シミュレータ&lt;/a&gt;で実験できないんですね(シミュレータといってもライブラリを入れるタイプで、そのライブラリが1.1仕様ママ)。実機じゃないとテストできないってちょっと。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5380761635143611395?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5380761635143611395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5380761635143611395'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/07/scala-android.html' title='[Scala] Androidアプリ!(センサーの実験など)'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7105117387873973739</id><published>2009-06-25T03:55:00.008+09:00</published><updated>2009-06-29T01:01:59.127+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] RichString!</title><content type='html'>動作は遅いのかもしれませんが、&lt;pre class="prettyprint"&gt;      val tmpStr:String = '^'+args(0)+".*";&lt;br /&gt;      val objStr = tmpStr.r;&lt;br /&gt;      println(aryTmp.filter{w =&gt; {&lt;br /&gt;        w match {&lt;br /&gt;          case objStr() =&gt; { true;}&lt;br /&gt;          case _ =&gt; { false; }&lt;br /&gt;        }&lt;br /&gt;      }}(0));&lt;br /&gt;&lt;/pre&gt;というのが、一行で書けるScalaの&lt;a href="http://scala-tools.org/scaladocs/scala-library/2.7.1/scala/runtime/RichString.html"&gt;RichString&lt;/a&gt;は、やはり魅力です。&lt;pre class="prettyprint"&gt;      println(aryTmp.filter{x =&gt; x.startsWith(args(0))});&lt;br /&gt;&lt;/pre&gt;特に意識せずに使う文字列型がコレ、というのはしかし、考えようによってはやり過ぎですが。。まぁLLと捉えればまったくありかと。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;　きちんと&lt;a href="http://www.scala-lang.org/docu/files/api/scala/runtime/RichString.html#split(Char)"&gt;split&lt;/a&gt;なんかもあって。本当にLL感覚でいけて嬉しいです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7105117387873973739?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7105117387873973739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7105117387873973739'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/scala-richstring.html' title='[Scala] RichString!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7679143597979298857</id><published>2009-06-21T16:08:00.006+09:00</published><updated>2009-06-21T16:19:47.201+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE/J'/><title type='text'>[Scala] GAE/JのMemcacheサービス</title><content type='html'>Scalaで、なぜかGAE/JのMemcacheサービスをJCacheを経由して使う方法が分からない。&lt;br /&gt;直接APIを使ってよいなら下のソースな感じで大丈夫なのだけど。&lt;br /&gt;&lt;pre class="prettyprint"&gt;import com.google.appengine.api.memcache._&lt;br /&gt;&lt;br /&gt;class memcached {&lt;br /&gt;  val cache:MemcacheService = MemcacheServiceFactory.getMemcacheService();&lt;br /&gt;&lt;br /&gt;  def setValue(strKey:String,strValue:String) = {&lt;br /&gt;   cache.put(strKey,strValue);    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def getValue(strKey:String):String = {&lt;br /&gt;   cache.get(strKey).asInstanceOf[String];    &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;JCache経由にしようとしたら、出てしまうエラー。Kってjava.util.Map&lt;K,V&gt;のKっぽいんだけど解決方法が分からない。。&lt;pre&gt;　～snip～&lt;br /&gt;   [scalac] D:\work\workspace\test\src\com\digipepper\memcached.scala:51: error:&lt;br /&gt; type mismatch;&lt;br /&gt;   [scalac]  found   : String&lt;br /&gt;   [scalac]  required: K&lt;br /&gt;   [scalac]             cache.put(key, value);&lt;br /&gt;   [scalac]                           ^&lt;br /&gt;　～snip～&lt;br /&gt;&lt;/pre&gt;お分かりの方は是非コメントください。一部ではGAE/JをPythonで使うべきかJavaで使うべきか、から発展した大変な議論が巻き起こったようですが、私はのんびりとScalaでがんばります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7679143597979298857?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7679143597979298857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7679143597979298857'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/scala-gaejmemcache.html' title='[Scala] GAE/JのMemcacheサービス'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4480570065983759208</id><published>2009-06-20T23:49:00.001+09:00</published><updated>2009-06-25T03:55:01.206+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE/J'/><title type='text'>[Scala] GAE/JのMailサービス</title><content type='html'>本文は普通に日本語文章を与えたらOK。サブジェクトだけ自分でいじることにしました。&lt;br /&gt;&lt;pre class="prettyprint"&gt;import java.util.Properties;&lt;br /&gt;&lt;br /&gt;import javax.mail.Message;&lt;br /&gt;import javax.mail.Session;&lt;br /&gt;import javax.mail.Transport;&lt;br /&gt;import javax.mail.MessagingException;&lt;br /&gt;import javax.mail.internet.AddressException;&lt;br /&gt;import javax.mail.internet.InternetAddress;&lt;br /&gt;import javax.mail.internet.MimeMessage;&lt;br /&gt;import javax.mail.internet.MimeUtility;&lt;br /&gt;&lt;br /&gt;class sendmail(strFrom:String) {&lt;br /&gt;&lt;br /&gt; var props:Properties = new Properties();&lt;br /&gt; var session:Session = Session.getDefaultInstance(props, null);&lt;br /&gt;&lt;br /&gt;  def send(strTo:String, strSubject:String, strBody:String) {&lt;br /&gt;  try {&lt;br /&gt;         var msg:Message = new MimeMessage(session);&lt;br /&gt;         msg.setFrom(new InternetAddress(strFrom));&lt;br /&gt;         msg.addRecipient(Message.RecipientType.TO,&lt;br /&gt;                          new InternetAddress(strTo, "Mr. User"));&lt;br /&gt;&lt;br /&gt;         msg.setSubject(MimeUtility.encodeText(strSubject,"iso-2022-jp","B"));&lt;br /&gt;         msg.setText(strBody+"\n");&lt;br /&gt; &lt;br /&gt;         Transport.send(msg);&lt;br /&gt;     &lt;br /&gt;  } catch {&lt;br /&gt;         case e:AddressException =&gt; printf("Exp_A(%s)\n", e.getMessage)&lt;br /&gt;         case e:MessagingException =&gt; printf("Exp_B(%s)\n", e.getMessage)&lt;br /&gt;         case e =&gt; e.printStackTrace&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/25238059-4480570065983759208?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4480570065983759208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4480570065983759208'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/scala-gaejmail.html' title='[Scala] GAE/JのMailサービス'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7273183267742032596</id><published>2009-06-20T19:54:00.004+09:00</published><updated>2009-06-25T03:55:01.206+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='GAE/J'/><title type='text'>[Scala] Eclipse+GAE/Jで最初にやること</title><content type='html'>GoogleAppEngineのアプリをEclipse+Scalaで開発するとき、ScalaとGAEのアドオンを入れた最初の状態では、GAEのEnhancerが失敗する(ファイルを保存する度にコンソールで「エンハンスするクラスファイルが見つからない/CLASSPATH変えろ」と言われ続ける)。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0tSGvTIRZ7U/Sjy_5XXTXlI/AAAAAAAAAGc/rUKdGh7lqis/s1600-h/desk.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/Sjy_5XXTXlI/AAAAAAAAAGc/rUKdGh7lqis/s320/desk.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5349361449654509138" /&gt;&lt;/a&gt;そんなときには、"eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.1.v200905131143\appengine-java-sdk-1.2.1\lib\tools\orm"など、GAEのプラグイン内のライブラリフォルダにScalaのライブラリを入れておくことで解決できます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7273183267742032596?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7273183267742032596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7273183267742032596'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/scala-eclipsegaej.html' title='[Scala] Eclipse+GAE/Jで最初にやること'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0tSGvTIRZ7U/Sjy_5XXTXlI/AAAAAAAAAGc/rUKdGh7lqis/s72-c/desk.PNG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7805663989317475173</id><published>2009-06-14T02:35:00.006+09:00</published><updated>2009-09-16T02:28:28.480+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><category scheme='http://www.blogger.com/atom/ns#' term='gosen'/><title type='text'>[Solr] GoSenを修正!</title><content type='html'>たぶん、全文検索ライブラリluceneに入った修正(&lt;a href="http://issues.apache.org/jira/browse/LUCENE-1636"&gt;LUCENE-1636&lt;/a&gt;)のために、&lt;a href="http://tf0054.blogspot.com/2009/04/solr-gosen.html"&gt;先のgosenセット&lt;/a&gt;がtrunkの&lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;が起動すら出来なくなっていました(IllegalAccessExceptionがPosFilter初期化時に発生!)。今日までupdateしてなかったので気が付かず。&lt;br /&gt;&lt;br /&gt;で、読めないJavaをなんとなく眺め、結局、本体の似たようなFilterのソースと同じ初期方法にかえる(superを呼ぶだけにする)ことで解消できている様子。なので、新&lt;a href="http://mantis.divers-high.com/work/public/lucene-ja/lucene-ja-gosen-1.0.2.zip"&gt;lucene-ja-gosenセット&lt;/a&gt;として置いておきます。&lt;br /&gt;&lt;br /&gt;よかったー。と直したのはいいけど、結局(Solrの)&lt;a href="http://wiki.apache.org/solr/Solr1.4"&gt;v1.4&lt;/a&gt;はいつ出るんだろう。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7805663989317475173?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7805663989317475173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7805663989317475173'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/gosen.html' title='[Solr] GoSenを修正!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-9024602939405895536</id><published>2009-06-08T00:11:00.000+09:00</published><updated>2009-06-08T00:11:07.665+09:00</updated><title type='text'>[Linux] libproxy</title><content type='html'>ブラウジングでロケーションが変わるとよく問題となる"Proxy情報(どうやったらインターネットにつなげるの?)の取得"は、当然アプリを自作するときもとても手間な部分です。これをサポートするライブラリが有りました。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/n/xy/q6/t94_bor_sha_f0f0f0.jpg" alt="http://code.google.com/p/libproxy/" title="libproxy - Google Code" width="351" height="52" style="border:none" usemap="#map_nxyq6t94"&gt;&lt;map name="map_nxyq6t94"&gt;&lt;area coords="2,5,37,42" href="http://code.google.com/p/libproxy/" alt="" shape="rect"&gt;&lt;area coords="49,8,133,28" href="http://code.google.com/p/libproxy/" alt="" shape="rect"&gt;&lt;area coords="49,29,337,39" href="http://code.google.com/p/libproxy/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/nxyq6t94"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;a href="http://d.hatena.ne.jp/keyword/WPAD"&gt;WPAD&lt;/a&gt;って規格もあるんですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-9024602939405895536?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9024602939405895536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9024602939405895536'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/06/linux-libproxy.html' title='[Linux] libproxy'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1855617044198240920</id><published>2009-05-31T03:47:00.002+09:00</published><updated>2009-05-31T06:57:50.134+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] GAE/JでJDO!</title><content type='html'>GoogleAppEngine/Javaではディスクが無いことからJDO/JPAでのデータ保存が必須です。&lt;br /&gt;&lt;br /&gt;これをピュアScalaで(Javaクラスを使わず)やっている例題&lt;a href="http://bitbucket.org/markryall/scalagae/"&gt;scalagae&lt;/a&gt;を見つけたのだが、うまく動かず苦労。&lt;br /&gt;&lt;br /&gt;原因は「java.lang.VerifyError」が出てしまうことだったのだが、これはJDO実装であるDataNucleusの&lt;a href="http://www.datanucleus.org/servlet/jira/browse/NUCENHANCER-34"&gt;バグ&lt;/a&gt;である様子。v1.1.3に入れ替えたら無事に動きました。&lt;br /&gt;具体的には、D:\appengine-java-sdk-1.2.1\lib\tools\ormにあるdatanucleus-enancer-1.1.0.jarが悪いので&lt;a href="http://www.datanucleus.org/downloads/maven-nightly/org.datanucleus/jars/"&gt;datanucleus-enhancer-1.1.3.jar&lt;/a&gt;に入れ替えます。&lt;br /&gt;&lt;br /&gt;あと、コマンドラインからGAEにuploadするとき、app_idはscalagae\WEB-INF\appengine-web.xmlに書かれるので、適宜書き換えましょう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1855617044198240920?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1855617044198240920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1855617044198240920'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/scala-gaejjdo.html' title='[Scala] GAE/JでJDO!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4582946576226515589</id><published>2009-05-30T06:19:00.001+09:00</published><updated>2009-05-31T06:57:31.927+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] GAE/J上でコンパイル!?</title><content type='html'>GAE/J上でコンパイル、JDOでバイトコードを保存、それを引き出して実行する、という機構を作ろうプロジェクトを&lt;a href="http://github.com/vydra/gae-scala/tree/master"&gt;見つけた&lt;/a&gt;。動くのかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4582946576226515589?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4582946576226515589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4582946576226515589'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/scala-gaej.html' title='[Scala] GAE/J上でコンパイル!?'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4725726809639532865</id><published>2009-05-29T06:53:00.000+09:00</published><updated>2009-05-31T06:57:50.134+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] PulpCore!</title><content type='html'>Javaの2Dレンダライブラリである&lt;a href="http://edtechdev.blogspot.com/2009/03/pulpcore-scala-sample-project-for.html"&gt;PlupCoreのScala版&lt;/a&gt;があった。何故ソース的に焼き直したのかまったく不明。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4725726809639532865?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4725726809639532865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4725726809639532865'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/scala-pulpcore.html' title='[Scala] PulpCore!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5637169422529022607</id><published>2009-05-27T00:36:00.003+09:00</published><updated>2009-06-01T02:25:02.137+09:00</updated><title type='text'>[Scala] Rail@GAE/J!</title><content type='html'>JRubyがあるわけなので、出来そうではありますが、普通に&lt;a href="http://d.hatena.ne.jp/technohippy/20090428#1240939733"&gt;ありました&lt;/a&gt;。すごい。&lt;br /&gt;&lt;br /&gt;ちなみに、Python版ではブログアプリ@GAEを&lt;a href="http://brizzled.clapper.org/id/77"&gt;見つけた&lt;/a&gt;のだが、これのJava版、もっというとScala版は無いものでしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5637169422529022607?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5637169422529022607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5637169422529022607'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/scala-railgaej.html' title='[Scala] Rail@GAE/J!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1238272510380398364</id><published>2009-05-24T23:32:00.003+09:00</published><updated>2009-07-01T06:12:25.124+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Solr] WebService::Solrが</title><content type='html'>自前でSolrのレスポンスを、&lt;a href="http://search.cpan.org/dist/XML-Simple/ "&gt;XML::Simple&lt;/a&gt;使って解析しようとして四苦八苦していたところ、、ふと思いついて調べてみたら、案の定&lt;a href="http://search.cpan.org/dist/WebService-Solr/"&gt;WebService::Solr&lt;/a&gt;なるものが。。&lt;br /&gt;&lt;br /&gt;早速書き直してみたところ、SolrのレスポンスのクセxXML::Simpleのクセにやられていた(例外処理ばかりだったコード)が、シンプルにんありました。&lt;br /&gt;&lt;br /&gt;最初から調べておけば。。。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;XMLじゃなくJSONのレスポンスを解析してますね、、なるほどー。そういえば、確かにJSON用CPANモジュールをいっぱいダウンロードしていました(&lt;a href="http://strawberryperl.com/"&gt;StrawberryPerl&lt;/a&gt;さいこうです)。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;英語の&lt;a href="http://infomotions.com/blog/2009/01/fun-with-webservicesolr-part-i-of-iii/"&gt;解説ページ&lt;/a&gt;を発見。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1238272510380398364?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1238272510380398364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1238272510380398364'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/solr-webservicesolr.html' title='[Solr] WebService::Solrが'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6719819990107685166</id><published>2009-05-17T01:10:00.006+09:00</published><updated>2009-05-31T06:58:02.382+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Lift] より簡素に!</title><content type='html'>Liftの勉強をしてます。Webなフレームワークって便利ですね。&lt;br /&gt;snippetで多用するbindについて、&lt;a href="http://blog.getintheloop.eu/2009/4/13/a-detailed-look-at-lift-s-view-code-binding-system"&gt;The Loopさん&lt;/a&gt;を参考に確認を。&lt;br /&gt;&lt;br /&gt;まず、以下の書き方がサンプル的に分かりやすいモノ。&lt;br /&gt;&lt;br /&gt;VIEW:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;lift:helloDB.tstForm&amp;nbsp;form=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:lines&amp;gt;Lines&amp;lt;/testBox:lines&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:desc&amp;gt;To&amp;nbsp;Do&amp;lt;/testBox:desc&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:submit&amp;gt;submit&amp;lt;/testBox:submit&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/lift:helloDB.tstForm&amp;gt;&lt;/pre&gt;SNIPPET:&lt;br /&gt;&lt;pre class="prettyprint"&gt;    def tstForm(argForm: NodeSeq) = {&lt;br /&gt;        // とりあえずモデルオブジェクトを作成(!)&lt;br /&gt;        val hellom = HelloModel.create;&lt;br /&gt;&lt;br /&gt;        // 入力を受け取り保存するかを判断&lt;br /&gt;        def checkAndSave(): Unit = hellom.validate match {&lt;br /&gt;            // S.noticeで&lt;lift:snippet type="msgs"/&gt;に値を出力&lt;br /&gt;            case Nil =&gt; hellom.save ; S.notice("Added "+hellom.desc)&lt;br /&gt;            case xs =&gt; S.error(xs) ; S.mapSnippet("helloDB.tstForm", doForm)&lt;br /&gt;            // S.redirectTo("/")は不要&lt;br /&gt;            // →何にせよ最後にdoFormしているから(再描画される)&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // テンプレートへバインドする関数&lt;br /&gt;        def doForm(argForm: NodeSeq) = {&lt;br /&gt;            bind("testBox", argForm,&lt;br /&gt;                 //"lines" -&gt; toShow.toString,&lt;br /&gt;                 "lines" -&gt; toShow, // toShowでXMLを返すようにするから&lt;br /&gt;                 "desc" -&gt; hellom.desc.toForm,&lt;br /&gt;                 "submit" -&gt; submit("SAVE", checkAndSave)); // ボタンもタグ必要&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // バインド実行(上の関数を)&lt;br /&gt;        doForm(argForm);&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;で、これをより簡単に書くと(HTML的な変更点はlabelで囲むこと)。&lt;br /&gt;&lt;br /&gt;VIEW:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;lift:helloDB.tstForm&amp;nbsp;form=&amp;quot;post&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:lines&amp;gt;Lines&amp;lt;/testBox:lines&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;label&amp;nbsp;for=&amp;quot;desc&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:desc&amp;gt;To&amp;nbsp;Do&amp;lt;/testBox:desc&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/label&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;testBox:submit&amp;gt;submit&amp;lt;/testBox:submit&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/lift:helloDB.tstForm&amp;gt;&lt;/pre&gt;SNIPPET:&lt;br /&gt;&lt;pre class="prettyprint"&gt;    def tstForm(argForm: NodeSeq): NodeSeq = {&lt;br /&gt;        val hellom = HelloModel.create;&lt;br /&gt;&lt;br /&gt;        bind("testBox",argForm,&lt;br /&gt;             "lines" -&gt; toShow, // toShowでXMLを返すようにするから&lt;br /&gt;             "desc" -&gt; SHtml.text(hellom.desc, hellom.desc(_)), // descカラムへ書込み&lt;br /&gt;             "submit" -&gt; SHtml.submit("SAVE", hellom.save)&lt;br /&gt;        )&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;なるほどー。かっこいい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-6719819990107685166?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6719819990107685166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6719819990107685166'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/lift_17.html' title='[Lift] より簡素に!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-92149446327748608</id><published>2009-05-04T02:52:00.007+09:00</published><updated>2009-05-04T03:42:05.800+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] DynamicVariableとは</title><content type='html'>&lt;a href="http://rainyday.blog.so-net.ne.jp/2007-08-16"&gt;ScalaでDSL&lt;/a&gt;ということで、&lt;a href="http://www.scala-lang.org/docu/files/api/scala/util/DynamicVariable.html"&gt;DynamicVariable&lt;/a&gt;について勉強中。あの記事においては、大体以下の流れであろうと思う。&lt;br /&gt;&lt;br /&gt;・&lt;a href="http://www.scala-lang.org/docu/files/api/scala/util/DynamicVariable.html"&gt;DynamicVariable&lt;/a&gt;のインスタンスであるoutは、withValueメソッドの引数で与えられたインスタンスを示すようになる(そのインスタンスに成り代わってしまうイメージ)&lt;br /&gt;・だから、outさんは共に与えられたパスでファイルを開いた_outさんになってしまう&lt;br /&gt;・そして、その与えられたブロック内で呼ばれたwriteメソッドは、オーバライドされたout.value.writeであるので、結局_outさんが書く事になる&lt;br /&gt;&lt;br /&gt;うーん。分かったような、分からんような。。withValueメソッドがset(そしてvalueがget)に相当していることは分かった。&lt;br /&gt;&lt;br /&gt;なお、ここでwriteが書かれているような、メソッドに渡されるブロック(＝クロージャ?/この表現も間違いな気がします)は、マニュアルではthunkとなっていた。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-92149446327748608?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/92149446327748608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/92149446327748608'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/lift-dynamicvalue.html' title='[Scala] DynamicVariableとは'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-226083042915860657</id><published>2009-05-01T23:56:00.004+09:00</published><updated>2009-06-06T11:54:48.362+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Lift] 作ってゆく流れは</title><content type='html'>基本的には以下流れ(&lt;a href="http://www.slideshare.net/yuroyoro/20081115-scala2-presentation?type=powerpoint)"&gt;yoroyoroさんライブコーディング資料&lt;/a&gt;から)。&lt;br /&gt;&lt;br /&gt;0.コアとなるデータモデルを定義(&lt;a href="http://scala-tools.org/scaladocs/liftweb/1.0/net/liftweb/mapper/MappedLongIndex.html"&gt;MappedLongIndex&lt;/a&gt;とかをextendsする)&lt;br /&gt;1.そのデータを記入するためのテンプレートを作成(webapp以下)&lt;br /&gt;2.そのテンプレートで使うsnippetを作成(＝入力フォーム)&lt;br /&gt;3.それをBootにPath登録(メニュー化+ACL)&lt;br /&gt;4.見るページのテンプレートを作る&lt;br /&gt;5.そこで必要となるsnippetを作る&lt;br /&gt;6.それをBootにPath登録&lt;br /&gt;&lt;br /&gt;1,2,3と4,5,6みたいに、テンプレート作ってsnippet当ててBootに入れる。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;Liftはやっぱり大きめですね。&lt;br /&gt;&lt;a href="http://code.google.com/p/sweetscala/"&gt;sweet&lt;/a&gt;というScalaで書かれたフレームワークもあるようで。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-226083042915860657?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/226083042915860657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/226083042915860657'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/05/lift.html' title='[Lift] 作ってゆく流れは'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5089121293511286812</id><published>2009-04-29T02:38:00.001+09:00</published><updated>2009-05-05T22:57:39.130+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] jettyが止まらない!?(netbeans)</title><content type='html'>ScalaのサポートはEclipseのpluginよりnetbeansのそれのほうが優れている(v6.5.1で見たとき)。&lt;br /&gt;が、netbeansでlift開発をするとき、起動したjettyを落とすことができない、、と思っていたら、やはりissueとして登録されており、暫定対処もある様子なのでメモ。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/6/cx/u4/x5a_bor_rou_ffeeee.jpg" alt="http://wiki.netbeans.org/TaT_ShutdownJettyStartedByMavenUsingNB" title="NetBeans Wiki: TaT_ShutdownJettyStartedByMavenUsingNB" width="334" height="90" style="border:none" usemap="#map_6cxu4x5a"&gt;&lt;map name="map_6cxu4x5a"&gt;&lt;area coords="121,63,267,77" href="http://www.mrhaki.com/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/6cxu4x5a"&gt;kwout&lt;/a&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/25238059-5089121293511286812?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5089121293511286812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5089121293511286812'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/scala-jettynetbeans.html' title='[Scala] jettyが止まらない!?(netbeans)'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8539555315547280243</id><published>2009-04-25T01:48:00.002+09:00</published><updated>2009-04-25T01:55:23.749+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] システムトレイで</title><content type='html'>システムトレイにアイコンを表示して、さらにメッセージボックスに日本語を出す実験。&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;import java.awt.AWTException;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;import java.awt.MenuItem;&lt;br /&gt;import java.awt.PopupMenu;&lt;br /&gt;import java.awt.SystemTray;&lt;br /&gt;import java.awt.TrayIcon;&lt;br /&gt;import java.awt.event.ActionEvent;&lt;br /&gt;import java.awt.event.ActionListener;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;import javax.imageio.ImageIO;&lt;br /&gt;&lt;br /&gt;object Alarm2 {&lt;br /&gt;    var clockImage:Image = ImageIO.read(new File("clock.png"));&lt;br /&gt;    var alarmImage:Image = ImageIO.read(new File("alarm.png"));;&lt;br /&gt;    var icon:TrayIcon = new TrayIcon(clockImage);&lt;br /&gt;&lt;br /&gt;    var alarmTime:Date = new Date();&lt;br /&gt;&lt;br /&gt;    def main(args : Array[String]){&lt;br /&gt;        var tray:SystemTray = SystemTray.getSystemTray();&lt;br /&gt;&lt;br /&gt;        var menu:PopupMenu = new PopupMenu();&lt;br /&gt;        var item:MenuItem = new MenuItem("表示");&lt;br /&gt;        item.addActionListener(new ActionListener() {&lt;br /&gt;                def actionPerformed(event:ActionEvent):Unit = {&lt;br /&gt;           icon.displayMessage("Alarm", "メッセージ!", TrayIcon.MessageType.INFO);&lt;br /&gt;                    println("message was displayed.");&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        menu.add(item);&lt;br /&gt;        item = new MenuItem("終了");&lt;br /&gt;        item.addActionListener(new ActionListener() {&lt;br /&gt;                def actionPerformed(event:ActionEvent):Unit = {&lt;br /&gt;                    System.exit(0);&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;        menu.add(item);&lt;br /&gt;&lt;br /&gt;        icon = new TrayIcon(clockImage, "アラーム", menu);&lt;br /&gt;        icon.setImage(alarmImage);&lt;br /&gt;&lt;br /&gt;        tray.add(icon);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.javainthebox.net/laboratory/JavaSE6/trayicon/trayicon.html"&gt;じゃじゃ馬さんを&lt;/a&gt;参考に。ちなみに画像も使わせて頂きました(&lt;a href="http://www.javainthebox.net/laboratory/JavaSE6/trayicon/src/alarm.png"&gt;*&lt;/a&gt;)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8539555315547280243?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8539555315547280243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8539555315547280243'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/scala.html' title='[Scala] システムトレイで'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7013844444265754147</id><published>2009-04-19T03:17:00.003+09:00</published><updated>2009-05-06T03:25:39.082+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] NB6.7とScala</title><content type='html'>v6.5ではmavenとの連携が悪い(環境変数を渡せない)ので、まだβではあるがv6.7へ移行。&lt;br /&gt;当初Scalaプラグインが動かず困っていたが、暫定対応版(&lt;a href="http://groups.google.com/group/scala-netbeans/browse_thread/thread/f08dde62a3cf5429"&gt;!?&lt;/a&gt;)を発見。&lt;br /&gt;&lt;br /&gt;updates.xml.gzはダウンロードするものではなく、NetBeansのツール＞プラグイン＞設定＞追加、で足して使う(使用可能なプラグインにScalaが出てくる)。&lt;br /&gt;&lt;br /&gt;今のところv6.5でやれていたメソッド補完などは無事に動いている(&lt;a href="http://tf0054.blogspot.com/2009/04/scala-jettynetbeans.html"&gt;Jettyが止まらない現象&lt;/a&gt;は(ある意味当然)v6.7にしても出続けているのでかっこ悪いがカスタムターゲットでjetty:stopする作戦をまま踏襲)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7013844444265754147?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7013844444265754147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7013844444265754147'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/scala-nb67scala.html' title='[Scala] NB6.7とScala'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-268716972735618391</id><published>2009-04-18T21:48:00.014+09:00</published><updated>2009-09-16T02:27:50.806+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><category scheme='http://www.blogger.com/atom/ns#' term='gosen'/><title type='text'>[Solr] GoSenを使う</title><content type='html'>Javaで形態素解析ライブラリはもうSenしかない状況、、だと思っていましたが、(ちょっと途中で投げ出されている感はあるものの)&lt;a href="http://tf0054.blogspot.com/2009/04/java-gosen.html"&gt;GoSen&lt;/a&gt;のほうが辞書作成もJavaだけでできる等、整備されていて良さそうです。&lt;br /&gt;ただ、Senはトークナイザだけを提供しているので、Solrで使うにはLucene-jaというのを別途取ってきて、そこに入っている"アナライザ"経由で使わなくてはなりません。&lt;br /&gt;つまり、(Lucene-jaの)アナライザが使うトークナイザを、SenからGoSenに変えればよい。。のですが、GoSenはSenから多少構成が変わっているため「ただjarを入れ替え」るだけでは動きません。&lt;br /&gt;&lt;br /&gt;細かくはまた別に書こうと思いますが、&lt;a href="http://hide-t.vox.com/library/post/gosen.html"&gt;hideakiさんのブログ&lt;/a&gt;を参考に、&lt;br /&gt;・Lucene-ja(のSenTokenizer.javaを)書き換え&lt;br /&gt;・無いと不便なbuild.xmlを作成&lt;br /&gt;とした&lt;a href="http://mantis.divers-high.com/work/public/lucene-ja/lucene-ja-gosen-1.0.2.zip"&gt;lucene-ja-gosenセット&lt;/a&gt;を作りましたので、上げておきます(JDK6で作ったので5で使うならlib以下にあるgosen.jarとか作り直しかも)。&lt;br /&gt;&lt;br /&gt;ちなみに、GoSenでもsen.xmlは必要ですが(厳密にはこれはLucene-ja側で使うファイルなので当たり前)、testdata/dictionary/dictionary.xmlをコピーして使えばOKです。&lt;br /&gt;&lt;br /&gt;簡単に使い方を。&lt;br /&gt;&lt;br /&gt;1.Lucene-ja-gosenをダウンロードして解凍(DIR-Aとする)&lt;br /&gt;2.中のGoSen.tgzをさらに解凍(DIR-Bとする)&lt;br /&gt;4.DIR-B/testdata/dictionaryへ移動してant(辞書作成)&lt;br /&gt;3.sen/confとディレクトリを掘る&lt;br /&gt;5.そのディレクトリへdictionaryで出来たファイルをコピー&lt;br /&gt;　cp *.sen sen/conf&lt;br /&gt;6.そのディレクトリへ以下リネームしてコピー&lt;br /&gt;　mv dictionary.xml sen/conf/sen.xml&lt;br /&gt;7.動かしたいSolrのWEB-INF/libへ移動して以下コピー(※追加参照)&lt;br /&gt;　cp DIR-A/lucene-ja-gosen*.jar (Solrの)WEB-INF/lib&lt;br /&gt;　cp DIR-B/lib/gosen*.jar (Solrの)WEB-INF/lib&lt;br /&gt;8.&lt;a href="http://blog.livedoor.jp/maru_tak/archives/cat_10013222.html#50644974"&gt;ココ&lt;/a&gt;を参考にSolrのschema.xmlへ組込み(senの場合と全く同じで)&lt;br /&gt;&lt;br /&gt;/sen/confは起動時の"-Dsen.home"指定を使いたくないからココにしているだけなので変更は可能です。が、辞書とsen.xmlは同じ場所に置きましょう。&lt;br /&gt;&lt;br /&gt;追加：&lt;br /&gt;　手順の7は、Solr自体がbuildできる状態なら、build.xmlと同じディレクトリにあるlib以下にこれらjarを入れておけば、適当に(WEB-INF/libに)はいるようなwarを作ってくれます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-268716972735618391?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/268716972735618391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/268716972735618391'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/solr-gosen.html' title='[Solr] GoSenを使う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4549006209521193567</id><published>2009-04-18T13:29:00.001+09:00</published><updated>2009-05-31T06:58:13.431+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Lift] JavaRebelを使う</title><content type='html'>&lt;a href="http://liftweb.net/"&gt;Lift&lt;/a&gt;のアプリに対しても、コンテナをTomcatにすれば、今はやりの(?)&lt;a href="shin1o.blogspot.com/2007/12/javarebel_08.html"&gt;JavaRebel&lt;/a&gt;を使ってホットデプロイを実現できるらしい。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/b/43/3s/2uk_bor_rou_ffeeee.jpg" alt="http://wiki.liftweb.net/index.php?title=JavaRebel#Tomcat" title="JavaRebel - LiftWiki" width="440" height="63" style="border:none" usemap="#map_b433s2uk"&gt;&lt;map name="map_b433s2uk"&gt;&lt;area coords="270,43,344,57" href="http://www.zeroturnaround.com/javarebel/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/b433s2uk"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;これで開発生産性(この単語は意味を持たなくなってきたけど)はあがりそうです、、、が、よく見るとJavaRebelって&lt;a href="http://www.componentsource.co.jp/products/javarebel/prices.html"&gt;商用&lt;/a&gt;なんですね。残念。。。&lt;br /&gt;&lt;br /&gt;補足：&lt;br /&gt;日本の方が、&lt;a href="http://d.hatena.ne.jp/scalar/20081014/1223957816"&gt;thick4&lt;/a&gt;というのを開発中な様子。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4549006209521193567?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4549006209521193567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4549006209521193567'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/lift-javarebel.html' title='[Lift] JavaRebelを使う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-9106342694850274227</id><published>2009-04-17T03:19:00.002+09:00</published><updated>2009-05-31T06:58:13.431+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Life] Liftのサンプル</title><content type='html'>&lt;a href="http://www.ibm.com/developerworks/jp/java/library/j-scala01228.html"&gt;Scala&lt;/a&gt;のフレームワークな&lt;a href="http://liftweb.net/"&gt;Lift&lt;/a&gt;と格闘中。GAE/Jで動くのはいつの日か。&lt;br /&gt;&lt;br /&gt;なかなか説明を読んでも難しく(&lt;a href="http://d.hatena.ne.jp/yuroyoro/20080808/1218168454"&gt;ゆろよろさんの&lt;/a&gt;が一番分かり良いと思う)、かつシンプルなサンプルが少ない(すぐDB連携とか見せちゃう)ので、シンプルなサンプルソースをmvn出来る形で&lt;a href="http://mantis.divers-high.com/work/public/simple2.tgz"&gt;まるっと置いて&lt;/a&gt;おきます。&lt;br /&gt;特にbootstrapのMenuはくせ者なので(ACL機能の代わりもしちゃう)、その部分、ソースにコメントしてあります。&lt;br /&gt;&lt;br /&gt;ちなみに、Mavenでfscを使うには以下です(本家に&lt;a href="http://scala-tools.org/mvnsites/maven-scala-plugin/usage_compile.html"&gt;ありました&lt;/a&gt;)。&lt;br /&gt;\apache-maven-2.0.9\bin\mvn&amp;nbsp;scala:cc&amp;nbsp;-Donce=true&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-9106342694850274227?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9106342694850274227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/9106342694850274227'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/life-lift.html' title='[Life] Liftのサンプル'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7505608787320901820</id><published>2009-04-16T03:38:00.002+09:00</published><updated>2009-05-31T06:58:33.769+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Solr] Nutchでサイトクロール</title><content type='html'>Solrを使ってサイトクロールを行う方法が、公開されていたので、&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/w/r6/e8/pmv_bor_rou_ffeeee.jpg" alt="http://www.lucidimagination.com/blog/2009/03/09/nutch-solr/" title="Lucid Imagination » Using Nutch with Solr" width="126" height="44" style="border:none" usemap="#map_wr6e8pmv"&gt;&lt;map name="map_wr6e8pmv"&gt;&lt;area coords="54,27,100,38" href="http://www.lucidimagination.com/blog/author/samisiren/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;&lt;a href="http://www.lucidimagination.com/blog/2009/03/09/nutch-solr/"&gt;Lucid Imagination » Using Nutch with Solr&lt;/a&gt; via &lt;a href="http://kwout.com/quote/wr6e8pmv"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;やってみた。&lt;br /&gt;&lt;br /&gt;Nutchはウェブスパイダーとしてのクロール機能を提供している。内部に分散ファイルシステムたるHadoopを持っていのだが、今回はこれは使わない方法(のようだ)。&lt;br /&gt;&lt;br /&gt;- - - - &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Nutchを&amp;lt;a&amp;nbsp;href=&amp;quot;http://hudson.zones.apache.org/hudson/job/Nutch-trunk/&amp;quot;&amp;gt;ダウンロード&amp;lt;/a&amp;gt;し、解凍する。&lt;br /&gt;&lt;br /&gt;　tar&amp;nbsp;xzf&amp;nbsp;apache-nutch-1.0.tar.gz&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;Solrの設定を行う&lt;br /&gt;&lt;br /&gt;Nutchの中にはschema.xmlなどSolrを連携して使うためのサンプルの設定ファイルが含まれています。&lt;br /&gt;&lt;br /&gt;a.&amp;nbsp;schema.xmlの配置&lt;br /&gt;apache-nutch-1.0/conf&amp;nbsp;to&amp;nbsp;directory&amp;nbsp;apache-solr-1.3.0/example/solr/conf&lt;br /&gt;&lt;br /&gt;b.&amp;nbsp;“content”フィールドの設定変更&lt;br /&gt;&lt;br /&gt;&amp;lt;field&amp;nbsp;name=”content”&amp;nbsp;type=”text”&amp;nbsp;stored=”true”&amp;nbsp;indexed=”true”/&amp;gt;&lt;br /&gt;&lt;br /&gt;c.&amp;nbsp;クローラ用リクエストハンドラの作成&lt;br /&gt;&lt;br /&gt;以下をsolrconfig.xmlに追記します。&lt;br /&gt;&lt;br /&gt;&amp;lt;requestHandler&amp;nbsp;name=&amp;quot;/nutch&amp;quot;&amp;nbsp;class=&amp;quot;solr.SearchHandler&amp;quot;&amp;nbsp;&amp;gt;&lt;br /&gt;&amp;lt;lst&amp;nbsp;name=&amp;quot;defaults&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;defType&amp;quot;&amp;gt;dismax&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;echoParams&amp;quot;&amp;gt;explicit&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;float&amp;nbsp;name=&amp;quot;tie&amp;quot;&amp;gt;0.01&amp;lt;/float&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;qf&amp;quot;&amp;gt;&lt;br /&gt;content^0.5&amp;nbsp;anchor^1.0&amp;nbsp;title^1.2&lt;br /&gt;&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;pf&amp;quot;&amp;gt;&lt;br /&gt;content^0.5&amp;nbsp;anchor^1.5&amp;nbsp;title^1.2&amp;nbsp;site^1.5&lt;br /&gt;&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;fl&amp;quot;&amp;gt;&lt;br /&gt;url&lt;br /&gt;&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;mm&amp;quot;&amp;gt;&lt;br /&gt;2&amp;amp;lt;-1&amp;nbsp;5&amp;amp;lt;-2&amp;nbsp;6&amp;amp;lt;90%&lt;br /&gt;&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;int&amp;nbsp;name=&amp;quot;ps&amp;quot;&amp;gt;100&amp;lt;/int&amp;gt;&lt;br /&gt;&amp;lt;bool&amp;nbsp;hl=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;q.alt&amp;quot;&amp;gt;*:*&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;hl.fl&amp;quot;&amp;gt;title&amp;nbsp;url&amp;nbsp;content&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;f.title.hl.fragsize&amp;quot;&amp;gt;0&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;f.title.hl.alternateField&amp;quot;&amp;gt;title&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;f.url.hl.fragsize&amp;quot;&amp;gt;0&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;f.url.hl.alternateField&amp;quot;&amp;gt;url&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;str&amp;nbsp;name=&amp;quot;f.content.hl.fragmenter&amp;quot;&amp;gt;regex&amp;lt;/str&amp;gt;&lt;br /&gt;&amp;lt;/lst&amp;gt;&lt;br /&gt;&amp;lt;/requestHandler&amp;gt;&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;Solrを起動しておきます。&lt;br /&gt;&lt;br /&gt;cd&amp;nbsp;apache-solr-1.3.0/example&lt;br /&gt;java&amp;nbsp;-jar&amp;nbsp;start.jar&lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;Nutchの設定を行います。&lt;br /&gt;&lt;br /&gt;a.&amp;nbsp;apache-nutch-1.0/confにあるnutch-site.xmlの中身を以下のものにまるっと入れ替えます。&lt;br /&gt;ここでは、クローラの名前や、有効化するプラグイン、ドメイン単位でみたときの最大同時接続数などを指定します。&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;http.agent.name&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;nutch-solr-integration&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;generate.max.per.host&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;100&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;&lt;br /&gt;&amp;lt;name&amp;gt;plugin.includes&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;protocol-http|urlfilter-regex|parse-html|index-(basic|anchor)|query-(basic|site|url)|response-(json|xml)|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;b.&amp;nbsp;apache-nutch-1.0/confにあるregex-urlfilter.txtの中身を書き換えます。&lt;br /&gt;&lt;br /&gt;-^(https|telnet|file|ftp|mailto):&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;nbsp;skip&amp;nbsp;some&amp;nbsp;suffixes&lt;br /&gt;-\.(swf|SWF|doc|DOC|mp3|MP3|WMV|wmv|txt|TXT|rtf|RTF|avi|AVI|m3u|M3U|flv|FLV|WAV|wav|mp4|MP4|avi|AVI|rss|RSS|xml|XML|pdf|PDF|js|JS|gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe|jpeg|JPEG|bmp|BMP)$&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;nbsp;skip&amp;nbsp;URLs&amp;nbsp;containing&amp;nbsp;certain&amp;nbsp;characters&amp;nbsp;as&amp;nbsp;probable&amp;nbsp;queries,&amp;nbsp;etc.&lt;br /&gt;-[?*!@=]&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;nbsp;allow&amp;nbsp;urls&amp;nbsp;in&amp;nbsp;foofactory.fi&amp;nbsp;domain&lt;br /&gt;+^http://([a-z0-9\-A-Z]*\.)*lucidimagination.com/&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;nbsp;deny&amp;nbsp;anything&amp;nbsp;else&lt;br /&gt;-.&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;初期URLリスト(クロール起点)ファイルを作成します。&lt;br /&gt;&lt;br /&gt;mkdir&amp;nbsp;urls&lt;br /&gt;echo&amp;nbsp;&amp;quot;http://www.lucidimagination.com/&amp;quot;&amp;nbsp;&amp;gt;&amp;nbsp;urls/seed.txt&lt;br /&gt;&lt;br /&gt;6.&amp;nbsp;初期URLのページをクロールしてNutchのcrawldbに格納します。&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;inject&amp;nbsp;crawl/crawldb&amp;nbsp;urls&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp; bin/nutch&amp;nbsp;inject&amp;nbsp;crawl/crawldb&amp;nbsp;urls&lt;br /&gt;Injector:&amp;nbsp;starting&lt;br /&gt;Injector:&amp;nbsp;crawlDb:&amp;nbsp;crawl/crawldb&lt;br /&gt;Injector:&amp;nbsp;urlDir:&amp;nbsp;urls&lt;br /&gt;Injector:&amp;nbsp;Converting&amp;nbsp;injected&amp;nbsp;urls&amp;nbsp;to&amp;nbsp;crawl&amp;nbsp;db&amp;nbsp;entries.&lt;br /&gt;Injector:&amp;nbsp;Merging&amp;nbsp;injected&amp;nbsp;urls&amp;nbsp;into&amp;nbsp;crawl&amp;nbsp;db.&lt;br /&gt;Injector:&amp;nbsp;done&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;7.&amp;nbsp;取得したページを解析してコンテンツを抜き出します。&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;generate&amp;nbsp;crawl/crawldb&amp;nbsp;crawl/segments&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp;bin/nutch&amp;nbsp;generate&amp;nbsp;crawl/crawldb&amp;nbsp;crawl/segments&lt;br /&gt;Generator:&amp;nbsp;Selecting&amp;nbsp;best-scoring&amp;nbsp;urls&amp;nbsp;due&amp;nbsp;for&amp;nbsp;fetch.&lt;br /&gt;Generator:&amp;nbsp;starting&lt;br /&gt;Generator:&amp;nbsp;segment:&amp;nbsp;crawl/segments/20090416032246&lt;br /&gt;Generator:&amp;nbsp;filtering:&amp;nbsp;true&lt;br /&gt;Generator:&amp;nbsp;jobtracker&amp;nbsp;is&amp;nbsp;'local',&amp;nbsp;generating&amp;nbsp;exactly&amp;nbsp;one&amp;nbsp;partition.&lt;br /&gt;Generator:&amp;nbsp;Partitioning&amp;nbsp;selected&amp;nbsp;urls&amp;nbsp;by&amp;nbsp;host,&amp;nbsp;for&amp;nbsp;politeness.&lt;br /&gt;Generator:&amp;nbsp;done.&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;上のコマンドで、crawl/segments以下に新たなクロール対象のディレクトリを作成します。&amp;nbsp;that&amp;nbsp;at&amp;nbsp;this&amp;nbsp;point&amp;nbsp;contains&amp;nbsp;files&amp;nbsp;that&amp;nbsp;store&amp;nbsp;the&amp;nbsp;url(s)&amp;nbsp;to&amp;nbsp;be&amp;nbsp;fetched.&amp;nbsp;In&amp;nbsp;the&amp;nbsp;following&amp;nbsp;commands&amp;nbsp;we&amp;nbsp;need&amp;nbsp;the&amp;nbsp;latest&amp;nbsp;segment&amp;nbsp;dir&amp;nbsp;as&amp;nbsp;parameter&amp;nbsp;so&amp;nbsp;we’ll&amp;nbsp;store&amp;nbsp;it&amp;nbsp;in&amp;nbsp;an&amp;nbsp;environment&amp;nbsp;variable:&lt;br /&gt;&lt;br /&gt;export&amp;nbsp;SEGMENT=crawl/segments/`ls&amp;nbsp;-tr&amp;nbsp;crawl/segments|tail&amp;nbsp;-1`&lt;br /&gt;&lt;br /&gt;クロールを開始します。&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;fetch&amp;nbsp;$SEGMENT&amp;nbsp;-noParsing&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp;bin/nutch&amp;nbsp;fetch&amp;nbsp;$SEGMENT&amp;nbsp;-noParsing&lt;br /&gt;Fetcher:&amp;nbsp;Your&amp;nbsp;'http.agent.name'&amp;nbsp;value&amp;nbsp;should&amp;nbsp;be&amp;nbsp;listed&amp;nbsp;first&amp;nbsp;in&amp;nbsp;'http.robots.agents'&amp;nbsp;property.&lt;br /&gt;Fetcher:&amp;nbsp;starting&lt;br /&gt;Fetcher:&amp;nbsp;segment:&amp;nbsp;crawl/segments/20090416032246&lt;br /&gt;Fetcher:&amp;nbsp;threads:&amp;nbsp;10&lt;br /&gt;QueueFeeder&amp;nbsp;finished:&amp;nbsp;total&amp;nbsp;1&amp;nbsp;records.&lt;br /&gt;fetching&amp;nbsp;http://www.lucidimagination.com/&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=1&lt;br /&gt;-activeThreads=1,&amp;nbsp;spinWaiting=0,&amp;nbsp;fetchQueues.totalSize=0&lt;br /&gt;-activeThreads=1,&amp;nbsp;spinWaiting=0,&amp;nbsp;fetchQueues.totalSize=0&lt;br /&gt;-finishing&amp;nbsp;thread&amp;nbsp;FetcherThread,&amp;nbsp;activeThreads=0&lt;br /&gt;-activeThreads=0,&amp;nbsp;spinWaiting=0,&amp;nbsp;fetchQueues.totalSize=0&lt;br /&gt;-activeThreads=0&lt;br /&gt;Fetcher:&amp;nbsp;done&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;コンテンツをパースします。&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;parse&amp;nbsp;$SEGMENT&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp;bin/nutch&amp;nbsp;parse&amp;nbsp;$SEGMENT&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;Then&amp;nbsp;I&amp;nbsp;update&amp;nbsp;the&amp;nbsp;Nutch&amp;nbsp;crawldb.&lt;br /&gt;updatedb&amp;nbsp;コマンドを使うと、先にとってきたページのパースと、もうパースされて見つかっているURLページの取得をパイプライン的に並行して行わせることができます。なお、Nutchは取得した各ページの状態を覚えているため、同じページを何度も取得しに行ってしまうことはありません。&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;updatedb&amp;nbsp;crawl/crawldb&amp;nbsp;$SEGMENT&amp;nbsp;-filter&amp;nbsp;-normalize&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp;bin/nutch&amp;nbsp;updatedb&amp;nbsp;crawl/crawldb&amp;nbsp;$SEGMENT&amp;nbsp;-f&lt;br /&gt;ilter&amp;nbsp;-normalize&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;starting&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;db:&amp;nbsp;crawl/crawldb&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;segments:&amp;nbsp;[crawl/segments/20090416032246]&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;additions&amp;nbsp;allowed:&amp;nbsp;true&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;URL&amp;nbsp;normalizing:&amp;nbsp;true&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;URL&amp;nbsp;filtering:&amp;nbsp;true&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;Merging&amp;nbsp;segment&amp;nbsp;data&amp;nbsp;into&amp;nbsp;db.&lt;br /&gt;CrawlDb&amp;nbsp;update:&amp;nbsp;done&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;これまでが、クロールの1サイクルとなります。&lt;br /&gt;&lt;br /&gt;8.&amp;nbsp;linkdbを作る&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;invertlinks&amp;nbsp;crawl/linkdb&amp;nbsp;-dir&amp;nbsp;crawl/segments&lt;br /&gt;&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&amp;nbsp;bin/nutch&amp;nbsp;invertlinks&amp;nbsp;crawl/linkdb&amp;nbsp;-dir&amp;nbsp;crawl/segments&lt;br /&gt;&lt;br /&gt;LinkDb:&amp;nbsp;starting&lt;br /&gt;LinkDb:&amp;nbsp;linkdb:&amp;nbsp;crawl/linkdb&lt;br /&gt;LinkDb:&amp;nbsp;URL&amp;nbsp;normalize:&amp;nbsp;true&lt;br /&gt;LinkDb:&amp;nbsp;URL&amp;nbsp;filter:&amp;nbsp;true&lt;br /&gt;LinkDb:&amp;nbsp;adding&amp;nbsp;segment:&amp;nbsp;file:/Users/tf0054/work/nutch-2009-04-15_04-01-57/crawl/segments/20090416032246&lt;br /&gt;LinkDb:&amp;nbsp;done&lt;br /&gt;konpyuta:~/work/nutch&amp;nbsp;tf0054$&lt;br /&gt;&lt;br /&gt;9.&amp;nbsp;全セグメントからSolrにコンテンツを送る&lt;br /&gt;&lt;br /&gt;bin/nutch&amp;nbsp;solrindex&amp;nbsp;http://127.0.0.1:8983/solr/&amp;nbsp;crawl/crawldb&amp;nbsp;crawl/linkdb&amp;nbsp;crawl/segments/*&lt;br /&gt;&lt;br /&gt;10.&amp;nbsp;Solrにて検索可能となったか確認する。&lt;br /&gt;&lt;br /&gt;http://127.0.0.1:8983/solr/nutch/?q=solr&amp;amp;amp;version=2.2&amp;amp;amp;start=0&amp;amp;amp;rows=10&amp;amp;amp;indent=on&amp;amp;amp;wt=json&lt;br /&gt;&lt;br /&gt;- - - - -&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SeYqaBglisI/AAAAAAAAAF0/lHQUKQE_L9M/s1600-h/FirstNutch_20090416_58.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 234px; height: 320px;" src="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SeYqaBglisI/AAAAAAAAAF0/lHQUKQE_L9M/s320/FirstNutch_20090416_58.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5324990235982269122" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7505608787320901820?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7505608787320901820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7505608787320901820'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/solr-nutch.html' title='[Solr] Nutchでサイトクロール'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0tSGvTIRZ7U/SeYqaBglisI/AAAAAAAAAF0/lHQUKQE_L9M/s72-c/FirstNutch_20090416_58.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-2025255411057143925</id><published>2009-04-15T19:15:00.004+09:00</published><updated>2009-05-05T23:42:00.321+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] スクリプト実行!</title><content type='html'>Javaで要求される杓子定規な、というか精緻な記述が省けるだけでもScalaを利用する価値はあるというものだが、さらにスクリプト実行(コンパイルして.classを作ってからじゃなく)できるとその価値はより高くなる。&lt;br /&gt;&lt;br /&gt;以下、Windowsでスクリプト実行する場合(test.batなどとして保存されることを想定)。&lt;br /&gt;&lt;pre class="prettyprint"&gt;::#!&lt;br /&gt;@echo off&lt;br /&gt;call c:\scala-2.7.4.final\bin\scala %0 %*&lt;br /&gt;goto :eof&lt;br /&gt;::!#&lt;br /&gt;&lt;br /&gt;class HelloFunction {&lt;br /&gt;    def apply() = "hello" &lt;br /&gt;    def apply(name: String) = "hello " + name&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// メソッド省略の例&lt;br /&gt;val hello = new HelloFunction&lt;br /&gt;println(hello())        // =&gt; "hello"&lt;br /&gt;println(hello("Dean"))  // =&gt; "hello Dean"&lt;br /&gt;&lt;br /&gt;// コマンドライン引数処理の例&lt;br /&gt;for(i &lt;- 1 to (args.length)){&lt;br /&gt;    print(i + ",");&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/25238059-2025255411057143925?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2025255411057143925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2025255411057143925'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/scala_15.html' title='[Scala] スクリプト実行!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3414170417025487460</id><published>2009-04-12T03:30:00.008+09:00</published><updated>2009-09-10T04:55:58.427+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gosen'/><title type='text'>[Java] SenよりもGoSen?</title><content type='html'>ちょっと前に見た&lt;a href="http://tf0054.blogspot.com/2009/02/java-sen.html"&gt;Sen&lt;/a&gt;は、しかしバグ付きだという噂だし、どうしたものかと思っていたら、&lt;a href="http://d.hatena.ne.jp/mtbr/20090319/nlpJavaGoSen"&gt;GoSen&lt;/a&gt;というのもあるらしい。&lt;br /&gt;&lt;br /&gt;PerlやJCLからの依存性を排除したとのことだが、しかし、これも本家のURLがNotFoundで、、どうもJavaでこの手のアプリは保守するのが面倒になるものなのか(&lt;a href="http://twistbendcoupling.net/632/cmecab-java-13-"&gt;CMeCab&lt;/a&gt;の中にあるような、辞書不要のタイプもある)。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SensHF7ag0I/AAAAAAAAAF8/1zjpvy1Kf1Q/s1600-h/gosen_gui.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 191px;" src="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SensHF7ag0I/AAAAAAAAAF8/1zjpvy1Kf1Q/s320/gosen_gui.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326047640936940354" /&gt;&lt;/a&gt;&lt;br /&gt;書きながら調べていたら、早速(Senよか治ってるようだけど)&lt;a href="http://d.hatena.ne.jp/Shimojimoji/20081231"&gt;バグ情報&lt;/a&gt;も。あとLucene対応の&lt;a href="http://hide-t.vox.com/library/post/gosen.html"&gt;書換え&lt;/a&gt;について。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3414170417025487460?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3414170417025487460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3414170417025487460'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/java-gosen.html' title='[Java] SenよりもGoSen?'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0tSGvTIRZ7U/SensHF7ag0I/AAAAAAAAAF8/1zjpvy1Kf1Q/s72-c/gosen_gui.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3389250465790705647</id><published>2009-04-11T04:14:00.002+09:00</published><updated>2009-04-18T23:37:00.869+09:00</updated><title type='text'>[Life] GAE/Javaとは</title><content type='html'>Javaのアカウントが来たので、Liftの稼働実験をしつつ、&lt;a href="http://www.atmarkit.co.jp/news/200904/08/gae.html"&gt;@IT&lt;/a&gt;の記事を読む。&lt;br /&gt;昨日まで「負荷による拡張はgoogleさんがよしなにやってくれる」という言説の意味(どうやって水平分散に回せているのか)が、まったく分からなかったのだけど、やっと理解。&lt;br /&gt;シングルスレッドだからですね。&lt;br /&gt;ウェブからの各アクセスを一筆的に考えると、確かに途中で抜けられたりしなければ、筐体が分かれてても(2本の干渉が無いから)ざーっと勝手に流れて行って問題ないんですね。。なるほど。というか確かに。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;面白い&lt;a href="http://d.hatena.ne.jp/xtanza/20090416/p1"&gt;潜入調査&lt;/a&gt;をしている方がいた。あと、&lt;a href="http://tinyurl.com/cgaxpe"&gt;mavenから&lt;/a&gt;の操作も出来るようになった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3389250465790705647?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3389250465790705647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3389250465790705647'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/life-gaejava.html' title='[Life] GAE/Javaとは'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1760412281143732262</id><published>2009-04-09T04:05:00.000+09:00</published><updated>2009-05-09T04:08:36.633+09:00</updated><title type='text'>[Lift] derbyの中を調べる</title><content type='html'>Liftの例(todo)では、標準ではapacheの&lt;a href="http://www.itarchitect.jp/enterprise/-/29481-2.html"&gt;derby&lt;/a&gt;が使われており、この中にテーブルなどが自動生成される。この、自動生成されたテーブル定義やらを見る方法を調べたのでメモ。&lt;br /&gt;&lt;br /&gt;D:\work\Scala\todo&gt;"d:\Documents and Settings\00962724\デスクトップ\db-derby-10.5.1.1-bin\bin\ij.bat"&lt;br /&gt;ij バージョン 10.5&lt;br /&gt;ij&gt; connect 'jdbc:derby:d:\work\scala\todo\lift_example';&lt;br /&gt;ij&gt; describe users;&lt;br /&gt;COLUMN_NAME         |TYPE_NAME|DEC&amp;|NUM&amp;|COLUM&amp;|COLUMN_DEF|CHAR_OCTE&amp;|IS_NULL&amp;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;ID                  |BIGINT   |0   |10  |19    |AUTOINCRE&amp;|NULL      |NO&lt;br /&gt;FIRSTNAME           |VARCHAR  |NULL|NULL|32    |NULL      |64        |YES&lt;br /&gt;LASTNAME            |VARCHAR  |NULL|NULL|32    |NULL      |64        |YES&lt;br /&gt;EMAIL               |VARCHAR  |NULL|NULL|48    |NULL      |96        |YES&lt;br /&gt;LOCALE              |VARCHAR  |NULL|NULL|16    |NULL      |32        |YES&lt;br /&gt;TIMEZONE            |VARCHAR  |NULL|NULL|32    |NULL      |64        |YES&lt;br /&gt;PASSWORD_PW         |VARCHAR  |NULL|NULL|48    |NULL      |96        |YES&lt;br /&gt;PASSWORD_SLT        |VARCHAR  |NULL|NULL|20    |NULL      |40        |YES&lt;br /&gt;TEXTAREA            |VARCHAR  |NULL|NULL|2048  |NULL      |4096      |YES&lt;br /&gt;SUPERUSER           |SMALLINT |0   |10  |5     |NULL      |NULL      |YES&lt;br /&gt;VALIDATED           |SMALLINT |0   |10  |5     |NULL      |NULL      |YES&lt;br /&gt;UNIQUEID            |VARCHAR  |NULL|NULL|32    |NULL      |64        |YES&lt;br /&gt;&lt;br /&gt;12 行が選択されました&lt;br /&gt;ij&gt; describe todo;&lt;br /&gt;COLUMN_NAME         |TYPE_NAME|DEC&amp;|NUM&amp;|COLUM&amp;|COLUMN_DEF|CHAR_OCTE&amp;|IS_NULL&amp;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;PRIORITY            |INTEGER  |0   |10  |10    |NULL      |NULL      |YES&lt;br /&gt;ID                  |BIGINT   |0   |10  |19    |AUTOINCRE&amp;|NULL      |NO&lt;br /&gt;DESC_C              |VARCHAR  |NULL|NULL|128   |NULL      |256       |YES&lt;br /&gt;DONE                |SMALLINT |0   |10  |5     |NULL      |NULL      |YES&lt;br /&gt;OWNER               |BIGINT   |0   |10  |19    |NULL      |NULL      |YES&lt;br /&gt;&lt;br /&gt;5 行が選択されました&lt;br /&gt;ij&gt; show tables;&lt;br /&gt;TABLE_SCHEM         |TABLE_NAME                    |REMARKS&lt;br /&gt;------------------------------------------------------------------------&lt;br /&gt;SYS                 |SYSALIASES                    |&lt;br /&gt;SYS                 |SYSCHECKS                     |&lt;br /&gt;SYS                 |SYSCOLPERMS                   |&lt;br /&gt;SYS                 |SYSCOLUMNS                    |&lt;br /&gt;SYS                 |SYSCONGLOMERATES              |&lt;br /&gt;SYS                 |SYSCONSTRAINTS                |&lt;br /&gt;SYS                 |SYSDEPENDS                    |&lt;br /&gt;SYS                 |SYSFILES                      |&lt;br /&gt;SYS                 |SYSFOREIGNKEYS                |&lt;br /&gt;SYS                 |SYSKEYS                       |&lt;br /&gt;SYS                 |SYSROLES                      |&lt;br /&gt;SYS                 |SYSROUTINEPERMS               |&lt;br /&gt;SYS                 |SYSSCHEMAS                    |&lt;br /&gt;SYS                 |SYSSTATEMENTS                 |&lt;br /&gt;SYS                 |SYSSTATISTICS                 |&lt;br /&gt;SYS                 |SYSTABLEPERMS                 |&lt;br /&gt;SYS                 |SYSTABLES                     |&lt;br /&gt;SYS                 |SYSTRIGGERS                   |&lt;br /&gt;SYS                 |SYSVIEWS                      |&lt;br /&gt;SYSIBM              |SYSDUMMY1                     |&lt;br /&gt;APP                 |TODO                          |&lt;br /&gt;APP                 |USERS                         |&lt;br /&gt;&lt;br /&gt;22 行が選択されました&lt;br /&gt;ij&gt; exit&lt;br /&gt;&gt; ;&lt;br /&gt;D:\work\Scala\todo&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1760412281143732262?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1760412281143732262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1760412281143732262'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/lift-derby.html' title='[Lift] derbyの中を調べる'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8071357127427854949</id><published>2009-04-02T23:01:00.000+09:00</published><updated>2009-05-06T03:23:13.721+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><title type='text'>[Scala] 遅延評価の例</title><content type='html'>Scalaで遅延評価。引数の型指定部分で":"の後ろに"=&gt;"を挟み込むことで指示できる(&lt;a href="http://www.h7.dion.ne.jp/~samwyn/Scala/function.htm"&gt;参考&lt;/a&gt;)。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#!/bin/bash&lt;br /&gt;exec ~/work/scala/bin/scala "$0" "$@"&lt;br /&gt;!#&lt;br /&gt;&lt;br /&gt;def until(f: =&gt; Boolean)(p: =&gt; Unit) {&lt;br /&gt;        while (!f) p&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var i = 0&lt;br /&gt;until (i &gt; 10) {&lt;br /&gt;        print(i + " ")&lt;br /&gt;        i += 1&lt;br /&gt;}&lt;br /&gt;println&lt;br /&gt;&lt;/pre&gt;この例で遅延評価を外す("until(f:Boolean)"とやる)と、&lt;br /&gt;・最初に"i&gt;10(でi=0)"がfalseと評価される&lt;br /&gt;・その結果(false)がuntil関数に渡ってしまう&lt;br /&gt;ため、(trueと渡って来たものを再評価できるわけもなく)無限ループに陥ってしまいます。&lt;br /&gt;&lt;br /&gt;なお、"(p: =&gt; Unit)"もその意味では遅延評価の指定がなされている、つまり「関数とは要するに引数付き遅延評価式で」ということで、具体的にはココを"(p:Unit)"とすると、&lt;br /&gt;・1回だけuntilに渡したブロック(printとか)を処理して&lt;br /&gt;・戻値が無い(Unitな)whileが回り続ける(iは1になったが以後そのまま)&lt;br /&gt;状態に陥ってしまう。なのでここでも遅延評価が活躍している(んだと思う)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8071357127427854949?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8071357127427854949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8071357127427854949'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/04/scala_16.html' title='[Scala] 遅延評価の例'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1485275538450976475</id><published>2009-03-30T03:51:00.001+09:00</published><updated>2009-03-31T03:52:18.694+09:00</updated><title type='text'>[Linux] JMX/REST変換</title><content type='html'>TomcatのManagerにも&lt;a href="http://tf0054.blogspot.com/2008/08/linux-jmxproxy.html"&gt;JMXProxy&lt;/a&gt;があるのでそれで良いような気はしますが、こんなのもあるようです。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/m/vv/3s/2uk.jpg" alt="http://code.google.com/p/polarrose-jmx-rest-bridge/" title="polarrose-jmx-rest-bridge - Google Code" width="413" height="51" style="border:none" usemap="#map_mvv3s2uk"&gt;&lt;map name="map_mvv3s2uk"&gt;&lt;area coords="0,9,35,46" href="http://code.google.com/p/polarrose-jmx-rest-bridge/" alt="" shape="rect"&gt;&lt;area coords="47,12,321,32" href="http://code.google.com/p/polarrose-jmx-rest-bridge/" alt="" shape="rect"&gt;&lt;area coords="47,33,407,43" href="http://code.google.com/p/polarrose-jmx-rest-bridge/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/mvv3s2uk"&gt;kwout&lt;/a&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/25238059-1485275538450976475?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1485275538450976475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1485275538450976475'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/linux-jmxrest.html' title='[Linux] JMX/REST変換'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8797280349818932308</id><published>2009-03-22T23:26:00.007+09:00</published><updated>2009-03-23T00:17:26.803+09:00</updated><title type='text'>[Life] ScalaでSolrj!</title><content type='html'>下のソースで、以下条件下にて、&lt;br /&gt;　・Solr(v1.4-dev/今のtrunk)のサーバ相手に&lt;br /&gt;　・Solr(v1.3)のsolrjライブラリで&lt;br /&gt;実行すれば、&lt;a href="http://www.ab-road.net/"&gt;ABROAD&lt;/a&gt;のスポット情報1件をインターネットから取得してうまく日本語も投入してくれることを確認しました。&lt;br /&gt;&lt;br /&gt;なぜv1.4のsolrjを組み込むとうまく動かないのか。。(補足:&lt;a href="http://issues.apache.org/jira/browse/SOLR-973"&gt;SOLR-973&lt;/a&gt;にタイムリーにはまっていたようで、今updateしたらサーバもsolrjもv1.4で正常動作しました!)&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;// &gt;\scala-2.7.3.fin\bin\scalac -cp c:\apache-solr-1.3.0\dist\solrj-lib\commons-httpclient-3.1.jar;c:\apache-solr-1.3.0\dist\apache-solr-solrj-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-core-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-common-1.3.0.jar getAB.scala&lt;br /&gt;// &gt;\scala-2.7.3.fin\bin\scala -cp .;c:\apache-solr-1.3.0\dist\solrj-lib\commons-httpclient-3.1.jar;c:\apache-solr-1.3.0\dist\apache-solr-solrj-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-core-1.3.0.jar;c:\apache-solr-1.3.0\dist\apache-solr-common-1.3.0.jar;c:\apache-solr-1.3.0\dist\solrj-lib\commons-logging-1.0.4.jar;c:\apache-solr-1.3.0\dist\solrj-lib\commons-codec-1.3.jar getAB&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;&lt;br /&gt;import scala.xml.parsing.ConstructingParser;&lt;br /&gt;import scala.io.Source;&lt;br /&gt;import scala.xml.PrettyPrinter;&lt;br /&gt;&lt;br /&gt;import org.apache.solr.client.solrj.SolrServer;&lt;br /&gt;import org.apache.solr.client.solrj.SolrServerException;&lt;br /&gt;import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;&lt;br /&gt;import org.apache.solr.common.SolrInputDocument;&lt;br /&gt;&lt;br /&gt;object getAB {&lt;br /&gt;  def main(args : Array[String]) {&lt;br /&gt;&lt;br /&gt; var solr = new CommonsHttpSolrServer("http://localhost:8983/solr");&lt;br /&gt;    val url = "http://webservice.recruit.co.jp/ab-road/spot/v1/?key=xxx4e359bbbbe6f4&amp;spot=000921";&lt;br /&gt;&lt;br /&gt;    val data = Source.fromURL(url,"UTF-8");&lt;br /&gt;    val elem = ConstructingParser.fromSource(data,true).document().docElem;&lt;br /&gt;&lt;br /&gt; var tmp1:String = (elem\"spot"\"description").text;&lt;br /&gt; //var tmp1:String = new PrettyPrinter(80 /*width*/, 2 /*indent*/).format(elem);&lt;br /&gt; //String変数(tmp1)から(UTF8エンコードな)バイトストリームで取り出し(そこから)UTF8のStringを作る&lt;br /&gt; var tmp2:String = new String(tmp1.getBytes("UTF-8"),"UTF-8");&lt;br /&gt; var tmp3:String = new String(tmp2.getBytes("MS932"),"MS932");&lt;br /&gt;&lt;br /&gt; //System.out.println( "ORG:\n"+tmp1 );&lt;br /&gt; System.out.println( "UTF8:\n"+tmp2 );&lt;br /&gt; System.out.println( "SJIS:\n"+tmp3 );&lt;br /&gt;&lt;br /&gt; var doc1 :SolrInputDocument = new SolrInputDocument();&lt;br /&gt; doc1.addField("id", "id1", 1.0f);&lt;br /&gt; doc1.addField("name", "doc1", 1.0f);&lt;br /&gt; doc1.addField("price", 10);&lt;br /&gt;&lt;br /&gt; var doc2 :SolrInputDocument = new SolrInputDocument();&lt;br /&gt; doc2.addField("id", "id2", 1.0f);&lt;br /&gt; doc2.addField("name", "doc2", 1.0f);&lt;br /&gt; doc2.addField("price", 20);&lt;br /&gt; doc2.addField("desc_t", tmp2);&lt;br /&gt;&lt;br /&gt; var docs :Collection[SolrInputDocument] = new ArrayList[SolrInputDocument]();&lt;br /&gt; docs.add(doc1);&lt;br /&gt; docs.add(doc2);&lt;br /&gt;&lt;br /&gt; solr.add(docs);&lt;br /&gt; solr.commit();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;お恥ずかしくも、Scalaっぽくはまったく無い書きっぷりですが、これでもJavaよりはだいぶ記述量が少ない気がします。&lt;br /&gt;&lt;br /&gt;追伸：&lt;br /&gt;　&lt;a href="http://webservice.recruit.co.jp/ab-road/"&gt;リクルートwebAPI&lt;/a&gt;を使うときのキーは、(ソースには)ダミーを入れています。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8797280349818932308?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8797280349818932308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8797280349818932308'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/life-scalasolrj.html' title='[Life] ScalaでSolrj!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5554511719131830894</id><published>2009-03-20T07:39:00.005+09:00</published><updated>2009-03-20T08:02:02.261+09:00</updated><title type='text'>[Life] ScalaでJSP!</title><content type='html'>ScalaのXMLサポートを実装した"Burak Emir"さんの書かれた"&lt;a href="http://burak.emir.googlepages.com/scalaservlet.html"&gt;ScalaでJSP(@Tomcat)&lt;/a&gt;"(改題)を参考に。&lt;a href="http://burak.emir.googlepages.com/scalaServletHowTo-0.9.tgz"&gt;ソース&lt;/a&gt;にはantのbuildが付いているので、これを使うと楽に準備できる。私は、&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;tomcat.home = D:\\apache-tomcat-5.5.27&lt;br /&gt;servlet-api.jar = ${tomcat.home}/common/lib/servlet-api.jar&lt;br /&gt;&lt;br /&gt;scala.home = D:\\scala-2.7.2.final&lt;br /&gt;scala-library.jar = ${scala.home}/lib/scala-library.jar&lt;br /&gt;scala-compiler.jar = ${scala.home}/lib/scala-compiler.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;として実行しました。なお、以下ライブラリは「1フォルダにまるっと集めて、そこにCLASSPATH通してantしてね」とあったのでその通りに。&lt;br /&gt;&lt;br /&gt;　・&lt;a href="http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_7_2_final/lib/fjbg.jar"&gt;fjbg.jar&lt;/a&gt;(これは何?→何故か入っていなかったのでダウンロード)&lt;br /&gt;　・tools.jar(JDKの中にあるライブラリ)&lt;br /&gt;　・scala.jar(不明→scala-compiler.jarをコピーした)&lt;br /&gt;&lt;br /&gt;結構すんなり。Scalaでウェブといえば&lt;a href="http://webflavor.wiki.sourceforge.net/"&gt;WebFlavor&lt;/a&gt;や&lt;a href="http://d.hatena.ne.jp/yuroyoro/20080808/1218168451"&gt;lift&lt;/a&gt;まで行ってしまう感がありましたが、これならお手軽ですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5554511719131830894?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5554511719131830894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5554511719131830894'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/life-scalajsp.html' title='[Life] ScalaでJSP!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3509599543702792550</id><published>2009-03-19T02:23:00.002+09:00</published><updated>2009-03-19T02:29:14.595+09:00</updated><title type='text'>[Linux] EC2の管理ツール</title><content type='html'>メモっていたつもりが、書いていなかったので今更ながら。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/hidemon/20080615/1213534638"&gt;RightScale&lt;/a&gt;では、動的にサーバ台数を増やしてゆく仕組み(RightScriptというマクロ的なもので実現する様子)を提供。&lt;br /&gt;そのOSSとして&lt;a href="http://jp.techcrunch.com/archives/20080403scalr-the-auto-scaling-open-source-amazon-ec2-effort/"&gt;Scalar&lt;/a&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/25238059-3509599543702792550?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3509599543702792550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3509599543702792550'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/linux-ec2.html' title='[Linux] EC2の管理ツール'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-977317827920178325</id><published>2009-03-18T22:23:00.004+09:00</published><updated>2009-03-30T01:27:25.523+09:00</updated><title type='text'>[Java] commons-fileuploadで受け取る</title><content type='html'>&lt;a href="http://curl.haxx.se/"&gt;curl&lt;/a&gt;を使って、apacheの&lt;a href="http://commons.apache.org/fileupload/"&gt;common-upload&lt;/a&gt;で受信できる形で送信する方法。&lt;blockquote&gt;D:\work\curl-7.16.2&gt;curl -F "name=@test.xml" http://192.168.11.150:20050/uploader&lt;/blockquote&gt;&lt;br /&gt;nameのところは何でもよい(&lt;a href="http://www.hcn.zaq.ne.jp/___/unix/curl_manual.html"&gt;参考&lt;/a&gt;)。Windows版のcurlはここから&lt;a href="http://curl.haxx.se/download.html"&gt;ダウンロード&lt;/a&gt;できます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-977317827920178325?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/977317827920178325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/977317827920178325'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/java-commons-fileupload.html' title='[Java] commons-fileuploadで受け取る'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1276010057736457426</id><published>2009-03-13T03:51:00.004+09:00</published><updated>2009-03-13T03:53:30.039+09:00</updated><title type='text'>[Solr] wgetでPOSTする</title><content type='html'>以前Solrにデータ投入をする際には&lt;a href="http://tf0054.blogspot.com/2007/02/search-solr.html"&gt;curlを使っていた&lt;/a&gt;(本家でもそうしていた)。&lt;br /&gt;が、これは普通にwgetでも出来るんですね。&lt;br /&gt;&lt;blockquote&gt;wget -q -O - --header "Content-type:text/xml; charset=utf-8" --post-file="/var/tmp/test.xml" http://localhost:20050/apache-solr-1.3.0/update&lt;/blockquote&gt;&lt;br /&gt;curlって、いっても標準では入っていない環境も多いので(&lt;a href="http://blog.goo.ne.jp/ozoz-goo/e/9792b5677f70586bd9befaa412aeb679"&gt;参考ページ&lt;/a&gt;)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1276010057736457426?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1276010057736457426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1276010057736457426'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/solr-wgetpost.html' title='[Solr] wgetでPOSTする'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8416074221648197997</id><published>2009-03-09T00:57:00.003+09:00</published><updated>2009-03-09T01:03:50.459+09:00</updated><title type='text'>[GoogleMap] マイマップとGoogleMapAPIと</title><content type='html'>GoogleMapのマイマップ機能はとても使いやすく、ちょろっとしたイベントの地図を作るのにベスト。だけれど、中にルート案内と作者(のマイマップへのリンク)が表示されてしまうのが玉に傷か。&lt;br /&gt;これが嫌なときは、一度rss(georss/マイマップのツールバー、"GoogleEarthで表示"の左隣にある)を経由して、それをAPIで使えばよい、、のだけど、そうするとせっかく変えたアイコンが、全て同じ青いピンのに変えられてしまう様子(でもこれは&lt;a href="http://groups.google.com.jm/group/Google-Maps-API/browse_thread/thread/0b49db494fbfea91"&gt;仕様っぽい&lt;/a&gt;)。&lt;br /&gt;うーん。やっぱりキチンと自前ですしょうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8416074221648197997?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8416074221648197997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8416074221648197997'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/googlemap-googlemapapi.html' title='[GoogleMap] マイマップとGoogleMapAPIと'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7318796434547746721</id><published>2009-03-08T10:42:00.000+09:00</published><updated>2009-03-09T10:49:55.430+09:00</updated><title type='text'>[MT] カスタムフィールド</title><content type='html'>MovableType4.1から入ったカスタムフィールドは、エクスポート機能では取り出せない様子。DBのmt_entryテーブルからとろうとしたのだが、バイナリ列で連結されており。。&lt;br /&gt;&lt;br /&gt;ただ、入力値は普通に入っているので、Perlなどで&lt;a href="http://cast-a-spell.at.webry.info/200701/article_5.html"&gt;丸呑み&lt;/a&gt;し、無理やり置き換えは可能。&lt;br /&gt;手動で投入したときは(mt_entry_idの)&lt;a href="http://ash.jp/db/pg_use.htm"&gt;シーケンス上げ&lt;/a&gt;を忘れずに。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7318796434547746721?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7318796434547746721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7318796434547746721'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/mt.html' title='[MT] カスタムフィールド'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1698585671644956741</id><published>2009-03-07T11:08:00.001+09:00</published><updated>2009-05-07T11:10:43.848+09:00</updated><title type='text'>[Scala] Twitterの移行について</title><content type='html'>ずいぶん前の話題だが、&lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;TwitterのバックヤードScala化&lt;/a&gt;に関する記事の要点整理をしてみた。&lt;br /&gt;&lt;br /&gt;＞＞前提&lt;br /&gt;&lt;br /&gt;Twitterは、フロントはRailsに依存しており、逆にOffload観点から、キャッシュの失効処理等に、キューイングの仕組みを使った非同期処理が多数あり、それだけデーモンアプリが必要となるシステム構成。&lt;br /&gt;&lt;br /&gt;＞＞なぜ移行？(システム的理由)&lt;br /&gt;&lt;br /&gt;RubyはGreenThreadでカーネルスレッドを使うことはできず、プロセッサに依存してしまい、マルチコア環境での性能が出ない。これに対処するため複数プロセスを上げる方向に行くのだが、そうなるとメモリが大量に必要となり、さらにRubyのガベコレ性能が(Javaのそれに比べて)悪いこともあり、限界を感じていた。&lt;br /&gt;&lt;br /&gt;(これに対し)JVMは、スクリプト言語が苦手とする長時間動かし続けるデーモンアプリを書く環境として適切。&lt;br /&gt;&lt;br /&gt;また、動的型付けにより必要となる「型確認」の計算量が莫大になっていたという問題もあった。たとえば障害復旧時の処理時間が長くなりすぎていた。&lt;br /&gt;&lt;br /&gt;JRubyへの移行も考えたが、オリジナルレベルのパフォーマンスは出ないこと、またそもそもRailsが動かなかったことから不採用とした。ただし将来的に再考の余地はあると考えている。&lt;br /&gt;&lt;br /&gt;パフォーマンスという観点では、mutableとimmutableに注意すること。JITコンパイラはimmutableなオブジェクト(状態変化がない≒必然的にスレッドセーフとなる)であれば、最適化してゆくことができる。&lt;br /&gt;&lt;br /&gt;＞＞なぜ移行？(その他の理由)&lt;br /&gt;&lt;br /&gt;これまでのエンタープライズな職場を去ったあと、楽しく書いてゆきたい(表現してゆきたい)という理由から、(書いていてつまらない言語(C++など)を卒業し)Ruby等の高級言語に転向するプログラマをたくさん見てきた。&lt;br /&gt;&lt;br /&gt;＞＞移行してどうだったか&lt;br /&gt;&lt;br /&gt;とても上手くいった(性能向上及び動作安定化の観点から)。&lt;br /&gt;&lt;br /&gt;静的型付けは、(Rubyでもわざわざ型宣言を使っていた位だから)まったく手間ではなかった。&lt;br /&gt;&lt;br /&gt;actor部分とハイスケーラビリティを確保するところでいくつか問題が出たが、致命的なものはまったく無かった(良い意味で想定外)。&lt;br /&gt;&lt;br /&gt;actorでの並列処理の記述はクライアントからの接続を受ける部分などを中心に極めて有効であった。&lt;br /&gt;&lt;br /&gt;(中を再考している過程で)逆にactorまでは必要とせず、逆にthreadのほうが適している場合もあることが分かった。そしてこのときでも、(actorを)threadに書き戻すことは置換するレベルでありとても簡単だった(書き換えでいうと、普通にlockすればいいだけという場合も)。&lt;br /&gt;&lt;br /&gt;いくつかパフォーマンス観点からJavaのクラスを直接利用する場面があったが、このようなことができることもScalaの利点だ。&lt;br /&gt;&lt;br /&gt;＞＞切り替えで気をつけることは&lt;br /&gt;&lt;br /&gt;関数型という考え方になれること(メンタリティ)。ただしこれは使っているうちに慣れてくる部分が大きい。その意味でもすぐにビジネスが絡むシステムに使うのではなくスタートアップで利用してゆくべき。&lt;br /&gt;&lt;br /&gt;(型やその中身ベースでの)パターンマッチを使いこなせることは、効率的記述を行うためにとても重要だ。&lt;br /&gt;&lt;br /&gt;IDEがモノによっては(Scalaの)サポートが完全ではないため注意が必要。TwitterではIntelliJとEmacsのそれを使っている。&lt;br /&gt;&lt;br /&gt;インタプリタではなくcompile-deployが必要になることも、(慣れの問題かもしれないが)いらいらさせる原因となりうる。この点はProjectごとにケアが必要だとはいえ、JavaRebelを使えば解決できる。&lt;br /&gt;&lt;br /&gt;＞＞その他&lt;br /&gt;&lt;br /&gt;Scalaを選択する決断をするまでには煩悶してきた。でも(Rubyを使ってきた我々が)C++などの中級言語に移行することは、とても大きなリスクを負うことになり、かつ困難を伴うと判断した。&lt;br /&gt;&lt;br /&gt;2009年度内には、メインどころのトラフィックを稼いでいるAPIをScalaベースに切り替える予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1698585671644956741?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1698585671644956741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1698585671644956741'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/scala-twitter.html' title='[Scala] Twitterの移行について'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4616046559236895728</id><published>2009-02-22T23:56:00.003+09:00</published><updated>2009-02-23T00:01:30.632+09:00</updated><title type='text'>[Perl] デーモンプログラムを書くには</title><content type='html'>今まで全く読んだ事がなかった"&lt;a href="http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq8.html"&gt;perlfaq8&lt;/a&gt;"より。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;psコマンドなど、外部から見えるコマンドラインを実際に書き換えるには、$0変数を書き換える。&lt;br /&gt;&lt;br /&gt;例えばsendmailのようなデーモンプログラムは以下ように状態を設定する:&lt;br /&gt;$0 = "orcus [accepting connections]";&lt;/blockquote&gt;&lt;br /&gt;なるほどー。そんなことができるんだ。。&lt;br /&gt;&lt;br /&gt;ちなみに、デーモンプログラムというかapache的なデーモンを書くためには、&lt;a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2008/04/parallel-prefork.php"&gt;Parallel::Prefork&lt;/a&gt;がとても便利です(中で使われている&lt;a href="http://labs.cybozu.co.jp/blog/kazuho/archives/2007/10/perl_mp.php"&gt;Proc::Wait3&lt;/a&gt;というのは初めて知りました)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4616046559236895728?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4616046559236895728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4616046559236895728'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/02/perl.html' title='[Perl] デーモンプログラムを書くには'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-144489419490883721</id><published>2009-02-20T20:47:00.000+09:00</published><updated>2009-03-20T20:53:49.561+09:00</updated><title type='text'>[Life] XMLをコマンドラインで</title><content type='html'>GUIが使えるときは、&lt;a href="http://tf0054.blogspot.com/2009/01/life-xml.html"&gt;折り畳めるエディタ&lt;/a&gt;を使えばよいのだが、ターミナル操作のときにXMLで書かれたファイルの記述を確認するのは、とても難儀する。。。&lt;br /&gt;&lt;br /&gt;と思っていたら&lt;a href="http://d.hatena.ne.jp/shunirr/20081225/p2"&gt;xpathコマンド&lt;/a&gt;を発見。以下のように使う。&lt;br /&gt;&lt;blockquote&gt;D:\apache-solr-trunk\example\solr\conf&gt;xpath schema.xml "(//fieldtype|//fieldType)/@name"&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;これにより、この例ではsolrのスキーマに設定されいてるフィールドに与えられる型一覧を取得することが出来る。便利！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-144489419490883721?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/144489419490883721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/144489419490883721'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/03/life-xml.html' title='[Life] XMLをコマンドラインで'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8112943887707821229</id><published>2009-02-19T01:07:00.003+09:00</published><updated>2009-02-19T01:14:30.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Java] Senのバグ</title><content type='html'>Javaで形態素解析をするときに、使われる&lt;a href="https://sen.dev.java.net/"&gt;Sen&lt;/a&gt;だが本家からダウンロードできるオリジナルソースはバグ付き。これは&lt;a href="http://d.hatena.ne.jp/gnarl/20080912/1221189985"&gt;gnarlさんのページ&lt;/a&gt;に修正方法が詳しく記載されている様子。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8112943887707821229?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8112943887707821229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8112943887707821229'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/02/java-sen.html' title='[Java] Senのバグ'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-230471576248415212</id><published>2009-02-14T02:34:00.001+09:00</published><updated>2009-02-14T02:38:06.165+09:00</updated><title type='text'>[Linux] googleクローラはJavascriptが読める</title><content type='html'>googleのクローラがJavascriptに対応していそう、という記事を発見。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/x/qk/5d/c36_bor_rou_sha_ffeeee.jpg" alt="http://searchengineland.com/an-update-on-javascript-menus-and-seo-16060" title="An Update On Javascript Menus And SEO" width="318" height="87" style="border:none" usemap="#map_xqk5dc36"&gt;&lt;map name="map_xqk5dc36"&gt;&lt;area coords="10,5,299,23" href="http://searchengineland.com/an-update-on-javascript-menus-and-seo-16060" alt="" shape="rect"&gt;&lt;area coords="141,34,222,43" href="http://searchengineland.com/author/jonathan-hochman/" alt="" shape="rect"&gt;&lt;area coords="133,52,309,62" href="http://searchengineland.com/diagnosing-the-seo-health-of-your-website-13852" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/xqk5dc36"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;常識でしょうか。私は知りませんでした。。当然の流れとは言え、すごいことだと思います。&lt;a href="http://www.a-cybernetics.com/blog/?p=30"&gt;Flashが読まれる&lt;/a&gt;ようになったことは知っていて、こちらは奏すべきだろうと思いましたが。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-230471576248415212?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/230471576248415212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/230471576248415212'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/02/linux-googlejavascript.html' title='[Linux] googleクローラはJavascriptが読める'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3250866703273204011</id><published>2009-02-13T01:49:00.005+09:00</published><updated>2009-02-13T01:54:47.236+09:00</updated><title type='text'>[Flash] PixelBlender</title><content type='html'>Flasherな人にしたらいまさらな話なのだと思うが、&lt;a href="http://www.adobe.com/cfusion/exchange/index.cfm?event=productHome&amp;exc=26"&gt;PixelBlender&lt;/a&gt;がすごい。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0tSGvTIRZ7U/SZRTf20J_XI/AAAAAAAAAFs/I4DQDxSKxDU/s1600-h/twirl.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://3.bp.blogspot.com/_0tSGvTIRZ7U/SZRTf20J_XI/AAAAAAAAAFs/I4DQDxSKxDU/s200/twirl.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5301954468077239666" /&gt;&lt;/a&gt;&lt;a href="http://boreal-kiss.com/flash/ex/37/"&gt;画像にぷるん&lt;/a&gt;、とした動きをさせたいと思っていたのが、もろできるようです。&lt;br /&gt;というかこういうのを思いのままに作れるというのであれば(センスは相当必要とされそうだけど)、かなり勉強する価値ありそう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-3250866703273204011?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3250866703273204011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3250866703273204011'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/02/flash-pixelblender.html' title='[Flash] PixelBlender'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_0tSGvTIRZ7U/SZRTf20J_XI/AAAAAAAAAFs/I4DQDxSKxDU/s72-c/twirl.PNG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-704317233585785605</id><published>2009-01-25T04:31:00.000+09:00</published><updated>2009-01-25T04:31:51.097+09:00</updated><title type='text'>[Linux] Kirin</title><content type='html'>相当今更感があるのですが、&lt;a href="http://kirin.tatamilab.jp/"&gt;Kirin&lt;/a&gt;という画像のリサイズなどが行える、画像変換のWebAPIを使ってみました。アプリキーをもらってから使うものなのですが、、説明に書かれている"呼び出し元サーバ名"って、、変換したい元画像が置いてあるサイトのドメイン名を書くのですね。。。うーん。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://kirin.tatamilab.jp/"&gt;&lt;img src="http://kwout.com/cutout/w/83/ab/qs2_bor_rou.jpg" alt="http://kirin.tatamilab.jp/" title="Kirin API:: 画像処理WEB API" width="81" height="77" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:1px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/w83abqs2"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;たまたまGIF画像のリサイズをしてみたので気がついたのですが、戻しはJPGなんですね(JPGのコメントにはしっかり"Kirin Library 1.11 2009/01/25 0"と入っていました)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-704317233585785605?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/704317233585785605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/704317233585785605'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/linux-kirin.html' title='[Linux] Kirin'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8832200862028811181</id><published>2009-01-20T08:16:00.000+09:00</published><updated>2009-03-20T08:19:14.773+09:00</updated><title type='text'>[Scala] TwitterもScalaで</title><content type='html'>Twitterでユーザ間のメッセージ送受信を実装するために使っている(のであろう)、キューイングシステムが、Rubyから(!)いつのまにか&lt;a href="http://robey.livejournal.com/53832.html"&gt;Scalaにて書き直された&lt;/a&gt;、とのこと。その上これはソースも&lt;a href="http://github.com/robey/kestrel/tree/master"&gt;公開&lt;/a&gt;されているので、ぜひ勉強がてら読んでみたい(最近githubが増えてきましたね9。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8832200862028811181?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8832200862028811181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8832200862028811181'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/scala-twitterscala.html' title='[Scala] TwitterもScalaで'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8403937886435054182</id><published>2009-01-20T02:09:00.013+09:00</published><updated>2009-01-21T02:26:31.862+09:00</updated><title type='text'>[Perl] 携帯サイトのアクセス分析!</title><content type='html'>MovableTypeを携帯対応する一番簡単な方法は、&lt;a href="http://www.hazama.nu/pukiwiki/index.php?MT4i"&gt;mt4i&lt;/a&gt;なわけですが、このアクセス解析をapacheログでやるのも面倒に思いました。&lt;br /&gt;なので、最近出た&lt;a href="http://eos.exbridge.jp/projects/show/ga4k"&gt;GA4K&lt;/a&gt;という、&lt;a href="http://www.google.com/analytics/ja-JP/ "&gt;GoogleAnalytics&lt;/a&gt;に携帯アクセスを流すPHPライブラリ(まぁ原理的には&lt;a href="http://blog.modeelf.com/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E8%A7%A3%E6%9E%90/%E6%90%BA%E5%B8%AF%E3%82%B5%E3%82%A4%E3%83%88%E3%81%A7google-analytics_%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89php/"&gt;ココ&lt;/a&gt;でも紹介されているとおり、たいしたことはないのですが)を、Perlモジュールに作り変えてみました(以下ソース。ウェブプロパティID(utmac)とウェブサイトURL(utmhn)は書き換えてください!)。&lt;br /&gt;&lt;pre class="prettyprint"&gt;#&lt;br /&gt;# This code is test module for k-tai web site (ex mt4i)&lt;br /&gt;#&lt;br /&gt;package Onamon;&lt;br /&gt;&lt;br /&gt;sub accessGoogleAnalystics{&lt;br /&gt;&lt;br /&gt;use Sys::Syslog;&lt;br /&gt;require HTTP::Request;&lt;br /&gt;require LWP::UserAgent;&lt;br /&gt;&lt;br /&gt;my $utmac   = 'UA-179xxxx-2';&lt;br /&gt;my $utmhn   = 'http://onamon.com';&lt;br /&gt;my $utmn    = 1000000000 + rand(9999999999 - 1000000000);&lt;br /&gt;my $cookie  = '';&lt;br /&gt;my $uservar = '';&lt;br /&gt;my $random  = 1000000000 + rand(2147483647 - 1000000000);&lt;br /&gt;my $today   = time();&lt;br /&gt;my $referer = $ENV{'HTTP_REFERER'};&lt;br /&gt;my $utmp    = $ENV{'REQUEST_URI'};&lt;br /&gt;&lt;br /&gt;if($ENV{'HTTP_X_UP_SUBNO'}){&lt;br /&gt;        $uservar = $ENV{'HTTP_X_UP_SUBNO'};&lt;br /&gt;}elsif($ENV{'HTTP_X_DCMGUID'}){&lt;br /&gt;        $uservar = $ENV{'HTTP_X_DCMGUID'};&lt;br /&gt;}elsif($ENV{'HTTP_X_JPHONE_UID'}){&lt;br /&gt;        $uservar = $ENV{'HTTP_X_JPHONE_UID'};&lt;br /&gt;}&lt;br /&gt;$cookie = $uservar;&lt;br /&gt;&lt;br /&gt;my $urchinUrl = 'http://www.google-analytics.com/__utm.gif?utmwv=1&amp;utmn='.$utmn.'&amp;utmsr=-&amp;utmsc=-&amp;utmul=-&amp;utmje=0&amp;utmfl=-&amp;utmdt=-&amp;utmhn='.$utmhn.'&amp;utmr='.$referer.'&amp;utmp='.$utmp.'&amp;utmac='.$utmac.'&amp;utmcc=__utma%3D'.$cookie.'.'.$random.'.'.$today.'.'.$today.'.'.$today.'.2%3B%2B__utmb%3D'.$cookie.'%3B%2B__utmc%3D'.$cookie.'%3B%2B__utmz%3D'.$cookie.'.'.$today.'.2.2.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)%3B%2B__utmv%3D'.$cookie.'.'.$uservar.'%3B';&lt;br /&gt;&lt;br /&gt;my $ua = LWP::UserAgent-&gt;new;&lt;br /&gt;my $request = HTTP::Request-&gt;new(GET =&gt; $urchinUrl);&lt;br /&gt;if ($ENV{'HTTP_ACCEPT_LANGUAGE'}) {&lt;br /&gt;        $request-&gt;header('Accept-language' =&gt; $ENV{'HTTP_ACCEPT_LANGUAGE'});&lt;br /&gt;}&lt;br /&gt;if ($ENV{'HTTP_USER_AGENT'}) {&lt;br /&gt;        $request-&gt;header('User-Agent' =&gt; $ENV{'HTTP_USER_AGENT'});&lt;br /&gt;}&lt;br /&gt;my $response = $ua-&gt;request($request);&lt;br /&gt;&lt;br /&gt;openlog(__FILE__, 'cons,pid', 'local4');&lt;br /&gt;if ($response-&gt;is_success) {&lt;br /&gt;        syslog('debug', 'OK('&lt;br /&gt;                .$ENV{'REQUEST_URI'}&lt;br /&gt;                .'^'.$ENV{'HTTP_USER_AGENT'}&lt;br /&gt;                .'^'.$ENV{'HTTP_X_DCMGUID'}&lt;br /&gt;                .')'&lt;br /&gt;        );&lt;br /&gt;} else {&lt;br /&gt;        syslog('debug', 'NG');&lt;br /&gt;}&lt;br /&gt;closelog();&lt;br /&gt;}&lt;br /&gt;1;&lt;br /&gt;&lt;/pre&gt;汚い、というか何も考えていないソースで恥ずかしいですが、一応。mt4iに適用するなら、mt4i.cgiと同じディレクトリに上記ソースをOnamon.pmとして保存し、mt4i.cgiの最初のほうに、&lt;br /&gt;&lt;pre class="prettyprint"&gt;～略～&lt;br /&gt;use FindBin qw($Bin);&lt;br /&gt;use List::Util qw(first);&lt;br /&gt;use HTTP::Date;&lt;br /&gt;use CGI::Carp qw(fatalsToBrowser);&lt;br /&gt;&lt;br /&gt;# ★ここから&lt;br /&gt;use Onamon;&lt;br /&gt;if($ENV{'REQUEST_URI'} !~ /(png|jpg)$/){&lt;br /&gt;        Onamon::accessGoogleAnalystics();&lt;br /&gt;}&lt;br /&gt;# ★ここまで&lt;br /&gt;&lt;br /&gt;my $bin;&lt;br /&gt;my $log_pl;&lt;br /&gt;our %cfg;&lt;br /&gt;&lt;br /&gt;BEGIN {&lt;br /&gt;～以下略～&lt;br /&gt;&lt;/pre&gt;と足します。&lt;a href="http://onamon.com/"&gt;お名紋&lt;/a&gt;と&lt;a href="http://psss.jp/"&gt;贈り物ブログ&lt;/a&gt;に適用してみたのですが、、果たして動くことやら。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8403937886435054182?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8403937886435054182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8403937886435054182'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/perl.html' title='[Perl] 携帯サイトのアクセス分析!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-1067978134136499528</id><published>2009-01-18T19:37:00.000+09:00</published><updated>2009-01-18T19:37:11.096+09:00</updated><title type='text'>[Perl] CTPP2テンプレートエンジン</title><content type='html'>CPANのPerlモジュールがひたすらupdateされていて、頑張っている感のあるテンプレートエンジン(C++で書かれていて各種言語でバインディング可能なもの)。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://freshmeat.net/projects/ctpp2/"&gt;&lt;img src="http://kwout.com/cutout/9/6u/mu/kni_bor_rou_sha_ffeeee.jpg" alt="http://freshmeat.net/projects/ctpp2/" title="freshmeat.net: Project details for CTPP2" width="463" height="63" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:0px"&gt;via &lt;a href="http://kwout.com/quote/96umukni"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;気になるのでメモ(Perlのモジュールは&lt;a href="http://search.cpan.org/dist/HTML-CTPP2/"&gt;コチラ&lt;/a&gt;)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-1067978134136499528?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1067978134136499528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/1067978134136499528'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/perl-ctpp2.html' title='[Perl] CTPP2テンプレートエンジン'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-5757657478852502747</id><published>2009-01-10T23:58:00.002+09:00</published><updated>2009-01-15T00:04:22.013+09:00</updated><title type='text'>[Flash] JPEG格納フォーマット</title><content type='html'>以下ページに良くまとまっている。&lt;br /&gt;&lt;div class="kwout" style="text-align: center;"&gt;&lt;img src="http://kwout.com/cutout/n/db/5d/c36_bor_sha_ffeeee.jpg" alt="http://pwiki.awm.jp/~yoya/?Flash/JPEG" title="Flash SWF 上の JPEG の扱い - Yoya Wiki" width="349" height="95" style="border: none;" usemap="#map_ndb5dc36" /&gt;&lt;map id="map_ndb5dc36" name="map_ndb5dc36"&gt;&lt;area coords="32,0,55,12" href="http://pwiki.awm.jp/~yoya/?Flash" alt="" shape="rect" /&gt;&lt;area coords="27,18,50,30" href="http://pwiki.awm.jp/~yoya/?Flash" alt="" shape="rect" /&gt;&lt;area coords="219,36,299,48" href="http://pwiki.awm.jp/~yoya/?Flash/SWF/format" alt="" shape="rect" /&gt;&lt;area coords="3,0,19,12" href="http://pwiki.awm.jp/~yoya/?FrontPage" alt="" shape="rect" /&gt;&lt;/map&gt;&lt;p style="margin-top: 0px;"&gt;via &lt;a href="http://kwout.com/quote/ndb5dc36"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;a href="http://nakamuu.korare.jp/e16962.html"&gt;こられとやまさんページ&lt;/a&gt;のFlashを&lt;a href="http://swfmill.org/"&gt;swfmill&lt;/a&gt;で解析中(珍しくFlashLite1.1で出来たスライドショー)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-5757657478852502747?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5757657478852502747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/5757657478852502747'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/flash-jpeg.html' title='[Flash] JPEG格納フォーマット'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8203179520364310061</id><published>2009-01-05T23:32:00.001+09:00</published><updated>2009-01-11T23:37:37.327+09:00</updated><title type='text'>[Life] XMLファイルをきちんと扱う</title><content type='html'>最近ミドルウェアの設定ファイルをXMLで書かなくてはならないことが多くなってきた。&lt;br /&gt;可読性が意外と低いので、きちんとXMLを解釈して折りたたみなどができるエディタを探していたのだが、とりあえず&lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt;でできることまでわかった。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SWoDGSXADrI/AAAAAAAAAFY/YaUGUrN8_tM/s1600-h/XML.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://2.bp.blogspot.com/_0tSGvTIRZ7U/SWoDGSXADrI/AAAAAAAAAFY/YaUGUrN8_tM/s200/XML.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5290044118842478258" /&gt;&lt;/a&gt;&lt;br /&gt;Pluginが1つ必要(その名も&lt;a href="http://plugins.jedit.org/plugins/?XML"&gt;XML&lt;/a&gt;というやつ)なのだが、PluginマネージャというGUIでさくっとインストールできる。&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_0tSGvTIRZ7U/SWoDCwb1VEI/AAAAAAAAAFQ/fHaWsMTSesU/s1600-h/Manager.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://1.bp.blogspot.com/_0tSGvTIRZ7U/SWoDCwb1VEI/AAAAAAAAAFQ/fHaWsMTSesU/s200/Manager.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5290044058196333634" /&gt;&lt;/a&gt;&lt;br /&gt;希望していた動きをするので、今しばらくはこれで行こうと思う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8203179520364310061?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8203179520364310061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8203179520364310061'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2009/01/life-xml.html' title='[Life] XMLファイルをきちんと扱う'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_0tSGvTIRZ7U/SWoDGSXADrI/AAAAAAAAAFY/YaUGUrN8_tM/s72-c/XML.PNG' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-2219596718217524305</id><published>2008-12-29T09:25:00.004+09:00</published><updated>2009-01-10T00:32:36.433+09:00</updated><title type='text'>[Solr] 日本語解析には</title><content type='html'>&lt;a href="http://code.google.com/p/cmecab-java/"&gt;cmecab-java&lt;/a&gt;、本当はMeCabをJavaから使うためのバインディング(本家のmecab-javaをSWIG使わず実装したもの)なのだけど、中に&lt;a href="http://tf0054.blogspot.com/2007/02/search-solr.html"&gt;Solr&lt;/a&gt;用のファクトリクラスが含まれていることに注目すべし。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://kwout.com/cutout/a/hn/97/gyj_bor.jpg" alt="http://code.google.com/p/cmecab-java/" title="cmecab-java - Google Code" width="151" height="36" style="border:none" usemap="#map_ahn97gyj"&gt;&lt;map name="map_ahn97gyj"&gt;&lt;area coords="0,0,2,35" href="http://code.google.com/" alt="" shape="rect"&gt;&lt;area coords="11,3,140,22" href="http://code.google.com/p/cmecab-java/" alt="" shape="rect"&gt;&lt;area coords="11,23,137,34" href="http://code.google.com/p/cmecab-java/" alt="" shape="rect"&gt;&lt;/map&gt;&lt;p style="margin-top:0px"&gt;via &lt;a href="http://kwout.com/quote/ahn97gyj"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;Java記述がv1.6系向けで、まだv1.5系の場合は少し書き換えが必要になる(MecabExceptionで2つメソッドを消した/string型のisEmptyを&lt;a href="http://snippets.hachinos.net/lang/java/user/yoshiyoshifujii/2/"&gt;null比較に変更&lt;/a&gt;)のですが、なんとか無事Solr(v1.3)から使えるようになりました。&lt;br /&gt;&lt;br /&gt;あ、あとMacでコンパイルする場合、Makefileが合わないので&lt;a href="http://www.onflow.jp/blog/archives/2004/02/osx_103mecab.html"&gt;シアノさんのページ&lt;/a&gt;を見ながら書き換えること、また、標準Javaのエンコード指定が何故かSJISなので、"-D file.encoding=UTF-8"とする必要があります。&lt;br /&gt;&lt;br /&gt;参考：&lt;a href="http://blog.xole.net/article.php?id=723"&gt;ハタさんのブログ&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-2219596718217524305?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2219596718217524305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/2219596718217524305'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/solr.html' title='[Solr] 日本語解析には'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3040982619998880289</id><published>2008-12-21T22:38:00.000+09:00</published><updated>2008-12-21T22:38:16.599+09:00</updated><title type='text'>[life] ソースをハイライト</title><content type='html'>ブログにソースを張るときに。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://uwanosora.xrea.jp/2008/06/web.html"&gt;&lt;img src="http://kwout.com/cutout/a/2y/qp/mv7_bor.jpg" alt="http://uwanosora.xrea.jp/2008/06/web.html" title="うわの空 - WEBサイトでのソースコード色分けの方法" width="348" height="127" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:0px"&gt;via &lt;a href="http://kwout.com/quote/a2yqpmv7"&gt;kwout&lt;/a&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/25238059-3040982619998880289?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3040982619998880289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3040982619998880289'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/life.html' title='[life] ソースをハイライト'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4978184624743445840</id><published>2008-12-19T22:58:00.003+09:00</published><updated>2009-02-19T01:14:45.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Solr] SpellCheckComponent</title><content type='html'>&lt;a href="http://ja.wikipedia.org/wiki/Solr"&gt;Solr&lt;/a&gt;には「もしかして検索」を実装するのに使えそうなSpellCheckComponentというコンポーネントがあるが、日本語は何故か使えない様子(出所は&lt;a href="http://www.ibm.com/developerworks/jp/java/library/j-solr-update/"&gt;IBMの開発者向けページ&lt;/a&gt;/いつも質が高く関心する)。&lt;br /&gt;Lukeで見るところ、SpellCheck用フィールドのトークナイザをMeCabにしているから、当然キチンとword及びstart3なんかにも、想定した切り方で入っているようだが。。&lt;br /&gt;問題はクエリ側か？&lt;br /&gt;&lt;br /&gt;参考:&lt;a href="http://alias-i.com/lingpipe/demos/tutorial/querySpellChecker/read-me.html"&gt;LingPipe&lt;/a&gt;, &lt;a href="http://wiki.apache.org/solr/SpellCheckComponent"&gt;Wiki&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4978184624743445840?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4978184624743445840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4978184624743445840'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/solr-spellcheckcomponent.html' title='[Solr] SpellCheckComponent'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-6790146921962316106</id><published>2008-12-14T01:04:00.001+09:00</published><updated>2008-12-14T01:04:22.233+09:00</updated><title type='text'>[Life] userchrome.jsの練習で</title><content type='html'>&lt;div &gt; すばらしい先達。これから(も)勉強できそう。 &lt;/div&gt;&lt;table cellpadding="0" cellspacing="0" style="margin: 12px 0px; font-family: arial; color: #333333; background: #ffffff; border: solid 4px #e5e5e5; width: 100%; clear: left;"&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;!-- BEGIN_CLIP_CONTENT ID:CBBA0C67-F42C-4E6D-A66C-4376236BE89B:0 CLIPMARKS.COM --&gt;&lt;div class="CM_CTB_Content_Wrap" style="margin: 0px; padding: 0px;background-color: #ffffff;"&gt;&lt;div style="border-bottom: solid 1px #dcdcdc; white-space: nowrap; margin-bottom: 8px; background-color: #eeeeee ;background-image: url(http://clipmarks.com/images/source-bg.gif); background-repeat: repeat-x; height: 24px; line-height: 24px; vertical-align: middle; padding-bottom: 4px; color: #666666; font-size: 10px;" &gt;&lt;a href="http://clipmarks.com/clip-to-blog/" title="clipmarks' clip-to-blog"&gt;&lt;img src="http://content.clipmarks.com/blog_icon/e10cf6c2-abb5-453e-9c9b-730efd5f85db/CBBA0C67-F42C-4E6D-A66C-4376236BE89B/" alt="" width="19" height="19" border="0" style="vertical-align: middle; margin: 0px 4px; display: inline; border: none; float:none;" /&gt;&lt;/a&gt;clipped from &lt;a title="http://www.code-404.net/articles/browsers/copy-url-lite.ja.utf8.shtml" href="http://www.code-404.net/articles/browsers/copy-url-lite.ja.utf8.shtml" style="font-size: 11px;"&gt;www.code-404.net&lt;/a&gt;&lt;/div&gt;&lt;blockquote style="text-align: left; padding: 0px 8px; margin: 4px 0px 8px 0px; background: transparent; border: none;" cite="http://www.code-404.net/articles/browsers/copy-url-lite.ja.utf8.shtml"&gt;&lt;img height="285" width="433" src="http://www.code-404.net/images/userchromes/copy-url-lite" alt="Copy URL Lite+" /&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="margin: 0px 6px 6px 4px;"&gt;&lt;table style="font-size: 11px;border-spacing: 0px;padding: 0px;" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tr&gt;&lt;td style="background:transparent;border-width:0px;padding:0px;"&gt;&amp;nbsp;&lt;/td&gt;&lt;td align="right" style="background:transparent;border-width:0px;padding:0px;width:107px" width="107"&gt;&lt;a href="http://clipmarks.com/share/CBBA0C67-F42C-4E6D-A66C-4376236BE89B/blog/" title="blog or email this clip"&gt;&lt;img src="http://content8.clipmarks.com/images/c2b-foot.png" border="0" alt="blog it" width="107" height="17" style="border-width:0px;padding:0px;margin:0px;" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-6790146921962316106?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tf0054.blogspot.com/feeds/6790146921962316106/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=25238059&amp;postID=6790146921962316106' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6790146921962316106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/6790146921962316106'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/life-userchromejs.html' title='[Life] userchrome.jsの練習で'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-4801671745851898265</id><published>2008-12-03T02:41:00.002+09:00</published><updated>2008-12-07T04:13:58.492+09:00</updated><title type='text'>[Life] XULの情報元!</title><content type='html'>Firefoxの拡張(&lt;a href="http://tf0054.blogspot.com/2008/11/life-userchrome.html"&gt;userChromeのだけど&lt;/a&gt;)を改訂したくて、&lt;a href="http://ja.wikipedia.org/wiki/XUL"&gt;XUL&lt;/a&gt;のチュートリアルを探していた。しかしそもそもマニアックなので書籍など期待できないな、と思っていたら、、、なんとウェブ上にとてもしっかりとした情報が公開されていました。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://piro.sakura.ne.jp/xul/doc/tutorial/"&gt;&lt;img src="http://kwout.com/cutout/x/z2/te/hrw_bor_rou_sha.jpg" alt="http://piro.sakura.ne.jp/xul/doc/tutorial/" title="XUL Apps &amp;gt; Documentations &amp;gt; Firefox拡張機能開発チュートリアル - outsider reflex" width="350" height="70" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/xz2tehrw"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;本当に、こういう活動には頭が下がります(しかし、本家のチュートリアルも&lt;a href="https://developer.mozilla.org/ja/XUL_Tutorial/"&gt;日本語で充実&lt;/a&gt;してました。もう実は至れり尽くせり!?)。&lt;br /&gt;あれ？でもFirefox2と3で&lt;a href="https://developer.mozilla.org/ja/Updating_extensions_for_Firefox_3"&gt;少しは違う&lt;/a&gt;のかな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-4801671745851898265?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4801671745851898265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/4801671745851898265'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/life-xul.html' title='[Life] XULの情報元!'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7875070001170957801</id><published>2008-12-02T02:23:00.001+09:00</published><updated>2008-12-02T02:23:57.054+09:00</updated><title type='text'>[S3] junglediskの次</title><content type='html'>CUIのツールを探していて、s3cmdが便利そう。pythonで書かれている。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://s3tools.logix.cz/s3cmd"&gt;&lt;img src="http://kwout.com/cutout/a/78/7n/ife_bor_rou_sha.jpg" alt="http://s3tools.logix.cz/s3cmd" title="Amazon S3 tools: s3cmd : command line S3 client" width="308" height="78" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/a787nife"&gt;kwout&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;"--configure"で設定ファイルを書くウイザードになる親切設計。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7875070001170957801?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7875070001170957801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7875070001170957801'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/s3-jungledisk.html' title='[S3] junglediskの次'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-3864010590671304511</id><published>2008-12-01T04:37:00.001+09:00</published><updated>2008-12-01T04:38:14.177+09:00</updated><title type='text'>[Linux] apacheの内部構造</title><content type='html'>1999年当時のものと古いですが、apacheの内部構造が説明された論文(?)を見つけました。&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="https://styx.uwaterloo.ca/~oadragoi/cw/CS746G/a2/acc.html"&gt;&lt;img src="http://kwout.com/cutout/x/77/8s/2uk_bor_rou_sha.jpg" alt="https://styx.uwaterloo.ca/~oadragoi/cw/CS746G/a2/acc.html" title="The Concrete Architecture of the Apache Web Server" width="340" height="116" style="border:none"&gt;&lt;/a&gt;&lt;p style="margin-top:0px;text-align:center"&gt;via &lt;a href="http://kwout.com/quote/x778s2uk"&gt;kwout&lt;/a&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/25238059-3864010590671304511?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3864010590671304511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/3864010590671304511'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/1999apache-via-kwout.html' title='[Linux] apacheの内部構造'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8105350087349001648</id><published>2008-11-30T22:54:00.003+09:00</published><updated>2008-11-30T23:02:25.865+09:00</updated><title type='text'>[PgSQL] セッションの切断方法</title><content type='html'>PostgreSQLは、DBサーバとしてクライアントのセッションについてタイムアウトをかけない。このため、さすがにちょっとセッションが多すぎるな、とDBAが思ったとして、今度はセッションを切断する方法がよくわからない。。&lt;br /&gt;と思ったら、管理者向け関数の中にある&lt;a href="http://www.postgresql.org/docs/8.2/static/functions-admin.html"&gt;pg_cancel_backend(pid int)&lt;/a&gt;というやつが役に立つようだ。これをpsqlからざくっと発行すれば、セッションは殺せるらしい(&lt;a href="http://postgis.refractions.net/pipermail/postgis-users/2008-July/020554.html"&gt;PostgisのML&lt;/a&gt;より)。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SELECT pg_cancel_backend(5220);&lt;/blockquote&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/25238059-8105350087349001648?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8105350087349001648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8105350087349001648'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/11/pgsql.html' title='[PgSQL] セッションの切断方法'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-8687634998836718452</id><published>2008-11-26T22:56:00.001+09:00</published><updated>2009-02-19T01:14:45.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Solr'/><title type='text'>[Solr] jQueryのSolrプラグイン</title><content type='html'>すばらしい!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://f.hatena.ne.jp/images/fotolife/t/tolerance/20080927/20080927182834.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 450px; height: 338px;" src="http://f.hatena.ne.jp/images/fotolife/t/tolerance/20080927/20080927182834.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-8687634998836718452?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8687634998836718452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/8687634998836718452'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/11/solr-jquerysolr.html' title='[Solr] jQueryのSolrプラグイン'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-207851657739199658</id><published>2008-11-24T06:14:00.001+09:00</published><updated>2008-12-01T06:21:49.259+09:00</updated><title type='text'>[Java] 性能試験のときなどに</title><content type='html'>Javaアプリは、性能に関係するパラメータが多すぎてよくわからない。なので試験時に如何にうまく、多くの情報を得て分析できるかが肝要だと思います。&lt;br /&gt;これまで、JVMの情報をSNMPで取れることは知っていて、これを細々とZABBIXでグラフ化したり、少し前からzapcatを知ったのでそれを用いてTomcatのスレッド挙動を見たりしていました。&lt;br /&gt;そして今日、今更ながら&lt;a href="http://tf0054.blogspot.com/2008/07/linux-zapcat.html"&gt;zapcat&lt;/a&gt;のzipファイルの中に「&lt;a href="http://www.kjkoster.org/zapcat/Zabbix_Java_Template.html"&gt;Javaテンプレート&lt;/a&gt;」が入っていることを発見しました。これは偶然、ファイルディスクリプタの消費って取れないのかな？と調べていた中で見つけました。&lt;br /&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/25238059-207851657739199658?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/207851657739199658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/207851657739199658'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/12/java.html' title='[Java] 性能試験のときなどに'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-283804518093806132</id><published>2008-11-20T04:02:00.000+09:00</published><updated>2008-12-07T04:11:16.222+09:00</updated><title type='text'>[Life] userChrome</title><content type='html'>httpヘッダに入ってくるデバッグ用の拡張httpヘッダを探すのに疲れたので、、LiveHeadersなんかを使わず画面上にそれとなく、そのデバック情報を表示してくれるような機能を、(今更ながら)Firefoxの拡張として、&lt;a href="http://www.itmedia.co.jp/enterprise/articles/0708/04/news012.html"&gt;userChrome&lt;/a&gt;を使って書いてみた。画面上はで想定する動きになったので、次はステータスバーか&lt;a href="http://d.hatena.ne.jp/fls/20070101/p1"&gt;メニューに&lt;/a&gt;off/onスイッチを付けたい。&lt;br /&gt;&lt;br /&gt;そもそもJavascriptが苦手ですが、意外に書けるもので、調子にのってこの苦手も克服できるよう、&lt;a href="http://ido.nu/kuma/2008/02/19/extending-firebug-console-add-include-function/"&gt;Javascriptの開発環境を整備&lt;/a&gt;してみようか、と考えています。&lt;br /&gt;&lt;br /&gt;今回はuserChromeを使ってみたのですが、それより前からある(?)&lt;a href="http://blogs.dion.ne.jp/k_sn/archives/2402394.html"&gt;JavascriptActions&lt;/a&gt;というやつと、どっちがどう(良い)のか。知りたいです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-283804518093806132?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/283804518093806132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/283804518093806132'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/11/life-userchrome.html' title='[Life] userChrome'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-7122869004751989665</id><published>2008-11-18T12:28:00.003+09:00</published><updated>2008-11-18T12:31:15.320+09:00</updated><title type='text'>[Life] MS-Accessの調査で</title><content type='html'>MS-Accessから、クエリ名とSQLの一覧を取得するVBAスクリプト(Cドライブ直下にlog.txtという名前でファイルアウトします)。&lt;br /&gt;&lt;br /&gt;Option&amp;nbsp;Compare&amp;nbsp;Database&lt;br /&gt;&lt;br /&gt;Public&amp;nbsp;Sub&amp;nbsp;MyQueryName()&lt;br /&gt;&lt;br /&gt;On&amp;nbsp;Error&amp;nbsp;GoTo&amp;nbsp;エラー&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;Cat&amp;nbsp;As&amp;nbsp;ADOX.Catalog&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;viw&amp;nbsp;As&amp;nbsp;ADOX.View&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;pcd&amp;nbsp;As&amp;nbsp;ADOX.Procedure&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim&amp;nbsp;strmsg&amp;nbsp;As&amp;nbsp;String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&amp;nbsp;ファイルハンドルオープン&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Open&amp;nbsp;&amp;quot;C:\log.txt&amp;quot;&amp;nbsp;For&amp;nbsp;Output&amp;nbsp;As&amp;nbsp;#1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;Cat&amp;nbsp;=&amp;nbsp;New&amp;nbsp;ADOX.Catalog&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cat.ActiveConnection&amp;nbsp;=&amp;nbsp;CurrentProject.Connection&amp;nbsp;'カレントデータベースに接続&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;Each&amp;nbsp;viw&amp;nbsp;In&amp;nbsp;Cat.Views&amp;nbsp;'&amp;nbsp;---&amp;nbsp;A&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strmsg&amp;nbsp;=&amp;nbsp;strmsg&amp;nbsp;&amp;amp;&amp;nbsp;vbNewLine&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;[v]&amp;nbsp;&amp;quot;&amp;nbsp;&amp;amp;&amp;nbsp;viw.Name&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;^&amp;quot;&amp;nbsp;&amp;amp;&amp;nbsp;viw.Command.CommandText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&amp;nbsp;viw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For&amp;nbsp;Each&amp;nbsp;pcd&amp;nbsp;In&amp;nbsp;Cat.Procedures&amp;nbsp;'&amp;nbsp;---&amp;nbsp;B&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If&amp;nbsp;Left(pcd.Name,&amp;nbsp;1)&amp;nbsp;&amp;lt;&amp;gt;&amp;nbsp;&amp;quot;~&amp;quot;&amp;nbsp;Then&amp;nbsp;'&amp;nbsp;---&amp;nbsp;C&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strmsg&amp;nbsp;=&amp;nbsp;strmsg&amp;nbsp;&amp;amp;&amp;nbsp;vbNewLine&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;[p]&amp;nbsp;&amp;quot;&amp;nbsp;&amp;amp;&amp;nbsp;pcd.Name&amp;nbsp;&amp;amp;&amp;nbsp;&amp;quot;^&amp;quot;&amp;nbsp;&amp;amp;&amp;nbsp;pcd.Command.CommandText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&amp;nbsp;pcd&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Print&amp;nbsp;#1,&amp;nbsp;strmsg&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'&amp;nbsp;ファイルハンドルクローズ&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Close&amp;nbsp;#1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox&amp;nbsp;&amp;quot;end.&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&amp;nbsp;Cat&amp;nbsp;=&amp;nbsp;Nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit&amp;nbsp;Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;エラー:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox&amp;nbsp;Err.Number&amp;nbsp;&amp;amp;&amp;nbsp;vbNewLine&amp;nbsp;&amp;amp;&amp;nbsp;Err.Description,&amp;nbsp;vbCritical&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit&amp;nbsp;Sub&lt;br /&gt;&lt;br /&gt;End&amp;nbsp;Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-7122869004751989665?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7122869004751989665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/7122869004751989665'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/11/life-ms-access.html' title='[Life] MS-Accessの調査で'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-25238059.post-527818921667859742</id><published>2008-11-15T04:23:00.008+09:00</published><updated>2009-02-19T01:13:43.475+09:00</updated><title type='text'>[Solr] Normとは</title><content type='html'>Normとはノルムと読み、(Luceneや)&lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;では、検索対象文章の重要度(例/一覧表示するときなど)を決める要素のこと。&lt;br /&gt;&lt;br /&gt;たとえばLength-Nornとは「各単語が含まれている文章が長い場合と、短い文章である場合は、後者のほうが(その単語が)、当該文章において重要である(≒その文章の特徴をあらわすものである可能性が高い)」ということを表現する情報のこと。&lt;br /&gt;&lt;br /&gt;これ以外に、各文書や(その中の)フィールドがそれぞれ指定されうるブースト値も、この中に含まれます。&lt;br /&gt;&lt;br /&gt;なお、よく混同される単語にNormalize(ノーマライズ/Normってこの略かと思いがち)があり、これは広くは正規化処理のことで、こと検索エンジンの世界(?)では、文章を格納するとき(後で使いやすいよう)、半角カナ→全角カナ、だったり、全角アルファベットを半角のそれに統一する処理をいいます。&lt;br /&gt;&lt;br /&gt;。。。と調べようと思っていたら、Luceneのスコアリング解析という&lt;a href="http://www.cybec.co.jp/files/Lucene_WhitePaper_No1.pdf"&gt;ドンピシャなまとまったpdf&lt;/a&gt;が公開されていた。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25238059-527818921667859742?l=tf0054.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/527818921667859742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/25238059/posts/default/527818921667859742'/><link rel='alternate' type='text/html' href='http://tf0054.blogspot.com/2008/11/solr-norm.html' title='[Solr] Normとは'/><author><name>tf0054</name><uri>http://www.blogger.com/profile/10320114687941940832</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
