Rubyのcase式で気を付けること への追記
Qiitaに載せた『Rubyのcase式で気を付けること』でcase式の評価に
Rangeオブジェクトを使う時の注意点を書いたけど、
Classオブジェクトの方が問題が発生し易いかな?
オブジェクトの素性を調べる時に Object#class を使用しないでね
def caution_case(obj) case obj when Fixnum "Fixnum" when Float "Float" when Bignum "Bignum" else "other class" end end # ダメなcase caution_case( 1.class ) # => "other class" caution_case( 1.0.class ) # => "other class" caution_case( 9999999999999999999.class ) # => "other class" # 正しいcase caution_case( 1 ) # => "Fixnum" caution_case( 1.0 ) # => "Float" caution_case( 9999999999999999999 ) # => "Bignum"
Shinjuku.rb #2に参加してきました #shinjukurb
Ruby関連の勉強会初参加です。
沢山の情報を得たので忘れないようにメモとちょい足し。
LT
■ @garden_treeさん
■ 珍田さん
Rails3レシピブック読書会
[001] Railsをインストールする
◆ Windows環境へのインストール
WindowsでRailsを動かそうとしている人には絶望、WindowsでRailsアプリを
運用したことがある人(私)には同意させる内容が書いてありますw
< 以下は私のちょい足し >
それでもWindowsで運用する必要がある人は本に書いてある通りRailsInstallerを使う
のが無難だと思います。
現時点では、ver.2.0.1で以下の構成になってます。
- Ruby 1.9.2-p290
- Rails 3.1.1
- Bundler 1.0.18
- Git 1.7.6
- Sqlite 3.7.3
- TinyTDS 0.4.5
- SQL Server support 3.3.3
- DevKit
でもDevKitの導入方法が分かる人はRubyInstaller + DevKitでRubyやRailsの
最新版等、好きな環境を整えられるのでコチラをオススメします。
<手前ミソですがWindows環境でRubyやRailsを使う時に便利だったものを
Qiitaに載せてあるので興味があればどうぞ>
但し!本の最後にもありますがDevKit導入だけでは解決できない場合があります。
代表例としてはWebサーバです。結論から言えばThinやMogrelは上記環境で動作
しますが、ある特定なバージョンやプラットフォームを指定しないと動作しない
のでgemをインストールする際にはinstallオプションが必要になります。
それでも動かない場合はrake-compilerを使ったりします。
そういえば、仕事でWindows環境でのRails開発経験がある人?って聞かれ、
自分の後ろは確認してないけど自分以外に手を挙げた人はいたのかな?
[002] Railsアプリケーションを作成する
◆ rails new コマンド
rails new コマンドでアプリケーション名をスネークケースにするとどうなるか?
$ bundle exec rails new _a_b_c_ アプリケーションディレクトリ名: _a_b_c_ アプリケーションモジュール名: ABC
rails new コマンドのオプションは沢山あるよね?という話に発展
$ bundle exec rails new --help Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby binary of your choice # Default: /Users/masassiez/.rbenv/versions/1.9.3-p125/bin/ruby -b, [--builder=BUILDER] # Path to a application builder (can be a filesystem path or URL) -m, [--template=TEMPLATE] # Path to an application template (can be a filesystem path or URL) [--skip-gemfile] # Don't create a Gemfile [--skip-bundle] # Don't run bundle install -G, [--skip-git] # Skip Git ignores and keeps -O, [--skip-active-record] # Skip Active Record files -S, [--skip-sprockets] # Skip Sprockets files -d, [--database=DATABASE] # Preconfigure for selected database (options: mysql/oracle/postgresql/sqlite3/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc) # Default: sqlite3 -j, [--javascript=JAVASCRIPT] # Preconfigure for selected JavaScript library # Default: jquery -J, [--skip-javascript] # Skip JavaScript files [--dev] # Setup the application with Gemfile pointing to your Rails checkout [--edge] # Setup the application with Gemfile pointing to Rails repository -T, [--skip-test-unit] # Skip Test::Unit files [--old-style-hash] # Force using old style hash (:foo => 'bar') on Ruby >= 1.9 Runtime options: -f, [--force] # Overwrite files that already exist -p, [--pretend] # Run but do not make any changes -q, [--quiet] # Supress status output -s, [--skip] # Skip files that already exist Rails options: -h, [--help] # Show this help message and quit -v, [--version] # Show Rails version number and quit Description: The 'rails new' command creates a new Rails application with a default directory structure and configuration at the path you specify. You can specify extra command-line arguments to be used every time 'rails new' runs in the .railsrc configuration file in your home directory. Note that the arguments specified in the .railsrc file don't affect the defaults values shown above in this help message. Example: rails new ~/Code/Ruby/weblog This generates a skeletal Rails installation in ~/Code/Ruby/weblog. See the README in the newly created application to get going.
- -Tオプション は良く使うね
- --skip-bundleオプション で自動的な bundle install を取り消せるよ
- -mオプション も便利
そういえば -mオプション の話の中で、RailsWizardに意外に反応があってビックリ。
結構メジャーなのかと思って言ってみたんだけど、マイナーだったらしいw
◆ rails install コマンド
- --pathオプション でgemをアプリ毎に指定のディレクトリに置けるよ
個人的には --binstubsオプションも覚えておいた方が良いと思う。
rake等の実行で bundle exec を付けずに rake を実行できます。
[003] Railsアプリケーションのファイル構造を理解する
◆ Gemfile
● sourceについて
Defaultは以下の3組
source :rubygems source "http://rubygems.org" source :rubyforge source "http://gems.rubyforge.org" source :gemcutter source "http://gemcutter.org"
それ以外のgemサーバも可能か? => 多分、 gem server で可能
$ gem server --help Usage: gem server [options] Options: -p, --port=PORT port to listen on -d, --dir=GEMDIR directories from which to serve gems multiple directories may be provided --[no-]daemon run as a daemon -b, --bind=HOST,HOST addresses to bind -l, --launch[=COMMAND] launches a browser window COMMAND defaults to 'start' on Windows and 'open' on all other platforms Common Options: -h, --help Get help on this command -V, --[no-]verbose Set the verbose level of output -q, --quiet Silence commands --config-file FILE Use this config file instead of default --backtrace Show stack backtrace on errors --debug Turn on Ruby debugging Summary: Documentation and gem repository HTTP server Description: The server command starts up a web server that hosts the RDoc for your installed gems and can operate as a server for installation of gems on other machines. The cache files for installed gems must exist to use the server as a source for gem installation. To install gems from a running server, use `gem install GEMNAME --source http://gem_server_host:8808` You can set up a shortcut to gem server documentation using the URL: http://localhost:8808/rdoc?q=%s - Firefox http://localhost:8808/rdoc?q=* - LaunchBar Defaults: --port 8808 --dir /Users/masassiez/.rbenv/versions/1.9.3-p125/lib/ruby/gems/1.9.1 --no-daemon
◆ config.ru
rails s コマンドで読み込まれる
◆ 各assetsディレクトリ
3つあるね
- app/assets : アプリ固有
- lib/assets : 汎用(管理は自分を含む) 例:社内汎用など
- vendor/assets : 汎用(管理は他人) 例:JQuery Plug-inなど
各assetsディレクトリ以下は全てアクセス可能。じゃあ、名前が同じ時の優先順位は?
Rails.application.config.assets.paths順に優先度が高くなる
mkdir lib/assets/javascripts y Rails.application.config.assets.paths --- - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/images - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/stylesheets - /Users/masassiez/Dropbox/project/rails/_a_b_c_/lib/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/assets/stylesheets - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/bundle/ruby/1.9.1/gems/jquery-rails-2.0.0/vendor/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/bundle/ruby/1.9.1/gems/coffee-rails-3.2.2/lib/assets/javascripts
config/application.rbに config.assets.paths << Rails.root.join("app", "assets", "flash") を追加するとどうなる?
# config/application.rbに config.assets.paths << Rails.root.join("app", "assets", "flash") を追加 y Rails.application.config.assets.paths --- - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/images - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/app/assets/stylesheets - /Users/masassiez/Dropbox/project/rails/_a_b_c_/lib/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/assets/stylesheets - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/bundle/ruby/1.9.1/gems/jquery-rails-2.0.0/vendor/assets/javascripts - /Users/masassiez/Dropbox/project/rails/_a_b_c_/vendor/bundle/ruby/1.9.1/gems/coffee-rails-3.2.2/lib/assets/javascripts - !ruby/object:Pathname path: !binary |- L1VzZXJzL21hc2Fzc2llei9Ecm9wYm94L3Byb2plY3QvcmFpbHMvX2FfYl9j Xy9hcHAvYXNzZXRzL2ZsYXNo
◆ tmp/pidsディレクトリ
なんぞ?
Webサーバ起動すると起動中 server.pid が現れます。
Cool!!な回答集 in 「rubeque」 (http://www.rubeque.com/)
『Rubeque』で Cool!! だったから score += 1 した回答集
正規表現がCool!!
# 19 Separating Numbers with Commas def separate_with_comma(n) n.to_s.gsub(/(?<=\d)(?=(\d{3})+$)/,',') end # assert_equal "1", p separate_with_comma(1) # assert_equal "10", p separate_with_comma(10) # assert_equal "100", p separate_with_comma(100) # assert_equal "1,000", p separate_with_comma(1000) # assert_equal "10,000", p separate_with_comma(10000) # assert_equal "100,000", p separate_with_comma(100000) # assert_equal "1,000,000", p separate_with_comma(1000000)
with_objectが分かってなかった。条件外の時にわざわざnilを返して最後にcompactしちゃった。
# 22 Each With Object def even_sum(arr) arr.each_with_object([]){|i,r| r << i.reverse if i && i.size.even? } end p even_sum(["cat", "dog", "bird", "fish"]) #, ["drib", "hsif"] p even_sum(["why", "chunky", nil, "lucky", "stiff"]) #, ["yknuhc"] p even_sum(["rewsna", "hitch hiker", "si", "guide", "galaxies ", "24"]) #, ["answer", "is", "42"]
Cool!!ってよりは何コレ?!スゴイ!!これがフィボナッチ??
# 24 Your Favorite and Mine, Fibonacci! def fibo_finder(n) root5 = Math.sqrt(5) phi = 0.5 + root5 / 2 Integer(0.5 + phi**n / root5) end #assert_equal 0, p fibo_finder(0) #assert_equal 1, p fibo_finder(1) #assert_equal 3, p fibo_finder(4) #assert_equal 13, p fibo_finder(7) #assert_equal 55, p fibo_finder(10)
Ruby技術者認定Gold試験合格した
88点でした。ちなみに一発合格ではない。
合格できたのは素直に嬉しいのですが、落ちた時も受かっても間違えた問題が把握しきれてないのが心残り。
取得のキッカケ
資格は幾つか持っているのですが大昔に会社から取得を強要されたものしかないし、正直資格取得に積極的ではないのだけど(辞めた not 開発メインな)会社内にRubyを普及させる必要があると主張し、結果的には勢いで取得の先陣をきることにしたw
まぁ、その当時の会社にはRubyという道具が合っていたと思うし、会社の今後を思うと認定システムインテグレータプログラムみたいな看板も必要だったと思ってたし。でも、その1年後には会社を辞めることになったのだがw
取得後の雑感
結果的に取得を目指して良かった。何となくな理解のままでは解けない問題があるので理解度は確実に上がったと思う。
ただ理解度を上げる方法はRubyでの開発経験ではなく、試験用の勉強だと思った。1年前の試験(72点不合格)から約1年間Ruby,Rails3開発を行っていたが試験用スキルは殆ど上がってなかった気がした。誤解を恐れ補足しておくと、試験が開発とは無関係だと言っているわけではなく、試験レベルではない、要は何となくの理解のまま開発をしていても、理解度は深まらなかったということです。むしろ合格レベルの理解度を持った上で開発をすれば理解度は進む気がするので、余裕があるなら資格取得から始めて開発に望んだ方が良いと思います。
あと理解度とは別にちゃんと勉強していかないといけない暗記問題っぽい問題も数問あるので、そこはしっかり押さえておきたいところ。でないと私のように数点足らずに落ちかねませんw
対象としては、コマンドラインオプション、組み込み変数/定数、例外処理、標準添付ライブラリあたりの、頻繁に使わないし普段は覚えてなくても詳細はリファレンスで都度確認すればいいよねってもの。最低5問はでると思うのでノーチェックの全滅は痛い。んま、資格らしい問題も結構ありますよってことですw
以下にポイントを挙げておきます
Gold出題範囲
リファレンスマニュアル
オブジェクト指向スクリプト言語 Ruby リファレンスマニュアルが勉強の中心となると思うので出題範囲の部分は全て見ておいた方が良いですが、特に以下の項目は要チェックですRubyの起動、スレッド、変数と定数、演算子式、クラス/メソッドの定義
メタプログラミングRuby
プログラミングRuby 1.9 -言語編-
Amazon.co.jp: プログラミングRuby 1.9 −言語編−: Dave Thomas with Chad Fowler and Andy Hun, まつもとゆきひろ, 田和 勝: 本 この版の前版に1.8系のものがありますが、この最新版でも多分大丈夫です。
<第1版での内容とページ>
- 第3章 クラス、オブジェクト、変数
- 【p.29】
- 標準出力への出力各メソッド(実際には2つ以上あるので、それらもリファレンス等で確認)とその仕組み。
- 実用度[高] 例えば、配列の各オブジェクトを独自の出力形式で出力する場合、eachメソッドを書くことが減りました。オブジェクトに独自形式のto_sメソッド参照があればeachメソッドを使わずに puts ary で同じ出力が得られます。
- 【p.30..34】3.1 オブジェクト属性
- 全部とリファレンスの演算子式の属性参照のとこも絡めて、各メソッドの詳細もリファレンス等で確認
- 【p.37..39】3.3 アクセス制御
- 全部。各アクセス制御の意味を押さえる。制御ケース例はこれだけだと圧倒的に足りない。
- 【p.39..41】3.3 変数
- 全部だが、特に後半の文章にでてくるオブジェクト複製各メソッドと凍結メソッドの詳細はリファレンス等で確認。
- 【p.29】
- 第4章 コンテナ、ブロック、イテレータ
- 第5章 機能の共有:継承、モジュール、Mixin
- 第8章 さらにメソッドについて
- 【p.107..112】
- 全部。特に可変長引数リスト、メソッドとブロック、メソッドへの引数の受け渡し(足らない。括弧の有無、ブロック付き/なしの全組み合わせ4パターン確認)、メソッドの戻り値(足らない。可変長引数と通常の引数、展開時のアスタリスクの有無の全組み合わせ4パターン確認)
- 【p.107..112】
- 第9章 式
- 【p.116..117】 9.1 演算子式
- 演算子によるメソッド定義の確認。試験には出そうにはないけどメソッドチェーンできるメソッドの定義方法もサンプルコードになっている。
- 【p.118..121】 9.3 代入
- 全部。特に展開と代入、その他の形式の代入は確認。
- 実用度[高] 様々な代入方法がありますが、私は全て使っています。1処理が複数行より1処理が1行の方が読み易いことが多いから。例えば、スワップは多重代入を使うとか、デフォルト値や遅延初期化に||=を使うとか。
- ちなみに代入ショートカットは「%=」、「~=」、「/=」、「-=」、「+=」、「|=」、「&=」、「>>=」、「<<=」、「*=」、「&&=」、「||=」、「**=」があります。(多いですねw)代入系の演算子は全てメソッドではないので再定義不可です。「[]=」は代入ではなく、要素の設定でメソッドなので再定義可です。
- 【p.116..117】 9.1 演算子式
- 第10章 例外と大域脱出(catch/throw)
- 【p.133..134】 10.1 Exception クラス
- 特に例外階層は把握。StandardErrorとその配下以外ではコードで簡単に発生させられる例外について深めに確認。
- 【p.134..137】 10.2 例外の処理
- 例外の処理と後片付け。あと1点確認すべき点はリファレンスの制御構造の例外処理を読んでサンプル作って確認。
- 【p.139..140】 10.4 catch と throw
- 全部。
- 【p.133..134】 10.1 Exception クラス
- 第12章 ファイバ、スレッド、プロセス
- 【p.151..154】 12.2 マルチスレッド
- 全部。スレッドと例外は深めに確認。
- 【p.155..158】 12.3 スレッドスケジューラの制御、12.4 相互排他
- 余裕があれば確認。対象外かも。
- 【p.151..154】 12.2 マルチスレッド
- 第15章 Rubyとその世界
- 【p.197..200】 15.1 コマンドライン引数
- 全部。スレッドと関連のあるオプションも確認。
- 【p.200..200】 15.2 プログラムの終了
- メソッドと例外の詳細を確認。
- 【p.197..200】 15.1 コマンドライン引数
- 第19章 Rubyのドキュメントを書く
- 【p.253..263】
- 出題範囲に出てるけど出たかな?出題範囲にあるので確認。
- 【p.253..263】
- 第22章 Rubyの文法
-
- 必ず一通り読む。特に以下の点は重点的に読み、できればサンプル組んで確認。
- 【p.299】 変数名とメソッド呼び出しの区別
- 読む。
- 【p.300..307】 22.5 変数と定数
- 足らないかもだけど読んで確認。事前定数の変数も実用頻度が高いものは特に確認。各項目毎に最低でも1つは出ると思って確認。
- 実用度[高]パターンマッチに関する変数全て、入出力変数、「$0」、「$:」、「__FILE__」、「$F」、「__method__」、「$SAFE」、「$VERBOSE」、「ARGF」、「ARGV」、「ENV」、「DATA」、「__END__」、「STDERR」、「STDIN」、「STDOUT」等は実用頻度が高いです。
- 【p.314..317】 22.7 メソッド定義
- 読んで確認。
- 【p.317..319】 22.8 メソッドの呼び出し
- 読んで確認。
- 【p.317..319】 22.9 別名定義
- 読んで確認。
- 【p.320..322】 22.10 クラス定義
- 読んで確認。
- 【p.322..324】 22.11 クラス定義
- 読んで確認。
- 【p.324..324】 22.12 アクセス制御
- 読む。
- 【p.324..325】 22.13 ブロック・クロージャ・procオブジェクト
- 読んで確認。結合力、各呼び出し方法、クロージャ。
- 【p.328..330】 22.14 例外
- 読んで確認。
- 【p.330..330】 22.15 大域脱出
- 読む。
-
- 第24章 メタプログラミング
-
- 必ず一通り読む。特に以下の点は重点的に読み、できればサンプル組んで確認。
- 【p.343..346】 24.1 オブジェクトとクラス
- 読んで確認。selfの変更の動きを押さえる。
- 【p.346..351】 24.2 特異クラス
- 読んで確認。オブジェクトモデルを描く。
- 【p.351..352】 24.3 継承と可視性
- 読んで確認。ページ数少ないけど内容濃いので読み込んでおく。重要なサンプルコードはあるが全然足りないので独自サンプル組んで色々なパターンを確認。
- 【p.352..354】 24.4 モジュールと mixin
- 読んで確認。オブジェクトモデルを描く。includeとextendメソッドの真の動作をリファレンス等で理解。
- 【p.354..359】 24.5 クラスレベルマクロのメタプログラミング
- 読んで確認。オブジェクトモデルを描く。フックメソッドを確認。
- 【p.346..351】 24.6 残る2つの形式のクラス定義
- 読んで確認。別形式の定義方法を確認。形式による相違点を確認。試験とは別に『メタプログラミングRuby』と共に使い方を身に付けるべき。
- 【p.365..370】 24.8 フックメソッド
- 読んで確認。実用頻度が高いものを確認。試験とは別に『メタプログラミングRuby』と共に使い方を身に付けるべき。
-
プログラミングRuby 1.9 -ライブラリ編-
Amazon.co.jp: プログラミングRuby 1.9 −ライブラリ編−: Dave Thomas with Chad Fowler and Andy Hunt, まつもとゆきひろ, 田和 勝: 本
- 【p.82】FileTest
-
- メソッドを確認。
-
- 【p.138..139】Marshal
-
- 全部。特に条件を確認。
-
- 【p.310】Matrix
-
- 全部。
-
- 【p.352】Socket
-
- クラス構造を確認。
-
- 【p.353】StringIO
-
- 全部。
-
- 【p.357】Test::Unit
-
- 全部。
-
最後に
上記の書籍を持っていなければ『Amazon.co.jp: Ruby公式資格教科書 Ruby技術者認定試験 Silver/Gold対応: 増井 雄一郎, 小川 伸一郎, (株)日立ソリューションズ 藁谷 修一, 川尻 剛, 牧 俊男 著, Rubyアソシエーション, CTCテクノロジー(株) 監修: 本』をまず購入した方がイイと思いますw
値段次第では、間違い箇所が気になるので買おうかな?w
n本の様々な長さの棒の中から3本使って、できるだけ周長の長い三角形を作る | ruby pythagorean.rb n(省略時:15)
何回か実行した結果をみると 3:4:5 で一番周長の長い三角形になる?