プロジェクト管理ソリューション「JIRA」を試す

前から気になっていたプロジェクト管理ソリューションJIRAを試してみようと思います。プロジェクト管理と言えばRedmine等のBTSとかリポジトリ管理とかそんなかんじのものを思い浮かべますが、JIRAもそれと同じようなものであるようです。

しかも高機能な上に、他のプロジェクト管理ツールからチケットをインポートできる機能も併せ持つ今話題のプロジェクト管理ツールだということですから、これは見逃せません。しかも安い。

というわけで使ってみた。

お試しということで体験版をダウンロードします。

中身を見てみる

README.txt があるので vim で開いてみます。

なるほど・・・。これは敷居が高そうだ・・。
とりあえず1番から進めていきます。

JREのインストール

JIRAを動かすにはJavaが必要なので、 ここからJDKかJREをダウンロードします。私はJDKを選択しました。

そしてインストール

ここまでやって、javaを実行できるか確認します。

これでjavaが実行できるようになりました。

JAVA_HOMEを定義

を実行して、環境変数にJAVA_HOMEを定義します。

実行

これでもう実行できるようです。

JIRAへアクセス

http://localhost:8080/

へアクセスします。

なんかでてきた

スクリーンショット 2013-01-03 7.29.43

どうやらJIRAのホームディレクトリがないというエラーのようです。JIRAのホームディレクトリを指定するには環境変数としてJIRA_HOMEを定義してやればいいようです。

環境変数の設定が完了したら、一度JIRAのプロセスをキルします。

あらためて実行

スクリーンショット 2013-01-03 7.41.26

おお!来ました!

データベースの選択では、とりあえずお試しなので内部を選択しました。この操作には少し時間がかかります。

アプリケーションの設定

スクリーンショット 2013-01-03 7.43.33

評価ライセンスの発行

スクリーンショット 2013-01-03 7.45.51

アンケートが求められる

スクリーンショット 2013-01-03 7.46.42

管理者アカウントの登録

スクリーンショット 2013-01-03 7.48.08

送信メールサーバーの設定

スクリーンショット 2013-01-03 7.49.05

ようこそ画面

スクリーンショット 2013-01-03 7.49.57

ダッシュボード

System Dashboard - test

プロジェクト管理画面

Demonstration - test

これには驚きました。メニュー部分がAJAXの非同期読み込みで、ぬるぬる画面が切り替わります。
スクリーンショット 2013-01-03 7.52.57

課題作成画面(チケット作成画面)

スクリーンショット 2013-01-03 7.54.09
なんとモーダルウィンドウ!

スクリーンショット 2013-01-03 7.56.29

スクリーンショット 2013-01-03 7.54.09
課題(チケット)の作成は非同期通信で一瞬で終わる。早い!

課題リスト(チケットリスト)

スクリーンショット 2013-01-03 7.58.16
見て分かる通り、検索結果のフィルタは保存できる機能がすごい!

スクリーンショット 2013-01-03 7.59.33
ネジマークをクリックすれば、各チケットにダイレクトに状態の変更が可能!

課題のクローズ

スクリーンショット 2013-01-03 8.00.33スクリーンショット 2013-01-03 8.00.42

課題のクローズもほんの一瞬で終わる。

一目瞭然なチャート

スクリーンショット 2013-01-03 8.01.41
まだあまり課題を登録していないのでわかりずらいですが、課題数ベースで作成した課題と完了済みの課題との比較チャートです。一目均衡表の雲のようです。

誰の作業量が一番多いのか、少ないのかわかる課題画面

スクリーンショット 2013-01-03 8.03.43
この機能こわいですね。作業量ベースで差が丸見えというか・・。力を魅せつけられるというか・・。

プラグインの導入

スクリーンショット 2013-01-03 8.06.26

gitプラグイン(有料)

スクリーンショット 2013-01-03 8.09.27
これはマイナスポイントかなぁ・・。デフォルトではCVSだけなのかなリポジトリ管理は。

スクリーンショット 2013-01-03 8.12.02
あれっ・・コミットしてたはずなのですが・・・。

まとめ

メリット

  • AJAXによる非同期読み込みで画面遷移をほとんど発生させずストレスのない挙動
  • 非プログラマな職の人でも使いやすい。直感的でわかりやすい
  • グラフが見やすい
  • 進捗管理しやすい
  • 他の人の作業状況が把握しやすい
  • シンプル
  • プラグインが簡単にいれられる
  • 最初のインストールが少しむずかしいが、インストールさえできれば簡単

デメリット

  • リポジトリ管理がヒドイ
  • シンプルすぎて細かいところに手がとどいてない感じがする
  • バージョンやマイルストーン・・・どこ・・?
  • やっぱりバーンダウンチャートがほしい
  • RedMineのTime Trackerプラグインには勝てない
  • Redmineのチャートプラグインのほうが高機能

Javascriptテストフレームワーク Jasmineを試す

日頃からJavascriptで開発をしているのにも関わらずあまりテストを書かないので、ここは本格的にテストを書こうと調べてみました。JavascriptのテストフレームワークといったらJsUnitなのかなーと思っていたが、調べてみると結構いろんな種類のテストフレームワークがあったりして、その中で得に人気なのかどうやらJasmineらしい。

Jasmine ~ JavaScript Test フレームワーク より引用:
今回は, JavaScript のテストを行うためのフレームワークJasmine の紹介です。
JavaScript のテストといえば, JSUnit が有名です。
JSUnit は, JUnit とに似たような, Matcher が利用できたりしてわかりやすいのですが,
開発やメンテナンスがストップしており, またWebプロジェクトに組み込まないと利用できないことが
ちょっと残念です。

JUnit のページでも紹介があるように, 今後は Jasmine というフレームワークを開発していくようです。

なるほど、JsUnitはかつて人気だったテストフレームワークだったけども開発ストップしてて古くなっており、今はJasmineということなのか。

とりあえずやってみた

しかし、初めて触るライブラリというのはどうにもこうにも敷居が高い。少しずつしらめてみる。なんにせよまずはインストールだ。

公式ページ: http://pivotal.github.com/jasmine/
公式ページ(の翻訳): http://mitsuruog.github.com/jasmine/
ダウンロード: https://github.com/pivotal/jasmine/downloads

ダウンロードしたファイルは、jasmine-standalone-1.3.1.zip です。

二種類の使い方

Jasmineは使い方が二種類あるそうです。

  • standalone
  • rubygems + rake

standaloneはRubyを使わずにJavascriptだけで使える環境、 rubygems + rake はテストを自動化させたい場合はこちらを選ぶ。ただ、standaloneでもPhantomJSを使えば自動化できるようです。

ここではstandaloneについて実験

rubygemsを使った方法だと、テストを実行させるためのHTMLを自動生成してくれて大変便利らしいのですが、ここでは導入としてstandaloneを使ったやりかたについて試してみたいとおもいます。

ディレクトリの構造はこのようになっています。

これをWebサーバーにあげて、SpecRunner.html を開いてみます。

スクリーンショット 2013-01-03 3.24.32

なるほど、わからん。

見た感じ、上の5つの丸がテストの成功か失敗かを表し、下段の黒字がテストスイート(カテゴリ分け)、緑の文字がテストケースという具合のようです。

Specの意味

「仕様」 = テストケース

Suiteの意味

「一式(分類)」 = テストスイート

SpecRunner.htmlの中身を見る

SpecRunner.htmlの中身を見てみます。

よくわからなかったのでコメントを振ってみる

よくわからなかったのでコメントを振ってみます。

このファイルは、テストを行いたいJavascriptを読み込み、それに対してテストを定義し実行するというもののようです。しかし、「jasmineEnv.updateInterval = 1000;」という行が気になった。これはもしかして1秒ごとにテストを実行するということなのだろうか。もしそうなら、このHTMLファイルを開きっぱなしで常にテスト結果を確認できるということなのでとても嬉しいのだけれど・・。

バグらせてみる

まだなんだか感覚がつかめないので、テスト対象のファイルをバグらせてみることにします。

Player.jsをバグらせる。

中身はとてもシンプルで、本当にプレイヤー機能が入っているのかと思えばそんなことはなくて、模倣したオブジェクトのようです。

コメントを振ってみます。

お気に入りに登録のコメントが合っているのか不安ですが、これの途中から再生するをバグらせてみます。

「song is already playing」からplaying を消してみました。これでいったいなにが起きるか・・・。
先ほどの SpecRunner.html を開いて確認してみます。

バグがある場合のテスト結果

スクリーンショット 2013-01-03 4.10.31

おお! なんか出ました!エラーがでました!これはエラー詳細ページで、全体のテストケース一覧を見るには「5 specs」をクリックします。

スクリーンショット 2013-01-03 4.11.31

エラーがあるテストケースは赤字になっています。
また、自動的にリロードしてくれるのか期待していたのですが、自動リロード機能はないようなので、ブラウザの自動リロード機能を使って常に監視しておくといいです。

テストのほうを弄る

テストケースが定義されているファイルをいじってみます。弄るファイルはspecフォルダにある「PlayerSpec.js」です。

中身はこんなかんじ

うおお..よくわからない…

RSpecというruby界隈の方にはお馴染みの書き方のようです。そしてこの書き方がテストをやる上ですごいやりやすいんだとか。
また同じようにコメントを振ってみます。

頭を使いすぎた・・・。だいたいこんなかんじで合っているとおもいます。
流れはコメントの通りで、expect の期待が外れると、そのテストケースは「失敗」となるようです。describeによるテストスイートのカテゴリ分けや階層化もなかなかおもしろいと思いました。

そして、とくに気になった点を2つあげると、独自定義マッチャと、スパイ機能です。これについては次に書きます。そしてその前に、マッチャってなんだ・・・・・。

マッチャ

マッチャとは、「AはBであることを期待する」というように正しいかどうかを評価するためのものです。
マッチャはいくつかの種類があります。

expect(x).toEqual(y); xとyが等しいことを期待する
expect(x).toBe(y); xとyが同じオブジェクトであることを期待する
expect(x).toMatch(pattern); 文字列または正規表現パターンでxと比較し、一致することを期待する
expect(x).toBeDefined(); xがundefinedではない場合ことを期待する
expect(x).toBeUndefined(); xがundefinedであることを期待する
expect(x).toBeNull(); xがnullであることを期待する
expect(x).toBeTruthy(); xがtrueであることを期待する
expect(x).toBeFalsy(); xがfalseであることを期待する
expect(x).toContain(y); 配列化か文字列であるxに対して、yが含まれていることを期待する
expect(x).toBeLessThan(y); xがy未満であることを期待する
expect(x).toBeGreaterThan(y); xがyよりも大きいことを期待する
expect(function(){fn();}).toThrow(e); 無名関数が実行された時に関数fnが例外eを投げることを期待する
.not.(matcher) (matcher)に他のマッチャを指定することでそのマッチャを逆に評価します(trueをfalseに falseをtrueに)

独自マッチャの定義

マッチャは予め定められたものだけではなく、「SpecHelper.js」によって独自に定義することもできます。

スパイ

次はスパイを見ていきます。

スパイのテストケースはこうなっています。「spyOn(song, ‘persistFavoriteStatus’);」で song オブジェクトの persistFavoriteStatusメソッドを監視します。

songのpersistFavoriteStatusメソッドはこのようになっています。

「player.play(song);」でプレイヤーを再生するときには特に内部でスパイは活動を行いませんが、「player.makeFavorite();」で活動を行います。

makeFavoriteメソッドは内部ではこのようになっており、「this.currentlyPlayingSong」には 「player.play(song);」内部で定義された songオブジェクトが入っているため、「persistFavoriteStatus」が実行できます。

このときに、スパイが活動を始め、このメソッドが実行されたことをしっかりと記憶します。

そして、

スパイの活動を見るために、toHaveBeenCalledWithメソッドがスパイから songオブジェクトがpersistFavoriteStatusメソッドを実行したときに引数にtrueを使用したかを聞き出します。

true が引数に使われたことがわかったので、これで期待通りの結果になっているということがわかります。

スパイのためのマッチャ

このように toHaveBeenCalledWith のようなスパイのためのマッチャがいくつか用意されています。

expect(x).toHaveBeenCalled() xメソッドがスパイ中に呼び出されていたメソッドであることを期待
expect(x).toHaveBeenCalledWith(arguments) xメソッドがスパイ中に呼び出された時にそのメソッドに使用していた引数がargumentsであることを期待
expect(x).not.toHaveBeenCalled() xメソッドがスパイ中に呼び出されなかった
expect(x).not.toHaveBeenCalledWith(arguments) xメソッドがスパイ中に呼び出された時にそのメソッドに使用していた引数がargumentsでないことを期待

さまざまなスパイの呼び出し方法

スパイが監視しているメソッドの実行を検知したときに細かい挙動を指定することができます。

spyOn(x, ‘method’).andCallThrough(); デフォルト機能。スパイ活動を開始します。
spyOn(x, ‘method’).andReturn(arguments); スパイが呼び出されたときに決められた引数であるargumentsを返します。
spyOn(x, ‘method’).andThrow(exception); スパイが呼び出された時に渡された例外をスルーします。
spyOn(x, ‘method’).andCallFake(function); スパイが呼び出された時に指定された関数へ実行を移譲します。

最後に

とても使いやすくて、ひとつのHTMLページに詰め込むこともできるし、デバッグモードをONにした場合にのみ表示なんてことも不可能ではないので、いろんな応用が効くテストフレームワークだと思いました。こんなに柔軟性のあるテストフレームワークだということに今更ながら驚いています。

スクリーンショット 2013-01-03 5.57.54

コンソールから整形されたJSONを表示

Linuxから手軽にJSON文字列を整形してコンソールに出力してくれるコマンドがあったのでご紹介。

echoの部分は、catでやればjsonファイルをそのまま読み込むこともできます。

参考: http://docs.python.jp/2.6/library/json.html

Pythonでエスケープとアンエスケープを行う

Escape Unescape

これでいけた。Python3からは文字コード周りがすごい修正かかってるらしいんだけども、これがあれば問題ない気がする。raw_inputのところをリテラルに変えてもいいし、エラーも吐かずいい仕事してくれる。

ただ改行コードが・・

しかし改行コードまではエスケープしてくれない。しかも先頭の\が消えるときがある。

追記

こんなのもあった。

PythonでMeCab実行時に文字化けを治す

文字化けの原因

文字化けの原因はどうやら一緒にインストールした辞書が原因らしい。UTF-8としてmakeしたはずなのになぜかeuc-8になってしまうらしく。これもまた混乱の原因になってしまうようです。

辞書の変更

sudo update-alternatives –config mecab-dictionary

とすることで辞書を変更できるようですが、これでutf-8を指定してるのにも関わらず文字化けする始末。どうしてなんだろうと調べてみると原因は全く関係ないところにありました。

mecabrcファイルを探す

find / -name *mecabrc*

mecabrcファイルにdecDirというディクショナリのディレクトリを指定する変数があるのでこれをutf-8対応のものに書き換えます。ややこしい・・。

/usr/local/etc/mecabrc
/etc/mecabrc

自分の環境だと2つでてきたのでこれらをviで開いてdecdirを書き換え。
書き換える元の辞書のファイルパスがわからない場合は、

find / -name *ipadic-utf8*

で探します。

/var/lib/mecab/dic/ipadic-utf8

こんなかんじになってるのがだいたい正解です。

Mac OS X で cc,gcc,clang をインストール

clangがない

OSX上でPythonを使い画像を加工しようと思ってPILをインストールしようとしたら、clangがないと怒られたので調べてみると、Xcodeをインストールしてもこれらコンパイラは自動的にインストールされなくなったみたい。

cc,gcc,clangを一括インストール

Xcode > Performance… > Downloads > Command Line Tools

のインストールボタンをクリックするだけで全てが一括インストールされる。

It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby. を出さないようにする

最初にyaml入れて

Rubyインストール後にこうするといいらしい。

参考: http://stackoverflow.com/questions/8410885/how-do-i-install-ruby-with-libyaml-on-ubuntu-11-10

ジャンプ率を考える

フォントのサイズによってWebサイトに元気があるように見えるらしい

ジャンプ率とは、Webサイトの中で一番小さい文字と一番大きい文字の比率のことで、この比率が大きければ大きいほど活発な元気なサイトに見えてくる。ただ、フォントだけではなく、オブジェクトの大小でもこの効果が現れるみたい。

20120803022801

オブジェクトのアスペクト比は黄金比または白銀比を使う

短い方を1として、1:1.1618 または 1:2.414 で統一させるとそれっぽく見える。

20120803023351

間は10px 5px

オブジェクトとオブジェクトは10px離し
小さいオブジェクト同士は5px離す。2倍がいいかも。
20120803023710

jQuery UI も Twitter Bootstrapもテーマカスタマイズができた

jQuery UI や Twitter Bootstrapのテーマを自由に変える

jQuery UI やTwitter Bootstrapのスタイルはcssによって描画されていますが、そのCSS(と画像ファイル)を自由にカスタマイズできるページがあったみたいです。

いやはやもう少し早く気づいておくべきでした・・。

jQuery UI

20120802040246

jQuery UI ThemeRoller
http://jqueryui.com/themeroller/

左ペインのメニューからいろいろ設定を変更してテーマを変えていきます。ギャラリーにはテーマ一覧もあったりして便利。設定完了したら「Download theme」ボタンをクリック。

Twitter Bootstrap

20120802040347

StyleBootstrap.info

http://stylebootstrap.info/

ここも同じようにカスタマイズした後最後にテーマをダウンロードできる。ダウンロードボタンがページ一番下にあるのでわかりにくいです。

bit.ly API を試してみる

短縮URLといったら

bitly
https://bitly.com/

Twitterが突発的に流行りだした時に一緒に有名になった短縮URLサービス。bit.ly ちょっとAPI調べて使ってみます。

bit.lyで短縮URL出すにはAPIキーが必要

これAPIリクエストの制限とかあるのかな。

とりあえずアカウント作る

create account のところをクリック
20120802033214

アカウント作ったらトップページへ

20120802033248

右上メニューからSETTINGS

20120802033601

APIキーを取得

20120802033601

当て込んでブラウザのアドレスバーにコピペ

http://api.bit.ly/shorten?version=2.0.1&login=ログインアカウント名&apiKey=APIキー&longUrl=http://www.yahoo.co.jp/

JSONでなんかデータでてくる

ここまでJavascriptコードにする

結果

“http://bit.ly/Qflg0g”

API制限について詳しくはこちら

bit.lyのAPI制限は開発者にやさしい?
http://ken.quoit.jp/2011/02/10/bit-ly%E3%81%AEapi%E5%88%B6%E9%99%90%E3%81%AF%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%82%84%E3%81%95%E3%81%97%E3%81%84%EF%BC%9F/