すがブロ

sugamasaoのhatenablogだよ

RSpecで遅いテストを見つける

--profile オプションを使う

普段きちんとRSpecを使っている人にとっては常識なのかもしれません。というか普通にhelpに載っているので常識なのでしょう、、、。

RSpecで遅いテストを見つけるには、--profile オプションを使うと簡単に見つけることができます。

% bundle exec rspec --profile 3
..................................

Top 3 slowest examples (4.24 seconds, 61.5% of total time):
  Pooka Pooka::Master Worker#run worker received usr1 signal(signal_handler_thread Error)
    1.41 seconds ./spec/pooka_spec.rb:86
  Pooka Pooka::Master worker received hup signal(fail config reload)
    1.41 seconds ./spec/pooka_spec.rb:109
  Pooka Pooka::Master Worker#run worker received hup signal
    1.41 seconds ./spec/pooka_spec.rb:53

Top 3 slowest example groups:
  Pooka
    0.76258 seconds average (6.86 seconds / 9 examples) ./spec/pooka_spec.rb:3
  Pooka::Configuration
    0.00121 seconds average (0.01575 seconds / 13 examples) ./spec/pooka/configuration_spec.rb:5
  Pooka::PID
    0.00063 seconds average (0.00443 seconds / 7 examples) ./spec/pooka/pid_spec.rb:4

Finished in 6.89 seconds (files took 0.24356 seconds to load)
34 examples, 0 failures

--profile の後に数値を指定することで出力する件数を調整することもできます。

macOS Sierra時代のsyslogとの付き合いかた

/var/log/system.log へ書き込まれないのでした

ある調査によると、人間は一日におよそ86400回はsyslogに出力したいと願っているそうです*1

さて例えばlogger コマンドを使って syslog に出力しておく、なんていうことは稀によくあることではないでしょうか。私は稀によくあります。

ところが、MacにおいてSierraにアップグレードしてからというもの、loggerコマンドや何がしかのプログラミング言語を使ったsyslogへの出力を行なってもsyslogーーいわゆる /var/log/system.log へ書き込まれないのでした。

統合されたログ環境

実は macOS Sierra 10.12 あたりを見ると、なんとなくsyslogについて言及されている。

要約すると

  • ASL (Apple System Logger)という統合されたログ環境になったよ
  • 見るなら Console.app を見てね
  • log コマンドでも見れるよ

そんなわけで、loggerコマンドなどで出力したログは虚空に吸い込まれたわけではなく、ASLに出力されているのでした。

ログを検索することもできる

新しくなったconsole.appで logger プロセスからの出力でフィルタリングしつつ、loggerコマンドを実行するとこんな感じで出力される。

f:id:seiunsky:20170406230324p:plain

もちろん、過去に出力されたログを検索することもできる。

また、上記で書いたように log というコマンドも用意されていて*2、それを使うと、例えばこんな風にログを検索することもできる。

% log show --style syslog --predicate 'processImagePath endswith "logger"' --start "2017-04-06 23:02:30"
Skipping info and debug messages, pass --info and/or --debug to include.
Filtering the log data using "processImagePath ENDSWITH "logger""
Timestamp                       (process)[PID]
2017-04-06 23:02:33.918967+0900  localhost logger[51425]: アババババばばばばb

logコマンドについてはまー man log すれば雰囲気はわかると思う。この先は君自身の目で確かめてくれ!

これでsyslogに何も出力されなくて途方にくれなくて済みますね。

*1:要出典

*2:噂では以前は数学のlog関数用のコマンドだった?

pry起動時に「Sorry, you can't use Pry without Readline or a compatible library.」と言われる場合あるいはirbで矢印キーが動かない場合

irbで矢印キーを入力するとエスケープ文字が出力されてしまったり、pryを移動させるとエラーになってしまう場合の対処。

OSのバージョンをSierraにしたからか、irbやpryがうまく動かなくなってしまった。

# bundle exec pry
Sorry, you can't use Pry without Readline or a compatible library.
Possible solutions:
 * Rebuild Ruby with Readline support using `--with-readline`
 * Use the rb-readline gem, which is a pure-Ruby port of Readline
 * Use the pry-coolline gem, a pure-ruby alternative to Readline
bundler: failed to load command: pry (/private/tmp/hoge/vendor/bundle/bin/pry)
LoadError: dlopen(/Users/sugamasao/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
  Referenced from: /Users/sugamasao/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
  Reason: image not found - /Users/sugamasao/.rbenv/versions/2.3.1/lib/ruby/2.3.0/x86_64-darwin15/readline.bundle
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/default.rb:151:in `require'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/default.rb:151:in `lazy_readline'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/default.rb:6:in `block in <class:Default>'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/default.rb:125:in `instance_eval'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/default.rb:125:in `block (2 levels) in <class:Default>'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/behavior.rb:54:in `public_send'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/config/behavior.rb:54:in `method_missing'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/history.rb:19:in `restore_default_behavior'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/history.rb:14:in `initialize'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/pry_class.rb:33:in `new'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/pry_class.rb:33:in `history'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/pry_class.rb:222:in `load_history'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/pry_class.rb:129:in `initial_session_setup'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/cli.rb:206:in `block in <top (required)>'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/cli.rb:83:in `block in parse_options'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/cli.rb:83:in `each'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/lib/pry/cli.rb:83:in `parse_options'
  /private/tmp/hoge/vendor/bundle/gems/pry-0.10.4/bin/pry:16:in `<top (required)>'
  /private/tmp/hoge/vendor/bundle/bin/pry:23:in `load'
  /private/tmp/hoge/vendor/bundle/bin/pry:23:in `<top (required)>'

調べてみると、どうも readline がおかしいらしい。

readlineを入れ直す

複数バージョン入っていたので一度全て消してインストール

$ brew uninstall readline
Uninstalling /usr/local/Cellar/readline/7.0... (45 files, 2M)
readline 6.3.5, 6.3.8 are still installed.
Remove all versions with `brew uninstall --force readline`.
$ brew uninstall --force readline
Uninstalling readline... (92 files, 4M)
$ brew install readline
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core, homebrew/science).

Rubyを入れ直す

rbenvなのでrbenvでuninstallしてinstallする

$ rbenv uninstall 2.3.1
rbenv: remove /Users/sugamasao/.rbenv/versions/2.3.1? y
$ rbenv install 2.3.1

これでpryを起動したりするとうまく動くようになった。やったー

「あなたのセキュリティ対応間違っています」をもらった && 読んだ

先日発売した「あなたのセキュリティ対応間違っています」を辻伸弘さんから頂きました。 すぐに読んでブログに書こうと思っていたのですが丸々一週間かかってしまって私はチーズ蒸しパンになりたい。

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

セキュリティに関しては特に専門家というわけではないので、取っつきにくいのかなぁ、なんて思ったのですが、難解な説明ではなく、それでいてきちんとそれぞれの事象についてわかるような内容でとても良かったです。

世の中でどういうインシデントが発生しているのか

最近はWebでも結構詳しく情報漏洩手順が書かれたりするんですが、「大まかにはわかるけど具体的にはなにが起きたんだぜ?」ということが多かったりしますよね。

例えば、

などは事例としても比較的記憶に新しいところだと思います。

これらの事件に対して、以下のような点で詳しく書かれています。

  • どのように感染したのか
  • 感染後の情報流出までの流れ
  • 異常をどの時点で検知できたのか(被害を抑えることができたか)

そのほかにも、「アノニマス」の活動についてや一時期流行ったvvvウィルス(ランサムウェア)についても丁寧に解説されています。

セキュリティインシデントに対してどう対応するか

怪しいメールがきた時の調べ方や、日頃の対策の仕方なども書いてあって、単なる事例集とも違って嬉しい点でした。 全然知らなかったんですが、お手軽さというとマイクロソフトが出しているEMET(よく利用される攻撃手順が使われると防いでくれる)というツール、Windows使ってるなら導入すると良さそうですね。

Enhanced Mitigation Experience Toolkit - EMET

あと、本の最後で無料Wi-Fiスポットの話が取り上げられていましたが、個人的には無料Wi-Fiスポットが怖くて使えないんですよね。いつか安心に使える日は来るんですかね……。

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

あなたのセキュリティ対応間違っています

個人的に辻さんと知り合いだからかも知れませんが、「おわりに」の文章がすごく良くて、(謝辞も含めて人柄が伝わって良かった)心構え的な意味でも、この本を読んで良かった。

HomeBrewのanalyticsをoffにする

いつの頃からか analytics を送るようになった

思い立った時にアップデートしてるので当時は気にしてなかったのだけど、ふと思い出して現状を確認しました。

経緯や、現在の対応方法も書いてあるのでここを見ればOKなんですけどね rcmdnk.github.io

実際に確認する

念のため現在のバージョンを確認しておく

% brew -v
Homebrew 1.0.0 (git revision c3105; last commit 2016-09-22)
Homebrew/homebrew-core (git revision 227e; last commit 2016-09-22)

否定できないくらい最新バージョンなのできっと analytics を送ってるのだろう……。サブコマンドが用意されてるらしいので確認してみよう。

$ brew analytics
Analytics is enabled.
UUID: xxxxxxxxxxxxxxxxxxxxxxxxxxxx

……有効らしい。切り替えるにはさらにon/offを指定すれば良いそうだ。

% brew analytics off
%

何も表示されないが有効になったってことかな?確認してみよう。

% brew analytics
Analytics is disabled.

無効になったようだ。

ぶっちゃけ、自分のプライベートなPCならどっちでも良いんだけど、場合によってはoffにしておきたい場合もあると思うのでメモとして残しておく。

Macで任意のファイルサイズのデータを作る時はmkfileが便利

1年に300日くらいは任意のサイズのファイルを作ってみたいという衝動にかられると思うのですが、Macを使っている場合はお手軽に作る方法があります。

詳しくは man mkfile をどうぞ

具体的な使い方

$ mkfile ファイルサイズ 出力ファイル名 でできる。ファイルサイズはメガバイトの場合はm、ギガバイトの場合はgなどの単位が使える。

➜  test mkfile 1g foo
➜  test ls -lh
total 2097152
-rw-------  1 sugamasao  wheel   1.0G  4 16 19:57 foo

べんり!Sorarisにも用意されてるコマンドらしいけど、いかんせんSorarisなんて10年近く触ってないので何もかも忘れました。

Webアプリケーションエンジニアがサービス運用をする時に必携の一冊

微力ながらレビューに協力させていただいた @koemu 先輩の単著(マジすごい!) ITインフラ監視実践入門をいただきました。

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

詳細な目次は gihyo.jp を参照してください。http://gihyo.jp/book/2016/978-4-7741-7865-3

なし崩し的にサービス運用を担当しているWebアプリケーションエンジニア……あるいは先輩(インフラ)エンジニアがどのような選択肢を考えた上で現在の方法を選んでいるか?をうかがい知るためにうってつけの本

長い見出しで恐縮です。 ただ、自分のように専門のインフラ担当というわけではないもののサービス運用を担当している人間としては 体系立てて、どのような選択肢があるのか を丁寧に説明してもらえるという場はなかなかないので非常にためになりました。

ドキュメントや体制づくりなど、色々な意味でリソースがかけられれば本書に書かれていることを全てやる!みたいのも可能かもしれませんが、現実は厳しい。そこまでのことはできない場合も多いと思います。

ただ、なんとなくやれそうな事をやる、という状況から、理想の世界ではどのような体制を作れば良いか? という指針を持った上で現場に合わせた選択をする、ということができるようになるというのは非常に重要なことだと考えています。

というのも、選択するということはある程度 別の方法を選ばなかった場合のリスク というのを想定できるからです。

個々の要素に対して非常に珍しいことを書いてあるわけではないのですが、上記のような意味で非常に有用だなと思います。

また、Mackerelでの監視設定の例があるので、この本で高まった意識をMackerelにぶつけやすいのも嬉しい点ですね。

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

ソフトウェアエンジニアのための ITインフラ監視[実践]入門 (Software Design plus)

最後に、繰り返しになりますが、我流でなんとなくやってると漏れがあったり体系立ててなかったり(別々のレイヤーのことを同列で考えてたり)するのでとても便利です。 個々の要素に対して知ってる or 知らないというよりも、こういうことが体系立てた文章になっているっていうことが自分にとってはとても嬉しいし、とても価値のある本じゃあ〜〜〜という気持ちです。