Jenkinsでプロジェクトの状況をウォッチする

Jenkinsでプロジェクトの状況をウォッチするために、RedmineMetricsPluginと言うものを作りました。
(twitter上では自分自身RedmineTicketMetricsPluginと読んでいたり、ちょっと名前が揺れてます)

背景

システムの開発現場では「プロジェクトのタスクがどのように推移していて、どのようなフローで消化される傾向にあるか。今どれぐらいのタスクが残っているのか、それらのチケットのステータスはどうなっているか」が知りたい場面が多いです。
特にリリース直前のリリース判定会などでは「今、残不具合はN件でM日で修正できる予定です」という報告をもらっても「M日で修正できるならリリースに間に合う」という判断を行うには材料が足りません。
「不具合は今日までにどのような勢いで発生しているのか、日々不具合が報告されているのか、既に報告される数は落ち着いているのか」が分からないと、現在のチケット数だけでは正しい判断ができないのです。(それが分かったから正しい判断ができるかというとそういう訳でもないのですが。)

で、なぜJenkinsのプラグインになったかというとアイデア元は「Jenkinsをメトリクス収集ツールとして使うアイデア」です。
http://forza.cocolog-nifty.com/blog/2012/04/jenkins-d895.html

JenkinsはSVNMercurial・GitのようなSCMリポジトリをインプットにするが、RedmineTracのようなITSのDBもインプットに入れれば、ITSのDBからデータをロードしてバッチ処理を行うことも可能のはずだ。
ITSのチケット集計機能はリアルタイムな集計しかできないけれども、そのようなアイデアを実現出来れば、バッチ処理を行う集計結果も可能になる。

ITSの機能でチケット数の推移やそのOpen/Closeの割合まではグラフ化することができるものもありますが、チケットのステータスの推移を見るにはバッチ的に集計する必要があるので、高機能なCronであるJenkinsの方がいいということです。

使い方

まだ本プラグインはJenkinsの公式プラグインとして申請していないので http://tombo.in/jenkins/redmine-metrics-plugin.hpi からプラグインをダウンロードします。

Jenkinsのメニューから Jenkinsの管理 > プラグインの管理 > 高度な設定 > プラグインのアップロード からダウンロードしたプラグインをアップロードし、Jenkinsを再起動します。再起動後、Jobの設定画面を見るとビルド後の処理の追加に「Redmineのメトリクスを集計する」という項目が追加されます。

ここで「Redmineのメトリクスを集計する」という項目を追加するとRedmineのURL、APIキー、プロジェクト名、バージョン名が聞かれるので、それぞれ入力します。

複数のバージョンのメトリクスを合わせて修正したい場合はカンマ区切りで入力します。「8月リリース新規機能,8月リリース不具合修正」などのように機能追加と不具合修正を別バージョンで管理している場合などに使うと便利でしょう。

設定が完了しビルドを実行すると、プロジェクトのページに以下のようにチケットのステータスの推移が分かるグラフが表示されるようになります。

実際にこのグラフがプロジェクトの助けになるのかどうかはまだ分からないですが、これからしばらく運用して有用性を確認しようと思います。

今後の展望

  • できればJenkinsの公式に入れてもらいたいと思うのですが、フローがよく分からないのでしばらくはここで野良プラグインとして提供します。
  • Redmine に特化する必要もないので Trac, Github, bitbucket などに対応して TicketMetricsPlugin として衣替えするのもおもしろいかなと考えています。

リポジトリ

https://github.com/mitoma/redmine-metrics-plugin

不具合情報
Ubuntuなど特定のLinux環境ではグラフの文字が□□□などとなってしまう(豆腐化してしまう)場合があります。
フォントが無いのが原因のようなので、以下のように追加してJenkinsを再起動すれば改善すると思います。

sudo apt-get install ttf-vlgothic

GitHubにアップされてるコードをPDFに書き出す簡単な方法

皆さん、通勤時間中にコードリーディングしたいなって思ったことありますよね?
けど、スマホgithubのサイトアクセスしてみるのはいまいちだし、
がんばって別のファイルを見ようとしたときに限ってトンネル入って通信できない…。

リポジトリのコードなんてほとんどテキストファイルなんだから、
PDFとかに変換できたらいいのにって思いますよね。

と、言うわけで @github2pdf という簡単な twitter bot を作りました。

例えば wayneeseguin さんの rvm をPDF化したい時は

@github2pdf wayneeseguin/rvm

とつぶやいてみましょう。

@github2pdf から accepted と返事がきます。

@your_account wayneeseguin/rvm is accepted.

そしてしばらく待ってるとリポジトリの内容が書き出されたPDFファイルへのリンクを教えてくれます!

@your_account wayneeseguin/rvm is hear http://t.co/wJM43jr9

ソースはこちら https://github.com/mitoma/github2pdf

ブラウザの操作を自動化するためのWebサービス、Jungpooをリリースしました。

昨日5月5日に、ブラウザの操作を自動化するためのWebサービス、Jungpooをリリースしましたのでサービスの簡単な紹介をしたいと思います。
いやー、GWを利用してなんとか開発・リリースにこぎつけることができました。

Jungpooについて

Jungpooというサービスなんですが、どんなサービスかというと「ブラウザの操作を自動化するためのWebサービスとなっております。
サービスURL→https://jungpoo.com/

「え?それってどういうこと?SeleniumとかWebDriverみたいなの?」
と思った方、正解です。
JungpooはSeleniumやWebDriverで作るようなテストケースをWeb上で作成することができ、そのままJavaアプレットで実行することができるサービスです。

現在、Seleniumなどでのブラウザを使った自動テストの実行にはいくつかの方法があります。
そのうち人気のあるのはいかの二つの方法でしょうか。

  1. FireFoxのアドオンであるSeleniumIDEを使ってテストケースを作成・実行する
  2. xUnitでWebDriverを使ったテストを書く

それぞれのメリット・デメリットを書き出すと以下のようになると思います。

  • SeleniumIDE
    • メリット
      • テストケースが作りやすい
      • テストケースをxUnit系のケースに書き出せる
      • 開発者じゃなくても作成しやすい
    • デメリット
      • 複雑なテストを書くときは面倒
      • 定期的な実行が行えない
      • FireFox限定
  • xUnit
    • メリット
      • 基本プログラムをゴリゴリ書くので何でもできる
      • CIに乗せて定期実行を自動化できる
    • デメリット
      • 基本プログラマじゃないとケースを作るのが難しい
      • 実行環境を準備するのが大変

では、Jungpooのメリット・デメリットを洗い出すとどのようになるでしょう?

  • Jungpoo
    • メリット
      • テストケースをWeb上で作成することで、第三者と共有しやすい
      • テストの実行環境の準備やアドオンをインストールする手間が少ない(アプレットが実行できるブラウザがあればよい)
      • テスト実行時に自動化が難しいところはユーザに操作させるよう促すダイアログを出すような機能があり、完全自動化できないケースも部分的に自動化できる。
    • デメリット
      • SeleniumIDEほど簡単にはテストケースを作れない
      • xUnitほど複雑なテストケースを作れない
      • テストケースをクラウド上に預けるとか…、ないわ…。

ちょっと、最後のケースは悩ましい問題ですがJungpooではユーザー名やパスワードなどセンシティブな情報はテストケースに残さず、実行時に直接入力する事もできるのでそこまでリスクは大きくならないかもしれません。

基本的にはJungpooは開発中のシステムのテスト目的で使われることが多いと思いますが、ほかにもいろいろな応用ができます。

  • 使い勝手の悪いWebシステムを使わされているが、Jungpooを使って効率化。
  • サイト巡回&キャプチャリングの自動化。
  • Webシステム、サイトの操作の仕方をみんなと共有する。

Jungpooでは今後の展望としては以下のような機能強化について検討中です。

  1. 英語ロケールの準備
  2. テストケースのグループ共有
  3. IE,Chromeの対応
  4. Mac, Linuxの対応
  5. 複数ブラウザの同時操作対応
  6. 操作できるアクションの増強
  7. iPhone, Android対応

Jungpooはまだ始まったばかりのサービスで機能も全然追いついていませんが、ありそうでなかった面白いサービスだと自負しておりますので是非一度お試しください。

データベース技術[実践]入門 第二章

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

インデックスで高速アクセスを実現する

この章ではデータ検索をするためにどのような手法が考えられるか。その手法のひとつであるB+TreeのRDBMSに合わせた最適化内容などが述べられている。

データ検索のためには以下のような手法がある。メリット・デメリットは本を読んで自分で考えたものなので違っているかもしれない。

  1. 線形探索を行う
    • メリット
      • 単純
    • デメリット
      • O(N)
  2. データ全体を固定長として扱う
    • メリット
      • O(1)
    • デメリット
      • 空間効率が悪い
      • 拡張性に欠ける
  3. インデックス構造を導入する(ハッシュ)
    • メリット
      • O(1)
    • デメリット
      • 範囲検索・ソートが行えない
  4. インデックス構造を導入する(B+Tree)
    • メリット
      • O(logmN)
      • 範囲検索(前方一致)・ソートが行える
    • デメリット
      • ハッシュよりもコストが大きい

また、RDBMSではB+Treeのような手法に以下のような課題に対してそれぞれ最適化を行っている。

  1. 一意性の保障
    • 一般的にRDBMSでは一意性の保障にインデックスを活用することによって実現している。
  2. マルチカラムインデックス
    • 複数のデータ項目に対するインデックスのことをマルチカラムインデックスと呼び、AND条件での検索に対して有効であるということ。(AND検索に対してのみ有効というのは覚えておいたほうがいいと思った)
  3. インデックスだけを読む検索
    • ある条件に合致するデータの件数を求めるクエリの場合、実際のデータの内容を読みに行く必要はないのでインデックスだけで結果を返すということ。
  4. インデックスマージ
    • 複数の項目の検索を行うときはそれぞれの項目のインデックスの検索結果をマージするということ。

実データに加えてインデックスを用意するということは、当然データの変更時にはインデックスの更新コストも増加する。
それに対してRDBMSは「ディスクへのまとめ書き」「並列更新性能の向上」などの対策を実施している。

データベースたるものデータの永続化はかなり重要なテーマで、永続化の実現というのはとりもなおさずディスクへのデータの書き込みであるため。なのでディスクの特性にあわせた最適化が非常に重要だということがここまで読んだだけでもわかった。(気がする)

データベース技術[実践]入門 第一章

Webエンジニアのための データベース技術[実践]入門 (Software Design plus)

データベース技術[実践]入門を読み始めたので、放置されてたこのブログにメモを残していくことにする。

第一章 データベースがないと何が困るのか

データベース技術がいかに重要か、データベースはどのような問題を解決するのかという事をメインに述べられている。
若い技術者でデータベースに詳しい人は少ないと感じると書かれている。これは僕もそうだなぁと思う。自分自身も学生のころはデータベースなぜ必要になるのか?というところがうまく理解できていなかった。業務的なデータに触れる機会が少なかったりそういうデータの扱いに魅力を感じていなかったのが大きいと思う。

データベースを利用する理由は以下の4つに対して高い性能を得ることができるからとの事。

  1. 検索性
  2. 耐障害性
  3. 並列性
  4. 整合性

このあたりはなんとなくで知っているけど、この4つを解決するためにあるんだと自分の中で考えがまとまっていると使うときの考えのブレがなくていいと思う。「みとまさん、このデータなんでファイルじゃなくてデータベースでストアするんすか?ファイルでいいじゃないすか?」って言われたときに「バーロー、なんかDBのほうがかっこいいし便利だからだよ」って言わずに、「それはね、ファイルに比べてデータベースのほうが検索性・耐障害性・並列性・整合性に優れていて、このデータの性質的にはデータベースにストアするほうが適切なんだよ」と答えられるほうがいい。

githubはじめました。delayed_job を fork しました。

最近 fork をしたいと思ったり、ソースをみたいプロジェクトがかなりの確率で github という事が多かったので、一念発起して github にアカウントを作りました。

http://github.com/mitoma/

そんで手始めに delayed_job を fork してみました。
https://github.com/mitoma/delayed_job/tree/v2.0

delayed_job ってのは ruby (主にrails)で非同期処理を実行するのに便利なプラグインなのだけど、ちょっと不便なところがあります。
例えば非同期処理を行いたいジョブがインポート、エクスポート、メール送信とか複数種類あった場合、普通に実装してくと全部の非同期処理を1種類のワーカーが実行してしまいます。そうすると、メール送信とか非同期処理であってもなるべく早いタイミングで処理してほしいジョブがインポートやエクスポートなどの時間のかかる処理によってブロックされ、ユーザの待ち時間に大きな影響を与えてしまいかねません。

今の delayed_job の場合、それぞれのジョブのワーカーを分けようとすると、プライオリティを工夫し、例えばメール送信はプライオリティは20、その他は0などとプロジェクトで決めごとをし、以下のようにワーカーを分けて立ち上げる事になります。

./script/delayed_job --min-priority 20 --max-priority 20 start
./script/delayed_job --min-priority 0 --max-priority 0 start

で、ワーカーを複数立ち上げる事自体は異論は無いのですが、プライオリティを本来の意味で使っていないのが気持ち悪い。と言うわけで、ジョブグループの概念を delayed_job に付け足して、以下のようにジョブグループ毎にワーカーを立ち上げることができるように修正しました。

./script/delayed_job --job-group mail start
./script/delayed_job start

これでプライオリティでワーカーを分割するよりも少しマシになりました。ヤッホー。

と、ここまで修正したものの、実は業務で使う予定はまったくありません。

こういうオープンソースのプロダクトを使う会社って、「せっかくオープンソースなんだから手を入れてナンボ!」って思っている会社もあれば「世界の優秀なプログラマーが作ったものだから中途半端に手を入れず、いつでもバージョンアップに追従できるようにしておく」って考えの会社もあります。
自分はどちらかというと前者の発想になってしまいがちなのですが、どちらかというと後者の思想を持った会社に在籍しているので、そうすると「世界の優秀なプログラマーに提案をして、本家に取り入れてもらう」というのがちょっと回りくどいようでもベストウェイなのかなぁと思います。

次の難関はどうやって英語で本家に pull request を投げるかです。

ポケモンタイピングを買いました。

最近ずっと気になってた、ポケモンタイピング
タイピングゲームについては特に興味はなかったんですが、一緒についてくる無線キーボードがどんなものか気になってしかたがなかったので買ってしまいました。
ちなみに、かなり人気があるのか大阪のヨドバシカメラでは2回ほど見に行ったのですが毎度売り切れでした。京都のヨドバシカメラではたくさんありましたが。

バトル&ゲット ポケモンタイピングDS (シロ)

バトル&ゲット ポケモンタイピングDS (シロ)

で、ゲーム自体は簡単に2時間ほどでクリアしてしまったので早速パソコンに繋いで試してみたのでその感想を簡単に。


まずは良いところから


コンパクト
まず、小さい。ThinkPad X200 と比べると横幅が2cmぐらい小さめ。ちょっと普通のサイズになれていると窮屈かな?と思わなくもないですが、それほど打ちにくいわけでもないです。
日本語配列
これは、人によっては良くないところだと感じる人もいるかもしれませんが、僕は日本語配列派なので特に気にならずに使えて便利です。
実はファンクションキーも使える
キーボードにはかかれてはいないんですが、Fnキー+数字の1から0までを押すと、F1〜F10までのキーになります。Alt+F2みたいなファンクションキーと他のキーを組み合わせたキーボードショートカットなどもAlt+Fn+2という風に押せば何とか入力できました。
静か
ThinkPad X200 と比べても打鍵音が結構静かです。これは子供向けのキーボードだから騒がしくならないようにわざわざ静音にしてくれたのでしょうか?


次に悪いところ


F11,F12は使えない
F1〜F10までが使えだけでもうれしいんだから贅沢だというのは分かるんですが、それでも0の隣にキーが3つも余ってるんだからF11,F12も使えるようにしてくれても良かったんじゃないかなぁと思います。
打ち心地はそんなに良くない
これは仕方がないですね。そういうところを追い求めた製品でもないので。ペコペコ。
けど、打ってて気分が悪くなってくるようなタッチでもないので、スペースとか手軽さのメリットを考えたらありかな。
変換・無変換キーがない
これは人によっては逆にメリットになるところですね。僕は別のキーに割り当てて使ってたので、なくなると少し困るんですが、まぁ、しかたがない。


と、いうわけでいいですよ。ポケモンタイピング。の、キーボード。