夏の怪異―Python3のクラス変数のスコープ

さて、今日Pythonを書いていたら、妙なエラーに遭遇した。同じ役割を持つ変数をまとめておくためにクラス定義を用いて以下のようなコードを書いた(このようなクラスの使い方は悪くはない)。

これを見ただけで「あっ…」となる人はすごい。なんとこのコードは以下のようなエラーを吐く。

原因究明に時間を要したが、説明しているブログがあった。

【python】クラス変数のスコープには注意が必要

python - Accessing class variables from a list comprehension in the class definition - Stack Overflow

要約すると、クラス変数の中にスコープがネストされた場合、クラス変数の定義されたスコープは読まないよ、ということを言っています。リスト内包表記はスコープを作るので、この問題が起こります。

PEP 227 -- Statically Nested Scopes | Python.org

「それができるとメソッド定義で事故るだろーが、親切なpython様が対策してやってるんだよ」と書いてあります。

なるほど…。全然知らなかった。Pythonでは内側のスコープから外側のスコープを読めないということは原則的にはないので驚いた。

なお、本日書いたなかでぶっちぎりのクソコードはこれ。PythonとRubyはよくライバルみたいな扱いされるけど、こういうのを書いているとRuby使いたいと思う。でもPythonの方がライブラリが充実してるんだよなあ。

疲労

※この日記はキンキンに冷えてやがる『KIRIN 一番搾り』を飲みながら書かれた。

美味すぎて言葉が出てこねえ…

緊張感

今日は久々に他人に対して責任のあるプログラムを書いた。やはりPythonは僕のホームだ。昔から使い続けている言語なので、自分の進歩も感じられて楽しい。

明日は早い予定なので、おやすみ。

大事なことは全部

実験に必要なのでArduino(正確にはマルツ製の互換品、その名も『Marduino』)に圧力センサを繋いでPythonで読めるようにした。デバイスレベルからなんやかんやするのはかなり久しぶりだ。小学生の頃にサッカーロボットを作ったが、説明書のとおりに組み立てただけでメインはプログラミングだった。タイルを並べて条件分岐やパラメータ調節ができるようになっていたと記憶している。当時は『子供の科学』を購読していて、そこに連載されていたJavaScriptのコードを書き写して九九表を表示させたり、ちょっとした電子工作でフォトトランジスタの信号を音に変換してスピーカーをブーブー鳴らしたりして遊んでいたものだ。

それにしても当時ははんだごてを使っていて熱に弱い部品を壊してしまったこともあったが、今の電子工作はブレッドボードにピンをスポスポ刺していくだけで完成してすごい。いや、昔からブレッドボードってあったと思うんだけど、なぜだかそういうものを使った記憶がほとんどない。

圧力センサーを1つ接続したときは問題なく動作したが、2つめを並列で接続すると2つめは反応しなかった。回路の設計が悪いのか、はたまたいじっているうちにどこかを壊してしまったのかと1時間ほど悩んでいたのだが、丁寧に原因を切り分けてみるとどうやら導線のうち1本が初期不良で電流が不安定になっていたようだ。秋月で買ってきた新品なので油断していた。それにしても導線の初期不良って普通ある?どうやったら不良品作れるのよアレ。

今回の工作は実際のところネットの先人の体験談のとおりにやっただけだ。サークルの先輩の「大事なことは全部ネットに書いてある」という言葉は本当に至言だと思う。もちろんこの手の主張には「ネットに書いていないこともある」という留保がつくのがお約束だが、検索して書いてあるとおりにやるスキルさえあれば素人でもかなりいろいろなことができる時代になっていると思う。

既存のデバイスを使わずに自分で作ったのは、既存のデバイスがアメリカのいち企業によって開発されたもので、ググッてわかることが少なく、その企業の提供する様々なツールを使わないと触れなかったからだ。僕が作りたいのはあくまで実験のための道具であって芸術品ではない。素早く思い通りに操れることが大事であって、何年も使い続けられる堅牢さや充実したサポートは求めていない(そもそもいち企業が真に「充実」したサポートなど提供できるものか)。

僕がそれなりにプログラミングができるようになったのは(?)ネットの力だ。プログラミングの情報はググれば出てくる。それは凄いことだ。心理学の情報は大学がクソ高い金払って購読している論文誌を読まないとわからないからね。ググればわかることをちゃんとググれること、あるいはググればわかるようにちゃんと情報を出していくことが大事な時代だと思う。

左手の重さ

歴史書に載っていないひとりの男の話をする。

男は1925年に4人きょうだいの次男として生まれ、満州国で育った。ちょうど戦争に行く必要がない年齢だった男は船乗りになり、船乗りを育てる教師となった。結婚して息子と娘が生まれ、やがて5人の孫を得た。書に堪能、持ち物や衣類に隙のないセンスがあり、中国語の教育にも携わった。妻が死んでからは息子の家族とともに暮らしていたが、4番目の孫が18歳のときに肺炎で死んだ。

男の葬式には多くの人が来た。本当に多かった。それは教師という職業によるものもあるだろうし、またそれだけでは説明のつかない部分もあった。肉体から解き放たれ、知り合いの僧侶に海にちなんだ新しい名前を授かり、男は妻と同じ世界へ旅立った。

 

今日、食堂に入る階段を降りながらふと入り口のガラス戸を見ると、僕の動きが奇妙に左右非対称で笑ってしまった。だが人体は左右非対称だ。臓器もそうだし、脳もそう。ヴァイオリンを本格的に練習していた頃は左手の指先だけ硬かった。身体だけではなく、身に付けるものもだ。左のポケットには財布、右のポケットにはスマホ。そして何より、僕はいつも左手に腕時計をしている。

その安くも高くもない、しかし止まったこともない腕時計を見るたびに、僕はある男の声を思い出す。歴史書に載っていない男の声を。

時間泥棒

今日は日曜にもかかわらず論文でも読もうかと思っていたのだが、ネトフリで配信している『フラーハウス』を7話まで見た。前作『フルハウス』は子供の頃のテレビで放送していたのを何度か見ている。『フルハウス』では男3人が娘3人を育てる話だったが、『フラーハウス』は女3人が息子3人を育てる話だ。アメリカらしい思い切った切り替えだと思う。

アメリカのドラマを見るのは好きだ。これまでだと『glee』『ビッグバン★セオリー』『プリズンブレイク』『ER』をそこそこ見た。やはり日本とは価値観やコミュニケーションの方法が違っていて面白い。また、日本語版が制作されるほどの人気作ともなれば当然脚本や演出のレベルも高い。メッセージ性と娯楽性をハイレベルで両立している作品がアメリカではヒットするようだ(日本のドラマは全然見てないのでよく知らない)。頻繁に取り上げられる社会問題としてドラッグ・虐待・差別などがあり、他にも退役軍人が尊敬されるとか家が広いとか、奨学金を返すのがしんどい(たぶん日本よりも借りる人が多い)とか、日本とは違う文化も読み取れる。

最近だと中国のアニメがよく日本で放送されている。『霊剣山』は神仙思想がベースにあってよくわからなかった。『TO BE HEROINE』はギャグの中にも社会制度の息苦しさを感じさせる描写がもりこまれていた。中国共産党による規制こそあれど、中国の文化に沿って中国語で作れば消費者は13億人。日本の10倍だ。これから伸びてこないわけがないだろう。人口の力という点ではインド映画も気になるところだ。『きっと、うまくいく』と『ムトゥ 踊るマハラジャ』しか見たことがないが…。

こうして海外の文化に触れてみると、逆に日本の文化が海外にどう受け止められているのかも興味深い。僕は日本のコンテンツだとアニメしかよく知らないのだが、学校文化はかなりドメスティックなものとして受け止められている気がする。

それにしても、国境を超えて様々なコンテンツに触れられるようになったというのは凄いことだ。僕が大学1年生のころはまだツタヤでDVDを借りていた。今思えばデジタルデータが記録された物理媒体を借りるために物理身体を移動させるというのは甚だ奇妙な話だ。最近ツタヤは減っているそうだが(僕の近所のツタヤも閉店した)、これは当然のことだと思う。

一方で古いマイナー作品で権利管理が不明などという状態の作品だと、市場に流通している物理媒体以外に見る方法がないものもある。たとえばおおすみ正秋監督の『走れメロス』はアニメファンの間では有名なハイクオリティ作品だが、合法的に見る方法はVHSしかない。ツタヤの総本山である渋谷・新宿はこのようなマイナー作品も多く取り揃えており、なくなって欲しくないと思う(今調べてみたら『走れメロス』は置いてなかった)。

be caught in the rain

毎週土曜はコインランドリー、そして日記もいつもコインランドリーのことを書いていてマンネリを感じないでもない。

今日はコインランドリーから帰るときに雨に降られた。といってもコインランドリーは自宅から290m徒歩3分なのでどうということはない。洗濯物も軽く乾燥して自宅で干すので多少濡れても問題ない。

雨に降られて道を走っていると、自分がその場所にいるということを強く感じる。考え事をしながらだとかツイッターを見ながら道を歩いていてもそういうことは感じないのだが、雨に降られていると早く家に帰りたいとか木の下を走ろうとか考えるので、場所や空間のことを強く意識するのだと思う。

僕はときおり、道に寝転がりたいと思う。夏の夜にコンクリートはひんやりして気持ちよさそうだと思ったり、コンクリートはどういう触感なのか気になったり、はたまた単に疲れていたり、いろいろな理由がある。しかし実際にやったことはない。小学生のころは平気で道に座って寝転がったりしただろうが、大学生になってからはない。なんどか本気で試みたのだが、ついにできなかった。誰かが見ているかもしれないとか、道は公共の場所なのでそんなことをすべきでないとか、いろいろと理由をつけてはいるが、事実として僕は道に寝転がることができない。

子供の頃は自分はなんでもわかっているつもりだったし、自分を子供扱いする大人に苛立ったりもした。そして大人になればもっと自由になれると思っていた。しかし法律的・身体的には間違いなく大人になった今、僕は「子供はものをわかっていない」と思っているし、道に寝転がる自由を失った。

ところでHyperappで2つのactionを連鎖的に呼び出したいとき、具体的にはinputへの入力をstate.onePropertyに反映しつつ、さらにその新しいstate.onePropertyに基づいてstate.anotherPropertyを再計算したいとき、どういう風に書くのが美しいのだろうか。

現状こんな風に書いているが、ひとつの関数で2つの作業をしており、美しくない。2つめ(4行目)の操作を他の場所でも使いたいときに、2つの作業を別々の関数にしておいたほうが便利だ。そう素朴に考えたのだが、

これは上手くいかない。値を入力しても即座に元の値に戻ってしまう。多分Hyperappから呼ばれるupdateにはstateが渡されるが、updateから呼ばれるupdateInputやreCalculateにはstateが渡されていない。

こうすると望み通りの動作をするが、actionsの中に形式の違う関数が混ざっていていいのかどうか疑問がある。別の場所にhelperみたいなオブジェクトを作ってそこにしまっておきたい気がする。

Hyperappは書きやすい。楽だ。しかし「どう書くべきか」というノウハウが見つからない。自由は苦痛だ。自由を捨てよ。

シネマイレージ

※この日記は『アサヒ スーパードライ』を飲んで寝てしまった翌朝に書かれた。

昨夜は『万引き家族』を見てきた。パルムドールは伊達ではなく、素晴らしい作品だった。良すぎて「あれがよかった」「これがよかった」などと列挙することができないのでとりあえず観よう。

さて、昨日映画館に行ったときにシネマイレージカードを作った。ざっくり言うと6本見ると1本タダになるサービスだ。年間300円の更新料はかかるが1回タダ見すれば回収できる。いつか作ろうと思いつつずっと作らずにいたのだが、今年の夏は映画をたくさん見ることになりそうなので思い切って作った。『未来のミライ』はダメそう。『ペンギン・ハイウェイ』に期待している。

酒を飲んで寝てしまったので昨夜のアニメを見ていないし、今朝のゴミ捨てにも失敗してしまった。つらい。

図書館

今日は久々に大学の総合図書館に行った。僕は図書館の文献が必要になったことがほとんどない。今日も研究目的ではなくいつもと違う作業空間と刺激を求めてのことだ。以前図書館で返却された本を棚に戻すだけの非人間的なバイトをしていたことがあるのだが、図書館は知識が圧倒的な密度で集積されている空間であり、ただ歩いているだけで知的好奇心を刺激する。手にとって読んでみたい本は数多あれど、実際に手に取るのはその10%で、読み終えるのは1%、完全に理解するのは0.1%だろうが。

総合図書館はずっと工事中だ。地下書庫やら学習スペースやらいろいろ作っている。しばらく閉館していたこともあったし、2年前から入り口は2回変わっている。今も完成しているのかよくわからない。

僕が以前の図書館で楽しんでいたのは新聞コーナーだ。紙の新聞は情報を俯瞰するという意味では効率的だが、資源・運搬・保存の観点からは極めて非効率的だ。だが図書館が新聞を取ってくれてそれを読みに行くのならば後者のデメリットを気にする必要はない。さらに図書館が新聞を集約してくれると複数の新聞を読み比べることもできる。

残念ながら新聞コーナーはなくなってしまった。そもそも以前の入り口が書庫になり、以前のミーティングルームはコピー機置き場になっている。都合のいい場所が取れなかったのだろう。

元気になった

※この記事は『金麦 RICH MALT』を飲みながら書かれた。

昨夜は発表が不安だったが、寝て起きたらどうでもよくなっていて、どうせならと二度寝してから大学に行った。なお前の担当者の発表が長引いたので僕の発表箇所は1/3ほど終わったところで次回持ち越しとなった。

睡眠は偉大だ。僕の人生のプライオリティは

  1. 1日1度の食事
  2. 睡眠
  3. 2度目以降の食事

となっている。1日1度の食事さえとれればあとは無限に寝ていたい。さらに睡眠には眠気がとれるという副産物まである。また、睡眠は認知症のリスクを減らす数少ないエビデンスのある予防法でもある。

夕方からは駒場キャンパスに行った。研究室メンバーが駒場にあるMRIを使った実験をするにあたって、頭部を固定する新しい器具の使い勝手を確認する実験台になった。自分が実験台になるのは好きだ。実験参加者になっているときの僕はいっさいの知的行動をしなくてよい。実験者の指示に正確に従い、下手な勘ぐりをせず素朴に行動することが求められる。実験中に何か事故が起きたとしても、その責任は100%実験者の側にある。従属の快感というのは自分でものを考えなくてもいいという安心感や気楽さに起因するのかなとふと思った。

電車での帰り道は将棋の名人戦を見ていた。「見ていた」と言っても4G回線でニコ生を見ていたわけではなく、ツイッターや5chで情報収集していただけだ。お互い残り時間が減ってきて、しかも形勢はほぼ互角というアツい状況で5chの実況スレをリロードしたとき、事件は起きた。

コイツだ。半年ほど前から認知され始めた迷惑系広告である。戻るを連打しても元のページに戻れない。1分1秒を争う緊迫した勝負の情報を集めているときに邪魔されるのは本当に迷惑だ。神奈川県警は早くこれの配信元を逮捕してくれ。あくしろよ。

名人戦は佐藤名人の防衛に終わった。