<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>ゆーすけべー日記</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/" />
    <link rel="self" type="application/atom+xml" href="http://yusukebe.com/atom.xml" />
    <id>tag:yusukebe.com,2011-10-18://2</id>
    <updated>2012-05-07T11:36:56Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.12</generator>

<entry>
    <title>実装までにする7つの企画作業</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120507/202346.html" />
    <id>tag:yusukebe.com,2012://2.10071</id>

    <published>2012-05-07T11:23:46Z</published>
    <updated>2012-05-07T11:36:56Z</updated>

    <summary>メルマガ「ゆーすけべーラジオ」にてWebサービス/アプリをつくるにあたっての僕な...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Column" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p><a href="http://www.mag2.com/m/0001426750.html">メルマガ「ゆーすけべーラジオ」</a>にてWebサービス/アプリをつくるにあたっての僕なりのエッセイを連載中です。先週は実装前に行う企画作業についてまとめてみたのですが、評判がいいので、折角ですしBlogで公開させていただきます。特に複数名でのものづくりに参考にしてみてください！</p>

<hr />

<p><br /></p>

<h3>実装までにする7つの企画作業</h3>

<p>何度か述べている通り、Webサービスにおいて「何を」つくるかは最も重要なことであり、いくら崇高な技術を持っていても「何を」つくるかによって、その技術が生きるか死ぬかが決まってきます。何をつくるかをしっかり決めることにより、実際に本番用のコードを書く実装の段階にも確信が持てますし、リリースした際のフィードバックも活きてくるでしょう。世の中でよく使われているサービスやアプリを見るとアイデアに富んだ今まで無かったと言われるような「何」がしっかりとしたものが多いと思います。</p>

<p>こうしたサービスの企画をつくるに当たっては各自の流儀に負うところが多く、世に言う企画書の書き方が十人十色のように、何を持って企画とするかも人それぞれです。また、各々のやり方といっても「企画」というものをうまく定型化できずに、頭の中でぼんやりと抱いているものを企画としてしまっているケースが多いかもしれません。特に複数人によるチームで企画を決める時に、皆がそのような意識であると企画をつめるに当たって「何を決めればいいのか？」が明確化されずに何となく実装に入ってしまうことも多々あります。ものづくりをしていて、自分（達）はいったい何がつくりたかったのか？と路頭に迷うことは最悪のケースです。</p>

<p>今回は、いまいち定型化しずらいとされている企画のつくり方をいくつかの段階に分けて解説していきます。これらは僕がデザイン思考で著名な奥出直人氏の研究会で長年学んだことや東大MOTで有名な宮田秀明氏の書籍「仕事のやり方間違えてます」に記載されていた事柄をまとめた結果でもあります。まず、企画と僕が言っているものには以下7つの項目を決めることです。</p>

<ol>
<li>哲学</li>
<li>アイデア</li>
<li>テーマ</li>
<li>コンセプト</li>
<li>名前</li>
<li>デザイン</li>
<li>内部設計</li>
</ol>

<p><img src="http://farm8.staticflickr.com/7189/7152069083_385bacab66.jpg" alt="実装までの企画作業" title="" /></p>

<p>それでは一つ一つ見ていきましょう。</p>

<hr />

<p><br /></p>

<h4>1. 哲学</h4>

<p>個々人が持っている特定の興味に関する揺るがない気持ちのことです。サービスやアプリをつくる原動力の根底になります。</p>

<p>例えば、今ではiPhoneなどのスマートフォンに取って代わってしまっているかもしれませんが、よいプロダクトの例としてAppleのiPodを挙げて行きましょう。iPodを開発した人のおそらく根底にあるのは「音楽をもっと楽しみたい」という揺るがない気持ちです。そこに「なぜ音楽を楽しむ必要があるのか？」といった問いに対する理論的な理由は存在しなくてよいのです。「『音楽が好きだから』もっと身近にいつでも楽しめていいじゃないか」と反論できればいいです。各々の日々の生活から得られる「音楽が好き」といった強い気持ちが哲学として反映されるのです。</p>

<p>企画を考えていく上で後述するアイデアやコンセプトの部分は右往左往するかもしれませんが、哲学の部分は決して変わらないように日々興味のあることをピックアップしていけばよいでしょう。そして、それを一言で言い表すとよりよいです。</p>

<h4>2. アイデア</h4>

<p>哲学を叶えるための個別具体的なアイデアです。一つのサービスやアプリ、プロダクトに対してたくさんのアイデアがあってよいでしょう。</p>

<p>「これが欲しい」という哲学から発想していくと細かいアイデアがいくつか浮かんでくると思います。例えば、iPodの場合を考えてみましょう。いくつかアイデアと思われるものを汲み取ることができます。</p>

<ul>
<li>所有している曲全てを持ち歩ける</li>
<li>ディスプレイとコントローラだけのなるべく小さいサイズのデバイス</li>
<li>専用のソフトウェア（iTunes）で曲を管理しデバイスと同期させる</li>
<li>コントローラは曲の選択とプレイヤーの操作だけできればよい</li>
<li>アルバム別だけじゃなくてアーティスト別や年代別、ジャンル別などで再生できる</li>
<li>再生中は曲のアートワークをかっこよく表示させる</li>
<li>販売サイト（iTunes Music Store）で曲を買ったらそのままデバイスにも同期される</li>
</ul>

<p>こうしたアイデアは最終的にiPodというプロダクトに活かされているものですが、おそらく企画をつくるに当たって没になったアイデアもいくつかあることでしょう。たくさんの個別具体的なアイデアを持っておき、後ほど吟味するとよいです。</p>

<h4>3. テーマ</h4>

<p>テーマとは哲学をより具体的にした勝負する領域のことを言います。アイデアを出していく過程などで固まっていくことが多いです。</p>

<p>iPodの場合は「携帯音楽プレイヤー」がテーマと言えるでしょう。ただ、Appleの戦略としてはiPodが単なる単体のプレイヤーというデバイスにとどまっていないのが妙でしょう。というのはiPodは音楽ソフトであるiTunesとオンラインの音楽販売ショップであるiTunes Music Storeとの連動により活かされる点が多分にあるからです。</p>

<p>AppleのiPod、iTunes、iTunes Music Storeのような絶妙なコンビネーションを考える必要はありませんが、テーマを定めることは必要です。テーマを認識することで、同じテーマの既存サービスやアプリを調査することができるからです。</p>

<h4>4. コンセプト</h4>

<p>アイデアがたくさん出て、テーマも定まったならば、自ずと何を作るかのイメージが頭の中に浮かぶはずです。それを一言で表したものがコンセプトです。コンセプトはテーマに沿った、アイデアを形成するための骨格のようなものです。</p>

<p>iPodの場合だとコンセプトは以下の文章になるでしょう。</p>

<blockquote>
  <p>専用の音楽ソフトを経由して所有する曲全てを持ち運べる携帯型音楽プレイヤー</p>
</blockquote>

<p>肝は「所有する曲全てを持ち運べる」という点ですね。このコンセプトに対して上記で挙げた個別のアイデアが付随してそれ何であるかを説明するという具合になります。このようにコンセプトとアイデア、テーマと分けて考えることにより、人に説明がつきやすい企画になります。例えば、「私たちがつくるものは」とはじめテーマ、コンセプト、アイデアという順番で説明していけば、抽象的なところからより具体的なところへと解説するので相手にもイメージが着きやすくなります。説明しやすいということはその企画は自分（達）の中でも明確化されているということなのです。</p>

<h4>5. 名前</h4>

<p>そのプロダクト、サービス、アプリの名前を決めることは非常に重要なことです。</p>

<p>焦る必要はありませんが、なるべく早い段階で名前を決めておくことをオススメします。もちろん仮でもよいです。というのは、これからつくろうとしているものを自分（達）で呼ぶのに名前が無いと気持ちが入りませんし、先に進まないケースもあります。例えばこれまで決まったアイデアやコンセプトなどの企画をまとめてデジタル化したい時、PCに作業用のフォルダをつくるとします。その際に仮でもいいですから名前があればそれを使ってフォルダ名とすればよいわけです。名前が無かったらどんな名前でフォルダ名を作ればいいか無駄に途方に暮れるかもしれません。些細な例でしたが、同じような悩みには多々遭遇するはずです。</p>

<h4>6. デザイン</h4>

<p>デザインというと見た目のデザインが思い浮かぶかもしれませんが、それだけではなく、全体のディテールを詳細に決めていく作業です。モックアップと呼ばれる一部の機能を叶える試作品をつくったり、同じテーマのプロダクトを調査する過程で固まっていきます。</p>

<p>コンセプトやアイデアを洗練させていくと無駄なものが削ぎ落され、最低限のサービスやアプリに対する機能が抽出されます。それらに対してユーザーがどういう風に使っていくかを具体的なイラストなどを元に試行錯誤していく作業を行っていきます。iPodの場合は「デザインがよい」という評判を聞きますが、それは機能を絞り込みそこに対するディテールをいかに使いやすく突き詰めたかの結果によるものでもあります。実装作業に入る前にiPodのような物理的なものならば木材や粘土などを用いたモックアップを作ることや、Webサービスであれば紙にUIのイラストを書くような作業を何度も繰り返すとよいでしょう。デザインに関しては様々な具現化の方法があると思いますが、複数人のプロジェクトにおいても、不思議と一つの形に定まっていくことが多いです。</p>

<h4>7. 内部設計</h4>

<p>今まではサービスやプロダクトを外から見た際の企画について考えてきましたが、内部的にどのように実現するかを設計していくことももちろん必要です。</p>

<p>Webサービスならば、情報の区分けを行いデータモデルを記述する、物理的な観点とソフトウェア的観点をあわせて大きな枠組みを考えるアーキテクチャ図を書くといった作業です。ユースケースと呼ばれるユーザーから見たシステムの振る舞いを書いてから作業に移るとよいでしょう。極力ユースケースに従った形で最低限の内部構造を持つことを考えていくと最初は作りやすいです。また、Webサービスの場合、他にもサービスのエンドポイントを決めるURI設計や、内部のクラス構造を考えるAPI設計なども設計作業に入ります。専用のモデリングツールと呼ばれるソフトウェアを使うのもよいですが、まずは、大きめの紙とペンで行います。</p>

<h4>まとめ</h4>

<p>以上、サービスを実装する前の企画とは何を決めなくてはいけないかを、7項目に分けて紹介してきました。この7つの項目はWebサービスだけではなく、ものづくり全てにある程度共通することではないかと思います。まずは、何度かこの項目に従ってつくり、自分なりのものづくりの方法を築いていくのもいいと思います。</p>

<hr />

<p><br /></p>

<h3>参考</h3>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html">ゆーすけべーラジオ</a></li>
<li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4152087994/kamawada-22/ref=nosim/">デザイン思考の道具箱</a></li>
<li><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4396612117/kamawada-22/ref=nosim/">仕事のやり方間違えてます</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>ノマドならルノアールがはかどるよねぇ〜っていう10個の理由</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120503/195637.html" />
    <id>tag:yusukebe.com,2012://2.10070</id>

    <published>2012-05-03T10:56:37Z</published>
    <updated>2012-05-03T12:20:38Z</updated>

    <summary>遊牧民的に仕事するノマドワーク。僕は「おうち」が一番はかどったりするんですが、 ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ノマド" label="ノマド" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>遊牧民的に仕事するノマドワーク。僕は「おうち」が一番はかどったりするんですが、
どうしても「おそと」で作業しなくてはいけない時があります。
そんな時に心地よくノートパソコンをカタカタと打てるような空間が関東近辺で展開する喫茶<strong>ルノアール</strong>（修正：ルノワール→ルノアール＞＜）です。
今も実はルノアールにいます。ご存知の方は当然のごとく知っているルノアールの魅力ですが、
なんとなく列挙してみると10個も出てきましたので紹介してみます。</p>

<p><a href="http://yusukebe.com/archives/2012/05/03/IMG_2009.JPG"><img alt="IMG_2009.JPG" src="http://yusukebe.com/archives/assets_c/2012/05/IMG_2009-thumb-550x410-182.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p><br /></p>

<hr />

<p><br /></p>

<h3>1. 長居しても嫌な顔されない</h3>

<p>まず、これが一番でしょう。長い時間居てもコーヒー一杯頼めば店員さんに嫌な顔全くされません。
むしろ店員さんは笑顔です。</p>

<h3>2. 場所によっては空いている</h3>

<p>で、お店が混んでる時には長居してるとお店に悪いなーって感じでその点はもちろん考慮した方がいいでしょう。
ですが、場所によってはいつも空いている店舗があったりしてそういう場所は使いやすいです。</p>

<h3>3. 電源が使える </h3>

<p>次に大きいのは、PC等向けに電源が使える席があります。
恵比寿店など店舗によっては電源が用意されてないところもありますので注意が必要ですが、
大抵貸してくれます。</p>

<h3>4. livedoor無線LANが使える</h3>

<p>自前でe-mobileやWiMAX等のネットワークを用意できない場合はlivedoor Wirelessがこれも大抵の店で利用できます。
月額525円で使える公衆無線LANサービスです。僕も以前ネットワークが無くてお世話になったことがあります。</p>

<h3>5. 打ち合わせにも使える</h3>

<p>席と席との間隔が狭いわけではないので、隣のお客さんの声があんまり聞こえない構造になっている？のか、
同席した人との会話がしやすい気がします。よって打ち合わせにも向いているかなーと。
実際にこの前八重洲口のルノアールで某ミーティングをしたのですが、快適でした。</p>

<h3>6. お茶がエンドレスに出てくる</h3>

<p>長い時間いると最初に注文した飲み物も無くなってのどが乾いてしまいますが、
ルノアールの場合暖かいお茶がエンドレスか！ってぐらい出ててきます。
これはありがたい。</p>

<p><a href="http://yusukebe.com/archives/2012/05/03/IMG_2011.JPG"><img alt="IMG_2011.JPG" src="http://yusukebe.com/archives/assets_c/2012/05/IMG_2011-thumb-550x410-184.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p><br /></p>

<h3>7. 禁煙席・喫煙席と分煙 </h3>

<p>禁煙席、喫煙席と分煙です。区分けはそこまで厳しくないので、禁煙席の方にも香ってきますが、一応分煙。
逆に言うならば、喫煙者にとっては喫煙席が必ずあるということでタバコを吸う方にはありがたいかも。</p>

<h3>8. コピー機があったりする</h3>

<p>確か、関内のルノアールにはコピー機があってお金を入れれば使えた気がします。</p>

<h3>9. 会議室を持っているところも</h3>

<p>会議室を持っているルノアールは結構ありますね。よく利用するのは、渋谷のルノアール系カフェ「カフェ・ミヤマ」のマイスペースっていう会議室です。場所が便利なのがいいっすね。</p>

<h3>10. 今ならルノアールEdyで15%オフ</h3>

<p>ルノアールが発行しているEdyがあって最近作ったのですが、これを使うとなんと飲み物等が15％オフになります。
今はキャンペーン中らしいのですが、通常でも10％オフ。こりゃお得。</p>

<p><a href="http://yusukebe.com/archives/2012/05/03/IMG_2010.JPG"><img alt="IMG_2010.JPG" src="http://yusukebe.com/archives/assets_c/2012/05/IMG_2010-thumb-550x410-186.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p><br /></p>

<hr />

<p><br /></p>

<h3>まとめ</h3>

<p>このようにルノアールにはお世話になっているので、コーヒー一杯だけではなくてもっと飲み物頼めばいいのかと思いつつ、
エントリーを書いてみました。店員の皆様、いつもありがとうございます！ルノアールのHPはこちらから。</p>

<ul>
<li><a href="http://www.ginza-renoir.co.jp/">銀座ルノアール</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>「メンノン」カットにした！</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120425/110839.html" />
    <id>tag:yusukebe.com,2012://2.10069</id>

    <published>2012-04-25T02:08:39Z</published>
    <updated>2012-04-25T02:41:37Z</updated>

    <summary>稲刈りカットが伸びてきたのでいつも通り藤沢のコムズヘアーにいって担当の「まめ」さ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="コムズヘアー" label="コムズヘアー" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p><a href="http://yusukebe.com/archives/20120213/220102.html">稲刈りカット</a>が伸びてきたのでいつも通り藤沢のコムズヘアーにいって担当の<strong>「まめ」さん</strong>に髪の毛を切ってもらいました。
前回が結構ハードなモヒカンをベースにしたヘンテコカットだったので、僕は思わず</p>

<blockquote>
  <p>モヒカンだけど、「<strong>普通に</strong>」してください</p>
</blockquote>

<p>ってまめさんに要求。まめさんは「<strong>普通</strong>でいいんですかー？」とバリカンを入れながら聞いてきます。
これから切る髪型についての話をバリカン入れながらってすごいっすね。
で、いきなり吹き出して「完成を思い描いたら面白くなっちゃったw」と今日もノリノリです。
10分ほどの短い時間で、「これどーですかー？」と外してた眼鏡を持ってきてくれた。
鏡を見てみると普通っていうか、案の定面白い感じになってるじゃないかー！</p>

<blockquote>
  <p>メンズノンノに載ってるモデルさんっぽくないっすかー？</p>
</blockquote>

<p>と、<strong>メンズノンノに載ってるくらいだから＝普通</strong>を主張してきてなんとなく納得しちゃったじゃないか！</p>

<p>ってなわけで、<strong>メンノン</strong>カットが出来上がりー。モヒカンの頂点がかなり長くて、横に流す髪型です。
下の写真はまめさんとスタッフのしょうくんとの写真です。</p>

<p><a href="http://yusukebe.com/archives/2012/04/25/IMG_1987.JPG"><img alt="IMG_1987.JPG" src="http://yusukebe.com/archives/assets_c/2012/04/IMG_1987-thumb-550x410-176.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p>美容室の社長さんまで巻き込んで完成の様子を写真で撮りました。</p>

<p>まずは、遠目から。</p>

<p><a href="http://yusukebe.com/archives/2012/04/25/IMG_1993.jpg"><img alt="IMG_1993.jpg" src="http://yusukebe.com/archives/assets_c/2012/04/IMG_1993-thumb-400x535-178.jpg" width="400" height="535" class="mt-image-none" style="" /></a></p>

<p>そして、どアップ！</p>

<p><a href="http://yusukebe.com/archives/2012/04/25/IMG_1994.jpg"><img alt="IMG_1994.jpg" src="http://yusukebe.com/archives/assets_c/2012/04/IMG_1994-thumb-400x535-180.jpg" width="400" height="535" class="mt-image-none" style="" /></a></p>

<p>このメンノンカット、スタイリングには艶の出るジェルがいいとまめさんに言われるが、ワックスくらいしか持っていません。
そこで、会計の帰り際にまめさん、</p>

<blockquote>
  <p>ポイントが溜まっているから、さっきも使ったジェル、プレゼントできますよー</p>
</blockquote>

<p>おー、ということでプロ仕様のジェルをただでいただきましたよ。
なんだかんだいってメンノンカット気に入ったし、さんざん美容室の中で騒いだし、社長さんも含めみんないい人だし、
コストパフォーマンスも含め楽しめましたー。コムズヘアーいいよ！最近、辻堂のテラスモールにもできたみたいなので、
湘南地域の人はチェックしてみてくださいな。</p>

<ul>
<li><a href="http://com-s.com/">コムズヘアーの公式サイト</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>海外エロサイトのページを串刺し検索するサイトを速攻で作ったwww</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120406/191902.html" />
    <id>tag:yusukebe.com,2012://2.10068</id>

    <published>2012-04-06T10:19:02Z</published>
    <updated>2012-04-06T10:34:23Z</updated>

    <summary>Googleのカスタム検索っての使って海外のエロサイトを串刺し検索するサイト作っ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Work" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="エロ" label="エロ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p><strong>Googleのカスタム検索っての使って海外のエロサイトを串刺し検索するサイト作ったwww 速攻でできたwww</strong></p>

<p>とりあえず「<a href="http://eroken.urasukebe.com/">eroken</a>」って名付けた。</p>

<p><a href="http://eroken.urasukebe.com/"><img alt="スクリーンショット 2012-04-06 19.18.27.png" src="http://yusukebe.com/archives/assets_c/2012/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-04-06%2019.18.27-thumb-550x367-174.png" width="550" height="367" class="mt-image-none" style="" /></a></p>

<p><br /></p>

<h3>どんなサイトに対応しているの？</h3>

<p>海外10個以上のサイトに対応している。xvideos、tube8、empflix、tnaflix、spankwireとかだいたい網羅したと思う。fc2入れようと思ったけど日本語サイトなんでやっぱりやめた。</p>

<h3>なにエロ動画これ検索できんの？</h3>

<p>正確に言うとエロ動画サイトの動画ページが検索できる。
一部日本語にも対応しててAV女優名を入れるとそこそこの精度で動画出てくるよ。
おまけとして「エロ動画検索として役に立つかもしれないエロ英単語」を左側に付けたから活用してね。</p>

<h3>検索するとサムネイルも出るじゃん！</h3>

<p>Google側で最近動画っぽい<strong>サムネイル</strong>を表示してくれるみたい。
CSSで無理矢理拡大してるから見やすいと思う！
ちなみに、<strong>オートコンプリート</strong>って言って検索のための補助語を出してくれる機能もつけた。
AV女優の名前一覧をぶっこんだから名前っぽい文字いれても保管されるwww</p>

<h3>どうやって作ったの？</h3>

<p>Googleカスタム検索のページ行って、対応させるサイトを入れたりして設定。
あとは簡単なJavaScriptのドキュメント読んでページに読み込ませた。簡単。</p>

<h3>masturbationで検索したら男のちんこができたんだけどwww</h3>

<p>それ俺もやったwww</p>

<hr />

<p><br /></p>

<p>ということでGoogleカスタム検索で作ったエロサイト検索は使えるかな！？ <a href="http://eroken.urasukebe.com/">eroken</a>、気になった人は見てみてください！！</p>
]]>
        

    </content>
</entry>

<entry>
    <title>イカ娘でTwitter OAuth認証</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120327/175645.html" />
    <id>tag:yusukebe.com,2012://2.10067</id>

    <published>2012-03-27T08:56:45Z</published>
    <updated>2012-03-27T08:59:02Z</updated>

    <summary>Webサービスのログイン方法の一つに「Twitterログイン」が最近多く見られる...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>Webサービスのログイン方法の一つに「Twitterログイン」が最近多く見られるようになってきました。
サイト上でのユーザー登録無しでTwitterアカウントを引き回すことも工夫によってはできますので、
ユーザーや開発者にとって手間が省けるという利点があるのではないでしょうか。
今回はアニメ「イカ娘」を題材とした簡単なWebアプリを作りつつTwitterのOAuth認証の流れと実装を見ていきましょう。</p>

<p><img src="http://farm8.staticflickr.com/7123/7020279907_6ab167dce6.jpg" alt="イカ娘タイムライン" title="" /></p>

<h3>Twitter OAuth認証の流れ</h3>

<p>Twitter OAuthでは主にキーと鍵のペアの値がいくつかでてきて混乱しがちなのでイカ、おっと間違えた、以下にまとめておきます。</p>

<ul>
<li>「<strong>コンシューマトークン、コンシューマシークレット</strong>」 アプリケーション固有のキーと鍵。Twitter Developerのページで発行される。アプリケーション開発者以外に知らせてはいけず、通常は設定ファイルなどに記載してアプリケーションで読み込ませる。</li>
<li>「<strong>リクエストトークン、リクエストトークンシークレット</strong>」 アプリと連携する際にTwitterのサイトでログインをしてもらうが、そのログイン画面へリダイレクトさせるURLが発行されるタイミングと同じくらいで使うトークン。リダイレクトさせる前に取得し、クッキーなどで保持し後ほど自サイトにユーザーが戻ってきた時に照合させる。</li>
<li>「<strong>アクセストークン、アクセストークンシークレット</strong>」 そのアプリにおけるユーザー固有のキーと鍵。これと上記のコンシューマトークン＆シークレットがあればTwitterにアプリケーションでログインが可能になりタイムラインの取得などができるようになる。実際にはTwitter上の認証画面から返ってきた際に初めて取得できる。</li>
</ul>

<p>そして上記の言葉を使った、カタカナばかりでちょっと分かりにくい、開発の流れはこのようなものです。</p>

<ol>
<li>Twitter Developerのページにてアプリケーションを登録</li>
<li>アプリケーション固有のコンシューマトークンというキーとコンシューマトークンシークレットという鍵をもらう</li>
<li>アプリを実装。設定からコンシューマトークン＆シークレットを呼び出せるようにしておく</li>
<li>コンシューマトークン＆シークレットを元にリクエストトークンとリクエストトークンシークレットを作り出す</li>
<li>リクエストトークン＆シークレットをクッキーで保持しておく</li>
<li>Twitterの認証ページにリダイレクトさせる</li>
<li>コールバックURLにGETパラメータの引数付きで返ってくるのでそれを元にユーザー固有のアクセストークン、アクセストークンシークレットを取得</li>
<li>アクセストークン＆シークレットをクッキーで保持しておく</li>
<li>コンシューマキー＆シークレット、アクセストークン＆シークレットを使ってログイン、タイムラインなどを取得</li>
</ol>

<h3>サンプルアプリの方針</h3>

<p>Twitterログインをして自分のタイムラインを見られるような機能をサンプルとして作成したいのですが、
少々それだけだと味気ないです。
Perlのライブラリ置き場CPANを漁っていると「<a href="http://search.cpan.org/dist/Acme-Ikamusume/">Acme::Ikamusume</a>」なる興味深いモジュールを発見したのでそれを使ったアプリを考えてみます。このAcme::Ikamusume、動かすのにMeCabという形態素解析のソフトが必要なのが多少敷居が高いですが、簡単に使えてかつ面白いです。</p>

<pre><code>my $text = Acme::Ikamusume-&gt;geso('変更したいテキスト');
</code></pre>

<p>とするとアニメ「イカ娘」でイカちゃんがしゃべるような言葉に変換されます。自分のTwitterのタイムラインがイカ娘変換されるとどうなるか！？おもしろいんじゃなイカ！？ってことでやってみます。ちなみに作者の富田さんが自身でイカ娘変換を簡単に試せるサービスとAPIを公開していますのでそちらもご参考ください。</p>

<ul>
<li><a href="http://ika.koneta.org/">侵略！ イカ娘変換でゲソ！</a></li>
</ul>

<p>実装の方針ですが、PerlのMojolicious Liteを使ったものとさせていただきます。上記の流れを最低限の機能で追うので他の言語でも応用できると思います。また、Mojolicious Liteのセッション管理は若干貧弱なためPlack::Sessionを代わりに、Twitter APIの処理にはNet::Twitter::Liteを使います。</p>

<h3>アプリケーションの登録とコンシューマキーの取得</h3>

<p>まず、<a href="https://dev.twitter.com/">Twitter Developer</a> のページでこれから作るアプリケーションの情報を登録します。</p>

<p><img src="http://farm8.staticflickr.com/7046/6874167300_4291f81cde.jpg" alt="Twitter Develper" title="" /></p>

<p>いくつかの項目は後から変更が効きますが「Name」の欄は変更がきかなかったり早い物勝ちだったりするので慎重に考えて入力しましょう。アプリケーションを登録したらいつでも「My Applications」からそのアプリを選んで、設定情報を確認することができます。コンシューマキー＆シークレットである「Consumer key」「Consumer secret」という文字列が表示されていると思うので、それを後ほど使います。</p>

<h3>アプリケーションの実装、設定からキーを呼び出す</h3>

<p>いよいよアプリケーションの実装に入っていきます。mojoコマンドを使ってアプリケーションの雛形を作ったら「myapp.conf」などの名前で設定ファイルを作り、そこにコンシューマキー＆シークレットを書き込みます。またアプリケーション内でConfig Pluginを使い、設定を呼び出します。</p>

<h4>myapp.conf</h4>

<pre><code>{
    consumer_key    =&gt; 'xxxxxxxxxxxxxxxxxxxxxx',
    consumer_secret =&gt; 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
};
</code></pre>

<h4>myapp.pl</h4>

<pre><code>my $config = plugin('Config');
my $nt = Net::Twitter::Lite-&gt;new(
    consumer_key    =&gt; $config-&gt;{consumer_key},
    consumer_secret =&gt; $config-&gt;{consumer_secret},
);
</code></pre>

<p>consumer_keyとconsumer_secretをそのまま渡してNet::Twitter::Liteのインスタンスを作ってそれを使い回していきます。</p>

<h3>Twitterログイン画面に飛ばす</h3>

<p>次に「/login」にアクセスするとTwitterのログイン画面に飛ぶために、URLを取得しリダイレクトさせる実装をします。
その際にリクエストトークン＆シークレットをセッションで保持しておくのを忘れないようにします。</p>

<pre><code>get '/login' =&gt; sub {
    my $self    = shift;
    my $session = Plack::Session-&gt;new( $self-&gt;req-&gt;env );
    my $url     = $nt-&gt;get_authorization_url(
        callback =&gt; $self-&gt;req-&gt;url-&gt;base . '/callback' );
    $session-&gt;set( 'token', $nt-&gt;request_token );
    $session-&gt;set( 'token_secret', $nt-&gt;request_token_secret );
    $self-&gt;redirect_to($url);
};
</code></pre>

<p>「$nt->get_authorization_url」のcallbackパラメータで指定している通り、Twitter側でのログインの処理が終わると「/callback」に戻ってくるように指定しています。</p>

<h3>Twitterログイン画面から戻ってきた時の処理</h3>

<p>ということで次は「/callback」を実装します。GETメソッドのパラメータ「oauth_verifier」の値と照合させてアクセストークン＆シークレットを取得できます。それらの値をセッションで保持し、トップページにリダイレクトさせています。また、もしユーザーがTwitterのログイン画面でログインを拒否した場合には「denied=xxxxxxxx」というパラメータ付きで「/callback」に返ってくるのでその際はセッションのセットをしていません。</p>

<pre><code>get '/callback' =&gt; sub {
    my $self = shift;
    unless ( $self-&gt;req-&gt;param('denied') ) {
        my $session = Plack::Session-&gt;new( $self-&gt;req-&gt;env );
        $nt-&gt;request_token( $session-&gt;get('token') );
        $nt-&gt;request_token_secret( $session-&gt;get('token_secret') );
        my $verifier = $self-&gt;req-&gt;param('oauth_verifier');
        my ( $access_token, $access_token_secret, $user_id, $screen_name ) =
          $nt-&gt;request_access_token( verifier =&gt; $verifier );
        $session-&gt;set( 'access_token',        $access_token );
        $session-&gt;set( 'access_token_secret', $access_token_secret );
        $session-&gt;set( 'screen_name',         $screen_name );
    }
    $self-&gt;redirect_to('/');
};
</code></pre>

<h4>ログイン後のホーム画面の処理</h4>

<p>セッションにはアクセストークン＆シークレットが保持された状態になるので、これでユーザーのタイムラインを取得することができるようになります。ホーム画面では「$nt->home_timeline」で取得したツイートにイカ娘変換をかけて配列リファレンスに入れ、そのままテンプレートに渡しています。テンプレートではその配列リファレンスやセッションに値が入っていればそのまま表示し、そうでなければログインしていない状態と見なしログインを促すリンクを張っておきます。</p>

<h4>myapp.pl</h4>

<pre><code>get '/' =&gt; sub {
    my $self    = shift;
    my $session = Plack::Session-&gt;new( $self-&gt;req-&gt;env );
    my $tweets;
    if ( $session-&gt;get('access_token') ) {
        $nt-&gt;access_token( $session-&gt;get('access_token') );
        $nt-&gt;access_token_secret( $session-&gt;get('access_token_secret') );
        for my $tweet ( @{ $nt-&gt;home_timeline } ) {
            next if $tweet-&gt;{user}{protected};
            $tweet-&gt;{text} = Acme::Ikamusume-&gt;geso( $tweet-&gt;{text} );
            push @$tweets, $tweet;
        }
    }
    $self-&gt;stash-&gt;{screen_name} = $session-&gt;get('screen_name');
    $self-&gt;stash-&gt;{tweets}      = $tweets;
    $self-&gt;render('index');
};
</code></pre>

<h4>templates/index.html.ep</h4>

<pre><code>% if ( $screen_name ) {
&lt;h3&gt;&lt;a href="/"&gt;@&lt;%= $screen_name %&gt;さんのイカ娘タイムライン&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="/logout"&gt;ログアウト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
% }else{ 
&lt;ul&gt;
  &lt;li&gt;&lt;a href="/login"&gt;Twitterログイン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
% }

% if($tweets) {
&lt;hr /&gt;
% for my $tweet ( @$tweets ) {
&lt;p style="margin-bottom:1em;padding-bottom:1em;border-bottom:1px dotted #ccc;"&gt;
  &lt;img src="&lt;%= $tweet-&gt;{user}{profile_image_url} %&gt;" alt=""
       width="36" height="36" style="float:left;margin-right:1em;"/&gt;
  &lt;a href="http://twitter.com/&lt;%= $tweet-&gt;{user}{screen_name} %&gt;" 
     target="_blank"&gt;@&lt;%= $tweet-&gt;{user}{screen_name} %&gt;&lt;/a&gt;: &lt;%= $tweet-&gt;{text} %&gt;
  &lt;span style="display:block;clear:both;"&gt;&lt;/span&gt;
&lt;/p&gt;
% }
% }
</code></pre>

<h3>ログアウトの実装</h3>

<p>最後にログアウトの実装をします。保持しているセッションをクリアして、トップページに遷移させます。</p>

<pre><code>get '/logout' =&gt; sub {
    my $self    = shift;
    my $session = Plack::Session-&gt;new( $self-&gt;req-&gt;env );
    $session-&gt;expire();
    $self-&gt;redirect_to('/');
};
</code></pre>

<h3>デモとコードの在りか</h3>

<p>さてこれらのコードを組み合わせれば「イカ娘タイムライン的な何か」が完成です。</p>

<p><img src="http://farm8.staticflickr.com/7277/7020318307_796b72e7e4.jpg" alt="イカ娘タイムラインその2" title="" /></p>

<p>そのうち使えなくなってしまう可能性大ですが、一応今のところ動いている物をイカの、いや以下のURLでデプロイしておきました。機能は少ないですがあなたのイカ娘タイムラインを眺めることができると思います。</p>

<ul>
<li><a href="http://twitter-ikamusume.yusuke.be/">http://twitter-ikamusume.yusuke.be/</a></li>
</ul>

<p>また、ソースコード一式をgithubに置いておきます。</p>

<ul>
<li><a href="https://github.com/yusukebe/Twitter-Ikamusume">yusukebe/Twitter-Ikamusume</a></li>
</ul>

<p>こうやって作ってみるとタイムラインを見るだけじゃなくてイカ娘な発言もしたくなってくるでゲソ。
ってな感じでアプリを拡張したりするのもいいと思います！ということでお楽しみください。</p>

<h3>お知らせ</h3>

<p>メルマガ「ゆーすけべーラジオ」ではこうしたWebサービスにまつわるエッセイ風のテキストやデザイン思考について書いています。よろしければお試し購読を。</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html" title="ゆーすけべーラジオ">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>Markdown文章をお手軽にKindleで見る</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120327/072156.html" />
    <id>tag:yusukebe.com,2012://2.10066</id>

    <published>2012-03-26T22:21:56Z</published>
    <updated>2012-03-26T22:49:53Z</updated>

    <summary>いつの間にか手元にある「Kindle Touch」。ぐふふ。 ページめくりがもっ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Technologies" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="kindle" label="Kindle" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="markdown" label="Markdown" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>いつの間にか手元にある「Kindle Touch」。ぐふふ。</p>

<p><a href="http://yusukebe.com/archives/2012/03/27/IMG_1882.JPG"><img alt="IMG_1882.JPG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1882-thumb-300x224-171.jpg" width="300" height="224" class="mt-image-none" style="" /></a>
<a href="http://yusukebe.com/archives/2012/03/27/IMG_1884.JPG"><img alt="IMG_1884.JPG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1884-thumb-300x224-165.jpg" width="300" height="224" class="mt-image-none" style="" /></a></p>

<p>ページめくりがもっさりしているのが気になるけど、軽くて手頃なサイズ感がいい。
今なら円高なんで安く買えるし。
ただ、Kindle Storeで購入する書籍も含めて英語だとなんとなく実感がわかないので、
日本語の文章を読んでみたかった。
というか、自分が最近書いている文章のプレビュー用として使いたかった。</p>

<p>Markdownで文章を書いているのでMarkdownを変換してKindleに転送して読めばよい。
実は後から知ったんだけどKindleってePubにまだ対応してないのね... 
ということで色々調べてみると以下の方法がすごくお手軽。</p>

<ul>
<li>Markdownを簡単な構造のHTMLに変換する</li>
<li>KindleGenを使って.mobi形式に変換する</li>
<li>Kindleを繋げてフォルダにぶっこむ</li>
</ul>

<p>KindleGenっていうのはAmazonがオフィシャルに配布しているePubやHTMLを結構かしこくKindleで読める形式＝.mobiに変換してくれるコマンドラインソフト。</p>

<ul>
<li><a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=1000234621" title="Kindle Publishing Programs">Kindle Publishing Programs</a></li>
</ul>

<p>これにMarkdownからおこしたHTMLをかませればいいということになる。
適当なHTMLを指定しKindleGenを実行するいろいろと警告や情報を出してくれるのでHTMLを作る参考になります。</p>

<p>気をつけるのは以下の点でした。</p>

<ul>
<li>html、bodyタグ等はしっかりつける</li>
<li>head内のmeta要素でcharset=utf8とかしないと日本語が文字化ける</li>
<li>画像はローカルにないといけない</li>
<li>デフォルトだと特有のCSSが適応されるので簡単なCSSを書く</li>
<li>.cssファイルを外部から読み込んでも考慮される</li>
</ul>

<p>MarkdownをHTML化するために使ったスクリプトはこちら。Markdownファイルを引数に渡すと、
HTML内の画像をtempファイルに置きつつsrc属性を変更、最終的に出来たHTMLを標準出力に吐いてくれる。</p>

<pre><code>use strict;
use warnings;
use Text::Markdown qw/markdown/;
use Path::Class qw/file/;
use Data::Section::Simple qw/get_data_section/;
use HTML::TokeParser;
use File::Temp qw/tempfile/;
use LWP::Simple qw/getstore/;

my $filename = $ARGV[0] or die "filename argument required!";
my $file     = file($filename);
my $content  = $file-&gt;slurp;
my $html     = markdown($content);

my $parser = HTML::TokeParser-&gt;new( \$html );
while ( my $token = $parser-&gt;get_tag('img') ) {
    my $src = $token-&gt;[1]{src};
    my ($suffix) = $src =~ /.+(\..\w+?)$/;
    my ( $fh, $tempname ) = tempfile( SUFFIX =&gt; $suffix );
    getstore( $src, $tempname );
    $html =~ s/$src/$tempname/g;
}

my $header = get_data_section('header.html');
my $footer = get_data_section('footer.html');
print "$header$html$footer";

__DATA__

@@ header.html
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;
    &lt;link rel="stylesheet" href="style.css" type="text/css" /&gt;
  &lt;/head&gt;
  &lt;body&gt;

@@ footer.html
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>これを「convert.pl」などと保存して、以下のようにすればHTMLが生成される。</p>

<pre><code>$ perl convert.pl oppai.mkdn &gt; oppai.html
</code></pre>

<p>そしてすかさずKindleGenで変換。</p>

<pre><code>$ ~/bin/kindlegen oppai.html
</code></pre>

<p>するとカバーが無いと怒られつつも「oppai.mobi」が生成されるのでKindleに転送して見てみる。</p>

<p><a href="http://yusukebe.com/archives/2012/03/27/IMG_1921.JPG"><img alt="IMG_1921.JPG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1921-thumb-550x410-167.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p>できたー！画像もコードも綺麗に読める！</p>

<p><a href="http://yusukebe.com/archives/2012/03/27/IMG_1922.jpg"><img alt="IMG_1922.jpg" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1922-thumb-550x410-169.jpg" width="550" height="410" class="mt-image-none" style="" /></a></p>

<p>やっぱりE-Ink読みやすいな！そしてこういう風に自分の書いた文章を物理デバイスでプレビューすると直したい点がわかったり全体のボリューム感を把握できていいわー。今手元に複数のMarkdownファイルがあるのでそれをうまいことまとめて一つのHTMLにすればもっとよさげ。表紙とか目次についても比較的簡単にプログラマブルにやれそうなんで調べてみます。</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Webサービス、最初の宣伝</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120322/100646.html" />
    <id>tag:yusukebe.com,2012://2.10065</id>

    <published>2012-03-22T01:06:46Z</published>
    <updated>2012-03-22T01:27:46Z</updated>

    <summary>Webサービスのプロモーション？について個人的にまとめてみます。 Webサービス...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>Webサービスのプロモーション？について個人的にまとめてみます。</p>

<hr />

<p><br /></p>

<p>Webサービスができたら想定するユーザーに使ってもらわないと寂しいところです。
そこでWebサービスを多くの人に知ってもらうための宣伝をしましょう。
今回はサービスを作った作者が一人でできる範囲を考え、
以下の3つの手段を使った初期のプロモーションについて僕なりのやり方を紹介します。</p>

<ul>
<li>プレスリリース</li>
<li>自身のBlogでの紹介</li>
<li>Twitterでの拡散、はてなブックマークでの注目</li>
</ul>

<p>今まで僕は個人で、もしくは「会社名義だけれども一人で」WebサービスやiPhoneアプリを作った際に、
上記のツールを使いながら意図的に宣伝を行い効果測定をしてきました。
プロモーションのプロではもちろん無いながらも工夫と、ある程度の努力をしています。
中には全く不発のもあり、とはいえ、それはサービス自体がそもそも面白くないケースがあったりで、
だんだんと作ったモノに見合った宣伝が出来つつあるのではないかと思います。</p>

<p>先日弊社ワディット名義でリリースした「僕のラジオ」というiPhoneアプリはうまくいった例です。
僕のBlogでの初期の宣伝とTwitterやはてなブックマークでの効果は非常に高く、
またプレスリリースも大手メディアに3件取り上げられました。</p>

<p><img src="http://farm8.staticflickr.com/7272/6858397512_e0a0dd3f83.jpg" alt="僕のラジオの記事掲載" title="" /></p>

<p>そのため、iTunes Store内の「ミュージック」カテゴリで瞬間風速2位と出だしとしては最高の結果を得ることができました。
ちなみに、Webサービスでの宣伝もiPhoneアプリのそれも僕にとっては全くやり方は同じ手法をとっています。</p>

<p>では、そのサービスやアプリの宣伝の手法について、サービスが完成してから公開まで何をしていくのか、
順を追ってみていきます。</p>

<hr />

<p><br /></p>

<h4>1.自分のサービスについて記述する</h4>

<p>まず、これはサービスが完成する前から考えなくてはいけないことです。
そのサービスが何を目標としていて何ができるのか？だけでも最低限文章として書けるようにしておきます。
事細かく書く必要はなく、例えば</p>

<blockquote>
  <p>□□□のために△△△ができるサービス「○○○」</p>
</blockquote>

<p>というような一言でよいと思います。
「○○○」にはサービス名が入り、全体で100文字弱の分量くらいを想定します。
しっかりと文言までも気にしながら作っておくと何かと便利です。
例えばサービス内の説明にも使うこともできますし、そのままプレスリリースのダイジェストになります。
また、友達などにサービスを紹介した際「それってどんなサービスなの？」
という友達が真っ先に思い浮かぶであろう質問に簡潔に答えることができる材料となります。</p>

<p>もうちょっとこの「□□□のために△△△ができる」という部分を噛み砕きましょう。
「□□□のために」というのはユーザーから見たサービスに対しての「Why」の答えになります。
「なぜそのサービスを使うのか？そのサービスを使う旨みはどこか？＝□□□のためにです」と答えられればよいと思います。
例えば冒頭で紹介した僕のラジオの場合だと「新しい音楽に出会える」ためと定義してあります。
「△△△ができる」というのはサービスに対する「What」、つまり「何が出来るの？」の答えの部分です。
具体的にはサービスの個々の機能列挙になると思うのですが、そこから一番の特徴を抜き出すのがコツかと思います。</p>

<p>まとめますと、
WhyもWhatもどちらも簡潔に記述することでサービスのイメージを説得力のある形で相手に伝えることができます。</p>

<h4>2. タイミングを見計らう</h4>

<p>サービスが完成し、それ自身に対する「記述」も練られてきたら、一般に公開するタイミングを見計らいましょう。
「一般に公開するタイミング」とはプレスリリースを送信し、自身のBlogなどで公開することを言います。
まぁ僕の今回のケースですと、自分でタイミングをコントロールできるので、いつ行ってもぶっちゃけいいのですが、
やるならより多くの人の目に止まる時間を狙います。</p>

<p>まずは日にちですが平日がやはりよいと思います。
休日にプレスリリースを送ったとするとメディアが休みの可能性が高くなり、
するとどうしても見られるのが休日明けになってしまいます。
で、世の中的に火曜日がいいとか木曜日がいいとか言われてるかもですが、
個人的には平日ならばいつでもいいかなぁと考えています。
プレスリリースに限って言えば、メディアが稼働中している平日のオフィスタイムめがけて送れば、
目に留まる可能性はそれほど変わりないと思うのです。</p>

<p>次に時間ですが、これは注意した方がいいかもです。
Blog記事、プレスリリースどちらにしてもこちらが発信してから情報が見られるまでのタイムラグが発生することを意識します。
プレスリリースの場合、担当者はメールボックスに溜まった大量のリリース文面を選り分けながら見て行き、
そこから気になるものをピックアップしある程度時間に追われながらメディアに乗せる記事にしていきます。
こうした一連の流れを想像しながらこの時間帯に送ったら見られそうなどと考えます。</p>

<p>今の僕ならばなのですが、朝一番、出社前の午前7時くらいまでの時間にプレスリリースを打つか、
それが間に合わなければ夕方の掲載を狙って昼までにって感じですね。
Blog記事に関しては午前中11時くらいまでの公開がいいと思います。</p>

<p>タイミングを見計らって次はいよいよプレスリリースを送ります。</p>

<h4>3. プレスリリースを打つ</h4>

<p>プレスリリースというと大げさな感じがしますが、
僕がやっているのはIT系メディアの、プレスリリースを受けつけるメールアドレスにリリース文をメールで送るというだけです。
プレスリリース配信会社なるものが存在しますがそれらは費用対効果が低いので使ってないです。</p>

<p>メールアドレスをそのまま掲載するのはやめておきますがだいたい以下のようなメディアに配信しています。</p>

<ul>
<li>ITmedia</li>
<li>japan.internet.com</li>
<li>CNET Japan</li>
<li>マイナビニュース</li>
<li>TechChrunch Japan</li>
<li>TechWave</li>
<li>etc.</li>
</ul>

<p>こうしたメディアのサイトに行くと「お問い合わせ」のメニューからプレスリリースの受付について書いてあるケースがあって、
そこからメールアドレスを取得することができたりしますね。</p>

<p>配信先のメールアドレス一覧を作成したらリリース文面を作ります。もしくは予め用意しておきます。
僕がいつも使っているテンプレートがあるのでそれを紹介してみましょう。</p>

<pre><code>【プレスリリース】△△△なWebサービス「○○○」公開

20xx年xx月xx日
株式会社xxxxx(代表 xxxxx)

--------------------------------------------------------
(株)xxxxxx、□□□のために△△△できる「○○○」をリリース
サービスURL: http://サービスのURL
--------------------------------------------------------

xx月xx日、株式会社xxxxx（代表 xxxxxx）は、....（サービスの客観的な説明100文字前後）...
 「○○○」をリリースしました。

（サービスの説明200文字程度）

（サービスの目的やその後の展望200文字程度）

■機能特徴一覧
機能や特徴の一覧を箇条書きで列挙
その他動作環境なども記述した方がいい場合もある

■スクリーンショットURL
スクリーンショットを掲載したURLと解説を列挙
画像を添付してもよいかも

--------------------------------------------------------
この件に対するお問い合せ
（開発者の名前）/株式会社xxxxxx
（住所）
電話：090-xxxx-xxxxx
問い合わせメール: xxx@xxxxxxxxxx
--------------------------------------------------------
</code></pre>

<p>冒頭の『 【プレスリリース】△△△なWebサービス「○○○」公開』というのは題名に当たる部分で、
それ以下がメールの本文になります。お分かりの通りいつもプレーンテキストのメールで書いてます。
題名が重要でキャッチーな方がいいと言われていますが、
僕はサービスが斬新であればそのサービスの特徴を示す一言を示せば目に留まるだろうと愚直にこのような形にしています。</p>

<p>プレスリリースは文言だけ変えてそのまま掲載されることが結構あるので、
掲載しやすいような内容を意識するのがコツかなぁと最近思います。
このテンプレート。参考にしていただければしてもらって、つどつど自分なりに書き換えていただければいいと思います。
送信する際はメディアのメールアドレス一覧をBCCにして、自分宛てに送信します。</p>

<p>さて、プレスリリースには掲載の種類が2種類あります。
一つはメディアの担当者がリリース文を読んだだけで掲載するパターンと、
もう一つはリリース文を元に編集者が実際に使ってみて感想を含めた記事を掲載するパターンです。
前者の方が掲載される率としては高めで、
また、配信元となっているようなメディアだとそこから波及して他のメディアに転載されるケースが期待できます。
後者の場合だと編集者の視点が入っているために内容の濃い記事になりやすく閲覧者の共感を得やすいのが特徴です。
個人的には後者の掲載がされると嬉しいなぁと感じます。</p>

<p>プレスリリースは打っても響かない、つまり掲載ゼロの場合もよくあるのでめげないでいきましょう。</p>

<h4>4. Blogで紹介する</h4>

<p>プレスリリースの原稿をより「柔らかく」表現したり、サービスの使い方に特化したりして、
リリース文と差別化を計った記事を自身のBlogにアップしましょう。
ここでよりよい効果を出すためにも日頃からBlogを更新し、フィードリーダーなどの購読者を増やす努力をしておくとよいでしょう。</p>

<h4>5. 拡散と注目</h4>

<p>プレスリリースの結果と違い、Blogの記事は公開のタイミングを自分で制御できます。
Blog記事を公開したらそれをTwitterで広めましょう。
うまくいけばRTやReplyなどの機能でサービスの名前が「拡散」していくかもしれません。
また、Blog記事がはてなブックマークされてあるしきい値を超えれば、
はてなブックマークのページからリンクが張られ「注目」されるようになります。</p>

<p>Twitterという情報のプラットフォームでサービスを拡散させ、はてなブックマークというメディアで注目させる。
こちらが制御できない部分もありますが、うまく行うことでサービスの効果的な宣伝につながります。</p>

<h4>6. フィードバックをウォッチする</h4>

<p>Blog記事の公開、プレスリリースの送信、Twitterやはてなブックマークの活用が済んだところでその結果が見たくなります。
その際にTwitterの検索機能を使うとよいでしょう。
Twitterの公式サイトから、もしくはお使いのTwitterクライアントの検索機能から、
公開したサービスの名前でずっと検索結果を垂れ流しにしておきます。
もしプレスリリースの結果としてどこか大手のメディアに取り上げられたとしたら一気に時間内の検索結果数が多くなるので、
逐一把握することができます。
また、サービスを使ってみての実際のユーザーの声も拾うことができると思います。</p>

<h4>まとめ</h4>

<p>以上、僕がWebサービスやiPhoneアプリの最初の宣伝としてやっていることの流れをまとめてみました。
割と当然のことな気がしますが、もしこうした流れを踏んだことのないとか、
これからWebサービスを公開するという方に、少しでも参考になれば幸いです。</p>

<hr />

<p><br /></p>

<h4>お知らせ</h4>

<p>メルマガ「ゆーすけべーラジオ」でもWebサービスにまつわるエッセイ風のテキストを掲載しています。
よろしければお試し購読を。</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>DMMのAVがDMM Booksでダウンロードできる件</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120319/045820.html" />
    <id>tag:yusukebe.com,2012://2.10064</id>

    <published>2012-03-18T19:58:20Z</published>
    <updated>2012-03-18T20:35:06Z</updated>

    <summary>アニメやドラマ、映画のネット配信、DVDレンタル、今ではFX、太陽光発電のレンタ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Column" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="エロ" label="エロ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dmm" label="DMM" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>アニメやドラマ、映画のネット配信、DVDレンタル、今ではFX、太陽光発電のレンタルなど幅広く手がけるDMM.com。
エロの分野では「DMM.R18」としてエロビエオはもちろん、
ライブチャットや同人誌などを大量に扱うのでお世話になっている方も多いでしょう。</p>

<p>そんなDMMが電子書籍向けに「<strong>DMM Books</strong>」というiPhoneアプリ及びAndroidアプリを2月の中旬にリリースしてました。</p>

<p><img alt="スクリーンショット 2012-03-19 4.42.55.png" src="http://yusukebe.com/archives/2012/03/19/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-19%204.42.55.png" width="194" height="188" class="mt-image-none" style="" /></p>

<p>ここでは<a href="http://itunes.apple.com/jp/app/dmm-books/id481155379?mt=8">iPhoneアプリ版</a>をみてみましょう。</p>

<blockquote>
  <p>DMM.comの電子書籍をiPhoneで楽しもう! <br /></p>
</blockquote>

<p>と謳い、以下の使い方が説明に書いてあります。</p>

<blockquote>
  <p>■閲覧方法 <br />
(1)Book Storeをタップ <br />
(2)お好みの商品を見つけて購入 <br />
(3)My Booksで購入した商品を読もう! <br /></p>
</blockquote>

<p>さっそくアプリを起動してみてログイン。「Book Store」をタップしてみると...</p>

<p><a href="http://yusukebe.com/archives/2012/03/19/IMG_1906.PNG"><img alt="IMG_1906.PNG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1906-thumb-300x450-158.png" width="300" height="450" class="mt-image-none" style="" /></a> <a href="http://yusukebe.com/archives/2012/03/19/IMG_1905.PNG"><img alt="IMG_1905.PNG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1905-thumb-300x450-156.png" width="300" height="450" class="mt-image-none" style="" /></a></p>

<p>ん... 本が2冊しかでてこないぞ... しかも、「来訪者」なんて聞いたことのない書籍だ...
アプリのレビューにも同じように「マイナーな本が2冊しかねーんじゃごら」的なものがある...</p>

<p>ってたぶんこれ、もっと裏技的な使い方があるんすよね。</p>

<p>で、その一つが「DMM（のサイト）で買った<strong>AV</strong>をDMM <strong>Books</strong>でダウンロードして観る」というもの。</p>

<p>DMMのアダルト動画をiPhoneで観るには「iPhone用の動画」を買ってストリーミングで再生するか、
一度PCやMacに動画を落としてからiTunesで同期させてiPhoneに転送する方法の2つがあります。
つまりストリーミングだと途切れちゃうなーなんて時に、ダウンロードで観たいわけですが、
そのためにはPCが必要だったわけです。
ところがどっこいDMM Booksを使えば、
PCいらずでiPhoneから直接動画がダウンロードできちゃうということなんです。たぶん...</p>

<p>実際にAV買ってみた。でも買えるのはDMMのサイトからのみなのでSafariにて。動画を購入してファイルの詳細を見ようとしたら「DMM Books」の利用を促された。</p>

<p><a href="http://yusukebe.com/archives/2012/03/19/IMG_1908.PNG"><img alt="IMG_1908.PNG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1908-thumb-300x450-160.png" width="300" height="450" class="mt-image-none" style="" /></a> <a href="http://yusukebe.com/archives/2012/03/19/IMG_1910.PNG"><img alt="IMG_1910.PNG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1910-thumb-300x450-162.png" width="300" height="450" class="mt-image-none" style="" /></a></p>

<p>AV購入後、再びDMM Booksを開くとダウンロード可能になっているので、ビットレートを選んでダウンロード。
App Storeで公式に配布されているアプリで、割と正統な方法で、しかも電子書籍用のアプリで、
AVをダウンロードするのがなんか変な感じですw</p>

<p><img alt="done.png" src="http://yusukebe.com/archives/2012/03/19/done.png" width="500" height="276" class="mt-image-none" style="" /></p>

<p>できた。そして観れた！</p>

<p>うぉーこれでPC無くてもiPhoneだけでダウンロードしたDMMの動画が楽しめますねっ。
たぶんこの使い方がある意味DMM Booksとしてはアリなやり方なんだと思います。
DMMは大量に動画コンテンツを持っているんだけど、今回のDMM BooksやDMM PlayerというMacでもDRM付きのファイルを再生可能にするソフトを配布していたりして、環境依存を吸収するような考慮もしているという印象ですね。</p>

<p>ところで、新しいiPadが話題ですがあの解像度を活かすエロコンテンツが観たい今日この頃。朝っぱらからエロの話でしたー！</p>
]]>
        

    </content>
</entry>

<entry>
    <title>iPhoneアプリの販売状況を知るための3つのサイト</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120310/193401.html" />
    <id>tag:yusukebe.com,2012://2.10063</id>

    <published>2012-03-10T10:34:01Z</published>
    <updated>2012-03-10T10:55:19Z</updated>

    <summary>iPhoneアプリを公開したらその販売状況が気になるところです。 いつ、どこから...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="iOS" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>iPhoneアプリを公開したらその販売状況が気になるところです。
いつ、どこから、何件ダウンロードされたか？
もし有料アプリだったりアプリ内課金をしている場合、いくら収益が上がっているのか？
今現在、僕の知る限り以下の3つのサイトでその状況を知ることができます。
ということで（大人の事情で深く突っ込まない感じで）順に紹介していきます。</p>

<h3>iTunes Connect</h3>

<p>Apple公式のサイトです。そもそも販売前のアプリ登録をここから行うので知らない人はいないでしょう。</p>

<p><a href="http://yusukebe.com/archives/2012/03/10/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.17.40.png"><img alt="スクリーンショット 2012-03-10 19.17.40.png" src="http://yusukebe.com/archives/assets_c/2012/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.17.40-thumb-550x338-147.png" width="550" height="338" class="mt-image-none" style="" /></a></p>

<p>「Sales and Trends 」っていう項目でグラフ化されたダウンロード数を見ることができます。
必要最小限ならこれで十分ですね。
僕の経験上だとだいたい日本時間の夜の22時以降くらいから前日のレポートを見ることができるようです。
ちなみにiPhoneアプリもあって、これが優れもの。</p>

<p><a href="http://yusukebe.com/archives/2012/03/10/IMG_1872.PNG"><img alt="IMG_1872.PNG" src="http://yusukebe.com/archives/assets_c/2012/03/IMG_1872-thumb-300x450-153.png" width="300" height="450" class="mt-image-none" style="" /></a></p>

<p>レポートを見ることができるだけではなくて、アプリの登録状況、つまり「ただいま審査中」「審査通ってStoreへ並べる準備中」
といったステータスの変更をプッシュ通知してくれます。
入れとくと何かとよいと思います。</p>

<h3>App Annie</h3>

<p>僕が一番よく見ていて活用できてるレポートサイトがこの「<a href="http://www.appannie.com/">App Annie</a>」です。</p>

<p><a href="http://yusukebe.com/archives/2012/03/10/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.22.57.png"><img alt="スクリーンショット 2012-03-10 19.22.57.png" src="http://yusukebe.com/archives/assets_c/2012/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.22.57-thumb-550x365-149.png" width="550" height="365" class="mt-image-none" style="" /></a></p>

<p>なんか昔はもっと「Annie」ちゃんがアメリカの萌えキャラっぽかったんですが最近デザインが変わりました。
自己責任でiTunes ConnectのユーザーIDとパスワードを登録すると、自動的にデータを取得してレポート化してくれます。
ダウンロード数を金額に変換してグラフ化してくれるのでよりリアルな数字として把握しやすいです。
また、ランキングやアプリごとのレビューもとってきてくれます。
設定すれば、毎日日本時間の深夜にレポートのダイジェストメールを送ってきてくれて、
それが便利っすね。データの更新時間が不定で、サイトを見るのが手間になるので。
とりあえずしばらくはこのApp Annieを見続けることになりそうです。
ちなみにAndroidアプリにも対応しております。</p>

<h3>Distimo Monitor</h3>

<p>App Storeのマーケティング情報を提供をしている<a href="http://www.distimo.com/">Distimo</a>の「Distimo Monitor」でApp Annie相当のことができます。</p>

<p><a href="http://yusukebe.com/archives/2012/03/10/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.28.14.png"><img alt="スクリーンショット 2012-03-10 19.28.14.png" src="http://yusukebe.com/archives/assets_c/2012/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-10%2019.28.14-thumb-550x373-151.png" width="550" height="373" class="mt-image-none" style="" /></a></p>

<p>こちらはレポートのUIが凝ってるっぽいんだけど、もっさりしているのであまり使ってないです。
収益のレポートという面で円表記に対応しているのが気になる点。
英語気合い入れて読んでないんでちょっと不明瞭な理解ですが、Distimoの「Disitimo Report」ってのが面白そう。</p>

<h3>まとめ</h3>

<p>3つのiPhoneアプリ販売レポートを知ることができるサイトを紹介しました。
他にもあったら教えてください＞＜</p>

<h3>宣伝</h3>

<p>メルマガ「ゆーすけべーラジオ」ではiPhoneアプリ開発に役立つかもしれない、
究極のモノ作り手法「デザイン思考」について連載中です！よろしければお試し購読を！</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>名古屋城行った</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120310/183443.html" />
    <id>tag:yusukebe.com,2012://2.10062</id>

    <published>2012-03-10T09:34:43Z</published>
    <updated>2012-03-10T09:49:52Z</updated>

    <summary>名古屋に城を見に行った。写真をたくさん撮ったんだけどiPhone4でも結構イケる...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Life" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>名古屋に城を見に行った。写真をたくさん撮ったんだけどiPhone4でも結構イケるね。</p>

<hr />

<p><br /></p>

<p>城に行く前にモーニングをいただいた。普通のテーブルとゲーム機テーブルがあって迷わずゲーム機の方に座る。
ホットドックの中に入ってるキャベツがすごい炒めてあって旨かった。
コーヒーは飲みやすい。</p>

<p><img alt="cafe.jpg" src="http://yusukebe.com/archives/2012/03/10/cafe.jpg" width="600" height="448" class="mt-image-none" style="" /></p>

<p>名古屋城に入場するとすかさず待ち受けていた人たちからグッズをもらった。
ホッカイロ、ステッカー、ポケットティッシュ。
ちなみに思いのほか城周辺が片付いている的な意味で奇麗なのが驚いた。</p>

<p><img alt="goods.jpg" src="http://yusukebe.com/archives/2012/03/10/goods.jpg" width="600" height="448" class="mt-image-none" style="" /></p>

<p>城。シャチホコが見える。</p>

<p><img alt="shiro.jpg" src="http://yusukebe.com/archives/2012/03/10/shiro.jpg" width="600" height="448" class="mt-image-none" style="" /></p>

<p>梅が咲いていて奇麗だった。そういえば今年の河津桜の開花がものすごく遅れていてようやく今頃満開らしい。
梅を見たら桜を見たくなった。</p>

<p><img alt="ume.jpg" src="http://yusukebe.com/archives/2012/03/10/ume.jpg" width="600" height="448" class="mt-image-none" style="" /></p>

<p>帰りは浜松で餃子を食った。野菜しか入ってないんじゃねって感じで旨いんだけど、するともはや餃子じゃないんじゃないか。</p>

<p><img alt="gyouza.jpg" src="http://yusukebe.com/archives/2012/03/10/gyouza.jpg" width="600" height="448" class="mt-image-none" style="" /></p>

<p>おまけ。名古屋城で見つけたチンコ。</p>

<p><img alt="chinko.jpg" src="http://yusukebe.com/archives/2012/03/10/chinko.jpg" /></p>
]]>
        

    </content>
</entry>

<entry>
    <title>iPhoneアプリ「僕のラジオ」をリリースしました</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120309/104143.html" />
    <id>tag:yusukebe.com,2012://2.10061</id>

    <published>2012-03-09T01:41:43Z</published>
    <updated>2012-03-09T03:32:18Z</updated>

    <summary>僕の第2弾iPhoneアプリ「僕のラジオ」の「より安定板」な1.1.0が公開され...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iOS" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="僕のラジオ" label="僕のラジオ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>僕の第2弾iPhoneアプリ「<strong>僕のラジオ</strong>」の「より安定板」な1.1.0が公開されたのでお知らせします！</p>

<p>
<a href="http://itunes.apple.com/jp/app/id506239642?mt=8"><img src="http://yusukebe.com/archives/2012/03/09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-09%2010.15.50.png" /></a>
</p>

<p>僕のラジオはiTunes Music Store内の音楽を楽しもう！ってことで作りました。
iTunes Storeでは楽曲ごとに30秒ごとの短いサンプルが用意されているのですが
（最近だと90秒もありますが今回は使ってません）、それを快適に聴くことができるプレイヤーです。
サンプル音源をラジオのように流していくので「僕ラジオ」というネーミングにしました。</p>

<p><strong>＊</strong> なので、決して<strong><a href="http://kimi.la">君のラジオ</a>のiPhone版というわけではない</strong>のですが、
これから述べるように「新しい音楽に出会う」という意味ではコンセプトの近いアプリになります。</p>

<p>聴くためのアクションは2通りあります。ひとつ目はランキングから選ぶ方法。
以下の17の項目から選んで1位から300位までの曲を連続で再生していくことができます。</p>

<ol>
<li>全てのジャンル</li>
<li>J-POP</li>
<li>R&amp;B/ソウル</li>
<li>アニメ</li>
<li>エレクトロニック</li>
<li>オルタナティブ</li>
<li>クラシック</li>
<li>サウンドトラック</li>
<li>ジャズ</li>
<li>ダンス</li>
<li>ヒップホップ/ラップ</li>
<li>ブルース</li>
<li>ポップ</li>
<li>レゲエ</li>
<li>ロック</li>
<li>ワールド</li>
<li>歌謡曲</li>
</ol>

<p>ふたつ目の聴き方はアーティストごとの人気曲を聴いていく方法です。
最近ではかなりアーティストがiTunes Storeでカバーされているのでなかなか楽しめます。
以下がランキング→視聴の模様のスクリーンショットです。</p>

<p>
<img src="http://yusukebe.com/archives/2012/03/09/ss01.png" width="300" />
<img src="http://yusukebe.com/archives/2012/03/09/ss02.png" width="300" />
</p>

<p>聴いている曲が気になった時は詳細を表示して、そのままiPhone内のiTunes Storeのアプリを立ち上げ、
曲を購入することも簡単にできます。
僕のラジオを開発しながら利用してみてランキングを垂れ流して聴いていると、
聴いたことないけど「いいな」って思う曲がたくさんあります。
実際「家入レオのサブリナ」買っちゃいましたよ！
僕のラジオを通じて新しい音楽に出会うってことがある程度かなえられるのかなぁなんて思っています。</p>

<p>以下が機能を列挙したものです。当然ながらバックグランド再生にも対応しています。</p>

<ul>
<li>各種ジャンルを1位から300位まで連続再生</li>
<li>曲を指定しての再生も可能</li>
<li>曲の詳細情報表示</li>
<li>詳細表示からiTunes Storeへ飛び直接購入ができます</li>
<li>アーティスト検索</li>
<li>ループ再生ON/OFF</li>
<li>アーティスト閲覧履歴</li>
<li>バックグランド再生</li>
<li>ロック画面からの操作(STOP/PLAYのみ対応)</li>
<li>ロック画面でのアートワーク表示 </li>
</ul>

<p>類似アプリはあるもの、上記以外にもちょっとしたコダワリをちりばめたつもりなので使いやすいと思います。
個人的には曲と曲のクロスフェードなつなぎが気に入っています。</p>

<p>値段は通常170円で売ろうかなーとざっくり考えているのですが、
3月31日までは85円の最安値で販売しております。よろしければ是非お試しください！
ご感想はレビュー欄もしくは<a href="http://twitter.com/yusukebe">@yusukebe</a>まで！</p>

<ul>
<li><a href="http://itunes.apple.com/jp/app/id506239642?mt=8">僕のラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>Webアプリのパフォーマンスアップ作戦</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120306/211114.html" />
    <id>tag:yusukebe.com,2012://2.10060</id>

    <published>2012-03-06T12:11:14Z</published>
    <updated>2012-03-06T12:34:03Z</updated>

    <summary>予定している機能を実現するアプリが完成するだけでWebサービスが成り立つわけでは...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Technologies" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>予定している機能を実現するアプリが完成するだけでWebサービスが成り立つわけではありません。
運用の最中にパフォーマンスにまつわる問題が出てくる可能性があります。
それは突然大きなトラフィックがやってきたというような時だけではありません。
知識が無いうちですと、いざ運用に乗せてみるとずいぶんとサイトの読み込みが遅いといったケースが発生することもあります。</p>

<p>僕はいくつかのエロサイトを管理しているのですが、
その中に月間700万PVのアクセスをいただいている「サイトA」があります。
サイトAの場合、トラフィックもそこまで無かった当初からパフォーマンスに関する問題がいくつか発生し、
その都度調べては実践で試して対策をしてきました。また、できる限り少ないリソースでの運用を目指しています。
今回はWebアプリのパーフォマンスアップ作戦として、
サイトAでの運用経験からのいくつかの方針やTipsを紹介したいと思います。</p>

<hr />

<p><br></p>

<h4>それはどこのパフォーマンス問題？</h4>

<p>まず、パフォーマンスといってもWebアプリの場合、どこがボトルネックになっているか？
その「どこ」を把握することが大事です。単に「Webサイトが遅いよ」と言っても、
Webページ自体のレスポンスを返すのが遅いのか、ページ内で使われている画像の配信が遅いのか、描画が遅いのか... 
様々なケースが考えられます。
そこで、大きく切り分けて以下の3つでパフォーマンスを考えるといいと思っています。</p>

<ul>
<li>バックエンド、アプリ部分のリクエストを処理する際の性能</li>
<li>フロントエンド、アプリ部分以外のページ全体を構成するパーツ郡の配信性能</li>
<li>クライアント、ページ全体を描画する際にクライアントにどれだけ負荷をかけるかの性能</li>
</ul>

<p>今回はあえて、フロントエンドとクライアントを分けて考えています。
クライアントは人間がページを見る場合ですと、
昨今、マシンの性能が上がっているので、ある程度負荷をかけてもいいところかもしれませんが、意識することは必要です。</p>

<h4>バックエンドの性能計測</h4>

<p>パフォーマンスに対する問題を解決するには、対策と結果をどちらも把握しなくてはいけません。
それには結果に対する計測が必要になってきます。ちなみに、最初に言っておきますと、
計測の原則として常に同じ環境で計測するというのが前提となってきます。</p>

<p>さて、バックエンドの性能を計測するには一般的にApache Benchmark「ab」というコマンドが使われています。
その名の通りApacheに付属しているツールです。</p>

<p>「http://127.0.0.1:5000/」にリクエストしてパフォーマンスを計測するには以下のようなコマンドを実行します。</p>

<pre><code>$ ab -n 100 -c 10 "http://127.0.0.1:5000/"
</code></pre>

<p>オプションの「-n」はリクエストの回数、「-c」は同時接続数を意味します。結果は以下のように出力されます。</p>

<pre><code>Benchmarking 127.0.0.1 (be patient).....done

Server Software:        
Server Hostname:        127.0.0.1
Server Port:            5000

Document Path:          /
Document Length:        271 bytes

Concurrency Level:      10
Time taken for tests:   0.227 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      44000 bytes
HTML transferred:       27100 bytes
Requests per second:    440.95 [#/sec] (mean)
Time per request:       22.678 [ms] (mean)
Time per request:       2.268 [ms] (mean, across all concurrent requests)
Transfer rate:          189.47 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   4.4      0      20
Processing:     4   20  12.8     20     104
Waiting:        0   19  12.7     19     103
Total:          4   22  13.1     22     104

Percentage of the requests served within a certain time (ms)
  50%     22
  66%     23
  75%     24
  80%     26
  90%     36
  95%     46
  98%     56
  99%    104
 100%    104 (longest request)
</code></pre>

<p>ここで注目したいのは「Request per second」という欄ですね。</p>

<pre><code>Requests per second:    440.95 [#/sec] (mean)
</code></pre>

<p>これは秒間に「440.95リクエスト」を処理しているということを意味しています。
「Hello World」程度のWebアプリなので速い数字が出てます。
この数字は複雑な処理をしたり、データベースアクセスやWeb APIへの接続をするアプリになってくると、
極端に小さくなっていきます。つまりアプリの処理速度が低下することを意味します。
サービスの規模や処理内容によるのでどういう数値が適切かはケースバイケースですが、
バックエンドのパフォーマンス計測に使う値の一つです。</p>

<h4>Webサーバの構成</h4>

<p>「サイトA」はPerl製のPSGI互換Webアプリとしてつくられています。
よって様々なWebアプリケーションサーバで起動することができるのですが、サイトAの場合は「Starman」を使用しています。
このStarmanで立ち上げているアプリだけでサイト内のコンテンツを全て配信して完結させることは可能ですが、
フロントエンドサーバとして「nginx」を構えさせています。
nginxがCSSや画像ファイルなどの静的コンテンツの配信とリバースプロキシによるバックエンド、
つまりStarmanとのつなぎをしています。</p>

<p><img src="http://farm8.staticflickr.com/7045/6958632065_4d8ce12f0d.jpg" alt="サーバ構成" title="" /></p>

<p>Starmanなどで起動するアプリサーバのプロセスがどうしてもメモリを占有してしまうために、
画像などのアクセスの多いコンテンツはフロントエンドに任せています。
サイトAの場合だとStarmanの子プロセスが一つ50MBほどになってしまいますから、
静的ファイルを全てアプリケーションサーバで配信すると大変なのです。
このような構成にすることで、最小限の動的コンテンツ部分をアプリケーションサーバで担うことになって、
プロセス数の把握がしやすくなり、プリフォークさせるプロセス数の調整がしやすくなります。</p>

<h4>アプリケーションでのキャッシュ</h4>

<p>アプリケーションでのキャッシュをすることはバックエンドの性能を向上させる常套手段でもあります。
キャッシュプログラムでよく使うのは「set」と「get」で、それぞれ簡単な概念です。
とあるキーを指定して、値をキャッシュするにはこのようなプログラムになるでしょう。</p>

<pre><code> $cache-&gt;set('key', $value);
</code></pre>

<p>値を取り出す時は、</p>

<pre><code>my $cached_value = $cache-&gt;get('key');
</code></pre>

<p>とします。memcachedなどを利用した場合、「set」する際にキャッシュの有効期限を指定することができます。
例えば、24時間だけ値をキャッシュしたい時には</p>

<pre><code>$cache-&gt;set('key', $value, 60 * 60 * 24);
</code></pre>

<p>と、秒単位で時間を記述します。この有効期限を利用して、
サイト内で頻繁にアクセスのあるデータをある一定時間キャッシュさせるということをサイトAでは行っています。</p>

<pre><code>my $data = $cache-&gt;get('key');
return $data if $data;
$data = $api-&gt;get_data();
$cache-&gt;set('key', $data, 60 * 60 * 24);
return $data;
</code></pre>

<p>このコードは、もし、キャッシュにヒットしたらその値を即座に返し、そうじゃなかったらデータを取得し、
キャッシュに設定するということを意味しています。
このコードはよく使うパターンです。</p>

<p>また、データのキャッシュよりも効果的なのは、制限が多くなりますが、
HTMLのページをまるごともしくは一部をキャッシュする方法です。
Web Application Framework内でビューを通してレンダリングした結果をキャッシュに乗せてそれを利用すればよいでしょう。</p>

<h4>クライアント側でのパフォーマンス計測と対策</h4>

<p>静的コンテンツの配信、そしてそれの描画に関するクライアント側での最終的なパフォーマンス計測には、
ブラウザのアドオンであるYahoo! YSlowやGoogle Page Speedなどが利用されています。
対象となるサイトをブラウザ開きつつアドオンを起動すると様々なチューニングポイントと共に、
「A」とか「C」とかアルファベットでスコアを付けてくれます。
ちなみに今、サイトAのランクを計ったら「B」のスコアをいただきました。</p>

<p><img src="http://farm8.staticflickr.com/7205/6812552230_03f061c682.jpg" alt="YSlow" title="" /></p>

<p>これを「A」にしなくてはいけないというわけでは決してないです。
それぞれのチューニングポイントは、サイトによって達成しなくていい項目も含まれているからです。</p>

<p>僕は最低限、自分がフロントエンドサーバで配信するコンテンツに関しての「header」調整はします。
特に「expires header」を適切に設定することでクライアント側に画像やCSSなどのファイルのキャッシュをすることができます。
サイトAでは極力長く1年間のexpiresを設定しています。nginxのコンフィグファイルは以下のように記述しています。</p>

<pre><code>location ~ ^/(favicon.ico|images|js|css)/  {
    expires 1y;
}
</code></pre>

<p>注意したいのはこちらが意図的に「/css/style.css」を書き換えたとすると、
そのファイルのクライアント側のキャッシュを解除しなくてはいけません。
対象となるCSSを読み込むHTMLでファイル名にパラメータを付加することで強制的に書き換えた新しいものを読み込ませています。</p>

<pre><code>&lt;link rel="stylesheet" href="/css/style.css?v=0002" /&gt;
</code></pre>

<p>クライアントサイドに関して様々な環境が存在するので、ある程度慎重にパフォーマンスを改善していくことがいいと思います。
ちなみにフロントとクライアントサイドのチューニングについては以下の書籍が詳しいです。</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311361X/kamawada-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51hIDIWHmYL._SL160_.jpg" alt="ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311361X/kamawada-22/ref=nosim/" name="amazletlink" target="_blank">ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/487311361X/kamawada-22/ref=nosim/" title="ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール" target="_blank">amazlet</a> at 12.03.06</div></div><div class="amazlet-detail">Steve Souders スティーブ サウダーズ <br />オライリージャパン <br />売り上げランキング: 91462<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/487311361X/kamawada-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<p><br /></p>

<h4>まとめ</h4>

<p>他にもサーバ構成をより見直すことができますし、非同期で処理するべき点はそうすべきかもしれませんし、
データベースアクセスなどは簡単に改善ポイントであります。
サイトAを例に取りましたが、やり方は色々あるので一つの参考にしてください。
また、Web上にも似たような事例、もっと大規模なチューニング事例が多く掲載されているのでそちらも見てみるとよいと思います。</p>

<h4>お知らせ</h4>

<p>メルマガ「ゆーすけべーラジオ」でもWebアプリのつくり方を連載しています。よろしければお試し購読を！</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html" title="ゆーすけべーラジオ">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>全裸で学ぶMVC事始め</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120306/061542.html" />
    <id>tag:yusukebe.com,2012://2.10059</id>

    <published>2012-03-05T21:15:42Z</published>
    <updated>2012-03-05T22:22:06Z</updated>

    <summary>一般的なWeb Application Framework（WAF）ではMVCと...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mojolicious" label="Mojolicious" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="zenrize" label="zenrize" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>一般的なWeb Application Framework（WAF）ではMVCという設計及び実装における概念が取り入れられています。
MVCに従ってつくるのが全てではありませんが、
WAFを使うと共に、一度はMVCを用いたWebアプリの開発経験はしておいた方がよいと思います。
MVCはモデル（Model）、ビュー（View）、コントローラ（Controller）の3つの単語を組み合わせた言葉で、
この3つで概念が成り立っています。
クライアントがWebに対してリクエストをした時に、これら3つがそれぞれ連動して結果を返します。
一般的には以下のような処理経路をたどります。</p>

<ol>
<li>クライアントがWebサイトにリクエスト</li>
<li>コントローラがリクエストの処理を行い、モデルとビューを動かす</li>
<li>必要に応じてモデルを呼び出す</li>
<li>結果のデータをビューに渡す</li>
<li>ビューがHTML化などをしたものをクライアントに表示する</li>
</ol>

<p><img src="http://farm8.staticflickr.com/7049/6810860068_1259706ebc.jpg" alt="MVC" title="" /></p>

<p>MVCという概念を学ぶにはこうした一連の流れを網羅する小さなサンプルをつくるのが一番取っ付きやすい気がします。
そこで今回は「全裸で学ぶMVC事始め」と題し、
zenrizeというテキスト処理を行うだけのWebサービスをつくってみたいと思います。</p>

<h4>zenrize</h4>

<p>zenrizeという聞き慣れない言葉が出てきましたが、これは単に僕がつくった言葉です。
zenrizeは「全裸bot」という<a href="http://twitter.com/sugyan">sugyan</a>がつくった
非常にくだらないTwitterボットの内部で行われている処理を指します。
全裸botではテキストの適切な位置に「全裸で」というフレーズを付け加えることにより、
Twitterのつぶやきを丸裸にします。
例えば、</p>

<blockquote>
  <p>これから歯磨きをするよ</p>
</blockquote>

<p>という文章はおそらく以下のようにzenrize処理されます。</p>

<blockquote>
  <p>これから全裸で歯磨きをするよ</p>
</blockquote>

<p>全裸botでは<a href="http://d.hatena.ne.jp/sugyan/20090930/1254242601">作者sugyanによる試行錯誤が行われている</a>のですが、
今回はzenrizeを単純に「文章内の動詞の前に【全裸で】を必ずつける」と定義してみます。</p>

<h4>Yahoo! 形態素解析APIを使う</h4>

<p>日本語の文章内の品詞を特定するには形態素解析と呼ばれる処理をします。
お手軽に実装するには、Yahoo! APIで提供されている<a href="http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html">形態素解析API</a>を利用したいところです。</p>

<p>一からWeb APIにリクエストをし結果をパースするプログラムを書かずに今回は、
CPANモジュールから「<a href="http://search.cpan.org/dist/WebService-YahooJapan-WebMA/">WebService::YahooJapan::WebMA</a>」を使ってみたいと思います。</p>

<p>簡単なスクリプトでzenrizeがされるかを試してみましょう。</p>

<pre><code>use strict;
use warnings;
use WebService::YahooJapan::WebMA;
use utf8;

$WebService::YahooJapan::WebMA::APIBase =
  'http://jlp.yahooapis.jp/MAService/V1/parse';
my $api = WebService::YahooJapan::WebMA-&gt;new( appid =&gt; 'yourappid', );

my $result = $api-&gt;parse( sentence =&gt; '起きたのでご飯を食べます' )
  or die $api-&gt;error;
my $ma_result = $result-&gt;{ma_result};

my $text = '';
for my $word ( @{ $ma_result-&gt;{word_list} } ) {
    if ( $word-&gt;{pos} eq '動詞' ) {
        $text .= "全裸で$word-&gt;{surface}";
    }
    else {
        $text .= $word-&gt;{surface};
    }
}

print $text . "\n";
</code></pre>

<p>結果は以下のようになりました。</p>

<pre><code>全裸で起きたのでご飯を全裸で食べます
</code></pre>

<p>いい感じです。
Yahoo! のWeb APIはデータリソースとし、それを扱うこうしたプログラム部分が以降モデルとなります。</p>

<h4>Sinatraライクに実装する</h4>

<p>MVCを理解するためにSinatraライクなPerlのWAF、Mojolicious::Liteを使います。
これだと1ファイルにMVCの全ての要素を詰め込めて俯瞰することができるのではないでしょうか。</p>

<p>まずはモデルを実装します。これはWebService::YahooJapan::WebMAのインスタンスを保持し、
zenrizeメソッドを上記のスクリプトと同じように実装した簡単なモジュールです。</p>

<pre><code>package Zenra::Model;
use WebService::YahooJapan::WebMA;
use utf8;

$WebService::YahooJapan::WebMA::APIBase =
  'http://jlp.yahooapis.jp/MAService/V1/parse';

sub new {
    bless { yahoo_ma =&gt;
          WebService::YahooJapan::WebMA-&gt;new( appid =&gt; 'yourappid, ), },
      shift;
}

sub zenrize {
    my ( $self, $sentence ) = @_;
    return unless $sentence;
    my $api       = $self-&gt;{yahoo_ma};
    my $result    = $api-&gt;parse( sentence =&gt; $sentence ) or return;
    my $ma_result = $result-&gt;{ma_result};

    my $result_text = '';
    for my $word ( @{ $ma_result-&gt;{word_list} } ) {
        if ( $word-&gt;{pos} eq '動詞' ) {
            $result_text .= "全裸で$word-&gt;{surface}";
        }
        else {
            $result_text .= $word-&gt;{surface};
        }
    }
    return $result_text;
}
</code></pre>

<p>次にコントローラ部分を実装します。と、その前にアプリケーションの設定でモデルを登録しているコードも含まれています。
「get」「post」メソッドでそれぞれのメソッドに応じたルーティングを設定し、
リクエストを処理、ビューを用いてHTMLをレンダリングしています。</p>

<pre><code>package main;
use Mojolicious::Lite;
use Encode;

app-&gt;helper(
    model =&gt; sub {
        Zenra::Model-&gt;new;
    }
);

get '/' =&gt; sub {
    my $self = shift;
    $self-&gt;render('index');
};

post '/result' =&gt; sub {
    my $self        = shift;
    my $text        = $self-&gt;req-&gt;param('text');
    my $result_text = $self-&gt;app-&gt;model-&gt;zenrize( decode_utf8($text) )
      or return $self-&gt;redirect_to('/');
    $self-&gt;stash-&gt;{result} = $result_text;
    $self-&gt;render('result');
};

app-&gt;start;
</code></pre>

<p>最後にビューの実装です。これはMojo::Templateと呼ばれるMojoliciousで使われているテンプレートの記述です。</p>

<pre><code>@@ index.html.ep
&lt;form action="/result" method="post"&gt;
&lt;textarea rows="3" cols="60" name="text"&gt;&lt;/textarea&gt;
&lt;br /&gt;
&lt;input type="submit" value="zenrize" /&gt;
&lt;/form&gt;

@@ result.html.ep
&lt;p&gt;
&lt;b&gt;&lt;%= $result %&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;a href="/"&gt;戻る&lt;/a&gt;
</code></pre>

<p>Mojolicious:Liteではこうしたビューをデータセクションに書くことができます。</p>

<p>では繋ぎ合わせた全てのコードをお見せいたします。</p>

<pre><code>#!/usr/bin/env perl
package Zenra::Model;
use WebService::YahooJapan::WebMA;
use utf8;

$WebService::YahooJapan::WebMA::APIBase =
  'http://jlp.yahooapis.jp/MAService/V1/parse';

sub new {
    bless { yahoo_ma =&gt;
          WebService::YahooJapan::WebMA-&gt;new( appid =&gt; 'yourappid', ), },
      shift;
}

sub zenrize {
    my ( $self, $sentence ) = @_;
    return unless $sentence;
    my $api       = $self-&gt;{yahoo_ma};
    my $result    = $api-&gt;parse( sentence =&gt; $sentence ) or return;
    my $ma_result = $result-&gt;{ma_result};

    my $result_text = '';
    for my $word ( @{ $ma_result-&gt;{word_list} } ) {
        if ( $word-&gt;{pos} eq '動詞' ) {
            $result_text .= "全裸で$word-&gt;{surface}";
        }
        else {
            $result_text .= $word-&gt;{surface};
        }
    }
    return $result_text;
}

package main;
use Mojolicious::Lite;
use Encode;

app-&gt;helper(
    model =&gt; sub {
        Zenra::Model-&gt;new;
    }
);

get '/' =&gt; sub {
    my $self = shift;
    $self-&gt;render('index');
};

post '/result' =&gt; sub {
    my $self        = shift;
    my $text        = $self-&gt;req-&gt;param('text');
    my $result_text = $self-&gt;app-&gt;model-&gt;zenrize( decode_utf8($text) )
      or return $self-&gt;redirect_to('/');
    $self-&gt;stash-&gt;{result} = $result_text;
    $self-&gt;render('result');
};

app-&gt;start;

__DATA__

@@ index.html.ep
% layout 'default';
&lt;form action="/result" method="post"&gt;
&lt;textarea rows="3" cols="60" name="text"&gt;&lt;/textarea&gt;
&lt;br /&gt;
&lt;input type="submit" value="zenrize" /&gt;
&lt;/form&gt;

@@ result.html.ep
% layout 'default';
&lt;p&gt;
&lt;b&gt;&lt;%= $result %&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;a href="/"&gt;戻る&lt;/a&gt;

@@ layouts/default.html.ep
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;&lt;/head&gt;
&lt;body style="width:500px;margin:0 auto;"&gt;&lt;h1&gt;zenrize&lt;/h1&gt;&lt;%= content %&gt;&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>これを「zenra.pl」などと保存し実行したりplackupで指定したりするとWebブラウザからzenrizeを試すことができます。</p>

<p>こちらがトップの入力画面です。</p>

<p><img src="http://farm8.staticflickr.com/7177/6810955350_0239bf35d6.jpg" alt="zenrize1" title="" /></p>

<p>結果です。</p>

<p><img src="http://farm8.staticflickr.com/7068/6957065013_e5311bb2c0.jpg" alt="zenrize2" title="" /></p>

<p>見事にzenrizeされたテキストがWebに表示されているではないですか！</p>

<h4>まとめ</h4>

<p>MVCを理解するために駆け足でzenrizeという題材の小さなWebアプリをつくってみました。
公開するにはちょっと不安な要素がいくつかありますが手元で確認するにはよい例だと思います。
そろそろ暖かくなる季節なので、「全裸で」Webアプリをつくるのもいいと思います！</p>

<h4>お知らせ</h4>

<p>メルマガ「ゆーすけべーラジオ」でもWebサービスにまつわるエピソードを連載中です。
よろしければお試しを！</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>CSS Frameworkを持つ</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120305/075231.html" />
    <id>tag:yusukebe.com,2012://2.10058</id>

    <published>2012-03-04T22:52:31Z</published>
    <updated>2012-03-04T23:06:28Z</updated>

    <summary>例えば、Webサービスのフロントエンドのコードを書き始める時にまず何をするでしょ...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Technologies" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Web Essay" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="css" label="css" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>例えば、Webサービスのフロントエンドのコードを書き始める時にまず何をするでしょうか？
デザインスケッチや画像を元にHTMLとCSSを記述していくことになると思います。
少なくとも僕はそうですね。
理論的にはHTMLだけでもWebサービスを作ることはもちろんできますが、
見た目を少しでも調整したいとなるとCSSが必要になります。
例えばCSSを使わないHTMLの場合、いくら単純なレイアウトだとしても、
デフォルトのリンクの色を変えたかったり、フォントを変更したかったり、
要素ごとの余白をどうにかしかったりと最低限の要望が出てきます。
こうした最低限のCSSに対するニーズは共通化して自分なりのCSS Frameworkとして持っておくとよいと思います。
近頃、一からCSSを記述しなくなったのもこうした考え方のおかげです。</p>

<p>今Web上で配布されて利用可能なCSS Framworkが非常に増えています。
僕も色々と探しては使ってみています。よく使われている、
もしくは僕が使っているCSS Framworkには以下のようなものがあります。</p>

<ul>
<li>Blueprint</li>
<li>960.gs</li>
<li>Bluetrip</li>
<li>YUI CSS</li>
<li>inuit.css</li>
<li>Twitter bootstrap</li>
<li>jQuery UI CSS Framework</li>
<li>Less Framework</li>
</ul>

<p>こうした数あるFramworkのうち、お気に入りを見つけるのもよし、
参考にして自分なりのCSS Frameworkを作るのもよいと思います。
そして結果的に「CSS Frameworkを持つ」ことになると開発が効率的になるのかなぁと。</p>

<p>では、CSS Frameworkでは何が出来るのかを見て行きます。
そのことで、自作のFrameworkを作る際にもどのような要素を考慮すればいいかが分かると思います。
分かりやすい例として以前から使っている<a href="http://bluetrip.org/">BluetripというCSS Framework</a>を紹介します。
BluetripはBlueprintや960.gsなど様々なFrameworkのいいとこ取りをした、けれども最低限のFrameworkです。</p>

<p><img src="http://farm8.staticflickr.com/7045/6807644790_9f46dd517e.jpg" alt="Bluetrip" title="" /></p>

<hr />

<p><br /></p>

<h4>スタイルの初期化</h4>

<p>CSS Frameworkではスタイルの初期化をしてくれるのが一番の効用かもしれません。
Bluetripの.cssファイルを見ると最初の冒頭でリセットと呼ばれる該当する要素に対してのマージンやパディングの無効化、
行間の調整などが一気に行われています。
ヘッダー要素、マージンとパディングに限れば以下のようなCSSになります。</p>

<pre><code>h1,h2,h3,h4,h5,h6{margin:0;padding:0;}
</code></pre>

<p>そしてその後、要素ごとに適切なスタイルを、この場合だとマージンやパディングを設定しています。
以下はヘッダー要素の記述です。</p>

<pre><code>h1 { margin: 1em 0 .5em;  }
h2 { margin: 1.07em 0 .535em; }
h3 { margin: 1.14em 0 .57em; }
h4 { margin: 1.23em 0 .615em; }
h5 { margin: 1.33em 0 .67em; }
h6 { margin: 1.6em 0 .8em; }
</code></pre>

<p>配布されているCSS Frameworkはおそらく作者のポリシーも含んだマージンや行間、
配色などの設定がなされていると思われます。そのまま使ってもよいですし、
多少の修正を加えることもCSSを上書きするか、修正などすれば容易です。
このスタイルの初期化によってプレーンな構造のHTMLがより見やすくなってくれます。
また、ブラウザごとの依存を吸収してくれる作用もあります。</p>

<h4>タイポグラフィー</h4>

<p>スタイルの初期化とも呼べるかもしれませんが、CSS Frameworkはそれぞれなりのフォントを要素ごとに設定してくれます。
Webで共通的に使える日本語のフォントが非常に少ないために日本人にはあまり恩恵がないかもしれませんが、
英字に限っては効果的です。
Bluetripはhtml要素全体と太字に対して以下のようなタイポグラフィーを設定しています。</p>

<pre><code>html { font-size: 62.5%; font-family: "Liberation Sans", Helvetica, Arial, sans-serif; }
strong, th, thead td, h1, h2, h3, h4, h5, h6 { font-weight: bold; }
</code></pre>

<p>また、Bluetripの面白いところは「.fancy」クラスを付けた要素に対しては「かわいらしいフォント」を表示する機能があります。</p>

<p><img src="http://farm8.staticflickr.com/7185/6807652332_aa80c8a05e.jpg" alt=".fancy" title="" /></p>

<p>CSSの実装はこのような具合でした。</p>

<pre><code>.fancy { color: #666; font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif; font-style: italic; font-weight: normal; }
</code></pre>

<h4>グリッドレイアウト</h4>

<p>スタイルの初期化の次にCSS Frameworkに欲しい機能なのがグリッドレイアウトです。
例えば横幅が分かりやすいように900pxのページだとして、3つの領域に分けるとしたら、300pxのグリッドが3つできます。
このグリッドに基づきコンテンツを配置していくのがグリッドレイアウトの使い方です。 <br />
Bluetripは、ページ大枠の幅は950pxなのですが、それを最適に24個のグリッドに分けています。
例えば、左側に8個のグリッドのサイドメニュー、右側に16個のグリッドのメインコンテンツというレイアウトにしたければ、
以下のようなHTMLを記述します。</p>

<pre><code>&lt;div class="span-8"&gt;
    サイドメニュー
&lt;/div&gt;
&lt;div class="span-16 last"&gt;
    メインコンテンツ
&lt;/div&gt;
</code></pre>

<p>タブーと言われているようなtableレイアウトを使わずにこうしたグリッドレイアウトを記述するには、
ちょっとした苦労とノウハウが必要なのですが既存のCSS Frameworkを使ったり、真似したりすると楽ですね。</p>

<h4>パーツ</h4>

<p>Bluetripでは、クラスを指定することでアンカー要素をボタンっぽく見せるための機能があったりします。
UIを構成するパーツのスタイリングですね。</p>

<pre><code>&lt;a class="button"&gt;OK&lt;/a&gt;
</code></pre>

<p>とするだけで、見栄えの効くパーツに変換してくれます。</p>

<p><img src="http://farm8.staticflickr.com/7047/6807721812_0923f2df23.jpg" alt="ボタン" title="" /></p>

<h4>印刷用CSS</h4>

<p>印刷用CSSが付いてくるCSS FrameworkもありBluetripもその一つです。
このようにHTMLのhead要素内で.cssを指定します。</p>

<pre><code> &lt;link rel="stylesheet" href="css/print.css" type="text/css" media="print" /&gt;
</code></pre>

<p>あまり意識をすることが無い印刷用CSSですが、サイトの種類によっては印刷する人が結構いるかもしれないので、
侮れないと思いました。</p>

<h4>スターターキット</h4>

<p>Bluetripの優れている点はサイトからZIPやTarをダウンロードして解凍すると、
中身のフォルダ・ファイル構造がいきなり使えるようになっていることです。</p>

<p><img src="http://farm8.staticflickr.com/7049/6807659154_6ed2c7769d.jpg" alt="ダウンロード、解凍後" title="" /></p>

<pre><code>./
├── css
│   ├── ie.css
│   ├── print.css
│   ├── screen.css
│   └── style.css
├── images
└── index.html
</code></pre>

<p>フォルダ内のindex.htmlにHTMLを書いて、style.cssには自分でカスタムしたいCSSを記載します。
フォルダのレイアウトを作ったり.cssへのパスを調べてhead内に書く作業が減るだけですが、
それだけでも時間短縮になってよいですね。</p>

<h4>まとめ</h4>

<p>BluetripというCSS Frameworkには以下の要素が備わっていることが分かりました。</p>

<ul>
<li>スタイル初期化</li>
<li>タイポグラフィー</li>
<li>グリッドレイアウト</li>
<li>パーツ</li>
<li>印刷用CSS</li>
<li>スターターキット</li>
</ul>

<p>これはあくまで一例なのですが、他のCSS Frameworkを吟味する際に参考にしてもらったり、
自分でFrameworkを作る際の指針になるかと思います。
CSS Frameworkを持つことはこうした要素を効率化していく効果があるのだと思います。</p>

<hr />

<p><br /></p>

<p>メルマガ「ゆーすけべーラジオ」でもこうしたWebサービスを作ることにまつわるエッセイを連載中です。
よろしければお試し購読を！</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html" title="ゆーすけべーラジオ">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

<entry>
    <title>月10万稼ぐにはiPhoneアプリ開発が一番速かった</title>
    <link rel="alternate" type="text/html" href="http://yusukebe.com/archives/20120303/071855.html" />
    <id>tag:yusukebe.com,2012://2.10056</id>

    <published>2012-03-02T22:18:55Z</published>
    <updated>2012-03-02T23:46:37Z</updated>

    <summary>実は大学時代の同期であるgamellaが面白いエントリーを書いていました。 題名...</summary>
    <author>
        <name>yusukebe</name>
        
    </author>
    
        <category term="Column" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iOS" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://yusukebe.com/">
        <![CDATA[<p>実は大学時代の同期であるgamellaが面白いエントリーを書いていました。
題名は「<a href="http://d.hatena.ne.jp/gamella/20120226/1330246228">ニート革命再々考とWebだけで月10万円稼げる力</a>」。</p>

<blockquote>
  <p>ニート革命、つまり職がないときにじゃーどうするの？という問題について、こんなことを書いていた。</p>

<p>...</p>

<p>最近はもう考え方が結構変わっていて、
とりあえずWebで月10万円稼げる方法を何とか見つける！というのが直近の答えなのかなーと思う。</p>

<p>...</p>
</blockquote>

<p>僕なりの解釈だと、Webだけで10万円を稼げれば、
住む場所によってはレバレッジが効いて場所と時間に束縛されないんで自由な生活できるんじゃね？ってとこです。</p>

<p>すごい同意です。特に今だったら日本円を稼いで東南アジアに住むなんてプランはありありだと思います。
また10万円という単位も一つの目標としてよい設定値だと思います。</p>

<p>さて、僕は、諸々の事情があって日本に住んでいますが、
Webだけで10万以上稼ぐことはしています。時間や場所に縛られている感覚もありません。
このWebだけで10万円ってのには様々な手段があります。また「Web」ってのをちょっと拡大解釈すると、
アプリ販売も候補に挙ります。</p>

<ul>
<li>アフィリエイトBlog</li>
<li>iPhoneアプリ販売</li>
<li>Webサービスで広告収入</li>
<li>メルマガ</li>
<li>etc...</li>
</ul>

<p>これら全て僕は実践してきた、もしくは実践しているものです。
そしていくつかは収入として10万円超えを達成しています。</p>

<p>で、僕が書きたかったのはこの中でも <strong>「iPhoneアプリ販売」が一番10万円を達成するのに素早かった</strong> という点です。</p>

<p><img src="http://yusukebe.com/archives/assets_c/2012/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-03-03%207.14.26-thumb-550x105-134.png" alt="グラフ" title="" /></p>

<p>このグラフは何も関係ないのですがw、まず販売から収入が入ってくるまで2ヶ月で月10万円超えを達成しました。
弊社の企業秘密的なことも含まれるので詳しいことは書きませんが、これは自分にとってかなり驚異的なスピードです。
また、アプリの開発期間は言語能力の取得も含めても2ヶ月ほど。
これを考慮しても速い。</p>

<p>アフィリエイトサイトで10万円以上を達成しているものを所持していますが、
結構この10万円というある意味大台へ載せるのに継続的な運用が必要だったりで大変です。</p>

<p>ま、だからと言ってニート革命の時代はiPhoneアプリを作ろう！というわけではないですが、
一つの事実として記してみたかったということです。iPhoneアプリで収入を得ることに関しては、
以下の本が面白いです。</p>

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839938067/kamawada-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51HZ65MHZSL._SL160_.jpg" alt="iPhoneアプリで稼ごう" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839938067/kamawada-22/ref=nosim/" name="amazletlink" target="_blank">iPhoneアプリで稼ごう</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4839938067/kamawada-22/ref=nosim/" title="iPhoneアプリで稼ごう" target="_blank">amazlet</a> at 12.03.03</div></div><div class="amazlet-detail">丸山弘詩 川畑雄補 脇俊済 <br />毎日コミュニケーションズ <br />売り上げランキング: 63241<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4839938067/kamawada-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

<p><br /></p>

<hr />

<p><br /></p>

<p>ちなみに現在は僕にとっての第2弾のiPhoneアプリの配信準備中です。また、
メルマガでは僕のWebで稼ぐワークスタイルを紹介していきたいと思うので興味のある方はお試し購読をば！</p>

<ul>
<li><a href="http://www.mag2.com/m/0001426750.html" title="ゆーすけべーラジオ">ゆーすけべーラジオ</a></li>
</ul>
]]>
        

    </content>
</entry>

</feed>

