Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Hokkaido.pm#11
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
akiym
December 28, 2013
Technology
5.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Hokkaido.pm#11
Cocoa module, perl-5.19
akiym
December 28, 2013
More Decks by akiym
See All by akiym
Webセキュリティのあるきかた
akiym
40
21k
CPAN Module Hacks
akiym
0
2.7k
Perlコーディングテクニック2018
akiym
0
11k
新時代のテストフレームワークTest2
akiym
2
19k
脆弱なアプリを書く技術
akiym
11
9.4k
Herokuで学ぶ、初めてのPerl
akiym
5
3k
Perl meets Leap Motion
akiym
0
1.6k
github止まり モジュール5選
akiym
0
1.6k
Skype効率化
akiym
1
2k
Other Decks in Technology
See All in Technology
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
1
620
AI開発に用いられるHPC技術について
gpuunite_official
0
290
Rust×eBPFでEDRっぽいものをつくる
sunlife3
2
970
「面白い!」を信じ抜け。激動の時代を貫く、オンリーワン・エンジニアの条件
kizawa2020
0
250
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
Digital Credentials API × OpenID4VP ブラウザ完結型本人確認の実装知見(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
260
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
1
1.2k
AIで変わるエンジニアの働き方(仮)
naoinaoi
0
550
フィジカルAIの知識ゼロの僕でも AIを使えばここまでできた
tatsuya1970
0
180
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
320
ClaudeCodeでセキュリティ監視業務を半自動化_1年の運用でわかったAIに任せる設計の5つのポイント
kintotechdev
3
450
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Prompt Engineering for Job Search
mfonobong
0
420
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
480
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
280
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Optimizing for Happiness
mojombo
378
71k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
The Language of Interfaces
destraynor
162
27k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Building AI with AI
inesmontani
PRO
1
1.2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Transcript
ࠓॻ͍ͨ 1FSMͷίʔυͷৼΓฦΓ )PLLBJEPQN !BLJZN
NF w !BLJZN w w TFDDBNQ ZBQDBTJB w 4&$$0/ࡳຈେձ༏উ
DUGLBUTVEPOPSH
$1"/HJUIVC
$1"/ w "OZ&WFOU4,,4FSW w $PDPB/FUXPSL$IBOHF w 3FHFYQ7FSCBM&YQSFTTJPOT
$1"/ w "OZ&WFOU4,,4FSW w $PDPB/FUXPSL$IBOHF w 3FHFYQ7FSCBM&YQSFTTJPOT
None
ϑλΛดͯ͡ˠ։͘ͷ8J'JͷεΠονΛ ར༻ͯ͠ࠂന͞ΕΔ
(JUIVC w .BD,FZCPBSE-&% $PDPB%JDUJPOBSZ4FSWJDFT Q6OB[V$IBO $PDPB(VJ5FTU "OZ&WFOU-FBQ.PUJPO
"NPO8FC%JTQBUDIFS%7 5FYU1JDP5FNQMBUF 888'$7JEFP%PXOMPBE (BNFT1JDSPTT 5FYU$IJOFTF/VNFSBMT+" *SPI
લճͷ)PLLBJEPQN Ͱ͠·ͨ͠
None
$PDPBNPEVMF
w ͳͥ$PDPBϞδϡʔϧΛॻ͘ͷ͔ʁ w $PDPB"1*Λ৮Γ͍͔ͨΒ w 1FSMͰ.BDΞϓϦ͡Όͳͯ͘ɺ.BDͷػೳʹ ΞΫηε͍͚ͨͩͩ͠͠ɺ୯ମϞδϡʔϧʹ͠ ͍ͯͬͨ΄͏͕ΈΜͳ͕ͤ w ͱUZQFTUFS͞Μ͕ݴ͍ͬͯͨ
BHSFF
$PDPBNPEVMFͷ ࡞Γํ
w ࠷ۙ w 946#Ͱॻ͚ΔΑ͏ʹͳͬͨͷͰઈศར w ֵ໋ w $PDPB(SPXM$PDPB4LZQF໘ͳ͜ͱΛ ͍ͯ͠Δ w
YTVCQQ͕ੜ͢ΔDΛखͰॻ͘Α͏ͳ͜ͱ
NJOJMOFX w .JOJMMBͰ࡞͢Δ w ANJOJMOFXQ94.PEVMFA w CVJMEFS.Z#VJMEFSQNΛ࡞ w IUUQTPIIBUFOBCMPHDPNFOUSZ
CVJMEFS.Z#VJMEFSQN package builder::MyBuilder; use strict; use warnings; use parent qw(Module::Build);
use File::Copy; ! sub new { my ($self, %args) = @_; $self->SUPER::new( %args, extra_compiler_flags => ['-Wall'], extra_linker_flags => ['-framework', 'Foundation'], ); } GSBNFXPSLͷϦϯΫ
CVJMEFS.Z#VJMEFSQN sub compile_c { my ($self, $file, %args) = @_;
! (my $m_file = $file) =~ s/\.c$/.m/; move($file, $m_file) or die $!; ! $self->SUPER::compile_c($m_file, %args); } ! 1;
NJOJMUPNM [build] build_class = "builder::MyBuilder"
w YTʹΰϦΰϦͱॻ͍͍ͯ͘ w NBLF͢ΔͱN͕ੜ͞ΕΔ w HJUJHOPSFʹlib/Foo.mͷΑ͏ʹՃ͓ͯ͘͠
w ී௨ͷ94ͱಉ͡Α͏ʹॻ͚·͢ w $PDPBˠ1FSM 1FSMˠ$PDPBͷσʔλͷม ʹؾΛ͚ͭΕ͍͍͚ͩͰ͢ w ͦΕҎ֎ͨͩͷ94 w Ͳ͏Ε͍͍Μͩʜͱ͍͏ͱ͖ʹ
w UZQFTUFS͞ΜTPI͞ΜͷSFQPTJUPSZΛ ࢀߟʹ͢Δ
σʔλͷม w IUUQXXXTMJEFTIBSFOFUUZQFTUFSIBDLJOHNBDPTYDPDPBBQJGSPN QFSM w IUUQTHJUIVCDPNTPI$PDPB/4%JTUSJCVUFE/PUJpDBUJPO$FOUFS CMPCNBTUFSOT@EJTUSJCVUFE@OPUJpDBUJPO@DFOUFSN • nsnumber_to_sv(), ns_to_sv()
σʔλͷม # e.g. NSString → SVPV ! SV* sv =
sv_2mortal(newSV(0)); sv_setpv(sv, [str UTF8String]);
Ͱ
.BD,FZCPBSE-&% w ͱ͍͏ϞδϡʔϧΛ࡞Γ·ͨ͠ w IUUQHPPHMFNBDCMPHTQPUKQ NBOJQVMBUJOHLFZCPBSEMFETUISPVHIIUNM w ͜ΕΛͦͷ··࣋ͬͯ͘Δ͜ͱʹ w ͳͷͰɺઆ໌͢Δ͜ͱ͕͋Γ·ͤΜ
HJUIVCDPNBLJZN.BD,FZCPBSE-&%
JTTVF w .JOJMMBͰ%FWFM"TTFSU04తͳ͜ͱΛ͍ͨ͠ w CVJMEFS.Z#VJMEFSQNIBDL • die 'OS unsupported' unless
($^O eq 'darwin');
QFSM
MBUFTUSFMFBTF QFSM
QFSMEFMUBΛோΊΔ
IBTITMJDFTZOUBY w %hash{…} %array[...] w LFZWBMVF JOEFYWBMVF ͷϦετΛฦ͠·͢ w ͍͚ͯΔ
IBTITMJDFTZOUBY my %h = ( blonk => 2, foo =>
3, squink => 5, bar => 8, ); my %subset = %h{qw/foo bar/}; # => (foo => 3, bar => 8)
IBTITMJDFTZOUBY my @a = "a".."z"; my @list = %a[3,4,6]; #
=> (3, "d", 4, "e", 6, "g")
QPTUpYEFSFGFSFODJOH w ޙஔσϦϑΝϨϯε w !BˠB! w ෳࡶͳσʔλߏΛૢ࡞͢Δͱ͖ʹศར w TMJDFͱΈ߹ΘͤΔ͜ͱ͕Ͱ͖Δ
QPTUpYEFSFGFSFODJOH no warnings 'experimental::postderef'; use feature qw/postderef/; ! my $r
= [1, 2, 3]; my @a = @$r; my @b = $r->@*;
σʔλߏ my $foo = { bar => { baz =>
{ a => 1, b => 2, c => 3, } } }; !
σʔλߏ my $foo = { bar => { baz =>
{ a => 1, b => 2, c => 3, } } }; ! my @ab = @{$foo->{bar}{baz}}{qw/a b/}; # => [1, 2] ࠈͬΆ͍
σʔλߏ my $foo = { bar => { baz =>
{ a => 1, b => 2, c => 3, } } }; ! my @ab = $foo->{bar}{baz}->@{qw/a b/}; # => [1, 2]
:PV5VCF%BUB"1* $VAR1 = { 'fmt' => '36', 'fmt_list' => [
'36', '18', '5', '43', '17' ], 'resolution' => '320x240', 'suffix' => 'flv', 'title' => 'HE-MAN HEYEAYEA SONG FOR 10 HOURS', 'user' => undef, 'video_id' => 'eh7lp9umG2I', 'video_url' => ..., 'video_url_map' => { '17' => { 'fmt' => '17', 'resolution' => '176x144', 'suffix' => '3gp', 'url' => ... }, '18' => { 'fmt' => '18', 'resolution' => '320x240',
ࠓ·Ͱ # video_url_mapから各フォーマットのデータを # ひっぱってくる ! my @data = @{$data->{video_url_map}}{@{$data->{fmt_list}}};
# video_url_mapから各フォーマットのデータを # ひっぱってくる ! my @data = @{$data->{video_url_map}}{@{$data->{fmt_list}}}; ࠓ·Ͱ
QPTUEFSFG # video_url_mapから各フォーマットのデータを # ひっぱってくる ! my @data = $data->{video_url_map}->@{$data->{fmt_list}->@*};
w QSPUPUZQFBUUSJCVUF w sub foo($$){}ˠsub foo : prototype($$){} w Perl
5.19.2から $!が decodeされる w http://d.hatena.ne.jp/syohex/ 20131227/1388149250
1FSM2VJ[
͜ͷίʔυಈ͘ʁ # メモリは十分にあるとする # perl-5.18.1 (64bit) ! my @a; $a[2**31]
= 1; ! # =>
͜ͷίʔυಈ͘ʁ # メモリは十分にあるとする # perl-5.18.1 (64bit) ! my @a; $a[2**31]
= 1; ! # => Modification of non-creatable array value attempted, subscript -2147483648 ಈ͔ͳ͍
QFSMҎ߱ͳΒ my @a; $a[2**31] = 1; ! # On 64-bit
platforms, the internal array functions now use 64-bit offsets, allowing Perl arrays to hold more than 2**31 elements, if you have the memory available.
EFQSFDBUJPOT w $(*QN w ͬͱ ɾТɾʆ
w .PEVMF1MVHHBCMF w 0CKFDU"DDFTTPS w 1PE-B5F9 w 5FSN6* w 5FYU4PVOEFY
SFNPWFENPEVMFT w "SDIJWF&YUSBDU w #-JOU w $1"/1-64 w 'JMF$IFDL5SFF w -PH.FTTBHF
·ͱΊ w ͪΐͬͱͨ͠$PDPBNPEVMFͷ࡞Γํ w QFSM w IBTITMJDFTZOUBY QPTUpYEFSFGFSFODJOH