tanihito’s blog

デジタル・新規事業開発・健康など、興味のあることについてつらつらと書いてきます。

Ruby技術者認定試験 Silver の勉強方法

Ruby技術者認定試験 Silverに合格しました!標準ライブラリについての問題がほとんどなので、普段Rubyを使っている人ならば2,3日で合格できます。

勉強方法

Ruby技術者認定試験 公式ガイドをやりました。Silver/Gold対応の参考書もありますが、Goldにしか出ない内容も書かれているため勉強しにくいようです。

  1. 公式ガイドをざっと読む
  2. 巻末の問題集をやる。考えて分かる問題はないので、分からなければすぐに解答を見る。
  3. 新しく知った内容をまとめる。
  4. 解けなかった問題だけリストアップして再度問題集をやる。

振り返り

  • 勉強内容をまとめるのは良い。同じところで何度も詰まることがなくなる。
  • 勉強した時間を測定しておくべきだった。どれくらいの勉強時間で合格できるかの参考になるはず。

勉強内容のまとめ

演算子

比較演算子の比較。

  • == 同じものか調べる
  • === 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つのステップを実行する。

  1. ユーザフロー図を書く
  2. 画面遷移図を書く
  3. KPIを決める
  4. データを収集する

Elixir: The Joy of Ruby, the Power of Erlang

Dave Thomasの講演。Elixirという言語の紹介。すぐに使えそうな場面は思いつかないが、なかなか面白そう。

  • Elixirとは
  • なぜElixirがよいのか?
    • 分散コンピューティングがしやすい。
    • 関数型言語なので簡潔に記述できる。
    • RubyのようなSyntaxなので書いていて楽しい。

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の講演。組織を改善するための方法。

  1. CRCカードを作り、それぞれの人の責務と、どんな人と連携して仕事をしているか把握する。
  2. 関係が深い人は赤色、薄い人は青色の線でつなぎ、組織のグラフを作る。
  3. 現状を把握する。特定の人に責務が集中しているなどの問題があれば改善していく。

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) を使っている場合は、あまり効果がないかも。

海外テック情報局

仕事術について

仕事には聴く、伝える、段取る、動かすの4種類がある。

自分 相手
仕事の中身 聴く 伝える
仕事の流れ 段取る 動かす

1. 聴く

  • No Guess:推測でものを語らず、事実のみを見つめる。

2. 伝える

  • ホウレンソウ
    1. 「3分ください」
    2. 「今日は○○について話します。結論としてはXXではないかと思っています。それを説明するために、これから3つの点について話します。」
    3. 「言いたいコトを1つに絞る」「段落ごとに区切りながら短く話す」「言い直さない」
  • 仕事のやりとりは証跡を残す
  • PAC思考:前提(Premise)→仮定(Assumption)→結論(Conclusion)

3. 段取る

  • 「段取り」とは、目標や仕事を必ず達成しようという決意。
  • 時間に投資して、仕事量を減らせるような仕組みを作る。
  • メールはすぐに返信する。返信を後回しにしても、メールの量は変わらない。
  • 仕事の所要時間は倍を見積もる。
  • 仕事の進め方
    1. 5分限定ですぐにやる:直後だから簡単な質問でも聞きやすい。
    2. ゴールを決める:時間をかけない。情報が充分に集まっていれば、意思決定はすぐにできるはず。
    3. スケジューリング:ゴールから俯瞰逆算して、最短ルートを探す。
      • 何かをバッサリ切り捨てる。『全くするべきでないことを能率的にする。これほどむだなことはない』
      • 自分でなくてもできることは人に任せる。
      • 1/10の時間で仕上げる方法はないか?

4. 動かす(交渉術)

セットアップ
  1. 交渉相手の見極め
    • 最大の価値を持つ相手
    • 潜在的影響力を持つ相手 
    • 取引の承認者
    • 取引を実行する当事者
    • 当事者が多すぎないか確認
  2. 利益の見極め
    • 自分の利益
      • 絶対に必要なもの
      • 望ましいが不可欠ではないもの
    • 相手の利益
      • 質問し、能動的に耳を傾ける
      • インターネットなどの開示情報を調べる
      • 自分の組織内に情報源を見つける
      • アドバイザーを得る
  3. BATNAの見極め
  4. 順序の決定
    • 取引のカギを握る相手を最終ターゲットとし、その相手から「Yes」を得るためには誰に働きかけるべきかを考える。
取引設計
  1. 自他双方のポジションの背後にある利益、そしてその相違を見極める。
  2. 相違を相互利益へとつなぐ「ダブテーリング」をする。
  3. パイの大きさを相手と共同で最大化する方法を見出す。
戦術
  1. ZOPAの見極めと、相手のZOPA認識を変える
  2. 目標は強気に設定する
  • 影響力の武器
    • 返報性:親切には親切で返そうとする。Give&Take, Door In The Face
    • 一貫性:人は一度決定すると、その後もそれに引きずられる。Foot In The Door, Low-ball
    • 社会的証明:他人や社会が正しいとしている判断基準に左右される
    • 好意:好意を持っている相手の意見は聞いてしまいがち。自己開示、良い警官・悪い警官
    • 権威:権威者の意見は正しい
    • 希少性:手に入りにくいものほど欲しくなる

5. その他

  • 早朝型で仕事をする。22時に寝て4時に起きる。
  • 帰宅前に机を整理し、明日のToDoリストをまとめる。

Macの開発環境構築

新しくMacBookAirをゲットしたので、RubyOnRailsの開発環境ができるまでをメモしておきます。

一般ツール

  • Alfred:ランチャー。最近はQuicksilverよりも有名?自分で検索サイトを追加できるのが便利。
  • OmniFocus:タスク管理。便利だけどMacしか使えない&高い。
  • BetterTouchToolWindows7のように、ウインドウを画面の端に持っていくとサイズ変更できるようになる。
  • StartNinjaMacの起動音を消す。
  • XtraFinder:Finderにタブ機能を追加
  • Skype
  • WindowFlow:Option+Tabでより便利なWindow切り替えができるようになる。Preferences > Start up > Don't ShowにしておくとDockに表示されないのでよい。
  • KeyRemap4MacBook:キーボードカスタマイズツール。Emacsキーバインドにしないと仕事にならない。
  • toggl:Time Tracking Application。どの作業にどれくらい時間を使ったかわかる。
  • CotEditor:エディタ。
  • PaintbrushWindowsのペイントとほぼおなじ。
  • 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を見るのに使う

Web+DB PRESS vol.76

最近Web+DBのまとめしか書いてない気がします。読みたい本はたくさんあるのですが、まずは大量のバックナンバーを消費しないと本棚に入らないんです…。というわけで、Web+DB PRESS vol.76のまとめ・感想です。

実践UIデザイン

UIをデザインするためには、まずは「ユーザがそのサービスを使ってどんなゴールを達成したいか」というUXをデザインする必要がある。

  1. 調査対象のユーザを見つけ出す
  2. ユーザ調査をする
    • どんなときにうれしいと思うか
    • どんなときにストレスを感じるか
    • ある機能がなかったら代わりに何で代用するか
    • 上記の理由
  3. ペルソナを作る
    • 氏名
    • 性別
    • 年齢
    • 顔写真
    • 職業
    • 簡単な人物像
    • サービスを使用する状況
    • 達成したいゴール(感情・機能・人生)
  4. シナリオを書く
  5. シナリオから機能要件を洗い出す
  6. UIをデザインする

Web決済入門

主にクレジットカード決済について。クレジットカードに含まれる情報は

  • カード番号:13~16桁の数字。PAN (Primary Account Number) とも呼ばれる。最後の1桁を見ることで、Luhnアルゴリズムにより入力間違いを検知できる。
  • 有効期限
  • カード所有者名
  • 国際ブランド:JCB, VISAなどのブランド。カード番号からブランドを判定することができる。
  • セキュリティーコード:不正使用利用防止のためのコード。CVC (Card Verification Code), CVV (Card Verification Value) とも呼ばれる。この数字を保存することは禁止されている。

クレジットカードの情報漏えいを防ぐためのセキュリティー標準として、PCI DSS (Payment Card Industry Data Security Standard) がある。日本では、クレジットカード決済を持つすべてのWebサービスPCI DSSへの準拠が必要。

serverspecによるテスト駆動インフラ構築

serverspecはサーバ構成のテストをRSpecで書けるRubyフレームワーク。Chefなどのプロビジョニングフレームワークとは独立しているため、Chefを使用していない環境にも使える。例:

describe package('httpd') do
  it { should be_installed }
end

describe service('httpd') do
  it { should be_enabled }
  it { should be_running }
end

海外テック情報局

理論で学ぶSQL再入門

Web+DBで連載している「理論で学ぶSQL再入門」が、大学のDB工学の授業の復習になって面白いです。最近はAPI経由でデータを取ることが多く、SQLを直接使うことは減りましたが、やはりSQLやDBの知識は必要ですね。

  • SQLにおける「リレーション」とは、テーブルのこと。
relation = heading + body
heading = 属性の名称とデータ型のペアの集合 Ex. ({国名:文字列}, {国番号: 整数})
body = 属性値のtupleの集合 Ex. (("日本", 81), ("イギリス", 44), ("アメリカ", 1)
  • SELECTとは、直積・制限・射影を同時に行う操作。
SELECT t1.c1, t2.c2 FROM t1 INNER JOIN t2 WHERE t1.c4 = t2.c5
=> t1とt2の直積に対して「t1.c4 = t2.c5」という条件の制限を適用し、さらにその結果からt1c1, t2.c2というカラムだけ出力する射影を行う。
  • SQLとリレーショナルモデルの違い:SQLには重複・順序・更新・トランザクション・NULLがあるが、リレーショナルモデルにはない。
  • NULLはできる限り使わないようにする。NULLを使うと以下の問題が発生する。
    • TRUE, FALSE, NULLという3つの論理値を処理する必要があり、評価式が複雑になる
    • 情報が不自然に丸められてしまう。たとえば、ある人の年齢がわからなくても風貌から「30歳だろうか?」と推測できるが、NULLにするとその情報が全てなくなる。
  • 正規化
正規形 正規化の方法
第1正規形 (1NF) 配列などを取り除き、スカラ値のみにする
第2正規形 (2NF) 候補キーから非キー属性への関数従属性を取り除く
第3正規形 (3NF) 非キー属性から非キー属性への関数従属性を取り除く
ボイスコッド正規形 (BCNF) 非キー属性から候補キーへの関数従属性を取り除く