読者です 読者をやめる 読者になる 読者になる

すがブロ

sugamasaoのhatenablogだよ

本日(5/17)改訂2版 パーフェクトRubyが発売されます

パーフェクトRubyの改訂をしていました

既に技術評論社さんのサイトやAmazonにも載っているのでご存知の方も多いかもしれませんが、最近はパーフェクトRubyの改訂をしていました。

f:id:seiunsky:20170428055050j:plain

 

目次などの詳しい情報はgihyo.jpの公式サイトをご覧ください。

gihyo.jp

 

書籍版はAmazonでも購入できます。ついうっかり初版を買わない様に注意してください(ヒント:今回のモチーフは鳥です)。 

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby

 

ところで私は見本誌を送付してもらう住所を書き間違えて不達になってしまったため、未だに見本誌が手元にありません😇 

初版持ってるんだけど違いはあるの?

いろいろ誤字やなんとも言えないサンプルコードなどを直しているので書籍としてのクオリティは上がってると思うのですが、内容的に大きく変わったところを簡単に書くとこんな感じです 

  • Ruby 1.9時代などに使われた旧時代の便利テクなどは控えめです
  • 初版で対応していたRuby 2.0以降(もちろん2.3, 2.4も)で追加されたメソッドなどにも可能な限り対応しています
  • 元々Sinatraを紹介していた章をtest-unitの章に置き換えました
  • capistranoには消えてもらいました*1

テストとsinatraにまつわるお気持ちの供養(ただのポエムです)

「パーフェクトRubyはテストがあればパーフェクトなのに」誰だってそー思う。俺だってそー思う。本当にそうだと思うのですが、実は初版の執筆時点ではテストの章はあったんですよね。

 15章のツールに対してRSpecでテストを書くというのをやっていたのですが、紙面の都合で泣く泣く削ってしまったのです。

また、当時はシリーズとしてパーフェクトRuby on Railsが無かったため、Rubyの書籍としてWebアプリに関する説明がほぼ無いのはどうなのだ、という懸念があってWebアプリの習作としてSinatraを採用しました。まぁここら辺は私の趣味なんですけどね。

という経緯から数年経ち、Ruby標準で付いてくるテスティングフレームワークも落ち着いた*2*3のもあり、Webアプリに関することはパRailsに任せれば良いかなというところで今回の構成になったのでした。 

電子書籍について

 gihyo.jpからのPDFなら今すぐ買えます!!!

gihyo.jp

Amazonでの販売についてはしばしお待ちください😅

 

*1:パーフェクトRubyの責務としてはいらんやろ的な

*2:

http://www.clear-code.com/blog/2014/11/6.html

*3:Rubyバンドルされている点も本書のテーマとして良い

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年近く触ってないので何もかも忘れました。