tanihito’s blog

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

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) 非キー属性から候補キーへの関数従属性を取り除く

WEB+DB PRESS vol.70, 72, 73を読み返した

積ん読していたWeb+DBをやっと読み終わりました。面白かった記事をまとめておきます。

Javaでナノチューニング! (vol.70)

ループ時の繰り返し判定を避ける

for (int i=0; i<list.size()-1; i++) // NG: 1ループするたびにlist.size()が実行される
for (int i=0, size=list.size()-1; i<size; i++) // OK

定数はstatic finalと記述する

static int MAX_SIZE = 5; // NG
static final int MAX_SIZ = 5 // OK: コンパイル時に定数値がインライン展開される

配列のディープコピーはNativeメソッドを使用する

for(int i=0; j=list1.length; i<j; i++) { list2[i] = list1[i] } // NG
System.arraycopy(list1, 0, list2, 0, MAX_SIZE-1) // OK

あなたの知らないActiveSupport (vol.70)

Railsのユーティリティライブラリ。詳細はActive Support Core Extensionsを参照。

require 'active_support/all' # require 'active_support'だけでは必要なライブラリが入らない。
4.hour.ago #=> 2013-08-31 08:02:14 +0900

Rack再入門 (vol.72)

  • RackとはサーバとWebフレームワークを繋ぐための仕様。サーバが使うHTMLをRubyが使うデータ構造(ハッシュ、配列など)に変換してくれる。
  • RailsのActionDispatch::RequestがRack::Requestを継承するなど、Rackについて知っておくことはWeb開発にも役立つ。
  • PythonでいうWSGI
require 'rack'
require 'pp'
class SimpleApp
  def call(env)
    status = 200
    header = {'Content-Type' => 'text/plan'}
    body = env.pretty_inspect
    [status, header, [body]]
  end
end
run SimpleApp.new
vim config.ru
rackup
curl "http://localhost:9292?hello=rack"

Chrome Developer Toolsを使った実践デバッグ術 (vol.72)

  • コード中にdebuggerと書くと、そこでブレークさせることができる。
  • $0: Elementsパネルで最後に選択した要素を返す
  • DOM Breakpoints: Elementsパネル右クリックで設定
  • XHR Breakpoints: Sourceパネル右ペインで設定

詳細Rails4 (vol.73)

ActiveRecordは使っていないので、それ以外で気になったところ。一部Gemの紹介も込み。

  • app/{modules, controllers}/concernsディレクトリの追加
  • Asset Pipelineの高速化。Asset Pipelineは以下の処理を行っており、時間がかかっていた。
    1. CoffeeScript, SCSSのコンパイル
    2. 単一のapplication.js, application.cssに結合
    3. 圧縮(コメントや空行の除去、変数名の短縮)
    4. ブラウザの再キャッシュのため、ファイル名にダイジェストを追加
  • Springによるコマンドの高速実行
bundle i spring
spring rake about
  • Jbuilder: respond_to do |format|の代わりに、.json.jbuilderテンプレートを作成できる。
  • Poltergeist: Capybaraから使用できるドライバ(ブラウザ相当の動作をするアプリケーション)の1つで、JSも含めたテストを可能にする。
    • ヘッドレス(ウィンドウを表示しない)なので、CIサーバでも実行できる。
    • JSのエラーをスタックトレース付きで表示できる。

RubyKaigi2013に参加しました

2013/05/30~6/1の3日間で開催されたRubyKaigiに参加してきました。自分が参加した発表について、内容をまとめておきます。Ustream・スライドはここにまとまっています。

The Future of JRuby?

JRubyとは、JVM上で動くRubyのこと.

  • 欠点:JVMの開発スピードが遅い
  • 利点:JVMが改善されれば、JRubyの性能の自動的に向上する。現状でRuby1.8よりも早い。

Ruby 'root'

https://speakerdeck.com/hsbt/ruby-root
Rubyコミッターの仕事の紹介。pull requestのmergeや、Rubyでライブラリのテストが通るかの確認(http://ci.hsbt.org/)などを行なっている。

Toward efficient Ruby 2.1

http://rvm.jp/t.pdf
Ruby2.1のRestricted generational Garbage Collection (RGenGC) の説明。

bundle install` Y U SO SLOW: Server Edition'

BundlerAPIをHeroku上で動かした話。

Refining refinements

https://speakerdeck.com/shugo/refining-refinements
Ruby2.0で追加されたrefinements機能の説明。main.using(mod)を呼んだ以降でそのmoduleの関数が使えるようになる。monkey patchに似ているが、monkey patchは全てのクラスが影響を受けるのに対し、refinementsはusingが呼ばれたファイルのみ影響を受けるため、影響範囲を小さくできる。

High Performance Rails

http://rubykaigi.org/2013/talk/S76
CockpadでのRailsの高速化の話。

  • response time (X-Runtime) を200ms以内にしている。
  • Rubyは遅いので、できるだけRubyに処理をさせない。
    • Apache (static files) -> Varnish (page caching) -> Nginx (proxy buffering) -> Unicorn (Rails)
  • Rubyのバージョンを上げる。1.9.3から2.0.0にすると20ms早くなった。
  • Railsの遅い、高速化が必要な場所
    • ActiveRecordのモデル作成
    • routing: url_forを含むviewのhelper
link_to 'hello', hello_index_url
#=> 0.09659 ms
link_to 'hello', controller: 'hello', action: 'index'
#=> 10.97867 ms
  • template engine
    • コンパイルは最初の一回だけなので、レンダリング時間のほうが重要
    • Slim, ERB, Haml の順番で早い
    • 全体の速度にはあまり影響しないので、使いやすいものを選べばよい
  • unicornGCを無効化する
    • 数リクエストごとにまとめてGCを実行することで、レスポンスタイムを短くできる
# config.ru
require "unicorn/oob_gc"
use Unicorn::OobGC, 10
# unicorn config
after_fork do |server, worker|
  GC.disable
end
    • unicorn-worker-killerを使って、メモリを使いすぎたときにworkerをkillできるようにする。
  • Slow Queryを集計しておく

Continuous gem dependency updating with Jenkins and Pull Request

https://speakerdeck.com/kyanny/continuous-gem-dependency-updating-with-jenkins-and-pull-request
Gemfile.lockを更新してpull requestを送るJenkinsタスクを作成し、毎日実行する。

  • hubコマンドを使用する。
  • pull requestのタイトルにテストの結果を書く。失敗していたらすぐに調査。
  • アバターにJenkinsのイラストを使用。
git checkout -b bundle-update-YYYYMMDD
bundle update
git add Gemfile.lock
git cimmit -m 'bundle update'
bundle exec rake spec
hub pull-request

Security is hard, but we can’t go shopping

Concerning 'Applications'

https://speakerdeck.com/moro/concerning-application
ActiveSupport::Concernの紹介。

  • クラスメソッド・インスタンスメソッド・属性の設定などを簡単にincludeできる。
  • Rails4ではcontrollersとmodelsの下にconcernsディレクトリができる。

Refactoring Fat Models with Patterns

http://www.ustream.tv/recorded/33569967
https://github.com/codeclimate/refactoring-fat-models
codeclimateのブログと同じ内容。concernを使ったmix-inを否定しているところが、前の発表と真逆。

Millions of Apps Deployed: What We've Learned

アプリ作成のTips集

  • security_tokenはハードコーディングせずに環境変数に入れる。「このアプリをそのままオープンソースにできるか?」
  • 開発環境と本番環境はできるだけ揃える
    • DB
    • Rubyバージョン
    • データ
  • README.mdを書く
    • 外部ライブラリのインストール方法
    • アプリの起動方法
    • 開発環境での注意点

If you do not enter the tiger's cave, you will not catch its cub: Objects, DCI, and Programming

DCI (Data, context and interaction) の紹介。DCIは面白そうなので後で調べる。参考資料:

The Origamist's Ruby: Folding better code

リファクタリング方法について。

  • Sandi Metz’ rules for developers
    • Classes can be no longer than one hundred lines of code.
    • Methods can be no longer than five lines of code.
    • Pass no more than four parameters into a method. Hash options are parameters.
    • Controllers can instantiate only one object. Therefore, views can only know about one instance variable and views should only send messages to that object (@object.collaborator.value is not allowed).
  • “Learn the rules like a pro, so you can break them like an artist.” - Pablo Picasso

Be a library developer!

http://www.slideshare.net/kou/rubykaigi-2013

  • Remember Than Imagine
    • 問題を解決するための知識(パターン)があると、解決方法を創造するよりも早い
    • Libraryを書くことで、知識を実装にする練習をしよう

'The Metric Talks or Not

https://speakerdeck.com/irohiroki/the-metric-talks-or-not

Contributing to Ruby

どうやってRubyコミュニティーに貢献するか。rdocでドキュメンテーションされていない関数を探し、修正してpull requestを送るところまでをライブコーディングしていた。

LT

  • 暗記用ツールankiの紹介。なぜPythonのツールをRubyKaigiで紹介したのかは謎。
  • rspecの自動作成ツールrspec-kickstarterの紹介。既存のテストがないクラスを修正する際に、これでテストを作っておくとデグレが減るかも。

リーダブルコード

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニックを読みました。どうやったらきれいなコードが書けるかについて、分かりやすく説明しています。200ページと薄いので、エンジニアなら読んでみて損はないです。これぐらい当たり前にできるようにならなきゃなー。

iPhone版『空気読み。』の隠しのリスト

たまにはプログラミングと関係ない話題を。
最近iPhoneアプリ空気読み。にはまってます。ここを参考にして「隠しのリスト」がほぼコンプリートできたので、やりかたをまとめました。残ってるのはNo.72だけですが、全然わからない…。

No. 問題 隠しのリスト 出し方
電車で そんな日もあるよね 操作しない
マヨネーズ ダイエット中 操作しない
ふせ ご主人様じゃない! 犬を左にスワイプ
エスカレーター東京編 運動不足解消 上にスワイプして駆け上がる
渡り… アウトロー 右の画面外へ
サンタ だるまさんが転んだ 一度寝てまた起きる
合コン 壊れてるかもしれないし… ボタン連打
とりあえず ご飯は飲み物! ご飯セットにタッチ
フィーリングカップル カミングアウト 男にタッチ
10 告る せめてもの抵抗 ボールが来る前に倒れる?
11 やさしさ 忘れ物、忘れ物… 左にスワイプ
12 始業 ノスタルジー 着席した際にさらに後ろに倒れる
13 はじめてのデート 生態研究 禁に近づく
14 メールに夢中 気のせい、きっと気のせい! 携帯を連打
15 ドミノ 俺は流されない! 右に倒れる
16 かさ 小雨だからね 傘をたたむ
17 バス 両替しなくちゃ… 右にスワイプ
18 電車で2 障害がある方が燃える! 右の画面外へ
19 デート アニメ見たい… アニメに近づいてから恋愛映画へ
20 立ち位置 ストーカーかよ! 左右に高速移動
21 ヅラ ざわざわ… タッチしない
22 水戸の 逃げるが勝ち! 左の画面外へ
23 歩調 波長もピッタリ しばらくして現れる、アニメ女にそろえる
24 付き合います やっぱり無理 左側で画面外へ
25 キッス つい、カッとして… 体当たり
26 戦隊オーディション 辛いものは苦手 手を挙げかけて、右へ
27 ポーズ 俺がレッドかも… 上にスワイプ
28 落ち物パズル 角があると強そう… 頭のてっぺん
29 脳内のアレで 大は小を兼ねる ダブルクリックで最大化
30 朝礼で 迷うことあるよね…? 右にスワイプ
31 つるつる 今日は髭そり バーバーに行く
32 バーで 返品希望 受け取ったら相手に返す
33 少年との約束 プロのカガミ ピッチャー返し
34 トップロープ マウストウマウス 相手の真下に移動
35 同じ方に… 嫌な予感がするときがある 操作しない
36 大縄跳び ピッタリジャンプ 左右に合わせて飛ぶ
37 夜露死苦 キメッ! 上にスワイプ
38 接待 興味なし ずっと右を向く
39 再び電車で あー!もう…! 叩いて起こす
40 一本じめ 昔は本気で間違った 3回叩く
41 続・再び電車で 紳士ですから… 起こした後、左の画面外へ
42 握手会 最後尾はこちら A子の真ん前に割り込み
43 スカイダイビング 俺が中心だ! 輪の中心に移動
44 グラビア 世紀のスクープ? 右にスワイプ
45 クーラー 節電完了 電源ボタン
46 立ち読み 邪魔だよね 隙間を空けておき、相手が来たら邪魔する
47 レンタル 返却はお忘れなく… 左の空箱を取る
48 自販機 無駄遣い禁止 おつり・返却レバーを押す
49 焼き肉 遠慮の塊 自分の口にまっすぐもってくる
50 気功の 作用反作用 右にスワイプして攻撃
51 目線 クローン…? 右のエスカレータをずっと見る
52 続々再び電車で 視線が怖いです… 左にスワイプ
53 雨あがり ターボ…? スピードMax
54 くじ 人生の厳しさ 線をたくさん書く
55 落ち物パズル 消したった! 右側のくぼみに入れる
56 糸くず モニター死亡… モニターを落とす
57 ぐち ほふく前進 左の画面外
58 ヘッドフォン マナーモード VoLを0にする
59 クイズ 経費削減 操作しない
60 デート2 焼き肉大好き! すぐ焼肉屋へ
61 回転寿司 エビ好き! エビだけ取る
62 一本じめ二本目 お約束 1回目の「よーお」で叩く
63 レジで ルフレ 自分でレジに行く
64 コールアンドレスポンス ロックだぜ… 全部いえい
65 デート3 今日は映画以外! 真中で画面外へ
66 映画館で 立ち見でも見たい 右の画面外へ
67 出撃!! ランデブー! 左に避け、シャアと同じ機体へ
68 スタンディングのアレ つまらなかったから… 右の画面外へ
69 バーで2 ナイスアシスト、お前! 一回止めて、次の人に渡す
70 がんばれ受験生 やれやれだ… 窓ガラスをタップ
71 すもう 八百長禁止! 右に押しだす
72 あのダン ギャグダン わからない…。
73 台風 史上最大級 台風に触りっぱなしで大きくする
74 SayHo!! 新興宗教…? 常に連打
75 ペンライト ワイパー 左右に高速移動
76 仮装大会 醍醐味だよね 司会が来てから点を入れる
77 トータライザー 連打したくなる… 連打
78 熱湯風呂 フライング すぐに押す
79 熱湯風呂その後 熱さに強いんです! 潜る
80 衝撃告白 怪しいものではありません マイクを隠す
81 始球式 プロ失格 ボールを打つ
82 ウェーブ 目立ちたがり 何回も立つ
83 リフト 上げてみただけ… 上げた後下ろす
84 山で 寝たふりはダメらしい 寝た後、画面外
85 続続々再び電車で 因果応報 女の子の右隣の男の顔を見続ける
86 シートベルト 罰ゲーム…? シートベルトを口に
87 参観日 油断大敵! 親を選択
88 テニス 見てはいけない…? 顔の向きを観客にあわせておき、UFOが来たら見ない
89 UFO 頭上注意 すぐに左にスワイプ
90 UFO内 パニック中! ずっと手を挙げる
91 着替え 俺が正義だ! 右の画面外へ
92 エスカレーター大阪編 大阪ですから 下りのエスカレーターに移動
93 プロジェクター 暗いとテンション上昇! スクリーンの前でジャンプ
94 解散宣言 解散、解散… 操作しない
95 節電中 換気 窓を5秒全開にして、しばらくしたら閉じる
96 電車7人掛け上級 隣の車両はガラガラかも… 左の画面外へ
97 惑星上陸 急に用事が… 下の画面外に
98 必殺技が… 逆転の一撃 右にスワイプし、必殺技を跳ね返す
99 さようなら SKIP!! ずっとタッチ
100 Gモード バランスが大事 ロゴを真ん中に