Ruby技術者認定試験 Gold の勉強方法
Ruby技術者認定試験Goldに合格しました!Silverに比べると、継承関係など暗記ではなく考えれば分かる問題が増えました。難易度は上がっていますが、クイズのようで面白い試験です。
勉強方法
Ruby公式資格教科書の演習問題を解いて、分からないところは解説を読みました。勉強時間は休日4日ほど。
勉強内容
環境変数
# 環境変数はENVにStringを渡して取得できる ENV["HOME"] #=> "/Users/tanihito" # Symbolではダメ ENV[:HOME] #=> TypeError
文法
'-'を使って桁数を見やすく表示できる
100_000 #=> 100000
ブロック
{ ... } の方が do ... end ブロックよりも強く結合する。
def foo(arg) yield arg end # fooの引数は"arg"とブロック foo "arg" do |msg| p msg end #=> "arg" # ブロックは"arg"の引数とみなされる foo "arg" { |msg| p msg } #=> SyntaxError
block_given?を使えば、メソッドにブロックが与えられたか判定できる。
def foo block_given? ? yield : "no block" end foo #=> "no block" foo {p "block"} #=> "block"
引数展開
実引数に'*'をつけると、配列を引数に展開できる。
def foo(a, *b) foo2(*b) # 配列[2, 3]を引数に展開 end def foo2(c, d) d end foo(1, 2, 3) #=> 3
オープンクラス
- オープンクラス:定義済みのクラスを再定義できるクラス
- クラスの再オープン:一度定義したクラスを再定義のために開くこと
# クラスを定義 class Klass def foo; end end # クラスを再オープンしてメソッドを追加 class Klass def foo2; end alias :foo3 :foo undef :foo2 end Klass.instance_methods(false) #=> [:foo, :foo3]
Module
- moduleはnewできない
- moduleは継承できない
- moduleはincludeできる
Mix-in
includeするとmoduleをスーパークラスとの間に組み入れる。
module Bar1; end module Bar2; end class Foo; end class FooExt < Foo include Bar1 include Bar2 end # ancestorsは変更されるが、superclassは変更されない FooExt.ancestors #=> [FooExt, Bar2, Bar1, Foo, Object, Kernel, BasicObject] FooExt.superclass #=> Foo
特異クラス
class Foo; end foo1 = Foo.new foo2 = Foo.new # 特異メソッドは特定のインスタンスだけで使える def foo1.foo1_method; 'foo1' end foo1.foo1_method #=> "foo1" foo2.foo1_method #=> NoMethodError # 特異クラスのインスタンスメソッドとして実装される Foo1Singleton = class << foo1; self; end Foo1Singleton.instance_methods(false) #=> [:foo1_method] # extendすると特異クラスにincludeしたことになる module Bar; end foo1.extend(Bar) Foo1Singleton.ancestors #=> [Bar, Foo, Object, Kernel, BasicObject]
日付・時間
# Timeの単位は秒。内部的にFloatで時刻を持っている。 t = Time.mktime(2014, 1, 2, 3, 4, 5, 6) t #=> 2014-01-02 03:04:05 +0900 t + 1 #=> 2014-01-02 03:04:06 +0900 (t - t).class #=> Float # Dateの単位は日。内部的にRationalで日付を持っている。 require 'date' d = Date.new puts d #=> -4712-01-01 puts d +1 #=> -4712-01-02 (d - d).class #=> Rational
Boxenを使ったMacの開発環境構築
Github社が作ったMacの設定ツール Boxenを使って、Mac Book Airの開発環境を作りました。結構はまった...。
インストール
## Boxenのインストール sudo mkdir -p /opt/boxen sudo chown $USER:admin /opt/boxen git clone https://github.com/boxen/our-boxen /opt/boxen/repo cd /opt/boxen/repo git remote rm origin git remote add origin git@github.com:tanihito/my-boxen.git git push -u origin master ## インストールしたいライブラリを追加 vim Puppetfile vim modules/people/manifests/tanihito.pp ## ライブラリのインストール cd /opt/boxen/repo script/boxen --no-fde ## zshrcに追加 [ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh
トラブルシューティング
- 一度削除したアプリを再インストールしたい
- /var/db/.puppet_compressed_app_installed_${APP_NAME}を削除する
- uild-aux/install-sh: Permission denied
- https://github.com/Homebrew/homebrew/wiki/troubleshootingを確認。私の場合はbrew updateで直った。
Ruby技術者認定試験 Silver の勉強方法
Ruby技術者認定試験 Silverに合格しました!標準ライブラリについての問題がほとんどなので、普段Rubyを使っている人ならば2,3日で合格できます。
勉強方法
Ruby技術者認定試験 公式ガイドをやりました。Silver/Gold対応の参考書もありますが、Goldにしか出ない内容も書かれているため勉強しにくいようです。
- 公式ガイドをざっと読む
- 巻末の問題集をやる。考えて分かる問題はないので、分からなければすぐに解答を見る。
- 新しく知った内容をまとめる。
- 解けなかった問題だけリストアップして再度問題集をやる。
振り返り
- 勉強内容をまとめるのは良い。同じところで何度も詰まることがなくなる。
- 勉強した時間を測定しておくべきだった。どれくらいの勉強時間で合格できるかの参考になるはず。
勉強内容のまとめ
演算子
比較演算子の比較。
- == 同じものか調べる
- === case式でオブジェクトをテストする
- eql? ハッシュの内部で「同じキーかどうか」を調べる
- equal? オブジェクトの同一性を調べる
以下の演算子は再定義できない。
引数
C言語と違い、ARGVにはプログラム名は入っていない。コマンドライン引数のみ入っている。
ruby foo.rb foo bar #=> "ARGV[0]: foo" #=> "ARGV[1]: bar"
String
String#indexの第2引数にはoffsetを渡す。
s = "abcabc" s.index("a") #=> 0 s.index("a", 1) #=> 3
文字列を置換する様々な方法
s = "abcdef" s[1..2] = "X" # 1文字目から2文字目を置換 p s #=> "aXdef" s = "abcdef" s[1,3] = "X" # 1文字目から3文字分を置換 p s #=> "aXef" s = "abcabc" s["bc"] = "X" # 部分文字列"bc"と最初に一致した箇所を置換 p s #=> "aXabc" s = "abcabc" s[/b./] = "X" # 正規表現にマッチした箇所を置換 p s #=> aXabc"
String#splitの第2引数にはlimitを渡す。
"foo\nbar\nbaz".split("\n") #=> ["foo", "bar", "baz"] "foo\nbar\nbaz".split("\n",2) #=> ["foo", "bar\nbaz"]
chop vs chomp
# chopは行末の1文字を削除する。chompは行末の行区切り文字のみ削除する。 "abc".chop #=> "ab" "abc".chomp #=> "abc" # 行末が\r\nの場合はchop, chompともに2文字削除する。 "abc\r\n".chop #=> "abc" "abc\r\n".chomp #=> "abc" # chomp("")とした場合、末尾の連続する改行コードをすべて取り除く。 "abc\n\r\r\n".chop #=> "abc\n\r" "abc\n\r\r\n".chomp #=> "abc\n\r" "abc\r\n\r\n".chomp("") #=> "abc"
Array
map = collect. find = detect. find_all = select.
a = [1, 2, 3, 4] a.map { |i| i * 2 } #=> [2, 4, 6, 8] a.collect { |i| i * 2 } #=> [2, 4, 6, 8] a.find { |i| i % 2 == 0 } #=> 2 a.detect { |i| i % 2 == 0 } #=> 2 a.find_all { |i| i % 2 == 0 } #=> [2, 4] a.select { |i| i % 2 == 0 } #=> [2, 4]
compactメソッドは配列からnilを取り除く
[1, nil, "b"].compact #=> [1, "b"]
sliceメソッドは、[]メソッドの別名。
a = ["a", "b", "c", "d", "e"] a[0, 2] #=> ["a", "b"] a.slice(0, 2) #=> ["a", "b"]
Hash
Hash#sortの出力はArrayになる
h = {b: 2, a: 1, c: 3} h.sort #=> [[:a, 1], [:b, 2], [:c, 3]]
Hash.newの引数がデフォルトの値になる
h = Hash.new h[:foo] #=> nil h = Hash.new(:bar) h[:foo] #=> :bar
File
File.openの様々なモード。
# fooと書かれたfoo.txtがあった場合 # rモード:読み込みのみ。デフォルト。 File.open("foo.txt", "r") do |f| p f.read(2) #=> "fo" #f.write("ba") #=> IOError: not opened for writing end %x"cat foo.txt" #=> "foo\n" # wモード:書き込みのみ。ファイルは初期化される。 File.open("foo.txt", "w") do |f| # p f.read(2) #=> IOError: not opened for reading f.write("ba") end %x"cat foo.txt" #=> "ba" # aモード:書き込みのみ。ファイル末尾に追記される。 File.open("foo.txt", "a") do |f| # p f.read(2) #=> IOError: not opened for reading f.write("ba") end %x"cat foo.txt" #=> "foo\nba" # r+モード:読み込み、書き込み両方できる。 File.open("foo.txt", "r+") do |f| p f.read(2) #=> "fo" f.write("ba") end %x"cat foo.txt" #=> "foba" # w+モード:読み込み、書き込み両方できる。ファイルは最初に初期化される。 File.open("foo.txt", "w+") do |f| p f.read(2) #=> nil f.write("ba") end %x"cat foo.txt" #=> "ba" # a+モード:読み込み、書き込み両方できる。書き込みはファイル末尾から行う。 File.open("foo.txt", "a+") do |f| p f.read(2) #=> "fo" f.write("ba") end %x"cat foo.txt" #=> "foo\nba"
Regexp
\Aは文字列の先頭にマッチする。^は文字列の先頭か改行文字の直後にマッチする。
/^abc/ =~ "\n\nabc" #=> 2 /\Aabc/ =~ "\n\nabc" #=> nil
Mix-in
includeはクラスに、extendはインスタンスに使用する。
module Greeting def hello; puts "Hello"; end end class Foo include Greeting end f = Foo.new f.hello #=> Hello class Bar; end b = Bar.new b.extend Greeting b.hello #=> Hello
楽天テクノロジーカンファレンス 2013 に行ってきました
楽天テクノロジーカンファレンスに参加してきました。Dave Thomas, James O. Coplien, Matzなどの有名人の話を聞けたのが良かったです。
UX Analytics - How to measure ROI of content and functions
UXの測定をするには、以下の4つのステップを実行する。
- ユーザフロー図を書く
- 画面遷移図を書く
- KPIを決める
- データを収集する
Elixir: The Joy of Ruby, the Power of Erlang
Dave Thomasの講演。Elixirという言語の紹介。すぐに使えそうな場面は思いつかないが、なかなか面白そう。
Aiming the Moving Target
Matzの講演。
昔はコンピュータが高価だったため、顧客満足よりもプロジェクトが失敗しないことが重要だった。今は何度も試せるので、失敗を前提としたTry And Error戦略のほうがよい。
Technology Evolution at Viki / developing VOD apps for Smart TVs (Wuaki.tv)
VikiとWuaki.tvの2社で使っている技術の紹介。
- High Performance
- Network time: Amazon Route 53を使い、最も近いサーバに転送することで、ネットワーク時間を削減する。
- Generation time: 事前に取得したデータをメモリに載せておくことで、APIのレスポンスタイムを25ms以下にしている。
- 複数プラットフォーム対応
- TVのプラットフォームごとにアプリを作るとメンテナンス性が下がる。そこで、プラットフォームごとのアプリを生成するアプリを作成することにした。
- テスト
- Jasmine + KarmaでJSのテストを実施している。
Do-it-yourself Organizational Patterns at Home
James O. Coplienの講演。組織を改善するための方法。
- CRCカードを作り、それぞれの人の責務と、どんな人と連携して仕事をしているか把握する。
- 関係が深い人は赤色、薄い人は青色の線でつなぎ、組織のグラフを作る。
- 現状を把握する。特定の人に責務が集中しているなどの問題があれば改善していく。
LT
- 「HOME'S へやくる!」アプリの紹介。気持ちのいいインターフェースになっている。引っ越すときに使ってみたい。
- 一番使われているLinuxディストリビューションはMintらしい。Ubuntuかと思っていた。Ubuntuよりデスクトップが使いやすそうなので、今度Linuxを入れるときはMintにしよう。
Web+DB PRESS vol.77
Amazon Web Services 最新活用
BoxenによるMacの開発環境構築&構成管理
Macの開発環境構築のためのツールBoxenの紹介。Puppetベース。部署で共通の開発環境を使えるようになれば便利そう。ただ、全員がばらばらのOS (Windows, Mac, Unix) を使っている場合は、あまり効果がないかも。
海外テック情報局
- The Three Best Debugging Tools - Mike Perham:最良のデバッグツールは・同僚・寝ること・システムに対する知識
- Launching airbnb.jp in record time - Airbnb Engineering:どうやって翻訳ファイルを作成するか。1. ページが見られた回数をカウントし、優先度付け 2. スクリーンショットを取り、その文言が使われる状況を翻訳者に伝える。
仕事術について
仕事には聴く、伝える、段取る、動かすの4種類がある。
自分 | 相手 | |
仕事の中身 | 聴く | 伝える |
仕事の流れ | 段取る | 動かす |
1. 聴く
- No Guess:推測でものを語らず、事実のみを見つめる。
2. 伝える
- ホウレンソウ
- 「3分ください」
- 「今日は○○について話します。結論としてはXXではないかと思っています。それを説明するために、これから3つの点について話します。」
- 「言いたいコトを1つに絞る」「段落ごとに区切りながら短く話す」「言い直さない」
- 仕事のやりとりは証跡を残す
- PAC思考:前提(Premise)→仮定(Assumption)→結論(Conclusion)
3. 段取る
- 「段取り」とは、目標や仕事を必ず達成しようという決意。
- 時間に投資して、仕事量を減らせるような仕組みを作る。
- メールはすぐに返信する。返信を後回しにしても、メールの量は変わらない。
- 仕事の所要時間は倍を見積もる。
- 仕事の進め方
- 5分限定ですぐにやる:直後だから簡単な質問でも聞きやすい。
- ゴールを決める:時間をかけない。情報が充分に集まっていれば、意思決定はすぐにできるはず。
- スケジューリング:ゴールから俯瞰逆算して、最短ルートを探す。
- 何かをバッサリ切り捨てる。『全くするべきでないことを能率的にする。これほどむだなことはない』
- 自分でなくてもできることは人に任せる。
- 1/10の時間で仕上げる方法はないか?
4. 動かす(交渉術)
セットアップ
取引設計
- 自他双方のポジションの背後にある利益、そしてその相違を見極める。
- 相違を相互利益へとつなぐ「ダブテーリング」をする。
- パイの大きさを相手と共同で最大化する方法を見出す。
戦術
- ZOPAの見極めと、相手のZOPA認識を変える
- 目標は強気に設定する
- 影響力の武器
- 返報性:親切には親切で返そうとする。Give&Take, Door In The Face
- 一貫性:人は一度決定すると、その後もそれに引きずられる。Foot In The Door, Low-ball
- 社会的証明:他人や社会が正しいとしている判断基準に左右される
- 好意:好意を持っている相手の意見は聞いてしまいがち。自己開示、良い警官・悪い警官
- 権威:権威者の意見は正しい
- 希少性:手に入りにくいものほど欲しくなる
5. その他
- 早朝型で仕事をする。22時に寝て4時に起きる。
- 帰宅前に机を整理し、明日のToDoリストをまとめる。
Macの開発環境構築
新しくMacBookAirをゲットしたので、RubyOnRailsの開発環境ができるまでをメモしておきます。
一般ツール
- Alfred:ランチャー。最近はQuicksilverよりも有名?自分で検索サイトを追加できるのが便利。
- OmniFocus:タスク管理。便利だけどMacしか使えない&高い。
- BetterTouchTool:Windows7のように、ウインドウを画面の端に持っていくとサイズ変更できるようになる。
- StartNinja:Macの起動音を消す。
- XtraFinder:Finderにタブ機能を追加
- Skype
- WindowFlow:Option+Tabでより便利なWindow切り替えができるようになる。Preferences > Start up > Don't ShowにしておくとDockに表示されないのでよい。
- KeyRemap4MacBook:キーボードカスタマイズツール。Emacsキーバインドにしないと仕事にならない。
- toggl:Time Tracking Application。どの作業にどれくらい時間を使ったかわかる。
- CotEditor:エディタ。
- Paintbrush:Windowsのペイントとほぼおなじ。
- DragonDrop:ドラッグ&ドロップがちょっと便利に。
- FormatMatch
- |nvAlt: memo
各種設定
- 警告音を消す:System Preference > Sound > Alert Volume
- 拡張子を表示:Finder > Preferences > Advanced > Show all filename extensions
- Caps lockをControlに変更:System Preferences > Keyboard > Modifier Keys
開発ツール
- Sublime Text 2:エディタ。いろいろなPackageを追加できる。
- Package Control:Package管理ツール。
- RubyTest:コードとテストのジャンプなどができる。便利。
- Git:gitのコマンドがSbulime Textから使えるようになる。blameが見やすい。
- SideBarEnhancements:サイドバーの右クリックメニューが増える。
- CoffeeScript
- iTerm2:ターミナル
- Xcode:homebrewをインストールするために必要。Xcode > Preferences > Downloads > Command Line Tools
- Firefox
- Chrome
- Postman:Get/Postリクエストを送るのに使用
- Proxy SwitchySharp:Proxyの管理
- Kaleidoscope:マージツール。有料だがきれい。
- Skitch:スクリーンショットに書き込みができる。
コマンドラインツール
## Homebrew ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" brew doctor ## zsh brew install zsh sudo sh -c 'echo "/usr/local/bin/zsh" >> /etc/shells' chpass -s /usr/local/bin/zsh ## rvm curl -L https://get.rvm.io | bash -s stable source /Users/taro.tanaka/.rvm/scripts/rvm rvm requirements rvm install ruby-1.9.2-p180 --with-gcc=clang ## Git brew install git git config --global user.name taro.tanaka git config --global user.email taro.tanaka@mail.example.com brew install qt # capybara-webkitのインストールに必要 brew install gitx # gitのbranchを見るのに使う