• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
クリップボード監視とAnyEventの基礎 #chibapm
 

クリップボード監視とAnyEventの基礎 #chibapm

on

  • 867 views

2013/06/08 に行われた Chiba.pm#3 でLTしたスライドです。

2013/06/08 に行われた Chiba.pm#3 でLTしたスライドです。

Statistics

Views

Total Views
867
Views on SlideShare
866
Embed Views
1

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    クリップボード監視とAnyEventの基礎 #chibapm クリップボード監視とAnyEventの基礎 #chibapm Presentation Transcript

    • クリップボード監視とAnyEventの基礎尾形 鉄次 (OGATA Tetsuji)Twitter: @xtetsuji2013/6/8 Chiba.pm#3 LT
    • 自己紹介• 尾形 鉄次 (OGATA Tetsuji)• Twitter: @xtetsuji• Blog: http://post.tetsuji.jp/• 普段は Apache mod_perl の研究しています
    • Chiba.pmにPerl成分を入れに来ました!
    • 前回までのあらすじ• Chiba.pm#2 で「クリップボード監視と外部コマンド実行」というLTをやった• http://slidesha.re/xtetsuji-chibapm2• 今回はそれの続き• 今はMac OS X限定です、すみません
    • 新ジャンルコピペ• 前回に引き続きご紹介• 所定形式の文字列がコピーされたら、自動的にどこかにペースト、もしくは事前定義済みのコールバックを実行• いわゆるクリップボード監視
    • モジュール作った• AnyEvent::Mac::Pasteboard• https://github.com/xtetsuji/p5-AnyEvent-Mac-Pasteboard• cpanm などで入れられますがCPANにはアップされていません• アップして欲しいというご要望募集中
    • Let’s A::M::Pasteboard• Let’s Install AnyEvent::Mac::Pasteboard!•$ cpanm git://github.com/xtetsuji/p5-AnyEvent-Mac-Pasteboard.git• perlbrewかplenvでユーザPerl環境を作っておくのがオススメです(詳細割愛)
    • DEMO#!/usr/bin/env perluse strict;use warnings;use AnyEvent;use AnyEvent::Mac::Pasteboard;my $cv = AnyEvent->condvar;my $pb_watcher = AnyEvent::Mac::Pasteboard->new(interval => 2, # 2秒おきに監視on_change => sub {my $pb_content = shift;print qq(change pasteboard. content is"$pb_content"n);},);$cv->recv();exit;
    • AnyEventとは• いろいろな「イベント」に応じて何かをしてくれるフレームワーク• イベント?→時間、シグナルハンドラ、色々なI/O、またはそれらの応用• 時間だったらwhileループでいいんじゃない?
    • whileループの罠• whileループを直接書いてもいいけど…• イベントが増えるごとに、管理が面倒くさくなってくる• バグの温床になるケースもある
    • 例題#!/usr/bin/env perluse strict;use warnings;my ($phase_2, $phase_3, $phase_5) = ("foo", "bar","buz");my $cur_time = 1;while (1) {print "[$cur_time] $phase_2n" if $cur_time % 2 == 0;print "[$cur_time] $phase_3n" if $cur_time % 3 == 0;print "[$cur_time] $phase_5n" if $cur_time % 5 == 0;$cur_time++;sleep 1;}
    • 例題を見てみる• sleep 1; を入れ忘れると大惨事• サーバでやらかすと暴走して死亡• ひとつのタイマーをオフにするとか、また面倒• あーもうwhileループ面倒くさい!
    • AnyEvent->timer• AnyEventのタイマー、AnyEvent->timerを利用する• これで結構見やすくなる
    • AnyEventで書き換え#!/usr/bin/perluse strict;use warnings;use AnyEvent;my $cv = AnyEvent->condvar;my ($phase_2, $phase_3, $phase_5) = ("foo", "bar", "buz");my $cur_time = 0;my $ae_timer_2 = AnyEvent->timer(after=>2, interval=>2, cb => sub { print "[$cur_time] $phase_2n"; },);my $ae_timer_3 = AnyEvent->timer(after=>3, interval=>3, cb => sub { print "[$cur_time] $phase_3n"; },);my $ae_timer_5 = AnyEvent->timer(after=>5, interval=>5, cb => sub { print "[$cur_time] $phase_5n"; },);my $incl_timer = AnyEvent->timer(interval=>1, cb => sub { $cur_time++; });$cv->recv();
    • AnyEventで書き換え• 少し長くなったが、こうして構造化しておけば後でいろいろな応用ができる• AnyEventの書き方が長いと感じる人には、短く書けるAEというものも用意されています。e.g. AE::timer 0,1,&cb;
    • AnyEventで書き換え• AnyEventオブジェクトを作っておいてcondvarで得られたオブジェクトにrecvメソッドを投げるところでループ実行• 各イベントはcb(callback)を持っていて、もしループを抜けたい場合はcondvarの値でsendを送ればrecvに戻せる
    • AnyEvnetで豊かな生活• 様々な低層の概念がイベント駆動になっており、それを応用した様々なクライアントやサーバがある• 自前で書くタイマーから、IRCボット、Plackベースウェブサーバなど、様々• 調べてみて活用してみましょう!
    • 続きは懇親会で• 飲みながらAnyEventの話しましょう!• 懇親会が本番• Chiba.pm 今後も盛り上がって欲しい
    • ご清聴ありがとうございました