Perl中学生?
2016年のPerl入学式Advent Calendar 15日目です。
普段は京都にいるので、お手伝いに行くとしたらPerl入学式in大阪なのですが、どうもここ数年、開催日とサーバメンテナンス作業日*1がかぶることが多く、全く行けていなくて、もはやPerl入学式Advent Calendarに参加するのもアレやなぁと思っていました。
しかし、尊さ校長*2から飛んできた白羽の矢をうっかり掴んでしまったので、15日目は僭越ながら @azumakuniyuki が書かせていただく次第でございます。
ちなみに、一週間後の22日は今年最後のネコの日です。また、昨日のsironekotoroさんに続いて猫アイコン二日目(2匹目)です。
そういえば
最後に行ったのはいつやったか、自分のツイートを探したら2015年の1月17日、阪神大震災と同じ日でした。
#Perl入学式 大阪第五回が無事終了、皆様お疲れ様でした。 pic.twitter.com/qnfk0Ur4Ms
— ネコ物質 (@azumakuniyuki) January 17, 2015
2015年1月の回(大阪第5回)までは真面目に毎回手伝いに行ってたかというと、全然そんなことはなくて、例えるなら近所の犬が校庭に入って走り回るぐらいの頻度でしか行けてません。とはいえ、@tomcha_さんはじめ、初年から前年までの受講生の皆さんが卒業後に続々と大阪のサポーターをしてくれてはる状況を見ると大きな安心感があります。
Perl入学式大成功!ですね。
飛んできた白羽の矢
参加したことなくてもOKとのこと、校長のお墨付きで尊い限りです。
@azumakuniyuki 大丈夫です, 一回も参加したことない @magnolia_k_ さんも登録されてるんで問題ないです!!!! Perlネタでいいんで是非!!!!! 書いて下さい!!!!!
— 尊さ (@__papix__) December 9, 2016
だれ?
前述の通り2016年は一度も行けなかったので「おまえ誰やねん?」と思ってはる人がたくさんやと思いますので簡単に自己紹介を。
- 名前 = azumakuniyuki (本名です、azumakuniyukiで検索して出てくるのは全部僕です、たぶん)
- ネコ = カワイイ猫のアイコンを各所で使ってますが、僕もアイコンのネコもどっちもおっさんです
- 仕事 = 昔はネットワークとかサーバの面倒を見るだけでしたが、コードも書きますし開発もします
本題
Perlネタである必要があるので、Perl入学式の一年が終わったあとの話でも書きます。
HubとしてのPerl
Perl入学式の一年(東京は半年)が終わったら、学んだことを仕事で生かしたり、定時で帰れるように効率を爆上げしたり、PerlでBotやサイトを作ったり、Perlが道具として機能し始めることやと思います。実際のところ、プログラミング言語としてPerlを覚えた人、仕事でPerlを使うようになった人も、Perlを使う上での実用的側面を見ると文字列の処理がかなりの割合を占めていると言えそうです。
僕はエラーメールを解析するライブラリを開発しているのですが、ほとんどが文字列処理で正規表現を使いまくっています。最初にどの言語で実装するかを検討した時は、商業的見地からJavaにするか、速度と単一バイナリを取ってCで書くか、あるいは文字列処理が得意なPerlか、と考えました。
やはり文字列処理の多さからPerlを選んで正解でした、後に作るRuby版への移植も比較的容易でしたし。またYAPCやKansai.pmなどのコミュニティへのHubとして捉えりと大正解でした。
文字列処理についてはつい最近、大阪の若林さん(@nqounet)がPerl 5 Advent Calendar 2016でPerl5で文字列操作 | IT Office Nishimiyaharaって記事を書いてはりますので参考になります。
盆栽としてのソフトウェア
さて、自転車は一度乗り方を覚えるとしばらく乗ってなくてもちゃ〜んと乗れるそうですが、プログラミング言語の場合は違うようで(いや、僕だけかもしれませんけど)しばらく書いてないと「この処理ってどう書くんやったかいな?」ってことがあると思います、たぶん。
なので、なんでも良いから定期的にコードを書くことが大事です。とはいえ、仕事でメンテナンス・保守するコードはあまり冒険ができないので、何か自分の好きなことや興味のある分野、身近な物事に関するプログラムを少しずつ育てるのなんか良さげです、盆栽みたいなもんです。あるいは漬物とか。
仕事に関係のないコードなら、「こう書いたほうが速い」「昨日知ったあのモジュールを使ってみよう」「ちょっと遊びの機能を追加してみよう」とか、いろいろ自分の裁量でできます、面白いです。
論理的に近いとこで盆栽的(つまり何かを作ってみて育てている・手入れをしている)やと思ったのを幾つか列挙しますと、
- ぬか漬のすゝめ - Perlがくしゅう帳(Rubyも) | ぬか漬けとぬか床管理アプリの話
- Getopt::Kingpinを使って、さくっとコマンドラインスクリプトを作成する - Qiita | Perlに移植したGo言語のGetopt::Kingpin
- Perl の基礎知識で実用プログラミング 〜旅情編〜 - 脇毛じゃないよ | 旅の荷物最適化プログラムの話
- cpm - a fast CPAN module installer - Qiita | CPANモジュールを高速にインストールする
cpm
の話 - できる!ゲーム制作 ~Perl入学式 卒業制作~ - Perlがくしゅう帳(Rubyも) | Perl入学式でやったこと+Xで何かを作る
「自分のプロダクト」と言えるものを作るのも良いですし、自分のアシスタントとして機能するコードを書くのも良いですね。それに着手した時点で50%は完了している、みたいな名言をどこかの何かで見た記憶がありますし、「とりあえず作ってみる」が大きな一歩です。
ニャーン
例えばネコです。みんな大好きネコちゃん、飼い猫から近所のネコまで身近な存在でもあります。近いところにネコが居ない人のために、ネコ画像を貼っておきます。
ネコ的文字列処理
Perl入学式第4回では正規表現をやりましたね。「やりましたね」ってあたかも僕がサポーターでその場にいたような体で書いてますが、講義資料をさっき見て確認しました。BBSを作るにしてもTwitterに何かを投稿するbotにしても、文字列処理は必ず必要です。
そこでネコです。
最後の練習問題で「標準入力から入ってきた文字列を条件判定して書き換えたものを表示する」というのがありました。あれ、応用すると文字列処理としてなかなか奥の深いところまで続く要素があるので、ネコを絡めてみましょう。
まずは普通の解答例
行数が長くなるので全部後置ifで書いています。
「にゃーん」
問題にはPerl, Python, Ruby, papix, Helloが入っていたら何かを表示すると指示がありました。それ以外の文字列が入ってきても何も表示されないので、下に条件を追加して、「ニャー」とか「ニャーン」をつけてみることにします。
追加した部分は、
- "。"を含む文字列は、その前の「文字列+ニャー」に書き換える
- "。"を含まない文字列の場合は「にゃーん?」とだけ表示する
- 「ニャー」ばかりでは面白くないので、「ニャーーーー」とか「ニャーー」とか「ー」が変動するように(サブルーチンnyaan()を呼ぶ)
という簡単なもので、実行すると次のような感じになります。
% perl ./peac-2016-q3-nyaa1.pl ↩︎ 今日は寒い。↩︎ 今日は寒いニャーーーー ストーブをつけた。↩︎ ストーブをつけたニャーーーーー ネコの日一週間前↩︎ 「にゃーん?」 0↩︎ %
改良する
現段階でのコードにはまだ問題があります。
1.「木曜日ですニャー。」は「木曜日ですニャーニャーー」になる(ニャーが重なる) 2. 「モーニング娘。」が「モーニング娘ニャーーー」になる(「。」までが正式名称)
なので、これらの問題点を解決します。
末尾のニャー対応版
改良版を実行して動作の確認をします。
% perl ./peac-2016-q3-nyaa1.pl 木曜日ですニャーん。↩︎ 木曜日ですニャーん。 明日は金曜日ですニャーーーーーーん。↩︎ 明日は金曜日ですニャーーーーーーん。 モーニング娘。↩︎ モーニング娘。ニャーーーーーーー。 0↩︎ %
まだまだ改良の余地がある
ちょっとはマシになったのですが、次のような問題点や改善点が考えられます。
- 「。」が一個である前提(「我輩は猫である。名前はまだない。」は最後の「。」しかニャーにならない)
- 「にゃ〜ん」の「〜」も考慮すべきでは?
- 改行があった場合はどうなる?
- 長い文章をファイルから読みんでニャーしたい
- いっそのことnyaan('文字列')でニャーできるようにしたほうが使いやすい?
- 毎回文字を手入力して動作確認するのが面倒なので
prove
でテストしたほうが楽
どんなプログラムでもそうやと思いますが、完成した時は「もうバグはない、完璧。」と思いがちなのですが、人に使ってもらうと予想外の文字列が入ってきて変な動作になったり、自分で使っているうちに使いにくい点や欲しい機能が出てきたりするものです。
なので、前述の通り身近な事柄、関心のある分野にまつわること、好きなものに関係したプログラムであれば、日々使う→バグを直す・機能を追加するというサイクルで、コードを書く習慣が少しは増えるのではないかと思います。飽きたらまた別のプログラムを作れば良いですし、何個でも作れますし、まずは手を動かしてコードを書くのが大事です、たぶん。
Acme::Nyaa
ニャーするプログラム、最初はここで例示した程度のものやったんですが、最終的にAcme::NyaaというPerlモジュールになりました。ネコの手を借りる必要がない程度に時間ができたらRuby版を作りたいなぁとか思っています。
Acme::Nyaaを作る過程では次のことが勉強になりました。
- 文字列処理(日本語の扱いやutf8フラグについても)
- Perlのオブジェクト指向
- 効率よく引数の受け渡しをするためにリファレンス・デリファレンス
- HTTPまわりの処理(Plackと組み合わせてネコProxyになる)
何の役に立つかわからんようなプログラムでも、いろいろと学ぶ機会を得られるものです。Acme::Nyaaを使ったHTTPプロキシは表示されるサイトの文書をニャーして表示しますってネタもできました。詳しくはAcme::Nyaaで実装した猫プロキシ | Hachioji.pm 日めくりテックトークで。
鍋がある
必要は発明の母って言いますし、まずは自分の好きなこと、身近なこと、関心のあること、自分の助けになるものをPerl入学式で覚えた記憶が新しいうちに手をつけるのが良いと思います。
Perl入学式がPerlの小学校とすれば、卒業後はPerl中学生、現実世界では社会に出るのと同じく、自分で考えて調べてコードを書いての繰り返しになります。そして大阪*3には壁に当たった時は身近なPerlの先達に質問できる勉強会があります。
どちらの鍋もPerl入学式in大阪のサポータさん主催で、卒業生であればより質問しやすいと思います。とりあえず「何かを作ってみる」の第一歩や、壁を越えるための梯子として鍋のある厨房に行ってみるのはどうでしょうか。
そして明日はトーカナイザの守護霊さん*4の「cpan/metacpanの歩き方みたいな話」です。プログラムを書くにあたっては「どのモジュールを使えば良いか」「どんなモジュールがあるのか」って壁に何度も当たると思いますが、そんな時に参考なる話かもしれないですね!