すでにお気づきの方もいるかもしれませんが、先日から、クリアコードで開発したフリーソフトウェアが入ったgitリポジトリの公開を始めました。
リポジトリ内にはgit用のコミットメール送信スクリプトを含むgit関連ユーティリティ集「git-utils」やCPUの使用率を表示するFirefoxアドオン「システムモニター」も含まれています。中には試し作りしただけのものなども含まれています。それぞれのソフトウェアはリポジトリ内に同梱されているライセンスにしたがって自由に利用できます*1。
クリアコードは既存のフリーソフトウェアプロジェクトの開発に参加するだけではなく、新たにフリーソフトウェアプロジェクトを立ち上げたりもしてきました。中にはプロジェクトを立ち上げるほどでもないような小さなソフトウェアもあり、それらのソフトウェアはこのようにひっそりと開発していたりします。これらはフリーソフトウェアなので、有用だと思うものがあったのなら、ソースコードにアクセスし、自由に利用してください。
もっと自由にソフトウェアを利用できる世界になるとよいですね。
*1 設定しているライセンスはGPL/LGPL/MPLあたりです。
みなさんはPassengerの管理下にあるRails/Rackプロセスをどのように監視しているでしょうか。
Muninを使った方法もあり、Dan Manges's Blog - Rails Application Visualization(gist: 20319 - munin plugin for passenger- GitHub)で公開されていたりします。このプラグインはpassenger-statusの結果をグラフ化しています。passenger-statusの結果はこんな感じになります。
----------- General information ----------- max = 6 count = 3 active = 0 inactive = 3 Waiting on global queue: 0 ----------- Domains ----------- /home/rurema/rurema-search: PID: 17128 Sessions: 0 Processed: 38 Uptime: 4m 54s PID: 30722 Sessions: 0 Processed: 543 Uptime: 1h 14m 32s
先述のプラグインではこのうち「General information」の情報だけをグラフ化しています。でも、「Domains」の情報もグラフ化したいですよね。「Processed」を見れば妙にたくさん処理しているプロセスを見つけることができるかもしれませんし、「Uptime」を見れば長生きしすぎているプロセスを見つけることができるかもしれません。
ということで、るりまサーチのリポジトリrackngaのリポジトリに「Domains」もグラフ化するMuninプラグインを入れておきました。
Debian GNU/Linux前提です。
まず、るりまサーチをcloneします。
% git clone git://github.com/kou/rurema-search.git
プラグインを/usr/share/munin/plugins/にコピーします。
% sudo cp rurema-search/munin/plugins/* /usr/share/munin/plugins/
プラグインをroot権限で動かすようにします。
/etc/munin/plugin-conf.d/passenger.conf:
[passenger_*] user root
プラグインをインストールします。autoconfに対応しているので、自動検出してくれます。
% sudo -H /usr/sbin/munin-node-configure --shell --remove-also | sudo sh
munin-nodeを再起動します。
% sudo /etc/init.d/munin-node restart
5分もすればグラフに反映されるでしょう。
Passenger用のMuninプラグインを紹介しました。
PassengerとMuninを使っている場合は導入してみてはいかがでしょうか。
Muninのプラグインを作るときなど、大きなサイズのログファイルを解析する必要がたまにありますよね。そんなとき、ファイルの先頭から処理をしていくとファイルサイズが増加するにしたがって処理時間も増えていってしまいます。Muninのプラグインの場合は最近5分間のデータだけあれば十分なので、ファイルの先頭からではなく、最後から処理する方が効率的です。最後から処理すると、ファイルサイズが大きくなっても処理時間にはほとんど影響がありません。
ということで、ファイルの最後から1行ずつ読み込む小さなRubyのクラスを作りました。groongaのリポジトリに入っているので、groongaと同じライセンスで利用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
class ReverseLineReader def initialize(io) @io = io @io.seek(0, IO::SEEK_END) @buffer = "" @data = "" end def each separator = $/ separator_length = separator.length while read_to_buffer loop do index = @buffer.rindex(separator, @buffer.length - 1 - separator_length) break if index.nil? or index.zero? last_line = @buffer.slice!((index + separator_length)..-1) yield(last_line) end end yield(@buffer) unless @buffer.empty? end private BYTES_PER_READ = 4096 def read position = @io.pos if position < BYTES_PER_READ bytes_per_read = position else bytes_per_read = BYTES_PER_READ end if bytes_per_read.zero? @data.replace("") else @io.seek(-bytes_per_read, IO::SEEK_CUR) @io.read(bytes_per_read, @data) @io.seek(-bytes_per_read, IO::SEEK_CUR) end @data end def read_to_buffer data = read if data.empty? false else @buffer.insert(0, data) true end end end |
以下のように使います。
1 2 3 4 5 6 |
File.open("/var/log/groonga/query.log", "r") do |file| ReverseLineReader.new(file).each do |line| break if no_more_need?(line) # ... end end |
ログファイルから直近のログだけを取り出して処理したいときなどに利用してみてはいかがでしょうか。
クリアコードは6月が期末なので今日が第4期の最終日になります。
今期になって初めて社員が増えました。2名増えたのでクリアコードは全員で7名になりました。
また、今期も前期と同様にいろいろなイベントに発表者として参加し(トップページにリストがあります)、これまで以上にたくさんの方とお話しすることができました。
業務でも継続してフリーソフトウェアの開発に関わってきました。いくつかはククログでも紹介してきました。
明日から第5期になります。これからもクリアコードをよろしくおねがいします。