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
Hokkaido.pm#11
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.8k
Perlコーディングテクニック2018
akiym
0
11k
新時代のテストフレームワークTest2
akiym
2
20k
脆弱なアプリを書く技術
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
2.1k
Other Decks in Technology
See All in Technology
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
200
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.4k
JAWS-UGグッズ職人仕事の流儀
kentapapa
0
130
夫婦で子育てするための育児標準化
codmoninc
PRO
0
500
LLM Content Moderationを支える評価・改善ループの実践
suikabar
1
220
大型犬好きによるPugの紹介
yamanoku
1
160
Turning Repos into the Product Second Brain with an LLM Wiki
linedevth
0
110
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
330
価値について
gree_tech
PRO
0
130
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
170
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
130
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
1
230
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Cult of Friendly URLs
andyhume
79
7k
Writing Fast Ruby
sferik
630
63k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
430
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
580
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Building Adaptive Systems
keathley
44
3.3k
GitHub's CSS Performance
jonrohan
1033
470k
Agile that works and the tools we love
rasmusluckow
331
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