DevLove関西「わかりやすいアジャイル開発の教科書」ワークショップ#1

これに参加しました!

DevLOVE関西 「わかりやすいアジャイル開発の教科書」ワークショップ#1
http://devlove-kansai.doorkeeper.jp/events/4148

いきさつと準備

わかりやすいアジャイル開発の教科書

わかりやすいアジャイル開発の教科書

レゴブロックを使ってアジャイルが体験できる!
ということもあって興味本位で参加してみました。
しかも仕事終わりで勉強できるなんてもう最高です。
立ち読み用PDF「レゴスプリント」

まずは前川氏からのアジャイルについてのセッション

アジャイルはお客様と作る側のコミュニケーションが成り立っていて、
単にアジャイルでやるとなんかおいしいよねというようなノリで
アジャイルで開発すると必ず頓挫しますと強調されていた。

確かに以前の「アジャイルジャパン大阪」でも、
アジャイルを推進している方々は同じようなことを言っていた。
安易な考えで「アジャイルで開発したいんだけど」という感じで
開発しようとするのは絶対だめって・・・。

そもそも本来、開発というものは楽しいものであり、
アジャイルは「お客様を含めた」「チーム」というまとまりで、
ものづくりをしていくためのひとつの手段だということ。

アジャイルだからいいものができるのではなくて、
その中のTIPSをお客様と作る側がうまく使えてこそ、
効果がでるものだということを再認識しました。

チーム名を決める(2分)

いよいよレゴスプリントの始まりです。

2分ってすごく短いんですよね。
チーム名は

 ブラッディマリー

に決定。
お酒の名前ですが、私は飲んだことないけど
響きがかっこいいからこれになりましたヽ(´ー`)ノ
(今度、小粋なバーで頼んでみようかと思います)

最高の飛行機のディスカッション(5分)

「最高」ってつくとやはりみんな考えることは似てました。
「速い」「快適」「カッコイイ」などなど・・・。
なんだか童心をよみがえらせてくれるようなフレーズですよね。
そこから導き出したのが
 
 セレブをターゲットにした飛行機の概念を崩した
 快適でかつ高速で飛行可能である飛行機

でした。あの童心な気持ちはどこにいったんだろう。
行き着いたところが大人すぎます。
しかもこれが後で苦労することになるわけで・・・。

タスクの切り出し(5分)

「やること」をポストイットに書き出して、
「TODO」「DOING」「DONE」に貼り出していきます。

いよいよ作成作業開始:1回目(10分)

朝会を済ませるんですが2分とまた短いので、
まずはパーツを集めましょうという話になるわけです。
でもここからが難題・・・。組み立てられないんですよ。
なぜなら

 コンセプトやこういうものを作りたいイメージはあるが
 デザイン(設計)がみんなの頭の中で共有されてない

という致命的なところに気づくんです。
見えているところは一緒なんですけど、
どういうものを作ればいいのかがわかってない感じです。

結局タイヤなどのパーツは集めたものの何も組み立てられず、
ひとまず土台のデザインだけを決めて終わりました。

どうやらこのレゴスプリントで1回目で飛行機ができなかったのは
なかなかのレアケースだったらしくてなんだか悔しかったです。

作業終了後に「ふりかえり」を行います。
KPT・・・問題は確かに多くありましたが、
K(Keep)ででた

 デザインのイメージがみんなで共有できた

というところを
次のスプリントに生かそうという感じになりました。
問題だらけだったからKeepが目立ったのかな(;´Д`A )

そしてまた作業開始:2回目(10分)

朝会をちゃっちゃと済ませて、
やることはまずは土台とエンジン。
その上にコクピットなどの基本装備をおきつつ、
オリジナリティあふれるパーツをおく。

完成・・・。

短時間で思った以上のものができたと思います。
あえて言うならもう少し座るところとか、
出入り口とかをしっかりしたかったです。

さいごに

レゴスプリントは本当にあっという間でした。
他のチームも違ったコンセプトをもって作っていて、
同じ「最高の飛行機」でもいろいろあるんだなと実感。


短時間でこんなにつくりがしっかりしている


飛行機をタクシーっぽく使うという発想がすばらしい

個人的課題

タスクの切り出しの粒度と
そのタスクの優先順位の決め方の感覚を
もう少し体感していかないといけないなと感じました。

TODOとして切り出したはいいけど、
本当は何をしないDONEになるのかまで読み取れない。
それってTODOではないような気がしています。

普段、仕事するときにタスクを切り出しますが、
実はタスクの中にすごく難しいことが含まれていたり
いざタスクをやり始めると、他のタスクを完了させないと
進まないようなものであったりすることが多々あるので、
そういうところをもう少し学べたらいいなと感じました。

次の DevLOVE関西「セルフ・タスクマネジメント」
もう少し勉強できるといいな。

DTIの490円SIMでテザリング

私の携帯事情

DTIServerMan SIM 3G 100
通話専用の端末の2台持ちをしてます。

 ・Galaxys2(SC-02C)(データ専用:月493円)
 ・ARROWS(FJL21)(通話専用:月3円+通話料)

100kbって遅いでしょ

はっきりいって遅いですが、
RSS確認+まとめサイトみるくらいなら
全然繋がるし個人的にはパフォーマンスよいです

動画とか重たいコンテンツ見るときは
個別に公衆無線LANを契約しているので
そっちで見ます。これも結構安いです。

 ・Wi2 300(月額:380円)
 ・NTT-SPOT(月額:無料)*1

docomoテザリングする場合

docomo端末はテザリング時に
専用のAPNに強制的に変更される仕様みたいなので、
DTIで設定していたAPNが書き換えられてしまい
標準ではテザリングできません。

APN書き換えの壁を越える

以下のアプリで接続ができるようになりました。

FoxFi (WiFi Tether w/o Root)
https://play.google.com/store/apps/details?id=com.foxfi&hl=ja

最後に

100kでテザリングしてPCでWebページ見ましたがなかなかもっさりします。
Limitを解除すればそれなりに利用できるのかな。

*1:フレッツ加入者であれば12ヶ月無料+ポイントでも支払可能

java.awt.Robotによるモダン(?)な画面キャプチャ

画面キャプチャの基本

テストケースを打鍵しながら画面をキャプチャするのは
TakesScreenshot#getScreenshotAs(OutputType.FILE)で取れるのは
いろいろ調べて理解しました。

How do you capture "Popup Alert Window"

ですが、アラートのポップアップが出ているところを
バチっとキャプチャしたいときには使えないみたいでした。
どうすればいいのか悩んでgoogleを彷徨い歩きました。

Robotを使ってキャプっちゃえ!

彷徨い歩いた結果たどり着いたのが「java.awt.Robot」でした。
どうもこれを使うとキャプチャ以外にもいろいろできるみたいですね・・・。

/**
 * Robotによる画面キャプチャ
 * 
 * @param path 出力先ファイルパス
 */
public static void alertCaptuer(String path) {

  // 取得する画面エリア 
  Rectangle screenSize = new Rectangle(0, 0, 2560, 800);

  try {

    // java.awt.Robotの生成
    Robot robot = new Robot();
    // イメージを所定の場所に出力
    ImageIO.write(robot.createScreenCapture(screenSize), "png", new File(path));

  } catch (IOException e) {
    e.printStackTrace();  
  } catch (AWTException e) {
    e.printStackTrace();
}

最後に

javaって本当に広い・・・そして深い・・・。
なんだか少しずつですが楽しくなってきましたヽ(´ー`)ノ

InternetExplorerの一時フォルダから出力されたPDFを取得する

IEでテストケース打鍵しつつ画面キャプチャをとるのは容易ですが、
テストケース内で出力されたPDFなどを一時フォルダから
取得できないかといろいろもがいた結果がこれです。

環境

jdk:javaSE-1.7
selenium-ie-driver:2.32.0
commons-io:2.4

ソースコード

// ディレクトリからPDF一覧を取得
File tmpDir = new File(tempFolder);
Collection<File> listFiles = FileUtils.listFiles(tmpDir, new String[] {"pdf"}, true);

// 最後に出力したPDFファイルを選定する
long lastTimeStamp = -1;
File targetFile = null;
for (File file : listFiles) {
  if (lastTimeStamp <= file.lastModified()) {
    targetFile = file;
    lastTimeStamp = file.lastModified();
  }
}

// 指定した場所にファイルを保存する
File saveFile = new File("C:/saveFile.pdf");
FileUtils.copyFile(targetFile, saveFile);

あとがき

commons-ioってすごいですね・・・ヽ(´ー`)ノ(そこかよ!)

ERRORCODE=4461, SQLSTATE=01000

タイトルが無骨すぎますけど、
これで調べる方もいらっしゃるかと思って。

エラー内容

内容としては

入力データ・タイプが一致しません。
チェーン例外を参照してください。
記述入力情報を使用して実行を再試行します。
JDBC セマンティクスで必要なデータベース列タイプと一致する入力データ・タイプを使用するよう、
アプリケーションを変更してください。
というものなのですが、
環境によっては再試行(WARN扱い)する場合と、
再試行しない(FATAL扱い)場合があって、
後者の場合はExceptionで落ちてしまいます。
(DB2にそんな設定があるのかドライバが悪いのかは不明です)

環境とエラー対象のテーブルについて

アプリケーション上からJDBC経由(db2jcc.jar)で
テーブルにSQLを発行するわけですが、
テーブルが以下のデータ型で構成されていて
 ・VARCHAR
 ・DECIMAL 
 ・CHAR
 ・TIMESTAMP
主キー以外NULLで更新する場合に起こっていました。
ちなみにドライバのバージョンは不明ですm(_ _;;)m

回避策(ひとまず)

上記であればDECIMAL型のカラムに
なにかしらの値を入れることによって
このエラーを回避することができます。

これはすべてのDECIMAL型に入れないといけないわけではなく、
特定の1つでかまわないのでシステムによって
ひとまず「0」を入れておいてもよいと判断できるものには
「0」を入れておくのがよいということです。

最後に

なんとも腑に落ちませんが私の現在の技術力では
こんなもんでしか対応できませんでした°゜(゜´Д`゜)゜°

jenkinsによるWebSphereへのEARファイルデプロイ

wsadminによるサイレントデプロイ - 遅れてやってきたプログラマーの小言
以前にこのタイトルでサイレントデプロイまではやってました。

これをjenkinsで
 ・コンパイル
 ・WAR・EARの生成
 ・WebSphereへEAR転送
 ・WebSphereにアプリをデプロイ
までやるわけですが全部jenkinsでできるわけではないので、
もう少し細分化します。

antでやる範囲

最近スタンダードなmavenでなくてすみません・・・°゜(゜´Д`゜)゜°
build.xmlでは以下の仕事をするようにしておいて、
jenkins上から実行できるようにしておきます。
 ・コンパイル
 ・テスト
 ・WAR・EARの生成

jenkinsでやる範囲

プラグインを使って以下の仕事をするようにします。
 ・EAR転送
 ・デプロイコマンド実行

各種プラグインの導入・設定(jenkins)

以下のプラグインを導入・設定します。
Publish Over FTP Plugin:https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+FTP+Plugin
Publish Over SSH Plugin:https://wiki.jenkins-ci.org/display/JENKINS/Publish+Over+SSH+Plugin

各ジョブの設定はこんな感じ

導入したプラグインの基本設定さえすればこんな感じです。

最後に

これでビルド完了とともにデプロイまで自動化できました。
タイミングは今のところ手動にしています。

またテスト・カバレッジについては
もう少し私のレベルアップが必要です。
テストはJUnitカバレッジはCoberturaを利用する予定です。

tarコマンド実行時に特定ファイルを除外する

あらかじめ除外リストを作っておく

# echo "/hoge/shell/stop.ksh" >> excludeFile

除外リストを指定して実行

# tar -cvf hoge.tar -X /excludeFile /hoge

実行結果こんな感じ

a /hoge
a /hoge/sample
a /hoge/xml
a /hoge/shell/stop.ksh (除外)

フォルダ単位で除外することも可能です

# echo "/hoge/shell" >> excludeFile
# tar -cvf hoge.tar -X /excludeFile /hoge
a /hoge
a /hoge/sample
a /hoge/xml
a /hoge/shell (除外)