<?xml version="1.0" encoding="UTF-8"?> 
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
<title>VOYAGE GROUP　エンジニアブログ</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/" />
<link rel="service.post" type="application/x.atom+xml" href="http://cms.blog.livedoor.com/atom/blog_id=3979250" title="VOYAGE GROUP　エンジニアブログ" />
<link rel="hub" href="http://pubsubhubbub.appspot.com" />
<link rel="self" href="http://tech.voyagegroup.com/atom.xml" />
<modified>2012-05-17T09:47:42Z</modified> 
<tagline><![CDATA[<a href="http://blog.livedoor.jp/ecnavi_tech/">
<img src="http://livedoor.2.blogimg.jp/ecnavi_tech/imgs/f/e/fe50b875.gif" border="0" alt="voyagegroup_techのブログ" ></a><br />
VOYAGE GROUPエンジニアブログです。]]></tagline> 
<id>tag:blog.livedoor.jp,2010:ecnavi_tech</id>
<author>
<name>ecnavi_tech</name> 
</author>
<generator url="http://blog.livedoor.com/" version="1.0">livedoor Blog</generator> 
<copyright>Copyright (c) 2012, ecnavi_tech </copyright>
<entry>
<title>Hardening ZeroというセキュリティイベントでMBSD賞を受賞しました。</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/6217348.html" />
<modified>2012-05-17T00:47:41Z</modified> 
<issued>2012-05-17T09:47:51+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.6217348</id>
<summary type="text/plain">4/21(土)に行われたHardening Zeroという全く新しいセキュリティイベントに参加し、三井物産セキュアディレクション賞をいただきました。▼イベントの概要ざっくり説明すると以下になります。全8チームによるチーム対抗戦1チームは2〜6人競技時間は8時間各チームはとあるECサ...</summary> 
<dc:subject>security</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/6217348.html">
<![CDATA[<div>4/21(土)に行われた<a href="http://wasforum.jp/2012/03/hardening-zero/" target="_blank" title="Hardening Zero">Hardening Zero</a>という全く新しいセキュリティイベントに参加し、三井物産セキュアディレクション賞をいただきました。</div><div><a target="_blank" title="HardeningZero_MBSD賞" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/8/08913350.png"><img class="pict" hspace="5" alt="HardeningZero_MBSD賞" border="0" height="240" width="321" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/8/08913350-s.png"></a><br /><br /><br /><br /></div><div><b>▼イベントの概要</b></div><div>ざっくり説明すると以下になります。</div><div><ul><li>全8チームによるチーム対抗戦</li><li>1チームは2〜6人</li><li>競技時間は8時間</li><li>各チームはとあるECサイトの運営を委託される</li><li>委託されたECサイトにはたくさんの脆弱性がある</li><li>各チームは発見した脆弱性を必要に応じて修正する</li><li>運営側が仕込んだインシデントが不定期に発生する</li><li>競技終了後に4つの観点(売上、技術、顧客対応、インシデント対応)から採点される</li></ul></div><div>参加者にはセキュリティ競技界隈では著名な方が多数いたらしく、軽くアウェー感を感じていたのは内緒です。</div><br /><br /><div><b>▼方針は「当たり前のことをやる」</b></div><div>このイベント自体が初めてであり、かつ僕らのチームのメンバーはセキュリティ競技に参加するのは全員初めてということで、競技対策というよりは普段当たり前にやってることをそのままやるという方針で挑みました。</div><br /><br /><div><b>▼メンバーと役割</b></div><div>僕らのチームは4名で参加し、以下のような役割で対応しました。</div><div><ul><li>@makoga　とりまとめ</li><li>@ajiyoshi　プログラマ</li><li>@masaki925　インフラエンジニア</li><li>@Akiyah　ECサイト管理者</li></ul></div><div>各役割1人ずついれば何とかなるよねと思っていたのですが、思ったよりひどいサイトだったのでめっちゃ忙しかったですw</div><div>ただそのおかげ(?)で表彰式や懇親会では「4人であれだけ対応できたのはスゴイですね」と実行委員からお褒めの言葉をいただきました。：）</div><br /><br /><div><b>▼かんばんで情報共有</b></div><div>事前に決めてたわけではないのですが、当日@Akiyahが模造紙と付箋を持ってきてくれたので、会社で慣れ親しんだかんばんで円滑な情報共有ができました。</div><div><a target="_blank" title="HardeningDay20120421" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/3/03ee69c0.png"><img class="pict" hspace="5" alt="HardeningDay20120421" border="0" height="427" width="319" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/3/03ee69c0-s.png"></a><br /><br />「チームで戦っている感じがすごく伝わってきました」や、「競技中に他のチームから見えるところに張り出すなんて斬新ですねw」など、他チームや実行委員からも好評でした。：D</div><br /><br /><div><b>▼競技の結果</b></div><div>ちょっとミスって売上はいまいちでしたが、それ以外は良い結果を残せたと思います。</div><div>Sales: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 511,728<br />Technical Merit: &nbsp; &nbsp; &nbsp; &nbsp; 1,700 　　1位</div><div>Customer Impression: 2,100　　 1位</div><div>Incident Response: &nbsp; &nbsp; 2,200 　　2位</div><div><a target="_blank" title="HardeningZero_参加証明書" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/b/0/b02d233c.png"><img class="pict" hspace="5" alt="HardeningZero_参加証明書" border="0" height="427" width="319" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/b/0/b02d233c-s.png"></a><br /><br /></div><div>実は最初の途中結果発表では総合7位だったので午前中は少し焦ってました。まあ単なるイベントだしそんなに頑張らなくてもいいよねなんてことが頭をかすめましたが、メンバー全員が自ら考え、自ら動いたおかげで後半巻き返しができました。諦めたらそこで試合終了ですよね。</div><br /><br /><div><b>▼まとめ</b></div><div>Webサービスを堅牢にするためには、様々な視点と技術力が必要です。また、限られたリソースでどこから対応していくかのバランスをとることも重要です。</div><div>それらに対し自分たちがどのくらいできるのかを試してみるにはとても良いイベントと感じました。</div><div>秋くらいにはHardening Oneが開催されると聞いています。少しでも興味もたれた方がいれば、ぜひチャレンジして欲しいと思います。</div>]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>androidとiOSで共通で使える暗号方式</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/6144504.html" />
<modified>2012-05-15T08:11:31Z</modified> 
<issued>2012-04-26T09:42:49+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.6144504</id>
<summary type="text/plain">こんにちは、VOYAGE GROUPのしんばし(@shinbashi）です。昨今何につけてもスマートフォンですよね。かくいう僕もPDAからのW-ZERO3という王道を通って来ました。さて、最近は特にスマートフォン対応とか、アプリ化する機会が増えてきたと思います。android版を作ればiOS版も出...</summary> 
<dc:subject>programming</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/6144504.html">
<![CDATA[こんにちは、VOYAGE GROUPのしんばし(<a href="https://twitter.com/#!/shinbashi" target="_blank">@shinbashi</a>）です。<br /><br />昨今何につけてもスマートフォンですよね。<br />かくいう僕もPDAからのW-ZERO3という王道を通って来ました。<br /><br />さて、最近は特にスマートフォン対応とか、アプリ化する機会が増えてきたと思います。<br />android版を作ればiOS版も出すよ！みたいな話になりますよね。<br />「android版だけでいい」<br />なんて言葉を信じて設計すると、後で痛い目を見るのは火を見るより明らかです。<br /><br />前フリが長くなりました。<br />android版だけだと信じて僕が痛い目を見たのは暗号化・復号処理の部分です。<br />Javaはともかく、Objective-Cをよく知らなかったのでライブラリに頼るわけですが、<br />Objective-Cの暗号化・復号処理をしてくれるライブラリでは扱えないアルゴリズムとかあるんですね。<br /><br />ざっくり調べた感じだと以下な感じです<br /><br /><div style="text-align: center;">表１ アルゴリズム比較表</div>

<table border="1">
  <thead>
    <tr>
      <th></th>
      <th>AES</th>
      <th>ARCFOUR</th>
      <th>Blowfish</th>
      <th>DES</th>
      <th>DESede</th>
      <th>ECIES</th>
      <th>RC2</th>
      <th>RC4</th>
      <th>RC5</th>
      <th>RSA</th>
      <th>CAST</th>
    </tr>
    </thead>
    
      <tbody><tr>
      <th>javax.crypt(android)</th>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;"></td>
    </tr>
    <tr>
      <th>CCCrypt(iOS)</th>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;">◯</td>
    </tr>
</tbody></table><br /><div style="text-align: center;">表２ パディング比較表</div><table border="1">
  <thead>
    <tr>
      <th></th>
      <th>no padding</th>
      <th>PKCS7</th>
      <th>PKCS5</th>
      <th>PKCS1</th>
      <th>PAEP</th>
    </tr>
  </thead>
  
    <tbody><tr>
      <th>javax.crypt(android)</th>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
    </tr>
    <tr>
      <th>CCCrypt(iOS)</th>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">◯</td>
      <td style="text-align: center;">△<span style="font-size: xx-small; ">※1</span></td>
      <td style="text-align: center;"></td>
      <td style="text-align: center;"></td>
    </tr>
  
</tbody></table><br /><span style="font-size: x-small; ">※1 PKCS7 ≒ PKCS5 (ブロック長の違いなのでPKCS7でPKCS5形式のものをunpad出来る)<br /></span><br />実際、パディング処理は暗号化前、復号後に自前でやってしまえばいいのでなんとでもなりますね。<br />こうしてみると、暗号化アルゴリズムはAESで実装するのが妥当そうです。<br />Objective-Cで自前でPKCS5でunpadする場合は以下な感じになると思います。<br />
<pre>+ (NSData *) pkcs5_unpad:(NSData *)data
{
    int pad = [[[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(data.length - 1, 1)] encoding:NSASCIIStringEncoding] characterAtIndex:0];
    if (pad &gt; data.length) return nil;
    return [data subdataWithRange:NSMakeRange(0, data.length - pad)];
}
</pre>
ざっくりまとめると<br /><ul><li>アルゴリズム：AES（鍵長は128でも256でもいいと思います）</li><li>&nbsp;ブロック形式：CBC（EBCも使えます）</li><li>パディング：PKCS5（独自で実装できるのでお好きにどうぞ）</li></ul>な感じで暗号化しておけば、android(java)でもiOS(Objective-C)でも取り扱いできます。<br />javax.cryptやCCCryptの使い方は色々な方が解説していらっしゃるのでそちらを参考にしていただければと思います。決して<strike>Javaのコード長すぎて写すのを</strike>面倒臭がっているわけではありません。<br /><br />また、僕の場合だけかもしれませんが、CCCryptを使った時に、末尾に改行コードが含まれていて、NSDataからNSStringに変換しようとした時にエラーが発生したので、トリムする必要があるかもしれません。<br />また、WindowsPhoneに関してですが<br />「C#だし」<br />ってことで割愛させて頂きました。<br /><br /><br />おまけ<br /><br />mixi Engineers' Blog »&nbsp;<span style="white-space: pre-wrap; font-family: monospace; ">OpenSSLの暗号文をJava/Perl/Rubyで開く</span><br /><a href="http://alpha.mixi.co.jp/blog/?p=91" target="_blank">http://alpha.mixi.co.jp/blog/?p=91</a><br /><br />こちらでJavaでOpenSSLのパスフレーズから鍵を導出する処理が書かれていたので、せっかくなのでObjective-Cで実装するとどうなるのか書いてみました。<br /><br />
<pre>+(NSDictionary*) pass2keyInfo:(NSData *)pass salt:(NSData *)salt
{
    int keySize = 256;
    int ivSize  = 128;
    int keyAndIvSize = (keySize/8) + (ivSize/8);
    NSMutableData* result = [[NSMutableData alloc] init];
    NSMutableData* keyAndIv = [[NSMutableData alloc] init];
    while (keyAndIv.length &lt; keyAndIvSize) {
        [result appendData:pass];
        [result appendData:salt];
        [result setData:[result MD5Digest]];
        [keyAndIv appendData: result];
    }
    NSData* key = [keyAndIv subdataWithRange:NSMakeRange(0, keySize/8)];
    NSData* iv  = [keyAndIv subdataWithRange:NSMakeRange(keySize/8, ivSize/8)];
    return [NSDictionary dictionaryWithObjectsAndKeys:key, @"key", iv, @"iv", nil];
}
</pre>
参考<br />







<span class="s2">Java ™ 暗号化アーキテクチャー標準アルゴリズム名のドキュメント<br /><a target="_blank" href="http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator ">http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator</a></span><br /><span style="white-space: pre-wrap; color: rgb(0, 0, 0); font-family: monospace; ">CommonCryptor.c<br /></span><a target="_blank" href="http:// http://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/Source/CommonCryptor.c"><span style="white-space: pre-wrap; color: rgb(0, 0, 0); font-family: monospace; "> </span>http://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/Source/CommonCryptor.c</a><ul class="ul1">


</ul>]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>Jumvoの作り方</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/6062984.html" />
<modified>2012-04-04T01:14:57Z</modified> 
<issued>2012-04-04T10:14:40+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.6062984</id>
<summary type="text/plain">genesixの永野です。
弊社では定期的に社内の発表イベントをやっていまして、先日「Jumvo 2.0 における デザイナーとエンジニアの連携」と題して、Jumvoをどうやって作ったのかを発表しました。
当日のSlideはこちら。


JumvoとはJumvoはgenesixからリリースしている、簡単...</summary> 
<dc:subject>スマートフォン</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/6062984.html">
<![CDATA[genesixの永野です。<br />
弊社では定期的に社内の発表イベントをやっていまして、先日<br />「Jumvo 2.0 における デザイナーとエンジニアの連携」<br />と題して、Jumvoをどうやって作ったのかを発表しました。
<a href="http://www.slideshare.net/7gano/jumvo-20" target="_blank">当日のSlideはこちら</a>。
<br />
<br />
<span style="font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; "><b>Jumvoとは</b></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">Jumvoはgenesixからリリースしている、簡単に言えば声のSMSができるiOSアプリケーションです。声を送りあうことに特化しているため、シンプルな操作性が売りになっています。<a target="_blank" href="http://itunes.apple.com/jp/app/jumvo/id449109613" style="color: blue !important; ">こちらから無料でダウンロードできます</a>。</span><br /><span style="background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><a target="_blank" title="icon_201201" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/6/e/6e03384a.png" style="color: blue !important; "><img class="pict" hspace="5" alt="icon_201201" border="0" height="160" width="160" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/6/e/6e03384a-s.png"></a><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "><br />発表はデザイナーの伊野と二人で行ったのですが、この記事ではプログラマーの立場から、Jumvoで取った開発方法を紹介します。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">具体的には、Jumvoでは「プロトタイピング」と「UXデザイン定義書に法った開発」を行いました。まず最初に、これに到るまでの経緯をお話します。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">自己紹介とこれまでにやってきたこと</span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">genesix入社前は、フリーランスで通販サイトを作ったり(PHP/Java)、時間とお金があればMacのアプリを書いたりしていました。genesix入社直前の1年ぐらいはMac/iOS系会社で主に受託案件をやっていました。受託という性質上、仕様の受け入れ、工数見積もり、というようなことがよくありましたが、その中で感じていたのが「iOSアプリは仕様を決めるのが難しい」そして「仕様が頻繁に変わる」ということです。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">「仕様」が決まらない</span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そんなのiOSに限ったことじゃないだろう、と思われる方もいると思いますが、Webアプリケーションの受託案件と比べても変更が多い印象でした。実際に画面に触ってみないと分からない点が後から色々出てくる、のが一番の理由だと思われます。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">象徴的な話としては自機を触って操作するシューティングゲームで、完成してみると、自機が指で隠れてしまうのでお蔵入りになった、という冗談みたいな話も聞いたことがあります。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そのため、いつも「後で変更しやすいようにしておかないと、納品前に仕様が変わって間に合わなくなるだろう」とか「この見積もりでは変更できないからクライアントが納得しないだろ」「最初にこの操作だけは決めておかないと完成前に変わると全部がひっくりかえる」といったよく心配をしていました。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">全画面の構成程度の仕様が決まったと思っても、使っているうちに問題点が浮き彫りになり、修正したくなる。よくあるのが、ここの仕様が曖昧だと思っていると、後でデザイナーから(もしくはクライアントから)指摘がある。しかし、仕様が決まりさえすれば、たいていのものは作るのは難しくありません。しかし、どんなに優秀なデザイナーでさえ、動かなければ分からないことが多い、どうすればいいだろう？ということをずっと考えてきました。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">「ユーザー」とは誰なのか？</span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">もう一点、仕様を決めていくプロセスにおいても問題を感じていました。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">たとえば、クライアント、エンジニア、デザイナーで新しいアプリの仕様を検討していても、それぞれがそれぞれの立場で、この機能が必要だ、これはこの位置だ、という話になりますが、その主張の根拠が「ユーザー」という正体不明なものであることでした。</span><br /><span style="font-size: 15px; white-space: pre-wrap; ">正体不明な</span><span style="text-indent: 154px; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">「ユーザー」？　何を言っているんだ！と言う方もいらっしゃると思いますので説明します。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">何かBtoCのサービスを作るのであれば、それは顧客であるユーザーのためである、これに異論がある方は居ないと思いますが、その「ユーザーのためを考える」のは各人共通であったとしても、実は対象としているユーザーがそれぞれ(の立場)によって異なるのです。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">iOSアプリを作るとすれば、対象ユーザーの範囲は多岐に渡るにも関わらず、ある人は若い女性を想定しているかもしれませんし、ある人は中年のサラリーマンを想定しているかもしれません。ある人は非常にリテラシーの高い人を想定、もしくは逆、ということがあり得ます。対象をきっちり決めていない場合はほぼそうだと考えるべきだと思います。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そのため、ある機能を決定する場合でも、想定しているリテラシーが異なるため、ある人はこれぐらいは分かると言い、ある人は逆にこれは理解できないはずだと言い、という出口の無い議論をすることになります。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">実際、前職で「ユーザー」という参加者全員が頻発する言葉に、それって誰？と言ったことがあります。そして、各人の「ユーザー」像を少しでも近づけるべく実際に使ってくれているユーザーに来てもらって話を聞こう、と提案したりしました(それは叶いませんでしたが)。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">Jumvo 1.0では、以上の二つの問題に対して次のような方法で解決を試みました。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">まず</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">1.「仕様」が決まらない</span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">この点については、最初から「仕様をかちっと決めてから開発する」ということは不可能である、という前提で開発することにしました。つまり仕様は決まらないので、決めずにやるということです。しかし何も決まらなければ進まないので、いつでも変更される前提のプロトタイプをベースに、動くものを見ながら意見を交換し、進めました。具体的には、iPhoneの実機で実際に動作するものを基本に進めました。これは簡単に言えばプロトタイピングと言えると思います。つまり、Jumvoは最初から他のiPhoneと声を送りあえる状態から作っていったのです。下の写真のように紙にメモを書きながら、最初は僕が必要な機能を考え、UX/UIデザイナーと意見を交換しながら、実際に動作するものを修正しつつ進めていきました。<br /><a target="_blank" title="jumvo1" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/a/a/aa0678a9.jpg"><img class="pict" hspace="5" alt="jumvo1" border="0" height="120" width="160" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/a/a/aa0678a9-s.jpg"></a><br /><br /><br />これによって実際に手に取って声を発して、それを実際に相手に送信する、という一連の操作と、何よりその操作性が重要であるということをチームのメンバーに最初に伝えることができたと思います。それはその後のスムーズな開発(のための仕様の検討)に繋がったと考えています。つまり、プロトタイプベースで進めることによって、ユーザー体験のコア部分が速い段階で検証できた、ということになります。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">また、事業責任者やプロデューサーに、Jumvoが面白いのかどうか、最初の段階で確認してもらえたことも大きな利点であったと思います。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">このようなプロトタイピング期間が1ヶ月程あった後、UIデザイナーが正式にアサインされ、それまでのプロトタイプを元に、具体的なデザイン案が出来てきました。その案も実際に実機で動かし、再度修正し、またさらに動かし、という工程を1ヶ月で3度ほど繰り返し、最初のv1.0が完成しました。ここまでで2ヶ月ほどの時間がかかっています。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">2.「ユーザー」とは誰なのか？</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">これは実は当初は想定していなかったのですが、genesixには選任のUXデザイナーがおり、UXデザインにおいてペルソナを採用していました。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そして、アプリは「アプリケーション定義ステートメント」にそって作られる、という一環した手法を採用していたのです。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">アプリケーション定義ステートメントとは、詳細は</span><a href="http://genesixdev.wordpress.com/2012/03/28/genesix%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9-%E8%B3%87%E6%96%99%EF%BC%9Aux%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%AE%9A%E7%BE%A9%E6%9B%B8/" style="font-weight: bold; font-size: 16px; "><span style="font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; color: rgb(17, 85, 204); ">こちら</span></a><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">を参照いただきたいのですが、簡単に言えば、誰が何を達成するため（＝使う人のゴール）のアプリケーションなのか、を1行程度で表したものです。Jumvoの場合「もっと気持ちを伝え合いたい人のためのもっと気軽で手軽なボイスメッセージングアプリ」がそれであり、仕様等で迷ったときには定義ステートメントはこれだから..と復唱することで目的を、もっと言えばユーザーのゴールを確認することができます。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">僕はこの開発手法を聞いたときに正体不明のユーザーから逃れる方法だ！と目からうろこが落ちました。実際にこの手法で開発をしてみると、チーム全員が「アプリケーション定義ステートメント」に向かっており、「ユーザー」ではなくペルソナを対象として話をするため、仕様の検討でばらばらな方向を向くというとが皆無でした。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">アプリの目的が明確だったというのもあると思いますが、このユーザーは分かる、分からない、という議論はまったくありませんでした。あったのはどうやればゴールに近いか、という議論だけです。その中では多くの方法が話し合われましたし、ときには難航もしましたが、誰かがひらめいたときの全員の「それだ！」という意思統一の速さはこれまでに経験したことのないものでした。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">加えて、Jumvoではプロトタイピングで仕様を決めていたため「この仕様にしたら、時間がかかるから...」 といったことを考えずに自由に発言できたこと、また出た案を常に手に取って使いながら判断できたことも、議論がスムーズに進んだ一つの要因だと考えます。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">問題点</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">さて、上記を振り返るといいことづくめなように思えますが、問題点としては以下が考えられます。</span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; "><span style="font-weight: normal; "><br /></span>1. いつまでも仕様が決まらない</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">仕様は決まらないから決めない、という前提でスタートしているため、時間的、予算的余裕があれば、それこそどれだけでも開発できてしまうため終りがやってきません。現実的にはそのようなことは無いため、いつか終わりがきます。Jumvoの場合その制約はリリース目標日でした(具体的には7月頭)。目標日までに作るには、プロトタイピングといえども、明確に何を決めたくて、今何を試しているのか、を意識する必要があると思います。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">ただ面白いかどうかだけを試していたら、何パターンもアニメーションを動かしてみて時間がすぎていく、ということもあるでしょう。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">Jumvoの場合、具体的な例としては、送信相手を複数選んで送信する、それを最も簡単に少ない操作ステップ数で行えるUIは何か、ということを何パターンも試しました。そして分かりやすさと操作性を軸に判断していきました。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">2. コーディング量が増える</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">Jumvoの完成形のコード量を1とすると、少なく見積もっても3倍ぐらいのコードを書きました。そのためには時間がかかります。ですが、プロトタイピングに2ヶ月かかっていては、それは機能しないでしょう。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そのため、必要な箇所を的確に判断し、最低限のコード量で最大の効果を発揮するいわば”勘”が必要になると思います。Jumvoは目的が明確なアプリであったため、それに必要なコア部分も分かりやすく、プロトタイピングに向いていたと考えられます。Jumvoに限らず、iOSアプリは目的が明確であるべきだと考えますので、プロトタイプベースでの開発に向いていると言えるかもしれません。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">3. プロトタイプに仕様決定の主導権が移ってしまう</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">実際に動くものがあるため、その説得力は非常に高く「うん、これで動いているしいいんじゃない？」となる可能性が高くなります。実際、Jumvoでもプロトタイプにデザイナーが引っ張られ、最終的な判断ができない、という状況がありました。これを回避するには、モノを判断するモードと、モノを作るモードの切り替えが必要です。UXデザイン定義書は判断するモードに戻るために非常に有効でした。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-weight: bold; font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; ">まとめ</span><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">これまで述べてきた僕が考える問題点とそれに対するやり方を振り返ると、</span><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">そもそも市場調査は的確だったのか、それで実際にアプリがヒットするのかどうか、といった根本的な問題はあります(実際、Jumvoが大ヒットしているわけではありません)。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">しかし、そのために最低限必要な条件である(と僕が考える)、よいものを作るための近道の一つが試せたと思いますし、実際に効果がありました。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">一つの結果としては、App Store Rewind 2011に選んでいただきました！</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><a target="_blank" title="25" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/5/b/5b3ed822.png" style="font-weight: bold; font-size: 16px; "><img class="pict" hspace="5" alt="25" border="0" height="105" width="160" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/5/b/5b3ed822-s.png"></a><br /><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">(実機のiPhoneで動くものをベースとした)プロトタイピングはコーディング量が増えるため導入の敷居は若干高いかもしれませんが、UXデザイン定義書は、採用しやすいのではないでしょうか。</span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">以下の記事などを参考に採用を検討してみてください。</span><br /><span style="font-weight: bold; background-color: transparent; "><span style="font-size: 15px; background-color: transparent; vertical-align: baseline; white-space: pre-wrap; "></span></span><br /><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">スライドの後半では、genesixのUXデザインについて具体例を交えながら書いてあるので、参考にしていただければ幸いです。また、</span><a href="http://genesixdev.wordpress.com/2012/03/26/genesix%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9-%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E3%81%AB/" style="font-weight: bold; font-size: 16px; "><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; color: rgb(17, 85, 204); ">genesixデザインプロセス</span></a><span style="font-size: 15px; background-color: transparent; font-weight: normal; vertical-align: baseline; white-space: pre-wrap; ">も公開されていますので、合わせてごらんください。</span></span>]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>第3回チューニンガソンで2位になりました!!</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/6038134.html" />
<modified>2012-03-27T07:01:36Z</modified> 
<issued>2012-03-27T16:01:32+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.6038134</id>
<summary type="text/plain">こんにちは！株式会社adingoでエンジニアをしている前田(@brtriver)といいます。3/24(土)に弊社のパンゲアで開催された &quot;第3弾！いろいろチューニングしてパフォーマンスを競うバトルイベント「チューニンガソン」&quot;  に弊社の岩川(@hogehiko)とペアで参戦し2位に入賞するこ...</summary> 
<dc:subject></dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/6038134.html">
<![CDATA[<div>こんにちは！株式会社adingoでエンジニアをしている前田(<a target="_blank" href="https://twitter.com/#!/brtriver">@brtriver</a>)といいます。</div><div>3/24(土)に弊社のパンゲアで開催された "<a target="_blank" href="http://www.zusaar.com/event/218004">第3弾！いろいろチューニングしてパフォーマンスを競うバトルイベント「チューニンガソン」</a>" &nbsp;に</div><div>弊社の岩川(<a target="_blank" href="https://twitter.com/#!/hogehiko">@hogehiko</a>)とペアで参戦し2位に入賞することができました！</div><div>TOPのスコアは本当に僅差でしたので、運も味方に付けた結果なのですが、簡単にレポートしてみたいと思います。</div><br /><div>■<a target="_blank" href="http://togetter.com/li/278147">第３回tuningathonのtogetter</a></div><br /><br /><div><span style="font-size: medium; "><b>事前準備</b></span></div><div>前日に作戦会議といいつつドイツビールがおいしいお店で二人してただ呑んだくれるという状態で何も準備せずに当日を迎えました。<br />もしかして、緊張せずに寝れたことが大事だったかもしれません。&nbsp;</div><br /><div><span style="font-size: medium; "><b>作業分担</b></span></div><div>お題はblojsomというJavaアプリケーションのチューニングでした。</div><div>PHPのアプリでなかったことは想定内でしたが、JavaでTomcat縛りというのは予想していませんでした。</div><div>Javaまわりは岩川が詳しいので私はMySQL周りを担当とある程度分業してチューニングをすることに</div><div>参考スコアが63だったので、この値を目標にがんばることに。</div><br /><div><span style="font-size: medium; "><b>開始</b><br /></span></div><div>スタート時のスコアは以下のとおり</div><div><span><span style="background-color: rgb(0, 51, 204); color: rgb(255, 255, 255); ">Score: <b>17.844</b> (get=16.900, comment=0.944(1), check=1.000)</span></span></div><br /><div>アナウンスでは初期ベンチが23ぐらいと聞いていたのでかなり低いなぁという印象。</div><br /><div><span style="font-size: medium; "><b>最初の準備</b></span></div><div>設定を色々変更し、アプリケーションの再起動もかなりの回数を重ねるだろうということで</div><div>restart.shというシェルスクリプトを用意し、再起動やDBのコメントデータのtruncateなどをあらかじめ用意。</div><div>また、どの設定や変更が有効なのかを把握するために、一度の多くの変更は行わずにこまめにベンチを取得するようにしました。</div><div>当たり前のことなのですがこのおかげもあって、突然スコアが劇的に下がった場合に原因がわからないということもなく安定していたと思います。</div><div>サーバーの状態はtopとvmstatで確認というレベルでした。</div><br /><br /><div><span style="font-size: medium; "><b>チューニングの記録</b></span></div><div>MySQLの設定は最初からある程度行われている状態でした。</div><div>メモリ周りの設定を増やすことでスコアは<span><span style="background-color: rgb(0, 51, 204); font-size: medium; color: rgb(255, 255, 255); "><b>24.377</b></span></span>に。</div><br /><div>まだまですね。</div><div>そして、スロークエリなども確認したのですが全く出ていないのでボトルネックにはなっていない印象。</div><br /><div>java周りでは、Tomcatのメモリを増やして調整することで一気に<span><span style="background-color: rgb(0, 51, 204); font-size: medium; color: rgb(255, 255, 255); "><b>48.278</b></span></span>に！</div><div>この時点の中間発表で2位になっていたので、「もしかしたら...!!」という期待をもちつつ気合が入りました。</div><br /><div>さらに、Tomcatのスレッド数を減らしたり、MySQLのバージョンを5.5に上げる+スレッド数を調整した結果スコアも60近くになりました。</div><br /><div>このころに自身のベンチで最高値を叩いていました。</div><div><span><span style="background-color: rgb(0, 51, 204); color: rgb(255, 255, 255); ">Score: <b>63.246</b> (get=49.400, comment=13.846(14), check=1.000)</span></span></div><br /><div>しかし、このあと何故か60台を超えることなく、50台をさまようことに....</div><br /><div>だいたい思いつく施策はやった感があったので、あとは本番の計測でベストな値を出すためにはどうすればよいか？という点を相談していました。</div><br /><div>ベンチ結果は複数回実行するとスコアに変化が見られました。</div><div>作業開始当初はアプリケーション再起動後に複数回ベンチを叩くことでスコアが上昇する傾向だったのが、</div><div>JVMを6から7に上げたあたりから再起動後最初のベンチが一番良いスコアを叩く傾向に変わって来ました。</div><br /><div>直接の原因はわからないですが、本番で一番よい結果を出すには、終了直前にアプリケーションを再起動させて何も触らない状態で終わることだろうと判断。</div><div>ラスト15秒ぐらいで一番最初に用意したrestart.shを叩いてあとは神に祈るのみという状態でした。</div><br /><div>一番最後に自分たちでベンチした結果は</div><div><span><span style="background-color: rgb(0, 51, 204); color: rgb(255, 255, 255); ">Score: <b>59.477</b> (get=58.499, comment=0.977(1), check=1.000)</span></span></div><br /><span style="font-size: medium; "><b>結果</b></span><br /><a href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/d/e/debcaea9.jpg" title="hogehiko_brtriver002" target="_blank"><img src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/d/e/debcaea9-s.jpg" width="320" height="240" border="0" alt="hogehiko_brtriver002" hspace="5" class="pict"></a><br /><br /><span style="background-color: rgb(255, 0, 0); "><span style="font-size: medium; color: rgb(255, 255, 255); "><br /></span></span><b style="word-break: break-all; 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: 'Hiragino Maru Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', メイリオ, sans-serif; line-height: 20px; text-align: left; font-size: 15px; "><span style="word-break: break-all; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; background-color: rgb(0, 51, 204); font-size: x-large; "><span style="color: rgb(255, 255, 255); ">2位　hogehiko ＆ brtriver ペア / 59.486</span></span></b><br /><div><br /><br /><br />また、弊社のもうひとつのチーム(<a target="_blank" href="https://twitter.com/#!/kenichikat">@kenichikat</a>)が相方が障害対応のため急遽個人参戦にもかかわらず10位入賞と大検討していました！<br /><br /><span style="font-size: medium; "><b>まとめ</b></span></div><div>今回のチューニンガソンはJavaの環境設定をどこまで最適化できるかが大きかったと思います。<br />nice値の調整などまだまだできることがあったことを考えると優勝できていた可能性があっただけに悔しいです&gt;&lt;</div><div>5時間という時間制限は想像以上に短く、疲労感もありますが、充実感が半端ないので是非皆さんには参加してほしいイベントです！</div><div id="fastlookup_top" style="display: none; "></div>]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>メタプログラミングR:重い関数をキャッシュする</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5928855.html" />
<modified>2012-03-09T00:29:11Z</modified> 
<issued>2012-03-09T09:29:28+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.5928855</id>
<summary type="text/plain">こんにちは、VOYAGE GROUPの水越(@Akiyah)です。最近、仕事でデータ解析環境「R」を使ってデータベースからデータを取り出して加工することが多いです。そういったとき、データベースからデータをとる部分はSQLでまるまる取得して、その後Rでもりもり加工するのが好きです。...</summary> 
<dc:subject>programming</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5928855.html">
<![CDATA[こんにちは、VOYAGE GROUPの水越(<a target="_blank" href="http://twitter.com/#%21/Akiyah">@Akiyah</a>)です。<br /><br />最近、仕事で<a target="_blank" href="http://www.r-project.org/">データ解析環境「R」</a>を使ってデータベースからデータを取り出して加工することが多いです。<br />そういったとき、データベースからデータをとる部分はSQLでまるまる取得して、その後Rでもりもり加工するのが好きです。<br />ですがその場合、何度も実行するとSQLの処理が重いしデータベースに負担をかけることになるので、ちょっと困っていました。<br /><br />そこで今回、Rのメタプログラミングで関数呼び出しをキャッシュ化してみることにしました。<br />キャッシュと言ってもずっと同じ値を返すのではデータベースに新しいデータが入ったときに更新されないで困るので、ある一定期間（例えば24時間）を過ぎたら最新の値をとるように作ります。<br /><br />

<h3>キャッシュ無し</h3>

まず最初に、"重い処理"という文字列を出力する関数を作ります。<br />

<style>
b {
background: #FFF380;
}
div.article-body pre.r_code {
 line-height:150%;
 font-size:130%;
}
</style>

<pre class="r_code">heavy_func1 &lt;- function() {
  <b>print("重い処理")</b>
  result &lt;- rnorm(1) # ランダムな数字
  return(result)
}
</pre>

この<b>print("重い処理")</b>が重いSQLであると思ってください。<br />heavy_func1を何度か実行すると、

<pre class="r_code">&gt; heavy_func1()
[1] "重い処理"
[1] -2.146503
&gt; heavy_func1()
[1] "重い処理"
[1] 0.07116749
&gt; heavy_func1()
[1] "重い処理"
[1] -0.277692
</pre>


何度も"重い処理"が実行されているのがわかります。

<h3>グローバル変数を用いたキャッシュ</h3>

それではキャッシュするバージョンを作ってみましょう。Rでは実行環境（ワークスペース）にデータを持たせて、Rの終了時にファイルに保存して次のR起動時に読み込む事ができるので、グローバル変数にキャッシュを入れておけば今回の用途には十分です。単純に書くとこうなります。

<pre class="r_code">heavy_func2.cache &lt;- NULL
heavy_func2 &lt;- function() {
  <b>now &lt;- Sys.time()</b>
  <b>if(!is.null(heavy_func2.cache)) {</b>
  <b>  if (10 &gt; now - heavy_func2.cache$updated_at) {</b>
  <b>    return(heavy_func2.cache$value)</b>
  <b>  }</b>
  <b>}</b>
  print("重い処理")
  result &lt;- rnorm(1) # ランダムな数字
  <b>heavy_func2.cache &lt;&lt;- list(value=result, updated_at=now)</b>
  return(result)
}</pre>

<b>&lt;&lt;-</b>は永続代入と言って、関数定義からグローバル変数に代入するときに使います。キャッシュ(<b>heavy_func2.cache</b>)にはキャッシュする値(<b>value</b>)と更新日時(<b>updated_at</b>)のリストを入れておきます。<br /><br />実行してみると、

<pre class="r_code">&gt; heavy_func2()
[1] "重い処理"
[1] -0.06969717
&gt; heavy_func2()
[1] -0.06969717
&gt; heavy_func2()
[1] -0.06969717
</pre>

"重い処理"がはじめの一回しか呼ばれていない事がわかります。そして戻り値はキャッシュが効いて同じ値を返しています。キャッシュの更新時間はここでは10秒にしているので10秒経つともう一度処理が実行されて、値も新しいものになります。

<pre class="r_code">&gt; heavy_func2()
[1] "重い処理"
[1] 0.8203284
</pre>

ちなみにRでは変数名に"."(ピリオド)が使えます。逆に言うとピリオドが使われていたからと言ってそれはJavaやRubyなどの言語のようなオブジェクトの属性へのアクセスと言うわけではありません。<h3>明示的なグローバル変数宣言を削除</h3>

実はこのままだと困る事があります。関数定義の直前にキャッシュのグローバル変数を定義しているので、たとえば関数定義を別ファイルにして何度も呼び出すと、その度にキャッシュが消えてしまうのです。そこを改善してみます。

<pre class="r_code">heavy_func3 &lt;- function() {
  now &lt;- Sys.time()
  if(<b>exists("heavy_func3.cache")</b>) {
    if (10 &gt; now - heavy_func3.cache$updated_at) {
      return(heavy_func3.cache$value)
    }
  }
  print("重い処理")
  result &lt;- rnorm(1) # ランダムな数字
  heavy_func3.cache &lt;&lt;- list(value=result, updated_at=now)
  return(result)
}</pre>


グローバル変数を直接定義するのではなく、変数が定義されているかどうか確認する関数<b>exist</b>を使うようにした事で、明示的なグローバル変数の定義を消す事ができました。やっとメタプログラミングっぽくなってきましたね。もうちょっと進めてみます。

<h3>明示的なグローバル変数アクセスを関数経由に</h3>


<pre class="r_code">heavy_func4 &lt;- function() {
  now &lt;- Sys.time()
  <b>cache_name &lt;- paste("heavy_func4", "cache", sep=".")</b>
  <b>if(exists(cache_name)) {</b>
  <b>  cache &lt;- get(cache_name)</b>
  <b>  if (10 &gt; now - cache$updated_at) {</b>
  <b>    return(cache$value)</b>
    }
  }
  print("重い処理")
  result &lt;- rnorm(1) # ランダムな数字
  <b>assign(cache_name, list(value=result, updated_at=now), envir=.GlobalEnv)</b>
  return(result)
}</pre>

グローバル変数へのアクセスを全て関数(<b>exists</b>, <b>get</b>, <b>assign</b>)経由にしました。<b>assign</b>の引数にある<b>.GlobalEnv</b>はグローバル環境を表します（このあたりをもっと有効に使う例はまた今度）。

<h3>キャッシュを別関数化</h3>

そろそろ仕上げです。このキャッシュの仕組みを共通化して別の関数に出します。

<pre class="r_code"><b>cache.get &lt;- function(key) {</b>
<b>  now &lt;- Sys.time()</b>
<b>  cache_name &lt;- paste(key, "cache", sep=".")</b>
<b>  if(exists(cache_name)) {</b>
<b>    cache &lt;- get(cache_name)</b>
<b>    if (10 &gt; now - cache$updated_at) {</b>
<b>      return(cache$value)</b>
<b>    }</b>
<b>  }</b>
<b>  return(NULL)</b>
<b>}</b>

<b>cache.set &lt;- function(key, value) {</b>
<b>  now &lt;- Sys.time()</b>
<b>  cache_name &lt;- paste(key, "cache", sep=".")</b>
<b>  assign(cache_name, list(value=value, updated_at=now), envir=.GlobalEnv)</b>
<b>}</b>

heavy_func5 &lt;- function() {
  <b>cache &lt;- cache.get("heavy_func5")</b>
  <b>if(!is.null(cache)) return(cache)</b>
  print("重い処理")
  result &lt;- rnorm(1) # ランダムな数字
  <b>cache.set("heavy_func5", result)</b>
  return(result)
}</pre>

キャッシュしたい関数の最初と最後にちょっと差し込めばキャッシュ化が可能になりました！
ふー、一段落ですね。<br /><br />

<h3>残りタスク</h3>

<ul>
<lh>残りタスク</lh>
<li>キャッシュの更新時間を設定できるようにする</li>
<li>キャッシュを高階関数化して関数を渡すとキャッシュ化した関数を返すようにする</li>
<li>グローバル環境を使わないようにする</li>
<li>キャッシュ化する関数のソースコードが変更された場合はキャッシュをクリアするようにする</li>
</ul>

残りタスクは解決できたらまた報告します。]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>韓国向けサービスを運営する際に必要な住民登録番号とは？</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5898804.html" />
<modified>2012-02-22T01:07:43Z</modified> 
<issued>2012-02-22T10:07:43+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.5898804</id>
<summary type="text/plain">リサーチパネルエイジアの鈴木です。弊社では中国と韓国でインターネットリサーチサイトの開発と運営をおこなっております。海外向けwebサイトを開発する際に、海外ならではの 知らなくて困ったことがいくつかありました。今回はそのなかの一つでもある、韓国の「住民登録番...</summary> 
<dc:subject></dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5898804.html">
<![CDATA[リサーチパネルエイジアの鈴木です。<br /><br />弊社では中国と韓国でインターネットリサーチサイトの開発と運営をおこなっております。<br /><br />海外向けwebサイトを開発する際に、海外ならではの 知らなくて困ったことがいくつかありました。<br /><br />今回はそのなかの一つでもある、<br />韓国の「住民登録番号」について簡単に紹介したいと思います。<br /><br />
<a href="http://tech.voyagegroup.com/archives/5898804.html">続きを読む</a>]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>第29回すくすくスクラム 〜スクラムプロジェクト逆計画ゲーム〜に会場提供しました</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5799410.html" />
<modified>2012-01-31T04:24:06Z</modified> 
<issued>2012-01-31T13:23:02+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.5799410</id>
<summary type="text/plain">こんにちは、VOYAGE GROUPの水越(@Akiyah)です。1月30日(月)に、VOYAGE GROUPの会議室パンゲアで第29回すくすくスクラム 〜スクラムプロジェクト逆計画ゲーム〜というイベントが開催されました。主催はアジャイルプロセスの一つであるスクラムのコミュニティすくすくスクラム...</summary> 
<dc:subject>勉強会</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5799410.html">
<![CDATA[こんにちは、VOYAGE GROUPの水越(<a target="_blank" href="http://twitter.com/#%21/Akiyah">@Akiyah</a>)です。<br /><br />1月30日(月)に、VOYAGE GROUPの会議室パンゲアで<a target="_blank" href="http://kokucheese.com/event/index/25651/">第29回すくすくスクラム 〜スクラムプロジェクト逆計画ゲーム〜</a>というイベントが開催されました。<br /><br />主催はアジャイルプロセスの一つであるスクラムのコミュニティ<a target="_blank" href="http://www.sukusuku-scrum.org/">すくすくスクラム</a>であり、VOYAGE GROUPのアジャイル戦略室が会場提供をいたしました。<br /><br />

<a target="_blank" title="IMGP0043" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/9/c/9c1b8879.jpg"><img class="pict" hspace="5" alt="IMGP0043" border="0" height="120" width="160" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/9/c/9c1b8879-s.jpg"></a>
<br />会場の雰囲気
<br /><br />
<a target="_blank" title="IMGP0042" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/8/5/8590b14e.jpg"><img class="pict" hspace="5" alt="IMGP0042" border="0" height="120" width="160" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/8/5/8590b14e-s.jpg"></a>
<br />プロジェクト逆計画ゲームの様子
<br /><br />

イベントは参加者がプロダクトオーナー1人と開発者5人の6人チームになってプロジェクトを進めていくというものです。<br />『このプロジェクトは大成功で、顧客も大満足だった』という結論から始まって、ではいったいなにを実施してそのためになにを計画したのか、をイテレーション4からイテレーション1に向かって時間軸と逆順にたどっていきます。<br />時間が逆向きに進むので直感的に理解できなくて混乱しました。でもみんなでいろいろ考えて議論＆相談＆質問をしながらゲームを進めて、そうやってわいわいしゃべるのが楽しいゲームでした。<br /><br />会場で偶然以前の同僚に久しぶりに会えて、近況を報告しあいました。またイベント中に入り口から中の様子をのぞいている会社見学の学生さんがいたのでおしゃべりしました。コミュニティに参加するとこういう出会いがあっていいものだなと改めて感じることができましたよ。学生さんにとっては社会人とおしゃべりできるチャンスなので就職活動中の学生さんなどぜひコミュニティに参加してみてください。<br /><br />VOYAGE GROUPの会議室はイベントを開催したいというコミュニティの方に会場提供をしています。興味がある方はぜひご連絡くださいね。<br /><br />]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>2011年の振り返りと2012年の抱負</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5653908.html" />
<modified>2012-01-04T08:39:17Z</modified> 
<issued>2012-01-04T17:39:56+09:00</issued> 
<id>tag:blog.livedoor.jp,2012:ecnavi_tech.5653908</id>
<summary type="text/plain">すでに三が日も過ぎましたが、あけましておめでとうございます。CTO 小賀(@makoga)です。 昨年に引き続き、今年も年の初めは振り返りと抱負でいきたいと思います。2011年の振り返り昨年は若手エンジニアが書いた下記エントリが一番PVおよびブクマを稼ぎました。ブクマが1,00...</summary> 
<dc:subject></dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5653908.html">
<![CDATA[すでに三が日も過ぎましたが、あけましておめでとうございます。CTO 小賀(<a href="https://twitter.com/#!/makoga" target="_blank">@makoga</a>)です。<br />&nbsp;<a href="http://tech.voyagegroup.com/archives/2152992.html" target="_blank">昨年</a>に引き続き、今年も年の初めは振り返りと抱負でいきたいと思います。<br /><br /><br /><b><span style="font-size: medium; ">2011年の振り返り</span><br /></b><br />昨年は若手エンジニアが書いた下記エントリが一番PVおよびブクマを稼ぎました。ブクマが1,000を超えたのでお祝いに<a target="_blank" href="https://www.facebook.com/media/set/?set=a.276221202401600.72878.176439939046394&amp;type=3">AJITO</a>で軽いパーティーも行いましたｗ<ul><li><a href="http://tech.voyagegroup.com//archives/5088413.html" target="_blank">自分の周りに居る凄腕プログラマーが実際に読んでいる本</a></li></ul><br />その他ではRailsやSymfony2などのフレームワーク系のエントリが人気がありました。<ul><li><a target="_blank" href="http://tech.voyagegroup.com//archives/2971611.html">Rails(Web)アプリケーションのセキュリティ(パスワードハッシュstretch編)</a></li><li><a target="_blank" href="http://tech.voyagegroup.com/archives/1918549.html">Rails(Web)アプリケーションのセキュリティ(ログファイル編)</a></li><li><a href="http://tech.voyagegroup.com//archives/4395318.html" target="_blank">Symfony2のススメ1 ～認証とともに～</a></li><li><a target="_blank" href="http://tech.voyagegroup.com/archives/4536275.html">Symfony2のススメ1.5 ～コンポーネントちょい話～</a></li><li><a href="http://tech.voyagegroup.com/archives/4402391.html" target="_blank">Symfony2のススメ2 ～認証とともに～</a></li></ul><br />また、下記は一昨年に続き、昨年も検索エンジン経由でよく読まれました。<ul><li><a target="_blank" href="http://tech.voyagegroup.com//archives/465806.html">あなたにも今日こそPerlの文字化けが理解できるたった一つの原則</a></li><li><a href="http://tech.voyagegroup.com//archives/460163.html" target="_blank">iPad で「妄撮」をやってみました。</a></li><li><a target="_blank" href="http://tech.voyagegroup.com//archives/523885.html">MySQL InnoDBでのネクストキーロックの落とし穴</a></li></ul><br />一部の読者に人気のネタ系エントリでは後半のエース<a href="https://twitter.com/Akiyah" target="_blank">@Akiyah</a>がアンパンマン3部作など良エントリを連発。：）<ul><li><a href="http://tech.voyagegroup.com/archives/4613974.html" target="_blank">Rを使ってお絵描き（アンパンマン）</a>、<a href="http://tech.voyagegroup.com/archives/4633136.html" target="_blank">Rを使ってお絵描き（アンパンマン3D）</a>、<a target="_blank" href="http://tech.voyagegroup.com/archives/5228571.html">MacのGrapherでアンパンマン</a></li><li><a href="http://tech.voyagegroup.com/archives/5259117.html" target="_blank">グレートナビック風を動くようにした</a></li><li><a target="_blank" href="http://tech.voyagegroup.com/archives/5360889.html">VOYAGE WiMAXボーイ(36才)をぷにょっとさせた</a></li></ul><br />VOYAGE GROUP内では新卒エンジニアが書いた下記エントリも好評価でした。<ul><li><a target="_blank" href="http://tech.voyagegroup.com//archives/5275777.html">「新卒エンジニアがこのさき生き残るには」</a></li></ul><span style="font-size: x-small; ">※VG内エンジニアから<span style="white-space: pre-wrap; background-color: rgb(247, 247, 255); font-family: 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', 'MS Gothic', 'ＭＳ ゴシック', monospace; ">「この先生きのこる、にしない理由が分からない」</span>&nbsp;という声もありましたが、本人曰く「あえてしなかった」ということでした。<br /></span><br />最近ではVOYAGE GROUPの代名詞にもなっている(?)勉強会関係のエントリも多くありました。<ul><li><a href="http://tech.voyagegroup.com/archives/cat_32590.html" target="_blank">VOYAGE GROUP　エンジニアブログ : 勉強会</a></li><li><a target="_blank" href="http://tech.voyagegroup.com/archives/cat_95490.html">VOYAGE GROUP　エンジニアブログ : presentation<br /></a></li><li><a href="http://tech.voyagegroup.com/archives/cat_104852.html" target="_blank">VOYAGE GROUP　エンジニアブログ : イベント</a></li></ul><br /><br /><b><span style="font-size: medium; ">2012年の抱負</span></b><br /><br />昨年後半からVOYAGE GROUPは新しい技術にもより積極的に挑戦しています。Node.js, Sencha Touch, PhoneGap, MongoDB, Erlang, Behat, Rails3, Amazon Elastic MapReduce, etc.<br />今年はこれらの技術を使ってサービスを構築した際に得られたノウハウを順次このブログで公開していきたいと思います。<br /><br />また、技術系の話だけではなく、サービス作りについての話も企画しています。<br />昨年末から今年にかけてリリースが続いたこともあり、面白い内容にできそうで今から楽しみです。<br /><br />もちろん、昨年に引き続き、一部の方に好評なネタ要素が高いエントリも比率を落とさないように気を配りたいと思います。<br /><br />本年もよろしくお願い申し上げます。<br /><br />]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>エンジニアが参加して良かったデザインミニ塾</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5580844.html" />
<modified>2012-01-04T07:35:15Z</modified> 
<issued>2011-12-28T15:32:40+09:00</issued> 
<id>tag:blog.livedoor.jp,2011:ecnavi_tech.5580844</id>
<summary type="text/plain">こんにちは、VOYAGE GROUPの水越(@Akiyah)です。皆さん、デザインミニ塾というイベントを知っていますか？デザインミニ塾とは産業技術大学院大学でほぼ毎月開催されているデザインに関する勉強会です。塾と言っても申し込みをすれば誰でも無料の、毎回デザインの分野で活躍し...</summary> 
<dc:subject>勉強会</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5580844.html">
<![CDATA[こんにちは、VOYAGE GROUPの水越(<a style="color: blue !important; " target="_blank" href="http://twitter.com/#%21/Akiyah">@Akiyah</a>)です。<br /><br />皆さん、デザインミニ塾というイベントを知っていますか？<br />デザインミニ塾とは産業技術大学院大学でほぼ毎月開催されているデザインに関する勉強会です。<br />塾と言っても申し込みをすれば誰でも無料の、毎回デザインの分野で活躍している方を呼んで講演をしていただくという形式の気軽に参加できるイベントです。<br /><br />私はエンジニアなのですがデザインにも興味があるので、異文化交流と言う意味でもこのデザインミニ塾を2010年頃からちょくちょく見に行っています。大好きで毎月楽しみなイベントです。<br />思い返してみると2011年末現在までの約2年間で15回参加したようです。<br /><br />先日、社内勉強会でエンジニアやデザイナー、そしてUX(ユーザーエクスペリエンス)に興味がある人を集めてデザインミニ塾の紹介を行いました。デザインミニ塾の開催案内pdfファイルを見ながら私が印象に残った話を語ると言うスタイルで、質問や意見が出て盛り上がりました。<br /><br />その社内勉強会のときにまとめた資料があるので、再編集してこのブログにのせます。エンジニア目線で面白かった回をピックアップしました。<!--『第○回』と書かれたリンクは申し込みの時に配布された開催案内pdfです。--><br /><br />


<hr>
<!--a href="http://aiit.ac.jp/img/aiit/091225_design6.pdf">第6回</a-->
第6回
<br />「医療安全への終わりなき挑戦」<br />～ ヒューマンファクターとインタフェース ～<br />自治医科大学医学部メディカルシミュレーションセンター教授<br />河野 龍太郎 氏<br /><br />この第6回がはじめて参加したデザインミニ塾なのですが、自分の中ではデザインミニ塾で一番良かった回です。<br />『実務入門 ヒューマンエラーを防ぐ技術』という本の編集者でもある河野 龍太郎 氏の講演で、ヒューマンエラーが起こるわけと、その原因となるインターフェース上の問題を、医療現場、航空機、管制塔、原発などの事例を豊富に紹介していただきました。<br /><br />B = f(P,E)<br />B : Behavior（行動）<br />P : Person（人）<br />E : Environment（環境）<br /><br />という式をつかって、行動は人と環境を入力とする関数の結果であり、ヒューマンエラーを人のせいにせず、そのエラーを引き起こした環境に原因があると認識して改善すると主張されています。デザインミニ塾なのに工学やシミュレーションがリスク回避にとても大切だとエンジニアの大切さを主張されていたのが印象的です。<br /><br />

これに近い回では<!--a target="_blank" href="http://aiit.ac.jp/img/aiit/design_21_110701.pdf">第24回「ユーザを中心としたものづくり」人間中心設計への取組</a-->『第24回「ユーザを中心としたものづくり」人間中心設計への取組』で講演された、株式会社 U'eyes Design の鱗原氏のブログである<a target="_blank" href="http://usability.ueyesdesign.co.jp/diary/">使いやすさ日記</a>もデザインの善し悪しを冷静にマルバツつけていてとても参考になります。<br /><br />

<hr>
<!--a href="http://aiit.ac.jp/img/aiit/100430.pdf">第10回</a-->
第10回
<br />「公共交通とサイン」<br />
<a href="http://www.rei-jp.com/" target="_blank">アール・イー・アイ株式会社</a>代表取締役<br />中村 豊四郎 氏<br />
<br />地下鉄の案内のデザインを行った方の講演です。デザイナーの仕事は華々しいものだとイメージしていたのですが、フォントの性能の測定や配色の視認性の実験など、工学的で地道な作業を聞いて案外エンジニアと似ているんだなと思いました。<br />普段何気なく接している公共交通の案内図などですが、こういうところにデザイナー達の働きが隠されているのですね。<br /><br />

<hr>
<!--a href="http://aiit.ac.jp/img/aiit/20101115.pdf">第16回</a-->
第16回
<br />「デザインの力を生かすＬＧの戦略（仮）」<br />
LG Electronics Inc. デザイン研究センター HEB デザイン研究所 常務<br />洪 思允 氏
<br /><br />LGやサムソンと言った韓国の電機メーカーの名前はもちろん知っているのですが、日本の大手の電機メーカーと比べ物にならないくらいデザインに力を入れていると言う事を聞き、衝撃を受けました。同様の事を<!--a href="http://aiit.ac.jp/img/aiit/design_25_111128.pdf" target="_blank">第25回「日本のデザインにまだアドバンテージはあるか？  〜アジアの国々の取り組みと比較して〜」</a-->『第25回「日本のデザインにまだアドバンテージはあるか？  〜アジアの国々の取り組みと比較して〜」』でも聞いたので、改めて日本以外の国のデザインへの強い取り組みを感じることができます。<br /><br />


<hr>第18回<br />「カラーユニバーサルデザインをはじめとするUD デザイン活動のお話し」<br />
(株)武者デザインプロジェクト 代表取締役/UDソーシャルデザイナー<br />武者 廣平 氏<br /><br /><a target="_blank" href="http://www.cudo.jp/">カラーユニバーサルデザイン</a>の講演です。私は色彩も好きなのでとても興味深い回です。日本人男性の場合は色覚特性がC型以外のP型やD型の人（いわゆる色弱の方ですが、色覚特性と表現されます）が20分の1もいる事を知り、この話を聞いてからP型D型の人が見づらいかもしれない単純な赤を使う事ができなくなりました！（その代わりに少し青が混じったオレンジを使ったりします）<br /><br />


<hr>
<!--a href="http://aiit.ac.jp/img/aiit/design_19_20110304.pdf">第19回</a-->
第19回
<br />「「共感」から発想するデザインコンセプト～オブザベーションのご紹介」<br />
株式会社インフィールドデザイン 代表取締役<br />佐々木 千穂 氏<br /><br />相手に共感してデザインするオブザベーションという手法とともに、『私は三年間老人だった 明日の自分のためにできること』という本を紹介していただきました。26歳のデザイナーが老婆の特殊メイクをして街に出てみたら、若い自分が受けているのと全く違う対応を社会から受けるという衝撃的な本です。<br />相手に共感すると言うのはこういう事か、と同時にここまでしないと立場の違いはわからないのか、とショックを受けました。<br /><br />

<hr>
<!--a href="http://aiit.ac.jp/img/aiit/design_21_110701.pdf">第21回</a-->
第21回
<br />「異文化市場のお客さんの頭の中を探ろう ローカリゼーションマップの試み」<br />

モバイルクルーズ株式会社代表取締役<br />安西 洋之 氏<br />テツタロウデザイン代表<br />中林 鉄太郎 氏<br /><br />ローカリゼーションマップという概念についての回です。地域毎の考え方や文化の違いの事をローカリゼーションマップというようです。例えば女性がコンビニに行くとき、<a href="http://business.nikkeibp.co.jp/article/manage/20101201/217354/" target="_blank">日本人なら日焼け止めクリームや乳液、フランス人なら香水、アメリカ人ならアイメイク</a>、と言った違いがあるのだそうです。その他にもメキシコではマルちゃんが国民食として、メキシコの食材とあわせて調理して食べられているというローカリゼーションマップの成功例も紹介されました。これらは『「マルちゃん」はなぜメキシコの国民食になったのか？ 世界で売れる商品の異文化対応力』という講演された安西氏と中林氏の本でも紹介されています。<br /><br />
<hr><br />さて、いかがでしょうか。興味が出てきた方もいるのではないでしょうか。<br />実は参加するにはpdfにかかれているメールアドレスにメールを送らないといけないのですが、デザインミニ塾の次回の予定は<a target="_blank" href="http://aiit.ac.jp">産業技術大学院大学</a>のトップページにお知らせが書かれてから知る事ができるという、すこしややこしい方法なのです。興味がある方は次回から申し込みでくじけずにぜひ参加してみてください。<br /><br />]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>

<entry>
<title>滅びの言葉をテストする</title> 
<link rel="alternate" type="text/html" href="http://tech.voyagegroup.com/archives/5505566.html" />
<modified>2011-12-09T15:00:21Z</modified> 
<issued>2011-12-10T00:00:16+09:00</issued> 
<id>tag:blog.livedoor.jp,2011:ecnavi_tech.5505566</id>
<summary type="text/plain">こんばんは。VOYAGE GROUPの野良クルー、@katzchangです。ところでみなさん、バルスしてますか？バルスとは滅びの言葉、つまりおまいらに解かりやすく言うと、異常系処理をキックするコマンドなわけです。で、やはり、異常系処理も含めてテストされるべきですよ。当然ですね...</summary> 
<dc:subject>programming</dc:subject>
<content type="text/html" mode="escaped" xml:lang="ja" xml:base="http://tech.voyagegroup.com/archives/5505566.html">
<![CDATA[こんばんは。VOYAGE GROUPの野良クルー、<a href="http://twitter.com/katzchang" target="_blank" title="@katzchang">@katzchang</a>です。<br /><br />ところでみなさん、<b>バルス</b>してますか？<br /><br /><a title="バルスとは" target="_blank" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%EB%A5%B9">バルス</a>とは滅びの言葉、つまりおまいらに解かりやすく言うと、<b>異常系処理</b>をキックするコマンドなわけです。で、やはり、異常系処理も含めてテストされるべきですよ。<b>当然</b>ですね。<br /><br />ということで、<a title="テスト駆動開発" target="_blank" href="http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA">テスト駆動開発</a>、いわゆるTDD"風味"で、バルスのJava実装を作ってみました。とはいえ、要するに System.exit(1) すればよいので、実装は大したことがない。でも、実際にどのような動作になるか、あまり試したことがないのは僕だけじゃないはず。試す価値はありそうです。<br /><br />方針としては、balseメソッドを実装したBalsableクラスを用意し、システムが無事に異常終了することを確認すればよいということにします。<br /><br />さて、いきましょう。<br /><blockquote><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; font: 12px 'Bitstream Vera Sans Mono',Courier,monospace; background-color: rgb(255, 255, 255);"><div style="margin: 0px; padding: 0px 0px 0px 1em;" id="LC1" class="line"><span style="font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; "><span style="line-height: 16px; ">package balse;

import static org.junit.Assert.*;

import org.junit.Test;

public class BalsableTest {

	@Test
	public void test() {
		new Balsable().balse();
		fail();
	}

}</span></span></div></pre></blockquote>テストコードはこんな感じ、<span style="font-size: 12px; line-height: 16px; white-space: pre; 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-weight: bold; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="k">new</span><span style="font-size: 12px; line-height: 16px; white-space: pre; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; "> </span><span style="font-size: 12px; line-height: 16px; white-space: pre; 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-weight: bold; color: rgb(153, 0, 0); font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="nf">Balsable</span><span style="font-size: 12px; line-height: 16px; white-space: pre; 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-weight: bold; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="o">().</span><span style="font-size: 12px; line-height: 16px; white-space: pre; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: rgb(0, 128, 128); font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="na">balse</span><span style="font-size: 12px; line-height: 16px; white-space: pre; 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-weight: bold; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="o">();</span>を実行すると、次の<span style="font-size: 12px; line-height: 16px; white-space: pre; 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: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="n">fail</span><span style="font-size: 12px; line-height: 16px; white-space: pre; 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-weight: bold; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; " class="o">();</span>が実行されないはずです。そうです、このときはそう信じていました………。alt + shift + x, t。<br /><br /><a target="_blank" title="first_test_gray" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/8/0808da14.png"><img width="160" hspace="5" height="119" border="0" class="pict" alt="first_test_gray" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/0/8/0808da14-s.png"></a><br /><br />よし、Gre……………y……？<br /><br />なんと、JUnit test runnerがバルスしてしまいました。バルスマジバルス。<br /><br />仕方がないから、外部プロセスとして実行し、結果を確認することにします。<b>方針転換</b>ってやつです。<br /><br />こんな感じにテスト用のランナーを用意し、<blockquote><pre style="background-image: none; background-attachment: scroll; background-color: rgb(255, 255, 255); padding: 0px; word-wrap: break-word; margin-top: 0px; margin-bottom: 0px; text-align: left; font: 12px 'Bitstream Vera Sans Mono',Courier,monospace; background-position: 0px 0px;"><div style="margin: 0px; padding: 0px 0px 0px 1em;" id="LC7" class="line"><span 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; " class="o"><span><span style="font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; ">package balse;<br /><br />public class BalsableRunner {
	public static void main(String...args) {
		new Balsable().balse();
	}
<span style="color: rgb(89, 93, 104); "><span style="font-weight: 800; white-space: pre-wrap; ">}</span></span></span></span></span></div></pre></blockquote>外部プロセスとして実行させます。<br /><blockquote><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; font: 12px 'Bitstream Vera Sans Mono',Courier,monospace; background-color: rgb(255, 255, 255);"><div class="line" id="LC20" style="margin: 0px; padding: 0px 0px 0px 1em;"><span style="font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; "><span style="line-height: 1.4; ">@Test</span></span></div><div class="line" id="LC27" style="margin: 0px; padding: 0px 0px 0px 1em;"><span 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; " class="o"><span style="font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; ">public void testBalsableProcess() throws Exception {
	ProcessBuilder pb = new ProcessBuilder("java",
			"-classpath", "./target/test-classes;./target/classes",
			"balse.BalsableRunner");
	Process p = pb.start();
	assertThat(p.waitFor(), is(1));
}<span style="line-height: 16px; "><b><br /></b></span></span></span></div></pre></blockquote><a target="_blank" title="green" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/c/1/c1772cee.png"><img width="160" hspace="5" height="119" border="0" class="pict" alt="green" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/c/1/c1772cee-s.png"></a><br /><br />今度はGreen。ちゃんとバルスできています。<br /><br />ところが、ここで<b>心配</b>になりました。このバルスは、ちゃんとプロセス全体をバルスしているのでしょうか？マルチスレッドでも問題なくバルスるのでしょうか？<br /><br />そう、<b>不安があったらテスト</b>しましょう。<br /><br /><a title="BalsableThreadRunner.java" target="_blank" href="https://github.com/katzchang/balse/blob/233b9890e88d54a75b390b8dfb38ec94f164f62d/src/test/java/balse/BalsableThreadRunner.java">マルチスレッドを使ったテスト用ランナー</a>を用意し、それをテストします。今度はリターンコードだけではなく、スレッドが実行されていることを確かめるべく、標準出力の内容も検査することにします。<br /><blockquote><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; font: 12px 'Bitstream Vera Sans Mono',Courier,monospace; background-color: rgb(255, 255, 255);"><div style="margin: 0px; padding: 0px 0px 0px 1em;" id="LC24" class="line"><span style="font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; "><span style="line-height: 16px; ">@Test
public void testBalsableThread() throws Exception {
	ProcessBuilder pb = new ProcessBuilder("java", "-classpath",
			"./target/test-classes;./target/classes",
			"balse.BalsableThreadRunner");
	Process p = pb.start();
	assertThat(p.waitFor(), is(1));
<br /><span style="white-space: pre; ">	</span>// TODO: helperを作るべき
	InputStream is = p.getInputStream();
	BufferedReader br = new BufferedReader(new InputStreamReader(is));
	String line;
	List&lt;String&gt; lines = new ArrayList&lt;String&gt;();
	while ((line = br.readLine()) != null) lines.add(line);
	is.close();

	assertThat(lines.size(), is(2));
	assertThat(lines.get(0), is("時間だ！！答えを聞こう！！"));
	assertThat(lines.get(1), is("バルス！"));
}</span></span></div></pre></blockquote><a target="_blank" title="バルス！" href="http://livedoor.blogimg.jp/ecnavi_tech/imgs/3/c/3c87c1bc.png"><img width="160" hspace="5" height="119" border="0" class="pict" alt="バルス！" src="http://livedoor.blogimg.jp/ecnavi_tech/imgs/3/c/3c87c1bc-s.png"></a><br /><br />はい、Green。標準出力の内容も意図通りのようです。<br /><br />他のコードも含めて&nbsp;<a href="https://github.com/katzchang/balse">https://github.com/katzchang/balse</a>&nbsp;にコミットしていますので、煮るなり焼くなり好きにしてください。<br /><br />これを他のプロダクトに組み込む場合、直接System.exit(1)を呼ぶより、Balsableを通して呼ぶように変えることができます。そのときのテストとしては、MockBalsableを用意し、モックのbalse()メソッドが呼ばれたことを確認すれば、プロダクトへのバルス実装は完了です（Balsableにももう少し手を加える必要はあります）。そして、end-to-endテストとして実際にBalsableを組み込んだ上でバルスしていることを確認できれば、<b>出荷可能</b>です。<br /><br />さて、この記事は<a title="TDD Advent Calendar jp: 2011" target="_blank" href="http://atnd.org/events/22027">TDD Advent Calendar jp: 2011</a>の10日目の記事でした。<br /><br />9日目の記事は<a title="@yujiorama" target="_blank" href="http://twitter.com/yujiorama">@yujiorama</a>の<a title="C言語でもレガシーでも、TDD をやってやれないことはない(レガシーコード改善成分90%、TDD成分10%)" target="_blank" href="http://d.hatena.ne.jp/yujiorama/20111209/1323356701">C言語でもレガシーでも、TDD をやってやれないことはない(レガシーコード改善成分90%、TDD成分10%)</a>、明日は大学でテスト駆動開発プロセスを研究してる<a title="@pocketberserker" target="_blank" href="http://twitter.com/pocketberserker">@pocketberserker</a>です。きっと読み応えのある記事を書いてくれることでしょう……！！<br /><br />純粋なTDDではないけど、まぁこんな感じで進めてますということで…。]]> 
</content>
<author>
<name>voyagegroup_tech</name> 
</author>
</entry>
</feed>

