tanihito’s blog

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

仕事術について

仕事には聴く、伝える、段取る、動かすの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) 非キー属性から候補キーへの関数従属性を取り除く

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の紹介。既存のテストがないクラスを修正する際に、これでテストを作っておくとデグレが減るかも。