‘プログラム’ タグのついている投稿

ExternalInterface

2009年9月12日 土曜日

一つ前のエントリで取り上げたlog.asの実装のこの部分。

25
26
27
28
29
30
31
32
33
34
35
36
37
        try {       
          ExternalInterface.call(<><![CDATA[
              (function(obj, klassName) {
               obj.toString = function() { return klassName };
               console.log(obj);
               ;})  
              ]]></>.toString(),
              ObjectUtil.clone(arg),
              getQualifiedClassName(arg)
              );    
        } catch(e:Error) {
          ExternalInterface.call('console.log', r);
        }

ExternalInterface.callの第一引数がなんか見慣れない書式。
なんかオブジェクトつくってtoStringしてる?
調べてみた。

package {
  import flash.display.*;
  public class Hello extends Sprite {
    public function Hello(){
      var hoge:Object = <><![CDATA[
        (function(obj, klassName) {
         obj.toString = function() { return klassName };
         console.log(obj);
         ;})
        ]]></>;
      log(hoge);
      log(hoge.toString()); 
    } 
  }
}

ピクチャ 3
なるほどー。CDATAセクションのみのXMLListオブジェクトつくってtoStringしてるんですね。それにしても変わった書式。

というか、ExternalInterface.callの第一引数、evalしたときに関数になってたら何でもokなんすね。
これならjs,flashの連携が楽にできそ。

javascript de svm

2009年8月23日 日曜日

紛失した過去記事の中で使っていたプログラムをサルベージ。
javascriptで実装したサポートベクターマシン(Support Vector Machine:SVM)のデモプログラムです。

ピクチャ 1

デモ:

http://pakpak.jp/work/svm_javascript/

平面にプロットされた二種類の点(赤、青)を学習データとし、それら二種類の入力を識別する関数を求め、分離超平面(カーネルトリックってのを使ってるから曲面になる)を可視化しています。

正方形のマップ上で左クリックすると点がプロットされます。プロットする点の色は下の「change color」から変更します。「execute svm」をクリックするとそれまでの入力を学習し、識別関数を求めて分離超平面を可視化します。その下にある「parameter」と「kernel」は分離超平面の求め方を制御するためのものです。

canvas?何それ?状態な時期につくったもので、マップ表示は全部ただのdivタグですw あと、firefoxでしか動作確認していません。また、条件によって非常に計算量が多くなり、ブラウザが落ちちゃう可能性もありますので、その辺ご理解の上ご覧下さいm(_ _)m

SVM?何それ?

って方に。
http://www.neuro.sfc.keio.ac.jp/~masato/study/SVM/index.htm
もすこしちゃんと勉強したい方はこちらが参考になるかと思います。
http://www.ism.ac.jp/~fukumizu/ISM_lecture_2006/

http://arx.ee.utsunomiya-u.ac.jp/research/svm/index.html

http://ibisforest.org/index.php?SVM

自分の理解

理論的なところをちゃんと理解した訳じゃないんですが、二種類のグループの間の距離(マージン)を最大化することで分離超平面を求めるという手法(線形SVM)のようです。でも平面だと曲面じゃないと分離できないようなケースに対応できないので、高次元の特徴空間に写像しておいて、そこで二つのグループを分離する超平面をもとめるという手法(非線形SVM)が用いられます。しかし、写像先での分離超平面を求める際に、その空間でのベクトル演算が必要になるのですが、高次元ベクトル演算の計算量は次元数に対して指数的に増大(たぶん)していくのでなるたけ避けたい。そのため、カーネルトリックとよばれる数学的手法が用いられる。これは、写像前のデータによる演算(実際必要なのは内積)をあたかも写像先で行ったかのように扱うことが出来る関数(カーネル関数)を用いる手法だそうです。(なんでそんなことが可能なのか私にはよくわかりません。。)特定の条件を満たす関数であればカーネル関数としてあつかっていいそうで、デモの「kernel」という項目ではそのカーネル関数のうちいくつかを選択することが出来るようになっているという訳です。

と、いつの間にかこんな時間だ。。おやすみなさいzzz

pakpakの本棚。

2009年8月20日 木曜日

本棚.org的なページが欲しかったので、つくってみた。
http://blog.pakpak.jp/hondana/

wordpressのエントリのうち書評タグがついているものをDBから取得して、エントリ本文をサーバサイドでパースして本棚風に加工して表示しようと考えたけどwordpressのphpにうんざりしたのでやめた。
かわりに書評タグがついたfeedをxhrで取得してjavascriptでXMLパースすることに。
なんやかんやで一時間ぐらいはかかりますね。。
cssは徐々にかっちょよくしていく予定(未定)

あ、サイドバーに表示するウィジェットもついでにつくろーっと。
うーん、、safariでうまくうごかないorz。ちなみにmac/ff3でしか動作確認してません。。

safariのDMParserでgetElemetsByTagNameでcontent:encodedタグが取得できていなかったようです。なんでだろ。。
とりあえず、WebKitのみdom全体をtextContentで取得して正規表現にかけることで対処しました。
こんな感じ。

54
55
56
57
58
59
60
61
62
63
64
65
66
      if(key === 'content:encoded'){
        var value;
        if(Prototype.Browser.WebKit){
          value = item.textContent;
        }else{
          value = item.getElementsByTagName(key)[0].textContent;
        }
        var result = value.match(/"(http:\/\/ecx\.images-amazon\.com\/.+\.jpg)"/);
        node['image'] = result[1];
      }else{
        var value = item.getElementsByTagName(key)[0].textContent;
        node[key] = value;
      }

taskpaper.vim

2009年5月27日 水曜日

最近vimをGTDツールとして使っていたのですが、
syntaxハイライトしてほしいなとおもって探したらこんなのありました。
http://www.vim.org/scripts/script.php?script_id=2027

メールで日報を送ったときに終了したタスクがわかりやすいようにフォーマットを修正。
syntax/taskpaper.vim

1
syn match  taskpaperDone "^&gt;.*$"

タスクが終わったらtd!
.vimrc

1
2
autocmd FileType taskpaper  :nmap td :s/^/&gt; /:nohlsearch
autocmd FileType taskpaper  :vmap td :s/^/&gt; /:nohlsearch

JSDeferred

2009年5月8日 金曜日

JSDeferredとは?

JSDeferredはcho45さんがモチキのDeferred機構に影響されて作ったらしいJavascript用の非同期処理ライブラリで、煩雑になりがちな複数の非同期処理間の協調動作を、簡単かつ柔軟に記述できるステキングなライブラリ
引用:http://unsigned.g.hatena.ne.jp/Trapezoid/20080425/1209054401

desu。

非同期処理

そもそも非同期処理とはどのようなものかといいますと、XHRリクエストがそのひとつです。
この例では、1,2,3の順に処理が実行されます。なれればなんてことないですが、処理順序が逆転していることがわかります。

1
2
3
4
5
console.log("1");
var myAjax = new Ajax.Request(url, {
				method: 'get',
				onComplete: function(res){ console.log("3");}});
console.log("2");

もうすこし複雑な例。

1
2
3
4
5
6
7
8
9
10
11
12
13
new Ajax.Request(url, {
  method: 'get',
  onComplete: function(res){
    console.log(res);
 
    new Ajax.Request(url2,{
      method: 'get',
      onComplete:function(res2){
        console.log(res2);
      }
    });
  }
});

うーん、もう処理順序がぐちゃぐちゃで処理を追いづらいですね。。

JSDeferredをつかうと。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ajax_request(url).
next(function(res){
 console.log(res);
}).ajax_request(url2).
next(function(res2){
 console.log(res2);
});
 
vaf ajax_request = function(url){
    var d=new Deferred();
    new Ajax.Request(url,{
      method: 'get',
      onComplete:function(res){
        d.call(res);
      }
    });
    return d;
}
Deferred.register('ajax_request',ajax_request);

だいたいこんな感じに書けます。(直接ここに書いたので間違ってるかもしれません^^;)
ちゃんと上から順に実行されていくので、処理の流れを理解しやすいですね!

しくみ

ソースよんでくらはいw
短いですが、javascriptのエッセンスがつまっていてとても勉強になると思います。

参考:

http://d.hatena.ne.jp/amachang/20060910/1157911122

http://labs.gmo.jp/blog/ku/2007/09/firefoxsettimeout.html

http://ido.nu/kuma/2007/11/29/coding-synchronized-asynchronous-processing-intuitively-with-mochikit-async-deferred/

http://d.hatena.ne.jp/amachang/20080303/1204544340

http://d.hatena.ne.jp/amachang/20061129/1164799871