Perl Beginners #5 に参加して参りました
10/26 (日) に開催されたPerl Beginners #5 に参加してきましたのでそのレポートをば。
かねてからこういうPerl 初学者向けの参加したかったんですよ、僕は!
Beginners Session
@sasakure_kei さん : Perl でREST API を提供するにはどうすれば良いのか
- URL をパースしなければならないし……
- あとメソッドについても考えないとならないし……(GET, POST, PUT, DELETE, etc...)
- 「"GET" で更新される処理を書くWeb プログラマはクソだ!」とかつての上司にも言われたし……
- 一応、CGI::Application::Dispatch で解決した
- REST API 向けのおすすめのフレームワークなどは存在するのか?
- REST API を叩くモジュールはたくさん有るけど、そのAPI をバラしてアプリケーションに上手い事投げてくれるのってあんまり無いよね
- Router::Simple を使ってキャプチャしてきたやつをDispatch ほにゃららモジュールで処理すれば良いと思う (@toku_bass さん)
- Router::Simple について (@maka2_donzoko さん)
- Mojolicious を最近知った。便利っぽいけどどう使えばいいのか……
- Mojolicious::Guides::Routing というドキュメントがあるので読めば良い。日本語版もある。(@charsbar さん)
@__papix__ さん : Perl でGPGPU コンピューティングをしたい
僕
- 色々と残念な質問をしたので後述します
LT
@toku_bass さん : 文字コードについて
- Perl の文字列の扱い
- 「内部エンコーディング」とそれ以外に大別できる
- Perl の中の世界と外の世界で考える
- utf8 フラグで、内部エンコーディングであるか否かを判定する
- Devel::Peek で確認できる
- utf8 であるか否かの判定には使ってはならない (今後、Perl の内部エンコーディングがutf8 から変わる可能性があるから)
- Devel::Peek で確認できる
- 内部エンコーディング以外は8bit を1文字として扱う
- 外部からutf8 のマルチバイト文字を読み込んだ場合、decode しないと8bit で分割されるので正常に表示されない
- use utf8;
- print すると"Wide character in.." という警告
- マルチバイト文字が存在した場合にencode せずに外界に出そうとすると警告する。
- perl が自動でutf8 にしてくれてはいるけれど、自前でやるべき
- 日本語をDump して結果を目視したいとき
- Data::Dumper だとencode を噛まさないと駄目なのでめんどい
- YAML のDump を使うと良い
僕
- 後述します
@i47_rozary さん - いいえTimeZoneです
- タイムゾーンの話
- ご自身が制作されたTime::Piece::Over24
- 24時を超えた時間も扱える(28時まで)
- 40件くらいバグレポートが届いてる
- サマータイムの影響
- 勝手に1時間進むから、そこでテストがぽしゃる
- どうしよう
- サマータイム準拠にしようか……
@ytnobody さん - 入れ子構造を分解する
- 入れ子がごちゃごちゃして読みにくいソースを読みやすくする
- まずはロジックを整理
- フローチャートを書いてみる
- そもそもフローチャートが煩雑
- 条件判断を統合する
- チェック部分を別の関数に切り出す
- 一見冗長だが、関数を呼ぶだけでチェック出来るようになる
- if やunless 等を後置記法で記述するとすっきりする
- die もチェック関数の中に入れればすっきりする (<= ただ、この部分は物議をかもした)
- validate する部分をひとまとめの関数にする
- するとだいたいすっきりする。
- ネストが深いのはクソ
- 入れ子の部分を別の関数に抽出すると良い
- 入れ子が3層構造とかになるとヤバさが増す
- 大きな関数1つで機能実装するよりも、複数の小さな関数の組み合わせで書こう
- 小さい関数に切り出すと仕様変更に強くなる
- 使いまわせるし、単体テストがやりやすくなる
- 入れ子の部分を別の関数に抽出すると良い
- まとめられるif 文はどんどんまとめよう
- 関数内の行数が多いとあやしい
- 関数が肥大化している場合は、だいたい別の関数として切り出せる
- 関数のやっている処理を単純な関数名で表現できない関数は駄目な関数である可能性が高い
- 関数の行数が多くて、複数の機能を提供している関数にありがち
僕がPerl Beginners でやってきたこと
・Beginners Session
"こういうコードを書くと、逐次的に (1回イテレーションするごとに) print されず、foreach を抜けた時に一気に表示される!! こわい!! 助けて!!!"
という、ハイパー初学者丸出しの質問をぶちかましてきました。
で、
- `$| = 1` すればよい
- IO::Handle のautoflush を使えば良い
ので、コレ幸いとばかりに
moznion/packingProgram_byPerl · GitHub
が抱えている同様の問題を解決しようと、勇んでライブコーディングしたわけですが
大変残念なことにこの部分とは関係のない、本質的な部分にバグが見つかった為、
失敗に終わりました。大変に残念ですね。そのうち直します。
この件に関しては、@kkotaro0111 さんが
今のはたぶんこれかな。 #perlbeginners / Perlでバッファリング抑止 - IT 東京 楽しいと思うこと URL
で詳しい説明をされているWeb ページを紹介していらしたので、
そちらの方を読まれると大変よいのではないかと思います。
Perlでバッファリング抑止 - IT 東京 楽しいと思うこと
そういや、RS232C でコンピュータ同士を接続してメッセージの送受信を実現した時にも
似たような問題にぶち当たった記憶が……学習能力の低さが仇となりましたね……
・LT
「なれるCA」というタイトルでLT してきました。最近、(Acme) モジュールを書いてCPAN Author になった (勘違い野郎な) ので、その手順と感想を書き連ねました。
スライドはこちらです。
このLT に対して、
- CPAN にアップする前に試験的にアップして、反応を見てみる場所なんかはあるのか
- モジュールにバグを見つけて、それを直して欲しい時はどうすれば良いのか
前者に関してはPrePAN というサービスがあるのでそれを使えば良いのでは、というアドバイスを頂きました。
PrePAN - Social Reviewing for Perl Modules
Perlモジュールのレビューサイト PrePAN をオープンしました - delirious thoughts
PrePAN は海外では利用が盛んらしいですが、日本ではあまり使われていないらしいです。
(日本はPrePAN にアップして反応を見なくても周りに訊ける人がいるからでは、という事らしいです)
せっかくのサービスなので、次に作るモジュールは積極的にPrePAN を使って行きたいと思います。
後者に関してはCPAN のモジュールのページの右側に"View/Report Bugs" という項目があるので、
そこからレポートを飛ばせば"ちゃんとしたメンテナだったら" 対応してくれるのでは、という事でした。
あと、「PAUSE の中の人はボランティアだから、あまりdis らないで」と@charsbar さんに言われました。
もちろんdis りなどしません。僕だってPAUSE の中の人だったら、一言「Acme」とだけ書いてアカウント申請してきた人間など無視すると思うので。
また、@__papix__ さんから拙作のモジュールであるAcme::AjiFry のSINOPSYS が間違ってるという指摘を受けましたので、
近いうちに修正したいと考えています。
感想
Perl 初学者の僕にとって、こういった勉強会はありがたいというか色々と勉強になりました。(autoflush の件とか)しかし、こういう質問する側が登壇するスタイルって良いですね。「学ぶ側」が積極的に参加できる勉強会って言うのは貴重だと思いました。
次回も参加したいと思います!