ブックマーク御礼。
全部思い入れがあるんだけど、「書いたもの」より「作ったもの」が評価されたほうが嬉しかったりする。上で言うと、3. 13. 14. あたり。
いろいろ発表した。
幅を広げていきたい。
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 の仕様書から抜き出すと、こういう手順になってる。
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 の仕様書には次のようにある。
ということで、ECMAScriptは、論理演算子の結果が Boolean とは限らないわけだ。Perl や Ruby でも似たような感じなので、スクリプト系ではこういう仕様が多いのかな。
ちなみに、3 > 1 は 3 とはならずに true となるので注意が必要。
function add(a, b){ addImpl(b && a, b || a); } function addImpl(a, b){ // ... }
add が呼ばれたときに、a と b が undefined でない場合、
なので、addImpl に適切に a と b が渡る。
a が undefined でなく、b が省略された場合(つまり、undefined の場合)は、
となる。
add(3);
と
add(undefined, 3);
が同じになる。第1引数を省略できるわけだ。
デフォルト引数の感覚からいくと、省略可能な引数は後ろにあってほしいんだけどな…。
ただ、論理演算子で処理を実行する技はよく使うので覚えておいたほうがよさげ。
とかはよく見るよ。
ActionScript 3.0メモ や Adobe AIRメモ でお馴染みの布留川さんの 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++; } } }
前回の募集エントリ に多数のコメントありがとうございます。初めて見るものも多くておもしろいです。
私もまとめましたよ。気合入れて書いたので 本家のほうに掲載 しておきました*1。かなり長くなっちゃったけど、渾身の記事なので時間見つけて読んでくれると嬉しいです。
まだまだ募集中ですが、教えてもらったすごい Flash を紹介していきます(随時追加)。あくまで個人ブログでの突発的企画なので、数も少ないですが、何かの参考になれば幸いです。
※ このブログで募集したこともあって、技術的なものや広告コンテンツが中心になってます。
はてなブックマーク、livedoor Clip、del.icio.us などで教えてもらったもの。
紹介者の名前とコメントは コメント欄 をご覧ください。
星は私のお薦め具合(3点満点)。コメントは私の主観。好き勝手言っててホントすいません。
まだまだ募集中ですよ!!!
ちょっと思ったこと。根っからの Flash 屋さんは、フルフラッシュサイトにこだわりがちなんだろうか。意外にも、ニコニコ動画や Ustream を挙げる人がいないくて不思議だった。広く使われたという意味では、今年1番の Flash 事例だと思うんだけどな。技術畑出身の人がサイトの一部にうまいこと Flash を組み込んでいく流れは今後も止まらないだろう。
(追記) 集計結果をまとめました。でもまだまだ募集中です!
久々に Flash なエントリ。今年から本格的に Flash / ActionScript を勉強し始めて、いろんな Flash サイトや ActionScript のサンプルを見てきたので、自分のお気に入りを選んでみようと思った。
で、せっかくなので自分以外の人のお気に入りも知りたい!
いいものを知りたいし、どういう物をすごいと思うかでその人のことが分かるかなー、と。
ということで大募集。
あなたが今年すごいと思った Flash を教えてください!!
これも自由に。このブログを見ているあなたの「すごい Flash」を聞きたい。
思い出すたびにコメント欄に書き込んでくれるぐらいの勢いで教えてほしい。
気軽に教えてください。
自分がすごいと思ったものは、週明けぐらいの次回のエントリにて。
そろそろ Yahoo! Pipes ネタも飽きてきたので、このエントリで一区切り。
今回は Yahoo! Pipes を使って、本文が一部分しか含まれていない RSS を全文配信にしてしまいます。題材として、若槻千夏のブログ『マーボー豆腐は飲み物です』 を取り上げましょう。
Loop モジュールがポイントですよ。
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
今回も Pipes ネタ。例によって Fetch Page モジュール。今まで「Page Fetch」だと勘違いしてたが、どうやら「Fetch Page」だったらしい。あちゃー。
で、本題。京都市バスの路線別 停留所 API を Yahoo! Pipes で作ってみた。
この Pipes を使ったサンプルを作ってみた。→ 京都バス案内 (デモ)
JavaScript+jQuery+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 になるわけです。
最寄の観光地の情報が含まれてるのが京都っぽいですね。
はてなハイク が楽しい。
ちょろっと絵を描いて、リロードしたらスターがついていて、すぐ反応がもらえるところがうれしくなる。はてなスターのおかげでリアルタイム性が増えてる気がする。
で、まだ RSS が吐かれていないようなので、Yahoo! Pipes の Page Fetch モジュールを使って、野良 RSS を作成してみた。
(追記 12/18) RSS が出力されはじめたようですが、画像は URL だけしか吐かれていないようです。画像系の追っかけなら私の RSS の方がお薦めですよ!!
(追記 12/25) HTML が変わってスクレイピングに失敗していたので、これを機に RSS を加工して画像を埋め込むように修正しました。
投稿者のアイコンも本家と同じサイズで配置されます。
といったあたり。
jQuery を使って JSONP でリクエストする方法を2通り紹介するよ。
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 のところは、サービスによって指定の仕方が違うかもね。
$.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¶m1=value1 という URL にリクエストが行く。jsonpXXXXX というのが jQuery が動的に生成するコールバック関数。呼び終わったら、ちゃんと自分自身を undefined にしているので、グローバル名前空間を汚すのも一瞬で済むようだ。
このブログでも何度か Yahoo! Pipes の話題は取り上げてきましたが、先日実装された「Page Fetch」モジュールは素敵すぎます。ほんとに。
今まで、Yahoo! Pipes といえば、XML・CSV か Yahoo が提供してるサービスのデータを加工することしかできませんでした。それが、「Page Fetch」モジュールの登場により、任意の Web ページを加工できるようになったのです。
Yahoo! Pipes の使い道といえば、次の2つだと思います。
このいずれに関しても、「Page Fetch」モジュールで可能性が広がってきます。
任意のページの HTML を取ってこれるようになったおかげで
ためしに、作ったのがこれ。Shinya talk という藤原新也さんのブログの RSS を作成してみました。
ソースはこんな感じ。
RSS は http://pipes.yahoo.com/nitoyon/shinya_talk_rss?_render=rss から取得できます。レッツ購読。
こっちは例を見てもらうほうが早いかな。はてブ ブックマーク件数一括取得API というのを作ってみました。
はてなブックマークのブックマーク件数を一括で取得するための Pipe です。Web サービスから使うイメージを醸し出すために API と名づけてます。
はてなが用意する ブックマーク件数取得 API は XML-RPC なので JS や AS からは扱いづらいし、RSS にもブックマーク数が入っていません。はてなアイデア - HTML→RSS で情報が落ちすぎ。ブックマーク数、できればタグとカテゴリもつけてほしい という要望が放置されているところを見ると、今後も RSS にブックマーク件数が追加される予定はなさそうです。
ってことで、「Page Fetch」モジュールを使って、ページ内のブックマーク一覧をスクレイピングしてます。JS や AS からこの API を使うこともできますし、サーバー側の Perl や PHP から XML をパースして利用も OK。
Yahoo! Pipes 側にキャッシュが効いてるので、はてなのサーバーに負荷をかけすぎる心配もありません。
この Pipe を活用して、複数ドメインの人気エントリランキング というのを作ってみました。雰囲気を知るには サンプルデータつき のものを見たほうがイメージが沸きやすいかもしれません。
通常、URL 別でしか人気エントリを見れないのですが、複数のURLで集計できます。
複数の場所でサイトを運営してる人は、自分が運営してるサイトを入れてみるとちょっと楽しいと思います。ブログの端っこに貼り付けてもいいかもしれませんね。
ちょっとはまったところ。
地味に少しずつ機能追加されていってる Yahoo! Pipes ですが、まだまだできることは限られています。やりたいことを実現するには頭をひねらないといけません。けれども、そういうところも含めて論理パズルのようで楽しかったりもします。
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 のソースに当たってみたが、テンプレート使いまくりで理解が困難だったので、このサンプルを動かすのに必要な機能だけを抽出してみた。
#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 は型を vector<T> に決め打ちしているが、実際の boost のコードは vector だけじゃなく、他のコンテナ(map とか queue とか...)にも対応している。
どうやってるかというと、コンテナに要素を追加するためのクラスが用意されている。
といった具合。
list_inserter では、このクラス経由でコンテナに追加している。上の list_inserter で c.push_back( t ) と決めうちしてる部分が、追加するためのクラスのメソッド呼び出しに変わるわけだ。
この仕組みのおかげで、コンテナの実体が vector なのか map なのかによらず、同じコードで実装できるようになる。デザパタでいうところの Strategy パターンってとこだろうか。
まあまあ、何はともあれ、次のキャプチャを見てくれ。
これはアドビの「会社情報 > アドビについて」のページの一画面だ。
Adobe が先週末にサイトデザインを一新して、何気なく色んなページを見て回っていたときに発見したんだけど、この画像、どう見ても日本語だ。
「ディッ」と読める。
ん?
これ?
消費者金融の「ディック」。「ィ」の折れ曲がり具合といい、これとしか思えない。
もしや、「消費者金融で借金してでもアドビの製品を買いましょう」というメッセージなのか?
何はともあれ、会社情報を表示するページで関連のない別会社の看板を表示して、しかもそれが消費者金融というのは、ちょっといかがなものかと思ってしまう…。いや、消費者金融を悪く言うつもりはないんだけど…。
深読みはいいとして、実は英語版の会社情報のページでも同じ画像が使われている。
ということで、おそらく日本語が読めない人間が「この写真はクールだぜ!」とかなんとか言って、文字の内容までは考えずにイメージ画像に採用したんだろう。
そういや、「日本人は意味も分からずに横文字を使うから、ネイティブの人が読んだらギョッとすることがある」という話を聞いたことがある。
今回のケースはその逆バージョンなのかもしれない。たしかにこれはギョッとする。
ここから学べることとしては…写真素材を使う場合には、そこに書いてある文字を英和辞典で調べるぐらいのことはしましょう、ってことぐらいか。
(2007/12/10 23:00 追記) Adobe 日本法人側で対策したようで、日本版のサイトでは上記の画像は出なくなりました。残念なことにつめが甘い。アドビのサイトのあの画像が修正されたとおもったら・・・: マイチキンハート によると、日本版でも背景画像としてうっすら使われているようです。英語版にはまだ残っているので、興味のある人は 英語版 を見てください。
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(オー)で代用してます。
Web を巡回していて気になったページは、自分のはてなブックマーク に追加していってます。
はてブに埋もれさせておくのはもったいないんだけど、単独で記事にするのも大げさかな、というものをピックアップして、ちょろっと補足していってみます。
枠内がブックマークしたときの自分のコメント、その下が補足コメントです。
「ピカソの絵ってヘン」って言っても良いですか | エキサイトニュース
好きな音楽聴いたり、ニコニコ動画みたり、そういうときと同じ姿勢で高尚な芸術にも触れ合いたいものだ。美術館に行くと、ついつい展示品に添えられた説明を読んで納得してしまうが、それは自分の感じ方に自信がないから、他人の解説に頼りがちになってるんだよな。本当は感じ方なんて人それぞれなはず。大事なのは「他人がどう思っているか」ではなく「自分がどう思うか」。「考える」のではなく「感じる」姿勢を忘れないようにしよう。
このサイトは久々に自分の中でヒットした Web デザイン。JS だけでも、センスある人が作るといいサイトができる、というよい見本。
「ひととおりできあがったらオープンソースにして公開します」の罠 - TokuLog 改め だまってコードを書けよハゲ
ブログを書くときに、きちんとした記事にしようとすると、いつまで経っても何も書けない。てきとーにやるのが一番。読む立場から考えても、前提から解説していく杓子定規な記事よりも、本質をズバッと書いてある記事のほうが読みやすかったりする。
知ってることよりも知らないことを書いたほうが、理解度が深まっていいこと多いね。間違ってたら、誰かが優しく教えてくれる。すばらしい。
amachang の 親友へ。ブログを書こう。 の心境が最近分かってきた。
炎上を楽しむ空気に違和感があった理由が分かった。なんだか切ない。
Genkyのメモ帳: PowerPoint Viewer 2007 が起動しない場合の対処法
バグや不具合についての情報を support.microsoft.com できちんと公開してる点については、Microsoft はもっと評価されてもいいはず(怪しい自動翻訳で萎えたりもするんだけど)。
こういうブログ記事のほうが分かりやすかったりするから、ついついそっちを見ちゃうんだけど、レジストリやファイルをいじるような手順は MS が公開している一次情報で確認してから実施したいところ。
リンク先にちなんだネタ。もちろんフィクションです。
いまどきシェアウェアなんてはやらないから、結局 Web サービス+広告が無難になっちゃう。ローカルアプリでも広告ビジネスしたい!
宣伝するからには裏がある。
次回は、最近 Twitter にポストした内容をまとめるかもしれません。
先日、話題になった プレイステーション2ゲーム『ICO』にGPL違反発覚 - Engadget Japanese という記事に「GPL ライセンスのライブラリを利用しているからソースを公開しなければならない」とあった。
この手の GPL 関連のニュースは今まで何度も出てきてたけど、いまいち腑に落ちてなかったので詳しい友人に聞いてみた。組み込みLinuxみたいな仕事をしてる人なので、そこそこ信用できるのではないかと。
以下、そのまとめ。(あまり詳しくない人間がまとめているので、間違いがあったらツッコミください)
例えば、glibc(GNU C Library)はよく使われるライブラリだけど、これをリンクした途端に「はい全部 GPL ね」っていうのは余りに乱暴なので、LGPLっていうライセンスで公開されている。
LGPL なライブラリを動的リンクするだけなら、そのソフトウェアを公開するライセンスに関する制約は生まれない。
ただし、LGPLの場合は、最終的なプログラムを所有するユーザが、LGPLなライブラリだけアップデートできるようにするために、再リンクできるようにしとかないといけない、といった制約はある。
それに対し、GPL なライブラリだと、動的リンクでも GPL に縛られるようになる(とするが一般的のようだ)。
今回の ICO では「libarc」という GPL のライブラリを利用していた。
だから余裕でアウトになる。
GPL を含んでいるバイナリには GPL が適用されるわけで、そのソースを公開しないといけない。
GPL の公開範囲は、厳密に言うとかなり曖昧なのが現状で、抜け道というかグレーゾーンはある。例えば、プロセス間通信して GPL なバイナリと通信しているだけだよ、と主張すると、GPL が適用されるかは微妙になってくる。
この辺のグレーなところを包括しよう、というのが今話題の GPLv3 だそうだ。
Software Licence は民事なので、実は、訴えられない限りは(社会的評判はさておき)大丈夫だったりする。
さらに、GPL はしょせん仕様許諾なので、提供者から GPL でない個別ライセンスを提供してもらう(金払うとかコミュニティごと買収するとか)っていう手もある。
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
これより短くできるんだろうか? えろい人に期待。
次回は、Web2.O(笑) を作る予定。
LiveCoding #5 でコーディングしてきました。
「はてブビューワーをFlexで作る」というのをやってみました。
完成品→http://tech.nitoyon.com/misc/live_coding5/test.swf
PR したかったポイントは表現できたかな…。
実は、5. のところまでは事前に研究していたのですが、そのときに E4X の名前空間で1時間ぐらいはまりました。DataGrid のソースを読んだのですが、DataGrid は名前空間つきの XML を表示できないようで、結局は上の 2. のひどい方法で対処しました。
LiveCoding は事前コーディング禁止だったので、半分は反則技ですね。とはいえ、研究してないと20分間悩んで終わっていたので、必要な技術の下調べは必要かもしれません。
あと、トップバッターで感覚が分からずひたすらコーディングしたのですが、他の人は喋りながらやっていたので、ある程度は解説しながらやったほうがよかったかな。
ソースコードは こちら に置いておきました。
いちおうここにも張っておきます(72行)
Adobe AIR完全解説 の4章を執筆させていただきました。