SlideShare una empresa de Scribd logo
1 de 99
非同期プログラミング
   with Perl

           2010/08/07
   Japan Perl Association 代表理事
         株式会社ライブドア
    牧    大 輔 (@lestrrat)
さっそくですが


 「複数URLに接続して
HTTP GETするコード」
普通の書き方
use strict;
use LWP::UserAgent;

my @urls = qw(
   http://www.livedoor.com/
   http://www.dena.jp/
   http://mixi.jp/
   http://www.gaiax.co.jp/
);

my $ua = LWP::UserAgent->new();
foreach my $url (@urls) {
   my $res = $ua->get( $url );
   ...
}
ポイント
•シンプル!
•命令を順番に処理
•ソケットからの読み込みに時間がか
かると次の処理に進めない
理想
•とりあえず可能な限りのホストに接続
•接続できたらとりあえずHTTPリクエ
スト発行
•読み込み可能なところ(先に返信が来
たところから)読み込む
read
•read(2) は読み込めるデータが到着
するまでブロックする
•一個だけ遅いホストがあると全体が
遅くなる :/
効率よくread
効率よくread

     ソケット1
効率よくread

     ソケット1

     ソケット2
効率よくread

     ソケット1

     ソケット2

     ソケット3
効率よくread

    読める?     ソケット1
  (データ来た?)
             ソケット2

             ソケット3
効率よくread

             ソケット1

    読める?     ソケット2
  (データ来た?)
             ソケット3
効率よくread

             ソケット1

             ソケット2

    読める?     ソケット3
  (データ来た?)
効率よくread

             ソケット1

             ソケット2

    読める?
    来た!      ソケット3
  (データ来た?)
   読み込め!
効率よくread

             ソケット1

             ソケット2

    読める?
  (データ来た?)
効率よくread

    読める?     ソケット1
  (データ来た?)
             ソケット2
効率よくread

    読める?
     来た!     ソケット1
  (データ来た?)
    読み込め!
             ソケット2
効率よくread

    読める?
  (データ来た?)
             ソケット2
効率よくread

    読める?     ソケット2
  (データ来た?)
効率よくread

     来た!
    読める?     ソケット2
    読み込め!
  (データ来た?)
効率よくread

    読める?
  (データ来た?)
効率よくread
イベント駆動
メインループ
(プログラムの進行)
 を他人に任せる
イベントループ




          =
              while ( $still_alive ) {

                  ... 処理 ...

              }
ループから呼ばれる
コールバックを登録する
イベントループ           キュー

                  コールバック   実行!
                  コールバック


                  コールバック


                  コールバック




          このイベントを待っている
イベント発生!
          コールバックがあるか確認
イベント?非同期?
• イベント駆動の仕組みの中でI/O処理→ファイル
ハンドル等を「非同期モード」にする


• イベント駆動のメリットを生かすにはI/O等ブロッ
クする処理が多いときに使う


•よって「非同期プログラミング」と「イベント駆動
プログラミング」は同義で使うことが多い
AnyEvent
なんで?
POE
Danga::Socket
IO::Async
Event
Glib Qt
お互いに
互換性無し
AnyEvent
非同期フレームワークのラッパ
汎用API           これだけ覚えていればOK




              AnyEvent
デフォルト




                   Event




                                  その他
                           Glib
        POE

              EV
standard API++
混ぜることもできる

 例:POE+EV
新規に書くなら
AnyEventでおk
先にお知らせ
名前空間
AnyEvent
   vs
   AE
スタイルの違いだけ
AnyEvent->timer(
    after => $after,
    interval => $interval,
    cb => sub {
        ....
    }
);



AE::timer $after, $interval, sub {
    ...
};
ここではAEを
 使います
基本コンポーネント

•ループ
•ウォッチャー
•コンディション変数
•ガード
ウォッチャー
AnyEventコンポーネント

        IO    コールバック
                       実行!
       タイマー   コールバック




                 「ウォッチャー」
AnyEventを使う =
 ウォッチャーの管理をする
Timer
my $timer;
$timer = AE::timer 0, 1, sub {
    warn “timer invoked”;
    undef $timer;
};
I/O
my $io;
$io = AE::io $fh, $read_or_write, sub {
    .... # $fhから読んだり、$fhに書いたり
    undef $io;
};



          注意:$fhは非同期モードに指定しておく
fh_nonblocking

use AnyEvent::Util qw(fh_nonblocking);

my $fh = get_socket(...);
fh_nonblocking $fh, 1;

my $io;
$io = AE::io $fh, 0, sub { ... };
シグナル
my $sig;
$sig = AE::signal "TERM", sub {
    ...
    undef $sig;
};
子プロセス
my $child;
$child = AE::child $pid, sub {
    ...
    undef $child;
};
待機状態
my $idle;
$idle = AE::idle sub {
    ...
    undef $idle;
};
なにこれ?
my $timer;
$timer = AE::timer 0, 1, sub {
    warn “timer invoked”;
    undef $timer;
};
Perl:
スコープが終わると
メモリが解放される
AnyEvent:
ウォッチャーが解放されると
イベントがキャンセルされる
NG
{
    my $timer = AE::timer 0, 1, sub {
        warn “timer invoked”; # 走らない!
    };
} # ここにたどり着いた時点で $timerが解放




       スコープ終了。リソース解放され
        $timerも解放されてしまう
Good
my $timer;
$timer = AE::timer 0, 1, sub {
    ...           # どこかで $timer を使うコード
    undef $timer; # 明示的に解放しないと消えない
}



    クロージャで使用されているため
    明示的に解放されるまで生き残る
コンディション変数
• いくつかの違う機能が同居してる
• ちょっと混乱しやすい
• が、重要
• 以降 「condvar」と表記
1. 何かを待つ
•現処理の流れを「止める」
•「知らせ」を待つ
•スクリプトレベルでは「ループに制御
を渡す」
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;


             知らせ が来るまでこの次にはいかない
               (→イベントループが起動)
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;      タイマーが起動したら 知らせ を送る
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;


        知らせ が来たら次の処理へ
         (→スクリプト終了)
#!perl
use strict;
use AnyEvent;

my $cv = AE::cv {
   print "Endn";
};
my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
   $cv->send;
};

$cv->recv;
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};



            何も「待つ」ことがなかったので
             イベントループも起動しない
#!perl
use strict;
use AnyEvent;

my $timer;
$timer = AE::timer 10, 0, sub {
   print "Waited 10 seconds!n";
   undef $timer;
};
2. 複数の知らせを待つ

•フラグをあげる→落とす
•一つでもフラグがあがっていれば待つ
•フラグが全部落ちるとお知らせ
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;             フラグをあげる
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;             フラグを落とす
   };
}

$cv->recv;
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;        フラグが全部落ちたらお知らせ
#!perl
use strict;
use AnyEvent;

my @delay = (1, 2, 5, 10);

my $cv = AE::cv { print "All timers are donen" };

foreach my $delay (@delay) {
   my $timer;
   $cv->begin;
   $timer = AE::timer $delay, 0, sub {
      print "Timer for delay = $delayn";
      undef $timer;
      $cv->end;
   };
}

$cv->recv;
3. 処理終了時の
     コールバック
•何か戻り値が必要な時処理結果を待つ
•ウォッチャーを作る関数に知らせて欲
しいcondvarを渡す
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );      結果を受け取るコールバックを渡す
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );        計算結果をcondvarに渡す
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;        結果を受け取る
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
#!perl
use strict;
use AnyEvent;

sub add {
   my ($x, $y, $cv) = @_;
   my $timer;
   $timer = AE::timer 5, 0, sub {
       $cv->send( $x + $y );
       undef $timer;
   };
}

my $cv = AE::cv {
   my $cv = shift;
   my ($result) = $cv->recv;
   print "Result = $resultn";
};

add( 3, 2, $cv );
$cv->recv;
基本はこれだけ
•ウォッチャーとcondvarだけで基本
的に全てまかなえる
•実際にはこれらを使った高レベルライ
ブラリを使う
AnyEventで


 「複数URLに接続して
HTTP GETするコード」
AnyEvent::HTTP
use strict;
use AnyEvent;
use AnyEvent::HTTP;

my @urls = qw(
   http://www.livedoor.com/
   http://www.dena.jp/
   http://mixi.jp/
   http://www.gaiax.co.jp/
);

my $cv = AE::cv {
   print "Fetched all urls!n";
};

my $guard;
foreach my $url (@urls) {
   $cv->begin;
   $guard = http_get $url, sub {
      print "Got $urln";
      undef $guard;
      $cv->end;
   }
}
$cv->recv;
以上!
•万が一どれかが遅くても、他のURL
は先に処理される
ライブラリ
 AnyEvent::Twitter          AnyEvent::Memcached     AnyEvent::FriendFeed::Realtime




AnyEvent::Twitter::Stream   AnyEvent::ReverseHTTP   AnyEvent::HTTP::MXHR



  AnyEvent::CouchDB         AnyEvent::SuperFeedr       AnyEvent::AIO


  AnyEvent::BDB              AnyEvent::DNS            AnyEvent::Beanstalk



   AnyEvent::DBI            AnyEvent::SNMP             AnyEvent::MP


AnyEvent::Gearman           AnyEvent::XMPP          Cache::Memcached::AnyEvent
Twiggy
Plack用非同期HTTPサーバー
1 スレッド!
複数接続高速処理
plackup -s Twiggy ...
ちょっとずつレスポンス
use strict;
use AnyEvent;

sub {
   my $env = shift;
   return sub {
      my $start_response = shift;
      my $writer = $start_response->( [
         200,
         [ "Content-Type" => "text/plain" ]
      ]);

      my $count = 1;
      my $t; $t = AE::timer 2, 2, sub {
         $writer->write( ($count * 2) . "秒たったよ!n");
         if ($count++ == 5) {
            undef $t;
            $writer->close;
         }
      };
   }
}
用途


                非同期サーバー
•接続後切断しない or              •何らかのイベント待っている
•いつ来るかわからないデー             •メッセージキュー、速いか遅
タを待っている                   いかわからないサービス等
プロキシ
•外部サーバーと連携するサービス
  •サーバーの性能を自分でコントロールできな
  い場合など
•某SNSとか某SNSとか
イベントサーバー
•ブラウザゲーム
•複数のクライアントが同時にイベント
を共有する場合など
注意
•「やりたいから」非同期にすると失敗
する
•「必要があるから」使うべき
•非同期コードは難しくなる
非同期にする条件
• リアルタイム性が重要
  • いつ起こるか分からない
  •ポーリングではリクエスト回数が多すぎる
• I/O待ちが多い
  •データを常時送り続けているのは x
  •待ち時間が長いとメリットがある
非同期にしない理由
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
•コードが複雑になる
必要な時だけ使う
  =効果絶大
Questions?
ご静聴ありがとう
 ございました

Más contenido relacionado

La actualidad más candente

日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
kumake
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
 

La actualidad más candente (20)

ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
RTOS入門 タスク間同期通信
RTOS入門 タスク間同期通信RTOS入門 タスク間同期通信
RTOS入門 タスク間同期通信
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
トランザクションの設計と進化
トランザクションの設計と進化トランザクションの設計と進化
トランザクションの設計と進化
 
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
 
JJUG CCC リクルートの Java に対する取り組み
JJUG CCC リクルートの Java に対する取り組みJJUG CCC リクルートの Java に対する取り組み
JJUG CCC リクルートの Java に対する取り組み
 
もしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などもしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点など
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具
 
Docker Swarm入門
Docker Swarm入門Docker Swarm入門
Docker Swarm入門
 
日本語テストメソッドについて
日本語テストメソッドについて日本語テストメソッドについて
日本語テストメソッドについて
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 

Destacado

これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
goccy
 
理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
Yoshihiro Sasaki
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_irc
rarere
 
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
Ryosuke IWANAGA
 

Destacado (20)

Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
軽量高機能webサーバーnginx
軽量高機能webサーバーnginx軽量高機能webサーバーnginx
軽量高機能webサーバーnginx
 
データベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみたデータベース屋がHyperledger Fabricを検証してみた
データベース屋がHyperledger Fabricを検証してみた
 
Using Dancer
Using DancerUsing Dancer
Using Dancer
 
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)これからのPerlプロダクトのかたち(YAPC::Asia 2013)
これからのPerlプロダクトのかたち(YAPC::Asia 2013)
 
理解したつもりになるGit入門
理解したつもりになるGit入門理解したつもりになるGit入門
理解したつもりになるGit入門
 
Plack::Request with Encoding
Plack::Request with EncodingPlack::Request with Encoding
Plack::Request with Encoding
 
Currying in perl
Currying in perlCurrying in perl
Currying in perl
 
テーマ「最適化」
テーマ「最適化」テーマ「最適化」
テーマ「最適化」
 
Google trends to_irc
Google trends to_ircGoogle trends to_irc
Google trends to_irc
 
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopmGames::* - Perlで 「ゲーム」しよう #hokkaidopm
Games::* - Perlで 「ゲーム」しよう #hokkaidopm
 
Takao.mt 2013
Takao.mt 2013Takao.mt 2013
Takao.mt 2013
 
Use Carton
Use CartonUse Carton
Use Carton
 
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使うYAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
YAPC::Asia 2013 - CPAN Testers Reports の情報を上手に使う
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏
 
Asset Pipeline for Perl
Asset Pipeline for PerlAsset Pipeline for Perl
Asset Pipeline for Perl
 
PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416PHPカンファレンス北海道_20160416
PHPカンファレンス北海道_20160416
 
YAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pmYAPC::AsiaとHokkaido.pm
YAPC::AsiaとHokkaido.pm
 
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
"Ops Tools with Perl" 2012/05/12 Hokkaido.pm
 
テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」テーマ「なんでもないようなこと」
テーマ「なんでもないようなこと」
 

Similar a Perl 非同期プログラミング

サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
kjwtnb
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy tool
Yuki Shibazaki
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
do_aki
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
jamadam
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
kumachang_LL
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
Sotaro Karasawa
 

Similar a Perl 非同期プログラミング (20)

ATSプログラミングチュートリアル
ATSプログラミングチュートリアルATSプログラミングチュートリアル
ATSプログラミングチュートリアル
 
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)GMO TECHNOLOGY BOOT CAMP2015(PHP編)
GMO TECHNOLOGY BOOT CAMP2015(PHP編)
 
サーバー実装いろいろ
サーバー実装いろいろサーバー実装いろいろ
サーバー実装いろいろ
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
Hack/HHVM 入門
Hack/HHVM 入門Hack/HHVM 入門
Hack/HHVM 入門
 
Cinnamon - simple deploy tool
Cinnamon - simple deploy toolCinnamon - simple deploy tool
Cinnamon - simple deploy tool
 
モダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasiaモダンmod_perl入門 #yapcasia
モダンmod_perl入門 #yapcasia
 
詳説ぺちぺち
詳説ぺちぺち詳説ぺちぺち
詳説ぺちぺち
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
Mojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてるMojoliciousをウェブ制作現場で使ってみてる
Mojoliciousをウェブ制作現場で使ってみてる
 
WCO2012「PHP教室」
WCO2012「PHP教室」WCO2012「PHP教室」
WCO2012「PHP教室」
 
PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門PHP5.5新機能「ジェネレータ」初心者入門
PHP5.5新機能「ジェネレータ」初心者入門
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析最近つくったrecent_zombies -  Perlで始めるTwitterタイムライン分析
最近つくったrecent_zombies - Perlで始めるTwitterタイムライン分析
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
Modern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI SeminarModern PHP Programming @ PFI Seminar
Modern PHP Programming @ PFI Seminar
 
Local php-100828 2
Local php-100828 2Local php-100828 2
Local php-100828 2
 
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 

Más de lestrrat

Más de lestrrat (20)

Future of Tech "Conferences"
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"
 
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
 
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
 
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
 
Rejectcon 2018
Rejectcon 2018Rejectcon 2018
Rejectcon 2018
 
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまで
 
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
 
iosdc 2017
iosdc 2017iosdc 2017
iosdc 2017
 
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
 
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
 
Coding in the context era
Coding in the context eraCoding in the context era
Coding in the context era
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
 
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
 
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
 
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
 
いまさら聞けないselectあれこれ
いまさら聞けないselectあれこれいまさら聞けないselectあれこれ
いまさら聞けないselectあれこれ
 
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
 
How To Think In Go
How To Think In GoHow To Think In Go
How To Think In Go
 

Perl 非同期プログラミング

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n