2015年8月12日水曜日

jira + confluence + trac にしました

チケット管理をjiraに変更してから、とても快適になりました。
tracでのチケット管理は色々と手間がかかり、面倒だったのです。

tracで問題だった点は、
チケット間の画面移動が面倒。
表を作るのにsqlかその簡易版のタグでがりがり書かなくてはならない。すなわち管理が大変。
画面レイアウトが大変。(チケットテンプレートがブラウザから編集できない & 複雑 & wikiページのデザインも大変)
チケット内容の変更(ステータス変更のみであっても)が大変。(クリックやマウス操作が多すぎる)
フローや状態によってチケットの仕様を変えたいけどできない。
wikiの機能が貧弱すぎる。プラグインも扱いが面倒すぎる&使い勝手の良い物がほとんど無く工夫が必要。

jira + confluence でこれら全ての不満が解消しました。
サービスの継続開発をアジャイル形式(チケット駆動)で行っているため、tracだと少々ストレスがありました。

jiraでの不満点は、
メモリ消費が半端無い。 javaサーバってこんなばかみたいに消費するのですか・・・。そのうえページ初期化処理が重い。(キャッシュが効いている間?は快適)
設定画面があまり親切ではなく、大変。 改善の余地ありますね。よく行き来する関連ページへのリンクぐらいは網羅して欲しいです。


そして、なぜ trac をまだ採用しているか!

リポジトリブラウザ(差分表示)のみ使っています。
fisheyeがこれに相当するのですが、さすがに3つはコストアップが激しすぎます。 それにこれだけはTracので充分でした。
jiraに無料svnプラグインを入れて、svnのプラグイン設定でtracのurlを指定して差分表示を連動させています。

そう、未だに svn を使っているのです。
そろそろ git に切り替えたいです。

2015年8月10日月曜日

JIRA と Confluence をインストール

開発ではずっとTracを使っていましたが、管理が微妙に大変なので JIRA と Confluence を導入しました。
選んだ理由は、他を寄せ付けない圧倒的な高評価でしょうか。  といっても私はTracとRedmineとbacklogとSharePointしか知りませんが、この中ではダントツです。


インストール環境
・CentOS 6.6
・MySQL 5.5
・JiraとConfluenceは64bitインストーラー版

JAVAサーバーのためか、メモリを非常に消費します。 2ギガだとスワップで数ギガ発生し、しまいには初期セットアップでこけます。

インストーラーはちょっと不親切で、マニュアルを見ながら行う必要があります。
といっても、解説サイトが大量にあるので、困る事も無いと思います。

もしメモリ不足等でウェブアクセス後の初期化に失敗した後に再インストールを行いたい場合は、設定ファイルを削除してください。
初期化するかしないかは、設定ファイルがあるかないかで決まります。
CentOSでデフォルトなら、
/var/atlassian/application-data/jira/confluence.cfg.xml
/var/atlassian/application-data/confluence/confluence.cfg.xml

DBの文字コードですが、マニュアルでは utf8-bin と書かれています。
おそらく古いMySQL用だとは思いますが、binが一番軽量なのでbinで作りました。
最近のなら、utf8mb4-general で構築するのが一番良い気がします。

mb4で4バイトの漢字に対応。 general で日本語ソートばっちし。
binだとバイナリコードでソートされてしまうため、場合によっては意図した順番にならずに面倒かもしれません。



そして実際に使ってみた感想。



今までやりたくてたまらなかったことが、できちゃう!
ワークフローやフォームの内容を条件で切り替えられるのがいいですね。Tracはこれが出来なくてカオスでした。
しかし設定多すぎて最初が大変。
表示を日本語(翻訳表示)に指定すると、若干の問題がある。


Tracのデータをインポート!

とりあえず、文字化けしました。 概要は化けていないのに、詳細とコメントが文字化けです。 DBの文字コードに問題なし。
面倒なので修正用のSQLをささっと作って修正しました。

詳細の修正は概要をキーにしてupdateかけるだけでいいので、簡単でした。
問題はコメントの修正です。キーにできるカラムが無い・・・・あった! 作成日をキーにしました。 同じ秒に投稿された記憶がないので、唯一の値とかってに決めました。
ただ、trac側はマイクロ秒のユニックスタイムなので、これを日時にコンバートさせないといけません。

UPDATE jira.jiraaction AS T1, trac.ticket_change AS T2 SET T1.actionbody = T2.newvalue WHERE T2.ticket >= 0 AND T2.ticket < 1000 AND T2.field = 'comment' AND T1.CREATED = from_unixtime(TRUNCATE(T2.time/1000000 ,0));

T2.ticket >= 0 AND T2.ticket < 1000 は、量が多すぎるので分割しました。 やっと終わったと思ったらエラーになっていたので・・・。
T2.time/1000000 は、マイクロ秒を秒に変換で、TRUNCATEで小数点以下を切り捨て、from_unixtimeで日付フォーマット。

無事、全てのチケットが表示されるようになりました。
ただし、更新ログ系はまた別なので、ばけたままです。 どうでもいいので放置します。

2015年8月8日土曜日

Windows10 + virtualbox + vagrant + phpstorm + eclipse

本日ついに! 私の元へwindows10が来たので、ささっとインストールをいたしました。

いざ、仕事で使っている開発環境へ!

無謀ではないですよ。 事前調査は済ませてあります。

なんかあちこちで、2ch情報としてvirtualboxが動かないだの eclipseが動かないだのが拡散していますが問題ありません。
eclipseが動かないというのは、JAVAのバージョンがおかしいのかもね。
virtualboxが動かないというのは、バージョンが古過ぎる?


Windows10にアップグレードする前に、下準備をしておくと楽かもしれません。

まず、「マイピクチャ」内の画像を別の所に移動させておきます。
これやらないと、本当に恥ずかしい事になってしまいます。

ソフトウェア類、特にドライバ類は最新バージョンに上げておきます。
でないとwindows10を入れた後にエラーになる場合があります。

モニターを沢山つなげている人は displaylink がほとんどだと思いますが、これは古いドライバのままだと動きません。
公式サイトからDLしてきて、自分でアップデートしましょう。

OSやデスクトップ改造系の常駐物は、Windows10では使えない可能性大です。
私の場合、「絶対領域」が対応していませんでした。 デスクトップが画面が非常に不安定になります。(いきなりクリックできない等)

eclipseとphpstormは何もせずに全て正常に動きました。
私はコーディングをphpstorm、リポジトリ管理をeclipseで行っています。


virtualboxは、windows10でも問題無く動作しましたが、vagrantとの連動が動作しませんでした。
どうやら再設定が必要っぽいです。(設定しなおせば動くという情報は、ぐぐると沢山出てきます)

まず、virtualbox と vagrant を最新版にアップデート!
virtualboxは、アップデートするとネットワーク設定が壊れることで有名です。
そして案の定壊れました。

ホストオンリーアダプターの設定がおかしなことになったので、元に戻します。
予め正常時の設定をメモしておきましょう。

vagrant up! os起動完了!
しかし、sshログインに失敗するようで、認証エラーの荒しで終わります。

ここらへんの情報は、世界のstackに情報があつまっています。
どうやら、鍵ファイルをアップデートすれば良いらしい。 バージョン4系で作ったboxはそのままでは使えないということでしょうか。

書いてある通りに鍵ファイルを置き換えて vagrant up!
こんどは大成功し、box環境をなにやらアップグレートの荒しです。 バージョン5系のツール類をインストールしているもよう。

無事に、vagrant up が正常完了できるようになりました。


が、しかし

sshはログインできるが、ブラウザからwebminにもhttpdにもつながりません。 サーバへのpingは通るのでIPは間違っていない・・・ポートかなと思った所で終了です!



続き


ブラウザから接続きなかった理由は、ただの設定ミスでした。
DHCPの設定で、IPをvagrantで指定したIPv4アドレスと同じにしたらできました。


さらに追記
今回発生した vagrant + virtualboxでのトラブルは、windows10とは無関係でした。
windows7のマシンでも、まったく同じ現象を確認できました。

2015年6月14日日曜日

セッション管理をDBで行う時の間違った設計

とある有名システムにて、重たい時のセッション動作が不安定なのでソースを見ていたところ!


セッションデータをDBで管理は良いのですが、トランザクションを開始していないというお粗末な物でした。
トランザクションを開始していない・・・これはデータを消失してしまうことを意味するのです。

たとえば
ページAを開く。
ページBに移動しようとしたら、重くて開かないからページCに移動。
ページBやCに移動する時にセッションへデータ書き込みがあった場合、セッションがどっちのデータになるかは神すらもわからない状態。

また、セッションに保存してそのままリダイレクトといった動作(ログインやログアウト)はよくある設計ですが、重いとセッション書き込み順序が逆転してうまく動作しません。

なのでセッションをDBで管理する場合は、トランザクションによる保護を絶対忘れないようにしましょう。

フレームワークを使っていればフレームワークがしっかり処理するので問題ないですが、DB操作に慣れていない人が自作するとこの肝心な部分が抜け落ちてしまうのですよね。


セッション専用のコネクションを張り、トランザクションを開始し、for update でロック。 これを最低限おこないましょう。
セッションをDBでというソースを載せているブログで、これが抜けているのが多く見受けられました。
ただし、闇雲にロックしてしまうと、範囲ロックをしてしまい、結果、デッドロックするということになります。for updateを使う時はこれに注意です。
1行のみロックするには、その行が存在していなければなりません。 なので、無かったら作って、その後にロックをすることでデッドロックを避けられます。


あとは、アクセスの全てでセッションを開始するような設計は絶対にやめましょう。 サーバが落ちる原因になります。
セッションのロックが解除されるまで、次のアクセスが許可されません。
1ページでいくつもセッションを開くような動作だった場合、どうなるかは想像できると思います。

セッションまわりって意外と落ちる原因になりやすく、初心者が気が付かない盲点だったりします。
特にPHPのセッションまわりのデフォルト設定は超小規模サイト向けであり使い物にならなく、気がきいていないと思います!

2015年5月21日木曜日

vagrant + phpstorm + phpunit 環境を構築しよう

今や主流の組み合わせである vagrant + phpstorm + phpunit の最新構築方法です。
ネットで検索しても古いバージョンの情報ばかりだったので、置いておきます。

phpstorm8(現時点最新)での導入方法となります。
要点のみの説明です。

まずはじめに
簡単にphpstorm8でphpunitと連動させるには、いくつかの制約がございます。
仕組みに詳しくない人は変な事をせず、さくっと設定しちゃいましょう。


①仮想環境(vagrant)にphpunitをインストール

必ずcomposerでインストールしてください。使ったことが無い人は「phpunit composer」でぐぐりましょう。
phpstormの設定ウインドウにはphpunitのダウンロードアドレスが載っていますが、手動インストールは設定難易度が一気に上がります。置いただけでは連動しません。


あと、sshでアクセスできる状態にしておいてくださいね。 phpstormからはssh経由でphpunitを実行されます。

②設定

Settings>Languages>PHP>PHPUnit で設定

「+」を押して By Remote Interpreter
プルダウンに何も無いので、右の「・・・」をクリックし Interpreters ウインドウを開く
何もないので「+」を押して追加
追加内容は、Vagrantを選び、適切な内容に。

さくさくっと進み、再び PHPUnit設定 に戻ってきます。
追加した設定を選択し、 Use Custom autoloder を選びます。 ここがポイント
composerでphpunitをインストールするとオートローダーが設置されていますので、探して指定してください。
最後に Default configuration file を指定して終わりです。

Default configuration fileとは、phpunit.xmlのことです。 めんどくさがらずに作りましょう!
ここで指定しない場合は、別途で指定になるかと思います。


以上で基本設定は終わります。
次に、テストの実行ですね。

phpstormの上部メニュー Run > Edit Configurations を開きます。
「+」を押して PHPUnit を選びます。「PHPUnit on Server」はhttp経由での実行(旧機能)なので無視してください。
PHPunitを選ぶとテスト内容の設定を行います。大規模になると複数作ることになりますね。
Defined in the configuration file を選ぶと、PHPUnitの設定「Default configuration file」で指定したテスト内容を実行してくれます。

これにて各設定終わり!
画面右上にPHPUnitのテスト実行ボタン等が出現したと思います。 そこから実行してください。



上記通りの設定をすると、ファイル名のみルール(xxxxTest.php)に従うのみで、ディレクトリ構造は自由です。
従わない場合ははオートローダーでテストケースを読み込みになるなどで、面倒なことになります。

2015年5月17日日曜日

tracの通知をslackへ飛ばそう

tracのチケット通知はメールアドレスを指定できるだけです。
しかしメールはちょっと不便ですよね。まず気がつきません!

リアルタイムに把握したい場合は、流行のslackが便利です。
slackについての説明や設定ははしょって、通知を飛ばす方法を紹介します。

Tracの通知メールはCCでいくつでも設定できるので、slack用メアドへ通知を送り、それをプログラムへ転送してslackへメール内容を送るという方法になります。

pythonの古い仕様のソースはgithubに上がってますが、そのままでは使えないしPHPが好きだしということで、PHPでの方法です。


メール転送は、ユーザディレクトリに「.forward」ファイルを設置し、この中に転送先を書きます。
とりあえず、「slack」というlinuxユーザを作って説明していきます。

ホームディレクトリありでslackユーザを作成すると
/home/slack ディレクトリが作られます。

/home/slack/.forward ファイルを作って
中身は


"|php slack.php"




とでもしておきましょう。
「|」がコマンド実行するよーという合図で
「php」がコマンド
「slack.php」が、コマンドに渡すパラメータで、まぁ、これを実行するわけですね。

ここから先はサーバ設定によってまったく異なりますのでご注意。


.forward で指定できる内容は、セキュリティー設定によりかなり制限されます。
・指定されたディレクトリに存在するコマンドしか使えない。
・コマンドのパス部分は無視され、ファイル名部分だけ認識。
・絶対パスは使えない。
|php /home/slack/slack.php と書いたら駄目です。 必ず相対パス。

以上3点がはまりやすいかもしれません。

phpコマンドを使えるように、設置
/etc/smrsh/ にあるコマンドのみ使えるので

# ln -s /usr/bin/php /etc/smrsh/
シンボリックリンクを置きます。

これで php コマンドが使えます。

次に、slackへメール転送するphpである slack.php。

<?php
require_once 'mimeDecode.php';

$WebHookURL = 'https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxx';
$param = array(
 'channel'  => '#channel',
 'username' => 'username',
 'icon_emoji' => ':vertical_traffic_light:',
 'text'     => '',
 'color'    => '#cccccc',
);

$decoder = new Mail_mimeDecode(file_get_contents("php://stdin"));
$params = array("include_bodies"=>true);
$structure = $decoder->decode($params);
$param['text'] = $structure->body;
postRequest($WebHookURL, $param);

function postRequest($url, $param)
{
 $content = json_encode($param);
 $headers = array(
  "Content-Type: application/json",
  "Accept: application/json",
  "Content-Length: ".strlen($content),
 );

 $options = array('http' => array(
  'method' => 'POST',
  'content' => $content,
  'header' => implode("\r\n", $headers),
 ));
 $contents = file_get_contents($url, false, stream_context_create($options));
 return $contents;
}

こんな感じで適当につくりましょう。
mimeDecode.phpはpearのです。slack.phpと一緒に置いてください。


動かない時は、.forwardのセキュリティーが非常に宜しいです。

.forwardのオーナーをslackにし、パーミッションを600にしてみましょう。
これで動かないサーバは無いと思います。



最後のphpの中身を少し解説

Mail_mimeDecode:pearライブラリで、メール内容をヘッダ、タイトル、本文、添付ファイルと分けてくれる便利な物です。
メールを読み込んでいる部分は file_get_contents("php://stdin")
file_get_contentsは外部と通信するための万能ツールです。slackへの送信もこれで。