ChefでMacを開発マシンとしてセットアップ

boxen, pivotal worktationなど最近Macを開発環境として自動でセットアップするためのツールが幾つかでてきています。

このような実装を幾つか見てみましたが、各会社用に特化しているので個人では少し使いづらいため、chefの既存のレシピを使って個人用の環境をセットアップできるようにしてみました。dotfilesと同じで、個人用の開発環境のセットアップ方法をバージョン管理しながら、少しずつ育てていこうかなと思ってます。

https://github.com/dann/chef-macbox

Mac用に使うChefのレシピとしては、hombrew, mac_os_x, dmgのレシピを使っています。
これらのレシピを使って、次のことをやっています。

  • 必要なアプリをdmgでインストール
  • homebrewレシピで必要なパッケージでインストール
  • mac_os_xレシピでMacの設定を変更
  • dotfilesをgithubから取得してセットアップ

設定そのものは完全に個人に依存しているので、他の人が使えるように作ってはいませんが、少し手をいれれば、汎用の開発者用としても使えます。

macbookがリニューアルされるとつい買ってしまったりと、個人でもMacはセットアップする回数が多いと思うので、Chefで個人用開発環境を育ててみると良いんじゃないかと思います。

Happy hacking!

Plack::Middleware::Profiler::KYTProfでプロファイリング

Devel::KYTProfでプロファイリングするのも、ミドルウェアになっていると使いやすいかもしれないということで作ってみました。
https://github.com/dann/p5-plack-middleware-profiler-kytprof

What is KYTProf?

onishiさんのDevel::KYTProfは、ネットワークI/O系やDBアクセスなどの、いわゆる重い処理に対してモンキーパッチをあてて、性能を測るということをするモジュールです。I/O系にフォーカスしているところが用途が明確でいいですね。Perl界隈でよく使われるモジュールに対してモンキーパッチをあてているので、useするだけで空気を読んで性能を測ってくれます。LLらしい面白いアプローチのモジュールです。

Plack::Middleware::Profiler::KYTProfの使いどころ

Ganglia, CloudForecast, Zabbixなどのリソースモニタリングツールを使うことで、I/O系の問題があることはすぐにわかります。しかし、I/Oの問題であることがわかっても、アプリケーションのどの箇所でおきているかを特定するのは、アプリの作りにも依存するところで、コードの理解無くして特定することは難しいこともあります。

そういった場合に、このミドルゥエアを使うことになります。使うことで、コードの変更すること無く、SQL、テンプレート、エンドポイントへの通信などを特定することが可能になります。

基本的な性能問題の8-9割は、I/O絡みで発生することが殆どなので、その点で実用的といえるかもしれません。

使い方

基本的な使い方は、以下の通りです。ウェブアプリ用のミドルということで、Template Engineもプロファイリング対象に加えています。

builder {                                                                                                                              
    enable "Plack::Middleware::Profiler::KYTProf";                                                                                     
    $app; 
}; 


負荷テスト環境や独自のアプリでも使えるようにするために、サンプリングしたいケースや、何をプロファイリング対象にしたいかなどを切り替えられるようにもしてあります。examplesにサンプルをいれてあるので、使ってみてください。

Enjoy!

#NYTProfのようなマイクロチューニングをするためのモジュールは、使う人が*モジュールの作者など)かなり限定的になるかなとは思うんですが、こういったI/O系は性能のオーダーはまるで違うので、使いどころは結構ありそうです。

Plack::Middleware::Profiler::NYTProfでプロファイリング

PlackアプリをプロファイリングするモジュールPlack::Middleware::Profiler::NYTProfを更新しました。
https://github.com/dann/p5-plack-middleware-profiler-nytprof

bayashiさんにパッチをもらって、負荷テスト環境などでも使えるようになりました。ある一定の負荷がかかった環境でしか性能問題がおきないといったケースはよくあるので、負荷テスト環境で、少し負荷をかけた状態で詳細なプロファイリングをしたい場合などに使ってみてください。

プロファリングのオーバーヘッドと負荷を減らすために、サンプリング、プロファイリング対象の限定、レポート機能のoffの3点の機能を追加しています。

サンプリング

全部のプロセスに負荷をかけるのではなく、対象をenable_profileというcallbackで、条件によってプロファイリングを有効にすることができます。特定のプロセスや何回かに1回プロファイリングするなどでサンプリングしながら、プロファイリングするのがおすすめです。

プロファイリング対象の限定

NYTProfは、PerlVMをhookして測定しているので、オーバーヘッドが他のプロファイラより小さくなっています。
ただ、それでもプロファイリングするレベルがstatementレベルなどと小さいとオーバーヘッドは大きくなってしまいます。
そこで、以下のDevel::NYTProfの文書に書いてあるように、プロダクション環境ではプロファイル対象を限定するのがおすすめです。

http://search.cpan.org/~timb/Devel-NYTProf/lib/Devel/NYTProf.pm#MAKING_NYTPROF_FASTER

これは、env_nytprofにblocks=0, slowops=0などを追加することで実現します。

HTMLレポートの出力をしない

これは単純に元々が開発環境用を目的に作られた機能なので、デフォルトがオンになっているのをオフにできる機能を用意したというだけのことです。負荷テスト環境では、HTMLレポートをそのまま生成するのではなく、NYTProfのプロファイリング結果だけを出力して、後でみられるようにすればよく、HTMLレポートはoffにしておかないといけません。
これは、enable_reporting optionを0に設定することで実現します。

設定のサンプル

まとめると、例えば以下のような設定で使います。

use Mojolicious::Lite;
use Plack::Builder;

get '/' => 'index';

builder {
  enable "Profiler::NYTProf",
    env_nytprof          => 'start=no:addpid=0:blocks=0:slowops=0:file=/tmp/nytprof.out',
    profiling_result_dir => sub { '/tmp' },
    enable_reporting     => 0,
    enable_profile       => sub { $$ % 2 == 0 }
    ;
 
  app->start;
};

__DATA__

@@ index.html.ep
<html><body>Hello World</body></html>

Enjoy!

#元々は開発環境で使うことを想定して、Plack Hackathonhttp://dann.g.hatena.ne.jp/dann/20091129/p1)で3年前につくったものですが、こうしてまた使われるというのも嬉しいものです。bayashiさん、ありがとうございました!

Devel::Cover::Report::VimででC0なカバレッジのコードを vim で表示

secondlifeさんのsimplecov-vimのエントリ見ていいなと思ってたんですが、perlでもDevel::Coverのreportとして実装されてました!
http://subtech.g.hatena.ne.jp/secondlife/20120312/1331528672

cover -report vim

でreport(cover_db/coverage.vim)を生成してから、vim

:so cover_db/coverage.vim

を実行すると、以下のようにC0なコードがvim上で表示できます。エディタ上で気軽にカバレッジがみれるのはいいですね。

coverage.vimをみた感じだと、ちょっとした修正で、rubyperlに限らず色々と応用できそうなので、今後他の言語でも使っていきたいところです。

Software Engineerにお勧めの技術書

人に聞かれることも増えてきた昨今ですが、お勧めする本は毎年そう変わりはしないのでまとめてみました。言語に依存する本は、書き出すと多くなってしまうので除いてます。

コンピュータサイエンス関連のおすすめ本

Computer Architecture

大規模なシステムを組む場合、高い性能を要求される場合、省リソースが求められるケースなどは、特に低レイヤへの理解の必要性を実感することになります。
下のレイヤを深く理解しておかなければ、このようなシステムのアーキテクチャデザインやトラブルシューティングは実質できません。

/高性能コンピュータ技術の基礎

    • 最新のプロセッサのアーキテクチャがどのようになっているのかを丁寧に解説しており、最近のプロセッサの全体像を把握するのに役立ちます。
OS/Linux Kernel
Algorithm/Data Structure

設計関連のおすすめ本

Software Architecture

と合わせて読みたい。Architectureという分類に入れるべきかは微妙なところもありますが...

Software Architectureを考える上で、Computer ArchitectureやArchitecture Patternだけではないというのは、企業で物作りをしている方は感じることがあると思います。以下の本は、Software Architectureをどのような視点で評価するのかということに対して、大局観を与えてくれるものです。

Design Pattern

GoFのパターン本以外にも読んでおくべきパターン本はあり、特にConcurrencyに関連する以下の本はおすすめです。

/ 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
/ Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

Testabilityの高いDesignをするための本

Robert C MartinシリーズとMartin Fowlerシリーズを読んでおくのがおすすめです。

, 実装パターン

OOA/D
Developer Testing
System Design (Scalability)

Scalabilityという切り口でまとめるのがよいか微妙なところもありますが、Web系システムのScalabilityに関しては、
以下の本がおすすめです。

Webシステムのデザインであれば、上記の本を読むのでも十分得られることはあると思います。
この分野は類書は数多くありますが、幾つか上記の本を読んだら、分散システム, OS, Database関連の本やHPCの分野の論文などを良く読んだほうがよいです。

DB Design

データベースは、システム開発をする上では避けて通ることのできない分野です。DBはOSとStorageに強く依存しているため、DBのArchitectureだけでなく、ストレージ/OSのアーキテクチャも良く理解しておく必要があります。

データモデリングは、OOA/D と同じくかなり癖のある分野で、これがベストであるといいきれる本はないのですが、以下の本は総じておすすめではないかと思います。ある程度読んだら、キーとなるドメインの知識獲得のほうを大事にしたほうがよいです。

/達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

      • セルコさんのSQL本。ミックさんの本も系統は似ていて、DBアーキテクチャというよりも、「SQL」を学ぶための本。Webシステム系の人というよりも業務よりの人の方が向いているかもしれません。
  • その他
    • データベース・リファクタリング
      • 若干粒度が細かいといえば細かいのですが、類書はなく一回読んでおいて損はないです。DBエンジニアの人にとっては当たり前なことも多いかもしれないんですが、AP開発者の人がDB設計を改善する際には役に立つと思います。
System Administration

以下の本は、純粋な運用に関する話ではなく、死活監視、測定、配備といった最近のDevOpsに求められる分野を網羅的にまとめている良書です。DevOpsの人だけでなく、AP開発者の人もAPを作る上で運用が可能なアプリケーションとはどのようなものなのかを意識するのにも役立つのではないかと思います。運用も含めた全体のシステムデザインが、昨今の大規模なクラスタではとても重要です。特に、クラウドインフラが増えていき少数のエンジニアがその上でアプリケーションを開発するようになっていく時代には、AP開発者であってもインフラの基礎知識を持っておくことが今後より重要になっていくでしょう。

Software Engineering系のおすすめ本

Agile

Agileの本は色々でていますが、基本的にはMike CohnとJames O. Coplienの本を読んでおけば大体間違いないです。
僕の場合は、Scrumをベースにした開発プロセスで大体のプロジェクトは進めています。

人間系
  • ワインバーグの本一式。
    • 人への深い洞察は、今読んでも得られるものが多いです。デマルコの本などもよいですが、ワインバーグシリーズが個人的には好きです。

# Amazonへのリンクが欲しいというコメントがありましたので、リンクを追加しておきました。和書が出ているものは、和書のほうにリンクを張りました。