ErgoDox EZ を買いました

買いました.初日です. まず,今日一日はデフォルトのキー配列で利用してみました.

初めてキーボードに触った時のような時の気持ちを取り戻した1日でした.

まず,良かったこととしては,入力姿勢はものすごく楽です. 健康によい感じがします,肩こりとおさらばできそうです.

次に,運指が矯正されます.いつも,適当に楽な指で入力していたのが,正しい指運びになります. あと,親指を活用できるのが良いですね.

次に,キツかった点.

ある程度わかっていたことですが,修飾キーの配置が全然違います. なので,キーボードショートカットを利用するときにいちいち立ち止まって考えなければならないのが辛いです.

あと,記号の位置も結構違います. コーディングの時,かなり戸惑います.

そして,指運びを普通のキーボードを使っている時と変える必要がありました. 割と厳密に,タッチタイピングのお作法に従って,運指することを強制される感じ.

だけど,このデメリットは,基本的には,慣れで改善する問題なので,しばらく利用していくうちに なんとかなるだろうと楽観してます.

何よりも,日常的にいつも行っている動作を見直す,という行為がとても面白いです. ほんとに初心者のようなタイピングしかできない状態に立ち返って,そこから,練習して段々慣れていくというのが面白い.

練習して,できないことができるようになるってのはどんなに小さいことでも面白いものです.

...,まぁこの記事は,MacBook Pro のキーボードで書いてるんですけどね. ErgoDox EZ ,会社においてきちゃったし,GW あけにはまた赤ちゃんのような状態に戻っているんだろうなぁ....

mruby-cli を頑張る

Hello World まで

mruby-cli を利用すると,LinuxOSX などでネィティブに動作するバイナリを作成できるらしいです.

puppet で Ruby で作成したコードを Gem を利用してデプロイしようとしたところ,ドハマリしたので,それならいっそのこと, こういったツールを使って,バイナリぽんおきで動くようにすると幸せかなぁと思ったのがきっかけです.

mruby にしたのは,ngx_mruby とか,ミドルウェアを操作する言語として mruby が採用される事例が多くなってきたのと, 社内で mruby が流行ってるからですね.

まずは,インストールと hello world から.

インストールは,https://github.com/hone/mruby-cli からバイナリを落としてきて, PATH が通った適当な場所に置くだけです.

> wget https://github.com/hone/mruby-cli/releases/download/v0.0.4/mruby-cli-0.0.4.tgz
> tar xzvf mruby-cli-0.0.4.tgz
> cp x86_64-apple-darwin14/mruby-cli ~/bin/

そして,

> mruby-cli --setup hello_world
> cd hello_world
> docker-compose run compile

ってやると,hello_world まではできます.

転職しました

むちゃくちゃ久しぶりな更新になりましたが、9月7日に転職しました。 1週間程度を、現職で過ごしてみて、感想を少しまとめてみようかと思います。

これから先も、現職で働き始めた驚きを忘れないようにするために。

1週間を過ごしてみて

まず、入社してみて一番に感じたことは孤立しないようにフォローしてくれてるなってことです。 例えば、いろんな人とランチに連れてってくれたりとか。

それだけじゃなくて、入社時のフォローもすごく手厚かった。 割と早い段階で仕事上で、必要なツールや情報へのアクセスは整えられていった感じです。 前職もその前も、割と手探りで、この辺り頑張って行った感じだったので良さがありました。

人と環境については、こんな感じです。

技術的な面だと、インフラをコードとして管理するってのが徹底されている感じしました。 いわゆる「infrastructure as code」を徹底している感じで、運用をPuppetのコードベースで行っています。

前職では、Chefを利用していたんですが、これは、プロビジョニングツールとしてしか利用していませんでした。 運用は、手順書ベースで行っていました。

前職で、一度、Chefベースで構築から運用までやろうとして挫折しているんで、若干悔しい感じがしますが、 現職では、理想に近い形で「infrastructure as code」ができているんじゃないかなと思います。

あとは、現職だと、情報をGHEに集約しているんですが、これも良いですね。 前職では、情報が複数ツールに分散していたんで、いろいろ大変でした。

まとめ

書こうと思えば、まだ、たくさんかけるんですが、とりあえずこんな感じで。 まだまだ、働き始めて2週間程度なので、これからいろいろな驚きに出会っていくんだと思います。 次はひと月後ぐらいに、また、印象をまとめてみようかと思います。

Graphiteを利用して構築したMetrics収集システムについて

Graphiteを利用した監視システム

  • Graphiteシステムについて
  • GraphiteへのMetricsの送信
  • Graphiteのクラスターについて
    • Graphiteの冗長性の担保
    • Graphiteのスケーラビリティ

前回のブログで、だいぶ前になっちゃったけど、CactiをやめてGraphiteを使おうよ、と書きました。 今回は、僕の会社で、実際にCactiからGraphiteへ移行するプロジェクトを進めてみての知見についてまとめます。 ちな、現在進行形で置き換えを頑張ってます、手が遅いので…

Graphiteシステムについて

前にも書いたと思いますが、Graphiteとは単一のApplicationではありません。 幾つかのApplicationが組み合わさって構成されるシステムです。 下記のソフトウェアを組み合わせて使います。

  • graphite-web

    • Grapheを作るところ
  • carbon-cache

    • Metricsを受信し、whisperと呼ばれるRRDと似た仕組みでtime serise dataを格納する
  • carbon-relay

    • 受信したMetricsを特定のルールに従って、carbon-cacheへ分配する
  • carbon-aggregator

    • Metricsに対して処理を行う

これらを適当に組み合わせて、Metricsを収集し、グラフ化するシステムを構築していきます。 最低限、

- graphite-web
- carbon-cache

は必要ですね。

GraphiteへのMetricsの送信

前述したシステムには、Metricsを送信するApplicationがありませんでした。 Cactiのようなシステムを作成するには、サーバーの情報を取得し、carbon-cacheへ送信する仕組みがなければなりません。

このような、ApplicationはGraphiteシステムには存在していません。 Graphite(carbon-cache)に対応している、任意のApplicationを用います。 私は「collectd」というApplicationを使用しています。

collectd

ここで、Graphiteシステムからは外れますが、「collectd」について紹介しておきましょう。 collectdはC言語で実装された、軽量な、Metrics収集、送信システムです。 Pluginにより、様々な拡張が可能であり、自由度も高いです。

私は、collectdにcarbon-cacheへMetricsを送信するPluginを組み込んで使用しています。

Graphiteのクラスターについて

Graphiteは単純なクラスター構成を組むことができます。 負荷分散目的のクラスターと、冗長化目的のレプリケーションという種類があります。

...ここまで書いてめんどくさくなったので、詳細はそのうち書きます。

Cactiを捨ててGraphiteを使うべき理由

導入がひと通り完了したので、Graphiteについて情報を出していくよ。 最初は、Graphiteって一体なんなのか、についてまとめる。

Graphiteって

Graphiteってのは、一言で表すと「収集した情報をグラフにするソフトウェア郡」のことだ。 Graphiteは下記のソフトウェアから構成される。

1. graphite-web
2. carbon

graphite-web

graphite-webとは、実際にグラフを表示する部分だ。 正直、UIの出来はあまり良くない。 こいつの一番の売りは、APIを利用してグラフの見た目をカスタマイズしたり、統計処理をかけられるところにある。 下記に、APIをまとめたページが有る。英語であるが、何となくわかると思う。

このAPIを利用すれば、要件にあったグラフを作ることが簡単にできる。 また、画像としてデータを取り出すだけでなく、json、csv等といった形式でも取り出せるので、javascriptに食わせて かっこいいグラフを書くなんてこともできる。

まぁ、バグも多いけど。 インストールはこのブログの前の記事を見れば問題無いと思う。

carbon

graphiteはrrdを使用しない。 代わりに独自のwhisperと呼ばれる形式でMetricsを集積する。 rrdと比べた際のwhisperのメリットは主に下記の3つ。

  • RRDは最新の更新の前にタイムスロットをアップデートすることができない
  • RRDはイレギュラーなアップデートが出来るように設計されていない
  • 遅滞なく更新が書き込まれる

パフォーマンス

carbonは割りと大量のMetricsを処理することができて、僕は30000を超えるMetricsを30秒から300秒間隔でためているけど、 今のところ問題はない。

Carbonができないこと

ところで、carbonはMetricsを受けるだけで、送信することはできない。 carbonにMetricsを集めさせたければ、対応したMetrics収集ソフトウェアを利用するか、自前で実装するしかない。 だけど、対応している収集ソフトウェアはいろいろあるので、心配しなくて大丈夫。 自分で実装するにしても、パケットフォーマットは単純だし、そこをカバーしてくれるソフトウェアもある。

僕は自前で実装することはせずに

- collectd

というソフトウェアを利用した。 自前で実装するなら、statdと呼ばれるソフトウェアを利用したと思う。

graphiteって何が良いのさ

周辺ソフトウェアの充実に尽きると思う。 graphiteとその周辺のソフトウェアを活用すれば、色々できる。 そして、それなりに動く。

今、僕はGraphiteをCPUの利用率とかそういったMetricsの収集に使っているんだけれども、この分野で、 それなりに動いて、カスタマイズもいっぱい出来て、ていうのを探しているのなら、Graphiteは選択肢に入れても良いと思う。

日本語の情報は殆ど無いけど…。

graphiteのインストール

何回かに分けてgraphiteについて書いていく。 まず、インストール方法について、日本語でまとまっているページがないので、 まとめておく。

graphiteって何が良いのさ、ってことについては、次くらいに書くよ。

インストール

全部、pipでインストールして問題ないよ。 だけど、graphite-webに依存する各種ライブラリのインストールには注意が必要。

graphite-web

いくつか気をつけなければならないことがあるよ。 下記の通りでうまくいく。

django

1.4.3を使ったほうが幸せになれる

    pip install Django==1.4.3

django-taggingは0.3.1を使ったほうが幸せになれる。

    pip install django-tagging==0.3.1

ここまでは、versionに気をつけるぐらいで、特に問題なく行く。

mysql-python

graphite-webはmysqlを必要とする。ライブラリのインストールはpipで簡単。

    pip install mysql-python

で、migrationをしなきゃならないんだけど、djangoを使ったことのない人は少し困ると思う。 下記のコマンドでうまくいく。db周りの設定はlocal_settings.pyに書くよ。

    python manage.py syncdb

ここまで設定すると、下記のコマンドで、graphite-webを起動することができる。

   ./run-graphite-devel-server.py --port 8080 /opt/graphite 

だけど、画像が作成されないと思う。 もう1つだけ、依存するライブラリのインストールが必要で、下記になる。

py2cairo

こいつは依存関係が複雑で、大変。 こいつはcairoに依存するので、cairoをインストールする。

cairo

cairoはpixmanに依存する。絶望の始まり。

pixman

pixmanはconfigure;make;make installで/usr/local/以下に入る。

cairo

pixmanのインストールは簡単だったよね。 ここで、一個、気をつけなきゃいけないことがある。/usr/local/以下はpkg_config_pathが通っていないってこと。 そのため、cairoをconfigureしようとしても、pixmanを見つけてくれない。 ので、通す。

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

あとは、configure;make;make install。と思ったんだけど、ダメ。

     configure --enable-gobject=no 

って感じで、gobjectを無効にするとうまくいく。

py2cairo

やっと、py2cairoだ。 複数のpythonを使っている場合、環境変数pythonを指定する必要がある。

    export PYTHON=/usr/bin/python2.7

後は、/etc/ld.so.confに/usr/local/libを追記して、

    ./waf configure --prefix=/usr
    ./waf build
    ./waf install

下記のコマンドでversionが表示されればうまく行ってる。終わり。

    python2.7 -c 'import cairo; print cairo.version'