<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>sue445&apos;s Blog</title>
        <link>http://blog.sue445.net/</link>
        <description>日記です</description>
        <language>ja</language>
        <copyright>Copyright 2012</copyright>
        <lastBuildDate>Sun, 15 Jan 2012 23:15:38 +0900</lastBuildDate>
        <generator>http://www.sixapart.com/movabletype/</generator>
        <docs>http://www.rssboard.org/rss-specification</docs>
        
        <item>
            <title>2011年に読んだ技術書まとめ</title>
            <description><![CDATA[去年の目標で「1年間に技術書を30冊読む」というのを掲げていた気がするのでまとめてみました（日付は<a href="http://booklog.jp/users/sue445">ブクログ</a>に書いていた読了日ですが間違ってるかも）
<div><br /></div><div><ol><li>1/10?: クリーンコード</li><li>1/10?: プログラマが知るべき97のこと</li><li>1/24: アジャイルプラクティス</li><li>2/12: 達人プログラマー</li><li>2/16: オープンソース徹底活用 Slim3によるウェブWebアプリケーション開発</li><li>2/18: Javaルールブック</li><li>2/28: プログラミング Google App Engine</li><li>3/7: WEB+DB PRESS vol.61</li><li>3/14:&nbsp;ソフトウェアアーキテクトが知るべき97のこと</li><li>4/2:&nbsp;アーキテクトの審美眼</li><li>4/15: 初めてのJavaScript</li><li>5/1: jQuery クックブック</li><li>5/10:&nbsp;作ればわかる！Google App Engine for Javaプログラミング</li><li>5/14:&nbsp;Java: The Good Parts</li><li>5/31:&nbsp;レガシーコード改善ガイド</li><li>6/9:&nbsp;エンジニアのための時間管理術</li><li>7/4:&nbsp;Java並行処理プログラミング</li><li>7/16: ビューティフルコード</li><li>7/22: Twitter API ポケットリファレンス</li><li>7/26: WEB+DB PRESS vol.63</li><li>8/2:&nbsp;テスト駆動開発入門</li><li>8/9:&nbsp;リファクタリング・ウェットウェア</li><li>8/18:&nbsp;アジャイルサムライ</li><li>8/22:&nbsp;Maven (開発者ノートシリーズ)</li><li>9/8: 実用Git</li><li>10/8:&nbsp;Being Geek</li><li>11/16:&nbsp;プログラミング言語Java&nbsp;</li><li>11/18:&nbsp;Jenkins実践入門</li><li>12/1:&nbsp;ソフトウェアテスト技法ドリル</li><li>12/18:&nbsp;入門Git</li><li>12/24:&nbsp;アジャイルソフトウェア開発の奥義</li></ol><div>ギリギリ目標達成ってとこですね。</div><div><br /></div><div>今年は１年間で40冊目標でいきたいと思います</div></div>]]></description>
            <link>http://blog.sue445.net/archives/2012/01/15-2315.html</link>
            <guid>http://blog.sue445.net/archives/2012/01/15-2315.html</guid>
            
            
            <pubDate>Sun, 15 Jan 2012 23:15:38 +0900</pubDate>
        </item>
        
        <item>
            <title>年初の目標を振り返ってみる</title>
            <description><![CDATA[年初の<a href="http://blog.sue445.net/archives/2011/01/08-1601.html">今年の目標</a>を見つけたので振り返ってみるテスト<div><br /></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;入院しない：元気があれば何でもできる！</span></div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">→</span><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">入院しなかった！</span></font></div><div><div style="text-align: left;"><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;"><br /></span></font></div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;体重50kg超え：何年間連続同じ目標だｗ</span></div><div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">→</span><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">×：現在体重47kgくらい。あとちょっとが超えられない俺ナッシュ</span></font></div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; "><br /></span></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;Google App Engineで何か作る：ネタはあるので</span></div><div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">→</span><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">○：今年は<a href="http://jubeatplusplus.appspot.com/">jubeat++</a>や<a href="http://azusaar.appspot.com/">AZusaar!</a>がメインでした。</span></font></div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; "><br /></span></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;AndroidアプリかiPadアプリを作る：同上</span></div><div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">→</span><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">×：Titaniumの本を買って環境構築するところまではやったんですがorz</span></font></div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; "><br /></span></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;社会人3年目ということで会社に引きこもらずにどんどん外に出る</span></div><div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">→</span><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">○：社内と社外合わせると今年1年間で合計30個くらい参加していました（うち、自分がなんらかの形で発表したものは5個くらい）。去年の自分に比べたらアグレッシブに行動できた方じゃないかと思います</span></font></div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; "><br /></span></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">&gt;OCJ-D(旧SJC-D)をとる：問題集はおろか公式にもろくな情報がねえｗ</span></div><div style="text-align: left;"><font color="#36414d" face="Verdana, Arial, sans-serif"><span style="line-height: 19px;">→×：いつも心の片隅で考えてはいたんですが、いつか調べた時にswingでコード提出というのが気になって結局やらずじまい。試験範囲もぼんやりとしすぎてるためぶっちゃけSJC-WCだけでよくね？という結論に。</span></font></div><div><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; "><br /></span></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/12/25-0300.html</link>
            <guid>http://blog.sue445.net/archives/2011/12/25-0300.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">HP</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ネタ</category>
            
            
            <pubDate>Sun, 25 Dec 2011 03:00:47 +0900</pubDate>
        </item>
        
        <item>
            <title>RPGツクールXP セーブデータ改変ツール Professionalをフリーウェアにしました</title>
            <description><![CDATA[<div><a href="http://www.sue445.net/downloads/rpgxpsav.html">RPGツクールXP セーブデータ改変ツール Professional</a>&nbsp;を今まで1000円のシェアウェアで公開していましたが、いろいろ思うところがあったのでフリーウェアにしました。</div><div><br /></div><div>理由のいくつか</div><div><br /></div><div><ul><li>初版から5年も経つから</li><li>しかも最後のアップデートから丸2年放置</li><li>Windowsアプリ開発に対する熱意が前に比べてだいぶ落ちた<br />（ここ1?2年くらいはwebアプリしか作ってないです・・・）</li><li>ろくにサポートしてない状態で有償として提供しておくことの罪悪感</li><li>数年前にPCを買い換えた時にアクティベーションの関係でRPGツクールXPが起動しなくなったｗ<br />（購入直後にユーザ登録してれば大丈夫だったんですがねぇ）</li><li>盆正月の帰省時に一時的にシェアウェアを無効化するのが地味に面倒</li><li><strike>メールが来たらライセンスキーを返信するお仕事はもういやだお・・・</strike></li></ul></div><div><br /></div><div>まぁこんなところですかね。</div><div><br /></div><div>サポートに関しては今まで通り（半分放置気味）で。</div><div><br /></div><div><br /></div><div>返金に関しては今のところ考えていません。直近1ヶ月以内に購入された方に関してはどうしてもという場合には返金を考えてはないですが、VectorやAnyWare+の手数料を差し引いた分からさらにこちらからの振込手数料を差し引いたら雀の涙程度の金額が残りそうにないことを考えると乗り気じゃないです。</div><div><br /></div><div>参考：</div><div><ul><li>Vectorシェアレジの場合：1000円 - 150円(手数料15%) = 850円</li><li>AnyWare+の場合：1000円 - 200円(手数料20%) = 800円</li></ul><div>他行宛の銀行振込だと手数料が200円前後かかるので返金しようとしたらそこからさらに差し引かれます。</div></div><div>500?600円ぽっちですがどうしても返金してほしい（かつ、僕に銀行口座を教えてもいい）場合メールで個別対応します。</div><div><br /></div><div><a href="http://www.sue445.net/cgi-bin/s_mail/index.html">メールフォーム</a>に下記を記入して送信してください（〆切は2012年1月末日）</div><div><br /></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>【購入時期】　</div><div>（基本的に2011年11~12月中に購入された方が対象）</div><div>【ユーザー名】</div><div>【メールアドレス】</div><div>【ユーザーID】</div><div>【銀行口座】</div><div>（三井住友銀行なら手数料かからないのでベスト）</div></blockquote><div><br /></div><div><br /></div><div><br /></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/12/25-0240.html</link>
            <guid>http://blog.sue445.net/archives/2011/12/25-0240.html</guid>
            
            
            <pubDate>Sun, 25 Dec 2011 02:40:51 +0900</pubDate>
        </item>
        
        <item>
            <title>AZusaar!がMashupAwardを受賞しました</title>
            <description><![CDATA[12/11(日)に<a href="http://ma7.mashupaward.jp/">Mashup Awards 7</a>の授賞式に参加し、<a href="http://azusaar.appspot.com/">AZusaar!</a>&nbsp;がジオどす賞を受賞しました。<div><br /></div><div>ジオどすAPIを使ってる作品が全部で4作品だけしかなかったため、最初受賞の連絡がきた時はうすうすこの賞かなぁとは思ってましたｗ</div><div><div><br /></div><div><a href="http://ma7.mashupaward.jp/results">選考理由</a>の</div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><br /></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><span style="font-family: 'ＭＳ Ｐゴシック', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Osaka; font-size: 12px; line-height: 18px; text-align: left; ">ジオどすの「ジオコーダ前処理API」は、京都の住所用と思われがちですが、その他の住所でも「ビル名等を判断して削除」する機能があります。</span></div><div><span style="font-family: 'ＭＳ Ｐゴシック', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Osaka; font-size: 12px; line-height: 18px; text-align: left; ">ATND、こくちーずなど、「セミナー」という性質上、ビル名・部屋名は必須情報であり、それが地図の自動表示を邪魔していることが非常に多くあります。</span></div><div><span style="font-family: 'ＭＳ Ｐゴシック', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', Osaka; font-size: 12px; line-height: 18px; text-align: left; ">この作品では、対象サイトの地図が住所検索に失敗してアフリカ沖を指している（緯度経度が0度）イベントに対しても、きちんと近隣のホテル検索が機能していました。これはイベントの住所をジオどすの「前処理API」を通した上でジオコーディングしていて、まさに本APIが本領発揮できる場所で使って頂いたことを高く評価いたしました。</span></div></blockquote><div><br /></div><div>を読んでちょっと感動。<a href="http://geodosu.com/">ジオどすAPI</a>は結構便利なのでジオエンコーディング（住所から緯度経度を算出）をするのなら使って損はないと思います。</div></div><div><br /></div><div>授賞式の様子。</div><div><a href="http://www.ustream.tv/recorded/19071855">Ustream.tv: ユーザー MashupAwards: Mashup Awards 7 授賞式, Recorded on 11/12/11. Web</a></div><div><br /></div><div>僕は1:36:00付近に映ってます。受賞台の上であずにゃんペロペロしたのは当日の思いつきです。iPadって便利ですねぇｗ</div><div><br /></div><div>貰った物</div><div><br /></div><div>賞状</div><div><a href="http://blog.sue445.net/archives/2011/12/15/MA7_1.png"><img alt="MA7_1.png" src="http://blog.sue445.net/archives/assets_c/2011/12/MA7_1-thumb-200x266-17.png" width="200" height="266" class="mt-image-none" /></a></div><div><br /></div><div>副賞の舞妓さん無料体験券</div><div><a href="http://blog.sue445.net/archives/2011/12/15/MA7_2.png"><img alt="MA7_2.png" src="http://blog.sue445.net/archives/assets_c/2011/12/MA7_2-thumb-200x150-19.png" width="200" height="150" class="mt-image-none" /></a></div><div><br /></div><div>今流行りの男の娘ですねｗ　京都に行くとしたら3月か5月の連休かなぁ・・・</div><div><br /></div><div>その他、Tシャツや各種ノベリティを貰いました。</div><div><br /></div><div><br /></div><div>今回の賞は自分だけの力だけで獲れたというわけではなく、<span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">かわいいあずにゃんを描いてくれた</span><a href="http://nominomi323.blog.fc2.com/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; color: rgb(0, 102, 153); text-decoration: none; line-height: 19px; text-align: left; ">のみあっきゅさん</a><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">（</span><a href="https://twitter.com/#!/akkyu323" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; color: rgb(0, 102, 153); text-decoration: none; line-height: 19px; text-align: left; ">@akkyu323</a><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">）とデザイン修正をしてくださった</span><a href="http://hossy.info/" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; color: rgb(0, 102, 153); text-decoration: none; line-height: 19px; text-align: left; ">ほっしーさん</a><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">（</span><a href="https://twitter.com/#!/hossie" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; color: rgb(0, 102, 153); text-decoration: none; line-height: 19px; text-align: left; ">@hossie</a><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">）、各種APIを提供してくださった企業様、</span><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">普段参加しているGoogle App Engineの勉強会（appengine ja night）のナレッジ</span><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; text-align: left; ">のおかげだと思います。</span></div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><br /></span></div><div style="text-align: left;"><span style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">本当にありがとうございます！</span></div><div><br /></div><div>来年こそは100万円を獲りたいところ。（それ以前にネタを思いつくかどうか怪しいですがｗ）</div><div><br /></div><div>【2012/1/7追記】</div><div>授賞式の写真がupされました</div><div><a href="http://mashupawards.tumblr.com/post/15436635038/12-11-ma7-4-3">http://mashupawards.tumblr.com/post/15436635038/12-11-ma7-4-3</a>
</div>]]></description>
            <link>http://blog.sue445.net/archives/2011/12/15-2210.html</link>
            <guid>http://blog.sue445.net/archives/2011/12/15-2210.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ネタ</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">gaeja</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">MA7</category>
            
            <pubDate>Thu, 15 Dec 2011 22:10:06 +0900</pubDate>
        </item>
        
        <item>
            <title>実録！TDD風景 #TddAdventJp</title>
            <description><![CDATA[<a href="http://atnd.org/events/22027">TDD Advent Calendar jp: 2011</a>&nbsp;の6日目で <a href="http://d.hatena.ne.jp/shuji_w6e/20111204/1323011355">@shuji_w6e さんのエントリ</a>の次です。<div><br /></div><div>他の人のエントリと比べると内容がかなりぶっとんでいるのであしからず（笑）<br /><div><br /><div><div>TDDを学ぶ上で何が一番いいなぁと考えたのですが、実際にコーディングしている風景を見るのがいいかと思い動画を撮ってみました。既出かどうかはシラネ</div><div><br /></div><div><iframe width="560" height="315" src="http://www.youtube.com/embed/tG33PAHqN0I" frameborder="0" allowfullscreen=""></iframe></div><div><br /></div><div>今回はTDDBC横浜のお題でTDDしてみました（言語はJava）</div><div><a href="http://www.slideshare.net/setoazusa/tddbc">http://www.slideshare.net/setoazusa/tddbc</a></div><div><br /></div><div><b>コード</b></div><div><div><div><a href="https://github.com/sue445/tdd-advent-caledar-2011">https://github.com/sue445/tdd-advent-caledar-2011</a></div></div></div><div><br /></div><div>本来なら課題4までやっていたのですが動画が途中で壊れていたので課題2まで収録しています。（githubには課題4まで収録）</div><div><br /></div><div><div></div></div><div>不自然に間が空いているのは途中何度もサブPCでググったりしてるからです。一発撮り無編集なのであしからず。</div><div>実際のコーディング風景からTDDのリズムを感じ取ってもらえれば幸いです。</div><div><br /></div><div>Quick JUnitではなくS2JUnit4 Pluginを使っていますが、使い方はだいたい一緒です。仕事がSeasar2中心なのでその流れでWinにはS2JUnit Pluginを入れています。（MacにはQuick JUnitだけどｗ）</div><div><br /></div><div>キー入力表示には拙作の「見えるキーボード」を利用しています。</div><div><a href="http://www.vector.co.jp/soft/win95/edu/se458963.html">http://www.vector.co.jp/soft/win95/edu/se458963.html</a></div><div><br /></div><div><br /></div><div>よく使うEclipseのショートカット（Macの人はCtrlをCommandに読み替えてください）</div><div><br /></div><div><ul><li><b>Ctrl + Space</b>: コード補完<ul><li>「tes」まで入れるとテストメソッドのテンプレートが作れる</li><li>カーソル位置がそのままだとJUnit3用のテストメソッド（testXxxxメソッド）</li><li>カーソルを1つ上に移動させるとJUnit4用のテストメソッド（@Testメソッド）</li></ul></li><li><b>Ctrl + 1</b>: クイックフィックス。その場に応じた補完ができる<ul><li>エラーや警告があればそれを解決</li><li>テストファーストで先にテストケースだけ作り、必要なメソッドがない状態でコンパイルエラーにしておいた状態からメソッドを作るのは日常茶飯事</li><li>メソッドの戻り値をローカル変数やフィールド変数に代入</li><li>とにかくいろいろできるすぎるのでとりあえず困ったらCtrl + 1しておくと吉</li></ul></li><li><b>Ctrl + Shift + O</b>: インポートの編成。足りないimport文や余分なimport文の整理ができる</li><li><b>Alt + Shift + R</b>: クラス名、メソッド名、変数名などの変更。<ul><li>直接参照している箇所はもとより、Javadocの中も全部まとめて変更できるので超便利</li><li>ただしリフレクションで参照してるのは無理なので、リファクタリングのことを考えるとリフレクションは極力使わない方がいい</li></ul></li><li><b>Alt + Shift + L</b>: 選択範囲をローカル変数に抽出</li><li><b>Alt + Shift + M</b>: 選択範囲をメソッド抽出</li><li><b>Alt + Shift + I</b>: インライン展開。ローカル変数抽出やメソッド抽出の逆</li></ul></div><div>右クリック→リファクタリングは便利なコマンドが揃ってるので、一度全部使ってみてどんなことができるか確認してみるといいです。</div><div><br /></div><div><br /></div><div>以下はQuick JUnit or S2JUnit plugin専用（JavaでEclipseでTDDやる上ではどちらかは必須）</div><div><br /></div><div><ul><li><b>Ctrl + 0</b>: テスト実行（テストメソッド内であればそのメソッドだけ、それ以外ならテストクラス全体）</li><li><b>Ctrl + 9</b>: テスティングペアの移動。なければ新規作成ダイアログ</li></ul></div><div><br /></div><div>その他や詳しいショートカットはこちらが参考になります</div><div><a href="https://sites.google.com/site/shin1ogawa/eclipse">https://sites.google.com/site/shin1ogawa/eclipse</a></div><div><br /></div><div><br /></div><hr><div>自分がTDDをやり始めて1年くらい経つのでついでに雑感など。</div><div><br /></div><div>そもそも自分の場合、初めからTDDをやろうとしてたわけじゃないです。</div><div>前のPJとかその前のPJとかでテストコードをほとんど書いてなくて苦労してた苦い経験があり、丁度新しいPJということで今度は何が何でもがっつりテストコードを書こうと勝手に決心したのが始まりです。</div><div><br /></div><div>その頃はTDDという言葉は知っていても具体的にどんなことかは知らず、ただ闇雲にテストを書きやすい開発スタイルを追求していったら自然とTDDのRed→Green→Refactoringの黄金の回転らしきものが見についていました。</div><div><br /></div><div>※たぶん同時期にリファクタリングやクリーンコードも読んでいたと思いますが、「テストコードのリファクタリング」という言葉を知らない時期に書いたテストコードはいい加減リファクタリングしたいです。（この間リファクタリングして1クラス4000行から3000行くらいには減ったけどｗ）</div><div><br /></div><div>そして実際にTDD BootCampに参加し和田さんの講演を聞いたり実際にペアプロをやったりして、自分の開発スタイルがTDDであることを再認識し自信をもつ頃が出来ました。</div><div><br /></div><div>5年後とか10年後とか先のことは分かりませんが、とりあえず現時点で自分に一番相性のいい開発スタイルはTDDなので飽きるまではこのスタイルで行くと思います。</div><div><br /></div><div><br /></div><div>まぁ、何が言いたいかと言うと</div></div></div><div><br /></div><div><font class="Apple-style-span" style="font-size: 1.953125em; ">べ、べつに好きでTDDをやっているんじゃないんだからね！///</font></div><div><br /></div><div>ということです（ぇー</div><div><br /></div><div>次は <a href="http://d.hatena.ne.jp/t-wada/20111207/coverage_is_your_friend">@t_wada さんのエントリ</a>です</div></div><div><br /></div><div><br /></div>


<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=sue445net-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=4894712288" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=sue445net-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=4048676881" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
]]></description>
            <link>http://blog.sue445.net/archives/2011/12/06-0000.html</link>
            <guid>http://blog.sue445.net/archives/2011/12/06-0000.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Java</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ネタ</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">TddAdventJp</category>
            
            <pubDate>Tue, 06 Dec 2011 00:00:00 +0900</pubDate>
        </item>
        
        <item>
            <title>Memcacheに1MB以上のオブジェクトを格納する</title>
            <description><![CDATA[<a href="http://azusaar.appspot.com/">AZusaar!</a>&nbsp;ではDatastoreからとってきた検索結果を100件ずつMemcacheに入れているのですが、最近ちょっとDatastore Reads Oppsが増えてきました。<div><br /></div><div><a href="http://blog.sue445.net/archives/2011/11/30/Image1.png"><img alt="チューニング前" src="http://blog.sue445.net/archives/2011/11/30/Image1.png" class="mt-image-none" /></a></div><div><br /></div><div>これが一番多かった時ですが、$0.11/日課金されてます。普通だとFrontEnd InstanceやDatastore Writesで課金がかかると思うんですがうちの場合これらは余裕ですｗ</div><div><br /></div><div>これくらいなら微々たるものなのですがなんとかチューニングできないかと課金対策してみました。</div><div><br /></div><div>とりあえず検索結果を100件ずつではなく全件Memcacheに入れるようにしたところ、下記のようなエラーが発生。</div><div><br /></div><div><pre class="ae-logs-expanded ae-pre-wrap" style="white-space: pre-wrap; word-wrap: break-word; padding-top: 0.3em; padding-bottom: 0.5em; padding-left: 1.5em; margin-bottom: 0px; font-family: 'Courier New'; color: rgb(0, 0, 0); line-height: 19px; text-align: left; background-color: rgb(233, 233, 233); ">Uncaught exception from servlet
com.google.appengine.api.memcache.MemcacheServiceException: Memcache put: Error setting single item (dev20111122.354967843445918452_KokucheeseSearchService__ALL_201111)
	at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl$7.transform(AsyncMemcacheServiceImpl.java:427)
	at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl$7.transform(AsyncMemcacheServiceImpl.java:419)
	at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.convertResponse(MemcacheServiceApiHelper.java:59)
	at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.wrap(MemcacheServiceApiHelper.java:98)
	at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.wrap(MemcacheServiceApiHelper.java:92)
	at com.google.appengine.api.utils.FutureWrapper.wrapAndCache(FutureWrapper.java:57)
	at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:98)
	at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
	at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:27)
	at com.google.appengine.api.memcache.MemcacheServiceImpl.put(MemcacheServiceImpl.java:79)
	at org.slim3.memcache.MemcacheDelegate.put(MemcacheDelegate.java:551)
	at org.slim3.memcache.Memcache.put(Memcache.java:361)</pre></div><div><br /></div><div>エラーメッセージからは分かりづらいですが、Memcacheに入れようとしたデータが1MB超えているためのエラーのようです。（実際計算したら1.3MBくらいでした）<br /></div><div><br /></div><div>シリアライズした状態のバイナリは実は全然圧縮されていないため、gzip圧縮かけてMemcacheに入れるためユーティリティを作りました。</div><div><br /></div><div><a href="https://github.com/sue445/diary/tree/master/20111130">https://github.com/sue445/diary/tree/master/20111130</a></div><div>(appengine 1.6.0, slim3 1.0.15で確認済)</div><div><br /></div><div>使い方はテストコードを見ればだいたい分かると思いますが、Slim3のMemcacheとだいたい同じです。</div><div>注意点としてはrootPackage配下に置いておかないとhotReloading時にエラーになること。</div><div><br /></div><div>気になるProduction Server上でのパフォーマンスはこんな感じです。</div><div><br /></div><div><b>put時 (1.3MB -&gt; 286KB)</b></div><div><div>serialize:53ms</div><div>compress:121ms</div></div><div><br /></div><div><b>get時&nbsp;(286KB -&gt;&nbsp;1.3MB)</b></div><div><div>uncompressed:55ms</div><div>deserialize:19ms</div></div><div><br /></div><div>※データの大部分がStringなので結構圧縮率が高いです</div><div><br /></div><div>圧縮や再シリアライズによる多少のオーバーヘッドはありますがこれくらいなら許容範囲かと。</div><div>体感的にもそんなに変わってないです。</div><div>他のライブラリに依存していないのでspin upによるコストもありません。</div><div><br /></div><div>普通だと圧縮してまでMemcacheに入れるということはあまりないと思いますが、もしどうしても1つのデータとしてMemcacheに入れたい場合はこういう方法もあるといういい例ですね。</div><div><br /></div><div>このチューニングを施した後は見事Datastore Readsを$0に抑えることができました。わーい！</div><div><img alt="チューニング後" src="http://blog.sue445.net/archives/2011/11/30/Image3.png" width="575" height="620" class="mt-image-none" /></div><div><br /></div><div><br /></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/11/30-2300.html</link>
            <guid>http://blog.sue445.net/archives/2011/11/30-2300.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Java</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">gaeja</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">slim3</category>
            
            <pubDate>Wed, 30 Nov 2011 23:00:53 +0900</pubDate>
        </item>
        
        <item>
            <title>AZusaar!でMA7の授賞式に参加することになりました</title>
            <description><![CDATA[前回のブログで書いていた<a href="http://blog.sue445.net/archives/2011/10/22-0025.html">AZusaar!</a>ですが、<a href="http://ma7.mashupaward.jp/">Mashup Awards 7</a>の一次審査は落ちたもののどこかの賞にひっかかったらしく授賞式に出席することになりました。具体的な賞に関しては12/11の授賞式当日までのお楽しみらしいです。<div><br /></div><div>プログラムに関しては全部自分でやりましたが、やはりかわいいあずにゃんを描いてくれた<a href="http://nominomi323.blog.fc2.com/">のみあっきゅさん</a>（<a href="https://twitter.com/#!/akkyu323">@akkyu323</a>）とデザイン修正をしてくださった<a href="http://hossy.info/">ほっしーさん</a>（<a href="https://twitter.com/#!/hossie">@hossie</a>）のおかげです。超感謝！</div><div><br /></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/11/24-2013.html</link>
            <guid>http://blog.sue445.net/archives/2011/11/24-2013.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ネタ</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">AZusaar</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">MA7</category>
            
            <pubDate>Thu, 24 Nov 2011 20:13:28 +0900</pubDate>
        </item>
        
        <item>
            <title>総合イベント検索サービス「AZusaar」をMashup Awards 7に応募しました</title>
            <description><![CDATA[<div>「総合イベント検索サービス」ってのは今考えました＜挨拶</div><div><br /></div><div><ul><li>AZusaar!<br /><a href="http://azusaar.appspot.com/">http://azusaar.appspot.com/</a></li><li>AZusaar! | Mashup Awards 7 (#MA7)<br /><a href="http://ma7.mashupaward.jp/works/119?locale=ja">http://ma7.mashupaward.jp/works/119?locale=ja</a></li></ul></div><div><br /></div><div>というわけでMashup Awardsに応募してみました。</div><div><br /></div><div><br /></div><div>エンジニア界隈で比較的メジャー（？）な<a href="http://atnd.org/">ATND</a>, <a href="http://www.zusaar.com/">Zusaar</a>, <a href="http://kokucheese.com">こくちーず</a>, <a href="http://partake.in/">PARTAKE</a>を一度に検索できるようにしました。遠征クラスタのために会場近くのホテルも検索できます。</div><div><br /></div><div>名前の由来は「ATND + Zusaar = AZusaar → あずにゃんペロペロ〜（＾ω＾）」です。</div><div>このネタのためだけにフォロワーの人にペロペロできるあずにゃんの絵を描いてもらいましたｗ</div><div><br /></div><div><br /></div><div>今回自分なりの新しい試みとしてフルAjaxでやってます。</div><div>サーバサイドではjsonを返すだけのシンプルな設計にして、画面は全部JavaScriptで動的に生成。フロントエンドのコード比率はJava : JavaScript = 1 : 9 といったところでしょうか。cronはJavaで泥臭くやっていますがｗ</div><div><br /></div><div>以前<a href="http://blog.sue445.net/archives/2011/09/26-2223.html">TDD BootCamp 札幌2.1</a>の講演した時に「spin upと戦うためにはAjaxを使うしかない」と言いましたが、その集大成がこれですね。自分で言うのもなんですがappengineの長所を最大限生かしてると思いますｗ</div><div><br /></div><div>あと、今回はGoogle App Engineの他に一部Herokuも併用しています。本当ならappengineで全部やってしまいたかったのですが、一部APIをappengineのProductionサーバからを叩くとエラーになるため仕方なくAPI用のHerokuでサーバを立てました。（LocalサーバやProductionサーバのktrwjrなら問題ないんですが、URLから叩くとタイムアウトエラーに・・・）</div><div><br /></div><div>大賞100万円と贅沢は言わないので、せめてどっかの賞にひっかかってくれるといいんですががが</div>]]></description>
            <link>http://blog.sue445.net/archives/2011/10/22-0025.html</link>
            <guid>http://blog.sue445.net/archives/2011/10/22-0025.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">ネタ</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">gaeja</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">heroku</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">MA7 AZusaar</category>
            
            <pubDate>Sat, 22 Oct 2011 00:25:25 +0900</pubDate>
        </item>
        
        <item>
            <title>indexの更新遅延を考慮した実装を行う</title>
            <description><![CDATA[<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">実はバリデータ関係でちょっと問題があったりします</div></span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><a href="http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B/src/main/java/tddbc/sapporo/validator/TitleDuplicateValidator.java" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; color: rgb(0, 102, 153); text-decoration: none; ">http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B/src/main/java/tddbc/sapporo/validator/TitleDuplicateValidator.java</a></div></span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">これは会議室の名前の重複をチェックするバリデータですが、appengine固有の問題により正常に動きません。</div></span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">ユニットテストでも問題ないため最悪本番稼動した後に発覚する一番質の悪いバグですね。これに関してはまた別の機会に書きます。</div></span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">（これはappengineで何らかのサービスを運営してしてないと気づかないかなぁと）</div></span></blockquote><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><a href="http://blog.sue445.net/archives/2011/09/26-2223.html">前回のブログ</a>でこんなことを書いてましたが解答編です。タイトルにもあるように、インデックスの更新遅延が原因でバリデータは正常に動きません。（appengineじゃなかったらこういう問題はおきないんですがねｗ）</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">Entity自体はすぐにDatastoreに反映されるのですが、indexの更新には若干ラグがあります。厳密に調べたことはありませんがひどい時で1?2時間くらいindexが更新されなかったことがあります。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">検索系は多少古い検索結果が返ってくることを許容することでいけますが、データの整合性に関してはそうもいきません。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">例えば今回の場合だと登録するタイミングによっては同一名の会議室が存在する可能性があります。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">よってindexやqureyを利用しない重複チェックを使用することになります。解決方法としては2つあります</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><b>1. keyに会議室の名前を入れる</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">keyはuniqueなのでこれがベストですね</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><b>2.&nbsp;Datastore.putUniqueValueを利用する</b></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; "><br /></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: Verdana, Arial, sans-serif; ">keyを利用するのがベストなんですが、運用中で容易にkeyを変えられないという場合があります。また、key以外の要素でもuniqueな要素を持たせたいというのはあると思います。</div></span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">そういう場合はSlim3の</span><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; ">Datastore.putUniqueValueを利用するのがいいです</span><div><span class="Apple-style-span" style="color: rgb(54, 65, 77); font-family: Verdana, Arial, sans-serif; line-height: 19px; "><a href="http://slim3.googlecode.com/svn/trunk/slim3/javadoc/org/slim3/datastore/Datastore.html#putUniqueValue(java.lang.String, java.lang.String)">http://slim3.googlecode.com/svn/trunk/slim3/javadoc/org/slim3/datastore/Datastore.html#putUniqueValue(java.lang.String, java.lang.String)</a></span></div><div><br /></div><div>これはソースを見ててたまたま見つけたやつなんですが、uniqueな名前を管理するためのEntityを1つ作ってしまうというやり方です。valueをDatastoreのkeyにしているので原理的には1と全く同じです。</div><div><br /></div><div>サンプルコード</div><div><br /></div>
<pre name="code" class="java">import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import org.junit.Test;
import org.slim3.datastore.Datastore;
import org.slim3.tester.AppEngineTestCase;

public class PutUniqueValueTest extends AppEngineTestCase{

    private static final String UNIQUE_INDEX_NAME = "ConferenceRoomName";

    @Test
    public void test() throws Exception {
        boolean actual1 = Datastore.putUniqueValue(UNIQUE_INDEX_NAME, "会議室A");
        assertThat(actual1, is(true));

        // 重複登録しようとするとfalseが返却される
        boolean actual2 = Datastore.putUniqueValue(UNIQUE_INDEX_NAME, "会議室A");
        assertThat(actual2, is(false));

        assertThat(tester.count(UNIQUE_INDEX_NAME), is(1));
    }

}
</pre>]]></description>
            <link>http://blog.sue445.net/archives/2011/10/01-2200.html</link>
            <guid>http://blog.sue445.net/archives/2011/10/01-2200.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">TDD</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">gaeja</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">slim3</category>
            
                <category domain="http://www.sixapart.com/ns/types#tag">tddbc</category>
            
            <pubDate>Sat, 01 Oct 2011 22:00:10 +0900</pubDate>
        </item>
        
        <item>
            <title>TDD Boot Camp 札幌 2.1に参加してきました</title>
            <description><![CDATA[ブログを書くまでがTDDBCです（挨拶）<div><br /></div><div><a href="http://atnd.org/events/19892">TDD Boot Camp 札幌 2.1</a>に参加してきました</div><div><br /></div><div>福岡、東京1.5に続いて3回目の参加。</div><div>丁度この時期はまだ暑いだろうから避暑も兼ねていたのですが、東京も以外に涼しかったらしいorz</div><div>（ちなみに札幌はストーブをつけるレベルの寒さでしたが）</div><div><br /></div><div>詳しいまとめサイト</div><div><ul><li><a href="http://d.hatena.ne.jp/shuji_w6e/20110926/1317006697">TDDBC 札幌 2.1 開催しました - やさしいデスマーチ&nbsp;</a></li><li><a href="http://togetter.com/li/192148">TDD BootCamp 札幌 2.1 #TDDBC - Togetter&nbsp;</a></li></ul></div><div><br /></div><div><br /></div><div>思い出しレベルで記載</div><div><br /></div><div><b>9/23(金)</b></div><div>夕方くらいの飛行機で札幌入り。</div><div>札幌駅に降りた辺りで自分だけ半袖だったので奇異の目で見られました（吐血）</div><div><a href="http://twitter.com/#!/shuji_w6e">@shuji_w6eさん</a>が開催してた<a href="http://atnd.org/events/19895">Jenkins勉強会</a>に懇親会から参加。</div><div>飛行機のチケットとるときのこれの開催を知ってればJenkins勉強会にも参加してたのにorz</div><div><br /></div><div><b>9/24(土)</b></div><div>TDDBC本番。JavaのTAとして参加。</div><div>4人チームでしたが、自分は基本的にコーディングをせずアドバイスやリファクタリングに徹してました。</div><div>（事前に予習をしてて完成形が分かっていたため）</div><div><br /></div><div>ちなみにこれが自分たちのチームの成果物です</div><div><a href="http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B">http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B</a></div><div><br /></div><div>実はバリデータ関係でちょっと問題があったりします</div><div><a href="http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B/src/main/java/tddbc/sapporo/validator/TitleDuplicateValidator.java">http://kanon.deathmarch.jp/trac/TDDBC/browser/Java_B/src/main/java/tddbc/sapporo/validator/TitleDuplicateValidator.java</a></div><div>これは会議室の名前の重複をチェックするバリデータですが、appengine固有の問題により正常に動きません。</div><div>ユニットテストでも問題ないため最悪本番稼動した後に発覚する一番質の悪いバグですね。これに関してはまた別の機会に書きます。</div><div>（これはappengineで何らかのサービスを運営してしてないと気づかないかなぁと）</div><div><br /></div><div>ついでにLTもさせてもらいました。</div><div><br /></div><div>僕が作っているjubeat++を元にappengineやslim3などの紹介をしています。</div><div>TDDBCなのにテスト成分がほとんどないことに終わった後に気づいた。（先週社内勉強会で発表した時の資料をベースにしてるしｗ）</div><div><a href="http://jubeatplusplus.appspot.com/">http://jubeatplusplus.appspot.com/</a></div><div><br /></div><div><b>資料</b></div><div style="width:425px" id="__ss_9378944"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/sue445/tddbc-sapporo" title="appengine活用事例資料@TDDBC札幌2.1" target="_blank">appengine活用事例資料@TDDBC札幌2.1</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9378944" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/sue445" target="_blank">sue445</a> </div> </div><div><br /></div><div><div>録画もあります</div><div><a href="http://www.ustream.tv/recorded/17463733">http://www.ustream.tv/recorded/17463733</a>　（34:00くらいから）</div></div><div><br /></div><div>余談ですが、僕が初めて参加した勉強会（appengine ja night #8）で@shuji_w6eさんがScenic3とPirkaEngineの紹介をしていました。そして今度は僕が@shuji_w6eさんが主催する勉強会でScenic3とPirkaEngineの活用事例を紹介するというのは個人的に非常に感慨深いものがありました（笑）</div><div><br /></div><div><b>9/25(日)</b></div><div>@shuji_w6eさんに連れられて札幌観光をしていました。味噌ラーメンとスープカレーおいしゅうございました</div>

<div><a href="http://twitpic.com/6q8qve"><img src="http://twitpic.com/show/thumb/6q8qve" /></a>&nbsp;<a href="http://twitpic.com/6qey55"><img src="http://twitpic.com/show/thumb/6qey55" /></a></div>

<div><br /></div><div><b>9/26(月)</b></div><div>有給をとってお昼くらいの飛行機に乗って東京の家に帰宅。</div><div>帰りの飛行機は爆睡でしたｗ</div><div><br /></div><div><br /></div><div>Javaに関してはある程度こなれた感があるため、次にTDDBCに参加する時はJavaScriptで参加したいなぁ・・・</div>]]></description>
            <link>http://blog.sue445.net/archives/2011/09/26-2223.html</link>
            <guid>http://blog.sue445.net/archives/2011/09/26-2223.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">TDD</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">tddbc slim3 gaeja</category>
            
            <pubDate>Mon, 26 Sep 2011 22:23:32 +0900</pubDate>
        </item>
        
        <item>
            <title>appengineの料金体系変更に伴うjubeat++の運用に関して</title>
            <description><![CDATA[<font class="Apple-style-span" style="font-size: 1.953125em; ">特に変更はありません(　´∀｀)</font><div><br /></div><div>以降分かる人ネタ</div><div><br /></div><div>旧料金体系</div><div><a href="http://blog.sue445.net/archives/2011/09/17/Image1.png"><img alt="旧料金体系" src="http://blog.sue445.net/archives/assets_c/2011/09/Image1-thumb-200x93-10.png" width="200" height="93" class="mt-image-none" /></a></div><div><br /></div><div>新料金体系</div><div><a href="http://blog.sue445.net/archives/2011/09/17/Image3.png"><img alt="新料金体系" src="http://blog.sue445.net/archives/assets_c/2011/09/Image3-thumb-200x157-12.png" width="200" height="157" class="mt-image-none" /></a></div><div><br /></div><div><br /></div><div>新料金体系でも無料枠内に収まっているので余裕で今まで通りです。</div><div>PVはだいたい30~40/日くらいなので今まで通りなら問題ないかと。</div><div><br /></div><div><br /></div><div>ちなみにこの辺に書かれていたチューニングポイントに関しては元から行っていたため、新料金体系のためだけのコード変更は特に行っていません</div><div><ul><li><a href="http://blog.shehas.net/2011/09/02/app-engine">App Engine アプリケーションのリソースを管理する方法 - Kay's daddy</a></li><li><a href="http://blog.shehas.net/2011/09/07/taskqueue-instance">App Engine のリソース管理 - TaskQueue の設定 - Kay's daddy</a></li></ul></div><div><br /></div><div>せいぜいバラバラに動いていた複数のcronを同じ時間に動かすことで1つのインスタンスを効率良く使ったり、TaskQueueの同時実行数を1にしたくらいですかね。</div><div><br /></div><div><br /></div><div>ちなみにjubeat++のアーキテクチャについては<a href="http://atnd.org/events/19892">TDDBC 札幌2.1</a>でも話させて貰う予定です（宣伝）</div><div><br /></div><div><font class="Apple-style-span" style="font-size: 1.953125em; ">「僕と契約して札幌に行こうよ！」</font></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/09/17-1857.html</link>
            <guid>http://blog.sue445.net/archives/2011/09/17-1857.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">TDD</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">gaeja jubeatplusplus</category>
            
            <pubDate>Sat, 17 Sep 2011 18:57:45 +0900</pubDate>
        </item>
        
        <item>
            <title>Slim3用のテストユーティリティ「S3 Tiger」を作りました</title>
            <description><![CDATA[需要があるかどうか分かりませんが作ってみました。俺得万歳<br /><br />

<b>before</b>
<pre name="code" class="java">public class SomeTest{
	@Test
	public void ignoreOnlyProduction(){
		if(AppEngineUtil.isProduction()){
			return;
		}
		// 本番サーバだけでは動かしたくないテスト
	}

	@Test
	public void ignoreOnlyDevelopment(){
		if(AppEngineUtil.isDevelopment()){
			return;
		}
		// 開発サーバだけでは動かしたくないテスト
	}
}
</pre>

<b>after</b>
<pre name="code" class="java">import net.sue445.s3tiger.Slim3;<br /><br />@RunWith(Slim3.class)<br />public class SomeTest{<br />	@IgnoreProduction<br />	@Test<br />	public void ignoreOnlyProduction(){<br />		// 本番サーバだけでは動かしたくないテスト<br />	}<br /><br />	@IgnoreDevelopment<br />	@Test<br />	public void ignoreOnlyDevelopment(){<br />		// 開発サーバだけでは動かしたくないテスト<br />	}<br />}<br /></pre>Productionサーバだけでは動かしたくないテストやDevelopmentサーバだけでは動かしたくないテストなどをアノテーションで制御することができます。<br /><br />他にも以下のアノテーションが使えます<br /><pre>@IgnoreServer<br />@IgnoreNotServer<br /></pre><br />詳しくはgithubの方を見てください<br /><a href="https://github.com/sue445/s3tiger">https://github.com/sue445/s3tiger</a><br />]]></description>
            <link>http://blog.sue445.net/archives/2011/08/31-2251.html</link>
            <guid>http://blog.sue445.net/archives/2011/08/31-2251.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">Java</category>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">slim3 gaeja</category>
            
            <pubDate>Wed, 31 Aug 2011 22:51:11 +0900</pubDate>
        </item>
        
        <item>
            <title>TDD Boot Camp 東京1.5に参加してきました #tddbc</title>
            <description><![CDATA[<a href="http://atnd.org/events/16311">http://atnd.org/events/16311</a><br /><br />3月の福岡に続いて2回目の参加。<br />一応経験者ということで今回はJavaのサポートメンバーに立候補しました。<br /><br /><b>周りが優秀すぎて特にサポートすることもなかったですがね！ｗ<br /></b><br />自分のペアプロの相手は<a href="http://twitter.com/daicham">daichamさん</a>でした。前回はこっちが主体的になりすぎで今回は逆にサポートに徹しすぎてあまりバランスがとれてなかったです。ペアプロって難しいですね(´･ω･`)<br /><br /><br />詳しいことはこの辺にまとまっています<br /><ul><li><a href="http://togetter.com/li/159430">Togetter - 「TDD Boot Camp in Tokyo #tddbc」</a><br /></li><li><a href="http://hiroki.jp/2011/07/10/2044/">TDDBC in Tokyo 1.5 主催レポート #tddbc | Act as Professional - プロとしての行為</a></li><li><a href="http://www.facebook.com/media/set/?set=a.1639360203369.68055.1817723189&amp;l=1d36c5f704">TDDBC in Tokyo 1.5</a> （Facebookのアルバム）</li><li><a href="http://www.ustream.tv/channel/tddbctokyo/videos">USTREAM：tddbctokyo：録画ビデオ、1 / - 過去のライブ配信</a><br /></li></ul>ustで最後の質問コーナーで僕が出演しています。（声だけですが）<br /><b>見るなよ！絶対に見るなよ！（上島風）</b><br /><br />今はQUnitを勉強中なので次回参加するとしたらJavaScriptで参加したいところ]]></description>
            <link>http://blog.sue445.net/archives/2011/07/12-2133.html</link>
            <guid>http://blog.sue445.net/archives/2011/07/12-2133.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">TDD</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">tddbc</category>
            
            <pubDate>Tue, 12 Jul 2011 21:33:20 +0900</pubDate>
        </item>
        
        <item>
            <title>#slim3 でgen-model-with-daoを実装しました #ajnhack</title>
            <description><![CDATA[@<a href="http://twitter.com/higayasuo/">higayasuo</a>さんが<br /><br /><a href="http://twitter.com/higayasuo/status/85337391539294208">http://twitter.com/higayasuo/status/85337391539294208</a><br /><br /><blockquote>#slim3 (+gen)のコードを修正したい人は、遠慮なくコミッタ申請を私の方までしてください。どこを修正したいか明確な人は、基本受け付けます<br /></blockquote><br />とのことだったので、それにのっかって先日の<a href="http://www.zusaar.com/event/agZ6dXNhYXJyDQsSBUV2ZW50GKnAAgw">Google App Engineハッカソン</a>でgenで機能追加をしました。<br /><br />この修正はSlim3 1.0.12に取り込まれて公開されています<br /><a href="https://sites.google.com/site/slim3appengine/">https://sites.google.com/site/slim3appengine/</a><br /><br />僕が追加したもの<br /><br /><img alt="image1.png" src="http://blog.sue445.net/archives/2011/07/05/image1.png" class="mt-image-none" style="" height="157" width="266" /><br /><br />gen-modelを実行 (before)<br /><div><blockquote>gen-model:<br />[gen-model] Generated. (slim3.model.Foo.java:0)<br />[gen-model] Generated. (slim3.model.FooTest.java:0)<br />BUILD SUCCESSFUL<br /><br /></blockquote>gen-model-with-daoを実行 (after)<br /><blockquote>gen-model-with-dao:<br />[gen-model] Generated. (slim3.model.Foo.java:0)<br />[gen-model] Generated. (slim3.model.FooTest.java:0)<br />&nbsp; [gen-dao] Generated. (slim3.dao.FooDao.java:0)<br />&nbsp; [gen-dao] Generated. (slim3.dao.FooDaoTest.java:0)<br />BUILD SUCCESSFUL<br /><br /></blockquote>Model生成時に対になるDaoもセットで生成してくれます。<br /><br />
Dao自体は1.0.10くらいで実装されていたんですが自動生成されず不便で毎回自分のコードをコピペして作ってたので、この機会に自分でgenを作ってみました。<br /><br />俺得でもいいじゃない。にんげんだもの<br /><br />Slim3でアプリを作ってるとServiceクラスが多くなりすぎるので、特定のModelのCRUD操作に関するものをDaoに切りだして置くとパッケージ構成的にすっきりするし、Datastoreへのアクセスを一本化しておくことで保守性も上がると思います<br /><br /></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/07/05-2049.html</link>
            <guid>http://blog.sue445.net/archives/2011/07/05-2049.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
                <category domain="http://www.sixapart.com/ns/types#tag">appengine slim3</category>
            
            <pubDate>Tue, 05 Jul 2011 20:49:12 +0900</pubDate>
        </item>
        
        <item>
            <title>Maven2でSlim3+Scenic3+PirkaEngineな環境を構築する #gaeja #slim3 #scenic3</title>
            <description><![CDATA[<div>scenic3: <a href="http://sites.google.com/site/aboutscenic3/maven2">http://sites.google.com/site/aboutscenic3/maven2</a></div><div>PirkaEngine: <a href="http://code.google.com/p/pirka/">http://code.google.com/p/pirka/</a></div><div><br /></div><div>配布元にもpom.xmlの設定方法は書いてあるんですが、あれだけだとちょっとかゆいところに手が届かないので自分用で使ってるやつを簡単に晒してみます。（<a href="http://jubeatplusplus.appspot.com/">jubeat++</a>でも実際に使用済）</div><div><br /></div><div>最初にslim3のarchtype-pluginでブランクプロジェクトを作る</div><div>参考）<a href="http://sites.google.com/site/slim3documentja/maven#TOC-archetype-plugin-">http://sites.google.com/site/slim3documentja/maven#TOC-archetype-plugin-</a></div><div><br /></div><pre name="code" class="xml">mvn archetype:generate -DarchetypeCatalog=http://slim3.googlecode.com/svn/trunk/repository</pre><div><br /></div><div>pom.xmlに追加する部分は要点だけ書いておきます（バージョン番号は新しいのが出たらそれで書き換えればOK）</div><pre name="code" class="xml">&lt;project&gt;
  &lt;properties&gt;
<b>    &lt;pirka.version&gt;0.3.0&lt;/pirka.version&gt;
    &lt;pirka-slim3.version&gt;0.2.0&lt;/pirka-slim3.version&gt;
    &lt;scenic3.version&gt;0.4.2&lt;/scenic3.version&gt;
    &lt;slim3.rootPackage&gt;【Your rootPackage】&lt;/slim3.rootPackage&gt;
</b>  &lt;/properties&gt;
  &lt;repositories&gt;
    &lt;repository&gt;
      &lt;id&gt;maven.deathmarch.jp&lt;/id&gt;
      &lt;name&gt;The Deathmarch Maven2 Repository&lt;/name&gt;
      &lt;url&gt;http://maven.deathmarch.jp/maven2&lt;/url&gt;
      &lt;snapshots&gt;
        &lt;enabled&gt;true&lt;/enabled&gt;
        &lt;updatePolicy&gt;always&lt;/updatePolicy&gt;
      &lt;/snapshots&gt;
    &lt;/repository&gt;
  &lt;/repositories&gt;
  &lt;dependencies&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.pirkaengine&lt;/groupId&gt;
      &lt;artifactId&gt;pirka&lt;/artifactId&gt;
      &lt;version&gt;<b>${pirka.version}</b>&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;org.pirkaengine&lt;/groupId&gt;
      &lt;artifactId&gt;pirka-slim3&lt;/artifactId&gt;
      &lt;version&gt;<b>${pirka-slim3.version}</b>&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
      &lt;groupId&gt;scenic3&lt;/groupId&gt;
      &lt;artifactId&gt;scenic3&lt;/artifactId&gt;
      &lt;version&gt;<b>${scenic3.version}</b>&lt;/version&gt;
    &lt;/dependency&gt;
  &lt;/dependencies&gt;
  &lt;build&gt;
    &lt;pluginManagement&gt;
      &lt;plugins&gt;
        &lt;plugin&gt;
          &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
          &lt;artifactId&gt;apt-maven-plugin&lt;/artifactId&gt;
          &lt;configuration&gt;
            &lt;encoding&gt;utf-8&lt;/encoding&gt;
            &lt;outputDirectory&gt;${generated.src}&lt;/outputDirectory&gt;
            &lt;options&gt;
              &lt;option&gt;slim3.rootPackage=<b>${slim3.rootPackage}</b>&lt;/option&gt;
            &lt;/options&gt;
          &lt;/configuration&gt;
        &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/pluginManagement&gt;
    &lt;plugins&gt;
      &lt;plugin&gt;
        &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;
        &lt;executions&gt;
          &lt;execution&gt;
            &lt;id&gt;copy-dependencies-for-apt&lt;/id&gt;
            &lt;configuration&gt;
              &lt;includeArtifactIds&gt;slim3-gen<b>,scenic3</b>&lt;/includeArtifactIds&gt;
            &lt;/configuration&gt;
          &lt;/execution&gt;
        &lt;/executions&gt;
      &lt;/plugin&gt;
      &lt;plugin&gt;
        &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
        &lt;artifactId&gt;maven-eclipse-plugin&lt;/artifactId&gt;
        &lt;configuration&gt;
          &lt;additionalConfig&gt;
            &lt;file&gt;
              &lt;name&gt;.factorypath&lt;/name&gt;
              &lt;content&gt;
                &lt;![CDATA[
&lt;factorypath&gt;
  &lt;factorypathentry kind="WKSPJAR" id="/${artifactId}/${eclipse.lib}/slim3-gen-${slim3.version}.jar" enabled="true" runInBatchMode="false"/&gt;
  <b>&lt;factorypathentry kind="WKSPJAR" id="/${artifactId}/${eclipse.lib}/scenic3-${scenic3.version}.jar" enabled="true" runInBatchMode="false"/&gt;</b>
&lt;/factorypath&gt;
               ]]&gt;
              &lt;/content&gt;
            &lt;/file&gt;
            &lt;file&gt;
              &lt;name&gt;.settings/org.eclipse.jdt.apt.core.prefs&lt;/name&gt;
              &lt;content&gt;
                &lt;![CDATA[
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=true
org.eclipse.jdt.apt.genSrcDir=${generated.src}
org.eclipse.jdt.apt.reconcileEnabled=false
<b>org.eclipse.jdt.apt.processorOptions/slim3.rootPackage=${slim3.rootPackage}</b>
               ]]&gt;
              &lt;/content&gt;
            &lt;/file&gt;
          &lt;/additionalConfig&gt;
        &lt;/configuration&gt;
      &lt;/plugin&gt;
    &lt;/plugins&gt;
  &lt;/build&gt;
&lt;/project&gt;
</pre>
ポイントはバージョン番号をプロパティに切り出していることと、Eclipse上でやっていたAPT設定をpomに書いたこと。これでmvn eclipse:eclipseした後にAPTだけ手動で設定しなおす必要がありませんｗ<div><br /></div><div>もっとちゃんとしたpomの書き方があるかも（汗</div><div><br /></div><div><br /></div><div>2011/6/26追記</div><div>アーキタイプを作ってくれた人があらわれました。ヒャッホー！</div><div><a href="http://code.google.com/p/slim3-scenic3-pirka-archetype/">http://code.google.com/p/slim3-scenic3-pirka-archetype/</a><br /><div><br /></div></div>]]></description>
            <link>http://blog.sue445.net/archives/2011/05/02-1915.html</link>
            <guid>http://blog.sue445.net/archives/2011/05/02-1915.html</guid>
            
                <category domain="http://www.sixapart.com/ns/types#category">appengine</category>
            
            
            <pubDate>Mon, 02 May 2011 19:15:51 +0900</pubDate>
        </item>
        
    </channel>
</rss>

