Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
てっく煮ブログ
[go: Go Back, main page]

Hatena::Diary

てっく煮ブログ

2007年12月30日

今年まとめ(自己満足)

今年の人気エントリ

ブックマーク御礼。

  1. てっく煮ブログ - Apollo 触ってみた。すごすぎ。
  2. Yahoo! Pipes の Page Fetch モジュールでスクレイピングし放題 - てっく煮ブログ
  3. はてブのCSSをカスタマイズしてみた [tech.nitoyon.com@hatena]
  4. てっく煮ブログ - ActionScript 的超絶技巧発表会に参加してきました
  5. てっく煮ブログ - ActionScript やるなら入れとけ。rascut 導入と使い方。
  6. HTML JS版 Apollo アプリを作ってみる [てっく煮]
  7. てっく煮ブログ - Google Gears の使い道
  8. てっく煮ブログ - あまり語られていない Apollo のセキュリティについてまとめてみた
  9. アドビの新サイトがすごいことになってる - てっく煮ブログ
  10. てっく煮ブログ - 四則演算を JavaScript で実装する
  11. てっく煮ブログ - すごく楽しかった Flash 談義のログをまとめてみたよ
  12. 京都市バスの路線別 停留所取得API公開 - てっく煮ブログ
  13. 丸ビル RSS リーダー
  14. てっく煮ブログ - ActionScript3.0でテトリスを作ってみる
  15. ECMAScript 4 の Draft をざっくり読んでみた - てっく煮ブログ

全部思い入れがあるんだけど、「書いたもの」より「作ったもの」が評価されたほうが嬉しかったりする。上で言うと、3. 13. 14. あたり。

発表資料まとめ

いろいろ発表した。

  1. Flex と WPF の概要東京勉強会
  2. ActionScript for Flasher(1)@てら子
  3. Flex Internals1 〜MXML 再入門〜@FxUG
  4. ActionScript3.0でテトリスを作ってみる@WCAN mini
  5. ActionScript と Flex のレイアウト@FxUG
  6. ラスタ→ベクタ変換する AS ライブラリ "PotrAs"ActionScript超絶技巧発表会
  7. 丸ビルRSSリーダー@FxUG+てら子
  8. Flexカスタムコンポーネントの作り方@FxUG
  9. LiveCoding#5 でコーディングLiveCoding#5

2008年抱負

幅を広げていきたい。

2007年12月27日

論理演算子(&& と ||)を応用する

jQueryソースコードを見ていて面白いのがあった。

function add(a, b){
    addImpl(b && a, b || a);
}


function addImpl(a, b){
    // ...
}

理解するためには、論理演算子を詳しく理解する必要がある。

論理演算子詳細

JavaScript(というか ECMAScript)の論理演算子は、評価結果が true/false で返される訳ではなく、結果が確定した時点で評価した値が返される。

まずは、|| を試してみよう。

alert(2 || 0);         // 2
alert(2 || 3);         // 2
alert({} || null)      // [object Object]

alert(0 || 3);         // 3
alert(0 || 0);         // 0
alert(0 || undefined); // undefined

オペランドが true として評価できるなら、左オペランドの値自身が返る。右オペランドはどんな値だったとしても評価結果が返る。

ECMAScript の仕様書から抜き出すと、こういう手順になってる。

  1. 左オペランドを評価する
  2. 左オペランドの結果を Boolean に変換
  3. 変換結果が true なら、左オペランドの評価結果を返す
  4. 右オペランドを評価
  5. 右オペランドの評価結果を返す

alert(0 || 0) と alert(0 || undefined) の結果が違うあたりが面白い。

次は、&&。

alert(2 && 3);         // 3
alert(1 && {})         // [object Object]

alert(2 && 0);         // 0
alert(null && 3);      // null
alert(0 || undefined); // 0

左オペランドが true として評価できるなら、右オペランドの評価結果が返り、そうでない場合は左オペランドの結果が返る。

ECMAScript の仕様書には次のようにある。

  1. 左オペランドを評価する
  2. 左オペランドの結果を Boolean に変換
  3. 変換結果が false なら、左オペランドの結果を返す
  4. 右オペランドを評価する
  5. 右オペランドの評価結果を返す

ということで、ECMAScriptは、論理演算子の結果が Boolean とは限らないわけだ。PerlRuby でも似たような感じなので、スクリプト系ではこういう仕様が多いのかな。

ちなみに、3 > 1 は 3 とはならずに true となるので注意が必要。

で、最初の例に戻る。

function add(a, b){
    addImpl(b && a, b || a);
}


function addImpl(a, b){
    // ...
}

add が呼ばれたときに、a と b が undefined でない場合、

  • b && a => a
  • b || a => b

なので、addImpl に適切に a と b が渡る。

a が undefined でなく、b が省略された場合(つまり、undefined の場合)は、

  • b && a => undefined
  • b || a => a

となる。

まとめると、

add(3);

add(undefined, 3);

が同じになる。第1引数を省略できるわけだ。

感想

デフォルト引数の感覚からいくと、省略可能な引数は後ろにあってほしいんだけどな…。

ただ、論理演算子で処理を実行する技はよく使うので覚えておいたほうがよさげ。

  • JavaScript で undefined を防ぐために param || {};
  • Perl で open(FILE, "foo.txt") or die;

とかはよく見るよ。

2007年12月26日

読まずに紹介「AIR プログラミングガイド」

ActionScript 3.0メモAdobe AIRメモ でお馴染みの布留川さんの AIR 本が出版されたようです。

Adobe AIRプログラミングガイド

Adobe AIRプログラミングガイド

布留川さんとは Adobe AIR完全解説 (アスキームック) の共著仲間(?)でもあります。

それはそうと、AIR はβ版が出るたびに仕様が変わっているのが不安です。特に、アプリケーション記述ファイル(ADF)は α版、β1、β2、β3 で全く互換性がないという…。正式リリース2008年初めとのことだったけど、Adobe の上条さんのブログによると

ベータ 3 は正式リリース前の最後のベータになる予定(いまのところ)ですので、今後大幅な変更は無いものと思われます。

Weblogs Temporarily Offline

とのこと。「いまのところ」に不安を感じるのは私だけでしょうか…。

なにはともあれ、正式版が出るまでは私は静観の予定でございます。

イベントハンドラに追加のパラメータを渡す

Reflektions miniml > AS3 : passing extra arguments to an event handler より。

AS3 でイベントハンドラに追加の値を渡したいときにはどうするか。

送信側から渡すとき

イベントオブジェクトにパラメータをくっつけて dispatch する。リンク先で紹介されている方法がこれ。

イベントを送信するコードを自分が作る場合は一番素直かと。パラメータは全ての listener に伝達される。

個人的には、イベントの種類ごとにクラスを定義するのはめんどくさい。そんな人には、DynamicEvent クラスを作っておくのがお薦め

package {
    import flash.events.Event;

    public dynamic class DynamicEvent extends Event {
        public function DynamicEvent(type:String, 
                                     bubbles:Boolean = false,
                                     cancelable:Boolean = false) {
            super(type, bubbles, cancelable);
        }

        override public function clone():Event {
            return new DynamicEvent(type, bubbles, cancelable);
        }
    }
}

Flex SDK には mx.events.DynamicEvent というクラスが定義されている。中身も同じ。SDK で開発してる人は、そっちを使うのがよろしいかと。

送信側はこう。

var event:DynamicEvent = new DynamicEvent("myEvent");
event.param1 = "文字列";
event.param2 = [1, 2, 3];  // 配列もOK
dispatchEvent(event);

受信する側はこう。

addEventListener("myEvent", function(event:DynamicEvent):void {
    trace(event.param1); // 文字列
});

dynamic クラスなので、コード補完してくれないし、入力ミスしたときにエラーにもならない。それが嫌ならクラスとして定義すべきなんだけど、めんどくさいときはこれでいくのが楽なのでおすすめ

受信側で追加する場合

送信側に手が出せないときとか、受信側で追加のパラメータを付け加えるときには、クロージャ使うのが手軽。

package {
    import flash.display.Sprite;
    import flash.events.Event;

    public class MyClass extends Sprite {
        // コンストラクタ
        public function MyClass() {
            var counter:int = 0;
            stage.addEventListener("click", function(event:Event):void {
                clickHandler(event, counter++);
            });
        }

        // イベントハンドラ
        private function clickHandler(event:Event, counter:int):void {
            trace(counter);
        }
    }
}

プライベートな変数にしてもいいけど、その場合はクラス内全体からアクセスする必要がある場合に絞ったほうがよいだろう。

package {
    import flash.display.Sprite;
    import flash.events.Event;

    public class Test extends Sprite {
        // プライベート変数に
        private var counter:int;

        // コンストラクタ
        public function Test() {
            counter = 0;
            stage.addEventListener("click", clickHandler);
        }

        // イベントハンドラ
        private function clickHandler(event:Event):void {
            trace(counter);
            counter++;
        }
    }
}

2007年12月25日

すごい Flash 2007 集計結果

前回の募集エントリ に多数のコメントありがとうございます。初めて見るものも多くておもしろいです。

私もまとめましたよ。気合入れて書いたので 本家のほうに掲載 しておきました*1。かなり長くなっちゃったけど、渾身の記事なので時間見つけて読んでくれると嬉しいです。

まだまだ募集中ですが、教えてもらったすごい Flash を紹介していきます(随時追加)。あくまで個人ブログでの突発的企画なので、数も少ないですが、何かの参考になれば幸いです。

※ このブログで募集したこともあって、技術的なものや広告コンテンツが中心になってます。


ブログエントリ

ブックマーク

はてなブックマークlivedoor Clipdel.icio.us などで教えてもらったもの。

星は私のお薦め具合(3点満点)。コメントは私の主観

コメント欄

紹介者の名前とコメントは コメント欄 をご覧ください。

星は私のお薦め具合(3点満点)。コメントは私の主観。好き勝手言っててホントすいません。

まだまだ募集中ですよ!!!

ちょっと思ったこと。根っからの Flash 屋さんは、フルフラッシュサイトにこだわりがちなんだろうか。意外にも、ニコニコ動画Ustream を挙げる人がいないくて不思議だった。広く使われたという意味では、今年1番の Flash 事例だと思うんだけどな。技術畑出身の人がサイトの一部にうまいこと Flash を組み込んでいく流れは今後も止まらないだろう。

*1:というのは嘘で大人の事情です。分かりやすくいうとアフィリエイト目的です。あとは察すべし

2007年12月21日

あなたの「すごい Flash 2007」を教えてほしい

(追記) 集計結果をまとめました。でもまだまだ募集中です!

久々に Flash なエントリ。今年から本格的に Flash / ActionScript を勉強し始めて、いろんな Flash サイトや ActionScript のサンプルを見てきたので、自分のお気に入りを選んでみようと思った。

で、せっかくなので自分以外の人のお気に入りも知りたい!

いいものを知りたいし、どういう物をすごいと思うかでその人のことが分かるかなー、と。

ということで大募集。

募集概要

あなたが今年すごいと思った Flash を教えてください!!

対象となる Flash
  • 今年発表された Flash でなくても、あなたが今年すごいと思ったものを教えてください!
  • Flash ならなんでも OK
    • フルフラッシュサイトとか
    • HTML の一部に埋め込まれている Flash とか
    • どこかのブログ載っていたサンプル Flash とか
    • Flex でも、AIR でも…
    • 自分が作った Flash でも
  • 1個でも10個でも好きなだけ教えてほしい
  • どこが「すごい」のか書いてあれば、なおさら嬉しい
参加方法

これも自由に。このブログを見ているあなたの「すごい Flash」を聞きたい。

思い出すたびにコメント欄に書き込んでくれるぐらいの勢いで教えてほしい。

よろしくおねがいします!

気軽に教えてください。

自分がすごいと思ったものは、週明けぐらいの次回のエントリにて。

Yahoo! Pipes で強制全文配信化

そろそろ Yahoo! Pipes ネタも飽きてきたので、このエントリで一区切り。

今回は Yahoo! Pipes を使って、本文が一部分しか含まれていない RSS を全文配信にしてしまいます。題材として、若槻千夏のブログ『マーボー豆腐は飲み物です』 を取り上げましょう。

完成品、どん。

仕組み

Loop モジュールがポイントですよ。

  1. Fetch Feed で RSS を取ってくる。
  2. Loop モジュールの中に Fetch Page を入れて、item.link の URL を取ってくる。
  3. 取得した HTML から Regex モジュールで本文を抜き出す。
  4. Rename モジュールで description を上書きする。

Feed の数だけ Fetch Page しています。なかなか極悪。

できたー、と思ったら、もっと汎用的なものを作ってる人がいました。

Ameblo 全部に対応した Pipes です。

お薦め情報源など

Yahoo! Pipes の最新情報は Pipes Blog で仕入れることができます。開発チームが追加した機能やちょっとした Tips を紹介してくれます。

ちなみに、私が作った Pipes は http://pipes.yahoo.com/nitoyon/ から見ることができます。といっても、全部このブログで紹介してますが。

それ以外にも、Yahoo! Pipes 上には数多くの Pipes が公開されています。はてなブックマーク - pipes.yahoo.com の新着エントリー あたりをウォッチしてみると、いろいろ発見できそうですね。

おまけ

1つ面白いのを発見したので最後に紹介しましょう。

Pipes: Japanese Idol Photo on Flickr という Pipes です。Flickr からアイドル写真を抜き出してくれます。

アイドルを抽出する方法が気になってソースを覗いてみたら、なんと、Pipe の中にアイドル名が生で埋め込まれていました。力技!! というか作者の趣味がよく分かりますw

2007年12月20日

京都市バスの路線別 停留所取得API公開

今回も Pipes ネタ。例によって Fetch Page モジュール。今まで「Page Fetch」だと勘違いしてたが、どうやら「Fetch Page」だったらしい。あちゃー。

で、本題。京都市バスの路線別 停留所 API を Yahoo! Pipes で作ってみた

サンプル作ってみた

この Pipes を使ったサンプルを作ってみた。→ 京都バス案内 (デモ)

  • 左の系統一覧を選択したら、右側に詳細が出る。
  • 停留所をクリックしたら時刻表が表示される。

JavaScriptjQuery+JSONP で実装してるよ。

そのまんまだけど、API 使ってる気分になってきた。

すごくない?

絶対に API を公開しそうにない京都市交通局の HTML を使って、外部の人間が勝手に API 化しちゃってるわけですよ。

Web 1.0 なページを、無理やり Web 2.0 化ですよ。なんでもかんでもマッシュアップですよ。

Yahoo! Pipes なので、もれなく JSONP にも対応、crossdomain.xml にも対応、RSS 出力にも対応、Yahoo! だからそこそこ信頼性ある、などなど申し分ないスペック。

自分でサーバー側のスクリプト書くと、動かなくなったらどうしようとか、負荷分散はどうしようとか、ディスクいっぱいになったらどうしようとか、無駄に心配することが増えるけど、そういうストレスからも開放。

自分はサーバーサイドを考えずに、クライアント側に注力したい人間なので、Yahoo! Pipes は楽しいサービスなのです。あと、落ちてたら Yahoo! のせいにできるし…(笑)

仕組み

まあ、詳しくはソースを見てもらうとして、簡単に概要を説明。

まず、入力された系統番号から京都市交通局の URL を構築する。17号系統なら http://www.city.kyoto.jp/kotsu/busdia/keitou/kto/017.htm といった具合。

この URL に対して Fetch Page モジュールで取得して、正規表現でごにょごにょっと RSS を作り上げる。

結果、こんな RSS になるわけです。

最寄の観光地の情報が含まれてるのが京都っぽいですね。

2007年12月17日

Yahoo! Pipes で「はてなハイク」用のRSSを作った

はてなハイク が楽しい。

ちょろっと絵を描いて、リロードしたらスターがついていて、すぐ反応がもらえるところがうれしくなる。はてなスターのおかげでリアルタイム性が増えてる気がする。

で、まだ RSS が吐かれていないようなので、Yahoo! Pipes の Page Fetch モジュールを使って、野良 RSS を作成してみた。

(追記 12/18) RSS が出力されはじめたようですが、画像は URL だけしか吐かれていないようです。画像系の追っかけなら私の RSS の方がお薦めですよ!!

(追記 12/25) HTML が変わってスクレイピングに失敗していたので、これを機に RSS を加工して画像を埋め込むように修正しました。

livedoor Reader で購読するとこんな感じ

投稿者のアイコンも本家と同じサイズで配置されます。

使い道

といったあたり。

弱点は

複数購読してるときに、どの RSS も「はてなハイクRSS」になってしまう
Yahoo! Pipes 側で対応してくれないかなぁ。どうしても嫌な人は、Clone してタイトルを変えたものを複数作るとよいかと。
HTMLが変わったら…
スクレイピングにはありがちな悲劇。落ち着いたころに、はてな側で RSS を吐くようにしてくれたら嬉しいですね。

2007年12月13日

jQuery で JSONP 2通り

jQuery を使って JSONP でリクエストする方法を2通り紹介するよ。

その1: $("<script>")

createElement を $() を使って実装。

$("<script>")
    .attr('type', 'text/javascript')
    .attr('src', "http://www.example.com/jsonp.cgi?param1=value1&callback=myCallback")
    .appendTo($("head"));

function myCallback(json){
    // ロード完了時にここが呼ばれる
}

http://www.example.com/jsonp.cgi?param1=value1&callback=myCallback にリクエストがいく。

callback のところは、サービスによって指定の仕方が違うかもね。

その2: $.ajax

$.ajax の dataType で jsonp が使える。

$.ajax({
    url : "http://www.example.com/jsonp.cgi",
    dataType : "jsonp",
    data : {
        param1 : "value1"
    },
    success : function(json){
        // ロード完了時にここが呼ばれる
    },
    error : function(){
        alert('error');
    }
});

こっちの方がシンプルに書ける。コールバック用の関数は jQuery が自動的に生成して、結果に応じて success や error を呼び出してくれる。

API によってはコールバックを指定するためのパラメータが callback ではなくて、別の名前の場合がある。このときは jsonp パラメータを指定する。

$.ajax({
    url : "http://www.example.com/jsonp.cgi",
    dataType : "jsonp",
    data : {
        param1 : "value1"
    },
    jsonp : "jsoncallback", // ← !!!これ!!!
    success : function(json){
        // ロード完了時にここが呼ばれる
    },
    error : function(){
        alert('error');
    }
});

裏側では、http://www.example.com/jsonp.cgi?jsoncallback=jsonp1197507452843&_=1197507453671&param1=value1 という URL にリクエストが行く。jsonpXXXXX というのが jQuery が動的に生成するコールバック関数。呼び終わったら、ちゃんと自分自身を undefined にしているので、グローバル名前空間を汚すのも一瞬で済むようだ。

2007年12月12日

Yahoo! Pipes の Page Fetch モジュールでスクレイピングし放題

このブログでも何度か Yahoo! Pipes の話題は取り上げてきましたが、先日実装された「Page Fetch」モジュールは素敵すぎます。ほんとに。

今まで、Yahoo! Pipes といえば、XML・CSV か Yahoo が提供してるサービスのデータを加工することしかできませんでした。それが、「Page Fetch」モジュールの登場により、任意の Web ページを加工できるようになったのです。

Yahoo! Pipes の使い道といえば、次の2つだと思います。

1. RSSリーダーで読むための XML 作り
複数の RSS を結合したり、見た目を整えたりして、自分専用の RSS を作る。
(例)サイトの最新被ブックマークを livedoor Reader で読むための Pipes
2. Web サービスとの連携
JSONP に対応してるので、JavaScript と組み合わせてサーバーレスに色々できる。crossdomain.xml に対応しているので、ActionScript と組み合わせてサーバーレスに色々できる。
(例)丸ビルRSSリーダー

このいずれに関しても、「Page Fetch」モジュールで可能性が広がってきます。

1. RSSリーダーで読むための XML 作り

任意のページの HTML を取ってこれるようになったおかげで

  • RSS 配信していないページの RSS を作れます。
  • 全文配信していないページの RSS の全文配信版を作れます。

ためしに、作ったのがこれ。Shinya talk という藤原新也さんのブログの RSS を作成してみました。

ソースはこんな感じ。

  1. Fetch Page でページを取得して、「<a id="」で分割(配列ができる)
  2. Rename を使って title, description, link に移動(配列を RSS 形式に変換)
  3. Regex を使って不要な部分を取り除いて、URL や本文を抽出

RSS は http://pipes.yahoo.com/nitoyon/shinya_talk_rss?_render=rss から取得できます。レッツ購読。

2. Web サービスとの連携

こっちは例を見てもらうほうが早いかな。はてブ ブックマーク件数一括取得API というのを作ってみました。

はてなブックマークブックマーク件数を一括で取得するための Pipe です。Web サービスから使うイメージを醸し出すために API と名づけてます。

はてなが用意する ブックマーク件数取得 API は XML-RPC なので JSAS からは扱いづらいし、RSS にもブックマーク数が入っていません。はてなアイデア - HTML→RSS で情報が落ちすぎ。ブックマーク数、できればタグとカテゴリもつけてほしい という要望が放置されているところを見ると、今後も RSS にブックマーク件数が追加される予定はなさそうです。

ってことで、「Page Fetch」モジュールを使って、ページ内のブックマーク一覧をスクレイピングしてます。JS や AS からこの API を使うこともできますし、サーバー側の Perl や PHP から XML をパースして利用も OK。

Yahoo! Pipes 側にキャッシュが効いてるので、はてなのサーバーに負荷をかけすぎる心配もありません。

応用例

この Pipe を活用して、複数ドメインの人気エントリランキング というのを作ってみました。雰囲気を知るには サンプルデータつき のものを見たほうがイメージが沸きやすいかもしれません。

通常、URL 別でしか人気エントリを見れないのですが、複数のURLで集計できます。

複数の場所でサイトを運営してる人は、自分が運営してるサイトを入れてみるとちょっと楽しいと思います。ブログの端っこに貼り付けてもいいかもしれませんね。

注意点

ちょっとはまったところ。

正規表現が必要
正規表現が分からないと自作するのはきつい。HTML はたいてい複数行なので s オプションをつけるのを忘れずに。
なぜかパースできない HTML がある
ヘルプには「robots.txt を設置していたり、meta タグで noindex しているサイトはパースできない」とあるが、それ以外のページでも失敗することがある。どうせ正規表現でパースするんだから好きにさせてほしい。
最後に正規化される
a タグに rel="nofolow" が追加されたり、相対リンクが消えたり、HTML 的に変なところを正規化する。途中のモジュールをプレビューしたときも HTML が正規化されているが、正規化は一番最後に走るので混乱しないよう。スクレイピングするサイトのソースを見ながら作業したほうがよさそう。
かなり面倒
Yahoo! Pipes の応答速度が結構遅くて、1箇所変更しては2〜3秒待っては確認を繰り返す必要あり。根気が必要。

地味に少しずつ機能追加されていってる Yahoo! Pipes ですが、まだまだできることは限られています。やりたいことを実現するには頭をひねらないといけません。けれども、そういうところも含めて論理パズルのようで楽しかったりもします。

関連リンク

2007年12月11日

C++ の std::vector に v += 3, 1, 4 で push_back

boost::assign使ってみた - Faith and Brave - C++で遊ぼう にて boost::assign の使い方が紹介されていた。

#include <iostream>
#include <vector>
#include <shand/foreach.hpp>
#include <boost/assign/std/vector.hpp>

using namespace std;
using namespace boost::assign;

int main()
{
    vector<int> v;

    v += 3, 1, 4; // !!!

    for(unsigned int i = 0; i < v.size(); i++)
        cout << v[i] << endl;

    return 0;
}

おおおおお、なんかすごい…!

普通なら

    v.push_back(3);
    v.push_back(1);
    v.push_back(4);

と書かなきゃならないところを

    v += 3, 1, 4;

と書ける。

自分の C++ の常識からするとびっくりするような書き方なのだけど、C++ ではカンマ演算子は一番優先度が低く設定されていて、

    ((v += 3), 1), 4;

という順番で実行されるわけだ。+= 演算子では、戻り値として list_inserter クラスが返されていて、これのカンマ演算子がオーバーロードされているらしい。

boostのソースを再現

試しに、boost のソースに当たってみたが、テンプレート使いまくりで理解が困難だったので、このサンプルを動かすのに必要な機能だけを抽出してみた。

#include <iostream>
#include <vector>

using namespace std;

// list_inserter クラスの定義
template<class T>
class list_inserter
{
private:
    std::vector<T>& c;

public:
    list_inserter( vector<T>& c ) : c( c)
    {}
    
    list_inserter& operator,( const T& r )
    {
        c.push_back( r );
        return *this;
    }

    list_inserter& operator()( const T& t )
    {
        c.push_back( t );
        return *this;
    }
};

// += 演算子の定義
template< class T >
inline list_inserter<T>
operator+=( std::vector<T>& c, T v )
{
    return list_inserter<T>( c )( v );
}

operator+=( std::vector<T>& c, T v ) で vector に対する += 演算子を定義している。普通なら、vector に push_back するだけなんだけど、ここで list_inserter を作成して返している。

結果として、次のカンマで list_inserter のカンマ演算子オーバーロードが呼ばれて、vector に push_back されるというわけだ。

list_inserter を汎用的に

上の list_inserter は型を vector<T> に決め打ちしているが、実際の boost のコードは vector だけじゃなく、他のコンテナ(map とか queue とか...)にも対応している。

どうやってるかというと、コンテナに要素を追加するためのクラスが用意されている。

  • vector の場合は boost::assign_detail::call_push_back
  • map の場合は boost::assign_detail::call_insert

といった具合。

list_inserter では、このクラス経由でコンテナに追加している。上の list_inserter で c.push_back( t ) と決めうちしてる部分が、追加するためのクラスのメソッド呼び出しに変わるわけだ。

この仕組みのおかげで、コンテナの実体が vector なのか map なのかによらず、同じコードで実装できるようになる。デザパタでいうところの Strategy パターンってとこだろうか。

2007年12月10日

アドビの新サイトがすごいことになってる

まあまあ、何はともあれ、次のキャプチャを見てくれ。

アドビについて

これはアドビの「会社情報 > アドビについて」のページの一画面だ。

Adobe が先週末にサイトデザインを一新して、何気なく色んなページを見て回っていたときに発見したんだけど、この画像、どう見ても日本語だ。

「ディッ」と読める。

ん?

これ?

ディック

消費者金融の「ディック」。「ィ」の折れ曲がり具合といい、これとしか思えない。

もしや、「消費者金融で借金してでもアドビの製品を買いましょう」というメッセージなのか?

何はともあれ、会社情報を表示するページで関連のない別会社の看板を表示して、しかもそれが消費者金融というのは、ちょっといかがなものかと思ってしまう…。いや、消費者金融を悪く言うつもりはないんだけど…。

よくあることなのかもね

深読みはいいとして、実は英語版の会社情報のページでも同じ画像が使われている。

About Adobe

ということで、おそらく日本語が読めない人間が「この写真はクールだぜ!」とかなんとか言って、文字の内容までは考えずにイメージ画像に採用したんだろう。

そういや、「日本人は意味も分からずに横文字を使うから、ネイティブの人が読んだらギョッとすることがある」という話を聞いたことがある。

今回のケースはその逆バージョンなのかもしれない。たしかにこれはギョッとする。

ここから学べることとしては…写真素材を使う場合には、そこに書いてある文字を英和辞典で調べるぐらいのことはしましょう、ってことぐらいか。

(2007/12/10 23:00 追記) Adobe 日本法人側で対策したようで、日本版のサイトでは上記の画像は出なくなりました。残念なことにつめが甘い。アドビのサイトのあの画像が修正されたとおもったら・・・: マイチキンハート によると、日本版でも背景画像としてうっすら使われているようです。英語版にはまだ残っているので、興味のある人は 英語版 を見てください。

2007年12月07日

Ruby で Web2.0(笑)

Ruby 勉強第2弾。前回の スイーツ(笑)で関数定義 に引き続いて、今回はクラスと Mix-in を試してみた。

ModuleO に O というメソッドを定義しておき、クラスメソッド、インスタンスメソッド、特異メソッドとして Mix-in している。

# モジュールを定義
module ModuleO
  def O(*args)
    # クラスを取得する
    cls = self.kind_of?(Class) ? self : self.class

    #  <class name>.0 を出力
    print "#{cls.to_s}.0"

    # 引数があれば出力
    unless args.empty?
      print "(#{args[0].to_s})"
    end

    # 改行
    puts
  end
end

# クラスメソッドとして Mix-in
class Web2
  extend ModuleO
end

# インスタンスメソッドとして Mix-in
class DoCoMo2
  include ModuleO
end
ドコモ2 = DoCoMo2.new

# 特異メソッドとして Mix-in
ActionScript3 = "AS3"
ActionScript3.extend ModuleO

# 実験!
Web2.O("")       # Web2.0(笑)
ドコモ2.O("")    # DoCoMo2.0(笑)
ActionScript3.O    # String.0

ポイント

どのケースでもクラスを取得するために

self.kind_of?(Class) ? self : self.class

と書いてみた。

クラスメソッドとして Mix-in されるときは、self はクラス自身を指す(上の例だと Web2 クラス)。だから、self.kind_of?(Class) は true になる。

インスタンスメソッドおよび特異メソッドとして Mix-in されるときは、self がインスタンスを指す(上の例だと ドコモ2 と ActionScript3)。なので、self.kind_of?(Class) は false になって、self.class でクラスを取得している。

もっといい書き方はあるんだろか。

ちなみに

Web2.O とあるけど、メソッド名に 0(ゼロ)は使えないので、大文字の O(オー)で代用してます。

2007年12月06日

最近ブックマークしたページ

Web を巡回していて気になったページは、自分のはてなブックマーク に追加していってます。

はてブに埋もれさせておくのはもったいないんだけど、単独で記事にするのも大げさかな、というものをピックアップして、ちょろっと補足していってみます。

枠内がブックマークしたときの自分のコメント、その下が補足コメントです。

芸術の感じ方

「ピカソの絵ってヘン」って言っても良いですか | エキサイトニュース

  • 解説に翻弄されず、ただ楽しもう。←音楽で例えると、CD聞く時間よりライナーノーツ読む時間の方が長いなんてありえない。数百文字の解説を読むのなんて最初から諦めて、作品と向き合った方がいいのかもしれん。

好きな音楽聴いたり、ニコニコ動画みたり、そういうときと同じ姿勢で高尚な芸術にも触れ合いたいものだ。美術館に行くと、ついつい展示品に添えられた説明を読んで納得してしまうが、それは自分の感じ方に自信がないから、他人の解説に頼りがちになってるんだよな。本当は感じ方なんて人それぞれなはず。大事なのは「他人がどう思っているか」ではなく「自分がどう思うか」。「考える」のではなく「感じる」姿勢を忘れないようにしよう。

最近見つけた素敵なサイト

volll

  • JSをうまく使った1画面Webサイト。ページ内スクロール。Flashはほとんど使わず、JSアニメーションで動いてる。JSオフでもそれなりに見れるのも素敵。 via Web Creme

このサイトは久々に自分の中でヒットした Web デザイン。JS だけでも、センスある人が作るといいサイトができる、というよい見本。

ブログって何よ

「ひととおりできあがったらオープンソースにして公開します」の罠 - TokuLog 改め だまってコードを書けよハゲ

  • 「一通り整理してから資料公開します」「一通りまとめてからブログで公開します」とかもある。まとめずに勢いで公開した方がいいことある。サービスだけじゃなくて、人間も「永遠のベータ版」でいいと思うこのごろ。

ブログを書くときに、きちんとした記事にしようとすると、いつまで経っても何も書けない。てきとーにやるのが一番。読む立場から考えても、前提から解説していく杓子定規な記事よりも、本質をズバッと書いてある記事のほうが読みやすかったりする。

知ってることよりも知らないことを書いたほうが、理解度が深まっていいこと多いね。間違ってたら、誰かが優しく教えてくれる。すばらしい。

amachang の 親友へ。ブログを書こう。 の心境が最近分かってきた。

Web のワイドショー化

しっぽのブログ: マスコミ以上に一次情報にあたらない、撤回しないネットマスコミ

  • 痛いニュースのワイドショー化。読者は面白ければよいし、管理人はアクセス増えれば満足。構造はマスコミと一緒。補足をするこのエントリの声が本家より小さいところも一緒。結局こういうところに行き着くのかねぇ。

炎上を楽しむ空気に違和感があった理由が分かった。なんだか切ない。

パワポ2007が起動しない

Genkyのメモ帳: PowerPoint Viewer 2007 が起動しない場合の対処法

  • PowerPoint Viewer 2007 が起動しない問題を解決する方法を分かりやすく解説。ちなみに、1041が日本語ロケールID、1033は米国英語のロケールID。MS公式の文章はhttp://support.microsoft.com/kb/929353/en

バグや不具合についての情報を support.microsoft.com できちんと公開してる点については、Microsoft はもっと評価されてもいいはず(怪しい自動翻訳で萎えたりもするんだけど)。

こういうブログ記事のほうが分かりやすかったりするから、ついついそっちを見ちゃうんだけど、レジストリやファイルをいじるような手順は MS が公開している一次情報で確認してから実施したいところ。

ただのネタ

寿司に溺れるJKです・・・ カオスちゃんねる

  • 就職して最初の給料日に、会社の先輩に回転寿司に連れて行かれました。お店に入ると、いろんな寿司が回っていました。先輩は「ヒラメ」とすぐに注文していたけど、僕は寿司を食べるのが初めてだったので(わっふる

リンク先にちなんだネタ。もちろんフィクションです。

新しいサービスにぐちぐち

Vector、有料ソフトを無料で使えるようにするサービス開始 - GIGAZINE

  • タイトルで期待したけど、10年前のビジネスモデルで脱力。アプリケーションの一部に広告入れるフレームワークを開発者に提供できるならすごいのに。

いまどきシェアウェアなんてはやらないから、結局 Web サービス+広告が無難になっちゃう。ローカルアプリでも広告ビジネスしたい!

経済のからくり

2ちゃんねる実況中継 マクドナルド原価一覧表

  • 2ちゃんねる実況中継 マクドナルド原価一覧表:真偽はともかくとして、サイドメニューやセットで儲けてることがよく分かる。「セットはいかがですか」には理由があるわけだ。コンビニが唐揚げやおでんをPRしまくるのも同じ理由ですね。

宣伝するからには裏がある。

おしまい

次回は、最近 Twitter にポストした内容をまとめるかもしれません。

2007年12月04日

ICO の GPL 違反について詳しい友達に聞いてみた

先日、話題になった プレイステーション2ゲーム『ICO』にGPL違反発覚 - Engadget Japanese という記事に「GPL ライセンスのライブラリを利用しているからソースを公開しなければならない」とあった。

この手の GPL 関連のニュースは今まで何度も出てきてたけど、いまいち腑に落ちてなかったので詳しい友人に聞いてみた。組み込みLinuxみたいな仕事をしてる人なので、そこそこ信用できるのではないかと。

以下、そのまとめ。(あまり詳しくない人間がまとめているので、間違いがあったらツッコミください)

GPL と LGPL

例えば、glibc(GNU C Library)はよく使われるライブラリだけど、これをリンクした途端に「はい全部 GPL ね」っていうのは余りに乱暴なので、LGPLっていうライセンスで公開されている。

LGPL なライブラリを動的リンクするだけなら、そのソフトウェアを公開するライセンスに関する制約は生まれない。

ただし、LGPLの場合は、最終的なプログラムを所有するユーザが、LGPLなライブラリだけアップデートできるようにするために、再リンクできるようにしとかないといけない、といった制約はある。

それに対し、GPL なライブラリだと、動的リンクでも GPL に縛られるようになる(とするが一般的のようだ)。

「ICO」の件

今回の ICO では「libarc」という GPL のライブラリを利用していた。

だから余裕でアウトになる。

GPL を含んでいるバイナリには GPL が適用されるわけで、そのソースを公開しないといけない。

GPL の公開範囲は、厳密に言うとかなり曖昧なのが現状で、抜け道というかグレーゾーンはある。例えば、プロセス間通信して GPL なバイナリと通信しているだけだよ、と主張すると、GPL が適用されるかは微妙になってくる。

この辺のグレーなところを包括しよう、というのが今話題の GPLv3 だそうだ。

補足

Software Licence は民事なので、実は、訴えられない限りは(社会的評判はさておき)大丈夫だったりする。

さらに、GPL はしょせん仕様許諾なので、提供者から GPL でない個別ライセンスを提供してもらう(金払うとかコミュニティごと買収するとか)っていう手もある。

参考リンク

2007年12月03日

Ruby で スイーツ(笑)関数

Ruby はじめました(冷やし中華的な発音で)

LiveCoding#5 にて 「Ruby とか Haskell は分かってて当たり前よね」 という空気だったので、今更ながらに Ruby を勉強しはじめた。

Haskell は難しいらしいので、ちょっと先延ばし。

参考資料:

初めてのコーディング

LiveCoding 後に cuzic さん邸で LiveCoder を中心に反省会というか雑談をしてた。

そのときに話題に上った「スイーツ(笑)」関数で フィボナッチ数 を求めるようにしてみた。

def スイーツ(笑)
    if 笑 == 1 || 笑 == 2
        return 1
    end
    return スイーツ(笑 - 1) + スイーツ(笑 - 2)
end

(1..10).each{|i| puts スイーツ(i)}

出力

うまくいってる。わーい。

>ruby -KU Test.rb
1
1
2
3
5
8
13
21
34
55

UTF-8 で保存して、-KU オプションをつけて実行した。

ちょっと改善

三項演算子も使えるようだ。あと、Perl みたいに return は省略できるわけね。ふむふむ。

def スイーツ(笑)
  笑 == 1 || 笑 == 2 ? 1 : スイーツ(笑 - 1) + スイーツ(笑 - 2)
end

これより短くできるんだろうか? えろい人に期待。

雑感

  • irb がいい!
    • すぐに試せる
    • サンプルをちょっと変えたときにどうなるか分かる
    • methods とかでメソッド一覧も見れるから、リファレンス代わりにも使える
  • オブジェクト指向!
    • [] とか + すらもメソッドだったりする設計が好き。内部設計を変に隠そうとしてないから取っ付きやすい。
    • "hoge".object_id が毎回違うあたりの潔さがステキ
    • だからこそ、シンボルが重要になるわけね。ふむふむ。
  • スコープはまだよく分からん

続きます

次回は、Web2.O(笑) を作る予定。

2007年12月02日

LiveCoding#5 でコーディングしてきた

LiveCoding #5 でコーディングしてきました。

はてブビューワーをFlexで作る」というのをやってみました。

成果物

完成品→http://tech.nitoyon.com/misc/live_coding5/test.swf

  • 私のはてなブックマーク一覧が表示されます
    • 上のリンクは件数を減らしていますが、本番では3,000件以上を表示していました
  • ヘッダ部分でソートできます
  • 選択した状態で [open] ボタンを押すと、別ページで開きます
  • 検索のところに文字列を入れるとタイトルからリアルタイムで絞込みできます

やったこと

  1. http://b.hatena.ne.jp/はてなID/config?mode=export から RSS1.0 形式でブックマーク一覧をダウンロードする
  2. 冒頭の「 xmlns="http://purl.org/rss/1.0/" 」を削除する。これは Flex の DataGrid で名前空間つきの XML を扱えないから(なんとかしてほしい)。
  3. rascut を起動して、Test.mxml の簡単なのを書いてみる
  4. ランゲージリファレンスの DataGrid のサンプルをコピペ
  5. 不要な部分を削って、URLLoader でロードした XML を DataGrid に突っ込む
  6. 表示できた!(おー)
  7. ボタンクリックされたときにページを表示するようにする
  8. TextInput を作って、filterFunction でフィルタリング機能を作る
  9. タグの一覧をパースして、タグの個数を Object に突っ込むところを作る
  10. タグクラウドを表示したかったけど時間切れ

感想

PR したかったポイントは表現できたかな…。

  • エディタとコマンドラインで Flash 開発できる(開発環境の Flex SDK は無料)
  • DataGrid に XML を突っ込んだらそのまま表示できる(!)
  • 3,000件(1.92MB)もある XML を難なくパースできる
  • E4X 気持ちいいよね
  • DataGrid は高機能

実は、5. のところまでは事前に研究していたのですが、そのときに E4X の名前空間で1時間ぐらいはまりました。DataGrid のソースを読んだのですが、DataGrid は名前空間つきの XML を表示できないようで、結局は上の 2. のひどい方法で対処しました。

LiveCoding は事前コーディング禁止だったので、半分は反則技ですね。とはいえ、研究してないと20分間悩んで終わっていたので、必要な技術の下調べは必要かもしれません。

あと、トップバッターで感覚が分からずひたすらコーディングしたのですが、他の人は喋りながらやっていたので、ある程度は解説しながらやったほうがよかったかな。

ソースコード

ソースコードは こちら に置いておきました。

いちおうここにも張っておきます(72行)

続きを読む