<?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-6648305517577816468</id><updated>2012-03-07T17:04:56.351+09:00</updated><category term='ruby'/><category term='solr'/><category term='javascript'/><category term='web'/><category term='bug'/><category term='jenkins'/><category term='unicorn'/><category term='maven'/><category term='github'/><category term='tomcat'/><category term='xsendfile'/><category term='rjb'/><category term='backbonejs'/><category term='rdbms'/><category term='git'/><category term='rack'/><category term='sakura vps'/><category term='gem'/><category term='jeweler'/><category term='nginx'/><category term='phantomjs'/><category term='rails'/><category term='class'/><category term='ci'/><category term='nodejs'/><category term='pjax'/><category term='uml'/><category term='windows'/><category term='javabin'/><category term='bdd'/><category term='wsh'/><category term='generator'/><category term='apache'/><category term='linux'/><category term='backbone.js'/><category term='centos'/><category term='mysql'/><category term='java'/><category term='google maps'/><category term='sass'/><category term='cobertura'/><category term='asset pipe line'/><category term='rails3'/><category term='capybara'/><category term='jasmine'/><category term='rvm'/><category term='ie'/><category term='oracle'/><category term='jquery'/><category term='rspec'/><category term='blogger'/><category term='sql'/><category term='twitter'/><category term='session'/><category term='design'/><category term='ubuntu'/><category term='capistrano'/><category term='coffeescript'/><category term='beginner'/><category term='subversion'/><category term='db'/><title type='text'>kennyjのブログ(仮)</title><subtitle type='html'>ruby / railsの話題を中心になにやら書いていきます。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-3577214625995090791</id><published>2012-02-29T00:54:00.001+09:00</published><updated>2012-02-29T00:54:32.695+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asset pipe line'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>別サーバでassetsを提供する際の覚書</title><content type='html'>&lt;br /&gt;rails3.1.x以降でassets pipe lineを利用する際に、assetsの提供を別サーバにしたい場合は下記の手順で実施する必要があります。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;config/environments/production.rbを編集する。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;config.assets.compile = falseにする。&lt;/li&gt;&lt;li&gt;config.action_controller.asset_host = "http://www.example.com" として提供サーバを設定する。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;開発マシンでrake assets:precompileを実行する。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;サブディレクトリ配下におきたい場合は、RAILS_RELATIVE_URL_ROOT=/fooの様に環境変数で指定する。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;manifest.ymlだけコミットする&lt;/li&gt;&lt;ul&gt;&lt;li&gt;manifest.ymlがあれば論理名をハッシュ付き名に変換可能。&lt;/li&gt;&lt;li&gt;public/assetsは無視リストに。public/assets/manifest.ymlだけコミット可能にする。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;assets自体はassets専用サーバに送る。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;AWS S3の場合、jammit-s3等を利用。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;アプリをデプロイする。&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;参考&amp;nbsp;&lt;a href="https://github.com/rails/rails/issues/3577"&gt;https://github.com/rails/rails/issues/3577&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-3577214625995090791?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/3577214625995090791/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2012/02/assets.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3577214625995090791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3577214625995090791'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2012/02/assets.html' title='別サーバでassetsを提供する際の覚書'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-47684726815671705</id><published>2012-02-19T19:40:00.000+09:00</published><updated>2012-02-20T12:44:54.407+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Rails contributorsはどこにいるのか？</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;久しぶりの更新になります。最近はもっぱらgithubでの活動がメインになってしまいました。&lt;br /&gt;&lt;br /&gt;色々なコントリビュータとやりとりをしていると「この人は現地で今何時なんだ？」と思う事が増えました。という事でまずコントリビュータがどこにいるのか調べてみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■説明&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;さてどうやったら調べられるか考えたのですが下記のステップでデータを作成しました。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;github APIを利用して、rails&amp;nbsp;contributorsをリストアップします。&amp;nbsp;&lt;a href="https://api.github.com/repos/rails/rails/contributors"&gt;https://api.github.com/repos/rails/rails/contributors&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;github accountの束が手に入るので、こちらもgithub APIを利用して、profile情報を取得します。&amp;nbsp;例えばDHHなら、&lt;a href="https://api.github.com/users/dhh"&gt;https://api.github.com/users/dhh&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2. で取得した情報を良く見るとlocation情報に、"Chicago, USA"と書いてあるのでこれを緯度経度情報に変換できれば、やりたい事を実現できます。&lt;/li&gt;&lt;li&gt;色々調べてみると、google maps API v3のジオコーディングリクエストを利用すれば、目的が達成できる事がわかりました。&lt;a href="http://code.google.com/intl/ja/apis/maps/documentation/javascript/services.html#Geocoding"&gt;http://code.google.com/intl/ja/apis/maps/documentation/javascript/services.html#Geocoding&lt;/a&gt;&lt;/li&gt;&lt;li&gt;ここまでで得た情報をgoogle maps上にプロットする。&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;■結果&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Hk3FeU0wJxo/T0DOtsCCJvI/AAAAAAAAAGk/UA0oIyI7Xd8/s1600/guys_world.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="476" src="http://1.bp.blogspot.com/-Hk3FeU0wJxo/T0DOtsCCJvI/AAAAAAAAAGk/UA0oIyI7Xd8/s640/guys_world.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(全体)都合によりTop300でローケーションが判明した人のみプロットしました。貢献数が多い人ほどZIndexを優先にし、画像サイズも変えてみました。世界に広がっていますね。アフリカ以外 ^o^&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lLB9Av2r6ow/T0DOsWeqVtI/AAAAAAAAAGc/hfxGopElnQM/s1600/guys_team_usa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="368" src="http://4.bp.blogspot.com/-lLB9Av2r6ow/T0DOsWeqVtI/AAAAAAAAAGc/hfxGopElnQM/s640/guys_team_usa.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(北米)アメリカといっても広いんですね。色々な地域から参加してます。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-FqmWGM7kT7s/T0DOyR5fUjI/AAAAAAAAAGs/2by4PeWc5G0/s1600/guys_team_europa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="370" src="http://3.bp.blogspot.com/-FqmWGM7kT7s/T0DOyR5fUjI/AAAAAAAAAGs/2by4PeWc5G0/s640/guys_team_europa.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;(ヨーロッパ)アメリカよりも多いぐらいの人が参加していますね。ちょっと意外でした。josevalimさんってここなんですかね？&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Qdp8hoxMX9E/T0DOrbUTS5I/AAAAAAAAAGU/yeORvMVEPvc/s1600/guys_team_south_america.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="444" src="http://1.bp.blogspot.com/-Qdp8hoxMX9E/T0DOrbUTS5I/AAAAAAAAAGU/yeORvMVEPvc/s640/guys_team_south_america.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;(南米)最近非常に活発なのは、この地域だと思います。見知った顔が一番多いです^o^&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UErEgdHKLnA/T0DOnoXM4gI/AAAAAAAAAGM/WsQoLEzcUIY/s1600/guys_team_asia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="368" src="http://3.bp.blogspot.com/-UErEgdHKLnA/T0DOnoXM4gI/AAAAAAAAAGM/WsQoLEzcUIY/s640/guys_team_asia.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;(アジア)アジアは少なめですが、インドが非常に活発です。日本からは、松田明さんと恥ずかしながら私めがエントリーです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■まとめ&lt;/b&gt;&lt;br /&gt;プロットしてみると改めて、世界から参加しているのがわかりました。また各種APIを組み合わせて物を作るというのも面白いですね！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-47684726815671705?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/47684726815671705/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2012/02/rails-guys.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/47684726815671705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/47684726815671705'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2012/02/rails-guys.html' title='Rails contributorsはどこにいるのか？'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Hk3FeU0wJxo/T0DOtsCCJvI/AAAAAAAAAGk/UA0oIyI7Xd8/s72-c/guys_world.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-3007123034920790494</id><published>2011-11-23T21:02:00.001+09:00</published><updated>2011-12-06T14:48:25.955+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>こうして僕はrailsを遅くした。そしてそこそこ直した。</title><content type='html'>&lt;br /&gt;最近blogの更新が途絶えがちですが、githubが面白くて（汗）...&lt;br /&gt;&lt;br /&gt;先日、ruby on rails 3.1.2と3.1.3が矢継ぎ早にリリースされたのですが、実は関与者の一人だったりします。自戒の意味もかねて、経緯とかを書いておきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/10/31 無作為に選んだissueを直そうと思った。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;この&lt;a href="https://github.com/rails/rails/issues/3440"&gt;issue&lt;/a&gt;を調べ始めたのですが、&lt;br /&gt;色々調べてみるとmysqlのdescribeの問題という事が判明し、結果的にschema dumperの出力がバグってるという事が分かった。&lt;br /&gt;&lt;br /&gt;そこで、describeを使わない形(informationスキーマを利用)で修正した。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/06 master/3-1-stableにマージされた。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;その後やりとりがあって、直ってよかったねという事で取り込まれた。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/18 rails 3.1.2がリリースされた。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;そりゃま～、ARは初めてだったので嬉しかったです(リリースノートにも名前が載ったし)。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/18深夜 問題発覚。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;「&lt;a href="https://github.com/rails/rails/issues/3678"&gt;ActiveRecord 3.1.2 takes 10 times slower than 3.1.1&lt;/a&gt;」というissueがあがる。&lt;br /&gt;良く見てみるとmysqlとあるじゃないか！というのも前のリリースからmysqlについて修正したの私だけ（汗）&lt;br /&gt;&lt;br /&gt;その後、某スペイン人（&lt;span class="Apple-style-span" style="background-color: black; color: white; font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 12px; line-height: 16px;"&gt;Christos Zisopoulosさん&lt;/span&gt;）とのやりとりで、"多くのデータベースが存在するmysql"の場合、遅くなる事が判明。&lt;br /&gt;&lt;br /&gt;schema dumperの時のみ、元の修正を利用する、pull requestが取り込まれましたが、&lt;br /&gt;抜本解決ではないので、"show index from"を利用する形で修正を進めた。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/19 早朝 修正完了。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/19 AM9時頃 某スペイン人により効果が確認され、pull requestした。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;その後、railsコミッタのjonleightonにマージしてもらう(master/3-1-stable)。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/21 sprockets等他の問題も修正され、rails 3.1.3がリリースされた。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ちなみにsprocketsは&lt;br /&gt;&amp;nbsp;「windows環境でasset pipe lineが失敗する」&lt;br /&gt;&amp;nbsp;「ファイルの更新が反映されない場合がある」&lt;br /&gt;問題があり、最終的に2.0.xにダウングレードされました。&lt;br /&gt;&lt;br /&gt;途中「速くリリースしろゴラ！」とか言う人がいてビビッタ。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/11/23&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;超大規模なデータセットの場合、問題がある可能性がありそうな為、再度「show create table」を利用する形で調整中。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/12/5&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;「show create table」を利用する形での実装が、rails 3.2系に&lt;a href="https://github.com/rails/rails/commit/f3470b08c9f72da56462f7857ef49501cb5f3201"&gt;マージ&lt;/a&gt;されました。&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;・2011/12/6&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;さらにrails 3.1系にもback portされました。&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;■雑感&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;・世界中で困っている人がいるかと思うとかなりびびった。某スペイン人には多謝。&lt;br /&gt;・この手の、量に対するテストをどう実施していくかは、そもそも根本的な問題。&lt;br /&gt;・私の嘘英語でも何とかやっていけてるのが驚異的。&lt;br /&gt;・gitはコマンド多すぎるが、かなり便利。&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-3007123034920790494?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/3007123034920790494/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/11/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3007123034920790494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3007123034920790494'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/11/rails.html' title='こうして僕はrailsを遅くした。そしてそこそこ直した。'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4488450423326541298</id><published>2011-10-30T00:07:00.000+09:00</published><updated>2011-10-30T00:07:16.709+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>(小ネタ)apacheのAddDefaultCharsetはOffにすべき</title><content type='html'>apacheのディレクティブに&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;AddDefaultCharset&lt;/span&gt;&lt;/b&gt;というのがあります。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;text/htmlやtext/plainの文字列エンコーディングを指定できるのですが、これが厄介です。&lt;br /&gt;&lt;br /&gt;何故なら一般的なブラウザはHTML内のmetaタグでの文字列エンコーディングより、HTTPレスポンスヘッダーの文字列エンコーディングを優先するからです。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;一つのapacheで複数文字列エンコーディングを指定する場合には&lt;br /&gt;&lt;ul&gt;&lt;li&gt;metaタグを駆使する&lt;/li&gt;&lt;li&gt;こまめにディレクトリを分けてAddDefaultCharsetを使う&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/6648305517577816468-4488450423326541298?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4488450423326541298/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/apacheadddefaultcharsetoff.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4488450423326541298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4488450423326541298'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/apacheadddefaultcharsetoff.html' title='(小ネタ)apacheのAddDefaultCharsetはOffにすべき'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5024593154543778524</id><published>2011-10-21T01:33:00.002+09:00</published><updated>2011-10-21T01:33:41.021+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><title type='text'>githubで既にあるIssueにPull Requestをくっつける方法</title><content type='html'>&lt;h2&gt;概要&lt;/h2&gt;githubではPull Requestを送信する時に自動的にIssueも作成されます。しかし「既にあるIssueにPull Requestをくっつける」という事がしたくなる場合があります。&lt;h2&gt;説明&lt;/h2&gt;困ったときのStackoverflowによると、githubはWeb-APIが充実しておりそれを利用すると、実現できるようです。参考ページを参考にするとUnix上でcurlを利用してwebリクエストを送信すると簡単でした。&lt;pre&gt;&lt;br /&gt;例&lt;br /&gt;$ curl -k \&lt;br /&gt;         -d "pull[base]=master" \&lt;br /&gt;         -d "pull[head]=master" \&lt;br /&gt;         -d "pull[issue]=1234" \&lt;br /&gt;         -u "kennyj:xxxxx" \&lt;br /&gt;         https://github.com/api/v2/json/pulls/rails/rails&lt;br /&gt;&lt;br /&gt;-k SSL証明書の問題？を避ける&lt;br /&gt;-d "pull[base]=master" 送信先のbranch名&lt;br /&gt;-d "pull[head]=master" 送信元のbranch名&lt;br /&gt;-d "pull[issue]=1234" バグ票番号&lt;br /&gt;-u "kennyj:xxxxx" ユーザ名とパスワード&lt;br /&gt;https://github.com/api/v2/json/pulls/rails/rails 送信先のユーザ名とリポジトリ名&lt;br /&gt;&lt;/pre&gt;無駄にIssueを増やさない為にも知ってて損はなさそうです。&lt;h2&gt;参考&lt;/h2&gt;&lt;a href="http://stackoverflow.com/questions/4528869/how-do-you-attach-a-new-pull-request-to-an-existing-issue-on-github"&gt;How do you attach a new pull request to an existing issue on github?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5024593154543778524?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5024593154543778524/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/githubissuepull-request.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5024593154543778524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5024593154543778524'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/githubissuepull-request.html' title='githubで既にあるIssueにPull Requestをくっつける方法'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6889501569950279243</id><published>2011-10-06T02:30:00.000+09:00</published><updated>2011-10-06T02:31:04.633+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='capybara'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><category scheme='http://www.blogger.com/atom/ns#' term='capistrano'/><title type='text'>backbone.jsをrails3で実行できるようにするシェルスクリプト(rails3.1対応版)</title><content type='html'>何度も同じ事しているので貼っておきます(rails3.1対応版)。&lt;br /&gt;capybara/capybara-webkit/headless対応や、capistrano、staging対応、sub uri対応等を追加しています。&lt;br/&gt;./gen.sh アプリ名&lt;br /&gt;で利用できます(ノーエラーハンドリング上等！)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;$ cat gen.sh&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1265077.js?file=gen.sh"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6889501569950279243?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6889501569950279243/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/backbonejsrails3rails31.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6889501569950279243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6889501569950279243'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/backbonejsrails3rails31.html' title='backbone.jsをrails3で実行できるようにするシェルスクリプト(rails3.1対応版)'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5081177122481748602</id><published>2011-10-04T02:03:00.000+09:00</published><updated>2011-10-04T02:03:08.577+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='capybara'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3.1 with rspec-request , capybaraでcookieを取り扱うには</title><content type='html'>rails3.1とrspec-requestsをcapybaraで利用した際に、cookieの扱い方が分からなかったのでメモしておきます。&lt;br /&gt;&lt;pre class="brush: ruby;"&gt;# app/controllers/foo_controller.rb&lt;br /&gt;class FooController &amp;lt; ApplicationController&lt;br /&gt;  def index&lt;br /&gt;    puts cookies["key1"]&lt;br /&gt;    cookies["key1"] = '2'&lt;br /&gt;    cookies.permanent["key2"] = "3"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# spec/requests/foo_spec.rb&lt;br /&gt;describe "foo周辺の仕様" do&lt;br /&gt;  def cookies&lt;br /&gt;    Capybara.current_session.driver.browser.current_session.instance_variable_get(:@rack_mock_session).cookie_jar&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  it "foo/index" do&lt;br /&gt;    cookies["key1"] = '1'&lt;br /&gt;    visit "/foo/index"&lt;br /&gt;    cookies["key1"].should == '2'&lt;br /&gt;    cookies["key2"].should == '3'&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;上記の検証の過程で、&lt;ul&gt;&lt;li&gt;cookiesのキー名は文字列でないといけない(シンボルだと上手くいかない)&lt;/li&gt;&lt;li&gt;cookiesメソッドを上書く必要があり&lt;/li&gt;&lt;li&gt;permanentでも同じように読める("key2")&lt;/li&gt;&lt;/ul&gt;という事が判明しました。&lt;br/&gt;&lt;br/&gt;ちなみに各プロダクトは下記の組み合わせで確認しました。&lt;br /&gt;rails-3.1.0&lt;br /&gt;rspec-2.6.0&lt;br /&gt;rspec-rails-2.6.1&lt;br /&gt;capybara-1.0.1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5081177122481748602?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5081177122481748602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/rails31-with-rspec-request.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5081177122481748602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5081177122481748602'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/10/rails31-with-rspec-request.html' title='rails3.1 with rspec-request , capybaraでcookieを取り扱うには'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7269833958183784490</id><published>2011-09-26T02:03:00.001+09:00</published><updated>2011-09-26T02:08:17.309+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='capybara'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>capybaraをwebkitやseleniumとかで動かす場合の注意点と解決策</title><content type='html'>&lt;h2&gt;■概要&lt;/h2&gt;&lt;br /&gt;capybaraとwebkit(たぶんselenium)を利用する際は、capybara側がブラウザとやりとりする為のスレッドを立ち上げる為&lt;br /&gt;&lt;pre class="brush: ruby"&gt;RSpec.configure do |config|&lt;br /&gt;  ...&lt;br /&gt;  config.use_transactional_fixtures = false&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;してfixtureのトランザクション制御をあきらめる必要があります。これでは少し都合が悪いので、 &lt;a href="http://ja.asciicasts.com/episodes/257-request-specs-and-capybara"&gt;DatabaseCleanerを利用して&lt;/a&gt;代用する等行う必要があります。&lt;br /&gt;&lt;br /&gt;ところがrailsコアチームのjosevalim氏が解決策をぼそっとつぶやいてました。実際にやってみると上手く動くだけでなく実行速度がかなり改善されました。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;■解決策&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#!/josevalim/status/18195382848"&gt;つぶやき&lt;/a&gt;で紹介されている&lt;a href="https://gist.github.com/470808"&gt;方法&lt;/a&gt;は非常に簡単です。&lt;br /&gt;spec_helper(test_helper.rb)で下記の用に追記しましょう。&lt;br /&gt;&lt;pre class="brush: ruby"&gt;RSpec.configure do |config|&lt;br /&gt;  ...&lt;br /&gt;  config.use_transactional_fixtures = true&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;# 下記追加&lt;br /&gt;class ActiveRecord::Base&lt;br /&gt;  mattr_accessor :shared_connection&lt;br /&gt;  @@shared_connection = nil&lt;br /&gt;&lt;br /&gt;  def self.connection&lt;br /&gt;    @@shared_connection || retrieve_connection&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection&lt;br /&gt;&lt;/pre&gt;でいつもどおり&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ bundle exec rake spec&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;して見ましょう。specの実行速度が改善したのでは無いでしょうか？&lt;br /&gt;&lt;br /&gt;&lt;a href="http://journal.mycom.co.jp/news/2007/02/20/003.html"&gt;ね、簡単でしょう！&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;@josevalim氏に多謝！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7269833958183784490?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7269833958183784490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/capybarawebkitselenium.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7269833958183784490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7269833958183784490'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/capybarawebkitselenium.html' title='capybaraをwebkitやseleniumとかで動かす場合の注意点と解決策'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8027760409319225002</id><published>2011-09-25T03:11:00.000+09:00</published><updated>2011-09-26T02:09:56.294+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3.0の頃からvalidationにコンテキストを指定できる様になってた</title><content type='html'>&lt;h2&gt;■概要&lt;/h2&gt;railsは従来modelで入力チェックを行ってました。#saveメソッドを呼び出し時に、#valid?メソッドが呼び出される事により、入力チェックを行っている人が多いのでは無いでしょうか？&lt;br /&gt;&lt;br /&gt;ただし、この仕様は、たまに上手く行かない時があり、「XXという画面ではYYの入力チェックだけしたい」というニーズに答えるにはあまり良い方法がありませんでした(泥臭い方法で解決する)。&lt;br /&gt;&lt;br /&gt;ところが、先日railsのソースを読んでいると&lt;br /&gt;&lt;br /&gt;activerecord-3.1.0/lib/active_record/validations.rb&lt;br /&gt;&lt;pre class="brush:ruby"&gt;   def valid?(context = nil)&lt;br /&gt;      context ||= (new_record? ? :create : :update)&lt;br /&gt;      output = super(context)&lt;br /&gt;      errors.empty? &amp;amp;&amp;amp; output&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;とcontextが引数に渡せる仕様になってるので早速試してみました。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;■検証&lt;/h2&gt;実験用のPostモデルを下記の用にしました。&lt;br /&gt;&lt;pre class="brush:ruby"&gt;class Post &amp;lt; ActiveRecord::Base&lt;br /&gt;  validates_presence_of :title, :on =&amp;gt; :bar&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;でrails cで動かしてみました。&lt;br /&gt;&lt;pre&gt;$ rails c&lt;br /&gt;Loading development environment (Rails 3.1.0)&lt;br /&gt;ruby-1.9.2-p180 :001 &amp;gt; post = Post.new&lt;post created_at:="" id:="" nil,="" nil="" title:="" updated_at:=""&gt;&lt;br /&gt;ruby-1.9.2-p180 :002 &amp;gt; post.valid?(&lt;span class="Apple-style-span" style="color: red;"&gt;:bar&lt;/span&gt;)&lt;br /&gt; =&amp;gt; &lt;span class="Apple-style-span" style="color: red;"&gt;false&lt;/span&gt;&lt;br /&gt;ruby-1.9.2-p180 :003 &amp;gt; post.valid?(&lt;span class="Apple-style-span" style="color: red;"&gt;:foo&lt;/span&gt;)&lt;br /&gt; =&amp;gt; &lt;span class="Apple-style-span" style="color: red;"&gt;true&lt;/span&gt;&lt;br /&gt;ruby-1.9.2-p180 :004 &amp;gt; post.save(&lt;span class="Apple-style-span" style="color: red;"&gt;:context =&amp;gt; :bar&lt;/span&gt;)&lt;br /&gt; =&amp;gt; &lt;span class="Apple-style-span" style="color: red;"&gt;false&lt;/span&gt;&lt;br /&gt;ruby-1.9.2-p180 :005 &amp;gt; post.save(&lt;span class="Apple-style-span" style="color: red;"&gt;:context =&amp;gt; :foo&lt;/span&gt;)&lt;br /&gt;  SQL (46.0ms)  INSERT INTO "posts" ("created_at", "title", "updated_at") VALUES (?, ?, ?)  [["created_at", Sat, 24 Sep 2011 18:03:18 UTC +00:00], ["title", nil], ["updated_at", Sat, 24 Sep 2011 18:03:18 UTC +00:00]]&lt;br /&gt; =&amp;gt; &lt;span class="Apple-style-span" style="color: red;"&gt;true&lt;/span&gt;&lt;br /&gt;&lt;/post&gt;&lt;/pre&gt;おぉ！いい感じにcontextを意識できてますね！&lt;br /&gt;ソースを読むとコンテキスト未指定時は、新規なら:create、更新なら:updateをコンテキストとして採用しており、過去との互換性を維持しているという事がわかりました。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;■雑感&lt;/h2&gt;&lt;a href="https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rb"&gt;https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rb&lt;/a&gt;&lt;br /&gt;で追加されてました。2010/05/10に追加された様です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8027760409319225002?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8027760409319225002/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails30validation.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8027760409319225002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8027760409319225002'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails30validation.html' title='rails3.0の頃からvalidationにコンテキストを指定できる様になってた'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-315621893648281275</id><published>2011-09-24T01:01:00.000+09:00</published><updated>2011-09-24T01:01:23.371+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>RewriteCondが効かずに困った</title><content type='html'>言わずと知れた、apacheの&lt;i&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;mod_rewrite&lt;/span&gt;&lt;/i&gt;エンジンですがRewriteCondとRewriteRuleの記述方法にはまってしまいました。普通の書き方は他に任せるとしてハマったポイントを書いておきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■RewriteCondは直後のRewriteRuleのみに適用される。&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{HTTP_REFERER} $^ …①&lt;br /&gt;RewriteRule ^/foo/(.*) /foo2/$1 [L] …②&lt;br /&gt;RewriteRule ^/bar/(.*) /bar2/$1 [L] …③&lt;br /&gt;&lt;/pre&gt;上記の様な設定の時に①は、②にも③にも効きそうですが、実際には②にしか効きません。&lt;br /&gt;だからリファラーがあっても、barはbar2にリダイレクトしてしまいます。&lt;br /&gt;&lt;br /&gt;③にも効かせるには、(冗長ですが)下記の様に書く必要があります。&lt;br /&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{HTTP_REFERER} $^&lt;br /&gt;RewriteRule ^/foo/(.*) /foo2/$1 [L]&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;RewriteCond %{HTTP_REFERER} $^ &amp;nbsp; # 同じ記載をする！&lt;/span&gt;&lt;br /&gt;RewriteRule ^/bar/(.*) /bar2/$1 [L]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■RewriteCondはRewriteRuleの後に評価される。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteCond %{HTTP_REFERER} $^&lt;br /&gt;RewriteRule ^/foo/(.*) /foo2/$1 [L]&lt;br /&gt;&lt;br/&gt;&lt;div&gt;上記の設定の場合「リファラーが空なら、リクエストが/foo/*の場合、/foo2/*へリダイレクト&lt;span class="Apple-style-span"&gt;」&lt;/span&gt;&lt;span class="Apple-style-span"&gt;と思いたい所ですが、実際には「&lt;span class="Apple-style-span" style="color: red;"&gt;リクエストが/foo/*の場合、リファラーが空なら、/foo2/*へリダイレクト&lt;/span&gt;」という処理の流れになります。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;「何でRewriteLogLevelを上げて見てみても、RewriteCond実行されてない！効いてないんちゃうか？」って時はこれが原因の可能性が高いです。&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-315621893648281275?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/315621893648281275/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rewritecond.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/315621893648281275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/315621893648281275'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rewritecond.html' title='RewriteCondが効かずに困った'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8535765589695184775</id><published>2011-09-20T01:30:00.000+09:00</published><updated>2011-09-20T01:37:41.593+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>spec実行時にdb:test:prepareを呼び出したくない。</title><content type='html'>&lt;br /&gt;&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;(激しく既出感ありですが。。)何年もrailsやってますが、正しく理解できていなかった事の一つに&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;i&gt;rake spec(test)&lt;/i&gt;すると、処理の一環としてdb:test:prepareタスクを呼び出す&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;という挙動があります。&lt;br /&gt;通常問題にならないのですが、db:test:prepareが、db/schema.rbの情報を元にデーターベースを作成する為、railsが認識できないような項目は抜けて落ちてしまいます。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;関数適用したインデックス&lt;/li&gt;&lt;li&gt;トリガーやファンクション&lt;/li&gt;&lt;li&gt;別スキーマに作ったオブジェクト ...etc&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;なので&lt;br /&gt;&lt;br /&gt;&lt;i&gt;RAILS_ENV=test rake db:drop&lt;/i&gt;&lt;br /&gt;&lt;i&gt;RAILS_ENV=test rake db:create&lt;/i&gt;&lt;br /&gt;&lt;i&gt;RAILS_ENV=test rake db:migrate&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;してから&lt;i&gt;rake spec&lt;/i&gt;する事を前提に、db:test:prepareを呼び出さずにspecを実行する方法を模索しました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■案1 db:test:prepare自体を書き換える&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;参照先にそのまんまの解決策が書かれています。&lt;br /&gt;Rakefileでtask削除用のメソッドを用意します(load_tasksの前に！)。&lt;br /&gt;&lt;pre class="brush: ruby"&gt;Rake::TaskManager.class_eval do&lt;br /&gt;  def remove_task(task_name)&lt;br /&gt;    @tasks.delete(task_name.to_s)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;lib/tasks/db/test.rakeとかを作って、実際にタスクを上書きします&lt;br /&gt;&lt;pre class="brush: ruby"&gt;Rake.application.remove_task 'db:test:prepare'&lt;br /&gt;&lt;br /&gt;namespace :db do&lt;br /&gt;  namespace :test do &lt;br /&gt;    task :prepare do |t|&lt;br /&gt;      # rewrite the task to not do anything you don't want&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;参考 &lt;a href="http://stackoverflow.com/questions/1097845/how-to-prevent-rake-test-to-call-task-dbtestprepare"&gt;http://stackoverflow.com/questions/1097845/how-to-prevent-rake-test-to-call-task-dbtestprepare&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■案2 自力でspecを実行する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;db:test:prepareを壊すのは怖いので...という方にはこのやり方&lt;br /&gt;&lt;br /&gt;lib/tasks/spec.rakeとかを作って&lt;br /&gt;&lt;pre class="brush: ruby"&gt;require 'rake'&lt;br /&gt;require 'rspec/core/rake_task'&lt;br /&gt;&lt;br /&gt;namespace :spec do&lt;br /&gt;  RSpec::Core::RakeTask.new('no_prepare_db') do |t|&lt;br /&gt;    t.pattern = ['spec/**/*_spec.rb']&lt;br /&gt;  end&lt;br /&gt;  namespace :no_prepare_db do&lt;br /&gt;    %w(controllers helpers lib mailers models requests routing views).each do |dir|&lt;br /&gt;      RSpec::Core::RakeTask.new(dir) do |t|&lt;br /&gt;        t.pattern = ["spec/#{dir}/**/*_spec.rb"]&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;で、&lt;i&gt;rake spec:no_prepre_db&lt;/i&gt;や、&lt;i&gt;rake spec:no_prepare_db:models&lt;/i&gt;で、db:test:prepareを呼び出さずに実行できます。&lt;br /&gt;&lt;br /&gt;参考 &lt;a href="http://old.nabble.com/db%3Atest%3Aprepare-interfering-with-rake-spec-pattern-td31075510.html"&gt;http://old.nabble.com/db%3Atest%3Aprepare-interfering-with-rake-spec-pattern-td31075510.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8535765589695184775?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8535765589695184775/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/specdbtestprepare.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8535765589695184775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8535765589695184775'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/specdbtestprepare.html' title='spec実行時にdb:test:prepareを呼び出したくない。'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7220723566571549040</id><published>2011-09-18T01:04:00.000+09:00</published><updated>2011-09-18T21:14:56.919+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3.1時代のautocompleteは(一部駄目だし)</title><content type='html'>railsを始めて触った時は、圧倒的に簡単に利用できるautocomplete機能に驚かされたものです（あ～懐かしい。。）。&lt;br /&gt;あるバージョンからautocompleteはplugin側に外れたのですが、rails3時代にはどのplugin(gem)が利用されているんでしょうか？&lt;br /&gt;rails3.1からはjqueryが標準になったので、rails3 - jquery - autocompleteという切り口で探してみました。&lt;br /&gt;すると、そのまんまなgemがありました。&lt;br /&gt;&lt;a href="https://github.com/crowdint/rails3-jquery-autocomplete"&gt;https://github.com/crowdint/rails3-jquery-autocomplete&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■インストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Gemfileに&lt;br /&gt;gem 'rails3-jquery-autocomplete'&lt;br /&gt;&lt;br /&gt;でinstall&lt;br /&gt;$ bundle install&lt;br /&gt;&lt;br /&gt;次にコード生成して&lt;br /&gt;rails generate autocomplete:install&lt;br /&gt;&lt;br /&gt;# generatorのrails3.1対応はまだみたいなのでautocomplete-rails.jsは、public/assets/javascripts&lt;br /&gt;# に手動コピーしましょう。&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;jsを読み込みましょう&lt;/strike&gt;&lt;br /&gt;&lt;strike&gt;javascript_include_tag "autocomplete-rails.js"&lt;/strike&gt;&lt;br /&gt;&lt;br /&gt;application.jsでjquery-uiを読み込む用にしましょう。&lt;br /&gt;//= require jquery-ui&lt;br /&gt;&lt;br /&gt;後defaultではcssがしょんぼりなので、public/assets/stylesheetsに&lt;br /&gt;&lt;a href="https://raw.github.com/crowdint/rails3-jquery-autocomplete-app/master/public/stylesheets/jquery-ui-1.8.2.custom.css"&gt;https://raw.github.com/crowdint/rails3-jquery-autocomplete-app/master/public/stylesheets/jquery-ui-1.8.2.custom.css&lt;/a&gt;&lt;br /&gt;をおきましょう。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■利用方法&lt;/b&gt;&lt;br /&gt;controllerに&lt;br /&gt;class ProductsController &amp;lt; Admin::BaseController&lt;br /&gt;&amp;nbsp; # モデル名、フィールド名&lt;br /&gt;&amp;nbsp; autocomplete :brand, :name&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;routes.rbに&lt;br /&gt;resources :products do&lt;br /&gt;&amp;nbsp; get :autocomplete_brand_name, :on =&amp;gt; :collection&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;最後にviewに&lt;br /&gt;&amp;lt;%= form_for @product do |f| %&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;%= f.autocomplete_field :brand_name, autocomplete_brand_name_products_path %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://journal.mycom.co.jp/news/2007/02/20/003.html"&gt;ね、（そこそこ）簡単でしょう！&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■いくつか残念な点&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;調べてみて感じた残念な点&lt;br /&gt;&lt;ol&gt;&lt;li&gt;rails3.1対応はまだ&lt;/li&gt;&lt;li&gt;rspec-request用のサポートが欲しい&lt;/li&gt;&lt;li&gt;label/valueに適応されるmethodが同じ&lt;/li&gt;&lt;li&gt;term以外の動的要素に対応できない&lt;/li&gt;&lt;/ol&gt;ぼやいててもしょうがないので、やれる事はやろう(続く)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2011/09/18&lt;/b&gt; 上記4に対応してみました。&lt;a href="https://github.com/kennyj/rails3-jquery-autocomplete"&gt;https://github.com/kennyj/rails3-jquery-autocomplete&lt;/a&gt;&lt;br /&gt;gem 'rails3-jquery-autocomplete', :git =&amp;gt;&amp;nbsp;git://github.com/kennyj/rails3-jquery-autocomplete.git&lt;br /&gt;で使えると思います。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2011/09/18&lt;/b&gt; 上記1にも対応してみました(rails3.1 branch) 上記に, :branch =&amp;gt; 'rails3.1' を追加すると利用できるはずです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;2011/09/19&lt;/b&gt;&amp;nbsp;上記2はspec_helper.rbで、require 'steak/autocomplete' して、config.include Steak::Autocomplete, :type =&amp;gt; :request すればrspec-requestsでも動きました。&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7220723566571549040?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7220723566571549040/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails31autocomplete.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7220723566571549040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7220723566571549040'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails31autocomplete.html' title='rails3.1時代のautocompleteは(一部駄目だし)'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7362472788109778566</id><published>2011-09-07T02:12:00.000+09:00</published><updated>2011-09-11T12:41:33.099+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='asset pipe line'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3.1.0でasset pipe lineの問題発見（と解決方法)</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;rails3.1.0で、productionモードにてasset pipe lineを使うには、一般的には rake assets:precompile を利用すると思いますが（さもなくばエラーになります）、実行すると下記の用になります。&lt;br /&gt;&lt;pre&gt;$ rake assets:precompile&lt;br /&gt;$ ls -la public/assets/&lt;br /&gt;合計 544&lt;br /&gt;drwxrwxr-x 2 kj kj   4096  9月  6 01:33 .&lt;br /&gt;drwxrwxr-x 3 kj kj   4096  9月  6 01:33 ..&lt;br /&gt;-rw-rw-r-- 1 kj kj  96110  9月  6 01:27 application-2438fd50052a4a5b81204dc6fb.js&lt;br /&gt;-rw-rw-r-- 1 kj kj  33515  9月  6 01:27 application-2438fd50052a4a5b81204dc6fb.js.gz&lt;br /&gt;-rw-rw-r-- 1 kj kj      0  9月  6 01:27 application-4635849c44627859332fda6a01.css&lt;br /&gt;-rw-rw-r-- 1 kj kj     20  9月  6 01:27 application-4635849c44627859332fda6a01.css.gz&lt;br /&gt;-rw-rw-r-- 1 kj kj  91273  8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js&lt;br /&gt;-rw-rw-r-- 1 kj kj  32054  8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js.gz&lt;br /&gt;-rw-rw-r-- 1 kj kj 198431  8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js&lt;br /&gt;-rw-rw-r-- 1 kj kj  50610  8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js.gz&lt;br /&gt;-rw-rw-r-- 1 kj kj    318  9月  6 01:33 manifest.yml&lt;br /&gt;-rw-rw-r-- 1 kj kj   6646  9月  6 01:26 rails-a560b5a3a7be0808c5cd76a798.png&lt;br /&gt;&lt;/pre&gt;上記に&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;jqueryとjquery-uiが含まれている事が理解できません&lt;/span&gt;&lt;/b&gt;。application.jsの中にはjqueryが内包されています。またjquery-uiはSprocketsのディレクティブで指定もしていません。良くわからない挙動なので追跡してみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■原因&lt;/b&gt;&lt;br /&gt;actionpack-3.1.0/lib/sprockets/assets.rake にdebuggerを仕込み動きを追いましたが、&lt;br /&gt;&lt;pre&gt; &lt;br /&gt; 26         config.assets.precompile.each do |path|&lt;br /&gt; 27           env.each_logical_path do |logical_path|&lt;br /&gt; 28             if path.is_a?(Regexp)&lt;br /&gt; 29               next unless path.match(logical_path)&lt;br /&gt; 30             else&lt;br /&gt; 31               next unless File.fnmatch(path.to_s, logical_path)&lt;br /&gt; 32             end&lt;br /&gt; 33&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;上記の28行目のpathは、config.assets.precompileの配列のメンバーですが、デフォルトでは&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;になっています(railties-3.1.0/lib/rails/application/configuration.rb 38行目)&lt;br /&gt;上記配列の一番目は、rails.png等jsやcss以外の為に存在しますが、このままではjquery.min.jsやjquery-ui.minjsも29行目でヒットしてしまうじゃないか！！！という事に気付きました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■解決方法&lt;/b&gt;&lt;br /&gt;直してやれ！と思いましたが既に&lt;a href="https://github.com/rails/rails/pull/2876"&gt;問題&lt;/a&gt;になってました。よって&lt;br /&gt;&lt;ul&gt;&lt;li&gt;上記もうすぐ取り込まれそうなので3.1.1?を待つ&lt;/li&gt;&lt;li&gt;とりあえず&lt;b&gt;config/environments/production.rb&lt;/b&gt;で&lt;b&gt;　config.assets.precompile = [ /\.(?!js$|css$)\w+$/, /application.(css|js)$/ ]　&lt;/b&gt;とする&lt;/li&gt;&lt;/ul&gt;辺りで対応しましょう。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■2011/09/11追記&lt;/b&gt;&lt;br /&gt;解決されている様です。あるべき姿になった感じです！ &lt;a href="https://github.com/rails/rails/commit/082f53a3bca9dce70adcf41094e246d2c9fed934"&gt;https://github.com/rails/rails/commit/082f53a3bca9dce70adcf41094e246d2c9fed934&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7362472788109778566?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7362472788109778566/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails310asset-pipe-line.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7362472788109778566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7362472788109778566'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/09/rails310asset-pipe-line.html' title='rails3.1.0でasset pipe lineの問題発見（と解決方法)'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6379738464485816463</id><published>2011-08-23T01:02:00.001+09:00</published><updated>2011-08-23T01:04:03.553+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='capybara'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>capybara-webkitを動かす 2011/08/23時点版</title><content type='html'>■概要&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/babie/20110430/1304136144"&gt;こちら&lt;/a&gt;の素晴らしい記事では、capybara-webkitを利用して、headlessでjsが動く環境を紹介されています。&lt;br /&gt;&lt;br /&gt;capybara-webkitのこれまでリリースされているバージョン(～0.5.0)では、capybara1.0.0系への依存が解決できない為、抗う方法をご紹介されています。が、0.6.0からは上手く依存関係を解決されるようになりました！&lt;br /&gt;&lt;br /&gt;■手順&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs1.html"&gt;こちら&lt;/a&gt;と同様ですが、Xvfbとqtの当たらしいバージョン(qt47)をインストールしておきます。&lt;br /&gt;qt47にする理由はphantomjsも動かしたいからです ^o^&lt;br /&gt;&lt;br /&gt;$ sudo yum -y install firefox ★ seleniumで動かす必要があれば&lt;br /&gt;$ sudo yum -y install xorg-x11-server-Xvfb xorg-x11-fonts*&lt;br /&gt;$ sudo vim /etc/yum.repos.d/atrpms.repo&lt;br /&gt;&lt;br /&gt;[atrpms]&lt;br /&gt;name= CentOS-$releasever - ATrpms&lt;br /&gt;baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/testing/&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms&lt;br /&gt;enabled=0&lt;br /&gt;&lt;br /&gt;$ sudo rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms&lt;br /&gt;$ sudo yum -y install sqlite --enablerepo=atrpms ★依存関係からインストールする必要がある?&lt;br /&gt;$ sudo yum -y install qt47-devel qt47-webkit qt47-webkit-devel --enablerepo=atrpms&lt;br /&gt;$ sudo ln -s /usr/bin/qmake-qt47 /usr/bin/qmake (コンパイル時に必要とされるので予め作成)&lt;br /&gt;&lt;br /&gt;でrailsプロジェクト側で&lt;br /&gt;&lt;br /&gt;$ vim Gemfile&lt;br /&gt;&lt;pre class="brush: ruby"&gt;group :development, :test do&lt;br /&gt;  ...&lt;br /&gt;  gem 'capybara', '1.0.1'&lt;br /&gt;  gem 'capybara-webkit', '0.6.0'&lt;br /&gt;  gem 'headless', '0.1.0'&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;$ bundle install&lt;br /&gt;$ vim spec/spec_helper.rb&lt;br /&gt;&lt;pre class="brush: ruby"&gt;...&lt;br /&gt;require "capybara/rails"&lt;br /&gt;require "capybara/rspec"&lt;br /&gt;...&lt;br /&gt;RSpec.configure do |config|&lt;br /&gt;...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Capybara.javascript_driver = :webkit&lt;br /&gt;&lt;/pre&gt;$ vim spec/support/headless.rb&lt;br /&gt;&lt;pre class="brush: ruby"&gt;if %w(yes y on).include?(ENV['HEADLESS'])&lt;br /&gt;  require 'headless'&lt;br /&gt;&lt;br /&gt;  headless = Headless.new&lt;br /&gt;  headless.start&lt;br /&gt;&lt;br /&gt;  at_exit do&lt;br /&gt;    headless.destroy&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;$ vim spec/requests/index_spec.rb&lt;br /&gt;&lt;pre class="brush: ruby"&gt;# coding: utf-8&lt;br /&gt;&lt;br /&gt;require 'spec_helper'&lt;br /&gt;&lt;br /&gt;describe "Index" do&lt;br /&gt;  describe "GET /" do&lt;br /&gt;    it "/index.html", :js =&amp;gt; true do&lt;br /&gt;      visit "/"&lt;br /&gt;      click_link "About your application’s environment"&lt;br /&gt;      page.should have_content("No route matches")&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;で&lt;br /&gt;$ HEADLESS=on bundle exec rspec spec/requests/index_spec.rb&lt;br /&gt;&lt;pre&gt;Index&lt;br /&gt;  GET /&lt;br /&gt;    &lt;span class="Apple-style-span" style="color: lime;"&gt;/index.html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finished in 4.48 seconds&lt;br /&gt;&lt;span class="Apple-style-span" style="color: lime;"&gt;1 example, 0 failures&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;という訳でいい感じに実行できました～&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6379738464485816463?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6379738464485816463/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/capybara-webkit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6379738464485816463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6379738464485816463'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/capybara-webkit.html' title='capybara-webkitを動かす 2011/08/23時点版'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-659634264383115067</id><published>2011-08-20T03:40:00.001+09:00</published><updated>2011-08-23T20:42:34.437+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rjb'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>javaの32bitと64bitの使い分けにはご注意を</title><content type='html'>最近では64bit OS環境が広く利用されている事と思います。&lt;br /&gt;一般的に64bit環境での32bitコマンドの実行は問題が無いと思いますが、java関係で二つ程問題が発生したので記録しておきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■Tomcatが起動出来なくなった。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;64bit =&amp;gt; 32bit javaに変更した所、Tomcatが起動しなくなりました。調べてみるとTomcat本体の問題では無かったのですが、jsvcを利用して起動している為、問題が発生しているようです(TOMCAT_HOME/bin/startup.sh等では問題なく起動しました)。&lt;br /&gt;&lt;br /&gt;一部推測混じりですが&lt;br /&gt;&lt;br /&gt;・jsvcを利用するにはコンパイルが必要&lt;br /&gt;・コンパイル時には、configureを実行&lt;br /&gt;・configureのログをよく見てみると、linux自体を"x86_64"と判定&lt;br /&gt;・よってjavaは64bit版を想定してコンパイルしてしまう（推測）&lt;br /&gt;&lt;br /&gt;という理由で上手く行かなくなったのではと思われます。&lt;br /&gt;&lt;br /&gt;結論：jsvcを利用する場合は、32/64bitをOSとあわせる必要があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■rjb(ruby java bridge)が動かなくなった。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;こちらも64bit =&amp;gt; 32bit javaに変更した所、動かなくなりました。ruby側からJava VMを作成できなくなるようです。&lt;br /&gt;&lt;br /&gt;但し上記問題を解決しても、javaのマイナーバージョン違いで急に動かなくなる場合を確認しています(jdk6u22 =&amp;gt; jdk6u23)。ログを見た限りではGC発生タイミングでseg faultしてしまうようです。&lt;br /&gt;&lt;br /&gt;リリースノートを見ている限りでは、hotspot vmのバージョンが上がったから？等推測してますが根本原因は判明しませんでした。&lt;br /&gt;&lt;br /&gt;結論：rjbを利用する場合は、32/64bitをOSとあわせる必要があります。またマイナーバージョン含め実績のあるjava/rubyのバージョン組み合わせ・設定を大事にする必要があります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-659634264383115067?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/659634264383115067/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/java32bit64bit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/659634264383115067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/659634264383115067'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/java32bit64bit.html' title='javaの32bitと64bitの使い分けにはご注意を'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7779245683957580506</id><published>2011-08-17T00:03:00.001+09:00</published><updated>2011-08-22T23:51:50.687+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><title type='text'>centos5.xでnginxをインストール。サービス起動 &amp; ログローテーション付き</title><content type='html'>今更感満載ですが、もったいないのであげておきます。&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1149301.js?file=gistfile1.txt"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7779245683957580506?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7779245683957580506/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/centos5xnginx.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7779245683957580506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7779245683957580506'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/centos5xnginx.html' title='centos5.xでnginxをインストール。サービス起動 &amp; ログローテーション付き'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5766426353488850999</id><published>2011-08-16T18:18:00.003+09:00</published><updated>2011-08-16T21:26:17.539+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='session'/><title type='text'>(小ネタ)railsのセッションを復元する(rails2.3系で確認)</title><content type='html'>必要に迫られたので... メモ残しておきます。&lt;br /&gt;&lt;br /&gt;$ irb&lt;br /&gt;&amp;gt; require 'rubygems'&lt;br /&gt;&amp;gt; require 'active_support'&lt;br /&gt;&amp;gt; v = ActiveSupport::MessageVerifier.new('Railsのsecret', 'SHA1')&lt;br /&gt;&amp;gt; v.verify('session文字列')&lt;br /&gt;&lt;br /&gt;※1 Railsのsecretは、initializer/session_store.rb&lt;br /&gt;※2 session文字列は、cookieから取得&lt;br /&gt;&lt;br /&gt;ちなみに得られる結果は&lt;b&gt;rack.session&lt;/b&gt;と同じです。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5766426353488850999?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5766426353488850999/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/railsrails23.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5766426353488850999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5766426353488850999'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/railsrails23.html' title='(小ネタ)railsのセッションを復元する(rails2.3系で確認)'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-9038276444284361685</id><published>2011-08-13T02:02:00.002+09:00</published><updated>2011-08-17T00:18:45.177+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>ruby1.9時代にrcovは使ってはいけない。simplecovを使おう！</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;rubyにおけるテスト網羅率の定番ツールといえばrcovですが、どうもテストの通っている箇所の色付けがおかしいのと網羅率に誤差があると感じてました。&lt;br /&gt;&lt;br /&gt;よくよく&lt;a href="https://github.com/relevance/rcov"&gt;githubのrcovのページ&lt;/a&gt;を見てみると、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;NOTE: This fork &lt;span class="Apple-style-span" style="color: red;"&gt;does not work&lt;/span&gt; on Ruby 1.9.x. For coverage on Ruby 1.9 look at &lt;span class="Apple-style-span" style="color: red;"&gt;SimpleCov&lt;/span&gt;. Even if you get results on 1.9 they will probably be inaccurate. Ruby 1.9 has call detection built in for faster, more accurate results.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;なんて書いてあります。という訳で&lt;a href="https://github.com/colszowka/simplecov"&gt;SimpleCov&lt;/a&gt;を試してみました。&lt;br /&gt;&lt;br /&gt;なお&lt;a href="http://kennyj-jp.blogspot.com/2011/07/backbonejsrails3.html"&gt;こちら&lt;/a&gt;で簡単にセットアップできるシェルスクリプト置いてます！&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■説明&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;まずはいつものGemfileに&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gem 'simplecov', :require =&amp;gt; false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;と記載して&lt;br /&gt;&lt;br /&gt;$ bundle install&lt;br /&gt;&lt;br /&gt;次にspec/spec_helper.rbに下記コードを追加しましょう。&lt;br /&gt;この時大事なのは&lt;span class="Apple-style-span" style="color: red;"&gt;実行の早い段階（railsが読み込まれる前！）で下記を実行する必要がある&lt;/span&gt;事です。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require 'simplecov'&lt;br /&gt;SimpleCov.start 'rails'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;で&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;$ rake spec&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;すると、coverageディレクトリ以下にhtmlファイルが出力されます(画像はsimplecovのページより)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://a248.e.akamai.net/assets.github.com/img/698fb79f19ddbdea983695df8e237fb58a663260/687474703a2f2f696d672e736b697463682e636f6d2f32303130303832332d6e39663532693374793371613763716a333372616667687274632e706e67" imageanchor="1"&gt;&lt;img border="0" height="377" src="https://a248.e.akamai.net/assets.github.com/img/698fb79f19ddbdea983695df8e237fb58a663260/687474703a2f2f696d672e736b697463682e636f6d2f32303130303832332d6e39663532693374793371613763716a333372616667687274632e706e67" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;このままでも良いのですが、rcovのフォーマットと異なるので、CIに統合するには不便です。そんな時は&lt;a href="https://github.com/fguillen/simplecov-rcov"&gt;simplecov_rcov&lt;/a&gt;を利用すると上手く行きます。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;group :test do&lt;br /&gt;  gem 'simplecov', :require =&amp;gt; false&lt;br /&gt;  gem 'simplecov-rcov', :require =&amp;gt; false&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;$ bundle install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;spec/spec_helper.rbには、SimpleCovの出力フォーマットを変更するコードを書きます。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require 'simplecov'&lt;br /&gt;require 'simplecov-rcov'&lt;br /&gt;SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;※くれぐれも早い段階で読み込んで下さい！&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;すると見慣れたあのHTMLがcoverage/rcov以下に出力されます。&lt;br /&gt;coverage/rcovをCI(というかjenkins)のrcovレポートの場所として指定してあげると良好な結果が得られます！&lt;br /&gt;&lt;br /&gt;ちなみにsimplecov-rcovのページで下記の様な記載があり、網羅率測定有無を切り替える方法があります。&lt;br /&gt;&lt;pre&gt;if( ENV['COVERAGE'] == 'on' )&lt;br /&gt;  require 'simplecov'&lt;br /&gt;  require 'simplecov-rcov'&lt;br /&gt;  SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter&lt;br /&gt;  ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;$ COVERAGE=on rake spec&lt;br /&gt;&lt;/pre&gt;また複数の出力フォーマットで出力する例もありますので是非見てみて下さい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-9038276444284361685?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/9038276444284361685/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/ruby19rcovsimplecov.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/9038276444284361685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/9038276444284361685'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/ruby19rcovsimplecov.html' title='ruby1.9時代にrcovは使ってはいけない。simplecovを使おう！'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8741409694548712595</id><published>2011-08-12T02:35:00.000+09:00</published><updated>2011-08-12T02:35:53.189+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xsendfile'/><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3とnginxでx-sendfile的な事をしてみる</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;rails3.0.9・nginxの組み合わせで、apacheでのX-Sendfile相当の事が実現したく検証しましたが、これまた少しはまりました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■答えまでの道のり&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;config/environments/production.rb を見ると&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Specifies the header that your server uses for sending files&lt;br /&gt;  config.action_dispatch.x_sendfile_header = "X-Sendfile"&lt;br /&gt;&lt;br /&gt;  # For nginx:&lt;br /&gt;  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;という記載があるので、上をコメントアウトし、下をコメント外せば、OKと思ったのですが甘かったです。。上手く行かずエラーが出ます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.nginx.org/XSendfile"&gt;nginxのドキュメント&lt;/a&gt;を見ても、internalに対応する内部向けurlが、必要なのは分かりますが、いまいち良くわかりません。&lt;br /&gt;&lt;br /&gt;ではrailsのsend_fileメソッド&lt;a href="https://raw.github.com/rails/rails/3-0-10/actionpack/lib/action_controller/metal/streaming.rb"&gt;(actionpack-3.0.x/lib/action_controller/metal/streaming.rb&lt;/a&gt;)のソースを確認しても、pathには絶対パスを渡さないと上手く行かない事が予想されます（冒頭でファイルシステムとしての存在チェックをしているので）。しかしよく見ると&lt;br /&gt;&lt;br /&gt;# Sends the file. This uses a server-appropriate method (such as X-Sendfile)&lt;br /&gt;# via the&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;b&gt;Rack::Sendfile&lt;/b&gt;&lt;/span&gt; middleware. The header to use is set via&lt;br /&gt;&lt;br /&gt;と書いてあるので、次はRack::Sendfile(&lt;a href="https://raw.github.com/rack/rack/1.2.3/lib/rack/sendfile.rb"&gt;rack-1.2.x/lib/rack/sendfile.rb&lt;/a&gt;)を見てみました。コメントには下記の用にnginx用のサンプルがあります。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  #   location ~ /files/(.*) {&lt;br /&gt;  #     internal;&lt;br /&gt;  #     alias /var/www/$1;&lt;br /&gt;  #   }&lt;br /&gt;  #&lt;br /&gt;  #   location / {&lt;br /&gt;  #     proxy_redirect     off;&lt;br /&gt;  #&lt;br /&gt;  #     proxy_set_header   Host                $host;&lt;br /&gt;  #     proxy_set_header   X-Real-IP           $remote_addr;&lt;br /&gt;  #     proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;&lt;br /&gt;  #&lt;br /&gt;  #     proxy_set_header   X-Sendfile-Type     X-Accel-Redirect;  # ①&lt;br /&gt;  #     proxy_set_header   X-Accel-Mapping     /files/=/var/www/; # ②&lt;br /&gt;  #&lt;br /&gt;  #     proxy_pass         http://127.0.0.1:8080/;&lt;br /&gt;  #   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;アプリケーションの通常処理を行うlocation "/" と、ファイル転送用のlocation "~ /files(.*)"があり/var/wwwがマッピングされるのかな？と思い、真似してみましたが上手くいきません。。&lt;br /&gt;&lt;br /&gt;もう少しRackのソースを読んでみると、上記設定の意味が良くわかります。①はvariationメソッドの戻り値になります。したがってcall内の分岐は"X-Accel-Redirect"に進みます。その後map_accel_pathメソッドを実行するのですが、ここで驚愕の事実に気付きます。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;def map_accel_path(env, file)&lt;br /&gt;    if mapping = env['HTTP_X_ACCEL_MAPPING']&lt;br /&gt;      internal, external = mapping.split('=', 2).map{ |p| p.strip }&lt;br /&gt;      file.sub(/^#{internal}/i, external)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;②は絶対パスを、nginx用内部urlに変換する為に必要な設定ですが「&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;右辺と左辺をドキュメントでは逆に書いている！&lt;/b&gt;&lt;/span&gt;」という事に気付きました。(internalとexternal)&lt;br /&gt;&lt;br /&gt;よって②は左右逆転にしなければいけません。&lt;br /&gt;&lt;br /&gt;proxy_set_header   X-Accel-Mapping     /var/www/=/files/;&lt;br /&gt;&lt;br /&gt;ここまでやって上手くいきました。&lt;br /&gt;/var/www/hoge.txt (send_file) =&gt; /files/hoge.txt (rackから出た時点) =&gt; /var/www/hoge.txt (nginxでの処理)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■設定方法(まとめ)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;・config/environments/production.rb&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;のコメントをはずし、一つ上のX-Sendfileはコメントアウトします。&lt;br /&gt;&lt;br /&gt;・プログラム&lt;br /&gt;&lt;br /&gt;ファイル送信部分は絶対パス指定します。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;send_file "/var/www/baz.txt"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・/etc/nginx/nginx.conf&lt;br /&gt;&lt;br /&gt;下記の様に、通常処理側には、X-Sendfile-Type・X-Accel-Mapping、内部処理向けには、internal・alias設定を記載すればOKです。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;location / {&lt;br /&gt;  ...&lt;br /&gt;  proxy_set_header X-Sendfile-Type X-Accel-Redirect;&lt;br /&gt;  proxy_set_header X-Accel-Mapping /var/www/=/files/;&lt;br /&gt;  ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;location /files/ {&lt;br /&gt;  internal;&lt;br /&gt;  alias /var/www;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8741409694548712595?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8741409694548712595/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/rails3nginxx-sendfile.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8741409694548712595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8741409694548712595'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/rails3nginxx-sendfile.html' title='rails3とnginxでx-sendfile的な事をしてみる'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-1442812799918750941</id><published>2011-08-12T01:41:00.000+09:00</published><updated>2011-08-12T01:41:13.735+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nginx'/><category scheme='http://www.blogger.com/atom/ns#' term='unicorn'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails3でのsub ディレクトリへのデプロイ</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;rails3.0.9・unicorn・nginxの組み合わせで、subディレクトリにアプリケーションをデプロイしようとすると、少しはまったのでメモを残しておきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■設定方法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://ホスト名/foo 以下にアプリをデプロイしたい場合...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○unicorn&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;unicorn_railsを実行する際に--pathを渡します。&lt;br /&gt;&lt;br /&gt;例)&lt;br /&gt;&lt;pre&gt;$ unicorn_rails -c config/unicorn.rb -E production -D --path /foo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;○nginx&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;passengerと同じくDocument Root直下に、subディレクトリ名でpublicへのシンボリックリンクをはればOKです。またlocation設定はsubディレクトリ毎に設定するのが良い感じでしょうね。&lt;br /&gt;&lt;br /&gt;例)&lt;br /&gt;&lt;pre&gt;$ ln -s /path/to/foo_root/public /var/apps/foo&lt;br /&gt;$ vim /etc/nginx/nginx.conf&lt;br /&gt;...&lt;br /&gt;root /var/apps/;&lt;br /&gt;...&lt;br /&gt;location /foo {&lt;br /&gt;  if (-f $request_filename) { break; }&lt;br /&gt;  proxy_set_header X-Real-IP  $remote_addr;&lt;br /&gt;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;  proxy_set_header Host $http_host;&lt;br /&gt;  proxy_pass http://(foo用のunixドメインのソケット);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;○rails3.0.9&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ActionController::Base.config.relative_url_root= が、deprecatedなのでどうしようかと思いますが検証した結果、下記で上手く行きました。&lt;br /&gt;通常のroutingもassetもこれで上手くいきます（config.serve_static_assets = false なので、assetsはnginxが処理します）。&lt;br /&gt;&lt;br /&gt;・unicon_rails --pathの設定は、ENV['RAILS_RELATIVE_URL_ROOT']となってrack側に渡される&lt;br /&gt;・ENV['RAILS_RELATIVE_URL_ROOT']は、ActionController::Base.config.relative_url_rootに代入されている(?)&lt;br /&gt;・よってconfig.ruで下記のようにrunを囲む&lt;br /&gt;&lt;pre&gt;map ActionController::Base.config.relative_url_root || "/" do&lt;br /&gt;  run FooApp::Application&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;参考：困った時のstackoverflow &lt;a href="http://stackoverflow.com/questions/3181746/what-is-the-replacement-for-actioncontrollerbase-relative-url-root"&gt;http://stackoverflow.com/questions/3181746/what-is-the-replacement-for-actioncontrollerbase-relative-url-root&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-1442812799918750941?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/1442812799918750941/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/rails3sub.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1442812799918750941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1442812799918750941'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/08/rails3sub.html' title='rails3でのsub ディレクトリへのデプロイ'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-352824468157722597</id><published>2011-07-31T22:41:00.004+09:00</published><updated>2011-08-01T00:06:55.606+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='rdbms'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>(小ネタ)システムコントロールテーブルは必ず用意しましょう</title><content type='html'>システムを構築すると、必ず「設定値」が必要になります。&lt;br /&gt;&lt;br /&gt;・1ページの表示行数&lt;br /&gt;・XXした際の遷移先URL&lt;br /&gt;・YY通信のタイムアウト時間&lt;br /&gt;...etc&lt;br /&gt;&lt;br /&gt;上記設定をどこに置くかは結構大きな問題です。&lt;br /&gt;&lt;br /&gt;(例)&lt;br /&gt;①propertiesファイル (javaの場合)&lt;br /&gt;②xxx.rbファイル (rubyの場合)&lt;br /&gt;③データベース&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;上記①や②は最速ですが、設定値の反映には「アプリケーションの再デプロイ or 再起動」が必要になります。よって気軽に変更値の変更という訳にはいきません。&lt;br /&gt;&lt;br /&gt;③はデータベースへの問い合わせが必要ですが、アプリケーション実行時に設定値を切り替えられるという利点があります。この手の設定値テーブルを用意しておくと顧客との打合せ時に、無駄な値決めに時間を浪費する事を回避できるというメリットもあります（&lt;span class="Apple-style-span" style="color: red;"&gt;顧客は情報がそろってから意思決定できるようになるので&lt;/span&gt;）。&lt;br /&gt;&lt;br /&gt;よって、システムを開発してusersテーブルを作成した次には（？）、上記テーブルを作成しましょう。(心の)師匠、渡辺幸三さんに敬意を評し、「システムコントロール」テーブルと名づけましょう。&lt;br /&gt;&lt;br /&gt;system_controls&lt;br /&gt;----&lt;br /&gt;code (PK or UK)&lt;br /&gt;value (設定値)&lt;br /&gt;editable (ユーザが画面上より編集可能か？)&lt;br /&gt;description (編集画面での説明文章)&lt;br /&gt;type (文字列、数字、boolean等入力タイプの区分値。多くなるならドメインテーブル作成。入力チェックと絡めるのも良いかもですね)&lt;br /&gt;updater_id (最終更新者)&lt;br /&gt;updated_at (最終更新日時)&lt;br /&gt;&lt;br /&gt;こんな感じかな？&lt;br /&gt;&lt;br /&gt;スピードが気になる人は、上記のcode値を利用して、KVSとかキャッシュサーバに突っ込めば良いでしょう。&lt;br /&gt;# 変更、破棄タイミングに気をつけて下さい&lt;br /&gt;&lt;br /&gt;ちなみに上記目的のテーブルを横持ち（カラム）で持ちたがる人がいますが、全力で阻止しましょう。柔軟にcodeを追加出来るのがミソなので！！&lt;br /&gt;&lt;br /&gt;後DB障害発生時に問い合わせられない事も意識する必要があります（例　例外メール送信先）ので注意が必要です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-352824468157722597?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/352824468157722597/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/blog-post_31.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/352824468157722597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/352824468157722597'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/blog-post_31.html' title='(小ネタ)システムコントロールテーブルは必ず用意しましょう'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-3934904487711360346</id><published>2011-07-28T23:23:00.021+09:00</published><updated>2011-07-31T15:43:45.966+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='backbonejs'/><category scheme='http://www.blogger.com/atom/ns#' term='pjax'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>backbone.jsがいつのまにかpjax対応していた</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;年初にbackbone.jsの調査をしていた頃は、ajaxで画面遷移を行うには、fragmentを利用する事しかできませんでした。&lt;br /&gt;&lt;br /&gt;しかし0.5以降では、Backbone.Routerを利用する事によって、pjax(HTML5のpushStateを利用した話題のあれ)な画面遷移が出来るになっています。&lt;br /&gt;&lt;br /&gt;pjaxについては、&lt;a href="http://d.hatena.ne.jp/punitan/20110404/1301895279"&gt;こちら&lt;/a&gt;をご参照ください。&lt;br /&gt;またgithubの&lt;a href="https://github.com/kennyj/java_bin"&gt;ファイルブラウザ&lt;/a&gt;はpjaxの良例として有名なのでチェックしてみて下さい。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;■何処がpjaxなのか？&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;まずは&lt;a href="#example"&gt;下記手順&lt;/a&gt;を実施後、http://localhost:3000/を閲覧してみましょう。chrome等html5対応ブラウザで確認して下さい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/-0-SBdIpCtUc/TjFvhDvNmSI/AAAAAAAAAEc/3hPZf_MW3cw/s1600/index.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-0-SBdIpCtUc/TjFvhDvNmSI/AAAAAAAAAEc/3hPZf_MW3cw/s400/index.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次にhelpをクリックしてみましょう。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/-6tsj78gvjOw/TjFviPrtSPI/AAAAAAAAAEk/fYRUd9jmVT8/s1600/help.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-6tsj78gvjOw/TjFviPrtSPI/AAAAAAAAAEk/fYRUd9jmVT8/s400/help.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;注目すべきなのは、&lt;/div&gt;&lt;div&gt;①URLが変わっている&lt;/div&gt;&lt;div&gt;②画面下部のレンダリング日時が変わっていない。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次にaboutをクリックしてみましょう。helpの時と同じです。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-a-jlBDX49fg/TjFviUnY9hI/AAAAAAAAAEo/4d_MjiWcu44/s1600/about.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-a-jlBDX49fg/TjFviUnY9hI/AAAAAAAAAEo/4d_MjiWcu44/s400/about.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ブラウザの「戻る」ボタンをクリックしてみましょう。&lt;br /&gt;About =&amp;gt; Help =&amp;gt; Indexに遷移します。「進む」ボタンもいい感じに遷移します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次にHelpが画面に表示されている状態で、「F5」を押下してみましょう。&lt;/div&gt;&lt;div&gt;レンダリング日時が変わったはずです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/-tvgSPgOi51I/TjFvhrTuThI/AAAAAAAAAEg/p5LNjt7YuTo/s1600/help2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-tvgSPgOi51I/TjFvhrTuThI/AAAAAAAAAEg/p5LNjt7YuTo/s400/help2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;■説明&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ajaxは非同期に（高速に）画面の一部を書き換える技術ですが、ユーザーの利便性の観点から、ブラウザの戻る、進むを利用可能にする必要があります。これまでのajaxでは、#(フラグメント)を利用して実現する事が多かったのですが、あまり良い解決策では有りませんでした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;pjaxでは、HTML5のpushStateを利用する事により、ブラウザのURLを切り替えつつ、画面の一部のみ切り替える事ができます。無論、URLは通常のURLですので、「通常のHTTPリクエスト」として処理するように実装する事が可能です。下記のIndexControllerでは、Ajax通信かどうかでレイアウトの適用を変更しています。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;これができたら何が嬉しいのか？！それは読者への宿題にしておきます(^.^;&lt;/div&gt;&lt;br /&gt;ちなみに、IE(≒pushStateをサポートしていないブラウザ)でみたら fragment での遷移に自動的に切り替わってました。。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;span id="example"&gt;■体験手順&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;・まずは&lt;a href="http://kennyj-jp.blogspot.com/2011/07/backbonejsrails3.html"&gt;前回の記事&lt;/a&gt;を参考にプロジェクトを生成する。&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ ./gen.sh pjax&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;・移動して体験に必要なファイルを用意する&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ cd pjax&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;app/views/layouts/application.html.erb&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;html&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;title&amp;gt;pjax2&amp;lt;/title&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;meta charset="utf-8"/&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;%= stylesheet_link_tag :all %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;%= javascript_include_tag :defaults %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;%= javascript_include_tag :backbone %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;script&amp;gt;&amp;lt;%= yield :javascripts %&amp;gt;&amp;lt;/script&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;%= csrf_meta_tag %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;lt;%= content_for?(:content) ? yield(:content) : yield %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;b&gt;app/views/layouts/index.html.erb&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;lt;%= content_for :javascripts do %&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;$(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; var Workspace = Backbone.Router.extend({&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; routes: {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "": &amp;nbsp; &amp;nbsp; &amp;nbsp;"index",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "help": &amp;nbsp;"help",&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "about": "about"&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; index: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $("#app").load("/");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; help: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $("#app").load("/help");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; },&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; about: function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; $("#app").load("/about");&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; var ws = new Workspace();&lt;/div&gt;&lt;div&gt;&amp;nbsp; Backbone.history.start({pushState: true});&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; $("#indexButton").click(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ws.navigate("", true);&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; $("#helpButton").click(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ws.navigate("help", true);&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;&amp;nbsp; $("#aboutButton").click(function() {&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; ws.navigate("about", true);&lt;/div&gt;&lt;div&gt;&amp;nbsp; });&lt;/div&gt;&lt;div&gt;});&lt;/div&gt;&lt;div&gt;&amp;lt;% end %&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;%= content_for :content do %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;div id="app"&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;hr/&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;input type="button" name="index" value="index" id="indexButton" /&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;input type="button" name="help" &amp;nbsp;value="help" &amp;nbsp;id="helpButton" /&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;lt;input type="button" name="about" value="about" id="aboutButton" /&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; 最終レンダリング日時:&amp;lt;%= I18n.l Time.now %&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;% end %&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;%= render :file =&amp;gt; "layouts/application" %&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;app/views/index/index.html.erb&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;h1&amp;gt;Index&amp;lt;/h1&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;app/views/index/help.html.erb&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;lt;h1&amp;gt;help&amp;lt;/h1&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;app/views/index/about.html.erb&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;h1&amp;gt;about&amp;lt;/h1&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;app/controllers/index_controller.rb&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;class IndexController &amp;lt; ApplicationController&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; layout "index"&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; def index&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; render :layout =&amp;gt; !request.xhr?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; end&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; def help&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; render :layout =&amp;gt; !request.xhr?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; end&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; def about&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; render :layout =&amp;gt; !request.xhr?&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; end&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;end&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;config/routes.rb&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;最後に&lt;/div&gt;&lt;div&gt;root :to &amp;nbsp; &amp;nbsp; &amp;nbsp;=&amp;gt; "index#index"&lt;/div&gt;&lt;div&gt;&lt;div&gt;match "help" &amp;nbsp;=&amp;gt; "index#help"&lt;/div&gt;&lt;div&gt;match "about" =&amp;gt; "index#about"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;public/index.html &amp;lt;= 削除&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;サーバ起動！&lt;/div&gt;&lt;div&gt;&lt;b&gt;$ rails server&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-3934904487711360346?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/3934904487711360346/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/backbonejspjax.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3934904487711360346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3934904487711360346'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/backbonejspjax.html' title='backbone.jsがいつのまにかpjax対応していた'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-0-SBdIpCtUc/TjFvhDvNmSI/AAAAAAAAAEc/3hPZf_MW3cw/s72-c/index.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7761228027283941509</id><published>2011-07-28T22:43:00.005+09:00</published><updated>2011-11-24T22:29:17.048+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backbone.js'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><category scheme='http://www.blogger.com/atom/ns#' term='generator'/><title type='text'>backbone.jsをrails3で実行できるようにするシェルスクリプト</title><content type='html'>&lt;span class="Apple-style-span" style="color: red;"&gt;※この記事はrails3.0に対する記事です。rails3.1は&lt;a href="http://kennyj-jp.blogspot.com/2011/10/backbonejsrails3rails31.html"&gt;こちら&lt;/a&gt;をご覧下さい。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;何度も同じ事しているので貼っておきます。&lt;br /&gt;./gen.sh アプリ名&lt;br /&gt;で利用できます(ノーエラーハンドリング上等！)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;●2011/08/15追記&lt;/b&gt; rcov =&amp;gt; simplecovに変更し、ci_reporterを追加しました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;$ cat gen.sh&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1114101.js?file=gen.sh"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7761228027283941509?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7761228027283941509/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/backbonejsrails3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7761228027283941509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7761228027283941509'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/backbonejsrails3.html' title='backbone.jsをrails3で実行できるようにするシェルスクリプト'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-1502651744920291120</id><published>2011-07-28T22:03:00.006+09:00</published><updated>2011-07-31T12:36:21.604+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>railsでネストしたレイアウトを実現する</title><content type='html'>railsのviewはレイアウト機能があり、画面の共通化が可能です。&lt;br /&gt;&lt;br /&gt;・画面のイメージ・レイアウトを共通化する&lt;br /&gt;・メニューを表示する&lt;br /&gt;...etc&lt;br /&gt;&lt;br /&gt;非常に便利な機能ですが、「サイト全体で画面のイメージを共通化しつつ、XXX機能でも共通のレイアウトにする」事が簡単にはできないと思っていました(レイアウトの二重適用)。&lt;br /&gt;ところが&lt;a href="http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts"&gt;Ruby on Rails Guides&lt;/a&gt;に実現方法がのっていました。非常に簡単なのでご紹介しておきます。&lt;br /&gt;&lt;br /&gt;■application.html.erb (全体的な共通レイアウト)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;  &amp;lt;title&amp;gt;&amp;lt;%= @page_title or 'Page Title' %&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;%= stylesheet_link_tag 'layout' %&amp;gt;&lt;br /&gt;  &amp;lt;style type="text/css"&amp;gt;&amp;lt;%= &lt;span class="Apple-style-span" style="color: red;"&gt;yield :stylesheets&lt;/span&gt; %&amp;gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;  &amp;lt;div id="top_menu"&amp;gt;Top menu items here&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="menu"&amp;gt;Menu items here&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;div id="content"&amp;gt;&amp;lt;%= &lt;span class="Apple-style-span" style="color: red;"&gt;content_for?(:content) ? yield(:content) : yield&lt;/span&gt; %&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;上記のポイントは二つ。&lt;br /&gt;&lt;br /&gt;・yield :stylesheets&lt;br /&gt;=&amp;gt; 機能側で定義したstylesheetをheadタグ内にレンダリングする例です &lt;br /&gt;・content_for?(:content) ? yield(:content) : yield&lt;br /&gt;=&amp;gt; 機能側で:contentがある場合は引数にしてyield、無い場合通常のyield&lt;br /&gt;&lt;br /&gt;■news.html.erb(機能毎レイアウト)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;% &lt;span class="Apple-style-span" style="color: red;"&gt;content_for :stylesheets&lt;/span&gt; do %&amp;gt;&lt;br /&gt;  #top_menu {display: none}&lt;br /&gt;  #right_menu {float: right; background-color: yellow; color: black}&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&amp;lt;% &lt;span class="Apple-style-span" style="color: red;"&gt;content_for :content&lt;/span&gt; do %&amp;gt;&lt;br /&gt;  &amp;lt;div id="right_menu"&amp;gt;Right menu items here&amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;%= &lt;span class="Apple-style-span" style="color: red;"&gt;yield(:news_content) or yield&lt;/span&gt; %&amp;gt;&lt;br /&gt;&amp;lt;% end %&amp;gt;&lt;br /&gt;&amp;lt;%= &lt;span class="Apple-style-span" style="color: red;"&gt;render :file =&amp;gt; 'layouts/application'&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;/pre&gt;・content_for :stylesheets&lt;br /&gt;=&amp;gt;上記のstylesheetを準備します。同じようにjavascriptも定義可能です。&lt;br /&gt;・content_for :content /&amp;nbsp;yield(:news_content) or yield&lt;br /&gt;=&amp;gt; :contentを定義し、更に:news_contentがある場合は引数にしてyield、無い場合通常のyield&lt;br /&gt;・render :file =&amp;gt; 'layouts/application'&lt;br /&gt;=&amp;gt; 上記contentを準備して、全体レイアウトをレンダリング&lt;br /&gt;&lt;br /&gt;■xxx.html.erb(各画面)&lt;br /&gt;&lt;br /&gt;&amp;lt;h1&amp;gt;タイトル&amp;lt;/h1&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;各画面固有のレンダリング内容&lt;br /&gt;&lt;br /&gt;■xxx_controller.rb&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class XxxController &amp;lt; ApplicationController&lt;br /&gt;   &lt;span class="Apple-style-span" style="color: red;"&gt;layout "news"&lt;/span&gt;&lt;br /&gt;   def xxx&lt;br /&gt;   end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;layoutで機能毎共通レイアウトを指定&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;上記の様に設定すると&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;application.html.erb&lt;br /&gt;  news.html.erb&lt;br /&gt;    xxx.html.erb&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;とネストしたレンダリング可能です！&lt;br /&gt;&lt;br /&gt;■備考&lt;br /&gt;&lt;br /&gt;2011/07/21 22:06 なんてこったい！ Rails3レシピブックにのっているじゃないか(^_^;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-1502651744920291120?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/1502651744920291120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1502651744920291120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1502651744920291120'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/rails.html' title='railsでネストしたレイアウトを実現する'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2251827875427621181</id><published>2011-07-27T21:31:00.002+09:00</published><updated>2011-07-31T12:40:02.085+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='cobertura'/><title type='text'>coberturaが猛烈に遅い！...けど解決した</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;junitの網羅率測定する為に、coberturaを利用する事が多いと思います。&lt;br /&gt;&lt;br /&gt;# 当方久しぶりにjavaを触ったので最近のトレンドにはとんと疎くなりました。もっと良いのがあれば教えてください。&lt;br /&gt;&lt;br /&gt;しかしこれが猛烈に遅い！軽快に進めたいのですが、ネックになりそうなので調査しました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■解説&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;coberturaの実行はantから行っています。通常&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. コンパイル&lt;br /&gt;2. instrument (coberturaを埋め込む)&lt;br /&gt;3. junit実行&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;の順番で実行する事になりますが、 &lt;b&gt;3.&lt;/b&gt; が非常に遅いのです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3.&lt;/b&gt; の実行は&lt;br /&gt;&lt;pre&gt;&amp;lt;junit fork="yes" dir="${basedir}"&amp;gt;&lt;br /&gt;  &amp;lt;classpath location="${instrumented.dir}" /&amp;gt;&lt;br /&gt;  &amp;lt;classpath location="${classes.dir}" /&amp;gt;&lt;br /&gt;  &amp;lt;classpath refid="cobertura.classpath" /&amp;gt;&lt;br /&gt;  &amp;lt;formatter type="xml" /&amp;gt;&lt;br /&gt;  &amp;lt;test name="${testcase}" todir="${reports.xml.dir}" if="testcase" /&amp;gt;&lt;br /&gt;  &amp;lt;batchtest todir="${reports.xml.dir}" unless="testcase"&amp;gt;&lt;br /&gt;    &amp;lt;fileset dir="${src.dir}"&amp;gt;&lt;br /&gt;      &amp;lt;include name="**/*Test.java" /&amp;gt;&lt;br /&gt;    &amp;lt;/fileset&amp;gt;&lt;br /&gt;  &amp;lt;/batchtest&amp;gt;&lt;br /&gt;&amp;lt;/junit&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;の様な記載を行うと思いますが、上記だと遅くなってしまいます。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;何故なら、antがjunitを起動する際にプロセスのforkを行うのですが、forkはTestCase毎に行われるようです。&lt;/span&gt;&lt;br /&gt;複数回のforkを通して網羅率の測定を行う必要がある為、「cobertura.ser」というファイルを&lt;br /&gt;かいして測定を行います。&lt;br /&gt;&lt;br /&gt;ところがforkする毎にcobertura.serに、シリアライズ・デシリアライズを行うためのその&lt;br /&gt;オーバーヘッドが大きくなります。実際topコマンド確認するとCPUバウンドな処理である事が分かります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fXUTDXSCO-E/TjAE7Vv0SkI/AAAAAAAAAEQ/VG-X2Xg-fFs/s1600/multiple.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://4.bp.blogspot.com/-fXUTDXSCO-E/TjAE7Vv0SkI/AAAAAAAAAEQ/VG-X2Xg-fFs/s320/multiple.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;そこでant 1.6.2より導入された、forkmodeを設定します。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;junit fork="yes" &lt;span class="Apple-style-span" style="color: red;"&gt;forkmode="once"&lt;/span&gt; dir="${basedir}"&amp;gt;&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記の設定により、junitを実行するプロセスは"一度だけ"起動される為、シリアライズ・デシリアライズのオーバーヘッドが無くなり、非常に高速にテストの実行が可能です。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-6PRmV5_vgtg/TjAFAWJI4FI/AAAAAAAAAEY/FzaACWTi4-g/s1600/once.jpg" imageanchor="1"&gt;&lt;img border="0" height="132" src="http://4.bp.blogspot.com/-6PRmV5_vgtg/TjAFAWJI4FI/AAAAAAAAAEY/FzaACWTi4-g/s320/once.jpg" width="320" /&gt;&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/6648305517577816468-2251827875427621181?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2251827875427621181/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/cobertura.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2251827875427621181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2251827875427621181'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/cobertura.html' title='coberturaが猛烈に遅い！...けど解決した'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-fXUTDXSCO-E/TjAE7Vv0SkI/AAAAAAAAAEQ/VG-X2Xg-fFs/s72-c/multiple.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5400569403925440173</id><published>2011-07-21T01:53:00.001+09:00</published><updated>2011-07-21T01:56:55.522+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='beginner'/><title type='text'>(小ネタ)DBにはトランザクションがありますが</title><content type='html'>今回は超初心者向け&lt;br /&gt;&lt;br /&gt;webでシステムを構築していると、「データ登録をしてメール送信」とか「データ登録してファイル削除」等の処理が必要になる場合があります。そこで&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;transaction do&lt;br /&gt;  yyy処理      ①&lt;br /&gt;  delete_files ②&lt;br /&gt;  db登録処理   ③&lt;br /&gt;  commit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;とか&lt;br /&gt;&lt;br /&gt;transaction do&lt;br /&gt;  xxx処理    ①&lt;br /&gt;  sendmail   ②&lt;br /&gt;  db更新処理 ③&lt;br /&gt;  commit&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;の様な処理をすると問題大有りです。何故でしょう？&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;データベース処理は通常ロールバックが可能ですが、&lt;b&gt;「ファイルシステムへの変更」&lt;/b&gt;や、「&lt;b&gt;送信してしまったメール」&lt;/b&gt;は元に戻す事ができません。&lt;br /&gt;&lt;br /&gt;# ①②が正常に処理された後に、③で例外が発生した場合取り返しが付かない&lt;br /&gt;&lt;br /&gt;よって上記の巻き戻し不能処理をする場合は、できるだけ処理の一番最後にもってくるべきです。例えば:&lt;br /&gt;&lt;pre class="brush: ruby"&gt;transaction do&lt;br /&gt;  xxx処理&lt;br /&gt;  db更新処理&lt;br /&gt;  commit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;sendmail&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5400569403925440173?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5400569403925440173/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/db.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5400569403925440173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5400569403925440173'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/db.html' title='(小ネタ)DBにはトランザクションがありますが'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6245253071988296282</id><published>2011-07-21T01:24:00.000+09:00</published><updated>2011-07-21T01:24:16.963+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>(小ネタ)IEの512byte問題。圧縮転送したらさらに問題</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;通常HTTPリクエストに対して成功した場合は、HTTPレスポンスコード200で返答します。しかし「ページが見つからない場合」は通常404で返します。&lt;br /&gt;&lt;br /&gt;しかしカスタマイズした404.html等を準備し、レスポンスコード404で返しても、IEは下記のような残念な画面を表示される事があります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OY0zlyc4H_U/TicAx9cDtTI/AAAAAAAAAEI/EvN__NGt-io/s1600/404.jpg" imageanchor="1" style=""&gt;&lt;img border="0" height="220" width="320" src="http://4.bp.blogspot.com/-OY0zlyc4H_U/TicAx9cDtTI/AAAAAAAAAEI/EvN__NGt-io/s320/404.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;準備したhtmlを表示したいので何とかする必要があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■説明&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;IEには特別な仕様があり、「HTTPエラーメッセージを簡易表示する(デフォルトはオン)」というオプションの機能により「512byte」以下のContent-Lengthで返信した場合は文字通り「簡易表示」してしまいます。&lt;br /&gt;&lt;br /&gt;またこの仕様はたちの悪い事に「&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;圧縮転送後のサイズが512byte&lt;/span&gt;&lt;/b&gt;」になります。よってgzip転送を行うとそれなりのサイズで返信しても「簡易表示」される可能性があります。&lt;br /&gt;&lt;br /&gt;よって&lt;br /&gt;&lt;ul&gt;&lt;li&gt;無駄な内容を追加して圧縮後も512byteを超えるようにする&lt;/li&gt;&lt;li&gt;圧縮転送設定を上記の場合はオフにする&lt;/li&gt;&lt;/ul&gt;のような対処がいります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■参考&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://neta.ywcafe.net/000558.html"&gt;http://neta.ywcafe.net/000558.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6245253071988296282?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6245253071988296282/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/ie512byte.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6245253071988296282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6245253071988296282'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/ie512byte.html' title='(小ネタ)IEの512byte問題。圧縮転送したらさらに問題'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-OY0zlyc4H_U/TicAx9cDtTI/AAAAAAAAAEI/EvN__NGt-io/s72-c/404.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8380191666180073490</id><published>2011-07-12T13:01:00.001+09:00</published><updated>2011-07-12T23:21:27.364+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>(小ネタ)saとかsysとかdbaとかadministratorとかrootとか本番環境で使ってはダメ</title><content type='html'>分かっちゃいるけど表題の様なユーザ・ロールを、OS/DBレベルで利用しているケースをみます。&lt;br /&gt;上記のユーザを利用してしまうと&lt;br /&gt;&lt;br /&gt;・セキュリティ上潜在的に問題がある&lt;br /&gt;・権限上強力すぎて、通常ユーザに許可されていない行為に気づかない(例 ファイルの書き込み)&lt;br /&gt;・(oracleの)dbaを利用すると「exportされたdumpは、dbaロールを持った人でしかimportできない」という十字架を背負う&lt;br /&gt;・見る人が見たら、考察が甘い事がばれる =&amp;gt; 信用を失う&lt;br /&gt;...etc&lt;br /&gt;&lt;br /&gt;色々簡単にすましたいのは分かりますが、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;「正しく理解しないと後で後悔する」&lt;/span&gt;&lt;/b&gt;ので、一般ユーザ・ロールを利用してあるべき姿で設計しましょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8380191666180073490?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8380191666180073490/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/sasysdbaadministratorroot.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8380191666180073490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8380191666180073490'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/sasysdbaadministratorroot.html' title='(小ネタ)saとかsysとかdbaとかadministratorとかrootとか本番環境で使ってはダメ'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4679835591494317444</id><published>2011-07-12T01:23:00.011+09:00</published><updated>2011-07-12T12:39:24.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>(小ネタ)webアプリケーションからの時間取得について</title><content type='html'>webアプリケーションで、現在日時を取得する場面は多いと思います。&lt;br /&gt;&lt;br /&gt;その際注意しなければいけないのは、&lt;b&gt;「どこから時間を取得するか？」&lt;/b&gt;という事です。&lt;br /&gt;&lt;br /&gt;通常考えられる時間の取得場所は&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・DBサーバ(sql文からsysdate等の関数を利用して)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;・APサーバ(プログラム開発言語からOS時間を取得)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;になると思いますが、アプリケーション側からの一貫した時間取得方法を明確にしておく事は大きな意味があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;1. インフラレベルで時間が同期できていなかったら？という観点から時間を取得する場所は一定にするべき&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;無論ntpdで同期しておけば...という話がありますが、意外と合っていない場合があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;2. テストの観点から「日時を固定、もしくは作為的にある日に設定」をしなければいけない場合がある&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;業務上の特定日（例 締め日)に固定し、テストしたい事は良くあります。&lt;br /&gt;その場合も日時の取得方法を一貫性のある設計にしておけば、簡単に問題解決を図る（例 mock化）事ができます。&lt;br /&gt;&lt;br /&gt;上記を確実に実施する為に、下記のような事を考えておけば良いのではないでしょうか。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・どこでどのように時間を取得するかアーキテクチャ上明確にし規約化する&lt;/b&gt;&lt;br /&gt;&lt;b&gt;・規約に反した時間取得方法を行っているプログラムを抽出する為に、規約チェックツールを作成する&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;例) / SYSDATE/等でgrepする&lt;br /&gt;&lt;br /&gt;ではでは&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-4679835591494317444?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4679835591494317444/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/web.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4679835591494317444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4679835591494317444'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/web.html' title='(小ネタ)webアプリケーションからの時間取得について'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8599272797376236551</id><published>2011-07-06T02:43:00.003+09:00</published><updated>2011-07-06T02:57:18.459+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>rails on oracle (oracleで接続する手順) その２</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;rails on oracle でいくつかのテーマで検証してみます&lt;br /&gt;&lt;br /&gt;&lt;b&gt;●fetchループ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:ruby"&gt;module FetchTest&lt;br /&gt;  SQL = "select p1.* from posts p1 cross join posts p2"&lt;br /&gt;  def self.run&lt;br /&gt;    Post.delete_all&lt;br /&gt;    200.times do |i|&lt;br /&gt;      Post.create(:title =&amp;gt; "title_#{i}", :body =&amp;gt; "body_#{i}")&lt;br /&gt;    end&lt;br /&gt;    open("test.txt", "w") do |f|&lt;br /&gt;      # ① Post.find_by_sql(SQL).each { |r| f.write "#{r}\r\n" }&lt;br /&gt;      # ② Post.connection.raw_connection.exec(SQL) { |r| f.write "#{r}\r\n" }&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;FetchTest.run&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;上記の場合①は通常の検索処理。sqlの実行結果を全てメモリ上に展開します。&lt;br /&gt;②の場合、fetchループで繰り返し処理が発生する為、"同時に必要となるメモリ"は少なくてすみます。&lt;br /&gt;&lt;br /&gt;# それぞれ実行しながら、topコマンド等でメモリ利用状況を確認しましょう。&lt;br /&gt;&lt;br /&gt;よって大量のcsv出力する場合は必ず②のようにする必要があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;●DROP&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;railsで実装する場合、割と頻繁にDBスキーマの全削除、再作成をするかと思います（うちだけ？）。その際の機能は充実してきており、adapter内で多数のDROP文が実装されています。&lt;br /&gt;&lt;br /&gt;但し適宜 purge recyclebin してあげないとゴミがたまりそうです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;●indexの表領域&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;性能向上の為、データ/インデックスを別HDDに保存する場合、データ/インデックスで表領域を分ける必要があります。oracle_enhanced_adapterは成長しており、migrationで&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:ruby"&gt;add_index :posts, :title, :tablespace =&amp;gt; 'foo'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;のように指定できます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;●varchar2問題&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;oracleのvarchar2/char2は歴史的な経緯で、"バイト単位"での長さ指定になります。&lt;br /&gt;よってrailsからスキーマ作成する際は、string =&amp;gt; nvarchar2へのマッピングを以前はしていたのですが、最近のoracle enhanced adapterは進化しています！&lt;br /&gt;&lt;br /&gt;lib/active_record/connection_adapters/oracle_enhanced_adapter.rb によれば、&lt;span class="Apple-style-span" style="color: red;"&gt;nls_length_semantics&lt;/span&gt; というオプションがデフォルトで'CHAR'となっており、このオプションを指定する事によってvarchar2/char2を&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;文字数単位&lt;/span&gt;&lt;/b&gt;で長さ指定出来る様になります。&lt;br /&gt;&lt;br /&gt;よって何も考えなくても、mysql等と同じように指定できる様になりました。&lt;br /&gt;実際下記の用にスキーマが出来ています。&lt;br /&gt;&lt;pre&gt;SQL&gt; desc posts;&lt;br /&gt; 名前                     NULL?    型&lt;br /&gt; -------------------------- -------- ----------------------------&lt;br /&gt; ID                         NOT NULL NUMBER(38)&lt;br /&gt; TITLE                               VARCHAR2(255 CHAR) &lt;= CHARで255&lt;br /&gt; BODY                                CLOB&lt;br /&gt; CREATED_AT                          DATE&lt;br /&gt; UPDATED_AT                          DATE&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;●oracle enhanced adapter独自項目の設定&lt;/b&gt;oracle enhanced adapterには独自の設定項目があり...と思ったら&lt;a href="http://blog.rayapps.com/2010/09/09/oracle-enhanced-adapter-1-3-1-and-how-to-use-it-with-rails3/"&gt;良いページ&lt;/a&gt;がありました。一部ソースを読んだ結果下記の様です。&lt;pre class="brush:ruby"&gt;# config/initializers/oracle.rb 等に下記内容を設置&lt;br /&gt;ActiveSupport.on_load(:active_record) do&lt;br /&gt;  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do&lt;br /&gt;    # NUMBER(1)をbooleanにマッピングするか&lt;br /&gt;    self.emulate_booleans = true&lt;br /&gt;    # DATE型を(rubyの)Date型にマッピングするか&lt;br /&gt;    self.emulate_dates = false&lt;br /&gt;    # カラム名が(^|_)date(_|$)とマッチする場合Date型にマッピングするか&lt;br /&gt;    self.emulate_dates_by_column_name = false&lt;br /&gt;    # カラム名が(^|_)idとマッチする場合Integer型にマッピングするか&lt;br /&gt;    self.emulate_integers_by_column_name = true&lt;br /&gt;    # CHAR(1)かVARCHAR(1)、またはカラム名が_FLAG/_YNで終了する場合Booleanにマッピングするか&lt;br /&gt;    self.emulate_booleans_from_strings = true&lt;br /&gt;    # シーケンサー作成する際のオプションを指定する&lt;br /&gt;    self.default_sequence_start_value = "1 NOCACHE INCREMENT BY 1"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;●雑感&lt;/b&gt;&lt;br /&gt;ソース見て思ったのですが、oracle enhanced adapter マジで進化してます！&lt;br /&gt;かなりきっちりしてる感じです(識別子30文字制限問題、in句の1000上限問題 ...etc)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8599272797376236551?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8599272797376236551/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/rails-on-oracle-oracle.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8599272797376236551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8599272797376236551'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/rails-on-oracle-oracle.html' title='rails on oracle (oracleで接続する手順) その２'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6986231358194169672</id><published>2011-07-02T01:55:00.002+09:00</published><updated>2011-08-15T23:35:02.783+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>履歴管理システムの無視ファイル</title><content type='html'>cvs/subversion/git等、色々な履歴管理システムがありますが、いずれも "履歴管理しないファイル" を適切に指定する事が大切です。&lt;br /&gt;&lt;br /&gt;# *.classを無視していない為、すごい事になっているチーム結構みた事あります &amp;nbsp;(;´д｀)ﾄﾎﾎ…&lt;br /&gt;&lt;br /&gt;いつも調べてる様な気がしたので、これを気にまとめようかなと調べたら&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;かなり良いの発見しました！&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/github/gitignore"&gt;github/gitignore&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;githubのチームが作成しています。色々な言語・フレームワークのgitignoreファイルサンプルがたくさんあります。ちなみに&lt;a href="https://github.com/github/gitignore/blob/master/Rails.gitignore"&gt;Rails.gitignore&lt;/a&gt;は&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;*.rbc&lt;br /&gt;*.sassc&lt;br /&gt;.sass-cache&lt;br /&gt;capybara-*.html&lt;br /&gt;.rspec&lt;br /&gt;/.bundle&lt;br /&gt;/vendor/bundle&lt;br /&gt;/log/*&lt;br /&gt;/tmp/*&lt;br /&gt;/db/*.sqlite3&lt;br /&gt;/public/system/*&lt;br /&gt;/coverage/&lt;br /&gt;/spec/tmp/*&lt;br /&gt;**.orig&lt;br /&gt;config/*.yml&lt;br /&gt;rerun.txt&lt;br /&gt;pickle-email-*.html&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;のようですね。確かに一通りそろってる感じ！&lt;br /&gt;&lt;br /&gt;■追記&lt;br /&gt;&lt;br /&gt;2011/08/04 下記もいるような気がする&lt;br /&gt;/spec/reports/&lt;br /&gt;&lt;br /&gt;後上記の設定ならdatabase.ymlも消えるので、database.yml.example =&amp;gt; database.ymlへのコピーが手順的に入りますね！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6986231358194169672?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6986231358194169672/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6986231358194169672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6986231358194169672'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/07/blog-post.html' title='履歴管理システムの無視ファイル'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2005512134834411339</id><published>2011-06-28T02:41:00.007+09:00</published><updated>2011-06-30T02:28:27.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>rails on oracle (oracleで接続する手順) その１</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;railsをoracleで接続したい人はあまり多くないと聞いた &amp; 最近の情報があまり見当たらないので、ニッチな人向けに纏めておこうと思います。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■Oracle XEのインストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;まずはサーバ側。既に何らかのOracleが存在する場合はここはパスして下さい。&lt;br /&gt;&lt;br /&gt;・http://www.oracle.com/technetwork/database/express-edition/downloads/102xelinsoft-102048.html&lt;br /&gt;ここからoracle-xe-univ-10.2.0.1-1.0.i386.rpm をダウンロード&lt;br /&gt;&lt;br /&gt;※アカウントが必要なので先に登録して下さい。&lt;br /&gt;※今日(2011/06/28)調べたらOracle XE 11.2 betaなる文字が！!&lt;br /&gt;&lt;br /&gt;・↑をインストール&lt;br /&gt;&lt;br /&gt;$ sudo rpm -ivh oracle-xe-univ-10.2.0.1-1.0.i386.rpm&lt;br /&gt;$ sudo /etc/init.d/oracle-xe configure&lt;br /&gt;&lt;br /&gt;↓管理アプリのポートを聞かれてます。他とバッティングする場合は変えましょう(例 9080)。&lt;br /&gt;Specify the HTTP port that will be used for Oracle Application Express [8080]: &lt;br /&gt;&lt;br /&gt;↓Oracleの待ち受けポートです。通常はdefaultのままで良いでしょう。&lt;br /&gt;Specify a port that will be used for the database listener [1521]:&lt;br /&gt;&lt;br /&gt;↓SYSとSYSTEMのパスワードをきかれてるので適当な物にしましょう。&lt;br /&gt;Specify a password to be used for database accounts.  Note that the same&lt;br /&gt;password will be used for SYS and SYSTEM.  Oracle recommends the use of&lt;br /&gt;different passwords for each database account.  This can be done after&lt;br /&gt;initial configuration:&lt;br /&gt;&lt;br /&gt;↓OS起動時に起動するかと言われてるので、通常稼動環境ではyです。&lt;br /&gt;Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:&lt;br /&gt;&lt;br /&gt;・確認&lt;br /&gt;&lt;br /&gt;$ sudo /etc/init.d/oracle-xe status&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■Oracle Instance Clientのインストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;続いては接続側。できるだけ接続側は綺麗にしておきたいので、Oracle Instance Clientから接続しようと思います。&lt;br /&gt;&lt;br /&gt;・http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html より対応するバージョンをダウンロード&lt;br /&gt;oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;をダウンロードしてみました。&lt;br /&gt;&lt;br /&gt;・↑をインストール&lt;br /&gt;&lt;br /&gt;$ sudo rpm -ivh oracle-instantclient11.2-basic-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;$ sudo rpm -ivh oracle-instantclient11.2-devel-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;$ sudo rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.1.0-1.x86_64.rpm&lt;br /&gt;&lt;br /&gt;・環境変数に下記を設定&lt;br /&gt;&lt;br /&gt;$ vim ~/.bash_profile&lt;br /&gt;export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/:$LD_LIBRARY_PATH&lt;br /&gt;export NLS_LANG=JAPANESE_JAPAN.AL32UTF8&lt;br /&gt;export PATH=/usr/lib/oracle/11.2/client64/bin/:$PATH&lt;br /&gt;&lt;br /&gt;$ source ~/.bash_profile&lt;br /&gt;&lt;br /&gt;・接続確認&lt;br /&gt;&lt;br /&gt;$ sqlplus system/パスワード@サーバのIP:1521/XE&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■railsから接続&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;・ruby-oci8のインストール&lt;br /&gt;&lt;br /&gt;$ gem install ruby-oci8 -v2.0.6&lt;br /&gt;(Oracle Instance Clientの場合は、LD_LIBRARY_PATHを設定しておけばコンパイルに支障が無いようです)&lt;br /&gt;&lt;br /&gt;・rails試しに作成&lt;br /&gt;&lt;br /&gt;$ rails new oracle_test -d oracle&lt;br /&gt;$ cd oracle_test&lt;br /&gt;$ vim Gemfile&lt;br /&gt;ruby-oci8の辺りを↓のように記載&lt;br /&gt;gem 'ruby-oci8', '~&gt; 2.0.6'&lt;br /&gt;# gem 'activerecord-oracle_enhanced-adapter', '~&gt; 1.3.2'&lt;br /&gt;gem 'activerecord-oracle_enhanced-adapter', '~&gt; 1.3.2', :git =&gt; 'git://github.com/rsim/oracle-enhanced.git' (1.3.2以降にユーザー作成機能が追加されていますので以後はそれで実行しています)&lt;br /&gt;&lt;br /&gt;$ bundle install&lt;br /&gt;$ vim config/database.yml&lt;br /&gt;development:&lt;br /&gt;  adapter: oracle_enhanced&lt;br /&gt;  database: //サーバのIP:1521/XE&lt;br /&gt;  username: kennyj_development&lt;br /&gt;  password: xxxxx&lt;br /&gt;&lt;br /&gt;test:&lt;br /&gt;  adapter: oracle_enhanced&lt;br /&gt;  database: //サーバのIP:1521/XE&lt;br /&gt;  username: kennyj_test&lt;br /&gt;  password: xxxxx&lt;br /&gt;&lt;br /&gt;production:&lt;br /&gt;  adapter: oracle_enhanced&lt;br /&gt;  database: //サーバのIP:1521/XE&lt;br /&gt;  username: kennyj_production&lt;br /&gt;  password: xxxxx&lt;br /&gt;&lt;br /&gt;$ rake db:create:all (userまで作ってくれます！)&lt;br /&gt;Please provide the SYSTEM password for your oracle installation&lt;br /&gt;&gt;xxxxx (development)&lt;br /&gt;Please provide the SYSTEM password for your oracle installation&lt;br /&gt;&gt;xxxxx (test)&lt;br /&gt;Please provide the SYSTEM password for your oracle installation&lt;br /&gt;&gt;xxxxx (production)&lt;br /&gt;&lt;br /&gt;$ rails g scaffold Post title:string body:text (いつもの奴生成)&lt;br /&gt;$ rake db:migrate&lt;br /&gt;==  CreatePosts: migrating ====================================================&lt;br /&gt;-- create_table(:posts)&lt;br /&gt;-&gt; 0.0349s&lt;br /&gt;==  CreatePosts: migrated (0.0350s) ===========================================&lt;br /&gt;&lt;br /&gt;$ rake test (test実行)&lt;br /&gt;&lt;br /&gt;$ rails s&lt;br /&gt;(ブラウザで確認)&lt;br /&gt;http://localhost:3000/posts&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■さらに使いやすく...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;次回はもう少し濃い話題(fetchループ, nvarchar, 表領域, oracle_enhanced特有の初期設定...etc)を書ければと思います。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■雑感&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;oracle_enhanced異様に進化している気がする...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-2005512134834411339?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2005512134834411339/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/rails-on-oracle-oracle.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2005512134834411339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2005512134834411339'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/rails-on-oracle-oracle.html' title='rails on oracle (oracleで接続する手順) その１'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2443906723926258488</id><published>2011-06-22T02:22:00.001+09:00</published><updated>2011-08-01T00:09:30.784+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>(小ネタ)本番のみロードバランサーがある場合の注意点</title><content type='html'>方式設計小話。&lt;br /&gt;&lt;br /&gt;webシステムを開発し、本番運用に至る過程で、下記のうち最低２つの環境があるのではと思います（所属している組織によって呼び方は色々変わるかと思いますが)。&lt;br /&gt;&lt;br /&gt;・個人開発環境&lt;br /&gt;・結合環境&lt;br /&gt;・ステージング環境&lt;br /&gt;・本番環境&lt;br /&gt;&lt;br /&gt;上記の様に複数の環境があるにも関わらず、予算の都合上、「&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;本番のみ&lt;/span&gt;&lt;/b&gt;複数台の冗長化構成。フロントにロードバランサー」という構成が多いのではと思います。そして&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;この事実の与えるインパクトを過小評価してしまいトラブルが起こる場合があります&lt;/b&gt;&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;ロードバランサー＆冗長化というキーワードを聞いた場合は、下記を必ず早期に確認しなければいけません。&lt;br /&gt;&lt;br /&gt;No.1 セッション情報の引継ぎ。ロードバランサー担当者にお願いする事項は無いか&lt;br /&gt;No.2 SSL通信の解除はどこが行うか？&lt;br /&gt;No.3 どうやってhttp/httpsを見分けるか？&lt;br /&gt;No.4&amp;nbsp;サーバ名は正しく返せるか？&lt;br /&gt;No.5 ファイルの置き場所&lt;br /&gt;&lt;br /&gt;順次説明していきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○No.1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ruby on railsの様に、クライアント側に実質状態維持の責務を移している場合は全く問題がありません。&lt;br /&gt;しかしJ2EEでのHttpSessionでは大問題になります。HttpSessionは、各々のサーバのメモリー上に保持される為、２台以上サーバをたてる場合はこのメモリーの共有化がネックになります。&lt;br /&gt;セッションのレプリケーションや永続化による回避方法もありますが、性能上大きな問題になる可能性もあります（機械的なセッションのシリアライズ、デシリアライズは意外にコストがかかる為）。&lt;br /&gt;よってロードバランサーの設定で、「jsessionid」等のcookie内でのキーを利用し、片系に固定してしまうという手が良く使われます。&lt;br /&gt;&lt;br /&gt;# 但しこれでは "本当の意味で"冗長化&amp;amp;高可用性にはならないですよね。&lt;br /&gt;&lt;br /&gt;いずれにしろ、この課題に対してどう取り組むかは早期に決定されるべきです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○No.2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ロードバランサーにも二種類有り&lt;br /&gt;・SSL通信を自力で複合化するタイプ&lt;br /&gt;・SSL通信は素通りさせるタイプ&lt;br /&gt;があります。&lt;br /&gt;&lt;br /&gt;SSL通信を複合化する責務はどこにあるのか（ロードバランサー or webサーバ)は早期に明確にする必要があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○No.3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;webアプリケーションには、http通信でよい部分と、https通信でなければいけない部分があります。もしNo.2のロードバランサーにてSSL(https)通信が複合化される場合、webサーバ自身は、httpなのかhttpsなのか分からなくなる場合があります。&lt;br /&gt;&lt;br /&gt;この問題がクリティカルになる可能性も大きい為、「どうやって見分けるのか？」（例 httpヘッダーに特定のキーが含まれる）を早期に確認しておくべきです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○No.4&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;絶対パスとしてurlを生成する際、ホスト名が必要になります。その場合サーバ自身のサーバ名を利用して生成されると、冗長化構成の各サーバでバラバラになってしまう恐れがあります。&lt;br /&gt;&lt;br /&gt;絶対パス生成の仕組みは早期に確認しておくべきです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○No.5&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;各サーバからファイルシステムとして共用されるべき物が、どのような方式(例 NFSマウント)で実現されているかを確認する必要があります。&lt;br /&gt;&lt;br /&gt;# これは意識している人が多いですが。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;小ネタの割にはずいぶん長くなってしまいました。。&lt;br /&gt;ある意味常識的な話題ですが、割とあいまいにしている人が多いので戒めの意味も込め記載させて頂きました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-2443906723926258488?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2443906723926258488/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/blog-post_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2443906723926258488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2443906723926258488'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/blog-post_22.html' title='(小ネタ)本番のみロードバランサーがある場合の注意点'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4976997514052869404</id><published>2011-06-22T01:16:00.001+09:00</published><updated>2011-06-22T01:17:45.773+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>(小ネタ)何故例外メールのアドレスや件名をDBに持ってはいけないのか？</title><content type='html'>設計小話。&lt;br /&gt;&lt;br /&gt;webシステムを設計する際、メール送信の仕組みをデータベース化し、文面のテンプレート化、From/To/Cc/Bccの管理を行うようなケースは多いと思います。より抽象化したメッセージング機構とかがあっても良いかもしれません。&lt;br /&gt;画面でGUIを設けてあげると、顧客自身でメンテナンスする事ができる為大変喜ばれるでしょう。&lt;br /&gt;&lt;br /&gt;しかし&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;例外メール&lt;/span&gt;&lt;/b&gt;（a.k.a. 障害報告メール。railsでいうExceptionNotifier）&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;の送信先とかを、データベースに持たせる事は絶対にしてはいけません。&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;何故でしょう？&lt;br /&gt;(分からない方は1分程度考えてみてください)&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;..&lt;br /&gt;...&lt;br /&gt;....&lt;br /&gt;..... 終了！&lt;br /&gt;&lt;br /&gt;例外メールが送信されるべき場合は&lt;br /&gt;・プログラムバグに起因する想定外の動きをした場合&lt;br /&gt;・ネットワーク、DBのトラブルに起因する設計時点より備えなければいけない場合&lt;br /&gt;前者は特に問題になりませんが、後者が重要です。&lt;br /&gt;&lt;br /&gt;DB障害が発生した&lt;br /&gt;↓&lt;br /&gt;例外メールを出さなければいけない&lt;br /&gt;↓&lt;br /&gt;送信先を取得する為に、DBを参照しなければいけない&lt;br /&gt;↓&lt;br /&gt;接続できない！&lt;br /&gt;↓&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;b&gt;送信できない！！！&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;# エンジニアはこういう小学生でも分かりそうなミスを時折犯してしまう場合があります。&lt;br /&gt;&lt;br /&gt;環境に応じて、事前に顧客と合意したアドレスにシンプルに送信するのが吉だと思います。&lt;br /&gt;場合によっては記載内容を吟味しないとセキュリティ的にまずい場合があるので気をつけて下さい。&lt;br /&gt;&lt;br /&gt;# 当たり前な事ですが割りと質問が多いので記事にしておきます。&lt;br /&gt;# ログを見張る別の系を用意できる場合は今回のケース外という事で(汗)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-4976997514052869404?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4976997514052869404/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/db.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4976997514052869404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4976997514052869404'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/db.html' title='(小ネタ)何故例外メールのアドレスや件名をDBに持ってはいけないのか？'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5119613911379610708</id><published>2011-06-21T01:43:00.000+09:00</published><updated>2011-06-21T01:43:09.900+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='solr'/><category scheme='http://www.blogger.com/atom/ns#' term='javabin'/><title type='text'>俺gem java_binをバージョンアップした</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;■概要&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;拙作gem、java_bin を約１年ぶりに更新しました！&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-L35JjNHkTRM/Tf9wVNiBE_I/AAAAAAAAADc/kuuybE_OOfY/s1600/java_bin_0_4_0.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://3.bp.blogspot.com/-L35JjNHkTRM/Tf9wVNiBE_I/AAAAAAAAADc/kuuybE_OOfY/s320/java_bin_0_4_0.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ダウンロードは&amp;nbsp;&lt;a href="http://rubygems.org/gems/java_bin"&gt;http://rubygems.org/gems/java_bin&lt;/a&gt;&amp;nbsp;からどうぞ！&lt;br /&gt;...て何者か良く分からないので少し説明します。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■java_binとは&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;全文検索サーバの有名なプロダクトの一つに、&lt;a href="http://lucene.apache.org/solr/"&gt;Apache Solr&lt;/a&gt;&amp;nbsp;があります。内部ではLuceneライブラリ(ツイッター内部でも利用されている)を利用しており、一説では white house のサイトでも利用されているようです。&lt;br /&gt;&lt;br /&gt;アプリケーション側からSolrへの通信は、httpプロトコルで行いますが、その際のレスポンスフォーマットを、複数の中から選択する事ができます（wtパラメータ）。&lt;br /&gt;&lt;br /&gt;通常rubyから利用する場合は、wt=ruby もしくは wt=jsonを利用する事になりますが、wt=javabin を利用する事により、バイナリフォーマットを指定する事ができます。しかしrubyでは解釈する事が出来ない為、C言語拡張を利用しparserを作成しました。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-e2YOVWrL2CA/Tf94FfGixDI/AAAAAAAAADg/BrlRW2hZ1HQ/s1600/java_bin_diagram.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="103" src="http://2.bp.blogspot.com/-e2YOVWrL2CA/Tf94FfGixDI/AAAAAAAAADg/BrlRW2hZ1HQ/s320/java_bin_diagram.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;バイナリフォーマットを利用する事により、下記の点が期待できます。&lt;br /&gt;&lt;br /&gt;・parseコストの削減&lt;br /&gt;&lt;div&gt;・通信量の削減&lt;/div&gt;&lt;div&gt;・型に応じたインスタンス化&lt;/div&gt;&lt;br /&gt;実際parseコストに関しては、3～6倍程度の高速化が実現できています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■今回何が新しくなったのか&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;0.4.0では下記の点で新しくなっています。&lt;br /&gt;&lt;br /&gt;・solr 3.1以降のjavabin format2に対応&lt;br /&gt;・RailsInstallerでのコンパイルサポート&lt;br /&gt;&lt;br /&gt;0.3.5を一年近くプロダクションで利用してきましたが、無問題でした！&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red; font-size: large;"&gt;&lt;b&gt;rubyからsolrを利用する際に、高速化したい！&lt;/b&gt;&lt;/span&gt;というニッチなお悩みをお持ちの方は是非 ^o^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5119613911379610708?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5119613911379610708/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/gem-javabin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5119613911379610708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5119613911379610708'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/gem-javabin.html' title='俺gem java_binをバージョンアップした'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-L35JjNHkTRM/Tf9wVNiBE_I/AAAAAAAAADc/kuuybE_OOfY/s72-c/java_bin_0_4_0.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7758255513204006300</id><published>2011-06-16T02:12:00.003+09:00</published><updated>2011-06-16T02:27:28.053+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>gemやmavenで気をつけるべき事</title><content type='html'>gem(ruby)や、maven(java)を利用し始めると、&lt;br /&gt;&lt;br /&gt;「何て便利なんだ！」&lt;br /&gt;&lt;br /&gt;と感じると思います。実際非常に便利です。&lt;br /&gt;&lt;br /&gt;しかし何年にも渡って運用するようなシステムの場合、「ハード故障に伴うリプレース」や「インフラ移行」が発生する場合があります。&lt;br /&gt;その際に絶対忘れてはいけないのは、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;「ライブラリ提供側が、いつまでも場所を提供してくれると考えてはいけない」&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;という事です。&lt;br /&gt;&lt;br /&gt;実際gemで起こった事があるのは、&lt;br /&gt;&lt;br /&gt;・githubが提供場所では無くなった(gemcutterへ移行?)&lt;br /&gt;・gems.rubyonrails.orgが提供場所では無くなった(gemcutterへ移行?)&lt;br /&gt;・sqlserverのアダプターの特定のバージョン(&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;1.0.0.9250&lt;/span&gt;)が取得できなくなった。&lt;br /&gt;&amp;nbsp; 現在は&amp;nbsp;&lt;a href="http://rubygems.org/gems/activerecord-sqlserver-adapter/"&gt;http://rubygems.org/gems/activerecord-sqlserver-adapter/&lt;/a&gt;&amp;nbsp;ですが欲しいバージョンがありません。&lt;br /&gt;&lt;br /&gt;と、かなり慌ててしまう状況です。&lt;br /&gt;&lt;br /&gt;# さらに性質が悪いのがmaven。&lt;br /&gt;# 私が出くわしたのは「リポジトリはあるがライブラリの該当バージョンが提供されなく無くなった」状況。&lt;br /&gt;# なんと「*.jarの中身をテキストエディタで見ると、503のHTML」。&lt;br /&gt;# しかもエラーを出力しないという難しい状況になります（どのファイルが無くなったのか分からない）&lt;br /&gt;&lt;br /&gt;よってgemの場合&lt;span class="Apple-style-span" style="color: red;"&gt;「&lt;b&gt;cacheディレクトリ以下のgemファイルはちゃんととっておきましょう！」&lt;/b&gt;&lt;/span&gt;というのが教訓になります。もちろんアプリ側では&lt;span class="Apple-style-span" style="color: red;"&gt;「&lt;b&gt;versionを絶対指定しておく」&lt;/b&gt;&lt;/span&gt;というのも大事ですね。&lt;br /&gt;&lt;br /&gt;もちろんrailsの場合、vendor配下にコミットしたら良いのでは？という意見もあるかもしれませんが、&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;度々デプロイする場合、純粋にサイズが大きすぎて遅い&lt;/span&gt;&lt;/b&gt;場合があります。&lt;br /&gt;コンテキストに合わせて最良の方法を考えましょう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7758255513204006300?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7758255513204006300/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/gemmaven.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7758255513204006300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7758255513204006300'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/gemmaven.html' title='gemやmavenで気をつけるべき事'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4228420355157106360</id><published>2011-06-16T01:18:00.026+09:00</published><updated>2011-11-27T17:48:42.982+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='sass'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><category scheme='http://www.blogger.com/atom/ns#' term='sakura vps'/><title type='text'>rails自体の開発環境を作る４（完結）</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;さくらvpsを再インストールし下記を目標に再構築した際の記録を残しておきます。&lt;br /&gt;&lt;br /&gt;・サーバとして一般的に行う設定がなされている事&lt;br /&gt;・最低限のサーバセキュリティを維持している事&lt;br /&gt;・rails自体の開発出来る事&lt;br /&gt;・node.js、coffeescriptが動く事&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■パッケージ管理・導入(centos5.5 x86_64版 さくらvps)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;●パッケージ最新化&lt;br /&gt;# yum -y update&lt;br /&gt;&lt;br /&gt;●当面必要そうなパッケージをインストール&lt;br /&gt;# yum -y install vim-enhanced nmap curl&lt;br /&gt;&lt;br /&gt;●webサーバ/DB系をインストール&lt;br /&gt;# yum -y install httpd httpd-devel&lt;br /&gt;# yum -y install sqlite sqlite-devel&lt;br /&gt;# yum -y install mysql mysql-server mysql-devel&lt;br /&gt;# yum -y install postgresql84 postgresql84-contrib postgresql84-devel postgresql84-libs postgresql84-server&lt;br /&gt;&lt;br /&gt;●rpmforgeの設定を行う&lt;br /&gt;# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm&lt;br /&gt;# rpm -i rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm&lt;br /&gt;# rm rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm&lt;br /&gt;# vim /etc/yum.repos.d/rpmforge.repo&lt;br /&gt;(8行目)&lt;br /&gt;enabled = 1 から enabled = 0 に変更(デフォルトで動かないようにする)&lt;br /&gt;&lt;br /&gt;●gitインストール&lt;br /&gt;# yum -y install git --enablerepo=rpmforge&lt;br /&gt;&lt;br /&gt;●memcachedインストール&lt;br /&gt;# yum -y install libevent libevent-devel&lt;br /&gt;(素直に依存パッケージが解決しないので手動でインストールする)&lt;br /&gt;# wget http://packages.sw.be/perl-Net-SSLeay/perl-Net-SSLeay-1.36-1.el5.rfx.x86_64.rpm&lt;br /&gt;# wget http://packages.sw.be/perl-Net-SSLeay/perl-Net-SSLeay-1.36-1.el5.rfx.i386.rpm&lt;br /&gt;# wget http://packages.sw.be/perl-IO-Socket-SSL/perl-IO-Socket-SSL-1.34-1.el5.rfx.noarch.rpm&lt;br /&gt;# rpm -Uvh perl-Net-SSLeay-1.36-1.el5.rfx.x86_64.rpm&lt;br /&gt;# rpm -Uvh perl-Net-SSLeay-1.36-1.el5.rfx.i386.rpm&lt;br /&gt;# rpm -Uvh perl-IO-Socket-SSL-1.34-1.el5.rfx.noarch.rpm&lt;br /&gt;# rm *.rpm&lt;br /&gt;# yum -y install memcached memcached-devel --enablerepo=rpmforge&lt;br /&gt;&lt;br /&gt;参考 http://nakoruru.jp/?p=439&lt;br /&gt;&lt;br /&gt;●その他開発用パッケージのインストール&lt;br /&gt;# yum -y install openssl-devel curl-devel readline-devel zlib-devel&lt;br /&gt;# yum -y install java&lt;br /&gt;# yum -y install libxml2 libxml2-devel libxslt-devel&lt;br /&gt;# yum -y install libyaml-devel libffi-devel --enablerepo=rpmforge&lt;br /&gt;&lt;br /&gt;●sqlite3が古いので自分でインストール&lt;br /&gt;# wget http://www.sqlite.org/sqlite-autoconf-3070603.tar.gz&lt;br /&gt;# tar zxvf sqlite-autoconf-3070603.tar.gz&lt;br /&gt;# cd sqlite-autoconf-3070603&lt;br /&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;br /&gt;※yumでインストールした物と競合しているはず。&lt;br /&gt;ただyumでの依存関係があるので、あえて競合してインストールしてみた。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■設定&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;●日本語化&lt;br /&gt;# vim /etc/sysconfig/i18n&lt;br /&gt;(1行目)&lt;br /&gt;LANG="C" から LANG="ja_JP.UTF-8" に変更&lt;br /&gt;&lt;br /&gt;●不要デーモンの停止設定&lt;br /&gt;# chkconfig auditd off&lt;br /&gt;# chkconfig autofs off&lt;br /&gt;# chkconfig avahi-daemon off&lt;br /&gt;# chkconfig bluetooth off&lt;br /&gt;# chkconfig cups off&lt;br /&gt;# chkconfig firstboot off&lt;br /&gt;# chkconfig gpm off&lt;br /&gt;# chkconfig haldaemon off&lt;br /&gt;# chkconfig hidd off&lt;br /&gt;# chkconfig kudzu off&lt;br /&gt;# chkconfig lvm2-monitor off&lt;br /&gt;# chkconfig mcstrans off&lt;br /&gt;# chkconfig mdmonitor off&lt;br /&gt;# chkconfig messagebus off&lt;br /&gt;# chkconfig netfs off&lt;br /&gt;# chkconfig nfslock off&lt;br /&gt;# chkconfig pcscd off&lt;br /&gt;# chkconfig portmap off&lt;br /&gt;# chkconfig rawdevices off&lt;br /&gt;# chkconfig restorecond off&lt;br /&gt;# chkconfig rpcgssd off&lt;br /&gt;# chkconfig rpcidmapd off&lt;br /&gt;# chkconfig smartd off&lt;br /&gt;# chkconfig xfs off&lt;br /&gt;# chkconfig yum-updatesd off&lt;br /&gt;&lt;br /&gt;参考 http://tanaka.sakura.ad.jp/archives/001065.html&lt;br /&gt;&lt;br /&gt;●firewall設定&lt;br /&gt;# system-config-securitylevel-tui&lt;br /&gt;(firewallをenabledにし、22/80/443/3000/10022(後述)/8080(後述)を開けた)&lt;br /&gt;&lt;br /&gt;●作業用ユーザ作成&lt;br /&gt;# useradd kennyj&lt;br /&gt;# passwd kennyj&lt;br /&gt;&lt;br /&gt;●sudo設定&lt;br /&gt;# /usr/sbin/visudo&lt;br /&gt;(一番下に追記)&lt;br /&gt;kennyj &amp;nbsp;ALL=(ALL) &amp;nbsp; &amp;nbsp; &amp;nbsp; ALL&lt;br /&gt;&lt;br /&gt;●ssh設定&lt;br /&gt;# vim /etc/ssh/sshd_config&lt;br /&gt;(13行目)&lt;br /&gt;#Port 22 =&amp;gt; Port 10022 (22番は非常に攻撃されやすいので)&lt;br /&gt;(39行目)&lt;br /&gt;#PermitRootLogin yes =&amp;gt; PermitRootLogin no&lt;br /&gt;(59行目)&lt;br /&gt;#PermitEmptyPasswords no =&amp;gt; PermitEmptyPasswords no&lt;br /&gt;&lt;br /&gt;# /etc/init.d/sshd restart&lt;br /&gt;&lt;br /&gt;●firewall再設定&lt;br /&gt;# vim /etc/sysconfig/iptables&lt;br /&gt;(22番ポートを閉じる)&lt;br /&gt;&lt;br /&gt;●時間同期設定(ntp)&lt;br /&gt;(さくらVPSでは最初から設定されていました)&lt;br /&gt;# yum -y install ntp&lt;br /&gt;# vim /etc/ntp.conf&lt;br /&gt;# ntpdate ntp.nict.jp (とりあえず一旦近づけておく)&lt;br /&gt;# /etc/init.d/ntpd start&lt;br /&gt;# chkconfig ntpd on&lt;br /&gt;&lt;br /&gt;参考 http://centossrv.com/ntp.shtml&lt;br /&gt;&lt;br /&gt;●postgresql準備&lt;br /&gt;# service postgresql initdb&lt;br /&gt;&lt;br /&gt;●mysql準備&lt;br /&gt;# vim /etc/my.cnf&lt;br /&gt;(文字列エンコーディングをUTF-8に設定)&lt;br /&gt;[mysqld]&lt;br /&gt;datadir=/var/lib/mysql&lt;br /&gt;socket=/var/lib/mysql/mysql.sock&lt;br /&gt;user=mysql&lt;br /&gt;old_passwords=1&lt;br /&gt;default-character-set = utf8&lt;br /&gt;&lt;br /&gt;[mysqld_safe]&lt;br /&gt;log-error=/var/log/mysqld.log&lt;br /&gt;pid-file=/var/run/mysqld/mysqld.pid&lt;br /&gt;default-character-set = utf8&lt;br /&gt;&lt;br /&gt;[mysql]&lt;br /&gt;default-character-set = utf8&lt;br /&gt;&lt;br /&gt;●必要に応じてサービス起動設定&lt;br /&gt;# chkconfig httpd on&lt;br /&gt;# chkconfig mysqld on&lt;br /&gt;# chkconfig postgresql on&lt;br /&gt;# chkconfig memcached on&lt;br /&gt;&lt;br /&gt;●一旦再起動&lt;br /&gt;# reboot&lt;br /&gt;&lt;br /&gt;※これ以降はkennyjユーザで作業しています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■javascript関係&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;●node.js/npm/coffeeスクリプトのインストール&lt;br /&gt;$ wget http://nodejs.org/dist/node-v0.4.8.tar.gz&lt;br /&gt;$ tar zxvf node-v0.4.8.tar.gz&lt;br /&gt;$ cd node-v0.4.8&lt;br /&gt;$ ./configure&lt;br /&gt;$ make&lt;br /&gt;$ sudo make install&lt;br /&gt;$ cd ..&lt;br /&gt;$ curl http://npmjs.org/install.sh &amp;gt; npm.sh&lt;br /&gt;$ chmod a+x npm.sh&lt;br /&gt;$ sudo PATH=/usr/local/bin:$PATH ./npm.sh&lt;br /&gt;$ sudo PATH=/usr/local/bin:$PATH npm install -g coffee-script&lt;br /&gt;$ rm npm.sh&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■ruby関係&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;●rvmのインストール&lt;br /&gt;$ bash &amp;lt; &amp;lt;(curl -s https://rvm.beginrescueend.com/install/rvm)&lt;br /&gt;$ source ~/.bash_profile&lt;br /&gt;$ rvm pkg install iconv&lt;br /&gt;$ rvm install 1.9.2 --with-iconv-dir=$rvm_path/usr&lt;br /&gt;$ rvm install ree &amp;nbsp; --with-iconv-dir=$rvm_path/usr&lt;br /&gt;$ rvm install 1.8.7 --with-iconv-dir=$rvm_path/usr&lt;br /&gt;$ rvm install jruby&lt;br /&gt;$ rvm use --default 1.9.2&lt;br /&gt;&lt;br /&gt;●railsインストール&lt;br /&gt;$ rvm 1.8.7,1.9.2,ree,jruby gem install rails --no-rdoc --no-ri&lt;br /&gt;&lt;br /&gt;※jruby1.6.1では落ちたので注意&lt;br /&gt;&amp;nbsp; arel2.0.10がNG。jruby1.6.2では直っています&lt;br /&gt;&amp;nbsp; http://jira.codehaus.org/browse/JRUBY-5581&lt;br /&gt;&amp;nbsp; https://github.com/jruby/jruby/commit/dd1d9382a72af181e9d3998f2680154ebf1e651c&lt;br /&gt;&lt;br /&gt;●sassのインストール&lt;br /&gt;$ rvm 1.8.7,1.9.2,ree,jruby gem install sass --no-rdoc --no-ri&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■rails自体の開発環境&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;●mysqlの設定&lt;br /&gt;$ sudo /etc/init.d/mysqld start&lt;br /&gt;$ mysql -u root&lt;br /&gt;mysql&amp;gt; GRANT ALL PRIVILEGES ON activerecord_unittest.* &amp;nbsp;to 'rails'@'localhost';&lt;br /&gt;mysql&amp;gt; GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';&lt;br /&gt;&lt;br /&gt;●postgresqlの設定&lt;br /&gt;$ sudo /etc/init.d/postgresql start&lt;br /&gt;$ sudo -u postgres createuser --superuser $USER&lt;br /&gt;&lt;br /&gt;●gitの設定&lt;br /&gt;$ git config --global user.name "kennyj" &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;# 名前&lt;br /&gt;$ git config --global user.email kennyj＠gmail.com # メールアドレス&lt;br /&gt;&lt;br /&gt;●railsの取得とテスト&lt;br /&gt;$ git clone git://github.com/rails/rails.git&lt;br /&gt;$ cd rails&lt;br /&gt;$ bundle install&lt;br /&gt;$ cd activerecord&lt;br /&gt;$ rake mysql:build_databases&lt;br /&gt;$ rake postgresql:build_databases&lt;br /&gt;$ cd ..&lt;br /&gt;$ rake test&lt;br /&gt;&lt;br /&gt;●railsを修正しパッチを作成する&lt;br /&gt;$ git checkout -b xxxxx # ブランチ名&lt;br /&gt;(ソース修正)&lt;br /&gt;$ git commit -a -m "コミットメッセージ"&lt;br /&gt;$ git checkout master&lt;br /&gt;$ git pull&lt;br /&gt;$ git checkout xxxxx&lt;br /&gt;$ git rebase master&lt;br /&gt;$ git commit -a&lt;br /&gt;$ git format-patch master --stdout &amp;gt; xxxxx.diff&lt;br /&gt;$ cat xxxxx.diff&lt;br /&gt;&lt;br /&gt;■更新記録&lt;br /&gt;&lt;br /&gt;2011/06/23 ntpについて追記&lt;br /&gt;サービス起動設定について追記&lt;br /&gt;&lt;br /&gt;2011/08/02 rvm package -&amp;gt; rvm pkgに変更&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-4228420355157106360?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4228420355157106360/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4228420355157106360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4228420355157106360'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/rails.html' title='rails自体の開発環境を作る４（完結）'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2074552211236297537</id><published>2011-06-16T00:57:00.006+09:00</published><updated>2011-06-16T00:59:50.283+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uml'/><category scheme='http://www.blogger.com/atom/ns#' term='class'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>ツイッターの基本構造をクラスモデリングする</title><content type='html'>■概要&lt;br /&gt;&lt;br /&gt;今さらながら、ツイッターの基本構造をクラスモデリングしてみました。あまり新しい気付きはありませんな～&lt;br /&gt;&lt;br /&gt;■まずはユーザー関係&lt;br /&gt;&lt;br /&gt;・ユーザーは、他のユーザーを複数人フォローする事ができる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ys6pm2wGLpw/TfjU11jXqnI/AAAAAAAAADA/hpPtApUJRn0/s1600/tweet1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="92" src="http://2.bp.blogspot.com/-ys6pm2wGLpw/TfjU11jXqnI/AAAAAAAAADA/hpPtApUJRn0/s320/tweet1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;・ユーザーは、他のユーザーをリストとしてまとめる事ができ、複数のリストを持つ事ができる。&lt;br /&gt;リストにはプライバシー設定ができ、公開/非公開を選べる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-gief-n9dY1c/TfjU2aWqAKI/AAAAAAAAADE/lz3AC0tzZhE/s1600/tweet2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://2.bp.blogspot.com/-gief-n9dY1c/TfjU2aWqAKI/AAAAAAAAADE/lz3AC0tzZhE/s320/tweet2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;# 多対多の表現が一定していないのは秘密です(汗)&lt;br /&gt;# 後公開/非公開は完全区画での継承で表現してみました。&lt;br /&gt;&lt;br /&gt;・ユーザーは、他のユーザーの公開しているリストをフォローする事ができる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Au85oHV12h0/TfjU2m95oGI/AAAAAAAAADI/GIoQ5scml1k/s1600/tweet3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Au85oHV12h0/TfjU2m95oGI/AAAAAAAAADI/GIoQ5scml1k/s320/tweet3.png" width="230" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;■次はツイート関係&lt;br /&gt;&lt;br /&gt;・ユーザーは、複数回ツイートを行う事ができる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Sz7leT-waks/TfjU3FktrnI/AAAAAAAAADM/FZo46HYVzg8/s1600/tweet4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-Sz7leT-waks/TfjU3FktrnI/AAAAAAAAADM/FZo46HYVzg8/s200/tweet4.png" width="112" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;・ユーザーは、ツイートに返信できる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-k0iGqZan878/TfjU3Tz3jDI/AAAAAAAAADQ/IfjDKcbC6lI/s1600/tweet5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-k0iGqZan878/TfjU3Tz3jDI/AAAAAAAAADQ/IfjDKcbC6lI/s200/tweet5.png" width="133" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;・ユーザーは、ツイートをお気に入り登録する事ができる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8vpNADNtHgk/TfjU3m3dkxI/AAAAAAAAADU/v9e-nTtoANI/s1600/tweet6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://4.bp.blogspot.com/-8vpNADNtHgk/TfjU3m3dkxI/AAAAAAAAADU/v9e-nTtoANI/s200/tweet6.png" width="173" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;・ユーザーは、ツイートをリツイートする事ができる。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-FCs4RmoHogw/TfjU3_eQD3I/AAAAAAAAADY/1eybLjGkue0/s1600/tweet7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://1.bp.blogspot.com/-FCs4RmoHogw/TfjU3_eQD3I/AAAAAAAAADY/1eybLjGkue0/s200/tweet7.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;■ここまでで、気に入っていない所&lt;br /&gt;&lt;br /&gt;・「フォローする・されるが」、ユーザーとリストに重複してあるのが今いち？&lt;br /&gt;&amp;nbsp; 「フォローされる物」という概念を持ち込むべきか？&lt;br /&gt;・公開・非公開を完全区画の継承で表現したが。。&lt;br /&gt;・リツイートの構造&lt;br /&gt;・ダイレクトメッセージの取り扱い。ツイートとはだいぶ性質が異なる。&lt;br /&gt;・クラス図が描ける軽量のUMLツールって、今何が人気なんだ？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-2074552211236297537?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2074552211236297537/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2074552211236297537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2074552211236297537'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/06/blog-post.html' title='ツイッターの基本構造をクラスモデリングする'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ys6pm2wGLpw/TfjU11jXqnI/AAAAAAAAADA/hpPtApUJRn0/s72-c/tweet1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8025914292371886227</id><published>2011-05-22T12:03:00.000+09:00</published><updated>2011-05-22T12:03:22.873+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>rails自体の開発環境を作る３</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;rails3をモジュール別にテストしていますが、activerecordだけはDBの準備があるので少し面倒そうです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■activerecord&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;○sqlite3&lt;br /&gt;&lt;br /&gt;$ cd activerecord&lt;br /&gt;$ RUBYOPT=-W0 rake test_sqlite3&lt;br /&gt;&lt;br /&gt;......&lt;br /&gt;2986 tests, 9101 assertions, 0 failures, 0 errors, 2 skips&lt;br /&gt;&lt;br /&gt;とくに問題なさそうだ。&lt;br /&gt;&lt;br /&gt;○mysql &amp; postgresql&lt;br /&gt;&lt;br /&gt;まずはデータベースの準備&lt;br /&gt;&lt;br /&gt;# yum install mysql mysql-devel mysql-server&lt;br /&gt;# yum install postgresql84 postgresql84-contrib postgresql84-devel postgresql84-libs postgresql84-server&lt;br /&gt;&lt;br /&gt;bundlerが、"DB無し設定"なので、再取得する。&lt;br /&gt;&lt;br /&gt;$ rm .bundle/config&lt;br /&gt;$ bundle install (adapterのコンパイルが成功するはず)&lt;br /&gt;&lt;br /&gt;mysqlの下準備は、ユーザの権限付与とDB構築&lt;br /&gt;&lt;br /&gt;# /etc/init.d/mysqld start&lt;br /&gt;$ mysql -u root&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON activerecord_unittest.* to 'rails'@'localhost';&lt;br /&gt;mysql&gt; GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';&lt;br /&gt;$ cd activerecord&lt;br /&gt;$ rake mysql:build_databases&lt;br /&gt;&lt;br /&gt;postgresqlの下準備は、DB作成とユーザ周り&lt;br /&gt;&lt;br /&gt;# service postgresql initdb&lt;br /&gt;# /etc/init.d/postgresql start&lt;br /&gt;$ sudo -u postgres createuser --superuser $USER&lt;br /&gt;$ cd activerecord&lt;br /&gt;$ rake postgresql:build_databases&lt;br /&gt;&lt;br /&gt;で、テストを実行&lt;br /&gt;&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;2977 tests, 9114 assertions, 0 failures, 0 errors, 2 skips&lt;br /&gt;&lt;br /&gt;お、動いた！！(postgresqlで2つ程落ちてますが。。)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■次回予告&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ここまでの作業を纏めて、目指せコントリビュータ！な感じにしようと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8025914292371886227?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8025914292371886227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8025914292371886227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8025914292371886227'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails_22.html' title='rails自体の開発環境を作る３'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-946440744181622989</id><published>2011-05-21T10:46:00.003+09:00</published><updated>2011-05-23T23:22:48.891+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>論理データベース設計（ER図）のチェックリスト</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;職業がら、顧客と会話しデータベースの論理設計をする事が良くあります。&lt;br /&gt;自分で設計する分には良いんですが、他人が設計した物を効率的にチェックする為に備忘録がてら記載しておきます。&lt;br /&gt;&lt;br /&gt;ちなみに当方は「渡辺幸三さんの著作」と「アナリシスパターン」の影響を一番受けています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■チェック項目&lt;/b&gt;&lt;br /&gt;○キーについて&lt;br /&gt;・データの一意性が、利用者(顧客)と意識があっているか&lt;br /&gt;・PKの無いテーブルはないか&lt;br /&gt;・UKが明示されているか&lt;br /&gt;・多すぎる複合キーはないか&lt;br /&gt;・自然キーとサロゲートキーを意識できているか&lt;br /&gt;・ID / コード・番号を使い分けているか&lt;br /&gt;・FKを意識できているか&lt;br /&gt;・FK/区分との使い分けは考えられているか&lt;br /&gt;・属性項目のドメインを規定する物なので使い分けの基準が重要&lt;br /&gt;&lt;br /&gt;○属性について&lt;br /&gt;・ドメイン管理を意識して属性名を付けているか&lt;br /&gt;・継承項目、導出項目が明示されているか&lt;br /&gt;・継承・導出ルールが明示・意識されているか&lt;br /&gt;・時点記録を意識して導出項目を設計しているか？&lt;br /&gt;&lt;br /&gt;○多重度・関係について&lt;br /&gt;・多重度が間違っていないか&lt;br /&gt;・1-1関連が存在しないか&lt;br /&gt;・"0以上"なのか"1以上"なのか考察できているか&lt;br /&gt;・親子と参照を意識して使っているか&lt;br /&gt;・派生関係を意識できているか&lt;br /&gt;&lt;br /&gt;○正規化について&lt;br /&gt;・繰り返し項目が除去できているか（もしくは意識できているか？）&lt;br /&gt;・PKからの関数従属性のみになっているか&lt;br /&gt;・キー組み合わせについてデータが表現出来ているか&lt;br /&gt;&lt;br /&gt;○その他について&lt;br /&gt;・インスタンスレベルでイメージできているか&lt;br /&gt;・インスタンスにするべき概念がテーブルになってないか&lt;br /&gt;・パラレルに重複した構造・関係はないか&lt;br /&gt;・プログラムとの連携を意識できているか&lt;br /&gt;・知識・操作レベルを意識できているか&lt;br /&gt;・データのライフサイクルを意識できているか&lt;br /&gt;・区分が設計されているか&lt;br /&gt;・状態の管理が意識できているか&lt;br /&gt;・人間はミスをするという事を意識できているか&lt;br /&gt;・業務にキャンセルがありえる事を意識できているか&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■雑感&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;思いつくまま記載しても結構あるな。思い出したら追加していこう。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-946440744181622989?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/946440744181622989/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/er.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/946440744181622989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/946440744181622989'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/er.html' title='論理データベース設計（ER図）のチェックリスト'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5108674512688057718</id><published>2011-05-18T01:37:00.001+09:00</published><updated>2011-05-22T11:16:01.480+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>rails自体の開発環境を作る２</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;前回とりあえず環境が出来たのでモジュール毎にtestcaseを実行していきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■actionmailer&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd actionmailer&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;Finished in 7.010759 seconds.&lt;br /&gt;&lt;br /&gt;181 tests, 487 assertions, 0 failures, 0 errors, 0 skips&lt;br /&gt;&lt;br /&gt;全部OKだ!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■actionpack&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd ../actionpack&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;Skipping MemCacheStoreTest tests. Start memcached and try again.&lt;br /&gt;&lt;br /&gt;どうもmemcachedが必要そうです。&lt;br /&gt;&lt;br /&gt;# yum install libevent libevent-devel&lt;br /&gt;# cd /usr/local/src&lt;br /&gt;# wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz&lt;br /&gt;# tar xvfz memcached-1.4.5.tar.gz&lt;br /&gt;# cd memcached-1.4.5&lt;br /&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;# cp /usr/local/src/memcached-1.4.5/scripts/memcached.sysv /etc/init.d/memcached&lt;br /&gt;# vim /etc/init.d/memcached&lt;br /&gt;(memcachedコマンドが見つからないと言われるので、/usr/local/bin/memcachedとした)&lt;br /&gt;# /etc/init.d/memcached start&lt;br /&gt;&lt;br /&gt;で再度挑戦&lt;br /&gt;&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;...F......F...&lt;br /&gt;Finished in 68.901053 seconds.&lt;br /&gt;&lt;br /&gt;1) Failure:&lt;br /&gt;test_default_params(TestRoutingMapper) [test/dispatch/routing_test.rb:1448]:&lt;br /&gt;&lt;"home"&gt; expected but was&lt;br /&gt;&lt;nil&gt;.&lt;br /&gt;&lt;br /&gt;2) Failure:&lt;br /&gt;test_non_greedy_regexp(TestRoutingMapper) [test/dispatch/routing_test.rb:1791]:&lt;br /&gt;&lt;true&gt; expected but was&lt;br /&gt;&lt;false&gt;.&lt;br /&gt;&lt;br /&gt;3117 tests, 14823 assertions, 2 failures, 0 errors, 0 skips&lt;br /&gt;二つほど落ちているが、一旦無視する。&lt;br /&gt;&lt;br /&gt;2011/05/22追記 =&gt; 今日見たら全部OKでした。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■activemodel&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd ../activemodel&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;Finished in 1.524920 seconds.&lt;br /&gt;&lt;br /&gt;492 tests, 1323 assertions, 0 failures, 0 errors, 0 skips&lt;br /&gt;&lt;br /&gt;全部OKだ!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■activeresource&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd ../activeresource&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;Finished in 3.307448 seconds.&lt;br /&gt;&lt;br /&gt;284 tests, 877 assertions, 0 failures, 0 errors, 0 skips&lt;br /&gt;&lt;br /&gt;※いくつかDEPRECATIONが出ていました。&lt;br /&gt;&lt;br /&gt;2011/05/22追記 =&gt; 今日見たら出てませんでした。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■activesupport&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd ../activesupport&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;Finished in 7.790476 seconds.&lt;br /&gt;&lt;br /&gt;2477 tests, 10526 assertions, 0 failures, 0 errors, 0 skips&lt;br /&gt;&lt;br /&gt;全部OKだ!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■railties&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ cd ../railties/&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;......&lt;br /&gt;&lt;br /&gt;すごく時間がかかりますが...３つ程落ちました。。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■activerecord&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;...次回に続く...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5108674512688057718?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5108674512688057718/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails_18.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5108674512688057718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5108674512688057718'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails_18.html' title='rails自体の開発環境を作る２'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5520573909153180427</id><published>2011-05-17T02:36:00.002+09:00</published><updated>2011-05-17T02:45:05.750+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>rails自体の開発環境を作る１</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;そういえばrails自体の開発環境を作成したい場合どうしたら良いのか？&lt;br /&gt;&lt;a href="http://guides.rubyonrails.org/contributing_to_ruby_on_rails.html"&gt;http://guides.rubyonrails.org/contributing_to_ruby_on_rails.html&lt;/a&gt;を参考にcentos5.xに環境を作成してみる。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■環境確認＆準備&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;バージョン確認&lt;br /&gt;$ ruby -v&lt;br /&gt;ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]&lt;br /&gt;&lt;br /&gt;必要なプロダクト等インストール&lt;br /&gt;$ sudo yum install libxml2 libxml2-devel libxslt-devel&lt;br /&gt;$ sudo yum install sqlite sqlite-devel&lt;br /&gt;$ sudo gem install bundler&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■railsを取得＆テスト実行&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ git clone git://github.com/rails/rails.git&lt;br /&gt;$ cd rails&lt;br /&gt;$ bundle install --without db&lt;br /&gt;$ rake test (全体をテスト。但しmysql/mysql2/postgresql依存は落ちます)&lt;br /&gt;&lt;br /&gt;なおモジュール単位でのテストの実行は(例 actionpack)&lt;br /&gt;&lt;br /&gt;$ cd actionpack&lt;br /&gt;$ rake test&lt;br /&gt;&lt;br /&gt;で良いようです。ちなみにwarningが発生しているので&lt;br /&gt;&lt;br /&gt;$ RUBYOPT=-W0 rake test&lt;br /&gt;&lt;br /&gt;とすればwarningを抑えられます。続く...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■雑感&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;う～む、意外にwarningが結構多発しているんですね(AM以外は何かしら発生します)。&lt;br /&gt;後memcached用意した方が良さそうですね。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5520573909153180427?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5520573909153180427/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5520573909153180427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5520573909153180427'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails.html' title='rails自体の開発環境を作る１'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-9050594501726021597</id><published>2011-05-07T03:03:00.012+09:00</published><updated>2011-07-20T18:25:08.583+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails3'/><title type='text'>rails 3.1 RC4の変更点を翻訳してみた</title><content type='html'>&lt;a href="https://gist.github.com/959393/2ea68ec3d841905baa4d04e3c0caefb1db479244"&gt;こちら&lt;/a&gt;で公開されているrails3.1 beta1の変更点を翻訳してみました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(更新)2011/07/20 rails3.1 RC4にしました。&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;作業途中＆超適当翻訳ですが、無いよりはましだと思うので公開します。&lt;br /&gt;埋め込み方がいまいち良くわからないので、&lt;a href="https://gist.github.com/959393"&gt;こちら&lt;/a&gt;へどうぞ。&lt;br /&gt;(凹まない程度の)ツッコミ募集中です！&lt;br /&gt;&lt;br /&gt;# どなたか綺麗に埋め込む方法教えてください。↓実験中。&lt;br /&gt;&lt;style&gt;/*    custom style for gist    div.section と組み合わせて適用範囲を限定することで、標準の.gist-xxxxの設定を上書きしている。 */div.section .gist .gist-file .gist-data pre{  -moz-border-radius-bottomleft: 0;  -moz-border-radius-bottomright: 0;  -webkit-border-bottom-left-radius: 0;  -webkit-border-bottom-right-radius: 0;  background: #000000 !important;  margin: 0;}div.section .gist .gist-file {  border: none;}div.section .gist .gist-file .gist-meta {  -moz-border-radius-bottomleft:8px;  -moz-border-radius-bottomright:8px;  -webkit-border-bottom-left-radius:8px;  -webkit-border-bottom-right-radius:8px;  background-color: #7A321D;  color: #c7c7c7;}div.section .gist .gist-file .gist-meta a{  color: #f8f8f8;}div.section .gist .gist-file .gist-meta  a:hover {  color:#FFF462;}div.section .gist ,div.section .gist-syntax .k ,div.section .gist-syntax .o ,div.section .gist-syntax .gd ,div.section .gist-syntax .gd .x ,div.section .gist-syntax .ge ,div.section .gist-syntax .gi ,div.section .gist-syntax .gi .x ,div.section .gist-syntax .kc ,div.section .gist-syntax .kd ,div.section .gist-syntax .kp ,div.section .gist-syntax .kr ,div.section .gist-syntax .ow{   color: #ffffff;}&lt;/style&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/959393.js"&gt; &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-9050594501726021597?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/9050594501726021597/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails31-beta1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/9050594501726021597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/9050594501726021597'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/05/rails31-beta1.html' title='rails 3.1 RC4の変更点を翻訳してみた'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6457221632433527704</id><published>2011-04-22T02:23:00.005+09:00</published><updated>2011-04-23T23:31:46.322+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='phantomjs'/><title type='text'>javascriptでのCIを目指して、phantomjsの環境を作成する４</title><content type='html'>■概要&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs_21.html"&gt;前回&lt;/a&gt;までで、phantomjsが大体わかったので、jasmine with CoffeeScriptな環境を作成します。&lt;br /&gt;&lt;br /&gt;■説明&lt;br /&gt;&lt;br /&gt;・CoffeeScriptのコンパイルを楽したい。ここではwatchrを利用してみます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ sudo gem install watchr&lt;br /&gt;&lt;br /&gt;$ mkdir demo; cd demo&lt;br /&gt;$ mkdir src; mkdir spec&lt;br /&gt;$ vim coffee.watchr&lt;br /&gt;&lt;br /&gt;watch(/(src|spec)\/.*\.coffee/) { |md|&lt;br /&gt;  system("coffee -cb #{md[0]}")&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$ watchr coffee.watchr&lt;br /&gt;&lt;br /&gt;(別の端末で)&lt;br /&gt;&lt;br /&gt;$ vim src/test.coffee&lt;br /&gt;&lt;br /&gt;console.log "a"&lt;br /&gt;&lt;br /&gt;$ ls src&lt;br /&gt;test.coffee test.js &amp;lt;= できてます！&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;・ではjasmineを利用してブラウザからテストを実行します。OOPでは古典的な"カウンター"を作ってみます。  &lt;br /&gt;&lt;pre class="brush:bash"&gt;$ wget http://pivotal.github.com/jasmine/downloads/jasmine-standalone-1.0.2.zip&lt;br /&gt;$ unzip *.zip&lt;br /&gt;$ rm *.zip&lt;br /&gt;$ vim spec/CounterSpec.coffee&lt;br /&gt;&lt;br /&gt;describe "Counter", -&amp;gt;&lt;br /&gt;  beforeEach -&amp;gt;&lt;br /&gt;    @counter = new Counter()&lt;br /&gt;&lt;br /&gt;  describe "#constructor", -&amp;gt;&lt;br /&gt;    it "の初期値は0である", -&amp;gt;&lt;br /&gt;      expect(@counter.value()).toEqual(0)&lt;br /&gt;&lt;br /&gt;  describe "#incr", -&amp;gt;&lt;br /&gt;    it "は値を1増加させるはず", -&amp;gt;&lt;br /&gt;      @counter.incr()&lt;br /&gt;      expect(@counter.value()).toEqual(1)&lt;br /&gt;&lt;br /&gt;$ vim src/Counter.coffee&lt;br /&gt;&lt;br /&gt;class Counter&lt;br /&gt;  constructor: () -&amp;gt;&lt;br /&gt;    @count = 0&lt;br /&gt;&lt;br /&gt;  incr: () -&amp;gt;&lt;br /&gt;    @count++&lt;br /&gt;&lt;br /&gt;  value: () -&amp;gt;&lt;br /&gt;    @count&lt;br /&gt;&lt;br /&gt;$ vim SpecRunner.html (Counter.js/CounterSpec.jsの読み込みを記載する)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;ブラウザで http://localhost/demo/SpecRunner.htmlを確認するといい感じです！。  &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-X0yYtv6Mbvs/TbLiolME3XI/AAAAAAAAACw/f7oN0jMza4o/s1600/jasmine.png" imageanchor="1"&gt;&lt;img border="0" height="163" src="http://3.bp.blogspot.com/-X0yYtv6Mbvs/TbLiolME3XI/AAAAAAAAACw/f7oN0jMza4o/s640/jasmine.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;最後にphantomjsからjasmineのSpecRunner.htmlを起動します。  &lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim src/run-jasmine.coffee&lt;br /&gt;&lt;br /&gt;if phantom.state.length is 0&lt;br /&gt;  if phantom.args.length isnt 1&lt;br /&gt;    console.log 'Usage: run-jasmine.js URL'&lt;br /&gt;    phantom.exit()&lt;br /&gt;  else&lt;br /&gt;    phantom.state = 'run-jasmine'&lt;br /&gt;    phantom.open phantom.args[0]&lt;br /&gt;else&lt;br /&gt;  window.setInterval -&amp;gt;&lt;br /&gt;    if document.body.querySelector('.finished-at')&lt;br /&gt;      console.log document.body.querySelector('.description').innerText&lt;br /&gt;      for el in document.body.querySelectorAll('div.jasmine_reporter &amp;gt; div.suite.failed')&lt;br /&gt;        console.log ''&lt;br /&gt;        for e in el.querySelectorAll('.description')&lt;br /&gt;          console.log e.innerText&lt;br /&gt;      phantom.exit()&lt;br /&gt;  , 100&lt;br /&gt;&lt;br /&gt;$ phantomjs src/run-jasmine.coffee http://localhost/demo/SpecRunner.html&lt;br /&gt;2 specs, 0 failures in 0.039s &amp;lt;= テスト結果が得られてます。いいじゃん！&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6457221632433527704?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6457221632433527704/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6457221632433527704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6457221632433527704'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs_22.html' title='javascriptでのCIを目指して、phantomjsの環境を作成する４'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-X0yYtv6Mbvs/TbLiolME3XI/AAAAAAAAACw/f7oN0jMza4o/s72-c/jasmine.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4149659824017698267</id><published>2011-04-21T01:30:00.003+09:00</published><updated>2011-04-23T23:34:35.112+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='phantomjs'/><title type='text'>javascriptでのCIを目指して、phantomjsの環境を作成する３</title><content type='html'>■概要&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs.html"&gt;前回&lt;/a&gt;に引き続きphantomjsのQuickStartを参考にCoffeeScriptを書いてみる。&lt;br /&gt;&lt;br /&gt;■説明&lt;br /&gt;&lt;br /&gt;・Loading &amp;amp; Rendering&lt;br /&gt;&lt;br /&gt;Loadingの説明を見ているといくつかポイントが見えてきます。&lt;br /&gt;&lt;br /&gt;・コマンドライン引数に指定されたスクリプトは、複数回呼び出される&lt;br /&gt;※phantom.exit()するまで&lt;br /&gt;・phantom.stateは値が維持されるので、初回呼び出しかどうか判断可能&lt;br /&gt;初回は空文字列&lt;br /&gt;・phantom.openは引数で指定されたページを読み込む&lt;br /&gt;読み込み終了までblockingされる&lt;br /&gt;・phantom.loadStatusはphantom.open後の状態が保持される&lt;br /&gt;"success" もしくは "fail"&lt;br /&gt;&lt;br /&gt;という訳で、LoadPage(とRendering)をCoffeeScriptで書いてみます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim google.coffee&lt;br /&gt;&lt;br /&gt;LoadPage = (name, url, action) -&amp;gt;&lt;br /&gt;  if !phantom.state&lt;br /&gt;    phantom.state = name&lt;br /&gt;    phantom.open url&lt;br /&gt;  else&lt;br /&gt;    action()&lt;br /&gt;    phantom.exit()&lt;br /&gt;&lt;br /&gt;LoadPage "google", "http://www.google.co.jp", -&amp;gt;&lt;br /&gt;  phantom.render "#{phantom.state}.png"&lt;br /&gt;&lt;br /&gt;$ phantomjs google.coffee&lt;br /&gt;$ ls google*&lt;br /&gt;google.coffee google.png&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちゃんと出来ました！なおphantom.viewportSizeの設定をしないとwidth/heightは適当な値になるようです&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6z9qRHtYETs/Ta8GeTgfqKI/AAAAAAAAACo/4zCv6mrshGE/s1600/google.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="248" src="http://2.bp.blogspot.com/-6z9qRHtYETs/Ta8GeTgfqKI/AAAAAAAAACo/4zCv6mrshGE/s320/google.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ちなみにdom treeは読み込み後documentオブジェクトを操作できます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;LoadPage "google", "http://www.google.co.jp", -&amp;gt;&lt;br /&gt;  console.log document.getElementById("prm").innerText&lt;br /&gt;&lt;br /&gt;$ phantomjs google.coffee&lt;br /&gt;世界中から寄せられた日本へのメッセージが日本語で見られるサイトを開設しました。&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;■参照&lt;br /&gt;&lt;br /&gt;phantomjsの&lt;a href="http://code.google.com/p/phantomjs/wiki/QuickStart"&gt;QuickStart&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;■雑感&lt;br /&gt;&lt;br /&gt;次回は本当にCIができたらな～と思いつつ（ゴールは近いはず）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-4149659824017698267?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4149659824017698267/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs_21.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4149659824017698267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4149659824017698267'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs_21.html' title='javascriptでのCIを目指して、phantomjsの環境を作成する３'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-6z9qRHtYETs/Ta8GeTgfqKI/AAAAAAAAACo/4zCv6mrshGE/s72-c/google.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-1257060210846903370</id><published>2011-04-20T00:10:00.010+09:00</published><updated>2011-04-22T00:35:05.895+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='phantomjs'/><title type='text'>javascriptでのCIを目指して、phantomjsの環境を作成する２</title><content type='html'>■概要&lt;br /&gt;&lt;a href="http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs1.html"&gt;前回&lt;/a&gt; phantomjsのインストールに成功したので、色々触って見ます。&lt;br /&gt;&lt;br /&gt;・ちなみにphantomjsってCoffeeScriptいけるんですね！&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ phantomjs&lt;br /&gt;&lt;br /&gt;Usage: phantomjs [options] script.[js|coffee]&lt;br /&gt;  [script argument [script argument ...]]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・次からはphantomjsのQuickStartを、CoffeeScriptに書き写しながら進めます。&lt;br /&gt;&lt;br /&gt;■説明&lt;br /&gt;&lt;br /&gt;・まずはhello world&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim hello.coffee&lt;br /&gt;&lt;br /&gt;console.log "hello, world!"&lt;br /&gt;phantom.exit()&lt;br /&gt;&lt;br /&gt;$ phantomjs hello.coffee&lt;br /&gt;hello, world!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・次に同期sleep&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim delay.coffee&lt;br /&gt;&lt;br /&gt;for t in [10..1]&lt;br /&gt;  console.log t&lt;br /&gt;  phantom.sleep 1000&lt;br /&gt;console.log 'BLAST OFF'&lt;br /&gt;phantom.exit()&lt;br /&gt;&lt;br /&gt;$ phantomjs delay.coffee&lt;br /&gt;10&lt;br /&gt;9&lt;br /&gt;...&lt;br /&gt;1&lt;br /&gt;BLAST OFF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・ちなみに非同期sleepは&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim adelay.coffee&lt;br /&gt;&lt;br /&gt;fibs = [0, 1]&lt;br /&gt;&lt;br /&gt;ticker = window.setInterval -&gt;&lt;br /&gt;  console.log fibs[fibs.length - 1]&lt;br /&gt;  fibs.push fibs[fibs.length - 1] + fibs[fibs.length - 2]&lt;br /&gt;  if fibs.length &gt; 10&lt;br /&gt;    window.clearInterval ticker&lt;br /&gt;    phantom.exit()&lt;br /&gt;, 300&lt;br /&gt;&lt;br /&gt;$ phantomjs adelay.coffee&lt;br /&gt;1&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;...&lt;br /&gt;21&lt;br /&gt;34&lt;br /&gt;&lt;/pre&gt;functionオブジェクトが最後の引数ではない場合ここにカンマ何ですね。。&lt;br /&gt;&lt;br /&gt;・コマンドライン引数は&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;$ vim arguments.coffee&lt;br /&gt;&lt;br /&gt;if phantom.args.length is 0&lt;br /&gt;  console.log 'Try to pass some args when invoking this script!'&lt;br /&gt;else&lt;br /&gt;  phantom.args.forEach (arg, i) -&gt; console.log "#{i}: #{arg}"&lt;br /&gt;phantom.exit()&lt;br /&gt;&lt;br /&gt;$ phantomjs arguments.coffee&lt;br /&gt;Try to pass some args when invoking this script!&lt;br /&gt;&lt;br /&gt;$ phantomjs arguments.coffee a b c&lt;br /&gt;0: a&lt;br /&gt;1: b&lt;br /&gt;2: c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次回は、感じのページオープンとdom tree周り経由でCIにつなげたいと思う今日この頃&lt;br /&gt;&lt;br /&gt;■参考&lt;br /&gt;&lt;br /&gt;phantomjsの&lt;a href="http://code.google.com/p/phantomjs/wiki/QuickStart"&gt;QuickStart&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;■雑感&lt;br /&gt;&lt;br /&gt;CoffeeScriptの構文は、あまり違和感が無いな～&lt;br /&gt;CoffeeScriptを習得するには、js -&gt; coffeeの翻訳が一番？&lt;br /&gt;&lt;br /&gt;■更新履歴&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2011/04/20&lt;/b&gt; &lt;a href="http://tech.kayac.com/"&gt;http://tech.kayac.com/&lt;/a&gt; を参考にさせて頂き、setIntervalの記載方法を変更しました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-1257060210846903370?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/1257060210846903370/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1257060210846903370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1257060210846903370'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs.html' title='javascriptでのCIを目指して、phantomjsの環境を作成する２'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-205494290120107625</id><published>2011-04-13T01:33:00.005+09:00</published><updated>2011-04-18T18:30:41.069+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ci'/><category scheme='http://www.blogger.com/atom/ns#' term='phantomjs'/><title type='text'>javascriptでのCIを目指して、phantomjsの環境を作成する１</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;a href="http://dann.g.hatena.ne.jp/dann/20110327/p1"&gt;qunit-tapとproveを使ってJSの単体テストのCIをする方法&lt;/a&gt;に感化されて、まずは環境づくりに挑戦してみます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■インストール手順&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;centos 5.5に環境を作るまでの手順です。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○phantomjsをインストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/phantomjs/wiki/BuildInstructionsのコメントとかも参考にしながら進めました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# vim /etc/yum.repos.d/atrpms.repo&lt;br /&gt;&lt;br /&gt;[atrpms]&lt;br /&gt;name= CentOS-$releasever - ATrpms&lt;br /&gt;baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/testing/&lt;br /&gt;gpgcheck=1&lt;br /&gt;gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms&lt;br /&gt;enabled=1&lt;br /&gt;&lt;br /&gt;# rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms&lt;br /&gt;# yum install qt47-devel qt47-webkit qt47-webkit-devel&lt;br /&gt;&lt;br /&gt;# git clone git://github.com/ariya/phantomjs.git &amp;&amp; cd phantomjs&lt;br /&gt;# qmake-qt47&lt;br /&gt;# make&lt;br /&gt;# cp bin/phantomjs /usr/local/bin (PATHの通ってる場所にコピー)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;○phantomjsの確認&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;http://code.google.com/p/phantomjs/を参考に起動を確認しようと思いました&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# vim test.js&lt;br /&gt;&lt;br /&gt;if (phantom.state.length === 0) {&lt;br /&gt;    phantom.state = 'pizza';&lt;br /&gt;    phantom.open('http://www.google.com/m/local?site=local&amp;q=pizza+in+new+york');&lt;br /&gt;} else {&lt;br /&gt;    var list = document.querySelectorAll('div.bf');&lt;br /&gt;    for (var i in list) {&lt;br /&gt;        console.log(list[i].innerText);&lt;br /&gt;    }&lt;br /&gt;    phantom.exit();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# phantomjs test.js&lt;br /&gt;2011-04-13T00:00:32 [WARNING] phantomjs: cannot connect to X server&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;うーん問題あるみたいですねぇ。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○xvfbの準備&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;どうもxvfbをインストールして仮想画面を立ち上げないとphantomjsは使えない感じなのでインストール＆起動します。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;# yum install xorg-x11-server-Xvfb xorg-x11-fonts*&lt;br /&gt;$ Xvfb :2 -screen 0 800x600x24 2&gt; /dev/null &amp;&lt;br /&gt;$ export DISPLAY=:2.0&lt;br /&gt;$ phantomjs test.js&lt;br /&gt;&lt;br /&gt;Adrienne's Pizza Bar Restaurant&lt;br /&gt;54 Stone Street, New York, NY&lt;br /&gt;(212) 248-3838 -&lt;br /&gt;&lt;br /&gt;John's Pizzeria&lt;br /&gt;278 Bleecker St, New York, New York&lt;br /&gt;(212) 243-1680 -&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;おーなんだか動いてますね！&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○/dev/null 指定しないと、何か変なエラーメッセージが出てるんですけど..&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;FreeFontPath: FPE "built-ins" refcount is 2, should be 1; fixing.&lt;br /&gt;Could not init font path element unix/:7100, removing from list!&lt;br /&gt;&lt;br /&gt;=&gt; fontの設定関係の問題っぽいのですが、どうも解決策がわかりません。。とりあえずほっています&lt;br /&gt;&lt;br /&gt;&lt;b&gt;○Xvfbどうやって止めたらいいんだ？&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ kill -9 `cat /tmp/.X2-lock`; rm -f /tmp/.X2-lock&lt;br /&gt;&lt;br /&gt;こんな感じかな?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-205494290120107625?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/205494290120107625/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/205494290120107625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/205494290120107625'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs1.html' title='javascriptでのCIを目指して、phantomjsの環境を作成する１'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-1774735629097656366</id><published>2011-04-06T01:58:00.003+09:00</published><updated>2011-04-06T13:35:39.330+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='rdbms'/><category scheme='http://www.blogger.com/atom/ns#' term='db'/><title type='text'>indexを作成すると本当に更新性能は下がるのか？</title><content type='html'>■概要&lt;br /&gt;RDBMSの参照性能を向上させる為に、indexを作成する事は常識だと思います。&lt;br /&gt;ところが「indexを張りすぎると更新性能が悪くなる」と言われており、理屈的にも理解できます（データおよびindexを更新する必要があるから)。&lt;br /&gt;しかし実際どの程度劣化するのか知りたいので、実験してみたいと思います。&lt;br /&gt;&lt;br /&gt;■前提&lt;br /&gt;・さくらVPS 512Mコース&lt;br /&gt;・CentOS 5.x&lt;br /&gt;・mysql  5.0.77&lt;br /&gt;・利用テーブル(下記の様なテーブルで順次indexを作成しなおしテストした)&lt;br /&gt;&lt;pre class="brush:sql"&gt;drop table test_table;&lt;br /&gt;create table test_table (&lt;br /&gt;  id integer auto_increment not null&lt;br /&gt;, v1 varchar(30) not null&lt;br /&gt;, v2 varchar(30) not null&lt;br /&gt;, v3 varchar(30) not null&lt;br /&gt;, v4 varchar(30) not null&lt;br /&gt;, v5 varchar(30) not null&lt;br /&gt;, primary key(id)&lt;br /&gt;);&lt;br /&gt;--create index v1_index on test_table(v1);&lt;br /&gt;--create index v2_index on test_table(v2);&lt;br /&gt;--create index v3_index on test_table(v3);&lt;br /&gt;--create index v4_index on test_table(v4);&lt;br /&gt;--create index v5_index on test_table(v5);&lt;br /&gt;&lt;/pre&gt;・テストデータ 10万件insert (下記の様なrubyスクリプトを作成し出来上がったinsert.sql文ファイルを実行した)&lt;br /&gt;&lt;pre class="brush:rb"&gt;def random_string(len)&lt;br /&gt;  (0...len).map{ ('a'..'z').to_a[rand(26)] }.join&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;open("insert.sql", "wb") do |f|&lt;br /&gt;  f.write("truncate table test_table;\r\n")&lt;br /&gt;  f.write("set @time:=now();\r\n")&lt;br /&gt;  (0...100000).each do |i|&lt;br /&gt;    v1 = random_string(30)&lt;br /&gt;    v2 = random_string(30)&lt;br /&gt;    v3 = random_string(30)&lt;br /&gt;    v4 = random_string(30)&lt;br /&gt;    v5 = random_string(30)&lt;br /&gt;    vals = "'" &amp;lt;&amp;lt; [v1, v2, v3, v4, v5].join("','") &amp;lt;&amp;lt; "'"&lt;br /&gt;    f.write("insert into test_table (v1, v2, v3, v4, v5) values (#{vals});\r\n")&lt;br /&gt;    puts i&lt;br /&gt;  end&lt;br /&gt;  f.write("commit;\r\n")&lt;br /&gt;  f.write("select timediff(now(), @time);\r\n")&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;$ mysql -u xxx &amp;lt; insert.sql&lt;br /&gt;&lt;br /&gt;■結果&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;       &lt;td&gt;index数&lt;/td&gt;       &lt;td&gt;1回目&lt;/td&gt;       &lt;td&gt;2回目&lt;/td&gt;       &lt;td&gt;3回目&lt;/td&gt;       &lt;td&gt;4回目&lt;/td&gt;       &lt;td&gt;5回目&lt;/td&gt;       &lt;td&gt;平均処理時間(秒)&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;0&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;15&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;20&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;14&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;10&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;14&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;12.6&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;1&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;19&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;16&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;15&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;14&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;16.4&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;2&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;15&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;14&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;15&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;16.0&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;3&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;14&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;17&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;20&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;21&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18.0&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;4&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;23&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;19&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;18&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;19.2&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;tr&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;5&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;19&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;22&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;19&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;24&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;20&lt;/div&gt;&lt;/td&gt;       &lt;td&gt;&lt;div style="text-align: right;"&gt;20.8&lt;/div&gt;&lt;/td&gt;     &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Z15ZiXJJ6uI/TZtISKaLdDI/AAAAAAAAACA/FoYh9PYiU0M/s1600/graph.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Z15ZiXJJ6uI/TZtISKaLdDI/AAAAAAAAACA/FoYh9PYiU0M/s1600/graph.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;■結論&lt;br /&gt;&lt;br /&gt;確かに下がるには、下がるようだ。。という訳でセオリー通りindexの張りすぎには注意が必要のようです。&lt;br /&gt;&lt;br /&gt;ただ全体的にy = ax + bの一次関数likeな上昇なので、"+b"がどこに消費されるのかが気になるところです(sql文のparse?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-1774735629097656366?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/1774735629097656366/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/index.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1774735629097656366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1774735629097656366'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/04/index.html' title='indexを作成すると本当に更新性能は下がるのか？'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Z15ZiXJJ6uI/TZtISKaLdDI/AAAAAAAAACA/FoYh9PYiU0M/s72-c/graph.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-3778169018566375907</id><published>2011-03-31T01:37:00.000+09:00</published><updated>2011-03-31T01:37:32.069+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>最近のOSでsubversion1.4.xがコンパイルしたい</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ubuntu 10.4等最近のOSで、subversion1.4.xをconfigure =&amp;gt; make =&amp;gt; make install しようとするとconfigureの段階で問題が発生します。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;$ tar zxvf subversion-1.4.6.tar.gz &lt;br /&gt;$ cd subversion-1.4.6&lt;br /&gt;$ ./autogen.sh&lt;br /&gt;...&lt;br /&gt;configure.in:146: warning: LTOPTIONS_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;build/libtool.m4:67: LT_INIT is expanded from...&lt;br /&gt;build/libtool.m4:102: AC_PROG_LIBTOOL is expanded from...&lt;br /&gt;configure.in:146: the top level&lt;br /&gt;configure.in:146: warning: LTSUGAR_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;configure.in:146: warning: LTVERSION_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;configure.in:146: warning: LTOBSOLETE_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;Creating configure...&lt;br /&gt;configure.in:146: warning: LTOPTIONS_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;build/libtool.m4:67: LT_INIT is expanded from...&lt;br /&gt;build/libtool.m4:102: AC_PROG_LIBTOOL is expanded from...&lt;br /&gt;configure.in:146: the top level&lt;br /&gt;configure.in:146: warning: LTSUGAR_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;configure.in:146: warning: LTVERSION_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;configure.in:146: warning: LTOBSOLETE_VERSION is m4_require'd but not m4_defun'd&lt;br /&gt;configure:5904: error: possibly undefined macro: m4_ifval&lt;br /&gt;      If this token and others are legitimate, please use m4_pattern_allow.&lt;br /&gt;      See the Autoconf documentation.&lt;br /&gt;configure:8391: error: possibly undefined macro: _LT_SET_OPTIONS&lt;br /&gt;configure:8391: error: possibly undefined macro: LT_INIT&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;どうもlibtoolの変更に伴う問題みたいなので（仕方なく）調べました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■解決方法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;参考ページによると*.m4系の内容が別々のファイルに分離したのが問題っぽいので乱暴ながら一時的に一つにするといいみたいです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush :bash"&gt;$ cd /usr/share/aclocal&lt;br /&gt;$ sudo cp libtool.m4 libtool.m4.org&lt;br /&gt;$ sudo chmod 666 libtool.m4&lt;br /&gt;$ sudo cat lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 &gt;&gt; libtool.m4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これで下記の手順でビルド＆インストールできます！&lt;br /&gt;&lt;pre class="brush: bash"&gt;$ cd subversion-1.4.6&lt;br /&gt;$ ./autogen.sh&lt;br /&gt;$ ./configure&lt;br /&gt;$ make&lt;br /&gt;$ sudo make install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;■参考ページ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugs.launchpad.net/ubuntu/+source/php5/+bug/262251"&gt;https://bugs.launchpad.net/ubuntu/+source/php5/+bug/262251&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-3778169018566375907?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/3778169018566375907/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/ossubversion14x.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3778169018566375907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3778169018566375907'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/ossubversion14x.html' title='最近のOSでsubversion1.4.xがコンパイルしたい'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7558216824108550346</id><published>2011-03-24T01:43:00.000+09:00</published><updated>2011-03-24T01:43:33.025+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>javascriptでの関数内関数について</title><content type='html'>javascriptでの関数内関数について、基礎的な事が良くわかってなかったのでメモしておきます。&lt;br /&gt;ruby on railsのalias_method_chain的な動きをさせたくて&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;function foo() {&lt;br /&gt;  console.debug("foo");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var fooWithoutBar = foo;&lt;br /&gt;&lt;br /&gt;foo = function() {&lt;br /&gt;  console.debug("before foo");&lt;br /&gt;  fooWithoutBar();&lt;br /&gt;  console.debug("after foo");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;foo();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;と書きましたが、これは問題なく動きます。ところが&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;(function() {&lt;br /&gt;  function foo() {&lt;br /&gt;    console.debug("foo");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  var fooWithoutBar = foo;&lt;br /&gt;&lt;br /&gt;  foo = function() {&lt;br /&gt;    console.debug("before foo");&lt;br /&gt;    fooWithoutBar();&lt;br /&gt;    console.debug("after foo");&lt;br /&gt;  }&lt;br /&gt;}());&lt;br /&gt;&lt;br /&gt;foo(); // error&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;は動きません。&lt;b&gt;関数内関数は、本当に関数内関数として動きます！&lt;/b&gt;rubyとは違いますな。。&lt;br /&gt;&lt;br /&gt;8行目の代入がグローバルスコープ？とか考えてしまいましたが&lt;br /&gt;・変数fooはローカルスコープで宣言されている(2行目)&lt;br /&gt;・8行目で変数を探す際、ローカルスコープから探し始める&lt;br /&gt;・ローカルスコープで発見！&lt;br /&gt;・その変数に新しい関数オブジェクトを代入&lt;br /&gt;という訳で、上記の即時関数の外ではfooは見えません。&lt;br /&gt;&lt;br /&gt;ちなみに&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;  var fooWithoutBar = foo;&lt;br /&gt;  ↓&lt;br /&gt;  fooWithoutBar = foo;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;とすると、即時関数外でもfooWithoutBar()は呼び出せます。代入時点ではfooWithoutBarという変数は存在しないのでグローバルスコープの変数となる為と思われます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7558216824108550346?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7558216824108550346/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7558216824108550346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7558216824108550346'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/javascript.html' title='javascriptでの関数内関数について'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2285104572297263677</id><published>2011-03-23T02:01:00.021+09:00</published><updated>2011-03-24T02:12:48.055+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backbonejs'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>backbone.jsをrails3に読み込む為におまじない</title><content type='html'>■概要&lt;br /&gt;&lt;br /&gt;backbone.jsでの開発を始める為に、簡単なgeneratorを作っておくと、うれしいかも&lt;br /&gt;&lt;br /&gt;■手順&lt;br /&gt;&lt;br /&gt;・新規にgeneratorを作成&lt;br /&gt;$ vim lib/generators/backbone_js_generator.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class BackboneJsGenerator &amp;lt; Rails::Generators::Base&lt;br /&gt;&amp;nbsp;&amp;nbsp;desc "This generator downloads and installs json2.js, underscore.js, backbone.js"&lt;br /&gt;&amp;nbsp;&amp;nbsp;def download_json2_js&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;say_status("fetching", "json2.js", :green)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;get "https://github.com/douglascrockford/JSON-js/raw/master/json2.js",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"public/javascripts/json2.js"&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;def download_underscore_js&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;say_status("fetching", "underscore.js", :green)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;download_via_documentcloud("underscore")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;download_via_documentcloud("underscore", "-min")&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;def download_backbone_js&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;say_status("fetching", "backbone.js", :green)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;download_via_documentcloud("backbone")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;download_via_documentcloud("backbone", "-min")&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;private&lt;br /&gt;&amp;nbsp;&amp;nbsp;def download_via_documentcloud(product, suffix = "")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;get "http://documentcloud.github.com/#{product}/#{product}#{suffix}.js",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;"public/javascripts/#{product}#{suffix}.js"&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・generatorを起動し必要なjsをファイルを出力する&lt;br /&gt;$ rails g backbone_js&lt;br /&gt;&lt;br /&gt;・javascript_include_tag用の設定を作成&lt;br /&gt;$ vim config/initializers/backbone_js.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;module BackboneJs&lt;br /&gt;  module Rails&lt;br /&gt;    class Railtie &amp;lt; ::Rails::Railtie&lt;br /&gt;      config.before_configuration do&lt;br /&gt;        config.action_view.javascript_expansions[:backbone] =&lt;br /&gt;          ::Rails.env.production? ? %w(json2 underscore-min backbone-min) : %w(json2 underscore backbone)&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;こうしておけば、application.html.erbとかで &amp;lt;%= javascript_include_tag :backbone %&amp;gt; と書けます。  defaultsに混ぜても良いかもしれませんが画面によっては不要そうなので分けてみました。&lt;br /&gt;&lt;br /&gt;■TODO&lt;br /&gt;gem化(汗)&lt;br /&gt;&lt;br /&gt;■参考&lt;br /&gt;&lt;a href="http://rubygems.org/gems/jquery-rails"&gt;jquery-rails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-2285104572297263677?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2285104572297263677/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/backbonejsrails3.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2285104572297263677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2285104572297263677'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/backbonejsrails3.html' title='backbone.jsをrails3に読み込む為におまじない'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-731629633203456196</id><published>2011-03-23T00:55:00.003+09:00</published><updated>2011-05-31T00:53:04.276+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rvm'/><category scheme='http://www.blogger.com/atom/ns#' term='gem'/><title type='text'>rails関係でよく忘れるコマンドメモ</title><content type='html'>関連するコマンドのオプションを良く忘れるので備忘の為メモしておきます。たまに追加しよう。。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■rvm&lt;/b&gt;&lt;br /&gt;&lt;b&gt;・rvm自体を最新化する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ rvm get head&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ rvm reload&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・rvmにインストール済みの環境リストを参照する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ rvm list&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・rvmが用意してくれている環境リストを参照する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ rvm list known&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・rvmのdefault環境を覚えさせる&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ rvm --default use xxx&lt;/i&gt;&amp;nbsp;← 次回からは自動的に左記環境になる&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■rubygems&lt;/b&gt;&lt;br /&gt;&lt;b&gt;・rubygems自体を最新化する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ gem update --system&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・riとかrdocは不要なので速くインストールしたい&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ gem install xxx --no-ri --no-rdoc&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;これは~/.gemrcに&lt;br /&gt;gem:&amp;nbsp;--no-ri --no-rdoc&lt;br /&gt;って書いておく方が確実かも。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-731629633203456196?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/731629633203456196/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/731629633203456196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/731629633203456196'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/03/rails.html' title='rails関係でよく忘れるコマンドメモ'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6448628997779592848</id><published>2011-02-09T03:16:00.003+09:00</published><updated>2011-02-09T03:20:34.498+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='jeweler'/><title type='text'>RailsInstallerで、jewelerが上手く動かない</title><content type='html'>俺gemをメンテナンスしようと、gem install xxx =&amp;gt; rake test しようとしたら、jewelerが上手く動きませんでした(stack level too deep)。&lt;br /&gt;&lt;br /&gt;調べてみたら原因は簡単でした。jeweler.rbを少し修正すれば動きました。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush :ruby"&gt;def git_base_dir(base_dir = nil)&lt;br /&gt;    if base_dir&lt;br /&gt;      base_dir = File.dirname(base_dir)&lt;br /&gt;    else&lt;br /&gt;      base_dir = File.expand_path(self.base_dir || ".")&lt;br /&gt;    end&lt;br /&gt;    # return nil if base_dir==File.dirname("/") stack level too deep ! on windows&lt;br /&gt;    return nil if base_dir==File.dirname("c:/") # quick fix&lt;br /&gt;    return base_dir if File.exists?(File.join(base_dir, '.git'))&lt;br /&gt;    return git_base_dir(base_dir)&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;.gitディレクトリの無い状態で、上のフォルダにさかのぼって行く物の、ルート判定が *nixスタイルになっているからでした(windowsのルートはc:/とかです。)！&lt;br /&gt;&lt;br /&gt;今日は眠いので本気対応は今度考えます&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6448628997779592848?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6448628997779592848/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/02/railsinstallerjeweler.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6448628997779592848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6448628997779592848'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/02/railsinstallerjeweler.html' title='RailsInstallerで、jewelerが上手く動かない'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7727205574205085747</id><published>2011-02-09T01:48:00.000+09:00</published><updated>2011-02-09T01:48:26.839+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><title type='text'>RailsInstallerを入れた後に、githubにつなぐには</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;&lt;a href="http://railsinstaller.org/"&gt;RailsInstaller&lt;/a&gt;がかなり簡単らしいので、自宅のwindows7環境に入れてみた。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;確かにOne Click!でインストールできました。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;その後gemのメンテナンスをしたかったので、githubに接続するまでのメモを残しておきます。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;（上記のinstallとgithubのアカウント持っている前提です。）&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;○スタート =&amp;gt; すべてのプログラム =&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;RailsInstaller =&amp;gt; Command Prompt with Ruby and Rails&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;○git関係の設定を行う&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git config --global user.name "foobar"&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git config --global user.email "foobar@baz.com"&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git config --global core.autocrlf true&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git config --global core.safecrlf true&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git config --global github.user foobar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;↓https://github.com/accountのアカウント管理からAPIトークンを貼り付け&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt;git config --global github.token 0123456789abcdef0123456789abcdef&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;○githubのssh関係の設定を行う&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; mkdir "%homedrive%%homepath%\.ssh"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; c:\RailsInstaller\Git\bin\ssh-keygen -t rsa -C "foobar@baz.com"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; cat "%homedrive%%homepath%\.ssh\id_rsa.pub" | clip&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;https://github.com/accountのアカウント管理からSSH公開鍵に追加する（クリップボードに張り付いているんのでペースト）&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;○gitからとりだす&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&amp;gt; git clone&amp;nbsp;https://github.com/josh/ruby-coffee-script.git (urlは一例です。)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;■参考&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: fixed-width, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px;"&gt;&lt;a href="http://groups.google.com/group/railsinstaller/msg/a06f5164682bd3cb?pli=1"&gt;http://groups.google.com/group/railsinstaller/msg/a06f5164682bd3cb?pli=1&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7727205574205085747?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7727205574205085747/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/02/railsinstallergithub.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7727205574205085747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7727205574205085747'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/02/railsinstallergithub.html' title='RailsInstallerを入れた後に、githubにつなぐには'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-578883656586763568</id><published>2011-01-29T01:36:00.010+09:00</published><updated>2011-02-01T01:43:43.997+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='wsh'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>CoffeeScriptをWindowsで使う</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;CoffeeScript面白いのですが、*nix系でしか利用できない。と思ってましたが、*.coffee -&amp;gt; *.jsのコンパイルだけならWindowsでも可能な方法を発見したのでご報告します！&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■方法&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;・&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;http://jashkenas.github.com/coffee-script/&lt;/a&gt;&amp;nbsp;からcoffee-scriptをダウンロード。&lt;br /&gt;・解凍して、extras/coffee-script.jsを取り出す。&lt;br /&gt;・coffee-script.jsと同じフォルダに、下記の様な感じでcoffee-scriptコンパイラを利用するスクリプトを作成する&lt;br /&gt;&amp;nbsp;&amp;nbsp;※色々処理はしょってるので要注意！&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;// compiler.js&lt;br /&gt;var fs = WScript.CreateObject("Scripting.FileSystemObject"); &lt;br /&gt;&lt;br /&gt;//coffeescriptを読み込んで評価&lt;br /&gt;var path = WScript.ScriptFullName.replace(WScript.ScriptName,"");&lt;br /&gt;eval(fs.OpenTextFile(path + "coffee-script.js", 1).ReadAll()); &lt;br /&gt;&lt;br /&gt;//&lt;br /&gt;// ここからメインです。&lt;br /&gt;//&lt;br /&gt;var args = WScript.Arguments;&lt;br /&gt;if (args.length == 0) {&lt;br /&gt;  WScript.Echo("error: please Drag And Drop *.coffee file!");&lt;br /&gt;} else {&lt;br /&gt;  for (var i = 0; i &amp;lt; args.length; i++) {&lt;br /&gt;    var src      = fs.OpenTextFile(args.Item(i), 1).ReadAll();&lt;br /&gt;    var compiled = CoffeeScript.compile(src);&lt;br /&gt;    var file     = args.Item(i).replace(".coffee", ".js");&lt;br /&gt;    fs.OpenTextFile(file, 2, true).Write(compiled);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;・*.coffeeなファイルをドラッグ &amp;amp; ドロップすると、*.coffeeと同じフォルダに*.jsが出来上がります！&lt;br /&gt;&lt;br /&gt;■参考&lt;br /&gt;&lt;br /&gt;・JScriptでimport スマートにできないかなぁ&amp;nbsp;&lt;a href="http://d.hatena.ne.jp/TakamiChie/20080403/1207227691"&gt;http://d.hatena.ne.jp/TakamiChie/20080403/1207227691&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;■2011/01/29 12:45&lt;br /&gt;&lt;br /&gt;書き込み時に新規作成フラグtrueがついていませんでしたので修正しました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-578883656586763568?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/578883656586763568/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescriptwindows.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/578883656586763568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/578883656586763568'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescriptwindows.html' title='CoffeeScriptをWindowsで使う'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5123878400148657394</id><published>2011-01-26T01:57:00.006+09:00</published><updated>2011-03-23T01:09:44.230+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='backbonejs'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>rails3とbackbone.jsの組み合わせで利用する2</title><content type='html'>&lt;b&gt;■概要&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://kennyj-jp.blogspot.com/2011/01/rails3backbonejs1.html"&gt;前回&lt;/a&gt;に引き続き、backbone.jsを利用してjqueryでMVCの世界を、rails3と共に作っていこうと思います。&lt;br /&gt;今回はデータのやり取りをする所までが目標です。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■モデル/コントローラ等を作成する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;$ rails g scaffold post title:string body:text published:boolean&lt;br /&gt;$ rake db:migrate&lt;br /&gt;$ rake spec (とりあえずrspecが動くか確認しとく)&lt;br /&gt;$ rake spec:rcov (ついでにrcovが動くか確認しとく)&lt;br /&gt;$ rails s&lt;br /&gt;&lt;br /&gt;ここで http://localhost:3000/posts でいつもの画面が表示されてればOK!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■json入出力用にコントローラを修正する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;とりあえずjsonでやり取りできるように変更します。params.exceptはbackboneとのやり取りを考慮してます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class PostsController &amp;lt; ApplicationController&lt;br /&gt;  respond_to :json&lt;br /&gt;  def index&lt;br /&gt;    @posts = Post.all&lt;br /&gt;    respond_with @posts&lt;br /&gt;  end&lt;br /&gt;  def show&lt;br /&gt;    @post = Post.find(params[:id])&lt;br /&gt;    respond_with @post&lt;br /&gt;  end&lt;br /&gt;  def create&lt;br /&gt;    @post = Post.new(params.except(:action, :controller))&lt;br /&gt;    respond_to do |format|&lt;br /&gt;      if @post.save&lt;br /&gt;        format.json { render :json =&amp;gt; @post, :status =&amp;gt; :created, :location =&amp;gt; @post }&lt;br /&gt;      else&lt;br /&gt;        format.json { render :json =&amp;gt; @post.errors, :status =&amp;gt; :unprocessable_entity }&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  def update&lt;br /&gt;    @post = Post.find(params[:id])&lt;br /&gt;    respond_to do |format|&lt;br /&gt;      if @post.update_attributes(params.except(:id, :action, :controller, :created_at, :updated_at))&lt;br /&gt;        format.json { head :ok }&lt;br /&gt;      else&lt;br /&gt;        format.json { render :json =&amp;gt; @post.errors, :status =&amp;gt; :unprocessable_entity }&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  def destroy&lt;br /&gt;    @post = Post.find(params[:id])&lt;br /&gt;    @post.destroy&lt;br /&gt;    respond_to do |format|&lt;br /&gt;      format.json { head :ok }&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;■jsonのフォーマットを変更する&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;このままだと下記の用に"post"が付いてしまうので、backbone側の期待と異なります。&lt;br /&gt;&lt;br /&gt;http://localhost:3000/posts.json&lt;br /&gt;=&amp;gt; [{&lt;span class="Apple-style-span" style="color: red; font-weight: bold;"&gt;"post"&lt;/span&gt;:{"body":"a","created_at":"2011-01-19T16:13:47Z","id":1,"published":false,"title":"aa","updated_at":"2011-01-19T16:13:47Z"}}]&lt;br /&gt;&lt;br /&gt;http://localhost:3000/posts/1.json&lt;br /&gt;=&amp;gt; {&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;"post"&lt;/span&gt;&lt;/b&gt;:{"body":"a","created_at":"2011-01-19T16:13:47Z","id":1,"published":false,"title":"aa","updated_at":"2011-01-19T16:13:47Z"}}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;config/initializers/include_root_in_json.rb&lt;/b&gt;の様なファイルを作成し&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;ActiveRecord::Base.include_root_in_json = false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;とすると下記の様な感じでgoodです！&lt;br /&gt;&lt;br /&gt;http://localhost:3000/posts.json&lt;br /&gt;=&amp;gt; [{"body":"a","created_at":"2011-01-19T16:13:47Z","id":1,"published":false,"title":"aa","updated_at":"2011-01-19T16:13:47Z"}]&lt;br /&gt;&lt;br /&gt;http://localhost:3000/posts/1.json&lt;br /&gt;=&amp;gt; {"body":"a","created_at":"2011-01-19T16:13:47Z","id":1,"published":false,"title":"aa","updated_at":"2011-01-19T16:13:47Z"}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■backbone用のcontorollerを作成&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;コントローラ/ビューを追加して必要な設定を追加します。&lt;br /&gt;&lt;br /&gt;$ vim controllers/home_controller.rb&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;class HomeController &amp;lt; ApplicationController&lt;br /&gt;  def index&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;$ vim config/routes.rb&lt;br /&gt;&amp;nbsp;&amp;nbsp;root =&amp;gt; "home#index"&lt;br /&gt;$ rm public/index.html&lt;br /&gt;$ mkdir views/home&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■backbone.jsを使ってみる&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim views/home/index.html.erb&lt;/div&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;script&gt;&lt;br /&gt;$(function() {&lt;br /&gt;  // ローカル側のモデル&lt;br /&gt;  window.Post = Backbone.Model.extend({&lt;br /&gt;    url: function() {&lt;br /&gt;      var base = "posts";&lt;br /&gt;      if (this.isNew()) {&lt;br /&gt;        return base;&lt;br /&gt;      } else {&lt;br /&gt;        return base + "/" + this.id;&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  });&lt;br /&gt;  // ローカル側のコレクション&lt;br /&gt;  window.PostList = Backbone.Collection.extend({&lt;br /&gt;    model: Post,&lt;br /&gt;    url: "posts"&lt;br /&gt;  });&lt;br /&gt;  // コレクションをインスタンス化&lt;br /&gt;  window.Posts = new PostList();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  // 実際に使ってみる&lt;br /&gt;&lt;br /&gt;  // 新しいpostを作成&lt;br /&gt;  var post = new Post({title: "test", body: "test", published: true});&lt;br /&gt;  post.save();&lt;br /&gt;&lt;br /&gt;  // 更新といきたい所ですが、saveはajaxでasyncっぽいのでこのままでは無理です&lt;br /&gt;  // post.set({title: "test update"});&lt;br /&gt;  // post.save();&lt;br /&gt;&lt;br /&gt;  // 一覧取得(上記と同じ理由で今回作成分は、更新されていない可能性大です)&lt;br /&gt;  Posts.fetch({success: function(col, res) {&lt;br /&gt;    col.each(function(e) {&lt;br /&gt;      alert(e.get("id") + ":" + e.get("title"));&lt;br /&gt;    });&lt;br /&gt;  }});&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;http://localhost:3000/ を開いて、画面に味気ないalertが表示されればOkay!!&lt;br /&gt;railsのログとDB見てると少しは楽しいかも&lt;br /&gt;&lt;br /&gt;次は画面を作っていきましょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5123878400148657394?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5123878400148657394/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails3backbonejs2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5123878400148657394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5123878400148657394'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails3backbonejs2.html' title='rails3とbackbone.jsの組み合わせで利用する2'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-6092648881643882347</id><published>2011-01-24T00:52:00.004+09:00</published><updated>2011-02-01T01:44:21.554+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>railsにおけるデータファイルの出力三段階</title><content type='html'>画面で選択した検索条件に基づき、データをファイル出力したいという要件は、非常に多いですが、基本に忠実な実装しないとメモリー不足等で大変な事になります。メモリーの利用方法と、応答速度を意識して、改善していきます。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;メモリー展開＋ファイル作成&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;@posts = Post.all&lt;br /&gt;&lt;br /&gt;open(file_name, "wb") do |f|&lt;br /&gt;&amp;nbsp;&amp;nbsp;@posts.each do |post|&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;f.write(post.to_csv + "\r\n")&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;send_file(file_name)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;長所&lt;br /&gt;&amp;nbsp;&amp;nbsp;簡単&lt;br /&gt;&lt;br /&gt;短所&lt;br /&gt;&amp;nbsp;&amp;nbsp;@postsが大量データだった場合に、メモリー不足に陥ります。&lt;br /&gt;&amp;nbsp;&amp;nbsp;ファイルが出来上がるまで応答を返せない。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;フェッチループ＋ファイル作成&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;open(file_name, "wb") do |f|&lt;br /&gt;&amp;nbsp;&amp;nbsp;Post.connection.raw_connection.query("select * from posts", :cache_rows =&amp;gt; false).each do |row|&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;f.write("#{row[0]},#{row[1]}\r\n")&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;send_file(file_name)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;長所&lt;br /&gt;&amp;nbsp;&amp;nbsp;同時に必要なメモリーが削減する事ができる。&lt;br /&gt;&lt;br /&gt;短所&lt;br /&gt;&amp;nbsp;&amp;nbsp;生SQLを書く必要があり、少しとはいえDB依存のコード(raw connection)を書く必要あり。&lt;br /&gt;&amp;nbsp;&amp;nbsp;ファイルが出来上がるまで応答を返せない。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;なおrailsにはbatch方式でのquery発行もありますが、複数回SQLを実行してしまうのでスピード面で問題が出る事が多いです。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;フェッチループ＋ネットワーク転送&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;headers.merge!(&lt;br /&gt;  "Content-Type"              =&amp;gt; "application/octet-stream",&lt;br /&gt;  'Content-Disposition'       =&amp;gt; "attachment; filename=\"test.csv\"",&lt;br /&gt;  'Content-Transfer-Encoding' =&amp;gt; 'binary'&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;self.response_body = proc { |r, o|&lt;br /&gt;  Post.connection.raw_connection.query("select * from posts", :cache_rows =&amp;gt; false).each do |row|&lt;br /&gt;    o.write("#{row[0]},#{row[1]}\r\n")&lt;br /&gt;  end&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;長所&lt;br /&gt;&amp;nbsp;&amp;nbsp;同時に必要なメモリーが削減する事ができる。&lt;br /&gt;&amp;nbsp;&amp;nbsp;途中で応答が返せる（ネットワーク例外を途中で捕捉できるので尚良しです）。&lt;br /&gt;&lt;br /&gt;短所&lt;br /&gt;&amp;nbsp;&amp;nbsp;生SQLを書く必要があり、少しとはいえDB依存のコード(raw connection)を書く必要あり。&lt;br /&gt;&lt;br /&gt;※webrickでは応答は最後になってしまうので注意&lt;br /&gt;※rails3になってまた変わったみたい。&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client"&gt;http://stackoverflow.com/questions/3507594/ruby-on-rails-3-streaming-data-through-rails-to-client&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;結論&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;要件に応じてメモリー展開＋ネットワーク転送(簡単)、もしくは、フェッチループ＋ネットワーク転送(無敵)が良いと思う。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2011/01/25 追記&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;よく考えたらrails3になってArelが導入されたおかげで、sqlは構築するのが楽になりましたね。。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;Post.where("created_at &amp;lt; ?", Time.now).to_sql&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-6092648881643882347?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/6092648881643882347/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6092648881643882347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/6092648881643882347'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails.html' title='railsにおけるデータファイルの出力三段階'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-5364872757007280795</id><published>2011-01-23T19:53:00.006+09:00</published><updated>2011-01-23T20:03:51.750+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>BloggerでSyntaxHighlighterを利用する</title><content type='html'>ブログ上でプログラムの断片を表示する場合、シンタックス・ハイライト機能があれば見やすいですよね。ネットで調べると様々な方法が出てきますが、色々と現状（？）にあってない気もしたので、メモとっておきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・テンプレートに必要なjavascript・cssを読み込む&lt;/b&gt;。&lt;br /&gt;&lt;br /&gt;デザイン -&amp;gt; HTMLの編集 -&amp;gt; テンプレートの編集のheadタグの中に下記を記載。&lt;br /&gt;ここではjavascriptとshのみ読み込んでいます。なうなヤングは、onloadはjqueryとかなんでしょうか？！&lt;br /&gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/&amp;gt;&lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/&amp;gt;&lt;br /&gt;&amp;lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/&amp;gt;&lt;br /&gt;&amp;lt;script type='text/javascript'&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;window.onload = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;SyntaxHighlighter.autoloader(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'js jscript javascript http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;'bash shell http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js'&lt;br /&gt;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;SyntaxHighlighter.all();&lt;br /&gt;};&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・投稿側でpreタグで囲む&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;pre class="brush: js"&amp;gt;&lt;br /&gt;var x = 0;&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;・参考&lt;/b&gt;&lt;br /&gt;本家&amp;nbsp;&lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;http://alexgorbatche&lt;/a&gt;&lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;v.com/SyntaxHighlighter/&lt;/a&gt;　対応している言語はこちらで調べて下さい。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"&gt;&lt;script src='http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js' type='text/javascript'/&gt;&lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/&gt;&lt;link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/&gt;&lt;script type='text/javascript'&gt;window.onload = function() {SyntaxHighlighter.autoloader('js jscript javascript http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js','bash shell http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js'); SyntaxHighlighter.all();};&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-5364872757007280795?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/5364872757007280795/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/bloggersyntaxhighlighter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5364872757007280795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/5364872757007280795'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/bloggersyntaxhighlighter.html' title='BloggerでSyntaxHighlighterを利用する'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8820483096068098805</id><published>2011-01-19T01:25:00.008+09:00</published><updated>2011-01-23T19:44:57.391+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='centos'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>mod_proxy_html をあきらめて mod_substitute を試した</title><content type='html'>リバースプロキシ越しに、内部のサーバへ転送したいのですが、良くあるのが、パスがずれる問題。&lt;br /&gt;&lt;br /&gt;何とかならんかなと調べてると、mod_proxy_html を利用すると、hrefを変換かけたり出来るようですが、centos5 でかなり悩んだのですが、、、、上手くいきません（全く効いていない？）。どうしようか悩んだ所&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://sikakugets.seesaa.net/article/171702220.html"&gt;http://sikakugets.seesaa.net/article/171702220.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;の様な話があり、mod_substitute を試そうと思いました。&lt;br /&gt;&lt;br /&gt;ところが mod_substitue は apache2.2.7 から標準添付らしく、centos5 の apache2.2.3 には付いてないのです！&amp;nbsp;さらに悩んだ所&lt;br /&gt;&lt;br /&gt;&lt;a href="http://corpocrat.com/2008/09/19/install-apache-mod_substitute/"&gt;http://corpocrat.com/2008/09/19/install-apache-mod_substitute/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;を発見！ソースだけ取ってきて apxs でコンパイルかけちゃうみたいです。&lt;br /&gt;という訳で&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;#&amp;nbsp;wget http://www.meisei-u.ac.jp/mirror/apache/dist//httpd/httpd-2.2.17.tar.gz&lt;br /&gt;#&amp;nbsp;tar zxvf httpd-2.2.17.tar.gz&lt;br /&gt;#&amp;nbsp;cd httpd-2.2.17/modules/filters/&lt;br /&gt;#&amp;nbsp;cp mod_substitute.c /tmp&lt;br /&gt;# cd /tmp&lt;br /&gt;#&amp;nbsp;apxs -aic mod_substitute.c&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これでインストールが完了するので、少し設定&lt;br /&gt;～&lt;br /&gt;AddOutputFilterByType SUBSTITUTE text/html&lt;br /&gt;Substitute s/inner.domain.com/mydomain.com/n&lt;br /&gt;～&lt;br /&gt;&lt;br /&gt;再起動後見てみると！！上手く動きました。感謝、感謝です。ちょっと怖いけど動いてるからいっか。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8820483096068098805?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8820483096068098805/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/modproxyhtml-modsubstitute.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8820483096068098805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8820483096068098805'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/modproxyhtml-modsubstitute.html' title='mod_proxy_html をあきらめて mod_substitute を試した'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-2245156885701869811</id><published>2011-01-11T12:30:00.020+09:00</published><updated>2011-04-16T00:43:43.357+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='backbonejs'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>rails3とbackbone.jsの組み合わせで利用する1</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■概要&lt;br /&gt;backendをrails3にして、backbone.jsを利用する為の手順を残しておきます。&lt;br /&gt;&lt;br /&gt;■railsプロジェクトの作成&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rails new demo -T -J -d mysql&lt;br /&gt;demo プロジェクト名&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-T testunitはいらない&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-J prototype.jsはいらない&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;-d mysql データベースはmysql&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■gemを追加&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ cd demo&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim Gemfile&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;下記を一番下に追加（本当はバージョンをつけた方が良い）&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;gem 'jquery-rails'&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;group :development, :test do&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp;gem 'rspec'&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp;gem 'rspec-rails'&lt;br /&gt;&amp;nbsp;&amp;nbsp;gem 'rcov'&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;end&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ bundle install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■コードジェネレート&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rails g rspec:install&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rails g jquery:install --ui&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■まず使えるように編集&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim config/database.yml&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;$ vim app/views/layouts/application.html.erb&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;文字列エンコーディングを明確に指定する為に下記追加&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&amp;lt;meta charset="utf-8"/&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim config/application.rb&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;jquery-railsに、javascriptのdefaults設定はまかせる(コメントアウトする)&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;# config.action_view.javascript_expansions[:defaults] = %w()&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;※&lt;a href="https://github.com/indirect/jquery-rails/blob/master/lib/jquery-rails.rb"&gt;これ&lt;/a&gt;を有効にしたい&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;$ vim spec/spec_helper.rb&lt;br /&gt;&lt;br /&gt;ruby1.9.2でrcovを正しく動作させる為に、下記を一番下に追加&lt;br /&gt;# quick monkey patch for rcov&lt;br /&gt;# http://codefluency.com/post/1023734493/a-bandaid-for-rcov-on-ruby-1-9&lt;br /&gt;if defined?(Rcov)&lt;br /&gt;&amp;nbsp;&amp;nbsp;class Rcov::CodeCoverageAnalyzer&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;def update_script_lines__&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;if '1.9'.respond_to?(:force_encoding)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SCRIPT_LINES__.each do |k,v|&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;v.each { |src| src.force_encoding('utf-8') }&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;end&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;@script_lines__ = @script_lines__.merge(SCRIPT_LINES__)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;end&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;end&lt;br /&gt;&lt;div&gt;&lt;br /&gt;$ vim .rspec&lt;br /&gt;spork等で動いてもいい様に下記を追加しておく&lt;br /&gt;--drb&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■backbone.jsの準備&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ cd public/javascripts&lt;br /&gt;↓jsファイル取得。ここも本当はバージョンを明示すべきかな&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ wget&amp;nbsp;http://documentcloud.github.com/underscore/underscore.js&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ wget&amp;nbsp;http://documentcloud.github.com/underscore/underscore-min.js&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ wget http://documentcloud.github.com/backbone/backbone.js&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ wget http://documentcloud.github.com/backbone/backbone-min.js&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ cd ../..&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim app/views/layouts/application.html.erb&lt;br /&gt;backbone.jsを読み込むようにする。下記をhead内に追加&lt;/div&gt;&lt;div&gt;&amp;lt;%= javascript_include_tag "underscore-min.js", "backbone-min.js" %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■履歴管理開始&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ vim .gitignore (履歴管理しない最低限のものを追加)&lt;br /&gt;&lt;br /&gt;.bundle&lt;br /&gt;db/*.db&lt;br /&gt;db/*.sqlite3&lt;br /&gt;db/schema.rb&lt;br /&gt;log/*.log&lt;br /&gt;tmp/&lt;br /&gt;coverage/&lt;br /&gt;*.swp&lt;br /&gt;&lt;br /&gt;$ git init&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ git add .&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ git commit -m "最初のコミット"&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■DB作成&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rake db:create:all&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rake db:migrate&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;■起動&lt;/div&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;$ rails s&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;ここまでで準備完了！次は実際にデータの操作をしてみます&lt;br /&gt;&lt;br /&gt;&lt;b&gt;20110113 追記&lt;/b&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/nedate/20101004/1286183882"&gt;http://d.hatena.ne.jp/nedate/20101004/1286183882&lt;/a&gt;を参考にrcovの設定も追加させてもらいました！&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-2245156885701869811?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/2245156885701869811/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails3backbonejs1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2245156885701869811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/2245156885701869811'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/rails3backbonejs1.html' title='rails3とbackbone.jsの組み合わせで利用する1'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-4733930311921488967</id><published>2011-01-04T00:25:00.011+09:00</published><updated>2011-01-04T00:57:45.072+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='bdd'/><category scheme='http://www.blogger.com/atom/ns#' term='jasmine'/><title type='text'>CoffeeScript面白そう2</title><content type='html'>&lt;a href="http://kennyj-jp.blogspot.com/2011/01/coffeescript.html"&gt;前回&lt;/a&gt;インストールしてみた&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt;だが、&lt;a href="http://pivotal.github.com/jasmine/"&gt;jasmine&lt;/a&gt;と組み合わせるとこんな感じで、javascriptのspecが書けた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;describe "String クラスは", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;str = ""&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;beforeEach -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;str = "jasmine"&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;it "split メソッドを持っている", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;expect(str.split).toBeDefined()&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;describe "ネストは", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;it "当然いけます", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;expect(str).toEqual("jasmine")&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;オリジナルのjasmine specと比較して良いのは&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;{}&amp;nbsp;&lt;/b&gt;とか&amp;nbsp;&lt;b&gt;()&amp;nbsp;&lt;/b&gt;とか&amp;nbsp;&lt;b&gt;;&amp;nbsp;&lt;/b&gt;が激減している&lt;/li&gt;&lt;li&gt;functionって書かなくて良い&lt;/li&gt;&lt;li&gt;varも書かなくて良い&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;辺りでしょうか。本気で使うなら課題は&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;coffeeの実行(*.coffee -&amp;gt; *.jsにコンパイル)を自動化&lt;/li&gt;&lt;li&gt;expect ～ toEqualとかをもっと"rspec"らしくしたい&lt;/li&gt;&lt;li&gt;上の"str"をrspecっぽく何とかしたい（無理かな？）&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;といった所かな。少し考えるか。。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2011/01/04 0:52 追記&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;変数にrubyっぽく@をつけて(thisとバインド)、上記は&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;describe "String クラスは", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;beforeEach -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@str = "jasmine"&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;it "split メソッドを持っている", -&amp;gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;expect(@str.split).toBeDefined()&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;で動くんだ。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-4733930311921488967?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/4733930311921488967/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescript2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4733930311921488967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/4733930311921488967'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescript2.html' title='CoffeeScript面白そう2'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-1229915929223010744</id><published>2011-01-03T21:53:00.010+09:00</published><updated>2011-01-03T22:44:11.500+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffeescript'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='nodejs'/><title type='text'>CoffeeScript面白そう</title><content type='html'>&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&lt;/a&gt;とは「javascript悪くないけどね...文法がちょっと...」という人の為の言語で、&lt;br /&gt;コンパイルすると&lt;b&gt;javascriptのソース&lt;/b&gt;が出力されます。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ruby(やpython)が大好き&lt;/li&gt;&lt;li&gt;"var"って書くのを忘れる&lt;/li&gt;&lt;li&gt;"function"って綴り長げー&lt;/li&gt;&lt;li&gt;"return"書きたくない&lt;/li&gt;&lt;li&gt;"if"を一行で書きたい&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;という私にぴったり。ちなみに&lt;a href="http://www.infoq.com/jp/news/2006/01/languages-on-javascript"&gt;37 signalsも使っている&lt;/a&gt;らしいですね&lt;br /&gt;&lt;br /&gt;下記は「centos 5.5」に動く環境を作成するまでの記録です(2011/1/3現在)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■node.jsのインストール(v8もインストールされるようです)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;# wget http://nodejs.org/dist/node-v0.2.6.tar.gz&lt;br /&gt;# tar zxvf node-v0.2.6.tar.gz&lt;br /&gt;# cd node-v0.2.6&lt;br /&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;(# make test)&lt;br /&gt;# make install&lt;br /&gt;&lt;br /&gt;centos5.xにはshasumコマンドが存在しないようので、make testでエラーが発生します。&lt;br /&gt;&lt;a href="http://groups.google.com/group/nodejs/browse_thread/thread/4f8290fc06baab3b?pli=1"&gt;http://groups.google.com/group/nodejs/browse_thread/thread/4f8290fc06baab3b?pli=1&lt;/a&gt;&lt;br /&gt;の様な話があるので&lt;br /&gt;&lt;br /&gt;# ln -s /usr/bin/sha1sum /usr/bin/shasum&lt;br /&gt;&lt;br /&gt;としておけば、落ちたテストは通ります。&lt;br /&gt;(上記を実行しても私の環境的に multicast はテストが通りません...)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■npm(the Node Package Manager)のインストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;# curl http://npmjs.org/install.sh | sh&lt;br /&gt;&lt;br /&gt;# npm -v (確認)&lt;br /&gt;0.2.13-3&lt;br /&gt;&lt;br /&gt;危ないからrootで実行するなとか言われましたが「It worked」だそうなのでほっときました。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■coffee scriptのインストール&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;# npm install coffee-script&lt;br /&gt;# coffee -v (確認)&lt;br /&gt;CoffeeScript version 1.0.0&lt;br /&gt;&lt;br /&gt;&lt;b&gt;■とりあえず実行してみる&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;# vim test.coffee で下記のように記載&lt;br /&gt;&lt;br /&gt;debug = (x) -&amp;gt; console.log(x)&lt;br /&gt;debug num for num in [1, 2, 3]&lt;br /&gt;&lt;br /&gt;# coffee test.coffee&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;って表示されればOkay!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;あとは、&lt;a href="http://jashkenas.github.com/coffee-script/"&gt;CoffeeScript&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/6648305517577816468-1229915929223010744?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/1229915929223010744/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1229915929223010744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/1229915929223010744'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2011/01/coffeescript.html' title='CoffeeScript面白そう'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-7590205826857135342</id><published>2010-12-29T01:12:00.001+09:00</published><updated>2011-01-03T22:49:23.772+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>基本的に...</title><content type='html'>「基本的に」とか、「原則として」が、会議の中で出てくる事が多いが、(経験を積んだエンジニアは良く知っている事ですが）放置しておくと&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;間違いなく危ない場合&lt;/span&gt;&lt;/b&gt;が多い。&lt;br /&gt;&lt;br /&gt;基本的に～であるという事は、裏を返せば基本的に～ではないケースが存在するという事。&lt;br /&gt;&lt;br /&gt;例１）　原則的には、そこの関係は、1:1です！&lt;br /&gt;答え) &amp;nbsp;最低でも、1:nで考えておかないと後で不味い事に。。ヒアリング必須&lt;br /&gt;&lt;br /&gt;例２）　基本的に、その資料は担当者に返します。&lt;br /&gt;答え） 担当者以外に誰が受け取るかヒアリングする&lt;br /&gt;&lt;br /&gt;ITシステムでは、ロジックで処理をしなければいけない為、処理がMECEになっている必要があります。「基本的に」とかではぐらかしてきたら、逆に突っ込んで聞きましょう！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-7590205826857135342?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/7590205826857135342/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7590205826857135342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/7590205826857135342'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/blog-post.html' title='基本的に...'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-3010320501708529307</id><published>2010-12-29T00:31:00.000+09:00</published><updated>2010-12-29T00:31:01.016+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>distinctってそんなに使うのか？</title><content type='html'>SQLのdistinctは使い所によっては、必要なキーワードだが、訳も分からず使われている事も多い。「膨らんだから書いとけ！」見たいな感じで。&lt;br /&gt;&lt;br /&gt;若者のSQLを見ていると、同じ使い方が多いことに気づいた。例えば&lt;br /&gt;&lt;br /&gt;foo: &lt;u&gt;id&lt;/u&gt;, name&lt;br /&gt;bar: &lt;u&gt;id&lt;/u&gt;, foo_id, flag&lt;br /&gt;&lt;br /&gt;というテーブル構成で、「barでflagがたっているfooの行を取得」が課題だった場合&lt;br /&gt;&lt;br /&gt;select&lt;br /&gt;&amp;nbsp;&amp;nbsp;f.id, f.name&lt;br /&gt;from&lt;br /&gt;&amp;nbsp;&amp;nbsp;foo f inner join bar b on b.foo_id = f.id&lt;br /&gt;where&lt;br /&gt;&amp;nbsp;&amp;nbsp;b.flag = true&lt;br /&gt;&lt;br /&gt;と書いてしまったが為に、最終的にselect句にdistinctをつけるはめに。。&lt;br /&gt;&lt;br /&gt;これは「fooからデータを取得する際の抽出条件」と認識すれば&lt;br /&gt;&lt;br /&gt;select&lt;br /&gt;&amp;nbsp;&amp;nbsp;f.id, f.name&lt;br /&gt;from&lt;br /&gt;&amp;nbsp;&amp;nbsp;foo f&lt;br /&gt;where&lt;br /&gt;&amp;nbsp;&amp;nbsp;exists (select 'x' from bar b where b.foo_id = f.id and b.flag = true)&lt;br /&gt;&lt;br /&gt;と書けるはずで、distinct は不要だ。&lt;br /&gt;&lt;br /&gt;selectは、縦*横の新しい表を取得する物で、「１行が意味する概念」は何かを、はっきり意識できていないからではと思う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-3010320501708529307?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/3010320501708529307/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/distinct.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3010320501708529307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/3010320501708529307'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/distinct.html' title='distinctってそんなに使うのか？'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-288475939579554242</id><published>2010-12-28T23:44:00.003+09:00</published><updated>2011-08-02T22:29:48.729+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>CSVというフォーマット</title><content type='html'>データ交換の検討で、「ここはCSVで」とかで会議終わらせちゃう人もいますが、アフォかと思います。&lt;br /&gt;&lt;br /&gt;"CSV"だけでは、フォーマットがあるようでないのと同じです。細かい事が詰まってないので、下記は最低決めちゃいましょう。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;文字列エンコーディング（例 Windows-31J）&lt;/li&gt;&lt;li&gt;改行コード (例 CRLF)&lt;/li&gt;&lt;li&gt;"の使い方。業務上EXCELで作業される方が多いので、私は下記で話する事が多いです。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;セル内に , がある場合は、"で囲む&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;セル内に " がある場合は、"で囲み、"は""とエスケープする&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;セル内に改行がある場合は、"で囲む&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;上記の仕様ってEXCELで色々なパターンを入力し、CSVを出力後テキストエディタで開けば一目瞭然なんですが、割と知られてないようですね。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-288475939579554242?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/288475939579554242/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/csv.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/288475939579554242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/288475939579554242'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/csv.html' title='CSVというフォーマット'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6648305517577816468.post-8215279375067227615</id><published>2010-12-28T22:53:00.004+09:00</published><updated>2011-08-02T22:27:27.807+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rack'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>rails2.3.5のマルチパート解析ではまった</title><content type='html'>&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;概要&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;rails2.3.5、正確にはrack1.0.1のマルチパート解析処理に問題があり、データの欠落する可能性があります。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;問題&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;「チェックボックスがおかしな状態になる」という問い合わせがあり調査開始しました。ほどなく"ごくまれ"にチェックボックスの入力状態が正しく反映されないケースがある事に気付きました。&lt;br /&gt;&lt;br /&gt;切り分けの為、問題箇所を確認した所&lt;br /&gt;&lt;ul&gt;&lt;li&gt;パケットダンパーでデータを確認すると、socket通信上は想定値が確認できた。&lt;/li&gt;&lt;li&gt;例外メール上の記録から、railsでのparamsには、おかしな値が入っている。&lt;/li&gt;&lt;li&gt;上記メールから、rackより引き継いだ段階でも、おかしな値が入っている。&lt;/li&gt;&lt;/ul&gt;という事が判明しました。これで犯人は、apache か passenger か rack に絞られました。&lt;br /&gt;&lt;br /&gt;そこで、Rack::Utils::Multipart.parse_multipartメソッドにログを仕込んで確認した所&lt;br /&gt;&lt;ul&gt;&lt;li&gt;content_lengthは想定どおりの値が確認できた。&lt;/li&gt;&lt;li&gt;io上入ってきた内容も想定どおり確認できた。&lt;/li&gt;&lt;li&gt;処理ループが想定よりもかなり早い段階で抜けている。但し例外は発生していない。&lt;/li&gt;&lt;/ul&gt;と言う事がわかりました。&lt;br /&gt;上手くいかない場合は、変数の動きをみていると、buf変数に一度読み込まれるだけで、後続のデータが処理されていません。&lt;br /&gt;&lt;span class="Apple-style-span" style="line-height: 17px; white-space: pre;"&gt;&lt;span class="mi" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="line-height: 22px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;解決&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="line-height: 22px; white-space: pre;"&gt;buf変数に読み込んだデータを逐次処理していきますが、バウンダリ＋EOL(\r\n)で丁度処理が終了した場合、buf.empty?が真となり、bufに読み込まれていないデータがあっても処理終了になっているようです。&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 22px; white-space: pre;"&gt;よって上記を&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 22px; white-space: pre;"&gt;&lt;a href="https://github.com/chneukirchen/rack/blob/a9440bc752be9b3093669614c6b56bf78d592958/lib/rack/utils.rb"&gt;rack1.1.xで修正されている&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 22px; white-space: pre;"&gt;ように&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;break if (buf.empty? &amp;&amp; $1 != EOL) || content_length == -1&lt;br /&gt;&lt;br /&gt;&lt;span class="mi" style="line-height: 1.4em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;とする必要があるようです($1 != EOLを追加)。&lt;br /&gt;しかしrack1.1とrails2.3.5は相性が悪いみたいなので、モンキーパッチで対処する必要がありますね。&lt;/span&gt;&lt;br /&gt;下記のような内容をconfig/initializers/rack_patch.rbとかで配置して下さい。&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;module Rack&lt;br /&gt;  module Utils&lt;br /&gt;    module Multipart&lt;br /&gt;      def self.parse_multipart(env)&lt;br /&gt;        unless env['CONTENT_TYPE'] =~&lt;br /&gt;            %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n&lt;br /&gt;          nil&lt;br /&gt;        else&lt;br /&gt;          boundary = "--#{$1}"&lt;br /&gt;&lt;br /&gt;          params = {}&lt;br /&gt;          buf = ""&lt;br /&gt;          content_length = env['CONTENT_LENGTH'].to_i&lt;br /&gt;          input = env['rack.input']&lt;br /&gt;          input.rewind&lt;br /&gt;&lt;br /&gt;          boundary_size = Utils.bytesize(boundary) + EOL.size&lt;br /&gt;          bufsize = 16384&lt;br /&gt;&lt;br /&gt;          content_length -= boundary_size&lt;br /&gt;&lt;br /&gt;          read_buffer = ''&lt;br /&gt;&lt;br /&gt;          status = input.read(boundary_size, read_buffer)&lt;br /&gt;          raise EOFError, "bad content body"  unless status == boundary + EOL&lt;br /&gt;&lt;br /&gt;          rx = /(?:#{EOL})?#{Regexp.quote boundary}(#{EOL}|--)/n&lt;br /&gt;&lt;br /&gt;          loop {&lt;br /&gt;            head = nil&lt;br /&gt;            body = ''&lt;br /&gt;            filename = content_type = name = nil&lt;br /&gt;&lt;br /&gt;            until head &amp;amp;&amp;amp; buf =~ rx&lt;br /&gt;              if !head &amp;amp;&amp;amp; i = buf.index(EOL+EOL)&lt;br /&gt;                head = buf.slice!(0, i+2) # First \r\n&lt;br /&gt;                buf.slice!(0, 2)          # Second \r\n&lt;br /&gt;&lt;br /&gt;                filename = head[/Content-Disposition:.* filename=(?:"((?:\\.|[^\"])*)"|([^;\s]*))/ni, 1]&lt;br /&gt;                content_type = head[/Content-Type: (.*)#{EOL}/ni, 1]&lt;br /&gt;                name = head[/Content-Disposition:.*\s+name="?([^\";]*)"?/ni, 1] || head[/Content-ID:\s*([^#{EOL}]*)/ni, 1]&lt;br /&gt;&lt;br /&gt;                if content_type || filename&lt;br /&gt;                  body = Tempfile.new("RackMultipart")&lt;br /&gt;                  body.binmode  if body.respond_to?(:binmode)&lt;br /&gt;                end&lt;br /&gt;&lt;br /&gt;                next&lt;br /&gt;              end&lt;br /&gt;&lt;br /&gt;              # Save the read body part.&lt;br /&gt;              if head &amp;amp;&amp;amp; (boundary_size+4 &amp;lt; buf.size)&lt;br /&gt;                body &amp;lt;&amp;lt; buf.slice!(0, buf.size - (boundary_size+4))&lt;br /&gt;              end&lt;br /&gt;&lt;br /&gt;              c = input.read(bufsize &amp;lt; content_length ? bufsize : content_length, read_buffer)&lt;br /&gt;              raise EOFError, "bad content body"  if c.nil? || c.empty?&lt;br /&gt;              buf &amp;lt;&amp;lt; c&lt;br /&gt;              content_length -= c.size&lt;br /&gt;            end&lt;br /&gt;&lt;br /&gt;            # Save the rest.&lt;br /&gt;            if i = buf.index(rx)&lt;br /&gt;              body &amp;lt;&amp;lt; buf.slice!(0, i)&lt;br /&gt;              buf.slice!(0, boundary_size+2)&lt;br /&gt;&lt;br /&gt;              content_length = -1  if $1 == "--"&lt;br /&gt;            end&lt;br /&gt;&lt;br /&gt;            if filename == ""&lt;br /&gt;              # filename is blank which means no file has been selected&lt;br /&gt;              data = nil&lt;br /&gt;            elsif filename&lt;br /&gt;              body.rewind&lt;br /&gt;&lt;br /&gt;              # Take the basename of the upload's original filename.&lt;br /&gt;              # This handles the full Windows paths given by Internet Explorer&lt;br /&gt;              # (and perhaps other broken user agents) without affecting&lt;br /&gt;              # those which give the lone filename.&lt;br /&gt;              filename =~ /^(?:.*[:\\\/])?(.*)/m&lt;br /&gt;              filename = $1&lt;br /&gt;&lt;br /&gt;              data = {:filename =&amp;gt; filename, :type =&amp;gt; content_type,&lt;br /&gt;                      :name =&amp;gt; name, :tempfile =&amp;gt; body, :head =&amp;gt; head}&lt;br /&gt;            elsif !filename &amp;amp;&amp;amp; content_type&lt;br /&gt;              body.rewind&lt;br /&gt;              &lt;br /&gt;              # Generic multipart cases, not coming from a form&lt;br /&gt;              data = {:type =&amp;gt; content_type,&lt;br /&gt;                      :name =&amp;gt; name, :tempfile =&amp;gt; body, :head =&amp;gt; head}&lt;br /&gt;            else&lt;br /&gt;              data = body&lt;br /&gt;            end&lt;br /&gt;&lt;br /&gt;            Utils.normalize_params(params, name, data) unless data.nil?&lt;br /&gt;&lt;br /&gt;            # break  if buf.empty? || content_length == -1&lt;br /&gt;            break  if (buf.empty? &amp;amp;&amp;amp; $1 != EOL) || content_length == -1&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;          input.rewind&lt;br /&gt;&lt;br /&gt;          params&lt;br /&gt;        end&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6648305517577816468-8215279375067227615?l=kennyj-jp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kennyj-jp.blogspot.com/feeds/8215279375067227615/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/rails235.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8215279375067227615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6648305517577816468/posts/default/8215279375067227615'/><link rel='alternate' type='text/html' href='http://kennyj-jp.blogspot.com/2010/12/rails235.html' title='rails2.3.5のマルチパート解析ではまった'/><author><name>kennyj</name><uri>http://www.blogger.com/profile/06686486481177575296</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-Xg_-0UyKOWs/Ty_3G173KiI/AAAAAAAAAFc/MhYP9ODRbIk/s220/e34583e315dc9ce4e007fa07afadaf39.jpeg'/></author><thr:total>0</thr:total></entry></feed>
