年末進行の合間を縫って、表題のイベントに行ってきました。
今回は「今年書いたPerlのコード」というテーマだったこともあって
色々なモジュールの話を聞けました。
@akiymさんのCocoaAPIを使うモジュールの話と@moznionさんのTestとDocumentを協調させるという考え方が
個人的にとても興味深い話でした。
あと、@yusukebeさんが海外のカンファレンスではcontextが違ったりして、
微妙に噛み合わない部分があったりした、という話をされていたのですが、
以前に、海外の開発者の方が書かれたブログで、カンファレンス(海外のOSC)に参加した感想を目にしたときに、
やはり似たような話が書かれていたのを思い出しました。
少し前に国内のOSC関係の方が、登壇者にOSSの開発者が少ないといった話をされていたこともあり
このcontextの違いは、海外との違いも勿論あると思うのですが、
カンファレンス毎の文化の違い、みたいなものもあったりするのかな、と考えたりしました。
仕事がPerlからPHPになったせいか、Perlコミュニティとの関わり方をどうしたものかと
最近よく考えるようになったのですが、そんな変化もあってか
少しずつ客観的に、Hokkaido.pmを眺めるようになってきたのかな、と思っています。
色々思う所はあるのですが、やっぱりPerlコミュニティの文化は凄く好感が持てるので
エンジニアの仕事を続ける内は、何らかの形で触れていけたら良いなと思いました。
その上で今回のHokkaido.pmに参加してみて、
改めてPerlのコミュニティはライブラリ開発者のコミュニティなんだな、と感じました。
年末進行でなかなか時間が取れなかったのですが
KossyとMonocerosで何か簡単なアプリを作ろうと環境だけは整えていたので
今日のPMで貰ったモチベーションを利用して
正月に何か動くものを作ってみようと思いました。
https://github.com/PhenX/php-font-lib
こちらのライブラリでいい感じに抽出が出来そうでした。
ただ、OpenTypeについてある程度理解が無いと厳しそうだったので
adobeとmicrosoft(とappleのTrueType)のfontのドキュメントも合わせて読んでみました。
http://www.adobe.com/devnet/font.html
http://www.microsoft.com/typography/otspec/
https://developer.apple.com/fonts/ttrefman/
フォントファイルはいわゆるバイナリなので、フォーマットの中身を調べていけば分かるはずなのですが、
ドキュメントの解読だけではUnicodeの割り当てまでたどり着けなかったので
上記のライブラリの実装と見比べて、調査する形になりました。
フォーマット全ては把握しきれませんでしたが、Unicodeの割り当てには
glyphIndexArrayというattributeが該当するようです。
glyphIndexArrayについての説明は以下のドキュメントにありました。
https://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
コードとしては、上記ライブラリのwww/font_info.php内でUnicodeの抽出と実体参照による描画をやっている箇所がありました。
cmapのテーブルからMicrosoft用のUnicode(BMP)に当たるglyphIndexArrayを抽出して
HTMLで可視化しているようです。
さきのドキュメントを調べた限りでは、BMP以外も別テーブルにあるようなので
全てを抽出するには、複数のテーブル(PlatoFormIDとPlatformSpecificIDの組み合わせ)を調べる必要がありそうです。
OpenTypeについて、ざっくりと説明すると、CIDと呼ばれる独自のIDに文字(字面)を割り当て
CID毎にUnicodeをマッピングしておくことで、アプリケーションから文字を使用出来るようになっています。
何故Unicodeそのままではない独自の形なのかと言うと、異体字の扱いが絡んでいるためとのこと。
(異体字はUnicodeは同じコードが割り当てられるため、文字の出し分けが出来ない)
また、このCIDと字面の割り当て方は、幾つかの仕様があるのですが
今回、自分が必要になったのはAdobe-Japan1-4という日本語を割り当てるための仕様の一つでした。
だいぶざっくりした調査ですが、メモ書きとして残しておきます。
@koji_magi @krocoke 感想なんかも教えて欲しいですね。あんまりフィードバックがないので。冬コミも申し込んでるので、イラスト期待ですね!!
— kaz_hiramatsu (@kaz_hiramatsu) September 20, 2013
ということで、先日のYAPC::Asiaにて入手した雅なPerl入門という同人誌の
感想など記事にしてみようと思います。
ちなみに中身は健全なPerl学習用の本ですので、
その点をふまえた上で、興味がある方は先へお進みください。
まごうことなく同人誌ですね。
即売会という響きも久しく聞いていない身ですが
これはいいものです。
後から気づいたのですが、知人が表紙絵を書いておりました。
縁とは意外な所で繋がるものです。
本編に入る前に、まずは目次をご覧あれ。
これを見るだけでも、基本を網羅した構成であることは
十分に伝わると思います。
自分がPerlを学んだ分厚い参考書と比べても
ページ数の差はあれど、中身では負けてない、という感想でした。
このクオリティで同人誌とは…恐るべし。
まず技術書としての話ですが、
対象は初学者から言語の基本をある程度おさえた中級者向け、くらいの内容になっていました。
なので、Perlに興味がある別言語の経験者の方や、
Perlはある程度触れるかな、くらいの人ならほぼつまずかないで読める内容だと思います。
参考までに、自分はWeb系の実務経験が三年半ほど、恐らく中級者に片足かけたくらいで
大体の内容は分かりつつ、知らないことも幾つかあった、という感じでした。
9章の正規表現で出てきた「よくばりとなまけもの」の話は
初めて知る内容で、とても勉強になりました。
ノートPCを置いといて、つまづいた所が出たらperldocを叩いたり、サンプルコードを打ち込む感じで
読み進めていきました。
内容は幅広く基礎を扱っているので、どの章も読み応えはありましたが
特に、環境構築にplenvを使っていた点と、Encodeを取り上げて文字コードの変換に触れている点が
好印象でした。
個人的には5、6章の組み込み関数はよく使うので
もう少し実例的なサンプルがあってもいいかな、という気もしました。
そういえばmap関数はあったのにgrep関数が無かったですね…もしかしてgrepってマイナーなのかな。
あとは、11.3でモジュールを入れる例として「cpanm Moose」していたけど
もう少しさくっと入るモジュールの方がいいかなと思いました。
依存が多くて時間かかりますし、何かしらテストこけそうな気が…。
(あえて茨の道を味わってみるのもアリと言えばアリですが!)
蛇足かと思いましたが、誤植や間違いとおぼしき箇所については
出来る限りメモしておいたので、本記事の最後にまとめて記しておきます。
誤植まとめに誤りなどありましたら、コメント頂けると有り難いです。
さて、ここからが本気の出しどころですね。
著者の@kaz_hiramatsuご本人も「ラノベを読む感覚で」と後書きされていますが
この本は物語仕立てになっています。
Perlを学びたい雅という女の子がクロウというPerlハッカーに教えを乞う、という流れですが
この二人の対話形式、凄く良いです。
クロウの人物設定は、某hatenaさんあたりにこんな学生さん居そうだなーというリアルさがあるし
雅は雅で「そんな奴いねえYO!」という部分と「いや、でもこういうことする奴居そうだな…」という
居なそうで居そう、という良い塩梅を突いたキャラになっていて
自分は好きな感じでした。
あと、最も興味深かったのが、雅の的確なコメントです。
この妙に的確コメントが、雅のキャラ設定を膨らませる燃料になっていたように感じました。
プロローグで人物の説明があったクロウに対し、雅はキャラ設定についてはっきりと書かれている場面はありません。
しかし、例えば2.2のやりとりを引用してみると
クロウ: (省略)... Perl のプログラムは、同じ事をやる場合でもいろんな書き方が出来るんだ。
雅: いろんな書き方ができると、プログラムが読みにくくなる気がしますけど。
このコメント、何やら「ん?」と思わされます。
「読みにくく」ということは、「プログラムは読むもの」という認識があることになります。
つまり、雅はある程度、プログラムを読む習慣があると推測できます。
また、「見る」ではなく「読む」という表現からも、プログラムに普段から触れている空気を感じ取る事ができます。
一方、4.3では整数リテラルの説明に対して、このようなコメントを返しています。
雅: 数値もほとんど数学と同じですね。意外とプログラミングって簡単な気がして来ました。
さもプログラム初心者であるかのようなコメントです。
雅はプロローグでPerlを知らないと言っているので、一見すると自然に見えますが
前述のコメントがあるので、まるで初心者を「装っている」ように見えてきます。
この後も、雅のコメントが的確すぎて
進めば進むほど「もしや正体を隠しているのでは?」という疑問が強くなってくるという
不思議なモチベーションに押されつつ、サクサクと読み進める事ができました。
うっかりエピローグが用意されていて「実は私はMiyabiではなくMiyagawaだったのさ!」「な、なんだっtt」
という超展開を妄想したりもしましたが、そんなことには全然なっていなかったので
残念ほっと一安心でした。
Perlを学ぶ本としても良い本ですし、ラノベ好きとしても楽しめる一冊でした。
Perl好きなら持っておいて、間違いは無いかと。
もし次回があれば中級者向けの本を、と後書きにありましたので
次の本も手にする機会があれば、是非よんでみたいと思います。
P13. 下方のサンプルコード4行目
誤:小数点以下3桁
正:小数点以下6桁
P16. 7行目
誤:$x、$y、$x
正:$x、$y、$z
P19. 表4.1、$x >= $y の意味
誤:$x より$y が大きいか等しい
正:$x は$y より大きいか等しい
P22. 4.8の三つ目の会話
誤:話者が雅
正:話者がクロウ
P31. 表4.3、$x ge $y の意味
誤:$x はより$y は大きいか等しい
正:$x は $y より大きいか等しい
P31. 表4.3、$x le $y の意味
誤:$x より$y は小さいか等しい
正:$x は$y より小さいか等しい
P32. 一つ目のサンプルコードのコメント
誤:"10" + "20"
正:"10" . "20"
P50. 下段のサンプルコード、一行目
誤://emlist{
正:この行が不要
P77. 9.14の最後のクロウの台詞
誤:マッチする文字列の中で最も短いもの
正:マッチする文字列の中で最初にマッチしたもの
実際にコードを叩いて確かめてみると、説明とは違って長い方にマッチします
perldoc perlreでは、以下のように説明されています
By default, a quantified subpattern is "greedy", that is, it will match
as many times as possible (given a particular starting location) while
still allowing the rest of the pattern to match. If you want it to
match the minimum number of times possible, follow the quantifier with
a "?". Note that the meanings don't change, just the "greediness":
*? Match 0 or more times, not greedily
+? Match 1 or more times, not greedily
?? Match 0 or 1 time, not greedily
{n}? Match exactly n times, not greedily (redundant)
{n,}? Match at least n times, not greedily
{n,m}? Match at least n but not more than m times, not greedily
P81. 表9.5、メタ文字の(?:b)
誤:(?:b)
正:(?:a)
「意味」の項目が「パターンaのグループ化」になっていたので、表の流れから考えて、
「意味」ではなく「メタ文字」の項目を直す形にしています
P84. 9.25項目全体
ここは恐らく(?<=)の説明として、9.25の中身自体が適切ではないです
perldoc perlreから、(?<=)の説明を一部抜粋します
"(?<=pattern)" "\K"
A zero-width positive look-behind assertion. For example,
"/(?<=\t)\w+/" matches a word that follows a tab, without
including the tab in $&. Works only for fixed-width look-
behind.
ざっくり訳すと、「タブ文字列(\t)に文字列が一文字以上繋がってる場合にマッチするけど、
$&(マッチした文字列が入る変数)にタブは含まないよ」となります
こんな感じのワンライナーを書くと、実際に動きが確認出来ます
$ perl -E 'if ("\taaa" =~ /(?<=\t)\w+/) { say $& }'
aaa
P115. サンプルコード、new関数の下から二行目のコメント
誤:空のハッシュリファレンスを用意
正:空じゃない
<a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
こんな感じでtweetボタンを設置できるけど、投稿文にurlが付与されない。
aタグにdata-urlで指定してもダメだった。
ローカルで動かしてみて、適当なドメインをhostsで指定したり
IP直接指定だとurlが付与されるので、github.ioの仕様なのかも。
2013-10-14追記:
Hachioji.pmの日めくりテックトークを見たら全然そんなことは無かったので
githubで使ってるkoji--というサブドメインが悪いんじゃないか説。
確かハイフンと.を並べる文字列をドメインにしちゃアカン、みたいなのをどこかで見たような…
あまりクドいデザインに出来るほど
デザイン脳があるわけではないので
ドットのボーダーとシンプルな色使いで
まとめてみました。
もう少し改良の余地はありますが
ひとまずこれでやってみようかなと思います。
ぼちぼちブログのデザインラフを作ったので
HTMLのコーディングをはじめてみたりしています。
デザインを考える作業はプログラムを書く作業とは
よく似ているけど考えることはやっぱり違っていて
とても興味深い作業です。
しばらくはRijiとキャッキャウフフしながら
ああでもないこうでもないと
デザインをいじってみようかなと思います。