すがブロ

sugamasaoのhatenablogだよ

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 知らないというよりも、こういうことが体系立てた文章になっているっていうことが自分にとってはとても嬉しいし、とても価値のある本じゃあ〜〜〜という気持ちです。

ISUCON5の予選で爆散してきた

昨年に引き続きISUCONに参加しました

今年は id:koemu さんと id:ariarijp さんのチームでした。YAPCのタイミングだったかな?で id:koemu さんからISUCON一緒に出ましょう!と声をかけられたので、ホイホイとチームを結成しました。その後、YAPCの帰りに一緒に飲んでいた縁で知り合った ariarijp さんが一緒にチームを組んでくれることになってチームが結成された。

当日まで

あまり素振りとかできなかったのが悔やまれますが、まずは昨年参加した知見から、事前に作業方針のメモを共有しておいた。

例えば ssh の公開鍵を予めあつめておくとか、最初に手を付ける箇所の分類、チャットツールの準備などなど。

これは結果論だけど、チャットツールにSlackを選択していたのは、当日ISUCONの公式チャットツールidobataに障害が発生していて正常にアクセスできなかったので助かった。

当日

id:koemu 宅におじゃまして3人で顔を突き合わせて作業しました。当日やんごとなき事情で開始時間が1時間遅れたので、その間にトイレ行ったりして気持ちを高めていた。

〜13:00 ころまで

  • koemu さんが秘伝のタレやミドルウェアのバージョンアップなど
  • 自分はアプリのコードをgit化してデプロイできる環境を構築。その後、ベンチマークでDBをドロップしたりしないで毎回特定のID以降をクリーンアップしてる、というあたりを確認していた
  • ariarijp さんがER図やベンチマーク実行時のログからどのような動きをしているかを確認してくれた

この時点のベンチマークでは(ランキングが正しければ)暫定1位を取ってたのは穏やかではなかった。

f:id:seiunsky:20150928235142p:plain

この時の私の様子はこちらです

〜18:30 ころまで

ここらへんからどうもミドルウェアよりはアプリ(SQL)の問題らしいということが明確になってきて、各自問題のありそうな部分の確認、修正に着手していく。

この時、id:koemuの圧倒的コミットによって一瞬15000点くらい叩き出していて、暫定3位くらいにつける瞬間があった。

この時の私の様子はこちらです

ただ、ベンチマーク的には問題なかったけど画面上の出力結果に問題があったので、おそらく意図しない結果だろうと判断して、この結果はお蔵入りになった(この得点に自力で到達できれば予選通過できたのだけど、、、)。

また、並行してプロファイラを仕込んだりしてボトルネックの可視化を図っていった*1

sugamasao.hatenablog.com

N+1問題の解決やデータをmemcachedへ移す作業、追加のindexなどを見ていたけれど最後まで詰められず時間が来てしまった。

〜19:00

不要なログ出力のOFFなどを準備し、再起動してベンチマークが正しく動くかなどのチェックを始め、18:58くらいにギリギリ最終提出用のイメージをfixすることができた。

所感

前回のISUCONはどちらかというとミドルウェアを攻めていけた印象が強かったので、じっくりソフトウェアのチューニングを行うことにはならないだろう……などという先入観があり、プロファイラの導入など、アプリに手を入れるための施策が遅れてしまったのは大きな痛手だった(git化のついでくらいの勢いで導入すべきだった)。

あと、ローカルでアプリを動かせるような環境を作れればもうちょっと作業が効率化できたと思うのだけど*2、mysql2のビルドがうまくいかなくて諦めてしまった。ここはもうちょっと掘り下げるとか、MySQL2 0.3系を試すとか、そういう方向の手を打っていた方が良かったかもしれない。

もう一つ、今後やるならチャットツールにサーバ上のログなどの情報を手軽に通知できる仕組みを準備できると、作業時間のロスがなくて良いのかなと思った(とくに具体案はないけど、やってて手間だった)。

最後に

id:koemu さん宅におじゃまして一日作業させてくれてありがとうございました。あと、id:koemuさん、id:ariarijpさんともインフラもアプリのコードも書けて素晴らしいエンジニアで、マジ自分は空気だったのでもうちょっと頑張っていかないと厳しいとしか言えない。。。

本当に最後に

今年も自分の課題が見えた*3ので、ISUCONは本当に刺激になる良いイベントでした(めっちゃ疲れるけど!)。運営チームのみなさん、ありがとうございました👼

*1:ただ、このとき自分は大チョンボをしてしまって、うまく動かないと思って1時間くらい有効活用できなかった。標準出力にログが出ているのに気がついてなくて、WARNINGがでていたのでそれでうまくとれてないのかと勘違いしてしまった、、、

*2:とにかく掟破りの本番修正というか祈りながらデプロイするみたいになってたのはあんまり良くなかった

*3:去年と変わらず筋力が足りない!!!!!!!!!!!!!1