Slide 1

Slide 1 text

BLJZN :"1$"TJB 4LZQFޮ཰Խ

Slide 2

Slide 2 text

NF wBLJZN wIUUQBLJZNDPN w4LZQFUBLJZN w๺ւಓ͔Βདྷ·ͨ͠ wߴ

Slide 3

Slide 3 text

͜ͷηογϣϯͰ͸ wχονͳτʔΫ wਅͷΤϯδχΞ͸4LZQFͰ͸ͳ͘*3$ Λ࢖͏

Slide 4

Slide 4 text

͜ͷηογϣϯͰ͸ w4LZQFΛޮ཰తʹར༻͢ΔͨΊʹ͸ w4LZQFCPU wԻ੠௨࿩ɺΠϯελϯτϝοηʔδΛ ར༻

Slide 5

Slide 5 text

͜ͷηογϣϯͰ͸ w*3$CPUΛ4LZQFʹ

Slide 6

Slide 6 text

% cpanm Skype::Any

Slide 7

Slide 7 text

% cpanm Net::DBus::Skype::API % cpanm Cocoa::Skype

Slide 8

Slide 8 text

4LZQF"OZ

Slide 9

Slide 9 text

IUUQTHJUIVCDPNBLJZN4LZQF"OZ

Slide 10

Slide 10 text

w4LZQF%FTLUPQ"1*XSBQQFS wJOTQJSFECZ4LZQF1Z w4LZQF"1*ʹ͍ͭͯ͸ͪ͜ΒΛࢀর IUUQEFWFMPQFSTLZQFDPNQVCMJDBQJSFGFSFODF

Slide 11

Slide 11 text

w.BD -JOVYͰಈ࡞ w8JOEPXTʹ͸ରԠ͍ͯ͠·ͤΜ w"OZ&WFOU w$PDPB4LZQF CZUZQFTUFS

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

JODPNQBUJCMFDIBOHFT

Slide 14

Slide 14 text

؀ڥߏங

Slide 15

Slide 15 text

ͳͥʁ w$6*؀ڥͰͷ4LZQFEBFNPO w9WGC w(6*؀ڥͰ͋Ε͹4LZQFΛ্ཱͪ͛Δ ͚ͩͰΑ͍

Slide 16

Slide 16 text

w%FCJBO(/6-JOVY4RVFF[F w4LZQFGPS-JOVY

Slide 17

Slide 17 text

w-JOVY্Ͱಈ͘4LZQF༻ͷCPUΛ࡞Δํ ๏

Slide 18

Slide 18 text

4LZQFCPU

Slide 19

Slide 19 text

QJOHQPOH

Slide 20

Slide 20 text

QJOHQPOH wbQJOH`ͷϝοηʔδ͕ૹΒΕ͖ͯͨΒ wbQPOH`ͷϝοηʔδΛૹ৴͢Δ

Slide 21

Slide 21 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run;

Slide 22

Slide 22 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run; ஫ҙ4LZQFΫϥΠΞϯτΛ্ཱ͓ͪ͛ͯ͘͜ͱ

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run;

Slide 25

Slide 25 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run; ϝοηʔδΛड৴͢Δͱݺ͹ΕΔ 4LZQF"OZ0CKFDU$IBU.FTTBHF

Slide 26

Slide 26 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run; ૹΒΕ͖ͯͨϝοηʔδͷຊจ

Slide 27

Slide 27 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run; νϟοτʹbQPOH`ͱϝοηʔδΛૹ৴ ϝοηʔδ͕ૹΒΕ͖ͯͨνϟοτ

Slide 28

Slide 28 text

use strict; use warnings; use Skype::Any; my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body eq 'ping') { $msg->chat->send_message('pong'); } }); $skype->run; Πϕϯτϧʔϓͷ։࢝

Slide 29

Slide 29 text

4LZQF"OZ0CKFDU

Slide 30

Slide 30 text

4LZQF"OZ0CKFDU w4LZQF"1* w$BMM $IBU $IBU.FTTBHF 'JMF5SBOTGFS 1SPpMF 6TFS w4LZQF"OZͰ͸ w4LZQF"OZ0CKFDU

Slide 31

Slide 31 text

CHATMESSAGE 18537 STATUS RECEIVED

Slide 32

Slide 32 text

νϟοτϝοηʔδͰ͋Ε͹ 4LZQF"OZ$IBU.FTTBHF

Slide 33

Slide 33 text

$msg->body; $msg->chatname; $msg->from_handle; $msg->timestamp;

Slide 34

Slide 34 text

4LZQFͷνϟοτͷ ࢓૊Έ

Slide 35

Slide 35 text

νϟοτͷࣝผ w͢΂ͯͷνϟοτ͸JEΛ͍࣋ͬͯΔ #anappo/$echo123;ebe5311cdd203657 w ΫϥΠΞϯτଆͰ͸ݟΔ͜ͱ͕Ͱ͖ͳ͍ w 4LZQF"1*ܦ༝ͰݟΔ͜ͱ͕Ͱ͖Δ

Slide 36

Slide 36 text

ϝοηʔδૹ৴ wجຊతʹνϟοτΛ࡞੒ͯ͠ϝοηʔ δΛૹ৴͢Δ wνϟοτରɺάϧʔϓ ෳ਺

Slide 37

Slide 37 text

$skype->user('echo123')->chat; $skype->user('echo123, t.akiym')->chat; ରͷνϟοτΛ࡞੒ άϧʔϓνϟοτΛ࡞੒

Slide 38

Slide 38 text

my $user = $skype->user('echo123, t.akiym'); my $chat = $user->chat; $chat->send_message('hello'); FDIP UBLJZNͱͷάϧʔϓνϟοτʹzIFMMPzͱૹ৴͢Δ

Slide 39

Slide 39 text

say $skype->user('t.akiym')->chat->name; #=> #t.akiym/$akiym_bot;f8efe7736e507088 say $skype->user('t.akiym')->chat->name; #=> #t.akiym/$akiym_bot;f8efe7736e507088 say $skype->user('t.akiym, echo123')->chat->name; #=> #akiym_bot/$84192e06d8b4cce9 say $skype->user('t.akiym, echo123')->chat->name; #=> #akiym_bot/$d2257830ee67a5bb άϧʔϓνϟοτͷ৔߹͸ νϟοτΛ࡞੒͢Δͨͼʹ৽͍͠΋ͷ͕࡞੒͞ΕΔ

Slide 40

Slide 40 text

4LZQF%FTLUPQ"1*

Slide 41

Slide 41 text

w4LZQF"OZ͸4LZQF"1*ͷXSBQQFS wੜͰ4LZQF"1*Λѻ͍͍ͨ

Slide 42

Slide 42 text

$skype->api->send_command('SEARCH RECENTCHATS')->reply; ࠷ۙ࢖ͬͨνϟοτͷ໊લΛऔͬͯ͘Δ

Slide 43

Slide 43 text

CHATS #t.akiym/$akiym_bot;e36505b33ee2e9c8, #akiym_bot/$echo123;b0d6153555b2f9d4

Slide 44

Slide 44 text

w$skype->api->send_command() w͙͢ʹϨεϙϯεΛฦ͞ͳ͍৔߹΋ wͦ͏͍ͬͨ৔߹͸Ϩεϙϯε͕ฦͬͯ ͘Δ·Ͱ଴ͪ·͢

Slide 45

Slide 45 text

63-CPU

Slide 46

Slide 46 text

63- wIUUQT Ͱ࢝·Δ63-͔ΒUJUMFͷத ਎Λऔͬͯ͘Δ

Slide 47

Slide 47 text

use strict; use warnings; use LWP::UserAgent; use Skype::Any; my $ua = LWP::UserAgent->new; my $skype = Skype::Any->new; $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; while ($body =~ m!(?=(https?://\S+))!g) { my $url = $1; my $res = $ua->get($url); return unless $res->is_success; my ($title) = $res->decoded_content =~ m! (.*?)!i; $msg->chat->send_message($title) if $title; } }); $skype->run;

Slide 48

Slide 48 text

&NBJMCPU

Slide 49

Slide 49 text

&NBJM wͳΜΒ͔ͷϝοηʔδʹରͯ͠ϝʔϧ ૹ৴͢Δ wlFNBJMzͰ࢝·Δϝοηʔδ

Slide 50

Slide 50 text

&NBJM wDPEFUBLFOGSPN 1FSMʹΑΔϝʔϧૹ৴࣮ફతͳ &NBJM4FOEFSͷར༻ํ๏ wUPLVIJSPN

Slide 51

Slide 51 text

use strict; use warnings; use utf8; use Email::Sender::Simple qw(sendmail); use Email::Simple; use Email::Simple::Creator; use Data::Recursive::Encode; use Encode; use Email::Sender::Transport::SMTP::TLS; use Skype::Any; my $sender = Email::Sender::Transport::SMTP::TLS->new( host => 'smtp.gmail.com', port => 587, username => '[email protected]', password => 'pa33w0rd', helo => 'example.com', );

Slide 52

Slide 52 text

my $skype = Skype::Any->new; $skype->message_received(sub { my ($msg) = @_; my $body = $msg->body; if ($body =~ /^!email/) { my $email = Email::Simple->create( header => Data::Recursive::Encode->encode( 'MIME-Header-ISO_2022_JP' => [ To => '"̨̩̠̠" ', From => '"·ͬͭΜ" ', Subject => "༦൧", ] ), body => encode( 'iso-2022-jp', "͏ͪͰͨ΂Δͷʁ" ), attributes => { content_type => 'text/plain', charset => 'ISO-2022-JP', encoding => '7bit', }, ); my $ret = sendmail($email, {transport => $sender}); } }); $skype->run;

Slide 53

Slide 53 text

શདCPU

Slide 54

Slide 54 text

શདCPU w શདCPU TVHZBO w ʮશདͰʯ w KPLFCPU

Slide 55

Slide 55 text

use strict; use warnings; use Skype::Any; use Acme::Zenra; use Try::Tiny; my $zenra = Acme::Zenra->new( yahoo_appid => $ENV{YAHOO_APPID}, ); my $skype = Skype::Any->new; my $chatname = ''; # your chatname

Slide 56

Slide 56 text

use strict; use warnings; use Skype::Any; use Acme::Zenra; use Try::Tiny; my $zenra = Acme::Zenra->new( yahoo_appid => $ENV{YAHOO_APPID}, ); my $skype = Skype::Any->new; my $chatname = ''; # your chatname ZVTVLFCF"DNF;FOSB

Slide 57

Slide 57 text

$skype->message_received(sub { my ($msg) = @_; if ($msg->chatname eq $chatname) { my $body = $msg->body; try { my $result = $zenra->zenrize($body); unless ($body eq $result) { # Edit message $msg->body($result); } }; } }); $skype->run;

Slide 58

Slide 58 text

$skype->message_received(sub { my ($msg) = @_; if ($msg->chatname eq $chatname) { my $body = $msg->body; try { my $result = $zenra->zenrize($body); unless ($body eq $result) { # Edit message $msg->body($result); } }; } }); $skype->run; ฤू͢Δ͜ͱ͕Ͱ͖ͳ͍ϝοηʔδ΋͋ΔͨΊ

Slide 59

Slide 59 text

$skype->message_received(sub { my ($msg) = @_; if ($msg->chatname eq $chatname) { my $body = $msg->body; try { my $result = $zenra->zenrize($body); unless ($body eq $result) { # Edit message $msg->body($result); } }; } }); $skype->run; 5JQT$msg->body(‘’);Ͱϝοηʔδͷ࡟আ

Slide 60

Slide 60 text

ࣙॻCPU

Slide 61

Slide 61 text

ࣙॻ wlEJDUEJDUJPOBSZzͷΑ͏ͳϝοηʔδ Λड৴ͨ͠Β wड৴ͨ͠Ϣʔβʔʹࣙॻͷ಺༰Λૹ৴ ͢Δ

Slide 62

Slide 62 text

use strict; use warnings; use utf8; use Encode; use Lingua::JA::Regular::Unicode qw/alnum_z2h/; use LWP::UserAgent; use Skype::Any; use XML::Simple (); use URI; use URI::QueryParam; our %DICT_TYPE = (e2j => 'EJdict', j2e => 'EdictJE'); my $ua = LWP::UserAgent->new; my $api_url = 'http://public.dejizo.jp/NetDicV09.asmx'; my $skype = Skype::Any->new; $skype->message_received(sub { my $msg = shift; if (my ($word) = $msg->body =~ /^dict:\s*(.+)/) { my $type = $word =~ /^[a-zA-Z0-9_]+$/ ? 'e2j' : 'j2e'; my $user = $msg->object(user => $msg->from_handle); if (my $item_id = get_item_id($word, $type)) { my $body = get_body($item_id, $type); $body = alnum_z2h($body); $user->chat->send_message($body); } else { $user->chat->send_message('Sorry, did not match... ;('); } } }); $skype->run;

Slide 63

Slide 63 text

use strict; use warnings; use utf8; use Encode; use Lingua::JA::Regular::Unicode qw/alnum_z2h/; use LWP::UserAgent; use Skype::Any; use XML::Simple (); use URI; use URI::QueryParam; our %DICT_TYPE = (e2j => 'EJdict', j2e => 'EdictJE'); my $ua = LWP::UserAgent->new; my $api_url = 'http://public.dejizo.jp/NetDicV09.asmx'; my $skype = Skype::Any->new; $skype->message_received(sub { my $msg = shift; if (my ($word) = $msg->body =~ /^dict:\s*(.+)/) { my $type = $word =~ /^[a-zA-Z0-9_]+$/ ? 'e2j' : 'j2e'; my $user = $msg->object(user => $msg->from_handle); if (my $item_id = get_item_id($word, $type)) { my $body = get_body($item_id, $type); $body = alnum_z2h($body); $user->chat->send_message($body); } else { $user->chat->send_message('Sorry, did not match... ;('); } } }); $skype->run; dict: Ͱ࢝·Δϝοηʔδ

Slide 64

Slide 64 text

use strict; use warnings; use utf8; use Encode; use Lingua::JA::Regular::Unicode qw/alnum_z2h/; use LWP::UserAgent; use Skype::Any; use XML::Simple (); use URI; use URI::QueryParam; our %DICT_TYPE = (e2j => 'EJdict', j2e => 'EdictJE'); my $ua = LWP::UserAgent->new; my $api_url = 'http://public.dejizo.jp/NetDicV09.asmx'; my $skype = Skype::Any->new; $skype->message_received(sub { my $msg = shift; if (my ($word) = $msg->body =~ /^dict:\s*(.+)/) { my $type = $word =~ /^[a-zA-Z0-9_]+$/ ? 'e2j' : 'j2e'; my $user = $msg->object(user => $msg->from_handle); if (my $item_id = get_item_id($word, $type)) { my $body = get_body($item_id, $type); $body = alnum_z2h($body); $user->chat->send_message($body); } else { $user->chat->send_message('Sorry, did not match... ;('); } } }); $skype->run; $skype->user($msg->from_handle);

Slide 65

Slide 65 text

sub get_item_id { my ($word, $type) = @_; my $uri = URI->new("$api_url/SearchDicItemLite"); $uri->query_form_hash({ Dic => $DICT_TYPE{$type}, Word => $word, Scope => 'HEADWORD', Match => 'STARTWITH', Merge => 'AND', Prof => 'XHTML', PageSize => 1, PageIndex => 0, }); my $res = $ua->get($uri); return unless $res->is_success; my $xml = XML::Simple::XMLin($res->content); return if $xml->{ItemCount} == 0; $xml->{TitleList}{DicItemTitle}{ItemID}; }

Slide 66

Slide 66 text

sub get_body { my ($item_id, $type) = @_; my $uri = URI->new("$api_url/GetDicItemLite"); $uri->query_form_hash({ Dic => $DICT_TYPE{$type}, Item => $item_id, Loc => '', Prof => 'XHTML', }); my $res = $ua->get($uri); return unless $res->is_success; my $xml = XML::Simple::XMLin( $res->content, SuppressEmpty => 1, # returns empty element. ); if ($type eq 'e2j') { my $caption = $xml->{Head}->{div}{span}{content}; if ($caption =~ s/\.$//) { my @results = split /\s+/, $xml->{Body}->{div}{div}; sprintf '%d results: %s', scalar @results, join ', ', @results; } else { sprintf '[%s] %s', $caption, join "\n", split /\s+/, $xml->{Body}->{div}{div}; } } else { (my $caption = $xml->{Head}->{div}{span}{content}) =~ s/\n* \s+.*$//ms; my $stuff = $xml->{Body}->{div}{div}{div}; if (ref $stuff eq 'ARRAY') {

Slide 67

Slide 67 text

Item => $item_id, Loc => '', Prof => 'XHTML', }); my $res = $ua->get($uri); return unless $res->is_success; my $xml = XML::Simple::XMLin( $res->content, SuppressEmpty => 1, # returns empty element. ); if ($type eq 'e2j') { my $caption = $xml->{Head}->{div}{span}{content}; if ($caption =~ s/\.$//) { my @results = split /\s+/, $xml->{Body}->{div}{div}; sprintf '%d results: %s', scalar @results, join ', ', @results; } else { sprintf '[%s] %s', $caption, join "\n", split /\s+/, $xml->{Body}->{div}{div}; } } else { (my $caption = $xml->{Head}->{div}{span}{content}) =~ s/\n* \s+.*$//ms; my $stuff = $xml->{Body}->{div}{div}{div}; if (ref $stuff eq 'ARRAY') { sprintf '[%s] %s', $caption, join ', ', @{$xml->{Body}- >{div}{div}{div}}; } else { sprintf '[%s] %s', $caption, $stuff; } } }

Slide 68

Slide 68 text

#0/64

Slide 69

Slide 69 text

1VTIOPUJpDBUJPO GPSJ1IPOF

Slide 70

Slide 70 text

1VTIOPUJpDBUJPOGPS J1IPOF w4LZQFGPSJ1IPOF͸ϓογϡ௨஌ʹର Ԡ͍ͯ͠ͳ͍ wCPUΛαʔόʹ্ཱ͓͍ͪ͛ͯͯɺ JNLBZBDͰ௨஌͢Ε͹͍͍ͷͰ͸

Slide 71

Slide 71 text

use strict; use warnings; use Skype::Any; use LWP::UserAgent; my $IM_KAYAC = 'http://im.kayac.com/api/post'; my $username = ''; # im.kayac my $password = ''; my $ua = LWP::UserAgent->new();

Slide 72

Slide 72 text

my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $from = $msg->from_handle; my $body = $msg->body; my $res = $ua->post("$IM_KAYAC/$username", { message => "$from: $body", handler => 'skype://', password => $password, }); die $res->status_line unless $res->is_success; }); $skype->run;

Slide 73

Slide 73 text

my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $from = $msg->from_handle; my $body = $msg->body; my $res = $ua->post("$IM_KAYAC/$username", { message => "$from: $body", handler => 'skype://', password => $password, }); die $res->status_line unless $res->is_success; }); $skype->run; ϝοηʔδΛૹ৴ͨ͠ϢʔβʔJE

Slide 74

Slide 74 text

my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $from = $msg->from_handle; my $body = $msg->body; my $res = $ua->post("$IM_KAYAC/$username", { message => "$from: $body", handler => 'skype://', password => $password, }); die $res->status_line unless $res->is_success; }); $skype->run; ϝοηʔδΛૹ৴ͨ͠ϢʔβʔJE 5JQT$msg->from_dispname;

Slide 75

Slide 75 text

my $skype = Skype::Any->new(); $skype->message_received(sub { my ($msg) = @_; my $from = $msg->from_handle; my $body = $msg->body; my $res = $ua->post("$IM_KAYAC/$username", { message => "$from: $body", handler => 'skype://', password => $password, }); die $res->status_line unless $res->is_success; }); $skype->run;

Slide 76

Slide 76 text

UBDPDIBO

Slide 77

Slide 77 text

wJLBDIBO :BQQP ͷ4LZQF൛ w༷ʑͳαʔόͷόονॲཧͷ݁Ռ౳Λ 4LZQFͷνϟοτʹ௨஌͢Δαʔό wϝοηʔδΛૹ৴͢Δͱ͍ͬͨ͜ͱΛ )551Ͱࡁ·͢͜ͱ͕Ͱ͖Δ

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

IUUQTHJUIVCDPNBLJZNQ"QQ5BDPDIBO

Slide 80

Slide 80 text

"OZ4BO1SPWJEFS4LZQF

Slide 81

Slide 81 text

wϝϦοτ w"OZ4BOΠϯλʔϑΣʔε w΋ͪΖΜɺ4LZQF"OZ୯ମͰ΋CPU ͸ॻ͚Δ

Slide 82

Slide 82 text

use strict; use warnings; use AnySan; use AnySan::Provider::Skype; use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $skype = skype; AnySan->register_listener( url => { event => 'chatmessage', cb => sub { my $receive = shift; my $message = $receive->message; while ($message =~ m!(?=(https?://\S+))!g) { my $url = $1; my $res = $ua->get($url); $res->is_success or return; my ($title) = $res->decoded_content =~ m! (.*?)!i; $title // return; $receive->send_reply($title); } }, }, ); AnySan->run;

Slide 83

Slide 83 text

IUUQTHJUIVCDPNBLJZN"OZ4BO1SPWJEFS4LZQF

Slide 84

Slide 84 text

3FENJOF$IBO$IBO

Slide 85

Slide 85 text

w3FENJOF$IBO POJTIJ ͷ4LZQF൛ wৄ͘͠͸ *3$͔Β3FENJOFΛૢ࡞͢ΔϞδϡʔ ϧΛ࡞Γ·ͨ͠ wPOJTIJ

Slide 86

Slide 86 text

use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use Config::Pit; use Redmine::Chan; use utf8; my $minechan = Redmine::Chan->new(%{pit_get('redmine', require => { redmine_url => '', redmine_api_key => '', })}, skype_chats => { '#t.akiym/$akiym_bot;e36505b33ee2e9c8' => {project_id => 1} }, status_commands => { 1 => [qw/new/], 2 => [qw/ongoing doing/], 3 => [qw/ϨϏϡʔ͓ئ͍͠·͢ ϨϏϡʔ͓Ͷ͕͍͠·͢/], 4 => [qw/ϨϏϡʔ͠·͢/], 7 => [qw/ϨϏϡʔ͠·ͨ͠/], 6 => [qw/done/], }, custom_field_prefix => { 2 => [qw(origin/)], # branch }, issue_fields => [qw/subject assigned_to status 1/], nick => 'minechan', ); $minechan->cook;

Slide 87

Slide 87 text

use strict; use warnings; use FindBin; use lib "$FindBin::Bin/../lib"; use Config::Pit; use Redmine::Chan; use utf8; my $minechan = Redmine::Chan->new(%{pit_get('redmine', require => { redmine_url => '', redmine_api_key => '', })}, skype_chats => { '#t.akiym/$akiym_bot;e36505b33ee2e9c8' => {project_id => 1} }, status_commands => { 1 => [qw/new/], 2 => [qw/ongoing doing/], 3 => [qw/ϨϏϡʔ͓ئ͍͠·͢ ϨϏϡʔ͓Ͷ͕͍͠·͢/], 4 => [qw/ϨϏϡʔ͠·͢/], 7 => [qw/ϨϏϡʔ͠·ͨ͠/], 6 => [qw/done/], }, custom_field_prefix => { 2 => [qw(origin/)], # branch }, issue_fields => [qw/subject assigned_to status 1/], nick => 'minechan', ); $minechan->cook; ͜͜ʹDIBUJE NJOFDIBOࢿྉ࡞Δ

Slide 88

Slide 88 text

IUUQTHJUIVCDPNBLJZN3FENJOF$IBO$IBO

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

5)"/,450 UZQFTUFS ZVTVLFCF TVHZBO UPLVIJSPN :BQQP POJTIJ

Slide 91

Slide 91 text

2VFTUJPOT PSSFQMZUP!BLJZN