Slide 1

Slide 1 text

)BDLJOH.BD049$PDPB"1* GSPN1FSM %BJTVLF.VSBTF UZQFTUFS :"1$"TJB5PLZP

Slide 2

Slide 2 text

"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL

Slide 3

Slide 3 text

"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP 'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04

Slide 4

Slide 4 text

"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP 'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04 w 72$IFDLFS 7PJDF2VPUJFOUBOBMZ[FSGPS1$BOEJ04

Slide 5

Slide 5 text

"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP 'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04 w 72$IFDLFS 7PJDF2VPUJFOUBOBMZ[FSGPS1$BOEJ04 w 0OFNPSFUIJOH 8JMMCFSFMFBTFECFGPSFUIJTYNBT

Slide 6

Slide 6 text

"CPVUNF w BLBUZQFTUFS

Slide 7

Slide 7 text

"CPVUNF w BLBUZQFTUFS w IUUQTFBSDIDQBOPSHd5:1&45&3 w IUUQHJUIVCDPNUZQFTUFS w IUUQGBDFCPPLDPNUZQFTUFS w IUUQUXJUUFSDPNUZQFTUFS

Slide 8

Slide 8 text

—.B[EB3PBETUFS LOPXOBT.9JOPUIFSDPVOUSJFT

Slide 9

Slide 9 text

"HFOEB w "MJUUMFLOPXMFEHFBCPVU0CKFDUJWF$ w )PXUPVTF0CKFDUJWF$GSPN1FSM w "MJUUMFLOPXMFEHFBCPVU94 w 4PNFUJQTBCPVU94BOE0CKFDUJWF$ w *OUSPEVDJOH$PDPBNPEVMFT*`WFDSFBUFE

Slide 10

Slide 10 text

0CKFDUJWF$

Slide 11

Slide 11 text

0CKFDUJWF$ w $SFBUFEGPS/FYU4UFQ w *U`TDVSSFOUMZVTFEBTQSJNBSZ QSPHSBNNJOHMBOHVBHFGPS.BD049 w *NQMFNFOUFECBTFE$ "MM$TZOUBYBOEGFBUVSFTDBOCFVTFEJO 0CKFDUJWF$pMF

Slide 12

Slide 12 text

0CKFDUJWF$ • #import int main(int argc, char** argv) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; // Objective-C code here NSLog(@”Hello World!”); [pool drain]; return 0; }

Slide 13

Slide 13 text

0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN

Slide 14

Slide 14 text

0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN w MJLFHDDM'PVOEBUJPOGPPD

Slide 15

Slide 15 text

0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN w MJLFHDDM'PVOEBUJPOGPPD w BPVU

Slide 16

Slide 16 text

94 w 'PPYTpMFJTOPUVTFEJSFDUMZGPS$ DPNQJMFS w 'PPYTXJMMDPOWFSU'PPDCZYTVCQQ w :PVDBOXSJUF'PPDEJSFDUMZJGZPVXBOU

Slide 17

Slide 17 text

'PPD • #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" XS(func) { dXSARGS; // code here XSRETURN(0); } XS(boot_Foo) { newXS("Foo::xs_function", func, __FILE__); }

Slide 18

Slide 18 text

QBDLBHF'PP •package Foo; use strict; use XSLoader; XSLoader::load __PACKAGE__, $VERSION; 1;

Slide 19

Slide 19 text

3VOJU •use Foo; Foo::xs_function();

Slide 20

Slide 20 text

.BLFpMF1-GPS'PPD • use inc::Module::Install; # some basic descriptions here use_ppport '3.19'; WriteAll; w .PEVMF*OTUBMM946UJM w 4FFBMTP%BUB.FTTBHF1BDL %BUB".'94 UIBUJTVTJOH UIJTQTFVEP94UFDIOJRVF

Slide 21

Slide 21 text

.BLFpMF1-GPS'PPN

Slide 22

Slide 22 text

.BLFpMF1-GPS'PPN w VTFJOD.PEVMF*OTUBMM TPNFCBTJDEFTDSJQUJPOTIFSF VTF@QQQPSU DD@BQQFOE@UP@MJCTMPCKD NBLFNBLFS@BSHT\EZOBNJD@MJC^\ 05)&3-%'-"(4GSBNFXPSL'PVOEBUJPO ^ \ IUUQXXXNBJMBSDIJWFDPNNBLFNBLFS!QFSMPSHNTHIUNM "EETPNFSFRVJSFENBDIJOFSZUPTVQQPSUNpMFT QBDLBHF.: TVCD@P\ NZJOIFSJUFETIJGU461&3D@P !@  JOIFSJUFE&0.&44 N 0#+@&95    $$$.%  $$$%-'-"(4 * 1&3-@*/$  1"45)36@%&'*/&  %&'*/&  N &0.&44 JOIFSJUFE ^ TVCYT@D\ NZJOIFSJUFETIJGU461&3YT@D !@  JOIFSJUFE&0.&44 YTN   946#1136/  9413050"3(  946#11"3(4  946#11@&953"@"3(4  YT YTN .7  YTN N &0.&44 JOIFSJUFE ^ TVCJOJU@EJSTDBO\ NZTFMGTIJGU TFMG461&3JOJU@EJSTDBO  GPSFBDINZOBNF TFMGMTEJS TFMGDVSEJS \

Slide 23

Slide 23 text

.BLFpMF1-GPS'PPN w 4PSSZ

Slide 24

Slide 24 text

.BLFpMF1-GPS'PPN w 4PSSZ w 4FF$PDPB bT.BLFpMF1- w IUUQTNFUBDQBOPSHTPVSDF5:1&45&3 $PDPB&WFOU-PPQ.BLFpMF1-

Slide 25

Slide 25 text

5IBU`TJU w 0CKFDUJWF$JOWPMWFBMM$GVODUJPOTBOE GFBUVSFT w +VTUSFOBNF'PPDUP'PPN JUDPNQMFUFMZ XPSLTCZUIJT.BLFpMF1- w "OEPGDBVTF ZPVDBOVTF0CKFDUJWF$ TQFDJpDTZOUBYJOUIJTpMF

Slide 26

Slide 26 text

)FMMPN • #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" // undefine Move macro, this is conflict to Mac OS X QuickDraw API. #undef Move #import XS(hello) { dXSARGS; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello!"); [pool drain]; XSRETURN(0); } XS(boot_Hello) { newXS("Hello::hello", hello, __FILE__); }

Slide 27

Slide 27 text

$PQJFTBOEQBTUFTGPS94 •#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h"

Slide 28

Slide 28 text

$PQJFTBOEQBTUFTGPS94 •#undef Move

Slide 29

Slide 29 text

$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here XSRETURN(0); }

Slide 30

Slide 30 text

$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here ST(0) = some_sv; XSRETURN(1); }

Slide 31

Slide 31 text

$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here ST(0) = some_sv; ST(1) = some_sv2; XSRETURN(2); }

Slide 32

Slide 32 text

$PQJFTBOEQBTUFTGPS94 • XS(function) { dXSARGS; SV* sv_args1 = ST(0); SV* sv_args2 = ST(1); // code here ST(0) = some_sv; ST(1) = some_sv2; XSRETURN(2); }

Slide 33

Slide 33 text

$PQJFTBOEQBTUFTGPS94 • XS(function) { dXSARGS; if (items < 2) { Perl_croak(aTHX_ "Usage: function($args1, $args2)"); } SV* sv_args1 = ST(0); SV* sv_args2 = ST(1); // code here ST(0) = some_sv; ST(1) = some_sv2; XSRETURN(2); }

Slide 34

Slide 34 text

GPS0CKFDUJWF$BOE1FSM w 1FSMTUSJOHUP/44USJOH STRLEN len; char* c = SvPV(sv, len); NSString* str = [NSString stringWithUTF8String:c]; w /44USJOHUP1FSMTUSJOH SV* sv = sv_2mortal(newSV(0)); sv_setpv(sv, [str UTF8String]);

Slide 35

Slide 35 text

GPS0CKFDUJWF$BOE1FSM w 1FSMOVNCFSUP/4/VNCFS NSNumber* n; if (SvNOKp(sv)) { n = [NSNumber numberWithDouble:(double)SvNVX(sv))]; } else if (SvIOK_UV(sv)) { n = [NSNumber numberWithDouble:(double)SvUV(sv))]; } else if (SvIOKp(sv)) { n = [NSNumber numberWithDouble:(double)SvIV(sv))]; } w /4/VNCFSUP1FSMOVNCFS SV* sv = sv_2mortal(newSVnv([n doubleValue]));

Slide 36

Slide 36 text

GPS0CKFDUJWF$BOE1FSM w 4OJQ EFTDSJCFEJONZCMPHMBUFS w 1FSMBSSBZUP/4"SSBZ w /4"SSBZUP1FSMBSSBZ w 1FSMIBTIUP/4%JDUJPOBSZ w /4%JDUJPOBSZUP1FSMIBTI

Slide 37

Slide 37 text

%PO`UGPSHFU w FOBCMF/4"VUPSFMFBTF1PPMTDPQFBSPVOE ZPVS/4 PCKFDUT w PUIFSXJTFUIFDPEFXJMMDSBTI

Slide 38

Slide 38 text

:PVSGSJFOET w QFSMEPDQFSMHVUT w QFSMEPDQFSMBQJ w YDPEFEPDVNFOUBUJPO

Slide 39

Slide 39 text

$PDPBNPEVMFT

Slide 40

Slide 40 text

$PDPBNPEVMFT w $PDPB&WFOU-PPQ w $PDPB(SPXM w "OZ&WFOU*NQM$PDPB

Slide 41

Slide 41 text

$PDPB&WFOU-PPQ w QSPWJEFTQFSMJOUFSGBDFGPS$PDPBTFWFOU MPPQ /43VO-PPQ w BMTPQSPWJEFTUJNFST *0XBUDIFSTBDUT XJUIUIBUFWFOUMPPQ w :PVDBOIBOEMFFWFOUDBMMCBDLTDPSSFDUMZ CZVTJOHUIJTNPEVMF

Slide 42

Slide 42 text

$PDPB(SPXM w 1FSMJOUFSGBDFGPS(SPXMGSBNFXPSL w 4VQQPSUDMJDLFWFOUXJUI $PDPB&WFOU-PPQ

Slide 43

Slide 43 text

$PDPB(SPXM •use Cocoa::Growl ':all'; my $installed = growl_installed(); my $running = growl_running();

Slide 44

Slide 44 text

$PDPB(SPXM • use Cocoa::Growl ':all'; # register application growl_register( app => 'My growl script', icon => '/path/to/icon.png', # or 'http://urlto/icon' notifications => [qw(Notification1 Notification2)], );

Slide 45

Slide 45 text

$PDPB(SPXM •use Cocoa::Growl ':all'; # show growl notification growl_notify( name => 'Notification1', title => 'Hello!', description => 'Growl world!', );

Slide 46

Slide 46 text

$PDPB(SPXM • use Cocoa::EventLoop; use Cocoa::Growl ':all'; growl_register( name => 'test script', notifications => ['test notification'], ); my $wait = 1; growl_notify( name => 'test notification', title => 'Hello', description => 'Growl World!', on_click => sub { warn 'click'; $wait = 0; }, on_timeout => sub { warn 'timeout'; $want = 0; }, ); Cocoa::EventLoop->run_while(0.1) while unless $wait;

Slide 47

Slide 47 text

"OZ&WFOU*NQM$PDPB w "OZ&WFOUBEBQUPSGPS$PDPB&WFOU-PPQ w ZPVDBOVTF$PDPBCBTFE"1*JOZPVS "OZ&WFOUBQQMJDBUJPO PS"OZ&WFOUXJUIJO $PDPBBQQMJDBUJPOT

Slide 48

Slide 48 text

"OZ&WFOU*NQM$PDPB w +VTUEPUIJT use AnyEvent; use Cocoa::EventLoop; # then all anyevent based api use Cocoa::EventLoop!

Slide 49

Slide 49 text

"OZ&WFOU*NQM$PDPB • use AnyEvent; use Cocoa::EventLoop; use Cocoa::Growl; my $cv = AE::cv; growl_notify( name => 'test notification', title => 'Hello', description => 'Growl World!', on_click => sub { warn ‘click’; $cv->send; }, on_timeout => sub { warn ‘timeout’; $cv->send; }, ); $cv->recv;

Slide 50

Slide 50 text

&OKPZ