Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Hacking Mac OS X Cocoa API from Perl
Search
typester
November 18, 2011
Programming
430
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hacking Mac OS X Cocoa API from Perl
YAPC::Asia 2011 Tokyo
typester
November 18, 2011
More Decks by typester
See All by typester
サーバーサイドエンジニアのためのiOSアプリ開発入門
typester
0
4.8k
Emacs実践入門 Perl編
typester
0
2.7k
XSにまつわる話
typester
4
2.2k
Perlハッカーは息をするようにCPANモジュールを書く
typester
5
7.6k
UV - libuv binding for Perl
typester
1
6.3k
Other Decks in Programming
See All in Programming
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.7k
APNsからLive Activityを開始する話
yumnumm
0
150
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
580
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
430
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
110
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
iOSDC2026登壇資料.pdf
riofujimon
0
210
Are APIs Still Relevant in the AI Era?
soyuka
0
410
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
7
1.7k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
130
mrbgem 三角測量 開発
ogom
0
190
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.4k
Featured
See All Featured
Skip the Path - Find Your Career Trail
mkilby
1
240
Embracing the Ebb and Flow
colly
88
5.2k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
250
Utilizing Notion as your number one productivity tool
mfonobong
4
610
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Fireside Chat
paigeccino
43
4k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
260
Facilitating Awesome Meetings
lara
57
7.2k
Code Reviewing Like a Champion
maltzj
528
40k
Building Applications with DynamoDB
mza
96
7.2k
Transcript
)BDLJOH.BD049$PDPB"1* GSPN1FSM %BJTVLF.VSBTF UZQFTUFS :"1$"TJB5PLZP
"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL
"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP
'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04
"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP
'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04 w 72$IFDLFS 7PJDF2VPUJFOUBOBMZ[FSGPS1$BOEJ04
"CPVUNF w %BJTVLF.VSBTF w ,":"$*OD QSFTFOU w 5IJTZFBS`TXPSL w 3FFOHP
'BDFCPPLJOUFHSBUFE7P*1BQQMJDBUJPOGPSJ04 w 72$IFDLFS 7PJDF2VPUJFOUBOBMZ[FSGPS1$BOEJ04 w 0OFNPSFUIJOH 8JMMCFSFMFBTFECFGPSFUIJTYNBT
"CPVUNF w BLBUZQFTUFS
"CPVUNF w BLBUZQFTUFS w IUUQTFBSDIDQBOPSHd5:1&45&3 w IUUQHJUIVCDPNUZQFTUFS w IUUQGBDFCPPLDPNUZQFTUFS w
IUUQUXJUUFSDPNUZQFTUFS
—.B[EB3PBETUFS LOPXOBT.9JOPUIFSDPVOUSJFT
"HFOEB w "MJUUMFLOPXMFEHFBCPVU0CKFDUJWF$ w )PXUPVTF0CKFDUJWF$GSPN1FSM w "MJUUMFLOPXMFEHFBCPVU94 w 4PNFUJQTBCPVU94BOE0CKFDUJWF$ w
*OUSPEVDJOH$PDPBNPEVMFT*`WFDSFBUFE
0CKFDUJWF$
0CKFDUJWF$ w $SFBUFEGPS/FYU4UFQ w *U`TDVSSFOUMZVTFEBTQSJNBSZ QSPHSBNNJOHMBOHVBHFGPS.BD049 w *NQMFNFOUFECBTFE$ "MM$TZOUBYBOEGFBUVSFTDBOCFVTFEJO 0CKFDUJWF$pMF
0CKFDUJWF$ • #import <Foundation/Foundation.h> int main(int argc, char** argv) {
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; // Objective-C code here NSLog(@”Hello World!”); [pool drain]; return 0; }
0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN
0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN w MJLFHDDM'PVOEBUJPOGPPD
0CKFDUJWF$ w HDDGSBNFXPSL'PVOEBUJPOGPPN w MJLFHDDM'PVOEBUJPOGPPD w BPVU
94 w 'PPYTpMFJTOPUVTFEJSFDUMZGPS$ DPNQJMFS w 'PPYTXJMMDPOWFSU'PPDCZYTVCQQ w :PVDBOXSJUF'PPDEJSFDUMZJGZPVXBOU
'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__); }
QBDLBHF'PP •package Foo; use strict; use XSLoader; XSLoader::load __PACKAGE__, $VERSION;
1;
3VOJU •use Foo; Foo::xs_function();
.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
.BLFpMF1-GPS'PPN
.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 \
.BLFpMF1-GPS'PPN w 4PSSZ
.BLFpMF1-GPS'PPN w 4PSSZ w 4FF$PDPB bT.BLFpMF1- w IUUQTNFUBDQBOPSHTPVSDF5:1&45&3 $PDPB&WFOU-PPQ.BLFpMF1-
5IBU`TJU w 0CKFDUJWF$JOWPMWFBMM$GVODUJPOTBOE GFBUVSFT w +VTUSFOBNF'PPDUP'PPN JUDPNQMFUFMZ XPSLTCZUIJT.BLFpMF1- w "OEPGDBVTF
ZPVDBOVTF0CKFDUJWF$ TQFDJpDTZOUBYJOUIJTpMF
)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 <Foundation/Foundation.h> XS(hello) { dXSARGS; NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello!"); [pool drain]; XSRETURN(0); } XS(boot_Hello) { newXS("Hello::hello", hello, __FILE__); }
$PQJFTBOEQBTUFTGPS94 •#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h"
$PQJFTBOEQBTUFTGPS94 •#undef Move
$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here XSRETURN(0); }
$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here ST(0) = some_sv;
XSRETURN(1); }
$PQJFTBOEQBTUFTGPS94 •XS(function) { dXSARGS; // code here ST(0) = some_sv;
ST(1) = some_sv2; XSRETURN(2); }
$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); }
$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); }
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]);
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]));
GPS0CKFDUJWF$BOE1FSM w 4OJQ EFTDSJCFEJONZCMPHMBUFS w 1FSMBSSBZUP/4"SSBZ w /4"SSBZUP1FSMBSSBZ w 1FSMIBTIUP/4%JDUJPOBSZ
w /4%JDUJPOBSZUP1FSMIBTI
%PO`UGPSHFU w FOBCMF/4"VUPSFMFBTF1PPMTDPQFBSPVOE ZPVS/4 PCKFDUT w PUIFSXJTFUIFDPEFXJMMDSBTI
:PVSGSJFOET w QFSMEPDQFSMHVUT w QFSMEPDQFSMBQJ w YDPEFEPDVNFOUBUJPO
$PDPBNPEVMFT
$PDPBNPEVMFT w $PDPB&WFOU-PPQ w $PDPB(SPXM w "OZ&WFOU*NQM$PDPB
$PDPB&WFOU-PPQ w QSPWJEFTQFSMJOUFSGBDFGPS$PDPBTFWFOU MPPQ /43VO-PPQ w BMTPQSPWJEFTUJNFST *0XBUDIFSTBDUT XJUIUIBUFWFOUMPPQ w
:PVDBOIBOEMFFWFOUDBMMCBDLTDPSSFDUMZ CZVTJOHUIJTNPEVMF
$PDPB(SPXM w 1FSMJOUFSGBDFGPS(SPXMGSBNFXPSL w 4VQQPSUDMJDLFWFOUXJUI $PDPB&WFOU-PPQ
$PDPB(SPXM •use Cocoa::Growl ':all'; my $installed = growl_installed(); my $running
= growl_running();
$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)], );
$PDPB(SPXM •use Cocoa::Growl ':all'; # show growl notification growl_notify( name
=> 'Notification1', title => 'Hello!', description => 'Growl world!', );
$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;
"OZ&WFOU*NQM$PDPB w "OZ&WFOUBEBQUPSGPS$PDPB&WFOU-PPQ w ZPVDBOVTF$PDPBCBTFE"1*JOZPVS "OZ&WFOUBQQMJDBUJPO PS"OZ&WFOUXJUIJO $PDPBBQQMJDBUJPOT
"OZ&WFOU*NQM$PDPB w +VTUEPUIJT use AnyEvent; use Cocoa::EventLoop; # then all
anyevent based api use Cocoa::EventLoop!
"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;
&OKPZ