Your SlideShare is downloading. ×
  • Like
Javascriptで無限ループを実現する5つの方法
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Javascriptで無限ループを実現する5つの方法

  • 25,308 views
Published

LightningTalk at Kanasan.JS, Japanese Javascript Users Group Meeting …

LightningTalk at Kanasan.JS, Japanese Javascript Users Group Meeting

http://groups.google.co.jp/group/kanasanjs/web/kanasan-js-javascript52-lightning-talk

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
25,308
On SlideShare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
21
Comments
0
Likes
11

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Javascript で無限ループ を実現する5つの方法 yhara @京大マイコンクラブ
  • 2. 自己紹介
    • 琵琶湖の方から来ました
    • Javascript 暦は 2 年ちょっと
    • 普段は Ruby 、ほかいろいろ ( 言語マニア )
    • 学生をしています
  • 3. 京都にはサイ本売ってない説
  • 4. ヨドバシ++
  • 5. (1) 普通に無限ループを書く
    • ブラウザが固まります(><)
    for(;;){ } while(true){ }
  • 6. 予想される反論
    • 無限ループなんてつかわねーよwww
    • 無限でなくても、時間のかかる処理をループさせるとやっぱりブラウザが固まってしまう
    while( 条件 ){ // 時間のかかる処理 }
  • 7. (2) setTimeout を使う
    • setTimeout( 関数 , ミリ秒 )
    • 指定した時間後に指定した関数を実行してくれる
    var f = function(){ // 時間のかかる処理 if( 条件 ) setTimeout (f, 0); }
  • 8. でも…、
    • setTimeout はめんどい
    • 同期処理がしたいのに、非同期にしないといけない
    現実: ( 非同期 ) var f = function(){ // 時間のかかる処理 if( 条件 ) setTimeout(f, 0); } 理想 : ( 同期 ) while( 条件 ){ // 時間のかかる処理 }
  • 9. 同様に
    • Ajax もめんどい
    • 同期処理がしたい時も、非同期にしないといけない
    • じゃあどうしたらいい・・・?
    現実: ( 非同期 ) Ajax.get(path, function(data){ alert(data); } 理想 : ( 同期 ) data = Ajax.get(path); alert(data);
  • 10. (3) jsThread
    • 別名 Thread.Concurrent
      • http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi
    • JavaScript のみ でスレッドシステムを実装!
    // ↓ ブラウザなぜか固まらない Concurrent.Thread.create (function(){ while( 条件 ){ // 時間のかかる処理 } });
  • 11. 仕組み
    • Javascript で書かれた Javascript パーザ内蔵
    • 指定した関数のソースコードを解析し、自動的に setTimeout を挟んでくれる
      • toSource() でソースが取れる javascript ならでは!
    • 15,119 行 の Javascript (1/8 現在 )
    • 無茶しやがってwww
    • その他、サイトに解説あり
      • http://jsthread.sourceforge.net/cgi-bin/wiki/wiki.cgi
  • 12. (4) JSDeffered
    • 関数合成を駆使して、同期処理をそれっぽく書ける
      • http:// coderepos.org/share/wiki/JSDeferred
    // loop の例: loop (ary, function (n) { // 時間のかかる処理 return wait(0.1); }); // next の例: loop (5, function (i, o) { // ループ処理 return o.last? i : wait(1); }). next (function (e) { // ループが終わったらする処理 print("end ["+e+"]"); })
  • 13. 注意点
    • つづりが むずかしいです (^o^)
    • Defer ( 延期する ) + r + ed とおぼえよう!
    × Deffered 〇 Deferred
  • 14. JSDeffered = DSL
    • JavaScript を拡張した新しい言語みたいな感じ
      • parallel() : 並列実行
      • wait() : 待つ、中断
      • next() : 順次実行
      • loop() : 繰り返し
      • error() : エラー時
    • 言語内言語?
  • 15. (5) Javascript で別の言語を実装
    • 例えば Scheme
      • http:// mono.kmc.gr.jp/~yhara/w/?BiwaScheme
  • 16. BiwaScheme
    • Javascript で書かれた Scheme 処理系
      • http:// mono.kmc.gr.jp/~yhara/w/?BiwaScheme
    • R6RS 準拠を目標に開発中です (><)
      • (sleep 0) のところでインタプリタの状態を保存
      • setTimeout で指定した時間後にインタプリタを再開
    (lambda (f) ;; 時間のかかる処理 (sleep 0) (if 条件 (f) 返り値 )) (let1 s (http-request (path)) (print s))
  • 17. JSRuby
    • Javascript で書かれた Ruby 処理系 ( ! )
      • http://coderepos.org/share/wiki/JSRuby
    • FizzBuzz を動かす程度の能力
    • sleep はまだなさそうだけど、原理的にはできるはず
    • cf. HotRuby (YARV の中間コードを js で実行 )
      • http://d.hatena.ne.jp/yukoba/20071231/p1
  • 18. まとめ
    • さよなら setTimeout
    • とにかくわかりやすく書きたい-> jsThread
    • とにかく軽い方がいい-> JSDeffered
    • ( どちらでもない )-> BiwaScheme
  • 19. おまけ (Reposh)
    • Reposh – Repository Shell
      • http://mono.kmc.gr.jp/~yhara/w/?Reposh
      • svn, svk, hg, darcs に対応 ( ディレクトリ構成から自動判定 )
      • Reposh なし :
      • $ svn st
      • $ svn di foo.rb
      • $ svn ci –m “foo”
      • Reposh あり :
      • > [Enter]
      • > di foo.rb
      • > ci –m “foo”