<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>yoshizu blog</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/" />
    <link rel="self" type="application/atom+xml" href="http://blog.s2factory.co.jp/yoshizu/atom.xml" />
    <id>tag:blog.s2factory.co.jp,2009-05-15:/yoshizu//4</id>
    <updated>2010-04-09T19:00:12Z</updated>
    <subtitle>Flash, iPhone and Perl</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.27-ja</generator>

<entry>
    <title>ブログデザイン変更</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2010/04/post-2.html" />
    <id>tag:blog.s2factory.co.jp,2010:/yoshizu//4.240</id>

    <published>2010-04-09T18:05:37Z</published>
    <updated>2010-04-09T19:00:12Z</updated>

    <summary>またしてもご無沙汰してしまいました。 今度は四ヶ月。年に 3 回しか更新しないブ...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Etc" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>またしてもご無沙汰してしまいました。<br />
今度は四ヶ月。年に 3 回しか更新しないブログ。すみません。</p>

<p>この半年間で、弊社も少し変化がありました。<br />
ずいぶん前になりますが、<a href="http://blog.s2factory.co.jp/umeta/2009/09/expansion-of-the-office.html">オフィスが拡張されて倍の広さになりました</a>。</p>

<p>プログラマが多い会社だけにえいっとオフィスを extend して新しい機能（人）が加わった、というわけです。<br />
イメージソース時代から一緒にやってきたデザイナーの <a href="http://blog.s2factory.co.jp/masa/"><span class="caps">PONY</span></a> さんが S2 にやってきたのです。</p>

<p>早速、長らく MT デフォルトのデザインのまま放置されていた<a href="http://blog.s2factory.co.jp">スタッフブログ</a>のデザインを<br />
新しくしてくれています。</p>

<p>良い機会なので、私のブログも新しいデザインにしてみました。<br />
と言っても私はデザイン出来ないので、スタイルが充実している WordPress から<br />
良さそうなテーマを選んできて、それを MT に移植しただけです。</p>

<h4>Minimalist by techdesigns</h4>
<a href="http://wordpress.org/extend/themes/minimalist">http://wordpress.org/extend/themes/minimalist</a>

<p>適当に移植しただけなので、汎用的に通用するとは思いませんが<br />
何となく弄ったCSS のことを書いておきます。</p>



<pre>#page          -&gt; #container
#leftcol       -&gt; #beta
#menu          -&gt; #beta-inner
#maincol       -&gt; #alpha
.contentheader -&gt; .entry-title
</pre>



<p>これでだいたいいけます。後の細かいところは適当に MT に合わせて調整すれば完璧です。</p>

<p>（いい加減なこと書いてすみません...）</p>

<p>最後に宣伝を。</p>

<p>仕事とは直接関係ありませんが、私が参加する number0 のアルバム <a href="http://www.amazon.co.jp/gp/product/B0034BUSCM?ie=UTF8&amp;linkCode=ur2&amp;tag=s2f-22">chroma</a> がリリースされました。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://www.rallye-label.com/?pid=19301388" onclick="window.open('http://www.rallye-label.com/?pid=19301388'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/images/19301388.jpg" width="400" height="405" alt="19301388.jpg" class="mt-image-none" style="" /></a></span></p>

<p>2009 年の私のエネルギーの大半はこの作品に注ぎ込まれました。<br />
その分、他のアウトプットの量が減ってしまったのが悔やまれます。</p>

<p>良かったら聴いてみてください。<br />
<a href="http://www.myspace.com/number0number0">http://www.myspace.com/number0number0</a></p>

<p>iPhone アプリ <a href="http://seagirl.jp/iphone/amg/"><span class="caps">AMG</span>: Ambient Music Generator</a> を始めとして、音関連のプログラムは私の得意分野なので、<br />
その辺の話もネタにしながら、何か書けると良いのかなと思ってます。</p>

<p>もちろん、iPad や <span class="caps">HTML5 </span>も気になっているのでその辺の話もキャッチアップして行きたいです。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Data::AMF 0.03</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/12/dataamf-003.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.215</id>

    <published>2009-12-25T04:13:19Z</published>
    <updated>2009-12-25T04:41:43Z</updated>

    <summary>すっかりご無沙汰してしまいました。 書く習慣がなくなると駄目ですね。 というわけ...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="ActionScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionscript" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flex" label="Flex" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="perl" label="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>すっかりご無沙汰してしまいました。<br />
書く習慣がなくなると駄目ですね。</p>

<p>というわけで、Data::AMF 0.03 がリリースされました。<br />
<a href="http://search.cpan.org/dist/Data-AMF/">http://search.cpan.org/dist/Data-AMF/</a></p>

<p>このバージョンから <span class="caps">AMF3 </span>がサポートされました。</p>

<p>あと、Data::AMF::Remoting というのが追加されていて、<br />
NetConnection を使った Flash Remoting と、Flex の RemoteObject<br />
を使った Flex <span class="caps">RPC </span>が簡単に出来るようになりました。</p>

<p>Plack でゲートウェイを実装するとこんな感じです。</p>



<pre class="prettyprint">use Data::AMF::Remoting;
use Plack::Request;
use UNIVERSAL::require;

sub
{
    my $env = shift;
    my $req = Plack::Request-&gt;new($env);
    my $res = $req-&gt;new_response(200);
	
    if ($req-&gt;path =~ /\/amf\/gateway$/)
    {
        my $remoting = Data::AMF::Remoting-&gt;new(
            source =&gt; $req-&gt;raw_body,
            message_did_process =&gt; sub
            {
                my $message = shift;
                my ($class_name, $method) = split '\.', $message-&gt;target_uri;
                $class_name-&gt;require;
                my $controller = $class_name-&gt;new;
                return $controller-&gt;$method($message-&gt;value);
            }
        );
        $remoting-&gt;run;
		
        $res-&gt;content_type('application/x-amf');
        $res-&gt;body($remoting-&gt;data);
    }
	
    return $res-&gt;finalize;
};
</pre>



<p>source に <span class="caps">POST</span>データを渡して、message_did_process というハンドラで、<br />
メッセージ毎に処理しています。ヘッダー用には別途 header_did_process という<br />
ハンドラが用意されています。</p>

<p>$message-&gt;target_uri に、Controller.method という形式の文字列が渡ってくるので、<br />
これを使ってディスパッチします。</p>

<p>$message-&gt;value は Perl オブジェクトにデシリアライズされた引数です。</p>

<p> <br />
コントローラクラスの方は MooseX::Declare を使うと良い感じに書けます。</p>



<pre class="prettyprint">use MooseX::Declare;

class HelloController
{
    method echo(Str $text)
    {
        return $text;
    }
}
</pre>



<p> <br />
Flex 側はこんな感じです。</p>



<pre class="prettyprint">&lt;mx:RemoteObject id=&quot;helloService&quot;
    endpoint=&quot;http://localhost:5000/amf/gateway&quot;
    destination=&quot;perlamf&quot;
    source=&quot;HelloController&quot;
    showBusyCursor=&quot;true&quot;
    result=&quot;trace(event.result)&quot;
    fault=&quot;trace(event.fault.faultDetail)&quot;
/&gt;
&lt;mx:Button label=&quot;Hello&quot; click=&quot;helloService.echo('Hello, world!')&quot; /&gt;
</pre>



<p>destication は特に使われないのですが、空にするとランタイムエラーになるので、<br />
適当に書いておきます。</p>

<p>source がサーバー側のクラス名になります。</p>

<p>これでボタンがクリックされると、HelloController クラスの echo メソッドが<br />
コールされます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>WWDC 2009 四日目 五日目 (San Francisco Day 5, Day 6)</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/wwdc-2009-san-francisco-day-5.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.150</id>

    <published>2009-06-13T16:55:34Z</published>
    <updated>2009-06-13T17:27:06Z</updated>

    <summary> 　四日目の夜には Beer Bash という Apple 主催のパーティがあり...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="WWDC 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="macosx" label="Mac OS X" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwdc" label="WWDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/IMG_0812.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/IMG_0812.html','popup','width=601,height=801,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/IMG_0812-thumb-400x533.jpg" width="400" height="533" alt="IMG_0812.JPG" class="mt-image-none" style="" /></a></span></p>

<p>　四日目の夜には Beer Bash という Apple 主催のパーティがありました。Yerba Buena Gardens という公園でビールやワインと食事が振る舞われました。ステージが設置されていて、名前はわかりませんがバンドが出て来て盛り上がっていました。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/IMG_0830.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/IMG_0830.html','popup','width=1200,height=1600,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/IMG_0830-thumb-400x533.jpg" width="400" height="533" alt="IMG_0830.jpg" class="mt-image-none" style="" /></a></span></p>

<p>　五日目は早めにセッションが終わったので、フィッシャーマンズワーフに行ってみました。右へ習えでクラムチャウダーを食べたりエビを食べたり、遠巻きにアルカトラズやゴールデンゲートブリッジを眺めました。ケーブルカーや muni にも乗りました。</p>

<p>　あっという間に過ぎた時間でしたが、集中して iPhone 開発の知識を聞いて、眠くなるまでコード書いて、わからなければすぐに聞けるという環境は非常にすばらしく、高いお金を払ってでも来る価値はあると思いました。オーディオ処理、OpenGL ES、パフォーマンス、アプリケーションアーキテクチャ、Cocoa のアーキテクチャ、それから新機能をいくつか、と知りたかったことをたくさん覚えられたので、アプリケーション開発に活かしていきたいと思います。</p>

<p>　ところで、前回アメリカに来た時にも思いましたが、1 年から 3 年くらい英語圏で生活しないと駄目だな、と思いました。なかなか難しいとは思いますが、これから先のことを考えると、ビジネスレベルで英語を使いこなせないとやりたいことがやれなくなるような気がしています。</p>]]>
        
    </content>
</entry>

<entry>
    <title>WWDC 2009 二日目 三日目 (San Francisco Day 3, Day 4)</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/wwdc-2009-san-francisco-day-3.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.149</id>

    <published>2009-06-11T12:04:01Z</published>
    <updated>2009-06-11T12:15:17Z</updated>

    <summary>　セッションに関しては NDA があるので書けませんが、朝から晩までみっちり学べ...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="WWDC 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="macosx" label="Mac OS X" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwdc" label="WWDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>　セッションに関しては <span class="caps">NDA </span>があるので書けませんが、朝から晩までみっちり学べて幸せです。一人だとご飯食べたり、どこかに出かけたりするのが無精になり、引き蘢ってコードを書き続けることになるので、不健康ながら充実しています。</p>

<p>　時差ぼけが未だに直らず、たぶん最後まで直らないだろうなと諦め始めていますが、ここ二日間は、ホテルに帰還、手早く晩ご飯を済ます、力尽きて寝る、深夜に起きる、コード書く、セッションに行く、というサイクルで動くことでうまいこと保たれております。</p>

<p>　日本時間に直すと朝の 11 時 頃に寝て、夕方 5 時頃に起きているので、いつもよりちょっと寝るのが遅いくらいです...</p>]]>
        
    </content>
</entry>

<entry>
    <title>WWDC 2009 初日 (San Francisco Day 2)</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/wwdc-2009-san-francisco-day-2.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.147</id>

    <published>2009-06-09T11:50:33Z</published>
    <updated>2009-06-09T12:18:51Z</updated>

    <summary> 　時差ぼけで 3 時頃に目が覚め、Blog などを書きながら基調講演に並ぶ列の...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="WWDC 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="macosx" label="Mac OS X" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wwdc" label="WWDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/IMG_0798.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/IMG_0798.html','popup','width=601,height=801,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/IMG_0798-thumb-400x533.jpg" width="400" height="533" alt="IMG_0798.JPG" class="mt-image-none" style="" /></a></span></p>

<p>　時差ぼけで 3 時頃に目が覚め、Blog などを書きながら基調講演に並ぶ列の状況を探っていました。そして 6 時頃にホテル出て会場に向かうと列はすでに長蛇になっていました。どうやら私は 572 番のようでした。</p>

<p>　確か 7 時半くらいには会場の中に入れてもらうことが出来、中でコーヒや甘い甘いパンをいただきながら待ちました。中は暖かく、絨毯のので座り心地もまずまずだったので割と楽に過ごせました。</p>

<p>　列が動き始めたのは 9 時半頃で、基調講演が行われた部屋まで辿り着くと、何だか大御所ロックスターのライブを見に来ているような感覚がありました。</p>

<p>　発表の内容については皆さんご存知の通りです。MacBook Pro、Snow Leopard、iPhone OS 3.0、そして iPhone 3G S とハードもソフトも大量に発表されました。私が記憶する限りでは、例年に比べてもとても濃い <span class="caps">WWDC </span>の基調講演だったのではないかな、思いました。</p>

<p>　Snow Leopard が Leopard ユーザーに対してたったの $29 で販売されるということが発表された時に、何故かはわかりませんが一番身震いしました。「みんなに使って欲しいから」と言って、スクリーン上の $129 の「1」が落ちた瞬間です。</p>

<p>　WWDC に来てしまうくらい Apple に傾倒しているので勘違いの可能性が高いですが、それでも Apple の時代を感じずにはいられませんでした。</p>

<p>　午後からはいよいよ <span class="caps">NDA </span>のセッションが始まりました。夜はアップルジャパンがレセプションパーティを開催していたので行き、二日目も終了です。</p>

<p>　余談ですが、Apple の人のプレゼンで一番出現頻度が高かった単語は「incredible」でした。以前アメリカに来た時にも思ったのですが、実際に現地で使われている頻度の高い英単語をもっと教えてくれれば良いのになと思いました。「suppose to」とかもかなりの頻度で聞くのですが、以前はあまり馴染みのない言葉でした。<br />
　</p>]]>
        
    </content>
</entry>

<entry>
    <title>WWDC 2009 開催前夜 (San Francisco Day 1)</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/wwdc-2009-san-francisco-day-1.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.145</id>

    <published>2009-06-08T11:16:30Z</published>
    <updated>2009-06-08T11:36:14Z</updated>

    <summary> 　現地時間午前 11 時頃、サンフランシスコに到着しました。思っていたよりも交...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="WWDC 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wwdc" label="WWDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/IMG_0791.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/IMG_0791.html','popup','width=1600,height=1200,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/IMG_0791-thumb-480x360.jpg" width="480" height="360" alt="IMG_0791.JPG" class="mt-image-none" style="" /></a></span></p>

<p>　現地時間午前 11 時頃、サンフランシスコに到着しました。思っていたよりも交通網が充実していて、迷うことなくホテルに到着出来ました。チェックインは 3 時だったのですが、12 時頃に荷物を預けに行ってみると、そのままチェックインすることが出来ました。</p>

<p>　少し休んでから、早速会場の Moscone West へ登録に行ってきました。会場まで来ると色々感慨深くなり、いよいよだなという実感が湧きました。「Snow Loopard」の文字がデカデカと掲げられていたりしてワクワクします。受付でバックパックと T シャツを受け取って、回線の設定などをして後にしました。</p>

<p>　その後、時間があったので SF MoMA へ。量の多さに圧倒されましたが、非常に良い刺激になりました。全てをじっくり見る時間がなかったので気になっていた作品と、気になった作品をじっくり見ました。写真を撮る余裕がなかったので、諦めて脳に刷り込みました。</p>

<p>　MoMA を出て、近くの Jewish Musium にも行ってみようと思ったのですが、疲労と空腹がピークで、バーガーキングを持ち帰ってホテルに戻りました。戻ってからふと鏡を見ると、あまりにひどい顔をしていたので、これはまずいと思って寝ることにしました。</p>

<p>　唯一のオフだったので、本当はもう少し回りたかったのですが、本来の目的に支障が出てはいけないので、体を休めることを優先した初日になりました。</p>]]>
        
    </content>
</entry>

<entry>
    <title>WWDC に参加してきます。</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/wwdc.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.142</id>

    <published>2009-06-06T13:25:45Z</published>
    <updated>2009-06-06T13:35:00Z</updated>

    <summary>明日から一週間、WWDC に参加するためにサンフランシスコに行ってきます。 iP...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="wwdc" label="WWDC" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>明日から一週間、WWDC に参加するためにサンフランシスコに行ってきます。<br />
iPhone アプリのおかげで一開発者として参加することが出来るのが非常に嬉しいです。</p>

<p><span class="caps">WWDC </span>にいつか行ってみたいなと思いながら、一 Apple ファンとしてお祭り気分だけで参加するにはあまりに敷居が高く、そもそも数年前まで英語がまったく喋れない状態だったりして、なかなか参加することは出来なかったのですが、今回思い切って行ってみることにしました。</p>

<p>スケジュールの都合で、特にツアーなどに参加することなく単独で動いているので、もし現地でお見かけしましたらよろしくお願いします。</p>

<p>Mail: yoshizu [at] s2factory.co.jp<br />
Twitter: <a href="http://twitter.com/seagirl">seagirl</a></p>

<p>このモチベーションに乗っかってまた新しいアプリを開発し始めようと思います！</p>]]>
        
    </content>
</entry>

<entry>
    <title>Progression で Flex アプリケーションを作る</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/progression-flex.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.141</id>

    <published>2009-06-03T11:18:07Z</published>
    <updated>2009-06-04T04:12:54Z</updated>

    <summary>Progression を使って Flex アプリケーションを作る場合、 自分な...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="ActionScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Flex" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Progression" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionscript" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flex" label="Flex" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="progression" label="Progression" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>Progression を使って Flex アプリケーションを作る場合、<br />
自分ならどんな風に書くかな？と思って試してみました。</p>

<p><a href="http://seagirl.jp/labs/progression/sample1/">サンプル</a><br />
<a href="http://seagirl.jp/labs/progression/sample1/srcview/">ソース</a></p>

<p>--<br />
まず、Progression と Flex を共存させるための基本的な考え方は、<br />
コントローラを Progression で、ビューを Flex で書く、ということになります。</p>

<p>これを踏まえた、アーキテクチャは以下のようになります。<br />
 <br />
　<br />
<b>・View (MXML)</b></p>

<p>View は <span class="caps">MXML </span>で書きます。逆に考えると、MXML で書いた部分が View です。したがって、基本的に <span class="caps">MXML </span>にはビジュアルコンポーネントしか書きません。</p>

<p><b>・Delegate</b></p>

<p>Application、ItemRenderer など、View を生成するところで Flex の作法に逆らえないところは、View を操作するロジックを非ビジュアルコンポーネントとして View に記述します。Delegate は、後述する ViewController とは別のものになります。通常、View が ViewController を保持／参照することはありません。</p>

<p><b>・ViewController (Cast)</b></p>

<p>Progression の CastObject クラスを継承し、View オブジェクトを保持します。View の操作とイベントハンドリングを記述します。</p>

<p><b>・Scene</b></p>

<p>Progression の Scene です。Scene 毎に必要になる Model や View を生成し、それらを用いて ViewController を生成します。また、必要となるリソースは都度 Command を用いて取得し、生成した Model で処理／保持します。</p>

<p><b>・Service (Command)</b></p>

<p>外部サービスとの連携には Progression の Command を使います。これらの Command の生成と実行は、Scene が行います。</p>

<p><b>・Model</b></p>

<p>Model は ViewController の単位で生成します。ViewController が Model の値を View に適用します。値を保持する役割の他に、サービスから取得した値をデコードする処理なども担います。</p>

<p>--<br />
次に、処理の流れを具体的に見て行きましょう。</p>

<p><b>1. ProgressionSample.mxml</b></p>

<p>Flex フレームワークを使う場合、メインクラスは Application クラス (MXML) になります。Application クラスは Flex のコンテナなので、直接 <span class="caps">MXML </span>を使って View を構築することも出来ますが、前述したアーキテクチャに従うために、ProgressionSampleDelegate コンポーネントのみが記述されています。</p>



<pre class="prettyprint">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	xmlns:local=&quot;*&quot;
	layout=&quot;absolute&quot;
	viewSourceURL=&quot;srcview/index.html&quot;
&gt;
	&lt;mx:Style source=&quot;ProgressionSample.css&quot; /&gt;
	&lt;local:ProgressionSampleDelegate /&gt;
&lt;/mx:Application&gt;
</pre>




<p><b>2. ProgressionSampleDelegate</b></p>

<p>ProgressionSample の FlexEvent.INITIALIZE イベントで ProgressionSampleDelegate の initialize() が呼ばれます。initialize() が呼ばれるまでの処理は、親クラスの ApplicationDelegate に隠蔽しています。initialize() で Progression インスタンスを生成し、ここからの処理の流れは Progression に委ねます。</p>



<pre class="prettyprint">public class ProgressionSampleDelegate extends ApplicationDelegate
{
	public var view:ProgressionSample;
	
	override protected function initialize():void
	{
		SWFWheel.initialize(view.systemManager.stage);
		FilterShortcuts.init();
		
		var progression:Progression = new Progression(&quot;main&quot;, view.systemManager.stage, MainScene);
		progression.sync = true;
		progression.autoLock = false;
		progression.goto(progression.firstSceneId);	
	}
	
}
</pre>



<p><b>3. MainScene</b></p>

<p>MainScene は Page1Scene と Page2Scene を生成し、さらに Header/Navigation/Contents の View と ViewController を生成しています。スタティックなコンテンツなので難しいところは特にないと思います。これらは onLoad で Application に AddChild されます。さらに、onInit で Page1Scene に Goto するようになっています。</p>



<pre class="prettyprint">public function MainScene(initObject:Object = null)
{
	super(&quot;main&quot;, initObject);
	
	addScene(new Page1Scene());
	addScene(new Page2Scene());
	
	application = Application.application as Application;
	
	header = new HeaderController(null, new Header());
	navigation = new NavigationController(null, new Navigation());
	contents = new ContentsController(null, new Contents());
}
</pre>





<pre class="prettyprint">override protected function _onInit():void
{
	addCommand(
		new Goto(getSceneAt(0).sceneId)
	);
}

override protected function _onLoad():void
{
	addCommand(
		[
			new AddChild(application, header),
			new AddChild(application, navigation),
			new AddChild(application, contents)
		]
	);
}
</pre>



<p><b>4. Page1Scene</b></p>

<p>Page1Scene では、PageModel と Page1 を生成し、Page1Controller を生成しています。onLoad で外部 <span class="caps">XML </span>を読んで、PageModel に渡し、それから Contents に View1Controller を AddChild しています。</p>



<pre class="prettyprint">public function Page1Scene(initObject:Object = null)
{
	super(&quot;page1&quot;, initObject);
	
	addScene(new Page1DetailScene());

	controller = new Page1Controller(new PageModel(), new Page1());
}

public var controller:Page1Controller;

override protected function _onLoad():void
{
	addCommand(
		new LoadURL(new URLRequest(&quot;assets/data.en.xml&quot;)),
		
		function ():void
		{
			controller.model.parse(this.previous.data);
		},
		
		new AddChild(MainScene(parent).contents.view, controller)
	);
}

override protected function _onUnload():void
{
	addCommand(
		new RemoveChild(MainScene(parent).contents.view, controller)
	);
}
</pre>



<p><b>5. Page1Controller</b></p>

<p>Page1Controller は view プロパティに Page1 オブジェクトを保持しています。view の表示アニメーションを DoTweener コマンドで定義し、さらに view.dataGrid の MouseEvent.DOUBLE_CLICK イベントをハンドリングしています。データグリッドがダブルクリックされると、Page1DetailScene がダイナミックに生成する Scene に Goto しています。</p>



<pre class="prettyprint">public var model:PageModel;
public var view:Page1;

override protected function _onCastAdded():void
{
	view.alpha = 0;
	
	view.dataGrid.dataProvider = model.words;
	view.dataGrid.addEventListener(MouseEvent.DOUBLE_CLICK, dataGridDoubleClickHandler);
	
	addCommand(
		new DoTweener(
			view,
			{
				_Blur_blurX : .1,
				_Blur_blurY : .1,
				alpha: 1,
				time: 1
			}
		)
	);
}

override protected function _onCastRemoved():void
{
	view.dataGrid.removeEventListener(MouseEvent.DOUBLE_CLICK, dataGridDoubleClickHandler);
	
	addCommand(
		new DoTweener(
			view,
			{
				_Blur_blurX : .1,
				_Blur_blurY : .1,
				_Blur_quality : 3,
				alpha: 0,
				time: 1
			}
		)
	);
}

private function dataGridDoubleClickHandler(event:MouseEvent):void
{	
	new Goto(new SceneId(&quot;/main/page1/detail/&quot; + view.dataGrid.selectedItem.@id)).execute();
}
</pre>



<p><b>6. Page1DetailScene</b></p>

<p>Page1DetailScene は通過専用の Scene で、ここで目的地となる Scene をダイナミックに生成しながら、遷移しています。この辺りは <a href="http://www.muraken.biz/blog/2009/05/28/case-study-of-progression-vol1/">muraken さんの記事</a> を多いに参考（と言うより、ほぼそのまま...）にさせていただきました。遷移が終わったら、View を持たない Controller を生成し、Alert.show() でモーダルウィンドウを表示させています。</p>



<pre class="prettyprint">public function Page1DetailScene()
{
	super(&quot;detail&quot;);
	
	controller = new Page1DetailController();
}

public var controller:Page1DetailController;

override protected function _onLoad():void
{
	super._onLoad();
	
	var parentController:Page1Controller = Page1Scene(parent).controller;
	var item:XML = parentController.model.getItemById(current.name);
		
	controller.show(item, parentController.view);
}
</pre>





<pre class="prettyprint">public function show(item:XML, target:Sprite):void
{
	if (item == null)
		Alert.show(&quot;Couldn't find.&quot;, &quot;Error&quot;, 4, target, closeHandler);
	else
		Alert.show(item.@value, &quot;No.&quot; + item.@id, 4, target, closeHandler);		
}

private function closeHandler(event:CloseEvent):void
{
	new Goto(new SceneId('/main/page1')).execute()
}
</pre>



<p>--<br />
基本的な流れは以上です。</p>

<p>DataGrid の DataGridColumn に無駄に豪華な ItemRenderer を当てていますが、ItemRenderer と ItemRendererDelegate はこんな具合に書くよ、というサンプルのつもりで敢えてそうしてあります。</p>

<p>html-template は Flex Builder でデプロイするのに最適なようにカスタマイズしてあります。</p>

<p>--<br />
以下は余談ですが、今回の検証で本格的な Flex アプリケーションを Progression を使って実装出来ることがわかりました。</p>

<p>Flex フレームワークはページ管理、状態管理といった部分の機能が非常に貧弱なので、大規模な開発を管理するのが難しいという側面があります。それを補うために、Cairngorm や PureMVC といった Flex アプリケーション向けのフレームワークが開発されていますが、Progression もそれらと比較しても遜色はないと思いました。</p>

<p>特に Scene という概念が秀逸で、Scene が Facade になって内部の <span class="caps">MVC </span>を隠蔽してくれるため、Scene 単位でアプリケーションを分けることが出来ます。Scene 毎に分散して開発することで、大規模な開発もしやすいと思いました。</p>

<p>さらに余談ですが、MXML に非ビジュアルコンポーネントを記述することは、Flash Professional でタイムラインにスクリプトを書くのと同じ感覚なので、実際のプロジェクトでは使用されていないスタイルだと思います。</p>

<p>個人的には Cocoa + Interface Builder のように、View に相当する部分は <span class="caps">GUI </span>で構築してしまって、中のソースコードは意識しなくて済むように隠蔽されている、というのが案外望ましいのかな、と思っているので、Flash Catalyst + Flash Builder の開発はそこを目指して欲しいなと思っています。残念ながら Beta から汲み取れる雰囲気ではそうなっていないようですが...。</p>]]>
        
    </content>
</entry>

<entry>
    <title>Subversive のインストール</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/06/subversive.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.140</id>

    <published>2009-06-02T07:36:27Z</published>
    <updated>2009-06-02T09:23:07Z</updated>

    <summary>メモ: インストールに必要な URL  SVNKit http://eclips...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="eclipse" label="Eclipse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="macosx" label="Mac OS X" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>メモ:</p>

<p>インストールに必要な <span class="caps">URL </span></p>

<p><span class="caps">SVNK</span>it<br />
http://eclipse.svnkit.com/1.3.x/</p>

<p><span class="caps">SVN</span> Connectors<br />
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/</p>

<p>Subversive<br />
http://download.eclipse.org/technology/subversive/0.7/update-site/</p>


<p><span class="caps">SVN</span> Connectors と Subversive は一度に入れる<br />
Leopard 標準の Subversion は 1.4 系なので、MacPorts で 1.6 系を入れてしまう<br />
Subversion 1.6 系を入れると、zsh の補完がおかしくなるので対処する</p>



<pre>% cd /usr/share/zsh/site-functions
% sudo wget -c http://gvn.googlecode.com/svn/trunk/contrib/zsh/_subversion</pre>]]>
        
    </content>
</entry>

<entry>
    <title>ActionScript でコマンドラインツールを作る方法</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/05/actionscript.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.135</id>

    <published>2009-05-14T11:13:15Z</published>
    <updated>2009-05-15T05:58:11Z</updated>

    <summary>Flex SDK に含まれる AIR 開発用の adl コマンドを使って、Act...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="AIR" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="ActionScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="air" label="AIR" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="actionscript" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>Flex <span class="caps">SDK </span>に含まれる <span class="caps">AIR </span>開発用の adl コマンドを使って、ActionScript で簡単なコマンドラインツールが作れることに気が付きました。</p>

<p>コンソールに Hello, world! と引数の中身を適当に出力するツールは、こんな感じで実装出来ます。</p>

<p>コマンドラインツールなので、最後に exit() を呼んでやる必要があります。<br />
引数は InvokeEvent 経由で受け取るようになっています。</p>



<pre class="prettyprint">// hello.as
package {
	import flash.desktop.NativeApplication;
	import flash.display.Sprite;
	import flash.events.InvokeEvent;

	import mx.utils.ObjectUtil;

	public class hello extends Sprite
	{
		public function hello()
		{
			NativeApplication.nativeApplication.addEventListener(InvokeEvent.INVOKE, initialize);
		}
		
		private function initialize(event:InvokeEvent):void
		{
			trace(&quot;--------------------------------------------------------------------------------&quot;);
			trace(&quot;Hello, world!&quot;);
			trace(&quot;&quot;);
			
			// コマンドライン引数を受け取る
			var args:Array = event.arguments;
			
			trace(ObjectUtil.toString(args));
			
			trace(&quot;&quot;);
			NativeApplication.nativeApplication.exit();	
		}
	}
}
</pre>


<p> </p>



<pre class="prettyprint">// hello-app.xml
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;application xmlns=&quot;http://ns.adobe.com/air/application/1.5&quot;&gt;
	&lt;id&gt;HelloASCommandLineTool&lt;/id&gt;
	&lt;filename&gt;hello&lt;/filename&gt;
	&lt;name&gt;hello&lt;/name&gt;
	&lt;version&gt;v1&lt;/version&gt;
	&lt;initialWindow&gt;
		&lt;content&gt;hello.swf&lt;/content&gt;
	&lt;/initialWindow&gt;
&lt;/application&gt;
</pre>



<p>後は、これを適当に amxmlc でコンパイルし、adl で実行するだけです。</p>



<pre class="prettyprint">% amxmlc -output hello.swf hello.as
Loading configuration file /Applications/Adobe Flex Builder 3/sdks/3.2.0/frameworks/air-config.xml
hello.swf (14304 bytes)
</pre>


<p> </p>


<pre class="prettyprint">% adl hello-app.xml -- Hoge Fuga &quot;`pwd`&quot;
--------------------------------------------------------------------------------
Hello, world!

(Array)#0
  [0] &quot;Hoge&quot;
  [1] &quot;Fuga&quot;
  [2] &quot;/Users/yoshizu/Desktop/ASCLTool&quot;
</pre>



<p>ちなみに、trace ログの出力は、mm.cfg で flashlog.txt に書き込まれるようにしている場合は、flashlog.txt に向きます。mm.cfg 作っていない場合は、そのままコンソールに出力されます。</p>

<p>ただ、このままだと hello-app.xml を置いているディレクトリを使う時にいちいち意識しないといけないので、簡単なラッパーとなるシェルスクリプトを作っておいて、パスが通る場所に置いておくと便利です。</p>

<p>今回は、ホームディレクトリ以下にこんな構成で配置しました。</p>



<pre>bin
  |- as
  |- astools
      |- hello
          |- hello.as
          |- hello-app.xml
          |- hello.swf
</pre>


<p> </p>


<pre class="prettyprint">#!/bin/sh

if [ ${1:-0} = 0 ]
then
	echo &quot;usage: % as hello&quot;
	exit
fi

path=${0%/*}

adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9

exit
</pre>



<p>すると、こんな風にどこからでも叩けるようになりました。</p>



<pre class="prettyprint">% as hello Hoge Fuga &quot;`pwd`&quot;
--------------------------------------------------------------------------------
Hello, world!

(Array)#0
  [0] &quot;Hoge&quot;
  [1] &quot;Fuga&quot;
  [2] &quot;/Users/yoshizu/Desktop&quot;
</pre>



<p>違うツールを作った時にも、astools 以下に放り込んでおけば、as コマンドは共通して使えるので便利です。</p>


<p>--<br />
追記 (2009.05.15)</p>

<p>mm.cfg で trace が flashlog.txt にいってしまう人は、一時的に mm.cfg の中身を書き換えてあげるとコンソールに trace が表示されるようになります。</p>



<pre class="prettyprint">#!/bin/sh

function replace
{
	sed -e $1 $2 &gt; $3
	mv $3 $2
	return 0;
}

mm=${HOME}/mm.cfg
path=${0%/*}

if [ ${1:-0} = 0 ]
then
	echo &quot;usage: % as hello&quot;
	exit
fi

replace &quot;s/^\(.*\)=1$/\1=0/g&quot; $mm ${path}/as-tmp

adl ${path}/astools/${1}/${1}-app.xml -- $2 $3 $4 $5 $6 $7 $8 $9

replace &quot;s/^\(.*\)=0$/\1=1/g&quot; $mm ${path}/as-tmp

exit</pre>]]>
        
    </content>
</entry>

<entry>
    <title>ネットワーク越しのディスクを使って TimeMachine する</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/03/-timemachine.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.126</id>

    <published>2009-03-13T10:02:22Z</published>
    <updated>2009-03-13T10:06:10Z</updated>

    <summary>メモ: defaults write com.apple.systemprefe...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Mac OS X" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>メモ:</p>



<pre class="prettyprint">defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1</pre>



<p><span class="caps">AFP </span>でマウントしておくと TimeMachine の対象ディスクに表示されるようになる</p>]]>
        
    </content>
</entry>

<entry>
    <title>AMG: Ambient Music Generator 1.0 リリースしました。</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/02/amg-ambient-music-generator-10.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.123</id>

    <published>2009-02-24T16:47:21Z</published>
    <updated>2009-02-24T16:58:10Z</updated>

    <summary> AMG: Ambient Music Generator 1.0 リリースしま...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Work" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/amg_1_1.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/amg_1_1.html','popup','width=320,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/amg_1_1-thumb-320x480.jpg" width="240" height="360" alt="amg_1_1.jpg" class="mt-image-none" style="" /></a></span></p>

<p><span class="caps">AMG</span>: Ambient Music Generator 1.0 リリースしました。<br />
<a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=302135622&amp;mt=8">App Store</a></p>

<p>--<br />
<b><span class="caps">AMG</span>: Ambient Music Generator</b><br />
<a href="http://seagirl.jp/iphone/amg/">http://seagirl.jp/iphone/amg/</a></p>

<p>Ambient Music Generator は、アンビエント・ミュージックを動的に生成するためのツールです。</p>

<p><b>使い方</b></p>

<p>音の生成を始めるには iPhone をシェイクします。あるいは、Algorithm を「None」から「Random」に変更する必要があります。</p>

<p>もう一度シェイクすると生成が止まります。</p>

<p><b>ジェネレータ</b><br />
ジェネレータは全部で 3 つあります。フリックすることで、それぞれのジェネレータを切り替えることが出来ます。それぞれのジェネレータはいくつかのパラメータを持っています。これらのパラメータを調整することで音楽を生成することが出来ます。</p>

<p><b>アルゴリズム</b><br />
音楽の生成に用いられるアルゴリズムを選択します。いずれかのアルゴリズムを与えることで、ジェネレータは音を鳴らし始めます。</p>

<p><b>キー</b><br />
ルートキー、スケール、音程の範囲を選択することが出来ます。</p>

<p><b>インターバル</b><br />
白い丸を左右にドラッグすることで、音と音の間隔を調整することが出来ます。</p>

<p><b>エンベロープ</b><br />
二つの白い丸を上下左右にドラッグすることで、音の性質を調整することが出来ます。</p>]]>
        
    </content>
</entry>

<entry>
    <title>SWFSound (Draft)</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2009/02/swfsound-draft.html" />
    <id>tag:blog.s2factory.co.jp,2009:/yoshizu//4.119</id>

    <published>2009-02-05T14:46:43Z</published>
    <updated>2009-02-05T16:04:25Z</updated>

    <summary>Adobe MAX Japan 2009 への参加を通じて、 たくさんの発見とイ...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="ActionScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionscript" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="swfsound" label="SWFSound" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>Adobe <span class="caps">MAX</span> Japan 2009 への参加を通じて、<br />
たくさんの発見とインスピレーションを得ることが出来たので、<br />
もう少しコミュニティに貢献していきたいなと思いまして、<br />
新しくサウンド系のライブラリを作ろうと思います。</p>

<p><a href="http://www.libspark.org/">Spark project</a> の音系ライブラリと言えば <a href="http://apps.sazameki.org/ssgen/">sazameki</a> がありますが、<br />
充実した機能を持っている反面、音を鳴らすまでに必要な手続きが少し長いので、<br />
プログラムに不慣れな人にとっては少し敷居が高いように思えました。</p>

<p>そこで、もっと手軽に音を鳴らすことが出来るライブラリを作ろうと思いました。</p>

<p>手軽に使えるという部分を意識するようになったのは、<br />
Spark project の <a href="http://www.libspark.org/wiki/trick7/TeraFire">TeraFire</a> から大きなインスピレーションを得たからです。</p>

<p>TeraFire は、new して addChild することで炎を作ることが出来ますが、<br />
<span class="caps">SWFS</span>ound は、new して play するだけで音が鳴らすことが出来ます。</p>



<pre class="prettyprint">var instrument:Instrument = new Instrument();
instrument.play();
</pre>



<p>音程や音量や音の長さも気軽に変えることが出来ます。</p>



<pre class="prettyprint">// 音程を変える
instrument.noteNumber = 60; // 0 〜 127 の MIDI ナンバーでで音程を決める
instrument.frequency = 440; // 周波数で音程を決める

// 音量を変える
instrument.volume = 0.8; // 0  〜 1.0 の範囲の値

// 音の長さを変える
instrument.lentgth = 3.0; // 単位は秒
</pre>



<p>音色は IPreset を実装したクラスのインスタンスを与えることで変えられます。<br />
豊富なプリセットを用意する予定です。</p>



<pre class="prettyprint">// ピコピコな音にします
var preset:IPreset = new PicoPico();
instrument.preset = preset;
</pre>



<p>プリセットを微調整することも出来ますし、全く新しく作ることも出来ます。</p>



<pre class="prettyprint">// オシレータをサイン波にする
preset.oscillator1 = new Sinewave();

// ADSR エンベロープを調整する (0 〜 1.0 の範囲の値)
preset.attack = 0.8;
preset.decay = 1.0;
preset.sustain = 0.4;
preset.release = 0.6;

// 新しくプリセットを作る
var customPreset:IPreset = new Preset();
customPreset. oscillator1 = new SquareWave();
customPreset. oscillator2 = new Noise();
customPreset.attack = 0;
customPreset.decay = 1.0;
customPreset.sustain = 0;
customPreset.release = 0;
</pre>



<p>また、楽器をいくつか組み合わせたキットを作ることも出来ます。<br />
デフォルトでも、DrumKit や WebSiteKit などを搭載する予定です。</p>



<pre class="prettyprint">// ドラムキット
var drums:IKit = new DrumKit();
drums.play(0); // キック
drums.play(1); // スネア
drums.cymbal.play(); // シンバル
drums.closeHighHat.play(); // クローズハイハット

// ウェブサイト用の音を集めたキット
var website:IKit = new WebSiteKit();
website.click.play(); // クリック
website.rollover.play(); // ロールオーバー
website.rollout.play(); // ロールアウト
</pre>



<p>もちろん、新しくキットを作ることも出来ます。</p>



<pre class="prettyprint">// 汎用的なキット
var kit:IKit = new Kit();
kit.addInstrument(instrument1);
kit.addInstrument(instrument2);
kit.play(0);
</pre>



<p>エフェクトも使えます。</p>


<pre class="prettyprint">// エフェクトを作る
var effect:IEffect = new Delay();

// 楽器に適用
instrument.addEffect(effect);

// プリセットに適用
preset.addEffect(effect);

// キットに適用
kit.addEffect(effect);
</pre>



<p>楽器、プリセット、キットという単位で好きなようにカスタマイズ出来るので、<br />
ユーザーにたくさんの音色を作ってもらって、どんどん公開してもらうのが狙いです。</p>

<p>さらにおまけとして、Ambient Music Generator の開発を通じて得たノウハウを元に、<br />
スケールを定義するクラスを同梱しようと思います。</p>



<pre class="prettyprint">// スケールを作る
var scale:IScale = new MajorScale();
scale.rootkey = 5; キーを E に変更

// 音程の範囲を制限する
scale.min = 40; // 最小値
scale.max = 80; // 最大値

// 作ったスケールを使ってランダムに鳴らす
var noteNumber:int = scale.notes[Math.random() * scale.numNotes];
instrument.noteNumber = noteNumber;
instrument.play();
</pre>



<p>これらを Timer とかで適当に回したりすると、自動作曲っぽいことが出来ます。</p>


<p>というようなライブラリを絶賛開発中です。<br />
公開予定は今春として濁しておきたいと思います...。</p>


<p>要望などございましたらどしどしお寄せ下さい！</p>

<p>yoshizu [ at ] s2factory.co.jp<br />
<a href="http://twitter.com/seagirl">twitter.com/seagirl</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Wonderfl ワンダフル！</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2008/12/wonderfl.html" />
    <id>tag:blog.s2factory.co.jp,2008:/yoshizu//4.111</id>

    <published>2008-12-17T18:43:58Z</published>
    <updated>2008-12-17T19:02:49Z</updated>

    <summary> KAYAC さんの新しいサービス Wonderfl がおもしろいです。 ブラウ...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="ActionScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Work" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="actionscript" label="ActionScript" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p><iframe src="http://wonderfl.kayac.com/blogparts/8b17ddb1ce4c73ebe8165c95d30f208bd393d037" width="484" height="490" style="border:1px black solid;"></iframe></p>

<p><span class="caps">KAYAC </span>さんの新しいサービス <a href="http://wonderfl.kayac.com/">Wonderfl</a> がおもしろいです。</p>

<p>ブラウザで書いた <span class="caps">AS3 </span>コードが即座にコンパイルされてプレビュー出来るといったサービスみたいです。</p>

<p>まだベータテスト中（？）らしいのですが、すでに Twitter 界隈の ASer たちが続々とコードを投稿しています。</p>

<p>嬉しいのが、Flash Player 10 に対応した Flex <span class="caps">SDK </span>でコンパイルしているっぽくて、<br />
Dynamic Sound Generation とかも普通に動いてます。</p>

<p>さらに外部ライブラリもすでにいくつか組み込まれており、Thread とか Tweener などが使えます。</p>

<p>というわけで、僕もいくつか投稿してみました。</p>

<p>1. Dynamic Sound Generation<br />
<a href="http://wonderfl.kayac.com/code/8b17ddb1ce4c73ebe8165c95d30f208bd393d037">http://wonderfl.kayac.com/code/8b17ddb1ce4c73ebe8165c95d30f208bd393d037</a></p>

<p>2. BitmapFilter<br />
<a href="http://wonderfl.kayac.com/code/b9c68bf8505c61b9b617dade4491ee8d2b3b98fe">http://wonderfl.kayac.com/code/b9c68bf8505c61b9b617dade4491ee8d2b3b98f</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Objective-C 向けの静的解析ツール clang</title>
    <link rel="alternate" type="text/html" href="http://blog.s2factory.co.jp/yoshizu/2008/12/objectivec-clang.html" />
    <id>tag:blog.s2factory.co.jp,2008:/yoshizu//4.110</id>

    <published>2008-12-15T03:42:11Z</published>
    <updated>2008-12-15T04:16:57Z</updated>

    <summary>Objective-C 2.0 からガーベジコレクションが導入されて話題になりま...</summary>
    <author>
        <name>seagirl</name>
        
    </author>
    
        <category term="Objective-C" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="objectivec" label="Objective-C" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://blog.s2factory.co.jp/yoshizu/">
        <![CDATA[<p>Objective-C 2.0 からガーベジコレクションが導入されて話題になりましたが、<br />
iPhone OS ではサポートされていないので、iPhone アプリを作ろうと思うと<br />
カウント方式と言われる方法で、メモリ管理を自分でしなければなりません。</p>

<p>しかし普段 AS で、ガーベジコレクションに頼ったプログラムを書いている人からすると<br />
このメモリ管理になかなか慣れることが出来ず、ついついメモリリークしてしまいます。</p>

<p>それを防ぐための <a href="http://clang.llvm.org/StaticAnalysis.html">clang</a> というツールを <a href="http://blog.asial.co.jp/504">アシアルブログ</a> で目にしたので、<br />
早速、試してみました。</p>

<p><span class="mt-enclosure mt-enclosure-image" style="display: inline;"><a href="http://blog.s2factory.co.jp/yoshizu/Picture%201.html" onclick="window.open('http://blog.s2factory.co.jp/yoshizu/Picture%201.html','popup','width=1109,height=968,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"><img src="http://blog.s2factory.co.jp/yoshizu/Picture 1-thumb-300x261.png" width="300" height="261" alt="Picture 1.png" class="mt-image-none" style="" /></a></span></p>

<p>メモリリークがたくさん見つかってしまいました...<br />
ファイル名と行数が書かれているので、簡単に場所を特定することが出来ます。</p>

<p>しかし、これはとても便利ですね。驚きました。<br />
Xcode に統合されれば良いのに、と思いました。</p>

<p>使い方は、プロジェクトディレクトリで</p>



<pre class="prettyprint">% scan-build -V -o ~/Desktop xcodebuild</pre>



<p>で、解析が行われて <span class="caps">HTML </span>をブラウザに表示してくれます。</p>

<p>オプションの -o は出力先を指定していて、-V は解析後にブラウザを自動で<br />
起動するためのものです。引数の xcodebuild はコンパイルに使われるコマンドです。</p>

<p>なお、実行すると実際にコンパイルされて、それが解析対象になるので、<br />
もう一度、実行する時は clean してやる必要があります。</p>



<pre class="prettyprint">% xcodebuild clean</pre>]]>
        
    </content>
</entry>

</feed>
