<?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-3362104472367103283</id><updated>2012-02-08T00:47:55.471+09:00</updated><category term='ruby'/><category term='Xen'/><category term='git'/><category term='amazon'/><category term='rails'/><category term='mac'/><category term='統計'/><category term='雑記'/><category term='プログラミング'/><category term='GAE'/><category term='vim'/><category term='crawler'/><category term='aws'/><category term='JavaScript'/><category term='Java'/><category term='勉強'/><category term='集合知'/><category term='slim3'/><title type='text'>The net is vast</title><subtitle type='html'>プログラミングや、コンピュータなどの備忘録です。
主にRuby, Java, Linux, 等を扱います。アルゴリズムも扱いたいな。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3362104472367103283.post-5195631618032740778</id><published>2011-02-05T06:42:00.000+09:00</published><updated>2011-02-05T06:42:10.058+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>VMのシンプロビジョニングの謎 sparse file</title><content type='html'>KVMなどを触っているとシンプロビジョニングを行えるqcow2等のフォーマットのファイルによく出くわします。lsをしてみると、40Gのファイルが出来ていたりするのですが、実際には4Gくらいしか使っていません。今までどういう仕組なのかわからなかったのですが、これはsparse fileという名前で実際に書きこまれていない領域は確保しないという仕組みのようです。作り方は簡単で、Rubyで書くと次のようになります。&lt;br /&gt;
&lt;pre class="code"&gt;open('a.txt', 'w') do |f|
  f.seek 10000000
  f.puts 'a'
end
&lt;/pre&gt;つまり、実際に書き込まずseekすれば良いということですね。ちなみにこういうファイルをコピーするときにはちゃんと気をつけてコピーしてあげなければいけません。cpコマンドは良きに計らってくれるようですが、rsyncについて自分で指定してあげないといけないのだとか。&lt;br /&gt;
&lt;pre class="code"&gt;rsync --sparse
&lt;/pre&gt;tarでもまとめるときにも余分な部分を削除して通常ファイルを作ってくれます。&lt;br /&gt;
&lt;pre class="code"&gt;tar --sparse
&lt;/pre&gt;これでVMのシンプロビジョニングも怖く有りません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5195631618032740778?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5195631618032740778/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5195631618032740778' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5195631618032740778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5195631618032740778'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2011/02/vm-sparse-file.html' title='VMのシンプロビジョニングの謎 sparse file'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5568109946885600046</id><published>2011-01-09T14:01:00.000+09:00</published><updated>2011-01-09T14:01:54.845+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>git cleanで追跡されていないファイルを削除する</title><content type='html'>gitで途中までファイルを追加してしまったんだけど、元に戻したいときってありますよね？&lt;br /&gt;
そういうときはgit clean。&lt;br /&gt;
追跡されていないファイルを奇麗に削除してくれます。&lt;br /&gt;
&lt;br /&gt;
ただし、オプションで -f をつけないと削除してくれません。&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="code"&gt;git clean -f
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5568109946885600046?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5568109946885600046/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5568109946885600046' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5568109946885600046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5568109946885600046'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2011/01/git-clean.html' title='git cleanで追跡されていないファイルを削除する'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-673185747567784679</id><published>2011-01-05T00:00:00.002+09:00</published><updated>2011-01-05T00:10:19.320+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>dreamhost(linux) + rsyncで差分バックアップをする方法</title><content type='html'>中学校の頃からデジカメで写真を撮ってきて、バックアップをろくにとっていませんでした。いつもバックアップしようと思うのですが、当時はCD-Rに入りきらないし、DVD-Rがでてもその頃にはDVD-Rにも入りきらない状態でした。だからいつも億劫になってしまってバックアップを取ってこなかったのです。&lt;br /&gt;
&lt;br /&gt;
それじゃまずいだろということで、さすがに良い歳にもなったのでそろそろまじめにバックアップを考えました。調べてみると最近はいろいろと手段があるようでした。Webサービスであれば&lt;a href="http://www.dropbox.com/"&gt;Dropbox&lt;/a&gt;が有名ですが、これは容量制限が結構小さいので無理ですし、最近でてきた&lt;a href="http://virusbuster.jp/safesync/"&gt;トレンドマイクロ オンラインストレージ SafeSync&lt;/a&gt;もあまり使い勝手が良くないようです。&lt;br /&gt;
&lt;br /&gt;
ここは、技術者の端くれとしてバックアップスクリプトを自分で書くのだということで、調べているとrsyncがバックアップしてくれるらしい記述を発見。--link-destというオプションをつけると、差分バックを取ってくれるようです。仕組みは意外とシンプルで、linuxの仕組みを使っていて感心しました。&lt;br /&gt;
&lt;br /&gt;
ext2系のファイルフォーマットではi-nodeという仕組みでファイルを管理しています。ハードリンクを使うと同じi-nodeを指し示す別名のファイルを作成する事ができるのです。つまり、ファイル名は異なっても指し示しているファイルは同じ物です。つまり、このrsync --link-destを使ってバックアップを使用している限り、任意の時点からの差分バックアップが簡単にとれるのです。&lt;br /&gt;
&lt;br /&gt;
また、私は&lt;a href="http://www.dreamhost.com/"&gt;DreamHost&lt;/a&gt;でサーバをレンタルしているのですが、このDreamHostはディスク容量が無制限なので、自由にバックアップする事ができます。しかし、本当に無制限で大丈夫なんでしょうかね？まぁちゃんとunlimited diskと書いてあるのでありがたく使わせてもらいましょう。&lt;br /&gt;
&lt;br /&gt;
肝心のスクリプトですが、こんな感じになりました。これを定期的に実行すればバックアップは完璧ですね！&lt;br /&gt;
&lt;pre name="code" class="code"&gt;SOURCE_DIR=~/Documents/backuped
DEST_HOST=user@dreamhost.com
DEST_DIR=/home/user/backup
DATE=`TZ=JST-9 date "+%Y%m%d%H%M%S"`

CURRENT=$DEST_DIR/current
RELATIVE_CURRENT=../current
THIS_TIME=$DEST_DIR/$DATE

rsync -av --delete --link-dest $RELATIVE_CURRENT $SOURCE_DIR $DEST_HOST:$THIS_TIME
ssh $DEST_HOST "rm -fr $CURRENT; ln -s $THIS_TIME $CURRENT"
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-673185747567784679?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/673185747567784679/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=673185747567784679' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/673185747567784679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/673185747567784679'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2011/01/dreamhostlinux-rsync.html' title='dreamhost(linux) + rsyncで差分バックアップをする方法'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5300829268882075230</id><published>2011-01-02T00:52:00.000+09:00</published><updated>2011-01-02T00:52:57.499+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>OSXでRuby1.9.2にバージョンアップしたらgemが動かなかった</title><content type='html'>Snow Leopardのportsでrubyを1.9.1から1.9.2にバージョンアップした。そうしたらgemが動かなくなってしまったんです。&lt;br /&gt;
&lt;blockquote class="code"&gt;$ gem1.9&lt;br /&gt;
&lt;br /&gt;
/opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:68:in `installed_spec_directories’: undefined method `path’ for Gem:Module (NoMethodError)&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/source_index.rb:58:in `from_installed_gems’&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:883:in `source_index’&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:81:in `init_gemspecs’&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems/gem_path_searcher.rb:13:in `initialize’&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `new’&lt;br /&gt;
from /opt/local/lib/ruby1.9/site_ruby/1.9.1/rubygems.rb:841:in `block in searcher’&lt;br /&gt;
from &lt;internal:prelude&gt;:10:in `synchronize’&lt;br /&gt;
&lt;…and so on…&gt;&lt;/blockquote&gt;&lt;br /&gt;
どうした物かとググってみてたら&lt;a href="http://www.prestonlee.com/2010/09/24/upgrading-from-ruby-1-9-1-to-ruby-1-9-2/"&gt;Preston Lee&amp;apos;s Blog&lt;/a&gt;に書いてありました。まさに的確な対処法。&lt;br /&gt;
&lt;br /&gt;
要するに以下のコマンドを叩けばよい。ただ下のコマンドはファイルを完全に削除してしまうので注意してくださいね。&lt;br /&gt;
&lt;blockquote class="code"&gt;sudo rm -rf /opt/local/lib/ruby1.9/site_ruby/&lt;/blockquote&gt;&lt;br /&gt;
実際に叩いてみるとあっさり動くようになりました。&lt;br /&gt;
どうやら以前のバージョンのgemを見てしまうのが問題だそうです。&lt;br /&gt;
&lt;br /&gt;
詳しくは&lt;a href="http://www.prestonlee.com/2010/09/24/upgrading-from-ruby-1-9-1-to-ruby-1-9-2/"&gt;Preston Lee&amp;apos;s Blog&lt;/a&gt;を参照してください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5300829268882075230?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5300829268882075230/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5300829268882075230' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5300829268882075230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5300829268882075230'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2011/01/osxruby192gem.html' title='OSXでRuby1.9.2にバージョンアップしたらgemが動かなかった'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-8754975898004797543</id><published>2010-12-09T21:33:00.000+09:00</published><updated>2010-12-09T21:33:30.677+09:00</updated><title type='text'>自分でWEBサービスを作りたいと思っている人へ(プログラミング経験者)</title><content type='html'>とりあえず、こっちに写しておく。&lt;br /&gt;
http://anond.hatelabo.jp/20101207002426からの転載&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Webサービスを公開するまでの軌跡を語るよ&lt;br /&gt;
&lt;br /&gt;
自分でWEBサービスを作りたいと思っている人へ ( &lt;a href="http://anond.hatelabo.jp/20101203150748"&gt;http://anond.hatelabo.jp/20101203150748&lt;/a&gt; ) を読んで、初心者じゃなくてある程度の経験者が作ったらこうなるんだよってことで書いています。でも正直4ヶ月でそこまでできるようになるなんておそらく相当頭がいいんじゃないかなと思うんです。いや、本当に凄いと思う。&lt;br /&gt;
まず作ったサービスはグルーポンチケットのまとめサイト。 グルーポンナビ( &lt;a href="http://gp-navi.net/"&gt;http://gp-navi.net/&lt;/a&gt; )まず自分のスペックだけど、昔から趣味でプログラムやったり仕事でプログラムしたりしてました。Web系ばっかりやってるいちおうこういうのを作るのには慣れてる方です。&lt;br /&gt;
お金使いたくないからHerokuを使う&lt;br /&gt;
&lt;br /&gt;
それで私ですが、まず最初に &lt;a href="http://anond.hatelabo.jp/20101203150748"&gt;http://anond.hatelabo.jp/20101203150748&lt;/a&gt; の人と同じで全然お金を使いたくなかったです。だからいろんなホスティング会社を探したりしたんですが、VPSを借りちゃうと大金がかかるんですよね。そこで、いわゆる流行のクラウドであるHeroku( &lt;a href="http://heroku.com/"&gt;http://heroku.com/&lt;/a&gt; )を使う事にしました。&lt;br /&gt;
このHerokuは無料で使えるから良いんですけど、バッチ処理を行うには有料のサーバを契約しなくちゃいけないんです。しかもWebの一回のリクエストは30秒までに押さえなくちゃいけないっていう制限があったりで、正直無料で使うには厳しい。&lt;br /&gt;
でもやっぱり無料っていう響きに吸い寄せられてHerokuを使うと決めてアプリケーションを書き始めました。Railsで書いて賞味2週間くらいちまちまと進めてアプリを完成させました。だいたい一日2時間くらいかな。Railsにはそこまで詳しくはなかったけど、Webで検索すれば結構情報がヒットするからそこまでの苦労は無かったです。それよりも制限のあるHerokuでどうやって実現するかというのが、結構問題でした。&lt;br /&gt;
でもやっぱり無料じゃ厳しい&lt;br /&gt;
&lt;br /&gt;
それでしばらく運用してました。このときは全然宣伝しませんでしたから、ほとんどページビューはあがらなかったです。宣伝大事。これほんと。それでHerokuで作った仕組みなんですが、無料でやりたかったので、Workersを契約しないでアプリをつくってました。だからWebのリクエストをトリガーとして普通にクロールさせるよう作ったんです。でも、クロールするサイトを徐々に増やしていくと30秒以内にリクエストが終了しなくなってきてさぁ問題。どうしようかと考えたあげく、レンタルサーバもいいなっておもったけど、結局自宅サーバをたてることにしました。たぶん、これが一番コストパフォーマンスが良い。でも気をつけなくちゃ行けないのが、サーバ自体の管理を自分でやらなくちゃいけないから結構めんどくさいんですよね。結局自宅サーバかよって感じです。&lt;br /&gt;
サーバの発注とかシステムの構成&lt;br /&gt;
&lt;br /&gt;
サーバをNTT-X Storeで発注して発注して、16,800円。かなり安いです。このサーバの詳細は &lt;a href="http://wiki.nothing.sh/page/NEC%20Express5800%A1%BFGT110b"&gt;http://wiki.nothing.sh/page/NEC%20Express5800%A1%BFGT110b&lt;/a&gt; に書かれています。なんでこのマシンにしたのかというと、VMWareのESXiで仮想化をしたくて、それに対応している安いサーバがこれだったというわけ。ちなみに、これをすると管理が楽になる。例えば、マシンのバックアップが取りたいなと思ってもすぐできるんですね。だから仮想化は凄く良い。&lt;br /&gt;
でも、素のGT110bを使うとメモリも少ないしCPUも弱いしハードディスクも少ないので、これはネットで買い足しました。あ、あとデスクトップ用のモニタが無かったのでそれも中古で買いました。それが次のような感じ。&lt;br /&gt;
Express/GT110b ¥16,800&lt;br /&gt;
Core i5 760 BOX ¥16,898&lt;br /&gt;
Samsung3.5インチHDD(SerialATA)/容量:1TB HD103SJ ¥4,980&lt;br /&gt;
TS256MLK72V3U [2GB DDR3 1333 ECC Long-DIMM 永久保証] ¥13,398&lt;br /&gt;
中古の液晶モニタ 15inch ¥3,980&lt;br /&gt;
計: ¥56,056&lt;br /&gt;
ずいぶんと安い買い物だったと思います。もちろん、マシンの上で動かしているOSはLinuxなので、ライセンス料もかからないしとてもリーズナブルです。&lt;br /&gt;
ここまできたら後はアプリを作り直すだけでした。Herokuで作ってたときにはHerokuの制限を考えながらアプリを作ってたので作りづらかったですが、自宅サーバを使うとそういった制限はなくなるのですごく作りやすい。お金を払うだけの価値はあると思います。やっぱりお金をかけるべきところはかけないとダメですね。&lt;br /&gt;
携帯対応とか&lt;br /&gt;
&lt;br /&gt;
それから結構このアプリケーションは携帯ユーザの女の子がよく使ってくれます。結構教えると毎日見てくれるんですよ。やっぱりお買い物と言えば女の子ですね。だから、携帯対応しました。携帯はいままでやった事は無かったんだけど、Railsのプラグインであるjpmobile( &lt;a href="https://github.com/darashi/jpmobile"&gt;https://github.com/darashi/jpmobile&lt;/a&gt;)を使ったところすごく簡単に対応する事ができた。凄いですね。id:darashiさんに感謝です。&lt;br /&gt;
iPhoneも対応していますが、こちらもあまり詳しくなかったので最初はjQuery mobileを使って構築しました。でもちょっと重かったのでjQuery mobileはやめて手組しています。そもそも一ページしか無いのでそんない難しい事は無いですね。&lt;br /&gt;
感想&lt;br /&gt;
&lt;br /&gt;
最後に一番強調したい事を。。。&lt;br /&gt;
ウェブサービス公開するのはそこまで難しくないんですが、それを流行らせるのはかなり難しいですね。面白いサービスとかであれば結構色んなところがとりあげてくれたりするんですけど、後発のサービスになるとなかなか。。。開発者の方は作る事よりもどうやってみんなに知ってもらうかを考えるのがすごく大変な事だと思います。お金かけて広告うてれば楽なんですけどね。&lt;br /&gt;
とにかく作ったら公開。やる事は各方面への宣伝です。今のところやってるのはTwitterへの投稿と、ここへの投稿ですかね。これからいろいろ試そうとしているところ。このサービスがある程度知名度が上がってきたらまたそのとき軌跡を書きたいと思います。&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-8754975898004797543?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/8754975898004797543/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=8754975898004797543' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8754975898004797543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8754975898004797543'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/12/web.html' title='自分でWEBサービスを作りたいと思っている人へ(プログラミング経験者)'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5462824118106341014</id><published>2010-10-15T00:34:00.005+09:00</published><updated>2010-10-15T01:15:26.381+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><title type='text'>vim-quickrunを使って高速開発</title><content type='html'>最近プログラミングコンテストチャレンジブックを読もうとしています。
&lt;iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=000000&amp;fc1=cccccc&amp;lc1=00E0FF&amp;t=jx-22&amp;o=9&amp;p=8&amp;l=as1&amp;m=amazon&amp;f=ifr&amp;md=1X69VDGQCMF7Z30FM082&amp;asins=4839931992"
style="width:120px;height:240px;" scrolling="no" marginwidth="0"
marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

そこで、c++を勉強してみようかと考えているのですが、学習効率の向上のため、vimで高速に開発できないものかといろいろ調べてみたところ、quickrun.vimというものが見つかりました。

&lt;h3&gt;quickrun.vimの種類&lt;/h3&gt;
quickrun.vimには2種類あるみたいでujihisaさんが作った&lt;a
href="http://github.com/ujihisa/quickrun/"&gt;quickrun.vim&lt;/a&gt;とthincaさんが作った&lt;a
href="http://github.com/thinca/vim-quickrun"&gt;vim-quickrun&lt;/a&gt;があるみたい。で、ujihisaさんの昨日はthincaさんのvim-quickrunに取り込まれてるらしいので、&lt;a
href="http://github.com/thinca/vim-quickrun"&gt;vim-quickrun&lt;/a&gt;を使えば良いみたいです。

&lt;h3&gt;インストール&lt;/h3&gt;
&lt;a href="http://github.com/thinca/vim-quickrun"&gt;vim-quickrun&lt;/a&gt;はShougoさんが作った&lt;a
href="http://github.com/Shougo/vimshell"&gt;vimshell&lt;/a&gt;を必要としているのでそちらも必要になります。また、Vimは7.2以上が必要条件のようです。
そして、これらをpluginにコピーしてやればOK。
&lt;pre class="code"&gt;git clone http://github.com/Shougo/vimshell.git
git clone http://github.com/thinca/vim-quickrun.git
pushd .
cd vimshell
cp -R * ~/.vim/
popd
cd vim-quickrun
cp -R * ~/.vim/&lt;/pre&gt;
これでうまく動きます。かなり快適に勉強できますよ！！

&lt;a href="http://github.com/thinca/vim-quickrun"&gt;vim-quickrun&lt;/a&gt;オススメ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5462824118106341014?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5462824118106341014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5462824118106341014' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5462824118106341014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5462824118106341014'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/10/vim-quickrun.html' title='vim-quickrunを使って高速開発'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7227666850523139466</id><published>2010-10-09T00:53:00.003+09:00</published><updated>2010-10-09T01:11:23.745+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>Dreamhostで自分だけがアクセスするgitレポジトリを作成する</title><content type='html'>今までSubversionを利用していたのですが、Herokuを使う事もあり普段使うバージョン管理ツールもgitにしようとしています。そこで、自分が自由に使えるレポジトリを創りたかったのですが、githubだと有料だし、せっかくDreamhostを借りているんだからここでレポジトリを作成したいと思います。なるべく簡単にいきます。手間をかけたくないですからね。

&lt;h3&gt;レポジトリの作成&lt;/h3&gt;
まずプロジェクトを格納するディレクトリを作成します。以下のように作成しておけばレポジトリを追加したくなったら~/git/以下にディレクトリをどんどん掘って行けば良いですね。
&lt;pre class="code"&gt;[DREAMHOST]$ mkdir -p ~/git/SomeProject.git&lt;/pre&gt;
今度は作成したディレクトリをレポジトリにします。
&lt;pre class="code"&gt;[DREAMHOST]$ cd ~/git/SomeProject.git
[dreamhost]$ git --bare init&lt;/pre&gt;
今度はローカルホストでレポジトリをcloneします。
&lt;pre class="code"&gt;[localhost]$ git clone ssh://USERNAME@DREAMHOST/home/USERNAME/git/SomeProject.git&lt;/pre&gt;
さらに、このレポジトリに名前を付けておきましょう。
&lt;pre class="code"&gt;[localhost]$ git remote add NAME ssh://USERNAME@DREAMHOST/home/USERNAME/git/SomeProject.git&lt;/pre&gt;
ここまですれば簡単にgitを使う事ができます。
ローカルでの変更後
&lt;pre class="code"&gt;[localhost]$ git add -A
[localhost]$ git commit -m 'some message'
[localhost]$ git push NAME master&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7227666850523139466?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7227666850523139466/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7227666850523139466' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7227666850523139466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7227666850523139466'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/10/dreamhostgit.html' title='Dreamhostで自分だけがアクセスするgitレポジトリを作成する'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7981791136814934884</id><published>2010-09-24T23:42:00.003+09:00</published><updated>2010-09-24T23:54:22.425+09:00</updated><title type='text'>グルーポンナビをHerokuで公開しました</title><content type='html'>グルーポンは各サイトでクーポンを販売しています。しかし、どのサイトも別々に作られており、 自分の欲しいクーポンを探すのが困難です。そこで、今各グルーポン系のサイトが どのようなクーポンを発売しているのかを一覧にしてわかりやすくまとめた&lt;a href="http://gp.jirox.net/"&gt;サイト&lt;/a&gt;を作成しました。

&lt;a href="http://gp.jirox.net/"&gt;グルーポンナビ&lt;/a&gt;を閲覧する事によってあなたの欲しいクーポンがすぐに見つけることができます。

&lt;h3&gt;ちょっと技術的な事&lt;/h3&gt;
この&lt;a href="http://gp.jirox.net/"&gt;グルーポンナビ&lt;/a&gt;は&lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;で動いています。どこで動作させようか考えたんですが、サーバの管理はしたくないし、お金は使いたくないしということで、1Dynoまで無料の&lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;で動かす事にしました。やっぱり、こういったPaaSはサーバの事をほとんど考えなくていいので楽で良いですね。

ぜひ&lt;a href="http://gp.jirox.net/"&gt;グルーポンナビ&lt;/a&gt;をよろしく。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7981791136814934884?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7981791136814934884/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7981791136814934884' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7981791136814934884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7981791136814934884'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/09/blog-post.html' title='グルーポンナビをHerokuで公開しました'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-9130105577558821543</id><published>2010-09-24T21:53:00.003+09:00</published><updated>2010-09-24T22:06:08.081+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Macですぐにモニタをスリープさせる</title><content type='html'>Macで音楽を聴いてるとき、モニタがつきっぱなしで電気がもったいないですよね。そんなときにはすぐさまモニタをスリープさせましょう。
その方法は以下の通り。Enjoy your mac!
&lt;pre class="code"&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt;&lt;kbd&gt;Shift&lt;/kbd&gt;&lt;kbd&gt;⏏&lt;/kbd&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-9130105577558821543?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/9130105577558821543/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=9130105577558821543' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/9130105577558821543'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/9130105577558821543'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/09/mac.html' title='Macですぐにモニタをスリープさせる'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-4819296562170815634</id><published>2010-09-23T18:47:00.007+09:00</published><updated>2010-09-23T18:58:59.633+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>Bashで実行ファイルのディレクトリを取得する方法</title><content type='html'>ネットで探してもBashで実行ファイルのディレクトリを取得する方法がなかなか見つからなかった。
やっと見つけたのが以下のページ

&lt;a href="http://blog.gijutsuya.jp/harajune/2010/08/31/how-to-get-script-working-dir/"&gt;shでスクリプトの実行ディレクトリを取得する - 進・日進月歩&lt;/a&gt;
&lt;pre name="code" class="java"&gt;echo $(cd $(dirname $0);pwd)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-4819296562170815634?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/4819296562170815634/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=4819296562170815634' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4819296562170815634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4819296562170815634'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/09/bash.html' title='Bashで実行ファイルのディレクトリを取得する方法'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5201553949971849872</id><published>2010-04-08T22:32:00.004+09:00</published><updated>2010-04-08T22:46:34.524+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Herokuでプロジェクトを作成する</title><content type='html'>&lt;a href="http://heroku.com/"&gt;Heroku&lt;/a&gt;はRailsのPaaS環境です。ここで作っておけば、簡単にスケールさせる事ができるのかな？いまいちわかってませんが、容量を5Mしか使わなければ、ただで使用する事ができます。だから、ちょっとしたものを公開するにはもってこいの環境かな。

早速プロジェクトを作成しましょう。まずはサインアップをします。トップページにサインアップボタンがあります。
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_iCwu8O8WgFs/S73blCBybcI/AAAAAAAAAPI/MUb2ged-J4w/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-04-08+22.34.47%EF%BC%89.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 224px; height: 57px;" src="http://2.bp.blogspot.com/_iCwu8O8WgFs/S73blCBybcI/AAAAAAAAAPI/MUb2ged-J4w/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-04-08+22.34.47%EF%BC%89.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5457759752688922050" /&gt;&lt;/a&gt;
サインアップが済むと、アプリケーションの導入のページが表示されます。それに従います。
&lt;pre class="code"&gt;sudo gem install heroku&lt;/pre&gt;
これで、必要なgemがそろいます。次に、既に作成してあるRailsアプリに移動し、gitにコミット
&lt;pre class="code"&gt;cd myapp
git init &amp;&amp; git add . &amp;&amp; git commit -m "first commit"
&lt;/pre&gt;

次に、Herokuアプリケーションを作成します。
&lt;pre class="code"&gt;heroku create
Created http://sharp-autumn-42.com/ | git@heroku.com:sharp-autumn-42.git
Git remote heroku added&lt;/pre&gt;
しかし、ここでSSHのエラーが出る場合があります。こんな感じ
&lt;pre class="code"&gt;No ssh public key found in /Users/hoge/.ssh/id_[rd]sa.pub.  You may want to specify the full path to the keyfile.&lt;/pre&gt;

ですので、sshのキーを作成しましょう。
&lt;pre class="code"&gt;ssh-keygen&lt;/pre&gt;
是を実行すればsshのエラーが出なくなり、heroku createコマンドは成功します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5201553949971849872?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5201553949971849872/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5201553949971849872' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5201553949971849872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5201553949971849872'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/04/heroku.html' title='Herokuでプロジェクトを作成する'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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/_iCwu8O8WgFs/S73blCBybcI/AAAAAAAAAPI/MUb2ged-J4w/s72-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%EF%BC%882010-04-08+22.34.47%EF%BC%89.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3362104472367103283.post-4576996705280864337</id><published>2010-03-07T22:20:00.008+09:00</published><updated>2010-03-07T22:45:32.472+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>java.util.UUIDの落とし穴</title><content type='html'>&lt;div&gt;JavaでUUIDを生成するためにはjava.util.UUIDを使用する事ができる。簡単に使うためには以下のようにすれば良い。
&lt;pre name="code" class="java"&gt;String uuid = UUID.randomUUID().toString();&lt;/pre&gt;だけれども、これで生成されるものをよく知らないと行けないので、その前にUUIDについて調べてみました。&lt;/div&gt;
&lt;h3&gt;UUIDについて&lt;/h3&gt;
&lt;div&gt;
&lt;a href="http://d.hatena.ne.jp/dayflower/20090306/1236314881"&gt;UUID と Perl について - daily dayflower&lt;/a&gt;によると、UUIDには5つあります。引用です。
&lt;blockquote class="code"&gt;&lt;table&gt; 
    &lt;tr&gt;&lt;th&gt;Version&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt; 
    &lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;時刻と&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CE%A1%BC%A5%C9"&gt;ノード&lt;/a&gt;をベースに一意値を算出&lt;/td&gt;&lt;/tr&gt; 
    &lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;（&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/POSIX"&gt;POSIX&lt;/a&gt; UID を埋め込んだ DCE Security バージョン&lt;span class="footnote"&gt;&lt;a href="/dayflower/20090306/1236314881#20090306f2" name="20090306fn2" title="自分でも何を書いているかよくわかりませんが，後述するようにこのバージョンについては省略します"&gt;*2&lt;/a&gt;&lt;/span&gt;）&lt;/td&gt;&lt;/tr&gt; 
    &lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;ある&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BE%C1%B0%B6%F5%B4%D6"&gt;名前空間&lt;/a&gt;に属するユニークな値から &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/MD5"&gt;MD5&lt;/a&gt; により一意値を算出&lt;/td&gt;&lt;/tr&gt; 
    &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;完全ランダム&lt;/td&gt;&lt;/tr&gt; 
    &lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;ある&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%CC%BE%C1%B0%B6%F5%B4%D6"&gt;名前空間&lt;/a&gt;に属するユニークな値から &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/SHA%2D1"&gt;SHA-1&lt;/a&gt; により一意値を算出&lt;/td&gt;&lt;/tr&gt; 
 
   &lt;/table&gt; &lt;/blockquote&gt;
このうち、複数のマシンで実行したときに最もユニークになる確率が高いものはバージョン1です。おそらく時代的にもそういった用途が多いのではないかと思います。
&lt;/div&gt;
&lt;h3&gt;java.util.UUIDの生成するUUID&lt;/h3&gt;
&lt;div&gt;
これがくせ者なのですが、上記のコードで生成するUUIDのバージョンは実は1ではなくて4なのです。つまり、異なるマシンで実行すると重複する可能性がバージョン1よりも高い事になります。といっても、重複する可能性は相当低いのでしょうが、、、、じゃあ、どのようにしてバージョン1のUUIDを生成したら良いのかを調べてみました。&lt;br/&gt;
&lt;br/&gt;
どうやら、JDKのJavaでversion 1は作れないようです(via &lt;a href="http://johannburkard.de/blog/programming/java/Java-UUID-generators-compared.html"&gt;Java UUID generators compared&lt;/a&gt;)。代わりに&lt;a href="http://johannburkard.de/software/uuid/"&gt;UUID – generate UUIDs (or GUIDs) in Java&lt;/a&gt;をつかうというのも手ですね。もし、ほかに何か手があるようでしたら教えてください。
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-4576996705280864337?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/4576996705280864337/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=4576996705280864337' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4576996705280864337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4576996705280864337'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/03/javautiluuid.html' title='java.util.UUIDの落とし穴'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5245008460031374412</id><published>2010-03-06T15:26:00.005+09:00</published><updated>2010-03-06T15:38:01.979+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>HTMLの文字コードの指定方法についての不思議</title><content type='html'>&lt;p&gt;
自分が作ってるサイトのページ&lt;a href="http://palito.jp/"&gt;Home - Capoeira&lt;/a&gt;でIEにて文字化けが発生すると言われていました。ちゃんと、HTMLのmetaタグにContentTypeを指定していたにも関わらずです。そこで、調べてみると、&lt;a href="http://www.w3.org/TR/1999/REC-html401-19991224/charset.html#spec-char-encoding"&gt;HTML Document Representation&lt;/a&gt;に載っていました。優先される順に書くと、
&lt;/p&gt;
&lt;blockquote&gt;&lt;ol style="list-style-type: decimal;"&gt;
&lt;li&gt;An HTTP "charset" parameter in a "Content-Type" field.&lt;/li&gt;
&lt;li&gt;A META declaration with "http-equiv" set to "Content-Type" and a value set for "charset".&lt;/li&gt;
&lt;li&gt;The charset attribute set on an element that designates an external resource.&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;となっています。&lt;a href="http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/charset.html#h-5.2.2"&gt;日本語訳&lt;/a&gt;から持ってくると、&lt;/p&gt;
&lt;blockquote&gt;&lt;ol style="list-style-type: decimal;"&gt;
&lt;li&gt;HTTPヘッダのContent-Typeフィールドの、charsetパラメータ。&lt;/li&gt;
&lt;li&gt;META要素で、http-equiv属性値がContent-Typeかつvalue属性の値にcharset情報があるもの。&lt;/li&gt;
&lt;li&gt;外部リソースを指している要素に設定されているcharset属性値。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;
3番目は何をさしているのはよくわかりませんが、少なくとも1番目と２番目は逆であるべきだと思うのですが、なんでこのような順序になっているのでしょうか？管理者がcharset=euc-jpで設定していても、各HTMLの作成者がUTF-8で書いていれば、そちらを優先すべきだと思うのですが、なにか理由があるのでしょうか。ん〜不思議
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5245008460031374412?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5245008460031374412/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5245008460031374412' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5245008460031374412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5245008460031374412'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/03/html.html' title='HTMLの文字コードの指定方法についての不思議'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-1163781375283262417</id><published>2010-02-28T21:39:00.002+09:00</published><updated>2010-02-28T21:43:48.981+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>RAILSのルートディレクトリを取得する</title><content type='html'>&lt;pre class="brush: ruby"&gt;
::RAILS_ROOT
&lt;/pre&gt;
これでルートディレクトリが取得できる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-1163781375283262417?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/1163781375283262417/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=1163781375283262417' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1163781375283262417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1163781375283262417'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/rails_28.html' title='RAILSのルートディレクトリを取得する'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7610668299086183863</id><published>2010-02-24T01:50:00.006+09:00</published><updated>2010-02-24T01:59:24.477+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Railsのトランザクションの中ではスレッドが使えない</title><content type='html'>&lt;p&gt;
例えば次のようなロールバックを期待するソースコードを書いても実際にはコミットされてしまう。&lt;br/&gt;
どうしてもスレッドを使いたかったら、スレッドの外でModelを作成するのがいいんじゃないかと思う。
&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;
begin
  ActiveRecord::Base::transaction() do
    h = Thread.start do
      Bookmark.create
      throw 'hoge'
    end
    h.join
  end
rescue
  p $!
end

p Bookmark.find(:all).size
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7610668299086183863?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7610668299086183863/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7610668299086183863' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7610668299086183863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7610668299086183863'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/rails.html' title='Railsのトランザクションの中ではスレッドが使えない'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-6328270178103071327</id><published>2010-02-24T01:03:00.005+09:00</published><updated>2010-02-24T01:10:40.951+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Snow LeopardにRailsをインストールする</title><content type='html'>おおかた、世間に出回ってる方法でOK。&lt;a href="http://d.hatena.ne.jp/sawada0903/20090612/1244756957"&gt;MacOSX LeopardにRailsをめちゃ綺麗にいれる簡単な方法 - デキルプログラマーになるのだ&lt;/a&gt;より引用
&lt;blockquote class="code"&gt;&lt;pre&gt;(1)OSを最新の状態に保つ
ソフトウェアアップデートによってOSを最新版にすること。
(2)ADCから最新版のXcodeをインストール
ほぼ1G近く、ダウンロードに30分を要します。
http://developer.apple.com/jp/
(3)MacPortsをインストール
普通にパッケージ形式で落ちているのでインストールして下さい。
(4)MacPortsをUpdateする
http://www.macports.org/
ここからターミナルを立ち上げます。
sudo port -d selfupdate
sudo port sync
(5)portでMySQLとMySQLデーモンをインストール
sudo port install mysql5 sudo port install mysql5-server
(6)my.cnf（設定ファイル）を作成
sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /etc/my.cnf
(7)my.cnfの設定（編集はvimなりemacsでも使って下さい）
・ソケットの場所変更
socket = /opt/local/var/run/mysql5/mysqld.sock
となっている所全てを
socket = /tmp/mysql.sock
に変更する。
・文字コードを設定 [mysqld] の下に
default-character-set=utf8
skip-character-set-client-handshake
を追記する
(8)MySQLの初期化
sudo -u mysql mysql_install_db5
(9)MySQL自動起動の設定
sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
(10)Rubyをportでインストール
sudo port install ruby
(11)Ruby Gemsをportでインストール
sudo port install rb-rubygems
(12)GemsからRailsをインストール
sudo gem install rails
(13)port でrubyのMySQLアダプタをportから入れる
sudo port install rb-mysql
(14)Terminalの設定を変更（デフォルトシェルがbashの場合）
~/.profileに以下の一文を追加
alias mysql="mysql5"
(15)おもむろに再起動
方法はおまかせ（sudo shutdown -r now　・　sudo reboot　・　りんごマーク＞再起動)
(16)MySQL接続の確認
mysql -u root
で接続できたら無事完了。後はrailsで適当なプロジェクトを作って実行して下さい。(mysql用dbオプションを忘れずに！）&lt;/pre&gt;&lt;/blockquote&gt;
だいたいこれでOKなんだけど、追加でmysqlのgemをインストールしなければいけない。このときちょっと引数が必要。
&lt;blockquote class="code"&gt;sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config&lt;/blockquote&gt;
あとは、下のように、railsのenvironment.rbを変更すればアクセスできます。
&lt;pre class="code"&gt;
# SQLite version 3.x
#   gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
  adapter: mysql
  database: hoge_development
  username: user
  password: pass
  socket: /opt/local/var/run/mysql5/mysqld.sock

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-6328270178103071327?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/6328270178103071327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=6328270178103071327' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6328270178103071327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6328270178103071327'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/snow-leopardrails.html' title='Snow LeopardにRailsをインストールする'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-8614450068932359640</id><published>2010-02-19T21:29:00.002+09:00</published><updated>2010-02-19T21:32:52.509+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Blogのヘッダー部にHTML5な笑い男を表示してみた</title><content type='html'>&lt;p&gt;以前作成した&lt;a href="http://jx-script.blogspot.com/2010/02/html5.html"&gt;HTML5で笑い男&lt;/a&gt;をこのブログのヘッダー部に表示するようにしてみた。結構お気に入りですこれ。ほとんどのプラグインがjQueryをもとに作られてるから使うときもあんまり気にしなくていいから好きです。&lt;/p&gt;

&lt;p&gt;
でも、SIerとかで使うときには、YAHOO UIとかの方が良いと思う。やっぱりプラグインは野良だから、誰がメンテナンスしてるかもわからないし、作る人がわかってるYAHOO UIがおすすめですね。といいつつ、jQueryの方が最近は好きなんですが、、、、&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-8614450068932359640?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/8614450068932359640/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=8614450068932359640' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8614450068932359640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8614450068932359640'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/bloghtml5.html' title='Blogのヘッダー部にHTML5な笑い男を表示してみた'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7010081189325517720</id><published>2010-02-19T20:57:00.005+09:00</published><updated>2010-02-19T21:06:39.633+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='slim3'/><title type='text'>Slim3で同名のクラスでClassCastException</title><content type='html'>Slim3で開発しています。
JSPで次のような事をしたところ、例外が発生してしまいました。
&lt;pre class="code"&gt;&amp;lt;%
List&amp;lt;HotEntry&amp;gt;&amp;nbsp;hotEntryList&amp;nbsp;=&amp;nbsp;(List&amp;lt;HotEntry&amp;gt;)&amp;nbsp;request.getAttribute(&amp;quot;hotEntryList&amp;quot;);
for&amp;nbsp;(HotEntry&amp;nbsp;entry&amp;nbsp;:&amp;nbsp;hotEntryList)&amp;nbsp;{
%&amp;gt;
&amp;lt;%=&amp;nbsp;entry.getUrl()&amp;nbsp;%&amp;gt;
&amp;lt;%
}
%&amp;gt;&lt;/pre&gt;
エラーは以下の通り。
&lt;pre class="code"&gt;java.lang.ClassCastException: net.jirox.acom.model.HotEntry cannot be cast to net.jirox.acom.model.HotEntry
 at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
 at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
 at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
 at java.security.AccessController.doPrivileged(Native Method)
 at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
 at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:288)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:247)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
 at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
 at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
 at org.slim3.controller.HotRequestDispatcherWrapper.forward(HotRequestDispatcherWrapper.java:67)
 at org.slim3.controller.FrontController.doForward(FrontController.java:696)
 at org.slim3.controller.FrontController.doForward(FrontController.java:667)
 at org.slim3.controller.FrontController.handleNavigation(FrontController.java:587)
 at org.slim3.controller.FrontController.processController(FrontController.java:544)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:324)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:285)
 at org.slim3.controller.FrontController.doFilter(FrontController.java:247)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.slim3.datastore.DatastoreFilter.doFilter(DatastoreFilter.java:54)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.slim3.controller.HotReloadingFilter.doHotReloading(HotReloadingFilter.java:223)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:187)
 at org.slim3.controller.HotReloadingFilter.doFilter(HotReloadingFilter.java:157)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:51)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:121)
 at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
 at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
 at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
 at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
 at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
 at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
 at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
 at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:352)
 at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
 at org.mortbay.jetty.Server.handle(Server.java:313)
 at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
 at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
 at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
 at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
 at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
 at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
 at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)&lt;/pre&gt;
なんだろう。クラスローダが違うのかな？

&lt;pre class="code"&gt;List&lt;HotEntry&gt; hotEntryList = (List&lt;HotEntry&gt;) request.getAttribute("hotEntryList");
System.out.println(HotEntry.class.getClassLoader());
System.out.println(hotEntryList.getClass().getClassLoader());&lt;/pre&gt;
上記のコードを実行してみた。
&lt;pre class="code"&gt;com.google.appengine.tools.development.IsolatedAppClassLoader@680e2291
null&lt;/pre&gt;
ん〜?null?こういうコードってこういう風になるんだっけ？
どうしたら良いんだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7010081189325517720?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7010081189325517720/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7010081189325517720' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7010081189325517720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7010081189325517720'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/slim3classcastexception.html' title='Slim3で同名のクラスでClassCastException'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3362104472367103283.post-7246423684483377227</id><published>2010-02-19T17:58:00.004+09:00</published><updated>2010-02-19T19:43:42.906+09:00</updated><title type='text'>GAEのURLFetchのタイムアウト</title><content type='html'>&lt;p&gt;GAEのURLFetchって5秒くらいでタイムアウトしちゃうのね。リクエストの30秒あるんだから、それくらいまでは頑張ってほしいなぁ。ていうかどうしよう。Task Queueを使用すれば、回避できるようになるんだろうか。やっぱりだめなんだろうか。
&lt;/p&gt;
&lt;p&gt;
作ろうとしてるものはもうGAEじゃ作れないのかな。あぁあぁああ
&lt;/p&gt;

&lt;p&gt;
追記:2010/02/19&lt;br/&gt;
そんな事ありませんでした。&lt;a href="http://code.google.com/intl/en/appengine/docs/java/urlfetch/overview.html"&gt;setConnectTimeout&lt;/a&gt;に書いてあるように10秒までは延ばす事ができるようです。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7246423684483377227?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7246423684483377227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7246423684483377227' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7246423684483377227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7246423684483377227'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/gaeurlfetch.html' title='GAEのURLFetchのタイムアウト'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-8642119409007192602</id><published>2010-02-19T16:48:00.005+09:00</published><updated>2010-02-19T16:51:02.807+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='slim3'/><title type='text'>GAE/Jのローカル管理コンソール</title><content type='html'>&lt;p&gt;GAEで開発しているとどんなデータがデータストアに格納されているかがわかりにくいですよね。
そんなときに便利なのが管理コンソール。デフォルトで付属しています。
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://localhost:8888/_ah/admin/datastore"&gt;http://localhost:8888/_ah/admin/datastore&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
実はちょっと前まで知りませんでした。これで少しは開発が楽になるかな。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-8642119409007192602?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/8642119409007192602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=8642119409007192602' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8642119409007192602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8642119409007192602'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/gaej.html' title='GAE/Jのローカル管理コンソール'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7839103731984781301</id><published>2010-02-19T16:36:00.004+09:00</published><updated>2010-02-19T21:19:34.449+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='slim3'/><title type='text'>Slim3のDatastoreはJDOとは全く異なる</title><content type='html'>Slim3を触っています。今、Entityあたりを勉強しているのですが、ずいぶんとJDOと違いますね。まぁもちろん、制約とは同じなんですが、同じEntity Groupにしようと思ってプロパティに
&lt;pre class="code"&gt;List&lt;MyEntity&gt; hoge;&lt;/pre&gt;
とすると、
&lt;pre class="code"&gt;[SLIM3GEN1005] Specify @Attribute(lob = true) or @Attribute(persistent = false).&lt;/pre&gt;
と言われてしまう。

もう少し勉強が必要そうですね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7839103731984781301?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7839103731984781301/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7839103731984781301' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7839103731984781301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7839103731984781301'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/slim3datastorejdo.html' title='Slim3のDatastoreはJDOとは全く異なる'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7916544729451725139</id><published>2010-02-19T01:42:00.006+09:00</published><updated>2010-02-19T21:16:27.257+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><category scheme='http://www.blogger.com/atom/ns#' term='slim3'/><title type='text'>Slim3のチュートリアルでjava.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM</title><content type='html'>Google App Engineでアプリでもこさえてみようかと考えています。
GAEといえばSlim3だろうということで、とりあえずはじめてみます。

と思ってチュートリアルを始めたらいきなり躓いた。躓いたのは&lt;a href="http://sites.google.com/site/slim3appengine/getting-started/creating-controller-and-test"&gt;Creating a controller and a test (Slim3)&lt;/a&gt;
gen-controller taskを実行しようとすると、下のようなエラーが表示されてしまう。
&lt;pre class="code"&gt;java.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM&lt;/pre&gt;

何故だろうと調べていたら自分の環境が64bitのMac環境だったためにおこった模様。
ちなみに、Snow Leopardです。

だから、Eclipseの64bit環境用のものを使用すれば問題ありません。
&lt;a href="http://download.eclipse.org/eclipse/downloads/"&gt;Eclipse Project Downloads&lt;/a&gt;からたどってMac OSXの64bit用Eclipseを落としてきてください。これで解決です。

やっと、チュートリアルに入れる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7916544729451725139?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7916544729451725139/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7916544729451725139' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7916544729451725139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7916544729451725139'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/slim3javalangunsatisfiedlinkerror.html' title='Slim3のチュートリアルでjava.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-2563449085373078540</id><published>2010-02-08T02:54:00.012+09:00</published><updated>2010-02-24T01:57:24.554+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>HTML5で笑い男</title><content type='html'>&lt;p&gt;
すごい久しぶりの更新です。
今日は遅く起きたので、寝れなくてふと思いついたのでHTML5で笑い男を作ってみました。
そのまま使うにはjQueryが必要です。でも、jQueryの機能なんにも使ってないんで、簡単に切り出せます。
&lt;/p&gt;
&lt;p&gt;
なお、笑い男のSVGは以下のページから拝借しました。&lt;br/&gt;
&lt;a href="http://d.hatena.ne.jp/fls/20061023/p1"&gt;http://d.hatena.ne.jp/fls/20061023/p1&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
最近のブラウザなら動きます。IEはSVGをサポートしてないんでダメですけどね。。。。
一応2010/2/8時点の最新の以下のブラウザで試して動く事を確認しています。
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Safari&lt;/li&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
ということで、これです。&lt;br/&gt;
&lt;a href="http://jirox.net/javascript/waraiotoko/waraiotoko.js"&gt;笑い男.js&lt;/a&gt;
&lt;/p&gt;
&lt;script type="text/javascript" src="http://jirox.net/javascript/waraiotoko/waraiotoko.js"&gt;&lt;/script&gt;
&lt;div class="waraiotoko" style="width: 100px; height: 100px; display: inline-block;"&gt;&lt;/div&gt;
&lt;div class="waraiotoko" style="width: 100px; height: 100px; display: inline-block;"&gt;&lt;/div&gt;
&lt;div class="big-waraiotoko"&gt;&lt;/div&gt;
&lt;script type="text/javascript"&gt;
$('.waraiotoko').waraiotoko({width: 100, height: 100});
$('.big-waraiotoko').waraiotoko();
&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-2563449085373078540?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/2563449085373078540/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=2563449085373078540' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/2563449085373078540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/2563449085373078540'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2010/02/html5.html' title='HTML5で笑い男'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-4813493418311032951</id><published>2009-10-27T00:44:00.008+09:00</published><updated>2009-10-27T00:54:04.001+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>fastlookup_bookmarklet ブックマークレットで辞書を引く</title><content type='html'>&lt;p&gt;
fastlookup alc なんかがあると、辞書を引くのが簡単です。でも、userscriptが使えないとだめだったりして、最近はもっぱらChromeを使用しているため、使えません。仕方ないので、YAHOO Pipesを利用して、YAHOOの英和辞書を引くブックマークレットを作成しました。自分はIEを使わないので、IEには非対応ですが、簡単に対応できるはずです。
&lt;/p&gt;
&lt;p&gt;
必要なときだけブックマークレットを読みこめばいいし、使い勝手は悪くないと思います。
&lt;/p&gt;
&lt;p&gt;
使い方は簡単。ブックマークレットを実行したら、辞書を引きたい単語を選択してください。Firefox, Webkit系で動くはずです。
&lt;/p&gt;
&lt;p&gt;
&lt;a href="javascript:(function(){var s=document.createElement('script');s.charset='UTF-8';s.src='http://jirox.net/fastlookup_bookmarklet/current/fastlookup_bookmarklet.js';document.body.appendChild(s)})();"&gt;fastlookup_bookmarklet&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-4813493418311032951?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/4813493418311032951/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=4813493418311032951' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4813493418311032951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4813493418311032951'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/10/fastlookupbookmarklet.html' title='fastlookup_bookmarklet ブックマークレットで辞書を引く'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-1152734108042281204</id><published>2009-08-24T00:12:00.005+09:00</published><updated>2010-02-24T01:57:58.396+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><title type='text'>Dijkstra's AlgorithmとA-Star AlgorithmをJavaScriptで実装してみた</title><content type='html'>&lt;p&gt;ダイクストラ法とA-StarアルゴリズムをJavaScriptで実装してみた。&lt;/p&gt;
&lt;p&gt;ダイクストラ法は確かに動いているように思えるけど、A-Starの方はうまく動いていないように見えるというか、全然高速化されていない。こんなもんなのかな？知ってる人いたら教えてください。&lt;p&gt;
  &lt;div id="message" style="color: red; height: 1em;"&gt;&lt;/div&gt;
  Create Map:&lt;select id="mapSelect20090824"&gt;
   &lt;option value="1"&gt;10x10&lt;/option&gt;
   &lt;option value="2"&gt;20x20&lt;/option&gt;
   &lt;option value="3"&gt;30x30&lt;/option&gt;
   &lt;option value="4"&gt;40x40&lt;/option&gt;
   &lt;option value="5"&gt;50x50&lt;/option&gt;
  &lt;/select&gt;
  &lt;label for="astar20090824"&gt;A-STAR&lt;/label&gt;&lt;input id="astar20090824" type="checkbox"/&gt;
  &lt;div id="graph"&gt;&lt;/div&gt;
  &lt;script type="text/javascript"&gt;
(function() {
var start;
var tdList;
var mapSize = 10;
var map; 
var dijkstra = function(sx, sy, gx, gy, astar) {
 var startTime = new Date().getTime();
 var masterList = new NodeList(); // Node全てを格納するリスト
 var openList = new NodeList(); // スコアが確定していないノードを格納するリスト
 var closeList = new NodeList(); // スコアが確定したノードを格納するリスト
 var maxWidth = map[0].length; // 地図の幅
 var maxHeight = map.length; // 地図の高さ

 message(''); // ログ
 // 地図データからノードを作成
 for (var i = 0, len = map.length; i &lt; len; i++) {
  for (var j = 0, jlen = map[i].length; j &lt; jlen; j++) {
   masterList.add(new Node(j, i));
  }
 }

 // スタートノードの設定
 var targetNode = masterList.get(sx, sy);
 targetNode.score = 0;
 closeList.add(targetNode); // スタートノードはcloseListに格納しておく

 var whileCount = 0;
 while (true) {
  whileCount++;
  // 次のノードを探索
  var checkNodePositions = [[targetNode.x, targetNode.y - 1], [targetNode.x, targetNode.y + 1], [targetNode.x - 1, targetNode.y], [targetNode.x + 1, targetNode.y]];
  for (var i = 0, len = checkNodePositions.length; i &lt; len; i++) {
   var checkNodePosition = checkNodePositions[i];
   // 地図の範囲外であれば探索しない
   if (checkNodePosition[0] &lt; 0 || checkNodePosition[0] &gt; maxWidth - 1 ||
     checkNodePosition[1] &lt; 0 || checkNodePosition[1] &gt; maxHeight - 1) {
    continue;
   }
   var checkNode = masterList.get(checkNodePosition[0], checkNodePosition[1]);
   if (checkNode.type == 0) continue; // 壁だったら処理しない
   if (closeList.get(checkNodePosition[0], checkNodePosition[1])) continue; // スコアが確定していればなにもしない
   if (!openList.get(checkNodePosition[0], checkNodePosition[1])) {
    openList.add(checkNode); // openListにもcloseListにも無ければopenListに格納しておく
   }
   var score;
   if (astar) {
    score = targetNode.score + 1 + Math.abs(checkNodePosition[0] - gx) + Math.abs(checkNodePosition[1] - gy);
    //console.log(score);
   } else {
    score = targetNode.score + 1; // この経路を辿ったときのスコアはtargetNode.score + 1
    //console.log(score);
   }
   // スコアが格納されていない、またはほかの経路よりも効率が良ければスコアと、一つ前のノードをセットする
   if (isNaN(checkNode.score) || checkNode.score &gt; score) {
    checkNode.score = score;
    checkNode.parent = targetNode;
   }
  }
  // openListが0になってしまったら、辿ることができないということ
  if (openList.length() == 0) {
   message('No route!');
   return;
  }
  // 現在openListに格納されている最小のスコアのノードはスコアを確定し、closeListに格納する
  targetNode = openList.getMin();
  openList.remove(targetNode);
  closeList.add(targetNode);
  targetNode.score = targetNode.score;
  if (targetNode.x == gx &amp;&amp; targetNode.y == gy) break;
 }
 var endTime = new Date().getTime();
 message(endTime - startTime + 'ms' + ' whileCount:' + whileCount);
 showRoute(targetNode); // ルートを表示する
}
var message = function(value) {
 document.getElementById('message').innerHTML = value;
}
var showRoute = function(targetNode) {
 var td = tdList.get(targetNode.x, targetNode.y);
 td.className = 'scotch route';
 td.style.backgroundColor = 'green';
 var parent = targetNode.parent;
 if (parent) showRoute(parent);
}
var createMapData = function(count) {
 map = [];
 start = [0, 0];
 for (var i = 0, len = mapSize * count; i &lt; len; i++) {
  var row = [];
  for (var j = 0, jlen = mapSize * count; j &lt; jlen; j++) {
   var r = Math.floor(Math.random() * 100) % 5;
   row.push(r);
  }
  map.push(row);
 }
}
var createMap = function() {
 var graph = document.getElementById('graph');
 graph.innerHTML = '';
 var table = graph.appendChild(document.createElement('table'));
 table.style.borderCollapse = 'collapse';
 var tbody = table.appendChild(document.createElement('tbody'));
 tdList = new Table();

 for (var i = 0, len = map.length; i &lt; len; i++) {
  var tr = tbody.appendChild(document.createElement('tr'));
  var row = [];
  for (var j = 0, jlen = map[i].length; j &lt; jlen; j++) {
   var td = tr.appendChild(document.createElement('td'));
   observe(td, 'click', analyse);
   td.style.border = '1px solid white';
   td.style.width = '10px';
   td.style.height = '10px';
   if (map[i][j] == 0) {
    td.className = 'scotch wall';
    td.style.backgroundColor = 'red';
   }
   else td.className = 'scotch';
   tdList.set(j, i, td);
  }
 }
}
var analyse = function(event) {
 var target = event.target || event.srcElement;
 var trChildren = target.parentNode.children;
 var tbodyChildren = target.parentNode.parentNode.children;
 var x,y;
 for (var i = 0, len = trChildren.length; i &lt; len; i++) {
  if (trChildren[i] == target) {
   x = i;
   break;
  }
 }
 var tr = target.parentNode;
 for (var i = 0, len = tbodyChildren.length; i &lt; len; i++) {
  if (tbodyChildren[i] == tr) {
   y = i;
   break;
  }
 }
 if (start[0] == x &amp;&amp; start[1] == y) {
  message('Start is equals to Goal');
  return;
 }
 if (target.className.indexOf('wall') != -1) {
  message('Your clicked cell is wall');
  return;
 }
 // routeをクリアする
 tdList.each(function(td) {
  var className = td.className;
  var classNameList = className.split(/ /);
  for (var i = classNameList.length - 1; i &gt;= 0; i--) {
   if (classNameList[i] == 'route') {
    classNameList.splice(i, 1);
    td.style.backgroundColor = '';
   }
  }
  td.className = classNameList.join(' ');
 });
 var astar = document.getElementById('astar20090824').checked;
 dijkstra(start[0], start[1], x, y, astar);
 start = [x, y];
}
var observe = function(target, type, listener) {
 if (target.addEventListener) target.addEventListener(type, listener, false);
 else target.attachEvent('on' + type, function() { listener.call(target, window.event); });
}
var Node = function(x, y) {
 this.x = x;
 this.y = y;
 this.type = map[y][x];
}
Node.prototype.score = NaN;
Node.prototype.parent = null;

var NodeList = function() {
 this.data = {};
}
NodeList.prototype.add = function(value) { this.data[value.x + ',' + value.y] = value; }
NodeList.prototype.get = function(x, y) { return this.data[x + ',' + y]; }
NodeList.prototype.length = function() {
 var count = 0;
 for (var key in this.data) {
  count++;
 }
 return count;
}
NodeList.prototype.remove = function(value) { delete this.data[value.x + ',' + value.y]; }
NodeList.prototype.getMin = function() {
 var data = this.data;
 var min = null;
 for (var node in data) {
  if (!min) {
   min = data[node];
   continue;
  }
  if (min.score &gt; node.score) min = data[node];
 }
 return min;
}
var Table = function() {
 this.data = {};
}
Table.prototype.set = function(x, y, value) { this.data[x + ',' + y] = value; }
Table.prototype.get = function(x, y) { return this.data[x + ',' + y]; }
Table.prototype.each = function(func) {
 var data = this.data;
 for (var key in data) {
  func(data[key]);
 }
}

observe(document.getElementById('mapSelect20090824'), 'change', function(event) {
 var target = event.target || event.srcElement;
 var value = target.value;
 createMapData(value);
 createMap();
});
createMapData(1);
createMap();
})();
  &lt;/script&gt;
&lt;pre name="code" class="js"&gt;
(function() {
var start;
var tdList;
var mapSize = 10;
var map; 
var dijkstra = function(sx, sy, gx, gy, astar) {
 var startTime = new Date().getTime();
 var masterList = new NodeList(); // Node全てを格納するリスト
 var openList = new NodeList(); // スコアが確定していないノードを格納するリスト
 var closeList = new NodeList(); // スコアが確定したノードを格納するリスト
 var maxWidth = map[0].length; // 地図の幅
 var maxHeight = map.length; // 地図の高さ

 message(''); // ログ
 // 地図データからノードを作成
 for (var i = 0, len = map.length; i &amp;lt; len; i++) {
  for (var j = 0, jlen = map[i].length; j &amp;lt; jlen; j++) {
   masterList.add(new Node(j, i));
  }
 }

 // スタートノードの設定
 var targetNode = masterList.get(sx, sy);
 targetNode.score = 0;
 closeList.add(targetNode); // スタートノードはcloseListに格納しておく

 var whileCount = 0;
 while (true) {
  whileCount++;
  // 次のノードを探索
  var checkNodePositions = [[targetNode.x, targetNode.y - 1], [targetNode.x, targetNode.y + 1], [targetNode.x - 1, targetNode.y], [targetNode.x + 1, targetNode.y]];
  for (var i = 0, len = checkNodePositions.length; i &amp;lt; len; i++) {
   var checkNodePosition = checkNodePositions[i];
   // 地図の範囲外であれば探索しない
   if (checkNodePosition[0] &amp;lt; 0 || checkNodePosition[0] &amp;gt; maxWidth - 1 ||
     checkNodePosition[1] &amp;lt; 0 || checkNodePosition[1] &amp;gt; maxHeight - 1) {
    continue;
   }
   var checkNode = masterList.get(checkNodePosition[0], checkNodePosition[1]);
   if (checkNode.type == 0) continue; // 壁だったら処理しない
   if (closeList.get(checkNodePosition[0], checkNodePosition[1])) continue; // スコアが確定していればなにもしない
   if (!openList.get(checkNodePosition[0], checkNodePosition[1])) {
    openList.add(checkNode); // openListにもcloseListにも無ければopenListに格納しておく
   }
   var score;
   if (astar) {
    score = targetNode.score + 1 + Math.abs(checkNodePosition[0] - gx) + Math.abs(checkNodePosition[1] - gy);
    //console.log(score);
   } else {
    score = targetNode.score + 1; // この経路を辿ったときのスコアはtargetNode.score + 1
    //console.log(score);
   }
   // スコアが格納されていない、またはほかの経路よりも効率が良ければスコアと、一つ前のノードをセットする
   if (isNaN(checkNode.score) || checkNode.score &amp;gt; score) {
    checkNode.score = score;
    checkNode.parent = targetNode;
   }
  }
  // openListが0になってしまったら、辿ることができないということ
  if (openList.length() == 0) {
   message('No route!');
   return;
  }
  // 現在openListに格納されている最小のスコアのノードはスコアを確定し、closeListに格納する
  targetNode = openList.getMin();
  openList.remove(targetNode);
  closeList.add(targetNode);
  targetNode.score = targetNode.score;
  if (targetNode.x == gx &amp;&amp; targetNode.y == gy) break;
 }
 var endTime = new Date().getTime();
 message(endTime - startTime + 'ms' + ' whileCount:' + whileCount);
 showRoute(targetNode); // ルートを表示する
}
var message = function(value) {
 document.getElementById('message').innerHTML = value;
}
var showRoute = function(targetNode) {
 var td = tdList.get(targetNode.x, targetNode.y);
 td.className = 'scotch route';
 td.style.backgroundColor = 'green';
 var parent = targetNode.parent;
 if (parent) showRoute(parent);
}
var createMapData = function(count) {
 map = [];
 start = [0, 0];
 for (var i = 0, len = mapSize * count; i &amp;lt; len; i++) {
  var row = [];
  for (var j = 0, jlen = mapSize * count; j &amp;lt; jlen; j++) {
   var r = Math.floor(Math.random() * 100) % 5;
   row.push(r);
  }
  map.push(row);
 }
}
var createMap = function() {
 var graph = document.getElementById('graph');
 graph.innerHTML = '';
 var table = graph.appendChild(document.createElement('table'));
 table.style.borderCollapse = 'collapse';
 var tbody = table.appendChild(document.createElement('tbody'));
 tdList = new Table();

 for (var i = 0, len = map.length; i &amp;lt; len; i++) {
  var tr = tbody.appendChild(document.createElement('tr'));
  var row = [];
  for (var j = 0, jlen = map[i].length; j &amp;lt; jlen; j++) {
   var td = tr.appendChild(document.createElement('td'));
   observe(td, 'click', analyse);
   td.style.border = '1px solid white';
   td.style.width = '10px';
   td.style.height = '10px';
   if (map[i][j] == 0) {
    td.className = 'scotch wall';
    td.style.backgroundColor = 'red';
   }
   else td.className = 'scotch';
   tdList.set(j, i, td);
  }
 }
}
var analyse = function(event) {
 var target = event.target || event.srcElement;
 var trChildren = target.parentNode.children;
 var tbodyChildren = target.parentNode.parentNode.children;
 var x,y;
 for (var i = 0, len = trChildren.length; i &amp;lt; len; i++) {
  if (trChildren[i] == target) {
   x = i;
   break;
  }
 }
 var tr = target.parentNode;
 for (var i = 0, len = tbodyChildren.length; i &amp;lt; len; i++) {
  if (tbodyChildren[i] == tr) {
   y = i;
   break;
  }
 }
 if (start[0] == x &amp;&amp; start[1] == y) {
  message('Start is equals to Goal');
  return;
 }
 if (target.className.indexOf('wall') != -1) {
  message('Your clicked cell is wall');
  return;
 }
 // routeをクリアする
 tdList.each(function(td) {
  var className = td.className;
  var classNameList = className.split(/ /);
  for (var i = classNameList.length - 1; i &amp;gt;= 0; i--) {
   if (classNameList[i] == 'route') {
    classNameList.splice(i, 1);
    td.style.backgroundColor = '';
   }
  }
  td.className = classNameList.join(' ');
 });
 var astar = document.getElementById('astar20090824').checked;
 dijkstra(start[0], start[1], x, y, astar);
 start = [x, y];
}
var observe = function(target, type, listener) {
 if (target.addEventListener) target.addEventListener(type, listener, false);
 else target.attachEvent('on' + type, function() { listener.call(target, window.event); });
}
var Node = function(x, y) {
 this.x = x;
 this.y = y;
 this.type = map[y][x];
}
Node.prototype.score = NaN;
Node.prototype.parent = null;

var NodeList = function() {
 this.data = {};
}
NodeList.prototype.add = function(value) { this.data[value.x + ',' + value.y] = value; }
NodeList.prototype.get = function(x, y) { return this.data[x + ',' + y]; }
NodeList.prototype.length = function() {
 var count = 0;
 for (var key in this.data) {
  count++;
 }
 return count;
}
NodeList.prototype.remove = function(value) { delete this.data[value.x + ',' + value.y]; }
NodeList.prototype.getMin = function() {
 var data = this.data;
 var min = null;
 for (var node in data) {
  if (!min) {
   min = data[node];
   continue;
  }
  if (min.score &amp;gt; node.score) min = data[node];
 }
 return min;
}
var Table = function() {
 this.data = {};
}
Table.prototype.set = function(x, y, value) { this.data[x + ',' + y] = value; }
Table.prototype.get = function(x, y) { return this.data[x + ',' + y]; }
Table.prototype.each = function(func) {
 var data = this.data;
 for (var key in data) {
  func(data[key]);
 }
}

observe(document.getElementById('mapSelect20090824'), 'change', function(event) {
 var target = event.target || event.srcElement;
 var value = target.value;
 createMapData(value);
 createMap();
});
createMapData(1);
createMap();
})();
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-1152734108042281204?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/1152734108042281204/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=1152734108042281204' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1152734108042281204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1152734108042281204'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/08/dijkstras-algorithma-star.html' title='Dijkstra&apos;s AlgorithmとA-Star AlgorithmをJavaScriptで実装してみた'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-9124035289210767923</id><published>2009-05-30T14:00:00.004+09:00</published><updated>2009-05-30T14:20:18.483+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xen'/><title type='text'>XenServerのインストールPDFがすばらしい</title><content type='html'>XenServerが無償化されているので、全てのサーバリソースをXenServerにしてみようかとインストールしてみた。XenServerのインストールに関してエントリーを書こうと思ったら&lt;a href="http://www.citrix.co.jp/"&gt;本家の日本語サイト&lt;/a&gt;に&lt;a href="http://www.citrix.co.jp/products/pdf/FreeXS.pdf"&gt;Citrix XenServer 5.0 無償版インストール Step by Step Guide（PDF）&lt;/a&gt;が置いてあった。

これを見てみると、XenServerを動かすまでの全ての手順が載っているので、大変わかりやすい。まぁXenServerは動かすのが簡単なので、ドキュメントもいらないくらい。インストールには30分もかからないほど簡単。

XenServerでOSを動かせば、マシンを買い替えてハードウェアが変わっても、マシンイメージを異動すればそれで環境移行が完了してしまうので楽。さらに、ライブマイグレーションを使えば、Xen上で動いているマシンをほかの物理マシンに動作しているまま移行させることができる。これはすばらしすぎる。

自宅サーバで運用していると人は是非XenServerを考えてみてはいかがだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-9124035289210767923?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/9124035289210767923/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=9124035289210767923' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/9124035289210767923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/9124035289210767923'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/xenserverpdf.html' title='XenServerのインストールPDFがすばらしい'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7925951688488223118</id><published>2009-05-27T23:08:00.003+09:00</published><updated>2009-05-27T23:41:06.098+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><title type='text'>gem 1.1から1.3へのアップデートではまる</title><content type='html'>ずいぶん前にRailsをやってから、しばらく触ってなかったので、gemが1.1のままでした。NetBeansでRailsプロジェクトを作るとGemが1.3.1以上じゃないとダメだよとおこられてしまったので、Gemをアップデートしようとすると、
&lt;blockquote&gt; $ sudo gem update --system
Updating RubyGems
Bulk updating Gem source index for: http://gems.rubyforge.org/
Nothing to update&lt;/blockquote&gt;
といわれて、アップデート出来ない。

どうしたら良いのかなと思って調べていたら&lt;a href="http://blogs.wankuma.com/pinzolo/archive/0001/01/01/162786.aspx"&gt;gem update --system で失敗する場合には&lt;/a&gt;という記事を発見。以下のコマンドでアップデート完了です。
&lt;blockquote&gt;$ sudo gem install rubygems-update
$ sudo update_rubygems&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7925951688488223118?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7925951688488223118/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7925951688488223118' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7925951688488223118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7925951688488223118'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/gem-1113.html' title='gem 1.1から1.3へのアップデートではまる'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-8741732775004120081</id><published>2009-05-18T23:37:00.004+09:00</published><updated>2009-05-19T00:08:33.931+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>紙の本が100%亡くなることは無い</title><content type='html'>&lt;a href="http://d.hatena.ne.jp/tempai/20090516/p1#tb"&gt;紙の本が100%亡くなると断言できる、たった一つの理由&lt;/a&gt;
&lt;blockquote&gt;断言できる理由、それは紙の本が"印刷"という技術だからです。そして、「紙の本に限ってそれは無い」と錯覚しやすいのは、「紙に印刷する」という技術があまりの大発明であったからです。あまりに長く親しまれすぎて、それが技術だと認識できないのです。

技術と言うのは、必ずそれを上回るまったく新しい技術によって取って代わられる運命にあります。&lt;/blockquote&gt;
何死ぬほど眠たい事言ってるんでしょうか。一般層への普及の条件というものをはき違えています。印刷という技術が普及したんじゃないんですよ、印刷したものが便利だったから普及したんです。技術だから新しいものにとって代わられるんじゃない。使いやすいからみんながそっちを使うんです。

既存の技術が新しい技術に取って代わられるというのは、&lt;span style="font-weight:bold;"&gt;「同じこと」&lt;/span&gt;を実現するのに、より性能の良いもの、コストの安いものの時に成り立つことです。今回の比較はインタフェースが異なってしまいます。使い勝手違います。もし、kindleのような電子ブックリーダーを想定してそのようなことを言っているとしたら、お門違いも甚だしいです。

&lt;blockquote&gt;"音"を記録する音楽メディアは、この100年ほどの間にレコード→カセット→ＣＤと変遷してきました。そして今はＣＤ→ダウンロード、となる過渡期です。&lt;/blockquote&gt;
この例では音楽を挙げていますが、この媒体の目的は音楽を聴くことが目的で、レコード、カセット、CD、ダウンロード、どれもイヤホン（スピーカー）を通して聴きます。インタフェースが変わっていないのです。インタフェースが変わらないのであれば、より小型、よりポータブルなものがより利便性が高いことは間違い在りません。だから、音楽という媒体は、この変遷を辿ったのです。

紙の本は状況がことなります。電子ブックリーダーという媒体を考えるのであれば、やはりインタフェースとして非力です。書き込めないし、次のページへの移動が、ページ遷移となってしまって連続しなくなってしまいますし、どれだけめくったのが実感できなかったり。

紙という媒体以上に便利なものを想像できますか？そもそも、人間が想像出来ないものは作ることはできません。もちろん、これから検索出来るという利便性から電子媒体のものは増えていくでしょう。しかし、やはりそれは一部の機械好きの人たちのガジェットに過ぎず、紙という媒体の代わりにはなりえません。

技術は生活をより便利にするものです。より便利になるものであれば古いものに取って代わりますし、そうでなければ変わることはできないでしょう。そして、人間は想像すらできないものは作ることができません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-8741732775004120081?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/8741732775004120081/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=8741732775004120081' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8741732775004120081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8741732775004120081'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/100-kindle-100-cd.html' title='紙の本が100%亡くなることは無い'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-478415102142539859</id><published>2009-05-18T01:37:00.002+09:00</published><updated>2009-05-18T01:58:32.975+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>GAE/JでXMLを操る</title><content type='html'>GAE/Jで開発をしていると、どうしてもXMLを操らなきゃいけないときがあります。開発機で&lt;a href="https://rome.dev.java.net/"&gt;Rome&lt;/a&gt;を使って動いたぞと思って本番環境にデプロイしても動作しません。下のような例外が発生してしまいます。
&lt;blockquote&gt;Could not load default SAX parser&lt;/blockquote&gt;
なんて言われてしまいます。これを解決するには&lt;a href="http://archive.apache.org/dist/xml/xerces-j/"&gt;xerces&lt;/a&gt;の次のjarが必要になります。
&lt;ul&gt;&lt;li&gt;serializer.jar&lt;/li&gt;&lt;li&gt;xercesImpl.ja&lt;/li&gt;&lt;li&gt;xercesSamples.jar&lt;/li&gt;&lt;li&gt;xml-apis.jar&lt;/li&gt;&lt;/ul&gt;

これでも実はまだ足りません。XPathを使おうと思っても、&lt;a href="http://archive.apache.org/dist/xml/xerces-j/"&gt;xerces&lt;/a&gt;にはXPathのAPIは用意されておらず、
&lt;blockquote&gt;XPathFactory.newInstance()&lt;/blockquote&gt;
上のようにするとやはり例外が発生してしまいます。
&lt;blockquote&gt;XPathFactoryConfigurationException: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFactory implementation found for the object model: http://java.sun.com/jaxp/xpath/dom&lt;/blockquote&gt;
これを解決するには、&lt;a href="http://ftp.riken.jp/net/apache/xml/xalan-j/"&gt;xalan&lt;/a&gt;が必要になります。

結局、&lt;a href="http://ftp.riken.jp/net/apache/xml/xalan-j/"&gt;xalan&lt;/a&gt;には&lt;a href="http://archive.apache.org/dist/xml/xerces-j/"&gt;xerces&lt;/a&gt;が含まれている？ので結局、&lt;a href="http://ftp.riken.jp/net/apache/xml/xalan-j/"&gt;xalan-j_2_7_1&lt;/a&gt;の以下のjarをWEB-INF/libの下に配置します。
&lt;ul&gt;&lt;li&gt;serializer.jar&lt;/li&gt;&lt;li&gt;xalan.jar&lt;/li&gt;&lt;li&gt;xercesImpl.jar&lt;/li&gt;&lt;li&gt;xml-apis.jar&lt;/li&gt;&lt;li&gt;xsltc.jar&lt;/li&gt;&lt;/ul&gt;
さらに、
&lt;blockquote&gt;XPathFactory.newInstance()&lt;/blockquote&gt;
のように書いてもダメで、次のように書かなければ行けません。
&lt;blockquote&gt;new org.apache.xpath.jaxp.XPathFactoryImpl();&lt;/blockquote&gt;

まとめると、
&lt;ol&gt;&lt;li&gt;&lt;a href="https://rome.dev.java.net/"&gt;Rome&lt;/a&gt;を使用して&lt;/li&gt;&lt;li&gt;&lt;a href="http://ftp.riken.jp/net/apache/xml/xalan-j/"&gt;xalan&lt;/a&gt;のjarを使って&lt;/li&gt;&lt;li&gt;new org.apache.xpath.jaxp.XPathFactoryImpl()で、Factoryを作成します&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-478415102142539859?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/478415102142539859/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=478415102142539859' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/478415102142539859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/478415102142539859'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/gaejxml.html' title='GAE/JでXMLを操る'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7689927200250099012</id><published>2009-05-16T19:00:00.007+09:00</published><updated>2009-05-16T19:25:51.632+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>「はまらない」ような体制を作ろう</title><content type='html'>&lt;a href="http://blog.livedoor.jp/lalha/archives/50261226.html"&gt;小野和俊のブログ:プログラマーの開発速度は「はまる」時間の長さで決まる&lt;/a&gt;

「はまる」時間で開発速度が決まるのであれば、そもそも「はまらない」ようにすればいい。そういう体制を作ろう。

周りがいつもハマっていたりする原因は、その使用するフレームワークや技術を誰も知らないとき。だったら、そんなもの使わずに、わかっているものを使えば良い。特に最近の重厚なフレームワークなんかを使った場合には、つぎはぎでつないできたプロジェクトが、最後の方でにっちもさっちもいかなくなってしまうようなことが多い。

上のように考えても、新しい技術やフレームワークを使うメリットが在ると感じるならば、わかっている人をつれてこよう。開発することが決まってから、自分たちだけで新しい技術を見極めるなんて並たいていの人ができることじゃない。

コーダーとしては、小野和俊さんの言う通りのことを気をつければ良いと思う。ただ、
そのパフォーマンスを決めてしまうのは、プロジェクトの方針を決めてしまう人だから、重要なフェーズでは気をつけて判断してほしい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7689927200250099012?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7689927200250099012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7689927200250099012' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7689927200250099012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7689927200250099012'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/blog-post_16.html' title='「はまらない」ような体制を作ろう'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-1839994947064479430</id><published>2009-05-15T02:06:00.004+09:00</published><updated>2009-05-15T02:29:27.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>青学大ももうダメかもね</title><content type='html'>&lt;a href="http://sankei.jp.msn.com/life/education/090514/edc0905141752003-n1.htm"&gt;青学大「ｉＰｈｏｎｅ」無料配布…狙いは「代返防止」&lt;/a&gt;
&lt;blockquote&gt;記者会見した伊藤定良学長は「次世代の携帯端末を活用し、人材を育成していきたい」と話した。&lt;/blockquote&gt;
これ、本気で言ってるの？iPhoneの本当の目的が「自在を育成していきたい」ということであれば、勉強というものの本質をわかってない。授業に出席しさえすれば、学力が向上するとでも思ってるんだろうか。

学力が低下したのは、出席点というなにを評価しているのかわからない指標で生徒を評価しているから。学力がどの程度かはかりたいのであれば、純粋に学力をはかればいい。なんで、出席することのなにが学力向上においてい重要なんだろうか。

こういった直接的でない指標で学生を評価していれば、もちろん学生は評価されるように頑張る。出席点をかせげばあまり学力が無くても、卒業出来るのであればそちらの方がらくなんだからそっちに流れるのは当たり前。人間楽な方に走りたくなるからね。学力はなくても、なんか出席してればいいらしいよ〜という話になる。

つまり、学力をつけさせたいのなら、出席点なんてクソなものは捨ててテストのみの結果で判断すればいい。大学というのはそもそも、そこで学力を身につける場所でしょう。授業に出ていなくても最初からその学力があるのであれば、無駄な時間を授業に割かせずに、さらにその上の学力なり人生経験を積めるように時間を与えてあげるという考え方はできないのか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-1839994947064479430?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/1839994947064479430/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=1839994947064479430' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1839994947064479430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/1839994947064479430'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/blog-post_15.html' title='青学大ももうダメかもね'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-3053493673737791481</id><published>2009-05-09T16:26:00.002+09:00</published><updated>2009-05-14T01:38:04.378+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>Product Advertising APIの日本用Restクライアント(Java)</title><content type='html'>dankogaiさんが、PerlのProduct Advertising APIライブラリを&lt;a href="http://blog.livedoor.jp/dankogai/archives/51211577.html"&gt;作ってた&lt;/a&gt;。便乗して、Java。
Amazonの新しいProduct Advertising APIのRestのリクエストの作り方は&lt;a href="http://jx-script.blogspot.com/2009/05/product-advertising-apirest.html"&gt;前回のエントリ&lt;/a&gt;で説明しました。このRestクライアントは、&lt;a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/AuthJavaSampleSig2.html"&gt;Amazonのドキュメント&lt;/a&gt;に載っています。しかし、その例は米国用になっているので、ちょっとだけ修正してあげる必要が在ります。

具体的には、endpointをecs.amazonaws.jpに変更します。これだけで、日本のものに適用出来るようになります。なお、使用方法ですが、次のようにします。簡単ですね。
&lt;pre name="code" class="java"&gt;
  // リクエストのキーと値のMap
  Map&amp;lt;String, String&amp;gt; keyMap = new HashMap&amp;lt;String, String&amp;gt;();
  keyMap.put("AWSAccessKeyId", "000000000000000");
  keyMap.put("Version", "2008-08-19");
  keyMap.put("Operation", "ItemLookup");
  keyMap.put("ItemId", "4877712399");
  keyMap.put("ResponseGroup", "Medium");
  keyMap.put("AssociateTag", "jx-22");
  keyMap.put("Service", "AWSECommerceService");
  SignedRequestsHelper signedRequestsHelper = new SignedRequestsHelper();
  String urlStr = signedRequestsHelper.sign(keyMap);
  URL url = new URL(urlStr);
  HttpURLConnection connection = (HttpURLConnection) url
    .openConnection();
&lt;/pre&gt;

日本用に修正したJava Rest クライアント
&lt;pre name="code" class="java"&gt;
package com.amazon.associates.sample;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TimeZone;
import java.util.TreeMap;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import net.jirox.shohyo.exception.ShohyoFatalException;

import org.apache.commons.codec.binary.Base64;

public class SignedRequestsHelper {
 private static final String UTF8_CHARSET = "UTF-8";
 private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
 private static final String REQUEST_URI = "/onca/xml";
 private static final String REQUEST_METHOD = "GET";

 //日本用
 private String endpoint = "ecs.amazonaws.jp"; // must be lowercase
 private String awsAccessKeyId = "YOUR ACCESS KEY ID";
 private String awsSecretKey = "YOUR SECRET KEY";

 private SecretKeySpec secretKeySpec = null;
 private Mac mac = null;

 public SignedRequestsHelper() throws ShohyoFatalException {
  byte[] secretyKeyBytes;
  try {
   secretyKeyBytes = awsSecretKey.getBytes(UTF8_CHARSET);
   secretKeySpec = new SecretKeySpec(secretyKeyBytes,
     HMAC_SHA256_ALGORITHM);
   mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
   mac.init(secretKeySpec);
  } catch (UnsupportedEncodingException e) {
   throw new ShohyoFatalException(e);
  } catch (NoSuchAlgorithmException e) {
   throw new ShohyoFatalException(e);
  } catch (InvalidKeyException e) {
   throw new ShohyoFatalException(e);
  }
 }

 public String sign(Map&amp;lt;String, String&amp;gt; params) {
  params.put("AWSAccessKeyId", awsAccessKeyId);
  params.put("Timestamp", timestamp());

  SortedMap&amp;lt;String, String&amp;gt; sortedParamMap = new TreeMap&amp;lt;String, String&amp;gt;(
    params);
  String canonicalQS = canonicalize(sortedParamMap);
  String toSign = REQUEST_METHOD + "\n" + endpoint + "\n" + REQUEST_URI
    + "\n" + canonicalQS;

  String hmac = hmac(toSign);
  String sig = percentEncodeRfc3986(hmac);
  String url = "http://" + endpoint + REQUEST_URI + "?" + canonicalQS
    + "&amp;Signature=" + sig;

  return url;
 }

 private String hmac(String stringToSign) {
  String signature = null;
  byte[] data;
  byte[] rawHmac;
  try {
   data = stringToSign.getBytes(UTF8_CHARSET);
   rawHmac = mac.doFinal(data);
   Base64 encoder = new Base64();
   signature = new String(encoder.encode(rawHmac));
  } catch (UnsupportedEncodingException e) {
   throw new RuntimeException(UTF8_CHARSET + " is unsupported!", e);
  }
  return signature;
 }

 private String timestamp() {
  String timestamp = null;
  Calendar cal = Calendar.getInstance();
  DateFormat dfm = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
  dfm.setTimeZone(TimeZone.getTimeZone("GMT"));
  timestamp = dfm.format(cal.getTime());
  return timestamp;
 }

 private String canonicalize(SortedMap&amp;lt;String, String&amp;gt; sortedParamMap) {
  if (sortedParamMap.isEmpty()) {
   return "";
  }

  StringBuffer buffer = new StringBuffer();
  Iterator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; iter = sortedParamMap.entrySet()
    .iterator();

  while (iter.hasNext()) {
   Map.Entry&amp;lt;String, String&amp;gt; kvpair = iter.next();
   buffer.append(percentEncodeRfc3986(kvpair.getKey()));
   buffer.append("=");
   buffer.append(percentEncodeRfc3986(kvpair.getValue()));
   if (iter.hasNext()) {
    buffer.append("&amp;");
   }
  }
  String cannoical = buffer.toString();
  return cannoical;
 }

 private String percentEncodeRfc3986(String s) {
  String out;
  try {
   out = URLEncoder.encode(s, UTF8_CHARSET).replace("+", "%20")
     .replace("*", "%2A").replace("%7E", "~");
  } catch (UnsupportedEncodingException e) {
   out = s;
  }
  return out;
 }

}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-3053493673737791481?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/3053493673737791481/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=3053493673737791481' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3053493673737791481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3053493673737791481'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/product-advertising-apirestjava.html' title='Product Advertising APIの日本用Restクライアント(Java)'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-860765871386917331</id><published>2009-05-09T15:29:00.003+09:00</published><updated>2009-05-09T16:15:24.902+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>Product Advertising APIをRestでアクセスする</title><content type='html'>AmazonアソシエイトWebサービスの名称が、「Product Advertising API」に変更された。これに伴って、今まで使用していたアクセス方法は使用出来なくなり、リクエスト自体にサインをしなければいけなくなった。

ライブラリが出てくるまで、ちょっとこの変更はつらいかも。ということで、そのRestでのアクセス方法を説明する。英語ですが、&lt;a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/rest-signature.html"&gt;Amazonのページ&lt;/a&gt;にちゃんと書かれています。

今までのリクエスト、例えば、ItemLookupは以下のようなリクエスト&lt;blockquote&gt;
http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&amp;amp;AWSAccessKeyId=0000000000000000&amp;amp;AssociateTag=jx-22&amp;amp;ItemId=4877712399&amp;amp;Operation=ItemLookup&amp;amp;ResponseGroup=Medium&amp;amp;Version=2008-08-19&lt;/blockquote&gt;

これに、タイムスタンプをつけます。次の例では、GMTのタイムスタンプをつけます。2009-0509T06:30:41Z
&lt;blockquote&gt;http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&amp;amp;AWSAccessKeyId=0000000000000000&amp;amp;AssociateTag=jx-22&amp;amp;ItemId=4877712399&amp;amp;Operation=ItemLookup&amp;amp;ResponseGroup=Medium&amp;amp;Version=2008-08-19&amp;amp;Timestamp=2009-05-09T06:20:41Z&lt;/blockquote&gt;

このリクエストをURLエンコードします。RFC3986に従って、エンコードします。
&lt;blockquote&gt;http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&amp;amp;AWSAccessKeyId=0000000000000000&amp;amp;AssociateTag=jx-22&amp;amp;ItemId=4877712399&amp;amp;Operation=ItemLookup&amp;amp;ResponseGroup=Medium&amp;amp;Version=2008-08-19&amp;amp;Timestamp=2009-05-09T06%3A20%3A41Z&lt;/blockquote&gt;

パラメータのキーと値のペアを抜き出します。
&lt;blockquote&gt;Service=AWSECommerceService
AWSAccessKeyId=0000000000000000
AssociateTag=jx-22
ItemId=4877712399
Operation=ItemLookup
ResponseGroup=Medium
Version=2008-08-19
Timestamp=2009-05-09T06%3A20%3A41Z&lt;/blockquote&gt;

さらに、それをソートします。ソートするときは、文字コードの値でソートします。つまり、Aよりも、aの方が後に来ます。
&lt;blockquote&gt;AWSAccessKeyId=0000000000000000
AssociateTag=jx-22
ItemId=4877712399
Operation=ItemLookup
ResponseGroup=Medium
Service=AWSECommerceService
Timestamp=2009-05-09T06%3A20%3A41Z
Version=2008-08-19&lt;/blockquote&gt;

ソート済みのこれらの文字列をアンパサンドで結合します。
&lt;blockquote&gt;AWSAccessKeyId=0000000000000000&amp;AssociateTag=jx-22&amp;ItemId=4877712399&amp;Operation=ItemLookup&amp;ResponseGroup=Medium&amp;Service=AWSECommerceService&amp;
Timestamp=2009-05-09T06%3A20%3A41Z&amp;Version=2008-08-19&lt;/blockquote&gt;

さらに、下の文字列を用意します。改行文字も必要です。
&lt;blockquote&gt;GET
ecs.amazonaws.jp
/onca/xml&lt;/blockquote&gt;

このサインする文字列を以下のようになります。
&lt;blockquote&gt;GET
ecs.amazonaws.jp
/onca/xml
AWSAccessKeyId=0000000000000000&amp;AssociateTag=jx-22&amp;ItemId=4877712399&amp;Operation=ItemLookup&amp;ResponseGroup=Medium&amp;Service=AWSECommerceService&amp;
Timestamp=2009-05-09T06%3A20%3A41Z&amp;Version=2008-08-19&lt;/blockquote&gt;

Secret Access Keyの文字列を利用して、SHA256ハッシュアルゴリズムを使用するRFC2104-compliant HMACを適用します。
&lt;blockquote&gt;pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=&lt;/blockquote&gt;

この文字列をURLエンコードします。
&lt;blockquote&gt;pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D&lt;/blockquote&gt;

最後に、先ほど生成したURLにこのSignatureのキーで追加します。
&lt;blockquote&gt;AWSAccessKeyId=0000000000000000&amp;AssociateTag=jx-22&amp;ItemId=4877712399&amp;Operation=ItemLookup&amp;ResponseGroup=Medium&amp;Service=AWSECommerceService&amp;
Timestamp=2009-05-09T06%3A20%3A41Z&amp;Version=2008-08-19&amp;Signature=pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D&lt;/blockquote&gt;

これで、リクエストが完成です。このJava実装は、Amazonのページに記載されています。それは、日本用にはなっていないので、それを日本用のものに変更したものを次のエントリーで掲載します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-860765871386917331?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/860765871386917331/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=860765871386917331' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/860765871386917331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/860765871386917331'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/product-advertising-apirest.html' title='Product Advertising APIをRestでアクセスする'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7196024035421753722</id><published>2009-05-06T21:41:00.003+09:00</published><updated>2009-05-06T21:47:49.802+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>AWSのキャッシュの制限は厳しい</title><content type='html'>&lt;a href="http://aws.amazon.com/agreement/#5.1"&gt;AWS Customer Agreement&lt;/a&gt;の5.1.12によれば、AmazonWebServiceの以下の項目は1ヶ月キャッシュしても良いとのこと。
&lt;table border="0" cellpadding="1" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="25%"&gt;&lt;span class="caps"&gt;URL&lt;/span&gt;&lt;/td&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;ASIN&lt;/span&gt;&lt;/td&gt;     &lt;td&gt;Product Name&lt;/td&gt;     &lt;td width="25%"&gt;Catalog&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td width="25%"&gt;Artists&lt;/td&gt;     &lt;td width="25%"&gt;Authors&lt;/td&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;MPN&lt;/span&gt;&lt;/td&gt;     &lt;td width="25%"&gt;Starring&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;ISBN&lt;/span&gt;&lt;/td&gt;     &lt;td width="25%"&gt;Directors&lt;/td&gt;     &lt;td&gt;Manufacturer&lt;/td&gt;     &lt;td width="25%"&gt;Media&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td width="25%"&gt;Distributor&lt;/td&gt;     &lt;td width="25%"&gt;Release Date&lt;/td&gt;     &lt;td&gt;Publisher&lt;/td&gt;     &lt;td width="25%"&gt;Num Media&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;UPC&lt;/span&gt;&lt;/td&gt;     &lt;td width="25%"&gt;Reading Level&lt;/td&gt;     &lt;td&gt;Theatrical Release Date&lt;/td&gt;     &lt;td width="25%"&gt;Platforms&lt;/td&gt;   &lt;/tr&gt;   &lt;tr&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;MPAA&lt;/span&gt; Rating&lt;/td&gt;     &lt;td width="25%"&gt;&lt;span class="caps"&gt;ESRB&lt;/span&gt; Rating&lt;/td&gt;     &lt;td&gt;Age Group&lt;/td&gt;     &lt;td width="25%"&gt;Encoding&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
逆にこれに無いような情報は、24時間しかキャッシュしてはいけないそうなんです。期限が切れる毎に、すごいリクエストが発生しそうなんだけど、文句言われないかが心配。

にしても、awsのレスポンスはGoogleの検索並みに早い。すごいと思う。どんな仕組みなんだろ。memcached等の分散キャッシュサーバを使用すれば、こういったことが可能になるんだろうか。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7196024035421753722?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7196024035421753722/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7196024035421753722' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7196024035421753722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7196024035421753722'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/aws.html' title='AWSのキャッシュの制限は厳しい'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-4602098115813500276</id><published>2009-05-06T16:54:00.005+09:00</published><updated>2009-05-09T17:43:40.674+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>AmazonのWSDLからJavaのクライアントの生成</title><content type='html'>いつも思うのだけれど、WSDLで生成されたソースコードは激しくわかりづらい。生成してもなかなか使い方がわかりにくいから嫌い。Amazonももちろん使いづらくてどうしたら良いのかよくわからなかった。試行錯誤の上やっとできるように。

まず、WSDLの場所なんだけれども、英語ページを見ていると、上のURLにたどり着くが、これだと日本の商品にアクセス出来ない。ちゃんと調べると、下のURLが正しいことがわかった。

&lt;a href="http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl"&gt;http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl&lt;/a&gt;

&lt;a href="http://webservices.amazon.com/AWSECommerceService/JP/AWSECommerceService.wsdl"&gt;http://webservices.amazon.com/AWSECommerceService/JP/AWSECommerceService.wsdl&lt;/a&gt;


そしたら、以下のコマンドを実行して、スタブを生成
&lt;blockquote&gt;wsimport http://webservices.amazon.com/AWSECommerceService/JP/AWSECommerceService.wsdl&lt;/blockquote&gt;
で、まぁここまでは、簡単なんだけど、その使い方が難しい。&lt;a href="http://wiki.dobon.net/index.php?%BC%AB%CD%B3%B6%E8%2FWeb%A5%B5%A1%BC%A5%D3%A5%B9%BE%D2%B2%F0%2FAmazon%20E-Commerce%20Service#"&gt;自由区/Webサービス紹介/Amazon E-Commerce Service - DoboWiki&lt;/a&gt;で、.Net用みたいだけど、説明してくれているのが役に立つ。で、できたのが下のソースコードでItemLookupのサンプルになってる。

ん〜自分で作ったRESTクライアントの方が早いし、わかりやすいからそのままにしようか。。。。
&lt;pre name="code" class="java"&gt;
String marketplaceDomain = null;
String awsAccessKeyId = "19A48A3RYVJ128FSEN82";
String subscriptionId = null;
String associateTag = "jx-22";
String validate = null;
String xmlEscaping = null;
ItemLookupRequest shared = null;
List&amp;lt;ItemLookupRequest&amp;gt; request = new ArrayList&amp;lt;ItemLookupRequest&amp;gt;();
ItemLookupRequest req1 = new ItemLookupRequest();
req1.getItemId().add("4990412621");
req1.getItemId().add("4835612582");
request.add(req1);
Holder&amp;lt;OperationRequest&amp;gt; operationRequest = null;
Holder&amp;lt;List&amp;lt;Items&amp;gt;&amp;gt; items = new Holder&amp;lt;List&amp;lt;Items&amp;gt;&amp;gt;();

AWSECommerceService client = new AWSECommerceService();
AWSECommerceServicePortType service = client
        .getAWSECommerceServicePort();
service.itemLookup(marketplaceDomain, awsAccessKeyId, subscriptionId,
        associateTag, validate, xmlEscaping, shared, request,
        operationRequest, items);
List&amp;lt;Item&amp;gt; itemList = items.value.get(0).getItem();
for (Item item : itemList) {
    System.out.println(item.getItemAttributes().getTitle());
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-4602098115813500276?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/4602098115813500276/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=4602098115813500276' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4602098115813500276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4602098115813500276'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/amazonwsdljava.html' title='AmazonのWSDLからJavaのクライアントの生成'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-435321923418011247</id><published>2009-05-05T20:16:00.004+09:00</published><updated>2009-05-09T17:45:55.910+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>GAE/Jでparentは変更出来ないけど、childは追加可能</title><content type='html'>タイトルのまんま。
&lt;pre name="code" class="java"&gt;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
 Parent parent = pm.getObjectById(Parent.class, "hoge");
 List childList = parent.getChildList();
 int r = (int) Math.floor(Math.random() * 100000);
 childList.add(new Child(KeyFactory.createKey(Child.class
   .getSimpleName(), "fuga" + r)).setName("fuga" + r));
 
} finally {
 pm.close();
}
&lt;/pre&gt;
もちろん、削除もできる。
&lt;pre name="code" class="java"&gt;
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
 Parent parent = pm.getObjectById(Parent.class, "hoge");
 List childList = parent.getChildList();
 Child child = childList.get(0);
 pm.deletePersistent(child);
} finally {
 pm.close();
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-435321923418011247?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/435321923418011247/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=435321923418011247' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/435321923418011247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/435321923418011247'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/gaejparent.html' title='GAE/Jでparentは変更出来ないけど、childは追加可能'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-8068495631009956071</id><published>2009-05-05T19:51:00.005+09:00</published><updated>2009-05-09T17:47:19.719+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>GAE/Jのparentとchildは変更出来ない？</title><content type='html'>一度作成したオブジェクトをほか子供にしようとしたら
&lt;pre name="code" class="java"&gt;
try {
 Parent p = new Parent("hoge");
 Key cKey = KeyFactory.createKey(
  Child.class.getSimpleName(), "fuga");
 Child c = new Child(cKey);
 pm.makePersistent(c);
 pm.makePersistent(p);
 p.setChild(c);
} finally {
 pm.close();
}
&lt;/pre&gt;
&lt;blockquote&gt;Detected attempt to establish Parent(hoge) as the parent of Child(fuga) but the entity identified by Child(fuga) has already been persisted without a parent.  A parent cannot be established or changed once an object has been persisted.&lt;/blockquote&gt;と言われてしまった。つまり、一度parentを設定してしまったら、変更は不可能の模様。これって要するに1レコードでデータが格納されるということなんだろうか。

なかなか難しいですな&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-8068495631009956071?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/8068495631009956071/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=8068495631009956071' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8068495631009956071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/8068495631009956071'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/gaejparentchild.html' title='GAE/Jのparentとchildは変更出来ない？'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-804779490359046053</id><published>2009-05-02T02:59:00.003+09:00</published><updated>2009-05-09T17:48:10.450+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>GAE/JavaのQueryでは!=演算子はサポートされない</title><content type='html'>GAEのQueryを触っていてハマった。
&lt;pre name="code" class="java"&gt;
Query pageQuery = pm.newQuery(Page.class);
pageQuery.setFilter("body != null");
&lt;/pre&gt;
SQLの気分で、上のように書いていたら、エラーがでてしまう。
&lt;blockquote&gt;App Engine datastore does not support operator  &lt;&gt; &lt;/blockquote&gt;
ってでてしまう。すごいハマった。ドキュメントをちゃんと読んでみたら、jdoqlでは!=演算子はサポートされないらしい。ちゃんと書いてあるじゃないですか。
&lt;blockquote&gt;Note: The Java datastore interface does not support the != and IN filter operators that are implemented in the Python datastore interface. (In the Python interface, these operators are implemented in the client-side libraries as multiple datastore queries; they are not features of the datastore itself.)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-804779490359046053?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/804779490359046053/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=804779490359046053' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/804779490359046053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/804779490359046053'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/05/gaejavaquery.html' title='GAE/JavaのQueryでは!=演算子はサポートされない'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-948812501025441558</id><published>2009-04-30T00:24:00.002+09:00</published><updated>2009-04-30T00:29:51.005+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GAE'/><title type='text'>GAE/JavaのJDOでPrimaryKeyをStringにすると厄介</title><content type='html'>GAE/JavaのJDOでPrimaryKeyをStringにすると厄介です。
&lt;blockquote&gt;@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private String primaryKey;&lt;/blockquote&gt;こんな風にすると、primaryKeyは数字で始まることができないようです。
&lt;blockquote&gt;Name may not start with a digit&lt;/blockquote&gt;というようにおこられてしまいます。
数値で始まるPrimaryKeyを主キーにしたい場合にはどうしたら良いんでしょう。というかまだ、JDOが全然わかってません。誰か、あのドキュメントを翻訳して。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-948812501025441558?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/948812501025441558/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=948812501025441558' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/948812501025441558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/948812501025441558'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/04/gaejavajdoprimarykeystring.html' title='GAE/JavaのJDOでPrimaryKeyをStringにすると厄介'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-7624215544007113924</id><published>2009-03-24T23:31:00.001+09:00</published><updated>2009-03-24T23:32:14.495+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='集合知'/><category scheme='http://www.blogger.com/atom/ns#' term='統計'/><title type='text'>集合知プログラミング第11章 進化する知性</title><content type='html'>&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc42v28m_25c8d4vffk' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-7624215544007113924?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/7624215544007113924/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=7624215544007113924' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7624215544007113924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/7624215544007113924'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/03/11.html' title='集合知プログラミング第11章 進化する知性'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-2246792643654646996</id><published>2009-03-08T23:20:00.000+09:00</published><updated>2009-03-08T23:24:52.679+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='集合知'/><category scheme='http://www.blogger.com/atom/ns#' term='統計'/><title type='text'>集合知プログラミング第9章 高度な分類手法：カーネルメソッドとSVM</title><content type='html'>&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc42v28m_23fq78j5fz' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-2246792643654646996?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/2246792643654646996/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=2246792643654646996' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/2246792643654646996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/2246792643654646996'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/03/9-svm.html' title='集合知プログラミング第9章 高度な分類手法：カーネルメソッドとSVM'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5344786456762795313</id><published>2009-02-19T00:54:00.001+09:00</published><updated>2009-02-19T00:56:04.331+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='集合知'/><category scheme='http://www.blogger.com/atom/ns#' term='統計'/><title type='text'>集合知プログラミング第7章 決定木によるモデリング</title><content type='html'>&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc42v28m_22hgcrz5dz' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;
例によって、勉強したので公開&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5344786456762795313?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5344786456762795313/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5344786456762795313' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5344786456762795313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5344786456762795313'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/02/7.html' title='集合知プログラミング第7章 決定木によるモデリング'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5783371362086673633</id><published>2009-01-26T00:03:00.004+09:00</published><updated>2009-01-26T00:06:32.152+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='集合知'/><category scheme='http://www.blogger.com/atom/ns#' term='統計'/><title type='text'>集合知プログラミング第5章 最適化</title><content type='html'>&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc42v28m_21hphgg6gr' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;
とりあえず勉強会用資料を作成した。基本的に自分が勉強するための資料なので、うまくまとまってもいないけど公開します&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5783371362086673633?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5783371362086673633/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5783371362086673633' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5783371362086673633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5783371362086673633'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/01/5.html' title='集合知プログラミング第5章 最適化'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-798292397138290217</id><published>2009-01-13T02:29:00.002+09:00</published><updated>2009-01-26T00:06:57.394+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='集合知'/><category scheme='http://www.blogger.com/atom/ns#' term='統計'/><title type='text'>集合知プログラミング第３章のドラフト</title><content type='html'>途中だけど、とりあえず外から見えるようにしておく。
&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc42v28m_19f3nth9cr' frameborder='0' width='410' height='342'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-798292397138290217?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/798292397138290217/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=798292397138290217' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/798292397138290217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/798292397138290217'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/01/blog-post.html' title='集合知プログラミング第３章のドラフト'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-3463583261398973330</id><published>2009-01-03T16:53:00.000+09:00</published><updated>2009-01-03T16:54:22.599+09:00</updated><title type='text'>Mac PortsでのMysql5のインストール</title><content type='html'>忘れないようにメモしておく。
$ sudo port install mysql +server
$ sudo chown -R mysql:mysql /opt/local/var/db
$ sudo -u mysql mysql_install_db5&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-3463583261398973330?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/3463583261398973330/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=3463583261398973330' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3463583261398973330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3463583261398973330'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2009/01/mac-portsmysql5.html' title='Mac PortsでのMysql5のインストール'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-6131355289354146990</id><published>2008-09-14T02:55:00.003+09:00</published><updated>2008-09-14T02:59:53.499+09:00</updated><title type='text'>Nutchをやめる</title><content type='html'>Nutchを使おうと考えていたんだけど、自分の作りたいアプリケーションとNutchの相性が良くない。特定のURLのみ扱いたくて、なおかつその特定のURLが膨大な数になる。Nutchを使うと、全てのURLを設定ファイルに記述しなければ行けなくなるし、別々に処理したい。さらに、そのURLは頻繁に更新されるから、Nutchが要件にあわない。

さて、どうしようか。サイトをRailsで作ろうかと考えているから、Rubyで書いてしまうか。でも、そこにあんまり力を入れたくないのも会ってかなり躊躇してる。さてどうしたものか。。。おすすめのクローラーがあったら教えてください。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-6131355289354146990?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/6131355289354146990/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=6131355289354146990' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6131355289354146990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6131355289354146990'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2008/09/nutch.html' title='Nutchをやめる'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-6401844575141510551</id><published>2008-08-30T01:38:00.004+09:00</published><updated>2008-08-30T01:55:49.106+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crawler'/><title type='text'>Nutchを学ぶ その2 Nutch-0.9の日本語化パッチを作成した</title><content type='html'>Nutch 0.9をそのままDLしてきてWebインタフェースを表示しようとすると、日本語環境では表示すらもままならない。ブラウザの環境から言語情報をとってくるが、jaとjpが誤って書かれているらしく、正常に表示ができないことが原因

そこで、これらを修正するNutch 0.9用のパッチを書いた。以下のようにして、パッチを当てれば、とりあえず、日本語のUIで検索ボックスが表示出来るようになる。
ファイルは&lt;a href="http://jirox.net/patches/nutch-0.9-ja.patch"&gt;こちら&lt;/a&gt;
&lt;blockquote&gt;$ wget http://jirox.net/patches/nutch-0.9-ja.patch
$ svn export http://svn.apache.org/repos/asf/lucene/nutch/tags/release-0.9/ nutch-0.9-ja
$ cd nutch-0.9-ja
$ patch -p1 -d . &lt; ../nutch-0.9-ja.patch ant war
&lt;/blockquote&gt;以上でbuild/nutch-0.9.war にwarができあがる
ちなみに、以下のサイトを参考にしました
&lt;a href="http://tidus.ultimania.org/wiki/index.php?Nutch"&gt;Nutch - PukiWiki&lt;/a&gt;
感謝です。

ただし、実際の検索は日本語とおりません。一文字ずつインデックスされてしまっているので、これは対応する必要があります。それについては、まだ解決出来ていないので、後日。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-6401844575141510551?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/6401844575141510551/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=6401844575141510551' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6401844575141510551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/6401844575141510551'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2008/08/nutch-2-nutch-09.html' title='Nutchを学ぶ その2 Nutch-0.9の日本語化パッチを作成した'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-5191129541914031931</id><published>2008-08-27T21:25:00.004+09:00</published><updated>2008-08-27T22:30:38.851+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crawler'/><title type='text'>Nutchを学ぶ その1</title><content type='html'>&lt;h2&gt;まずは情報収集&lt;/h2&gt;Crawlerについて調べたくなったので、勉強日誌をつける。英語がからっきしだめなので、日本語の情報を探してみる。Crawlerについて調べていくと、なんとなくよさそうなものが二つ
&lt;ul&gt;&lt;li&gt;&lt;a href="http://lucene.apache.org/nutch/"&gt;Nutch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://archive-crawler.sourceforge.net/" class="bookmark" target="_blank"&gt;Heritrix&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;両方ともJavaで作られていて、大規模なクローリングに向いている。どちらも日本語の情報は極端に少なく、インストールしてみたとか、動作させてみた、という情報はあるものの、しっかりとやった人は情報を公開していない。

Nutchはクローラーだけでなく、検索エンジンもついている。一方HeritrixはInternet Archiveで使われているクローラー。Heritrixは開発がすごく活発に行われているみたい。でもここは検索エンジンもついているNutchについて勉強しようと思う。名前も可愛いし。今日あたりからちゃんと勉強を初めてみる。
&lt;h2&gt;日本語のリンク集&lt;/h2&gt;Nutchについてかかれている情報へのリンクを羅列してみる。
&lt;ul&gt;&lt;li&gt;Kaz Muzikさんのところ&lt;ul&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/73052.html"&gt;Kaz Muzik Blog - Nutch 0.9 - Kaz Muzik Blog Backup Project #1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/73692.html"&gt;Kaz Muzik Blog - Nutch crawldb - Kaz Muzik Blog Backup Project #2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/73761.html"&gt;Kaz Muzik Blog - Nutch segment - Kaz Muzik Blog Backup Project #3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/74000.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #4&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/74410.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/74998.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/75135.html"&gt;Kaz Muzik Blog - my ContentGetter class - Kaz Muzik Blog Backup Project #7&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/77261.html"&gt;Kaz Muzik Blog - Nutch 0.9 - org.apache.nutch.protocol.Content main() - Kaz Muzik Blog Backup Project #8&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/77846.html"&gt;Kaz Muzik Blog - LiveJournalEntryFilterReader - Kaz Muzik Blog Backup Project #9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/78252.html"&gt;Kaz Muzik Blog - LiveJournalEntryExtractor - Kaz Muzik Blog Backup Project #10&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/78745.html"&gt;Kaz Muzik Blog - LiveJournalEntry &amp;amp; LiveJournalEntryParser - Kaz Muzik Blog Backup Project #11&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/79224.html"&gt;Kaz Muzik Blog - LiveJournalEntryHtmlWriter &amp;amp; LiveJournalEntryHtmlCreator - Kaz Muzik Blog Backup Project #12&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/79813.html"&gt;Kaz Muzik Blog - LiveJournalFetchPreparator - Kaz Muzik Blog Backup Project #13&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/79912.html"&gt;Kaz Muzik Blog - LiveJournalEntryDatabase - Kaz Muzik Blog Backup Project #14&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/80298.html"&gt;Kaz Muzik Blog - LiveJournalEntryDatabaseInitializer - Kaz Muzik Blog Backup Project #15&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/80540.html"&gt;Kaz Muzik Blog - LiveJournalEntryUpdater - Kaz Muzik Blog Backup Project #16&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/81113.html"&gt;Kaz Muzik Blog - LiveJournalDatabaseSetup - Kaz Muzik Blog Backup Project #17&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/81294.html"&gt;Kaz Muzik Blog - LiveJournalHtmlCreator - Kaz Muzik Blog Backup Project #18&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/84912.html"&gt;Kaz Muzik Blog - DbVisualizer (Kaz Muzik Blog Backup Project #19)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/91272.html"&gt;Kaz Muzik Blog - LiveJournalDatabaseManager - Kaz Muzik Blog Backup Project #20&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/91593.html"&gt;Kaz Muzik Blog - LiveJournalFetchPreparator with LiveJournalDatabaseManager - Kaz Muzik Blog Backup Project #21&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/103902.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #22&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/104659.html"&gt;Kaz Muzik Blog - Apache Ant - Kaz Muzik Blog Backup Project #23&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/104989.html"&gt;Kaz Muzik Blog - HTML per Tag - Kaz Muzik Blog Backup Project #24&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/105227.html"&gt;Kaz Muzik Blog - Nutch subcommands - Kaz Muzik Blog Backup Project #25&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/152816.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #26&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/153269.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #27 - LiveJournalMonthlyParser &amp;amp; LivrJournalMonthlyManager&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/153393.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #28 - Kaz Muzik Blog Google Search Project #6&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/156265.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #29&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuomik.livejournal.com/156515.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #30&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/199052.html"&gt;Kaz Muzik Blog - Kaz Muzik Blog Backup Project #31&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazmuzik.net/lj/206190.html"&gt;Kaz Muzik Blog - sampo nutch project - Kaz Muzik Blog Backup Project #32&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tidus.ultimania.org/wiki/index.php?Nutch"&gt;Nutch - PukiWiki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kazuhiro.ty.land.to/blog/2007/01/nutch.html"&gt;Kazuhiro's Weblog: 「Nutch」ですいすい情報収集　(クローリング機能を試す)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Nutch情報ではないけどCrawler関連&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.windy.ac/2004/07/post_71.html"&gt;今日の井原. オープンソースなクローラをまとめてみたよ&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.windy.ac/2005/10/post_196.html"&gt;今日の井原. 都内某社で開催されたクローラ勉強会のスライドを公開します。&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.windy.ac/archives/000880.html"&gt;今日の井原 - 尾内研究室クローラ勉強会 レジュメ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-5191129541914031931?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/5191129541914031931/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=5191129541914031931' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5191129541914031931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/5191129541914031931'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2008/08/nutch-1.html' title='Nutchを学ぶ その1'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-4808792293589843678</id><published>2008-08-23T11:40:00.001+09:00</published><updated>2008-08-23T11:45:31.439+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>Spam認定</title><content type='html'>&lt;blockquote&gt;&lt;p&gt;このブログは、Blogger の
利用規約に違反した可能性があるためロックされており、公開されていません。ブログを確認してロックを解除するまで、新しい投稿を公開することはできません。&lt;/p&gt; &lt;p&gt;このブログは、確認をリクエストしないと 20 日以内に削除されます。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
このページにアクセスしようとしたら、こんな風なメッセージが表示されたよ。俺なにもしてないし、投稿二日目にこんなふうになるなんて、Bloggerはユーザに使ってほしくないんかね？せめてさ、もう少したってからにしてほしいよね。
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-4808792293589843678?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/4808792293589843678/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=4808792293589843678' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4808792293589843678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/4808792293589843678'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2008/08/spam.html' title='Spam認定'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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-3362104472367103283.post-3865723058828377683</id><published>2008-08-22T22:50:00.003+09:00</published><updated>2008-08-22T22:54:33.971+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>心機一転Blogを始める</title><content type='html'>心機一転Blogを始める。

ネットは広大だ。自分が集めたい情報だけでもGoogleで検索すると1,000,000件を軽く超える。マシン一台では到底扱えないような情報。でもそういった情報に積極的ににアクセスし、手足のように扱いたい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3362104472367103283-3865723058828377683?l=jx-script.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jx-script.blogspot.com/feeds/3865723058828377683/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3362104472367103283&amp;postID=3865723058828377683' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3865723058828377683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3362104472367103283/posts/default/3865723058828377683'/><link rel='alternate' type='text/html' href='http://jx-script.blogspot.com/2008/08/blog.html' title='心機一転Blogを始める'/><author><name>jx</name><uri>http://www.blogger.com/profile/09970370491935140974</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></feed>
