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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.9k
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
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
5k
ChromeでローカルLLM
ryu1013
0
190
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
190
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
310
SFCで実現する病院・医療システムの動的組み立て式UI
koukimiura
1
160
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
670
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
120
Next.js: The final boss of Web Performance
guaca
0
380
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
130
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.5k
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
180
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
190
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.5k
Bash Introduction
62gerente
615
220k
Typedesign – Prime Four
hannesfritz
42
3.2k
Building AI with AI
inesmontani
PRO
1
1.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
My Coaching Mixtape
mlcsv
0
380
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
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