日々常々

ふつうのプログラマがあたりまえにしたいこと。

ハンズオンイベントに潜む悪魔(黒猫)

11/15に「Javaでwebアプリケーション入門」というイベントのお手伝いをいたしました。 #javajok で関西Java女子部さんのイベントです。

私は参加者と一緒にライブコーディングをするという大役を仰せつかり、緊張のあまり前日は24時間以上爆睡いたしまして。 おかげでGitHubの草を生やそう運動が54日で止まりました。無念。

会場は @bufferings さんに楽天株式会社大阪支社のカフェテリアを提供いただきました。最高ですね。広いし綺麗だし。

同会場にて11月21日(土)に Rakuten Technology Conference 2015 のサテライトが行われます。大阪にいながら世界のセッションを聞けますよ!(英語的な意味で)

当日のコトが起こるまで

家を出てすぐに黒猫に横切られました。嫌な予感がぷんぷんしました。

まず、環境構築でドハマりしました。 ハンズオンイベントでの問題となる筆頭は環境構築です。 ただ、Javaの場合はJDKIDEの準備さえしていてもらえれば、GradleWrapperが他は良いようにしてくれます。 してくれる。そう思っていた時期もありました。参加者が一斉にGradleWrapperを使えば……ダウンロード、すっごいですね。 全然終わりませんでした。

セッション順番を組み替えたり、Gradleを使わずにjarを添付する形にしたり、運用対処でなんとか凌いでハンズオン開始。 準備はできているので大丈夫だと思っていました。各ステップを細かくコミットしたブランチも作って「何かあってもこれを見てもらえばいける」くらいの気分。この準備は前日やる予定だったのですが、残念ながら私の土曜日は夢に飲み込まれたので、仕方なく会場についてから必死にやってました。でも間に合った、いけるつもりでした。

しかし、現実はそうは甘くありません。 本番はAPIサーバーをherokuに立てました。素振りはlocalhostでやりました。検証環境と本番環境が異なると問題が検出できないものです。 ですが素振りの他に、ほぼ同じように作成したサンプルは動作していたので、大丈夫だと思っていました。油断していたのです。

ただでさえ初心者を対象にしたハンズオン。 いくらサポート陣を揃えていても、予定通り進まないのはある程度仕方ありません。 この辺りは織り込み済みで、最悪最後まで行かなくても仕方ないかなーとも思っていました。

起こったコト

ハンズオンの最後の最後。ブラウザで入力したメッセージをつぶやく、よくあるフォーム入力を受け付けるところです。 そこに、以下のようなコードがありました。

Response res = new RestTemplete().postForObject(
        "http://xxxx.heroku.com/yyy",
        param,
        Response.class);

この子がエラーにならずに正常終了しているのに、APIサーバーにはPOSTできませんでした。ちなみにGETの方は普通に動いていたので、タチが悪い。

原因は xxxx.heroku.com/yyy が xxxx.herokuapp.com/yyy にリダイレクトされる動作になっている点。getForXxx はリダイレクトを平然と処理して、リダイレクト先の結果を返してきます。一方 postForXxx はリダイレクトは処理せず(POSTなのでリダイレクトしたらダメだよね)、そのまま301 Moved Permanentlyを空のbodyで受け取って終了しちゃっていました。 この結果になっていることが検出できずに処理は正常終了。最終的には「エラーにならないのに動かない」という不思議な事態となりました。 プロジェクターでスクリーンに画面を映しながら、頭抱えることに……。

結果的には終わる前に解決できて動いたので、それはそれで良いのですが。

言い訳タイム

herokuとかRestTempleteとか普段使ってないのがね……。

postForEntityで受けて、ResponseEntitystatusCodeを見れば判断つくのですが、postForObjectだと直接オブジェクトが生成されちゃうので、見るタイミングがありません。一応RestTemplateに拡張したErrorHandlerを差し込んで「201 Created 以外ならエラー」とかもできますが、どちらにせよ「初心者向けハンズオン」にあまり複雑なことは持ち込みたくはないので、知っていても入れなかったでしょう。(Springのハンズオンでは無いのです)

素振りの時点でherokuを使っておけば、herokuとherokuappの違いに気付けたかもしれません。アドレスを打つときに手打ちせずにコピペしていれば間違えませんでした。URIを手打ちせず、サンプルと同じく設定ファイルから @Value で取っておけば問題は起きなかったです。どれも実際は起こらなかった可能性ですが、助かる可能性もあるにはありました。

しかし、気付くタイミングや間違えないタイミングは全てスルーして問題は起きるものです。油断大敵……そこまでは結構うまくいってた(つもりな)だけに、残念感が酷かったです。

総括

とても楽しかった。今度から黒猫に横切られたら帰って寝る。

#AsiyanAutomationAlliance をやりました

kokucheese.com

第一回 AsiyanAutomationAlliance をや っています。現在進行中です。 りました!第二回AAAです。 運営なんですが、超寝坊しました。開始には間に合ったけど、運営業できてない。。。orz 最後まで運営らしいことできませんでした!!

イベント概要

Asiya最大の自動化イベントです。午前2セッション、午後から2トラックで6セッション、最後に1セッション。懇親会はビアバッシュでLT祭り。2トラックは「テスト自動化」と「自動化・ツール」で大きくわけてお送りしました。

自動家(オートメーター)大地に立つ!! 〜オールドタイプの一年戦争

出落ちが酷かったので、あんま大丈夫じゃなかった。 話はいつもの三浦一仁氏だったのでよかったのだけど……。話の裏のツイッターも面白かったので、雑にまとめました。

失敗したデモはLTでリトライ。さあどうなるか。

ギアと開発とわたし

読みたいなーと思ってたけどまだ買ってなかったので、話聞きながらポチった。

システムテスト自動化 標準ガイド (CodeZine BOOKS)

システムテスト自動化 標準ガイド (CodeZine BOOKS)

  • 作者: Mark Fewster,Dorothy Graham,テスト自動化研究会,伊藤望,玉川紘子,長谷川孝二,きょん,鈴木一裕,太田健一郎,森龍二,近江久美子,永田敦,吉村好廣,板垣真太郎,浦山さつき,井芹洋輝,松木晋祐,長田学,早川隆治
  • 出版社/メーカー: 翔泳社
  • 発売日: 2014/12/16
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (3件) を見る

話の中で数式の紹介があったのですけど、そのいじり方の紹介がとても面白かったです。噛み砕いて何かのネタにしたいなー。

まとめ

自動化と一言で言っても、それを使う相手によって求める部分は違うし、違って良いし、それに応えてこそ。自動化も普通の開発と同じところあるなー、というTABOK読書会で話してたことを再確認できたりしました。やばい、進歩ない私。

てことで、個人的なベストセッションは @moririring さんのでした。

非公開ひゃっはー。

MavenSurefirePluginのバージョンのメモ

前置き

プラグインのバージョンとかは上げるタイミングがあれば最新にする私ですが、設定によっては動かなくなったりして、一気に上げるのは厳しいこともあります。でもどこまで下げたらいいかわからなくて、やりたいことができるギリギリでお茶を濁すなんてのもよく見ます。細々としたバグフィックスとかも入ってるし、上げられるだけ上げた方がいいとは思うんだけど、そうも言っていられない現実もあります。

バージョンを上げなきゃと思った以上は、何かしら問題があった、もしくはやりたいことがあるんだと思う。てことでそのメモ。

てか個人的にはもうMaven使わないんだけどね。。。

各バージョンごとのメモ

surefire-plugin自体の機能にはあまり興味ない感じです。実行対象がそれなりに選べて、レポートがそれなりに出てくれれば十分。

2.9

Maven 3.0.5 のデフォルトバージョン。Mavenの3.0系の安定版を使って特になんてしてなかったらこれになる。これより下げることはないと思ってる。

2.11

なんかよく使われてる感じのするバージョン。なぜかは知らない。

2.12.1

昔の自分のエントリによると、JUnitProviderが変更されたバージョン。JUnitのCategoryを使用する場合の記述が簡略化できるようになっているので、Category使うならこれ以降で。

2.12.3

日本語テストメソッド名を使用したテストレポートなどがユニコードエスケープされて出てきちゃう問題が解消された。日本語テストメソッダー(このエントリのみの独自用語)には重要なバージョン。

2.12.4

現時点の最新である Maven 3.3.3 で使用されるデフォルトバージョン。特に気にしてなかったらこれになるか? 2.12系の最終でもあるし、2.12.xを使うならここまで上げても問題にはならないと思ってるので、2.12.1とかで中途半端に止める理由はないでしょね。

2.13近辺

なんかパラレル周りの対応が目立つのがこの辺。

2.14.1

2.14でうっかりFileWriterとか使ちゃったせいで、TEST-*.xmlがシステムのエンコード使うようになっちゃってたのが直ったりしてます。出たばっかりの2.14を使ってリアルタイムに踏んだのはいい思い出。とりあえず、2.14系で止めるなら2.14.1にしたほうが良いです。

2.15

Java SE 1.4 以前を切り捨てたバージョン。そちらの方々はこれ以降は使えません。

2.17

Java SE 8 の対応が入り始めた頃。

まとめ

とりあえず最新使って、なんか詰まったらISSUE上げるとか騒ぐとかしましょう。(そんなこと書いてない) あ、このブログ書いてる時点の最新は2.18.1です。