tag:blogger.com,1999:blog-66483055175778164682024-02-07T21:47:14.761+09:00kennyjのブログ(仮)ruby / railsの話題を中心になにやら書いていきます。kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.comBlogger76125tag:blogger.com,1999:blog-6648305517577816468.post-8137290264013977162013-09-05T20:22:00.001+09:002013-09-05T20:22:51.517+09:00関西Ruby会議05でのプレゼンの製作について<h3>
<span style="color: red;"><u>■概要</u></span></h3>
<br />
先日、<a href="http://regional.rubykaigi.org/kansai05">関西Ruby会議05</a>が開催されました。大変面白く為になる一日でした。実行委員 / スタッフの皆様、スピーカーの皆様お疲れ様です!<br />
<br />
さて幸運にも、そのイベントで招待講演をさせて頂きました。公での40分・100人超という、私にとっては未体験ゾーンでのプレゼンです。<br />
<br />
当日のプレゼンの出来は、自分ではわかりませんが、それなりに工夫をして作ったのは間違いないので、吐き出せるものは吐き出しておこうと思い、このエントリを書きはじめました。<br />
<br />
少し長いですがお付き合い頂ければと思います。<br />
<br />
ちなみに当日の発表資料は<a href="http://www.slideshare.net/kennyj1976/20130831ruby05">こちら</a>です。合わせて御覧頂けたら幸いです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCqmta5IUXl0l2hk6u3gn6YUpRHBHiIDA-XP1ktm-itvuY_fFSOhBkQhTIo8pwWXr4Op-VR8p2N2Rox6d4pefXiv9Mv-FN0X12NuBLz3nJh4I53H7-UziEvfa5NYz6FM9nhN97TdgYUMo/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%891.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCqmta5IUXl0l2hk6u3gn6YUpRHBHiIDA-XP1ktm-itvuY_fFSOhBkQhTIo8pwWXr4Op-VR8p2N2Rox6d4pefXiv9Mv-FN0X12NuBLz3nJh4I53H7-UziEvfa5NYz6FM9nhN97TdgYUMo/s200/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%891.PNG" width="200" /></a></div>
<br />
<br />
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<div>
<span style="color: red;"><u><br /></u></span></div>
<h3>
<span style="color: red;"><u>■きっかけ</u></span></h3>
<br />
2013/05/12 12:15。その時私は<a href="http://ikoma36-park.jp/">生駒山麓公園</a>という所で、子供とアスレチックをしておりました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFjwhFgHLrsmQbs9RijCI-NlvFOzq1BrdiiH_ndG7MBlk3mkB3kK9V49I0mPtjSWOijUO2Fr7ahcrI9RHJ5Qf38aomiuWd8pExOr4r63GW-Js3YB4kTVH6-OCrWKzU6IUnQnvzywY-ivQ/s1600/%E5%86%99%E7%9C%9F.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFjwhFgHLrsmQbs9RijCI-NlvFOzq1BrdiiH_ndG7MBlk3mkB3kK9V49I0mPtjSWOijUO2Fr7ahcrI9RHJ5Qf38aomiuWd8pExOr4r63GW-Js3YB4kTVH6-OCrWKzU6IUnQnvzywY-ivQ/s320/%E5%86%99%E7%9C%9F.JPG" width="320" /></a></div>
<br />
<br />
すると突然、実行委員の <b><a href="https://twitter.com/agilekawabata">@agilekawabata</a></b> さんからTwitterのDMが届き<br />
<i><b>「関西Ruby会議(08/31)にて講演どうですかー?」</b></i><br />
ときたので<br />
<i><b>「お、イイですね!させて頂きます。」</b></i><br />
と軽い気持ちで答えてしまいました。<br />
<br />
その時、まさか<span style="color: red;"><b>招待講演</b></span>という重責とはつゆ知らずでしたが、受けてしまったので何とかしようと考えました。<br />
「<a href="http://d.hatena.ne.jp/keyword/%C0%B5%B5%A4%A4%C7%A4%B9%A4%AB%A1%A9">正気ですか?</a>」と叫びたくはなりましたが。<br />
<br />
<h3>
<span style="color: red;"><u>■書籍</u></span></h3>
<br />
以前よりRuby会議やその他のカンファレンスでの素晴らしい発表を見て、プレゼンをするという事に興味を持った事もあり、社内では過去三年ぐらいプレゼン勉強会を主催しています。元々社内で「プレゼンテーションZENが面白い」といった所、賛同してくれる人がおり勉強会に発展しました。<br />
<br />
読まれた方も多いと思いますが、上記の「<a href="http://www.amazon.co.jp/%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3Zen-%E7%AC%AC2%E7%89%88-%E3%82%AC%E3%83%BC%E3%83%BB%E3%83%AC%E3%82%A4%E3%83%8E%E3%83%AB%E3%82%BA/dp/4864010870">プレゼンテーションZEN</a>」という書籍が<br />
(出来ているかどうかは別にして)私のプレゼンスタイルに与えた影響はかなり大きいです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp1o3obVTNamvnDWTC0VIS_c0x213T64lMyxOxfhuFgmREWM3xusMtzcnTyPl26KTJaCuVYGdn22DwYV0IyzstGGL8z3dxxXu77-azhhFKsWtIhP3C7CcoTRekyJpQR_SRnFWrFZgnAw/s1600/41ltF0IDucL._SL500_AA300_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRp1o3obVTNamvnDWTC0VIS_c0x213T64lMyxOxfhuFgmREWM3xusMtzcnTyPl26KTJaCuVYGdn22DwYV0IyzstGGL8z3dxxXu77-azhhFKsWtIhP3C7CcoTRekyJpQR_SRnFWrFZgnAw/s200/41ltF0IDucL._SL500_AA300_.jpg" width="200" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
後もう一冊非常にオススメなのが、ナンシー・デュアルテの「<a href="http://www.amazon.co.jp/%E3%82%B6%E3%83%BB%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%8A%E3%83%B3%E3%82%B7%E3%83%BC%E3%83%BB%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%86/dp/4478016968/ref=sr_1_1?s=books&ie=UTF8&qid=1378361753&sr=1-1&keywords=%E3%83%8A%E3%83%B3%E3%82%B7%E3%83%BC%E3%83%BB%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%86">ザ・プレゼンテーション</a>」です。根底にある物は同じように感じますが、また異なった視点でプレゼンを語っており、本当に為になる一冊です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1p3NmsDI9sc1v3JyS5YBmEhZpuSE3viZeMzuKwUrUSfBNg0IFZqb1KIVlfn9j61dGif4X7KQLKxwkCwUPDL2Jqb9MPhG7YePTQsvZkgGULywh452ghTdzhT8f9sYSIH0TMx4HvjaFgPY/s1600/51i5ysv6n4L._AA300_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1p3NmsDI9sc1v3JyS5YBmEhZpuSE3viZeMzuKwUrUSfBNg0IFZqb1KIVlfn9j61dGif4X7KQLKxwkCwUPDL2Jqb9MPhG7YePTQsvZkgGULywh452ghTdzhT8f9sYSIH0TMx4HvjaFgPY/s200/51i5ysv6n4L._AA300_.jpg" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
いずれの本も「スライドの作り方/Power Point(keynote)の使い方」といったテクニックより、<br />
<ul>
<li>何故プレゼンをするのか?</li>
<li>誰の為のプレゼンであるか?</li>
<li>論理 vs パッション</li>
<li>ストーリーで語る事の重要さ</li>
<li>どのようにすれば印象に残るか? ...etc</li>
</ul>
といった部分が多く語られており、本当に素晴らしい書籍だと思います。未読の方は是非読んで欲しいな~と思います。<br />
<br />
<h3>
<span style="color: red;"><u>■製作</u></span></h3>
<br />
5月には講演が決まったのですが、その後色々ありまして、話のプロットを考え始めたのは、8月の上旬に早めの夏休みをとり家族で旅行した後です。<br />
<br />
そこから通勤や休みの日に構成を作って行きました。この段階では全て頭の中で考え、ある程度まとまってからiphoneのメモにテキストを作成しました。<br />
<br />
上記の書籍でも語られていますが、最初の段階からデジタルな世界で考えるのは、あまり良くないように感じます(雑音が多いですから!)。ゆっくりネットの無い状態で、心の声と向き合う時間を持つ事が大切だな~と今回痛感しました。<br />
<br />
...<br />
<br />
その後また色々あって、実際にスライドを作成し始めたのは、2013/08/23の夜からです。何と本番の一週間前です!かなりヒヤヒヤしました。<br />
<br />
過去の経験から100枚前後のスライドが必要になるので<a href="http://minkara.carview.co.jp/userid/18679/blog/871850/">汽車犬</a>のように作成しました。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://apollo1969.img.jugem.jp/20050812_2362.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="161" src="http://apollo1969.img.jugem.jp/20050812_2362.jpg" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
ただこれも過去の経験から、私のスタイルと(高くない)スライドの精度なら、話が決まっていればスライド製作はあまり時間がかからないというのもありました。<br />
土日と断続的に作業を続け、日曜の夜にはα版が完成しました。<br />
<br />
そこから昼休み、夜等にシャドープレゼンを繰り返し、しゃべりとスライドを馴染ましていきました。<br />
この練習の過程で、120枚ぐらい作ったスライドから優先度の高いトピックを残し、最終的には93枚<br />
のスライドになりました。<br />
<br />
このシャドープレゼンの過程では、<br />
<br />
<ul>
<li>トピックの取捨選択</li>
<li>スライドを俯瞰してのトピックの順番の決定</li>
<li>しゃべりと馴染まないスライドの、分割 / 統合 / 破棄の実施</li>
</ul>
を行ないα版が、β版ぐらいにはなりました。<br />
<br />
発表直前まで、スライドは微調整しました。特に小さいフォントを大きくし、見やすくというのを心がけました。<br />
<br />
<h3>
<span style="color: red;"><u>■今回取り入れて良かった事</u></span></h3>
<br />
今回社内のような、良く知っている人向けのプレゼンでは無いので、<span style="color: red;"><b>レビュー</b></span>してもらう事が重要だと思いました(ex. 面白くない冗談、内輪受けのネタに走っていないかとか)。<br />
<br />
まずβ版の段階で、<span style="color: red;"><b>妻(非IT)</b></span>にスライドを見てもらいながら話そうと思っている事を説明しました。<br />
これは"かなり"効果がありました。<br />
<br />
意味不明な写真や、気持ち悪い色使い、良く分からないトピック等、沢山の指摘をしてもらいました。また「以前聞いた話では、タイムゾーンの話と英語の話が印象的だった」というアドバイスをもらいコンテンツに含める事にしました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0PbjcQeM-gl6oXMGIudnpE8RgoiwZrH9FRW5Sz4twyztXXy39WqPY361RMCTZ23-2rYSf64WsA5Nx0Zc0Xtap5CAJ-AwXAzsU2Pp2NNxifWT5f9frhUe4Oe-nKtZNYEXRS0I83wqYIJU/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8947.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0PbjcQeM-gl6oXMGIudnpE8RgoiwZrH9FRW5Sz4twyztXXy39WqPY361RMCTZ23-2rYSf64WsA5Nx0Zc0Xtap5CAJ-AwXAzsU2Pp2NNxifWT5f9frhUe4Oe-nKtZNYEXRS0I83wqYIJU/s200/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8947.PNG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
また社内の<span style="color: red;"><b>プレゼン勉強会のメンバー</b></span>には、実際のプレゼンをみてもらいました。<br />
ここでも本当に重要な指摘をしてもらいました。意味不明な写真や語彙について、沢山のアドバイスをもらいました。こちらもスライド/構成/喋りの精度を上げていくのに効果がありました。<br />
<br />
森田くん、寺島くん、酒井さん、本当にありがとう。<br />
<br />
反省点としては、このレビューをもっと早く受けていれば、もっと改善できた所です。<br />
スケジュール管理がなっていない自分に反省です。<br />
<br />
<h3>
<span style="color: red;"><u>■練習</u></span></h3>
<br />
前述のようなバタバタしたスケジュールでしたが、プレゼンの練習は、通しで何度も行ないました。<br />
概ね<span style="color: red;"><b>5日間</b></span>で、<span style="color: red;"><b>10回ぐらい</b></span>通しはしたと思います。また最初の~10分を上手く乗り越えれば、後は<br />
何とかなると思い、冒頭は少し重点的に練習しました。<br />
<br />
私は、喋りに対して苦手意識があるので(特にアドリブ)、練習する事により、その不安を払拭する事ができると感じます。またとっさの問題発生時にも、練習により対処方法の平均点を向上できるとも思います。<br />
<br />
滑舌を少しでも改善したり、言い難い言葉を他の言葉に置き換えたり、間を考えたり ...etc<br />
スライド製作より、練習という過程の方がよっぽど大事だな~と今は感じます。<br />
<br />
また練習すると「<b><span style="color: red;">次のスライドの内容を少し話してからページ切り替え</span></b>」が出来るようになります。<br />
これは結構良いテクニックだと思います。<br />
<br />
# もっと早く準備します。反省。<br />
<br />
ちなみに本番のプレゼン時間は発表者用ツールによると<span style="color: red;"><b>37.5分</b></span>でした。だいたい練習通りでの終了となりました。<br />
<br />
<h3>
<span style="color: red;"><u>■構成</u></span></h3>
<br />
プレゼン全体の構成は、もっと上手くできるようになりたいです。今回40分という尺を頂いたので、トピックのバランスや順番については、もっと工夫ができたはずと悔やんでいます。<br />
<br />
ただ要所要所で考えた事もあるので書いておきます。<br />
<br />
<b>・冒頭の話方</b><br />
<br />
プレゼンは、最初の10~20秒で聴衆の印象が決定するというのを聞いたことがありますが、残念ながら私は、最初から笑いを取るのは上手くありません。<br />
<br />
だから危険な賭けをするよりは、普通の話題で初めて、少しずつ空気を温める作戦にしたいと考えました。<br />
<br />
恐らく私のことは知らない人がほとんどなので、冒頭では、まず皆にとって共通の話題をチョイスし<br />
(ruby言語/Ruby Kaigi)少しでも一体感を作りたいと考えました。また実行委員/スタッフの方々への謝意を伝えたかったので、これも話題としてチョイスし、拍手という<span style="color: red;"><b>体を動かす行為</b></span>をしてもらう事により、少しでも空気をほぐそうと考えました。<br />
<br />
<b>・自己紹介</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL0mDfgjN5C1USZTY_8bQMWpvzkrviVXUtSO_2_hEF-sxTbj9dRcgC_ApVeHR1mY9q_FO6CuC3LjPuWZ5gRJgg9BtzIK-HZEy_luGtxJ5e4-LLO2rM5-x74Mz30kZ6hNVwW0fcsbu3GnY/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%898.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiL0mDfgjN5C1USZTY_8bQMWpvzkrviVXUtSO_2_hEF-sxTbj9dRcgC_ApVeHR1mY9q_FO6CuC3LjPuWZ5gRJgg9BtzIK-HZEy_luGtxJ5e4-LLO2rM5-x74Mz30kZ6hNVwW0fcsbu3GnY/s200/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%898.PNG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
今回は自己紹介を冒頭に持ってくる構成はやめようと思いました。<br />
40分間あるので、そこそこゆったりと時間が使える事もありますし、最初から「オレがオレが」という<br />
構成にしてしまうと「誰の為のプレゼンか」を自分自身見失ってしまいそうな気がしたからです。<br />
<br />
自己紹介に家族の写真を使うのは好きです(自分の中でのお約束にしてます)。人物像・状況を言葉で伝えるよりも、簡単に伝えられると考えています。<br />
<br />
<b>・Railsコントリビュータになるまでの話</b><br />
<br />
ここは今でも構成上どうだったのか悩んでいる部分です。<br />
というのも冒頭~Railsコントリビュータになるまでの尺が、何度練習しても10分強になるからです。<br />
人によっては、ここまでで飽きてしまうのではと恐れました。<br />
<br />
最初は15分かかる内容だったので少しスライドを捨てました。少し長いとも思いましたが、ストーリー仕立てという事もあり(編集しにくいので)そのままにしておきました。<br />
<br />
<b>・思い出のコミットの話</b><br />
<br />
今回Ruby会議という事もあり、聴衆の層が分かりそうな気もしますが、中々分かりかねる部分もありました。<br />
<br />
そん中で、私の活動の成功/失敗やコミュニティーという部分が、外から見た時に分かりにくいと思うのと、少しはテクい話しをしないと納得頂けない方もいるのではと思いましたw<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg61LJqnUj5C6TQVfW6BkwEZ9G6s1eSc0CB4GtmH2w6hbo8VK6HE9_kQKDxOgoWd820j2qBY0KpKG4MDUce13xRyaVDO3SMoyQMI-D-OcFGxvIhmX5a49cn0Wm_1oRlSWZaQIXL5zmMK5E/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8959.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg61LJqnUj5C6TQVfW6BkwEZ9G6s1eSc0CB4GtmH2w6hbo8VK6HE9_kQKDxOgoWd820j2qBY0KpKG4MDUce13xRyaVDO3SMoyQMI-D-OcFGxvIhmX5a49cn0Wm_1oRlSWZaQIXL5zmMK5E/s200/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8959.PNG" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
ちなみに練習時の指摘を元に「rubyは知っているが、rails/githubについて名前は知っているが深くは知らない」という人に合わせ、語彙の変更をしました(うっかりプルリクとか言った気がしますが...)<br />
<br />
<b>・まとめ</b><br />
<br />
好きなプレゼンなので、是非「マッド・カッツの30日間チャレンジ」の話を紹介したかったのと、自分自身の見解や、これからコミュニティーやってくる人への話をしたいと思いました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://images.ted.com/images/ted/3971219fb49b0779ad6aec67caa99f83c7f6b9ae_389x292.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="http://images.ted.com/images/ted/3971219fb49b0779ad6aec67caa99f83c7f6b9ae_389x292.jpg" width="200" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
少し説教臭い語り口だったと思うので「どうかな?」とも思いましたが、これぐらいの方が選んだ話の終わりとしては適当かなとも思い話の結末といたしました。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP-lcurc7tmJgMgQuEyV18zDNkgWSiuy78j1Be4Pn_7d1JfPCvjDLfjXmFEPmufkstpj6YbEIocW_Q5xmVdE_94kpkooV-6FgFmvanP4u5m378vMoFdubB2eXPEa4tdcP5r5Ud2jtSLLY/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8989.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiP-lcurc7tmJgMgQuEyV18zDNkgWSiuy78j1Be4Pn_7d1JfPCvjDLfjXmFEPmufkstpj6YbEIocW_Q5xmVdE_94kpkooV-6FgFmvanP4u5m378vMoFdubB2eXPEa4tdcP5r5Ud2jtSLLY/s200/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%8989.PNG" width="200" /></a></div>
<br />
<br />
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u><br /></u></span></h3>
<h3>
<span style="color: red;"><u>■最後に</u></span></h3>
<br />
自分なりには、持てる力を注ぐ事ができた講演ではありました。<br />
次機会があれば、反省点を踏まえ、もっと上手くなりたいな~と感じました。<br />
<br />
皆さん聞いて/読んで頂きありがとうございました。<br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com2tag:blogger.com,1999:blog-6648305517577816468.post-82996470657606456542013-08-18T01:05:00.002+09:002013-08-18T01:19:08.008+09:00ActiveRecord::Core.generated_feature_methods が何をしているか?今日参加させて頂いた<a href="http://koberubyistmeetup.doorkeeper.jp/events/5218">Kobe Rubyist Meetup 1st</a>で話題になった、<br />
<i>ActiveRecord::Core.generated_feature_methods</i> の意味が良く分からない問題を追跡してみました。<br />
<br />
<h3>
■疑問</h3>
<br />
@sutetotanuki さんより下記のコードの意味が分からないとの質問がありました。<br />
以前から私も良く分からないコードだな~と思っていたのですが、理由を良く知りませんでした。<br />
<pre class="brush:ruby"> 97 def generated_feature_methods
98 @generated_feature_methods ||= begin
99 mod = const_set(:GeneratedFeatureMethods, Module.new)
100 include mod
101 mod
102 end
103 end
</pre>
moduleをその場で生成しincludeしているだけ。何の役に立つのか?<br />
<br />
<h3>
■調査した結果</h3>
<br />
<i>generated_feature_methods </i>を呼び出しているのは、少し上の <i>initialize_generated_modules</i> メソッド
とassociations/builder系 と nested_attributes.rb です。<br />
<br />
まず<i> initialize_generated_modules</i> メソッドは<br />
<br />
<i>activerecord/lib/active_record/core.rb より
</i><br />
<pre class="brush:ruby"> 91 def initialize_generated_modules
92 super
93
94 generated_feature_methods
95 end
</pre>
となっており、<i>generated_feature_methods </i>を呼び出す前に、さらに上位のメソッドを呼び出しており、
その中で<i>@generated_attribute_methods</i>が生成されています。<br />
<br />
<i>activerecord/lib/active_record/attribute_methods.rb より
</i><br />
<pre class="brush:ruby"> 62 def initialize_generated_modules # :nodoc:
63 @generated_attribute_methods = Module.new { extend Mutex_m }
64 @attribute_methods_generated = false
65 include @generated_attribute_methods
66 end
</pre>
これにより <i>generated_attribute_methods</i> が返す<i>Module</i>は、<i>generated_feature_methods</i>が返す<i>Module</i>より継承ツリー上、必ず上位になります。<br />
<br />
一方でassociations/builder系 と nested_attributes.rbでは、アクセサを生成する為のmoduleとして利用されている事がわかります。<br />
<br />
<i>activerecord/lib/active_record/associations/builder/association.rb より
</i><br />
<pre class="brush:ruby"> 85 def define_accessors(model)
86 mixin = model.generated_feature_methods
87 define_readers(mixin)
88 define_writers(mixin)
89 end
</pre>
これにより属性用のメソッドは、アソシエーション用のメソッドより継承ツリーでは上位で生成される。言い換えると<b><span style="color: red;">アソシエーション用のメソッドが優先して呼び出されるようにしたい</span></b>という意図が見えると思います。<br />
<br />
実際、関係がありそうなコミット<br />
<ul>
<li><a href="https://github.com/rails/rails/commit/61bcc318c865289d215e8e19618b9414bd07d1e8">https://github.com/rails/rails/commit/61bcc318c865289d215e8e19618b9414bd07d1e8</a></li>
<li><a href="https://github.com/rails/rails/commit/7cba6a37848ba96b4decec885779fb309d71c339">https://github.com/rails/rails/commit/7cba6a37848ba96b4decec885779fb309d71c339</a></li>
</ul>
を見てみると、そのようなコミットコメントが書かれています。<br />
<blockquote class="tr_bq">
<pre style="background-color: #e6f1f6; color: #596063; font-family: Monaco, 'Liberation Mono', Courier, monospace; font-size: 14px; margin-bottom: 10px; margin-top: 10px; max-width: 100%; text-shadow: rgba(255, 255, 255, 0.498039) 0px 1px; white-space: pre-wrap;">Instead of generating association methods directly in the model
class, they are generated in an anonymous module which
is then included in the model class. There is one such module
for each association. The only subtlety is that the
generated_attributes_methods module (from ActiveModel) must
be forced to be included before association methods are created
so that attribute methods will not shadow association methods.</pre>
</blockquote>
テストケースには、さらによく分かるコードが残っています。<br />
<pre class="brush:ruby">333 def test_association_methods_override_attribute_methods_of_same_name
334 assert_equal(developers(:david), computers(:workstation).developer)
335 # this next line will fail if the attribute methods module is generated lazily
336 # after the association methods module is generated
337 assert_equal(developers(:david), computers(:workstation).developer)
338 assert_equal(developers(:david).id, computers(:workstation)[:developer])
339 end
</pre>
なるほど!深い理由がある事が分かりましたwkennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com3tag:blogger.com,1999:blog-6648305517577816468.post-57372983731704469412012-12-17T00:51:00.001+09:002012-12-17T10:39:38.160+09:00Rails Girls Kyotoに参加させて頂きました。<br />
<a href="https://twitter.com/satomicchy">@satomicchy</a>さんに誘って頂き、2012/12/14日15日と<a href="http://railsgirls.com/kyoto">Rails Girls Kyoto</a>にコーチとして参加させて頂きました。<br />
とても良いイベントだったので、スポンサー、オーガナイザー、コーチ、スタッフの皆様、そして何より参加頂いた皆様に感謝感謝です。<br />
<br />
当日の雰囲気は<a href="http://eventifier.co/event/railsgirlskyoto">こちら</a>から。信じられないぜ、これがITのイベントだなんて!<br />
↓懇親会にてケーキを撮る風景<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2WL_uVsGTMQca499kANtu1d1nPL2PLxNybyNgV1uug-aZm3Rdwvd7UT9gaNhKRBky1XVv-lrEpdRU7_se07UaQx1VmFvZeDfCpIL0VRuM7Q_bnYcI1Lsg9Q8GhAaMKukz9TR2SEb_0X0/s1600/rails-girls-kyoto.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2WL_uVsGTMQca499kANtu1d1nPL2PLxNybyNgV1uug-aZm3Rdwvd7UT9gaNhKRBky1XVv-lrEpdRU7_se07UaQx1VmFvZeDfCpIL0VRuM7Q_bnYcI1Lsg9Q8GhAaMKukz9TR2SEb_0X0/s320/rails-girls-kyoto.JPG" width="320" /></a></div>
<span style="color: red;">■コーチ業について</span><br />
14日のインストールデーは、windowsチームを担当しました。<br />
RailsInstallerを利用すれば、意外な程簡単にインストール作業は終了しました。<br />
<br />
railsが少し古いのでアップデートしたい心を押し留めたのですが、良く考えたらmacとはバージョンが違うはずなので、アップデートしておいても良かったかもしれないなと思いました。<br />
<br />
<i>gem install rails --no-ri --no-rdoc</i><br />
とコマンドラインで実行すればアップデートできますよ!とここに書いてみる。<br />
<br />
15日は、参加者2~3人につき1人ぐらいという事もあり、かなり個別に対応できたのは○だと思いました。<br />
また非常に向上心が高い方ばっかりだったので、教える方も熱が入りましたw.<br />
<br />
web/ブラウザとかの説明は、個人的にはもう少し準備しておくべきだと感じました。かなりノープランに話をしてしまいました。<br />
<br />
tryrubyはrubyをインタラクティブに勉強できる英語サイトなのですが、思いの他、皆さんどんどん進んで<br />
いくのがかなり予想外でした。ちょいちょい脱線して周辺の話を説明できたのは○でした。<br />
プログラム初心者のとある方に「putsの戻り値は?」と言う質問を受けたのが、かなり衝撃的な出来事でした。ちゃんと理解しようとする姿勢は、良いエンジニアに必要だと思うので(エンジニアの方では無いのですが)。<br />
<br />
ローカルで作ったアプリを、PaaS(herokuかSqale)にデプロイし、インターネットに公開できると皆さん嬉し<br />
そうにしていたのが印象的でした(^ ^)<br />
<br />
<h3>
<span style="color: red;">■ライトニングトークスについて</span></h3>
15日のお昼にライトニングトークスさせて頂きました。機材の都合でトップバッター。緊張するがな。。<br />
当日の資料は<a href="http://www.slideshare.net/kennyj1976/rails-girls-kyoto-20121215-lt">こちら</a>。<br />
<br />
今回は「プログラム初心者がかなり来る」との事前情報を得ていたので、<br />
言葉やテーマについて、事前に考えたつもりだったんですが、前日のイントールデーの雰囲気を見て、<br />
これはまずいと感じました。<br />
冒頭に、とあるネタを入れていた(かつキーとなるメッセージに繋がる)のですが、<br />
どう考えてもウケるはずがない!と判断しました(妻からのアドバイスのおかげでもありますが)。<br />
<br />
という訳で前日~当日に"武器"を変えたので、資料にタイトルが無かったりします。聴衆を意識して内容を変えるという心意気は、自分的には良かったのですが、その分しゃべりの練度は下がっちゃいました(^_^;)<br />
<br />
<a href="http://www.amazon.co.jp/%E3%82%B6%E3%83%BB%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%8A%E3%83%B3%E3%82%B7%E3%83%BC%E3%83%BB%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%86/dp/4478016968">ナンシーデュアルテのこの本</a>を読んでから、「プレゼンテーションの主役は聴衆である」という事を意識しているのですが、中々実践できていない事を反省をしている所です。<br />
<div>
<br /></div>
kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com2tag:blogger.com,1999:blog-6648305517577816468.post-62678258275699408192012-11-29T01:55:00.000+09:002012-11-29T01:55:19.192+09:00sqliteを利用した日本語での全文検索実験 <br />
<h4>
<b><span style="color: red;">■概要</span></b></h4>
ひょんな事から、sqliteでの全文検索について調べました。<br />
すると全文検索用に、fts3/4指定ができる事を発見したのですが、予想通り"スペース"での、単語区切りしかできないようです。<br />
日本語を処理したかったので、自分でn-gramしたデータを登録してテストしてみました。<br />
確かに高速に検索できます。<br />
<br />
※ MeCabを利用したtokenizerとかはandroidでの利用を考え考察していません。<br />
<br />
<h4>
<b><span style="color: red;">■テストデータ</span></b></h4>
郵便番号データを下記からダウンロードしました。<br />
<a href="http://www.post.japanpost.jp/zipcode/dl/kogaki.html">http://www.post.japanpost.jp/zipcode/dl/kogaki.html</a><br />
<br />
全国版データを利用しました。<br />
ちなみにcentos6.xではlhaコマンドを入手できなかったので、<a href="http://d.hatena.ne.jp/pcmaster/20100211/p3">http://d.hatena.ne.jp/pcmaster/20100211/p3</a> を参考にインストールしました。<br />
<br />
$ lha e ken_all.lzh<br />
$ ruby gensql.rb ken_all.csv > ken_all.sql # 下記スクリプトで分割済みのフィールドを準備<br />
<br />
<h4>
<b><span style="color: red;">■実験</span></b></h4>
$ sqlite3 a.sqlite<br />
> create virtual table zip_codes using fts3<br />
(<br />
code text<br />
, address text<br />
, search_field text<br />
);<br />
<br />
> begin;<br />
> .read ken_all.sql<br />
> commit;<br />
<br />
> .timer ON;<br />
> select code, address from zip_codes where address like ('%東成区%');<br />
CPU Time: user 0.272959 sys 0.024997<br />
<br />
> select count(*) from zip_codes where address like ('%東成区%');<br />
CPU Time: user 0.262960 sys 0.032995<br />
<br />
> select code, address from zip_codes where search_field match '東成 成区';<br />
CPU Time: user 0.001000 sys 0.000000<br />
<br />
> select count(*) from zip_codes where search_field match '東成 成区';<br />
CPU Time: user 0.001000 sys 0.000000<br />
<br />
なんと数値上は<span style="color: red;"><b>300倍近く高速化</b></span>されましたw!<br />
ちなみに検索文字列もn-gram分割する必要があります。<br/>
<br />
<h4>
<b><span style="color: red;">■(参考)データ加工用スクリプト</span></b></h4>
<pre class="brush:ruby">
require 'csv'
# なんちゃって2-gram。英数字は特別扱いするとか正規化するとか工夫してください。
# javaで組めば幸せになるはず(?)
def gen_2_gram(org)
result = []
(org.length - 1).times { |i| result << org[i, 2] }
result.join(" ")
end
# *.csvファイルを処理する。
ARGV.each do |file|
CSV.foreach(file, "r:sjis") do |row|
zip = row[0]
address = (row[6] + row[7] + row[8]).encode("utf-8")
puts "insert into zip_codes (code, address, search_field) values (#{zip}, '#{address}', '#{gen_2_gram(address)}');"
end
end
</pre>
<br />
※"以下に掲載がない場合"とかは実験目的なので特に処理していません。<br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-77976647232078374842012-09-30T00:16:00.000+09:002012-09-30T00:16:13.710+09:00(初心者向け)SELECT文を考える時には最終アウトプットを強く意識する。<br />
SELECT文を考える時、何となくjoinやgroup byとか使ってませんか?もしくはメインとなるテーブルを意識していますか?<br />
<br />
SELECT文は非常に便利なので気づかないのですが裏で実行されている事は(非常に簡単に言うと)<br />
<br />
・縦*横の二次元の表を付きあわせ、新たな縦*横の二次元の表を作成<br />
<br />
しているだけなのです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFubcskrX-o0mpGsJ6jDRIoscvICJ-Fy2BqkLm0CFLGEusLqmFoELztuORkoDXK9EprBJ_yH2rDkr-o5VdT4RNMx-Ejq3I85-eVkTZi4mTNf0iQSxoyrSigKE3l-TX_j6e3q9PhHf4JZE/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%891.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFubcskrX-o0mpGsJ6jDRIoscvICJ-Fy2BqkLm0CFLGEusLqmFoELztuORkoDXK9EprBJ_yH2rDkr-o5VdT4RNMx-Ejq3I85-eVkTZi4mTNf0iQSxoyrSigKE3l-TX_j6e3q9PhHf4JZE/s320/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%891.PNG" width="320" /></a></div>
<br />
その際に、一行の粒度が変わる事に注意が必要です。多重度が大きい側にjoinすると、自ずと一行の粒度が変わってしまう(行が増えてしまう)為、初心者のうちは自分が何をしているのか分からなくなります。<br />
<br />
例えば次のER図があり、<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtV8Bg0LcCySvn7os0wuBsjCpfqKSJX2k-7PfNrb0foq8I7_3xswIvU_bSRozb6Gvg7ElhtXbwGJC-YM7rtqPEPA2eS_tt3aJjHluiBmPgMiuaod1__1S1MyAycGGanHYVSLnpzqZoU0U/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%892.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtV8Bg0LcCySvn7os0wuBsjCpfqKSJX2k-7PfNrb0foq8I7_3xswIvU_bSRozb6Gvg7ElhtXbwGJC-YM7rtqPEPA2eS_tt3aJjHluiBmPgMiuaod1__1S1MyAycGGanHYVSLnpzqZoU0U/s320/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%892.PNG" width="320" /></a></div>
<br />
最終的に次のような表が欲しい場合、どういうSQLを書きますか?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiauMDz9njHh6mB9AExvDfF154Z8J2treDOTTeN3FprkdJvmXH_XIT2W52o8aMMcibjZc69BQoe0ACulZoNe-696-H8iO-ZbtlUo3FV-d7a9eQXoeHDVYEkK-ZAomI8zThPah30RyPq-XM/s1600/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%893.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiauMDz9njHh6mB9AExvDfF154Z8J2treDOTTeN3FprkdJvmXH_XIT2W52o8aMMcibjZc69BQoe0ACulZoNe-696-H8iO-ZbtlUo3FV-d7a9eQXoeHDVYEkK-ZAomI8zThPah30RyPq-XM/s320/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%893.PNG" width="320" /></a></div>
<br />
私は概ね次のステップでSELECT文を考えます。<br />
<br />
・最終アウトプットの一行の粒度を確認する。<br />
<blockquote class="tr_bq">
<i>この場合注文明細の行数が最終アウトプットの行数と同じ</i></blockquote>
<br />
・その粒度にあったテーブルをメインの表にする。<br />
<blockquote class="tr_bq">
<i> from 注文明細を起点に考える</i></blockquote>
<br />
・そこに枝葉のテーブルを加える。その時に行の粒度を変えない(膨らまさない)。<br />
<blockquote class="tr_bq">
<i> from 注文明細<br /> inner join 注文 on 注文.注文番号 = 注文明細.注文番号<br /> inner join 顧客 on 顧客.顧客NO = 注文.顧客NO<br /> inner join 商品 on 商品.商品NO = 注文明細.商品NO</i></blockquote>
<br />
<span style="color: red;"><i>from 注文</i>からはじめる人も多いと思いますが、注文明細をjoinした時に行が膨れるため、考えを単純化する目的で、こんな簡単な場合でも徹底して明細側をメインテーブルにします。</span><br />
<br />
あまりにも意図せず膨らましてしまい、group by/distinctでお茶を濁そうとする人が多そうなので記事にしてみました。もちろん集計が入ってくるとこの限りでは無いのですが、「最終アウトプットの一行の粒度」を意識する事は非常に重要です。<br />
<br />
<div>
<br /></div>
kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-20873484305396944232012-09-29T23:08:00.000+09:002012-09-29T23:11:02.701+09:00Amazon EC2でOracle-XEを動かす時の注意点先日諸般の事情で、Amazon EC2にOracle11gXEをインストールして利用する必要があったのですが、一つ困った事があったのでメモ。<br />
<br />
<b>■問題</b><br />
インストールも簡単にでき重宝していたのですが、EC2インスタンスをStop -> Startすると外部から接続できなくなりました。<br />
<br />
FWとかSecurity Groupとか確認したのですが問題を発見できず。<br />
サーバにログインしておもむろにプロセスを確認すると、何と ”リスナー” が起動していないのです!<br />
<br />
<b>■原因&対処方法</b><br />
EC2インスタンスをStop -> StartするとIPおよびホスト名が変わります。ところがOracle11gXEをインストールすると、listener.ora内にインストール時点のホスト名が埋まってしまいます。よって再起動後は前のホスト名に対してリスナーを起動しようとする為、上手くいかなります。<br />
<br />
ホスト名を変更し、/etc/init.d/oracle-xe stop / startすると、めでたく起動できました!<br />
<br />
<b>■追記</b><br />
↑な事をtwitterでぼやいていたら、Rails contributor仲間のyahondaさんより、<a href="https://twitter.com/yahonda/status/250592370314326016">「Host名を空にする」という方法</a>を教えて頂きました。これだとインスタンス起動毎に変更しなくてよいので楽ちんです。kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-66775425658664071482012-06-24T00:04:00.000+09:002012-06-24T01:16:28.925+09:00ActiveRecord自体のテストケースをOracleで動かす<h2>
■概要</h2>
ActiveRecord自体のテストケースは通常sqlite3/mysql/postgresqlで実行しますが、oracleで実行したくなり調べましたが少し手こずりました。手順を残しておきます。<br />
<br />
<h4>
■oracle-xeインストール準備</h4>
・swap領域が足りないので追加<br />
<pre class="brush: bash"># dd if=/dev/zero of=/swap.extended bs=1M count=1024
# mkswap /swap.extended
# swapon /swap.extended
# cat /proc/swaps # 確認
Filename Type Size Used Priority
/dev/vda2 partition 2096472 19024 -1
/swap.extended file 1048568 0 -2
# vim /etc/fstab # 再起動時のおまじない
...
/swap.extended swap swap defaults 0 0
</pre>
<h4>
■oracle関係インストール</h4>
・ここからoracle11g xeをダウンロード<br />
http://www.oracle.com/technetwork/database/enterprise-edition/overview/index.html<br />
<br />
・oracle-xeインストール<br />
<pre class="brush: bash"># unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
# cd Disk1
# rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm
# /etc/init.d/oracle-xe configure
入力は、9080(8080は他の用途で利用している...) => 1521 => パスワード => y
# /etc/init.d/oracle-xe status
</pre>
・oracle clientインストール<br />
http://www.oracle.com/technetwork/jp/topics/index-099943-ja.html<br />
<pre class="brush: bash"># rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm
</pre>
<b>■ユーザ設定</b><br />
・環境変数を設定<br />
<pre class="brush: bash">$ vim ~/.bash_profile
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib/:$LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/11.2/client64/bin/:$PATH
export NLS_LANG=JAPANESE_JAPAN.AL32UTF8
$ source ~/.bash_profile
</pre>
・テスト用ユーザ作成<br />
<pre class="brush: bash">$ sqlplus system/パスワード@localhost:1521/XE
SQL> create user arunit identified by arunit default tablespace USERS temporary tablespace TEMP;
SQL> create user arunit2 identified by arunit2 default tablespace USERS temporary tablespace TEMP;
SQL> grant connect,resource to arunit;
SQL> grant create session to arunit;
SQL> grant create synonym to arunit;
SQL> grant connect,resource to arunit2;
SQL> grant create session to arunit2;
SQL> grant create synonym to arunit2;
</pre>
<h4>
■gem準備</h4>
<pre class="brush: bash">$ gem install ruby-oci8
$ git clone git://github.com/rsim/oracle-enhanced.git
$ git checkout -b rails4 origin/rails4
$ cd /home/kennyj/rails/activerecord
$ ORACLE_ENHANCED_PATH=/home/kennyj/oracle-enhanced bundle update
</pre>
<h4>
■テスト実行</h4>
<pre class="brush: bash">$ ARUNIT_DB_NAME=localhost:1521/XE ARCONN=oracle \
ORACLE_ENHANCED_PATH=/home/kennyj/oracle-enhanced \
ruby -Itest:lib test/cases/schema_dumper_test.rb
</pre>
<div>
<br /></div>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-87015416467907412672012-05-28T18:38:00.000+09:002012-05-28T18:47:30.668+09:00ruby/rails勉強会54thで、ライトニングトークスさせて頂きました! 2012/05/26に、Ruby関西様主催の「ruby/rails勉強会54th」で、ライトニングトークスをさせて頂きました。<br />
<br />
スライドは<a href="http://www.slideshare.net/kennyj1976/rails40-13085544">こちら</a>!<br />
<br />
発表の是非は皆様のご判断を仰ぐとして、今後の為に思ったことを記載しておきます。<br />
<br />
<h4>
<b><span style="color: red;">■練習・リハーサルは重要</span></b></h4>
<br />
<ul>
<li>前日に3時間程度練習しました。少ない!と言われるかもしれませんが、必要以上に緊張せずにはすみました。</li>
<li>リハーサルにて時間が長すぎる事が分かったので、結果9枚(1/4程度)スライドを捨てました。中心的なメッセージ以外のくだりは、思い切って外しました。</li>
</ul>
<br />
<h4>
<span style="color: red;"><b>■前回某所でのLTでは、練習では5分丁度だったのに、実際には</b><b> 3.5分程度になってしまった。</b></span></h4>
<br />
<ul>
<li>練習をしてくるのは当然だが、使える機能は利用すべきと思った。</li>
<li>マルチモニタ機能で、プレゼン画面と発表者用をわける。</li>
<li>ちら見程度でも、時間の把握と次のスライドがわかるとよい。次のスライドが分かれば、<span style="color: red;">先に話を進めてからスライドを切り替える</span>という、進め方を確実にする事が可能。</li>
<li>もっと時間をかけて練習すれば、不要なのは理解しているのですが現実との兼ね合いで妥協。</li>
<li>音楽における”<span style="color: red;">暗譜</span>”と似てますね。</li>
</ul>
<br />
<h4>
<b><span style="color: red;">■反省点</span></b></h4>
<br />
<ul>
<li>5分という制約の中で、この題材は適切だったのか少し反省。</li>
<li>話題を詰め込みすぎて、喋りが慌ただしかったと思う。</li>
<li>リモコン?が無いので、画面切り替え時にPCを操作しなければいけなかった。結果目線を落とす必要があり、また体を自由に使って表現が難しかった。</li>
<li>スライドは自分のしゃべりを支える物と考えているのですが、いざslideshareにあげてみると、よく分からんだろうなと思いました。</li>
<li>「プレゼンテーションzen」の影響うけてますよね?と感想を頂いた。全くその通りで指摘頂き嬉しい半面、さらに精進して影響を消化したいなと思いました。</li>
</ul>
<br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-64275012515149634262012-05-01T01:34:00.000+09:002012-07-07T20:46:14.752+09:00rails自体の開発環境を作る2012<br />
<b>■概要</b><br />
さくらvpsを新プランに乗り換えたので、またまた"rails自体"の開発環境を作ります。<br />
<br />
<b>■パッケージ管理・導入(centos6.2 x86_64 2Gプラン)</b><br />
<br />
○パッケージの最新化<br />
# yum -y update<br />
(yum -y upgrade)<br />
<br />
○必要そうなパッケージをインストール<br />
# yum -y install git nmap telnet<br />
<br />
# yum -y install screen zsh<br />
<br />
(# yum -y install httpd httpd-devel)<br />
<br />
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm<br />
# yum --enablerepo=remi,remi-test -y install mysql mysql-server mysql-devel<br />
<br />
# yum -y install sqlite sqlite-devel<br />
<br />
# rpm -Uvh http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm<br />
# yum -y install postgresql91 postgresql91-contrib postgresql91-devel postgresql91-libs postgresql91-server<br />
<br />
# yum --disablerepo=pgdg91 -y install libevent libevent-devel memcached memcached-devel<br />
<br />
# yum -y install openssl-devel curl-devel readline-devel zlib-devel libxml2 libxml2-devel libxslt-devel libyaml-devel libffi-devel<br />
# yum -y install java-1.6.0-openjdk java-1.6.0-openjdk-devel java-1.6.0-openjdk-src<br />
<br />
(参考) http://www.if-not-true-then-false.com/2010/install-mysql-on-fedora-centos-red-hat-rhel/<br />
(参考) http://www.oss-d.net/postgresql/9.1<br />
<br />
<b>■設定</b><br />
<br />
○日本語化<br />
# vim /etc/sysconfig/i18n<br />
LANG="C" から LANG="ja_JP.UTF-8" に変更<br />
<br />
○不要デーモンの停止設定<br />
# chkconfig auditd off<br />
# chkconfig haldaemon off<br />
# chkconfig mdmonitor off<br />
# chkconfig messagebus off<br />
# chkconfig netfs off<br />
# chkconfig restorecond off<br />
# chkconfig smartd off<br />
<br />
(参考) http://tanaka.sakura.ad.jp/archives/001065.html<br />
<br />
○FW設定<br />
# system-config-firewall-tui<br />
SSH/HTTPS/HTTP/3000(tcp)<br />
後は未設定<br />
<br />
○時間同期設定<br />
(さくらVPSでは最初から設定されていました)<br />
# yum -y install ntp<br />
# vim /etc/ntp.conf<br />
# ntpdate ntp.nict.jp (とりあえず一旦近づけておく)<br />
# /etc/init.d/ntpd start<br />
# chkconfig ntpd on<br />
<br />
○selinux停止<br />
(さくらVPSでは最初から設定されていました)<br />
# vim /etc/sysconfig/selinux<br />
SELINUX=disabled<br />
# reboot<br />
<br />
○作業用ユーザ作成<br />
# useradd kennyj<br />
# passwd kennyj<br />
<br />
○sudo設定<br />
# /usr/sbin/visudo<br />
(一番下に追記)<br />
kennyj ALL=(ALL) ALL<br />
<br />
○ssh設定<br />
# vim /etc/ssh/sshd_config<br />
(42行目)<br />
PermitRootLogin no<br />
(47行目)<br />
RSAAuthentication yes<br />
PubkeyAuthentication yes<br />
AuthorizedKeysFile .ssh/authorized_keys<br />
(65行目)<br />
PermitEmptyPasswords no<br />
PasswordAuthentication no<br />
<br />
# /etc/init.d/sshd restart<br />
<br />
# su - kennyj<br />
$ ssh-keygen -t rsa<br />
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys<br />
(秘密鍵をローカルにダウンロード。秘密鍵のみでログインできる事を確認する。)<br />
$ rm ~/.ssh/id_rsa<br />
$ exit<br />
<br />
○postgresql準備<br />
# service postgresql-9.1 initdb<br />
<br />
○mysql準備<br />
# vim /etc/my.cnf<br />
(文字列エンコーディングをUTF-8に設定)<br />
[mysqld]<br />
...<br />
character-set-server = utf8<br />
<br />
[mysqld_safe]<br />
...<br />
character-set-server = utf8<br />
<br />
[mysql]<br />
...<br />
default-character-set = utf8<br />
<br />
# mysql_install_db<br />
# service mysqld start<br />
# mysql_secure_installation<br />
<br />
○必要に応じてサービス起動設定<br />
(# chkconfig httpd on)<br />
# chkconfig mysqld on<br />
# chkconfig postgresql-9.1 on<br />
# chkconfig memcached on<br />
<br />
○再起動<br />
# reboot<br />
<br />
○サービス稼動確認<br />
# ps aux | grep -E 'http|postgre|mysql|memcache'<br />
<br />
<b>■rails環境構築</b><br />
<br />
○javascript関係インストール<br />
# wget http://nodejs.tchol.org/repocfg/el/nodejs-stable-release.noarch.rpm<br />
# yum localinstall --nogpgcheck nodejs-stable-release.noarch.rpm<br />
# yum install nodejs-compat-symlinks npm<br />
<br />
(# npm install express -g)<br />
(# npm install jade -g)<br />
(# npm install socket.io -g)<br />
# npm install coffee-script -g<br />
<br />
(参考) https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager<br />
<br />
○ruby関係インストール<br />
<br />
(kennyjユーザで)<br />
$ curl https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable<br />
$ source ~/.rvm/scripts/rvm<br />
$ rvm install ree-1.8.7-2012.02<br />
$ rvm install 1.9.3-p194<br />
$ rvm install jruby-1.6.7<br />
<br />
$ rvm use --default 1.9.3<br />
($ rvm ree,1.9.3,jruby do gem install rails --no-rdoc --no-ri)<br />
<br />
<b>■rails開発環境</b><br />
<br />
○mysqlの設定<br />
$ mysql -u root<br />
mysql> GRANT ALL PRIVILEGES ON activerecord_unittest.* to 'rails'@'localhost';<br />
mysql> GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';<br />
mysql> flush privileges;<br />
mysql> quit<br />
<br />
○postgresqlの設定<br />
$ sudo -u postgres createuser --superuser $USER<br />
<br />
○github公開鍵の準備<br />
(参考) http://help.github.com/win-set-up-git/<br />
<br />
○gitの設定<br />
$ git config --global user.name kennyj # 名前<br />
$ git config --global user.email kennyj@gmail.com # メールアドレス<br />
<br />
○gitの補完機能設定<br />
$ cd $HOME<br />
$ wget https://raw.github.com/gitster/git/master/contrib/completion/git-completion.bash -O .git-completion.bash<br />
$ vim $HOME/.bashrc<br />
source $HOME/.git-completion.bash<br />
PS1='\w$(__git_ps1 "(%s)")\$ '<br />
<br />
$ souce ~/.bashrc<br />
<br />
○rails開発環境<br />
$ git clone git://github.com/(自分)/rails.git (先にgithub上でforkしておく)<br />
$ cd rails<br />
$ gem install pg -- --with-pg-config=/usr/pgsql-9.1/bin/pg_config<br />
$ bundle update<br />
$ bundle exec rake mysql:build_databases<br />
$ bundle exec rake postgresql:build_databases<br />
○hstore準備<br />
$ psql activerecord_unittest<br />
> CREATE EXTENSION hstore;<br />
> \q<br />
$ psql activerecord_unittest2<br />
> CREATE EXTENSION hstore;<br />
> \q<br />
○テスト稼動確認<br />
$ cd ..<br />
$ bundle exec rake (テスト稼動確認)<br />
<br />
○docrailsも準備<br />
$ cd $HOME<br />
$ git clone git://github.com/lifo/docrails.git<br />
<br />
○適宜関連gemの開発環境<br />
$ git clone git://github.com/(自分)/mail.git<br />
$ git clone git://github.com/(自分)/journey.git<br />
$ git clone git://github.com/(自分)/sprockets.git<br />
$ git clone git://github.com/(自分)/sprockets-rails.git<br />
...<br />
<div>
<br /></div>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-53243984437694052652012-03-29T22:09:00.000+09:002012-03-30T00:31:40.045+09:00ActiveRecord自体のテストケースを実行する際にDBを選ぶ方法<div><b>■概要</b></div>
<div>
ActiveRecord自体のテストケースを、"個別に"実行する際のデフォルトDBは、sqlite3です。これを切り替える方法が、長らくわからず時間を浪費していました。</div>
<div>
<br /></div>
<div><b>■方法</b></div>
<div>
わかってしまえば簡単です。ARCONNで指定できます。</div>
<pre class="brush: ruby">
$ cd activerecord
$ ARCONN=mysql2 ruby -Ilib:test test/cases/base_test.rb
</pre>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-35772146259950907912012-02-29T00:54:00.001+09:002012-02-29T00:54:32.695+09:00別サーバでassetsを提供する際の覚書<br />
rails3.1.x以降でassets pipe lineを利用する際に、assetsの提供を別サーバにしたい場合は下記の手順で実施する必要があります。<br />
<br />
<ul>
<li>config/environments/production.rbを編集する。</li>
<ul>
<li>config.assets.compile = falseにする。</li>
<li>config.action_controller.asset_host = "http://www.example.com" として提供サーバを設定する。</li>
</ul>
<li>開発マシンでrake assets:precompileを実行する。</li>
<ul>
<li>サブディレクトリ配下におきたい場合は、RAILS_RELATIVE_URL_ROOT=/fooの様に環境変数で指定する。</li>
</ul>
<li>manifest.ymlだけコミットする</li>
<ul>
<li>manifest.ymlがあれば論理名をハッシュ付き名に変換可能。</li>
<li>public/assetsは無視リストに。public/assets/manifest.ymlだけコミット可能にする。</li>
</ul>
<li>assets自体はassets専用サーバに送る。</li>
<ul>
<li>AWS S3の場合、jammit-s3等を利用。</li>
</ul>
<li>アプリをデプロイする。</li>
</ul>
<div>
参考 <a href="https://github.com/rails/rails/issues/3577">https://github.com/rails/rails/issues/3577</a></div>
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-476847268156717052012-02-19T19:40:00.000+09:002012-02-20T12:44:54.407+09:00Rails contributorsはどこにいるのか?<b>■概要</b><br />
<br />
久しぶりの更新になります。最近はもっぱらgithubでの活動がメインになってしまいました。<br />
<br />
色々なコントリビュータとやりとりをしていると「この人は現地で今何時なんだ?」と思う事が増えました。という事でまずコントリビュータがどこにいるのか調べてみました。<br />
<br />
<b>■説明</b><br />
<br />
さてどうやったら調べられるか考えたのですが下記のステップでデータを作成しました。<br />
<ol>
<li>github APIを利用して、rails contributorsをリストアップします。 <a href="https://api.github.com/repos/rails/rails/contributors">https://api.github.com/repos/rails/rails/contributors</a> </li>
<li>github accountの束が手に入るので、こちらもgithub APIを利用して、profile情報を取得します。 例えばDHHなら、<a href="https://api.github.com/users/dhh">https://api.github.com/users/dhh</a></li>
<li>2. で取得した情報を良く見るとlocation情報に、"Chicago, USA"と書いてあるのでこれを緯度経度情報に変換できれば、やりたい事を実現できます。</li>
<li>色々調べてみると、google maps API v3のジオコーディングリクエストを利用すれば、目的が達成できる事がわかりました。
<a href="http://code.google.com/intl/ja/apis/maps/documentation/javascript/services.html#Geocoding">http://code.google.com/intl/ja/apis/maps/documentation/javascript/services.html#Geocoding</a></li>
<li>ここまでで得た情報をgoogle maps上にプロットする。</li>
</ol>
<b>■結果</b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEA3kgqP7RT9YFpa7zzgWNCYkeQapbOTovc3OlR5pGemcW0-FkwY5hptGhX_dhdY7yLy0LnyxlitUEz_30APgulOrCL-mCW6i4mKm0A_ZKCh2FYyfB2QJAZ5teOy3DYAjJK4P-liaeZM/s1600/guys_world.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="476" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipEA3kgqP7RT9YFpa7zzgWNCYkeQapbOTovc3OlR5pGemcW0-FkwY5hptGhX_dhdY7yLy0LnyxlitUEz_30APgulOrCL-mCW6i4mKm0A_ZKCh2FYyfB2QJAZ5teOy3DYAjJK4P-liaeZM/s640/guys_world.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
(全体)都合によりTop300でローケーションが判明した人のみプロットしました。貢献数が多い人ほどZIndexを優先にし、画像サイズも変えてみました。世界に広がっていますね。アフリカ以外 ^o^</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPPLjiy8sK67QnPkep3bNF_iJQXFZr69y9YIqtAaj2-AFQsIs8s071C3N62rx69eYh0-F0X_cRcX7OCbtNJ1EiNg83zwOPLUZpQbNjfWqN0UV_9vQTqC_34vlvm8r7wnwuGWyR_uOAjU/s1600/guys_team_usa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="368" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRPPLjiy8sK67QnPkep3bNF_iJQXFZr69y9YIqtAaj2-AFQsIs8s071C3N62rx69eYh0-F0X_cRcX7OCbtNJ1EiNg83zwOPLUZpQbNjfWqN0UV_9vQTqC_34vlvm8r7wnwuGWyR_uOAjU/s640/guys_team_usa.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
(北米)アメリカといっても広いんですね。色々な地域から参加してます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-wlQoKvvK67r-oB_70vGJ-F2jtrLnwL4EyY_KytpBjVksk4cYbrH90vQUf13xndADhooUwHhNcIjdj4b0SXddV8sziaGZMg51oOTUoEvfcZYLLOvawBwa2clVC5N7QeWdThyphenhypheniMIhJcA/s1600/guys_team_europa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2-wlQoKvvK67r-oB_70vGJ-F2jtrLnwL4EyY_KytpBjVksk4cYbrH90vQUf13xndADhooUwHhNcIjdj4b0SXddV8sziaGZMg51oOTUoEvfcZYLLOvawBwa2clVC5N7QeWdThyphenhypheniMIhJcA/s640/guys_team_europa.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
(ヨーロッパ)アメリカよりも多いぐらいの人が参加していますね。ちょっと意外でした。josevalimさんってここなんですかね?</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMNhhr_8yAE-ieBQy_yFEOp2euqDfQZHgw8zwc1CFxwekxZcr3o8I6lseDkIjOuslf2rmupOnCGH0hFQU8UftDeN9bR3_-ahxCm2TtnEbYRE2UXoQZIGi92YD9o8UNOPNgTO5-jxE0WA/s1600/guys_team_south_america.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="444" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFMNhhr_8yAE-ieBQy_yFEOp2euqDfQZHgw8zwc1CFxwekxZcr3o8I6lseDkIjOuslf2rmupOnCGH0hFQU8UftDeN9bR3_-ahxCm2TtnEbYRE2UXoQZIGi92YD9o8UNOPNgTO5-jxE0WA/s640/guys_team_south_america.png" width="640" /></a></div>
(南米)最近非常に活発なのは、この地域だと思います。見知った顔が一番多いです^o^<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5zjbJp7ostW-dKcOB6ekRMmogw_oC22DjH_SZLL5449Owrt2IpCGYVY6mXhUPXUt1wr_oaOe7dpbdpD9cCNzrgusB5HXlBfe2os75Wvr79tFT0dkoKg_7P31RG6iTy2VkLwym5rcvU0/s1600/guys_team_asia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="368" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgm5zjbJp7ostW-dKcOB6ekRMmogw_oC22DjH_SZLL5449Owrt2IpCGYVY6mXhUPXUt1wr_oaOe7dpbdpD9cCNzrgusB5HXlBfe2os75Wvr79tFT0dkoKg_7P31RG6iTy2VkLwym5rcvU0/s640/guys_team_asia.png" width="640" /></a></div>
(アジア)アジアは少なめですが、インドが非常に活発です。日本からは、松田明さんと恥ずかしながら私めがエントリーです。<br />
<br />
<b>■まとめ</b><br />
プロットしてみると改めて、世界から参加しているのがわかりました。また各種APIを組み合わせて物を作るというのも面白いですね!<br />
<br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-30071230349207904942011-11-23T21:02:00.001+09:002011-12-06T14:48:25.955+09:00こうして僕はrailsを遅くした。そしてそこそこ直した。<br />
最近blogの更新が途絶えがちですが、githubが面白くて(汗)...<br />
<br />
先日、ruby on rails 3.1.2と3.1.3が矢継ぎ早にリリースされたのですが、実は関与者の一人だったりします。自戒の意味もかねて、経緯とかを書いておきます。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/10/31 無作為に選んだissueを直そうと思った。</span></b><br />
<br />
この<a href="https://github.com/rails/rails/issues/3440">issue</a>を調べ始めたのですが、<br />
色々調べてみるとmysqlのdescribeの問題という事が判明し、結果的にschema dumperの出力がバグってるという事が分かった。<br />
<br />
そこで、describeを使わない形(informationスキーマを利用)で修正した。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/06 master/3-1-stableにマージされた。</span></b><br />
<br />
その後やりとりがあって、直ってよかったねという事で取り込まれた。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/18 rails 3.1.2がリリースされた。</span></b><br />
<br />
そりゃま~、ARは初めてだったので嬉しかったです(リリースノートにも名前が載ったし)。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/18深夜 問題発覚。</span></b><br />
<br />
「<a href="https://github.com/rails/rails/issues/3678">ActiveRecord 3.1.2 takes 10 times slower than 3.1.1</a>」というissueがあがる。<br />
良く見てみるとmysqlとあるじゃないか!というのも前のリリースからmysqlについて修正したの私だけ(汗)<br />
<br />
その後、某スペイン人(<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;">Christos Zisopoulosさん</span>)とのやりとりで、"多くのデータベースが存在するmysql"の場合、遅くなる事が判明。<br />
<br />
schema dumperの時のみ、元の修正を利用する、pull requestが取り込まれましたが、<br />
抜本解決ではないので、"show index from"を利用する形で修正を進めた。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/19 早朝 修正完了。</span></b><br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/19 AM9時頃 某スペイン人により効果が確認され、pull requestした。</span></b><br />
<br />
その後、railsコミッタのjonleightonにマージしてもらう(master/3-1-stable)。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/21 sprockets等他の問題も修正され、rails 3.1.3がリリースされた。</span></b><br />
<br />
ちなみにsprocketsは<br />
「windows環境でasset pipe lineが失敗する」<br />
「ファイルの更新が反映されない場合がある」<br />
問題があり、最終的に2.0.xにダウングレードされました。<br />
<br />
途中「速くリリースしろゴラ!」とか言う人がいてビビッタ。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/11/23</span></b><br />
<br />
超大規模なデータセットの場合、問題がある可能性がありそうな為、再度「show create table」を利用する形で調整中。<br />
<br />
<b><span class="Apple-style-span" style="color: red;">・2011/12/5</span></b><br />
<b><span class="Apple-style-span" style="color: red;"><br /></span></b><br />
「show create table」を利用する形での実装が、rails 3.2系に<a href="https://github.com/rails/rails/commit/f3470b08c9f72da56462f7857ef49501cb5f3201">マージ</a>されました。<br />
<b><span class="Apple-style-span" style="color: red;"><br /></span></b><br />
<b><span class="Apple-style-span" style="color: red;">・2011/12/6</span></b><br />
<b><span class="Apple-style-span" style="color: red;"><br /></span></b><br />
さらにrails 3.1系にもback portされました。<br />
<b><span class="Apple-style-span" style="color: red;"><br /></span></b><br />
<b><span class="Apple-style-span" style="color: red;">■雑感</span></b><br />
<br />
・世界中で困っている人がいるかと思うとかなりびびった。某スペイン人には多謝。<br />
・この手の、量に対するテストをどう実施していくかは、そもそも根本的な問題。<br />
・私の嘘英語でも何とかやっていけてるのが驚異的。<br />
・gitはコマンド多すぎるが、かなり便利。<br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-44884504233265412982011-10-30T00:07:00.000+09:002011-10-30T00:07:16.709+09:00(小ネタ)apacheのAddDefaultCharsetはOffにすべきapacheのディレクティブに<b><span class="Apple-style-span" style="color: red;">AddDefaultCharset</span></b>というのがあります。
<br />
<br />
text/htmlやtext/plainの文字列エンコーディングを指定できるのですが、これが厄介です。<br />
<br />
何故なら一般的なブラウザはHTML内のmetaタグでの文字列エンコーディングより、HTTPレスポンスヘッダーの文字列エンコーディングを優先するからです。
<br />
<br />
一つのapacheで複数文字列エンコーディングを指定する場合には<br />
<ul>
<li>metaタグを駆使する</li>
<li>こまめにディレクトリを分けてAddDefaultCharsetを使う</li>
</ul>
とか工夫が必要です。kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-50245931545437785242011-10-21T01:33:00.002+09:002011-10-21T01:33:41.021+09:00githubで既にあるIssueにPull Requestをくっつける方法<h2>概要</h2>
githubではPull Requestを送信する時に自動的にIssueも作成されます。
しかし「既にあるIssueにPull Requestをくっつける」という事がしたくなる場合があります。
<h2>説明</h2>
困ったときのStackoverflowによると、githubはWeb-APIが充実しておりそれを利用すると、実現できるようです。参考ページを参考にするとUnix上でcurlを利用してwebリクエストを送信すると簡単でした。
<pre>
例
$ curl -k \
-d "pull[base]=master" \
-d "pull[head]=master" \
-d "pull[issue]=1234" \
-u "kennyj:xxxxx" \
https://github.com/api/v2/json/pulls/rails/rails
-k SSL証明書の問題?を避ける
-d "pull[base]=master" 送信先のbranch名
-d "pull[head]=master" 送信元のbranch名
-d "pull[issue]=1234" バグ票番号
-u "kennyj:xxxxx" ユーザ名とパスワード
https://github.com/api/v2/json/pulls/rails/rails 送信先のユーザ名とリポジトリ名
</pre>
無駄にIssueを増やさない為にも知ってて損はなさそうです。
<h2>参考</h2>
<a href="http://stackoverflow.com/questions/4528869/how-do-you-attach-a-new-pull-request-to-an-existing-issue-on-github">How do you attach a new pull request to an existing issue on github?</a>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-68895015699502792432011-10-06T02:30:00.000+09:002011-10-06T02:31:04.633+09:00backbone.jsをrails3で実行できるようにするシェルスクリプト(rails3.1対応版)何度も同じ事しているので貼っておきます(rails3.1対応版)。<br />capybara/capybara-webkit/headless対応や、capistrano、staging対応、sub uri対応等を追加しています。<br/>
./gen.sh アプリ名<br />
で利用できます(ノーエラーハンドリング上等!)<br />
<br />
<b>$ cat gen.sh</b><br />
<br />
<script src="https://gist.github.com/1265077.js?file=gen.sh">
</script>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-50811771224817486022011-10-04T02:03:00.000+09:002011-10-04T02:03:08.577+09:00rails3.1 with rspec-request , capybaraでcookieを取り扱うにはrails3.1とrspec-requestsをcapybaraで利用した際に、cookieの扱い方が分からなかったのでメモしておきます。
<br />
<pre class="brush: ruby;"># app/controllers/foo_controller.rb
class FooController < ApplicationController
def index
puts cookies["key1"]
cookies["key1"] = '2'
cookies.permanent["key2"] = "3"
end
end
# spec/requests/foo_spec.rb
describe "foo周辺の仕様" do
def cookies
Capybara.current_session.driver.browser.current_session.instance_variable_get(:@rack_mock_session).cookie_jar
end
it "foo/index" do
cookies["key1"] = '1'
visit "/foo/index"
cookies["key1"].should == '2'
cookies["key2"].should == '3'
end
end
</pre>
上記の検証の過程で、
<ul>
<li>cookiesのキー名は文字列でないといけない(シンボルだと上手くいかない)</li>
<li>cookiesメソッドを上書く必要があり</li>
<li>permanentでも同じように読める("key2")</li>
</ul>
という事が判明しました。<br/>
<br/>
ちなみに各プロダクトは下記の組み合わせで確認しました。<br />
rails-3.1.0<br />
rspec-2.6.0<br />
rspec-rails-2.6.1<br />
capybara-1.0.1kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-72698339581837844902011-09-26T02:03:00.001+09:002011-09-26T02:08:17.309+09:00capybaraをwebkitやseleniumとかで動かす場合の注意点と解決策<h2>■概要</h2>
<br />
capybaraとwebkit(たぶんselenium)を利用する際は、capybara側がブラウザとやりとりする為のスレッドを立ち上げる為<br />
<pre class="brush: ruby">RSpec.configure do |config|
...
config.use_transactional_fixtures = false
end
</pre>
してfixtureのトランザクション制御をあきらめる必要があります。これでは少し都合が悪いので、 <a href="http://ja.asciicasts.com/episodes/257-request-specs-and-capybara">DatabaseCleanerを利用して</a>代用する等行う必要があります。<br />
<br />
ところがrailsコアチームのjosevalim氏が解決策をぼそっとつぶやいてました。実際にやってみると上手く動くだけでなく実行速度がかなり改善されました。<br />
<br />
<h2>■解決策</h2>
<br />
<a href="http://twitter.com/#!/josevalim/status/18195382848">つぶやき</a>で紹介されている<a href="https://gist.github.com/470808">方法</a>は非常に簡単です。<br />
spec_helper(test_helper.rb)で下記の用に追記しましょう。<br />
<pre class="brush: ruby">RSpec.configure do |config|
...
config.use_transactional_fixtures = true
end
# 下記追加
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
</pre>
でいつもどおり<br />
<br />
<i>$ bundle exec rake spec</i><br />
<br />
して見ましょう。specの実行速度が改善したのでは無いでしょうか?<br />
<br />
<a href="http://journal.mycom.co.jp/news/2007/02/20/003.html">ね、簡単でしょう!</a><br />
<br />
@josevalim氏に多謝!kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-80277604093192250022011-09-25T03:11:00.000+09:002011-09-26T02:09:56.294+09:00rails3.0の頃からvalidationにコンテキストを指定できる様になってた<h2>■概要</h2>
railsは従来modelで入力チェックを行ってました。#saveメソッドを呼び出し時に、#valid?メソッドが呼び出される事により、入力チェックを行っている人が多いのでは無いでしょうか?<br />
<br />
ただし、この仕様は、たまに上手く行かない時があり、「XXという画面ではYYの入力チェックだけしたい」というニーズに答えるにはあまり良い方法がありませんでした(泥臭い方法で解決する)。<br />
<br />
ところが、先日railsのソースを読んでいると<br />
<br />
activerecord-3.1.0/lib/active_record/validations.rb<br />
<pre class="brush:ruby"> def valid?(context = nil)
context ||= (new_record? ? :create : :update)
output = super(context)
errors.empty? && output
end
</pre>
とcontextが引数に渡せる仕様になってるので早速試してみました。<br />
<br />
<h2>■検証</h2>
実験用のPostモデルを下記の用にしました。<br />
<pre class="brush:ruby">class Post < ActiveRecord::Base
validates_presence_of :title, :on => :bar
end
</pre>
でrails cで動かしてみました。<br />
<pre>$ rails c
Loading development environment (Rails 3.1.0)
ruby-1.9.2-p180 :001 > post = Post.new<post created_at:="" id:="" nil,="" nil="" title:="" updated_at:="">
ruby-1.9.2-p180 :002 > post.valid?(<span class="Apple-style-span" style="color: red;">:bar</span>)
=> <span class="Apple-style-span" style="color: red;">false</span>
ruby-1.9.2-p180 :003 > post.valid?(<span class="Apple-style-span" style="color: red;">:foo</span>)
=> <span class="Apple-style-span" style="color: red;">true</span>
ruby-1.9.2-p180 :004 > post.save(<span class="Apple-style-span" style="color: red;">:context => :bar</span>)
=> <span class="Apple-style-span" style="color: red;">false</span>
ruby-1.9.2-p180 :005 > post.save(<span class="Apple-style-span" style="color: red;">:context => :foo</span>)
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]]
=> <span class="Apple-style-span" style="color: red;">true</span>
</post></pre>
おぉ!いい感じにcontextを意識できてますね!<br />
ソースを読むとコンテキスト未指定時は、新規なら:create、更新なら:updateをコンテキストとして採用しており、過去との互換性を維持しているという事がわかりました。<br />
<br />
<h2>■雑感</h2>
<a href="https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rb">https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rb</a><br />
で追加されてました。2010/05/10に追加された様です。kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-3156218936482812752011-09-24T01:01:00.000+09:002011-09-24T01:01:23.371+09:00RewriteCondが効かずに困った言わずと知れた、apacheの<i><span class="Apple-style-span" style="color: red;">mod_rewrite</span></i>エンジンですがRewriteCondとRewriteRuleの記述方法にはまってしまいました。普通の書き方は他に任せるとしてハマったポイントを書いておきます。<br />
<br />
<b>■RewriteCondは直後のRewriteRuleのみに適用される。</b><br />
<pre>RewriteEngine On
RewriteCond %{HTTP_REFERER} $^ …①
RewriteRule ^/foo/(.*) /foo2/$1 [L] …②
RewriteRule ^/bar/(.*) /bar2/$1 [L] …③
</pre>
上記の様な設定の時に①は、②にも③にも効きそうですが、実際には②にしか効きません。<br />
だからリファラーがあっても、barはbar2にリダイレクトしてしまいます。<br />
<br />
③にも効かせるには、(冗長ですが)下記の様に書く必要があります。<br />
<br />
RewriteEngine On<br />
RewriteCond %{HTTP_REFERER} $^<br />
RewriteRule ^/foo/(.*) /foo2/$1 [L]<br />
<span class="Apple-style-span" style="color: red;">RewriteCond %{HTTP_REFERER} $^ # 同じ記載をする!</span><br />
RewriteRule ^/bar/(.*) /bar2/$1 [L]<br />
<br />
<b>■RewriteCondはRewriteRuleの後に評価される。</b><br />
<br />
RewriteEngine On<br />
RewriteCond %{HTTP_REFERER} $^<br />
RewriteRule ^/foo/(.*) /foo2/$1 [L]<br />
<br/>
<div>
上記の設定の場合「リファラーが空なら、リクエストが/foo/*の場合、/foo2/*へリダイレクト<span class="Apple-style-span">」</span><span class="Apple-style-span">と思いたい所ですが、実際には「<span class="Apple-style-span" style="color: red;">リクエストが/foo/*の場合、リファラーが空なら、/foo2/*へリダイレクト</span>」という処理の流れになります。</span><br /><br />
<span class="Apple-style-span">「何でRewriteLogLevelを上げて見てみても、RewriteCond実行されてない!効いてないんちゃうか?」って時はこれが原因の可能性が高いです。</span><br />
</div>
kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com5tag:blogger.com,1999:blog-6648305517577816468.post-85357655896951847752011-09-20T01:30:00.000+09:002011-09-20T01:37:41.593+09:00spec実行時にdb:test:prepareを呼び出したくない。<br />
<b>■概要</b><br />
<br />
(激しく既出感ありですが。。)何年もrailsやってますが、正しく理解できていなかった事の一つに<br />
<br />
<span class="Apple-style-span" style="color: red;"> <i>rake spec(test)</i>すると、処理の一環としてdb:test:prepareタスクを呼び出す</span><br />
<br />
という挙動があります。<br />
通常問題にならないのですが、db:test:prepareが、db/schema.rbの情報を元にデーターベースを作成する為、railsが認識できないような項目は抜けて落ちてしまいます。<br />
<br />
<ul>
<li>関数適用したインデックス</li>
<li>トリガーやファンクション</li>
<li>別スキーマに作ったオブジェクト ...etc</li>
</ul>
<br />
なので<br />
<br />
<i>RAILS_ENV=test rake db:drop</i><br />
<i>RAILS_ENV=test rake db:create</i><br />
<i>RAILS_ENV=test rake db:migrate</i><br />
<br />
してから<i>rake spec</i>する事を前提に、db:test:prepareを呼び出さずにspecを実行する方法を模索しました。<br />
<br />
<b>■案1 db:test:prepare自体を書き換える</b><br />
<br />
参照先にそのまんまの解決策が書かれています。<br />
Rakefileでtask削除用のメソッドを用意します(load_tasksの前に!)。<br />
<pre class="brush: ruby">Rake::TaskManager.class_eval do
def remove_task(task_name)
@tasks.delete(task_name.to_s)
end
end
</pre>
<br />
lib/tasks/db/test.rakeとかを作って、実際にタスクを上書きします<br />
<pre class="brush: ruby">Rake.application.remove_task 'db:test:prepare'
namespace :db do
namespace :test do
task :prepare do |t|
# rewrite the task to not do anything you don't want
end
end
end
</pre>
<br />
参考 <a href="http://stackoverflow.com/questions/1097845/how-to-prevent-rake-test-to-call-task-dbtestprepare">http://stackoverflow.com/questions/1097845/how-to-prevent-rake-test-to-call-task-dbtestprepare</a><br />
<br />
<b>■案2 自力でspecを実行する</b><br />
<br />
db:test:prepareを壊すのは怖いので...という方にはこのやり方<br />
<br />
lib/tasks/spec.rakeとかを作って<br />
<pre class="brush: ruby">require 'rake'
require 'rspec/core/rake_task'
namespace :spec do
RSpec::Core::RakeTask.new('no_prepare_db') do |t|
t.pattern = ['spec/**/*_spec.rb']
end
namespace :no_prepare_db do
%w(controllers helpers lib mailers models requests routing views).each do |dir|
RSpec::Core::RakeTask.new(dir) do |t|
t.pattern = ["spec/#{dir}/**/*_spec.rb"]
end
end
end
end
</pre>
で、<i>rake spec:no_prepre_db</i>や、<i>rake spec:no_prepare_db:models</i>で、db:test:prepareを呼び出さずに実行できます。<br />
<br />
参考 <a href="http://old.nabble.com/db%3Atest%3Aprepare-interfering-with-rake-spec-pattern-td31075510.html">http://old.nabble.com/db%3Atest%3Aprepare-interfering-with-rake-spec-pattern-td31075510.html</a><br />
<br />kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-72207235665715490402011-09-18T01:04:00.000+09:002011-09-18T21:14:56.919+09:00rails3.1時代のautocompleteは(一部駄目だし)railsを始めて触った時は、圧倒的に簡単に利用できるautocomplete機能に驚かされたものです(あ~懐かしい。。)。<br />
あるバージョンからautocompleteはplugin側に外れたのですが、rails3時代にはどのplugin(gem)が利用されているんでしょうか?<br />
rails3.1からはjqueryが標準になったので、rails3 - jquery - autocompleteという切り口で探してみました。<br />
すると、そのまんまなgemがありました。<br />
<a href="https://github.com/crowdint/rails3-jquery-autocomplete">https://github.com/crowdint/rails3-jquery-autocomplete</a><br />
<br />
<b>■インストール</b><br />
<br />
Gemfileに<br />
gem 'rails3-jquery-autocomplete'<br />
<br />
でinstall<br />
$ bundle install<br />
<br />
次にコード生成して<br />
rails generate autocomplete:install<br />
<br />
# generatorのrails3.1対応はまだみたいなのでautocomplete-rails.jsは、public/assets/javascripts<br />
# に手動コピーしましょう。<br />
<br />
<strike>jsを読み込みましょう</strike><br />
<strike>javascript_include_tag "autocomplete-rails.js"</strike><br />
<br />
application.jsでjquery-uiを読み込む用にしましょう。<br />
//= require jquery-ui<br />
<br />
後defaultではcssがしょんぼりなので、public/assets/stylesheetsに<br />
<a href="https://raw.github.com/crowdint/rails3-jquery-autocomplete-app/master/public/stylesheets/jquery-ui-1.8.2.custom.css">https://raw.github.com/crowdint/rails3-jquery-autocomplete-app/master/public/stylesheets/jquery-ui-1.8.2.custom.css</a><br />
をおきましょう。<br />
<br />
<b>■利用方法</b>
<br />
controllerに<br />
class ProductsController < Admin::BaseController<br />
# モデル名、フィールド名<br />
autocomplete :brand, :name<br />
end<br />
<br />
routes.rbに<br />
resources :products do<br />
get :autocomplete_brand_name, :on => :collection<br />
end<br />
<br />
最後にviewに<br />
<%= form_for @product do |f| %><br />
<%= f.autocomplete_field :brand_name, autocomplete_brand_name_products_path %><br />
<% end %><br />
<br />
<div>
<a href="http://journal.mycom.co.jp/news/2007/02/20/003.html">ね、(そこそこ)簡単でしょう!</a><br />
<br />
<b>■いくつか残念な点</b><br />
<br />
調べてみて感じた残念な点<br />
<ol>
<li>rails3.1対応はまだ</li>
<li>rspec-request用のサポートが欲しい</li>
<li>label/valueに適応されるmethodが同じ</li>
<li>term以外の動的要素に対応できない</li>
</ol>
ぼやいててもしょうがないので、やれる事はやろう(続く)<br />
<br />
<b>2011/09/18</b> 上記4に対応してみました。<a href="https://github.com/kennyj/rails3-jquery-autocomplete">https://github.com/kennyj/rails3-jquery-autocomplete</a><br />
gem 'rails3-jquery-autocomplete', :git => git://github.com/kennyj/rails3-jquery-autocomplete.git<br />
で使えると思います。<br />
<br />
<b>2011/09/18</b> 上記1にも対応してみました(rails3.1 branch) 上記に, :branch => 'rails3.1' を追加すると利用できるはずです。<br />
<br />
<b><span class="Apple-style-span" style="font-weight: normal;"><b>2011/09/19</b> 上記2はspec_helper.rbで、require 'steak/autocomplete' して、config.include Steak::Autocomplete, :type => :request すればrspec-requestsでも動きました。</span></b></div>
kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-73624727881097785662011-09-07T02:12:00.000+09:002011-09-11T12:41:33.099+09:00rails3.1.0でasset pipe lineの問題発見(と解決方法)<b>■概要</b>
<br />
rails3.1.0で、productionモードにてasset pipe lineを使うには、一般的には rake assets:precompile を利用すると思いますが(さもなくばエラーになります)、実行すると下記の用になります。
<br />
<pre>$ rake assets:precompile
$ ls -la public/assets/
合計 544
drwxrwxr-x 2 kj kj 4096 9月 6 01:33 .
drwxrwxr-x 3 kj kj 4096 9月 6 01:33 ..
-rw-rw-r-- 1 kj kj 96110 9月 6 01:27 application-2438fd50052a4a5b81204dc6fb.js
-rw-rw-r-- 1 kj kj 33515 9月 6 01:27 application-2438fd50052a4a5b81204dc6fb.js.gz
-rw-rw-r-- 1 kj kj 0 9月 6 01:27 application-4635849c44627859332fda6a01.css
-rw-rw-r-- 1 kj kj 20 9月 6 01:27 application-4635849c44627859332fda6a01.css.gz
-rw-rw-r-- 1 kj kj 91273 8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js
-rw-rw-r-- 1 kj kj 32054 8月 15 22:49 jquery-ed8d29566738ad005e19fe1c2d.min.js.gz
-rw-rw-r-- 1 kj kj 198431 8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js
-rw-rw-r-- 1 kj kj 50610 8月 15 22:49 jquery-ui-2a28fc84ad0e0e47e46cbf901c.min.js.gz
-rw-rw-r-- 1 kj kj 318 9月 6 01:33 manifest.yml
-rw-rw-r-- 1 kj kj 6646 9月 6 01:26 rails-a560b5a3a7be0808c5cd76a798.png
</pre>
上記に<b><span class="Apple-style-span" style="color: red;">jqueryとjquery-uiが含まれている事が理解できません</span></b>。application.jsの中にはjqueryが内包されています。またjquery-uiはSprocketsのディレクティブで指定もしていません。良くわからない挙動なので追跡してみました。
<br />
<br />
<b>■原因</b>
<br />
actionpack-3.1.0/lib/sprockets/assets.rake にdebuggerを仕込み動きを追いましたが、
<br />
<pre>
26 config.assets.precompile.each do |path|
27 env.each_logical_path do |logical_path|
28 if path.is_a?(Regexp)
29 next unless path.match(logical_path)
30 else
31 next unless File.fnmatch(path.to_s, logical_path)
32 end
33
...
</pre>
上記の28行目のpathは、config.assets.precompileの配列のメンバーですが、デフォルトでは
<br />
<span class="Apple-style-span" style="color: red;"><b>[ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]
</b></span><br />
になっています(railties-3.1.0/lib/rails/application/configuration.rb 38行目)
<br />
上記配列の一番目は、rails.png等jsやcss以外の為に存在しますが、このままではjquery.min.jsやjquery-ui.minjsも29行目でヒットしてしまうじゃないか!!!という事に気付きました。
<br />
<br />
<b>■解決方法</b>
<br />
直してやれ!と思いましたが既に<a href="https://github.com/rails/rails/pull/2876">問題</a>になってました。よって
<br />
<ul>
<li>上記もうすぐ取り込まれそうなので3.1.1?を待つ</li>
<li>とりあえず<b>config/environments/production.rb</b>で<b> config.assets.precompile = [ /\.(?!js$|css$)\w+$/, /application.(css|js)$/ ] </b>とする</li>
</ul>
辺りで対応しましょう。
<br />
<br />
<b>■2011/09/11追記</b>
<br />
解決されている様です。あるべき姿になった感じです! <a href="https://github.com/rails/rails/commit/082f53a3bca9dce70adcf41094e246d2c9fed934">https://github.com/rails/rails/commit/082f53a3bca9dce70adcf41094e246d2c9fed934</a>kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-63797384644858164632011-08-23T01:02:00.001+09:002011-08-23T01:04:03.553+09:00capybara-webkitを動かす 2011/08/23時点版■概要<br />
<br />
<a href="http://d.hatena.ne.jp/babie/20110430/1304136144">こちら</a>の素晴らしい記事では、capybara-webkitを利用して、headlessでjsが動く環境を紹介されています。<br />
<br />
capybara-webkitのこれまでリリースされているバージョン(~0.5.0)では、capybara1.0.0系への依存が解決できない為、抗う方法をご紹介されています。が、0.6.0からは上手く依存関係を解決されるようになりました!<br />
<br />
■手順<br />
<br />
<a href="http://kennyj-jp.blogspot.com/2011/04/javascriptciphantomjs1.html">こちら</a>と同様ですが、Xvfbとqtの当たらしいバージョン(qt47)をインストールしておきます。<br />
qt47にする理由はphantomjsも動かしたいからです ^o^<br />
<br />
$ sudo yum -y install firefox ★ seleniumで動かす必要があれば<br />
$ sudo yum -y install xorg-x11-server-Xvfb xorg-x11-fonts*<br />
$ sudo vim /etc/yum.repos.d/atrpms.repo<br />
<br />
[atrpms]<br />
name= CentOS-$releasever - ATrpms<br />
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/testing/<br />
gpgcheck=1<br />
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms<br />
enabled=0<br />
<br />
$ sudo rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms<br />
$ sudo yum -y install sqlite --enablerepo=atrpms ★依存関係からインストールする必要がある?<br />
$ sudo yum -y install qt47-devel qt47-webkit qt47-webkit-devel --enablerepo=atrpms<br />
$ sudo ln -s /usr/bin/qmake-qt47 /usr/bin/qmake (コンパイル時に必要とされるので予め作成)<br />
<br />
でrailsプロジェクト側で<br />
<br />
$ vim Gemfile<br />
<pre class="brush: ruby">group :development, :test do
...
gem 'capybara', '1.0.1'
gem 'capybara-webkit', '0.6.0'
gem 'headless', '0.1.0'
...
end
</pre>$ bundle install<br />
$ vim spec/spec_helper.rb<br />
<pre class="brush: ruby">...
require "capybara/rails"
require "capybara/rspec"
...
RSpec.configure do |config|
...
end
Capybara.javascript_driver = :webkit
</pre>$ vim spec/support/headless.rb<br />
<pre class="brush: ruby">if %w(yes y on).include?(ENV['HEADLESS'])
require 'headless'
headless = Headless.new
headless.start
at_exit do
headless.destroy
end
end
</pre>$ vim spec/requests/index_spec.rb<br />
<pre class="brush: ruby"># coding: utf-8
require 'spec_helper'
describe "Index" do
describe "GET /" do
it "/index.html", :js => true do
visit "/"
click_link "About your application’s environment"
page.should have_content("No route matches")
end
end
end
</pre>で<br />
$ HEADLESS=on bundle exec rspec spec/requests/index_spec.rb<br />
<pre>Index
GET /
<span class="Apple-style-span" style="color: lime;">/index.html</span>
Finished in 4.48 seconds
<span class="Apple-style-span" style="color: lime;">1 example, 0 failures</span>
</pre>という訳でいい感じに実行できました~kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0tag:blogger.com,1999:blog-6648305517577816468.post-6596342643831150672011-08-20T03:40:00.001+09:002011-08-23T20:42:34.437+09:00javaの32bitと64bitの使い分けにはご注意を最近では64bit OS環境が広く利用されている事と思います。<br />
一般的に64bit環境での32bitコマンドの実行は問題が無いと思いますが、java関係で二つ程問題が発生したので記録しておきます。<br />
<br />
<b>■Tomcatが起動出来なくなった。</b><br />
<br />
64bit => 32bit javaに変更した所、Tomcatが起動しなくなりました。調べてみるとTomcat本体の問題では無かったのですが、jsvcを利用して起動している為、問題が発生しているようです(TOMCAT_HOME/bin/startup.sh等では問題なく起動しました)。<br />
<br />
一部推測混じりですが<br />
<br />
・jsvcを利用するにはコンパイルが必要<br />
・コンパイル時には、configureを実行<br />
・configureのログをよく見てみると、linux自体を"x86_64"と判定<br />
・よってjavaは64bit版を想定してコンパイルしてしまう(推測)<br />
<br />
という理由で上手く行かなくなったのではと思われます。<br />
<br />
結論:jsvcを利用する場合は、32/64bitをOSとあわせる必要があります。<br />
<br />
<b>■rjb(ruby java bridge)が動かなくなった。</b><br />
<br />
こちらも64bit => 32bit javaに変更した所、動かなくなりました。ruby側からJava VMを作成できなくなるようです。<br />
<br />
但し上記問題を解決しても、javaのマイナーバージョン違いで急に動かなくなる場合を確認しています(jdk6u22 => jdk6u23)。ログを見た限りではGC発生タイミングでseg faultしてしまうようです。<br />
<br />
リリースノートを見ている限りでは、hotspot vmのバージョンが上がったから?等推測してますが根本原因は判明しませんでした。<br />
<br />
結論:rjbを利用する場合は、32/64bitをOSとあわせる必要があります。またマイナーバージョン含め実績のあるjava/rubyのバージョン組み合わせ・設定を大事にする必要があります。kennyjhttp://www.blogger.com/profile/06686486481177575296noreply@blogger.com0