技術メモ

主にRuby関連

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関連の勉強会初参加です。
沢山の情報を得たので忘れないようにメモとちょい足し。

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 + DevKitRubyRails
 最新版等、好きな環境を整えられるのでコチラをオススメします。
 <手前ミソですがWindows環境でRubyRailsを使う時に便利だったものを
  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 が現れます。

etc.

bundle

bundle1.1

早いよ

git

ロカールリポジトリからリモートリポジトリへのignore

.git/info/excludeファイルにignoreパターンを書く事でローカルでは管理対象だがリモートでは管理対象外にできる。(あってるかな?)

mxcl/homebrew - GitHub

homebrewいいよw

fomula分かり易くて書き易いよ。

puma

pumaもあるよ

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

以下にポイントを挙げておきます

Rubyのバージョン

Ruby 1.8.7 です(2012-02-05現在)

Gold出題範囲

Rubyアソシエーション: Ruby技術者認定試験制度の試験実施要項にあるGold出題範囲をしっかり把握しておきましょう。一通り出ます。
  • 実行環境
  • 文法
    • 変数と定数
    • 演算子
    • ブロック
    • 例外処理
    • 大域脱出
  • オブジェクト指向
    • メソッドの詳細
    • メソッドの可視性
    • クラスの詳細
    • クラスの継承
    • モジュールの詳細
  • 組み込みライブラリ
    • よく使用されるクラス(Object、Kernel、Module等)
    • よく使用されるモジュール(Enumerable、Comparable等)
    • 数値
    • 正規表現
  • 標準添付ライブラリ
    • よく使用されるライブラリ(socket、rdoc等)

リファレンスマニュアル

オブジェクト指向スクリプト言語 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 変数
      • 全部だが、特に後半の文章にでてくるオブジェクト複製各メソッドと凍結メソッドの詳細はリファレンス等で確認。
  • 第4章 コンテナ、ブロック、イテレータ
    • 【p.49..54】4.1 ブロックとイテレータ
      • ブロック、イテレータの実装の項目全部。スコープについても再確認。
    • 【p.58..61】4.1 ブロックとイテレータ
      • トランザクションとしてのブロック、オブジェクトとしてのブロック、クロージャとしてのブロックの内容はもちろん登場するメソッドの詳細もリファレンス等で確認。
      • 実用度[高] 私は結構使います。特に Execute Around Method は好きです。
  • 第5章 機能の共有:継承、モジュール、Mixin
    • 【p.65..77】
      • この範囲の問題は多数でるし大切なのですが足りません。この範囲は『メタプログラミングRuby』をメインで確認。
    • 【p.71..73】5.4 Mixin
      • 出題範囲のComparableはここの説明とリファレンス等で確認。
    • 【p.73..74】5.5 イテレータと Enumerable モジュール、5.6 モジュールの構築
      • 出題範囲のEnumerableはここの説明とリファレンス等で確認。
  • 第8章 さらにメソッドについて
    • 【p.107..112】
      • 全部。特に可変長引数リスト、メソッドとブロック、メソッドへの引数の受け渡し(足らない。括弧の有無、ブロック付き/なしの全組み合わせ4パターン確認)、メソッドの戻り値(足らない。可変長引数と通常の引数、展開時のアスタリスクの有無の全組み合わせ4パターン確認)
  • 第9章 式
    • 【p.116..117】 9.1 演算子
      • 演算子によるメソッド定義の確認。試験には出そうにはないけどメソッドチェーンできるメソッドの定義方法もサンプルコードになっている。
    • 【p.118..121】 9.3 代入
      • 全部。特に展開と代入、その他の形式の代入は確認。
      • 実用度[高] 様々な代入方法がありますが、私は全て使っています。1処理が複数行より1処理が1行の方が読み易いことが多いから。例えば、スワップは多重代入を使うとか、デフォルト値や遅延初期化に||=を使うとか。
      • ちなみに代入ショートカットは「%=」、「~=」、「/=」、「-=」、「+=」、「|=」、「&=」、「>>=」、「<<=」、「*=」、「&&=」、「||=」、「**=」があります。(多いですねw)代入系の演算子は全てメソッドではないので再定義不可です。「[]=」は代入ではなく、要素の設定でメソッドなので再定義可です。
  • 第10章 例外と大域脱出(catch/throw)
    • 【p.133..134】 10.1 Exception クラス
      • 特に例外階層は把握。StandardErrorとその配下以外ではコードで簡単に発生させられる例外について深めに確認。
    • 【p.134..137】 10.2 例外の処理
      • 例外の処理と後片付け。あと1点確認すべき点はリファレンスの制御構造の例外処理を読んでサンプル作って確認。
    • 【p.139..140】 10.4 catch と throw
      • 全部。
  • 第12章 ファイバ、スレッド、プロセス
    • 【p.151..154】 12.2 マルチスレッド
      • 全部。スレッドと例外は深めに確認。
    • 【p.155..158】 12.3 スレッドスケジューラの制御、12.4 相互排他
      • 余裕があれば確認。対象外かも。
  • 第15章 Rubyとその世界
    • 【p.197..200】 15.1 コマンドライン引数
      • 全部。スレッドと関連のあるオプションも確認。
    • 【p.200..200】 15.2 プログラムの終了
      • メソッドと例外の詳細を確認。
  • 第19章 Rubyのドキュメントを書く
    • 【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
      • 全部。

最後に

値段次第では、間違い箇所が気になるので買おうかな?w

n本の様々な長さの棒の中から3本使って、できるだけ周長の長い三角形を作る | ruby pythagorean.rb n(省略時:15)

何回か実行した結果をみると 3:4:5 で一番周長の長い三角形になる?

Pythagorean#triples_of_maxlength - n本の様々な長さの棒の中から3本使って、できるだけ周長の長い三角形を作る