<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.katsuma.tv</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/" />
    <link rel="self" type="application/atom+xml" href="http://blog.katsuma.tv/atom.xml" />
   <id>tag:blog.katsuma.tv,2011://1</id>
    <link rel="service.post" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1" title="blog.katsuma.tv" />
    <updated>2011-12-30T02:52:19Z</updated>
    <subtitle>適当に直感で思ったことを何も考えず発信</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type  3.33-ja</generator>
 
<entry>
    <title>2011年を振り返る</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/12/look_back_on_2011.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=237" title="2011年を振り返る" />
    <id>tag:blog.katsuma.tv,2011://1.237</id>
    
    <published>2011-12-30T02:45:35Z</published>
    <updated>2011-12-30T02:52:19Z</updated>
    
    <summary>    執筆            今年の目標、というかここ1,2年の目標で「本...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="diary" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[    <h3>執筆</h3>
    <p>
      今年の目標、というかここ1,2年の目標で「本にモノを書いて自分が得た知見、考えをもとに価値を提供する」みたいなものをずっと考えていました。それがひょんな所からかなって、<a href="http://blog.katsuma.tv/2011/12/webdb_press_vol_66.html">Web+DB PRESS vol.66で記事を書かせていただきました。</a></p>

    <p>
      今回の記事の後も技評の<a href="https://twitter.com/#!/inao">稲尾さん</a>とは仲良くさせていただいているので、今後もいろいろ僕なりのものを提供し続けられればな、と思っています。
    </p>

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

    <h3>仕事</h3>
    <p>仕事については、全体として良くも悪くも個人的にはスカっとできない感じがずっと続いていたと思います。。</p>
    <p>一方で、震災の時にやった「<a href="http://www.itmedia.co.jp/news/articles/1103/13/news012.html">限られた食材で工夫</a>」の話だったり、ここ最近のいろいろ責任が増えた中でリリースしたものだったり(割といい数字が出た)を振り返ると、やっぱり自分は追い込まれてる時のほうがいい結果が出やすいのかなぁと感じています。縛りのある中の方がパフォーマンスが出やすいというか。</p>

    <p>どんな時でもお前なんとかしろよ、な話ではあるかと思いますが、2012年は縛りをいい感じに自分でうまく設定して、パフォーマンスを上げていきたいですね。</p>

    <p>
      <ul>
        <li>
          <a href="http://cookpad.com/category/1693">限られた食材で工夫</a>
        </li>
      </ul>
    </p>


    <h3>プライベート</h3>
    <p>gem初めて作ったのはいい経験でした。</p>

    <p>
      <ul>
        <li>
          <a href="http://blog.katsuma.tv/2011/11/gem_musical.html">DVDデータをチャプタ毎にリッピング/wav変換するLionに対応したgem 'musical'</a>
        </li>
      </ul>
    </p>

    <p>同じように、最近YouTube絡みのコードも書きました。</p>

    <p>
      <ul>
        <li>
          <a href="http://blog.katsuma.tv/2011/12/taifu.html">YouTubeの音声をiTunesに転送する</a>
        </li>
      </ul>
    </p>


    <p>それぞれニッチなとこを狙ったものではありますが、自分も日常的に使うものになってるし、音楽に絡むコードを書く楽しさはこれらのコードを書くことを通じて再確認したので、来年もこんな感じのコードは書き続けたいな、と。</p>

    <h3>2012年</h3>
    <p>仕事でもっと圧倒的な結果を出したいですね!!!!1 それを元にして自分の知見だったり考えだったりをもっと外に広げたい、サービス開発エンジニアとしてはこれはやっぱり一番強く思っています。あと、仕事以外では、デバイス絡みでなんか作りたいと思っています。思っているというか構想はあるので、少しづつそれも実現していきたいですね。(最近また復活してきましたが)blogももっと書きますぞ!</p>
    <p>と、いうわけで来年もよろしくお願いします!</p>]]>
        
    </content>
</entry>
<entry>
    <title>YouTubeの音声をiTunesに転送する</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/12/taifu.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=236" title="YouTubeの音声をiTunesに転送する" />
    <id>tag:blog.katsuma.tv,2011://1.236</id>
    
    <published>2011-12-29T12:16:12Z</published>
    <updated>2011-12-29T12:37:07Z</updated>
    
    <summary>年の瀬になんかちゃっちゃと作りたかったので、単機能musicalみたいなtaif...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="ruby" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>年の瀬になんかちゃっちゃと作りたかったので、単機能musicalみたいな<a href="https://gist.github.com/1515069">taifu</a>というスクリプトを書きました。</p>

<p><script src="https://gist.github.com/1515069.js?file=taifu"></script></p>

<h3>これは何？</h3>
<p>YouTubeでかっこういい動画を見つけたときに、iTunesで音だけでも聴きたい！な時は割とあるかと思いますが、それを実現するスクリプトです。実行権限を追加して</p>

<p><pre>taifu http://www.youtube.com/watch?v=KPWfBfFFrwsx</pre></p>

<p>で、wavデータを標準のエンコーダ設定でエンコードして何事もなかったようにiTunesに追加します。（要VLC.app）</p>

<h3>タグ情報はどうなってるの？</h3>
<p>「TAIFU_NAME」「TAIFU_ARTIST」「TAIFU_ALBUM」の名前でタグ付けされているので、iTunes上から「TAIFU」で検索したら追加された曲が見つかるはずです。あとは自分の好みのタグ情報に更新ください。オプションで渡すことも考えたけど、iTunes上で編集したほうが楽だったのでやめました。</p>

<p>「あーこれいつでも聴いていたいな〜」なものを見つけたとき、ご利用ください！</p>]]>
        
    </content>
</entry>
<entry>
    <title>WEB+DB PRESS vol.66に寄稿しました</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/12/webdb_press_vol_66.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=235" title="WEB+DB PRESS vol.66に寄稿しました" />
    <id>tag:blog.katsuma.tv,2011://1.235</id>
    
    <published>2011-12-23T15:19:31Z</published>
    <updated>2011-12-23T15:42:34Z</updated>
    
    <summary>           Webエンジニアの教科書的存在であるWEB+DB PRES...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="book" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[    <p>
      Webエンジニアの教科書的存在である<a href="http://www.amazon.co.jp/gp/product/4774149365/ref=as_li_ss_tl?ie=UTF8&tag=katsumatv-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4774149365">WEB+DB PRESS</a><img src="http://www.assoc-amazon.jp/e/ir?t=katsumatv-22&l=as2&o=9&a=4774149365" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />ですが、本日12/23に発売のvol.66でのクックパッド特集で寄稿させていただきました。</p>

<p>第三章「ユーザを向いたものづくり」が僕の担当です。サービス開発の進め方について余すこと無くクックパッドでのプロセスを全部まとめています。ユーザを徹底的に向いた開発手法について興味のある方は是非一読ください。</p>
    <p>僕以外の記事もインフラ、開発基盤、スマートフォン開発、DevOpsと多岐に渡る分野の内容になっていて、かなり面白い内容になっていると思います。</p>
    <p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=katsumatv-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4774149365" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
    </p>
    <p>読もう！ WEB+DB PRESS！</p>]]>
        
    </content>
</entry>
<entry>
    <title>rb-appscriptを利用してwavデータを自動的にiTunesにタグ情報付きでエンコード、ライブラリに追加</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/11/itunes_by_rb_appscript.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=234" title="rb-appscriptを利用してwavデータを自動的にiTunesにタグ情報付きでエンコード、ライブラリに追加" />
    <id>tag:blog.katsuma.tv,2011://1.234</id>
    
    <published>2011-11-26T15:17:22Z</published>
    <updated>2011-11-26T15:56:34Z</updated>
    
    <summary>    musical 0.0.2リリース     musicalの0.0.2を...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="ruby" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[    <h3>musical 0.0.2リリース</h3>
    <p><a href="https://github.com/katsuma/musical">musical</a>の0.0.2をリリースしました。(インストールなんかの細かい話は<a href="http://blog.katsuma.tv/2011/11/gem_musical.html">こちら</a>)</p>

<p>リッピングしたwavデータを自動的にiTunesのエンコード設定(mp3/AAC/Appleロスレス...)に従ってエンコードし、アーティスト名とDVDタイトル名を与えることでタグ情報付きでライブラリに追加します。たとえばDVDをドライブに入れた状態で、次のように実行します。</p>

    <p><pre>musical --title "TOUR あいのわ" --artist ハナレグミ</pre></p>
    <p>そうすると、</p>
    <p>
      <ol>
        <li>チャプタごとにvobでリッピング</li>
        <li>wavに変換</li>
        <li>iTunesライブラリにwavを追加</li>
        <li>エンコード設定に従ってタグ付きでエンコード</li>
      </ol>
    </p>

    <p>の順に処理がすすみ、最終的にはiTunesのライブラリにこのように取り込まれます。</p>

    <p>
<img  src="http://blog.katsuma.tv/images/049ac944d0c9738d398daa4403b75db1.png" width="425" height="97" />
</p>
    <p>各チャプタのタイトルは今は自動にタグ付けする仕組みはないので、そこは自前で編集を。ここもうまく自動化したいのですが、DVD自身にはトラック情報を持っていないので、amazonなりから情報をうまく吸い出すなりいい方法を模索してます。</p>

    <p>--title, --artistを与えない場合は、それぞれ「LIVE」「ARTIST」の名前でタグ付けされます。また、半角スペースを挟む情報の場合(上の例だと、「TOUR あいのわ」)は、「"」と「"」で囲って渡してあげます。</p>

    <h3>rubyからiTunesを操作</h3>
    <p>iTunesを操作する処理については、<a href="http://appscript.sourceforge.net/rb-appscript/">rb-appscript</a>を利用しています。rb-appscriptは、AppleEventをブリッジしてrubyから扱えるようにしたライブラリで、AppleScriptに対応したアプリケーションは、全て制御することができます。</p>

    <p>一見、すごく便利で万能すぎるように思えるんですけど、ドキュメントが全くないのが辛いとこ。(単純にファイルをライブラリに追加するだけでも相当苦労しました。) 基本的に、method_missingで実装されているので、APIを把握してないと何も開発できません。。最初は、AppleScriptのAPIをdeveloper.apple.comからAPIを探しまくってたのですが、全然見つからなくて途方に暮れてたら意外にも手元にすでに存在してました。</p>

    <p>「アプリケーション」「ユーティリティ」から「Appleスクリプトエディタ」を起動し、「ウィンドウ」&gt;「ライブラリ」から「iTunes」を選択すると、AppleScript用のAPIが表示されます。(ちなみに裏技的に、Appleスクリプトエディタのアイコンに、iTunesのアイコンをD&Dしてもこのライブラリウィンドウは起動します。すごい使いづらいですけど。。)</p>

    <p>
<img src="http://blog.katsuma.tv/images/0e20d45228d622404c53980dead9fe01.png" width="533" height="446" />
</p>

    <p>これを元に、上で述べたファイルを追加+エンコードの基本的な操作をまとめるとこんなかんじになります。</p>
    <p><script src="https://gist.github.com/1380680.js?file=gistfile1.rb"></script></p>
    <p>見てわかる通り、割と直感的な操作が可能になっていると思います。基本的にはgetで情報を取得、setで更新し、このときにAppleEventが発行されています。(なので、できるだけget/setの数は減らすほうがイベント発行の節約になって、パフォーマンスが上がる)</p>


    <p>また、普段irbやpryなんかで簡単な操作をしているときに、APIを確認するまでもなく、ざっとプロパティを確認することくらいはもうちょっと手軽な方法で確認できます。<a href="http://appscript.sourceforge.net/tools.html">ASDictionary</a>をインストールしておくと、各オブジェクトに対してhelpメソッドを利用できます。たとえば、現在iTunes上で選択中のトラック、current_trackには次のようなプロパティが存在することを確認できます。</p>

    <p><pre>
$ pry
[1] pry(main)&gt; require 'appscript'
=&gt; true
[2] pry(main)&gt; include Appscript
=&gt; Object
[3] pry(main)&gt; its = app("iTunes.app")
=&gt; app("/Applications/iTunes.app")
[4] pry(main)&gt; its.current_track
=&gt; app("/Applications/iTunes.app").current_track
[5] pry(main)&gt; its.current_track.help
==============================================================================
Help (-t)

Reference: app("/Applications/iTunes.app").current_track

------------------------------------------------------------------------------
Description of reference

Property: current_track (r/o) : track -- the current targeted track


Terminology for track class

Class: track -- playable audio source
  Plural:
    tracks
  Inherits from:
    item (in iTunes Suite)
  Properties:
    container (r/o) : reference -- the container of the item
    id_ (r/o) : integer -- the id of the item
    index (r/o) : integer -- The index of the item in internal application order.
    name : unicode_text -- the name of the item
    persistent_ID (r/o) : string -- the id of the item as a hexidecimal string. This id does not change over time.
    album : unicode_text -- the album name of the track
    album_artist : unicode_text -- the album artist of the track
    album_rating : integer -- the rating of the album for this track (0 to 100)
    album_rating_kind (r/o) : :user / :computed -- the rating kind of the album rating for this track
    artist : unicode_text -- the artist/source of the track
    bit_rate (r/o) : integer -- the bit rate of the track (in kbps)
    bookmark : short_float -- the bookmark time of the track in seconds
    bookmarkable : boolean -- is the playback position for this track remembered?
    bpm : integer -- the tempo of this track in beats per minute
    category : unicode_text -- the category of the track
    comment : unicode_text -- freeform notes about the track
    compilation : boolean -- is this track from a compilation album?
    composer : unicode_text -- the composer of the track
    database_ID (r/o) : integer -- the common, unique ID for this track. If two tracks in different playlists have the same database ID, they are sharing the same data.
    date_added (r/o) : date -- the date the track was added to the playlist
    description : unicode_text -- the description of the track
    disc_count : integer -- the total number of discs in the source album
    disc_number : integer -- the index of the disc containing this track on the source album
    duration (r/o) : short_float -- the length of the track in seconds
    enabled : boolean -- is this track checked for playback?
    episode_ID : unicode_text -- the episode ID of the track
    episode_number : integer -- the episode number of the track
    EQ : unicode_text -- the name of the EQ preset of the track
    finish : short_float -- the stop time of the track in seconds
    gapless : boolean -- is this track from a gapless album?
    genre : unicode_text -- the music/audio genre (category) of the track
    grouping : unicode_text -- the grouping (piece) of the track. Generally used to denote movements within a classical work.
    kind (r/o) : unicode_text -- a text description of the track
    long_description : unicode_text
    lyrics : unicode_text -- the lyrics of the track
    modification_date (r/o) : date -- the modification date of the content of this track
    played_count : integer -- number of times this track has been played
    played_date : date -- the date and time this track was last played
    podcast (r/o) : boolean -- is this track a podcast episode?
    rating : integer -- the rating of this track (0 to 100)
    rating_kind (r/o) : :user / :computed -- the rating kind of this track
    release_date (r/o) : date -- the release date of this track
    sample_rate (r/o) : integer -- the sample rate of the track (in Hz)
    season_number : integer -- the season number of the track
    shufflable : boolean -- is this track included when shuffling?
    skipped_count : integer -- number of times this track has been skipped
    skipped_date : date -- the date and time this track was last skipped
    show : unicode_text -- the show name of the track
    sort_album : unicode_text -- override string to use for the track when sorting by album
    sort_artist : unicode_text -- override string to use for the track when sorting by artist
    sort_album_artist : unicode_text -- override string to use for the track when sorting by album artist
    sort_name : unicode_text -- override string to use for the track when sorting by name
    sort_composer : unicode_text -- override string to use for the track when sorting by composer
    sort_show : unicode_text -- override string to use for the track when sorting by show name
    size (r/o) : integer -- the size of the track (in bytes)
    start : short_float -- the start time of the track in seconds
    time (r/o) : unicode_text -- the length of the track in MM:SS format
    track_count : integer -- the total number of tracks on the source album
    track_number : integer -- the index of the track on the source album
    unplayed : boolean -- is this track unplayed?
    video_kind : :none / :movie / :music_video / :TV_show -- kind of video track
    volume_adjustment : integer -- relative volume adjustment of the track (-100% to 100%)
    year : integer -- the year the track was recorded/released
  Elements:
    artworks -- by index



==============================================================================
=&gt; app("/Applications/iTunes.app").current_track</pre></p>
    <p>実際は、さきほどのAppleスクリプトエディタのヘルプ情報から引っ張ってきて表示しているだけですが、都度手元で確認できるのは便利です。ざっとAPI全体を眺めて把握した上で、手元で動かしながら動作を確認するのが開発を進める方法として良さそうです。</p>

    <h3>今後の予定</h3>
    <p>当面、次の内容くらいはどうにかしたいです。</p>
    <p>
      <ul>
        <li>iTunesのライブラリに追加したとき、変換前のwavファイルをライブラリ上から削除</li>
        <li>副音声の扱いを制御</li>
        <li>テストを追加</li>
        <li>トラック名を自動追加</li>
      </ul>
    </p>

    <p>あとrb-appscriptめちゃめちゃ可能性を感じるので、こいつでもうちょっと遊んでみたいですね。API見ているだけでムフムフします。。！</p>


<p>
    <iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=katsumatv-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=B00317CONK" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</p>]]>
        
    </content>
</entry>
<entry>
    <title>Homebrewでffmpegインストール時の&quot;ERROR: libmp3lame &gt;= 3.98.3 not found&quot;を回避</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/11/brew_install_ffmpeg.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=233" title="Homebrewでffmpegインストール時の&quot;ERROR: libmp3lame &gt;= 3.98.3 not found&quot;を回避" />
    <id>tag:blog.katsuma.tv,2011://1.233</id>
    
    <published>2011-11-14T18:13:20Z</published>
    <updated>2011-11-14T18:30:20Z</updated>
    
    <summary>	前のエントリで「libmp3lameあたりでコケる」と言ったのですが、そのとき...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="osx" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[	<p><a href="http://blog.katsuma.tv/2011/11/gem_musical.html">前のエントリ</a>で「libmp3lameあたりでコケる」と言ったのですが、そのときの対応方法のメモ。</p>

	<h3>ERROR: libmp3lame &gt;= 3.98.3 not found</h3>
	<p>brew install ffmpegしたときのエラーはlibmp3lameが3.98.3以上のものが見つからないというエラーでした。ところが、</p>
	<p><pre>
$ lame --version  
LAME 64bits version 3.99.1 (http://lame.sf.net)

Copyright (c) 1999-2011 by The LAME Project
Copyright (c) 1999,2000,2001 by Mark Taylor
Copyright (c) 1998 by Michael Cheng
Copyright (c) 1995,1996,1997 by Michael Hipp: mpglib

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this program. If not, see
&lt;http://www.gnu.org/licenses/&gt;.</pre></p>

	<p>と、なっているので、lame本体は3.99.1の最新のものがインストールされているようです。要はこいつが認識されていないよう。</p>
	<p>最初は、(他の)ライブラリのインストールが失敗していて、正しく認識されないことを疑ったのですが、どうもそうではなさそう。</p>

	<h3>そもそもどのバージョンとして認識されているのか</h3>
	<p>インストールされていないことは無さそうなので、一体どのバージョンがインストールされていると見なされているんだろう、、途方に暮れつつも共有ライブラリのバージョンの確認方法がそもそもよくわかりません。。。とりあえず、libmp3lameのインストールされている場所を確認してみます。</p>

	<p><pre>
$ locate libmp3lame
/usr/lib/libmp3lame.dylib
/usr/local/Cellar/lame/3.99.1/lib/libmp3lame.0.dylib
/usr/local/Cellar/lame/3.99.1/lib/libmp3lame.a
/usr/local/Cellar/lame/3.99.1/lib/libmp3lame.dylib
/usr/local/lib/libmp3lame.0.dylib
/usr/local/lib/libmp3lame.a
/usr/local/lib/libmp3lame.dylib</pre></p>
	
	<p>なんかいっぱい出てきました。下の/usr/local/lib以下のものは、実際はそれぞれ/usr/local/Cellar/lame/3.99.1/以下のシンボリックリンクになっているようですが、一番上のものが何やら疑わしいです。普通、バージョン情報なんかは文字列として埋め込まれている可能性が高いので、stringsで覗いてみると</p>

	<p><pre>
$ strings /usr/lib/libmp3lame.dylib | less
l3_side->main_data_begin: %i
, 3DNow!
Warning: many decoders cannot handle free format bitrates >320 kbps (see documentation)
xr^3/4
3.97
LAME3.97
http://www.mp3dev.org/
32bits
mpg123: Bogus region length (%d)
mpg123: Can't rewind stream by %d bits!
333333?
...</pre></p>
	<p>むむむ。LAME3.97とすごい怪しいバージョン番号ぽいものが見えます。。。! では、他のファイルはどうなのかと思い、/usr/local/lib以下のものを調べてみると</p>

	<p><pre>
$ strings /usr/local/libmp3lame.dylib | less
Error: can't allocate VbrFrames buffer
strange error flushing buffer ... 
Error: MAX_HEADER_BUF too small in bitstream.c 
Internal buffer inconsistency. flushbits <> ResvSize
bit reservoir error: 
...
This is a fatal error.  It has several possible causes:
90%%  LAME compiled with buggy version of gcc using advanced optimizations
 9%%  Your system is overclocked
 1%%  bug in LAME encoding library
LAME %s version %s (%s)
LAME version %s (%s)
...
INTERNAL ERROR IN VBR NEW CODE (986), please send bug report
INTERNAL ERROR IN VBR NEW CODE (1313), please send bug report
maxbits=%d usedbits=%d
3.99.1
L3.99r
http://lame.sf.net
...</pre></p>

	<p>おおお、やはりlameのバージョンである3.99.1という文字列が確認できます。やはりこの/usr/local/lib以下のものよりも優先して/usr/lib以下の低いバージョンの共有ライブラリが参照されているようです。試しに、この低い方のものを削除して、brew install ffmpegしなおしてみると</p>

	<p><pre>
$ brew install --use-gcc ffmpeg
==> Downloading http://ffmpeg.org/releases/ffmpeg-0.8.6.tar.bz2
File already downloaded in /Users/katsuma/Library/Caches/Homebrew
==> ./configure --prefix=/usr/local/Cellar/ffmpeg/0.8.6 --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --cc=
==> make install
/usr/local/Cellar/ffmpeg/0.8.6: 97 files, 55M, built in 5.7 minutes</pre></p>

	<p>ビンゴ！やはり低いバージョンのものが邪魔をしていたようです。。。！どういう経路でこの古いバージョンのlibmp3lameが入ってきたのか謎ですが、何かのアプリケーションをインストールしたときに一緒に入って、アプリケーションのアンインストール時に削除されないまま残ったのかもしれません(謎)</p>

	<h3>まとめ</h3>
	<p>ライブラリのバージョン依存でインストールに困ったときは、とりあえず</p>
	<p><ul>
		<li>locateで該当対象のファイルパスのリストを洗い出し</li>
		<li>stringsでバージョン確認</li>
	</ul></p>
	<p>な感じでしょうか。ただ、このstringsで確認するあたりが正当法じゃない感じがする。。のですが、もっといいバージョン確認方法があればぜひ教えていただきたいです。</p>]]>
        
    </content>
</entry>
<entry>
    <title>MacOSXでIPアドレスを迷わず1秒で即答する</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/11/check_ip_address_on_mac.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=232" title="MacOSXでIPアドレスを迷わず1秒で即答する" />
    <id>tag:blog.katsuma.tv,2011://1.232</id>
    
    <published>2011-11-08T15:26:25Z</published>
    <updated>2011-11-08T18:33:05Z</updated>
    
    <summary>ifconfigでもちろん取れるけど、情報量多すぎるのでIPアドレスがどこに書か...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="osx" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>ifconfigでもちろん取れるけど、情報量多すぎるのでIPアドレスがどこに書かれてるか探してしまうCUI素人としては、極限まで情報量削ってもっと便利にしたい。と、いうことでこんなのを最近使ってます。</p>

<p>
<!--<pre>ifconfig en1 | grep netmask | awk '{ print $2 }' | pbcopy && pbpaste</pre>-->
<script src="https://gist.github.com/1348626.js?file=i"></script>
</p>

<p>これをパスが通った場所に「i」という名前のファイルで置いて実行すると、IPアドレスだけ表示されて、かつクリップボードにも入るのですぐに利用できる状態になる。</p>

<p>手元で開発した内容をディレクターや他のメンバーと共有するときに、自分のIP教えてブラウザで直接見てもらうことがかなり多いんですけど、「i」「Enter」で共有できるようになったことで、めちゃめちゃコスト下がってかなり便利！</p>]]>
        
    </content>
</entry>
<entry>
    <title>DVDデータをチャプタ毎にリッピング/wav変換するLionに対応したgem &apos;musical&apos;</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/11/gem_musical.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=231" title="DVDデータをチャプタ毎にリッピング/wav変換するLionに対応したgem 'musical'" />
    <id>tag:blog.katsuma.tv,2011://1.231</id>
    
    <published>2011-11-06T14:57:21Z</published>
    <updated>2011-11-26T16:45:11Z</updated>
    
    <summary>	musicalというgemを作りました。 	 	  musical 	  gi...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="ruby" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[	<p><strong>musical</strong>というgemを作りました。</p>
	<ul>
	  <li><a href="https://rubygems.org/gems/musical">musical</a></li>
	  <li><a href="https://github.com/katsuma/musical">github</a></li>
	</ul>

	<h3>これは何?</h3>
	<p>「<a href="http://blog.katsuma.tv/2009/01/dvd_to_mp3.html">Mac OSXでライブDVDをmp3ファイルに変換</a>」にも書いたのですが、僕はアーティストのライブDVDを買って思う存分鑑賞した後は、mp3/AACに変換してiTunes/iPhoneで聴くという楽しみ方をよくしています。
ところが、この変換の際に肝である<a href="http://www.macupdate.com/app/mac/9830/osex">0SEx</a>というソフトがMac OSX 10.7(Lion)になってから動かなくなりました。理由は明確で、0SExはPPC用にビルドされたバイナリなのでRosetta上では動作していたのですが、LionになってRosettaが取り除かれてしまったことで動作しなくなりました。Rosettaの代用品も存在せず、途方に暮れていたのですが、既存のソフトウェアの組み合わせでなんとかできることがわかったので、自分が使いやすい形にmusicalというgemの形でまとめてみました。</p>

	<p>musicalができることが単純で、</p>

	<p>
	  <ol>
		<li>チャプタごとのリッピング</li>
		<li>チャプタごとのwavファイルの変換</li>
		<li>(オプションとして)タイトル/チャプタ情報の出力</li>
	  </ol>
	</p>

	<p>だけです。個人的には2.のwavの変換を行ったあとに、iTunesにD&DでAACに変換を行っているので、ここまでの処理を行おうか迷ったのですが、利用する音声フォーマットは個々人に任せたほうがいいと思ったので、wav変換までで止めています。</p>

      <p>(2011.11.27 追記) <a href="http://blog.katsuma.tv/2011/11/itunes_by_rb_appscript.html">0.0.2でiTunesの設定に従ってエンコード、ライブラリ追加まで行えるようにしました</a></p>

	<h3>インストール</h3>
	<h4>必要ソフトウェアのインストール</h4>
	<p>musicalはバックエンドでdvdbackup, ffmpegを利用しているので、これらをインストールしておきます。homebrewでインストールできます(後述しますが、ちょっと罠があります)。</p>
	<p>
	  <pre>
brew install dvdbackup
brew install ffmpeg</pre>
	</p>

	<h4>gemのインストール</h4>
	<p>毎度おなじみの</p>
	<p>
	  <pre>
gem install musical</pre>
	</p>
	<p>で、OKです。</p>

	<h3>利用方法</h3>
	<p>一番シンプルなのは、DVDドライブにDVDを入れた状態で</p>
	<p>
	  <pre>
musical</pre>
	</p>
	<p>だけで、カレントディレクトリにチャプタ毎にwavファイルができあがります。</p>

	<h4>wavはいらない！リッピングだけでいいんだけど</h4>
	<p>
	  <pre>
musical --ignore-convert-sound</pre>
	</p>
	<p>で、リッピングだけ行い、wavへの変換は行いません。</p>

	<h4>保存する場所を変更したいんだけど</h4>
	<p>
	  <pre>
musical --output=save/to/path --title=DVD_title</pre>
	</p>
	<p>--output, --titleオプションを利用できます。オプションについては--helpでご確認ください。</p>
	
	<h4>musical --infoが何も表示されないんだけど</h4>
	<p>DVDにプロテクトがかかっているので、<a href="http://www.metakine.com/products/fairmount/">Fairmount</a>などを使って、ディスクイメージとしてマウントすれば大丈夫です。</p>

	<h3>ライブラリのインストール時の注意</h3>
	<h4>dvdbackup</h4>
	<p>brew installで簡単にいく。。と思いきや、依存パッケージのlibdvdreadのインストールでコケました。これは単純にURLが変更になっていたので、</p>
	<p>
	  <pre>
brew edit libdvdread</pre>
	</p>
	<p>して、</p>
	<p>
	  <pre>
@@ -3,7 +3,7 @@ require 'formula'
 class Libdvdread < Formula
   homepage 'http://www.dtek.chalmers.se/groups/dvd/'
   # Official site is down; use a mirror.
-  url 'http://www.mplayerhq.hu/MPlayer/releases/dvdnav/libdvdread-4.1.3.tar.bz2'
+  url 'http://www.mplayerhq.hu/MPlayer/releases/dvdnav-old/libdvdread-4.1.3.tar.bz2'
   md5 '6dc068d442c85a3cdd5ad3da75f6c6e8'
   depends_on 'libdvdcss' => :optional</pre>
	</p>
	<p>こんなかんじで編集した後、brew install libdvdreadしなおしたら大丈夫です。</p>
	<p>ちなみに<a href="https://github.com/katsuma/homebrew/commit/09a0b8ca14239109c4aedf23d0a1e95aabdc7835">この内容</a>は(人生初の)<a href="https://github.com/mxcl/homebrew/pull/8468">pull request</a>を送ってみたので、もしかしたら今後は取り込まれるかもしれませんね。</p>

<p>(2011.11.11追記) pull requestは取り込まれたので、brew updateしたらformulaを編集しなくてもインストールできると思います。</p>

	<h4>ffmpeg</h4>
	<p>これもbrew installで簡単にいく。。と思いきや、最新のXcodeでgccが無くなった + pod2manの実行権限がなぜか無くなっていたことでかなりハマりました。あらかじめgccをインストールしなおした上で、こんなかんじでインストール可能です。</p>
	<ul>
	  <li>
		<p><a href="https://github.com/kennethreitz/osx-gcc-installer">osx-gcc-installer</a></p>
	  </li>
	</ul>

	<p>
	  <pre>
# 関連するものを含めて、一度アンインストール
brew uninstall --force `brew deps ffmpeg`

# なぜか実行権限無くなっていたので再設定
sudo chmod +x /usr/bin/pod2man

# gccの利用を指定
brew install --use-gcc ffmpeg</pre>
	</p>

	<p>基本的にこれでいけるはずなんですけど、依存関係上一緒にインストールされるlibxvid, libmp3lameあたりでコケた場合(実際、別のLionのマシンで試したらコケた)は、最悪これらのインストールをスキップしても大丈夫です。brew edit ffmpegで</p>

	<p><pre>
depends_on 'yasm' => :build
...
#depends_on 'lame' => :optional
...
#depends_on 'xvid' => :optional

...
#args << "--enable-libmp3lame" if Formula.factory('lame').installed?
...
#args << "--enable-libxvid" if Formula.factory('xvid').installed?</pre></p>

	<p>こんなかんじでコメントアウトたらビルドも通り、動作が確認できました。</p>

	<h3>最後に</h3>
	<p>当然ながら、本gemは著作権違反の手助けをするためのものではありません。自身の責任の元、ご利用ください。</p>]]>
        
    </content>
</entry>
<entry>
    <title>「ウェブオペレーション」を献本いただきました</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/07/web_operation.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=230" title="「ウェブオペレーション」を献本いただきました" />
    <id>tag:blog.katsuma.tv,2011://1.230</id>
    
    <published>2011-07-06T17:58:57Z</published>
    <updated>2011-07-06T18:12:30Z</updated>
    
    <summary> 同僚のhmskさんから献本いただいたウェブオペレーション、なかなかまとまった時...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="book" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>

<a href="http://www.amazon.co.jp/gp/product/4873114934/ref=as_li_ss_il?ie=UTF8&tag=katsumatv-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4873114934"><img border="0" src="http://ws.assoc-amazon.jp/widgets/q?_encoding=UTF8&Format=_SL110_&ASIN=4873114934&MarketPlace=JP&ID=AsinImage&WS=1&tag=katsumatv-22&ServiceVersion=20070822" align="left" style="margin:0 5px 5px;"></a><img src="http://www.assoc-amazon.jp/e/ir?t=&l=as2&o=9&a=4873114934" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

同僚の<a href="https://twitter.com/#!/hmsk">hmsk</a>さんから献本いただいた<a href="http://www.amazon.co.jp/gp/product/4873114934/ref=as_li_ss_tl?ie=UTF8&tag=katsumatv-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4873114934">ウェブオペレーション</a>、なかなかまとまった時間が取れていなかったのですが、今週やっと読み終えました。</p>


<h3>日本の料理のインフラ</h3>
<p>去年、hmskさんが執筆しているときから内容については大筋把握はしていたのですが、
  改めてhmskさんが寄稿された18章から読みなおしました。</p>

<p>こういう形で自分の会社のサービスについて、かなり細かな内部なことを客観的に読むことはほとんどないので、
「あぁインフラモニタあるよね。このウィンドウも入社時と比べて種類が増えたもんだなぁ」なんてしみじみ思ったり、
(<a href="http://d.hatena.ne.jp/hxmasaki/20110513/1305304114">hmskさん本人も言及されていますが</a>)「いやいやVarnishいま使ってるよねｗ」なんてにこやかな感じで読んでいたのですが、
フと目にとまったのが「18.7章 抱える課題」。そこにはこうあります。</p>

<p>
  <blockquote>
	現在クックパッドのインフラチームが唯一抱えている問題は、インフラチーム外との情報共有の面だ。
	アプリケーションの開発チームとインフラチームはグループとしては別の組織として動いているため、
	情報の共有がなかなか難しくなっている。(中略) まさに本書の「16章 アジャイルインフラストラクチャ」で述べられているような、
	開発と運用の緊張関係に似たようなものがときに垣間見えるのである。
  </blockquote>
</p>

<p>正直、ちょっとドキっとしました。</p>
<p>と、同時に「ムム、そうなのか?そこまででもないんじゃないかな??」と業務を省みることも。
そんなことをもやもや考えながら、まえがきから読み直しました。</p>

<h3>ウェブオペレータ</h3>
<p>話は前後しますが、本書はウェブオペレータ、本書の言葉をそのまま借りると「ITシステム管理の専門分野で、ウェブアプリケーションの開発、運営、保守、調整、修理を含む」業務を担当するエンジニアたち、のさまざまな知識と経験をもとにしたエッセイ集です。アジャイルのプロセス、継続的デプロイ、RDB/NoSQLなどのDB、ストレージ、キャリアについてなど、ウェブオペレータの目線からの内容はかなり多岐にわたりますが、翻訳の<a href="https://twitter.com/#!/kdmsnr">角征典</a>さんの文章がとても綺麗で、非常に読みやすい１冊でした。</p>

<p>個人的には「4. 継続的デプロイ」「10. 開発と運用の協力と提携」
「13. 障害を活用する:ふりかえりの技芸と科学」「16 アジャイルインフラストラクチャ」あたりが特に読んでいて面白かったです。
リリースされるサービスをどういう視点でインフラはサービス開発エンジニアと協力していくべきなのか、
品質を保ちながらリスクを少なくリリースを行いつづけるための試行錯誤など、ウェブオペレータとしての生々しい声がグっときました。</p>

<p>このあたりについては、16章の最後にある文章が印象的です。</p>

<p>
  <blockquote>
「アジャイル」は間違って理解、使用されることが多い。「2週間ごとに動くソフトウェアを提供する」開発者の犠牲になっていたら、
本当に申し訳ないと思う。彼らは、自分たちの行動をよく理解していないだけなのだ。悪気があるわけではない。
是非、彼らを助けてあげてほしい。それがあなたの助けにもなる。お互いに助け合いが必要だ。<br />
(中略)<br />
1つの考え方や観点に囚われてはいけない。最善のアイデアは文化が衝突したときに出てくるものだ。
優れたものを見つけたら盗め。理解できたら活用しろ。できるようになったら還元だ。<br />
「アジャイル」になるかどうかなんか気にするな。「すごい」人を目指せ。<br />
技術的な問題を解決するのは人だ。<br />
みんなで幸せになろうよ。
  </blockquote>
</p>


<h3>日本の料理のインフラ、ふたたび</h3>
<p>1冊まるまる読み終えてもう一度、最初に気になった18章の箇所を読みなおすと、なんかスっと納得できた気がしました。
あぁ、そうか。僕はインフラチームの取り組みを理解できていなかったし、理解していたつもりになっていただけだった。
普段のSkype上での会話と週１のエンジニアミーティングで情報共有は大筋できていたと思い込んでいたけど、
そんなレベルじゃ全くダメだったんだな、というのが1冊読み終えた後の率直な感想です。</p>

<p>今はプロジェクトによっては、サービス開発のプロジェクトにインフラエンジニアが最低1名Joinして、
  一緒にサービスを創り上げることも試行しています。
  スケールの問題はまだありそうですが、最初の問題の1つの解としては挙げられそうです。
  実際、僕のいるグループにhmskさんがJoinしていた時は、物理的な席もすぐ近くにいたので、
  インフラ面での相談もしやすく、圧倒的な安心感がありました。</p>

<h3>そんなわけで</h3>
<p>本書はインフラエンジニア(ウェブオペレータ)の方が読んでも、「そうそう、そうだよなぁ(ニヤニヤ)」と
納得感があるものも多く面白いでしょうが、むしろサービス開発エンジニアこそ読むべき1冊ではないでしょうか。
より高速に価値の高いサービスを産み続けていくためには、
パっと出のアイディアと強引な実装だけで成立しつづけるものではありません。
サービス開発エンジニアとインフラエンジニアがいかにして協調しあうべきなのか。</p>

<p>
一度じっくり考えさせられるきっかけになる一冊だと思います。
</p>


<p>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=katsumatv-22&o=9&p=8&l=as4&m=amazon&f=ifr&ref=ss_til&asins=4873114934" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</p>]]>
        
    </content>
</entry>
<entry>
    <title>$.deferredを利用したflickrのjqueryプラグイン</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/05/jquery_flickr_plugin.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=229" title="$.deferredを利用したflickrのjqueryプラグイン" />
    <id>tag:blog.katsuma.tv,2011://1.229</id>
    
    <published>2011-05-05T15:15:31Z</published>
    <updated>2011-05-05T16:11:26Z</updated>
    
    <summary>jQuery1.5から追加されたjquery.deferred。どんなものなのか...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="Javascript" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>jQuery1.5から追加されたjquery.deferred。どんなものなのかはなんとなく理解していたのですが、全く触ったことがなかったので練習がてら、このblogのトップページにあるFlickrの最新画像サムネイル表示ライブラリを、jquery.deferredを利用したjquery.pluginとして書きなおしてみました。</p>

<p>
  <ul>
	<li><a href="https://github.com/katsuma/jquery-flickr-plugin">jquery.flickr.js</a></li>
  </ul>
</p>

<h3>利用方法</h3>
<p>jquery(1.5)以上と、当jsをロードしておいた状態で、</p>

<p><pre>
$('#foo').flickr({ user_name: 'katsuma'});
</pre></p>

<p>こんなかんじで最新画像のサムネイルがロードされます(デフォルトでは6枚)。Topページもこのシンプルな方法でロードさせています。</p>

<p>枚数を変更したいときは</p>
<p><pre>
$('#foo').flickr({ user_name: 'katsuma', view_num: 3 });
</pre></p>
<p>こんなかんじ。</p>

<p>サイズを変更したいときは</p>
<p><pre>
$('#foo').flickr({ user_name: 'katsuma', view_num: 3, size: 'small'});
</pre></p>

<p>こんなかんじ。詳しくは実際に試せるデモがあるのでこちらをご覧ください。</p>
<p>
  <ul>
	<li><a href="http://katsuma.github.com/jquery-flickr-plugin/">jquery.flickr.js demo</a></li>
  </ul>
</p>



<h3>jquery.deferred</h3>
<p>で、肝心のdeferredですが、今回は非同期のjsonpを連続して実行しつづけているのですが、普通に書くとcallbackが激しく入れ子構造になってしまうところ、それらの非同期処理を「割と同期処理っぽく綺麗に書ける」のがいいのかな、、という理解です。
たとえば、今回はユーザIDの逆引き→最新画像情報の取得→実画像のパスを取得のフローになりますが、この流れを次のように書くことができます。(実際のコードを簡略化しています)
</p>

<p><pre>
<strong>$.when</strong>(methods.findByUsername(setting.user_name)).<strong>then</strong>(function(){
  <strong>$.when</strong>(methods.getPublicPhotos()).<strong>then</strong>(function(){
    <strong>$.when</strong>(methods.loadPhoto(setting.photos));
  });
});
</pre></p>

<p>こんなかんじで、$.when~thenでchain構造でつなげていけるので、非同期処理ながらも「この処理はこの後で実行」を指示できるのがウリです。よくありがちなのはこんな書き方じゃないでしょうか。</p>

<p><pre>
var methods = {
  findByUsername : function(name){
    $.ajax({
      ...
      callback : function(data){
        ...
        methods.getPublicPhotos(); // callback内から次に実行する関数を呼び出し
      }
    });
  },

  getPublicPhotos : function(){
    ...
  }
};

// 最初に呼び出す関数
methods.findByUsername(setting.user_name);
</pre></p>

<p>こんな感じでも書けますが、呼び出し元がコード内で散らばるので、可読性が著しく落ちることになります。jquery.deferredを利用すれば、when~thenのchainでまとめられるので、「どういう順番でどの関数が呼び出されているか」を追いかけやすくなります。
まだまだ他にもメリットはあるかと思いますが、ざっと書いてみたところとりあえずこの点が一番のメリットかな、と感じました。</p>

<h3>勘違い</h3>
<p>最初は結構勘違いしていて、非同期処理を完全に同期処理として書けるものなのかと思ってました。なので、こんなふうに書けちゃうのかな、と。</p>

<p><pre>
// findByusernameはjsonpで実行...だけどreturnでidが取れるはず！
var user_id = methods.findByUsername(setting.user_name); 

 // 上記結果を元にして再びjsonpでgetPublicPhotosを呼び出せる！
var photos = methods.getPublicPhotos(user_id);
</pre></p>

<p>当然こんなかんじには動きません。非同期処理はあくまでも非同期なので、returnで同期処理っぽく値を取れることはありません。このあたりはやっぱコード書かないとわからないですね。</p>
]]>
        
    </content>
</entry>
<entry>
    <title>ハードウェアが特定の条件下ではIEでfilter:alpha(opacity=N)が適用されない</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/03/ie_filter_hardware_problem.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=228" title="ハードウェアが特定の条件下ではIEでfilter:alpha(opacity=N)が適用されない" />
    <id>tag:blog.katsuma.tv,2011://1.228</id>
    
    <published>2011-03-06T16:10:17Z</published>
    <updated>2011-03-06T17:05:47Z</updated>
    
    <summary> CSSでDOM要素に対してアルファフィルターを適用させたいときは、クロスブラウ...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="css" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[ <p>CSSでDOM要素に対してアルファフィルターを適用させたいときは、クロスブラウザを意識すると次のような記述になると思います。
   もうすこし古いMozilla系ブラウザを対象にするなら-moz-opacityの定義も追加してあげるとことになりますが、
   今回はIEに絞った話のため、そのあたりは割愛します。
 </p>

 <p><pre>
#element {
  filter: alpha(opacity=0); /* IE */
  opacity: 0; /* その他のモダンブラウザ */
}
</pre></p>

 <p>さて、普段は特に何も考えずにfilter:alpha~と記述していたのですが、
   実はIEはある条件下によってまったくfilterが効かない場合があります。</p>

 <h3>ActiveXが無効</h3>
 <p>そもそもの話ですが、filterはActiveXを利用したレンダリングを行っています。
   そのため、そもそもセキュリティの設定などでActiveXを無効にされていると、filterが効かず想定したようなレンダリングがされません。</p>
 <p>たとえば、「インターネットオプション」の「セキュリティ」でセキュリティのレベルを「高」にする、ActiveXの設定を個別でOFFにする、
   などの設定を行うなどでfilterを無効にすることができます。</p>
 <p><img src="http://gyazo.com/80fed404c3f6f7a032f5fe69b9a37941.png" alt="インターネットオプション" /></p>

 <p>ただし、この場合は当然ながらFlashも見ることはできませんし、セキュリティを気にするユーザはそもそもIE以外のモダンブラウザを利用することの方が多いでしょうし、
標準的なユーザがこの条件下でfilterが効かない、という話はほぼ無いと考えてもいいと思います。実は次の問題が厄介です。</p>

 <h3>2048pxを超えるような巨大な要素がfilterの対象</h3>
 <p>実は今回この事例にずばりハマってたのですが、</p>
<p>
 <ul>
   <li>IE7,8(6は未確認)</li>
   <li>Windows Vista, 7(XPは未確認)</li>
   <li>filter対象要素が2048pxを超えるような巨大なもの</li>
   <li>ATI(AMD), NVidiaのグラフィックカード</li>
</ul></p>
 <p>な条件下において、filterが適用されないことを確認しています。(<a href="http://social.msdn.microsoft.com/forums/en-US/iewebdevelopment/thread/29d0b0e7-4326-4b3e-823c-51420d4cf253/" target="_blank">参考文献 "filter-alpha-opacity fails if the element is taller than 2048px, IE7 Vista"</a>)</p>

 <p>上記のActiveX無効の場合はJavaScriptでActiveXが有効/無効を判断できるので、何らかの対応をすることはできるのですが、
   この場合はハードウェアの話が絡んでくるので、実質的な回避方法はありません。後で詳しく述べますが、今回は</p>
 <p>
   <ul>
	 <li>filter対象要素が2048pxを超えるような巨大なもの</li>
   </ul>
 </p>

 <p>をやめて、filter対象要素の面積を可能なかぎり小さくすることができたので、回避しました。</p>

 <h3>巨大な要素にfilterをかける必要性</h3>
 <p>そもそも、なんでそんな巨大な要素にfilterをかける必要があるのかという話になるのですが、今回はファイルアップロードのUIをゼロから作ったことに起因します。
   ファイルアップロードの際には、&lt;input type="file" name="uploader" /&gt;なんかでファイル選択ダイアログを表示し、対象ファイルを選択することになります。
   ところが、これはブラウザ標準のUIになるので、「もっと凝ったことしたい!画像など任意に要素クリックでこの選択ダイアログを表示させたい!」などとなると、途端に話は面倒くさくなり、</p>
 <p>
   <ol>
	 <li>Flashで実装</li>
	 <li>JavaScript/CSSで巧みに実装</li>
   </ol>
 </p>

 <p>の選択を迫られることになります。</p>

 <p>Flashで実装をとるという方法もあったのですが、カスタマイズ性や毎回publishすることの実装コストを考慮して、JS/CSSでの実装を選択することにしました。
   たとえば画像クリックでファイル選択ダイアログを表示させたい場合、次のような構成になります。</p>
 <p><img src="http://blog.katsuma.tv/images/upload-1.png?v1" /></p>
 <p>img要素の上に大きめのinput要素を重ねあわせ、filterでalpha=0に指定します。これで画像をクリックしようとするとinput要素をクリックすることになり、結果的にダイアログを表示することができます。
   そのあとはinput要素のchangeイベントに対してハンドラを設定し、formを送信なりなんなりとしてあげると完了です。</p>

 <p>ところが、ここで１つマウスカーソルの問題があります。ただ単純にinput要素を重ねただけだと、画像の上にカーソルを重ねたときに</p>
 <p><img src="http://gyazo.com/951cce6610efa70467ca700dfc8ce4d0.png" /></p>
 <p>な形状になり、クリックできそうなことを連想できません。そこで、input要素に対して</p>
 <p><pre>
cursor: pointer;
</pre></p>
 <p>な、スタイルを設定する必要があります。これでカーソルの形状が</p>
 <p><img src="http://gyazo.com/b70fc947973eff8acbbe5de331574b37.png" /></p>
 <p>になり、解決しました。。と、言いたいのですが、実はこれでもまだ完璧ではなく、Firefoxではカーソルは変わりません。</p>
 <p>どうもこれはFirefoxの仕様のようで、いくらcursor指定をしても変わることがありませんでした。では、Firefoxだけ残念な形になっちゃうのか。。と思いきやそうでもなく、先ほどの画像とinput要素の重ね方を工夫するともうすこし頑張れます。結果から言うとこう配置します。</p>

 <p><img src="http://blog.katsuma.tv/images/upload-2.png?v2" /></p>
 <p>分かりづらいですが、最初の例では画像に対してinput要素も{ left:0, top:0 }で配置していたのに比べて、２つ目の例ではinput要素をサイズを巨大なものにして、{ right:0, top:0 }で配置します。(大きさはfont-size:で調整します)
   このとき、<strong>要素のサイズを巨大にして「選択」ボタンを画像に重ねる</strong>ことがポイントです。「選択」ボタンを画像にうまく重ねることで、画像のマウスオーバー時に</p>
 <p><img src="http://gyazo.com/1a11e1ef315d505d5d92e5f354e72a1c.png" /></p>
 <p>と、することができ、最初の状態と比べて「クリックできそう感」が改善されます。ちなみにこのマニアックな手法はいろんなファイルアップロードライブラリを見ても、
Flash実装じゃないものは全部この仕様になってあり、Firefoxのマウスカーソル問題はここが妥協ポイントのようです。（例：<a href="https://github.com/valums/file-uploader">file-uploader</a>）</p>

 <h3>話をfilterに戻す</h3>
 <p>大きく脱線しましたが、ようやく最初のfilterの話に戻します。</p>
 <p>ここまできてようやく「Flashで実装しない場合に、ファイルアップロードを実装する場合において、カーソルの形状の最適化のためにfilter対象要素を十分に大きくする必要がある」という話になりました。実際にこれを実装してみるとわかるのですが、画像と選択ボタンを合わせるためにはinput要素を相当巨大なものにする必要があり、
   <strong>結果的に{数千px × 数百px}の巨大な面積の要素にfilterをかけることになります。</strong></p>

<p>
で、HWスペックが十分なマシンだとIEだと問題なくレンダリングされるのですが、冒頭の条件であったりレンダリングスペックが十分でない場合、filterに失敗して
表示が崩れる、という問題が起こります。

この場合、セキュリティ設定やActitiveXなどOS、ブラウザの設定を操作することなくfilterが無効になるので、気づかない間にユーザが不便を被ることになるので非常に厄介です。</p>

 <p>さて、ではどう対策をすればいいかというと、話を振り返るとそもそもinput要素を巨大にしたり右寄せにしたり面倒なことをしているのはFirefoxのマウスカーソルを
   いい感じに見せるためだけであって、IEはそもそもこの対応をしなくともcursor: pointer;だけしておけば表示位置はどこに設定してもOKなので、
<strong>IEだけレンダリング要素を最小化しておけば大丈夫</strong>という最初で述べた結論に帰着するのです。（長い！）</p>

<p>と、いうわけでここまでまとめるとたとえば130x130なサイズの画象にinput要素をかぶせるときは次のようなスタイルを設定します。サイズは各環境によって微調整をしてください。</p>

 <p><pre>
right: 0;
top: 0;
position: absolute;
cursor: pointer;
opacity: 0; /* IE以外の最新ブラウザはこれでOK */
filter: alpha(opacity=0); /* IE */
font-size: 460px;

/* StarHackを使ってIEだけ適用。要素を必要十分なサイズで最小化。 */
*font-size: 32px;
*width: 130px;

z-index: 1;
height: 130px;
</pre></p>

 <h3>結論</h3>
 <p><strong>CSSコーディングでグラフィックカードの特性を意識しないのは素人！</strong></p>

<h3>ところで</h3>
<p>今回はたまたまレンダリング要素のサイズ変更で回避できましたが、本質的な解決にはなっていません。あと動的なサイズの要素の場合、回避は不可能そうです。どなたかこの問題について詳しい方はいないでしょうかね？？</p>]]>
        
    </content>
</entry>
<entry>
    <title>MacRubyとLLVMを導入してRubyでネイティブGUIアプリを作る</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/01/macruby_llvm_introduction.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=227" title="MacRubyとLLVMを導入してRubyでネイティブGUIアプリを作る" />
    <id>tag:blog.katsuma.tv,2011://1.227</id>
    
    <published>2011-01-23T08:16:08Z</published>
    <updated>2011-01-23T14:19:12Z</updated>
    
    <summary>(2011/1/23 23:00追記) macrubycはLLVMから入れなくて...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="ruby" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>(2011/1/23 23:00追記) macrubycはLLVMから入れなくてもmacrubyをインストールするだけで一緒にインストールされます。下記内容は誤りを含んでいますのでご注意ください。ご指摘いただいた<a href="http://twitter.com/#!/watson1978">watson1978</a>さん、ありがとうございました。
</p>

 <p>最近Macアプリケーションが気になっていて、Cocoa周りの話を調べています。その一環でRubyでMacアプリを作る方法についての話です。</p>

<h3>MacRuby</h3>
 <p>Mac上でRubyでアプリケーションを作る場合、最初からインストールされてあるRubyCocoaと、最近盛り上がっているMacRubyの２通りの手段があります。
どちらもCocoaを含むいろんなフレームワークをRubyから直接叩けるのですが、RubyCocoaはプロキシオブジェクトを介してCocoaフレームワークを叩くのに対して、MacRubyはプロキシを必要とせずに直接Objective-Cのメソッドにアクセスできるのが大きな特徴です。
実装方法として、MacRubyはRubyランタイムからObjective-Cのランタイム関数を直接呼び出すことで実現しているようです。
感覚的に考えてもRubyCocoaと比べて、MacRubyの方がパフォーマンスが大きく改善されていることが期待できるので、MacRubyで遊んでみたいと思います。</p>

<h3>rvmの利用</h3>
<p><a href="http://www.macruby.org/">MacRuby</a>の本家サイトにはインストーラのpackageファイルがあるのですが、もっと手軽に試してみるにはrvmの利用がおすすめです。rvmは複数のRubyを共存させるツールで、いろんなバージョンのRubyを切り替えて使いたいときは必須ツールです。
同僚の<a href="http://twitter.com/#!/mirakui">mirakui</a>さんが詳しい記事を書いているので、rvm自身のインストールなど詳細な情報はそちらを参照ください。</p>


<p><ul>
<li><a href="http://d.hatena.ne.jp/mirakui/20100502/1272849327">rvm: 複数のRubyを共存させる最新のやり方</a></li>
</il></ul></p>

<p>ではMacRubyをrvmでインストールしてみます。MacRubyの最新バージョンは2011年1月22日現在で0.8なのですが、rvmのバージョンを最新にしないとバージョン指定でインストールできないようです。</p>

<p><pre>
$ rvm update --head
$ rvm reload
$ rvm install macruby-0.8
$ rvm use macruby-0.8
</pre></p>

<p>バージョンを確認してみて、次のような出力が得られるとインストール成功です。</p>

<p><pre>
$ ruby -v
MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64]
</pre></p>

<p>あとGUI系のライブラリを利用するためにHotCocoaのgemもインストールしておきます。</p>
<p><pre>
$ gem install hotcocoa
</pre></p>

<h3>Hello World!</h3>
<p>まずは簡単なHello Worldアプリをつくってみます。「ruby hello_world.rb で」ウィンドウ上にボタンを表示し、ボタンクリックでHello Worldをputsさせます。</p>

<p>
<a href="http://www.flickr.com/photos/katsuma/5380359654/" title="1st MacRuby App by katsuma, on Flickr"><img src="http://farm6.static.flickr.com/5284/5380359654_a1072a4d9e_o.png" width="206" height="227" alt="1st MacRuby App" /></a>
</p>
<p>
<script src="https://gist.github.com/791905.js?file=hello_world.rb"></script>
</p>

<p>MacRubyはKernelモジュールにframeworkメソッドを追加しているので、このメソッドでCocoa機能を呼び出します。
あとのコードも大体読めばわかる程度のレベルだとおもいます。Objective-Cだと抵抗あるRubyエンジニアもこれだとMacアプリも怖くないですね！</p>

<h3>MacRubyコンパイラを利用してネイティブアプリ化する</h3>
<p>このままだとただのRubyスクリプトなので、これをネイティブアプリ化します。
(2011/1/23 23:00追記、macrubycはmacrubyに梱包されているので、LLVMからインストールする必要はありません。一応、備忘録のために導入方法だけ残しておきます。)<del>
ネイティブアプリ化を行うためには、LLVMが提供するツールのmacrubycを利用します。macrubycはMacRubyをインストールするだけだと使えないので、LLVMのビルド、インストールが必要です。</del></p>

<p>LLVMはバージョンに依存するようで、僕の場合は<a href="http://rvm.beginrescueend.com/interpreters/macruby/">rvmのサイトの内容</a>を参考にして、次の手順で導入できました。</p>

<p><pre>
$ svn co -r 106781 https://llvm.org/svn/llvm-project/llvm/trunk llvm-trunk
$ cd llvm-trunk
$ env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ ./configure --enable-bindings=none --enable-optimized --with-llvmgccdir=/tmp
$ env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ make -j2
$ sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ make install
</pre></p>

<p>makeのときに追加しているj2オプションの「2」の値はビルドを行うCPUのコア数に合わせて最適化を行ってみてください。なお、このビルドは1時間近くかかるので、時間があるときに試すのをおすすめします。</p>

<p><pre>
$ which macrubyc
/usr/local/bin/macrubyc
</pre></p>

<p>のようにエラーがなく結果が返ってくればインストール成功です。</p>


<p>では、早速先ほどつくったhello_world.rbをコンパイルしてみましょう。コンパイルは簡単で次のコマンドでコンパイルできます。</p>

<p><pre>
$ macrubyc hello_world.rb -o hello_world
</pre></p>

<p>これでhello_worldという名前の実行可能ファイルができるので、</p>

<p><pre>
$ ./hello_world
</pre></p>

<p>で、実行できます。無事、ウィンドウが表示されましたね！</p>

<h3>まとめ</h3>
<p>rvmでMacRubyは簡単に導入することができるので、Objective-Cを諦めていて人もRubyで手軽にMacアプリの作成を試すことが確認できました。
また、LLVMを導入することでネイティブアプリも作成することができるので、RubyでのMacアプリケーション開発の可能性の大きさも伺えますね！</p>
]]>
        
    </content>
</entry>
<entry>
    <title>Xcodeのプロジェクトテンプレートファイルをカスタマイズする</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2011/01/customize_xcode_template.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=226" title="Xcodeのプロジェクトテンプレートファイルをカスタマイズする" />
    <id>tag:blog.katsuma.tv,2011://1.226</id>
    
    <published>2011-01-15T19:40:14Z</published>
    <updated>2011-01-15T19:44:46Z</updated>
    
    <summary> 半年ぶりの更新ですが、特に脈略もなく唐突にXcodeとopenFramewor...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="Xcode" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[ <p>半年ぶりの更新ですが、特に脈略もなく唐突にXcodeとopenFrameworksの話をします。</p>

 <p>最近、趣味で<a href="http://www.openframeworks.cc/">openFrameworks</a>を触りだしたのですが、XCodeの開発環境を触るのも１年ぶりだし、そもそもC++を書くのは数年ぶりすぎて前に書いたのいつだっけ、、というくらいのレベルでした。
   そんな感じなので、まずは開発環境を完璧にしようと思った矢先、出鼻をくじかれる問題が。</p>

 <h3>テンプレートから作成したプロジェクトがビルドできない</h3>
 <p>openFrameworkは2011年1月16日時点でバージョン0.062が最新となっています。
ダウンロードページから最新ファイルを解凍すると、Xcode用のテンプレートディレクトリ「xcode templates」が内包されてあり、このディレクトリをXcodeが起動していないときに下記のいずれかに配置すると、
Xcode側で認識されopenFrameworksのアプリケーション用のプロジェクトを作成できる、とあります。</p>

<p>
<pre>
/Library/Application Support/Developer/3.0/Xcode/Project Templates/openFrameworks
/Library/Application Support/Developer/Shared/Xcode/Project Templates/openFrameworks
~/Library/Application Support/Developer/3.0/Xcode/Project Templates/openFrameworks
~/Library/Application Support/Developer/Shared/Xcode/Project Templates/openFrameworks
</pre>
</p>

<p>場所はどこでもよかったのですが、僕は一番下の「~/Library/Application Support/Developer/Shared/Xcode/Project Templates/openFrameworks」に「xcode templates/Project Templates/openFrameworks/Mac OSX Empty Example」ディレクトリを配置し、
「$OF_ROOT/apps/projects」以下で新規プロジェクトを作成しました。ちなみに、openFrameworksのアプリケーションを作成するときは、このapps以下で作成するのがお作法のようです。（ここじゃないとライブラリがロードできなくてそもそもビルドが全く通らない）
配置後にXcodeを起動すると、新規プロジェクトでテンプレートを洗濯するダイアログでUserTemplateで配置したディレクトリ名のテンプレートが追加されていることが確認できると思います。
ところが、ここからMac OSX Empty Exampleを選択し、そのままビルドを行うと以下の２つのエラーが出てビルドできませんでした。</p>

<p><pre>
Line Location ツール:0： Command /bin/sh failed with exit code 1
Line Location ツール:0： "_usleep$UNIX2003", referenced from:
</pre></p>

<p>さすがにこれだと意味不明すぎて対応ができません。検索してもいまいちピッタリな情報がひっかからないな。。。と思って、そもそもの環境がなんかおかしいのかな、と思いapps/examples/emptyExampleをビルドしてみると、これはビルドが通ります。
と、なると「このemptyExampleをテンプレートに使えないか」の仮説で、emptyExampleを上記のパスに配置して、新規プロジェクト(プロジェクト名test)作成後にビルドしてみたところ、</p>

<p><pre>実行可能なファイルがありません</pre></p>

<p>と、ダイアログが表示され今度はビルドできません。</p>

<p>単体だとビルドが通るのに、テンプレートにしたらダメということは、命名系がなんかおかしいのかな、、と思いよくよくダイアログを見てみると、ビルドの結果test.appを実行すべきはずなのに、emptyExampleDebug.appを実行しようとして、コケてるみたい。
要するに、テンプレートが任意の実行ファイル名を受け付けるべき箇所で、exampleからファイルをコピーしてきただけなので、変数扱いされずに定数扱いされていたことが問題だったよう。そこで、templateディレクトリ配下でemptyExampleをgrepして、全部変数に置換してあげれば解決しそうです。</p>

<p>grepすると、project.pbxprojファイル内で該当文字列が発見されるので、これを「プロジェクト名.app」にしてあげます。プロジェクト名は<strong>«PROJECTNAME»</strong>を利用すると、プロジェクト作成時の名前に置き換えることができるので、これを利用します。
置換後、またまた新規プロジェクトを作成しなおし、ビルドをしてみると今度こそやっとビルドが通り、実行ファイルを実行することを確認できたとおもいます。</p>

<h3>完成したテンプレート</h3>
<p>と、いうわけで完成したテンプレートをまとめておきます。このテンプレートを元にプロジェクトを作成すると、空のウィンドウだけを起動するアプリケーションを作成できます。</p>
<p><ul>
<li><a href="https://github.com/katsuma/XcodeTemplates/tree/master/openFrameworks">https://github.com/katsuma/XcodeTemplates/tree/master/openFrameworks</a></li>
</ul></p>

<h3>まとめ</h3>
<p>openFrameworksの勉強をする前に、そもそもXcodeのカスタマイズの仕方に集中しすぎて本質から外れたことに注力しすぎちゃいました。。が、この知識を知っておけば、自分にだけ便利なオレオレスケルトンのテンプレートを作成できるので、
価値は割と大きいかな、と思えます。次回以降は、やっとコードが書ける状態になったので、実際にopenFrameworksネタで何か書きたいと思います。</p>
]]>
        
    </content>
</entry>
<entry>
    <title>Google Codeで管理していたコードをgithubへ移行する</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2010/07/from_googlecode_to_github.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=225" title="Google Codeで管理していたコードをgithubへ移行する" />
    <id>tag:blog.katsuma.tv,2010://1.225</id>
    
    <published>2010-07-10T19:37:18Z</published>
    <updated>2010-07-11T13:47:16Z</updated>
    
    <summary>最近は仕事でgitを使うケースがSubversionと比べて圧倒的に多いので、個...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="develop" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>最近は仕事でgitを使うケースがSubversionと比べて圧倒的に多いので、個人的にGoogle Codeでホスティングしていたコードもgithubに移すことにしました。</p>

<h3>git-svn</h3>
<p>移行作業にはgit-svnが必要になります。MacOSXでgit-svnを使うには、git-coreをmacportsで入れるときに、<strong>+svn</strong>のvariantsをつけてインストールしてあげるとOK。ぼくはすでにgit-coreをインストールしていたので、次のようにしてインストールしなおしました。</p>

<p><pre>
sudo port deactivate git-core
sudo port install git-core +svn
</pre></p>

<h3>作業用ディレクトリの作成</h3>
<p>作業用の適当なディレクトリを作ります。</p>
<p><pre>
mkdir ~/Desktop/git
cd ~/Desktop/git
</pre></p>

<h3>authors.txtの作成</h3>
<p>次のような内容のauthors.txtを作成。(no author)はGoogle Codeの初期設定で、名無しさんがtrunk, branches, tagsを作成しているようなので、この２行が必要になります。左辺はGoogleアカウント名、右辺はgithubに登録した名前とメールアドレスです。</p>
<p><pre>
ryo katsuma = ryo katsuma &lt;katsuma@gmail.com&gt;
(no author) = ryo katsuma &lt;katsuma@gmail.com&gt;
</pre></p>

<h3>移行用レポジトリを作成</h3>
<p>githubで移行用のレポジトリを作成します。作成は<a href="http://github.com/repositories/new">ここ</a>から。</p>

<h3>移行</h3>
<p>ここまでくるとあとは簡単。</p>
<p><pre>
git svn clone -s -A ./authors.txt http://svn_repo.googlecode.com/svn repo
cd repo/
git remote add origin git@github.com:katsuma/new_repo.git
git push origin master
</pre></p>

<h3>まとめ</h3>
<p>Google Codeからgithubの移行は、実作業はauthors.txtを用意するくらいで、全体としてそんなに複雑なものではなかったと思います。
ちなみに今回の作業を通して<a href="http://www.tokyo-jogging.com/">Tokyo-Jogging</a>のコードを全部<a href="http://github.com/katsuma/tokyo-jogging">github</a>に移しました。
コード管理はもちろん、サイト全体の操作性なんかもGoogle Codeと比べてgithubの方が優れていると思うので、移行して正解だったかなーと感じています。
</p>]]>
        
    </content>
</entry>
<entry>
    <title>「よくわかるAmazonEC2/S3入門」を献本いただきました</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2010/07/amazon_ec2_s3_introduction_book.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=224" title="「よくわかるAmazonEC2/S3入門」を献本いただきました" />
    <id>tag:blog.katsuma.tv,2010://1.224</id>
    
    <published>2010-07-04T17:55:29Z</published>
    <updated>2010-07-04T19:16:01Z</updated>
    
    <summary>株式会社学びingの五十嵐学様より「よくわかるAmazonEC2/S3入門」を献...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="aws" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>株式会社学びingの<a href="http://twitter.com/igarashi">五十嵐学</a>様より「<a href="http://www.amazon.co.jp/gp/product/4774142840?ie=UTF8&tag=katsumatv-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4774142840">よくわかるAmazonEC2/S3入門</a>」を献本いただきました。</p>

<p>本書は、EC2, S3を中心とするAWSの導入、運用方がをボリュームよくまとまったかなりの良本です。</p>

<h3>目次</h3>
<p>
<ul style="list-style-type: none">
<li>■第1章　クラウドコンピューティングへの招待 
<ul>
<li>1-1 クラウドコンピューティングの隆盛</li>
<li>1-2 クラウドコンピューティングとは何か</li>
<li>1-3 サービス提供側から見るクラウドコンピューティング</li>
<li>1-4 クラウドコンピューティングの3つの分類</li>
<li>1-5 クラウドコンピューティングの主要プレイヤー</li>
</ul>
</li>

<li>■第2章　Amazon EC2/S3で何をするのか
<ul>
<li>2-1 Amazon EC2</li>
<li>2-2 Amazon EC2</li>
<li>2-3 Amazon S3</li>
<li>2-4 料金体系</li>
</ul>
</li>

<li>■第3章　Amazon EC2/S3導入手順詳細
<ul>
<li>3-1 Amazon EC2/S3を使うまでの準備</li>
<li>3-2 GUIツールからの操作（AWS Management Console） </li>
<li>3-3 コマンドラインからの操作</li>
<li>3-4 Amazon S3を利用する</li>
</ul>
</li>

<li>■第4章　Amazon EC2使用方法
<ul>
<li>4-1 Amazon EC2でLinuxを使う</li>
<li>4-2 Amazon EC2でWindowsを使う</li>
</ul>
</li>

<li>■第5章　Amazon EC2/S3の応用例
<ul>
<li>5-1 Amazon EC2のオプション</li>
<li>5-2 Amazon S3のオプション</li>
<li>5-3 その他のオプション</li>
<li>5-4 Amazon EC2/S3　ツール集</li>
</ul>
</li>

<li>■第6章　AWSにおける運用管理
<ul>
<li>6-1 運用上における物理サーバとAmazon EC2の違いとは</li>
<li>6-2 サーバ種類別の考察</li>
<li>6-3 AMIをゼロから作る</li>
</ul>
</li>

<li>■第7章　Amazon EC2/S3ができること，できないこと
<ul>
<li>7-1 相性が良い想定利用シーン</li>
<li>7-2 相性が悪い想定利用シーン</li>
<li>7-3 当社で起きた特殊な事件</li>
<li>7-4 その他注意点</li>
<li>7-5 Amazon EC2/S3は使えるのか？</li>
</ul>
</li>

<li>■Appendix　コマンドリファレンス</li>
</ul>
</p>

<h3>AWS導入検討時は何よりまず読むべき</h3>
<p>一通り読んでみて感じたことは、「僕がAWSを初めてまともに使った１年前にこの本があれば。。。」と、いうこと。導入にあたってのアカウントの作成方法、料金計算方法、Webインターフェースとコマンドツールの細かな説明から運用上の諸注意まで全部一通り掲載されてあって、AWS日本語公式サイトがまだ存在しない今だと、へたに検索して１つ１つ調べるよりよっぽど有益な情報を効率よく収集できます。</p>

<p>個人的に一番よかったのは、６章「AWSにおける運用管理」と７-3「当社でおきた特殊な事件」。AWSの実運用事例はまだまだ国内では少ないので、このあたりの実際に使ってみてはじめて分かる、目の当たりにする困難な点は情報として絶対量もまだまだ多くありません。その点で、これらの章は使った人にとっては「あるある！！」と思える点ばかりで、AWSユーザ視点での生の声が集まったかなり貴重な章と言えると思います。あと、Auto ScalingやElastic Load Balancingなんかは、まだ使ったことがなかったので、そのあたりの情報は普通にかなり参考になりました。</p>

<p>と、いうわけでAWSの導入を検討している人は当然のこと、AWSのサービスを断片的には使っているもののサービス間の連携についての知識が不十分だと思える人にとって、本書は必須な本だと思います。かなりオススメ！</p>

<p>
<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=katsumatv-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4774142840" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
</p>]]>
        
    </content>
</entry>
<entry>
    <title>memcached vs TokyoCabinet vs TokyoTyrant vs Redis</title>
    <link rel="alternate" type="text/html" href="http://blog.katsuma.tv/2010/06/memcached_vs_tokyocabinet_vs_tolyo_tyrant_vs_redis.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://blog.katsuma.tv/mt-atom.cgi/weblog/blog_id=1/entry_id=223" title="memcached vs TokyoCabinet vs TokyoTyrant vs Redis" />
    <id>tag:blog.katsuma.tv,2010://1.223</id>
    
    <published>2010-06-12T17:39:01Z</published>
    <updated>2010-06-12T20:25:39Z</updated>
    
    <summary>NoSQLの話題が周りで盛り上がっているので、有名どころのライブラリのset/g...</summary>
    <author>
        <name>ryo_katsuma</name>
        <uri>http://katsuma.tv</uri>
    </author>
            <category term="kvs" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.katsuma.tv/">
        <![CDATA[<p>NoSQLの話題が周りで盛り上がっているので、有名どころのライブラリのset/getのベンチマークを取ってみることにしました。対象はmemcached, TokyoCabinet, TokyoTyrant, Redisの４種類。gemで入れたruby用のバインディングを利用して1000件のデータをset, getしています。結果はこんなかんじ。</p>

<table>
<thead>
<th>&nbsp;</th>
<th>user</th>
<th>system</th>
<th>total</th>
<th>real</th>
</tr>
</thead>

<tbody>
<tr><td>memcached:set</td><td>0.120000</td><td>0.030000</td><td>0.150000</td><td>(  0.213069)</td></tr>
<tr><td>memcached:get</td><td>0.150000</td><td>0.030000</td><td>0.180000</td><td>(  0.238989)</td></tr>
<tr><td>TokyoCabinet:set</td><td>0.000000</td><td>0.000000</td><td>0.000000</td><td>(  0.002802)</td></tr>
<tr><td>TokyoCabinet:get</td><td>0.000000</td><td>0.000000</td><td>0.000000</td><td>(  0.001759)</td></tr>
<tr><td>TokyoTyrant:set</td><td>0.010000</td><td>0.000000</td><td>0.010000</td><td>(  0.005384)</td></tr>
<tr><td>TokyoTyrant:get</td><td>0.030000</td><td>0.000000</td><td>0.030000</td><td>(  0.038285)</td></tr>
<tr><td>Redis:set</td><td>0.040000</td><td>0.030000</td><td>0.070000</td><td>(  0.147060)</td></tr>
<tr><td>Redis:get</td><td>0.040000</td><td>0.020000</td><td>0.060000</td><td>(  0.151168)</td></tr>
</tbody>
</table>

<p>当然のごとくmemcachedが最速だろう。。。と思いきや、そうでもない結果に。むしろ一番遅い結果に。なんだこれーーーと思って調べ続けていたのですが、バインディングのgemのコードを追いかけるかぎり、どうもこれはmemcache-clientの実装が原因のよう。</p>

<p>これは、memcache-clientの実装はpure-rubyで実装されているのに対して、TokyoCabinet/TokyoTyrantのバインディングの実装はnativeコードで実装されてあるのが原因のようです。事実、TokyoTyrantはmemcacheプロトコルを実装しているので、memcache-clientを利用してTokyoTyrantにアクセスすると両者はこんな結果になりました。</p>

<table>
<thead>
<th>&nbsp;</th>
<th>user</th>
<th>system</th>
<th>total</th>
<th>real</th>
</thead>
<tbody>
<tr><td>memcache:set</td><td>0.120000</td><td>0.040000</td><td>0.160000</td><td>(  0.189803)</td></tr>
<tr><td>memcache:get</td><td>0.150000</td><td>0.030000</td><td>0.180000</td><td>(  0.240141)</td></tr>
<tr><td>TokyoTyrant:set</td><td>0.130000</td><td>0.030000</td><td>0.160000</td><td>(  0.238009)</td></tr>
<tr><td>TokyoTyrant:get</td><td>0.130000</td><td>0.020000</td><td>0.150000</td><td>(  0.271598)</td></tr>
</tbody></table>

<p>TokyoTyrantのアクセス速度は一気に遅くなりました。やっぱりRuby実装に引きづられているみたいですね。。</p>

<p>ちなみに、Redisもsetに限るとmemcacheプロトコルと同じプロトコルを利用できるので、そのベンチをとってみると</p>

<table>
<thead>
<th>&nbsp;</th>
<th>user</th>
<th>system</th>
<th>total</th>
<th>real</th>
</tr>
</thead>
<tbody>
<tr><td>Redis:set</td><td>0.040000</td><td>0.010000</td><td>0.050000</td><td>(  0.091300)</td></tr></tbody></table>

<p>と、なってmemcacheクライアントを利用したときのmemcached, TokyoTyrantと比較しても圧倒的に高速だということがわかりました（おもしろい！）</p>

<h3>まとめ</h3>
<ul>
<li>オンメモリだからmemcachedが高速、とは限らない</li>
<li>memcache-clientは遅いので注意</li>
<li>各ライブラリのオリジナルのバインディングを利用した場合、高速順に並び替えるとTokyoCabinet, TokyoTyrant, Redis, memcachedになる</li>
</ul>


<p>と、いうわけで、memcachedが高速なことを確認するためにベンチマーク取ってみたのですが、実装によってはまったく異なる結果になることが分かって、なかなかおもしろかったです。なお、今回利用したコードは<a href="http://gist.github.com/436046">gist</a>に掲載しています。</p>]]>
        
    </content>
</entry>

</feed> 


