読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

Perl Beginners #5 に参加して参りました

10/26 (日) に開催されたPerl Beginners #5 に参加してきましたのでそのレポートをば。
かねてからこういうPerl 初学者向けの参加したかったんですよ、僕は!

Perl Beginners とは

Perl 初学者が登壇して、分からない事やつまずいた事を質問するという勉強会
詳しくは → Perl Beginners

今回のTips (主催の@ytnobody さん)

コードリファレンス (無名関数) の紹介

Beginners Session

@sasakure_kei さん : PerlREST 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 さん)
      • URI に対して正規表現が使えて、それを引数として渡せる
      • メソッドによる分岐が可能
      • ディスパッチャとして特化している
      • さっき話に出たAmon2 もそれを使っている
  • Mojolicious を最近知った。便利っぽいけどどう使えばいいのか……
    • Mojolicious::Guides::Routing というドキュメントがあるので読めば良い。日本語版もある。(@charsbar さん)

@__papix__ さん : PerlGPGPU コンピューティングをしたい
  • "Namba.pm" と"Perl 入学式 in 福岡" を新たに旗揚げ (Namba.pm、行きます!)
  • PerlGPGPU コンピューティングは修論のテーマ
    • Perl で書いたコードを、CUDA 向けのコードに変換したい
      • とは言うものの書き下したコードの関数の範囲とかってどうやって判断するの
      • 正規表現とかで処理しようとすると死ぬよね……
      • PyCUDA のように文字列として変換するコードを与えれば楽ちんだけれど
        • GPGPU 環境が無い場合はPerl で実行出来るようにしたい
        • 文字列か否かを判別してスイッチしてくれる良い感じのモジュールが無い!
    • パースに関しては、B::Deparse で文字列化して解析しましょう (@maka2_donzoko さん)

  • 色々と残念な質問をしたので後述します

LT

@toku_bass さん : 文字コードについて
  • Perl の文字列の扱い
    • 「内部エンコーディング」とそれ以外に大別できる
  • Perl の中の世界と外の世界で考える
    • Perl の外の世界の文字はPerl にとって理解出来ない
    • 外部からの入力にはdecode、Perl から外に出るときはencode
      • Perl の世界の文字列に戻すのでPerl から見ればdecode
      • Perl の世界の文字列を外界の文字列にするのでencode
  • utf8 フラグで、内部エンコーディングであるか否かを判定する
    • Devel::Peek で確認できる
      • utf8 であるか否かの判定には使ってはならない (今後、Perl の内部エンコーディングがutf8 から変わる可能性があるから)
  • 内部エンコーディング以外は8bit を1文字として扱う
    • 外部からutf8 のマルチバイト文字を読み込んだ場合、decode しないと8bit で分割されるので正常に表示されない
  • use utf8;
    • ソースコードがutf8 で書かれてますよ、といいう宣言
    • ソースコード自身もPerl から見たら外部のものだから、decode が必要
    • "use utf8;" 以降の文字列をdecode してくれる
  • 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 さん

で詳しい説明をされている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 の件とか)
しかし、こういう質問する側が登壇するスタイルって良いですね。「学ぶ側」が積極的に参加できる勉強会って言うのは貴重だと思いました。
次回も参加したいと思います!

(蛇足) PerlGPGPU コンピューティング

クソ大変だと思いますが、頑張って下さい。僕は匙を投げました(無責任)