タグ別アーカイブ: perlentrance

Perl入学式 #1 に参加してきました #Perl入学式

おがた (@xtetsuji) です。

2014年4月26日(土曜日)に行われた「Perl入学式in東京#1」に参加してきました。サポーターや講師側での参加です。

カレンダーを見ると、昨年度(2013年度)の「in東京#2」からサポーターとして参加していたのですが、今まで参加したというブログ記事を書いていなかったなーと思って、ちょっとでも感想を書いてみようと思った次第です。

昨年度のPerl入学式もサポーターとしてだいたい毎回参加していて、そこで得られた様々な人との貴重な出会いや知見などもまとめたいと思ってはいるのですが、それはまたの機会にします。長くなりそうだから。昨年度は本当に貴重な体験でした。

今回はサポーターだけでなく、より運営側に近い側で作業させてもらい、資料作成や後半の講義まで行いました。特に資料作成は想像以上に大変で、これを前2年間、校長を含む数人だけで回していたことを考えると、もっと運営側にコミットして助けていかないとなーと思った次第です。

Perl入学式の歴史

適当なことを書いているかもしれませんが、だいたいこんな感じです。

  • 2012年度に大阪で @__papix__ 校長がプログラミング初心者向け勉強会として開始。当時は毎月合計12回のペースだったらしい。
  • 2013年度は大阪の他に東京でも行われる。毎月から隔月合計6回のペースになり、in東京では各月の次月は同じ内容を話す「補講」が行われて、用事で来られない人向けの体制となった。当時大学院生である @__papix__ 校長が自腹で毎月大阪から上京していたというのは結構驚かれる話。
  • 2014年度はJPAの支援も受けつつ、福岡でも開催され、東京・大阪・福岡という三大都市での開催となる。この最初の「Perl入学式 in東京 #1」が先日2014年4月26日にありました。

そういえば今回、Perl入学式とは…といった部分のスライドも自分が書いたんでした。途中からサポーターで入った自分が書いてもいいものかなと思いながら書きましたが、校長チェックは通ったので、大きく間違ったことは書いていなかったと思います。

Perl入学式の体制

前年度までを踏襲して、今年度も以下のような感じになっています。

  • 講師:in東京であれば、だいたい @__papix__ 「校長」。他の都市は別途校長に依頼された人が担当する
  • 運営:グループウェア上で開催日時や会場の議論をしたり、資料を書いたりする人達
  • サポーター:当日会場内をまわって分からない人の個別サポートをする人達
  • 受講生:来てくださる方々

講師も運営もサポーターも有志で結成されていて、原則的に手弁当でやっています。また、パソコンを持ち込んでもらう必要がありますが、受講者(生徒)の皆さんの参加費は無料です(懇親会費は有料です)。パソコンを持ち込んでもらうのは、パソコンの貸出の手間やコストというよりも、学習環境を持ち帰って自習してもらいたいという考えのほうが先立っています。

運営・サポーターは何を目的に毎月手弁当で無料勉強会をやっているのか疑問に思う人もいるかもしれませんが、だいたいの人達がPerlコミュニティの促進だったり、Perlプログラマの育成といったことに大きな興味を持って集まっているわけです。とかくPerlは古いと揶揄されることも多い中、学びやすい言語であることも確かで、そういうことを伝えていきつつ、Perlの雇用促進までつなげていければいいなという感じ。これは私が思っていることで、運営・サポーターの人によって若干の考え方の違いはあるかもしれないけど、だいたい似たようなものでしょう。

今回私が担当したこと

前述ですが、今回は前年度のサポーター以上に踏み込んだ活動をさせてもらいました

  • 資料作成:後半部分を担当
  • 講義:後半部分の一部を担当
  • サポーター

後半の資料、半分くらいは昨年の資料をベースに2014年版として書きなおしただけなのですが、新たに書き起こす部分が校長から指示されていて、それを書き過ぎないように気をつけながら書いたものの、結構書きすぎて当日(4月26日)は30分オーバーしてしまったという感じです。

時間は常に気にしていたのですが、私の壇上でトークする経験って長くてせいぜい20分程度で、2時間の長丁場の時間見積もりができていなかったのは反省点ですね。

当日のお話

例年、1回目は環境構築から入ります。後々システムPerlを汚さないようにユーザPerlを作ることと、そのためにMac/Linuxでビルド環境を用意することを教えます。

だいたい人の集まりを待つので、13時を少し過ぎたあたりから開始。

自分は前年度の1回目を知らなかったのですが(顔を出し始めたのは2回目から)、これがなかなか大変。一歩間違えると、生徒さんの私物のパソコンの環境を壊したりしかねないのでハラハラものです。

MavericksからのMacは環境構築が楽なほうですが、それでもみんなが一斉にXcodeのダウンロードをしたらネットワークが詰まるということで、ここは次回の補講での課題となりました。

Windowsの人にLinux環境を作ってもらうという部分、今年度はUSBメモリによるブートできるUbuntuを使った方法も紹介したのですが、前年度同様にVMwareを使った方法も一緒に解説して、サポートコストが倍近くになったのは大変でした。結局、USBメモリによるブートの方法は、慣れていなくて会場で対応が疎かになってしまったのは反省点でした。

会場であるガイアックスさんの会場が先日最新鋭になったことで、環境構築の部分では、最初は1つの内容を投影していた2つのスクリーンを突然分けて、Mac編とLinux/Windows編で別進行となって、Mac側は急遽@tsucchiさんが壇上に立って講義をするという校長の無茶ぶりが面白かったです。そのために校長は、Macの人とLinux/WIndowsの人を最初から会場の真ん中で二分して座らせていたというのには、会場の設備を最大限に利用した良いアイデアだなぁと思った次第です。

2時間かけて環境構築を完了。15時からの後半は、校長が冒頭に話をしたあとは私のターンです。

とはいえ、スライドのビルドの方法を聴いていなかったのは段取りが悪かったと反省しています。Perl入学式用に魔改造(?)されたImpress.jsとは…。これも補講までになるべくプレーンな環境に近づけたいなと思いました。

私の書いた資料で私が壇上に立って、Perlの歴史やPerlでできること、そしてワンライナーからエディタを立ち上げて最初のプログラムを書くところまで話したのですが、資料の盛り込み過ぎだったり、講義の段取りが悪かったりで、結局30分オーバーとなってしまいました。色々反省点多い…。

運営・サポーターの人達と、懇親会に参加するために残った受講生の皆さんと会場の片付けをして、18時前に会場を後にしました。

懇親会

五反田のガイアックスさんでPerl入学式を開催したときのお約束 「居酒屋北海道 五反田店」。今回もそこでした。

色々と大変だった分、ビールがうまい。そして居酒屋北海道、食事もうまい。

今回初参加の受講生の方々や、いつものサポーターの方々と歓談をして、22時前には解散しました。

参考

「校長」として日々手弁当で講師をしている@__papix__さん、そしてJPAの理事として2014年度からPerl入学式の事業化に向けて尽力している@yusukebeさんが参加されている回のポッドキャスト「職質テックトーク」(by @moznion)を聴いてみると、Perl入学式についての思い、そしてPerlの様々な話題を聴くことができます。時間があればどうぞ。

今後の開催日程など

今回と同じ内容を行う「in東京 #1 補講」は、5月最終土曜日である2014年5月31日の予定です。また、in福岡#1が2014年5月10日、in大阪#1が2014年5月17日の開催となっています。

開催日程や詳細は公式ウェブサイトやTwitter @Perl_Entranceでアナウンスされるので、興味のある方はぜひチェックしてみてください。

Perlや他のプログラム言語、それを使ったテキスト処理やウェブ開発に興味があるけれど、プログラム言語を学ぶ取っ掛かりが見つからなくて…といった皆さんの参加を、運営・サポーター一同、お待ちしています。

先日の #Perl入学式 での演習問題「calc_string.pl」の一風変わった解法

おがた (@xtetsuji) です。これを書いている2013年12月22日、まだ入院中です (詳細)。ベッドでブログ書くの、結構腰が疲れます…。

最近では「Perl入学式in東京」のサポーターを常連でやらせてもらっています。

先日の #5 での演習の中に「calc_string」という問題がありました。スライドの内容から引用します。

  • 引数として与えられた文字列が, 数値A 演算子 数値Bという文字列であれば, その値を計算して, 結果を返すような関数calc_stringを書いてみましょう
    • 「数値A」は任意の桁の正・負の整数とします. また, 演算子は+-*/%が使えるものとします.
    • 但し, 引数が与えられなかった場合(空の文字列の場合)は, undefを返します
    • また, 数値A 演算子 数値Bというフォーマットと一致しない場合もundefを返します
  • 関数calc_stringとwhile文を使って, Ctrlキーとdキーを押すまでの間標準入力から文字列を受け取り, 文字列に書かれた式を計算するようなコードを書いてみましょう

これについての回答は、他の生徒さんもブログにアップしたりしていて、その試行錯誤を見て初心に戻ったりしました。

私も生徒さん達が問題に取り組んでいるときに問題をといてみたのですが、マッチさせた演算子文字列で延々と条件節を書かないといけないのであれば、最初から計算式が文字列として組み立てられていることを前提に「文字列eval」したほうが、この場合はパフォーマンスを気にすることもないし簡潔になるかなと思って、Perl入学式の中では教えられなかった s/// の e オプション (eval) を使って解決してみました。しかも結果的に一風変わった形式で。

#!/usr/bin/env perl
# https://github.com/perl-entrance-org/workshop-2013-05/blob/master/slide.md#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C-1

use strict;
use warnings;

while(my $str = <STDIN>) {
    chomp $str;
    my $res = calc_strings($str);
    if ( defined $res ) {
        print "$res\n";
    } else {
        print "Input Error: $str\n";
    }
}

sub calc_strings {
    my $str = shift;
    # 文字クラス [...] の中での - は文字コード範囲になるので端っこに置く
    $str =~ s|^(\d+)\s*([-+/*])\s*(\d+)$| "$1 $2 $3" |ee
        or return undef;
    return $str;
}

ここでは Perl の simple replace s/// を使っていますが、e オプションを2回重ねています。こうすることで、置き換え後文字列に二回文字列evalがかかるというPerlの挙動があります。eオプションを重ねれば重ねるほどevalが重複してかかります。最初この挙動はPerlのバグというか意図しない挙動であったのですが、いつしか正式な仕様となりました。

  • s|^(d+)s*([-+/*])s*(d+)$| “$1 $2 $3” |ee

区切り文字を / から | に変更しています。割り算演算子としての文字列 “/” をキャプチャする必要があるのでややこしいからです。あと文字クラス […] 中では、正規表現のメタキャラはその意味を失います(一部の記号、例えばバックスラッシュや “[” などは除く)。またハイフン “-” は文字コードの範囲演算子になるので、文字クラスの列挙の最初か最後に書かないと混乱を招くことに注意しましょう(バックスラッシュでエスケープしてもよいです)。

「数字 演算子 数字」をキャプチャして、最初の置き換え後の文字列eval (e) では、これを文字列連結したPerlの文字列として評価しています。そして二回目の文字列evalで、最初に文字列連結した「計算式の文字列」をさらにPerl自身で評価させて結果を最終的な置き換え文字列としています。

ユーザの任意の文字列を文字列evalすることはセキュリティホールにつながる危険な行為であり、文字列evalはパフォーマンスにも良い影響を与えないことには注意が必要ですが、今回の例では「数字 演算子 数字」の列を正規表現できちんと検査していること、また一人で使うコマンドラインツールなのでパフォーマンス上の問題点は特に無いことで、これも一つのトリッキーな回答になっているかなと思います。

s///ee といった複数回evalの「仕様」は以前から知ってはいたのですが、実際に有用な場面で使ったのが初めてだったので、改めてまとめて解説を書いてみることにしました。