<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-988385995704066370</id><updated>2012-02-29T15:55:26.201+09:00</updated><category term='node.js'/><category term='要求項目'/><category term='エディタ'/><category term='ガラケー'/><category term='javascript'/><category term='IPv4枯渇'/><category term='仮想化'/><category term='ClickableCanvas'/><category term='OpenVZ'/><category term='megumi'/><category term='Selenium'/><category term='AmazonEC2'/><category term='監視'/><category term='monit'/><category term='CI'/><category term='ブラウザ'/><category term='inomata'/><category term='github'/><category term='ビルド'/><category term='DBI'/><category term='hbstudy'/><category term='テストケースCI'/><category term='BSD'/><category term='スクレイピング'/><category term='ou.g'/><category term='Web'/><category term='CROSS2012'/><category term='jCanvas'/><category term='scraping'/><category term='qpstudy'/><category term='jQueryMobile'/><category term='agile'/><category term='chappie'/><category term='git'/><category term='Chrome'/><category term='開発プロセス'/><category term='パフォーマンステスト'/><category term='kmt'/><category term='Solaris'/><category term='Backlog'/><category term='プログラミング'/><category term='eclipse'/><category term='SSL'/><category term='vim'/><category term='Apache'/><category term='aws'/><category term='勉強会'/><category term='堀譲治'/><category term='WCCF'/><category term='開発環境'/><category term='オフショア'/><category term='アーキテクチャ'/><category term='HTML5'/><category term='IPv6'/><category term='mod_rewite'/><category term='Socket.io'/><category term='要件定義'/><category term='jQuery'/><category term='SSH'/><category term='Salesforce'/><category term='WebSocket'/><category term='QA'/><category term='sugimoto'/><category term='numa'/><category term='son'/><category term='fujya.sh'/><category term='putty'/><category term='リモート接続'/><category term='Perl'/><category term='Healer'/><category term='Haskell'/><category term='Playframework'/><category term='Yana'/><category term='テスト'/><category term='Canvas'/><category term='Firefox'/><category term='PostgreSQL'/><category term='Jenkins'/><category term='レポート'/><category term='FitNesse'/><category term='ikeike443'/><category term='Linux'/><category term='Scrum'/><category term='雑記'/><category term='koya'/><category term='inoue'/><category term='ユニットテスト'/><category term='XSS'/><category term='Webkit'/><category term='nishino'/><category term='仕様策定'/><category term='ネットワーク'/><category term='kiyoto.s'/><category term='Gecko'/><title type='text'>株式会社シャノン技術ブログ</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>67</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-5112635644273995240</id><published>2012-02-29T15:55:00.000+09:00</published><updated>2012-02-29T15:55:26.286+09:00</updated><title type='text'>オライリーさんの『Jenkins』（通称カエル本）に寄稿しました</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ec2.images-amazon.com/images/I/51v-MV54goL._SL500_AA300_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="Jenkins" border="0" height="300" id="prodImage" src="http://ec2.images-amazon.com/images/I/51v-MV54goL._SL500_AA300_.jpg" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;こんにちは。&lt;a href="https://twitter.com/ikeike443" target="_blank"&gt;ikeike443&lt;/a&gt;です。せっかくの閏年なので投稿してみました！&lt;br /&gt;ちなみにこの記事は私の&lt;a href="http://d.hatena.ne.jp/ikeike443/20120226/p1" target="_blank"&gt;個人ブログと同内容&lt;/a&gt;をクロスポストしています。ご了承ください。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;寄稿しました&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;去る2月22日にオライリー・ジャパンさんから発売された『Jenkins』（通称カエル本）に、縁あって寄稿させていただきました。&lt;br /&gt;&lt;b&gt;”付録B プラグインの開発”&lt;/b&gt;という記事です。&lt;br /&gt;帯にも記載されているとおり、Play! frameworkプラグインを例にして、プラグイン開発について簡単なチュートリアルを書かせてもらいました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;正直、Playみたいな（新しいけど）マイナーなフレームワークを題材にしていいんですか、という疑問があって、お話をくださった訳者の玉川さんには何度か確認したのですが、ぜひPlayで、とのことだったので、思い切って書かせていただきました。&lt;br /&gt;ぜひ、手にとってお確かめください！&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=ikeike443-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4873115345" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;初心者から上級者までカバーする決定版&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;さて、この本は、先に出版された技術評論社さんの『Jenkins実践入門』と比較すると、中級者むけのやや難しい本、という紹介がされているようです。&lt;br /&gt;ですが、私はそうは思っていません。&lt;br /&gt;確かに、第2章の初めの一歩という章でいきなりMavenとGitが出てくるのは、日本のIT業界の現状を考えると厳しいかも知れませんが、インストールの仕方について説明は書いてありますし、Jenkinsを手にとって読もうと考えるような人（プロジェクトのリーダーだったり、ライブラリアンだったりリリースマネージャーだったりする人）であれば、仮にMavenやGitに馴染みがなくても、何とかできると思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;この本は、初めてJenkinsに触れようとしている方や、継続的インテグレーションって聞いたことあるけどなんのことだっけ、という方のために、まず第1章でJenkinsと継続的インテグレーションについての概説から説き起こしてくれます。&lt;br /&gt;目次については&lt;a href="http://www.oreilly.co.jp/books/9784873115344/" target="_blank"&gt;こちらを参照してください&lt;/a&gt;。（目次タブをクリック）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;とりあえずJenkinsについて知りたい人は第2章まで、さらに第6章まで読めばかなり分かる&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;続く第2章ではとりあえずJenkinsをクイックに起動して一通り試してみるための方法について触れています。第3章では、各種OSにおけるJenkinsのインストールの仕方、Apacheのリバースプロキシの設定の仕方、TomcatなどJEEアプリケーションサーバでの動かし方、といったサーバの設定にもページを割いて丁寧に説明しています。&lt;br /&gt;第4章ではJenkinsのシステム設定について、第5章ではビルドジョブの設定、第6章では自動テストの設定の仕方、コードカバレッジをとる方法、JMeterを使ったパフォーマンステストなどについて詳しく丁寧な解説があります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;初めてJenkinsに触れるという方は、第2章まで読めば、とりあえずJenkinsを動かして、一通りの流れを試すことが出来ます。まず概要を掴むには第2章までで充分です。&lt;br /&gt;さらに第6章まで読めば、サーバのセットアップからビルドジョブの設定、自動テストのやり方までひと通り学ぶことが出来ます。&lt;br /&gt;このように、ステップバイステップでJenkinsに慣れていくことが出来るように書かれています。&lt;br /&gt;かなり丁寧に書かれているので、この本を読みながら設定すれば、きっと動かすことが出来るはずです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;セキュリティについての第7章、通知のバリエーションについてやたら詳しくなれる第8章&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;さらに、第7章ではセキュリティ、ユーザー権限管理についても詳しく説明があります。大きな組織でテストやリリースを管理されている場合、この章はかなり役立つのではないでしょうか。&lt;br /&gt;第8章ではメールやIRCなどによる、ビルド結果の通知について掘り下げています。このあたりからこの本は少しずつマニアックな面を見せてきます。メールで使える変数の解説はもちろん、デスクトップ通知やSMSへの通知について触れ、ビルドラジエータという概念についても説明し始め、さらにはSoundsプラグインやSpeaksプラグインを使って、ビルド結果を音を鳴らしたり、コンピュータにしゃべらせて通知するなんていう方法も教えてくれます。（こんなの知らなかった。。）&lt;br /&gt;さらに、XFDについても触れていて、お約束のNabaztagをフィーチャーしています。&lt;br /&gt;Jenkinsによってテストやビルドを自動化していても、成功や失敗の事実をきちんと人間がキャッチできなければ意味がありません。&lt;br /&gt;通知について1章を割いて熱く語るのもわかるなー、という感想をもちました。&lt;br /&gt;特に、成功ビルドや失敗ビルドをまとめてメンバーの眼を引くような場所に（大型ディスプレイなどに）映しだしておく、というビルドラジエータという方法はいいなあと思いました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;徐々に高度に：ビルドプロモーション、分散ビルド、継続的デリバリ&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;第9章でCheckStyleやFindbugsといった静的解析ツールについて触れ、Sonarとの統合について説明した後、さらに高度な内容の説明に入っていきます。第10章ではパラメータ化ビルドジョブやマルチ構成ビルドジョブについての詳説、並列ビルドやビルドパイプライン、ビルドプロモーションといった本当に高度な、しかし大きなプロジェクトを成功させようと思ったら必ず必要になる知識が山盛りになっています。&lt;br /&gt;第11章はJenkinsの分散ビルドについて詳しく知ることが出来ます。EC2プラグインや、CloudBeesのDEV@Cloudについても説明があります。プロジェクトが成長してスローテスト問題が顕在化してくると、複数ノードを使った分散ビルドを検討するようになります。分散ビルドがかなりイージーにセットアップ出来るのもJenkinsの特徴ですよね。&lt;br /&gt;第12章ではさらに一歩進んで、デプロイの自動化と継続的デリバリについて触れられています。Mavenリポジトリへのデプロイや、アプリケーションのデプロイについて触れています。デプロイで問題になるのはアプリケーションの更新よりもデータベースの更新（スキーマの変更や出荷データの更新）だと思いますが、このあたりは軽く触れられているだけで、まだまだこれからの分野なのかな、と思わせます。継続的デリバリについてはそれだけで一冊本があるくらいですしね。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;メンテナンスについてもフォローしてるよ&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;この本が素晴らしいのは、第13章でJenkinsのメンテンナンスについてもきちんと目配せしていることです。ディスク使用量の監視やバックアップの仕方、ビルドジョブの移行（別のJenkinsインスタンスへビルドジョブだけを移行する）についても触れています。これは長期間継続的にJenkinsを使っていると必ず問題になるところです。&lt;br /&gt;メンテナンスまでしっかりフォローしているのは本当にさすがという感じです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;付録までついてお腹いっぱい&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;さらに、付録AではMavenとAntで自動テストを書く方法、付録Bではプラグインを書く方法（僕の記事！）までフォローされていて、本当にお腹いっぱいになります。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Jenkinsについてのバイブル&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Jenkinsを初めて使おうとしている人から、今使っている人まで、全てのJenkinsユーザーが常に傍らに常備しておくべきバイブル、それがこの『Jenkins』という本だと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;というわけでみなさん、よかったらお買い求めを！&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&amp;amp;bc1=000000&amp;amp;IS2=1&amp;amp;bg1=FFFFFF&amp;amp;fc1=000000&amp;amp;lc1=0000FF&amp;amp;t=ikeike443-22&amp;amp;o=9&amp;amp;p=8&amp;amp;l=as4&amp;amp;m=amazon&amp;amp;f=ifr&amp;amp;ref=ss_til&amp;amp;asins=4873115345" style="height: 240px; width: 120px;"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-5112635644273995240?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/5112635644273995240/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/jenkins.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5112635644273995240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5112635644273995240'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/jenkins.html' title='オライリーさんの『Jenkins』（通称カエル本）に寄稿しました'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-1129724429724076210</id><published>2012-02-24T05:23:00.011+09:00</published><updated>2012-02-24T05:35:38.760+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Playframework'/><category scheme='http://www.blogger.com/atom/ns#' term='Backlog'/><category scheme='http://www.blogger.com/atom/ns#' term='Salesforce'/><category scheme='http://www.blogger.com/atom/ns#' term='nishino'/><title type='text'>Play! でつなげるWebサービス(XML-RPC/OAuth2.0)</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ごきげんよう　&lt;a href="http://www.blogger.com/profile/15291112813871756041" target="_blank"&gt;nishino@サポートの人&lt;/a&gt; です。&lt;/div&gt;&lt;div&gt;普段はお仕事として弊社サービスに関する問い合わせやトラブルの対応をやっております。&lt;/div&gt;&lt;div&gt;社内外の問い合わせデータを集約したいなーという思惑のもと、今回は弊社で使用しているWebサービスのデータをAPIで取得してみようと思います。&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;Play!frameworkで各種Webサービスにつながってみる&lt;/h3&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回、データの集約をしたいWebサービスは、バックログさんとセールスフォースさんです。ちなみにシャノンさんもAPIでつながることができます。是非つながりたい人は、&lt;a href="http://www.shanon.co.jp/product/marketingplatform/" target="_blank"&gt;こちらの&lt;/a&gt;SHANON MARKETING PLATFORMをご購入いただくか、右上の「人材募集」バナーをクリック！クリック！してください。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;バックログ&lt;/h3&gt;&lt;a href="http://www.backlog.jp/"&gt;http://www.backlog.jp/&lt;/a&gt;&lt;br /&gt;nulab社が提供する「楽しくチームで仕事ができる」プロジェクト管理のWebサービスです。&lt;br /&gt;シャノンCRM部および技術部（QA）では、主に社内の問い合わせをバックログに登録し、ナレッジベースとして活用しています。&lt;br /&gt;このブログでも何度か紹介されていますね。&lt;br /&gt;&lt;a href="http://shanon-tech.blogspot.com/2011/02/blog-post_02.html" target="_blank"&gt;開発者にやさしい環境&lt;/a&gt;&lt;br /&gt;&lt;a href="http://shanon-tech.blogspot.com/2012/02/yana-201112-httpwww.html" target="_blank"&gt;クラウド時代のプロジェクトマネジメント&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;セールスフォース&lt;/h3&gt;&lt;a href="https://www.salesforce.com/" target="_blank"&gt;https://www.salesforce.com/&lt;/a&gt;&lt;br /&gt;セールスフォース・ドットコム社が提供する「CRM （顧客関係管理）」のWebサービスです。&lt;br /&gt;シャノンCRM部では、社外からの問い合わせをSalesforceのケースに登録しています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Webサービスのプロトコル&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Webサービスと連携するためのプロトコルはいくつかあります。&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;XML-RPC&lt;/li&gt;&lt;li&gt;JSON-RPC&lt;/li&gt;&lt;li&gt;SOAP&lt;/li&gt;&lt;li&gt;REST（正確にはプロトコルではなくアーキテクチャスタイル）&lt;/li&gt;&lt;li&gt;OAuth&lt;/li&gt;&lt;li&gt;OAuth 2.0&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;今回は、XML-RPC（バックログ）、OAuth 2.0（セールスフォース）によるAPI連携を行います。&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;XML-RPC&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;XML-RPCは、RPCプロトコルの一種であり、エンコード（符号化）にXMLを採用し、転送機構に HTTP を採用してます。非常に単純なプロトコルで、少数のデータ型やコマンドだけを定義しているだけです。（&lt;a href="http://ja.wikipedia.org/wiki/XML-RPC" target="_blank"&gt;Wikipedia&lt;/a&gt;からの抜粋です）&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Backlogは、XML-RPCでAPI連携できますので、さっそくPlay!でつながってみようと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;、、とその前に&lt;/h3&gt;&lt;br /&gt;取得したデータは、前回の投稿「&lt;a href="http://shanon-tech.blogspot.com/2011/12/play-framework.html" target="_blank"&gt;Play! frameworkでつくるスクリーンショット取得サービス&lt;/a&gt;」で紹介したcrudモジュールを使って表示します。知らないよ～って方は前回の投稿も覗いてみてください。&lt;br /&gt;&lt;br /&gt;モデルはこんな感じです。&lt;br /&gt;hoge/app/models/Data.java&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package models;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.Lob;&lt;br /&gt;import play.db.jpa.Model;&lt;br /&gt;import play.data.validation.MaxSize;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Data extends Model {&lt;br /&gt;public String code;&lt;br /&gt;public String question;&lt;br /&gt;@Lob&lt;br /&gt;@MaxSize(4000)&lt;br /&gt;public String answer;&lt;br /&gt;&lt;br /&gt;public Data(String code, String question, String answer) {&lt;br /&gt;this.code = code ;&lt;br /&gt;this.question = question;&lt;br /&gt;this.answer = answer;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String toString() {&lt;br /&gt;return code + ":" + question;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;crudモジュールを使用したコントローラはこんな感じです。&lt;br /&gt;hoge/app/controllers/Datas.java&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import play.*;&lt;br /&gt;import play.mvc.*;&lt;br /&gt;&lt;br /&gt;public class Datas extends CRUD {}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;では、話を戻して&lt;/h3&gt;&lt;br /&gt;XML-RPCをつかって、バックログにアクセスしてみます。&lt;br /&gt;コントローラにbacklog()メソッドを追加します。&lt;br /&gt;&lt;br /&gt;hoge/app/controllers/Application.java&lt;br /&gt;&lt;pre class="java" name="code"&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import play.*;&lt;br /&gt;import play.mvc.*;&lt;br /&gt;import jobs.*;&lt;br /&gt;&lt;br /&gt;public class Application extends Controller {&lt;br /&gt;&lt;br /&gt;public static void index() {&lt;br /&gt;render();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void backlog() {&lt;br /&gt;new ImportBacklog().now();&lt;br /&gt;redirect("/datas/list");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;backlog()メソッドでは、Play!frameworkの&lt;a href="http://playdocja.appspot.com/documentation/1.2.3/jobs" target="_blank"&gt;ジョブ機能&lt;/a&gt;を使って、非同期に実行後、/datas/listにリダイレクトしています。&lt;br /&gt;処理の実装はImportBacklog ジョブに記述します。&lt;br /&gt;&lt;br /&gt;hoge/app/jobs/ImportBacklog.java&lt;br /&gt;&lt;pre class="java" name="code"&gt;package jobs;&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;import play.*;&lt;br /&gt;import play.jobs.*;&lt;br /&gt;import play.libs.WS;&lt;br /&gt;import play.libs.WS.*;&lt;br /&gt;import play.libs.XPath;&lt;br /&gt;import play.templates.*;&lt;br /&gt;import org.w3c.dom.*;&lt;br /&gt;import models.*;&lt;br /&gt;&lt;br /&gt;public class ImportBacklog extends Job {&lt;br /&gt;&lt;br /&gt;public void doJob() {&lt;br /&gt;String authorizeUrl = "https://shanonpj.backlog.jp/XML-RPC";&lt;br /&gt;String clientId = "loginId";&lt;br /&gt;String clientSecret = "password";&lt;br /&gt;&lt;br /&gt;WSRequest wsrequest = WS.url(authorizeUrl).authenticate(clientId, clientSecret);&lt;br /&gt;&lt;br /&gt;Template template = TemplateLoader.load("conf/backlog.findIssue.xml");&lt;br /&gt;Map&amp;lt;String, Object&amp;gt; templateMap = new HashMap&lt;string, object=""&gt;(16);&lt;br /&gt;templateMap.put("projectId", "5816");&lt;br /&gt;templateMap.put("limit", "100");&lt;br /&gt;templateMap.put("offset", "0");&lt;br /&gt;&lt;br /&gt;wsrequest.body = template.render(templateMap);&lt;br /&gt;&lt;br /&gt;Document document = wsrequest.post().getXml();&lt;br /&gt;&lt;br /&gt;Map&amp;lt;String, String&amp;gt; map = new HashMap&lt;string, string=""&gt;(16);&lt;br /&gt;for(Node node: XPath.selectNodes("//data/value/struct/member", document)) {&lt;br /&gt;String name = XPath.selectText("name", node);&lt;br /&gt;String value = XPath.selectText("value", node);&lt;br /&gt;&lt;br /&gt;if(name.equals("key") || name.equals("summary") || name.equals("description")) {&lt;br /&gt;map.put(name, value);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(map.size() == 3) {&lt;br /&gt;// create Data&lt;br /&gt;Data data = Data.find("byCode", map.get("key")).first();&lt;br /&gt;if(data == null) {&lt;br /&gt;data = new Data(map.get("key"), map.get("summary"), map.get("description"));&lt;br /&gt;data._save();&lt;br /&gt;}&lt;br /&gt;map.clear();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/string,&gt;&lt;/string,&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;バックログAPIは、ログインIDとパスワードで認証します（ベーシック認証）。&lt;br /&gt;今回は課題データをごっそり持ってきたかったので、backlog.findIssueメソッドを使用します。&lt;br /&gt;Backlog API:&lt;br /&gt;&lt;a href="http://www.backlog.jp/api/method3_4.html" target="_blank"&gt;http://www.backlog.jp/api/method3_4.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;xmlrpcライブラリでさくっと取ってきたかったのですが、なぜかうまくいかなかったので今回はテンプレートを使ってxmlを生成しています。&lt;br /&gt;hoge/conf/backlog.findIssue.xml&lt;br /&gt;&lt;pre class="java" name="code"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;methodCall&amp;gt;&lt;br /&gt;&amp;lt;methodName&amp;gt;backlog.findIssue&amp;lt;/methodName&amp;gt;&lt;br /&gt;&amp;lt;params&amp;gt;&lt;br /&gt;&amp;lt;param&amp;gt;&lt;br /&gt;&amp;lt;value&amp;gt;&lt;br /&gt;&amp;lt;struct&amp;gt;&lt;br /&gt;&amp;lt;member&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;projectId&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&lt;br /&gt;    &amp;lt;int&amp;gt;${projectId}&amp;lt;/int&amp;gt;&lt;br /&gt;  &amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;member&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;limit&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&lt;br /&gt;    &amp;lt;int&amp;gt;${limit}&amp;lt;/int&amp;gt;&lt;br /&gt;  &amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;member&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;offset&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&lt;br /&gt;    &amp;lt;int&amp;gt;${offset}&amp;lt;/int&amp;gt;&lt;br /&gt;  &amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;member&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;sort&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;value&amp;gt;&lt;br /&gt;    &amp;lt;string&amp;gt;CREATED&amp;lt;/string&amp;gt;&lt;br /&gt;  &amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/member&amp;gt;&lt;br /&gt;&amp;lt;/struct&amp;gt;&lt;br /&gt;&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;/params&amp;gt;&lt;br /&gt;&amp;lt;/methodCall&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;リクエスト用XMLは、play.templateのrender()メソッドをつかって値を置き換えています。（projectIdとlimitとoffset）&lt;br /&gt;課題データのうち、課題キー（key）と件名（summary）と詳細（description）を取得したら、課題キーをキーに既に登録されていないかを確認して、もしなければDataモデルを新規作成しています。&lt;br /&gt;http://localhost:9000/application/backlog へアクセスすると&lt;br /&gt;こんな感じで、データが取得できました。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-0BmiYdZu-Bg/T0aco9Hf_MI/AAAAAAAAAEc/yjYKnwwyFEg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-02-24%2B5.05.01.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 284px;" src="http://3.bp.blogspot.com/-0BmiYdZu-Bg/T0aco9Hf_MI/AAAAAAAAAEc/yjYKnwwyFEg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-02-24%2B5.05.01.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5712425404780772546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;OAuth 2.0&lt;/h3&gt;&lt;br /&gt;OAuth 2.0は、セキュアなAPI認可 (authorization) の標準的手段を提供する認証プロトコルです。（&lt;a href="http://ja.wikipedia.org/wiki/OAuth" target="_blank"&gt;Wikipedia&lt;/a&gt;からの抜粋です）&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;SalesforceのOAuth 2.0接続に関しては、以下の公式サイトに詳しい手順があるので、この通り実装します。&lt;br /&gt;&lt;a href="http://blogjp.sforce.com/2011/04/forcecom-rest-a-4182.html" target="_blank"&gt;http://blogjp.sforce.com/2011/04/forcecom-rest-a-4182.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;では、さっそくPlay!でつながってみます。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;コントローラは、認証用URLとコールバック用URLの２つのアクセスがあるので、新たにsfdc()とcallback()を追加します。&lt;br /&gt;hoge/app/controllers/Application.java&lt;br /&gt;&lt;pre class="java" name="code"&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import play.*;&lt;br /&gt;import play.mvc.*;&lt;br /&gt;import jobs.*;&lt;br /&gt;&lt;br /&gt;public class Application extends Controller {&lt;br /&gt;&lt;br /&gt;public static void index() {&lt;br /&gt;render();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void backlog() {&lt;br /&gt;new ImportBacklog().now();&lt;br /&gt;redirect("/datas/list");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void sfdc() {&lt;br /&gt;String authorizeUrl = "https://login.salesforce.com/services/oauth2/authorize";&lt;br /&gt;String redirectUrl = "http://localhost:9000/application/callback";&lt;br /&gt;String clientId = "loginid";&lt;br /&gt;String url = authorizeUrl + "?response_type=code&amp;amp;client_id=" + clientId + "&amp;amp;redirect_uri=" + redirectUrl;&lt;br /&gt;redirect(url);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public static void callback() {&lt;br /&gt;String code = params.get("code");&lt;br /&gt;new ImportSfdc(code).now();&lt;br /&gt;&lt;br /&gt;redirect("/datas/list");&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Play!frameworkには、&lt;a href="http://www.playframework.org/documentation/api/1.2.4/play/libs/OAuth2.html" target="_blank"&gt;play.lib.OAuth2&lt;/a&gt;というヘルパークラスがあるのですが、Salesforceの認証URLへのアクセスには、response_typeパラメータが必要であるため、play.lib.OAuth2を使わず、urlを作成して直接リダイレクトしています。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/playframework/play/blob/master/framework/src/play/libs/OAuth2.java"&gt;ソースコード&lt;/a&gt;をみても、retrieveVerificationCode()メソッドではリダイレクトしているだけなので特に問題はなさそうです。&lt;br /&gt;コールバックの実装はImportSfdc ジョブ に記述します。&lt;br /&gt;&lt;br /&gt;各手順の詳細は公式サイトの「&lt;a href="http://wiki.developerforce.com/page/JP:Digging_Deeper_into_OAuth_2.0_at_Salesforce.com" target="_blank"&gt;Salesforce.comのOAuth 2.0を掘り下げてみよう&lt;/a&gt;」を読んでもらえれば図解で書いてあるので、ここでは要点だけ記載すると、&lt;br /&gt;１. 認証URLにアクセスし認証を行った後、callbackURLにリダイレクトされるので、URLパラメータからcodeを取得します。&lt;br /&gt;２. 取得したcodeとgrant_type、client_id、client_secret、redirect_uri パラメータを使用して、今度はトークン取得URLにPOSTでアクセスします。&lt;br /&gt;３. トークン取得URLからJson形式でレスポンスが返ってくるのでその中のアクセストークン（accessToken）を取得します。&lt;br /&gt;４. アクセストークンをHTTPヘッダ（Authorization: OAuth）に含めることで、以後REST形式でデータを取得できます。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;hoge/app/jobs/ImportSfdc.java&lt;br /&gt;&lt;pre class="java" name="code"&gt;package jobs;&lt;br /&gt;&lt;br /&gt;import java.util.*;&lt;br /&gt;import play.*;&lt;br /&gt;import play.jobs.*;&lt;br /&gt;import play.libs.WS;&lt;br /&gt;import com.google.gson.*;&lt;br /&gt;import models.*;&lt;br /&gt;&lt;br /&gt;public class ImportSfdc extends Job {&lt;br /&gt;&lt;br /&gt;String code;&lt;br /&gt;&lt;br /&gt;public ImportSfdc(String code) {&lt;br /&gt;this.code = code;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void doJob() {&lt;br /&gt;String tokenUrl = "https://login.salesforce.com/services/oauth2/token";&lt;br /&gt;String redirectUrl = "http://localhost:9000/application/callback";&lt;br /&gt;String clientId = "loginid";&lt;br /&gt;String clientSecret = "password";&lt;br /&gt;&lt;br /&gt;String url = tokenUrl + "?grant_type=authorization_code&amp;amp;code=" + code + "&amp;amp;client_id=" + clientId + "&amp;amp;client_secret=" + clientSecret + "&amp;amp;redirect_uri=" + redirectUrl;&lt;br /&gt;JsonElement tokens = WS.url(url).post().getJson();&lt;br /&gt;String accessToken = tokens.getAsJsonObject().get("access_token").getAsString();&lt;br /&gt;String instanceUrl = tokens.getAsJsonObject().get("instance_url").getAsString();&lt;br /&gt;&lt;br /&gt;url = instanceUrl + "/services/data/v23.0/query/?q=SELECT Id, Subject, Description from Case";&lt;br /&gt;JsonElement cases = WS.url(url).setHeader("Authorization", "OAuth " + accessToken).get().getJson();&lt;br /&gt;Logger.info(cases.toString());&lt;br /&gt;&lt;br /&gt;Iterator&amp;lt;JsonElement&amp;gt; records = cases.getAsJsonObject().get("records").getAsJsonArray().iterator();&lt;br /&gt;while(records.hasNext()) {&lt;br /&gt;JsonElement attributes = records.next();&lt;br /&gt;String caseId = attributes.getAsJsonObject().get("Id").getAsString();&lt;br /&gt;String subject = attributes.getAsJsonObject().get("Subject").getAsString();&lt;br /&gt;JsonElement elem = attributes.getAsJsonObject().get("Description");&lt;br /&gt;String description = elem.isJsonNull() ? "" : elem.getAsString();&lt;br /&gt;&lt;br /&gt;Data data = Data.find("byCode", caseId ).first();&lt;br /&gt;if(data == null) {&lt;br /&gt;data = new Data(caseId, subject, description);&lt;br /&gt;data._save();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こちらもごっそりCaseを取得したかったので、SOQLクエリで取得します。&lt;br /&gt;&lt;a href="http://wiki.developerforce.com/page/JP:Getting_Started_with_the_Force.com_REST_API#Force.com_REST_API_.E3.82.AF.E3.82.A4.E3.83.83.E3.82.AF.E3.83.AA.E3.83.95.E3.82.A1.E3.83.AC.E3.83.B3.E3.82.B9" target="_blank"&gt;Force.com REST API クイックリファレンス&lt;/a&gt;&lt;br /&gt;http://localhost:9000/application/sfdc へアクセスすると&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;こんな感じでデータが取得できました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-zrvY2vhm2sc/T0afxTpQnrI/AAAAAAAAAEo/vO9G06Yg9W4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-02-24%2B5.20.51.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 284px;" src="http://2.bp.blogspot.com/-zrvY2vhm2sc/T0afxTpQnrI/AAAAAAAAAEo/vO9G06Yg9W4/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-02-24%2B5.20.51.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5712428846801788594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;まとめ&lt;/h3&gt;今回は社内のデータ収集のためにバックログとセールスフォースのAPI連携をPlay! frameworkで作ってみました。Play!のジョブ機能には、cronの機能も備わっているので、自動で同期したりすることもできて便利です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;社内の情報を集約して、使えるナレッジベースになるように修練していきたいですね。&lt;br /&gt;ではまた。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-1129724429724076210?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/1129724429724076210/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/play-webxml-rpcoauth20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1129724429724076210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1129724429724076210'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/play-webxml-rpcoauth20.html' title='Play! でつなげるWebサービス(XML-RPC/OAuth2.0)'/><author><name>nishino</name><uri>http://www.blogger.com/profile/15291112813871756041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-0BmiYdZu-Bg/T0aco9Hf_MI/AAAAAAAAAEc/yjYKnwwyFEg/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588%2B2012-02-24%2B5.05.01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-8931708833555865152</id><published>2012-02-08T13:00:00.002+09:00</published><updated>2012-02-08T13:01:06.887+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強会'/><category scheme='http://www.blogger.com/atom/ns#' term='fujya.sh'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><category scheme='http://www.blogger.com/atom/ns#' term='CROSS2012'/><title type='text'>「エンジニアサポート新年会2012 CROSS」参加報告</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-mGcbC25fiYs/TzHpMWp_z2I/AAAAAAAAAEg/MYVNSul1OZ8/s1600/baba.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-QrItY_wq2JE/TyaQA9nQeQI/AAAAAAAAAEU/L8HovRuNxqI/s1600/cross2012.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5703404324324931842" src="http://4.bp.blogspot.com/-QrItY_wq2JE/TyaQA9nQeQI/AAAAAAAAAEU/L8HovRuNxqI/s320/cross2012.png" style="cursor: hand; cursor: pointer; float: left; height: 288px; margin: 0 10px 10px 0; width: 640px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tech.nifty.co.jp/party/2012/"&gt;http://tech.nifty.co.jp/party/2012/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;どうも、fujya.shです。&lt;/div&gt;&lt;div&gt;久しぶりの投稿になりますが、1/27(金)に「エンジニアサポート新年会2012 CROSS」というイベントがあり、&lt;a href="https://sites.google.com/site/qpstudy/"&gt;qpstudy&lt;/a&gt;のリーダーこと&lt;a href="https://twitter.com/#%21/iara"&gt;@&lt;/a&gt;&lt;a href="https://twitter.com/#%21/iara"&gt;iara&lt;/a&gt;さんからのご招待で「クラウドCROSS」でお話する機会をいただきました。感謝。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とにかく物凄く良いイベントで、登壇しているエンジニアの皆様はエッジな方々でためになる話や、刺激を受ける話をたくさん聞けました。右手を上げれば美味しいプレモルが手に入るといった「至れり尽くせり」な６時間でした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回は（ブログを書くまでが勉強会の精神で）参加報告をしたいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span&gt;■何を話してきたの？&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;例のごとくSlideShareに上げてあるのでまずはパラパラ眺めてみてください。&lt;/div&gt;&lt;div id="__ss_11310118" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/fujya/cross2012a-fujya" target="_blank" title="cross2012a fujya"&gt;cross2012a fujya&lt;/a&gt;&lt;/b&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/11310118" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;・シャノンはとてもインフラエンジニア募集してるよ&lt;/div&gt;&lt;div&gt;・シャノンはたくさんの「クラウド」を活用してるよ&lt;/div&gt;&lt;div&gt;　→　無駄を省いてサービス構築にリソースを集中している&lt;/div&gt;&lt;div&gt;・インフラエンジニアがクラウドの障壁を取り除いてあげる必要があるよ&lt;/div&gt;&lt;div&gt;・SaaSベンダのインフラエンジニアは「プラットフォーム」を構築するのが仕事だよ&lt;/div&gt;&lt;div&gt;・オンプレ/IaaSのどちらにプラットフォームを構築するか見極める必要があるよ&lt;/div&gt;&lt;div&gt;　→　それぞれメリット/・デメリットがあるので使い分けは大事&lt;/div&gt;&lt;div&gt;・シャノンは「説明できる」インフラを心がけてるよ&lt;/div&gt;&lt;div&gt;・QA環境はスケールできるIaaS環境に構築してるよ&lt;/div&gt;&lt;div&gt;　→　IaaSのスケールできるというメリットを利用した構築例&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;といった内容になってます。&lt;/div&gt;&lt;div&gt;BtoB向けのSaaSのインフラをやっている人というのが世の中にどれだけ存在しているか分からないですが、この手の話でもそれなりに聞いてくれている人がいて安心しました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;■クラウドCROSSでの感想&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;a href="https://twitter.com/#%21/kuwa_tw"&gt;@kuwa_tw&lt;/a&gt;さん&lt;/span&gt;の話：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.slideshare.net/akuwano/ss-11368700"&gt;http://www.slideshare.net/akuwano/ss-11368700&lt;/a&gt; &lt;/div&gt;&lt;div&gt;インフラエンジニア界のトップアイドル、サイバーエージェントの桑野さんのお話。業務ではクラウドを利用していないとの事。&lt;/div&gt;&lt;div&gt;お話の中でビックリしたのは「来週までに30台のサーバを用意して欲しい」という要望に急ピッチで対応できる体制があると説明していた点です。そこまで体制が作れるのであれば、オンプレのメリットをフルで使う事ができるのでパブリッククラウドの必要性というのが確かに薄れてきますね。&lt;/div&gt;&lt;div&gt;サイバーエージェントさんはOpenStackを利用してプライベートクラウドを構築しているとの事なので、クラウドを自分たちで作って自分たちで使う感じですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://twitter.com/#%21/abej"&gt;@abej&lt;/a&gt;&lt;span&gt;さんの話：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://www.slideshare.net/abej/cross-cloudabej-11329180"&gt;http://www.slideshare.net/abej/cross-cloudabej-11329180&lt;/a&gt;&lt;/div&gt;&lt;div&gt;nifty中の人である安倍さんがNIFTY Cloudの１ユーザの視点で、クラウドが無かった時代のインフラとクラウド真っ盛りの現在ではどういうインフラを構築・運用しているかの違いを解説してくれました。ポイントはAPI・自動化辺りかと。クラウドがあるこの時代だと気づくと10台・100台とスケールする可能性があるので、1台でも100台でも管理工数が同じになるようにインフラ設計をする事が大事なんですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://twitter.com/#%21/netmarkjp"&gt;@netmarkjp&lt;/a&gt;さんの話：&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.slideshare.net/toshiak_netmark/cross2012-cross-11306808"&gt;http://www.slideshare.net/toshiak_netmark/cross2012-cross-11306808&lt;/a&gt; &lt;/div&gt;&lt;div&gt;ハートビーツの馬場さんはフルマネージドでクラウド上のサーバの構築・運用/監視をしている立場として、オンプレとクラウドのメリット・デメリット等を紹介してました。その中でクラウドの残念な所として「クラウドに夢見過ぎな人を説き伏せないと」という話がありました。確かに「クラウドならバックアップいらないよね！」等の夢を見ている人はたまに見かけるので、そういう人を説得するのは大変だと思います。&lt;/div&gt;&lt;div&gt;私の場合は「クラウドに対して不安しか無い人を説き伏せないと」と逆の場合が多くみられます。どちらも非常にたいへんです。&lt;/div&gt;&lt;div&gt;クラウドならではのメリット・デメリットはあるものの「やらないといけない事」はオンプレ・クラウド共に変わりません。ただその作業の容易さは変わってきますね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span&gt;■総括&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;クラウドの出現によりインフラエンジニアに求められる仕事が変わっている。そういう印象を受けました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;－プログラマブルなインフラ&lt;/b&gt;&lt;/div&gt;&lt;div&gt;会場で良く出てきたキーワードとして「プログラマブルなインフラ」があげられると思います。実際にインフラエンジニアがプログラムを書くというワケでは無く、インフラの設計自体がプログラムチックになっていないとダメだという事だと思います。もちろんプログラムも書けたほうが良いです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;－オンプレとクラウドの特徴の把握&lt;/b&gt;&lt;/div&gt;&lt;div&gt;１：オンプレでは大変苦労していたけど、クラウドでは凄い楽にできる事&lt;/div&gt;&lt;div&gt;２：オンプレでもクラウドでも変わらずやらないといけない事&lt;/div&gt;&lt;div&gt;３：クラウドだからこそやらないといけない事&lt;/div&gt;&lt;div&gt;この３点を把握して上手に使いこなす事が求められてきている用に感じます。２番３番に関しては「クラウドに夢見てる人」が勘違いしやすいポイントなのでは無いでしょうか。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;－インフラエンジニアの不足&lt;/b&gt;&lt;/div&gt;&lt;div&gt;上記２点ができるインフラエンジニアが不足している印象を受けました。実際にシャノンが求めているインフラエンジニアはそういう方ですし、業界として少ない印象を受けています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;解決策として&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-mGcbC25fiYs/TzHpMWp_z2I/AAAAAAAAAEg/MYVNSul1OZ8/s320/baba.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5706598601304559458" style="color: rgb(0, 0, 238); text-decoration: underline; float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 320px; height: 170px; " /&gt;&lt;/div&gt;&lt;div&gt;&lt;br class="Apple-interchange-newline"&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;業界全体でインフラエンジニアを増やす事が必要なのではないかと。私もそう思います。具体的に何をすれば良いのかアクションはまだ分かっていませんが、少しづつでもアウトプットを増やしていきたいです。そして勉強会などでCROSSしていく事、業界全体でインフラの楽しさを布教していきたいなと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;小学生のなりたい職業TOP10に「インフラエンジニア」が入るようにする事が個人的なミッションですｗ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;最後にニフティ様をはじめ実行委員会の皆様、すべての講師の方々、とても素敵な時間を過ごせて感謝しております。ありがとうございました。&lt;/div&gt;&lt;div&gt;来年も是非参加したいと思っておりますので、よろしくお願いします。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-8931708833555865152?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/8931708833555865152/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/2012-cross.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/8931708833555865152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/8931708833555865152'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/2012-cross.html' title='「エンジニアサポート新年会2012 CROSS」参加報告'/><author><name>fujya.sh</name><uri>http://www.blogger.com/profile/03776400533753064010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-QrItY_wq2JE/TyaQA9nQeQI/AAAAAAAAAEU/L8HovRuNxqI/s72-c/cross2012.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-7137697456298234924</id><published>2012-02-07T09:27:00.001+09:00</published><updated>2012-02-07T09:35:54.988+09:00</updated><title type='text'>クラウド時代のプロジェクトマネジメント</title><content type='html'>元インフラ担当のyanaです。&lt;br /&gt;2011年12月付けで、技術統括部からイベントソリューション事業部へ異動しました。&lt;br /&gt;技術部ブログに投稿しても良いということなので、&lt;br /&gt;今まで触れられなかった事業部署についてご紹介させていただきます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;そもそも、シャノンってなんの会社？&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;オンラインとオフラインが融合した、時代に適切な&lt;br /&gt;マーケティングソリューションを支えるサービスを展開しています。&lt;br /&gt;&lt;br /&gt;主力製品は２つあります。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HSnWPkdYo94/Ty-RAwSCvTI/AAAAAAAAAFE/hM0lpru5IpU/s1600/aaa.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-HSnWPkdYo94/Ty-RAwSCvTI/AAAAAAAAAFE/hM0lpru5IpU/s400/aaa.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ZoDVMBTCmb4/TzBk_J9iIQI/AAAAAAAAAFM/CDBGXXXm96o/s1600/img02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="186" src="http://4.bp.blogspot.com/-ZoDVMBTCmb4/TzBk_J9iIQI/AAAAAAAAAFM/CDBGXXXm96o/s400/img02.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.shanon.co.jp/product/marketingplatform/"&gt;http://www.shanon.co.jp/product/marketingplatform/&lt;/a&gt; &lt;br /&gt;&lt;a href="http://www.shanon.co.jp/product/eventplatform/"&gt;http://www.shanon.co.jp/product/eventplatform/&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;どちらの製品も自社開発、運用を行っています。&lt;br /&gt;クラウドコンピューティングのメリットを最大限に生かし、&lt;br /&gt;外部サービスとの連携に強いことが特徴です。&lt;br /&gt;&lt;br /&gt;例えば、&lt;br /&gt;&lt;br /&gt;１．展示会やプライベートショーの事前登録をWebフォームで受付&lt;br /&gt;２．当日に受付で来場の有無をバーコードで取得し&lt;br /&gt;３．来場された方、されなかった方に、それぞれメールを送って&lt;br /&gt;４．メールに記載されたURLをクリックしたか有無を取得して&lt;br /&gt;５．URLから興味のある内容を予測し、さらに具体的なメールを送る&lt;br /&gt;７．このような施策を繰り返し、最後は商談・成約につなげる&lt;br /&gt;&lt;br /&gt;こんなマーケティングソリューションをご提供しています。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;技術部と事業部ってどういう関係？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;簡単に言いますと、&lt;br /&gt;技術部は、製品開発とサーバーインフラを運用する役割、&lt;br /&gt;事業部は、製品やサービスのセールスやコンサルティング・インプリメントを行い&lt;br /&gt;お客様へご提供する役割です。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tL_09LDknGI/TzBrSvgZBmI/AAAAAAAAAFc/83lysCokgOo/s1600/--------.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://4.bp.blogspot.com/-tL_09LDknGI/TzBrSvgZBmI/AAAAAAAAAFc/83lysCokgOo/s640/--------.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;&lt;b&gt;やっぱり製品があるって面白い&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-kISPsxXkUzo/Ty9xZoyCKoI/AAAAAAAAAD8/b--R4q3iOkY/s1600/mp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-kISPsxXkUzo/Ty9xZoyCKoI/AAAAAAAAAD8/b--R4q3iOkY/s1600/mp.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Ex3BqHGnoZQ/Ty9xkgCiBFI/AAAAAAAAAEM/gQQl-MbvKEg/s1600/e.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Ex3BqHGnoZQ/Ty9xkgCiBFI/AAAAAAAAAEM/gQQl-MbvKEg/s1600/e.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;弊社の強みと言えば、やはり製品を中心としたサービスのご提供です。&lt;br /&gt;製品があれば、利用実績が積み上がっていきますので、&lt;br /&gt;その経験を元にして安定したサービスをご提供できます。&lt;br /&gt;&lt;br /&gt;また、毎月のバージョンアップでご提供できる機能が追加されたり、&lt;br /&gt;パフォーマンスが改善されたりとお客様に合わせて製品が成長していくところも&lt;br /&gt;製品をご提供ものとして心強いです。&lt;br /&gt;（技術部を離れて、この強さを実感します）&lt;br /&gt;&lt;br /&gt;お客様からの要望は、当然のように千差万別です。&lt;br /&gt;固定された製品があると難しいよういのも思われますが、&lt;br /&gt;製品で提供するメリットを前提に、ある意味では弊社の製品にお客様の運用を合わせていただき&lt;br /&gt;想定よりも大きな効果を得ていただくご提案をしていくことが醍醐味でもあります。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;&lt;b&gt;サービス企画、製品企画に参加できる&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;通常は、技術部が製品企画を立案し、立ち上げに参加することも多いですが&lt;br /&gt;お客様と接している事業部ならではの製品（サービス）企画をすることもあります。&lt;br /&gt;&lt;br /&gt;現在も、その機能が競合他社との差別化になっているケースもあります。&lt;br /&gt;&lt;br /&gt;技術側だけでなく、事業側からも製品を成長させるアイデアを出して実現していく&lt;br /&gt;これで市場に変化を作っていく事ができるのもシャノンの事業部の楽しさです。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;&lt;b&gt;業務アプリの中心は自社製品＆Sales force＆Google apps&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;事業部側で発生する見込み客の管理から商談まで、自社製品とSales forceで管理されています。&lt;br /&gt;&lt;br /&gt;マーケティングサービスを主軸にしていますので、&lt;br /&gt;事業活動のベースになるマーケティングプロセスに自社製品が&lt;br /&gt;ガッチリ組み込まれているのが、ウチらしいです。&lt;br /&gt;（自社用のSales force連携は、提供案件も含め最大規模という噂も）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nFZGGgOdhaY/Ty-IAF1kQ9I/AAAAAAAAAEs/7UnmL_0vqSQ/s1600/Dreamforce.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="156" src="http://1.bp.blogspot.com/-nFZGGgOdhaY/Ty-IAF1kQ9I/AAAAAAAAAEs/7UnmL_0vqSQ/s200/Dreamforce.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;見積もりの作成承認から仕入れの検収まで承認フローも全て&lt;br /&gt;Salesforceで実装されていますので事業活動がリアルタイムで確認できるのも強みです。&lt;br /&gt;&lt;br /&gt;もう一つ、全社導入しているのがGoogleAppsです。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-nmikkbiskU4/Ty96_Er3QUI/AAAAAAAAAEc/kPoM4gwfDvw/s1600/GoogleAppslogo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://2.bp.blogspot.com/-nmikkbiskU4/Ty96_Er3QUI/AAAAAAAAAEc/kPoM4gwfDvw/s200/GoogleAppslogo.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;社内外とわず、メールは全てGmail&lt;br /&gt;スケジュール管理はGoogleCalendar&lt;br /&gt;重要ドキュメントはGoogleSiteでサマリー化され&lt;br /&gt;それぞれの情報は、GoogleDocsやGoogleSpreadsheet、Google&lt;span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: x-small; line-height: 16px;"&gt;Presentation&lt;/span&gt;&lt;br /&gt;を利用していますし、社内研修のビデオはGoogleVideoに保存されています。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これで1アカウント年間6,000円というのがすばらしいです。&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.google.com/apps/intl/ja/business/"&gt;http://www.google.com/apps/intl/ja/business/&lt;/a&gt; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;クラウドコンピューティングの恩恵をフル活用しています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;プロジェクトマネジメントもWebアプリを完全活用&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;プロジェクトマネジメントにもWebアプリを積極利用しています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;１．1つ前でもご紹介したSalesforce&lt;/b&gt;&lt;br /&gt;&lt;b&gt;２．プロジェクト開始後にマイルストーン作成とスケジュール管理に利用しているSmartSheet&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.smartsheet.com/"&gt;http://www.smartsheet.com/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;３．課題・タスク管理に利用しているBacklog&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.backlog.jp/"&gt;http://www.backlog.jp/&lt;/a&gt;&lt;br /&gt;&lt;b&gt;４．プロジェクトのドキュメント管理に利用しているGoogleApps&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;このツールを下記の様なプロセスで利用しています。&lt;br /&gt;本当は自動で連動させたいですが、今後の課題です。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-F2ayB6zKRL4/Ty-DarMQ9jI/AAAAAAAAAEk/UWcys10uaqQ/s1600/ES.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-F2ayB6zKRL4/Ty-DarMQ9jI/AAAAAAAAAEk/UWcys10uaqQ/s400/ES.png" width="333" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;一部ファイルはセキュリティの関係で社外の保存ができませんが、&lt;br /&gt;そのファイルサーバーもセキュアな社外クラウド環境を利用しています。&lt;br /&gt;&lt;br /&gt;社内にあるものは何だろう？と思うほど、事業部側のプロジェクト運営は&lt;br /&gt;クラウド化が進んでいます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;ノートPC＋モバイルルータ or ダブルディスプレイ&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tpbozbUJnis/Ty-IZZBGToI/AAAAAAAAAE0/aWt9il_dIJQ/s1600/IMG_0373.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://3.bp.blogspot.com/-tpbozbUJnis/Ty-IZZBGToI/AAAAAAAAAE0/aWt9il_dIJQ/s200/IMG_0373.jpg" width="200" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://1.bp.blogspot.com/-BLYuhRDH9HQ/Ty-IbH0b0TI/AAAAAAAAAE8/-o9-D9AVRoM/s1600/IMG_0374.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="149" src="http://1.bp.blogspot.com/-BLYuhRDH9HQ/Ty-IbH0b0TI/AAAAAAAAAE8/-o9-D9AVRoM/s200/IMG_0374.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;担当者によってはトリプルディスプレイもあります。&lt;br /&gt;私には使いこなせる自身がありませんが。。&lt;br /&gt;&lt;br /&gt;外出の多い営業担当者やコンサルタントはノートPCが全員に支給されています。&lt;br /&gt;移動先で業務ができる環境があるほうが、業務が効率化できますね。&lt;br /&gt;&lt;br /&gt;※　情報は、ほぼクラウド環境化ですし、認証・HDDの暗号化対策も実施しています。&lt;br /&gt;※　月一回は、個人情報が保存されていないか自動診断のプログラムも実行されますので安心です。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;&lt;b&gt;技術部と一緒で、裁量労働でコアタイムなし&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;お客様とお仕事をする事が多いので、何時でもというわけにはいきませんが&lt;br /&gt;自分の職務責任を果たすため、大きく裁量を与えられています。&lt;br /&gt;&lt;br /&gt;単純なインプリメント作業ではなく、お客様への企画提案がベースにありますので&lt;br /&gt;クリエイティブな思考をサポートできる環境を整えています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;担当者ごとに専用番号があるので取り次ぎ無し&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;営業担当者、コンサルタント全員に専用番号が配布されています。&lt;br /&gt;&lt;br /&gt;商談中も、プロジェクト推進中も担当者（またはチーム）がアサインされていますので、&lt;br /&gt;連絡先はきまっています。なので、取り次ぎによる業務の中断を減らすための工夫です。&lt;br /&gt;&lt;br /&gt;お客様のご協力あり、取り次ぐことよる集中を遮断されるケースが激減しました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;ちなみに、事業部は大きく２つ&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;１．マーケティングソリューション事業部&lt;br /&gt;２．イベントソリューション事業部&lt;br /&gt;&lt;br /&gt;大きくは、この２つの事業部があります。&lt;br /&gt;２つの事業部を合わせて計40名ほど所属しています。&lt;br /&gt;&lt;br /&gt;私が所属しているのは、イベントソリューション事業部になります。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;&lt;b&gt;イベントソリューション事業部とは？&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;主に、コンベンション事業を行っているお客様、&lt;br /&gt;または広告代理店のお客様が多い事業部です。&lt;br /&gt;&lt;br /&gt;スポットでイベントを開催される際に弊社製品を中心にサービスをご提供し、&lt;br /&gt;イベント開催の目的達成をマーケティング側からサポートしています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;平均年齢は、約28歳&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;調べてみて驚きましたが、若いですね。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: #444444; font-size: x-large;"&gt;プロジェクトマネージャー募集中&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;プロジェクトの設計、進捗管理、予算管理を担当いただくお仕事です。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;弊社製品であるクラウド型Webサービスのソリューション提供が中心ですが、&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;プロジェクトの要件に応じて外部制作会社との共同進行や、&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;他Webサービスとのアプリケーション連携のディレクションも含まれます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;弊社のプロジェクト進行において非常に重要な役割を担うお仕事です。&lt;/span&gt; &lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;ご興味のある方は、是非ご連絡ください。&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.green-japan.com/job/18472"&gt;http://www.green-japan.com/job/18472&lt;/a&gt; &lt;br /&gt;&lt;span style="font-family: メイリオ, 'Lucida Grande', 'Hiragino Kaku Gothic Pro', 'ヒラギノ角ゴ Pro W3', 'ＭＳ Ｐゴシック', Meiryo, Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-7137697456298234924?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/7137697456298234924/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/yana-201112-httpwww.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7137697456298234924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7137697456298234924'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/02/yana-201112-httpwww.html' title='クラウド時代のプロジェクトマネジメント'/><author><name>Yana</name><uri>http://www.blogger.com/profile/17879422007975892113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-HSnWPkdYo94/Ty-RAwSCvTI/AAAAAAAAAFE/hM0lpru5IpU/s72-c/aaa.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-882496821009205309</id><published>2012-02-01T20:01:00.000+09:00</published><updated>2012-02-01T20:03:05.740+09:00</updated><title type='text'>アンドロイドアプリを作ってみよう　～ 開発環境準備（その２）～</title><content type='html'>ご無沙汰してます、h.kashiwagiです。&lt;br /&gt;しばらく放置して、9ヶ月ぶりの投稿になります。。&lt;br /&gt;&lt;br /&gt;今回も前回に引き続きアンドロイドアプリを開発するにあたっての必要なことをまとめていこうと思います。&lt;br /&gt;まず、前回のおさらいから、&lt;br /&gt;開発環境に必要なものをインストールしましょう。&lt;br /&gt;1. SDKのインストール&lt;br /&gt;・Androidアプリを開発するためのツール&lt;br /&gt;・&lt;a href="http://developer.android.com/intl/ja/sdk/index.html" style="color: #3366ff;"&gt;Android Developers&lt;/a&gt;からダウンロード&lt;span style="color: black;"&gt;。&lt;/span&gt;&lt;br /&gt;2. Eclipseのインストール&lt;br /&gt;・&lt;span style="color: black;"&gt;Javaの開発環境&lt;/span&gt;&lt;br /&gt;・&lt;a href="http://www.eclipse.org/downloads/" style="color: #3366ff;"&gt;Eclipse Downloads&lt;/a&gt;&lt;span style="color: black;"&gt;からダウンロード。&lt;/span&gt;&lt;br /&gt;3. JDKのインストール&lt;br /&gt;・Java言語でプログラミングを行う際に必要なソフトウェア。&lt;br /&gt;・&lt;a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-download-346242.html" style="color: #3366ff;"&gt;Java SE Downloads&lt;/a&gt;&lt;span style="color: black;"&gt;からダウンロード。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;今回は、&lt;br /&gt;1. ADTのインストール&lt;br /&gt;2. Eclipseの環境設定&lt;br /&gt;3. AVD(Android仮想デバイス)の&lt;span style="font-size: 100%;"&gt;インストール&lt;/span&gt;&lt;br /&gt;あたりについてまとめようと思います。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;1. ADTのインストール&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;ATD(Android Development Tools)とはEclipseでAndro&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;idアプリケーション開発を行うためのプラグインです。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;【手順】&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;1.1　Eclipseを起動して、メニューの「ヘルプ」=&amp;gt;「新規ソフトウェアのインストール」を選択します。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://4.bp.blogspot.com/-Tj9h5d0SnCw/TykA6CKcKFI/AAAAAAAAADc/7dW7ESqXIqE/s1600/2.1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704091400054515794" src="http://4.bp.blogspot.com/-Tj9h5d0SnCw/TykA6CKcKFI/AAAAAAAAADc/7dW7ESqXIqE/s400/2.1.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;1.2　「インストール」ダイアログが表示されるので、追加を選択。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;「サイトの追加」ダイアログが表示されるので、&lt;br /&gt;・名前： Android Development Tools&lt;br /&gt;・ロケーション： https://dl-ssl.google.com/android/eclipse&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;と入力してOKボタンをクリック。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://4.bp.blogspot.com/-4u4yxPRpFc8/TykBFx8JC7I/AAAAAAAAADo/EtGKTrGuOPk/s1600/2.2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704091601858005938" src="http://4.bp.blogspot.com/-4u4yxPRpFc8/TykBFx8JC7I/AAAAAAAAADo/EtGKTrGuOPk/s400/2.2.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1.3　&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;「インストール」ダイアログに戻り、「作業対象」に上記で追加したサイトを選択。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;選択したサイトのURLからインストール可能なプラグイン情報が一覧で表示されます。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;一覧の中で「開発ツール」にチェックを入れて、「次へ」をクリック。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;※赤枠の「▷」をクリックすると開発ツールの詳細が見れます。&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://1.bp.blogspot.com/-QwzGIsIgtZA/TykBTgb_R7I/AAAAAAAAAD0/Yjftyjt9CJs/s1600/2.3.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704091837677914034" src="http://1.bp.blogspot.com/-QwzGIsIgtZA/TykBTgb_R7I/AAAAAAAAAD0/Yjftyjt9CJs/s400/2.3.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;1.4　「使用条件の条項」に対しての同意が求められるので、同意して次へ進むと&lt;br /&gt;インストールが始まります。&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://2.bp.blogspot.com/-lqthQJTek3s/TykCCenRkWI/AAAAAAAAAEA/KVVzlHXyVeY/s1600/2.4.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704092644642230626" src="http://2.bp.blogspot.com/-lqthQJTek3s/TykCCenRkWI/AAAAAAAAAEA/KVVzlHXyVeY/s400/2.4.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;1.5　インストールが正常終了すると、Eclipseの再起動を求められるので、再起動してください。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;br /&gt;&lt;br /&gt;これで&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;ATDの&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;インストール作業は終了になります。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 130%;"&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;2. Eclipseの環境設定&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;2.1　Android SDKのパス設定&lt;br /&gt;これは、EclipseにSDKを認識させるために必要な設定です。&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;【手順】&lt;/span&gt;2.1.1 Eclipseのメニューから「ウィンドウ」=&amp;gt;「設定」を選択します。&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://1.bp.blogspot.com/-TUlPOs93KI8/TyjXZfmp92I/AAAAAAAAACg/LPrKD2_9-HU/s1600/3.1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704045761045067618" src="http://1.bp.blogspot.com/-TUlPOs93KI8/TyjXZfmp92I/AAAAAAAAACg/LPrKD2_9-HU/s400/3.1.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;2.1.2 「設定」ダイアログが表示されるので、左枠の一覧から「Android」を選択します。&lt;br /&gt;「参照」ボタンからインストールしたSDKのフォルダを選択し、「OK」ボタンをクリック。&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://2.bp.blogspot.com/-tEk-ortFufw/TyjXphJtbtI/AAAAAAAAACs/DedDi_e7rvo/s1600/3.2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704046036338437842" src="http://2.bp.blogspot.com/-tEk-ortFufw/TyjXphJtbtI/AAAAAAAAACs/DedDi_e7rvo/s400/3.2.png" style="cursor: hand; cursor: pointer; display: block; height: 237px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;これでパスの設定は終了です。&lt;br /&gt;&lt;br /&gt;2.2　SDKコンポーネントの追加&lt;br /&gt;今回インストールしたSDKは、バージョンによって異なる機能をなくした最小限のパッケージになっているため、開発するにあたって、バージョンによって異なるコンポーネントが必要になります。ADTプラグインを使って、SDKのコンポーネントを追加します。&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;【手順】&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;2.2.1　まず、Eclipseのメニューから「ウィンドウ」=&amp;gt;「Android SDK Manager」を選択。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;「Android SDK&lt;/span&gt;&lt;span style="font-size: 100%;"&gt; Manager&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;」&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;ダイアログに、インストール可能なコンポーネントが表示されます。&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://3.bp.blogspot.com/-pVbjKrJNf4M/Tyj2HrTi3eI/AAAAAAAAAC4/f6rTWeNDFW8/s1600/4.1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704079539808951778" src="http://3.bp.blogspot.com/-pVbjKrJNf4M/Tyj2HrTi3eI/AAAAAAAAAC4/f6rTWeNDFW8/s400/4.1.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;2.2.2　今回は、「Tools」と「Android 2.2(API8)」を選択して「install packages」をクリック。&lt;br /&gt;なぜ、2.2かというと、自分のスマフォが2.2なので。。（いつか自分の末端にインストールする日が来る日を夢見て・・）特に深い意味はありません。&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;開発するバージョンに応じてチェックするものを変更してください。&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://2.bp.blogspot.com/-sDNls4sL5Bc/TykWCCR2OiI/AAAAAAAAAFU/asIekvSm-MY/s1600/4.2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704114627268721186" src="http://2.bp.blogspot.com/-sDNls4sL5Bc/TykWCCR2OiI/AAAAAAAAAFU/asIekvSm-MY/s400/4.2.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;2.2.3　確認ダイアログが表示されるので、「すべて受諾」を選択してインストールしてください。&lt;br /&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://3.bp.blogspot.com/-tdtBOGPMa_w/TykC4E137jI/AAAAAAAAAEY/UP4zNlAFZP8/s1600/4.3.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704093565437079090" src="http://3.bp.blogspot.com/-tdtBOGPMa_w/TykC4E137jI/AAAAAAAAAEY/UP4zNlAFZP8/s400/4.3.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;これで、SDKコンポーネントの追加作業は終了です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%; font-weight: bold;"&gt;3. AVD(Android仮想デバイス)のインストール&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;AVDとは、&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;実際の末端での動作をPC上で再現することのできるツールで、Androidエミュレータとも言われています。まー、テスト環境的なものと思ってもらっていいと思います。&lt;br /&gt;【手順】&lt;br /&gt;3.1　まず、Eclipseのメニューから「ウィンドウ」=&amp;gt;「AVD Manager」を選択。&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;a href="http://2.bp.blogspot.com/-g6drZyfoV5M/TykNyJtGDnI/AAAAAAAAAE8/J4_vUea-q5c/s1600/5.1.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704105558291123826" src="http://2.bp.blogspot.com/-g6drZyfoV5M/TykNyJtGDnI/AAAAAAAAAE8/J4_vUea-q5c/s400/5.1.png" style="cursor: hand; cursor: pointer; display: block; height: 238px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: 100%;"&gt;3.2　「Android Virtual Device Manager」&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;ダイアログが表示されるので、「新規」を選択すると、「Create&lt;/span&gt;&lt;span style="font-size: 100%;"&gt; new Android &lt;/span&gt;&lt;span style="font-size: 100%;"&gt;Virtual Device&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;」ダイアログが表示されます。&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;・&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;名前: Device-Android2.2（Deviceの設定名）&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;・&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;ターゲット: &lt;/span&gt;&lt;span style="font-size: 100%;"&gt;Android 2.2 - API Level 8&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;（&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;Deviceが利用するライブラリ&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;）&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;・ビルドイン: WVGA800（解像度）&lt;br /&gt;を設定して、&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;「Create AVD」をクリックするとAVDが作成されます。&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-size: 100%;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;a href="http://4.bp.blogspot.com/-xYLCXvjcF-o/TykOZyQF8_I/AAAAAAAAAFI/0g-WOwkreBY/s1600/5.2.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5704106239190234098" src="http://4.bp.blogspot.com/-xYLCXvjcF-o/TykOZyQF8_I/AAAAAAAAAFI/0g-WOwkreBY/s400/5.2.png" style="cursor: hand; cursor: pointer; display: block; height: 242px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: 100%;"&gt;ここまでで、開発環境の構築は一通りできました。（もし不足があれば、追記します。）&lt;br /&gt;ここまで来るのに、半年・・・確かに仕事は忙しいが、にしてもサボりすぎ。。反省。。&lt;br /&gt;時間みつけてペース上げていかねば！&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;次回は、「アプリケーションの開発手順」か、その前に「Androidの仕組み・アーキテクチャ」のお話ができ&lt;/span&gt;&lt;span style="font-size: 100%;"&gt;ればと思っています。&lt;/span&gt;&lt;br /&gt;では、また。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-882496821009205309?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/882496821009205309/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/04/blog-post_29.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/882496821009205309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/882496821009205309'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/04/blog-post_29.html' title='アンドロイドアプリを作ってみよう　～ 開発環境準備（その２）～'/><author><name>kashiwagi</name><uri>http://www.blogger.com/profile/05198871606509863206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Tj9h5d0SnCw/TykA6CKcKFI/AAAAAAAAADc/7dW7ESqXIqE/s72-c/2.1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-709900823230166736</id><published>2012-01-23T22:51:00.010+09:00</published><updated>2012-01-23T23:03:25.704+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='megumi'/><category scheme='http://www.blogger.com/atom/ns#' term='DBI'/><title type='text'>Class::DBI でインデックス・スキャンができない？</title><content type='html'>様々な箇所で現在パフォーマンス対策を実施しています。&lt;br /&gt;その中で、え？そうなの？と思った件があったので、ここに書いておこうと思います。&lt;br /&gt;もし、より良い解決策をご存知の方がいらっしゃいましたら、ぜひ教えてください。&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;やたらとパフォーマンスが悪い箇所があるということで調査した結果、ソースコードのただ1行にすごい時間がかかっていた。&lt;br /&gt;そして、それが繰り返して使用されているということで、レスポンスを時間内に返せないでいた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;my $result = MyData::CDBI-&gt;search_where(&lt;br /&gt;  {&lt;br /&gt;    t_id =&gt; \@tid, &lt;br /&gt;    code_id =&gt; $cid, &lt;br /&gt;    disable =&gt; 0 &lt;br /&gt;  }, &lt;br /&gt;  { &lt;br /&gt;    columns =&gt; [ 'id' ] &lt;br /&gt;  }&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;@tid は1000個の値を持っている配列である&lt;/li&gt;&lt;br /&gt;&lt;li&gt;MyData::CDBI は、Class::DBI を base としたクラスで Class::DBI::AbstractSearch を use している&lt;/li&gt;&lt;br /&gt;&lt;li&gt;検索対象のテーブルには100万レコードが入っている&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;この検索に50秒かかっていたのだ。（←テスト用に用意した大量データの場合。以下同じ）&lt;br /&gt;&lt;br /&gt;データベースのほうを見たところ、&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;t_id は text型で INDEX を使用していない&lt;/li&gt;&lt;br /&gt;&lt;li&gt;code_id は integer型で INDEXを使用していない&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;そのため、INDEX がないせいだろうと思って、つけてみた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;CREATE INDEX t_id_idx ON my_table (t_id);&lt;br /&gt;CREATE INDEX code_id_idx ON my_table (code_id);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;そして、EXPLAIN ANALYZE をしてみた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;EXPLAIN ANALYZE SELECT id, t_id FROM my_table WHERE disable=0 AND code_id=1 AND t_id IN (IDを1000個);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;当然のことながら Index Scan になっていたし、45ms で返ってきていたので、解決したと思った。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt; EXPLAIN ANALYZE&lt;br /&gt; Bitmap Heap Scan on visitor  (cost=9666.11..1256891.51 rows=957593 width=8) (actual time=9.454..38.358 rows=81903 loops=1)&lt;br /&gt;   Recheck Cond: (t_id = ANY ('{2001,&lt;br /&gt;・・・（中略）・・・&lt;br /&gt;2998,2999,3000}'::text[]))&lt;br /&gt;   Filter: ((code_id = 1) AND (disable = 0))&lt;br /&gt;   -&gt;  Bitmap Index Scan on t_id_idx  (cost=0.00..9426.71 rows=958871 width=0) (actual time=9.145..9.145 rows=82010 loops=1)&lt;br /&gt;         Index Cond: (t_id = ANY ('{2001,&lt;br /&gt;・・・（中略）・・・&lt;br /&gt;997,2998,2999,3000}'::text[]))&lt;br /&gt; Total runtime: 45.652 ms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;だが、実際にアプリケーションを動かしてみると遅いままだった。&lt;br /&gt;また、Class::DBIの検索部分のみを切り出したコードで試したが、結果は同じく約50秒だった。&lt;br /&gt;&lt;br /&gt;そこでミスに気付いた。&lt;br /&gt;&lt;br /&gt;検索条件の中の t_id =&gt; \@tid, の部分は IN検索ではなくて OR検索だった。&lt;br /&gt;t_id in (1,2,...) ではなく、t_id=1 OR t_id=2 OR ... である。&lt;br /&gt;&lt;br /&gt;そこで、EXPLAIN ANALYZE をもう一度やりなおした。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;EXPLAIN ANALYZE SELECT id, t_id FROM my_table WHERE code_id=1 AND (&lt;br /&gt; (ext_id = '2000') OR &lt;br /&gt;・・・（中略）・・・&lt;br /&gt; (ext_id = '2999')&lt;br /&gt;) AND disable=0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;約40秒かかっており、確かに遅かった。&lt;br /&gt;OR検索は遅いということだ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt; Seq Scan on my_table (cost=0.00..2680689.17 rows=963661 width=8) (actual time=0.129..39667.052 rows=81903 loops=1)&lt;br /&gt;   Filter: ((code_id = 1) AND (disable = 0) AND ((t_id = '2000'::text) OR &lt;br /&gt;・・・（中略）・・・&lt;br /&gt;(t_id = '2998'::text) OR (t_id = '2999'::text)))&lt;br /&gt; Total runtime: 39677.908 ms&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;これのせいだったか～と思い、INを指定する検索に変更した。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;my $result = MyData::CDBI-&gt;search_where(&lt;br /&gt;  {&lt;br /&gt;    t_id =&gt; {'-in' =&gt; \@t_ids},&lt;br /&gt;    code_id =&gt; $cid, &lt;br /&gt;    disable =&gt; 0 &lt;br /&gt;  }, &lt;br /&gt;  { &lt;br /&gt;    columns =&gt; [ 'id' ] &lt;br /&gt;  }&lt;br /&gt;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;それなのに、またしても秒数に変化なし。&lt;br /&gt;50秒のまま。&lt;br /&gt;&lt;br /&gt;INの検索になっていないのかな？と疑う。&lt;br /&gt;だが、DBのログを見たところ、ちゃんとINの検索になっていた。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;postgres[3656]: [9-1] LOG: 実行 dbdpg_1: SELECT id&lt;br /&gt;postgres[3656]: [9-2] FROM my_table&lt;br /&gt;postgres[3656]: [9-3] WHERE ( code_id = $1 AND disable = $2 AND t_id IN ( $3, $4, $5, $6, $7, $8, $9, $（略）&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;IN検索にしたら、「Total runtime: 45.652 ms」に近づくと思っていたのに、残念。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次に疑うべきは、t_id が text型であるせいで遅い？ことだ。&lt;br /&gt;入ってるものはIDなので、integer型に変更することにした。&lt;br /&gt;（単なる過去のミスでtext型だったと思われる。さっさと修正しろよって話ですよね、はい。）&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;ALTER TABLE my_table ALTER COLUMN t_id TYPE INTEGER USING CAST(t_id AS INTEGER);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;さぁ今度こそ！とテストコードを実行したところ、25秒。&lt;br /&gt;&lt;br /&gt;速くなったけど、なんか違う。&lt;br /&gt;私が求めているのは、「Total runtime: 45.652 ms」だ。&lt;br /&gt;&lt;br /&gt;postgres だと pg_stat_user_tables というテーブルの統計情報に、シーケンシャルスキャンとインデックススキャンの実施回数が記録されている。&lt;br /&gt;&lt;br /&gt;そこでは idx_scan の数が1つ増えていた。&lt;br /&gt;どうやらインデックススキャンをしてこの遅さらしい。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;もうDBテーブルに心当たりはなく、DB側の問題ではないだろうと推測した。&lt;br /&gt;そして実際にどこで時間がかかっているのか、Class::DBI::AbstractSearch-&gt;search_where を見てみることにした。&lt;br /&gt;&lt;br /&gt;すると、$sth-&gt;execute で時間がかかっていることがわかった。&lt;br /&gt;Class::DBI を使わずに、DBI を使ってベタ書きして試したところ、やはり execute が遅かった。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;my $dbh = DBI-&gt;connect('dbi:Pg:host=x;dbname=y', 'z', '', {AutoCommit =&gt; 0, RaiseError =&gt; 0});&lt;br /&gt;my $sql = 'select id from my_table where (code_id = ? and disable = ? and t_id in (?, ?, ?,（略）, ?, ?, ?));';  &lt;br /&gt;my $sth = $dbh-&gt;prepare($sql)&lt;br /&gt;my $result = $sth-&gt;execute(1,0,@t_ids)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;試しに selectall_arrayref で検索してみたところ問題のない速さだった。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;my $result = $dbh-&gt;selectall_arrayref($sql);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;execute が遅いことは確定。&lt;br /&gt;&lt;br /&gt;だが、Class::DBI を使うと、自動的に execute で実行されてしまう。&lt;br /&gt;&lt;br /&gt;ということで、set_sql を使って検索をすることで、この execute が遅い問題を回避。&lt;br /&gt;外部から入力する値はないものの、これではイケてない。&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;&lt;br /&gt;my $sql = sprintf('select id from my_table where (code_id = 1 and disable = 0 and t_id in (%s))', join ',', @t_id);&lt;br /&gt;MyData::CDBI-&gt;set_sql('by_t_id' =&gt; $sql);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;一応速度は EXPLAIN ANALYZE で Index Scan と表示されていたときの速度(と思われる速さ)になっている。&lt;br /&gt;&lt;br /&gt;まとめると&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;search_where を set_sql に変更したこと&lt;/li&gt;&lt;br /&gt;&lt;li&gt;t_id を1000個並べる検索条件を or から in に変更したこと&lt;/li&gt;&lt;br /&gt;&lt;li&gt;t_id をtext型からinteger型に変更したこと&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;によって速度は変化していった。&lt;br /&gt;&lt;br /&gt;&lt;table border="1" summary="変更した箇所とかかった時間の対応表"&gt;&lt;br /&gt;&lt;caption&gt;変更した箇所とかかった時間&lt;/caption&gt;&lt;br /&gt;&lt;tr&gt; &lt;th&gt;set_sql/search_where&lt;/th&gt; &lt;th&gt;or/in&lt;/th&gt; &lt;th&gt;text/int&lt;/th&gt; &lt;th&gt;time(sec)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;search_where&lt;/td&gt; &lt;td&gt;or&lt;/td&gt; &lt;td&gt;text&lt;/td&gt; &lt;td&gt;49.038347&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;search_where&lt;/td&gt; &lt;td&gt;or&lt;/td&gt; &lt;td&gt;int&lt;/td&gt; &lt;td&gt;47.85891&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;search_where&lt;/td&gt; &lt;td&gt;in&lt;/td&gt; &lt;td&gt;text&lt;/td&gt; &lt;td&gt;41.17876&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;search_where&lt;/td&gt; &lt;td&gt;in&lt;/td&gt; &lt;td&gt;int&lt;/td&gt; &lt;td&gt;22.656974&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;set_sql&lt;/td&gt; &lt;td&gt;or&lt;/td&gt; &lt;td&gt;text&lt;/td&gt; &lt;td&gt;46.890032&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt; &lt;td&gt;set_sql&lt;/td&gt; &lt;td&gt;or&lt;/td&gt; &lt;td&gt;int&lt;/td&gt; &lt;td&gt;47.396322&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;set_sql&lt;/td&gt; &lt;td&gt;in&lt;/td&gt; &lt;td&gt;text&lt;/td&gt; &lt;td&gt;7.736877&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt;set_sql&lt;/td&gt; &lt;td&gt;in&lt;/td&gt; &lt;td&gt;int&lt;/td&gt; &lt;td&gt;7.486474&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ただ、そもそもの問題として、この1000個のIDを渡して検索する箇所というものをなくすべきだと思っている。&lt;br /&gt;&lt;br /&gt;そのため、現在はデータ構造を変更するなどして、こういう検索を消すことに力を入れていこうとしている次第である。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-709900823230166736?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/709900823230166736/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/classdbi.html#comment-form' title='5 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/709900823230166736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/709900823230166736'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/classdbi.html' title='Class::DBI でインデックス・スキャンができない？'/><author><name>megumi</name><uri>http://www.blogger.com/profile/06626837198746946677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3309208463161511117</id><published>2012-01-21T23:30:00.012+09:00</published><updated>2012-01-22T00:41:37.740+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chappie'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='PostgreSQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linux + PostgreSQL + Perl な WEBアプリケーションにおけるタイムゾーンの実装</title><content type='html'>&lt;a href="http://upload.wikimedia.org/wikipedia/commons/8/8c/DST_on_3_April_1949_in_Japan.JPG"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 500px; height: 326px;" src="http://upload.wikimedia.org/wikipedia/commons/8/8c/DST_on_3_April_1949_in_Japan.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;        &lt;p class="p1"&gt;こんにちは、冬は冬眠する生き物、chappie です。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;少し前に、アプリケーションの国際化対応の一環として、タイムゾーン対応の実装を担当しました。今回は、そのときの対応の概要について書いてみたいと思います。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;WEBアプリケーションにおけるタイムゾーンの扱いはとても基本的なことのように思えますが、意外とまとまった情報がウェブを見てても少なかったように感じました。今後、私たちと似たようなWEBアプリケーションでタイムゾーンサポートを実装する予定がある方のお役に立てる部分があるかもしれません。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ タイムゾーン対応する、とは？&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;ここで、タイムゾーン機能をサポートするということは、アプリケーションを操作する人がどのタイムゾーンで日時データを入出力するか指定できるようにする、ということです。&lt;/p&gt; &lt;p class="p1"&gt;たとえば、ログインして操作するようなアプリケーションであれば、ログインしているユーザは自分のユーザ情報として、お好みのタイムゾーン(たとえば、日本標準時や、西ヨーロッパ時間、など)を設定します。そのユーザがログインして操作する場合、日時データをそのタイムゾーンにあわせて表示したり、入力された日時データはそのタイムゾーンでの時刻だとして保存したりします。&lt;/p&gt; &lt;p class="p1"&gt;とある保存された日時が、あるユーザから見ると 2012-01-20 10:00 (日本標準時)であり、別のユーザから見ると 2012-01-20 01:00 (GMT) である、というようなことです。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ タイムゾーンのマスター情報 tz database &lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;オープンソースソフトウェアの世界でタイムゾーン情報の標準的なマスターとなるのは tz database (またの名を Olson DB)です。ボランティアベースでメンテナンスされてきたもので、Linux ベースのOSや、オープンソースのプログラミング言語環境では、これがタイムゾーン情報の参照先となっています。 tz database の内容を最新に保つことで、どのエリアは時差がGMTから何時間なのかとか、夏時間がいつからいつまでなのかなどの情報が実社会に即したものに保つことができます。&lt;/p&gt; &lt;p class="p1"&gt;Asia/Tokyo や、 Europe/London などの形式でエリアを指定します。エリアは、時差やサマータイムの有無によって区分されています。あるエリアでサマータイムの実施時期などが変わった場合、情報が更新されます。最近の大きな変更では、ロシアが夏時間を廃止したり(2011年)、アメリカでのサマータイムの実施時期が変わったり(2007年)しました。最新の情報は公式サイト(下記参照)から圧縮されたファイルをダウンロードできます。&lt;/p&gt; &lt;p class="p1"&gt;ちなみに、2011年の10月、ちょうど私たちがタイムゾーン対応をやっていたまさにその最中に訴訟問題が発生し、一時サイトがクローズする、という事件が起こりました。当時は何が起こったのかよく分からず、とにかく法的ないざこざでタイムゾーン情報の入手先であるFTPサイトが閉鎖してしまったらしい、という事態に一瞬、青ざめました。結局は、ICANN および IANA に管理が委ねられることとなったようで、今では詳しい経緯について Wikipedia にも記載されています。&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;参考:&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-family: arial; "&gt;Wikipedia - tz database &lt;/span&gt;&lt;span class="s2" style="font-family: arial; "&gt;&lt;a href="http://ja.wikipedia.org/wiki/Tz_database"&gt;http://ja.wikipedia.org/wiki/Tz_database&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="font-family: arial; "&gt;現在の tz database 入手先(IANA): &lt;/span&gt;&lt;a href="http://www.iana.org/time-zones" style="font-family: arial; "&gt;&lt;span class="s2"&gt;http://www.iana.org/time-zones&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ Linux でのタイムゾーン情報&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;一般的なLinux系ディストリビューションでは、上記の tz database の情報をデフォルトで /usr/share/zoneinfo/ の下に持っています。file コマンドを使ってみると、タイムゾーンデータであることが分かります。(Mac OS X で実行した場合の例)&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;$ file /usr/share/zoneinfo/Asia/Tokyo&lt;/span&gt;&lt;/p&gt;&lt;p class="p1"&gt;&lt;span&gt;/usr/share/zoneinfo/Asia/Tokyo: timezone data, old version, 3 gmt time flags, 3 std time flags, no leap seconds, 9 transition times, 3 abbreviation chars&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;特に更新していなければ、インストール時のまま情報が古くなっている可能性があるので、更新しましょう。大体は、以下のいずれかのコマンドで更新できるでしょう。&lt;/p&gt; &lt;p class="p1"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0); font-family: 'trebuchet ms'; font-size: small; "&gt;$ yum update tzdata (CentOS などRPMベースのディストリビューション)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0); font-family: 'trebuchet ms'; font-size: small; "&gt;$ apt-get update tzdata (Ubuntu などDebian系のディストリビューション)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="p1"&gt;tz database をダウンロードして手動でインストールすることもできます。より詳しくは下記リンク先を参照ください。&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"&gt;&lt;span&gt;参考: &lt;a href="http://chrisjean.com/2009/03/10/updating-daylight-saving-time-on-linux/"&gt;&lt;span class="s2"&gt;http://chrisjean.com/2009/03/10/updating-daylight-saving-time-on-linux/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ PostgreSQL でのタイムゾーン情報&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;PostgreSQL は、バージョン 8.0 以降、OS にインストールされている tz database の情報を利用できるようになりました。(それ以前のバージョンでは、コンパイル済みの情報を PostgreSQL 内部に持っていたようです。その場合は、PostgreSQL 自体をアップデートしなければタイムゾーン情報を更新できません)&lt;/p&gt; &lt;p class="p1"&gt;コンパイルオプションで &lt;/p&gt; &lt;p class="p4"&gt;&lt;span&gt;'--with-system-tzdata=/usr/share/zoneinfo'&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;を指定しておけば、PostgreSQL がインストールされている OS の zoneinfo が更新されれば自動的に最新の情報となります。&lt;/p&gt; &lt;p class="p5"&gt;すでに稼働している PostgreSQL がある場合は、コマンドラインで&lt;/p&gt; &lt;p class="p4"&gt;&lt;span&gt;$ pg_config --configure&lt;/span&gt;&lt;/p&gt; &lt;p class="p4"&gt;としてみて、出力内容に 上記のオプションが表示されていれば、そのままでOKでしょう。&lt;/p&gt; &lt;p class="p5"&gt;&lt;span&gt;参考:&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span&gt; PostgreSQL 8.4 マニュアル&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href="http://www.postgresql.jp/document/8.4/html/install-procedure.html"&gt;&lt;span class="s2"&gt;http://www.postgresql.jp/document/8.4/html/install-procedure.html&lt;/span&gt;&lt;/a&gt;&lt;span&gt; (日本語)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href="http://www.postgresql.org/docs/8.4/static/install-procedure.html"&gt;&lt;span class="s2"&gt;http://www.postgresql.org/docs/8.4/static/install-procedure.html&lt;/span&gt;&lt;/a&gt;&lt;span&gt; (英語)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;データベースの OS のタイムゾーンを更新した場合は、正しくタイムゾーンが更新されているか確認してみましょう。&lt;/p&gt; &lt;p class="p5"&gt;たとえば、tzdata_2011g から tzdata_2011h に更新した場合は、ロシアの夏時間廃止が反映されます。psql で日時データの表示を更新の前後で比較してみます。&lt;/p&gt; &lt;p class="p5"&gt;&lt;span&gt;&lt;b&gt;更新前(2011g):&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p8"&gt;        &lt;/p&gt;&lt;p class="p1"&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;dbuser=&amp;gt; set time zone 'Europe/Moscow'; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;SET &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;dbuser=&amp;gt; select * from timezone_master; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;        date_1       |             date_2   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;------------------------------+------------------------------- &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2011-10-04 13:19:38.796444+04 | 2012-02-02 04:00:00+03  &lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p class="p5"&gt;date_1 が夏時間の期間にあたる日時で、date_2 が冬時間の期間にあたる日時です。それぞれ、オフセットが +04、+03 と異なっていることが分かります。しかし、制度廃止によって 2011年の夏時間がそのまま通年の標準となるように変わったので、 2012年の日付である date_2 が +03 になっているのは誤りです。&lt;/p&gt; &lt;p class="p5"&gt;&lt;span&gt;&lt;b&gt;更新後(2011h):&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p8"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;dbuser=&amp;gt; select * from timezone_master; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;          date_1                       |             date_2               &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;------------------------------+------------------------------- &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;2011-10-04 13:19:38.796444+04 | 2012-02-02 05:00:00+04       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;p class="p1"&gt;tz database の更新後、同じようにデータを表示してみると、 date_2 も +04 になっており、更新が正しく適用されたことが分かります。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ Perl でのタイムゾーン情報&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;Perl では CPAN に公開されている DateTime モジュールが日時系の情報を扱う際の標準ですが、このモジュールも tz database の情報を元にタイムゾーン情報を持っています。CPAN からインストールしたファイルではすでに Perl のコードに展開されたものが記述されています。&lt;/p&gt; &lt;p class="p1"&gt;通常は、CPAN コマンドで DateTime::TimeZone モジュールをアップデートすれば、最新のタイムゾーン情報が反映されるでしょう。&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;$ cpan update DateTime::TimeZone&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;諸事情により DateTime モジュールを更新できない場合(機能や関連モジュールを更新できない/しなくない場合など)は、OS の tz database を使って、タイムゾーン情報だけを更新することができます。&lt;/p&gt; &lt;p class="p1"&gt;以下に、手順例を挙げます。&lt;/p&gt; &lt;p class="p1"&gt;1. ダウンロードした tz database のファイルを適当な場所に解凍&lt;/p&gt; &lt;p class="p9"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small; "&gt;&lt;span&gt;$ tar xzvf tzdata_2011h.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small; "&gt;&lt;span&gt;$ mv tzdata_2011h/tmp/tzdata2011h&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="p1"&gt;2. 更新のベースとする DateTime::TimeZone モジュールをダウンロード&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="s3"&gt;&lt;a href="http://search.cpan.org/~drolsky/DateTime-TimeZone-1.42/"&gt;CPAN&lt;/a&gt;&lt;/span&gt; または &lt;a href="http://git.urth.org/?p=DateTime-TimeZone.git;a=tags"&gt;&lt;span class="s3"&gt;Git&lt;/span&gt;&lt;/a&gt; から、ベースとしたいバージョンをダウンロードします&lt;/p&gt; &lt;p class="p1"&gt;3. ダウンロードした DateTime モジュールで、上の tzdata を指定して parse_olson スクリプトを実行&lt;/p&gt; &lt;p class="p9"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0); font-size: small; "&gt;$ tar xzvf DateTime-TimeZone-0446627.tar.gz&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0); font-size: small; "&gt;$ cd DateTime-TimeZone-0446627&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0); font-size: small; "&gt;$ perl tools/parse_olson --clean --dir /tmp/tzdata2011h/ --version 2011h&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;   &lt;p class="p1"&gt;これで、指定した tzdata の情報を持つ DateTime::TimeZone モジュールが出来上がります。(lib/DateTime/TimeZone/ 以下に、各エリアのディレクトリ/ファイルが作成されます)&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;参考:&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;CPAN - DateTime: &lt;/span&gt;&lt;a href="http://search.cpan.org/dist/DateTime/"&gt;&lt;span class="s2"&gt;http://search.cpan.org/dist/DateTime/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ アプリケーションでの実装&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;日時系の情報がデータベースに入っているなら、話は簡単です。&lt;/p&gt; &lt;p class="p1"&gt;ユーザがログインしてタイムゾーンが特定できる場合、リクエスト処理の先頭のほうで、以下のようなコマンドをデータベースに対して発行するだけでOKです。&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;SET TIME ZONE 'Asia/Tokyo'; (PostgreSQLの場合)&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"&gt;&lt;span&gt;参考: &lt;a href="http://www.postgresql.org/docs/8.4/static/sql-set.html"&gt;&lt;span class="s2"&gt;http://www.postgresql.org/docs/8.4/static/sql-set.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;これで、このデータベースコネクションの間は、 timestamp with time zone 型のデータについては指定したタイムゾーンで扱われます。&lt;/p&gt; &lt;p class="p1"&gt;たとえば '2012-01-20 10:30:00' としてクエリーを発行した場合、上記の例であればこれは日本時間での 10時半 という扱いになります。&lt;/p&gt; &lt;p class="p1"&gt;ちなみに、MySQLでは以下のコマンドで同様の設定ができるようです。&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;SET time_zone = 'Asia/Tokyo'; (MySQL)&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"&gt;&lt;span&gt;参考: &lt;a href="http://dev.mysql.com/doc/refman/5.1/ja/time-zone-support.html"&gt;&lt;span class="s2"&gt;http://dev.mysql.com/doc/refman/5.1/ja/time-zone-support.html&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;データベースへの単純なデータの出し入れであれば以上で十分ですが、操作しているユーザと異なるタイムゾーンで日時を出力したり送信したりする場面では、適宜タイムゾーンを調整する必要があります。1例を挙げると、ある外部のアプリケーションに日時データを送信するときは常に日本標準時で送らなければいけない、といったケースです。操作中のユーザのタイムゾーンの日時→日本標準時 への調整が必要です。たとえば Perl のコードでは DateTime モジュールに日時を格納した上で、以下のような変換を行います。&lt;/p&gt; &lt;p class="p1"&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="perl" name="code"&gt;use DateTime;&lt;br /&gt;&lt;br /&gt;my $dt = DateTime-&amp;gt;new(&lt;br /&gt;     'year' =&amp;gt; 2012, 'month' =&amp;gt; 1, 'day' =&amp;gt; 20,&lt;br /&gt;     'hour' =&amp;gt; 19, 'minute' =&amp;gt; 20, 'second' =&amp;gt; 0,&lt;br /&gt;      time_zone =&amp;gt; 'America/New_York'&lt;br /&gt;); # DB から取得した日付が New York のタイムゾーンだとして&lt;br /&gt;&lt;br /&gt;$dt-&amp;gt;set_time_zone('Asia/Tokyo'); # 日本時間に変換&lt;br /&gt;&lt;br /&gt;print $dt-&amp;gt;strftime('%F %T') . "\n"; # 2012-01-21 09:20:00&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt; &lt;p class="p1"&gt;他にも、タイムゾーンの異なる日付同士を比較する場合なども、たとえば それぞれ UTC にそろえた上で比較・演算する必要があります。&lt;/p&gt; &lt;p class="p1"&gt;ちなみに、開発中にテストで入出力した日時が正しいかどうか確認するツールとして、以下のサイトなどを利用するとよいでしょう。日本で何時だったらニューヨークで何時、といった比較が簡単にできます。&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"&gt;&lt;span&gt;worldtime buddy: &lt;a href="http://www.worldtimebuddy.com/"&gt;&lt;span class="s2"&gt;http://www.worldtimebuddy.com/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;なお、ユーザが指定可能なタイムゾーンの選択肢は、 tz database で選択可能なものに限定するようにしましょう。アプリケーション(Perl)、PostgreSQL、それぞれの OS で tz database のバージョンが一致していることが重要です。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;b&gt;■ おまけ: タイムゾーン小ネタ&lt;/b&gt;&lt;/p&gt; &lt;p class="p1"&gt;以上、ざっくりしたタイムゾーンサポート導入の概要でした。&lt;/p&gt; &lt;p class="p1"&gt;以下は技術ネタとは関係ない蛇足ですが、タイムゾーンまわりのことは調べてみるといろいろ興味深い話があります。&lt;/p&gt; &lt;p class="p1"&gt;-- 日本のタイムゾーン、サマータイム&lt;/p&gt; &lt;p class="p1"&gt;2011年は、電力不足の懸念から日本でもサマータイムを導入すべきではないか、という話題が挙がったりしていました。もし本当にサマータイムを導入するとなると、上で述べた tz database も日本中のシステムで更新されることになるでしょう。ちなみに日本でも戦後、GHQの施策でしばらくサマータイムが実施されていた期間があったそうです(僕は全然知りませんでした)。zdump コマンドで zoneinfo をのぞいてみると、1948 年から 1951 年ごろまで、切り替わりを示す情報が記載されいてるのが分かります。&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;$ zdump -v /usr/share/zoneinfo/Asia/Tokyo&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Dec 13 20:45:52 1901 UTC = Sat Dec 14 05:45:52 1901 CJT isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat Dec 14 20:45:52 1901 UTC = Sun Dec 15 05:45:52 1901 CJT isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Dec 31 14:59:59 1937 UTC = Fri Dec 31 23:59:59 1937 CJT isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Dec 31 15:00:00 1937 UTC = Sat Jan  1 00:00:00 1938 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  1 16:59:59 1948 UTC = Sun May  2 01:59:59 1948 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  1 17:00:00 1948 UTC = Sun May  2 03:00:00 1948 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep 10 15:59:59 1948 UTC = Sat Sep 11 01:59:59 1948 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep 10 16:00:00 1948 UTC = Sat Sep 11 01:00:00 1948 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat Apr  2 16:59:59 1949 UTC = Sun Apr  3 01:59:59 1949 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat Apr  2 17:00:00 1949 UTC = Sun Apr  3 03:00:00 1949 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  9 15:59:59 1949 UTC = Sat Sep 10 01:59:59 1949 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  9 16:00:00 1949 UTC = Sat Sep 10 01:00:00 1949 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  6 16:59:59 1950 UTC = Sun May  7 01:59:59 1950 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  6 17:00:00 1950 UTC = Sun May  7 03:00:00 1950 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  8 15:59:59 1950 UTC = Sat Sep  9 01:59:59 1950 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  8 16:00:00 1950 UTC = Sat Sep  9 01:00:00 1950 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  5 16:59:59 1951 UTC = Sun May  6 01:59:59 1951 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Sat May  5 17:00:00 1951 UTC = Sun May  6 03:00:00 1951 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  7 15:59:59 1951 UTC = Sat Sep  8 01:59:59 1951 JDT isdst=1&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Fri Sep  7 16:00:00 1951 UTC = Sat Sep  8 01:00:00 1951 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 12:14:07 2038 JST isdst=0&lt;br /&gt;/usr/share/zoneinfo/Asia/Tokyo  Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 12:14:07 2038 JST isdst=0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;1937年から1938年へ変わるタイミングについての記載は、どうもそれまで「中央標準時」と「西部標準時」の2つのタイムゾーンがあったのが一本化されたことに対応するもののようです。(CJT から JST に変わっています)&lt;/p&gt; &lt;p class="p1"&gt;&lt;span&gt;参考:&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small; "&gt;Wikipedia 日本標準時: &lt;/span&gt;&lt;a href="http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%A8%99%E6%BA%96%E6%99%82" style="font-size: small; "&gt;&lt;span class="s2"&gt;http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%A8%99%E6%BA%96%E6%99%82&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small; "&gt;hnwの日記 - 日付と時刻の豆知識 (4)tz databaseと日本のサマータイム:&lt;/span&gt;&lt;span class="s4" style="font-size: small; "&gt;&lt;b&gt; &lt;/b&gt;&lt;a href="http://d.hatena.ne.jp/hnw/20101223"&gt;&lt;span class="s5"&gt;http://d.hatena.ne.jp/hnw/20101223&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;-- タイムゾーンの選択肢をどうするか&lt;/p&gt; &lt;p class="p1"&gt;ユーザが選択可能なタイムゾーンは、 tz database に含まれているものである限りは何でも構わないのですが、すべてのタイムゾーンを選択可能にすると選択肢が膨大になります。また、それだけのタイムゾーンをサポートするということになると、どこかのエリアでタイムゾーン情報の変更があるたびに tz database を更新しなければならないので、その更新頻度も多くなってしまいます。&lt;/p&gt; &lt;p class="p1"&gt;最低限という意味では、1日 24時間なんだから 24分割して代表的なエリアを 24個選択肢に含めればいいのではないか？と一瞬 思いますが、エリアによっては UTC との差が n 時間30分差/15 分差だったりします(たとえばインドは UTC + 5:30、ネパールは UTC + 5:45)し、サマータイムを実施しているエリアとそうでないエリアがある(たとえばアメリカやオーストラリアでも、同じくらいの経度の地域でも州によってサマータイムを実施しているところとしていないところがある)ので、そう単純には決まりません。&lt;/p&gt; &lt;p class="p1"&gt;結局は、サービスを利用するユーザの分布(予測)で決めるしかないでしょう。主要な国や地域を見繕って、あとはなるべく将来の更新頻度を減らすために、ある程度の網羅性を確保できるよういくつかのエリアを補足すればよいでしょう。&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"&gt;&lt;span&gt;参考:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p3"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Wikipedia 標準時: &lt;a href="http://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3"&gt;&lt;span class="s2"&gt;http://ja.wikipedia.org/wiki/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Time-j.net 世界時計 - 世界の時間と時差: &lt;a href="http://www.time-j.net/uc/"&gt;&lt;span class="s3"&gt;http://www.time-j.net/uc/&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p1"&gt;他にも、UTC と GMT の違いや閏秒の話など、ネタはいくつかありますが、おまけのほうが長くなりそうなのでこの辺で今回は終わりとしたいと思います。&lt;/p&gt; &lt;p class="p1"&gt;では、また。&lt;/p&gt; &lt;p class="p2"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-3309208463161511117?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/3309208463161511117/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/linux-postgresql-perl-web.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3309208463161511117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3309208463161511117'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/linux-postgresql-perl-web.html' title='Linux + PostgreSQL + Perl な WEBアプリケーションにおけるタイムゾーンの実装'/><author><name>chappie</name><uri>http://www.blogger.com/profile/03991254246977977123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-5696041848521516925</id><published>2012-01-10T13:51:00.000+09:00</published><updated>2012-01-10T13:51:33.048+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='scraping'/><category scheme='http://www.blogger.com/atom/ns#' term='スクレイピング'/><category scheme='http://www.blogger.com/atom/ns#' term='Haskell'/><title type='text'>Haskell で Web スクレイピング</title><content type='html'>&lt;div&gt;どうも。開発の_fpです。&lt;/div&gt;&lt;div&gt;&lt;a href="http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06857-7"&gt;『７つの言語7つの世界』&lt;/a&gt;が題材の社内勉強会に参加して Haskell を担当したところ、意外にハマってしまいました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回は Haskell で Web スクレイピングということで、シンプルなリンクの抽出と、表形式のデータの取得をやってみたいと思います。&lt;/div&gt;&lt;div&gt;Web 上のライブなデータを扱うことができるので、Haskell をこれから学習する人にとっても面白いのではないかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;一般に Web スクレイピングといえば、Python の &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt; などが定番かと思いますが、 Haskell　にも &lt;a href="http://community.haskell.org/~ndm/tagsoup/"&gt;TagSoup&lt;/a&gt; というモジュールがあります。（同名の Java のものとは無関係のようです）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;開発環境は &lt;a href="http://hackage.haskell.org/platform/"&gt;Haskell-Platform&lt;/a&gt; です。&lt;/div&gt;&lt;div&gt;事前に、いくつか必要なモジュールをインストールしておきます。&lt;/div&gt;&lt;pre class="perl" name="code"&gt;&amp;gt; cabal update&lt;br /&gt;&amp;gt; cabal install　utf8-string tagsoup&lt;/pre&gt;&lt;div&gt;まずは、 ghci を起動して Web のコンテンツ取得を試してみます。&lt;/div&gt;&lt;pre class="perl" name="code"&gt;&amp;gt; import Network.HTTP&lt;br /&gt;&amp;gt; getResponseBody =&amp;lt;&amp;lt; simpleHTTP (getRequest "http://www.shanon.co.jp")&lt;/pre&gt;&lt;div&gt;HTMLのソースが表示されます。&lt;/div&gt;&lt;div&gt;ついでに以下もそれぞれ試してみると良いでしょう。&lt;/div&gt;&lt;pre class="perl" name="code"&gt;&amp;gt; (getRequest "http://www.shanon.co.jp/")&lt;br /&gt;&amp;gt; simpleHTTP (getRequest "http://www.shanon.co.jp")&lt;/pre&gt;&lt;div&gt;ここからは、TagSoupを使っていきます。&lt;/div&gt;&lt;div&gt;ソースファイルを作成して、ghciからロードします。&lt;/div&gt;&lt;pre class="perl" name="code"&gt;-- hrefs.hs&lt;br /&gt;import Network.HTTP&lt;br /&gt;import Text.HTML.TagSoup&lt;br /&gt;&lt;br /&gt;openURL :: String -&gt; IO String&lt;br /&gt;openURL x = getResponseBody =&lt;&lt; simpleHTTP (getRequest x)&lt;br /&gt;&lt;br /&gt;hrefs :: IO [String]&lt;br /&gt;hrefs = do&lt;br /&gt;    tags &lt;- fmap parseTags $ openURL "http://www.shanon.co.jp/"&lt;br /&gt;    let attrs = [head i | (TagOpen "a" i) &lt;- tags]&lt;br /&gt;    return [j | ("href", j) &lt;- attrs]&lt;/pre&gt;&lt;div&gt;ghciで以下のコマンドを実行します。&lt;/div&gt;&lt;pre class="perl" name="code"&gt;&amp;gt; :load hrefs.hs&lt;br /&gt;&amp;gt; hrefs&lt;/pre&gt;&lt;div&gt;&lt;div&gt;実行すると、URLのリストが表示されます。&lt;/div&gt;&lt;div&gt;parseTags の戻り値はTagのオープンとクローズのリストなので、まずは a タグをリスト内包表記で取り出し、次にアトリビュートのリストから href の値を取り出してリストとして返しています。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次に、tableタグのデータを抽出してみます。&lt;/div&gt;&lt;div&gt;今回は、個人的に引越し先として検討している千葉県船橋市の小学校のデータを抽出してみます。&lt;/div&gt;&lt;div&gt;元のサイトはこちらです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="background-color: white; font-family: 'Hiragino Kaku Gothic ProN',Meiryo,'ＭＳ Ｐゴシック',Helvetica,Verdana,Arial,sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;a href="http://www.city.funabashi.chiba.jp/kodomo/school/0004/p008678.html"&gt;船橋市 小学校学級数・児童数一覧&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;さて、先ほどのaタグと違って、今度は開きタグと閉じタグの対応関係を見なくてはなりません。&lt;/div&gt;&lt;div&gt;何度もパターンマッチすればできそうですが、ちょっと面倒です。&lt;/div&gt;&lt;div&gt;そこで、今回は TagSoup.Tree を使って木構造からデータを取得してみます。&lt;/div&gt;&lt;/div&gt;&lt;pre class="perl" name="code"&gt;-- schools.hs&lt;br /&gt;import Network.HTTP&lt;br /&gt;import Text.HTML.TagSoup&lt;br /&gt;import Text.HTML.TagSoup.Tree&lt;br /&gt;import Data.Char (isSpace)&lt;br /&gt;import qualified Codec.Binary.UTF8.String as U&lt;br /&gt;&lt;br /&gt;openURL :: String -&gt; IO String&lt;br /&gt;openURL x = getResponseBody =&lt;&lt; simpleHTTP (getRequest x)&lt;br /&gt;&lt;br /&gt;-- |先頭と末尾の空白を取り除く&lt;br /&gt;trim :: String -&gt; String&lt;br /&gt;trim = f . f&lt;br /&gt;    where f = reverse . dropWhile isSpace&lt;br /&gt;&lt;br /&gt;getSchools :: IO [[[String]]]&lt;br /&gt;getSchools = do&lt;br /&gt;    tags &lt;- fmap parseTags $ openURL "http://www.city.funabashi.chiba.jp/kodomo/school/0004/p008678.html"&lt;br /&gt;    -- 木構造を取得&lt;br /&gt;    let tree = tagTree tags&lt;br /&gt;    -- tr を取り出す (先頭2つと末尾は除く)&lt;br /&gt;    let schools = map doRow (init $ drop 2 $ [x | (TagBranch "tr" _ x) &lt;- universeTree tree])&lt;br /&gt;    return schools&lt;br /&gt;    where&lt;br /&gt;        -- |セルの文字列を取り出す&lt;br /&gt;        doCell :: [TagTree String] -&gt; [String]&lt;br /&gt;        doCell xs = [U.decodeString $ trim $ fromTagText t | t@(TagText _) &lt;- flattenTree xs]&lt;br /&gt;&lt;br /&gt;        -- |td を取り出す&lt;br /&gt;        doRow :: [TagTree String] -&gt; [[String]]&lt;br /&gt;        doRow xs = map doCell [x | (TagBranch "td" _ x) &lt;- xs]&lt;br /&gt;&lt;br /&gt;showSchools = do&lt;br /&gt;    s &lt;- getSchools&lt;br /&gt;    mapM doSchool s&lt;br /&gt;    return ()&lt;br /&gt;    where&lt;br /&gt;        doSchool xs = do&lt;br /&gt;            -- インデックス1の要素(学校名)を取り出す&lt;br /&gt;            let sname = head $ xs !! 1&lt;br /&gt;            putStr (sname ++ "\n")&lt;br /&gt;            -- 残りを表示&lt;br /&gt;            putStr ((show $ drop 2 xs) ++ "\n")&lt;/pre&gt;&lt;div&gt;&lt;div&gt;ghci&lt;/div&gt;&lt;pre class="perl" name="code"&gt;&amp;gt; :load schools.hs&lt;br /&gt;&amp;gt; showSchools&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;実行結果&lt;/div&gt;&lt;pre class="perl" name="code"&gt;船橋&lt;br /&gt;[["3"],["87","(2)"],["3"],["86",""],["3"],["84","(2)"],["3"],["78","(1)"],["3"],["86","(1)"],["2"],["74","(3)"],["17","(2)"],["495","(9)"]]&lt;br /&gt;湊町&lt;br /&gt;[["2"],["69","(3)"],["3"],["79","(2)"],["3"],["81","(6)"],["2"],["71","(3)"],["2"],["75","(2)"],["3"],["83","(4)"],["15","(3)"],["458","(20)"]]&lt;br /&gt;...&lt;/pre&gt;&lt;div&gt;&lt;div&gt;一旦、木構造に変換してtrを抜き出し、そこからさらにtdを抜き出しています。最終的にセルの値は　flattenTree でリスト構造に戻して取り出します。詳しくはコメントを参照して下さい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;補足すると、doCellのTagTextのリスト内包表記は&lt;a href="http://www.haskell.org/tutorial/patterns.html"&gt;As-pattern&lt;/a&gt;というもので、&lt;/div&gt;&lt;div&gt;パターンの前に識別子と@をつけるとマッチしたタプル全体を参照できます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;空白の除去には、&lt;a href="http://en.wikipedia.org/wiki/Trimming_(computer_programming)#Haskell"&gt;Wikipediaで紹介されている trim 関数&lt;/a&gt;をそのまま使いました。&lt;/div&gt;&lt;div&gt;いかにも Haskell らしくていい感じです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;また、サイトから取得した文字列が文字化けしてしまうので、デコードしています。&lt;/div&gt;&lt;div&gt;出力はターミナルの文字コードがUTF-8なら日本語で表示されると思いますが、WindowsではデフォルトがCP932などになっているので注意が必要です。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以上、簡単に説明してみました。&lt;/div&gt;&lt;div&gt;Haskell というと学術的なイメージがありますが、このように実用的なプログラムも簡潔に書けることが分かると思います。&lt;/div&gt;&lt;div&gt;私もまだまだ始めたばかりですが、面白いサンプルがあれば紹介していければと思っています。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-5696041848521516925?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/5696041848521516925/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/haskell-web.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5696041848521516925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5696041848521516925'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/haskell-web.html' title='Haskell で Web スクレイピング'/><author><name>_fp</name><uri>http://www.blogger.com/profile/17427863276413981913</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6193942162646974638</id><published>2012-01-07T09:43:00.005+09:00</published><updated>2012-01-17T12:22:21.967+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClickableCanvas'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='WCCF'/><category scheme='http://www.blogger.com/atom/ns#' term='Healer'/><category scheme='http://www.blogger.com/atom/ns#' term='Canvas'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQueryでCanvasを使ってお絵かき - 実践編</title><content type='html'>ご無沙汰しております、株式会社シャノン技術統括部プロダクト開発部のHealerです。&lt;br /&gt;&lt;br /&gt;あけましておめでとうございます。&lt;br /&gt;冬も本番となり、寒さが厳しくなってきましたが、お風邪などを召しておられませんでしょうか？&lt;br /&gt;そして本年も本ブログともども、弊社株式会社シャノンをよろしくお願い致します。&lt;br /&gt;&lt;br /&gt;さて、前回、&lt;br /&gt;&lt;a href="http://shanon-tech.blogspot.com/2011/06/jcanvasjquerycanvas.html"&gt;jCanvas(jQueryプラグイン)でCanvasを使ってお絵かき - 対応ブラウザ確認編&lt;/a&gt;&lt;br /&gt;なるものを書いてから早半年以上空いてしまいました。。&lt;br /&gt;実はスケジュールの都合が合わなくて1回パスをしているんです。&lt;br /&gt;当ブログは基本的に当番制でスケジュールの割り当てをいただいて技術部内の人間が順繰りに書いていくわけですが、1回だけパスが認められています。&lt;br /&gt;従って、1回パスをしたところ、今回は捕まえられてどうにも逃げられず書いている次第です。(笑)&lt;br /&gt;&lt;br /&gt;という冗談はさておき、今回は&lt;br /&gt;jQueryでCanvasを使ってお絵かき - 実践編&lt;br /&gt;です。&lt;br /&gt;良質な読み物エントリの多いブログですが、&lt;br /&gt;作ったもので遊べる系エントリでニッチなところを攻めていきたいと思います。&lt;br /&gt;&lt;br /&gt;ん？前回とタイトルを比べてみましょう。&lt;br /&gt;&lt;br /&gt;jCanvas(jQueryプラグイン)でCanvasを使ってお絵かき - 対応ブラウザ確認編&lt;br /&gt;jQueryでCanvasを使ってお絵かき - 実践編&lt;br /&gt;&lt;br /&gt;jCanvasという言葉が消えましたね。。&lt;br /&gt;そうなんです。&lt;br /&gt;CanvasをjQueryでいじくり倒す目的は変わりないのですが、&lt;br /&gt;とある事情のためjCanvasを使わなくなってしまったんです。&lt;br /&gt;&lt;br /&gt;そのとある事情とは、描いた図形を動かして動的に線で繋げたい！という事情です。&lt;br /&gt;絵を描くだけならjCanvasでもよかったんですが、&lt;br /&gt;下にある要件を満たすために描いた図形を動かしたかったのですが、&lt;br /&gt;うまく動かすことが出来なかったので&lt;br /&gt;今回は、&lt;br /&gt;&lt;a href="http://wiz-code.digick.jp/javascript/jquery.clickablecanvas.html"&gt;HTML5のCanvas図形をクリッカブルにするjQueryプラグイン ClickableCanvas&lt;/a&gt;&lt;br /&gt;を使うことにしました。&lt;br /&gt;こちらの方が色々なアニメーションチックな動きにも対応していて、&lt;br /&gt;かつ書き方自体もjCanvasと同じくCSSライクな記法が使えるので簡単で助かりました。&lt;br /&gt;&lt;br /&gt;さて、ここからは実際に作ってみたサンプルを元にClickableCanvasを見ていきたいと思います。&lt;br /&gt;&lt;br /&gt;作ったサンプルはこちら。(Internet Exproler以外で開いてください)&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/8393341/canvas_test2.html"&gt;Cooperation Checker with Canvas&lt;/a&gt;&lt;br /&gt;PC限定ですが触ってみてください。&lt;br /&gt;(Flashに変換したIE対応版を近日中に公開します)&lt;br /&gt;&lt;br /&gt;作る際に念頭においた要件は以下のとおりです。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;サッカーのフィールドに11人+ベンチ5人を並べて好き勝手にフォーメーションを組めるようにしたい&lt;/li&gt;&lt;li&gt;ゴールキーパーとベンチは動かさない&lt;/li&gt;&lt;li&gt;各ポジションは色を別にして見やすく&lt;/li&gt;&lt;li&gt;移動してポジションが変わったら色もそのポジションのものに変わる&lt;/li&gt;&lt;li&gt;動物占い準拠で相性の良し悪しが一目で分かる(おまけ) &lt;/li&gt;&lt;/ol&gt;要するに、某S◯GA社のアーケードサッカーカードゲームのチーム編成をする時に、&lt;br /&gt;自分のチームの選手の相性が視覚的にチェックできるといいよね、というものです。&lt;br /&gt;何のことかわからない方は捨て置いてください。(笑)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiz-code.digick.jp/demo/demo_2.html"&gt;jQuery ClickableCanvas デモページ2&lt;/a&gt;&lt;br /&gt;を参考に作りました。&lt;br /&gt;&lt;br /&gt;まずjQueryとClickableCanvasを使う用意をしましょう。&lt;br /&gt;HEADタグに&lt;br /&gt;&amp;lt;script src="js/jquery-1.6.1.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script src="js/jquery.clickablecanvas.v1.4.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;BODYタグに&lt;br /&gt;&amp;lt;div id="field" class="test"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;のようにすれば十分です。&lt;br /&gt;&lt;br /&gt;まずはCanvas全体のスタイルを指定しましょう。&lt;br /&gt;これが下地になります。&lt;br /&gt;&amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;   #field {&lt;br /&gt;       margin: 15px 30px;&lt;br /&gt;       width: 550px;&lt;br /&gt;       height: 600px;&lt;br /&gt;       position: absolute;&lt;br /&gt;       background-color: #00800;&lt;br /&gt;       zIndex: 0;&lt;br /&gt;   }&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;そして、&lt;br /&gt;var cc = $('#field').clickableCanvas({ flashCanvas: true });&lt;br /&gt;のようにclickableCanvasのオブジェクトを用意すれば、&lt;br /&gt;後はひたすら図形を書いていくだけです。&lt;br /&gt;&lt;br /&gt;以下のようにcreateShapeメソッドを使って書いていきます。&lt;br /&gt;cc.createShape({&lt;br /&gt;       name: 'center_circle',&lt;br /&gt;       type: 'circle',&lt;br /&gt;       coords: { x: 225, y: 2, r: 50 },&lt;br /&gt;       attr: { shapeZIndex: 0 },&lt;br /&gt;       style: {&lt;br /&gt;           lineWidth: 2.0,&lt;br /&gt;           strokeStyle: '#ffffff',&lt;br /&gt;           noFill: true&lt;br /&gt;       }&lt;br /&gt;});&lt;br /&gt;name(図形の名前)、type(図形の形)、coords(図形の座標など)が必須項目で、&lt;br /&gt;style(デフォルト)、hoverStyle(ポインタが乗ったとき)、activeStyle(クリックしたとき)のスタイルを指定することが出来ます。&lt;br /&gt;また、styleの代わりにgradientを使うとグラデーション付きスタイルを指定できます。&lt;br /&gt;図形にテキストを追加したいときはtextStyleを指定することでテキストが追加されます。&lt;br /&gt;下記のように、イベントハンドラも実装されていますので、&lt;br /&gt;イベントを機に図形を新たに描画したりすることも出来ます。&lt;br /&gt;onClick: function(shape, coord) {&lt;br /&gt;   shape.name.match(/player(\d+)/);&lt;br /&gt;   ppoint[RegExp.$1] = false;&lt;br /&gt;},&lt;br /&gt;ここでの 第1引数は図形オブジェクト、第2引数はカーソル座標が渡されます。&lt;br /&gt;&lt;br /&gt;今回作成したサンプルの範囲だと、このくらいで事足りますが、&lt;br /&gt;他にもanimateShapeというアニメーションを行うことの出来るメソッドも用意されています。&lt;br /&gt;&lt;br /&gt;サンプルに関してですが、&lt;br /&gt;まず画面のロード時にフィールドの描画と選手の初期配置を行うようにしました。&lt;br /&gt;選手の描画には、&lt;br /&gt;textStyleでその選手の番号を表示し、&lt;br /&gt;hoverStyleでカーソルを載せたときに色が変わるようにしました。&lt;br /&gt;onMouseDownで&lt;br /&gt;&lt;br /&gt;ppoint[s] = true;&lt;br /&gt;&lt;br /&gt;とすることによって移動を可能にし、&lt;br /&gt;onMouseMoveで移動前、移動後の座標の差を計算して図形を移動させるようにしてあります。&lt;br /&gt;&lt;br /&gt;shape.coords.x += (x[num] - preX[num]);&lt;br /&gt;shape.coords.y += (y[num] - preY[num]);&lt;br /&gt;var pos = position = checkPosition(shape.coords.x,shape.coords.y, false);&lt;br /&gt;shape.normal.fillStyle = positions[pos];&lt;br /&gt;&lt;br /&gt;onMouseMoveはかなり細かく移動を認識するので重たい処理を書くと&lt;br /&gt;図形の移動がスムーズに見えなくなるので注意が必要です。&lt;br /&gt;移動後の座標から、ポジションが変わっていたら色を変えるようにしてあります。&lt;br /&gt;&lt;br /&gt;ppoint[RegExp.$1] = false;&lt;br /&gt;&lt;br /&gt;最後にonClickで再び図形の移動を不許可にしています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ここまでで要件の4まで満たしており、かなり簡単に図形の描画と移動を行うことが出来ました。&lt;br /&gt;&lt;br /&gt;5の要件に関しては、&lt;br /&gt;各選手に対応するselectタグを配置して 、&lt;br /&gt;選択された値をinputタグに保存しておいて&lt;br /&gt;onMouseOverで動物占いの相性によって色付きの線が出るようにしました。&lt;br /&gt;最も相性がいい場合が金色で以下、赤、青、白、グレーの順になっています。&lt;br /&gt;グリグリ動かしたりして、色々試して遊んで挙動を楽しんでみてください。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-c2Q4n922Wk0/TweWWJ9ZVwI/AAAAAAAAABQ/h17w9Mo6Nn4/s1600/Cooperation+Checker+with+Canvas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-c2Q4n922Wk0/TweWWJ9ZVwI/AAAAAAAAABQ/h17w9Mo6Nn4/s320/Cooperation+Checker+with+Canvas.png" width="297" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;最後に、個人的な不満点や課題をいくつか。&lt;br /&gt;&lt;br /&gt;まずコードが汚くなってしまったこと。。&lt;br /&gt;設定関連の値をゴチャ混ぜに書いてしまったため、かなり汚いです。&lt;br /&gt;読者の方には申し訳ないですが今回は我慢していただいて、&lt;br /&gt;次回はそのへんを整理して別のファイルに切り出すなどしてコードの可読性を上げたいと思います。&lt;br /&gt;時間が取れれば今回の分も書き直します。&lt;br /&gt;&lt;br /&gt;ClickableCanvasを最終的に使いこなすところまで持って行けなかったところも課題です。&lt;br /&gt;実は、色付きの線が描画された状態で 選手を移動すると線だけ残ります。。&lt;br /&gt;各選手に一旦カーソルを当てると順次描画しなおすので消えていきますが、&lt;br /&gt;最後まで解決方法が分かりませんでした。&lt;br /&gt;それにともなってエラーが出る場合もあります。&lt;br /&gt;このようなバグを残さないよう精進していきます。&lt;br /&gt;&lt;br /&gt;後はCanvasそのものに対する不満です。&lt;br /&gt;今回、textStyleに選手の番号をいれていますが、&lt;br /&gt;当初の構想では番号を入れると同時に指定されている動物の名前も直上に表示するつもりでした。&lt;br /&gt;また、select要素もページ上に常に表示しておくのではなく、&lt;br /&gt;ポインタが当たった時点でフロートのようにselect要素を表示しようと考えたのですが、&lt;br /&gt;残念ながら現在はHTMLのレンダリングには対応しておらず、&lt;br /&gt;タグはエスケープされて表示されます。&lt;br /&gt;仕様書の通りなら可能になるはずなので、早めに対応して欲しいものですね。&lt;br /&gt;&lt;br /&gt;次回はこの可動式Canvasサンプルをスマートフォンで動かせるようにしていきたいと思います。手元のiPhoneのSafariだとフィールドの描画とポインタ乗せ時の線の描画まではされたんですが、&lt;br /&gt;配置をいじることは出来ませんでした。&lt;br /&gt;何かまた違った要素があるようですね。&lt;br /&gt;その辺を勉強してみます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上、JavaScriptだけでこんなにお絵かき出来るんだ！のコーナーでした。&lt;br /&gt;業務とは全く関係の無いエントリですいません。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6193942162646974638?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6193942162646974638/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/jquerycanvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6193942162646974638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6193942162646974638'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2012/01/jquerycanvas.html' title='jQueryでCanvasを使ってお絵かき - 実践編'/><author><name>Healer</name><uri>http://www.blogger.com/profile/17671238333931328820</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-c2Q4n922Wk0/TweWWJ9ZVwI/AAAAAAAAABQ/h17w9Mo6Nn4/s72-c/Cooperation+Checker+with+Canvas.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6766344086906933793</id><published>2011-12-26T18:51:00.002+09:00</published><updated>2011-12-26T19:49:29.113+09:00</updated><title type='text'>小さな企業が技術ブログやってみた一年、どうだったかのまとめ</title><content type='html'>師走ですね。&lt;a href="https://twitter.com/#%21/ikeike443" target="_blank"&gt;ikeike443&lt;/a&gt;です。&lt;br /&gt;&lt;br /&gt;皆さん、知ってますか？　今週の日曜は既に来年です！&lt;br /&gt;何を言ってるかわからないと思いますが、カレンダーを見ればわかります。。年をとるって怖いですね！　一瞬だよ！　光陰矢の如しだよ！&lt;br /&gt;&lt;br /&gt;さて、今回は、2011年のまとめということで、弊社技術ブログのこの一年を簡単に振り返ってみたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;このブログってなんなんですか &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;一応コーポレイトサイトからもリンクを貼ってもらっていて、公式ブログっぽく見せていますが、実態は技術部の有志で運営しているブログです。（別に非公式だというわけではないですが。。）&lt;br /&gt;予算もついてないですし、主に運営業務をしているのは私ですが、私も本業が別にあって、片手間にこのブログのメンテナンスや編集者業務をしている感じです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;なんのために始めたの&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;いろいろあります。&lt;br /&gt;&lt;b&gt;一つは採用&lt;/b&gt;です。シャノンという会社は企業向けにSaaSを提供しているベンチャー企業で、地味にいいエンジニアが揃っているのですが、いまいち社外のコミュニティ内での知名度も低く、応募者の数も決して多くありませんでした。&lt;br /&gt;せっかくいい会社なのに、知られてないのはもったいないなー、と思ったのがきっかけです。&lt;br /&gt;もう&lt;b&gt;一つは社内の研究開発機会と意識の醸成&lt;/b&gt;です。シャノンは少ない人数で多くのお客様に対してサービスを提供していますので、本業は大変忙しい状況です。エンジニアも優秀な人が揃っていますが、それでも日々の業務に忙殺されることが多く、中々新技術や、開発方法論の研究に当てる時間が取れません。&lt;br /&gt;ブログを運営することで、社外への発信の機会を無理やり作り、それによって何かを研究しないといけない、わかりやすくまとめないといけない、となり、それによって社内に研究開発の機会を作っていきたい、という狙いがありました。&lt;br /&gt;最後の&lt;b&gt;一つは、なんか楽しそう&lt;/b&gt;だったからです。&lt;br /&gt;ウノウさん（現Zynga）やカヤックさんの技術ブログを見ていて、なんか楽しそうだなー、うちも楽しいことしたい！　というノリで始めた、っていうのも大きいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;結果どうだったの &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;まだ始めて1年経ってませんので結果というのもアレですが、中々いい結果を得ることができています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;まず採用ですが&lt;/b&gt;、数は明かせませんが、応募者数も少し増えました。ですが、正直言って、数自体は期待していたよりずっと少なかったです。数だけを見ると失敗だったかも？　という結果でした。&lt;a href="https://shanon-tech-recruit.smktg.jp/public/seminar/view/1" target="_blank"&gt;今からでもいいからここから応募してよ&lt;/a&gt;！&lt;br /&gt;ですが、数は少ない代わりに、以前にも増して優秀なエンジニアの方に多く応募していただくことができました。特に、以前は&lt;b&gt;シャノンなんて名前も知られていない&lt;/b&gt;し、応募する方も、こちらから&lt;b&gt;スカウトを出さない限りは興味も示さない&lt;/b&gt;という方がほとんでしたが（私もそうでした）、ブログを始めてからは、むしろ&lt;b&gt;シャノンに入りたい、と言って応募してくださる方が増えました&lt;/b&gt;。これは大きな効果だったと感じています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次に&lt;b&gt;研究開発機会の醸成&lt;/b&gt;ですが、これも効果はあったと感じています。思っていたよりは新技術がどうのという話は少なく、比較的地味な記事が多かったかもしれませんが、地に足の着いた記事はそこそこの人気を博しましたし、幾つかの記事は、はてなブックマークもたくさんいただきました。&lt;br /&gt;社内での勉強会も活発になり、直接間接に、本業のプロダクトに反映されるようになっています。&lt;br /&gt;&lt;br /&gt;また社外の勉強会に出席するエンジニアの割合も増え、何人かは登壇をする機会なども得られまして、幾分か技術向上の意識が高まった実感があります。これは今後も続けていきたいと感じています。&lt;br /&gt;登壇といえば、年明け早々に、弊社の&lt;a href="https://twitter.com/#%21/fujya" target="_blank"&gt;fujya（藤倉）&lt;/a&gt;がニフティさん主催の&lt;a href="http://tech.nifty.co.jp/party/2012/program.htm#aRoom1" target="_blank"&gt;CROSS エンジニアサポート新年会 2012のこのセッション&lt;/a&gt;に登壇する予定です。良かったらみなさん参加されてください！ &lt;br /&gt;&lt;br /&gt;最後に、&lt;b&gt;楽しかったかどうか&lt;/b&gt;ですが、 &lt;br /&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;超楽しかったですよ&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;ブログを書くのも、Twitterやはてなでバズるのを見るのも楽しかったですし、また仕事でお客様や取引先様とお話する際も「ブログ見てます」といってくださる方が多く、やってよかった感満載でした。&lt;br /&gt;個人的には、&lt;a href="http://shanon-tech.blogspot.com/2011/05/backlog-in-fukuoka.html" target="_blank"&gt;ブログの記事にするという口実で福岡まで渡ったりしました&lt;/a&gt;し、また、上述の&lt;a href="http://tech.nifty.co.jp/party/2012/program.htm#aRoom1" target="_blank"&gt;CROSS エンジニアサポート新年会 2012&lt;/a&gt;の話も、このブログがきっかけでお話を頂いたわけですし、とても楽しい1年でした。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;ぶっちゃけどのくらいのPVがあるんですか&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;はい。こんなもんです。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ruVt8CXsbww/Tvg7hflNNQI/AAAAAAAAAGw/CFx6UTRKZK4/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.05.46.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="89" src="http://4.bp.blogspot.com/-ruVt8CXsbww/Tvg7hflNNQI/AAAAAAAAAGw/CFx6UTRKZK4/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.05.46.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;今年の2月に技術ブログを始めたのですが、初月から1万PVを出し、その後も順調に推移して、年間最大では2万6千PV程を叩き出すことが出来ました。&lt;br /&gt;この数値はPVとしてみた場合は貧弱ですし、著名なブログであれば個人ブログでもこの何十倍もPVを稼いでいますが、全くコネも実績もない状態からブログを立ち上げたにしては、そこそこの数字を出したのではないかなと思っています。&lt;br /&gt;&lt;br /&gt;下記の参照元URLと参照元サイトを見てもらうとわかりますが、&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-U63-7X3IWNA/Tvg7mLwU10I/AAAAAAAAAHE/Q_57i9JtNfM/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.07.03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://3.bp.blogspot.com/-U63-7X3IWNA/Tvg7mLwU10I/AAAAAAAAAHE/Q_57i9JtNfM/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.07.03.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-5K9pNPaThIg/Tvg7lvR7uCI/AAAAAAAAAG8/uGxaRx-hPP0/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.06.57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://2.bp.blogspot.com/-5K9pNPaThIg/Tvg7lvR7uCI/AAAAAAAAAG8/uGxaRx-hPP0/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.06.57.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;ほぼ、Twitterとはてなブックマークによるバズだけでアクセスを稼いでいます、と書こうとしてよく見たら、意外にGoogleからの検索で来ている方も多かったようです。&lt;br /&gt;ブログを立ち上げた最初の3ヶ月くらいはほぼTwitterとはてなブックマークからのアクセスだけだったのですが、徐々に検索にも引っかかるようになった結果、このようになったみたいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tophatenar.com/" target="_blank"&gt;TopHatenar&lt;/a&gt;さんの指標においては、下記のとおりです。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ntllTmVjATc/Tvg7owN85gI/AAAAAAAAAHc/jyXJ5bk0qFg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.11.36.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://2.bp.blogspot.com/-ntllTmVjATc/Tvg7owN85gI/AAAAAAAAAHc/jyXJ5bk0qFg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.11.36.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;まだまだgigazineさんの背中は遠いですねー。。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;もっと精進して、gigazineさんを超えるメディアに育てたいと思います！（嘘です！）&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt; 2011年、どんな記事書いたの&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;最後に、人気のあった記事を振り返って終わりたいと思います。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/09/web.html"&gt;ブラウザってどうやって動いてるの？（モダンWEBブラウザシーンの裏側）&lt;/a&gt;&lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;はてなブックマークを700以上頂きました。HTML5Rocksの記事の翻訳です。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;ちなみにHTML5Rocks本家の眼にも止まったようで、&lt;a href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/" target="_blank"&gt;本家にもリンクしてもらっています&lt;/a&gt;(記事末尾のTranslationの項参照)。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/03/vim.html"&gt;vim で実践！　コードリファクタリング&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;vimでリファクタリングをする方法を、なぜか動画付きで解説するという記事です。なんでこんな力入ってるのこれ。。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/04/blog-post_20.html"&gt;アンドロイドアプリを作ってみよう　～開発環境準備&lt;/a&gt;&lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Googleで検索してきた方が多かったようです。期待した記事になっていたでしょうか。。記事としては完成していないため、執筆者は早く続きを書くように。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/02/blog-post_02.html"&gt;開発者にやさしい環境&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;シャノン技術部の環境について書きました。シャノンはできるだけ開発者が働きやすいように配慮した職場環境を整えています。特にルンバとか。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/11/selenium.html"&gt;Jenkins, Seleniumを使った自動テストの課題とこれからの取り組み&lt;/a&gt;&lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Jenkins、Selenium、品質保証、と言った記事は特に人気が高く、常にアクセスが多くありました。特にこの記事は人気が高かったようです。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/01/amazonec2.html"&gt;AmazonEC2を何倍もお得に使う方法&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;OpenVZ on Xenです。とにかくコストにうるさいシャノンでは、インフラエンジニアがコストダウンのために何でもするんです、ということがよく分かる記事でした。大変ですね！　面白いけど。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/05/fitnesseseleniumjenkins.html"&gt;FitNesse+Selenium+Jenkinsによるテストケース継続的インテグレーション&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;これもJenkinsとSeleniumですね。FitNesseってまだ動くんだ、みたいな反応が多かったように記憶しています。執筆者は早く続き書いてね。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/10/gbpostgresql30.html"&gt;数百GBのPostgreSQLを一瞬でバックアップする方法&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;なんか疲れてきました。いい記事だよ！&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/03/2jenkins.html"&gt;第2回Jenkins勉強会に参加しました！&lt;/a&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;勉強会も出てるよ！&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a class="GMUUXGEDGN" href="http://shanon-tech.blogspot.com/2011/05/blog-post.html"&gt;ソフトウェアテスト技法いろいろ&lt;/a&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;テストの話って人気あるよね！&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;a href="http://shanon-tech.blogspot.com/2011/11/15monit.html" target="_blank"&gt;15分出始めるmonitによるサーバ監視&lt;/a&gt; &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;サーバ監視楽しいよ！&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;ってことで、 &lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: x-large;"&gt;&lt;b&gt;また来年！ &lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6766344086906933793?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6766344086906933793/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/blog-post_26.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6766344086906933793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6766344086906933793'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/blog-post_26.html' title='小さな企業が技術ブログやってみた一年、どうだったかのまとめ'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-ruVt8CXsbww/Tvg7hflNNQI/AAAAAAAAAGw/CFx6UTRKZK4/s72-c/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2011-12-26+18.05.46.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-7411802630294226152</id><published>2011-12-19T22:51:00.012+09:00</published><updated>2011-12-20T02:38:58.026+09:00</updated><title type='text'>産休・育休中に貰えるお金と手続きのポイント　その二</title><content type='html'>こんにちは、技術部QA所属のおかもとです。&lt;br /&gt;12月始めに産休・育休に関する記事、第二弾を公開しようと思っていたのですが、&lt;br /&gt;子供が保育園で大流行している水疱瘡になっていた為投稿が遅れてしまいました。&lt;br /&gt;大変長らくお待たせしました・・汗。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前回は産休・育休・復職後のシャノン体験談と題してお話をしたのですが、&lt;br /&gt;今回はそのお休みの間にしなくてはいけない手続きや貰えるお金について詳しく書いてみようと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;なぜそのような当り前な事をここで取り上げるか・・？についてちょっと触れると、&lt;br /&gt;確かに「育休　手続き」とかでググればそんな情報は五万と出てきますが、&lt;br /&gt;「どのタイミングでどの手続きをしなくてはならないか？」という時系列にまとめられた資料はほとんどなく、私自身大変困った＆自分で調べることも多かった・・という経緯があるからです。&lt;br /&gt;また、どうしてそんなに時系列が大切か？というと、特に役所関連で申請するものには「期限が何日まで！厳守！！」というのが多く、期限を一日でも過ぎると受理して貰えない＆お金も貰えない・・ということが容赦なくある為です。&lt;br /&gt;是非このあたりのタイムスケジュール管理は会社任せにせず、自分でも大まかな流れを知っておくことをお勧めしたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;では、さっそく時間軸毎に。。&lt;br /&gt;以下は、主な産休・育休の流れを2011年1月1日出産の場合という具体例で書き、&lt;br /&gt;表にある重要ポイント毎に順を追って簡単に説明していきます。&lt;br /&gt;尚この資料は私が育児休業を取得した当時を参考にしているので、改定されている場合などはご了承ください。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-ysochvdMeCo/Tu9jhEoUi4I/AAAAAAAAZSQ/89DgxkRvI2k/s1600/31v9t_U56399059854448.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 181px;" src="http://2.bp.blogspot.com/-ysochvdMeCo/Tu9jhEoUi4I/AAAAAAAAZSQ/89DgxkRvI2k/s400/31v9t_U56399059854448.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5687874274221919106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;まずポイント①、「産休開始時」&lt;br /&gt;産休は産前6週間・産後8週間を指します。&lt;br /&gt;この期間の健康保険や厚生年金、住民税などは支払う義務があるため、&lt;br /&gt;たいてい産休に入る前の給与でまとめて徴収されることになります。&lt;br /&gt;その為、産休前最後に支給される給与は、ほぼないものと覚悟した方がいいです（笑）。&lt;br /&gt;また、産休に入る前に会社の事務などを通して入手しておいた方がいいものとして、出産育児一時金・出産育児付加金の支払依頼書や出産手当請求書があります。&lt;br /&gt;これは、まだ後に請求するものなので急ぐ必要はありませんが、いざ申請の時！！には、出産直後で余裕がないので早めに入手して書いておくのが得策です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ポイント②「出産直後」&lt;br /&gt;おめでとうございます・・この出産直後はかなり申請もののラッシュです(汗)。。&lt;br /&gt;まず、出産翌日から産後休暇が始まります。&lt;br /&gt;入院している間に出産一時金と付加金の証明書類を病院で書いて貰いましょう。&lt;br /&gt;因みにこれらの請求先は健康保険組合になりますが、提出先は会社です。&lt;br /&gt;弊社の所属するIT健保は、昔ホリエ●ンが絶賛したことがある健保で、「出産一時金」が420,000円（産科医療補償制度対象分娩でない場合は390,000円）、「出産育児付加金」90,000円の計510,000円（産科医療補償制度対象分娩でない場合は480,000円）が給付されます。&lt;br /&gt;また、このタイミングで育児休業開始予定日を会社に申し出ておきましょう。&lt;br /&gt;これにより、産休終了後にスムーズに育児休業に突入できます。&lt;br /&gt;&lt;br /&gt;更に・・退院後は必要書類を揃えて市役所に直行しましょう！&lt;br /&gt;子供の出生届等と児童手当(こども手当)の手続きを早めにすることをお勧めします。なぜなら児童手当金は月末が申請手続きの締め切りで、手続きをした翌月の分からが支給されるため、手続きが遅れた場合も遡って払込みなどは行ってくれませんので注意です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ポイント③「育児休業開始時」&lt;br /&gt;さて、産休が終わった次の日から育児休業が始まります。&lt;br /&gt;ここでまずした方がいいのが「出産手当金」の申請です。これは何のお金なのかと言うと、&lt;br /&gt;産休中の休業保障といった感じのものです。幾らもらえるかは↓&lt;br /&gt;&lt;br /&gt;給付額：　休業1日につき、標準報酬日額の3分の2相当額&lt;br /&gt;・・と言っても分かり辛いので実際の例を見てみましょう♪&lt;br /&gt;&lt;br /&gt;ex.)給与が25万だった人(交通費含む)の貰える出産手当金は？？&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1.まず大体の日給を出すとこんな感じ。&lt;br /&gt;　　　&lt;br /&gt;250.000 ÷　30 =　8.333&lt;br /&gt;日給：￥8.333&lt;br /&gt;&lt;br /&gt;2.日給の2/3が支給されるので、さっき出た日給に2/3をかける・・&lt;br /&gt;&lt;br /&gt;8.333　×　0.67(2/3を計算しやすくした)　=　5.583&lt;br /&gt;日給の2/3：￥5.583&lt;br /&gt;&lt;br /&gt;3.2で算出した額に産休で取得した日数をかけると・・&lt;br /&gt;&lt;br /&gt;5583　×　98　=　547.134&lt;br /&gt;&lt;br /&gt;A.給与が25万だった人の出産手当金として貰える額は、約￥547.134&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;・・となります。&lt;br /&gt;出産手当金の申請書類もまた出産した産科による証明などが必要な為、出来れば出産直後の一時金申請書類等と一緒に書いて貰っておくことをお勧めします。私の場合は里帰り出産ですぐにはハンコを貰いに行けない場所だったので、書いて貰って時期が来るまで保管していました。&lt;br /&gt;こちらも請求先は健保、提出先は会社になります。&lt;br /&gt;さてもう一つ重要な手続きが健康保険と厚生年金保険の免除申請です。これも育児休業に入ってからしかできませんが、全額免除されます。こちらの手続きも会社を通して行います。&lt;br /&gt;因みに住民税は？というと、これは払い続けなければなりません(笑)。私の場合は、育児休業中は普通徴取に切り替えてぼちぼち払っていました。&lt;br /&gt;&lt;br /&gt;そして最後に「育児休業給付金」の申請。まずこの申請は受給資格があるかを確認する必要がありますが、自分で確認する場合は会社管轄のハローワークに育児休業開始から10日以内に行う必要があります。会社が申請を行ってくれる場合は、初回申請時に受給資格を確認するらしいです。これが完了すると、以下の金額が2カ月ごとに振り込まれてきます。&lt;br /&gt;&lt;br /&gt;月給×0.5×育休として休んだ月数＝もらえる金額(目安)&lt;br /&gt;&lt;br /&gt;ざっと説明しましたが、産休・育休に関わる手続きは大体こんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前回のシャノン体験談でもお話しましたが、これだけの色々な免除や貰えるお金があるのは大変ありがたいことであり、「社員」という存在は休んでいても尚、特に金銭的な保障の部分で会社に守られた存在であるということを感じます。&lt;br /&gt;&lt;br /&gt;また個人的にお礼を言わせて頂くと、特に復職後のQAチームや一緒に仕事をしている方たちのバックアップ体制には感謝しています・・(笑)&lt;br /&gt;突然の水疱瘡や手足口病(今年だけで4回もなった・・泣)にも文句ひとつ言わず、「何かあったらやっておくんで振ってください」とさりげなくメールをくれたりする優しさ。。&lt;br /&gt;どうやら一緒に共倒れしてくれる七人の侍らしき人たちがうちの会社にはいっぱいいるみたいです・・この場を借りてお礼を。。&lt;br /&gt;&lt;br /&gt;社外のシャノンに興味ある方々・・&lt;br /&gt;そして社内の皆さんにいつかこの情報が役立つときが来ますように・・と願いつつ終わります。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-5udGTk__GmU/Tu9wvXDk9AI/AAAAAAAAZSk/V9_SvoNVbC4/s1600/untitled6.JPG"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://3.bp.blogspot.com/-5udGTk__GmU/Tu9wvXDk9AI/AAAAAAAAZSk/V9_SvoNVbC4/s200/untitled6.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5687888813337408514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これが皆さんのおかげでのびの～～びと育っているうちの息子です(笑)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-7411802630294226152?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/7411802630294226152/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7411802630294226152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7411802630294226152'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/blog-post.html' title='産休・育休中に貰えるお金と手続きのポイント　その二'/><author><name>かなぴー</name><uri>http://www.blogger.com/profile/03096814031879496520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-ysochvdMeCo/Tu9jhEoUi4I/AAAAAAAAZSQ/89DgxkRvI2k/s72-c/31v9t_U56399059854448.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-5852008544542369396</id><published>2011-12-05T00:38:00.015+09:00</published><updated>2011-12-05T11:24:13.143+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Playframework'/><category scheme='http://www.blogger.com/atom/ns#' term='Selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='nishino'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>Play! frameworkでつくるスクリーンショット取得サービス</title><content type='html'>&lt;div&gt;本エントリは &lt;a href="http://www.atnd.org/events/22247" target="_blank"&gt;Play! framework Advent Calendar 2011 jp #play_ja : ATND&lt;/a&gt; の5日目です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-LroeN8pdnh8/TtuStIWeIFI/AAAAAAAAAD0/mlXWtVGxqyo/s1600/screenshot_logo.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 276px; height: 375px;" src="http://4.bp.blogspot.com/-LroeN8pdnh8/TtuStIWeIFI/AAAAAAAAAD0/mlXWtVGxqyo/s400/screenshot_logo.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5682296658891513938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;シャノンCRM部の &lt;a href="http://www.blogger.com/profile/15291112813871756041" target="_blank"&gt;nishino&lt;/a&gt; です。&lt;div&gt;サポートの人となって、はや５ヶ月。主にトラブル対応がメインですが、お客様の声を直接耳にするようになり、温度感とか、つまずきポイントとか、技術部時代には「意味分からん」とか言っていたことがなんとなく分かるようになってきた気がします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;自分としては懇切丁寧に（手取り足取り）教えるとゆーよりは、お客様が自己解決できるようにドキュメントやツール群を整備していきたいなあ・・と考えている今日このごろです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回はシャノンのヱヴァンジェリスト &lt;a href="http://twitter.com/ikeike443" target="_blank"&gt;@ikeike443&lt;/a&gt; 氏より&lt;/div&gt;&lt;div&gt;「Play!のAdvent Calendarやるよー。」&lt;/div&gt;&lt;div&gt;「ほう、いいねぇ」&lt;/div&gt;&lt;div&gt;と二つ返事で参加することになりましたが、このPlay!という代物は実行時デバッグでエラーが分かりやすく、あまりつまずくことなく扱えるのと（すばらしい）、公式英語サイト（&lt;a href="http://www.playframework.org/" target="_blank"&gt;http://www.playframework.org/&lt;/a&gt;）の日本語翻訳サイト（非公式）（&lt;a href="http://playdocja.appspot.com/" target="_blank"&gt;http://playdocja.appspot.com/&lt;/a&gt;）がかなり内容充実しており（これまたすばらしい）、オレがあまり言うこともないなぁという印象で今は若干後悔しておる感じです。&lt;/div&gt;&lt;div&gt;Advent Calender days 4thの &lt;a href="http://twitter.com/Masahito" target="_blank"&gt;@Masahito&lt;/a&gt; さんもPlayの情報源としていろいろ紹介してくれていますので気になる方は是非見にいかれることをオススメします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Play! framework Advent Calendar 2011 jp&lt;/div&gt;&lt;div&gt;&lt;a href="http://atnd.org/events/22247" target="_blank"&gt;http://atnd.org/events/22247&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とはまあ言ってもちょっとドキュメント整備の一環でスクリーンショット取得の仕組みが欲しかったので、さくっとPlay!でつくってみて、他のAdvent Calender参加者様（もちろんこのブログを見てくれているあなた様も）と、きゃっきゃ・うふふと楽しめたら御の字だよね、と思っております。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;スクリーンショット取得サービス&lt;/h3&gt;&lt;div&gt;URLを入力してスクリーンショットの画像を取得するサービスです。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;既存のサービスに「&lt;a href="http://www.cman.jp/BrowserCapture/" target="_blank"&gt;ブラウザキャプチャサービス&lt;/a&gt;」や「&lt;a href="http://capture.heartrails.com/help/make_thumbnail" target="_blank"&gt;HeartRails Capture&lt;/a&gt;」といったものがありますが、これをPlay! で作ってみたいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;プロジェクト作成&lt;/h3&gt;&lt;div&gt;プロジェクト名はhogeです。&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;好きな名前をつけるとよいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;$ play new hoge&lt;br /&gt;~        _            _&lt;br /&gt;~  _ __ | | __ _ _  _| |&lt;br /&gt;~ | '_ \| |/ _' | || |_|&lt;br /&gt;~ |  __/|_|\____|\__ (_)&lt;br /&gt;~ |_|            |__/&lt;br /&gt;~&lt;br /&gt;~ play! 1.2.3, http://www.playframework.org&lt;br /&gt;~&lt;br /&gt;~ The new application will be created in /Users/magnet/Workspace/play/hoge&lt;br /&gt;~ What is the application name? [hoge]&lt;br /&gt;~&lt;br /&gt;~ OK, the application is created.&lt;br /&gt;~ Start it with : play run hoge&lt;br /&gt;~ Have fun!&lt;br /&gt;~&lt;br /&gt;$&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;h3&gt;CRUDモジュール&lt;/h3&gt;Play!に標準で用意されているCRUDモジュールは便利です。なぜなら色々やることが&lt;span style="text-decoration:line-through;"&gt;なまけられる&lt;/span&gt;省略できるからです。&lt;br /&gt;&lt;div&gt;このCRUD モジュールを有効にします。&lt;/div&gt;&lt;div&gt;hoge/conf/application.conf ファイルに次の行を追加します。&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;# Import the crud module&lt;br /&gt;module.crud=${play.path}/modules/crud&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ついでにデータベースを使用するために、 次の行を非コメント化しましょう。&lt;/div&gt;&lt;pre class="java" name="code"&gt;db=mem&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;モデル&lt;/h3&gt;&lt;div&gt;モデルのフィールドはスクリーンショットを撮りたいURLのみです。撮った画像はファイルで保存するのでモデルにはいれません（つくるとしたらBlob型とか）。&lt;/div&gt;&lt;div&gt;hoge/app/models/Screenshot.javaファイルを作成します。&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package models;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import play.db.jpa.Model;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Screenshot extends Model {&lt;br /&gt;public String url;&lt;br /&gt;&lt;br /&gt;public Screenshot(String url) {&lt;br /&gt;this.url= url;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;コントローラ&lt;/h3&gt;CRUDモジュールをつかっているのでコントローラは超スッキリです。&lt;br /&gt;hoge/app/controllers/Screenshots.javaファイルを作成します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="java" name="code"&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import play.*;&lt;br /&gt;import play.mvc.*;&lt;br /&gt;&lt;br /&gt;public class Screenshots extends CRUD {}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;コントローラのクラス名は、モデル名（Screenshot）の複数形である Screenshotsにしとかないと動かないのでご注意。（&lt;a href="http://ja.wikipedia.org/wiki/%E8%A8%AD%E5%AE%9A%E3%82%88%E3%82%8A%E8%A6%8F%E7%B4%84" target="_blank"&gt;設定より規約&lt;/a&gt;ってヤツです）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;とりあえずここまでを動かしてみる&lt;/h3&gt;&lt;div&gt;上記の作業を行った後で、Play!を実行してURLの一覧が表示されるのを確認してみます。&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;$play run&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;基本的にplayコマンドの実行はhogeディレクトリ（プロジェクトのトップディレクトリ）で行います。別ディレクトリで実行する場合は、[app_path]オプションを渡してあげればよいかと思いますが、めんどくさいのでね、、&lt;/div&gt;&lt;div&gt;（play（オプションなし）で表示されるUsage参照）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次のURLにアクセスします。&lt;/div&gt;http://localhost:9000/screenshots/list&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-qXgqwHlh_28/Ttrx73XgfgI/AAAAAAAAADY/HHYud7GrIJc/s1600/screenshots_list1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-qXgqwHlh_28/Ttrx73XgfgI/AAAAAAAAADY/HHYud7GrIJc/s320/screenshots_list1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5682119890658426370" style="cursor: pointer; width: 320px; height: 180px; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CRUDモジュールによりビューが自動生成されるので楽ちんですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;h3&gt;スクリーンショットを取得するライブラリの追加&lt;/h3&gt;&lt;/div&gt;&lt;div&gt;今回スクリーンショットを取得するライブラリは、ウチのQAでも大変お世話になっているseleniumのWebDriverを使用します。&lt;/div&gt;&lt;div&gt;&lt;a href="http://seleniumhq.org/docs/03_webdriver.html" target="_blank"&gt;http://seleniumhq.org/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;WebDriverのライブラリ（jarファイル）を取り込むために依存ファイルを書きます。&lt;/div&gt;&lt;div&gt;今回はFirefoxでスクリーンショットを撮るのでFirefoxDriverを入れます。状況によってはInternetExplorerDriverでもいいと思います。&lt;/div&gt;&lt;div&gt;あと、ファイルの処理用にFileUtilsも欲しいのでApache Commonsも入れておきます。&lt;/div&gt;&lt;div&gt;hoge/conf/dependencies.ymlファイルに次の行を追加します。&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;- org.seleniumhq.selenium -&amp;gt; selenium-api 2.11.0&lt;br /&gt;- org.seleniumhq.selenium -&amp;gt; selenium-firefox-driver 2.11.0&lt;br /&gt;- org.apache.commons -&amp;gt; commons-io 1.3.2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;次のコマンドを実行するとライブラリが取り込まれます。&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;$ play dependencies&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;ライブラリの検索は、JARVANA（&lt;a href="http://www.jarvana.com/jarvana/" target="_blank"&gt;http://www.jarvana.com/jarvana/&lt;/a&gt;）がオススメです。javadocも検索できるので重宝しております。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;スクリーンショットを取得する処理の追加&lt;/h3&gt;&lt;div&gt;それでは、登録したURLのスクリーンショットを取得する処理を追加します。&lt;/div&gt;保存（save）ボタンが押されたら、スクリーンショットを撮ります。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;hoge/app/controllers/Screenshots.javaファイルを編集します。&lt;/div&gt;&lt;div&gt;（さっきまでCRUDモジュールでスッキリしてたヤツです）&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;package controllers;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.List;&lt;br /&gt;import play.*;&lt;br /&gt;import play.mvc.*;&lt;br /&gt;import org.openqa.selenium.*;&lt;br /&gt;import org.openqa.selenium.firefox.FirefoxDriver;&lt;br /&gt;import org.apache.commons.io.FileUtils;&lt;br /&gt;&lt;br /&gt;import models.Screenshot;&lt;br /&gt;&lt;br /&gt;public class Screenshots extends CRUD {&lt;br /&gt;&lt;br /&gt;@After( only={"create", "save"} )&lt;br /&gt;static void capture( Long id ) {&lt;br /&gt;String[] datas1 = params.getAll("object.url");&lt;br /&gt;String urlpath = "";&lt;br /&gt;for(String data1: datas1) {&lt;br /&gt;urlpath = data1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Screenshot screenshot = new Screenshot("");&lt;br /&gt;if ( id == null ) {&lt;br /&gt;List&amp;lt;Screenshot&amp;gt; datas2 = Screenshot.find(&lt;br /&gt;"select s1 from Screenshot s1 " +&lt;br /&gt;"where s1.id = (select max(s2.id) from Screenshot s2)").fetch();&lt;br /&gt;for( Screenshot data2 : datas2 ) {&lt;br /&gt;screenshot = data2;&lt;br /&gt;}&lt;br /&gt;} else {&lt;br /&gt;screenshot = Screenshot.findById(id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;WebDriver driver = new FirefoxDriver();&lt;br /&gt;driver.get(urlpath);&lt;br /&gt;File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);&lt;br /&gt;FileUtils.copyFile(scrFile,&lt;br /&gt;new File("public/images/" + screenshot.id.toString() + ".png"));&lt;br /&gt;driver.quit();&lt;br /&gt;} catch (Exception e) {&lt;br /&gt;Logger.info(e.getMessage());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;少しだけ解説しますと、&lt;/div&gt;&lt;div&gt;まずcaptureメソッドを追加しているのですが、「@After( only={"create", "save"} )」で、create（新規作成）とsave（更新）の場合だけ、リクエストをインターセプトしています。&lt;/div&gt;&lt;div&gt;（&lt;a href="http://playdocja.appspot.com/documentation/1.2.3/controllers#interceptions" target="_blank"&gt;Play!ドキュメント：インターセプション&lt;/a&gt;参照）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次に、入力したurlをパラメータマップであるparamsオブジェクトから取得します。&lt;/div&gt;&lt;div&gt;（&lt;a href="http://playdocja.appspot.com/documentation/1.2.3/controllers#params" target="_blank"&gt;Play!ドキュメント：HTTPパラメータの取得&lt;/a&gt;参照）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;urlとモデルのidを結びつけたいので、idをcaptureメソッドの引数で取得しているのですが、新規作成時はidが渡ってこない(id == nullで返る）ので、findメソッドでidが最大のオブジェクトを検索しています。&lt;/div&gt;&lt;div&gt;（&lt;a href="http://playdocja.appspot.com/documentation/1.2.3/jpa#finding" target="_blank"&gt;Play!ドキュメント：オブジェクトの検索&lt;/a&gt;参照）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;WebDriverのgetScreenshotAsメソッドで取得したスクリーンショットの画像ファイルは、hoge/public/images ディレクトリに{id}.pngという名前で保存しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;h3&gt;取得したスクリーンショットを表示する（ビュー）&lt;/h3&gt;ビューはどこでもいいのですが、一覧で見るのが壮観な気がしたので、今までCRUDモジュールで自動生成していた一覧テンプレートをカスタマイズします。&lt;/div&gt;&lt;div&gt;（&lt;a href="http://playdocja.appspot.com/documentation/1.2.3/guide7#aCommentsa" target="_blank"&gt;Play!ドキュメント：‘Comments’ データリストのカスタマイズ&lt;/a&gt;参照）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre class="html" name="code"&gt;$ play crud:ov --template Screenshots/list&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;上のコマンドを実行すると、hoge/app/views/Screenshots/list.html にテンプレートが作成されます。&lt;/div&gt;&lt;div&gt;スクリーンショットの画像が表示されるようにimgタグを追加します。&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;#{crud.table fields:['id']}&lt;br /&gt;#{crud.custom 'id'}&lt;br /&gt;&amp;lt;a href="@{Screenshots.show(object.id)}"&amp;gt;${object.id}:${object.url}&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;img width="250" src="/public/images/${object.id}.png"&amp;gt;&lt;br /&gt;#{/crud.custom}&lt;br /&gt;#{/crud.table}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;#{crud.table}編集後のlist.html&lt;/div&gt;&lt;br /&gt;&lt;pre class="java" name="code"&gt;#{extends 'CRUD/layout.html' /}&lt;br /&gt;#{set title:messages.get('crud.list.title', type.name) /}&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="crudList" class="${type.name}"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;h2 id="crudListTitle"&amp;gt;&amp;amp;{'crud.list.title', type.name}&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="crudListSearch"&amp;gt;&lt;br /&gt;#{crud.search /}&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="crudListTable"&amp;gt;&lt;br /&gt;#{crud.table fields:['id']}&lt;br /&gt;#{crud.custom 'id'}&lt;br /&gt;&amp;lt;a href="@{Screenshots.show(object.id)}"&amp;gt;${object.id}:${object.url}&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;img width="250" src="/public/images/${object.id}.png"&amp;gt;&lt;br /&gt;#{/crud.custom}&lt;br /&gt;#{/crud.table}&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="crudListPagination"&amp;gt;&lt;br /&gt;#{crud.pagination /}&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;p id="crudListAdd"&amp;gt;&lt;br /&gt;&amp;lt;a href="@{blank()}"&amp;gt;&amp;amp;{'crud.add', type.modelName}&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;こんな感じで撮ったスクリーンショットが表示されるようになりました。&lt;/div&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-r7rPl9eW1mw/Ttrx7gABVnI/AAAAAAAAADQ/KhoGVoCmcho/s1600/screenshots_list2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://4.bp.blogspot.com/-r7rPl9eW1mw/Ttrx7gABVnI/AAAAAAAAADQ/KhoGVoCmcho/s320/screenshots_list2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5682119884385900146" style="cursor: pointer; width: 320px; height: 180px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;まとめ&lt;/h3&gt;今回はスクリーンショットを取得するWebサービスをPlay! frameworkで作ってみました。&lt;/div&gt;&lt;div&gt;Play! はアイデアをすぐに動く形に出来るという点ですばらしいツールです。&lt;/div&gt;&lt;div&gt;まあ実用レベルのサービスを作ろうと思ったらフレームワークの機能だけでは足りなくて、自分でゴリゴリ書かなきゃダメなんでしょうが、社内ツールレベルだったら十分アスティルの写本だと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Play! framework Advent Calender の明日 (12/6) は &lt;a href="http://twitter.com/syuta" target="_blank"&gt;@syuta&lt;/a&gt; さんです。 明日もお楽しみに！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-5852008544542369396?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/5852008544542369396/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/play-framework.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5852008544542369396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5852008544542369396'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/12/play-framework.html' title='Play! frameworkでつくるスクリーンショット取得サービス'/><author><name>nishino</name><uri>http://www.blogger.com/profile/15291112813871756041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LroeN8pdnh8/TtuStIWeIFI/AAAAAAAAAD0/mlXWtVGxqyo/s72-c/screenshot_logo.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-2315842949494575198</id><published>2011-11-29T13:08:00.010+09:00</published><updated>2011-11-29T13:23:46.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='sugimoto'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>どうやってソフトウェアのまずさを数値化するかを調べてみる</title><content type='html'>開発エンジニアのsugimotoです。&lt;br /&gt;弊社サービスのMARKETING PLATFORMの開発を担当してます。&lt;br /&gt;近頃はソースコードのまずさによりメンテナンスコストの増加やメンテナンスによる新たなバグの発生で悩むことが多かったので、今回はこのまずさをどう数値化したものかを調べてブログに書いてみます。&lt;br /&gt;&lt;br /&gt;○技術的負債&lt;br /&gt;ソースコードのまずさを負債と捉えて数値化できるのではと考え技術的負債について調べてみました。技術的負債のちゃんとした内容はWikipediaとかInfoQとかの記事を見てもらうのが良いので、ここでは理解した内容を簡単にまとめてみます。&lt;br /&gt;&lt;br /&gt;・負債&lt;br /&gt;まず負債って何？ということなんですが、お金と同様に借金です。ソフトウェアの場合、借金に当たるのが良い設計(あるべき姿)に対してどれだけ妥協した設計で作ったかを表します。式で表すと&lt;br /&gt;&lt;br /&gt;　　負債　＝　良い設計で作ったもののコスト　－　妥協した設計で作ったもののコスト&lt;br /&gt;&lt;br /&gt;になります(下図参照)。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-YaVwlU6eKq8/TtRbZ84NlFI/AAAAAAAAACA/XaV1sC-x_l4/s1600/2011-11-28-01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 247px;" src="http://3.bp.blogspot.com/-YaVwlU6eKq8/TtRbZ84NlFI/AAAAAAAAACA/XaV1sC-x_l4/s320/2011-11-28-01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5680265531417793618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;当然負債なので利子の支払いや負債の返済が必要です。&lt;br /&gt;&lt;br /&gt;・利子&lt;br /&gt;利子はメンテナンス時に掛かるコストの差分です。基本的に良い設計で作った方がかかるコストは少ないので、妥協して作ったものをメンテナンスすることで余計に掛かるコストが利子になるわけです。これを式で表すと&lt;br /&gt;&lt;br /&gt;　　利子　＝　妥協した設計で作ったものをメンテナンスするコスト　－　良い設計で作ったものをメンテナンスするコスト&lt;br /&gt;&lt;br /&gt;で表現できます(下図参照)。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-iLupnXhlPTM/TtRbzOKy6OI/AAAAAAAAACM/ULmIrZMf79A/s1600/2011-11-28-02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://1.bp.blogspot.com/-iLupnXhlPTM/TtRbzOKy6OI/AAAAAAAAACM/ULmIrZMf79A/s320/2011-11-28-02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5680265965555869922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このコストは1回だけでなく、メンテナンスする度に掛かりますし、その度に大きさは違います。&lt;br /&gt;&lt;br /&gt;・負債の返済&lt;br /&gt;負債の返済なんですが、これはリファクタリングによって良い設計に基づいたものに作り変えるコストになります。部分的にでもリファクタリングすることによって借金を返済することは可能です。ここで、負債＝返済額なのかという疑問が浮かびますが、実際には違うはずです。つまり借金した分だけコストを掛ければ完済できるわけではないんです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-31SRA21bPUc/TtRcOp1zPkI/AAAAAAAAACY/lIvqLDsN4TY/s1600/2011-11-28-03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/-31SRA21bPUc/TtRcOp1zPkI/AAAAAAAAACY/lIvqLDsN4TY/s320/2011-11-28-03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5680266436840472130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これは、真っ直ぐあるべき姿に進んでいれば一番コストが少ないわけですが、多少なりとも遠回りしているのでその分が掛かるためです。&lt;br /&gt;ただ、実際のお金と違い借金を返済する義務がありません。返済しないとメンテナンスの度に利子を払うだけなわけです。なので理屈上は、&lt;br /&gt;&lt;br /&gt;　　良い設計で作ったもののコスト　＋　良い設計で作ったものをメンテナンスするコストの総和　＞　妥協した設計で作ったもののコスト　＋　妥協した設計で作ったものをメンテナンスするコストの総和　(＋　良い設計のものに作り変えるコスト)&lt;br /&gt;&lt;br /&gt;であるならば、別に妥協した設計で作ってもいいという判断ができるわけです。&lt;br /&gt;ただこれはあくまで開発コストだけのお話なので、早く出すことのビジネス上のメリットやパフォーマンスに掛かるコストが入ってないので実際はさらに複雑です。&lt;br /&gt;&lt;br /&gt;で、理屈はわかったのですが、実際にこんなの出してたら面倒臭すぎてやっていけないというのが正直な感想です。特に既に抱えている負債を数値化するのが非常に大変。ということでいったん技術的負債をソフトウェアのまずさとして数値化するのを却下しました。&lt;br /&gt;&lt;br /&gt;(技術的負債のいろいろな意見は&lt;a href="http://www.infoq.com/jp/search.action?queryString=%E6%8A%80%E8%A1%93%E7%9A%84%E8%B2%A0%E5%82%B5&amp;searchOrder=relevance&amp;search=%E6%8A%80%E8%A1%93%E7%9A%84%E8%B2%A0%E5%82%B5" target="_blank"&gt;InfoQの記事&lt;/a&gt;で見てみると良いと思います)&lt;br /&gt;&lt;br /&gt;○ソフトウェアの定量的手法&lt;br /&gt;次に検討したのがソフトウェア工学での定量的手法に頼ってみる案です。Wikipediaの「ソフトウェア測定法」によると次のようなものがあるらしいです。&lt;br /&gt;&lt;br /&gt;・成長オーダー（アルゴリズム解析、O記法など参照）&lt;br /&gt;・ソースコードの行数&lt;br /&gt;・循環的複雑度&lt;br /&gt;・ファンクションポイント法&lt;br /&gt;・ソースコードの行当たりのバグ数&lt;br /&gt;・コード網羅率&lt;br /&gt;・顧客要求仕様の行数&lt;br /&gt;・クラスおよびインタフェースの個数&lt;br /&gt;・Robert Cecil Martin のソフトウェアパッケージ測定法&lt;br /&gt;・凝集度&lt;br /&gt;・結合度&lt;br /&gt;&lt;br /&gt;この中で参考になりそうでコントロールできそうなものが、ソースコードの行数(メソッドの行数の方が良い)、循環的複雑度、コード網羅率、凝集度、結合度の5個。この中でツールを使って取得できるものがソースコードの行数、循環的複雑度、コード網羅率の3個。1個1個がどのようにまずさを表すかを考えてみます。&lt;br /&gt;&lt;br /&gt;・ソースコードの行数(メソッドの行数)&lt;br /&gt;あまりに長いメソッドは可読性を悪くなるために、メンテナンスもしづらくなります。行数が大きければ大きいほどまずいコードであると考えて良さそうです。&lt;br /&gt;&lt;br /&gt;・循環的複雑度&lt;br /&gt;プログラムの複雑さを数値化するためのものです。複雑であればあるほどメンテナンスコストも上がりますしバグの温床になりやすいです。この値が大きければ大きいほどまずいコードと考えて良さそうです。&lt;br /&gt;&lt;br /&gt;・コード網羅率&lt;br /&gt;自動テストのカバー率。自動テストがない場合、その分は手動テストでしなければならないし、反復して実行するのも容易ではないため、コストや品質の両面で良くありません。ですので、カバー率が低い場合はまずいコードと考えて良さそうです。&lt;br /&gt;&lt;br /&gt;ということで、今後これら3個の指標を用いて担当ソフトウェアのまずさを数値化してみようと思います。本当は結合度や凝集度も入れたいところですが今のところは難しそうなので。機会があったらやってみた結果をまたブログで報告します。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-2315842949494575198?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/2315842949494575198/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/blog-post_29.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2315842949494575198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2315842949494575198'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/blog-post_29.html' title='どうやってソフトウェアのまずさを数値化するかを調べてみる'/><author><name>sugimoto</name><uri>http://www.blogger.com/profile/17904179713550067005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YaVwlU6eKq8/TtRbZ84NlFI/AAAAAAAAACA/XaV1sC-x_l4/s72-c/2011-11-28-01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-7226869572624545614</id><published>2011-11-24T12:45:00.000+09:00</published><updated>2011-11-24T12:43:35.862+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='監視'/><category scheme='http://www.blogger.com/atom/ns#' term='fujya.sh'/><category scheme='http://www.blogger.com/atom/ns#' term='monit'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='BSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>15分で始めるmonitによるサーバ監視</title><content type='html'>&lt;div&gt;どうも、インフラエンジニアです。名前はfujya.shです。クラウドインフラやってます。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;サーバ管理者の間ではプロセス監視なら「daemontools」が定番ですが、個人的には設定が面倒で（慣れればどうという事は無いのですが）あまり利用していません。シャノンではプロセス監視の新定番として「monit」を激しくお勧め致します。設定が簡単でそれこそ誰でもプロセス監視ができる代物です。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: 25px;"&gt;&lt;b&gt;■monitとは&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;総合監視デーモンとしてファイルシステムからHTTPレスポンス内容・プロセス監視などの機能を持っています。GPLライセンスでLinux/BSD/Solaris上で動作可能です。CentOSならDAGリポジトリからyum installもでき、configも簡潔ですので15分程度で導入ができます。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://mmonit.com/monit/_Media/monit_banner.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://mmonit.com/monit/_Media/monit_banner.png" border="0" alt="" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 627px; height: 172px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://mmonit.com/monit/"&gt;http://mmonit.com/monit/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;ではさっくりインストールから基本設定、sshdの監視用のコンフィグを書いてみましょう。&lt;/div&gt;&lt;div&gt;※　今回はCentOS5系で試してます。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: 25px;"&gt;&lt;b&gt;■インストールから基本のconfig作成&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;インストールを始める前にDAGリポジトリが設定されている事が前提となります。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;◯インストール&lt;/b&gt;&lt;/div&gt;&lt;div&gt;yumでインストールできますので、&lt;/div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;# yum install -y monit&lt;/blockquote&gt;&lt;div&gt;これでインストール完了です。ブログ公開したタイミングではバージョンは5.2.5-1.el5.rfです。最新版は5.3.1ですが、tar.gzの中にはspecファイルも含まているので簡単にrpmも作れます。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;◯コンフィグの設定&lt;/b&gt;&lt;/div&gt;&lt;div&gt;基本のコンフィグを/etc/monit.confに設定します。下記はサンプルになります。&lt;/div&gt;&lt;div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set daemon 60&lt;br /&gt;&lt;br /&gt;set logfile syslog facility log_daemon&lt;br /&gt;&lt;br /&gt;set mailserver  mail1.example.com,    # primary mailserver&lt;br /&gt;           mail2.example.com     # secondary mailserver&lt;br /&gt;set mail-format {&lt;br /&gt;from: monit@example.com&lt;br /&gt;subject: $HOST : $SERVICE - $EVENT&lt;br /&gt;message: Monit&lt;br /&gt;ACTION  : $ACTION&lt;br /&gt;SERVICE : $SERVICE&lt;br /&gt;at $DATE on $HOST.&lt;br /&gt;DESCRIPTION : $DESCRIPTION&lt;br /&gt;}&lt;br /&gt;set alert server_alert@example.com&lt;br /&gt;include /etc/monit.d/*.conf&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;一行づつ解説していきましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set daemon 60&lt;/pre&gt;&lt;div&gt;監視の実行タイミングを設定します。多くの監視ソリューションでは最短1分間隔のものが多いですが、monitでは秒単位で監視の設定ができます。あまり短くしすぎると負荷が高くなる可能性もあるので監視内容に応じ適切に設定しましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set logfile syslog facility log_daemon&lt;/pre&gt;&lt;div&gt;ログの設定をします。monitではsyslogでの出力をサポートします。facilityの設定を'log_local0' - 'log_local7'もしくは、log_daemonで設定可能です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set mailserver  mail1.example.com,    # primary mailserver&lt;br /&gt;           mail2.example.com     # secondary mailserver&lt;/pre&gt;&lt;div&gt;メールサーバの設定をします。monitはアラートを送信するのにSMTPサーバを利用します。,（カンマ）区切りで複数台設定できるので、可能であれば複数設定しましょう。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set mail-format {&lt;br /&gt;from: monit@example.com&lt;br /&gt;subject: $HOST : $SERVICE - $EVENT&lt;br /&gt;message: Monit&lt;br /&gt;ACTION  : $ACTION&lt;br /&gt;SERVICE : $SERVICE&lt;br /&gt;at $DATE on $HOST.&lt;br /&gt;DESCRIPTION : $DESCRIPTION&lt;br /&gt;}&lt;/pre&gt;&lt;div&gt;アラートメールのフォーマットを設定します。変数も使えるので、monitの公式Documentの「Alert message layout」を参照して、適宜設定しましょう。上記はサンプルから拝借してきました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;set alert server_alert@example.com&lt;/pre&gt;&lt;div&gt;アラートの送信先を設定します。こちらも複数行書くことで設定できます。アラートの送信先に応じて「何のアラートを送信するか」の設定が可能です。例えば下記の用に記述すれば、監視スクリプトを実行した時のみアラートを送信する事も可能です。&lt;/div&gt;&lt;div&gt;　alert server_alert@example.com only on { exec } &lt;/div&gt;&lt;div&gt;逆にbut not onと記述すれば対象の動作を除外する事も可能です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;include /etc/monit.d/*.conf&lt;/pre&gt;&lt;div&gt;最後にincludeが設定可能です。ApacheのIncludeと同じような振る舞いをします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: 25px;"&gt;&lt;b&gt;■試しにsshdを監視してみよう&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;それでは実際に監視を記述してみましょう。sshdは落ちたらデータセンター直行しなければいけない重要なプロセスです。ここではsshdが停止したら自動で再起動を試みる監視のコンフィグを記述します。/etc/monit.confにincludeが書いてあるとして、/etc/monit.d/以下にコンフィを追加してみましょう。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;check process sshd with pidfile /var/run/sshd.pid&lt;br /&gt;every 2 cycle&lt;br /&gt;group system&lt;br /&gt;start program = "/etc/rc.d/init.d/sshd start"&lt;br /&gt;stop  program = "/etc/rc.d/init.d/sshd stop"&lt;br /&gt;if 5 restarts within 5 cycles then unmonitor&lt;/pre&gt;&lt;div&gt;こちらも一行づつ解説していきましょう。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;check process sshd with pidfile /var/run/sshd.pid&lt;/pre&gt;&lt;div&gt;監視対象のデーモンのpidファイルを指定します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;every 2 cycle&lt;/pre&gt;&lt;div&gt;監視の実行タイミングを指定します。set daemonで指定した秒数 × every [num cycle]のタイミングで監視を実行します。[num cycle]の部分をcronと同じ書き方で指定することも可能です。例えばevery "* * * * 1-5"と記述すれば、平日のみ監視するという指定も可能です。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;group system&lt;/pre&gt;&lt;div&gt;任意のgroupを指定します。monitではgroup単位での動作の制御が可能です。group単位で監視の停止、起動、再起動などができるようになります。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;start program = "/etc/rc.d/init.d/sshd start"&lt;br /&gt;stop  program = "/etc/rc.d/init.d/sshd stop"&lt;/pre&gt;&lt;div&gt;起動と停止のプログラムを指定します。指定したスクリプトにオプションも指定できるので、上記のような設定が可能です。さらに下記のように記述すると任意の実行ユーザも指定する事が可能です。&lt;/div&gt;&lt;div&gt;　start program = "/etc/rc.d/init.d/sshd start"&lt;/div&gt;&lt;div&gt;　　as uid user and gid users&lt;/div&gt;&lt;div&gt;特に指定が無ければrootユーザでスクリプトの実行がされます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;if 5 restarts within 5 cycles then unmonitor&lt;/pre&gt;&lt;div&gt;再起動を試みる回数と、タイムアウトの時間を指定します。何らかの不具合があって再起動を繰り返す場合にこの設定は有効です。上の設定では5回の監視中に5回再起動を実施した場合に監視を停止します。unmonitor以外には任意のスクリプトの実行するexecを指定する事も可能です。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ここまで記述して、monitを起動しておけばOOMにsshdが殺されとしても自動でsshdが復帰されますので、有事の際にデータセンターに直行なんて事は無くなります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b style="font-size: 25px;"&gt;■その他、monitができること&lt;/b&gt;&lt;/div&gt;&lt;div&gt;上記まではプロセスの監視と検知後に再起動というコンフィグが書かれていました。その他にもmonitは様々な機能を持ち合わせています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;◯監視対象&lt;/b&gt;&lt;/div&gt;&lt;div&gt;・プロセス(pid/ppid)&lt;/div&gt;&lt;div&gt;・ファイルシステム&lt;/div&gt;&lt;div&gt;・ディスク容量（space/i-node)&lt;/div&gt;&lt;div&gt;・ファイル&lt;/div&gt;&lt;div&gt;- サイズ&lt;/div&gt;&lt;div&gt;- パーミッション&lt;/div&gt;&lt;div&gt;- uid/gid&lt;/div&gt;&lt;div&gt;- チェックサム&lt;/div&gt;&lt;div&gt;- タイムスタンプ&lt;/div&gt;&lt;div&gt;・ファイルの中身とパターンマッチ&lt;/div&gt;&lt;div&gt;・ロードアベレージ&lt;/div&gt;&lt;div&gt;・メモリ使用量(サーバ単位・プロセス単位)&lt;/div&gt;&lt;div&gt;・レスポンス内容パターンマッチ(send/expectも可能）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;◯アクション&lt;/b&gt;&lt;/div&gt;&lt;div&gt;・起動・停止・再起動&lt;/div&gt;&lt;div&gt;・アラートメール送信&lt;/div&gt;&lt;div&gt;・任意のスクリプトの実行&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;監視対象とアクションを組み合わせて独自の監視を構築することが可能です。見ての通りmonitは内形監視するのには十分な機能が備わっています。簡単なものであれば外形監視も可能なので、小規模なインフラであればmonitだけで事足りる場合があります。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b style="font-size: 25px;"&gt;■シャノンでの便利なmonit利用例&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;◯EC2の消し忘れ防止&lt;/b&gt;&lt;/div&gt;&lt;div&gt;シャノンではAmazonEC2を使ってテスト環境を構築しています。EC2では起動した時間だけ課金されるので、消し忘れた時間があると無駄な費用が発生してしまいます。この問題を解決するためにmonitを利用しています。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;監視対象：Apacheのaccess_logのタイムスタンプ&lt;/div&gt;&lt;div&gt;アクション：1時間更新が無かったら任意のスクリプトの実行&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;[サンプル]&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;  check file auto_shutdown with path /var/log/httpd/access_log&lt;br /&gt;  if timestamp &amp;gt; 30 minutes for 30 cycles then exec&lt;br /&gt;  "/root/bin/autoshutdown.sh"&lt;/pre&gt;ポイントはtimestampが30分更新されていない状態が、30回連続で続いたらautoshutdown.shを実行するというところです。これをit timestamp &amp;gt; 60 minutes for 1 cycles then execにしてしまうと、1時間以上停止していたインスタンスが起動時にすぐにautoshutdown.shを実行してしまいます。起動後に30分以内にアクセスすればファイルのタイムスタンプが更新されるので、すぐに停止状態になる事を防げます。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;◯メモリの監視、自動再起動&lt;/b&gt;&lt;/div&gt;&lt;div&gt;アプリによってはメモリが増え続けてしまうアプリがあります。プロセス単位でメモリの使用量を監視して一定以上に増えた場合に再起動をしてあげる監視を設定しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;監視対象：プロセスのメモリ使用量&lt;/div&gt;&lt;div&gt;アクション：全体の何%利用したら任意のスクリプトの実行&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[サンプル]&lt;br /&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt;check process worker with pidfile /var/run/worker.pid&lt;br /&gt;group system&lt;br /&gt;start program = "/path/to/worker_starter start"&lt;br /&gt;        as uid user and gid users&lt;br /&gt;stop  program = "/path/to/worker_starter stop"&lt;br /&gt;        as uid user and gid users&lt;br /&gt;if memory usage &amp;gt; 7% then restart&lt;br /&gt;if 5 restarts within 5 cycles then stop&lt;/pre&gt;ワーカが全体のメモリ7%を超えて利用していた場合に再起動する設定が書いてあります。あまりこういう設定は書きたくないのですが、運用を行なっているとどうしてもこのようなシーンに出会ってしまいます。monitならサーバ管理者の代わりに再起動してくれるので多少運用が楽になるかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;◯Nagiosの監視&lt;/b&gt;&lt;/div&gt;&lt;div&gt;シャノンでは外形監視にはNagiosを利用しています。Nagiosが動作している事を監視をするために、Nagiosの監視項目に特定のサーバにHTTPアクセスするものを設定してあります。対象のサーバでmonitを動作させ、Nagiosがアクセスするファイルのタイムスタンプを監視しています。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;監視対象：ファイルのタイムスタンプ監視&lt;/div&gt;&lt;div&gt;アクション：1時間更新が無かったらアラートを送信&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[サンプル]&lt;/div&gt;&lt;div&gt;&lt;pre style="background: #eee; border: 1px solid #aaa; font-size: medium; overflow: auto; padding: 0.5em;"&gt; check file check_nagios with path /path/to/nagios_check.dat&lt;br /&gt;  if timestamp &amp;gt; 60 minutes then alert&lt;/pre&gt;非常にシンプルなコンフィグですが、これだけでnagiosの監視が可能です。監視しているつもりがいつの間にか止まっていた場合に気づくことができないので、監視は相互監視する事が大事です。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b style="font-size: 25px; "&gt;■さいごに&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;monitはDocumentが充実しているので、簡単に監視項目を追加することができます。&lt;/div&gt;&lt;div&gt;&lt;a href="http://mmonit.com/monit/documentation/monit.html"&gt;http://mmonit.com/monit/documentation/monit.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;シャノンでは「何か問題があったらmonitで監視項目追加」という運用を行なっています。monitなら独自で作成したスクリプトの実行も可能なので問題からの自己復旧も簡単に構築する事ができます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;大事な事なのでもう一度言います&lt;/div&gt;&lt;b&gt;問題があったら即監視項目追加&lt;/b&gt;&lt;div&gt;これを簡単に実現するソリューションとしてmonitを激しくお勧めします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;15分で始められるので、是非一度試してみてはいかがでしょうか。&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-7226869572624545614?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/7226869572624545614/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/15monit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7226869572624545614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7226869572624545614'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/15monit.html' title='15分で始めるmonitによるサーバ監視'/><author><name>fujya.sh</name><uri>http://www.blogger.com/profile/03776400533753064010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-5002594685356355411</id><published>2011-11-16T11:59:00.002+09:00</published><updated>2011-11-16T15:20:10.613+09:00</updated><title type='text'>100ドメイン以上を運用する企業向けクラウドのWebサーバー（Linux + Apache + mod_proxy_balancer ）</title><content type='html'>こんちには、インフラチームのyanaです。&lt;br /&gt;前回のPostgresに続きまして、実際に弊社のサービスで利用しているWebサーバーの&lt;br /&gt;ご紹介させていただきます。&lt;br /&gt;&lt;br /&gt;Linux＋Apacheの標準的な構成で、負荷分散と可用性維持のためにApacheの標準モジュールであるmod_proxy_balancerを利用したロードバランサーを導入しています。&lt;br /&gt;&lt;br /&gt;上記の構成にした理由は、以下の3つです。&lt;br /&gt;&lt;br /&gt;１．複数のFQDN環境でのSSL提供が可能である&lt;br /&gt;２．拡張性や自由度がある&lt;br /&gt;３．上記の２つを実現させ、低コストでの運用できる&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;１．複数のFQDN環境でのSSL提供が可能である&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;弊社のサービスでは、個人情報やクレジットカード情報を取り扱う場合があるため&lt;br /&gt;SSLの利用が必須となっています。&lt;br /&gt;お客様には、共有ドメインのご利用か専用ドメイン（お客様が希望されたFQDN）のどちらかを選択いただきます。&lt;br /&gt;&lt;br /&gt;現在、運用している専用ドメインは、100個以上ありますが、&lt;br /&gt;この全ドメインを１つのLinuxサーバで稼働しています。&lt;br /&gt;&lt;br /&gt;サービスの設計当初から、お客様が専用ドメインを利用することは必須事項の１つでした。&lt;br /&gt;&lt;br /&gt;しかし、SSLを利用する場合に問題になるのが、&lt;br /&gt;１つのSSL（FQDN）に対して、１つのグローバルIPアドレスが必要ということです。&lt;br /&gt;そのため、100ドメイン運用するためには100グローバルIPアドレスが必要となります。&lt;br /&gt;&lt;br /&gt;SNI（Server Name Indication）など、SSLハンドシェイク前にホスト名を通知する仕組みが&lt;br /&gt;ありますが、利用できるブラウザが限定されIE6など３から4年前に主流だったブラウザ&lt;br /&gt;からは利用できなくなると判断し採用しませんでした。&lt;br /&gt;&lt;br /&gt;また、ハードウェアのロードバランサーを検討しましたが&lt;br /&gt;上記の運用方法に合う機器が当時は非常に高価だったため採用を見送っています。&lt;br /&gt;&lt;br /&gt;上記の問題をシンプルに解決するために現在も運用しているのが&lt;br /&gt;Linux Karnelの仮想インタフェイスとApacheのIPアドレスベースのVirtual Hostの組み合わせです。&lt;br /&gt;&lt;br /&gt;現在は、１サーバでグローバルIPアドレスを64個運用し、そのサーバを２台運用しています。&lt;br /&gt;※　↑のサーバもfujyaが仮想化したOpenVZのサーバなので物理サーバは1台です。&lt;br /&gt;&lt;br /&gt;IPv4の枯渇問題があるので実際の確保は難しくなっていますが、&lt;br /&gt;この仮想サーバを追加することで専用ドメインの運用を拡張できるようにしています。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KCESreGOtTA/TsMlYjIRWyI/AAAAAAAAADo/D-D3WDgZ6bw/s1600/webserver.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-KCESreGOtTA/TsMlYjIRWyI/AAAAAAAAADo/D-D3WDgZ6bw/s640/webserver.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;２．拡張性や自由度がある&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apacheを選択したのはモジュールによる拡張性があることも１つの理由です。&lt;br /&gt;その１つが今回のテーマにしているmod_proxy_balancerです。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy_balancer.html"&gt;http://httpd.apache.org/docs/2.2/ja/mod/mod_proxy_balancer.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ご存じの方が多いとは思うので、設定方法などのご説明は省略させていただきますが&lt;br /&gt;弊社では下記のような使い方をしています。&lt;br /&gt;&lt;br /&gt;ApacheのIPアドレスごと（FQDNごと）の設定例&lt;br /&gt;&lt;pre class="js" name="code"&gt;&amp;lt;VirtualHost XXX.XXX.XXX.XXX:443&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ServerAdmin serveradmin@shanon.co.jp&lt;br /&gt;&amp;nbsp; &amp;nbsp; DocumentRoot /var/www/html/&lt;br /&gt;&amp;nbsp; &amp;nbsp; SSLEngine on&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; SSLCertificateFile /etc/httpd/conf.d/ssl-file/sample.crt&lt;br /&gt;&amp;nbsp; &amp;nbsp; SSLCertificateKeyFile /etc/httpd/conf.d/ssl-file/sample.nopass.key&lt;br /&gt;&amp;nbsp; &amp;nbsp; SSLProtocol -ALL +SSLv3 +TLSv1 -SSLv2&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ErrorLog /var/log/httpd/ssl-error_log&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; CustomLog /var/log/httpd/-ssl-access_log &amp;nbsp;combined&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteEngine On&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteLogLevel 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteLog /var/log/httpd/ssl-rewrite_log&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteCond %{REQUEST_FILENAME} ^/application-A/&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteRule ^/(.*) &amp;nbsp;balancer://application-A/$1 [P]&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteCond %{REQUEST_FILENAME} ^/application-B/&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteRule ^/(.*) &amp;nbsp;balancer://application-B/$1 [P]&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteCond %{REQUEST_FILENAME} ^/application-B/&lt;br /&gt;&amp;nbsp; &amp;nbsp; RewriteRule ^/(.*) &amp;nbsp;balancer://application-B/$1 [P]&lt;br /&gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;mod_proxy_balancer（00balancer.conf）のグループの例&lt;br /&gt;&lt;pre class="js" name="code"&gt;&amp;lt;Proxy balancer://balancer-groupA&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server1:8080 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server2:8080 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server3:8080 loadfactor=20&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server4:8080 loadfactor=20&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;div&gt;&amp;lt;Proxy balancer://balancer-groupB&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server1:8081 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server2:8081 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server3:8081 loadfactor=20&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server4:8081 loadfactor=20&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Proxy balancer://balancer-groupC&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server1:8081 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server2:8081 loadfactor=10&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server3:8081 loadfactor=20&lt;br /&gt;&amp;nbsp; &amp;nbsp; BalancerMember http://ap-server4:8081 loadfactor=20&lt;br /&gt;&amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;バランシンググループ数で35個運用しています。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【mod_proxy_balancerの機能を独自ツールで補強して利用】&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;mod_proxy_balancerは、複雑な分散アルゴリズムがありませんが&lt;br /&gt;重み付けを考慮した上で、リクエスト数、またはバイト数での分散を行う事ができます。&lt;br /&gt;&lt;br /&gt;また、管理画面（balancer-manager）を利用する事で&lt;br /&gt;特定のワーカーをサービスから切り離すことも可能です。&lt;br /&gt;&lt;br /&gt;【事前に切り離した上で、アプリケーションを再起動（メンテナンス）したい】&lt;br /&gt;&lt;br /&gt;これは、弊社のアプリケーションがApacheの子プロセスとして実行されるFastCGIを利用していることにも原因がありますが、アプリケーションの起動が終わる前にApacheは起動してしまいます。&lt;br /&gt;この間もApacheは処理待ちのリクエストを受けてしまうため、そのサーバに割り当てられた&lt;br /&gt;リクエストのレスポンスタイムは大きく遅延してしまいます。&lt;br /&gt;&lt;br /&gt;また、複数のアプリケーションが同じサーバで稼働している場合もあるため&lt;br /&gt;多くのバランサーグループからDisableにするというケースもあります。&lt;br /&gt;&lt;br /&gt;そこで、自社で制作したのが管理画面（balancer-manager）をmechanizeで操作し&lt;br /&gt;一括してDisable、Enableにするツールです。&lt;br /&gt;&lt;br /&gt;これを監視ツールやメンテナンスツールに組み込み、障害時やメンテナンス時に自動で&lt;br /&gt;バランシングから切り離されるようにしています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;社内用で使っているツールですが、お役に立ちそうでしたらご利用ください。&lt;br /&gt;&lt;a href="https://github.com/Shanon/mod_proxy_balancer_tools"&gt;https://github.com/Shanon/mod_proxy_balancer_tools&lt;/a&gt;&lt;br /&gt;（※　自己責任での利用をお願い致します）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ ./bl_changer.pl --help&lt;br /&gt;&amp;lt;ex&amp;gt; ./bl_changer.pl --config ./00balancer.conf --domain LBMAN-hostname --group proxy-groupname --range 1-8 --disable&lt;br /&gt;&amp;lt;ex&amp;gt; ./bl_changer.pl --domain LBMAN-hostname --myself --disable&lt;br /&gt;&amp;lt;ex&amp;gt; ./bl_changer.pl --domain LBMAN-hostname --hostname ap-server-hostname --disable&lt;br /&gt;&lt;br /&gt;--config -c &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set 00balancer.conf&lt;br /&gt;--domain -d &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set LBMAN domain or IP address&lt;br /&gt;--group -g &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set balancer group name&lt;br /&gt;--force -f &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if an existing destination&lt;br /&gt;--none-ssl &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;use http request&lt;br /&gt;--disable &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set disable status&lt;br /&gt;--enable &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set enable status&lt;br /&gt;--range -r &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;set target serial number for host ex:(1-8)&lt;br /&gt;--myself -m &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set target my hostname, change all grop (ex `hostname`)&lt;br /&gt;--hostname -H &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; set target hostname , change all group (ex --hostname ap-server-hostname)&lt;br /&gt;--help &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;display help message&lt;br /&gt;&lt;br /&gt;このようなオプションを用意しています。&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;＊＊注意＊＊&lt;br /&gt;&lt;br /&gt;ワーカーのホスト名が、&lt;br /&gt;・ap-server1&lt;br /&gt;・ap-server2&lt;br /&gt;の様にホスト名＋数字であることを前提にしているツールです。&lt;br /&gt;-------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;mechanizeを利用しているため管理画面のGETパラメータが変わると利用できなってしまうのが&lt;br /&gt;問題ですが、このような方法で自動化を行っています。&lt;br /&gt;&lt;br /&gt;balancer-manager以外でAPIなど外部からmod_proxy_balancerを操作できる方法を探していたのですが見つけることができませんでした。何かご存じの方は是非教えていただけると幸いです。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mod_proxy_balancerを利用する上での注意点&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;弊社で運用した経験上、注意している点があります。&lt;br /&gt;&lt;br /&gt;１．httpd restart　をすると、管理画面から動的に指定したステータスやファクターが初期化される&lt;br /&gt;&lt;br /&gt;２．グループやワーカーの追加、削除後にgraceful restartすると動作がおかしくなる&lt;br /&gt;&lt;br /&gt;３．１Apache上で設定できるワーカー数の合計に上限がある（？&lt;br /&gt;&lt;br /&gt;上記には注意して運用しています。&lt;br /&gt;ワーカー数の上限はメモリ管理上存在してもおかしくは無いと思いますが、正確な理由や数は調査できていません。ただ、弊社では100前後のワーカーを設定した際に、設定ファイルの下部ワーカーへリクエストがバランシングされなくなる現象を確認しました。詳細をご存じの方がいましたら、補足いただけると幸いです。&lt;br /&gt;&lt;br /&gt;Webサーバーの再起動をしないと動的にはワーカー数を変更できない事が今後の課題です。mod_proxy_balancer以外を利用するしか無いのかもしれませんが。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;簡単なご紹介で恐縮ですが、このような方法でWebサーバー（バランサー）を利用しています。&lt;br /&gt;ハードウェアにより解決するのも１つの方法かも知れませんが、ソフトウェアバランサーでも運用に対応させることは可能です。&lt;br /&gt;&lt;br /&gt;Poundより中、大規模環境での運用は人気があると思われるmod_proxy_balancerですが&lt;br /&gt;これから構築される方は、是非ご検討されるのも宜しいかと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;余談ですが、シャノンインフラチームでは担当エンジニアを募集中です。&lt;br /&gt;プログラマからインフラエンジニアへ転向を検討されている方でもかまいませんので、&lt;br /&gt;ご興味やご質問がありましたら、お気軽にご連絡ください。&lt;br /&gt;&lt;a href="https://shanon-tech-recruit.smktg.jp/public/application/add/30"&gt;https://shanon-tech-recruit.smktg.jp/public/application/add/30&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-5002594685356355411?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/5002594685356355411/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/100weblinux-apache-modproxybalancer.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5002594685356355411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5002594685356355411'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/100weblinux-apache-modproxybalancer.html' title='100ドメイン以上を運用する企業向けクラウドのWebサーバー（Linux + Apache + mod_proxy_balancer ）'/><author><name>Yana</name><uri>http://www.blogger.com/profile/17879422007975892113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-KCESreGOtTA/TsMlYjIRWyI/AAAAAAAAADo/D-D3WDgZ6bw/s72-c/webserver.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-4341162892206231148</id><published>2011-11-09T00:30:00.000+09:00</published><updated>2011-11-09T00:30:09.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='koya'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>Navigation TimingとCanvasを使ったページロード時間の可視化</title><content type='html'>&lt;div style="text-align: left;"&gt;こんにちわ。開発チームのkoyaです。 今回はどんなネタがいいかなと思っていたところ、&lt;a href="http://www.html5rocks.com/en/tutorials/webperformance/basics/"&gt;Measuring Page Load Speed with Navigation Timing&lt;/a&gt;という記事でNavigation TimingというAPIがあることを知りました。 Navigation Timingはウェブアプリケーションのパフォーマンスを計測できるJavaScriptのAPIです。 JavaScriptのAPIなのでCanvasと組み合わせて取得したデータを表現してみたらおもしろいかと思いやってみました。&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;はじめに、Navigation Timingについて簡単に紹介します（元記事により詳しい情報があるので興味を持たれた方は是非そちらを読んでみてください）。 その後、Canvasを使ってNavigation Timingの情報をグラフ化してみます。&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Navigation Timingの利用&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;Navigation Timingは２つのオブジェクトnavigationとtimingで構成されます（そのままですね）。 それぞれwindow.performanceのプロパティとして提供されます。&lt;/div&gt;&lt;ul class="ul1"&gt;&lt;li class="li3"&gt;navigation: どのようにページへ遷移してきたかの情報&lt;/li&gt;&lt;li class="li3"&gt;timing: ページロード時の時間情報&lt;/li&gt;&lt;/ul&gt;&lt;div class="p3"&gt;現在は最新のFirefoxとGoogle Chrome、IE9が対応しています。&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;ロード時間の取得&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;timingオブジェクトではユーザーがページを開こうとしたとき（ナビゲーション開始）からロードが終わるまでの各イベント毎の時間情報を取得できます。 取得できるイベントは図のようになります。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/timing-overview.png"&gt;&lt;img alt="" border="0" src="http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/timing-overview.png" style="cursor: hand; cursor: pointer; display: block; margin: 0px auto 10px; text-align: center; width: 600px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;それぞれのイベントごとに1970/01/01からの経過時間がミリ秒単位でセットされます。 例えば次のような値です。&lt;/div&gt;&lt;ul class="ul1"&gt;&lt;br /&gt;&lt;li class="li3"&gt;navigationStart: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;redirectStart: 0&lt;/li&gt;&lt;li class="li3"&gt;redirectEnd: 0&lt;/li&gt;&lt;li class="li3"&gt;fetchStart: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;domainLookupStart: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;domainLookupEnd: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;connectStart: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;connectEnd: 1320317663113&lt;/li&gt;&lt;li class="li3"&gt;requestStart: 1320317663114&lt;/li&gt;&lt;li class="li3"&gt;responseStart: 1320317663114&lt;/li&gt;&lt;li class="li3"&gt;responseEnd: 1320317663115&lt;/li&gt;&lt;li class="li3"&gt;domLoading: 1320317663118&lt;/li&gt;&lt;li class="li3"&gt;domInteractive: 1320317663315&lt;/li&gt;&lt;li class="li3"&gt;domContentLoadedEventStart: 1320317663315&lt;/li&gt;&lt;li class="li3"&gt;domContentLoadedEventEnd: 1320317663316&lt;/li&gt;&lt;li class="li3"&gt;domComplete: 1320317663316&lt;/li&gt;&lt;li class="li3"&gt;loadEventStart: 1320317663316&lt;/li&gt;&lt;li class="li3"&gt;loadEventEnd: 1320317663316&lt;/li&gt;&lt;/ul&gt;&lt;div class="p3"&gt;&lt;br /&gt;値が0の場合はそのイベントが起きなかったなど無効なことを表します。 それぞれの差分をとることでトータルのロード時間やネットワークレイテンシー、リダイレクトにかかった時間などを計算できます。&lt;/div&gt;&lt;div class="p4"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;ページ遷移情報の取得&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;navigationオブジェクトにはページ遷移に関する２つのプロパティがあります。&lt;/div&gt;&lt;ul class="ul1"&gt;&lt;li class="li3"&gt;redirectCount: 最終的なドキュメントにたどりつくまで何回リダイレクトされたか&lt;/li&gt;&lt;li class="li3"&gt;type: ページへのナビゲーション方法&lt;/li&gt;&lt;/ul&gt;&lt;div class="p3"&gt;typeには次のいずれかの値がセットされます。&lt;/div&gt;&lt;ul class="ul1"&gt;&lt;br /&gt;&lt;li class="li3"&gt;TYPE_NAVIGATE(=0): リンクのクリックやアドレスバーへのURL入力、フォームサブミットなど下記タイプ以外のアクション&lt;/li&gt;&lt;li class="li3"&gt;TYPE_RELOAD(=1): リロード&lt;/li&gt;&lt;li class="li3"&gt;TYPE_BACK_FORWARD(=2): 戻るや進むといったヒストリ操作&lt;/li&gt;&lt;/ul&gt;&lt;div class="p3"&gt;Navigation Timingはシンプルですが有益な情報が取得できますね。 元記事ではAjaxを使って直接データを集めたり、localstorageを使って統計情報を作るといったアイディアが紹介されています。&lt;/div&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Canvasによる可視化&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;実際に使ってみた例を示します。データを収集し統計情報を取ったりするのがおもしろいと思いますが、ちょっと難しいので取得したデータを簡単に表示させてみます。 テキストで出すだけではあまり面白くないのでCanvasを使ってみます。&lt;/div&gt;&lt;br /&gt;&lt;div class="p3"&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;ネットワーク遅延時間&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="p2"&gt;&lt;br /&gt;ページロード時間で気になるのは、どのくらい時間がかかったか、そして何に時間がかかったかです。 Navigation Timingのいいところはネットワークのやりとりに使っている時間も取得できるところです。&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;そこで、このネットワークによる遅延時間がロード時間全体の中でどれくらいの割合なのかを円グラフで表現してみます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-2yBFvOXPwO8/Traw8ivo-1I/AAAAAAAAABc/uuYsckhHeW8/s1600/sblog_latency.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5671915334884981586" src="http://3.bp.blogspot.com/-2yBFvOXPwO8/Traw8ivo-1I/AAAAAAAAABc/uuYsckhHeW8/s400/sblog_latency.png" style="cursor: hand; cursor: pointer; display: block; height: 61px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;canvas要素&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="p3"&gt;はじめに幅と高さを指定してcanvas要素を追加します。対応していないブラウザのためのメッセージもセットしておきます。&lt;/div&gt;&lt;pre class="html" name="code"&gt;    &amp;lt;canvas width="400" height="300"&amp;gt;(キャンバス非対応)&amp;lt;/canvas&amp;gt;&lt;/pre&gt;&lt;div class="p1"&gt;&lt;b&gt;ケーキの一切れ&lt;/b&gt;&lt;/div&gt;&lt;div class="p2"&gt;円グラフを作るために扇形（ケーキの一切れ）を描画できるようにします。 基本的な図形描画処理なので後々便利なように2Dコンテキストを拡張します。&lt;/div&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;CanvasRenderingContext2D.prototype.fillWedge = function (x, y, radius, startAngle, endAngle, anticlockwise) {&lt;br /&gt;   // パスをセット&lt;br /&gt;   this.beginPath();&lt;br /&gt;   this.moveTo(x, y);&lt;br /&gt;   this.arc(x, y, radius, startAngle, endAngle, anticlockwise);&lt;br /&gt;   this.closePath();&lt;br /&gt;&lt;br /&gt;   // 塗りつぶし&lt;br /&gt;   this.fill();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-FdUNZ8EX9yY/Traw8zUBxII/AAAAAAAAABo/NadP-24P_aY/s1600/sblog_wedge.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5671915339332568194" src="http://1.bp.blogspot.com/-FdUNZ8EX9yY/Traw8zUBxII/AAAAAAAAABo/NadP-24P_aY/s400/sblog_wedge.png" style="cursor: hand; cursor: pointer; display: block; height: 118px; margin: 0px auto 10px; text-align: center; width: 203px;" /&gt;&lt;/a&gt;&lt;div class="p1"&gt;図はanticlockwise（反時計回り）フラグをfalseにした場合ですが、trueをセットすると角度の指定が反時計回りになります。&lt;/div&gt;&lt;div class="p2"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p3"&gt;&lt;b&gt;データの取得&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;ロード時にデータを表示したいのでonloadイベントで処理したいところですが、 onloadイベント中ではtiming.loadEventEndに値がセットされていません。 ロードをきっかけに処理したい場合はsetTimeout()を使います。 setTimeout()のハンドラではloadEventEndに値がセットされた状態で処理することができます。&lt;/div&gt;&lt;pre class="js" name="code"&gt; window.onload = function() {&lt;br /&gt;     setTimeout(function() {&lt;br /&gt;         var timing = window.performance.timing; // loadEventEndに値がセット済み！&lt;br /&gt;         ...&lt;br /&gt;     }, 0);&lt;br /&gt; }&lt;/pre&gt;&lt;div class="p6"&gt;&lt;b&gt;円グラフ&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;準備ができたのでcanvas要素に円グラフを描画します。&lt;/div&gt;&lt;pre class="js" name="code"&gt;window.onload = function() {&lt;br /&gt;   setTimeout(function() {&lt;br /&gt;   // キャンバスとコンテキストを取得&lt;br /&gt;   var canvas = document.getElementsByName("canvas")[0];&lt;br /&gt;   var context = canvas.getContext('2d');&lt;br /&gt;&lt;br /&gt;   // データと色情報を準備&lt;br /&gt;   var timing = window.performance.timing;&lt;br /&gt;   var data = [timing.navigationStart, timing.responseEnd, timing.loadEventEnd];&lt;br /&gt;   var colors = ["#933", "#FCC"];&lt;br /&gt;&lt;br /&gt;   // 描画位置と半径をセット&lt;br /&gt;   var x = canvas.width / 2;&lt;br /&gt;   var y = canvas.height / 2;&lt;br /&gt;   var radius = 100;&lt;br /&gt;&lt;br /&gt;   // 円グラフの描画&lt;br /&gt;   drawPie(context, x, y, radius, data, colors);&lt;br /&gt;   }, 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="p4"&gt;キャンバスとtimingデータを取得してdrawPie()関数で円グラフを描画しています。 drawPie()関数の定義は次のようになります。&lt;/div&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;function drawPie(context, x, y, radius, data, colors) {&lt;br /&gt;   var i, last, startAngle, endAngle;&lt;br /&gt;&lt;br /&gt;   for (i = 0, last = data.length - 1; i &amp;lt; last; ++i) {&lt;br /&gt;       // データを角度にマッピング&lt;br /&gt;       startAngle = map(data[i], data[0], data[last], -Math.PI*0.5, Math.PI*1.5);&lt;br /&gt;       endAngle = map(data[i+1], data[0], data[last], -Math.PI*0.5, Math.PI*1.5);&lt;br /&gt;       context.fillStyle = colors[i];&lt;br /&gt;       context.fillWedge(x, y, radius, startAngle, endAngle, false);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function map(x, low1, high1, low2, high2) {&lt;br /&gt;   // low1 &amp;lt; x &amp;lt; high1を[low2, high2]の範囲にマッピング&lt;br /&gt;   return (x - low1) * (high2 - low2) / (high1 - low1) + low2;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div class="p4"&gt;&lt;br /&gt;drawPie()関数では開始から終了まで２つの時間データをとり、それぞれ円上の角度に変換して扇形を描いていきます。 map()関数はある範囲にある値を別の範囲にマッピングしています。この場合は時間から角度ですね。 &lt;/div&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;br /&gt;実行すると次のようなグラフが得られます。&lt;/div&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-DcUBhuKVrDg/TratWEPihlI/AAAAAAAAABE/Hi2waZBHH-8/s1600/pie01.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5671911375327364690" src="http://3.bp.blogspot.com/-DcUBhuKVrDg/TratWEPihlI/AAAAAAAAABE/Hi2waZBHH-8/s400/pie01.png" style="cursor: hand; cursor: pointer; display: block; height: 221px; margin: 0px auto 10px; text-align: center; width: 217px;" /&gt;&lt;/a&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;トータル時間や凡例を追加したりしたのが次の図になります。 &lt;/div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-sMjohpmVEPk/TratWLDs6FI/AAAAAAAAABQ/l32vYYpi51c/s1600/pie02.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5671911377156761682" src="http://1.bp.blogspot.com/-sMjohpmVEPk/TratWLDs6FI/AAAAAAAAABQ/l32vYYpi51c/s400/pie02.png" style="cursor: hand; cursor: pointer; display: block; height: 352px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="p6"&gt;&lt;br /&gt;&lt;b&gt;まとめ&lt;/b&gt;&lt;/div&gt;&lt;div class="p1"&gt;Navigation Timingを利用するとユーザー体験よりのパフォーマンス情報が簡単に得られることが分かりました。 また、Canvasを組み合わせてデータをグラフ化してみました。今のところ新しいブラウザでしか対応されてはいませんが、シンプルで扱いやすいためパフォーマンス解析の手段として活用していければと思います。&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span"&gt;参考&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span"&gt;1: &lt;/span&gt;&lt;a href="http://www.html5rocks.com/en/tutorials/webperformance/basics/"&gt;Measuring Page Load Speed with Navigation Timing&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;2: &lt;a href="http://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html"&gt;W3C Editor's Draft - Navigation Timing&lt;/a&gt;&lt;/div&gt;&lt;div class="p1"&gt;3: &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html"&gt;HTML Living Standard - 4.8.11 The canvas element&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-4341162892206231148?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/4341162892206231148/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/navigation-timingcanvas.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4341162892206231148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4341162892206231148'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/navigation-timingcanvas.html' title='Navigation TimingとCanvasを使ったページロード時間の可視化'/><author><name>koya</name><uri>http://www.blogger.com/profile/06365933770147046985</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2yBFvOXPwO8/Traw8ivo-1I/AAAAAAAAABc/uuYsckhHeW8/s72-c/sblog_latency.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6195153145952294350</id><published>2011-11-04T02:59:00.011+09:00</published><updated>2011-11-07T23:24:01.084+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>産休・育休のシャノン体験談　その一</title><content type='html'>こんにちは、技術部QA所属のおかもとです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今年の4月に復帰するまでの1年半、育児休業でお休みを頂いておりました。&lt;br /&gt;うちの会社は在籍している社員の平均年齢が若く、女性社員も少なかったことから、私が産休・育休を取得する２人目の社員でした。そんなわけで今回は社内でリクエストがあったので、2部に分けて第一回目は産休・育休・復職後に関してのシャノン社員としての体験談、&lt;br /&gt;第二回目は産休・育児休業中に貰える具体的なお金や手続きに関してを時系列のポイント毎にまとめてみようと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;前述の通り圧倒的な症例数の少なさ故、私は聞ける人がいなかったのですが、皆さんも多分こんな事を聞きたいだろう・・というあたりをまずは勝手に予想して書いてみようと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q1.「妊娠中の仕事のペースはどんな感じですか？」&lt;br /&gt;&lt;br /&gt;A1.直属のリーダーに早めに相談し、仕事のペースを調整して貰ったため、妊娠前よりも余裕を持って仕事に取り組めました。つわりがひどかったので通勤に一番苦労しましたが、ラッシュ時をはずしての通勤等柔軟に対応してもらいました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q2.「産休に入る時期は調整できますか？」&lt;br /&gt;&lt;br /&gt;A2.国で定められている産前6週間から休みを取れる・・だけでは、かなり過酷です(個人差もありますが、その頃にはお腹がパンパンです・・)。私の場合は里帰り出産で飛行機に乗る予定もあったので、産休の前に有給をくっつけて早めにお休みを頂きたいとお願いしたのですが、本人の意向に沿う形で対応してもらえ助かりました。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/--2O9i-8e-G0/TrfoeK-44wI/AAAAAAAAZRY/h4sjd6pWeqw/s1600/2009-07-28%2B20.27.59.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/--2O9i-8e-G0/TrfoeK-44wI/AAAAAAAAZRY/h4sjd6pWeqw/s400/2009-07-28%2B20.27.59.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5672257860738278146" /&gt;&lt;/a&gt;&lt;br /&gt;産休に入る前に会社の人たちがお疲れさん会をしてくれました。そのときのケーキです♪&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q3.「ベンチャーだけど大丈夫・・？」&lt;br /&gt;&lt;br /&gt;A3.就職説明会等に来ている女性の方とお話すると必ず聞かれるのがここです。&lt;br /&gt;皆さん「ベンチャー＝福利厚生が整備されていない？」とか、「IT＝女性がやっていくにはきつい職場？」というイメージがあるようですが、そんな事はありません(笑)。&lt;br /&gt;福利厚生に関しては、産休・育休中に色んな免除や給付金を申請する先は雇用保険や健康保険組合ですし(当然うちの会社も入ってますし、他の会社もそこは同じなのでたいした差異はありません)、&lt;br /&gt;復職してからも、肺炎だ・・！インフルだ・・！手足口病だ・・！！と、次から次へと子供が病気をしますが、周囲の理解と協力が得られているからこそ仕事を続けられていると言って過言ではありません（笑)。&lt;br /&gt;・・よって、うちの会社がベンチャーだから・・ITだから・・といって不自由したことは何もないのです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Q4.「仕事を辞めようか・・それとも産休をとろうか・・それが問題だ」&lt;br /&gt;&lt;br /&gt;A4.よく産休に入る前に退職してしまう方がいます。私の周りにもそういうママさんたちは沢山います。&lt;br /&gt;・・そしてたいていの場合、もし退職しないで休業していたらどれくらいの補償があったのか？？というのを全く知らないままに仕事を辞めてしまっています。・・勿体無すぎる・・(涙)&lt;br /&gt;もし、今後も働きたい・復帰したいという意思が少しでもあるなら、仕事は続けることを私はお勧めします。&lt;br /&gt;&lt;br /&gt;仕事と子育てが両立できるのか？とか、会社に迷惑がかかってしまうのでは・・？は誰しも考えますが、会社が復職するまで待ってくれると言ってくれるなら、ありがたく復職してみてから仕事が続けられそうかは考えても遅くないと思います(都合が良くてすいません・・中村さん)。&lt;br /&gt;現に私はそうしたのですが(笑)、近くに身内もおらず、旦那も仕事が忙しく、子供は体力有り余ってて寝ず、エンドレス寝不足・・みたいな修行を一年半した後だったので、ランチを同僚とゆっくり食べられる会社はかなりの気分転換にもなってます(笑)。&lt;br /&gt;&lt;br /&gt;では、ここでこんな資料を見てみます。&lt;br /&gt;以下の資料は、働いているときの給与所得別に給付金が幾ら貰えるのかを算定したものです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;給与総額が18万円の人の場合&lt;br /&gt;出産育児一時金 + 出産手当金 + 育児休業給付金 　→　約172万円貰える&lt;br /&gt;&lt;br /&gt;給与総額が26.5万円の人の場合&lt;br /&gt;出産育児一時金 + 出産手当金 + 育児休業給付金 　→　約232万円貰える&lt;br /&gt;&lt;br /&gt;給与総額が32万円の人の場合&lt;br /&gt;出産育児一時金 + 出産手当金 + 育児休業給付金 　→　約273万円貰える&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;どうですか？&lt;br /&gt;結構な金額ですよね(笑)。&lt;br /&gt;もし仮に出産する前に自己都合で退職したら、出産育児一時金(現在は42万円)の他は一切支給されないお金になります。&lt;br /&gt;つまり復職意思があって産休・育休に入ると働けない間の休業補償が出るのに対し、退職してしまうと上記の給付金は補償されません・・また育児休業中には手続きすると社会保険料も免除されることを考えると、その差は歴然です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;では、次回はいよいよ時系列に手続き関連の話をしていきたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Qfa2aP8ApXM/TrfpGnSCdTI/AAAAAAAAZRk/-xuz166vOSk/s1600/2009-07-29%2B13.54.57.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/-Qfa2aP8ApXM/TrfpGnSCdTI/AAAAAAAAZRk/-xuz166vOSk/s400/2009-07-29%2B13.54.57.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5672258555529557298" /&gt;&lt;/a&gt;&lt;br /&gt;会社の方たちが産休前にくれたプレゼント。それぞれに頑張って選んでくれたのが分かります(笑)。。今でも子供のお気に入りもあります。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6195153145952294350?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6195153145952294350/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6195153145952294350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6195153145952294350'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/blog-post.html' title='産休・育休のシャノン体験談　その一'/><author><name>かなぴー</name><uri>http://www.blogger.com/profile/03096814031879496520</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/--2O9i-8e-G0/TrfoeK-44wI/AAAAAAAAZRY/h4sjd6pWeqw/s72-c/2009-07-28%2B20.27.59.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-1001045682709209578</id><published>2011-11-01T18:38:00.015+09:00</published><updated>2011-11-01T19:20:03.993+09:00</updated><title type='text'>Jenkins, Seleniumを使った自動テストの課題とこれからの取り組み</title><content type='html'>こんにちは。QAの井上です。&lt;br /&gt;&lt;br /&gt;今回は現在QAチームで行っている自動テストに関する課題、それに対する取り組みについて紹介します。&lt;br /&gt;まだまだ詰めが甘いところがあると思うで、フィードバックいただけるとうれしいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;早速ですが、QAチームではCIツールにJenkinsを使用していて、約8割がSeleniumによるテストケースでできています。&lt;br /&gt;テストケースの作成から実行まではざっくりですが、以下のようになっています。&lt;br /&gt;&lt;br /&gt;- テストケースはFirefoxのIDEを使用して作成&lt;br /&gt;- 作成したテストケースはSVNに保存&lt;br /&gt;- 毎日夜中に最新のソースコードに対してテストを実施&lt;br /&gt;- テストの実施は、Jenkinsの&lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Seleniumhq+Plugin" target="blank"&gt;seleniumhqプラグイン&lt;/a&gt;を使用して、複数台のクライアント(Windows)上でSeleniumRCサーバーに直接テストスイートを渡すことで行う&lt;br /&gt;- テストで使うクライアントはWindowsでブラウザはFirefox&lt;br /&gt;- テスト結果を次の日に確認&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;テスト実行の流れを図にするとこのようになります。&lt;br /&gt;基本的に&lt;a href="http://seleniumhq.org/docs/05_selenium_rc.html#proxy-injection" target="blank"&gt;SeleniumRCのマニュアル&lt;/a&gt;に書いてあることと同じなのですが、SeleniumRCサーバーがテストスイートを直接実行する所がちょっと違いますね。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-H911bBaIZeI/Tq_CZjkFcbI/AAAAAAAAAC4/zNXQa-GKE70/s1600/seleniumrc.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 339px;" src="http://1.bp.blogspot.com/-H911bBaIZeI/Tq_CZjkFcbI/AAAAAAAAAC4/zNXQa-GKE70/s400/seleniumrc.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5669964200181854642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Jenkinsを導入することで、毎日最新のソースコードで、決まった時間に自動でテストが実行されるようになっているのですが、次のような課題を抱えて困っていました。。。&lt;br /&gt;&lt;br /&gt;(1) ソースコードを何も変更していないときでも、必ずしも毎回テストがパスしない&lt;br /&gt;(2) テストが失敗した時は、テストが実行されるPC(Windows)にリモートデスクトップで繋いで、再度テストを実行しながら動作を確認したりするのですが、リモートデスクトップは複数人で同時に接続できないので、誰かが接続すると切られてしまう&lt;br /&gt;　あと、できれば仮想化したい&lt;br /&gt;(3) IEなどの他のブラウザでもテストしたいが、(1)の課題が頻発して使えない&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;そこで、これらの課題に対してどのように取り組んでいるのか(取り組んで行こうとしてるのか)について書いていきます。&lt;br /&gt;&lt;br /&gt;まず、大きな課題である(1)に対してです。&lt;br /&gt;ソースコードを何も変更していないにも関わらずテストが失敗したりするのは致命的ですよね。&lt;br /&gt;これまでも何度も調べていたのですが、結局どう対策したらよいのか分からなかったんです。。。&lt;br /&gt;しかし、最近やっと解決方法らしきものを見つけました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://saucelabs.com/blog/index.php/2011/04/how-to-lose-races-and-win-at-selenium/" target="blank"&gt;How to Lose Races and Win at Selenium&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;で、この方が言うには、問題なのはSeleniumの実行が早く、ページのロードと競争しているからだそうです。&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The problem is that Selenium is overeager, and it needs to chill out and wait.&lt;br /&gt;Selenium tests often fail because they’re too fast. &lt;br /&gt;Selenium will interact with a page at the speed of code, before the page is ready.&lt;br /&gt;&lt;br /&gt;There are several ways for a page to be “loaded,” and Selenium doesn’t wait for the right one. &lt;br /&gt;It races your page’s loading logic, often “winning” the race and clicking on things before they’re ready to be clicked on. &lt;br /&gt;You need Selenium to lose the race.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;これに対する解決作として、SeleniumRCサーバーに対して繰り返し waitForTextPresent などを成功するまで何度か送ってみるといいと言っています。&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;wait_for_text_present will repeatedly ask the Selenium server whether the text is present until it shows up. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;なるほどー、って感じですね。&lt;br /&gt;そこで、まず変えなければいけないことは、テストスイートを直接SeleniumRCサーバーに投げていたことです。&lt;br /&gt;そのために、次のように変更しようとしています。&lt;br /&gt;&lt;br /&gt;1. テストスイート、テストケースは現状のままFirefoxのIDEで作成する。&lt;br /&gt;　これはやっぱり作成やメンテナンスが楽だからです。なので、保存しておくのもHTMLのものになります。&lt;br /&gt;2. 作成したテストスイートをJavaのソースコードにエクスポートする&lt;br /&gt;3. 出力したJavaコードをコンパイル、実行することでテストが行われるようにする&lt;br /&gt;&lt;br /&gt;このように一度Javaに変換することで、テストの実行を自分たちでコントロールできるようになり、この課題に対してある程度解決できるようになるのではないかと考えています。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;次に、(2)の課題に対してですが、PCを追加すれば解決できるのですが、1台あたりのリソースはまだまだ余っている状態っていうのと、増やすたびにお金かかる(Windowsのライセンスを買わないといけない)っていうのもちょっと嫌だったんでどうしようか悩んでいました。&lt;br /&gt;&lt;br /&gt;で、クライアントPCをLinuxにすればいいんじゃない??と思い、まずLinuxのFirefoxでテストを実行してみると普通に動いたので単純にクライアントPCをLinuxにしようとしています。1台のHWに複数の仮想マシン(Linux)を立て、動作を確認するときはVNCで接続するっていう方法です。&lt;br /&gt;あと、Jenkinsから実行するときにどのディスプレイで実行するかはこちらでいけるんじゃないかと思っています。うまくいけば、複数人で同じHWを共有で使えるようになります。&lt;br /&gt;http://www.linux-archive.org/centos/463349-how-run-command-specific-vnc-display.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;最後に(3)の課題に対してですが、こちらは(1)の課題を解決することで同時に解決できると思っているのですが、どうせなので少し前にリリースされたSelenium2系(WebDriver)も試していきたいと思っていて。。。&lt;br /&gt;&lt;br /&gt;WebDriverはSeleniumRCと違ってJavascriptでの実行という方法ではなくネイティブなAPIを使ってブラウザを実行するようなので、クロスブラウザの問題がクリアできるらしく、またブラウザのサポートもIphone, Androidまで対応しようとしているらしく広いみたいです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-ihmHi_BiBhU/Tq_Ci445zUI/AAAAAAAAADE/YMh1659HwFE/s1600/support_browser.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 113px;" src="http://2.bp.blogspot.com/-ihmHi_BiBhU/Tq_Ci445zUI/AAAAAAAAADE/YMh1659HwFE/s400/support_browser.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5669964360525139266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;情報源はこちら(もしかしたら少し古いかもしれません)&lt;br /&gt;- &lt;a href="http://robfletcher.github.com/grails-selenium-rc/docs/manual/guide/3.%20Running%20Selenium%20RC%20Tests.html" target="blank"&gt;SeleniumRC ブラウザサポート&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://seleniumhq.org/docs/03_webdriver.html#introducing-webdriver-s-drivers" target="blank"&gt;WebDriber ブラウザサポート&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;といった感じで、現状抱えている課題とそれに対する取り組みについて書いてみました。&lt;br /&gt;今回書いた内容に関してはまだまだ取組中で変わっていくと思いますので、ある程度できたら構築中のはまりポイントなどを一緒に取り組んでいるメンバーが紹介してくれると思います。&lt;br /&gt;&lt;br /&gt;それでは。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-1001045682709209578?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/1001045682709209578/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/selenium.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1001045682709209578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1001045682709209578'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/11/selenium.html' title='Jenkins, Seleniumを使った自動テストの課題とこれからの取り組み'/><author><name>inoue</name><uri>http://www.blogger.com/profile/00351612336306652569</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-kNGBXcd9Vm0/TZFKRLO1I_I/AAAAAAAAAAM/YDdLk33kzmw/s220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-H911bBaIZeI/Tq_CZjkFcbI/AAAAAAAAAC4/zNXQa-GKE70/s72-c/seleniumrc.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3486181190977631988</id><published>2011-10-18T11:34:00.009+09:00</published><updated>2011-10-18T22:55:28.606+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強会'/><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='megumi'/><title type='text'>YAPC::Asia TOKYO 2011 に参加してきました</title><content type='html'>先週末に行なわれた &lt;a href="http://yapcasia.org/2011/"&gt;YAPC::Asia TOKYO 2011 &lt;/a&gt; に初めて参加してきました。&lt;br /&gt;&lt;br /&gt;Yet Another Perl Conference (YAPC) はPerlプログラミング言語の進歩を目的とする草の根のシンポジウムです。 (http://yapc.orgより抜粋）&lt;br /&gt;[上記サイトより転記]&lt;br /&gt;&lt;br /&gt;東京工業大学が会場だったのですが、1日に3会場あるうちの100周年記念フェライト会議室はあまり大きい部屋ではなかったせいか、いつも立ち見の人や床に座って見る人がたくさんいました。そしてせっかく席に座れたのだから…とつい長居してしまいました（笑）&lt;div&gt;&lt;br /&gt;現在の仕事で役に立ちそうなセッションということで、パフォーマンスとセキュリティと品質向上を中心に聞いてきました。アプリ開発目線です。&lt;br /&gt;詳しい内容については、発表資料を見たほうが正しい情報が得られると思いますので省略します。&lt;br /&gt;&lt;br /&gt;○パフォーマンス&lt;br /&gt;&lt;a href="http://ma.la/files/yapcasia2011/"&gt;Webアプリケーション高速化&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/zigorou/yapc-asia-2011zigorou"&gt;Mobage オープンプラットフォームの事件簿&lt;/a&gt;&lt;br /&gt;一般的な解決方法として紹介されていた、不要な処理をしないこと、キャッシュすること、まとめて処理することは、現在まさに対応中です。これらについては今やっていることが正しかったのかなと確認できて少々ホッとしました。&lt;br /&gt;『Webアプリケーション高速化』のほうの話で、特に、何ミリ秒単位で少しずつ処理を高速化するよりは、不要な処理を行なわないように考えたほうがいいという話は、最近の仕事ではそのような修正をすることが多く体験済みだったので納得しました。明らかなボトルネックがあるときの対処法ではありますが。&lt;br /&gt;そして、あまり一般的ではない解決方法として挙げられていたキャッシュのウォームアップについても、弊社でも使ったら効果が出そうなので興味があります。&lt;br /&gt;&lt;br /&gt;○セキュリティ&lt;br /&gt;&lt;a href="http://www.slideshare.net/onishi/ss-9726535"&gt;新はてなダイアリーの裏側&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/ockeghem/how-to-guard-your-password"&gt;Webアプリでパスワード保護はどこまでやればいいか&lt;/a&gt;&lt;br /&gt;『新はてなダイアリーの裏側』はセキュリティの話が中心ではなかったのですが、XSS対策のiframeでドメインを分ける話は考えたことがなかったので新鮮でした。&lt;br /&gt;『Webアプリでパスワード保護はどこまでやればいいか』はパスワードのハッシュ値が漏えいした場合はどの程度安全なのか、より安全にするにはどうしたらいいか、という話で、普通のハッシュ値だけでは全然安全ではないということがよくわかりました。&lt;br /&gt;&lt;br /&gt;○品質向上&lt;br /&gt;&lt;a href="http://www.slideshare.net/masaki/perl-testing-consideration-seen-from-other-languages"&gt;他言語から見たPerlのテスト&lt;/a&gt;&lt;br /&gt;開発エンジニアが品質のよいコードを作って、QAエンジニアの負担を減らすことが最近ますます重要になっているテーマなので、テストの話も聞いてきました。&lt;br /&gt;弊社の場合は、ユニットテストが Test::Class をベースとしたもの、ビルドテストが Test::WWW::Mechanize をベースとしたものなので、出てきた内容と近いと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Perl 限定で他社のリアルな話を聞くことができる場はあまりないと思います。共通の問題意識があることを確認できたり、それらの解決方法についても新しく取り入れてみたいと思う情報を得ることができました。たまにはこういう場から情報を得るのも楽しくていいものです。&lt;br /&gt;情報を得るだけではなく、製品開発に活かしていけるように意識を持っていたいと思います。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-3486181190977631988?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/3486181190977631988/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/yapcasia-tokyo-2011.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3486181190977631988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3486181190977631988'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/yapcasia-tokyo-2011.html' title='YAPC::Asia TOKYO 2011 に参加してきました'/><author><name>megumi</name><uri>http://www.blogger.com/profile/06626837198746946677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3534245449695182326</id><published>2011-10-17T12:51:00.003+09:00</published><updated>2011-10-17T13:49:31.834+09:00</updated><title type='text'>数百GBのPostgreSQLを一瞬でバックアップする方法</title><content type='html'>こんにちは、インフラ部門のYanaです。&lt;br /&gt;&lt;br /&gt;本日は、弊社で利用しているPostgreSQLのバックアップ取得方法についてご紹介します。&lt;br /&gt;&lt;br /&gt;弊社は、データベースにPostgreSQL8.4系を利用しています。&lt;br /&gt;&lt;br /&gt;定期的なバックアップとして一般的なpg_dumpも利用していますが、&lt;br /&gt;データベース容量が数100GBになると数時間バックアップ時間を要してしまいます。&lt;br /&gt;&lt;br /&gt;通常はこのバックアップ時間でも問題ありませんが、サービスの運用上この時間を許容できないシーンがありました。&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;バージョンアップの作業時間を短縮することが目的&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;弊社では、3ヶ月に1回提供アプリケーションのバージョンアップが行われます。&lt;br /&gt;その際に、作業内容によってはデータベースの変更が行われます。&lt;br /&gt;万が一、作業で問題があった場合は作業前の状態にロールバックする必要があります。&lt;br /&gt;そのため、メンテナンス画面を表示し、リクエストの遮断した後にデータベースのバックアップを取得します。&lt;br /&gt;しかし、バックアップに数時間を要してしまうとメンテナンスによる停止時間が大幅に増加してしまいます。この時間を削減するために運用を開始したのが、今回ご紹介するバックアップ取得方法です。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-qk40BUDU7lo/TpgfqY67qgI/AAAAAAAAACc/UM0Fa32cnUE/s1600/mentend.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-qk40BUDU7lo/TpgfqY67qgI/AAAAAAAAACc/UM0Fa32cnUE/s1600/mentend.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;元々、冗長化のためにPITRを利用したレプリケーションを利用していました。&lt;br /&gt;&lt;br /&gt;PITRについての詳しい解説はこちらが参考になります。&lt;br /&gt;&lt;a href="http://www.postgresql.jp/document/current/html/continuous-archiving.html"&gt;http://www.postgresql.jp/document/current/html/continuous-archiving.html&lt;/a&gt;&lt;br /&gt;(PostgreSQLマニュアル　継続的アーカイブとポイントインタイムリカバリ)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lets.postgresql.jp/documents/technical/backup/3"&gt;http://lets.postgresql.jp/documents/technical/backup/3&lt;/a&gt;&lt;br /&gt;（Let's PostgreSQL 物理バックアップの概要）&lt;br /&gt;&lt;br /&gt;簡易イメージだとこんな感じです。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-IR6IlFmJNUo/Tpux1LESMzI/AAAAAAAAAC8/ulGuAJd1QkE/s1600/pitr3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-IR6IlFmJNUo/Tpux1LESMzI/AAAAAAAAAC8/ulGuAJd1QkE/s1600/pitr3.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;このような形で、アーカイブログ単位で待機系サーバのデータベースを更新しています。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;完全な同期型ではありませんが、ほぼリアルタイムにデータはレプリケーションされていますので&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Activeサーバが停止した場合は、Standbyサーバに変更するだけでサービスを再開できます。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;ファイルシステムのスナップショットの仕組みを参考に&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;短時間のバックアップが目的でしたので、試行錯誤の結果ファイルシステムのスナップショットの仕組みに注目しました。そして、それをPITRを利用して再現することでデータベース版のスナップショットにしたのが下記のイメージ図です。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-7cKUcwhrHqo/Tpux5iSqDOI/AAAAAAAAADE/h7y20ny10fc/s1600/pitr2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-7cKUcwhrHqo/Tpux5iSqDOI/AAAAAAAAADE/h7y20ny10fc/s1600/pitr2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;このように、PITRをStandbyサーバだけでなく、３台でレプリケーションさせてしまいバージョンアップなどメンテナンス作業前に分離することで、瞬時にバックアップを取ることできると考えました。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-MqmpsYGC_0M/Tpux9jIg0aI/AAAAAAAAADM/cmt5DI8Eh0U/s1600/pitr1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-MqmpsYGC_0M/Tpux9jIg0aI/AAAAAAAAADM/cmt5DI8Eh0U/s1600/pitr1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;こうすることで、Snapshoｔサーバは切り離した時点のデータ状態のまま維持されますので万が一メンテナンス作業を中断し全て元に戻す必要がある場合はSnapshotをActiveのデータベースとして利用すれば良いわけです。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;（社内では、元になったアイデアからSnapshotサーバと呼んでいます）&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;この仕組みを採用し、開始当時で３から４時間メンテナンスによってサービスが停止する時間を短縮することができるようになりました。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;このデータベーススナップショットの仕組みは、このような課題があれば有効です。&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;　データベースサイズが大きくpg_dumpではある程度時間がかかる&lt;/li&gt;&lt;li&gt;　短時間にデータベースのバックアップを取得する瞬間がある&lt;/li&gt;&lt;li&gt;　世代バックアップである必要が無い&lt;/li&gt;&lt;li&gt;　構築コストをできるだけかけないようにしたい（OSSのみで実現したい）&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;当然ですが、デメリットもあります。&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;　一度止めたSnapshotサーバを再びレプリケーションに復帰させるのには時間がかかる&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;u&gt;構築方法は通常のPITRに追加して３つだけ&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【&lt;/b&gt;&lt;b&gt;アーカイブログを共有する&lt;/b&gt;&lt;b&gt;】&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;弊社では、Activeのデータベースサーバーが各Standby（Snapshot）サーバをNFSでマウントしログを書き込んでいます。&lt;br /&gt;&lt;br /&gt;マウントのイメージ&lt;br /&gt;&lt;br /&gt;XXX.XXX.XXX.XXX:/var/lib/pgsql/nfs/archive_log/standby-server/&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ***G &amp;nbsp;***G &amp;nbsp;***G &amp;nbsp;**% /var/lib/pgsql/nfs/archive_log/standby-server/&lt;br /&gt;&lt;br /&gt;XXX.XXX.XXX.XXX:/var/lib/pgsql/nfs/archive_log/snapshot-server/&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ***G &amp;nbsp;***G &amp;nbsp;***G &amp;nbsp;**% /var/lib/pgsql/nfs/archive_log/snapshot-server/&lt;br /&gt;&lt;br /&gt;&lt;b&gt;【&lt;/b&gt;&lt;b&gt;アーカイブコマンドでスクリプトを使う&lt;/b&gt;&lt;b&gt;】&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;postgresql.conf&lt;br /&gt;&lt;pre class="js" name="code"&gt;archive_command = '/home/public/tools/archive_copy.sh %p %f &amp;lt;/dev/null'&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;【&lt;/b&gt;&lt;b&gt;スクリプトでアーカイブログを2箇所に保存する&lt;/b&gt;&lt;b&gt;】&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;※スクリプトの例&lt;br /&gt;/home/public/tools/archive_copy.sh&lt;br /&gt;&lt;pre class="js" name="code"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;basefilename=$1;&lt;br /&gt;copy2filename=$2;&lt;br /&gt;copy2path1='/var/lib/pgsql/nfs/archive_log/standby-server/';&lt;br /&gt;copy2path2='/var/lib/pgsql/nfs/archive_log/snapshot-server/';&lt;br /&gt;&lt;br /&gt;cp -i $basefilename "$copy2path1/$copy2filename";&lt;br /&gt;cp -i $basefilename "$copy2path2/$copy2filename";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この３つの作業を行うことで、アーカイブログが各Standbyサーバ、Snapshotサーバに転送され&lt;br /&gt;復元され続けますので非同期ではありますがデータベースをレプリケーションできます。&lt;br /&gt;&lt;br /&gt;後は、必要に応じてSnapshotサーバのアーカイブログの読み込みを止め、PostgreSQLを起動してしまえばその時点のデータを分離させることができます。&lt;br /&gt;&lt;br /&gt;弊社では、アーカイブログの読み込みにpg_standbyを利用していますので、トリガーファイルを特定の場所に設置するだけで読み込みが停止されます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-3534245449695182326?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/3534245449695182326/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/gbpostgresql30.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3534245449695182326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3534245449695182326'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/gbpostgresql30.html' title='数百GBのPostgreSQLを一瞬でバックアップする方法'/><author><name>Yana</name><uri>http://www.blogger.com/profile/17879422007975892113</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-qk40BUDU7lo/TpgfqY67qgI/AAAAAAAAACc/UM0Fa32cnUE/s72-c/mentend.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-4873471826343467633</id><published>2011-10-10T00:24:00.010+09:00</published><updated>2011-10-10T01:25:20.215+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='テスト'/><category scheme='http://www.blogger.com/atom/ns#' term='パフォーマンステスト'/><title type='text'>パフォーマンステストをまとめてみた</title><content type='html'>&lt;div&gt;こんにちは。&lt;/div&gt;&lt;div&gt;QAのinomataです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;パフォーマンスの問題は、顕在化するとシステム停止や機能の停止を余儀なくされたりと、インパクトが大きい可能性が高いです。個人的な位置づけだと、&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;セキュリティテスト　≒　パフォーマンステスト　&amp;gt;&amp;gt;　機能テスト&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;くらいだと思ってます。しかもパフォーマンスの問題は修正が大変（すぐ修正できない）な場合が多いので、しっかりテストをやっておく必要があります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただ、ひとつの問題として、何をすればいいのか分からないんですよね。私自信も、最初は何をすればいいのかわかりませんでした。パフォーマンステストはセキュリティテストに次ぐ重要度にもかかわらず（恣意的）情報が少ないのです！！本屋に行ってもそんな本はほとんどありませんし、Google先生に聞いてもJmeterの使い方くらいしか出てきません。とは言ってもどうにかやらなくてはいけません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回は私がどうにかやってきた、パフォーマンステストの進め方ポイントをまとめてみたいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;まずパフォーマンステストの目的を決めよう&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;パフォーマンステスト（性能評価）といってもいろいろあります。同時にどれくらい使えるのか、連続稼働時間がどれくらいなのか、レスポンスはどれくらいか、システムがどこまで耐えられるか。パフォーマンスを測りたいからには目的があるはずなので、それを決めましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;目的が決まったら要件を決めよう&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;具体的な数値を持って要件を決めましょう。上記の例であればこんな感じ。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・同時にどれくらい使えるのか→同時1000ユーザーの使用を保障する&lt;/div&gt;&lt;div&gt;・連続稼働時間がどれくらいなのか→300時間の連続起動ができる&lt;/div&gt;&lt;div&gt;・レスポンスはどれくらいか→1秒以内でレスポンスがある&lt;/div&gt;&lt;div&gt;・システムがどこまで耐えられるか→平常時の倍の負荷まではシステムがダウンしない&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;要件がない場合、200%の確率で後で問題になります。webシステムであれば以下のようなテンプレートがあればよいでしょうか。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・単位時間当たりの処理数&lt;/div&gt;&lt;div&gt;・同時使用数&lt;/div&gt;&lt;div&gt;・応答時間&lt;/div&gt;&lt;div&gt;・エラー率&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これらはお互いに関連性があるので、どれも抜けてはいけないのです。これ以外の重要な項目がないかも検討してください。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;テストケースを考えよう&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;要件も決まったのでテストケース組んでいきましょう。その際のポイントをいくつか紹介します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・テストケースはユーザーの操作を意識する&lt;/div&gt;&lt;div&gt;テストはユーザーの操作に忠実でなければ、本番の挙動とかけ離れてしまいます。ここはユーザーの操作をシミュレーションしましょう。たとえば買い物サイトの場合以下のような操作がありますが、具体的にはこれらを網羅していきます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・どこのカテゴリを見るのか。&lt;/div&gt;&lt;div&gt;・どれくらい検索するのか&lt;/div&gt;&lt;div&gt;・いくつ買うのか&lt;/div&gt;&lt;div&gt;・レビューを書くのか&lt;/div&gt;&lt;div&gt;・etc&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただこのような操作パターンはほぼ無限なので、全部を再現するのは現実的ではありません。どうにかこうにか間引いて、現実的なテストにしましょう。ABC分析とかが使えそうですね。またファイルダウンロードなど、パフォーマンス的に高負荷となる操作が別にあるのであれば、それは別枠で考える必要があります。&lt;/div&gt;&lt;div&gt;ひたすらログイン/ログアウトを繰り返すユーザーはそうそういません。申込フォームの開始から登録まで5秒で完了するユーザーもそうそういません。本番を想定するテストであれば画面遷移、参照する機能、入力フォームでのユーザーの思考時間等を考慮する必要があります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・使うデータの検討&lt;/div&gt;&lt;div&gt;毎回同じデータを参照した場合、キャッシュによってパフォーマンスが良くなる場合があり、テスト結果の信頼性にかける場合があります。参照、または登録するデータは本番と同じようなデータにしましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・テスト環境とタイミング&lt;/div&gt;&lt;div&gt;本番でのパフォーマンスを図りたいのであれば、本番と同じシステムを用意するか、本場でテストするしかありません。テストの目的に合わせてシステムの構成（ネットワーク機器、ロードバランサ等も含める）、リクエストを送る場所（ファイアーウォール越しかどうか等）、定期バッチ処理のタイミング、本番で稼働させる各サービス等も考慮しなければなりません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・エラーの定義を決める&lt;/div&gt;&lt;div&gt;テストのエラーになる条件を決めます。HTTPのエラーコードが返ってくればエラーなのか、専用のエラーページを表示すればエラーなのか決めておきましょう。専用のエラーページはHTTP的にはエラーではないので、Jmeterではアサーションを仕込むなど、ひと手間必要になることを忘れずに。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・ログは何を見るか&lt;/div&gt;&lt;div&gt;何を見るのかは重要です。リクエストをかける外側と、処理を行う内側のログをとります。内側のログは、ログを出すこと自体がシステムに負荷をかける場合があります。ログの出力は、目的に合わせて必要最小限に抑えるのがよいでしょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・どれくらい負荷をかけるのか&lt;/div&gt;&lt;div&gt;基本的に要件を満たす分、ピーク時を想定した負荷の2種類があれば望ましいでしょう。信頼あるデータが必要なので、現実的な範囲で負荷をかける必要があります。過大、過少になってはいけません。&lt;/div&gt;&lt;div&gt;上記でもありますが、各要件を矛盾しないような量にしないとダメです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・どうやってテストするのか&lt;/div&gt;&lt;div&gt;同時1000人のログインとかは手動じゃできませんよね。パフォーマンステストは、基本的にツールを使わなければ実現できません。どんなツールを使って、どうやって結果を判断できるのかを事前に検討しておきましょう。なんだったら外部に委託してしまうのも手でしょう。専門家に任せるのと、リスク移転の意味を込めて。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;テストは繰り返しできるように準備しておくことも重要です。本番を使う場合は時間的な制限があったりするので、なるべく短い時間でかつ繰り返し実行できるようになっているとよいです。また、ボトルネックは一回のテストで一ヶ所しか発見できません。システムのパフォーマンスは一番のボトルネックに引きずられます。なのでパフォーマンステストは、テスト→修正→テスト→修正→テスト...と繰り返すことは必然です。となるとやはり繰り返し実行できることは重要です。ボタン一つで実行できるほど簡素化されているとよいですね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;テストを実行しよう。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;いよいよ作成したテストを実行します。ここまで事前に準備してきましたが、実行中でしかわからない情報もある場合もあるので、実行中は人が立ち会った方がよいです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;結果を検討しよう&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;得られた結果が決定した要件に沿った結果かどうかを検討します。結果の検討は一番重要かつ難しいフェーズです。応答時間などの外側からの結果とサーバのCPU等の内側の結果を突き合わせて、何が原因かを探ります。このためにも適切にログをとりましょう。有識者からのヒアリングもしましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;その他&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;・いつテストしたらいいのか&lt;/div&gt;&lt;div&gt;なるべく早い方がいいには越したことはないですが、早すぎてシステムが動かなければ意味がありません。これはなかなか難しいのですが、開発の段階で小さい機能から段階的にテストをしていくのが一番です。パフォーマンステストはいきなりシステム全体をテストするという性質から、原因の究明が困難になりがちです。まして後工程では修正が困難な部分に手を入れなくてはならないと最悪なので、やはり小さい機能のうちからこまめに計測しておくのがよいでしょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;・誰がやったらいいのか&lt;/div&gt;&lt;div&gt;これはいろんな分野の人が数人集まった方がよいでしょう。数人で意見を出し合った方が解析や検討が早いでしょう。重要なテストなので、それなりにコストをかけて取り組みましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さて、一通り書いた感じですが、考えることがいっぱいありますね。これでもまだ十分ではないでしょう。大変すぎます。しかし手を抜くと何十倍ものコストで跳ね返ってくるので、プロジェクトがアツくなる前にしっかりテストしておきましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-4873471826343467633?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/4873471826343467633/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4873471826343467633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4873471826343467633'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/blog-post.html' title='パフォーマンステストをまとめてみた'/><author><name>inomata</name><uri>http://www.blogger.com/profile/13744753825842161516</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-2821541050326073623</id><published>2011-10-03T13:07:00.009+09:00</published><updated>2011-10-03T13:27:13.056+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='XSS'/><category scheme='http://www.blogger.com/atom/ns#' term='ou.g'/><title type='text'>ちょっと面白いjavascriptコード</title><content type='html'>はじめまして、技術部のou.gと申します。先月の中旬に中途として入社しまして、QAチームに配属となりました。&lt;br /&gt;&lt;br /&gt;最近は弊社のサービス&lt;a href="http://www.shanon.co.jp/marketingplatform/"&gt;SHANON MARKETING PLATFORM&lt;/a&gt;のXSS対応テストを担当しています。最初にXSSを調べた時に、&lt;a href="http://www.modsecurity.org/documentation/XSS_Street_Fight-Ryan_Barnett-BlackhatDC-2011.pdf"&gt;このPDF&lt;/a&gt;の４０ページ目に乗っているちょっと面白いソースコードを見つけていました。すでにご存知の方も多いかもしれませんが、みなさんとシェアしたいと思います。&lt;br /&gt;&lt;br /&gt;記号だけ英数字の使わないjavascript：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;・コード１&lt;/span&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;・コード２&lt;/span&gt;&lt;br /&gt;&lt;pre class="js" name="code"&gt;([,Á,È,ª,É,,Ó]=!{}+{},[[Ç,µ]=!!Á+Á][ª+Ó+µ+Ç])()[Á+È+É+µ+Ç](-~Á)&lt;/pre&gt;&lt;br /&gt;上記の２つともはalert(1)と相当する合法的なjavascriptです。※但しブラウザ依存があります。&lt;br /&gt;&lt;br /&gt;このような記号だけ英数字の使わないコードはどう動いてますか。&lt;br /&gt;&lt;br /&gt;コード２のほうは短いから、実装のほうもコード１より巧妙だと思いますので、例として簡単に説明させて頂きます。&lt;br /&gt;&lt;br /&gt;まず、読めない記号を読みやすいものに置換しましょう。&lt;br /&gt;&lt;pre class="js" name="code"&gt;Á→AÈ→Bª→CÉ→DÓ→EÇ→Fµ→G&lt;/pre&gt;&lt;br /&gt;コード２は次のようになります。&lt;br /&gt;&lt;pre class="js" name="code"&gt;([,A,B,C,D,,E]=!{}+{},[[F,G]=!!A+A][C+E+G+F])()[A+B+D+G+F](-~A)&lt;/pre&gt;&lt;br /&gt;次は、ソースをフォーマットして、もっと読みやすくなってみます。&lt;br /&gt;&lt;pre class="js" name="code"&gt;&lt;br /&gt;(&lt;br /&gt;  [,A,B,C,D,,E]=!{}+{},          //1&lt;br /&gt;  [[F,G]=!!A+A][C+E+G+F]         //2&lt;br /&gt;)()                              //3&lt;br /&gt;   [A+B+D+G+F](-~A)              //4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これから行ごとに説明しましょう。&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.&lt;/span&gt;&lt;br /&gt;"!{}+{}"の結果を変数A,B,C,D,Eに一括代入  ※firefox特有な代入方式&lt;br /&gt;&lt;br /&gt;空オブジェクト{}がNULLではないので、!{}がfalseになります。!{}+{}を計算するときに、falseとオブジェクトが数字ではないので、それぞれ文字列にキャストされ、加算ではなく文字列の連結が行われます。&lt;br /&gt;&lt;br /&gt;false→文字列"false"&lt;br /&gt;&lt;br /&gt;{}→object.toString() = "[object Object]"&lt;br /&gt;&lt;br /&gt;よって、&lt;br /&gt;&lt;pre class="js" name="code"&gt;&lt;br /&gt;[,A,B,C,D,,E]=!{}+{} = "false[object Object]";&lt;br /&gt;A="a"&lt;br /&gt;B="l"&lt;br /&gt;C="s"&lt;br /&gt;D="e"&lt;br /&gt;E="o"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.&lt;/span&gt;&lt;br /&gt;まず、"!!A+A"の結果を変数F,Gに一括代入します。&lt;br /&gt;&lt;pre class="js" name="code"&gt;[F,G] = !!A+A = !!"a" + "a" =!false + "a" = true + "a" = "truea"&lt;/pre&gt;&lt;br /&gt;よって、&lt;br /&gt;&lt;pre class="js" name="code"&gt;F="t"G="r"&lt;/pre&gt;&lt;br /&gt;次、今まで作成した変数C、E、G、Fを使って、値の代入を行います。&lt;br /&gt;&lt;pre class="js" name="code"&gt;[C+E+G+F] = "s" + "o" + "r" + "t" = "sort"&lt;/pre&gt;&lt;br /&gt;よって、&lt;br /&gt;&lt;pre class="js" name="code"&gt;[[F,G]=!!A+A][C+E+G+F] = [["t","r"]]["sort"] = Array.prototype.sort&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.&lt;/span&gt;&lt;br /&gt;カンマ演算子の使い方は左から右へ実行して、一番右の値を返すのです。&lt;br /&gt;&lt;br /&gt;よって、コメント1とコメント２の結果はコメント２の値となります。&lt;br /&gt;&lt;pre class="js" name="code"&gt;(Array.prototype.sort)() = window&lt;/pre&gt;&lt;br /&gt;※window取得の説明は&lt;a href="http://d.hatena.ne.jp/javascripter/20100217/1266393981"&gt;このリンク&lt;/a&gt;をご参照ください。&lt;br /&gt;&lt;br /&gt;注意すべきなのは、Array.prototype.sort()でwindowが取れるかどうかはブラウザの実装に依存するので、ブラウザのアドレスバーに下記のコードを入力して確かめてください。&lt;br /&gt;&lt;pre class="js" name="code"&gt;javascript:v=[].sort;alert(v());&lt;/pre&gt;&lt;br /&gt;"[object Window]"のようなalertが出てきたら、今のブラウザはこの方法でwindowの参照が取れることが分かります。&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.&lt;/span&gt;&lt;br /&gt;これから、簡単ですよ。&lt;br /&gt;&lt;br /&gt;変数Aが数値に変換できないので、0として処理されることになります。&lt;br /&gt;&lt;pre class="js" name="code"&gt;-~A = -~"a" = -~0 = 1[A+B+D+G+F](-~A) = ["a"+"l"+"e"+"r"+"t"](1) = ["alert"](1)&lt;/pre&gt;&lt;br /&gt;最後&lt;br /&gt;&lt;pre class="js" name="code"&gt;([,Á,È,ª,É,,Ó]=!{}+{},[[Ç,µ]=!!Á+Á][ª+Ó+µ+Ç])()[Á+È+É+µ+Ç](-~Á) = window["alert"](1) = window.alert(1);&lt;/pre&gt;&lt;br /&gt;ちょっと面白いでしょう。^o^&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;追記&lt;/span&gt;&lt;br /&gt;最初にこの素晴らしいアイデアを出したのは、日本の技術者&lt;a href="http://twitter.com/hasegawayosuke"&gt;@hasegawayosuke&lt;/a&gt;でしたと思います。公式サイトはこちらです。&lt;a href="http://utf-8.jp/"&gt;http://utf-8.jp/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-2821541050326073623?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/2821541050326073623/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/javascript.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2821541050326073623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2821541050326073623'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/10/javascript.html' title='ちょっと面白いjavascriptコード'/><author><name>ou.g</name><uri>http://www.blogger.com/profile/05653341082735685895</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6037387791334751775</id><published>2011-09-15T12:38:00.000+09:00</published><updated>2011-09-15T12:50:08.413+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='レポート'/><category scheme='http://www.blogger.com/atom/ns#' term='堀譲治'/><title type='text'>Dreamforce '11に参加してきました</title><content type='html'>こんにちは、堀です。&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;先日、サンフランシスコで開催されたDreamforce 2011に参加してきました。&lt;br /&gt;&lt;br /&gt;Dreamforceの実際の模様はいろんな記事がありますので、そちらを参照していただくとしてここでは僕が現地で感じたことなどをざっくりレポートしようと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;基調講演：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-yikx0ZyM7ZA/TnE48o3pVYI/AAAAAAAAAB4/xfeIxjsibpo/s1600/IMG_0366.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-yikx0ZyM7ZA/TnE48o3pVYI/AAAAAAAAAB4/xfeIxjsibpo/s320/IMG_0366.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;ライティングがかっこいい会場&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gR44INlJAQk/TnE4_BAhKyI/AAAAAAAAAB8/9axXempiHlY/s1600/IMG_0386.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-gR44INlJAQk/TnE4_BAhKyI/AAAAAAAAAB8/9axXempiHlY/s320/IMG_0386.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;ソーシャルエンタープライズがテーマ&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のDreamforceのイベントのテーマは「Social Enteprise」でしたが、基調講演では「顧客がソーシャルに」「社員がソーシャルに」「製品がソーシャルに」という形でソーシャルを軸に話がされました。&lt;br /&gt;&lt;br /&gt;企業にとってのソーシャルは僕もまだビジョンがそこまで感じ取れているわけではないですが、話を聞きながら、ひょっとして欧米企業の価値観が昔の日本的になっているのかも...って感じました。&lt;br /&gt;&lt;br /&gt;日本では昔から意識を「共有」することにあまり抵抗がなく、パーティションのないスペースで一緒に仕事したり、仕事の後に頻繁に飲みにいったり、井戸端会議でちょっとした情報を立ち話で共有したりと昔から「social」でしたが、アメリカのような国土の広い国では、仕事の後にちょっと食べたり飲んだりとかそういうゆるい感じのつながりというのは地理的成約もあって比較的少なかったのではないかと思っています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;それがFacebookやChatter、Twitterなどでオンラインで実現手段ができてきて、欧米にも広まってきたのが今であり、日本にも価値観として逆輸入されてきている気がします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;また、講演の中でWinter12ではチームでのフォーキャスト（売上予測）が機能実装される予定とあり、これはまさに個人業績主義ではなく、日本型のチーム営業（集団で意思決定＆ミッション遂行する）のエッセンスが入ってくる予兆なのではないかと思っています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;マーク・ベニオフがなぜこんなにChatterへ注力しているのかを考えてみたのですが、まったく個人的な予測ですが以下の二つがあると思っています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;1. 社員にとってのFacebook型業務アプリ？&lt;/b&gt;&lt;/div&gt;&lt;div&gt;個人的にFacebookとTwitterをいろいろ使っていて思うのですが、Facebookの大きな違いは人と人の関係性の重みを軸に、タイムラインに出すデータを自動的に最適化してくれるということです。&lt;br /&gt;&lt;br /&gt;つまり「何も考えなくても」リロードするだけで、仲の良い人の写真や、コメントなどが現れるようになっています。Twitterはタイムラインが時系列に流れていくだけなので、こうはいきませんね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;で、Chatterは今はTwitter的なものだと思うのですが（間違ってたらすいません）、今後は企業内のソーシャルグラフを元に、自分に関連する商談や、顧客、社内の各業務が浮かび上がってくるようなインターフェースになっていくのではないかと思っています。そのために今、懸命にChatterに情報を一本化しようとしているのではないかと。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まだ企業サイズが小さい弊社でさえ、最近は業務アプリが増えてきて、いろんなサイトに行かないと業務が遂行できません。「あれ、これどうやるんだっけ。。これどこだっけ。。」なんていうのもしばしばです。僕ももし、業務が一つのアプリだけで完結できるってなったら素晴らしいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;きっと「Chatterだけ見てれば誰でも業務が遂行できる」というレベルまで昇華させようとマークは考えているのではないかと基調講演を見て感じました。&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;2. 業務アプリメッセージからの脱却&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Salesforce社も実際にメインビジネスとしているのはSFAやCRMを販売するということは間違いないと思います。ただ、CRMやSFAは業務として成熟化してきており、基本的な機能であればおそらくOracleやその他の競合と大差がないのだと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただ、現在ほぼ無償であるChatterをメッセージのキーに添えることで、次のソーシャルというビジョンを顧客に見せることができるのが大きいのだと思います。顧客は今は積極的に社内ソーシャルに取り組んでいなくても、無償であればとりあえずやってみようかと思いますし、他と機能差がなければ未来が見える方にかけてみようかという気になるものです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Heroku for Java：&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7ANMJqmFpDU/TnE5Y50rRTI/AAAAAAAAACA/HjSr2tOIzWo/s1600/IMG_0271.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-7ANMJqmFpDU/TnE5Y50rRTI/AAAAAAAAACA/HjSr2tOIzWo/s320/IMG_0271.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;盛り上がってたHeroku展示ブース&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今、PaaSプラットフォームはいろんなものが出てきていてまさに黎明期の様相ですが、数少ないJavaのPaaSプラットフォームとしてHerokuは大きく期待したいところです。早くインフラのパフォーマンスを気にしなくてよくなる世の中になって欲しいと個人的にも思います。。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Force.com/Apexは企業向けPaaSとしては非常に良いコンセプトだとは思うのですが、プログラミングするエンジニアの立場に立ってみると「俺の大事な時間をベンダーロックインの技術に投資するのか・・」となり、なかなか時間を投資するのには勇気がいります。そこがApex普及の障壁になっていまっているのではないかと。。&lt;br /&gt;&lt;br /&gt;エンジニアだったらやはり、オープンな言語のスキルをつけたいですし、日本に比べてテクニカルなスキルでの勝負感の強い欧米では特にその傾向が強いのではないかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のHerokuのJava対応により、上記のロックインを解決しつつ、900万人いると言われるJavaのデベロッパーにリーチできたのは非常に大きいと思います。個人的にはSalesforceはApexへの投資を控えて、こういうオープンなプラットフォームへの進化を強めていくのではないかと思っています。&lt;br /&gt;&lt;br /&gt;ただ、Herokuは値段はちょっと高いような気もするので今後の値下げに是非とも期待したいです。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;会場や雰囲気について：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1ABRa0huoos/TnE5yE1FaFI/AAAAAAAAACI/VYYJ8lFpums/s1600/IMG_0199.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-1ABRa0huoos/TnE5yE1FaFI/AAAAAAAAACI/VYYJ8lFpums/s320/IMG_0199.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;右側の女性はバーバリーの社長&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-98VXb7bLb-E/TnE5zYe7L0I/AAAAAAAAACM/aWW-AeQZeNk/s1600/IMG_0204.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-98VXb7bLb-E/TnE5zYe7L0I/AAAAAAAAACM/aWW-AeQZeNk/s320/IMG_0204.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;なんと郵政の日本語の看板&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-YwxXgTh2t3w/TnE506birCI/AAAAAAAAACQ/BaJf477E23c/s1600/IMG_0211.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-YwxXgTh2t3w/TnE506birCI/AAAAAAAAACQ/BaJf477E23c/s320/IMG_0211.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;会場近辺はイベント一色&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-_rn9vv--wtI/TnE52sQNYEI/AAAAAAAAACU/FSxc7MmRnRg/s1600/IMG_0244.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-_rn9vv--wtI/TnE52sQNYEI/AAAAAAAAACU/FSxc7MmRnRg/s320/IMG_0244.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;よく見ると競合のO社のバルーンが！&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;イベント会場となるモスコーンセンターは、大きな会場でしかも建物が分かれているため迷いがちです。なので、会場の中だけではなく外のいたるところにもstaffの方がいて、気さくに「迷ってないかい？」と話しかけてきてくれます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;会場に入って思ったのは、朝から音楽がかかっていてとにかく雰囲気が明るい。日本のビジネスイベントは音楽がかかっているものが少なく、どこか堅い気がするのですが、それとは違う明るさがあるなぁと思いました。イベントに音楽は大事ですね。ズンドコいうのはイイです。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;昼間もフリーフードで、夜も会場や周辺の至る所でお酒が振舞われたりパーティーが行われたりしています。1企業のイベントにも関わらず、有料で皆それなりのお金を払っているのですが、それ以上にお金を使って、来場者に還元しようという姿勢が素晴らしいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いろいろとイベントが派手だから記憶に残るんですよね。「あー、あのメタリカのやつね」って来年でもきっと皆覚えているイベントになると思います。こういう風にイベントが記憶に残るようにするっていうのは大事だなぁと強く感じました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;展示ブース：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-__JoPyFVlHE/TnE7E1KqUMI/AAAAAAAAACY/_-0zxCreijI/s1600/IMG_0608.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-__JoPyFVlHE/TnE7E1KqUMI/AAAAAAAAACY/_-0zxCreijI/s320/IMG_0608.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;展示コーナーもすごい人&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-e0STCZ5qVg4/TnE7Jfl_5xI/AAAAAAAAACk/Dp5Mb-cua0k/s1600/IMG_0607.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-e0STCZ5qVg4/TnE7Jfl_5xI/AAAAAAAAACk/Dp5Mb-cua0k/s320/IMG_0607.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;各ブースも熱心に聞く人であふれてました&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;個人的には結構時間を割いてパートナー企業の展示ブースをまわりました。どこのブースでも「さわらせてくれ」って言ったらちょっぴり嫌な顔されたので（笑）基本的にいろいろとデモンストレーションをしてもらいました。&lt;br /&gt;&lt;br /&gt;やはりどこのブースでも担当説明員が自信満々で説明してくるのはさすがにアメリカンな感じでしたね。実体としていわゆる統合ソリューションだったとしても、デモとしてはみな特徴のある部分を切り取ってうまく自社の強みを表現している感じでした。&lt;br /&gt;&lt;br /&gt;実際にSalesforce社と共にビジネスしている企業といろいろと見たり話したりできて、かなり有意義な時間を過ごすことができました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;さいごに：&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;今回初めてDreamforceに参加させてもらって、日米の違いを感じた部分もありましたが、どちらかというと変わらない部分やお互いの強みと弱みをたくさん認識できたのが大きな収穫でした。&lt;br /&gt;&lt;br /&gt;やはりイベントに参加することの意義は現地で生の情報や、実際にやっている人と話すことでそこから次のステップのアイデアやインスピレーションが湧いてくることだと思います。&lt;br /&gt;&lt;br /&gt;実際行く前と比べて、アメリカでのビジネス、開発について感覚が変わったところもだいぶでてきたので、個人的にはとても収穫がありました（中身を聞きたい人は是非虎ノ門におこしください）。&lt;br /&gt;&lt;br /&gt;※現地ではSalesforce社の方々（特に日本の方々）に大変お世話になりました。日本を大事にしてもらっていることも強く感じました。この場を借りて御礼申し上げます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Dreamforce'11関連記事へのリンク：&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://ascii.jp/elem/000/000/631/631724/"&gt;http://ascii.jp/elem/000/000/631/631724/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://itpro.nikkeibp.co.jp/article/NEWS/20110902/368072/"&gt;http://itpro.nikkeibp.co.jp/article/NEWS/20110902/368072/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222; font-family: arial,sans-serif;"&gt;&lt;a href="http://www.publickey1.jp/blog/11/databasecom10dreamforce11.html" style="color: #1155cc;" target="_blank"&gt;http://www.publickey1.jp/blog/&lt;wbr&gt;&lt;/wbr&gt;11/databasecom10dreamforce11.&lt;wbr&gt;&lt;/wbr&gt;html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222; font-family: arial,sans-serif;"&gt;&lt;a href="http://www.publickey1.jp/blog/11/dreamforce11.html" style="color: #1155cc;" target="_blank"&gt;http://www.publickey1.jp/blog/&lt;wbr&gt;&lt;/wbr&gt;11/dreamforce11.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="background-color: white; color: #222222; font-family: arial,sans-serif;"&gt;&lt;a href="http://jp.techcrunch.com/archives/20110901eric-schmidt-google-apps-has-40m-users-adding-5k-new-companies-per-day/" style="color: #1155cc;" target="_blank"&gt;http://jp.techcrunch.com/&lt;wbr&gt;&lt;/wbr&gt;archives/20110901eric-schmidt-&lt;wbr&gt;&lt;/wbr&gt;google-apps-has-40m-users-&lt;wbr&gt;&lt;/wbr&gt;adding-5k-new-companies-per-&lt;wbr&gt;&lt;/wbr&gt;day/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/#%21/jojihori"&gt;@jojihori&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6037387791334751775?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6037387791334751775/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/dreamforce-11.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6037387791334751775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6037387791334751775'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/dreamforce-11.html' title='Dreamforce &apos;11に参加してきました'/><author><name>堀　譲治</name><uri>http://www.blogger.com/profile/05335148554137923798</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-yikx0ZyM7ZA/TnE48o3pVYI/AAAAAAAAAB4/xfeIxjsibpo/s72-c/IMG_0366.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6916052446558646405</id><published>2011-09-06T12:38:00.000+09:00</published><updated>2011-09-09T14:01:55.366+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ブラウザ'/><category scheme='http://www.blogger.com/atom/ns#' term='アーキテクチャ'/><category scheme='http://www.blogger.com/atom/ns#' term='kiyoto.s'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='Webkit'/><category scheme='http://www.blogger.com/atom/ns#' term='Gecko'/><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>ブラウザってどうやって動いてるの？（モダンWEBブラウザシーンの裏側）</title><content type='html'>どうも、鈴木です。&lt;br&gt;さて、前回は vim の使用法というじつに低レベルレイヤの出身者的な記事を書きましたが、&lt;br&gt;今回も懲りずに低レベルのお話しをしたいと思います。&lt;br&gt;&lt;br&gt;というのも、先日「ブログ書くのめんどくさいよぅ」と駄々をこねていたところ、あまりにレガシーすぎる HTML/CSS/JavaScript 仕様や Flash や Silverlight といったプロプライエタリなリッチコンテンツ用プラグインに日々苦しめられている気弱く善良な一介の WEB プログラマにすぎない我々の希望の星であり、そして同時に新たな巨大クソレガシーの萌芽でもある HTML5 が、いかにイケてないのではなくイケているのであるかを盛んに啓蒙するサイトである HTML5 Rocks (&lt;a href="http://www.html5rocks.com/"&gt;http://www.html5rocks.com/&lt;/a&gt;) に、&amp;quot;How Browsers Work&amp;quot; というとても楽しい記事があるのを、我が社のアーリーアダプタでありエヴァンジェリストである ikeike443 氏から教えてもらい、これはなかなかありそうでなかった部分のきちんとしたドキュメントだと刮目したので、これを日本のドメスティックな (つまり私のように楽天にはもう入ることのできない) WEB 開発者にも広く読んでもらおうと考え、今回のブログの記事は、この記事の翻訳にさせてもらおうと勝手に思った次第なのであります。&lt;br&gt;&lt;br&gt;というわけで元の記事はこちら。&lt;br&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;a href="http://www.html5rocks.com/static/images/identity/HTML5_Badge_64.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://www.html5rocks.com/static/images/identity/HTML5_Badge_64.png"&gt;&lt;/a&gt;&lt;a href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/"&gt;How Browsers Work&lt;/a&gt;&lt;/div&gt;&lt;br&gt;翻訳にあたっては、一部プログラムコードも登場する記事であることから、ある程度ソフトウェアアーキテクチャやアルゴリズム的な用語については、あまり言い換えずにそのままカタカナ語を用いています。&lt;br&gt;また訳語を当てはめたものについても、わりといい加減に当てはめているので、オライリーのきちんとした和訳本などの用語と若干異同があるかもしれないことはお断りしておきます。&lt;br&gt;（つまり、そのへんきちんと調べるのをさぼったわけです）&lt;br&gt;&lt;br&gt;それでは、現存する汎用ソフトウェアの最高峰のひとつである WEB ブラウザのめくるめく (≒ 発狂しそうな) 世界へようこそ。&lt;br&gt;&lt;br&gt;9/9 追記:&lt;br&gt;Kosei Moriyama (&lt;a href="http://twitter.com/#%21/_kosei_"&gt;_kosei_&lt;/a&gt;)氏による訳もあるようです。&lt;br&gt;&lt;a href="http://cou929.nu/docs/how-browsers-work/"&gt;http://cou929.nu/docs/how-browsers-work/&lt;/a&gt;&lt;br&gt;&lt;br&gt;わたくしめのいい加減な訳のせいで文意がつかめない場合などは、読み比べてみてはいかがでしょう。というか、ならはじめからそちらを読めばいいじゃん、というのは言いっこなしです。また、わたくしとしても「やってくれてるの知ってたら、慣れない和訳なんぞ自分でやろうとは思わなかったであろうよ」的な愚痴は言いっこなしにしたいと思います。&lt;br&gt;&lt;br&gt;それはともかく、どちらかといえば、氏のもう一つの和訳である&lt;a href="http://cou929.nu/data/google_javascript_style_guide/"&gt; Google JavaScript Style Guide 和訳&lt;/a&gt; もたいへんな労作であり、内容も非常に実践的なものであることから、自身は JavaScript プログラマであると認識されている方はぜひ一度目を通しておかれることをお薦めいたします。&lt;br&gt;&lt;br&gt;ちなみに、わたくし個人といたしましては、このスタイルガイドにだいたい 8 割同意で、残り 2 割は、わたくしなりのわりとめんどくさい理由から反対（別のスタイルがよいと考えている）といったところであります。（おもに、はじめてまともに触った JavaScript フレームワークが ExtJS であったところから来ているのですが）&lt;br&gt;いずれにせよ、プログラマであれば、こうしたコーディングスタイルの問題は、なんといいますか、（ときに喧嘩になる、というのも含めて）酒の肴的なものであり、その意味でもたいへん楽しく読めるのではないかなと思っております。&lt;br&gt; &lt;br&gt;また最近は、これベースで JavaScript コードをチェックしてくれる&lt;a href="http://code.google.com/intl/ja/closure/utilities/docs/linter_howto.html"&gt; Google Closure Linter&lt;/a&gt; なる、まったくもっておせっかいな代物もあるようですので、(C の lint をまったく快く思ってない身としては、lint と聞くとその時点で斜に構えてしまうのであります) こちらなども試してみるとよろしいかと思います。&lt;br&gt;もっとも、わたくしとしてはまったく同意できない規則がいくつかありますので、使わないわけなんですけれども。&lt;br&gt;&lt;br&gt;それでは、あらためて本文をどうぞ。&lt;br&gt;&lt;br&gt;&lt;a href="http://shanon-tech.blogspot.com/2011/09/web.html#more"&gt;もっと読む »&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6916052446558646405?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6916052446558646405/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/web.html#comment-form' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6916052446558646405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6916052446558646405'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/web.html' title='ブラウザってどうやって動いてるの？（モダンWEBブラウザシーンの裏側）'/><author><name>kiyoto.s</name><uri>http://www.blogger.com/profile/11489806910113743131</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/_p6PR4p5cpHI/TTnM9LrEziI/AAAAAAAAAB4/LWeInbROdwk/s220/tumblr_lecs7wdFmd1qz4umco1_500.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-2005370802801412248</id><published>2011-09-03T13:25:00.007+09:00</published><updated>2011-09-03T13:54:02.651+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開発環境'/><category scheme='http://www.blogger.com/atom/ns#' term='リモート接続'/><category scheme='http://www.blogger.com/atom/ns#' term='オフショア'/><category scheme='http://www.blogger.com/atom/ns#' term='megumi'/><category scheme='http://www.blogger.com/atom/ns#' term='雑記'/><title type='text'>ノマドワーカーになりたいので、できるかどうか考えてみた</title><content type='html'>先日、&lt;a href="http://kuranuki.sonicgarden.jp/2011/08/post-37.html"&gt;『国境なきプログラマ』を目指す～ノマドワークの究極のかたち&lt;/a&gt; というブログを読み、コレが私の理想の働き方だ！と憧れている megumi です。&lt;br /&gt;&lt;br /&gt;そこで、これは弊社で可能なのか？と考えてみることにしました。&lt;br /&gt;&lt;br /&gt;制度が存在しないので、現実としてはできません。&lt;br /&gt;それは置いといて、技術的に可能なのか、もし制度があったら可能なのか、というところだけを考えてみます。&lt;br /&gt;&lt;br /&gt;海外から仕事をした経験については、以前ソンさんが韓国から仕事をした経験を書いてくれています。（&lt;a href="http://shanon-tech.blogspot.com/2011/05/shanon-puttysshpcmtgskype-ok-pc-sshpc.html"&gt;海外からのリモート作業&lt;/a&gt;） 韓国は時差が少ないので、チャット等でリアルタイムに連絡を取りながら進めることが可能です。&lt;br /&gt;&lt;br /&gt;前職ではアメリカやヨーロッパと一緒に仕事をしていましたが、さすがに時差が大きいので、チャット等の使用頻度は高くありませんでした。&lt;br /&gt;その頃の経験と、現在の仕事スタイルから、必要なことを考えてみます。&lt;br /&gt;&lt;br /&gt;開発エンジニアが1日にやることは、だいたい毎日こんな感じです。（時系列）&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ReviewBoard を使ったコードレビューをする&lt;br /&gt;&lt;/li&gt;&lt;li&gt;自分が出したレビューが ReviewBoard で Ship it になっていたら、CVSにコミットする&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Bugzilla にコミット内容を記載し、ステータスを変更する&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Google docs の業務報告シートに昨日の仕事内容を記録する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Backlog で今日のタスクを確認する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;スクラムチームのデイリーミーティング&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugzilla を確認し、要対応なものに着手する&lt;br /&gt;&lt;ol&gt;&lt;li&gt;バグが再現しないときや仕様が曖昧な時はQAに相談する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;修正と動作確認をし、Build テストを流す&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ReviewBoard に投稿する&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;今月の開発テーマに着手する&lt;br /&gt;&lt;ol&gt;&lt;li&gt;現状の機能がどう作られているか確認し、開発方針を立てる&lt;br /&gt;&lt;/li&gt;&lt;li&gt;仕様が曖昧な時はQAに相談する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;口頭かメールかReviewBoardで設計レビューを出す&lt;br /&gt;&lt;/li&gt;&lt;li&gt;修正と動作確認をし、Build テストを流す&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ReviewBoard に投稿する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google docs のリリースノートに変更内容を書く&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;ReviewBoard を使ったコードレビューをする&lt;br /&gt;&lt;/li&gt;&lt;li&gt;作業の進捗をBacklogに記録する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;（帰宅）&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;※ ReviewBoard についてはこちら ⇒ &lt;a href="http://shanon-tech.blogspot.com/2011/02/blog-post_21.html"&gt;コードレビュー&lt;/a&gt;&lt;br /&gt;※ Bugzilla についてはこちら ⇒ &lt;a href="http://bugzilla.mozilla.gr.jp/"&gt;Bugzilla-jp - もじら組&lt;/a&gt; （本家）&lt;br /&gt;※ Backlog についてはこちら ⇒ &lt;a href="http://shanon-tech.blogspot.com/2011/05/backlog-in-fukuoka.html"&gt;Backlog ユーザーの集い in Fukuoka に行ってきました！&lt;/a&gt;&lt;br /&gt;※ スクラムについてはこちら ⇒ &lt;a href="http://shanon-tech.blogspot.com/2011/06/blog-post_27.html"&gt;スクラム道バーストにいってきました&lt;/a&gt;, &lt;a href="http://shanon-tech.blogspot.com/2011/07/blog-post.html"&gt;マンネリ化したスクラムをアナログ回帰でテコ入れするの巻&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;この他に時々ミーティングが入ったりすることがあります。また、月末にスプリントレビュー（ビジネスオーナ－向けのレビュー）、月初に計画ミーティングなどがあります。&lt;br /&gt;&lt;br /&gt;これらは、対面で行うもの、方法は問わないもの、ツールを使用するものに大別できます。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;対面&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;スクラムチームのデイリーミーティング&lt;br /&gt;&lt;/li&gt;&lt;li&gt;その他ミーティング&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;方法は問わない&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;バグが再現しないときや仕様が曖昧な時はQAに相談する&lt;br /&gt;&lt;/li&gt;&lt;li&gt;現状の機能がどう作られているか確認し、開発方針を立てる&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;ツール&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ReviewBoard でレビューする／される&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CVSにコミットする&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bugzilla でバグの管理をする&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google docs で業務報告シートを書く&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google docs でリリースノートを書く&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Backlog でタスクの管理をする&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Build テスト&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;対面で行っているものについては、Skypeやメッセンジャーなど、リアルタイムで連絡を取ることができる方法が必要です。&lt;br /&gt;このときに最重要なことは、&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ログインしておくこと&lt;/span&gt;&lt;/span&gt; でしょうか。そのためには、&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ミーティングの開始時刻を確定しておくこと&lt;/span&gt;&lt;/span&gt;、&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;時間を守ること&lt;/span&gt;&lt;/span&gt; も大事なことです。&lt;br /&gt;ミーティングの時間と移動時間が重ならないようにする必要があるからです。また、時差が大きいときは、いつ始まるかもわからないミーティングのために待っていられないものです。&lt;br /&gt;全員揃ったら開始、前のミーティングが終わり次第開始といった曖昧なミーティングが時々あるので、そこは改善すべきポイントだと思います。&lt;br /&gt;&lt;br /&gt;次に、方法が決まっていないものについて。&lt;br /&gt;これは対面の場合と同様に行うか、もしくはメールを使うことが多いのではないかと思います。&lt;br /&gt;メールのように非同期でコミュニケーションを取る場合には、&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;お互いがメールをチェックする習慣があること&lt;/span&gt;&lt;/span&gt;、&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;わかりやすく説明する言語能力&lt;/span&gt;&lt;/span&gt; が必要かと思います。&lt;br /&gt;メールを見てなかった・・・では仕事が進みませんし、読んだけど意味不明だったというのも仕事は進みません。文章が長すぎて読むのがイヤになった、というのも困ります。&lt;br /&gt;&lt;br /&gt;そして最後に、ツールを利用するものについて。&lt;br /&gt;上に列挙したものを見るとツールを使うものが大半です。そのため、いつでもどこでも仕事ができそうじゃないか！と思うかもしれません。確かに、ちゃんと有効活用できていれば、かなりの部分をツールに頼ることができそうだという実感はあります。&lt;br /&gt;主にコミュニケーション手段ともなる ReviewBoard、Bugzilla, Backlog （レビュー、バグ管理、タスク管理） をうまく活用できているかどうかは重要です。これらは&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;何をどこまで作業しているかを見えるようにする&lt;/span&gt;&lt;/span&gt;という重要な役割があります。&lt;br /&gt;きっと見えない相手と仕事をすれば、相手がサボっているのではないか？と不安になることもあるのではないでしょうか。それを解消する役目がこれらのツールを活用することかなと思います。&lt;br /&gt;&lt;br /&gt;いずれの手段を用いるにしても、それがインターネット経由で共有できる情報なのかどうか、というのが大事だと思うのです。&lt;br /&gt;&lt;br /&gt;こうして書いてみて、ツールなど手段は存在するけど、使い方はまだまだ足りないな、という感触を受けました。&lt;br /&gt;時差がないほうが仕事しやすいというのは、ツール等を用いた非同期コミュニケーションに慣れていないからだと思います。うまく時差を活用すれば、開発とQAをうまく組み合わせて2倍速くらいにできる気がするのです。&lt;br /&gt;&lt;br /&gt;自分が海外で働くわけではなくても、海外の人と仕事をすることになるかもしれません。&lt;br /&gt;そんな遠隔地でなくても、もし日本で開発拠点が2つになった時点で、姿が見えない相手と仕事をすることになるわけです。他人事だと思わずに、一度思いを廻らせてみると、見えてなかったことに気付くかもしれません。&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-2005370802801412248?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/2005370802801412248/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2005370802801412248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2005370802801412248'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/09/blog-post.html' title='ノマドワーカーになりたいので、できるかどうか考えてみた'/><author><name>megumi</name><uri>http://www.blogger.com/profile/06626837198746946677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-7795059885067519806</id><published>2011-08-30T10:40:00.009+09:00</published><updated>2011-08-30T12:38:25.881+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='chappie'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>サーバサイドのレガシーなHTMLに負けずに jQuery Mobile を使おう</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;こんにちわ、 &lt;a href="http://www.blogger.com/profile/07308803140601522333"&gt;chappie&lt;/a&gt; です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;少し前に、とある案件で jQuery Mobile を触って iPad 用に画面をカスタマイズする機会がありました。&lt;/div&gt;&lt;div&gt;jQuery Mobile (以下 JQM) 自体については素敵な紹介記事が世の中にたくさんあるので(末尾の参考リンク参照ください)、ここでは個人的に対応しなければならなかった細かい問題について小ネタをシェアしたいと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://jquerymobile.com/"&gt;&lt;img src="http://4.bp.blogspot.com/-AmlQcVAiY8c/TlxTiQNQ9zI/AAAAAAAAAC0/FwwmkOKAhwo/s400/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B3.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5646479880747022130" style="cursor: pointer; width: 400px; height: 194px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JQM は、HTMLをセマンティックに記述しておけば自動的にモバイル端末向けの画面にレンダリングしてくれるライブラリです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://jsfiddle.net/somat/NrCGb/7/"&gt;超カンタンなサンプル(@ jsFiddle)&lt;/a&gt; (http://jsfiddle.net/somat/NrCGb/7/)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;全く新規にスマートフォン/タブレット向けにサイトを作るといったようにHTMLを自由に書ける場合は、JQM が求めるとおりの記述をしておけばいいだけなのでとても楽チンです。しかし、SaaSアプリケーションなど既存のWebアプリをカスタマイズする場合、一部のパーツがサーバサイドから固定出力されるため、必ずしも JQM に都合のよいHTMLが生成されるとは限りません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回私が担当した件では、入力フォームのチェックボックスが問題になりました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JQM では、チェックボックスやラジオボタンの選択肢は label タグとセットで記述されていないと正しくレンダリングしてくれません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre name="code" class="html"&gt;&amp;lt;input type="checkbox" name="chk1" value="1" id="chk1-1"&amp;gt;&amp;lt;label for="chk1-1"&amp;gt;せんたくし１&amp;lt;/label&amp;gt;&amp;lt;input type="checkbox" name="chk1" value="2" id="chk1-2"&amp;gt;&amp;lt;label for="chk1-2"&amp;gt;せんたくし２&amp;lt;/label&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;label タグがない、たとえば以下のような記述だと、とても残念な出力結果になってしまいます。&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;pre name="code" class="html"&gt;&amp;lt;input type="checkbox" name="chk1" value="1"&amp;gt;せんたくし１&amp;lt;br&amp;gt;&amp;lt;input type="checkbox" name="chk1" value="2"&amp;gt;せんたくし２&amp;lt;br&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-aTe3zimsmVc/TlxUHYKPwoI/AAAAAAAAAC8/_haR1Ys1bS4/s1600/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-aTe3zimsmVc/TlxUHYKPwoI/AAAAAAAAAC8/_haR1Ys1bS4/s400/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5646480518537003650" style="cursor: pointer; width: 400px; height: 375px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;(上のチェックボックスグループが label タグ付き、下が label タグなし)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;サーバサイドで出力されるHTMLを label 付きのコードに変更できれば一番よいのですが、出力を変えることは既存の他のユーザ環境にも影響を与えることになってしまい、簡単には変えられません。ここが SaaS アプリケーションのムズカシイところです。サーバサイドのプログラムを変えてもらう交渉するのも大変でしょう。(注: 弊社のエンジニア同士の仲が悪いわけではありません)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかし、諦めるのはまだはやい。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;多少ムリヤリでもクライアント側で DOM を加工してやればいいのではないか、、、そう思ってやってみたら、(一応)うまくいきました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-J94wQS9sYdY/TlxUpuWik2I/AAAAAAAAADE/k3l-U2aLI-k/s1600/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-J94wQS9sYdY/TlxUpuWik2I/AAAAAAAAADE/k3l-U2aLI-k/s400/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5646481108609700706" style="cursor: pointer; width: 391px; height: 400px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://jsfiddle.net/somat/u2a79/5/"&gt;サンプルコード (@ jsFiddle)&lt;/a&gt; (http://jsfiddle.net/somat/u2a79/5/)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;元々のチェックボックスと、label タグがついてない素のテキストを取り出し、新しい要素を作ってその中に順番にチェックボックスとlabelでかこったテキストをつめて、元の要素を置き換えています。とってもクルシイことしてますが、今回の案件は短期プロジェクトだったので、割りきって対応しました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに、案件担当当時は JQM はまだ アルファ版でした。&lt;/div&gt;&lt;div&gt;そのころのバージョンでは、head タグ内で、DOMの加工処理をJQMのロード箇所よりも前に記述する必要がありました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;- &lt;a href="http://jsfiddle.net/somat/9mnAq/2/"&gt;サンプルコード @ jsFiddle&lt;/a&gt; (http://jsfiddle.net/somat/9mnAq/2/)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;その後、当時のバージョンにはセキュリティホールが見つかったりして、ほんと短期プロジェクトでの利用でよかったな。。。と思った次第。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;というわけで、JQM本体もいよいよ安定してきている？ようですし、サーバサイドの中の人と仲が悪くても大丈夫！積極的に jQuery Mobile つかっていきましょう。(注: 弊社のエンジニア同士の仲が悪いわけではありません)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;参考リンク:&lt;/div&gt;&lt;div&gt;- &lt;a href="http://ke-tai.org/blog/2011/05/27/jquerymobilematome/"&gt;もう知らないでは許されない！！「これからはじめる」という人のためのjQuery Mobile情報まとめ&lt;/a&gt; &lt;/div&gt;&lt;div&gt;- &lt;a href="http://hisasann.com/housetect/2011/02/jquerymobile.html"&gt;jQueryMobileを使ってのスマートフォンサイトの構築メモ&lt;/a&gt; &lt;/div&gt;&lt;div&gt;- &lt;a href="http://hisasann.com/housetect/2011/06/jquerymobile_1.html"&gt;jQueryMobileのかゆいところに手が届くお作法メモ&lt;/a&gt; &lt;/div&gt;&lt;div&gt;- &lt;a href="http://jsdo.it/event/topics/2011/06/jquery-mobile"&gt;jQuery Mobileを触りながら覚えよう！&lt;/a&gt; &lt;/div&gt;&lt;div&gt;- &lt;a href="http://kachibito.net/web-design/19-jquery-mobile-tips.html"&gt;jQuery Mobileを使う際に知っておくと役立ちそうなTipsや情報のまとめ&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-7795059885067519806?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/7795059885067519806/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/html-jquery-mobile.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7795059885067519806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/7795059885067519806'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/html-jquery-mobile.html' title='サーバサイドのレガシーなHTMLに負けずに jQuery Mobile を使おう'/><author><name>chappie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-2qD6qWCmFwk/TaP-Hb-y8wI/AAAAAAAAABY/PmW3BCwhqJw/s220/chappie_icon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-AmlQcVAiY8c/TlxTiQNQ9zI/AAAAAAAAAC0/FwwmkOKAhwo/s72-c/%25E3%2583%2594%25E3%2582%25AF%25E3%2583%2581%25E3%2583%25A3%2B3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-2046711705239413495</id><published>2011-08-22T02:48:00.020+09:00</published><updated>2011-08-22T15:40:36.274+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='開発環境'/><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='numa'/><title type='text'>Vundle入れたら、Vimのプラグイン管理が楽になった</title><content type='html'>どうも、EventPlatFormチーム、新卒入社２年目、開発担当のnumaです。 最近、会社のPCが変わったり、個人的に新しいPCを購入したりと開発環境を移行する場面が多かったので、vimプラグイン管理に&lt;a href="ttps://github.com/gmarik/vundle"&gt;Vundle&lt;/a&gt;を導入することにしました。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;■vundleとは？&lt;/span&gt;&lt;blockquote&gt;&lt;a href="https://github.com/gmarik/vundle"&gt;gmarik / vundle&lt;/a&gt;&lt;br /&gt;Vundle is short for Vimbundle and is a Vim plugin manager. &lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;.vimrcに管理したいプラグインを記述することで管理をする&lt;/li&gt;&lt;li&gt;vim上でプラグンの検索が出来る。&lt;/li&gt;&lt;li&gt;vim上でプラグインのインストールとアップデートが出来る。&lt;/li&gt;&lt;li&gt;.vim/bundle以下にプラグインごとにディレクトリが作られるので、視覚的にも分かりやすい。&lt;/li&gt;&lt;li&gt;.vimrcで同じプラグインを指定すれば、複数のPC間で同じ環境が作れる。 &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;導入するにはgitが必要なのですが、gitさえ入っていればすぐに導入出来るので、vimは時々しか使わないという方も、ちょっと機能追加したいなというときに使えるのでオススメです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;■導入&lt;/span&gt;&lt;br /&gt;$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle&lt;br /&gt;&lt;br /&gt;~/.vim　以下にbundleディレクトリを作り、リポジトリをcloneする事で導入は完了です。dotfileをgitで管理している場合はsabmoduleとして取り込む必要があるようです。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;■.vimrcを編集&lt;br /&gt;&lt;/span&gt; 青字で書かれている箇所で、プラグインを指定しています。各自必要なプラグイン名に書き換えてください。 &lt;blockquote&gt;filetype off """ Vundle&lt;br /&gt;''' set rtp+=~/.vim/bundle/vundle/&lt;br /&gt;call vundle#rc()&lt;br /&gt;" let Vundle manage Vundle Bundle 'gmarik/vundle'&lt;br /&gt;"管理したいプラグイン&lt;br /&gt;" original repos on github&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Bundle 'Shougo/neocomplcache'&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;Bundle 'Shogo/unite.vim'&lt;/span&gt;&lt;br /&gt;" vim-scripts repos&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;Bundle 'ZenCoding.vim'&lt;/span&gt;&lt;br /&gt;" non github repos &lt;span style="color: rgb(51, 51, 255);"&gt;&lt;br /&gt;Bundle 'git://git.wincent.com/command-t.git'&lt;br /&gt;&lt;/span&gt; filetype plugin indent on &lt;/blockquote&gt;■プラグイン名の指定の仕方 github上にレポジトリから取得する場合&lt;br /&gt;Bundle 'user_name/repojitory_name'　&lt;br /&gt;Githubのユーザ名とリポジトリ名&lt;br /&gt;&lt;br /&gt;vim-scripts上のレポジトリから取得する場合&lt;br /&gt;Bundle 'script_name'&lt;br /&gt;それ以外のgitリポジトリから取得する場合&lt;br /&gt;Bundle 'git://repository_url'　gitレポジトリのフルパス &lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;■プラグインのインストール&lt;/span&gt;&lt;br /&gt;.vimrcの設定が終わったら、vimを開き直す、もしくは:source ~/.vimrcのコマンドを打って.vimrcの変更をvimに適用させたら準備は完了です。 &lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;■インストール&lt;/span&gt;&lt;br /&gt;:BundleInstall&lt;br /&gt;コマンドモードで:BundleInstallと打てば、先ほど.vimrcで指定したリポジトリから自動的にBundle ‘name’ と記述した plugin が自動的に取得され、インストールまで行われます。 &lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;■アップデート&lt;/span&gt;&lt;br /&gt;:BundleInstall!&lt;br /&gt;すでにインストールしたプラグインのアップデートには:BundleInstall!コマンドを使用します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;■プラグインの検索&lt;/span&gt;&lt;br /&gt;:Bundles plagin_name&lt;br /&gt;プラグインを検索して、インストール削除などが行えます。&lt;br /&gt;&lt;br /&gt;gitとvimさえあれば、あとは、cloneして、.vimrcに数行記述すれば始められるので、導入が簡単で分かりやすいと感じました。これならVimをメインに使っている方はもちろん、時々しか使わない方も入れておくと後々便利なのでは無いでしょうか。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考&lt;br /&gt;&lt;a href="https://github.com/gmarik/vundle/blob/master/README.md"&gt;github gmarik / vundle&lt;/a&gt;&lt;br /&gt;&lt;a href="http://vim-users.jp/2011/04/hack215/"&gt;Hack #215: Vundle で plugin をモダンに管理する　vim-users.jp&lt;/a&gt; &lt;a href="http://d.hatena.ne.jp/marutanm/20110503/p1"&gt;VundleでVundleをBundleしてみる / Meltdown Countdown&lt;/a&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-2046711705239413495?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/2046711705239413495/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/vundlevim.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2046711705239413495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2046711705239413495'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/vundlevim.html' title='Vundle入れたら、Vimのプラグイン管理が楽になった'/><author><name>fujinuma</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-1878624012983643856</id><published>2011-08-15T17:57:00.006+09:00</published><updated>2011-08-16T11:34:52.362+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Socket.io'/><category scheme='http://www.blogger.com/atom/ns#' term='勉強会'/><category scheme='http://www.blogger.com/atom/ns#' term='node.js'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><category scheme='http://www.blogger.com/atom/ns#' term='ikeike443'/><category scheme='http://www.blogger.com/atom/ns#' term='WebSocket'/><title type='text'>Websocket, node.js, Socket.io@社内勉強会</title><content type='html'>&lt;a href="https://twitter.com/ikeike443"&gt;ikeike443&lt;/a&gt;です。&lt;br /&gt;&lt;br /&gt;今日は弊社の社内勉強会で発表したWebSocketとnode.js周りについて書きます。&lt;br /&gt;&lt;br /&gt;書きます、というか、資料を貼らせていただきます。。&lt;br /&gt;&lt;div id="__ss_8852014" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/ikeike443/websocket-shanon-8852014" target="_blank" title="Websocket shanon"&gt;Websocket shanon&lt;/a&gt;&lt;/b&gt; &lt;object height="355" id="__sse8852014" width="425"&gt; &lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=websocketshanon-110815033852-phpapp01&amp;stripped_title=websocket-shanon-8852014&amp;userName=ikeike443" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse8852014" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=websocketshanon-110815033852-phpapp01&amp;stripped_title=websocket-shanon-8852014&amp;userName=ikeike443" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt; &lt;/object&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ikeike443" target="_blank"&gt;Takafumi Ikeda&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;ポイント&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;WebSocketは「WebのためのTCP」的なもの&lt;/li&gt;&lt;li&gt;WebSocketはPushを実現できる&lt;/li&gt;&lt;li&gt;WebSocketには&lt;span style="font-size: large;"&gt;&lt;b&gt;クロスドメイン制約がない&lt;/b&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;WebSocketはコネクション張りっぱなしなので注意が必要&lt;/li&gt;&lt;li&gt;WebSocketは仕様が揺れており、取り扱いには注意が必要&lt;/li&gt;&lt;li&gt;WebSocket＋WebSocketエミュレーションをクロスブラウザで行うSocket.io&lt;/li&gt;&lt;li&gt; &lt;span style="font-size: large;"&gt;&lt;b&gt;Socket.ioが現時点での現実解？&lt;/b&gt;&lt;/span&gt;ではないか&lt;/li&gt;&lt;li&gt;用途を絞れば十分に使えるのではないか&lt;/li&gt;&lt;li&gt;サーバサイドJavascriptアツイ感じ&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;尚、デモの内容については、僕の個人ブログに同じ内容を動画として保存してあるので、よかったらご覧ください。&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/ikeike443/20110808/p3"&gt;http://d.hatena.ne.jp/ikeike443/20110808/p3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;参考URL&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.atmarkit.co.jp/fcoding/articles/websocket/01/websocket01a.html"&gt;node.jsの衝撃とWebsocketが拓く未来&lt;/a&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/Ehren/20100830/1283183474"&gt;最近のWebSocket事情についてまとめとく Ehrenの日記&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.publickey1.jp/blog/11/websocket.html"&gt;WebSocketがセキュリティ問題を解決して再び実装へ  Publickey&lt;/a&gt;&lt;br /&gt;&lt;a href="http://prog.re-d.net/demo/slide/20110528"&gt;WebSocket勉強会&lt;/a&gt; &lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/takoratta/20100426/1272237156"&gt;「続・ハイパフォーマンスWebサイト」に書かれたWebSocket記事への更新 Nothing ventured, nothing gined.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/mzp/20110123/websokcet"&gt;サーバを作りながら学ぶWebSocketプロトコル みずぴー日記&lt;/a&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/t_43z/20101020/1287546063"&gt;ExpressとSocket.ioを使ったチャットサンプル 自分の感受性くらい&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;倍プッシュ！　倍プッシュ！　でお願いします。 &lt;br /&gt;&lt;br /&gt;ではまたー。&amp;nbsp; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-1878624012983643856?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/1878624012983643856/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/websocket-nodejs-socketio.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1878624012983643856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1878624012983643856'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/08/websocket-nodejs-socketio.html' title='Websocket, node.js, Socket.io@社内勉強会'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3096491339385053748</id><published>2011-07-22T16:30:00.001+09:00</published><updated>2011-08-24T16:44:17.117+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AmazonEC2'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenVZ'/><category scheme='http://www.blogger.com/atom/ns#' term='Jenkins'/><category scheme='http://www.blogger.com/atom/ns#' term='fujya.sh'/><category scheme='http://www.blogger.com/atom/ns#' term='テスト'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>テスト環境まるごとAWSにのっけてみた ～第三回　Backlogチャンネル～</title><content type='html'>&lt;span class="Apple-style-span"&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;どうもfujya.sh（梨ガリ君 Love）です。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;7月21日にシャノンのセミナールームで&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; line-height: 18px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://www.backlog.jp/blog/2011/07/backlog2119aws.html" style="color: rgb(102, 102, 102); "&gt;Backlogチャンネル・AWSセミナー&lt;/a&gt;が開催されました。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; line-height: 18px; "&gt;&lt;span class="Apple-style-span"&gt;AWSに関する講師枠をもらえたので、「テスト環境まるごとAWSにのっけてみた」というタイトルで話をしたのですが、若干滑りつつも好評だった部分もあったので紹介したいと思います。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS', Trebuchet, Verdana, sans-serif; line-height: 18px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;strong style="display: inline !important; margin-top: 12px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; "&gt;&lt;a href="http://www.slideshare.net/fujya/aws-8652660" title="テスト環境まるごとAwsにのっけてみた" target="_blank"&gt;テスト環境まるごとAwsにのっけてみた&lt;/a&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div style="width:425px" id="__ss_8652660"&gt;&lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8652660" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/fujya" target="_blank"&gt;fujya .sh&lt;/a&gt; &lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■テスト環境はAWSに乗っけてるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;電力が無いから社内にテスト用サーバ追加できない　→　じゃあAWSに乗せようって流れでAWSを使い始めました。本当はAWS使ってみたいなーと思っていた自分とかが、QAチームが困っていることをダシにして予算を獲得したという裏話もあったりなかったり・・・&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■テスト全体の管理はJenkinsでやってるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;元々テスト全体の流れはJenkinsでやっていたのですが、EC2のインスタンスの起動・停止も含めて管理するようになりました。テスト全体の紹介に関しては&lt;a href="http://shanon-tech.blogspot.com/search/label/nishino"&gt;nishino&lt;/a&gt;が以前Jenkinsの勉強会（その当時はHudsonでした）で発表したことがあるので、そちらを見ていただければ分かると思います。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;a href="https://docs.google.com/present/view?id=0AbDvtUF_P-4uZDl0cGo4aF8zMWdmNXhnZ3M2&amp;amp;hl=en"&gt;Hudson活用事例&lt;/a&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■テスト用インスタンスはOpenVZで再仮想されてるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;a href="http://shanon-tech.blogspot.com/2011/01/amazonec2.html"&gt;前にBlogにも書いたネタ&lt;/a&gt;なんですがインスタンスはOpenVZで再仮想されてます。EC2インスタンス起動時にはElasticIPの取得をはじめ、色々なスクリプトが実行され初期化されて立ち上がります。初期化周りの調整がまぁ結構大変で、立ち上げて確認してダメだったらまた調整して・・・の繰り返しで良い感じに仕上げました。今はそのイメージをコピーして複数台のOpenVZ化されたEC2インスタンスを立ち上げてテストしてます。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■起動からテスト実行、終了まで全部自動化されてるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;シャノンのQAはテストする人じゃなくて、テストプラットフォームを創る人なんです！！&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;実際にテストケースも書きつつ、プラットフォームに必要なアプリケーションも作ってます。シャノンのQAって凄い！と共感し興味がある人は、ブログ下部にある「人材募集」ボタンをクリックしてくれたら嬉しいですｗ&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■節約してるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;使ってない電気は消そう！という事で、自動シャットダウンの仕組み作りました。仕組みはmonitで作りました。コンフィグはこんな感じ&lt;/div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;check file auto_shutdown with path /var/log/httpd/ssl-access_log&lt;br /&gt;   if timestamp &amp;gt; 30 minutes for 60 cycles then exec&lt;br /&gt;      "/root/bin/autoshutdown.sh"&lt;/blockquote&gt;Apacheのアクセスログのタイムスタンプを監視して、30分更新されていない状態を60回検知したら/root/bin/autoshutdown.shを実行する&lt;div&gt;というコンフィグになっています。（タイミングは1分に1回で設定で、90分アクセスが無ければ落ちる想定）autoshutdown.shにはアプリケーションを停止してから「落とすよ！」というアラートを飛ばした後、API経由でシャットダウンする内容が書いてあります。&lt;/div&gt;&lt;div&gt;この仕組みを導入してから全体で600~800時間分のインスタンス起動時間が削減できている見込みです。節電！節電！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■家計簿書いてるよ&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;案件でAWSを使いたいけど、内訳わかんないよね。でも、AWSには課金APIが無いので自前で課金情報を集計するスクリプトを作りました。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;ul&gt;&lt;li&gt;帳簿：Google Spreadsheets&lt;/li&gt;&lt;li&gt;言語：Python&lt;/li&gt;&lt;li&gt;モジュール：AWSの情報取得 boto&lt;br /&gt;　　　　　　　Spreadsheetsの情報取得・書き込み gdata&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;処理の流れとしては&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;ol&gt;&lt;li&gt;botoを使いAWSのAPIを叩きインスタンスの情報一覧を取得&lt;br /&gt;Runnning中のインスタンスの instanceID / Tag:Name / instanceType / Tag:biz(用途） を取得&lt;/li&gt;&lt;li&gt;gdataを使いSpreadsheetsの一覧を取得して１の情報とぶつける&lt;br /&gt;既にシートにinstanceIDが記述されていたら起動時間をインクリメント&lt;br /&gt;シートにinstanceIDが記述されてなかったら（新規で作成したインスタンス）行を追加&lt;/li&gt;&lt;li&gt;このスクリプトをcronに設置して毎分実行&lt;/li&gt;&lt;li&gt;月をまたぐ瞬間にシートのコピーをとり、初期化する（当月の集計）&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;Spreadsheets内部でTag:biz(用途）別に金額を集計するようにしておき、他のシートにインスタンスの時間単価、為替レートを書いておきSpreadsheetsの関数を使い用途別の利用金額を出してます。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;EBSとトラフィック周りの金額は・・・いい感じにマージしてます。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;これ作ってみてよかった事は、何が使いすぎているのかという分析ができるようになります。AWSは使い始めると金額が膨れてくるので節約周りはインフラ屋の大きなミッションになります。情報を集めて分析するのにとても役立ってます。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;（早く課金APIで無いかなぁ・・・）&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;■結論：AWS最高！&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;資料にも書いてますが当初の目的のテスト実行時間が短縮できました。たぶん社内にサーバ増強して同じ事をやっていても目標は達成できたかもしれませんが、テストケースはどんどん増えていきます。物理サーバを増やす運用だとテストケースが一定量を超えた時点で破綻する事が目に見えているので、AWS上にテスト環境移動している現在では心配事は予算のみとなりました（強敵ですが・・・）&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;インフラエンジニアが面倒だなーと思うところ（工数がかかる）をAWSが全部やってくれるので、本当に素晴らしいプラットフォームだと思います。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;結論としてはAWS使うと色々と幸せになれるよって事ですね。&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;最後に、今回こういったすばらしい企画をしてくれたヌーラボの皆様、講師のアイレット：後藤様、AWS：大谷様本当にありがとうございました、凄く楽しいセミナーになりました。&lt;/div&gt;&lt;/div&gt;&lt;div style="padding:5px 0 12px"&gt;また機会があればご一緒しましょう！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-3096491339385053748?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/3096491339385053748/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/aws-backlog.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3096491339385053748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3096491339385053748'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/aws-backlog.html' title='テスト環境まるごとAWSにのっけてみた ～第三回　Backlogチャンネル～'/><author><name>fujya.sh</name><uri>http://www.blogger.com/profile/03776400533753064010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-1375771104346248204</id><published>2011-07-20T20:41:00.001+09:00</published><updated>2011-07-20T20:42:21.950+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='勉強会'/><category scheme='http://www.blogger.com/atom/ns#' term='Backlog'/><category scheme='http://www.blogger.com/atom/ns#' term='ikeike443'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>明日のBacklogチャンネル・AWSセミナーに会場をお貸しします</title><content type='html'>突然ですが、明日、ヌーラボさん主宰の&lt;a href="http://www.backlog.jp/blog/2011/07/backlog2119aws.html"&gt;Backlogチャンネル・AWSセミナー&lt;/a&gt;がひらかれます。&lt;br /&gt;その会場として、弊社セミナールームをお貸しすることになりました！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Backlogの話やAWSの話が聞けて、ビールも飲めるみたいなので、お近くの方は是非どうぞ！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下記が地図になります！　一階のガラス窓に"SHANON"と書いてあるので分かると思います！！&lt;br /&gt;&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.co.jp/maps?f=q&amp;amp;source=s_q&amp;amp;hl=ja&amp;amp;geocode=&amp;amp;q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%99%8E%E3%83%8E%E9%96%80%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%96%E2%88%92%EF%BC%91%EF%BC%96&amp;amp;aq=&amp;amp;sll=35.668306,139.748738&amp;amp;sspn=0.001817,0.002411&amp;amp;brcurrent=3,0x60188b925a11e22b:0xf5511b9e4e7d1bac,0&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%99%8E%E3%83%8E%E9%96%80%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%96%E2%88%92%EF%BC%91%EF%BC%96&amp;amp;ll=35.669099,139.748905&amp;amp;spn=0.003051,0.00456&amp;amp;z=17&amp;amp;output=embed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.co.jp/maps?f=q&amp;amp;source=embed&amp;amp;hl=ja&amp;amp;geocode=&amp;amp;q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%99%8E%E3%83%8E%E9%96%80%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%96%E2%88%92%EF%BC%91%EF%BC%96&amp;amp;aq=&amp;amp;sll=35.668306,139.748738&amp;amp;sspn=0.001817,0.002411&amp;amp;brcurrent=3,0x60188b925a11e22b:0xf5511b9e4e7d1bac,0&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA%E8%99%8E%E3%83%8E%E9%96%80%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%EF%BC%96%E2%88%92%EF%BC%91%EF%BC%96&amp;amp;ll=35.669099,139.748905&amp;amp;spn=0.003051,0.00456&amp;amp;z=17" style="color: blue; text-align: left;"&gt;大きな地図で見る&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-1375771104346248204?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/1375771104346248204/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/backlogaws.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1375771104346248204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/1375771104346248204'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/backlogaws.html' title='明日のBacklogチャンネル・AWSセミナーに会場をお貸しします'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-6426892135760298674</id><published>2011-07-19T15:06:00.012+09:00</published><updated>2011-07-20T09:35:08.993+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ユニットテスト'/><category scheme='http://www.blogger.com/atom/ns#' term='sugimoto'/><title type='text'>ざくっとユニットテスト</title><content type='html'>開発担当のsugimotoです。&lt;br /&gt;今回は弊社サービスであるShanon Marketing Platformの開発で行っているユニットテストについて書いてみたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;いつから？&lt;/li&gt;&lt;br /&gt;恐らく2008年の夏くらいです。&lt;br /&gt;コードレビューを始めた時期と同じくらいだと思います。&lt;br /&gt;その頃はバグが多発していて何とかしないといけないなーと思って始めました。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;どんな感じ？&lt;/li&gt;&lt;br /&gt;Test::Classを使用してXUnitライクに書いています。&lt;br /&gt;テストはクラス単位で行っています。&lt;br /&gt;テスト対象クラス一つに対しテストクラスが一つ、テストクラスを実行するテストスクリプトが一つ存在します。&lt;br /&gt;テストスクリプトをクラス毎に用意しているのは、&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;クラス単位でテストが実行できるようにしたい&lt;/li&gt;&lt;br /&gt;&lt;li&gt;テスト間の影響をできるだけ無くしたい&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;という狙いがあります。&lt;br /&gt;トリッキーなことをすることでやっとテストができるという場合もありますので、どちらかというと後者の狙いの方が大きいです。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-bU5ZsVPdvdQ/TiUkrNX_92I/AAAAAAAAAB4/jHZoqLW5Jy0/s1600/2011-07-19.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 178px;" src="http://3.bp.blogspot.com/-bU5ZsVPdvdQ/TiUkrNX_92I/AAAAAAAAAB4/jHZoqLW5Jy0/s400/2011-07-19.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5630947233839970146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;開発時にはテストスクリプト単体を繰り返し実行していきます。&lt;br /&gt;開発がある程度終わりに近づき他のクラスへのデグレが無いことを確認したり、デイリーでテストする際にはまとめてテストを実行する必要あります。&lt;br /&gt;その場合にはModule::Buildを使用して全てのテストスクリプトをまとめて実行するようにしています。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;使用しているモジュール&lt;/li&gt;&lt;br /&gt;ごくごく一般的なものばかりです。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Test::Class&lt;/li&gt;&lt;br /&gt;XUnitライクにテストを行うためのテストクラスのベースとして使用&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Test::More、Test::Exception等&lt;/li&gt;&lt;br /&gt;各チェックメソッド内でのアサーション。&lt;br /&gt;この辺は&lt;br /&gt;http://www.amazon.co.jp/Perl-Testing-Developers-Notebook/dp/0596100922/ref=sr_1_1?ie=UTF8&amp;amp;qid=1311040508&amp;amp;sr=8-1&lt;br /&gt;が参考になります。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Module::Build&lt;/li&gt;&lt;br /&gt;テストをまとめて実行するために利用&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Devel::Cover&lt;/li&gt;&lt;br /&gt;コードカバレッジの取得&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;メリット・デメリット&lt;/li&gt;&lt;br /&gt;実際にやってみた一番大きなメリットだと思ったのは、クラスのインタフェースがシンプルになる点です。&lt;br /&gt;インタフェースがシンプルじゃないととてもじゃないけどテストが大変なので。&lt;br /&gt;デメリットはやっぱり工数がかかることです。&lt;br /&gt;ただこれは後からテストを作る場合であって、テスト駆動で開発を行えばそんなに増えないかなーって印象です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ユニットテストを始めて3年くらい経ちましたが、現在のコードカバレッジ(命令網羅)は33％ほどです。&lt;br /&gt;もともとアプリケーション自体がフレームワークべったりに書かれていたためにテストコードが書きづらく、当初は新たに追加したクラスをメインにテストコードを書いてました。&lt;br /&gt;現在はソースコードを徐々にフレームワークから切り離して行く過程で、既存のコードにもテストコードを書くようになっています。&lt;br /&gt;6％／半年くらいのペースでカバレッジは上げていきたいのですが、なかなか難しいところです。&lt;br /&gt;&lt;br /&gt;今回はざっくりしすぎた内容でしたね。。。&lt;br /&gt;もうちょっと突っ込んだ話やTipsは次回のネタにでも取っておきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-6426892135760298674?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/6426892135760298674/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/blog-post_19.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6426892135760298674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/6426892135760298674'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/blog-post_19.html' title='ざくっとユニットテスト'/><author><name>sugimoto</name><uri>http://www.blogger.com/profile/17904179713550067005</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-bU5ZsVPdvdQ/TiUkrNX_92I/AAAAAAAAAB4/jHZoqLW5Jy0/s72-c/2011-07-19.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-5842627509380225483</id><published>2011-07-14T12:08:00.013+09:00</published><updated>2011-07-14T12:39:08.482+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='プログラミング'/><category scheme='http://www.blogger.com/atom/ns#' term='要件定義'/><category scheme='http://www.blogger.com/atom/ns#' term='nishino'/><title type='text'>JSが苦手なWebデザイナーに贈る たった２つの克服のコツ</title><content type='html'>シャノン &lt;a href="http://www.blogger.com/profile/15291112813871756041" target="_blank"&gt;nishino&lt;/a&gt; です。&lt;div&gt;最近、わたくし部署異動しまして、テストの人からサポートの人になりました。&lt;br /&gt;なんのサポートかというと、ウチの製品（&lt;a href="http://www.shanon.co.jp/marketingplatform/" target="_blank"&gt;Shanon Marcketing Platform&lt;/a&gt;）を売ってくれる人向けのテクニカルなサポートを行うことになりました。&lt;br /&gt;是非是非よろしくお願いいたします。&lt;br /&gt;&lt;br /&gt;&lt;div&gt;さっそく今回、制作部署向けに JavaScript のお勉強会を実施しましたので、その時に使ったプレゼンテーションを紹介します。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;iframe src="https://docs.google.com/present/embed?id=d9tpj8h_174gtx57qd9" width="410" frameborder="0" height="342"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;h3&gt;JavaScriptを克服するたった２つのコツ？&lt;/h3&gt;&lt;div&gt;今回のプレゼンテーションは技術者向けではなく、制作部署のWebデザイナー向けに作成しました。&lt;br /&gt;なので、以下の人を対象にしています。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HTMLやCSSはなんとなく分かるけど、JavaScriptはやったことない人&lt;/li&gt;&lt;li&gt;過去にJavaScriptに挑戦したけれども、さっぱり分からなくて挫折した人&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;私が提案するコツは以下の２つです。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;いつ・なにを・どうする？&lt;/li&gt;&lt;li&gt;エラーメッセージを読む&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;これだけです。&lt;br /&gt;以下に簡単に解説します。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;コツ１：いつ・なにを・どうする？&lt;/h3&gt;「いつ・なにを・どうする？」といきなり言われても何のことやら、、ですが、これは、JavaScriptの要件を定義するのに必要な３つのことを表しています。&lt;br /&gt;&lt;br /&gt;Web制作を行う際に、クライアントからの要件を制作物に反映させる必要がありますが、この時に要件が明確になっているとは限りません。&lt;br /&gt;「もうちょっとわかりやすくしてよ」&lt;br /&gt;こんな感じで、何か改善して欲しいということは分かりますが、具体的にどうすればいいのかわからない要件が往々にしてあります。&lt;br /&gt;&lt;br /&gt;こういった場合に、「いつ・なにを・どうする？」を明確にすることにより、制作物へ要件を反映させることができます。&lt;br /&gt;たとえば、最初にすべてを画面に表示すると内容が多すぎて分かりにくい場合は、最初（いつ）は詳細（なに）を非表示にしておいて（どうする）、ボタン（なに）をクリックされたら（いつ）詳細（なに）を表示する（どうする）。&lt;br /&gt;といったことです。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;「いつ？」は、初期表示時、イベント時、サブミット（送信）時の３パターン&lt;/h3&gt; jQueryでは、$( function() { ... } ) 内に以下の内容を記載することで、「いつ処理するか？」を指定できます。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;初期表示時を指定する場合は、$( function() { ... } ) 内に特に指定はいりません。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;イベント時（クリックなど）を指定する場合は、$( function() { ... } ) 内に&lt;br /&gt;$("xxx").click( function() {...})&lt;br /&gt;と書きます。&lt;/li&gt;&lt;li&gt;サブミット（送信）時を指定する場合は、$( function() { ... } ) 内に&lt;br /&gt;$("form").submit( function() {...})&lt;br /&gt;と書きます。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;厳密には「初期表示時」も「サブミット時」もイベントですが、要件を詰めるうえで時系列に上記３つのパターンで考えるのが実用的です。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;「なにを？」は、jQueryのCSSセレクタで指定&lt;/h3&gt;  jQueryでは、HTML内の「なんの要素？」を指定する方法としてCSSセレクタを使用できます。&lt;br /&gt;よく使うCSSセレクタとして以下を紹介しました。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;.class　（指定したclass名がある要素を指定します）&lt;/li&gt;&lt;li&gt;#id　（指定したid名がある要素を指定します）&lt;/li&gt;&lt;li&gt;ko mago　（指定した子（ko）孫（mago）要素で構成される要素を指定します）&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;「どうする？」は、jQueryに用意されているメソッドを組合せ&lt;/h3&gt;   jQueryでは、上記で指定した要素に対して「どう処理する？」を指定するためのメソッドが用意されています。&lt;br /&gt;よく使うメソッドとして以下を紹介しました。&lt;br /&gt;&lt;ul&gt;&lt;li&gt;hide() …非表示にします&lt;/li&gt;&lt;li&gt;show() …表示します&lt;/li&gt;&lt;li&gt;val(値)…valueの値を設定します&lt;/li&gt;&lt;li&gt;css(プロパティ, スタイル)…プロパティにスタイルを設定します&lt;/li&gt;&lt;li&gt;attr(キー, 値)…キーに値を設定します&lt;/li&gt;&lt;li&gt;addClass(クラス名)…classにクラス名を追加します&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;コツ２：エラーメッセージを読む&lt;/h3&gt;どんなに経験豊富なプログラマーでも常にエラーを発生させずにコードを書くことは不可能です。&lt;br /&gt;ブラウザにはJavaScriptのエラーメッセージを表示させる機能がありますので、このエラーメッセージを読むことにより、誤りに気づき、正しいコードに修正することができます。&lt;br /&gt;&lt;br /&gt;時には全く意味不明なエラーメッセージを読まされることもありますが、alert()関数を使って何度もエラーの箇所を繰り返し調べるうちに、きっとJavaScriptを克服している自分に気づくことでしょう。&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;まとめ&lt;/h3&gt;今回、JavaScriptの入門的な内容として、要件定義のための&lt;span style="font-weight: bold;"&gt;「いつ・なにを・どうする？」&lt;/span&gt;。&lt;br /&gt;また、制作を完成させるための&lt;span style="font-weight: bold;"&gt;「エラーメッセージを読む」&lt;/span&gt;をコツとして紹介させていただきました。&lt;br /&gt;&lt;br /&gt;実践的なJavaScriptを書けるようになるまでには、今回紹介したjQuery以外のライブラリを使用したり、画面遷移を伴わないajaxといった技術が必要になるかもしれませんが、考え方として上記の２つのコツは有効だと思います。&lt;br /&gt;&lt;br /&gt;がんばろー&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-5842627509380225483?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/5842627509380225483/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/jsweb.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5842627509380225483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/5842627509380225483'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/jsweb.html' title='JSが苦手なWebデザイナーに贈る たった２つの克服のコツ'/><author><name>nishino</name><uri>http://www.blogger.com/profile/15291112813871756041</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3226305486721904055</id><published>2011-07-06T12:55:00.001+09:00</published><updated>2011-07-06T17:58:05.621+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mod_rewite'/><category scheme='http://www.blogger.com/atom/ns#' term='SSL'/><category scheme='http://www.blogger.com/atom/ns#' term='ガラケー'/><category scheme='http://www.blogger.com/atom/ns#' term='fujya.sh'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>mod_rewriteでauガラケーのSSL対応しようとしたら見事にハマった件について</title><content type='html'>お久しぶりでございます、インフラ担当のfujya.shです。&lt;br /&gt;&lt;div&gt;最近暑いですね、ホント嫌になっちゃいます。最近はプライベートでIX2015を2台貰ったので、ちょっと遊んでみようかと思っております。&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-__Z-rDEgH04/ThPaaczsx2I/AAAAAAAAACU/Snnja0FEDvc/s1600/IX2015.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-__Z-rDEgH04/ThPaaczsx2I/AAAAAAAAACU/Snnja0FEDvc/s320/IX2015.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5626080507460372322" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 200px; height: 92px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:2px"&gt;IPsec 高速化拡張ソフトウェアセット入れるとIPsecが爆速になるという噂のIX2015たん。&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;とある事から「ガラケーからSSLのサイト見れるよーにしてくれない？」という話が来まして、軽い気持ちで対応しようとしたら様々な障壁があり、大変だったので今回は解決までの道のりを紹介しようかと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;■auガラケーはRequestHeaderのHostに:443付けてリクエストしてくる輩がいる&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;auの一部ガラケーではhttps://～のサイトを閲覧する際に、リクエストヘッダのHostの末尾に:443をつけてアクセスしてくる事があります。（手元の検証端末W63CAではついてきました）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;こんなアクセスログが入ってきます（HTTP_HOSTがexample.com:443になっちゃってる）&lt;/div&gt;&lt;div&gt;&lt;pre style="font-size:medium;border:1px solid #aaa;background:#eee;padding:0.5em; overflow: auto;"&gt;10.8.15.100 - - [29/May/2011:17:48:30 +0900] "GET /path/to/sample/test?lang=ja&lt;br /&gt;HTTP/1.1" 200 2547 "&lt;referrer&gt;" "KDDI-CA3C UP.Browser/6.2_7.2.7.1.K.2.232 (GUI) MMP/2.0"&lt;br /&gt;281408 &lt;span style="color:red"&gt;example.com:443&lt;/span&gt;&lt;br /&gt;&lt;/referrer&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これでは環境変数の %{HTTP_HOST} が :443 付いてしまうので、アプリケーションが%{HTTP_HOST} を利用している箇所がある場合は正常に動作しない可能性があります。mod_rewriteで %{HTTP_HOST} が ^.*:443$ にマッチした場合に&lt;/div&gt;&lt;div&gt;%{HTTP_HOST} から :443 を消し去る処理を施してあげる必要がありそうです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;それではmod_rewriteで ${HTTP_HOST} を書き換えてみましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;■mod_rewriteで%{HTTP_HOST}の書換ができない&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;さっそくmod_rewriteでRewriteCondとRewriteRuleを書いてみましょう。&lt;/div&gt;&lt;div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;RewriteCond %{HTTP_HOST} ^(.*):443$&lt;br /&gt;RewriteRule .* - [E=HTTP_HOST:%1]&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;これで%{HTTP_HOST}が:443抜きのものに書き換わっているハズです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;確認作業に入ります。&lt;/div&gt;&lt;div&gt;Apacheのコンフィグに下記コンフィグを追加してHTTP_HOSTの状態を確認してみましょう。&lt;/div&gt;&lt;div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;CustomLog logs/env_log "%t %h HTTP_HOST=%{HTTP_HOST}e"&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;configtestして、SyntaxがOKならrestart||gracefulします。そしてアクセスしてenv_logを見てみましょう。&lt;/div&gt;&lt;br /&gt;&lt;pre style="font-size:medium;border:1px solid #aaa;background:#eee;padding:0.5em; overflow: auto;"&gt;[1/Apr/2011:12:00:00 +0900] 10.8.15.100 HTTP_HOST=&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;example.com:443&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;%{HTTP_HOST}がexample.com:443のままです。何故でしょうか？？&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://httpd.apache.org/docs/2.0/ja/env.html"&gt;Apacheの環境変数に関するドキュメントを読んでみると&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;「環境を操作するディレクティブを使って標準CGI変数を上書きしたり変更したりすることはできません。」&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;と書いてありました。&lt;/div&gt;&lt;div&gt;標準CGI変数とは何かとさらに調べてみると&lt;a href="http://www.ietf.org/rfc/rfc3875.txt"&gt;RFC3875&lt;/a&gt;で定義されているCGIが利用するメタ変数の事だそうです。つまり、標準的な環境変数は書換が出来ないという事になります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;■%{X_HTTP_HOST}を宣言してしまう方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;回避策として複数ありますが今回は別途、独自環境を宣言し回避することにしました。&lt;/div&gt;&lt;div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;RewriteCond %{HTTP_HOST} !^(.*):443$&lt;br /&gt;RewriteRule .* - [E=X_HTTP_HOST:%{HTTP_HOST}e]&lt;br /&gt;RewriteCond %{HTTP_HOST} ^(.*):443$&lt;br /&gt;RewriteRule .* - [E=X_HTTP_HOST:%1]&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;%{HTTP_HOST}の末尾に:443がついていてもついていなくても、&lt;/div&gt;&lt;div&gt;%{X_HTTP_HOST}という独自環境変数に:443抜きのモノが入るように宣言しています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;それでは早速確認してみましょう。先程のenv_logのコンフィグを下記の通り修正します。&lt;/div&gt;&lt;div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;CustomLog logs/env_log "%t %h X_HTTP_HOST=%{X_HTTP_HOST}e"&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;コンフィグを変更したら必ずconfigtestしてからrestart||gracefulです。OKが返ってきたらアクセスしてみましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre style="font-size:medium;border:1px solid #aaa;background:#eee;padding:0.5em; overflow: auto;"&gt;[1/Apr/2011:12:15:31 +0900] 10.8.15.100 X_HTTP_HOST=&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;example.com&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;:443がついていない%{X_HTTP_HOST}という環境変数が生成されていることが確認できました。&lt;/div&gt;&lt;div&gt;後はアプリケーション側で%{HTTP_HOST} -&amp;gt; %{X_HTTP_HOST}に切り替えてもらう作業をする事で無事解決といった形になります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;■番外編１：mod_rewriteで独自の環境変数を利用する場合はご注意を&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;mod_rewriteのRewriteCond/RewriteRuleで使用する環境変数は限定されています。mod_rewriteで独自の環境変数を利用するときは%{ENV:環境変数}で宣言しないといけません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="border-left: 5px solid #99C8FC; width: 100%;"&gt;#例えば%{X_HTTP_HOST}をパスの先頭に入れる場合は&lt;br /&gt;RewriteCond %{HTTP_HOST} !^(.*):443$&lt;br /&gt;RewriteRule .* - [E=X_HTTP_HOST:%{HTTP_HOST}]&lt;br /&gt;RewriteRule ^/path/to/ /%{ENV:X_HTTP_HOST}e/path/to/&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;普通に%{X_HTTP_HOST}eでrewriteしようとしてもできないので、ENV:を付けてあげましょう。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;■&lt;/span&gt;番外編２&lt;span class="Apple-style-span"&gt;：ガラケーのSSL対応状況にご注意を&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ガラケーにインストールされているルート証明書に関しては端末ごと・発売時期によって全然対応状況が変わってきます。&lt;/div&gt;&lt;div&gt;各証明局で携帯電話のSSL対応状況が書いてあるので、ガラケー対応する場合には確認が必要です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://www.verisign.co.jp/ssl/about/mobile_list.html"&gt;&lt;span class="Apple-style-span"&gt;ベリサイン&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://jp.globalsign.com/support/index.php?action=artikel&amp;amp;cat=9&amp;amp;id=54&amp;amp;artlang=ja"&gt;グローバルサイ&lt;/a&gt;&lt;a href="http://jp.globalsign.com/support/index.php?action=artikel&amp;amp;cat=9&amp;amp;id=54&amp;amp;artlang=ja"&gt;ン&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;a href="http://www.secomtrust.net/service/ninsyo/mobile_SSL.html"&gt;セコム&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="https://www.cybertrust.ne.jp/ssl/mobile.html"&gt;&lt;span class="Apple-style-span"&gt;サイバートラスト&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;手元の検証端末と検証用サイトのSSLが対応して無く（au W63CA × グローバルサイン）アクセスすることすらできず、検証するのにとても手こずりました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;■まとめ：ガラケェ・・・&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;とにかくガラケーは文字コード・SSL周り・HTML対応状況・独自仕様等々の制約が山のようにあり、全ての端末に対応させようと思ったら気が遠くなるほど時間と労力が必要だと体感しました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;他の国がどうなのか分かりませんが、ガラケーの独特の仕様に対応するための時間って凄い無駄なワケで、こういったモノが氾濫してる日本は国家レベルでの競争力低下につながってるんじゃないかと。&lt;/div&gt;&lt;div&gt;良いモノ作りたい人がこういうった制約が足かせになって、機能開発などに時間が使えないのは不幸だと思うわけです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;もし、この記事を呼んで「参考になった！」と思ってくれる人が居て、ガラケー対応の為の時間が省けて良いものを作る時間に1秒でも多く費やしてもらえたら幸いです。&lt;/div&gt;&lt;div&gt;ガラケーはホビロン！！！&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-3226305486721904055?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/3226305486721904055/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/modrewriteaussl.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3226305486721904055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/3226305486721904055'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/modrewriteaussl.html' title='mod_rewriteでauガラケーのSSL対応しようとしたら見事にハマった件について'/><author><name>fujya.sh</name><uri>http://www.blogger.com/profile/03776400533753064010</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-__Z-rDEgH04/ThPaaczsx2I/AAAAAAAAACU/Snnja0FEDvc/s72-c/IX2015.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-4058033583088798714</id><published>2011-07-02T22:45:00.016+09:00</published><updated>2011-07-04T11:28:11.654+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='chappie'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='開発プロセス'/><title type='text'>マンネリ化したスクラムをアナログ回帰でテコ入れするの巻</title><content type='html'>&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;/span&gt;  &lt;p class="p1"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;こんにちわ、&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt; &lt;a href="http://www.blogger.com/profile/07308803140601522333"&gt;chappie&lt;/a&gt; です。&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;先日、&lt;a href="http://shanon-tech.blogspot.com/2011/06/blog-post_27.html"&gt;kmt によるエントリー&lt;/a&gt;もありましたが、私も 6/24 に開催されたスクラム道バーストにいってきました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;あまり他社さんがスクラムをどのように実践しているかといったことを知る機会は少ないので、とても刺激になりました。今回のイベントは、壇上に上がってしゃべる人を「選手」、議論を傍聴する人を「観客」として分け、立場に応じた「距離感」で参加できることで敷居を下げていたのがよかったです。私も今回はじめての参加だったので、「とりあえず観客で」といった感じで、見学させていただきました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p2"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p1"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;イベントの雰囲気は&lt;/span&gt;&lt;/p&gt; &lt;p class="p3"&gt;&lt;span class="s1"  style="font-size:100%;"&gt;&lt;a href="http://togetter.com/li/153684"&gt;&lt;span class="Apple-style-span"&gt;Togetter - 「&lt;b&gt;スクラム道バースト&lt;/b&gt;」&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p4"&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.facebook.com/TaoOfScrum"&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;スクラム道&lt;/b&gt;&lt;span class="s1"&gt; | Facebook&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;などから感じていただくとして、当日あった議論とはあんまり関係ないですが、このエントリーでは私が今いるチームでの取り組みとして、アナログ回帰による改善のはなしを紹介したいと思います。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-weight: bold;" class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;私達のチームでの問題&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;今のチームは、かれこれ半年以上、だいたい同じメンバーで開発に取り組んでいました。１ヶ月を１スプリントとして、&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;月のはじめに計画ミーティング＆見積り&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;日々のスタンドアップミーティング&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;週次での成果物レビュー&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;月末でのスプリントレビュー＆デモ&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;    &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;など、基本的にスクラムのプロセスにのっとって活動し、月ごとの成果もそれなりには出ていました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;ただ、以下のような問題がありました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;毎月、いまいち当初の予定(見積り)よりも完了できるストーリーの量が少ない&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;そのため、中長期的にみるとプロジェクト期間がどんどん伸びていく&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;しかもいまいち原因がよく分からない&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;遊んでるわけではなさそうだけど、デイリーの進捗がいまいちお互いによく分からない&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;    &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-weight: bold;" class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;アナログ回帰&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;当然、原因はいろいろあって単純ではないのですが、まずは日々何が起きているのか認識＆共有ができていないとはじまりません。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;そこで今回、スクラムをはじめた当初やりかけたけどやめてしまっていたアナログ版タスクボードを復活させました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="p6"&gt;&lt;a href="http://4.bp.blogspot.com/-2_w8Uavdu10/Tg8og6xHVgI/AAAAAAAAACE/ULeg_QP0LFo/s1600/taskboard_20110614.JPG"&gt;&lt;img style="cursor: pointer; width: 399px; height: 298px;" src="http://4.bp.blogspot.com/-2_w8Uavdu10/Tg8og6xHVgI/AAAAAAAAACE/ULeg_QP0LFo/s400/taskboard_20110614.JPG" alt="" id="BLOGGER_PHOTO_ID_5624759005605221890" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;月初の見積りの段階から、今月のストーリーも、前月の積み残しも、その時点で対応することが決まっているバグも、すべて付箋に書き出し、見積り後はそのままホワイトボードに貼りつけました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);font-size:100%;" &gt;&lt;b&gt;未着手 ＞ 処理中 ＞ Done！&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;右側にストーリーやバグやタスクなどが概ね優先度順に並んでいて、開発/QA が処理中のものが真ん中に移動してきて、終わったものは右側に移動させます。基本的に、スクラムで説明される一般的なタスクボードのフォーマットを踏襲しています。右側の Done のところがカレンダーになってて、終わった日付に終わったタスクを貼ってるとこが若干オリジナルでしょうか。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);font-size:100%;" &gt;付箋のサイズと色&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;大きいサイズの付箋はストーリーなど基本的に見積り対象となる粒度の項目で、小さいものがその中でのタスクといった感じになってます。ポイントの小さいものは大きい付箋がそのままタスクになってたりします。また、オレンジはビジネスアナリスト(的役割の人)からの懸念事項や、ピンクが臨時、緊急のものといった感じで、なんとなくルールができていきつつあります。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;あまりこのあたりは厳格なルールは強いてなくて、忘れないようにしたいことや、進捗を示すためにタスク用付箋をはったりしてます。スクラム道バーストでも「適切なタスクのサイズとは？」みたいな議論があり、どなかが「スタンドアップミーティングで話す１項目が大体１タスクと思っていい」といったことをおっしゃってたと思いますが、我々のタスクボードでも実際そうなっているので同感です。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);font-size:100%;" &gt;&lt;b&gt;日々の記録とバーンダウンチャート&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;タスクボードの状況は一応、撮影して残すようにしています。また、バーンダウンチャートは単純に貼る場所がなかったので、ポイントを Google Docs のスプレッドシートに記録して、こちらはデジタルで見られるようにしています。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;a href="http://4.bp.blogspot.com/-RDynIAkl6F8/Tg8q-vj4qEI/AAAAAAAAACc/oKm5Xo5r8ZA/s1600/WS000061.JPG"&gt;&lt;img style="cursor: pointer; width: 400px; height: 261px;" src="http://4.bp.blogspot.com/-RDynIAkl6F8/Tg8q-vj4qEI/AAAAAAAAACc/oKm5Xo5r8ZA/s400/WS000061.JPG" alt="" id="BLOGGER_PHOTO_ID_5624761717016275010" border="0" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-Iv7ZxdLBRrk/Tg8rFqRhFPI/AAAAAAAAACk/1D1nsDjr7LI/s1600/WS000062.JPG"&gt;&lt;img style="cursor: pointer; width: 400px; height: 284px;" src="http://1.bp.blogspot.com/-Iv7ZxdLBRrk/Tg8rFqRhFPI/AAAAAAAAACk/1D1nsDjr7LI/s400/WS000062.JPG" alt="" id="BLOGGER_PHOTO_ID_5624761835856139506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="font-weight: bold;" class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;タスクボードの動き&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;ちなみに、月毎のタスクボードをアニメーションにしてみるとこんな感じです。&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;、、、と思ったら アニメーションGIFがアップできない。。。何故。&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;しょうがないので、外部サイトにとりあえずアップ。(後で変えるかもしれません)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;a href="http://photozou.jp/photo/show/311054/87396048"&gt;&lt;img src="http://art12.photozou.jp/pub/54/311054/photo/87396048.gif" alt="20110701-172151-71800800_500m" style="border: 0pt none;" height="298" width="399" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://photozou.jp/photo/show/311054/87396048"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://photozou.jp/user/top/311054"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;a href="http://photozou.jp/photo/show/311054/87396280"&gt;&lt;img src="http://art45.photozou.jp/pub/54/311054/photo/87396280.gif" alt="20110701-170933-52052900_500m" style="border: 0pt none;" height="298" width="399" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;なんとなく、チームのダイナミズムが見えるような気がしますかね？&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;かなーり雑然としているあたり、チームの性格が出てるようです。。。&lt;/span&gt;&lt;/p&gt;  &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;あと、ホワイトボードがあんまりホワイトじゃなくて汚くみえるのは予算がなくてお下がりのホワイトボードしかもらえなかったからです。。。広くて大きいホワイトボードほしい！むしろ、壁全体ホワイトボードにしたい！内装とか別におしゃれじゃなくてもいいから！&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-weight: bold;" class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;従来との違い&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;・・・閑話休題。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;従来、スタンドアップミーティングは大体毎日やっていたのですが、特に何も見ずに、各人が口頭でやったこと、やることをなんとなく話してふわふわっと終了してました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;タスク管理には以前からヌーラボさんのバックログを使っていて、これはこれで素晴らしいツールなのですが、個々人が自分のタスクを管理するためだけのツールになっていました。これはおそらく使い方の問題で、スプリントのはじめにだれが何やるってが割り振ってしまい、自分で自分の範囲のタスクを洗いだして登録し、あとは自分が「担当者」のタスクしか見なくなっていました。&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;チーム全体の状況を俯瞰するにはタスクレベルだと見づらいし、バーンダウンチャートでは大まかすぎて、結果、スタンドアップミーティングで見ることもありませんでした。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;この、「何も見るものがないスタンドアップミーティング」が日々の進捗が分かりにくい原因のひとつだったと思います。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;タスクボードを使うようになってからは、各メンバーがここの付箋を移動させながらやったこと、やることを話すようになりました。処理中のものと同時に、当月で何が残っているかも見えるので、デイリーの情報とスプリントの情報がいっぺんに見られます。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;懸念事項もとりあえずはここに貼るので、「そういやあの問題ってどうなったんだっけ？」って気づいたら誰も何も対応してなかった、みたいなことも極力減らせます。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="font-weight: bold;" class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;まとめ的なもの&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;アナログ版タスクボードを使い始めてから２ヶ月＝２スプリントほど経過しましたが、個人的には&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;チームとしてタスクに向きあう姿勢がでてきた&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;消化できるストーリーポイント数への意識が高まった&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;残タスクや臨時タスクをなるべく減らしたり、コントロール可能にしようとする議論ができるようになってきた&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;といった効果を感じています。&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;チームとして改善サイクルを回していかなければアジャイル開発プロセスの良い点は発揮されません。まだまだ課題も多いですが、その解決に向けた足がかりができたのは大きな前進だと思っています。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:100%;"&gt;タスク管理ツールは使ってるけど、なんとなくチームとして問題に取り組んでる感がなくなってきたり、スプリントを繰り返すうちに締まりが悪くなってきたりしてる、、、と感じたときは、原点に帰るつもりでアナログ回帰し、手触りのあるツールを介したコミュニケーションで活性化することもあるので、オススメです。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:85%;"&gt;■■■&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;余談1&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span style="font-size:85%;"&gt;ちなみに、バーンダウンチャートの中盤でグッと残時間が減ってる点は、弊社のリリースプロセスが反映されています。現在のプロセスでは基本的に、当月開発したものを翌月の第４週にリリースするようになっています。これは主に、ユーザや事業部へのアナウンスおよび調整のための期間が必要なためです。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span style="font-size:85%;"&gt;そうすると、大体のところは当月中に開発するのですが、細かいテストや統合レベルのテストや自動テストの作成など、終盤になりがちなタスクが次の月にずれ込むことで「負債」となってしまいます。にもかかわらず、月初には新しいストーリーの見積りを立てて次のスプリントがはじまります。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span style="font-size:85%;"&gt;このあたりのギャップと、その存在と大きさがはっきり見えていないことが、なんとなく締まりの悪さ、１ヶ月のスケジュールの見通しの立てにくさにつながっていたんだろうと思われます。このあたりもバーンダウンとタスクボードの進捗具合で見える化＆共有されてきたので、今後のプロセス改善に活かしていきたいところです。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span class="Apple-style-span"  style="font-size:130%;"&gt;余談2&lt;/span&gt;&lt;/p&gt; &lt;p class="p5"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p5"&gt;&lt;span style="font-size:85%;"&gt;実は、付箋のサイズの区別は意図したものではなくて、ふつうのサイズの10セット入りと思って頼んだら小さいサイズだったという &lt;span style="font-weight: bold;"&gt;7500円の誤発注&lt;/span&gt; によって導入されたものでした。&lt;/span&gt;&lt;/p&gt; &lt;p class="p6"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-4058033583088798714?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/4058033583088798714/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4058033583088798714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/4058033583088798714'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/blog-post.html' title='マンネリ化したスクラムをアナログ回帰でテコ入れするの巻'/><author><name>chappie</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/-2qD6qWCmFwk/TaP-Hb-y8wI/AAAAAAAAABY/PmW3BCwhqJw/s220/chappie_icon.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2_w8Uavdu10/Tg8og6xHVgI/AAAAAAAAACE/ULeg_QP0LFo/s72-c/taskboard_20110614.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-2212968681951985054</id><published>2011-07-01T15:58:00.001+09:00</published><updated>2011-07-01T16:01:10.712+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='レポート'/><category scheme='http://www.blogger.com/atom/ns#' term='勉強会'/><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='ikeike443'/><title type='text'>Shibuya.tracの第12回勉強会 チケット管理システム大決戦第二弾　に登壇させていただきました</title><content type='html'>&lt;a href="http://twitter.com/ikeike443"&gt;ikeike443&lt;/a&gt;です。&lt;br /&gt;&lt;br /&gt;昨日、6月30日に行われました、「&lt;a href="http://sourceforge.jp/projects/shibuya-trac/wiki/meeting%2F17"&gt;Shibuya.tracの第12回勉強会 チケット管理システム大決戦第二弾&lt;/a&gt;」に、パネラーとしてお声がけいただき、登壇させていただきました。&lt;br /&gt;&lt;br /&gt;このイベントは、チケット管理ツールであるTracおよびチケット駆動開発を推進するコミュニティであるShibuya.tracさんの第12回勉強会として、Trac,Redmine,JIRA,Backlogの4つのチケット管理ツールについての&lt;strike&gt;Disりあい&lt;/strike&gt;、パネルディスカッションとして開催されました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;僭越ながら私は、Backlogユーザー代表として、ヌーラボの&lt;a href="http://twitter.com/ikikko"&gt;@ikikko&lt;/a&gt;さんと共に登壇させていただきました。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;当日の資料は下記になります。登壇者8名の合作となっています。&lt;br /&gt;&lt;br /&gt;Backlogの部分では、弊社シャノンの開発プロセスなども記載させていただいています。&lt;br /&gt;実際のところどうやってスクラムを実施しているか、よく分かる資料になっていると思います！&lt;br /&gt;&lt;br /&gt;&lt;div id="__ss_8474304" style="width: 425px;"&gt;&lt;b style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/Ryuzee/ss-8474304" target="_blank" title="チケット管理システム大決戦第二弾"&gt;チケット管理システム大決戦第二弾&lt;/a&gt;&lt;/b&gt; &lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/8474304" width="425"&gt;&lt;/iframe&gt; &lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/Ryuzee" target="_blank"&gt;Ryuzee YOSHIBA&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;尚、既に様々な方がブログにて言及してくださっていますので、勉強会全体の内容についてはそちらをご参照ください！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="list-style-position: inside; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://togetter.com/li/156024" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;Togetter「2011/06/30_Shibuya.trac 第12回勉強会 #shibutra」&lt;/a&gt;&lt;/li&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://d.hatena.ne.jp/kaorun55/20110630/1309451579" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;Shibuya.trac 第12回勉強会 〜 チケット管理システム大決戦　第二弾 〜 に行ってきました #shibutra&lt;/a&gt;&lt;/li&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://d.hatena.ne.jp/shinyaa31/20110630/1309457849" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;Shibuya.trac 第12回勉強会『～ チケット管理システム大決戦　第二弾 ～』に参加してきた – Shinya’s Dairy Report&lt;/a&gt;&lt;/li&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://d.hatena.ne.jp/banana-umai/20110630/1309458227" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;チケット管理システムの頂上決戦！？ – Shibuya.trac第12回勉強会に参加してきました&lt;/a&gt;&lt;/li&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://mikeneck.blogspot.com/2011/07/shibuyatrac-12.html" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;Shibuya.trac 第12回勉強会　【通常枠】に参加してきました。&lt;/a&gt;&lt;/li&gt;&lt;li style="line-height: 1.5em; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; padding-top: 2px;"&gt;&lt;a href="http://diary.tachibanakikaku.com/2011/07/shibuyatrac-12.html" style="color: #227db2; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" target="_blank"&gt;チケット管理システム大決戦観戦記&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;「Backlogは チケット管理システムの自由民権運動だ！」&lt;/b&gt;&lt;/span&gt;というフレーズを決めてきましたので、私としては役割を果たせたのかな、と思います！！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/988385995704066370-2212968681951985054?l=shanon-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://shanon-tech.blogspot.com/feeds/2212968681951985054/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/shibuyatrac12.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2212968681951985054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/988385995704066370/posts/default/2212968681951985054'/><link rel='alternate' type='text/html' href='http://shanon-tech.blogspot.com/2011/07/shibuyatrac12.html' title='Shibuya.tracの第12回勉強会 チケット管理システム大決戦第二弾　に登壇させていただきました'/><author><name>ikeike443</name><uri>http://www.blogger.com/profile/02384187511937952106</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_P6tEWvjzMeE/TS2DGnQ6gMI/AAAAAAAAAA4/nEgthycW3Ek/S220/ikeikephoto.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-988385995704066370.post-3112878336907188116</id><published>2011-06-27T09:57:00.002+09:00</published><updated>2011-06-27T10:07:45.975+09:00</updated><title type='text'>スクラム道バーストにいってきました</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-family:'MS PGothic';font-size:medium;"  &gt;&lt;span class="Apple-style-span" style=";font-family:arial;font-size:small;"  &gt;&lt;div&gt;スクラム道バーストに観客として弊社のマスコットエンジニアの&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;font-family:'MS PGothic';font-size:medium;"  &gt;&lt;span class="Apple-style-span" style="color: rgb(102, 102, 102); line-height: 18px;font-family:'Trebuchet MS',Trebuchet,Verdana,sans-serif;font-size:13px;"  &gt;&lt;a href="http://www.blogger.com/profile/07308803140601522333" style="text-decoration: none; color: rgb(34, 136, 187);"&gt;&lt;span style="font-size:large;"&gt;chappie&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;といってきました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;スクラム道って何かというと「&lt;span style="line-height: 20px;font-family:arial,sans-serif;" &gt;Scrumを中心にアジャイルを探究するための場&lt;/span&gt;」で、&lt;/div&gt;&lt;div&gt;今までに何回か開催されてきましたが毎回すぐに定員がいっぱいになっちゃう人気の勉強会です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回のスクラム道バーストは、全員が選手ではなくて、選手（話す人）と観客（観る人）にわかれての形式になっており、いままでと違った形でより多くの人が参加できるように工夫されていました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;予断ですが、、、&lt;br /&gt;&lt;br /&gt;会場の&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.bandainamcogames.co.jp/corporate/directory/headquarter.php" target="_blank" style="text-decoration: none; color: rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0);"&gt;バンダイナムコ未来研究所&lt;/a&gt;&lt;/span&gt;さんのホールはものすごーく素敵で椅子の座り心地にうっとりしたりガンダムがいて興奮したりしてそれだけでも楽しかったです。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;閑話休題&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;まず最初に、いままでの勉強会の中でやってきたお題の中で今回話し合う内容を挙手で観客の皆で選びました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;お題は、&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1.振り返り&lt;/div&gt;&lt;div&gt;2.バーンダウンチャート&lt;/div&gt;&lt;div&gt;3.スプリント計画MTG&lt;/div&gt;&lt;div&gt;4.スクラムマスター&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;の4つで皆どれもおなじ位興味があったようで分散していましたが、結局　3.スプリント計画MTG　に決定して&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;読み手の@miholovesqさんが発表をしてくださいました。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;後日資料がアップされるのでここでは割愛させてもらいますが、&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;自分のところは、&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;スプリント計画MTGにこれくらいの時間をかけているよとか&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;font-size:13px;"  &gt;こんなスプリント計画MTGは困ったよとか&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;具体的なお話がきけておもしろかったです。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;次に選手の皆さんがディスカッションを行いました。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;最初は緊張されていた選手の皆さんも具体的な質問や回答がでると、&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;「あ、うちではこうです、、、」&lt;br /&gt;&lt;br /&gt;とか&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;「なんでそんな風になるんですか？」&lt;br /&gt;&lt;br /&gt;とか&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;よりリアルな現場の声がきけてよかったです。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;自分も、同僚のちゃっぴぃに、「&lt;/span&gt;&lt;/span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;font-family:Verdana,Osaka,sans-serif;" &gt;あ、これはうちではこうだよね」とか、「うちは違うなあ」とかぶつぶついいながら観客として楽しませてもらいました。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;うちとディスカッションで違った部分をいくつかピックアップすると&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span style="letter-spacing: 1px; line-height: 15px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div st
