プログラミング入門者向けのサンプルコードで異なる名前を付けられるはずの複数の変数に同じ変数名を付けてしまう問題

Perl入学式の受講生だった5年前にも同じようなことを言っていたので変わってないな自分・・と思うとともに、この問題じたいがある種普遍的なのかな、という気も。

以下、掲題の件について簡単にまとめてみたいと思います。

Rubyで言うと、たとえばこんなサンプルコード。

class Foo
  def initialize(name:, price:)
    @name = name
    @price = price
  end

  def show
    return "#{@name}: #{@price}"
  end
end

bar = Foo.new(name: "apple", price: 100)
puts bar.show

結果は以下。

apple: 100円

引数としてクラスの外部から内部へ値を受け渡すためのname, priceと、クラスの内部でその値を操作するインスタンス変数のname, priceがそれぞれ別の変数であるにもかかわらず同名で記載・使用されています。

こういったことはPerlの入門者向けサンプルコードでも起こりがちで、なにしろPerlではスカラー変数でも配列変数でもハッシュ変数でも、それぞれ別の変数なのに同じ単語を使えるので、たとえばこんなことになります。

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';

my $apple = 100;
my @apple = (101, 201);
my %apple = (foo => 102, bar => 201);

say $apple;
say $apple[0];
say $apple{foo};

結果は以下ですが、

100
101
102

問題は、この中の

say $apple;
say $apple[0];
say $apple{foo};

と並んでる3つの「$apple」は全部別物だということですね。まったく相互の関係はありません。

これ、混乱しませんか??

ぼくは初心者のときにこう思いました。「なんでわざわざ同じ名前付けるの!?」

上記の例で関係がある(同じ変数名でなければいけない)のは、以下の組み合わせです。

# 配列とその要素

@apple
$apple[0];
# ハッシュとその要素

%apple
$apple{foo};

同じ変数名を使うなら、こうした「同じ変数名でなければいけない組み合わせ」に限るべきで、なぜわざわざ配列とハッシュを同じ変数名にするのだ・・とただ苦しむばかりでした。

まあ実際には、ぼくもやがて初心者を卒業というか、初心者であることに飽き始めた頃、「なるほど、コードを書くときはこんな風にいろいろ揃えてしまった方がラクに感じることもあるのだな」と理解するようになりましたが、とはいえ、初心者にこれは酷だろうという気持ちには今も変わりはありません。

では、そのPerlのコード、どう直したら読みやすくなるでしょうか?
一例ですが、こんな風にすればどうかと思います。

#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';

my $apple = 100;
my @orange = (101, 201);
my %lemon = (foo => 102, bar => 201);

say $apple;
say $orange[0];
say $lemon{foo};

これだったら、どの変数がどこに動いているのか。それぞれの代入した値がその後にどこで使われているのか、追いやすくなります。

ようは、「同じ変数名でなければいけないものだけ」を同じ変数名にするということです。

コードには色が付いていません*1。そのようなとき、色分けをする代わりに適切な変数名*2を付ける必要があるのではないか、と思うわけです。

上記を踏まえて、あらためて最初のRubyの例に戻りますが(再掲)

class Foo
  def initialize(name:, price:)
    @name = name
    @price = price
  end

  def show
    return "#{@name}: #{@price}"
  end
end

bar = Foo.new(name: "apple", price: 100)
puts bar.show

これ、たとえば以下のようにすると、どの値がどの変数を通してどこへ動いているのか、わかりやすくなると思います。

class Foo
  def initialize(name_arg:, price_arg:)
    @name_var = name_arg
    @price_var = price_arg
  end

  def show
    return "#{@name_var}: #{@price_var}"
  end
end

bar = Foo.new(name_arg: "apple", price_arg: 100)
puts bar.show

この問題、ようは読み手のトレースする力の程度に合わせる、ということなのだと思います。コードを書いているプログラマー自身は、どの変数がどの値を抱えているのか、頭の中ですでに追えている状態なので、変数名によって値の経路を示す必要はもうなくて、むしろ別の理由、たとえば異なる中身を持った変数同士が同種の属性や役割を背負っていることを示すために、同じ変数名を付けてカテゴライズしておきたい、みたいな考えがあるのかもしれません。

しかし入門段階の人は、普通はそういったトレースをする力が十分にはないがゆえに、変数の名前からその中身の値を想像しようとしますから、異なる値・異なる変数であるにもかかわらず同じ名前がついていると、混乱が生じやすいということではないかなと。

このあたりの問題を認識した上で、その状況に応じてどうするべきなのか(異なる中身を持つ変数同士に同じ名前を付けるのか、それをしないのか)を考えられると、より良いかたちで書き手と読み手のコミュニケーションが成立しやすくなるのではないか、と思っています。

*1:エディタ等のシンタクスハイライトで色を付けることはできますが、それは個々の設定によるので、結局書き手が見ているのと同じ色付けを別の読み手が見ることはできません。

*2:ここで言う「適切さ」とはそのコードが読み書きされる背景によって変わるものだと思います。プログラマーの間だけで読まれる前提ならば、上記のような配慮は不要かもしれません。ここではあくまで「入門者にとって適切な」変数名について書いています。

YAPC::Tokyo 2019 に参加しました

2019/01/26(土)に開催されたYAPC::Tokyo 2019に行ってきました。

以下、順不同に(思い浮かべた順に)感想を書いていきます。

本編

tokuhiromさん

いきなり最後ですが、tokuhiromさんのキーノート、とても良かったです。

以前にもtokuhiromさんのトークYAPCで聞いたことがありますが(Perl6の話をしていたような)、そのときの印象と変わらない落ち着いた話しぶり。

過去を振り返る流れでいろんな写真が出てきたのも良かったです。何度か直也さんの名前や写真が出てきたのも共感するところがありました。あのサトちゃんのアイコンじゃない顔写真だったのが良かったな、と。

tokuhiromさんのスライドはこちら。

www.slideshare.net

LINEさんの振り返りブログでも紹介されていました。
engineering.linecorp.com

大仲さん

はてな id:onk さんの「Perl on Rails」。超よかったです。ぼくが先日入社したヴェルクRailsを使っているので、逆方向の関心にもとづいて聞けたというか。

予定より早く終わっちゃったと言っていましたが、その分後半は藤井さん(?)とのかけ合いが第2部みたいになっていて、トクした気分で聞きました。

mixi 萩原さん

ランチセッションのmixi編、なんと21才(でしたっけ)の入社間もない萩原さんのトークも大変聞きやすい丁寧な話しぶりで楽しく聞きました。

speakerdeck.com

mixiさんの振り返りブログはこちら。
medium.com

後述の自分のLTの不安定感を思うと、「この差は一体・・」というぐらいの落ち着きを感じましたが、ん〜、練習量とかが違うのかなあ。

Perlの話も随所に入っていて、最後まで興味が持続しました。「若い人がPerlを使ってるという話をしたら、既存のコミュニティの人たちが喜ぶのでは」という目論見は見事に当たったのではないか、と思います。

深沢千尋さん

深沢さんはぼくの恩師とも言えるPerl入門書の執筆家で、これまでもこのブログでは事あるごとに深沢さんの著書を紹介してきました。

深沢千尋 の検索結果 - the code to rock

今回はその中でもとくに思い入れが深い『すぐわかるオブジェクト指向Perl』を持参して、サインしてもらいました。

すぐわかる オブジェクト指向 Perl

すぐわかる オブジェクト指向 Perl

前夜祭や懇親会でもいろいろ思いの丈を伝えられて、嬉しかったです。深沢さんの本はある種、革命的に丁寧で、かつその文体もオンリーワンのオリジナリティで、誰も真似できない唯一無二の著者だと思います。

ランチセッションも楽しく聞きました。途中で北野宏明さんの名前が出てきましたが、たまたまぼくが今やっている編集仕事(春頃にWebで公開予定のコチラ採録記事)の関係で北野さんのことを少し調べていたので、不思議な縁だなと思いながら聞いていました。

hitodeさん

この辺りの時間まではずっと下のホールで聞いていましたが、後述のtecklさんの話を聞きたいなと思ったので、上の階に上がってRoom1に入ると、この界隈で知らない人はいないhitodeさんの発表が始まるところでした。

*発表資料はこちら。はてなブログの記事がそのまま資料になっている・・。
blog.sushi.money

WebVRの話ということで、ヘッドマウントディスプレイの実物が回覧されてきたので装着しましたが、これはビックリの面白さでした。上下左右の360度に対して画像・映像が付けられていて、下を見たらフワ〜って布団に寝たhitodeさんが浮き上がってきてこっちにぶつかって、そのまま空に舞い上がっていくという仕掛け(?)が施されていて衝撃でした。ああ、面白かった。

わいとんさん

hitodeさんに続いて、Perl入学式でもその初期からずっとお世話になっているわいとんさんの発表を聞きました。

*スライド&振り返りブログはこちら。

YAPC::tokyo 2019で登壇しました – Wyton

内容的にはぼくには全然難しいんだけど、とにかくデモの進行上想定外のことが起きても、そのつどそれに備えて用意していた第2案、第3案を次々と出してリカバーしていくのが本当、すごいなあ・・と思いました。

それらの準備されていた代案、もちろん使わずに済めばそれに越したことはないわけですが、でも使わざるをえない状況になったことで「ひえ〜、そんなところまで用意してたんだ」と知れるわけで、その意味ではわいとんさんの思考の深さを窺える発表だったのではないかと思います。

tecklさん

シーサー社のtecklさん。最初に知り合ったのはYAPC::Okinawaでぼくの少し前に同じ会場で発表されていたときで、その半年ぐらい後、buildersconの懇親会でゆっくりお話しできて、そのときにはPerlの初級〜中級あたりのあれこれについてお聞きしました。

tecklさんはベテランの貫禄というか、終始ゆったり柔らかい調子で話が進んでいって、リラックスして聞きました。内容的にも俯瞰的な広い見方から年代ごとの細かい差分までいろいろな情報が組み込まれていて、面白かったです。

Songmuさん

LTの時間が迫ってきたので、最後の20分はホールで・・と思ったらSongmuさんの発表でナイス!でした。

*上記のhitodeさんもそうでしたが、今回は全然事前にタイムテーブルを確認してなくて、毎回「次はどうしようかな」と行き当たりばったりに部屋に入っては登壇者を知る感じでした。

いろんなトピックや描写がありましたが、やはり印象に残ったのは失敗経験のところでした。

ぼく自身は、アウトプットすることは必ずしも良いことばかりではなくて、むしろそれは失敗する可能性をゼロから1以上にする、という後戻り不能なスイッチを入れてしまうことだから、いかにそれが良い結果をもたらす可能性が高かったとしても、それを「絶対やるべき」とか「どんどんアウトプットしろ」みたいなことを、少なくとも他人の立場から無責任に言うのは違うかなと思っています。

その失敗によって損害をこうむるのは行為者自身であって、勧めた人は1ミリも影響を受けないわけなので、たとえば上司や同僚のように同じリスクを背負う立場で言うならアリかもしれませんが、結局アウトプットとはそういう失敗と不可分なものとして存在していて、だからこそ紛れもない価値があるのだよな・・なんていうことを、その話を聞きながら考えていました。

他にもいろいろと知っているようで知らないことが語られていて、楽しかったです。ベストトークはSongmuさんに入れました。

www.songmu.jp

広木大地さん

ゲストスピーカーの広木さんの発表も聞きました。場馴れしてらっしゃるのか、すごく聞きやすい話で、スライドも要領を得た見やすい構成でした。

speakerdeck.com

事前に著書の『エンジニアリング組織論への招待』を少し読んでいましたが、まだ全部は読み切れていなくて、でも内容的には重なるところが多いようだったので、相互補完的に聞けたかなと思っています。

予習のようにポッドキャストEMFMも聞いていましたが、せっかくならやっぱりもう少し本を読み込んでからの方がより面白く聞けたかなとも思っています。

とりあえず、続きを読んでからまたスライドを見直してみたいと思います。

yoku0825さん

一瞬、懇親会に飛びますが、今回発表もされた@yoku0825さんとも少しお話ができて嬉しかったです。

yokuさんはぼくがエンジニアのコミュニティに飛び込み始めた超最初の方、Chiba.pmに参加したときに初めてお会いして、その意味ではPerl入学式のサポーター陣に次ぐ長いお付き合いです。

今でも覚えているのは、ぼくがChiba.pmで自己紹介的なLT(Perlを勉強してます、的な)をした後に、yokuさんから「データベースに関心はありますか?」という質問があって、それは場が湧いたのでぼくも嬉しかったんだけど、でもデータベースの勉強なんてまだまだ先の話で、そもそもプログラミング自体いつまで続けられるかわからないよな・・と思って「関心はあるけどまだ先の話」なんて生真面目な回答をした記憶があります。

気がつけばそれから5〜6年経って、ぼくはまだプログラミングをしていて、続けているどころかYAPCに登壇したり、むしろ勢いは増しているようで、データベース、現時点では直接的な必要性はないにせよ、近いうちに勉強できるんじゃないかなという予感もあったので、そういう話をしたりしました。

LT狂騒曲

本編のトークがすべて終わって、tokuhiromさんのキーノートの前にLTが行われました。

LTの参加に至る流れや詳しい発表内容については、別記事にまとめていますので、ぜひどうぞ。

note103.hateblo.jp

そちらの記事に書きそびれたこととしては、採択が決まった後、ネタ自体はだいたい揃っていたのですが、どうしてもオチまでの流れが決まらなくて、結局当日の朝になっても固まらなかったので、通常ならちょっとあり得ないことですが、YAPC本編が始まった後も前夜に泊まっていた浅草橋の宿でそのままずっとスライドを作っていました。

今までも寝坊して午前のトークを聞きそびれるとかはあったのですが、自分のスライドを作るためにオープニングをスルーしたのは初めてでした。

ただ、tokuhiromさんのキーノートの中で「日本人はトークを真面目に見過ぎ。せっかくいろんな人が集まってるんだから、Hallway Trackみたいな感じで適度にパスしたらいい」みたいな話もありましたし、その意味では日本人参加者としては理想的な態度だったのでは、とも・・(ちがうか)

なんとか内容がまとまって、最後に1回通しで練習しました。おそらく通しの練習ができたのはその前も含めて計4回ぐらいだったと思いますが、結局一度も5分には収まらなくて、かえって不安が高まりました。

Songmuさんのトークが終わりに近づいて、そろそろLTか・・と緊張がみなぎってきた頃、発表前にスライドをアップしておくか(&Twitterにもハッシュタグ付きで知らせておくか)、ちょっと迷いました。

事前に公開しておけば、後ろの方でスクリーンをちゃんと見れない人もついてきやすいかな、と思ったので。

でも実際には、会場後方にもモニターが用意されていて、これがあれば大丈夫かなと思ったのと、「このスライドは今この会場に集まっている人たちに優先で見てほしいな」と思ったので、事前の公開はやめました。

ようは、会場にいる人たち、自分と同じ時間・同じ場所を共有している限られた人たちを、えこひいきしようと思ったわけです。

真っ白な夢の中を爆走するように発表し終えて、あらためてその仕上がりを今の頭で振り返ってみると、上記の解題にも書いたとおり、実感的には理想の3割ぐらいの出来でした。その意味では、失敗です。

でも、やらなかった場合に比べたら30倍ぐらいやって良かったと思います。その意味では成功でした。

終わりに

ということで、時系列も内容もめちゃくちゃな感じですが、当日の感想を記してみました。

たった1日の本編ではありましたが、YAPC::Japanシリーズに通底するローカルな手作り感と、伝統ある雰囲気が魅力的にマッチした、良いイベントでした。

最後の id:kfly8 さんによるクロージングもよかったですね。一旦引き受けて、でもやめて、でもまた別の形で借りは返した、みたいな。

ついでの話ですが、ぼく自身も20代半ばから後半ぐらいだったか、自分で自分に呪いをかけて、でもその呪いを自分で解いて、みたいなことがありました。当時のぼくはそれを一生やっつけられないだろうとほとんど諦めていましたが、あるとき村上春樹さんの「七番目の男」という短編(『レキシントンの幽霊』所収)を読んで、「やっぱりこれは自分で落とし前をつけなきゃ駄目なんだ」と思ってなんとかやっつけて、自分を解放できました(スピリチュアルっぽく言いましたが、泥臭いプライベートな話です)。

イベント全体をふと思い返すと、会場でtokuhiromさん、Yappoさん、xaicronさん、弾さんといったオールスターをひと目に見られたのも何だかハッピーな感じでした。

tokuhiromさんの写真の中で、東工大でしたか、芝生でnipotanさんやkazuhoさんも含めてにこやかに語らっているシーンが写って、うわーレジェンドな光景だな〜と勝手に思っていましたが、でも同時に、当時のその人たちからしてみれば、べつに特別なことをしていたわけではなくて、ただその時そこにある面白いものとか、気になることとかを次から次へ全力でやっていただけなんだろうな、とも思いました。言い換えると、周りから特別だと思われるような(レジェンド感のある)ことをしなくても、いま目の前にある超面白そうなものとか、大事だと思えることに本気で取り組むっていうのがやるべきことで、もしそれが一部でも達成できたら、のちのちその瞬間を偶然切り取った写真とかを見た誰かが「これ、伝説的な瞬間だね」って言うみたいな、そういうことなんじゃないかなと。今の自分がtokuhiromさんたちみたいになろうとする必要は全然なくて、自分自身が今やりたいことにちゃんと向かっていけば、それが結果的に未来から見た「スゴイ」になるんじゃないかな、と。そんなことを感じたイベントでもありました。

YAPC::Japan、おそらくこんなにアクセスしやすい会場での開催はそうそうない気もしますが(笑)また参加できることを楽しみにしています。

TokyoGirls.rb Meetup vol.1 に行ってきた

TokyoGirls.rb Meetup vol.1 に行ってきました。

techplay.jp

昨年11月にフリーランス編集者からRailsを使うIT企業(のカスタマーサポート)に転職したので、今後はRubyコミュニティとの接点を増やしていきたいな、と思っていました。

その一環として、昨年後半には大江戸Ruby会議07に参加して、今年の春にはRubyKaigi 2019に参加するつもりですが、前者の大江戸の方で見たしなもんさんがこれに参加する、という話をTwitterで見かけて抽選に応募したところ当選。という流れで、同イベントに参加してきました。

現場の雰囲気については、ハッシュタグを追うとある程度わかるかもしれません。

#tokyogirlsrb - Twitter Search

以下、簡単に感想を。

かなきゃん(@_kanacan_)さん

元アイドルにして携帯キャリアのエース販売員。中学のときの技術の時間? にHTMLを教わったというぐらいお若い方でウルトラカルチャーショックを受けましたが、それ以上に生き方・考え方みたいなところに刺激を受けました。

speakerdeck.com

たくましいとか強いとかしたたか、みたいなことはいくらでも言えるんだけど、今回この発表から感じたもっと本質的なところを一言で言うと、自分が何を欲しいのか、どうなりたいのか、みたいなことをすごく自覚している、あるいは自覚しようとしている、ということですね。これ、ぼくにはすごく欠けているところです。これがないと、ただフラフラ流されるままというか、本当はもっと欲しいものがあるのに、他人から「君はこれでいいでしょ?」と言われたら「あ、はい・・」みたいになってしまうんですよね。

印象的だったエピソードもいくつかありましたが、とくに残ったのはSmartHRに応募するときの話で、駄目かもしれないけど、失敗したらそれはそれでストーリーになる、というところ。ここで言う「ストーリー」というのは、仮に落ちても、その2年後ぐらいにもっと力を付けてから「一度落ちたけど、また挑戦しに来ました!」って行けばかつての失敗もストーリーとして価値を持つ、みたいなこと。これを考えて実行できるのはスゴイと思いました。

だって、そんな風に考えられるようになったら、すべての失敗は成功の一部になりますよね。

実際には、そんな風に考えたりトライしたりできるっていうことは、そのウラに何十倍もの失敗があるんだろうと想像します。それも全部引き受けながら、トライを続けるその生き方には大いに学ぶところがありました。

*参考記事として紹介された以下のブログ、あとQiitaも読み応えがありました。

しなもん(@sinamon129)さん

前述の大江戸Ruby会議07で一度発表を見ていて、それがものすごい面白かったので、今回の目当ての一つはしなもんさんの発表でした。

speakerdeck.com

果たして、その大江戸のときの話とある意味ワンセットというか、合わせて読むと一段深く楽しめるような、やはり今回も非常に面白い発表でした。

*大江戸Ruby会議07のリポートとしなもんさんのスライドは以下。

障害対応・深夜メンテナンスはすごい人がやってる印象、だからそれに憧れていた、という話。ぼくはプログラマーではないですが、すごいわかる気がしました。たぶん、そのすごい人たちもまた、そういう作業を陰惨な雰囲気で、ではなく、どこか充実した感じでやっていたのかな、という気もします。で、そういう人に自分もなりたいな、みたいなことを感じたのかな・・とか。

印象に残ったのは、できる先輩同士がやってるのを見ながら「その話、どこ見ながら言ってます?」みたいにツッコミながら追いかけていた、という話。たしかに言われてみればめちゃ効率いい方法だけど、自分だったら現場でそんな風に考えたり聞いたりできるかなあ・・と。

単純に、そういう合理的な方法を考えて実際に行動に移す、というのができてスゴイ、と感心しました。自分の今後にも参考になりそうだな、と。

スポンサーLT

スポンサーLTでは万葉の鳥井さんの発表が印象的でした。

speakerdeck.com

というのも、万葉には働き手を支えるいろんな仕組みがそろっているという話が次々出てくるんだけど、これがけっこうどれもヴェルク(昨年ぼくが転職した先)を想起させるんですよね。

ヴェルク株式会社 - board・データ分析・受託開発

*ちなみに、転職したときのぼくのブログは以下です。
ヴェルク株式会社に入社しました - 103

社員それぞれの都合を最大限生かせる仕組みを用意する感じというか。あるいはぼくなりにもっと原理的なところを言うなら、社員をとことん人間扱いする、みたいな感じでしょうか。

おまけに、どちらもRailsを使ってる・・!

あえて言うと、万葉さんの方は女性の働きやすさという点でより特徴的かなと思いました。
ぼくはプログラマーではないですが(再)プログラミングの本はいくら買ってもOKと言ってもらっているので、万葉さんの以下を読みつつ、新入社員教育用カリキュラムもやってみたいと思っています。

現場で使える Ruby on Rails 5速習実践ガイド

現場で使える Ruby on Rails 5速習実践ガイド

github.com

よう(@youchan)さん

じつは今回のイベント、しなもんさんやかなきゃんさんの発表を見たいというのも大きかったですが、タイムスケジュールを見て一番期待していたのはこちらのようさんの発表で、期待に違わぬとても面白い内容でした。

youchan.org

最初に印象に残ったのは「千葉の人、いますか?」という質問で、なぜなら今は千葉のRubyコミュニティがない(アクティブではない)ので、とのこと。ぼくは千葉の人で、しかもけっこう近いところにお住まいだったので、え、だったらそれ作るの参加したい・・と思いました。(今度また何かの集まりに顔を出したらお声がけします・・)

期待していたというのは、Ruby入門みたいな話だったからですね。それは言語の勉強という意味でも、コミュニティへの入り口という意味でも。

「すべてがオブジェクト」とはRubyを語るときよく語られることですが、今回初めて「あ、なるほど・・」という腑に落ちた感じが少ししました。(まだあまりRuby自体触っていないので、本当に少しですが)

ぼくは今まで5年ほど、Perlを趣味レベルではありますがずっと触ってきたので、その辺も思い出しながら聞いていました。関数型言語と絡めたあたりの話も興味深かったです。

それから後半の、男性中心なのも問題だけど、だからって女性だけなら良いってわけでもない、偏るのが問題。という話、まったく同感でした。

問題は、そういった状況が必ずしも悪意によって生じるのではなくて、むしろ大抵の場合は単に無意識・無自覚のうちに起きてしまう、ということなのかなと。であればこその大人力・思慮・配慮が求められるということなのかなと。

言い換えると、つねに思考停止せず、より良い環境を実現するための方法を想像したり、考え続けたりすることが必要なんだろうな・・と。

そうそう、あと余談ではありますが、ようさんはRabbitを使っていましたね。

Rabbit - A presentation tool for Rubyist

やっぱりつくづく、登壇者だけでなくお客さんにもプレゼンの進捗が可視化されてすごいツールだなあ・・と思いました。少し前に自分でも使おうと思ったものの(YAPC::TokyoのLT)、ちょっとデザインのカスタマイズが難しい・・と思って諦めたことがあったので、あらためてもう少し触ってみようと思いました。

かとりえ(@katorie)さん

最後のかとりえさん、終盤の子育てを絡めた部分は時間の都合もあって概要のみという感じでしたが、具体的なチーム作業のことも多く触れつつ、全般的には女性がどんな働き方をしていけるか、ということについて一番現実的・実感的なイメージを伝える内容だったという印象を持ちました。

speakerdeck.com

Web業界・エンジニア界への惹句としてキラキラした美辞麗句はそこいら中にあって、あたかもこの業界に入りさえすればそれが実現するかのように思ってしまいがちだけど(だから気をつけて、とかなきゃさんも言っていた)、本当に必要なのは誰が具体的にどんなことをして、その結果としてどんな今があるのか、という話で、これからそういう業界に飛び込んでみたいと思っている人たち(とくに女性)にとっては貴重な話だったのではないかな、と思いました。

すべての発表が終わった後、懇親会の方は今回はパスしました。ケータリングのすごい良い匂いがしていましたが、体調が今ひとつだったので。とくに食事の席は外しておいた方が無難かな・・と。

しかし懇親会はボッチ対策でグループ分けの工夫があったようですね。

すげーアイデアだ・・とハッシュタグを見ながら思っていました。(もし残っていたらVimグループでした)

雑感

女性メインでありつつ、男性の参加も一定割合まではOK、というこのシステム、素晴らしいと思いました。

とくに印象的だったのは、質疑応答でどんどん女性参加者が発言していたことですね。それも、手元のメモを見ながら、というなんだか真面目な感じ・・すごい良いなと。

しかしこんな風なシステムだと、女性ばかりが優遇されるような雰囲気が醸されてしまうのでは? という懸念もありそうですが、この辺のコンセプト的なことについては、個人的には主催の伊藤淳一さんによる以下のブログ記事に大元のことが書かれていると思っています。
blog.jnito.com

とくに、以下2点ですかね。

  • 日本のITエンジニアの世界は、まだまだ比率的に男性の方が圧倒的に多い
  • いろんな勉強会や初心者向けのイベントもあるが、そういった場所でも男性が多いので、(主催者がいくら「女性でもOK」と強調しても)女性にとっては敷居が高い

あとは、少し前に自分の別ブログで抜き書きをしたのですが、作家の森博嗣さんによる以下の言葉も近いことを言っていると思います。

男女平等などの流れで、「女性ばかりを優遇しすぎではないのか? それでは平等ではない」と反発する声もあるのですが、これは、これまでの歴史を知らない発言だと言われてもしかたがないでしょう。つまり、それくらい女性を優遇する仕組みを押し出しても、まだまだ平等ではない、という歴史です。真っ直ぐ走るためには、ハンドルを真っ直ぐにすれば良いわけですが、今まで右に進んでいたら、左にハンドルを切らないと真っ直ぐにはなりませんからね。
森博嗣数奇にして有限の良い終末を』より/太字は原文ママ

今はまだ、ここで言う「ハンドル」を真っ直ぐにしたままでは足りない状況なのかな、と。その意味でも、とても意義深いイベントだったと思います。

あらためまして、スタッフの皆さん、登壇者さん、参加者の皆さん、おつかれさまでした。楽しい時間をありがとうございました。

なぜアウトプットするのか

2013年からPerl入学式(Perlによる無料のプログラミング講座)でお世話になっている id:xtetsuji さんから、ぼくがアウトプットを続ける理由は何か? という質問というか、お題をもらって、しばらく考えていました。

ここで言うアウトプットとは、直近で言うと去る1月終盤に行われたYAPC::TokyoでのこのLTとか。

note103.hateblo.jp

あるいは昨年の今頃に発表したこちらとか?

note103.hateblo.jp

その他にも、このブログをはじめとするネット上での各種意見もそれに含まれると思います。

あとは、いろんなイベントに顔を出してもいますね。去年だけでも、上記以外にbuildersconとか、大江戸Ruby会議07とか、Vimconfとか。

*大江戸Ruby会議については最近公開されたるびまのこの記事がとても良かったです。シェアさせて頂きます。
magazine.rubyist.net

で、そういうイベントでまた、いろんな人に自分から話しかけたり。これもまたアウトプットかなと。

さて、それで最初の質問に戻りますが、なぜそんなことをするのか? という話ですが。

それに対する答えのいくつかは、最初に挙げたYAPCでのLTスライドに書きました。曰く・・

  1. やったことや考えたことを忘れちゃうから、メモがわりに。
  2. 見知らぬ人への手紙。どこの誰かもわからない人に知見の共有。
  3. 自慢したいから。
  4. 恥ずかしさよりも、それをやりたい気持ちの方が強くなるから。

ということ。

とくに、最後のはある意味一番大きいかなと思っていますが、これってじつは「なぜアウトプットしないのか?」という視点から捉えることもできて、ぼく自身のことを考えると、「ああ、あのとき、なんであれをやらなかったんだろう!?」と思ったときの答えは、結局「失敗したくないから」とか「絶対に恥ずかしい思いをしたくないから!」ということだったと思います。

実際には、何かを「やらない」理由なんて100でも1,000でも挙げることは可能で、いくらでもやらない言い訳なんてできるけど、でもやっぱり最後の最後には「失敗したくない」という理由に行き着くはずだと思っています。だって、絶対に失敗しない唯一の方法は、それをしないことですから。試合に出なければ、100%負けません。間違いない。

だから、「なぜアウトプットするのか?」という質問は、単純にそれをひっくり返せばよくて、「失敗してもいい」と思えた時というか、「失敗したくない」と思う以上に「それをやりたい」とか「実現したい!」と思った時があったからですね。

でも、その「実現したい!」っていうのも、そう書くとなんだかポジティブに聞こえますが、実感的にはもっとしょぼい感じというか、ようは「もったいない」って思っちゃうんですよね。たぶん、ぼくがアウトプットする理由の第一ってこれかも、と今思いました。

人生は有限で、チャンスは一度だけではないかもしれないけど、でも生きてる時間が限られてる以上は何度も巡ってくるわけじゃないから、次のチャンスはもう生きてるうちには来ないかもしれない、じゃあ、今やっとくしかないんじゃない? みたいな。

それで、渋々というか、仕方なくというか、「二度とできないぐらいだったら、いま頑張ります・・気乗りはしないけど・・」みたいな感じですね。

その意味では、なんというか、捨て身になっていることも多い気はしますね。それまで丹念に育ててきた何かを一気に全部捨てて次の場所に行く、みたいな。そのことにあまり躊躇がないというか。

ぼくは美大に入って、将来何をしたいとかまったく考えないまま大学4年間を過ごして、卒業してもまだ何も決めず、30を過ぎた頃にようやく継続的な仕事をもらえるようになって、でもそのまま43歳になるまで一度も定職につかずに生きてきて、ようはずっと「なんとかなるっしょ」のままやってきた感じがあるんですよね。

その根無し草感というか、べつにカッコつけるつもりはまったくないですが(とくにカッコよくないですか)、実際本当にそんな感じだったので、あるとき突然どっかに飛び込む、チャレンジする、ということに対して抵抗感が少ないところがあるかなと自己分析します。明日から突然それまでの全部がなくなっても、まあ、わかりました、なんとかします、みたいな。

あるいは別の言い方をすると、「痛くない」という感じ。失敗したり、恥ずかしい思いをしたり、指をさされて笑われたりしてもべつに構わない、いやもちろんめっちゃイヤだし、傷つくし、全然積極的にそんな思いをしたいわけではないけど、それでも「まあそんなに、痛くない」という感じ。ある意味鈍感というか、無感覚ということなのかもしれないですが、でもそのある種の耐性みたいのができてきて、それで前半の方で言った「アウトプットしない理由」の方が、「やりたいこと、味わいたいこと」に比べて相対的に小さくなってくれているのかな・・と。

もうひとつ、これは先日、rubyist.club という数年前にやっていたポッドキャストの以下のエピソードを聞きながらふと思ったことなのですが、

rubyist.club

その中でゲストの@bash0C7さんが言っていたことで、「ロックスターに憧れていても、客席から見ているだけでは届かないから、どんな形でもいいから舞台から客席を見る側でありたい」と言っていて、ああ、それちょっと似てるなと。(実際の文脈とはちょっと違うかもしれないんですが)

上記の捨て身の感覚というのは十代後半ぐらいからあった気がするんですが、それとは別に、ぼくが自分の人生が大きく変わった分岐点として今でも思うのは、たしか28歳のときに菊地成孔さんの音楽私塾に申し込んだときで。その申し込んだ瞬間のことは今でも覚えていますが、雪の日で、古い貸家の暖房をつけてもなかなかあったまらない部屋でブルブル震えながらそれこそ捨て身で「絶対駄目だよなあ」と思いながらエイヤと申し込んだら50分後に入学OKの返事が来て。

その数週間後に第1回の授業があって、初めて目の前に現れた菊地さんを見て、あ、今までスクリーンの向こうにいた人が、現実でつながった。あれ、てことは今ぼくはスクリーンのどっちにいるんだ? こっち側? 向こう側? いやどっちでもないのか? みたいな。その日のその瞬間から、何かその「こっち」と「向こう」を分ける透明なガラス板みたいのが音を立てて砕け散った感じで、こんなふうに言うとあまりに綺麗にまとまってしまうんだけど、それがもしかするとぼくがアウトプットする側に入ったときだったのかな、という気も少ししますね。

実際、その菊地さんとの出会いがきっかけで、ぼくは編集者的な作業をするようになって、それが元になって大谷能生さんと共著で本を出すことになって、その経験を踏まえて後藤繁雄さん、坂本龍一さんとの仕事にも連なっていったわけで。

で、ここからがまた大事なトピックなんですが、そういう経験をする中でぼくがつくづく思っていたのは、結局そういう才能あるミュージシャン、クリエイターのような人たちとどう関係を結ぶかといったときに、やっぱりお客さんとして付き合うというのは、ぼくにはどうしても不合理というか、もったいなく感じられて、なぜならお客さんとしてアーティストに触れられるのってほんの一瞬だけで、にもかかわらずその「一瞬」を手に入れるためにかなりのコストを支払うことになるんですよね。あくまで個人の感想ですが。

じゃあどうすればいいのよ、と言ったら、その菊地さんの時のように生徒になるとか、あるいは坂本さんの時のように仕事相手になるとか。

まあ後者の方は運や他人の要素も大きいので、やりたいからってそう簡単には実現できないかもしれないですが、ただいずれにしても、ぼくはそういう巨大な才能をお客さんとして味わうのではなくて、もっとその人たちの近くで、もっとダイレクトに体験したいと思っていて、そのためには、彼らと対等な関係になるしかないと思っていました。言い換えると、たくさんいるお客さんの中の一人ではなくて、交換不能な役割を持ってその場に混ざるということなんですけど。

で、それってさらに言い換えると、結局自分もクリエイターになるしかないということなんですよね。自分も作る人になるしかない。なぜなら、お客さんとしてではなく現場に混ざるということは、その才能ある相手から「君には何ができるの? 何を作れるの?」と聞かれるということだから。現場の一員になる以上は、その輝く才能をただ近くで受け取って楽しむだけではなくて、自分からも何らかの才能を燃やした結果を提供しなきゃいけないから。対等な関係というのはそういうことだから。

つまり、リスクを取るということですね。相手にもっと近づきたい、まだ見たことがない巨大な才能の輝きを、生きているうちにもっと見たい、間近で見たい! と思ったら、自分もその人に何かを提供できる人になるしかない、「君には何ができるの?」と聞かれたときに提示できる何かがなきゃいけない。上手くいけば大きなリターンがあるけど、失敗したらもう立ち上がれなくなるほど傷つくかもしれない、というそれがリスクというもので、でもその輝きを本当に体験したいなら、リスクを取るしかない。

上記のポッドキャストでは「客席から舞台を見るのではなく、舞台から客席を見たい」と言っていましたが、ぼくの場合はそれで言うと、「客席からロックスターを見るのではなく、同じ舞台の上からロックスターを見たい」という感じでしょうか。

そう考えると、その後、38歳にしてそれまでまったく馴染みがなかったエンジニア界隈の人たちとつながりを持って、みんな坂本さんのことは知っていてももちろんぼくのことなんて1ミリも知らない人たちに囲まれて、なんのアドバンテージもなく、むしろどちらかといえばマイナスからのスタートみたいなところから、こんなふうに「どうしてアウトプットするの?」なんて質問されるぐらいコミュニティの人たちと親しくなれたりしてきたのは、そういう考え方だったり、経験だったりを重ねてきたからかな、という気もします。

以上、今度 id:xtetsuji さんとそれについて喋るときのためにメモとして書き出してみました。

Scrapboxの当日の日記ページにすぐ移動できるブックマークレットを作った。

小ネタです。

チェック終わりました。

javascript:(function(){ dt = new Date(); dtm = dt.getMonth()+1; dtd = dt.getDate(); if (dtm < 10) { dtm = '0'+dtm; } if (dtd < 10) { dtd = '0'+dtd; } date = dt.getFullYear()+'-'+dtm+'-'+dtd; window.open('https://scrapbox.io/***/'+date,"_self")})()

上記コードの最後の「***」のところをアカウント名に差し替えると、できます。

以下、アカウント名をnote103にした場合。

https://i.gyazo.com/e51d1482c152cfce2008d985b644e78f.gif

ちなみに、当初はクリックすると target="_blank" 的に新規タブが開くようになっていたのですが、同じタブ内で動いてほしいなあ・・と思ったもののどうしたらいいのかわからず、しばらく粘ってググっていたら以下が見つかり、

stackoverflow.com

window.open()の2つめの引数に "_self" というのを付ければOKでした。ナイス質問者!

以上です。

LT解題 - YAPC::Tokyo 2019

先週土曜に開催されたYAPC::Tokyo 2019でLTをしてきました。

yapcjapan.org

イベント全体の感想は別途まとめる予定ですが、その前に自分の発表について、覚えているうちに書いておきたいと思います。

目次

登壇スライド / 録音

まず発表資料というかスライドはこちら。

speakerdeck.com

手元で録音しておいた音声ファイルもSoundCloudにアップしておきました。

soundcloud.com

声、めっちゃ震えてるんですよね・・(笑)。しかもその震えがなかなか止まらないというか、むしろ後半に行くにしたがって増してくる感じすらあり、軽く絶望を感じながら、でもしょうがないのでそのまま最後までやりました。

たしか沖縄で発表したときも、「うわー、なんか緊張がむしろ増してくるじゃん!」と思ったものですが、つまり「話しているうちに落ち着いてくる」とか、「緊張するのは最初だけ」みたいなことは少なくともぼくの場合はナイようです。

とはいえ、やはりトータル的には、沖縄とどっちが緊張したかと言ったら今回の方が緊張しましたね。

これについてはその後の懇親会でsongmuさんもおっしゃっていましたが、たとえばメイントークって20分とか40分とかあるけど、それを見ているのは「そのトークを見にきている、全体からすれば一部の人たち」に過ぎなくて、でも本編LTってその時点でカンファレンスに残っている人全員が見ているもので、べつにその発表を見たくて集まったというわけじゃない、ある意味予備催眠率ゼロの厳しい目を持った人たちなので、そこで発表する方がよっぽどハードル高い、自分だったらまずメイントーク経験してから本編LTに挑む、みたいな話を聞きました。

いやほんと、心の底から同意です。喩えてみるならメインのトークは自著を書くようなもので、本編LTは雑誌や新聞に寄稿するようなものですね。自著は元々それに関心がある人が買ってくれるけど、雑誌やとくに新聞の場合、自分ではなくその媒体に付いたお客さんなので・・いろいろ厳しい!

プロポーザル / 何を提供できるか

イベント当日は1/26で、LTの締切りは1/22だったのですが、ぼくが申し込んだのはたしか1/21の夜とか、そのぐらいだったと思います。

プロポーザルはこんな感じでした。

# 自走するプログラミング入門者の探し方
 
プログラミングの初心者には、自らモチベーションを高めて学習を進めていける人と、そうではない人がいるようです。その二者を分けるものは何でしょうか?
 
私は長い間、ITとはまったく関係ない仕事をしていましたが、2013年のYAPC::Asiaで行われたPerl入学式に参加したことをきっかけに趣味のプログラミングに没頭するようになり、気がつけばYAPC::Okinawaで登壇を果たし、ついにはIT企業に就職していました。
 
私は冒頭に挙げた二者の中では前者にあたると思いますが、自分にどのような特徴や傾向があったのかと考えると、それは「アウトプットすること」だったように思います。LTでは自分の実体験を軸に、これについて発表したいと思います。

これは手元にあったメモなので、最終的に送った内容そのままではないかもしれないですが、大体こんな感じでした。

なぜこのテーマを選んだのか? と言ったら、一番の理由は、ぼくがYAPCの参加者(おもにエンジニア)に何らかの価値として渡せるものは何かと考えたときに、このネタぐらいしか思い浮かばなかったからでした。

LTで発表する内容は、ぼく一人が満足すればいいカラオケみたいなものではなくて、聞いている人が「ああ、この話を聞いてよかった」と一瞬でも思えるものであるべきでした。でも、ぼくは何か役立つ技術トピックを持っているわけでもありませんし、そもそもそういう知識も経験もありません。

だったら申し込まなければいいのでは、という気もしますが、後述の理由で申し込むこと自体はもう決まっていて、だったらとにかく「自分は持ってるけど他のYAPC参加者が持っていない何か」を探さなきゃ、となって結果的にこの話題に行き着きました。

少なからぬYAPC参加者がこのネタに興味を持つだろうと思った理由は、たとえば id:papix さんのこの記事を読んだからでした。

papix.hatenablog.com

そーだいさんも書かれていました。

soudai.hatenablog.com

こちらの方も時間をかけて考えをまとめてらっしゃいました。

blog.3qe.us

(時系列がバラバラですみません)

それらを読みながら共通して思ったのは、どれもが当然のことながら、プログラミングを「教える側」からの考えであって、「教わる側」が何を考えているのか、とくには、自走する初心者が何を考えているのか、感じているのか、何に突き動かされているのか、という点については、その立場の違いから原理的に(構造的に)触れられないのだな、ということでした。

であれば、プログラミングを「教わる側」のぼくがその欠けたパズルのピースを埋めることには一定の意義があるはずで、それをすれば多少はコミュニティの役に立てるのではないか、喜んでもらえる可能性があるのではないか、と思ったのでした。

応募するまで

少し時間を遡りますが、じつのところ、今回のYAPCでLTをするなんていう気持ちはまったくありませんでした。前夜祭のLTソンで発表する気すらなかったです。

(だって、忙しかったので・・)

でも、YAPCのチケットを買ったとTwitterでつぶやいたその日ぐらいから、 id:magnoliak さんから「LT募集してますよ」という煽り・・ではなくご案内を何度か頂いて、反射的には「ムリです!」という気持ちでいっぱいでしたが、ただお腹の底の底のところで、「んーしかし、magnoliaさんやスタッフの皆さんがこれだけ全力を投じているこのイベントに対して、しかもそのmagnoliaさん本人から応募を勧められているのに、やらないって選択肢があるのかなあ・・いや無理だけど、無理なんだけど、でもなあ・・」という逡巡が、何度押さえつけても戻ってきて、なかなか「やる」とも「やらない」とも決められないまま、とりあえずネタを考えてみておく、という日々を過ごしました。

そして最終的には、上述のとおり締切りの前日になって、「とりあえず」というつもりで一旦プロポーザルを書き始めてみたら思いのほかサラサラ内容がまとまって、それを見ながら「まあ、よく考えたらそもそも一択か」と思って応募に至りました。

この際には、せっかくやるなら前夜祭の方ではなくて、「毒を食らわば皿まで」という言葉もありますように、ぜったい怖すぎてマジやばいとは思いながら、応募するだけなら何も損はしないのだから、と思って本編の方に申し込み、その際に「駄目だったら前夜祭の方で」というオプションを付けておきました。

しかしこの、「応募するだけなら何も損はしないのだから」というのは、「タダより高い物はない」という言葉もありますように、恐ろしい誘い文句でして、それから発表までの間は何度も「あれ、これ万一選ばれたらかなり大変では? え、なんで応募したん? なんで??」という後悔にそれはもうさいなまれたものでした。

なんというか、プロポーザルは持ち前の調子の良さであたかも崇高なネタがすでに用意されているかのように悠然と書いてしまったものの、実際には具体的な内容はまったく固まってなくて、もし選ばれたらその場に見合うだけのガッツリしたものをその瞬間から一気に作らなければならず、いやいや、会社に通いながらそれは無理じゃん、って無責任じゃん、ってかなりマズイ、かなり・・とかなんとか、ただひたすらエネルギーが落ちていく感じでした。

果たして、LTの選考結果が発表されるのはイベント本番の2日前、1/24のお昼すぎでしたが、「LT採択が云々」という件名のメール通知が目に入ると同時に頭の頂点からこめかみに向けてイヤ〜な汗がズワッと降り出してきて、「今は見たくない・・というか落ちていてほしい・・」などと思いながらエイヤと開いたら採択されていて、ひえ〜マズイ! けど嬉しい! けど絶対失敗する! などの恐怖と混乱に包まれながら、でも同時にぼくのプロポーザルを見て期待を感じてくれた運営の人たちの顔も浮かんで、ああそうだ、その人たちの期待に応えなければいけないんだ。と、あちこちぶつかりながらなんとか覚悟を決めました。

構成の練り方

すでにプロポーザルを書いた段階で大きめの方針は決まっていて、どんなトピックを入れるかということも思っていたよりはスムーズにリストアップできたのですが、大変だったのはその筋道を整理することで、いくら考えても話がうまくつながりません。

それもそのはずで、これは上記のpapixさんたちのブログとは逆方向の性質ゆえというか、ぼく自身はプログラミング初心者の視点からものを感じたり言ったりすることはできるけど、テーマはそういう初心者を外側から見るような(すでに技術を習得した側からの)視点で立てられているので、一体どちらの視点を軸にしたらいいのか、またどうすれば双方の視点から語られるトピックを自然に構成できるのか、といったことが難しく、なかなかこれを整理できませんでした。

それでとにかく、言いたいトピックを一回全部入れた上で、それだとまったく時間に収まらなかったのでネタを足し引きしながら本の編集のように構成をまとめて、その「語りの軸足をどちらに置くか」とか、「どうやって自然につなげるか」とかは最後の最後まで後回しにする作戦を取りました。

視点や方針を定めないまま構成なんてできるの? とぼくも今これを書きながら思いましたが、ん〜、でもなんか、できましたね。言っておきたいネタはあって、それをどう見せるかまでは出来てしまうというか。

具体的には、こんな感じでした。

  • タイトル
  • 目次
    • その1
    • その2
    • その3
  • 結論
  • その1
    • 話の前提
      • 勝手に水を飲む馬
    • 自己紹介
      • commmons: schola
      • YAPC::Asia 2013 & Perl入学式
      • MOONGIFT
      • ブログ
  • その2
  • その3
    • アウトプット
    • なぜ?
      • 忘れちゃう
      • 見知らぬ人への手紙
        • メッセージ・イン・ア・ボトル
      • 自慢
      • 恥ずかしさが薄れていく
        • 相対的に
  • 引用
  • 結論(再)

ここでやっているのは、ただひたすら見出し文言の洗練とその入れ替えです。結論を最初の方に持っていったのも、結局最後の1行をコピーして初めの方にペーストする、という作業を見出しだけなら簡単にできるところから思いつきました。

ちなみに、今回の一連の作業はもちろん(というか)Vimでやっていました。沖縄での発表でも紹介しましたが、tagbarというプラグインを使って、こんな感じで左に本文、右に見出しを出しながら内容を詰めていきました。

f:id:note103:20190202210801p:plain

*いま気づきましたが、レイアウト調整の都合もあって本来見出しではないものが右に行ってますね・・文字を大きくしたいものを見出しにしていたので。まあ、暖かく見守って頂ければと・・。

そしてまた、このようにMarkdownファイル1本でスライド資料を作りきれたのは、ゆーすけべーさんによるPerlモジュール App::revealup のおかげでした。

metacpan.org

これがなかったらまず間に合いませんでしたし、このモジュールのおかげでKeynoteを地道にポチポチ調整することもなく、本質的な内容の洗練に集中できました。ゆーすけべーさん、ありがとうございます!

筋を通す / 引用

上で何度か書きました「筋道の通し方」ですが、最終的に思ったのは、「結局ぼくにわかるのは初心者側の話なのだから、初心者としての実感をメインにするしかない」ということ、そしてその上で、「アウトプットしてる人を探せ、なんて何も言ってないのと同じだから、そうではなくて、そのアウトプットからそれを支えるモチベーションを逆算的に見出して、もしそのモチベーションが自走型のそれだったら、その元にいる人は自走するプログラミング入門者だっていう論理なら行けるのでは」ということでした。

やや強引にも思える論理ですが、この準備期間でこれらのトピックを入れるにはその方向しかなかったのですよね・・。

ただ実際には、そこまで込み入った論理を説明するヒマはなかったですし、聞いてくれた人たちもそこまで論理のつながりみたいなものは気にしていなかったかな、とも思っています。

それとは別に、もうひとつ論理のつながりとして気になっていたのは、終盤の森博嗣さんの引用でした。

ぼくが今回絶対入れたいと思っていたのは、2本出した引用のうちとくに最初の方、「才能は決して埋もれない」というもので、これは本当にぼくを支える言葉になっています。といっても、それは何も「ぼくの才能が埋もれるはずがない」とおまじないのように思っているということではなくて、ただ「アピールの仕方にリソースを費やすぐらいなら納得行くまで物を作ろう」という気分を後押しするものとして支えにしている、ということです。

なのですが、この引用も結局、なんの支えになるのかと言ったら「教わる側」であるところのぼくを支えているもので、それを外から見る「教える側」とか、自走するプログラミング入門者を「探す側」の実感とは、ある意味では逆なんですね。なので、ん〜、この超終盤の決め手になるようなところで、教わる側視点の引用を出すのって正直意味わからん・・どうしよう・・と、これはかなり悩みました。

悩みましたが、でもこの引用は(くり返しになりますが)絶対必要で、確かにこれがなければ流れはスッキリして、誰からも突っ込まれないウェルメイドなスライドができたかもしれないんだけど、それって言いかえると「小さくまとまる」みたいなことで、せっかくここまで地獄の釜の蓋を開けるようなことをしてきたのに、最後に日和るんかい、というツッコミの方が勝ちまして、「もう論理とかどうでもいいからとりあえず入れとけ、説明は本番でしろ」みたいに自分に説得される感じで結局入れました。

結果的には、発表では「この言葉はぼくの支えになっていて、関係ないって思われるかもしれないけど今回の発表とめちゃ関係してます」みたいな、説明になってるんだかなってないんだかわからないようなことを言って終わってしまいましたが、その数分後に思ったのは、「自走するプログラミング入門者を何が支えているのかと言ったらたとえばこういう信念だから、知っておいて損はないですよ」みたいな観点から見れば筋はちゃんと通ってたな、ということでした。

ようは、瞬間的な反応とか、評価とか、そういうのはもういらないんだと。「いいね」とか、はてブとか、そういうのはもういいんだと。もちろんそういうのを求めたっていいし、その欲求は自然なものなんだけど、でも逆に、すぐには全く反応が得られなかったとしても、それは作品の価値とは全然関係ないし、気にするに値することじゃないんだと。それが本当に面白いものだったら、必ずいずれ評価されるから、作る人が本当に全力で気にすべきことは、それが本当に面白いものなのかどうかなんだってこと。それだけ。作る人はそのことだけに集中してればいいんだと。めっちゃ頑張ったけど全然評価されませんでした、見向きもされませんでした、なんていうのはまったく気にすることじゃなくて、めっちゃ頑張ったけど全然面白くなりませんでした、ってそっちの方がダメなんだと。そっちを気にしろと。それだけを集中して考えろと。・・そういうことをこの引用を通して伝えられたら良かったのかなと思いましたが、ぼく自身今これを書きながら「ああ、そういうことだったんですね」と思ったので、その時点で言えるはずはなかったですね。

いろいろスッ飛ばしながら、最後のまとめに触れ終わった瞬間の手元のiPhoneのストップウォッチは4分57秒で、あ、間に合った・・と思って「ピッタリ」と思わず言いました。実際はどうだったかわからないですが・・ぼくが締めの御礼を言ったあとにpapixさんのドラが鳴り響いて、ああなんか、すみませんありがとうございました、という感じでした。

練習、練習、練習!

しかしステージに上がる数分前まではけっこう正気だったんですけど、階段を上がる瞬間にはなんだか、真っ白な天国の光の中に入っていくような、意識が薄れていく感じがあって不思議な感覚でした。M-1グランプリの決勝に出る人たちとかってこんな感じなのかな・・とふと思ったり。ステージで何を喋っていたのか、ほとんど覚えていないですね。降りてから、「あれ、坂本さんの話ちゃんとしたっけ?」と本気で不安になったりしました(一応してました)。

ステージではもう、だから体が勝手に動くのに任せていた感じでした。そこで生きてくるのが練習なんでしょうね。スポーツとか楽器とかと同じで。普段練習した分がそのまま本番に影響するのかなと。今回、ぼくはスライドがなんとか形になるまでだいぶ時間がかかって、当日の昼前ぐらいまで浅草橋のホテルでスライドを作っていたので、その後にできた練習は正味3〜4周ぐらいでしたか・・もう少しできると良かったのですけど。

ぼくはパフォーマンスの出来/不出来として目に見えるのは山の頂上みたいなほんのわずかな部分でしかなくて、それを高めるにはひたすら山の裾野を広く盤石にしていくしかないと思っていて、つまりパフォーマンスの完成度を高めたかったらひたすら地味な練習をくり返すしかないと思っていました。それがまあ、結局は足りなかったがゆえのあの結果かな・・とも思っています。いやあ、口が乾いて仕方なかったですね。舌が口の中にひっついて喋れない! なんて経験、初めてだったかもしれません。ああ緊張しました。

緊張といえば、ちょっと聴いている人全員を意識しすぎたかなとも後から思いました。もう少し「こういう人に向けて喋る」という対象を絞って想像しても良かったのかなと。今回のYAPC参加者数は384人とのことですから、本編LTに残っていたのは300人ぐらいでしょうか(わからないですが)。なので、その全員に向けて喋っても大半には伝わらないはずで、だからそうではなく、その中のほんの3〜4人だけを相手に喋る感じだったらもう少しリラックスできたかな・・とも。いやまあ、次にそんな機会があってもそう上手くいくとは到底思えないですが・・でも理想としてはそういうことだったのかなあ、と。

また接続にハマる / バックアップ

前回のYAPC::Okinawaの前夜祭LTでもそうだったのですが、ぼくはいまだにMacとプロジェクターとの接続方法がよくわかっていなくて、今回もLT前の接続確認でかなり手間取ってしまったのですが、ぼくの後ろで次のチェックを待っていた id:moznion さんが「ミラーリングじゃないですか」と不調の理由をさっと指摘してくれた上に「それ、そこをチェックして」などと具体的に教えてくれて、沖縄のときには id:karupanerura さんに近い感じで救ってもらったことを思い出しましたが、本当に助かりました・・ありがとうございます。

ただじつは、その後にもまだ結構深刻なトラブルが待っていて、というのも事前に書き出しておいたスライドのPDFを投映しても一部が消えてしまうんですよね。で、こんなこともあろうかと思って、これまた事前にスライドを上げておいたSpeaker Deckのページにアクセスして颯爽と自分のスライドを開いたのですが、それもダメ!🙅‍♂️

え、ええ〜〜〜・・マジやばい、やっぱりプロジェクター意味わからん、苦手すぎる! と逃げ出したい気持ちになりましたが、じつはもう一つだけバックアップとして用意しておいたのが前述のApp::revealupのローカルサーバ機能で、念のためにこれをターミナルから開きっぱなしにして、ブラウザのタブもそれに合わせてあったのですよね。で、そっちに移動したら何とかまともに見れるようになって、これほんとに半ば無意識のうちにやっていた準備でしたが、もしやってなかったらスタートラインにすら立てなかったわ・・という感じでした。

そんな風にフルタイム・パニックみたいな状況でしたが、周りのスタッフの皆さんは常にスムーズかつ間違いなく発表できるようにすごく丁寧に段取ってくれていて、最後までストレスなく場に臨むことができました。ありがとうございました。

ベストLT賞

ぜんぶ終わって、もう何も残ってません・・灰になりました・・という感じで同じくLTに登壇された id:xtetsuji さんと並んで会場最前列に座ってしばらくしてから、ベストLT賞なるものがあることを初めて知りました。で、あ、これもしかしたら獲るかもな・・と思いましたね。自信があったわけでもなければ、誰かからそう言われたわけでもなくて、むしろやってるときは「会場、反応ないな!」と思っていたぐらいでしたが、なにか音もなく届いた手応え。みたいなものを感じていたんですよね。その何というか、一瞬の淡い期待感みたいなのが心地よかったです。もし事前にそういう賞があるとわかっていたら、狙って登壇していたかもしれないので、狙わずに発表しきって、かつそういう手応えを感じられたのが良かったなと。

(結果的にはそれはmoznionさんが受賞されて、その発表内容としても、またその後のsongmuさんのベストトーク賞への流れという意味でも、まさにベストなLT賞だったと思いました)

ご感想

終わってから、いくつか嬉しい反応を頂きました。

tomcha.hatenablog.jp

blog.3qe.us

sorehaedamame.hatenablog.com

nayuta-1999.hatenablog.com

morichan.qrunch.io

*他にもあったかもしれないですが、もし見つけたら追加します。

ありがとうございました。やって良かったです。

ちなみに、スライド上の文字と口頭の内容をずらすというのは意識的にやっていました。紙芝居じゃないのだから読み上げるのはやめよう、と。昔大学で「なんて退屈な講義なんだ」と思ったものは大抵、教科書をただ読み上げるだけのものでした。

でもそれに気づいてもらえるなんて! 伝わるものですね・・。

それからsongmuさん、これは以下の記事にも書きましたが、

note103.hateblo.jp

ぼくは勝手にsongmuさんに煽られ・・じゃなくて導かれるように情報処理の勉強をしてみたり、そうやって一歩一歩進んできた感覚を持っていたので、うわ、直接評価された! って思ってすごい嬉しかったです。

終わりに

本当はYAPC::Tokyo全体の感想の中にこのLT解題を入れるつもりでしたが、ご覧のとおり、だいぶ長くなったので分けました。会全体については、また時間を見つけてアップしたいと思っています。

(ドラフトはほぼできてるので、何ヶ月も先とかにはならないと思います・・)

今回のLTに採択されたときはこんなツイートをしましたが、

果たしてスタッフの皆さん、どうでしたでしょうか・・あまりみっともいい感じではなかったですが、自分的にはやり切りました。スライドにも書きましたが、ぼくは本当は恥ずかしい思いをするのも失敗するのもみっともないのも超!イヤだし、おそらく今後もずっとイヤですが、それを上回る「やるしかない」とか「これをやったら今まで見たことない風景を見られるはず」みたいなモチベーションでやらせて頂きました。恥ずかしさや不安をゼロにすることは決してできませんが、小さくすることはできるな、と今回の発表で自分に教えられました。やりたいことが大きくなるほど、それらは相対的に小さくなります。これをステップに、またこういうことに挑戦したいと思っています。ありがとうございました。

PHPで書いたWebページをVagrant+Ubuntu+Nginxで複数デバイスから閲覧する

PHPとは相性が悪い、というのがプログラミング入門初期からの実感で、これまで「おー、やった!いいじゃんPHP!!」みたいに思ったことは一度もありませんでした。

しかし昨年の後半、いろんな成り行きからもう頑張るしかない・・みたいな状況に追い込まれまして(たぶんそれについては別記事で)、少し本腰を入れてというか、時間をかけて対応しましたら、ようやく「はあ〜、できた」みたいになったので、ここにメモしておきたいと思います。

ちなみに、この現象と解消、以前から何度かくり返してはいたのですが、そのつど「あれって、一回できたはずだけど、どうやるんだっけ? もう忘れちゃったよ・・」というくり返しでもあったので、今度こそちゃんと記録しておく、というのもあります。

あとは、その以前に辿りついた解決法というのも、結局いろいろイジっているうちになんか知らんけど出来てしまった、みたいな感じだったりして、その意味でも再現しづらかったので今度こそ(略)という感じでもあります。

やりたいこと

記事タイトルにもバリッと書きましたが、今回の目標は

PHPで書いたWebページをローカルネットワーク内で複数ブラウザから閲覧する!

というものです。

これはメインのPCのブラウザから見るのはもちろんですが、スマホでも見れるとか、離れた部屋の別マシンでも見れるとか、そういう状態を指しています。

で、今回はそのWebページ自体は重要ではないので、以下のコードだけを記した hello.php というファイルを作成し、

<?php echo '<p>Hello, PHP!</p>'; ?>

これを Vagrant の共有フォルダに置いて閲覧できるようにする、としたいと思います。

その閲覧時の手順としては、最初にローカルサーバ上のトップページである index.html に入って、そこから張られている hello.php のリンクをクリックしたらそのページに移動して「Hello, PHP!」を見る。という感じで行ってみます。

先にその結論というか、成功した状態を見てみましょう。

https://i.gyazo.com/7b3a99735f887250aa85cb21f9263b0d.gif

はい、左上に控えめに「Hello, PHP!」と表示されました。これができればOKです。

環境の前提

記事タイトルにも書きましたが、今回はVagrantUbuntuを起動して、その中に入れたNginxでサーバを立てます。

Nginxを起動してHTMLのトップページを見られるようにするまでの段取りは、少し前に書いた以下の記事のママですので、今回は割愛します。ご興味おありの方は、そちらをどうぞ。

note103.hateblo.jp

余談ですが、今回のUbuntuは12.04ですが、このバージョン番号を調べるのに何気に時間がかかりました。どうやったら正確なバージョンを調べられるのだろう? と。

もちろん、ちょっとググればいろんな方法が出てくるのですが、どれも不要な情報があれこれと一緒に表示されてしまって、読み解きにそれなりにコストがかかるなあ、と。

しかしこれ、単にUbuntuに最初にログインしたとき、つまり「vagrant ssh」で入ったときに、このように出てくるんですね。

Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)

完全に見落としていて、たぶんトータル20〜30分ぐらい費やしました。いやほんとに余談ですが・・。

さらにちなみに、今この手順でこのUbuntuを立ち上げると、14.04にせよ、と以下のように出てくるのですが、

 * Documentation:  https://help.ubuntu.com/
New release '14.04.5 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

今回は無視しています。

PHPファイルが無限にダウンロードされる問題

では、ここから本題です。ひとまずトップページが見えるところまで設定して、目的の hello.php を開こうとすると、こんな感じで・・

https://i.gyazo.com/df73e987d25e682ba1aefbb1bebaa282.gif

ページ移動すらせず、とりあえずファイルがダウンロードされてしまいます。何回クリックしても、何回でもダウンロードされます。(当然ですが)

これは今回の最初の難関ですが、同時にこの後どれだけいろんなことを試してもなかなか解消されない最大の難関でもありました。実際、ぼくのダウンロードフォルダはこの hello.php が大量に溜まってしまい、ひどい時はファイル名が hello.php(17) とかになってましたね・・。

PHPをインストールする

さて、この時点では何が何やら、原因のゲの字もわかりません。

ということで、とりあえずググりまくって最初に役立った記事はこちらでした。

freefielder.jp

とくに、ここで書かれているこのコマンド。

$ dpkg -l |grep php | awk '{print $2}'

リンク先では、これによってインストール済みのPHP関連パッケージを見つける、みたいな感じでこのコマンドが紹介されていましたが、ぼくがこれを打ってどうなったかというと、

https://i.gyazo.com/e5b30de8499937eec08017468878e65f.gif

はい。何も出ないですね。なんだろう、コマンド自体間違ってるのかな? と思ってPHPのところをPerlにしてみると、

https://i.gyazo.com/8183caae7b75e6a7a360357394f9397b.gif

ちゃんと出てきます。つまり、PHP自体まったく入ってなかったんですね。これには驚きました。なんだ、そもそもPHP入ってないんかい! という。いやあ、PHPってめっちゃメジャーな言語なので、当然どこにでも入っているものだという思い込みがありました。

さて、じゃあPHP入れようよ、簡単でしょ? という感じなんですが、これはこれで逆にあちこちに情報があふれすぎていて、今回ぼくが求める最小限のインストール方法ってどうしたらいいのか、精査するのがきわめて大変でした。

結論的には、以下のブログ記事の冒頭で紹介されていた、

thr3a.hatenablog.com

最低限のラインナップ。

$ sudo apt-get install -y php5 php5-fpm

これだけにしておきました。実際にちゃんと使おう、PHP書こう、という時はこれでは足りないのかもしれないですが、今回はオプション的な情報が入るとかえって煩雑になるので。

設定ファイルを編集

さてしかし、PHPのインストールが完了してもまだファイルのダウンロードは止まりません。クリックすればしただけPHPファイルがダウンロードされてきます。

そこで、次にどうしたかというと、上記の同記事で紹介されていた以下の設定ファイルを書き換えます。

$ sudo vi /etc/nginx/sites-available/default

ファイルを開いたら、以下の箇所で5行分コメントアウトを解除します。(オフだったのをオンにする)

location ~ \.php$ {  #← 解除
#       fastcgi_split_path_info ^(.+\.php)(/.+)$;
#       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
#       # With php5-cgi alone:
#       fastcgi_pass 127.0.0.1:9000;
#       # With php5-fpm:
#
#       ↓ 以下4行解除
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
}

なお、この際、リンク先の解説では最初の行の拡張子部分にもう少し手を入れるように教えてくれていますが、前述の通り、これも今回の目的とは少しずれるのでその点は反映していません。

ここまでやってからNginxを再起動すると、

$ sudo service nginx restart

https://i.gyazo.com/4395f66a48b31f58a39e2fa3656f5126.gif

はい、やりました。ついに hello.php に移動してくれました。なんか、違うのが出ていますが・・。

502 Bad Gateway から逃れる

ファイルをダウンロードしなくなったのは大きな前進です。このまま記事を終えても良いぐらいですが、それで納得するのはぼくぐらいでしょうから、もう少し頑張ります。

現在画面に出ている「502 Bad Gateway」を消す方法については、ここまでの参考記事ではとくに言及がありませんでした。

そこでまたいろいろググりまして、以下の記事を見つけました。

qiita.com

これはこれで何というか、膨大な情報があふれていて、詳しい人にとっては有用なリファレンスかもしれないのですが、ぼくにとっては「こん中のどれを参考にすればええんや!」という感じで途方に暮れましたが、とにかく一つひとつそれらしいのを試して、結論的には以下の設定ファイルを編集すれば良いことがわかりました。

$ sudo vi /etc/php5/fpm/pool.d/www.conf

これを開いて、まず以下の2行のコメントアウトを解除します。

listen.owner = www-data
listen.group = www-data

そして、その近くに(じゃなくてもいいとは思いますが)以下を追加。

listen = /var/run/php5-fpm.sock

はい。で、php5-fpm を再起動。

$ sudo service php5-fpm restart

で、どうなるかと言うと・・

https://i.gyazo.com/7b3a99735f887250aa85cb21f9263b0d.gif

や、やりました!

iPhoneのブラウザからも見れます。(9秒の動画)

youtu.be

雑感

ということで、長きにわたるPHPとの戦いにも終止符が打たれ、ぼくも晴れてPHPerの仲間入り・・ができたかはわかりませんが、個人的にはひとつの大きな達成でした。

とくにあの、何回試してもとりあえずファイルがダウンロードされるタイムリープ世界から解放されたのは、本当になんというか、よかったです。

ちなみに、ちょっとしたローカルサーバ利用だったらべつにそんなことしなくても、ビルトインサーバ使えばいいんだよ、と言われてしまうかもしれないのですが、それは大丈夫です、わかっています、ということで。

PHP: ビルトインウェブサーバー - Manual

何しろぼくは以下のムックで、うずらさんのPHP記事、付箋ペタペタ張りながらそれなりに読み込みましたから。

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

Webアプリエンジニア養成読本[しくみ、開発、環境構築・運用…全体像を最新知識で最初から! ] (Software Design plus)

ビルトインサーバについては、その中でもちゃんと取り上げられているのです。

なので問題は、どちらかと言うと「同ネットワーク内にいる他のデバイスからも見れるようにしたい」という方ですね。その欲求に応えようとすると、なかなか茨の道だったな・・と。

また正直なところ、お読み頂いてわかったかもしれないですが、設定ファイルを書き換えた辺りについては、自分で何をやっているのかまったくわかっていません。この辺、どういう部分をどのように、なぜ書き換えるのか、ということを解読していけると、もっと面白くなるかなあとも思っています。

ともあれ、この記事によって、少なくとも未来の自分はもうPHPの同件で時間を浪費することがない(あるいはその時間を最小化できる)だろうと思っています。おつかれさまでした。

追記

本文でも勝手に登場させて頂いてしまいましたうずらさんから、大変勉強になるコメントを次々と頂いたので、以下にまとめさせて頂きます。

Twitter、あとから掘り起こすのメチャ大変なのが目に見えていたのでとにかく今のうちに・・と。
*togetter使う手も考えましたが、あれってあまり相性が良くないというか、今まで満足に使えた試しがないのでこちらで。
*途中でかたついさんがしれっと入っていますが、うずらさんが一連のツイートの間にRTされていたものです。










うずらさん、最高です。

追記2

Twitterにて、こちらのご意見も頂きました。

な、なるほど・・まったく知らなかったのですが、であれば7を入れる前提で考えた方がより汎用的な方法・情報になりそうですね。

今回の場合、一応ローカル利用特化&最低限のセットで、ということだったので5.6でも大きな問題はないと思いますが、サポートが終わってしまうなら個人的にも新しい方を入れられるようにしておきたいな、と。

ということで、次に同じようなことをやるときには、PHPインストールのくだりで7系(というかなるべく最新の)を入れる方向で調べ直し&トライし直してみたいと思います。