YAPC::Hokkaido 2016 SAPPORO で「4日目の人」になりました

YAPC::Hokkaido 2016 SAPPORO のために北海道遠征し、「4日目の人」と称えられて帰ってきた旅の記録です。技術成分はゼロに近くなってますので、そういうのを期待される方は、公式の関連エントリまとめへどうぞ。
【随時更新中】YAPC::Hokkaido 2016 関連エントリまとめ - YAPC::Japan 運営ブログ
私が聞くことのできたトークについては、別のブログに書けたら書くつもりです。

はじめに

YAPC (やぷしー) というのは、Yet Another Perl Conference の略で、Perl というプログラミング言語に関わる人たちのためのお祭りです。
ざっくり説明すると、その界隈のすごい方々の発表を生で聞けて、場合によっては、国内外のハッカーや知人と交流できたりできなかったり、そのあたりでは売ってないようなノベルティをもらえたりします。

みなさんご存じかもしれませんが、こういった感じの素晴らしいイベントは毎日のようにどこかで開催されています。しかし、Perl 関連のイベントで最大規模のものといえば YAPC なのです。ゆえに、Perl または Perl コミュニティが好きな人にとっては、「YAPC = 事情が許すなら是非とも行きたいイベント」であることが多いです。
参加効果としては、ユーザーやエンジニアを幸せにするテクノロジーや思想に出会える / IT の最新の動向を肌で感じられる / 各種モチベーションが上がる / その界隈の人たちと横繋がりを持てる・深められる ... 等々の良いことがあります。これらは、直接的/間接的に、参加者の会社や家庭に恩恵をもたらします。

そういうわけで、身近に YAPC に行きたがっている人がいれば、ぜひ応援または支援してあげてください。現時点でオープンになっている来年の開催予定は、下記の2回です。

2回とも素晴らしいイベントになる見込みが高いので、できれば両方とも行かせてあげてください。分かりましたか、我が○○よ。

欠航と YAPC

さて、今年の YAPC::Hokkaido 2016 SAPPORO は 12月09日(金) と12月10日(土) の 2日間に渡って札幌市で開催されたのですが、広く報道された通り、12月09日(金)からの大雪の影響により、札幌にほど近い新千歳空港では飛行機の欠航が相次ぎました。

毎日新聞発表の新千歳空港の欠航数と合わせて、YAPC 参加者たちの動きをふんわりと表にまとめます。

日付 欠航数 YAPC 道外からの参加者の動き
12月09日(金) 60便 0日目 前夜祭 この日来る人が多かった (来れない人もいた)
12月10日(土) 249便 1日目 当日 この日帰ろうとする人もいた
12月11日(日) 183便 2日目 この日帰ろうとする人が多かった
12月12日(月) 10便 3日目 みんな帰っていった
12月13日(火) 58便 4日目 最後の1人 (?) が帰った

記事によれば、新千歳空港では過去5年間、12月の欠航数が500便を超えたことはないそうですが、今年は12月09日(金)からのたった4日間の欠航数合計が 502便。ちょうど YAPC にぶち当たるように、想定しづらい規模で交通が麻痺したということで、消耗された方も多かったのではないかと思います。大変おつかれさまでした。

「4日目の人」になった件

上述の通り、道外からの参加者たちは YAPC 3日目にはどうにかして帰って行ったため、4日目の参加を表明した私は「4日目の人」と称えられることとなりました。

この方をはじめ、何人かの方から暖かい声援もいただきました。

おかげさまで最長滞在争いは圧勝したようです。ありがとうございました!

なぜ4日も居たのか

一言でいえば「カニのため」。二言でいうなら「カニと観光のため」です。
もともとは私も 12月11日(日)、つまり YAPC 2日目 に帰るつもりでいました。実際、飛行機に乗り込みもしたのですが、除雪作業と安全確認のためなかなか出発でない状況が続き、結局、約1時間後に機内アナウンスで欠航を知らされました。
となれば、周りの乗客は全員ライバル。彼らに先んじて代わりの便と当日の宿を確保しなければいけません。*1
すぐ頭に浮かんだのは、「翌日の飛行機のチケットと、今夜確実に必要になる宿とだったら、どっちを優先すべきか」という問題です。ふつうは天気予報等を考慮して前者なのでしょうが、私はお土産用の毛ガニを所持していたため、宿の予約を優先しました。
結果、宿は確保できたものの、翌日のフライト予約はタッチの差で間に合わず、2延泊が決まりました。

ちなみに、どうにかして3日目に帰る、そのために陸路を使う / キャンセル待ちを狙う/ 別の空港から飛ぶ、等の方法も思いつきはしましたが、実際に比較したのは以下の可能性です。

  1. 3日目に1日がかりで帰宅に成功するが、宿のキャンセル料100%を払う
  2. 3日目も帰宅に失敗して、1日棒に振るが、夜は宿でゆっくり休み、4日目に帰宅する (仕事を2日休む)
  3. 3日目も帰宅に失敗して、1日棒に振った上に宿無しになり、空港泊デビューして4日目に帰宅する (仕事を2日休む)
  4. 3日目は普通にリモート勤務して、夜は宿でゆっくり休み、4日目に札幌を観光して悠々と帰る

どう考えても最後のが一番楽で楽しいよね! というわけで、4日目参加が確定したのでした。

心配してくださった方々、しょうもない理由ですみません。しかし、その分しっかり楽しんでまいりましたので、平にご容赦くださいませ。

日記

以下は個人的な日記です。ここまでも長いですが、ここからも長いので、お好みでどうぞ。

12月09日(金) / YAPC::Hokkaido 2016 SAPPORO 前夜祭

雪の影響で飛行機が遅延。定刻より 55分遅れで離陸し、1時間25分遅れで着陸しました。
すすきの駅近くのショッピングモール「NORBESA」内にある「MIRAI.ST cafe & kitchen」で前夜祭に参加。トーク5本の後は懇親タイムでした。

12月10日(土) / YAPC::Hokkaido 2016 SAPPORO 当日

朝起きたら見たこともないほどたくさんの雪が積もっていました。「楽に歩くために除雪済みのルートを探す」という知恵が無かったため、素直に Google マップのおすすめに従い、ふわふわの雪に膝下まで埋まりながら会場へ。

YAPC当日は、開始から終了まですごい方々のお話ばかりで、全体的に Perl 濃度も高くて、最高でした。
トークの合間に、お世話になった方に再会して御礼かたがた近況報告できたり、吹雪の中でコメダが繁盛している様子をウォッチできたりしたのも良かったです。

懇親会は、北二条の BUDDY BUDDY で。これは!と思うモジュールの作者様のお話を聴けたり、懐かしい人や若者とお話しできたりして、こちらも感慨深かったです。
そして二次会は、@xtetsujiさん、@kazu_hiramatsuさん、@hakata_oyuki さんと。Yet Another 人間界という感じで、おそらく一生の思い出になりました。

書いていて、本当に一日のうちに起きた出来事だったのかと思うほど、密度の濃い一日でした。

12月11日(日) / YAPC 2日目

快速エアポートで空港へ。車内に居合わせた人たちと情報交換し、帰りたい日にさくっと帰れたらラッキーな状況だということを知りました。

新千歳でお土産を買い込んで、搭乗口前へ。14時ちょっと前に、出発時刻を 13:35 から 16:10 に変更するというアナウンスがありました。結局、16時半ごろに乗り込んだのですが、約1時間後に前述の欠航アナウンス。
すでに満腹だったので、北海道土産として買い込んだカニをどうするかで途方に暮れそうになりましたが、気を取り直して宿と飛行機を予約し、会社に帰宅用の有給休暇を申請。
席を立つと、通路の前方に、キャリーバッグを手に狭い通路を急ぐ若者の姿がありました。
「ゆっくりでいいですよ」と声をかけると、心無しかほっとしたような表情。
「お一人ですか?」
「宿は決まっていますか? それは急がないとまずいですね。よかったら予約しましょうか?」
「せっかくなので宿でいっしょにカニを食べませんか?」
結果的に一人旅の心細さにつけこむような形で、じわじわと間合いを詰めるようにして、カニ要員を確保。道々話しているうちに、お互いのボツ土産 (カニとイクラ) を持ち寄って宿で酒盛りしようという話がまとまりました。

が、しかし、この若者が非常に人を惹きつける感じの人物で、途中から食べ物そっちのけで話し込んでしまい、解散時のテーブルにはたいして減っていないカニ・イクラに加えて、焼きうどんとご飯とスイーツが残りました。まさか捨てるわけにもいかないので、一人でやっつけて就寝。身も心も本当にお腹いっぱいになる一日でした。

12月12日(月) / YAPC 3日目

10時頃に起き、客室の配線の都合でベッドの上から出勤。ティータイムあたりからシェアオフィス クロッカスさんにお世話になり、午後の仕事。
計7時間ほど勤務したところで、宿に戻って残りの仕事をするために移動開始...するはずが、時計台やさっぽろテレビ塔の輝きに吸い寄せられて早退。




良かったです、夜の札幌も。カップル向けのスポットかと思っていましたが、ぼっちでも童心に返って楽しむことができました。

12月13日(火) / YAPC 4日目

f:id:wakegisky:20161219011721j:plain
北海道庁へ寄ってから、札幌市中央卸売市場へ。


ここまで来てやっと北海道の魚介類が美味しいと言われることに納得。帆立と鮭が未体験ゾーンの美味しさでした。

その後のタクシーで海鮮丼が美味しかった感動を告げると、運転手さんからこんな話をしてもらえました。
「私は毎年いくらを漬けるんです。スーパーで卵が安いときを狙って、コーヒーのこんな大きな瓶に何本かね。親戚が土浦にいるので毎年贈るんですよ。ええ、それはもう喜ばれますとも。でもお礼はアジの開きでいいんです。アジの開きなんかで、ってみなさんおっしゃいますけど、アジがいいんです。北海道にもアジはありますが美味しくないんですよ、バサバサで。道外のホッケが美味しくない、道内のホッケはぜんぜん違うってみなさん喜ばれるのと同じです。えーっお客さん、まだホッケを召し上がってないんですか!ぜひ試してください。本当に違うんですよ」
搭乗時刻が迫っていたため、なんてこったい!という気持ちを抱えたまま機上の人となり、定刻ちょい過ぎに中部国際空港へ到着したのでした。

以上、長い旅でしたが、ホッケ以外は思う存分楽しんできました。


観光グルメうんぬんを抜きにしても、今年の YAPC は私にとっては本当に最高の YAPC でした。「これが本当に Perl のカンファレンスなのか」と思うような技術イベントではなく、Perl が好きで YAPC に参加する人たちの気持ちにしっかりと応えてくれるような内容だったのが何よりも嬉しかったです。
運営・スポンサー・発表者の皆々様、ありがとうございました!

*1:2日目の宿は念のため確保しておいたのですが、搭乗できると分かった段階で油断してキャンセルしてしまったのでした

YAPC::Hokkaido 3日目にシェアオフィス クロッカスさんのお世話になりました

YAPC::Hokkaido 2016 SAPPORO の居残り組になり、@shinotra さんと クロッカス さんのご厚意に助けられたので、そのときのレポートです。

お世話になるまでの経緯

Twitter#yapcjapan ハッシュタグをチェックしていた方は、月曜朝の
@shinotra さんのこちらのツイートをご覧になったことと思います。

なんて粋な取り計らい!
私も見ました。が、その日は勤務日で、私の身体は布団の中。急いで起床・移動しても、弊社出勤タイムリミットの 11:00 に間に合いません。
あきらめて朝食をとるなどして、ベッドの上へ。PC を膝の上に載せて、いざ出勤。

わけぎ「おはようございます」
組長「わけぎさん帰れなかったんですよね?どこにいるんですか?」
わけぎ「ホテルです」
組長「TwitterYAPCハッシュタグをつけてシェアオフィスのツイートをされてる方がいましたね」
わけぎ「はい。行きたかったけど、昨晩遅くまで飲んでたので寝坊してしまいまして」
組長「」
弊社に寝坊を咎める文化は無いので、地方 Perl Monger のご厚意を、寝坊ごときのために袖にすることに呆れられたのでしょうか。

そういうわけで、普通にベッドの上で仕事をすること3時間半。膝の上のキーボードを叩くたびに画面が小刻みに揺れ、眼筋へのダメージがじわじわと蓄積し...。
眼病持ちにつき、これ以上の負担は危ないかなということで、弊社チャットで長めの休憩を宣言し、昼の予定を消化してからクロッカスさんのところへ移動を始めました。

シェアオフィス クロッカス さんにて

勝手に略してしまっていますが、正しくは 9locku's~クロッカス~ 北海道ビジネスサポートセンター さんです。有名な観光スポット、時計台のすぐ近くの9階建てのビルの最上階にあります。

エントランスを奥へ進むと...
f:id:wakegisky:20161214232940j:plain
あれっエレベーターが無い?
入り口まで引き返して今度は右手に進むと...あれっアコム
もうこの際だから、階段を見つけてそっちから行ったほうが早いんじゃないか。そう思いつつ入り口まで戻ると、エントランス奥の鏡が左右に割れて人が出てくるところでした。 (今思えば @shinotraさんご本人)

鏡の奥に乗り込んで 9階まで上がると、こんなドア。
f:id:wakegisky:20161214233024j:plain


とのことだったので、受付の男性にそう告げました。

わけぎ「やぷしーのほうからきました」
受付の方「...え」
わけぎ「あの、やぷしーのほうからまいりました」
受付の方「...はい?」
はにかむように微笑む受付の方。つられて微笑む私。

「○○さんの関係ですか?」と水をむけられて、事情をしどろもどろになりながら説明しようとしていると、奥から出てきた別の方が「札幌で昨日、YAPC っていう全国的なイベントがあったんです。@shinotraさんの紹介ということでいいと思います」と言ってくださり、受付で住所・氏名・名前・電話番号を記入し、案内されるまま奥へ。

こういう感じのスペースが広がっていて、好きなところに座るように勧めていただきました。

荷物を展開していると、@shinotra さんご登場。軽くご挨拶し、Wi-Fi のパスワードを教えていただくなどして、昼休憩終了。

フロアは暖かく、デスクは揺れず、大変快適でした。
それから、コーヒーメーカーとお菓子も。
f:id:wakegisky:20161214233116j:plainf:id:wakegisky:20161214233134j:plain
2日ぶりに美味しいコーヒーにありつくことができました。

シェアオフィスは @shinotra さんと同僚の方の他に、何人かの方が利用されていて、みなさん親切で和やかな方でした。
ときどき飛び交う会話には、Azure、Serverless、FlashPHP などなどの技術ワードが何度も登場し、Web 開発会社のオフィスそのものといった雰囲気で、静かすぎず、にぎやかすぎず、快適な環境の中、自分の仕事に集中することができました。ありがとうございました。

宣伝?

受付の方から「よかったら宣伝をお願いします」「はい、喜んで」という流れでパンフレットとカードをたくさん頂戴したのですが、北海道に行きそうな人が身近にいないので、ご希望の方の方がいらっしゃれば、名古屋土産人気 No.1 のうなぎパイ*1 を1枚添えて普通郵便で送ります。届くころには、おそらく面積比 50% くらいが粉々になりますが、どうぞお気軽に @wakegisky にお声がけください。

宣伝になるかどうかは分かりませんが、半日利用して抱いた勝手な印象からのおすすめ利用シーンを挙げておきます。

  • Web 開発の現場ってどんな感じか知りたい
    • Web 開発作業中のエンジニアさんたちの生の会話や、お客さん?との電話のやりとりを耳にすることができます
  • 生涯現役 Web エンジニアでいるための希望材料がほしい
    • 将来の自分が Web エンジニアを続けてる様子をイメージできない方に。
    • 天命を知る年齢の @shinotraさんが、現役バリバリで Web 開発される様子を見ることができます
  • たまには出社気分を味わいたい
    • リモートワーカーやフリーランスの方に。
    • 苦手な感じの作業がたまってしまったときに行くと、程良い緊張感で仕事が捗ると思います。「ホテルに缶詰になる」の応用のようなものです
  • Perl Monger とさりげなく出会いたい
    • いきなり *.pm とかに行くのはちょっと気が引けて...という方に。
    • @shinotraさんがまさに Perl Monger です
  • 北海道で起業するためのサポートがほしい
    • たぶん主にそういう方のための場所だと思います。詳しくは Web で。

日によって、@shinotra さんがご不在だったり、空席状況が違ったりするかと思いますので、実際にご利用になる際は、事前に何らかの方法で確認されると良いでしょう。
ちなみに、クロッカスさんのビジター利用料金は 3,240円/日で、月額料金のほうは 86,400円 8,640円 *2から。1,080円/日 という料金は、YAPC 居残り組のために @shinotra さんとオーナーのご厚意で特別に設定された金額とのことですので、ご注意を。

シェアオフィスを提供/利用中のみなさんから聞いたお話

せっかくなので、みなさんから聞いたことも。

  • Twitter によれば、まだ YAPC から帰れない人が他にもいるようだ
  • 日曜夜のフライトで新千歳空港から東京に行こうとした家族が、搭乗後に 3時間もの間、機内で離陸を待つことになった。結局、夜遅く飛んだ。今さら飛んでも東京での移動手段が無いと分かっているので、乗客達が「飛ばないでくれ」と祈る中で飛んでしまった。幸い家族は ANA のホテルに泊まれた。
  • 旭川発の飛行機は欠航になりにくい
  • 北海道には、8月の台風の被害がまだ色濃く残っている
    • 道東エリアが完全に分断され、高速道路だけいち早く復旧した
    • 鉄道もまだ復旧していないため、公共交通機関は高速バスの一人勝ち状態
    • 被害規模が大きすぎて国道全体の復旧は難しいだろうといわれている

以上、シェアオフィス クロッカスさんの利用レポートでした。

あのときいらした皆様、突然訪れた不審者を暖かくおもてなしいただき、ありがとうございました!

関連リンク

*1:うなぎパイは静岡県浜松市の名物ですが、定番の名古屋土産です。この夏、名古屋駅のキオスクからうなぎパイが姿を消したときは、別れを惜しむ声や、復活の兆し、復活を喜ぶ声などが続々とニュースになったほどです。

*2:すみませんすみません。勝手にお値段10倍にしてしまっていました...。正しくは 8,000円(税別) です。

Perl の基礎知識で実用プログラミング 〜旅情編〜

Perl5 Advent Calendar 2016 7日目の記事です。
昨日は @mackee_w さんの PerlのELVM バックエンドを実装してチューニングした話 でした。

今日のこの記事では、Perl 初心者さん向けに「Perl の基礎知識があれば、こんなに実用的なプログラムを作れますよ」という例を紹介します。

目次

開発動機

みなさんは、旅行の荷物とのおつき合いは順調でしょうか。
旅先で忘れ物に気づいて困ったり、その逆に、余計な物まで持参して荷物の重さに苦しんだりしたことはありませんか? また、荷造りの際に、何を持って行くべきかで毎度のように頭を悩ませていたりしませんか?

私はどれもこれも当てはまるのですが、どちからといわずとも、忘れ物よりは荷物の重さや選定で困っていました。
問題を自覚したのは、今年の夏のことです。青春18きっぷを10日分購入して、始発で出発し、旅先でも電車に乗り倒し、終電1本前で帰宅するというアクティビティに励んだのですが、「荷物はなるべく軽く小さく」というポリシーに反して、どんどん荷物が増えていく...

旅慣れている方なら、青春18きっぷ、始発、終電1本前というキーワードだけでお察しかもしれませんが、実はこの旅、けっこうシビアだったのです。移動に片道6時間とか9時間とかはザラで、戻ってくるのにも同じくらいの時間がかかるのですが、旅先でちょっと大きめに予定が狂うと、楽しみにしていた目的地を回れなくなったり、家に帰れなくなったりするわけです。
何度か肝の冷える思いをしているうちに、備えあれば憂い無し式にどんどん荷物が増えていき、ついには「リュックが重すぎて走っても前に進めなかったために電車を逃す」という珍しい体験をしました。

その後は、無駄な荷物を減らすために、持って行くべきものとそうでないものの峻別に真剣に取り組むようになったのですが、これがとんでもなく時間を喰う苦行でした。
旅の前提条件って毎回違うんですよね。短い旅と長めの旅と長い旅、PC の要不要、ドレスコードの有無、などなどなど。今挙げた条件の組み合わせだけで 3 * 2 * 2 = 12パターンですが、実際にはもっと細々した思い出しにくい事柄がいろいろと有り、条件はずっと複雑になります。
しかも、旅に出れば何かしら価値観に影響を受けるので、同じような条件でも必要な荷物はどんどん変化していきます。

この難題をどうにかするために、スプレッドシートの関数を駆使するなどして持ち物リストの作成やブラッシュアップにも励んでみましたが、結局、納得の行くリストは完成しませんでした。


と、そういうわけで、自分の頭で考えるのは諦めて、難題解決のための凄いプログラムを作ったのでした。

技術的トピック

「凄いプログラム」と聞くと身構えてしまう人のために、この記事やプログラムに登場する技術的トピックを挙げておきます。

Perl のハッシュ / 配列 / リファレンス / デリファレンス / サブルーチン / 標準入力 / ファイル読み込み / 正規表現 / ソート / eval (解説有り)
Perl以外で、TSV形式 (解説有り)

どうでしょう? 「凄いプログラムという割に、あんまり高度なことはやってなさそうだな」という気がしてきませんか? だとしたら正解で、この記事はあなたのような方のために書かれました。だいたいのところは理解できる内容になっていますので、安心して読み進めてください。

それでは、いざ、凄いプログラムの紹介へ。

凄い機能

  • 前提条件をヒアリングして、旅の内容にふさわしい持ち物リストを一瞬で作ってくれる
  • なんと、必要な数量まで教えてくれる

使い方

  1. ExcelGoogle スプレッドシートなどで所定のフォーマットのアイテムリストを作る
  2. TSV形式 (後述) で書き出す
  3. プログラムと同じディレクトリ (フォルダ) に items.tsv というファイル名で置く
  4. コマンドラインでプログラムを起動する
  5. 旅についての質問に次々に答えていく

たったこれだけで、その旅に必要な荷物のリストが完成するという仕組みになっています。

動作イメージ

続いて、動作イメージです。
データにリアリティがあるほうが凄さが伝わりやすいので、私秘伝のアイテムリストをサンプルとして使います。

旅の設定もリアルに行きます。ちょうど明後日から2泊3日の北海道遠征予定で、YAPC 参加ついでにちょっと足を伸ばして趣味スポットを訪れるので、そのための持ち物リストを作ります。

$ perl ./motteke.pl

で起動し、

何泊しますか? 自然数を入力してください。:

2 とタイプして Enter を押すと、

以下の質問は、該当する場合のみ'y'と答えてください。

と来るので、

IT系イベント?: y
スーツ?: 
仕事?: 
同行者?: 
寒い?: y
暑い?: 
未踏エリア?: y
洗濯?: 
田舎?: y
登山?: 
超寒い?: y
雨?: 
雪?: y
飛行機?: y

こんな感じで回答すると、即座に持ち物リストが出来上がります。少々長くなりますが、リスト全体を載せてしまいます。

--------------------
もってけリスト
--------------------
00 カバン スタンプ帳 * 1冊
01 カバン 傘 * 1本
02 カバン MacBook Pro * 1個
03 カバン iPhone * 1個
04 カバン 財布 * 1個
05 カバン ペン * 1本
06 カバン メモ帳 * 1冊
07 カバン 交通系ICカード * 1枚
08 カバン 名刺入れ (名刺入り) * 1個
09 カバン サングラス * 1本
10 カバン A5ファイル * 1枚
11 カバン ハンカチ * 1枚
12 カバン>茶ポーチ モバイルバッテリー * 1個
13 カバン>茶ポーチ ポケットティッシュ * 1袋
14 カバン>茶ポーチ 歯ブラシ * 1本
15 カバン>茶ポーチ 防水用ビニール袋 * 1枚
16 カバン>茶ポーチ カロリーメイト * 1個
17 カバン>茶ポーチ カイロ * 2個
18 カバン>半透明ポーチ MacBook 電源アダプタ * 1個
19 外泊袋 外出着 * 2日分
20 外泊袋 インナーの靴下巻き * 2個
21 外泊袋 替えハンカチ * 2枚
22 外泊袋>黒ポーチ Lightning・USB 変換アダプタ * 1個
23 外泊袋>黒ポーチ iPhone 充電アダプタ * 1個
24 外泊袋>透明ポーチ コンタクトレンズ * 2セット
25 外泊袋>透明ポーチ コンタクトレンズ保存液 * 2本
26 外泊袋>透明ポーチ 麺棒 * 6本

良い旅を!


もう1パターンいってみます。
これまたリアルな例で、前回の旅行です。登山かつ仕事かつ客先訪問という大量の荷物を必要とする3泊4日でした。

$ perl ./motteke.pl
何泊しますか? 自然数を入力してください。: 3

以下の質問は、該当する場合のみ'y'と答えてください。
IT系イベント?: y
スーツ?: y
仕事?: y
同行者?:
寒い?: y
日射し?: y
暑い?:   
未踏エリア?: y
洗濯?:   
田舎?: y 
登山?: y 
超寒い?: 
雨?:
雪?:
飛行機?: 

--------------------
もってけリスト
--------------------
00 - ビジネスバッグ * 1個
01 - トレッキングポール * 2本
02 カバン スタンプ帳 * 1冊
03 カバン 帽子 * 1枚
04 カバン MacBook Pro * 1個
05 カバン iPhone * 1個
06 カバン 財布 * 1個
07 カバン ペン * 1本
08 カバン メモ帳 * 1冊
09 カバン ノート * 1冊
10 カバン 交通系ICカード * 1枚
11 カバン 名刺入れ (名刺入り) * 1個
12 カバン サングラス * 1本
13 カバン A5ファイル * 1枚
14 カバン A4ファイル * 1枚
15 カバン ハンカチ * 1枚
16 カバン>財布 EX-ICカード * 1枚
17 カバン>財布 EX身分証明用クレカ * 1枚
18 カバン>茶ポーチ モバイルバッテリー * 1個
19 カバン>茶ポーチ ポケットティッシュ * 1袋
20 カバン>茶ポーチ ウェットティッシュ * 1袋
21 カバン>茶ポーチ 歯ブラシ * 1本
22 カバン>茶ポーチ カロリーメイト * 1個
23 カバン>茶ポーチ カイロ * 1個
24 カバン>半透明ポーチ MacBook 電源アダプタ * 1個
25 カバン>半透明ポーチ ディスプレイアダプタ * 1個
26 スーツケース>スーツ袋 スーツ * 1着
27 スーツケース>靴袋 革靴 * 1足
28 外泊袋 シャツ * 1枚
29 外泊袋 外出着 * 3日分
30 外泊袋 インナーの靴下巻き * 3個
31 外泊袋 替えハンカチ * 3枚
32 外泊袋>ネガネケース メガネ * 1本
33 外泊袋>黒ポーチ Lightning・USB 変換アダプタ * 1個
34 外泊袋>黒ポーチ iPhone 充電アダプタ * 1個
35 外泊袋>黒ポーチ 目薬 * 1本
36 外泊袋>透明ポーチ コンタクトレンズ * 3セット
37 外泊袋>透明ポーチ コンタクトレンズ保存液 * 3本
38 外泊袋>透明ポーチ 麺棒 * 9本

良い旅を!

上が 26件で下が38件。実はサンプルのリストからは、公にしたくない趣味の品々などを除外してあるのですが、それでもけっこうなボリュームです。これらの一つ一つについて、都度自分の頭で要不要を判断していたころには、もう戻れそうにありません。この凄いプログラムは、はっきり言って、めちゃ便利です!

アイテムリストリスト

さて、ここからは、技術的な話が増えてきます。

プログラム本体の説明に入る前に、アイテムリストについて説明します。
まずはサンプルのアイテムリスト をご覧ください。

4列からなるスプレッドシートで、左から順に

A列 "入れ物"
B列 "品名"
C列 "数量"
D列 "単位"

となっています。

論理演算子三項演算子

2行目以降のデータ行を見ると、C列 "数量" の内容がただの数字ではないことにすぐ気づかれると思います。
いくつかのデータについて、その意味を表にまとめます。

品名 数量 単位 説明
財布 1 財布を1個持って行く
コンタクトレンズ保存液 泊数 セット N泊するならレンズをNセット持って行く
革靴 スーツ ? 1 : 0 スーツを着るなら革靴を1足持って行く。着ないなら革靴は不要
雨合羽 (登山 && 雨) ? 1 : 0 登山をするときに雨ならば1枚持って行く。それ以外の場合は要らない
ウェットティッシュ (登山 || 暑い) ? 1 : 0 山に登るか、もしくは暑い時期なら 1袋持って行く。それ以外の場合は要らない

'&&' や '||' は Perl や他の言語の論理演算子と同じ働き、'?' や ':' は三項演算子と同じ働きをしています。日本語の説明と見比べてみると、演算子を用いることで、簡潔で紛れのない表現に落とし込めていることが分かりますね。

もうちょっと大げさに比較するなら、こんな感じでしょうか。
「いくつ要るの?」
「えーっと、山に登るときとか暑いときは1袋で、じゃなかったら要らない」
「『じゃなかったら』はどこに掛かるのか。正確に要点だけを言え」
「 (登山 || 暑い) ? 1 : 0」

TSV形式

使い方の項でもちらっとふれましたが、アイテムリストは TSVという形式で保存します。

Google スプレッドシートの場合
ファイルメニュー>形式を指定してダウンロード>タブ区切りの値 でTSV形式でダウンロードできます。
Excel の場合
では、名前をつけて保存の "フォーマット" で "タブ区切りテキスト" を選択することで、任意のシートをTSV形式で保存できます。

TSV形式というものを知らなかった方も、ここまでで何となくお察しのことと思いますが、TSV というのはタブ文字区切りのテキストデータのことです。データの区切りをカンマで表現する CSV と似たようなものですが、下記のように違います。

CSV
データをカンマで区切ったりクォートしたり、場合によってはエスケープしたりする
TSV
単純にタブ文字で区切るだけ

今回のプログラムでは、簡単にデータを読み込むために、シンプル仕様のTSV形式を採用しました。

# 改行文字を外して \t で split するだけでデータを取り出せる
chomp($line);
my @cols = split(/\t/, $line);

プログラム

続いてプログラム本体についての説明です。

ソースコードこちらに置いてあります。
全体の処理の流れは、文章で説明するよりも、main サブルーチンのコードを見てもらったほうが掴みやすいと思います。

sub main {
    # TSVファイルからアイテムデータを読み込む
    my $file_path = './items.tsv';
    my $items = load_tsv($file_path);
             
    # C列"数量"に登場する言葉を、ユーザーに確認するために取り出しておく
    my $words = get_words($items);
             
    # ユーザーから旅の条件を聞き出す
    my $conditions = ask_conditions($words);
                                                                                                                                            
    # 各アイテムの必要数量を求める
    calculate_quantities($items, $conditions);
             
    # 持ち物リストを出力する
    print_item_list($items);
             
    print "\n良い旅を!\n";
}

ソースコード内に難しい構文は有りませんが、データ構造が少し複雑なので、戸惑われる方もいるかもしれません。&main に登場する $items, $words, $conditions という3つの変数について下記にまとめるので、読解の参考にしてください。

$items

「TSV ファイルから読み込んだ内容」のハッシュの配列のリファレンス。

[                    
  {                  
    container        => 'カバン',
    quantity         => '(IT系イベント || 仕事) ? 1 : 0',
    unit             => '個',
    name             => 'MacBook Pro',
    numeric_quantity => 1,
  },                 
  {                  
    container        => 'カバン',
    quantity         => '1',                                                                                                                
    unit             => '個',
    name             => 'iPhone',
    numeric_quantity => 1,
  },                 
  (中略)             
]  

numeric_quantity は、calucurate_quantities($items, $conditions) に追加されるキーで、値は最終的な必要な数量です。

$words

「$item の quantity キーの値から取り出した言葉」の配列のリファレンス。

['IT系イベント', '仕事', (中略) , '泊数']                                                                                          

$conditions

「ユーザーから得た条件群」のハッシュのリファレンス。
"泊数" 以外のキーの値は、条件を満たす場合は 1、満たさない場合は 0 になります。

{                      
  '泊数'         => 2,                                                                                                              
  'IT系イベント' => 1, 
  'スーツ'       => 0, 
  '仕事'         => 0, 
  (中略)               
}

最後に

初心者さん向けの Perl プログラミング勉強会などで「シンタックスは学んだけど、この知識をどう活かせばいいのかが分からない。もっといろいろなことを勉強しないと何もできない気がする」という声をときどき聞くので、基礎知識でできることの一例を紹介しました。
この記事が、どなたかが何かを作り始めるきっかけに繋がれば幸いです。

なお、私 @wakegisky は、Perlガイド東海の主催者の一人として、初心者さん向けのプログラミング勉強会を名古屋で不定期開催しています。お近くの方は、もしタイミングが合えば、ぜひ Perlガイド東海のイベントにお越しください。主催者一同、お待ちしておりますので!


明日の記事は、だれか氏 (未定) の何か (未定) です。だれか氏〜〜!

YAPC::Asia 2015 2日目に参加しました

書くのが遅くなってしまいましたが YAPC::Asia 2015 最終日の参加記録。
前夜祭1日目 に続いて、2日目にも参加してきました。

Mackerel開発におけるScalaとGo、そしてPerl - YAPC::Asia Tokyo 2015

@songmu さんのセッション。Mackerel で使っている言語の特徴・使いどころや、Scala , Go の Perl との比較の他に、Mackerel のための CPAN モジュール紹介や、Perl の強みについて。

自分は今も Perl メインで開発していて、Perl の仕事がなくなったらどうしよう、他の言語をちゃんと好きになれるだろうか、というような漠然とした不安を抱いていたので、適材適所の言語選択の一環として Perl も選んで強みを活かすという形にグッと来ました。

サーバーサイドエンジニア(特にPerl)のためのiOSアプリ開発入門 - YAPC::Asia Tokyo 2015

@typester さんのセッション。
Swift 2.0 と Xcode 7 で iOS 開発の敷居がずいぶん下がりましたよというお話から始まって、PerlSwift の違いや、Foresqure API を叩くアプリのライブコーディングなど。

特に印象に残ったお話:

  • サーバサイドエンジニアが iOS アプリを作り始めるなら、最初から完璧なものを作ろうとしないほうがいい。クライアントサイドではなるべく手抜きをして、サーバサイドで本領を発揮する形が入りやすい。サーバサイドで頑張れば、クライアントサイドからちょっと呼ぶだけで良いものができる
  • iOS なら作ったものを見せやすいから、モチベーションを保ちやすい。変なものを作って持って行って「馬鹿じゃないの」と言われると承認欲求が満たされる
HTTP2 時代の Web - YAPC::Asia Tokyo 2015

@jxck_ さんの HTTP/2 セッション。
HTTP/2 を理解した上で導入するのは有りだけど、導入しないのも有り。必要性や技術的問題を見極めた上で自分たちで考えて決めて行く事なんだ、という語り口でした。導入するという前提ありきで考えようとしてたので耳が痛かった...

自分が回った中で、最も席の競争率が高いセッションでもありました。
必ず混むだろうという確信があったので、早めに行ってドア付近で待つ作戦でしたが、開始15分前の時点ですでに長蛇の列。なんとか会場には入れたものの、椅子には座れないという盛況っぷりでした。

LT

1日目は会場に入れず、ドアの外から音だけ聞いたような感じだったので、2日目は早めの移動を心がけて前のほうに着席。
どのトークも最高に面白くて、特に bot さんと電話とモールス信号と CONBU さんがすごかった!

クロージング

ベストトーク賞は、発表順に

3位 @kazuho さん
HTTP/2時代のウェブサイト設計 - YAPC::Asia Tokyo 2015
2位 @jxck_ さん
HTTP2 時代の Web - YAPC::Asia Tokyo 2015
1位 @hitode909さん
Perlの上にも三年 〜 ずっとイケてるサービスを作り続ける技術 〜 - YAPC::Asia Tokyo 2015

ひとでくんさんの Perl トークが1位! ということで胸熱でした。

クロージングの後

真っ赤な YAPC Tシャツを着たまま、同じく真っ赤な @nqounet さんや 真っ黄色な巨大リュックを背負った @issm さんと東京駅へ。非常に派手派手しい一団だったので、待ち合わせ余裕でした。
懐かしい方々やその同僚さんなどと技術周辺話で盛り上がりつつ飲食して、帰りは @nqounet さんに「Perl と心中したいくらい好きだったんです」とこぼしたり「心中は違うでしょう」と諭されたりしながらホテル周辺まで。

最後に

まとめに代えて YAPC::Asia 2015 参加前後での心境の変化を。

Perl の仕事がなくなったらどうしよう
-> 他言語を楽しみつつ、隙あらば適所で Perl を楽しめば良い

技術書が高くて悩ましい
-> 悩まず 1-Click すれば良い

*.pm へ行きたいけど旅費が
-> 稼いで行きまくれば良い


自分にとっても大変意義深いカンファレンスで、やはり YAPC::Asia は最高でした。

牧さん始め関係者の皆々様、ご尽力ありがとうございました。

YAPC::Asia 2015 1日目に参加しました

前夜祭 に続き、1日目に参加しました。

茶色いほうの YAPC Tシャツを着て Perl の print 文バッグを持ち、好きな格好で堂々と出歩けるなんて最高だなあと浮かれつつ出発。

オープニング

牧さんによるオープニングトーク。良いお声でした。

メリークリスマス! - YAPC::Asia Tokyo 2015

Perl 5 をホビット物語に、Perl 6 を指輪物語になぞらえて、トールキンPerl のお話を 4:6 くらいの割合で。
どうして今の時期にメリークリスマスなのかと思ったら、ずいぶん昔の「Perl 6 はクリスマスまでに完成します」という宣言のクリスマスがついに今年やって来るかもしれないそうです。

DeepLearning の前に知っておくことがある! 再帰型のニューラルネットワークや自己組織化マップについて語ろう - YAPC::Asia Tokyo 2015

DeppLearning 以前のお話。興味はあったのですが、SOM の近傍の説明あたりからついていけなくなってしまいました。前のほうの良い席をとってしまって申し訳なかった...

それは僕たちのドメイン・DNS運用 - YAPC::Asia Tokyo 2015

趣味ドメインを管理できてなくてつらいので、良い方法を求めて聞きに行きました。

内容は、カヤックさんにおけるドメインDNS運用の歴史と、関連サービスや技術の解説、組織における運用の心得。
暖かみのある運用(フル人力作業)から、Google Form + Spreadsheet による管理 -> Route53 への移行 -> roadworker の導入 -> 継続的デリバリーと、段階的に高度になっていくので分かりやすく、まずはワンステップだけでも前に進んでみようかなと思える内容でした。

ランチタイム

2階ローソン前でおにぎりとコーヒーを一人で黙々と。
向かいの席にも隣りの席にも、YAPC ストラップをつけて黙々と食事をしてる人がいて、結局声はかけなかったのですが、せっかく居合わせたのにもったいなかったなあと。

HTTP/2時代のウェブサイト設計 - YAPC::Asia Tokyo 2015

kazuhoさんのセッション。
HTTP/1.1 の問題や、HTTP/2 のプロトコル・優先度制御・サーバプッシュ、メジャーブラウザの対応状況、H2O の強みなど。
HTTP/2 なんてまだまだ先の話だろうと思っていたら、すでに FirefoxChrome は対応済みで、秋には Safari も対応予定とのこと。何も知らずに聞きに行ったので、衝撃が大きかったです。

うっかりをなくす技術 - YAPC::Asia Tokyo 2015

安全工学の観点も取り混ぜた、うっかり削減技術。
小さな事もおそろかにせず、地道にやっていくしかないのですね...という当たり前なんだけどあんまり嬉しくない事実を再確認したものの、実はそれってけっこう楽しいことなんじゃないかと後から思い直したりして、このセッションは半年間隔とかで聞き直してみたいです。

紹介された本:
Amazon.co.jp: The Art of Readable Code (Theory in Practice): Dustin Boswell, Trevor Foucher: 洋書

懇親会

Larry Wall 氏にサインをいただきました。感激で涙が出そうになるのをこらえたら代わりに胃酸が出まくって胃痛で悶えました。


残る2日目の参加ブログも今日書くつもりでしたが、やっぱり明日書きます。

YAPC::Asia 2015 前夜祭に参加しました

今さらながら、 YAPC::Asia 2015 前夜祭の参加記録です。
折しも本日は8月31日。夏休みの宿題提出に失敗し続けた子供の頃のことを思い出します...

さて前夜祭ですが、今回が最後の YAPC::Asia になるかもしれないとのことで、風邪など引かぬように気合いを入れて当日を迎えました。ところが気合いの入れ方が間違っていたのか、朝から体調不良に見舞われてしまい、回復しないまま会場へ。道中の冷房が何よりもつらかったので、個人スポンサー特典の長袖パーカーはひたらすらありがたかったです。

以下、聞きに行ったセッションと感想を簡単に。

PHP帝国の逆襲!(を願うPHPerが話す最近のPHPについてのクイックツアー PHP7対応版) - YAPC::Asia Tokyo 2015

PHP7 や PSR-7 の真面目なお話。
勢いのある楽しいトークと、おそらくビール&つまみ効果で会場が盛り上がって、祭り!という雰囲気でした。

はてなブックマークのトピックページの裏側 - YAPC::Asia Tokyo 2015

はてなブックマークのトピックページの裏側、Elsticsearch を利用したトピック生成と、自然言語処理によるトピックタイトル生成について。

自分にとっては興味はあれども全く馴染みのない分野なので、ついていけるかどうかが心配でしたが、「首相官邸にドローン落下」「スイスフラン高騰」など、具体例をベースにした分かりやすい解説で最後まで興味深く聞く事ができました。
ただ、その難易度のほうは全く想像できなかったので、機会があれば Elasticsearch だけでも自分で試して苦しんでみたいです。

技術ブログを書くことについて語るときに僕の語ること - YAPC::Asia Tokyo 2015

はてなブックマークのブクマ数を伸ばす技術や、最後まで読んでもらえる記事の書き方、ブログの続け方・モチベーションの保ち方など。
自分は今はブログ自体を書けていないですが、単なる Tips ブログから一歩進むための内容の深め方についてのお話が特に良かったです。

  • 1ヶ月でネタを考えて、2〜3日で書く
  • ある技術について調べて分かった気になって、でもよく分かってないからまた調べて、しばらくしてまた調べることになって...というふうに、分からない→調べるを繰り返して深めてた知識・理解を書く

あと、神は細部に宿るというテーマの中で、有名な 理科系の作文技術 が薦められていて、半年くらい前から机の袖に積んでる本なので、おっ!という感じでした。


前夜祭りについては以上です。
続きの1日目と2日目の分は明日書きます。

nodebrew で Node.js と npm の簡単インストール

npm を使う必要があって重い腰を上げてインストールを試みたら、びっくりするくらい簡単だったので初ブログ。

1. nodebrew のインストール

node のいろんなバージョンを手軽にインストールしたり切り替えたりするために nodebrew をインストール。
以前使ったことがあるのは nvm (Node Version Manager) なんだけど、nodebrew のほうがパスが綺麗だからという理由で nodebrew にしてみたら、簡単だった。本当にびっくりした。

hokaccha/nodebrew · GitHub
ドキュメントも充実してて至れり尽くせり。

nodebrew はコマンド一発でインストールできる。

~$ curl -L git.io/nodebrew | perl - setup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 20087  100 20087    0     0  11314      0  0:00:01  0:00:01 --:--:-- 2452k
fetching nodebrew...
install nodebrew in $HOME/.nodebrew

========================================
Add path:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

上の通りにパスを通す。

~$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
~$ source ~/.zshrc

bash 使いの人は ~/.zshrc ではなく ~/.bashrc に。
Mac の場合は ~/.bash_profile でパスを通す必要がある らしいけど未確認。

2. node と npm のインストール

最新の安定板をインストール。

~$ nodebrew install-binary stable
fetch: http://nodejs.org/dist/v0.10.33/node-v0.10.33-linux-x64.tar.gz
######################################################################## 100.0%
Install successful

nodebrew list でインストール済みバージョンを確認できる。

~$ nodebrew list
v0.10.33

current: none

利用するバージョンを切り替えるには nodebrew use。

~$ nodebrew use v0.10.33
use v0.10.33
~$
~$ nodebrew list
v0.10.33

current: v0.10.33
~$
~$ node -v
v0.10.33

npm もいっしょに入ってた。

~$ npm -v
1.4.28

インストール完了。
すごい簡単!

npm とは

npm が何をするものなのか思い出せなかったので、ついでに軽くググった。
npm (software) - Wikipedia, the free encyclopedia
Node.js の標準のパッケージマネージャで、node のバイナリに bundle されてるものらしい。

本家ドキュメントはここ。
https://www.npmjs.org/doc/