RubyKaigi 2013の感想など
生まれかわった RubyKaigi RubyKaigi 2013 に参加しました。
今回も私の会社 EY-Office は スポンサー (一番小さいのですが)になりました。 現在のEY-Officeの売り上げのほとんどが Ruby, Ruby on Railsの教育なので当然ですよね ^^)
RubyKaigi全体の感想など
Matz がいる RubyKaigi
今までのRubyKaigiは土日開催が多く、Rubyのパパ Matz(まつもとさん)は宗教上の理由から土曜夜の帰ってしまわれる事が多かったと思います。
しかし、今回は木金土開催だったので、いつもMatzが会場にいました。 にこにこと質問に応じてくれるMatz 、お弁当を配ってくれるHeroku社員のMatz、 ボッチのMatz 。。。 私も Rubyの質問をゆっくりと出来ました。
Matz がいる Rubykaigi は Matz is nice so we are nice. が感じられる良い空間になってたと思う。
みんなと語りあえる Bentou のありがたさ
今回は Heroku が Bentou スポンサーとして、毎日の昼ご飯を提供してくれました。おかげで、お店に行ったりする時間が要らず、いろいろな参加者と話す事が出来、有形無形の得るものがりました。
Herokuさんありがとうございます。Microsoftさんも飲み物ありがとうございます。
しかし、語り合えない
@a_matsuda さんが、なぜ(日本人)みんなは、いつも使ってるモジュールやツールの作者の(外人の)開発者が来てるのに、話さないのかな? と言われ・・・・
その晩、考えました。
- 便利に使ってるモジュール・ツールでも、使ってるだけで、そのコードを読んだりしてない。したがって作者も知らない
- これは、日本人の作者でも同じで、使っていても、そのモジュール・ツールそのものに興味をもっていない事が多い
- 何か自分のやりた事が出来そうで出来ない時などはコードを読むが、そうい機会はそんなに多くない
- 英語力の低さ(低いと思ってる意識)もあり「素晴らしいモジュール・ツールをありがとう」と声をかける事が出来ない
- 上の2つが関連し、そのモジュール・ツールに興味があれば、拙い英語でも質問をしたくなるし、技術的な話しなら出来そうだけど、一般的なお話が出来る英語力は無いよ・・・
しかし、技術は圧倒的に英語圏で生まれるいまの時代、このようなチェンスに話しが出来ないのは本当にもったいないよな。
英語がんばろう! コードもたくさん読もう!
Ruby on Railsの人がたくさん登壇
以前より Ruby on Railsの人(と思える人)のセッションが増えたと思います。しかも、彼らの多くも Rubyの事を語っていました。
昔からRubyを使っていた人たちと、Ruby on Railsを使ってる人の溝みたいな物が、凄く小さくなっているように思え嬉しかった。
角谷さんの RubyKaigi
角谷さんは世界で一番 RubyKaigi の事を考え、時間を使っている人だ。 1年の休みを取ってからの 2nd Season の RubyKaigiが現実になり、緊張したり、焦ったりしながらも、輝いてる Kaigi屋の 角谷さんを 久しぶりに見られたのも 嬉しかった。
技術的な収穫
オブジェクト指向の再来
オブジェクト指向が今ほど広まっていなかった昔、一部のエンジニアたちが熱く語っていたオブジェクト指向。時は流れ Ruby on Rails を始めオブジェクト指向は一般的になりたくさんの場所で使われ出してみると、あらたな問題が出てくる・・・ 今回のRubyKaigiでも DCI, Refactoring Fat Models with Patterns、Refinement .... オブジェクト指向の古典と、さらにRubyらしい新しい形の話しが聞けた。今後も楽しみ。
RubyMotion
登場したときに、これは面白い! と思った RubyMotion でしたが、購入後まったく触っていませんでした、今回 RubyMotion がどのような仕掛けになっているのかが判りました。
そしてその面白さに惹かれて、現在あるアイデアを実装出来るのか試しています。Objective-Cが抵抗なく書ける私ですが、案外 面白い事が出来そうだとワクワクしています。
年を取った
Matzの髪の毛や髭に白いものが混じって来て・・・ という話しではなく。3日間の密度の高いRubyKaigiに参加するのは体力が無く3日目は疲れていて、ついつい居眠りをしてました ^^;
歳を取ったなぁ〜 と思い知らされました。 でも老体にむち打って来年も参加します!
来年もスポンサーになれるようにがんばって仕事しよう !!
今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0RC1 を試したい人向けのメモ
以前書いた 今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0beta1 を試したい人向けのメモ より、だいぶ楽になったので書きました。
警告
- 一応EY-Office教育テキスト(Rails, RSpec)のコードが動くところを確認しましたが、Rails4.0RC1の動作を保証するものではありません
- もしMacやLinux環境が使えるなら、そちらを使う事を強くお勧めします
- irb, rails consoleでワーニングが出ます → Stack Overflow
- Windows7(64bit)で試しました、WindowsXP等で動くかどうかわかりません
- RailsInstaller も Ruby2.0.0に対応したインストラーを準備しているようなので、そちらを待つのも良いかもしてません
インストールの概要
- Rubyのインストールは RubyInstaller+DevKit を使用
- Railsのインストル は普通に gem
- sqlite3 は http://packages.openknapsack.org/sqlite/sqlite-3.7.15.2-x86-windows.tar.lzma を使用
インストール手順
- http://rubyinstaller.org から Ruby 2.0.0-p125 と DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe をダウンロードし、インストール
- インストール先は C:\Ruby200 等にしましょう
- PATH に C:\Ruby200\bin を追加しましょう(インストラーで設定)
- DevKitのインストールは訳あって C:\Ruby200\DevKit にしました
> gem update --system -N > gem install bundler -N > gem install rails --version 4.0.0.rc1 -N > rails new dummy
- sqlite3 (sqlite3-1.3.7-x86-mingw32)は動かないのでアンインストール
gem uninstall sqlite3
- SQLite3のインストール
- http://packages.openknapsack.org/sqlite/sqlite-3.7.15.2-x86-windows.tar.lzma を C:\temp に ダウンロードし展開、ついでに sqlite3.exe をPATHの通っている場所にコピー
> cd C:\temp > C:\Ruby200\DevKit\mingw\bin\bsdtar.exe -xvf sqlite-3.7.15.2-x86-windows.tar.lzma > copy bin\sqlite3.exe C:\Ruby200\bin
- sqlite3の再インストール
> gem install sqlite3 -N --platform=ruby -- --with-opt-dir=C:\temp
- Ruby on Rails の動作が確認できたら C:\temp は削除してかまいません
プロジェクト作成時の注意
新規にRailsプロジェクトを作る際に bundle が動くと、また動作しないsqlite3-1.3.7-x86-mingw32がインストールされてしまうので以下のように、プロジェクトを作成すると良いでしょう
> rails new rails_app -B > cd rails_app > bundle install --local
まちがって、普通に rails new rails_app してしまった時は sqlite3-1.3.7-x86-mingw32 をアンインストールすれば OK
>gem uninstall sqlite3 Select gem to uninstall: 1. sqlite3-1.3.7-x86-mingw32 2. sqlite3-1.3.7 3. All versions > 1 Successfully uninstalled sqlite3-1.3.7-x86-mingw32
おまけ
この方法で作った C:\Ruby200 をコピーしPATHを設定するだけで、簡単に他のPCに Ruby on Rails環境をコピーできます ^^)
今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0beta1 を試したい人向けのメモ
なんとか、Windows7 で Ruby 2.0.0 + Rails 4.0beta1 を動かせたので、そのときのメモです。
警告
インストールの概要
- Rubyのインストールは RubyInstaller+DevKit を使用
- Railsのインストル は普通に gem
- 問題点は
- OpenSSL 利用時に証明書エラーが発生
- sqlite3 (sqlite3-1.3.7-x86-mingw32)がRuby2.0 に対応してない
インストール手順
- http://rubyinstaller.org から Ruby 2.0.0-p0 と DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe をダウンロードし、インストール
- DevKitのインストールはGitHubやネット上の情報を参照して下さい
- インストール先は C:\Ruby200 等にしましょう
- PATH に C:\Ruby200\bin を追加しましょう(インストラーで設定)
- SSL証明書の設定
- http://curl.haxx.se/docs/caextract.html から cacert.pem をダウンロードし、C:\Ruby200\cert.pem にコピー
- コマンドプロンプトで set SSL_CERT_FILE=C:\Ruby200\cert.pem を実行 (環境変数に設定してもよい)
- Rails のインストール (コマンドプロンプト)
gem install rails --version 4.0.0.beta1 --no-ri --no-rdoc rails new dummy
- sqlite3 (sqlite3-1.3.7-x86-mingw32)は動かないのでアンインストール
gem uninstall sqlite3
- SQLite3のインストール
- http://www.sqlite.org/sqlite-autoconf-3071502.tar.gz をダウンロード、C:\sqlite-autoconf-3071502 へ展開
- SQLite3のビルド
set PATH=%PATH%;C:\Ruby200\DevKit\bin;C:\Ruby200\DevKit\mingw\bin bash cd c:/sqlite-autoconf-3071502 ./configure --prefix=c:/sqlite3 make mkdir c:/sqlite3 make install cp c:/sqlite3/bin/* c:/Ruby200/bin
- sqlite3の再インストール
gem install sqlite3 --platform=ruby -- --with-sqlite3-include=c:/sqlite3/include --with-sqlite3-lib=c:/sqlite3/lib
以上です ^^;
謝辞
sqlite3 gem のインストールは sqlite3 gemコミッターの Lavena さんに助けてもらいました m(_ _)m
Ruby on Rails中級者コースを始めました。
私の会社EY-Officeでは、Ruby on Rails中級者コース を始めました → http://www.ey-office.com/blog_archive/2012/11/13/in-new-ruby-on-rails-education/
このコースは、たんにRuby on Railsの知識を深めるのでは無く、Ruby on Railsを使って実際のアプリ・サービスを作る為に必要な技術・知識を学んでもコースです。
弊社のRuby on Rails入門コースを受講してない方でも、大歓迎です!
Ruby on Rails 3 の Ajax いろいろ
今さら感はありますが、Rails3 の Ajax 実装の方法を紹介します。
Rails3.1 から jQuery がデフォルトになり、AjaxもRails2の頃とは違うスタイルなりました。また、幾つかのパターンが選べるようになりました。
ここでは上の画像のように、 rails g scaffold todo due:date task:string で作ったアプリのshow がindex画面に表示される簡単な Ajax アプリで説明します。
1. Rails2 に近いやり方
Rails2 では、view にjavascriptを書かずに ajax アプリを書けるようになっていましたが、それに近い方法は、
- index.html.erb の showへのリンクに :remote => trueを指定し、Ajax用の表示エリア div.show_area を置きます。
<% @todos.each do |todo| %> .... <td><%= link_to 'Show', todo, :remote => true %></td> ... <% end %> ... <div id="show_area"></div>
- todos_controller.rb の show メソッドの表示に javascriptリクエストに対応する format.js を追加
def show @todo = Todo.find(params[:id]) respond_to do |format| format.html # show.html.erb format.js # show.js.erb format.json { render json: @todo } end end
- show.js.erb テンプレートを追加し、ブラウザーで実行される javascript を書きます。
$('#show_area').html("<%= raw(j(render :partial => 'show_body')) %>")
2. jquery_ujs のcallbackを使う方法
jquery_ujsではサーバー側とブラウザー側が明確に分かれていて、jQueryが分かる人には最適かと思います。
- index.html.erb の showへのリンクには、もう少しおまじないが追加されます。これは、サーバーに javascriptではなく、htmlを戻してくれという指示です。
... <td><%= link_to 'Show', todo, :remote => true, "data-type" => "html", :class => 'show' %></td> ...
- todos_controller.rb の show メソッドは、Javascriptからのリクエスト時にはlayoutを使わないようにするだけです。
def show @todo = Todo.find(params[:id]) respond_to do |format| format.html { render layout: (request.headers["X-Requested-With"] != 'XMLHttpRequest') } format.json { render json: @todo } end end
- 最後にサーバーから送られて来たhtmlをdivに入れるJavascriptをindex.html.erb に追加します。jquery_ujsではサーバーからデータを受け取った時に ajax:success イベントが発生しますので、それを受け取るリスナーを書いてあげます。注意点としては リスナーの引数 status に サーバーからのhtmlが入る点です。 data ではありません!
<div id="show_area"></div> <%= javascript_tag do %> $('a.show').on('ajax:success', function (data, status, xhr) { $('#show_area').html(status); }) <% end %>
3. jQuery のみ
jQueryはとても強力で、かつ簡潔に記述できるJavascriptライブラリーです。:remote => true を使わなくても jQuery だけでも Ajaxアプリは書けます。
- index.html.erb の Showリンクをクリックした時に、jQueryの .getメソッドでサーバーにリクエストを送り、受け取った結果を div に書き込めば良いのです。
- 以下のような簡単なコードです。 ちなみに、サーバー側は、2. と同じです。
<% @todos.each do |todo| %> .... <td><%= link_to 'Show', "#", "data-id" => todo.id, :class => 'show' %></td> .... <%= javascript_tag do %> $('a.show').click(function() { $.get("<%= todo_path(9999) %>".replace('9999', $(this).data('id')), function(data) { $('#show_area').html(data) } ) }) <% end %>
使い分け
2. のスタイルが Rails3の標準でしょうか?
1.のスタイルは単純なAjaxには良いかもしれませんが複雑な Javascriptアプリは書けませんし、デバックも大変なので Rails2のアプリをアップグレードした場合以外にはあまり使われないかと思います。
また、表示にJavascript を多用したサイトであれば、jquery_ujs にこだわらない 3. のスタイルも良いかもしれません。
.
最近作った Jekyll (Liquid) のプラグイン
最近作った、Jekyll (Liquidテンプレート) のプラグインの解説を書きます。Jekyllの良いところは、Rubyプログラマーなら簡単に独自タグ等のプラグインが書けるところです。ただし、情報が少ないので参考になれば嬉しいです。
1. h1タグに付けた番号を引き継げる h2タグ
テキストを書いていると 1. Ruby入門 ... 1.1 リテラル ... 1.2 式 ... 1.3 制御構造 ... のように連番のサブタイトルを書きますが、途中に章が追加さると番号を振り直さないといけません。そこで、サブタイトル(h2)の連番を タイトル(h1) から引き継いだ連番を自動生成すれば良いわけです。
このタグはこのように使います、これで <h2>1.1 リテラル</h2> ... <h2>1.2 式</h2> ... <h2>1.3 制御構造</h2> ... が生成されます
{% h1 1 Ruby入門 %} ... {% h2 リテラル %} ... {% h2 式 %} ... {% h2 制御構造 %} ...
コードは以下のようになります。
module Jekyll class SequencedH1Tag < Liquid::Tag def initialize(tag_name, text, tokens) @h1_text = text super end def render(context) context['h1_seq'] = @h1_text.to_i context['h2_seq'] = 0 "<h1>#{@h1_text}</h1>" end end class SequencedH2Tag < Liquid::Tag def initialize(tag_name, text, tokens) @h2_text = text super end def render(context) context['h2_seq'] = context['h2_seq'] + 1 "<h2>#{context['h1_seq']}.#{context['h2_seq']} #{@h2_text}</h2>" end end end Liquid::Template.register_tag('h1', Jekyll::SequencedH1Tag) Liquid::Template.register_tag('h2', Jekyll::SequencedH2Tag)
2. テーブルの幅(%)指定タグ
これは
{% table_width table1 30,8,8 %} table(table1). |_. Railsのバージョン |_. Ruby1.8.X |_. Ruby1.9.X | | 2.3.X |=. ○ |=. x | | 3.0.X |=. ○ |=. ○ | | 3.1.X |=. ○ |=. ○ | | 3.2.X (現在) |=. ○ |=. ○ | | 4.0.X (次期) |=. x |=. ○ |
のように書くと下のような幅が指定されたテーブルが生成されます。
... | ... | は Textile のテーブルで table(table1). でテーブルに table1というクラス名を付けています。 我ながら便利だと思います ^^)/ |
<style type="text/css"> .table1 {width: 46%;} .table1 td:nth-child(1) {width: 30%;} .table1 td:nth-child(2) {width: 8%;} .table1 td:nth-child(3) {width: 8%;} </style> <table class="table1"> <tr> <th>Railsのバージョン </th> <th>Ruby1.8.X </th> <th>Ruby1.9.X </th> </tr> <tr> <td> 2.3.X </td> <td style="text-align:center;">○ </td> <td style="text-align:center;">x </td> </tr> <tr> <td> 3.0.X </td> <td style="text-align:center;">○ </td> <td style="text-align:center;">○ </td> </tr> ・・・・ </table>
コードは以下で <style ...> 〜 </style>を生成しています。
module Jekyll class TableWith < Liquid::Tag Syntax = /(.*)\s+([\d,]+)\s*/o def initialize(tag_name, markup, tokens) if markup =~ Syntax @table_class = $1 @width_array = $2.split(/,/).map{|e| e.to_i} else raise SyntaxError.new("Syntax Error in 'table_width' - Valid syntax: table_width [class of table] [width, width...]") end end def render(context) s = %|<style type="text/css">\n| s += " .#{@table_class} {width: #{@width_array.inject(0){|x,s| s += x}}%;}\n" @width_array.each_with_index {|w, ix| s += " .#{@table_class} td:nth-child(#{ix + 1}) {width: #{w}%;}\n"} s += "</style>\n" s end end end Liquid::Template.register_tag('table_width', Jekyll::TableWith)
- initializeメソッドの引数の解釈やエラーメッセージの表示は Liquid テンプレート コード https://github.com/Shopify/liquid の定型です
- TextileとLiquid の適応の順番ですがですが、Textile が先に適応されます
3 「この章の目標」タグ
これは
{% goalbox %} * TDDを知る * RSpecについて理解する * 受け入れテストを知る {% endgoalbox %}
が 下のような tableになります
<table class="goalbox"> <tr><th>この章の目標</th></tr> <tr> <td> <ul> <li>TDDを知る</li> <li>RSpecについて理解する</li> <li>受け入れテストを知る</li> </ul> </td> </tr> </table>
コードは
# -*- encoding : utf-8 -*- module Jekyll class GoalBox < Liquid::Block def render(context) output = super %|<table class="goalbox"> <tr><th>この章の目標</th></tr> <tr> <td> #{output} </td> </tr> </table>| end end end Liquid::Template.register_tag('goalbox', Jekyll::GoalBox)
- Liquid::Blockを使うとコンテンツを持つタグが作れます。閉じタグは end〜 になります。
- コンテンツの文字列は親クラスからもらいます
Redmineをバージョン 2.0 に上げてみた
Redmine 2.0.0 がリリースされてから時間が経ってしまいましたが、今まで使っていた 1.0.2 を 最新の 2.0.3 にアップデートしてみました。
インストール
アップデートの手順は、Redmine 2.0.3 をインストールし、1.0.2 から DB と添付ファイルをコピーすることにしました。
Redmine 2.0.3 のインストール
% wget http://rubyforge.org/frs/download.php/76259/redmine-2.0.3.tar.gz % tar xzf redmine-2.0.3.tar.gz % ln -s redmine-2.0.3 redmin % cd redmin
Gemインストール(bundle)
Gem のインストールは bundle で簡単。ただしデフォルトの Gemfile には MySQL,PostgreSQLなども書かれていますので不要なものは コメントアウトします。
LDAPやOpenIDも使わないのですが、インストールしないとサーバーが起動しませんでした・・・・
今回の Gemfile
source 'http://rubygems.org' gem 'rails', '3.2.6' gem 'prototype-rails', '3.2.1' gem "i18n", "~> 0.6.0" gem "coderay", "~> 1.0.6" gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "builder" # Optional gem for LDAP authentication group :ldap do gem "net-ldap", "~> 0.3.1" end # Optional gem for OpenID authentication group :openid do gem "ruby-openid", "~> 2.1.4", :require => "openid" gem "rack-openid" end # Optional gem for exporting the gantt to a PNG file, not supported with jruby #platforms :mri, :mingw do # group :rmagick do # # RMagick 2 supports ruby 1.9 # # RMagick 1 would be fine for ruby 1.8 but Bundler does not support # # different requirements for the same gem on different platforms # gem "rmagick", ">= 2.0.0" # end #end # Database gems platforms :mri, :mingw do # group :postgresql do # gem "pg", ">= 0.11.0" # end group :sqlite do gem "sqlite3" end end platforms :mri_18, :mingw_18 do # group :mysql do # gem "mysql" # end end platforms :mri_19, :mingw_19 do # group :mysql do # gem "mysql2", "~> 0.3.11" # end end #platforms :jruby do # gem "jruby-openssl" # group :mysql do # gem "activerecord-jdbcmysql-adapter" # end # group :postgresql do # gem "activerecord-jdbcpostgresql-adapter" # end # group :sqlite do # gem "activerecord-jdbcsqlite3-adapter" # end #end group :development do gem "rdoc", ">= 2.4.2" gem "yard" end group :test do gem "shoulda", "~> 2.11" gem "mocha" end local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local") if File.exists?(local_gemfile) puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v` instance_eval File.read(local_gemfile) end # Load plugins' Gemfiles Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file| puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v` instance_eval File.read(file) end
% bundle install
DB、添付ファイルの移行
Redmine 1.0.2 から DB、添付ファイル をコピー
cp ../redmine-1.0.2/config/database.yml config/ cp ../redmine-1.0.2/db/redmine.db db cp ../redmine-1.0.2/files/* files/
config/database.yml の形式が変わっていました
vi config/database.yml
production: adapter: sqlite3 database: db/redmine.db timeout: 5000
migration, 設定
% RAILS_ENV=production rake db:migrate % rake tmp:create % rake generate_secret_token
Redmine 2.0 にすると何が嬉しいか?
@yusuke_kokubo さんの指摘 で、不勉強に気づき、不適切な部分を変更しました。 指摘ありがとうございます!
現在の Redmine 2.0は機能的には機能的には Redmine 1.4 と同じで、 Redmine 1.0.2 と比べると機能は増えています。 現在のところ Redmine 1.4 でも最新の機能は使えます 。 ちなみに Redmine 1.4 は Rails2.3 ベースです。
Redmine 2.0 は Rails3.2 ベースになったので、 メモリー使用量が増えます、またサーバー起動時間がかかります(私の環境ではメモリー使用量に関しては Redmine 1.0.2 が 173Mbyte なのに Redmine 2.0.3 は 202Mbyte に上がりました)。
現時点ででの Redmine 2.0 のメリットは、正式にサポートされている Rails3.2 ベースの安心感でしょうか? サーバーの環境等で2.0にアップデート出来ない場合も 1.4 にはしておいた方が良いですね。
テーマ を変えてみた
Redmine 2.0 に変えても変化が無くてつまらないので、テーマ(見かけ)を変えてみました。一番上にある画像は、一見 Redmine にみえないでしょ!
実はテーマが変えられる事を、今まで知らなかったのですが今回、いろいろと調べていて知りました。 Redmineのサイトに テーマの一覧 があります。たくさんあるのですが、どんな画面になるのかはリンク先に行かないと判らないので、先頭にあった A1 を入れてみました。インストール方法は ここ に書かれています。
% cd /tmp % wget http://redminecrm.com/projects/a1theme/products/1279 % mv 1279 a1-1_0_3.tgz % tar xvzf a1-1_0_3.tgz % cd XXXXXX/redmine-2.0.3 % mv /tmp/a1 public/themes/
Redmine の 管理→設定→表示(タブ)のテーマでA1を選択し保存ボタンを押す。
これでテーマが変更できます、気分も Redmine2.0 になりました。
今日の結論: 見かけ重要