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
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
[JAWS-UG彩の国埼玉#12]そろそろ準備する?re:Invent2026をやさしく解説 / reinvent2026-sainokuni
sh_fk2
1
370
AIカンパニーへの転換を支えた、エンジニアの仕事の再定義
kworkdev
PRO
2
1.4k
PHPカンファレンス関西の招待状 / Invitation to PHP Conference Kansai
ykanoh
0
220
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
420
スキマバイトという雇用形態は存在しないので、雇用期間1日のアルバイト契約を事業者とワーカーが結ぶ手続きを支えるのがタイミーなんです
akitoshiga
1
230
WasmをRustにする
sansantech
PRO
0
300
その Valkey 使いこなしていますか?
onk
PRO
5
1.7k
How to Design Configuration for Rails Applications
willnet
1
950
Browser Spec: Testing Hotwire with Ruby
takahashim
1
140
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
360
FinOps Agentが生んだ技術負債:コスト自動調査の落とし穴と解消までの道のり
oasis1994liveforever
2
220
CloudWatch Logsのコスト最適化:どこまでAIに任せてどこから人間が承認すべきか
yama3133
0
140
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
[SF Ruby Conf 2025] Rails X
palkan
3
1.5k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
Evolving SEO for Evolving Search Engines
ryanjones
0
330
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.4k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Building Applications with DynamoDB
mza
96
7.2k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
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