トップ 追記

日々の破片

Subscribe with livedoor Reader
著作一覧

2020-05-25

_ CoffeeScriptに地雷を埋め込んでしまって、踏み抜いた

Rails5で標準装備(特に設定とかしなくても勝手にトランスパイラが動いて処理できる)だったので、時代遅れ感はわかっていたがCoffeeScriptを使っていたのだが、とんでもない地雷を埋め込んでそれが爆発したので記録。

CoffeeScriptは書式が多少Rubyっぽいので、ときどき終端endを書いてしまうことがある。

if foo 
  console.log('foo!')
end

実際はCoffeeScriptはPythonのようなインデントベースなので上記のコードのendは不要だし、そもそも予約語ですらないのでエラーとなる。

ここで重要なのはendは予約語ではないという点で、そのためstrictモードで動作させるCoffeeScriptではReferenceErrorがスローされるということだ。

というわけで通常は上記のようなコードを書くと例外を食らうのですぐに気づくのだが、以下のようなコードを記述していたため、まったく気づかずに半年以上稼働させていた。

ready = ->
  displayStartEndPeriod = ->
    start = $('#foo-start-date').val()
    end = $('#foo-end-date').val()   # 予約語ではないので変数名として利用できる
    $('#date-disaply-div').text(formatBlaBla(start, end))
    ...
 
  fooBar = (foo) ->
    if someCondition(foo)
      console.log('foo!')
    end
 
  displayStartEndPeriod()
  fooBar($('#baz').val($('#baz').text()))
 
$(document).ready(ready)

このコードに対して、期間表示をサーバー側処理へ移動したので、displayStartEndPeriod関数を削除した。その結果、特定条件で(上のコードだとfooBar関数のパラメータfooがsomeConditionを満たす場合)例外が発生するようになった。

もちろん例外がスローされた場所はわかるので見た瞬間にfooBarのendが悪いということはわかる。

わからないのは、なぜこれが半年も稼働していたかだ。

mergeのタイミングか? とか調べても半年間上記のfooBarで動いていたことは間違いない。

でしばらく考えてやっとわかった。

CoffeeScriptが生成するJavaScriptでは、すべての変数はトップレベルの関数内に定義される。

したがって上の例からは以下のようなJavaScriptが生成される。

(function() {
  var ready;  # トップレベル関数用の変数
  ready = function() {
    var start;
    var end;
    var displayStartEndPeriod;
    var fooBar;
 
    displayStartEndPeriod = function() {
      start = $('#foo-start-date').val();
      end = $('#foo-end-date').val();
      $('#date-disaply-div').text(formatBlaBla(start, end));
    }
    ...
 
    fooBar = function(foo) {
      if (someCondition(foo)) {
        console.log('foo!')
      }
      retun end;
    }
 
    displayStartEndPeriod();
    fooBar($('#baz').val($('#baz').text()));
  }
  $(document).ready(ready);
}).call(this);

displayStartEndPeriod関数でend変数を利用しているのに対して、ready関数のスコープでend変数を宣言しているため、fooBar関数内でのendという記述が既存変数に対する参照となるために動作していたのだった。

この状態でdispalyStartEndPeriod関数を削除すれば、start,end両変数の宣言も削除される。しかしfooBar関数の中身はそのままとなる(endに対して代入が行われていないので宣言は作られない)。結果としてundefinedなendに対する参照が行われてReferenceErrorがスローされる。

なぜ、end付きifで動作していたのか実に不思議だった。


2020-05-16

_ ラストマンと縦横

kdmsnrさんがFBでくっそおもしろいラストマンの続きはどうなるんだ? とか書いていておもしろそうなので4月18日に買って、さっき1~6巻まで読み終わって、くっそおもしろいラストマンの続きはどうなるんだ? となっている。

70年代に日本アニメで育って、最近はナルトあたりを読んでいるらしきフランス人3人組のマンガ(いちおうバンド・デシネに分類して良いのだと思う)だが、20世紀マンガの文脈総ざらいの側面があってどうにもすさまじい。

日本のマンガの影響を後書きマンガなどで公言しているが、絵柄は日本のマンガではない。でも細部にいろいろそれっぽいところはある。

とにかく様々な要素を惜しげもなくばんばん投入してきて、それにほとんど破綻がない(読んでいて、あれ? なんでこうなると最初は思わなくもなかった。特に、王国から谷を抜けてマッドマックスになった時にはそう思った。思い返すと相棒が出てくるところもえ? となったな)。

最初は、主人公の少年が木の精霊の力を使う格闘技学校で訓練しているところから始まる。トーナメントへの出場が目的らしくて、同級生(嫌な奴もいればどうも恋心がなくもない女生徒とかも出てくる)間の話かと読んでいると、いきなりマッチョな好漢登場。主人公のやたらとセクシーな母親がからみ、なんでこうなるのとどんどん話が展開していくのだが、展開が唐突ではあるが、ちゃんと筋道が立っているので滅法おもしろい。魔法の国の武道大会に始まり、マッドマックス風暴力の世界での裁判、一転、ギャングの麻薬戦争、そしてベルセルク風なダークファンタジーに変わり、さてこのあとどうなるんだろうというところで7巻に続く。

特に謎の仮面戦士が良い味を出している。

4巻あたりのあとがきインタビューで作者の一人が、なぜセックスシーン(まったく露骨ではない)が日本の読者から拒否反応を受けたのか不思議だ、だってキャッツアイでもっこりとかバシバシ出てくるじゃんというようなことを書いているのが、すごくおもしろかった。というのは、おれも拒否反応はまったくないものの、そのシーンではん?となったからだ。おそらく日本のマンガ文脈では、交接そのものを示す描写は書かないからだろう。というか、画がその部分が妙に自然にセクシャルだからだと思う。どうもコンテキストの中に埋没しているのが、逆にマンガとしては不自然な感覚を受けるのだろう。というか、フランスだからかも知れないがあまりにいきなりそこまで進んでしまうからかも。ここが、文化的に一番の相違点になっていそうだ。

ラストマン (1)(バラック)

アマゾンでKindle版を購入したが1~4巻は右綴じ、5~6巻は左綴じで別の書籍コードになっているらしくライブラリが2つに分かれる。

右綴じは日本のマンガと同じページ繰りなのでその点は自然なのだが、コマ割りは左から右で、最初の2ページで話が続かなくて不思議だった(で、コマ割りが左から右へ進行と気づく)。さらにセリフが左揃えになっているので、縦書きではなく横書きだと頭ではわかるのだが、縦読みしそうになったりもする。特に字数が揃っているところはそうだ。

試し読みできる範囲だと

負けた
者だけ
交代だ

は、「たけだけだ……」とつい読みそうになる自分に気づいておもしろい。

慣れたところで、5巻以降は左綴じなので自然と左から右へのコマ割りでOKとなる。

日本語は、現在は横書きの場合、左から右なので左綴じであれば自然と読めるが、これが日本のマンガを欧米に持ち込む場合のネックというのは相当前に何かで読んだ。

要は右から左へコマが進むので、左綴じだと不自然(セリフは横書きになるわけだが)、右綴じであっても当然不自然、そのため、読者の便を考えて反転させて出版するので、日本マンガの登場人物は全員左利きで不自然ということだった。さすがに現在はページを反転させて出版したりはしないだろうとは思うが、読みにくそうだな(と思う反面、1~4巻もこちらはすぐに慣れたのだから、わざわざ日本のマンガを読もうという人達には屁でもないのだろう。でも、マスで売るものは、現在でも反転させていたりするのかな?)

同じく、縦書き2行の吹き出しに、横書きにするとえらくハイフネーションされまくって読みにくそうだが、そのあたりはどう処理しているんだろうか?

# このマンガの今気づいたすごく良い点は、どの登場人物も次々変化する文化状況に対して不思議がることはあるのだが(精霊の国から出て来てテレビを目にすればそりゃ不思議だろう)、すぐさま状況を受け入れるところだ。だから政治目的や欲望遂行のための暴力や敵対はがんがんあっても、文化的対立がまったくない(解放戦士はいるけど文脈が異なる)のはとても教育的だ。


2020-05-02

_ マイナポータルで特別定額給付金の申請(と思ったら違ってぴったりサービス)

マイナンバーカードを持っていると特別低額ではなく定額給付金の申請がオンラインでできるというので、マイナポータルからわかりやすい導線に従って進んでいったら、PCにカードリーダライタが必要とわかってしょんぼりしていたところ、塚本さんが『特別定額給付金の申請をオンラインで済ませた』というノートを書いていたので、ならばスマホでやってみるかと再チャレンジしてみた。塚本さんはiPhoneだがおれはAndroidだ。でもおそらくMIFAREだろうからどちらにしても使えるはずだ(と思ったら、Type BでMIFARE(Type A)でもFelicaでもなかった。富士通の『マイナンバーカードの技術仕様と利活用方式』は良い資料だ)。

最初、普段使いのGalaxy A30(マイナポータルで、サポート対象なのは確認済み)にマイナポータルAPをダウンロードしたのだが、いきなりPINを入れろと出て来てびびる。読み込んでからPINなら間違い回数がわかるけど、間違えて入力して読み取りに自動再試行で失敗しまくればあっという間にリトライオーバーでロックされちゃうんじゃないか? と不安を抱えたままのスタートとなる。

まあ、実際間違えていたのだけど。

あと、一瞬Chromeが開いてぱっと消えるのも不安要素ではある(自動的に閉じない場合はクリックとやっと読めたが、自動で閉じるので一瞬フロントに出て来てあっという間にバックに回るので怪しいことこの上ない。というか最初からChrome専用のWebサイトにしたほうが良いんじゃないか? QUICPayとかそうだし)。

でPINを入れて、次へをクリックすると、設置しろと出て来てこれまた疑問がたくさん。しかしいろいろ試したら、ある位置に置くと動作が開始して、そして「動かすな(エラーコード)」と表示されておしまい。動かしてないのにおかしいな? と何度も試したが、1回だけ「暗証番号が違います」が表示されたので、あわてて、マイナンバーカード受領時の紙を探すことにした(少なくともあと2回はチャンスがあるのがこれでわかったからそれはOKでもあるけど)。探したら、区役所の妙な色(蕎麦の実色に緑の字)の封筒が出て来て、中にウサギ(マイナちゃんというらしい)の顔が見えたので一安心。

だが、正しいPINを入れても読み取りエラーになることは変わらない。メッセージは常に「動かすな」なのだが、動かしていないから、SYN-ACKまでは進むが(TCP/IPではなくても、通信は最初のエスタブリッシュフェーズは短いコマンドでやるものだ)、その後が続かないような状態なのかな? ということは伝送長によって不安定になるということだろうと考える。データ転送中にパケットが消えるので「動かすな」というのは悪くないメッセージかも知れないが、この場合は当てはまらない。

そういえばBluetoothも繋がりが悪いのだった。そういうマシンなんだろう(個体問題かも知れないし、もしかすると、附属していた薄いカバーのせいかもしれない)。カバーを外してリトライする気にはならないのであきらめてアンインストールした。

ついでにエラーコードをマイナポータルのお問い合わせに投げ込んだ。A30はサポート対象なのだし、途中まで進むのだから一応、原因は聞いておきたいし。ちなみに、ここの導線は最悪だった。お問い合わせフォームに最短時間で到達するのを競うゲームが作れそうだ。

が、ふと気づくと、Pixel 3aが予備機として手元にあるのだった。しかもこいつは普段使いではないので剥き身のままだ。

で、再度、マイナポータルAPをダウンロード・インストールして再試行。

するとするする進む。読み取り位置は上半分にカードを横向きが安定している。2020年7月に証明書が切れるから役所で更新しろと注意がポップアップされるが、オンライン更新できないのかな? この場合はEMV接触型ICチップのほうを利用するのだろうか(前述の富士通のPDFにも更新については記述されていない)?

最初にPINを入れて読み取ってログイン、特別低額給付金の申請に進み、郵便番号を入力してサポート対象の地区かどうかを判定、いよいよ申請となると再度PIN入力、読み取って名前や住所を自動入力、振込先のエビデンスを求められるので最近よく利用するようになったソニー銀行のホームページを開いて写真を撮ってアップロード(どうでも良いけど、こういう場合、URLに銀行名ではなくMONEYKITとかいうわけのわからないドメイン名を表示するのはエビデンスとしては使いにくいし、どこにもソニー銀行という文字がなくて閉口する。良くみたらタイトルバーにはソニー銀行と出ているので、そこも撮影範囲にした。

最後に、暗号化して送るので署名用暗証番号(番号ではないが)を入力して再度読み取りなんだが、書き込みとかやるせいかえらく時間がかかって相当不安感を覚えたが無事完了。

というわけで、申請は完了。

A30でもたついたことと、問い合わせフォームダンジョン探索を除けば、なかなかうまくできていると思う。楠さんがいろいろ呟いている通り、相当良いものだ。

ところが、メーラを見たらPDFが添付されたメールやらメール送信確認のお知らせなど計3通が、【ぴったりサービス】というわけのわからない件名で来ていて、なんのフィッシング詐欺か? と驚いた。

ヘッダを確認すると送信元がsendgrid.netだから怪しいといえば怪しいが、return-pathなどはちゃんとmyna.go.jpになっているのだから、件名にもマイナポータルと書けばいいじゃんと思わざるを得ない。

が、スマホのほうを見るとマイナポータルAP(に起動されたChrome)の画面に「ぴったりサービス」って書いてあった。怪しい名前だけど、そういうものなのか。

何がぴったりサービスかわからんが、マイナポータルAPが制御するまま、そんな名前のサイトで作業していたのかと気づかずに入力していたことに愕然とした。(多分、ここからは「ぴったりサービス」のサイトで行いますのようなメッセージがあったのかも知れないが、まったく意識していなかったわけで、フィッシングに引っかかる典型的な行動だったのだな)

国内版SIMフリー Google Pixel 3a 64GB Clearly White(-)


2020-04-22

_ Rubyの状態変数の値

状態変数を利用したプログラムを実装するときに、あまり何も考えずに、Numeric定数を使ってしまって失敗した。

 STATE_A = 1
 STATE_B = 2
 STATE_UNKNOWN = 99
 ...
 case @current_state
 when STATE_A
   ...

あとからステートパターンを実装することを考えたら、そこはSymbolを使うべきところだった。

 STATE_A = :state_a # 不要だが、ステート一覧を示すための宣言と考える
 STATE_B = :state_b
 ...
 if self.respond_to?(@current_state)
   @current_state = self.__send__(@current_state)
 else
   raise "unknown state #{@current_state}"
 end
...
 def state_a
  if foobar
    STATE_B
  else
    STATE_A
  end
end

追記: よく考えたらstateを算術演算しているわけではないから中身をSymbolにしたら解消した。型指定がなくてよかった。


2020-04-18

_ 恐ろしき媒(なかだち)

いつ買ったのか忘れたが、1928年(昭和2年)刊で2009年に復刻された岩波文庫の恐ろしき媒を読了。といっても200ページに満たない戯曲。

書いたのはホセ・エチェガライというまったく知らない人だが、あとがきによるとノーベル文学賞(1904年)も取っているらしい。

久々の旧仮名旧字體で最初の数ページは読むのが苦痛だったが(例えばあとがきを読まずに普通に読み始めてしまったので、登場人物のところに記述された場所の馬徳里に最初マレーシアかいやそんなはずはあり得ないから多分マドリードでスペインのようだと思いつくまでで数10秒のラグが生じる)割とすぐに読み方を思い出して普通の速度で読めるようになった。なんでもやっておくものだ。

登場人物はテオドーラという20歳の妻、ドン・フリアンという40歳のその夫、ドン・セペーロというフリアンの弟、ドニヤ・メルセデスというセペーロの妻、ペピートというセペーロ夫妻の子供(20は越えているようだ)、そしてエルネストという24だか26歳だかの青年で、そのほか證人(この時点では意味わからなかったが要は決闘の立会人なので、それを知らずに読み進めたため、突如として血腥くなって驚いた)と下僕が出てくる。1800年代、近代になっている。

最初(プロローグの幕がある)、エルネストの部屋をフリアンが訪れる。エルネストは戯曲を書いているが、うまく書けずに困っている。フリアンはエルネストの父親の資金援助を受けて大成功して富豪となったため、恩義に報いるためならエルネストには何でも提供してやろうと考えている。少なくとも、冒頭を読んで、フリアンってのは実に良い奴だな、と感心する。

エルネストが困っているのは、書きたい題材は噂話のネットワークという世間様なのだが、戯曲という限られた空間、限られた人数による表現で、どうすれば世間様ネットワークを構築すれば良いのか見当がつかないからだ。

ウェルテル的人物なのでエルネストを観客代表とみなして作劇しているのがわかる。

さて物語が幕を開ける。

冒頭で示された人間関係がテオドーラ、フリアン、エルネスト3人の会話で克明に描写される。エルネストはフリアンの好意(部屋と小遣いと資金援助)に心底感謝している。フリアンは自分がエルネストの父親から受けた恩義に報いるためなら全財産をエルネストに与えても良いくらいの勢いである。その妻(20歳の年の差が具体的に示されるのは2幕だが、エルネストのフリアンのことを父親、テオドーラのことを妹として扱う様子から若いことはわかる)は、そういう律儀な夫のことを愛し尊敬している。とても良い関係である。

エルネストはフリアンの好意に甘え続けることに内心忸怩たるものがあるため、独立についてフリアンに話す。フリアンはエルネストを秘書として雇うことを提案する。意見が一致し、フリアンは別口で来ていた秘書の紹介を断るための手紙を書きに場を離れる。

そこセペーロとメルセデス、ペピートが観劇から帰って来る。そして世間ではフリアンたちが話題になっているということをほのめかす。何のことか見当もつかない2人が戸惑っていると、その戸惑いを見て3人は、噂の正しさを確信する。そもそも2人だけでいることがおかしい。

そこにフリアンが戻って来るので、再び世間の噂をほのめかしながら、エルネストを家から追い出すべきだとセペーロはフリアンに進言する。あまりのばかばかしさにエルネストは家から出ることをフリアンに告げる。

2幕、エルネストが独立して住んでいる家をフリアンとセペーロが訪問する。が、エルネストは留守だ。

フリアンは怒っている。噂のせいで、自分が妻とエルネストを見る目は以前のようにはいかなくったのだ、事実自分は40歳で妻は20歳、エルネストは美青年で24歳でお似合いだ。そんなことがないのはわかっているのだが、それでも疑念を持たされてしまったためにもう元には戻れない。お前が悪い、とセペーロに詰める。セペーロは、おれは兄貴と家名のために噂を紹介しただけでそんなことは考えてもいないという。(言葉の端々で、セペーロはエルネストのことを財産を使う寄生虫のように考えていることが明らかになり、当然、テオドーラとの仲も噂通りだと信じていることがわかる。そして家名と財産と同様に兄の名誉も大事に考えていることもわかる)。

そこにペピートが入って来る。エルネストが、噂話を耳にしてその噂を口にした子爵を殴ったために決闘の約束をしたと告げる。

フリアンはそれは自分の役目なのだと宣言してセペーロと共に出て行く。

ペピートが独白する。テオドーラは美しい。したがって噂は正しいに違いない。要は自分がテオドーラに横恋慕しているために、噂話に真実があると確信しているのであった。(エルネストの愛読書の神曲が机の上に置かれているのを眺めながら。場面はパオロとフランチェスカ・ダ・リミッニがランスロとギネヴィアの本を読んでいるところとなっていることで確信するのだが、冒頭からエルネストが仲立ちについて考察するためにそこを開いていることを観客はわかっている)

そこにエルネストが登場。2人で言い合いをしているところに下僕がやって来て、ご婦人が訪問ですと告げる。それじゃおれは行くわとペピートは気を利かせて帰る。

やって来たのはテオドーラで、決闘をやめてくれと懇願する。そうはいかないとエルネストは答える。でも、実際に2人の間の愛情は兄と妹のようなものでまったくの潔白なのに、決闘を受けて立ったら本当になってしまうではないか。名誉を傷つけられたのは夫なのだから戦うのは夫でなければ筋が合わない。でも子爵は強いから死にますよ。夫を侮辱するのですか? と、困った話し合いになったところに下僕がいっぱい人が来たと告げる。そもそも独身男の部屋を既婚のテオドーラが訪問しているのは噂話に尾ひれがつくので厄介だから、寝室に隠れていてくれと寝室に通す。

フィガロの結婚のような人に入れ替わり立ち替わりによるドタバタ劇でおもしろいが、話が深刻なので愉快ではない。

入って来たのは血まみれで瀕死のフリアン、セペーロ、ペピートと證人。(決闘の場所が同じ家ということになっているため、フリアン邸ではなくエルネストの部屋なのは合理的)

3人はフリアンを寝かすために寝室に入れようとする。必死に止めるエルネスト。わけがわからんとペピートとセペーロが扉を開けるとテオドーラが飛び出してくる。やっぱり、そうなんだとペピートとセペーロと瀕死のフリアン。わけがわからなくなってエルネストは飛び出していく。

3幕。フリアンは瀕死の病床でテオドーラとエルネストを呪っている。本気で殺そうとしている。

セペーロとメルセデスとペピートが話しているとエルネストが入って来る。フリアンに釈明したいというのだ。エルネストはいきなり子爵に再決闘を申し込んで見事に仕留めたことを語る。

セペーロはそれを許さない。エルネストは人を一人殺したことで完全に狂犬状態になっているのでセペーロを脅しつける。セペーロが屈服しつつあるところに、テオドーラが入って来ようとする。絶対に合わせないとセペーロとメルセデスが強行に出るのでエルネストは部屋を出て行く。

さあ、本当のところを白状させるて兄貴に謝らせるとセペーロが息巻くと、ここは私にまかせて男は引っ込んでとメルセデスが1人きりでテオドーラを迎える。

ここではメルセデスの真意がわかる。彼女は浮気をしたくてたまらないので、当然機会があるテオドーラがエルネストと浮気していることが前提となるのだ。かくして、あらゆるカマをかけまくる。呆れ果てるテオドーラだが、何を言ってもメルセデスには通用しない。

全員が集まる。フリアンは最後の力を振り絞ってエルネストを殴る。エルネストはあまりのばかばかしさにされるがままとなる。フリアン死ぬ。テオドーラは気を失う。

さらにやいのやいの攻め立てるセペーロ、メルセデス、ペピートに対して、気絶したテオドーラを両腕に抱きかかえたエルネストは、わかったわかった愚かな世間よ。お望みの結末をお前ら犬畜生にくれてやる。これで満足だろう、と2人(テオドーラは気を失ったままだが)で扉を開けて去って行く。

悲劇なのは間違いないし(言葉遣い)、会話は巧妙(とくに1幕の終わりの気分の悪さ(何もやましいことがない3人の間に徐々に疑惑が入り込むところ)や、2幕から3幕にかけて、弟家族の本心が透けだしてくるところ)、場面転換のうまさ、密室劇に近いのに入れ替わりをうまく利用した演出の幅の取り方、文句ない傑作だった。

しかし、あまりにもエルネストを高潔な文学青年として書いているため(というか、そういう観客設定だろうし)意図せぬ喜劇性がそこかしこにあって、おもしろさまでもが抜群になっていた。最後はあまりにもエルネストがかっこよすぎだろうし、一方で、おっさん代表にされてしまったフリアンの最後のみっともなさは酷過ぎる。

おもしろかった!

恐ろしき媒 (岩波文庫)(ホセ・エチェガライ)

ザンドナーイのおかげでフランチェスカ・ダ・リミッニの物語を知っていたのでおもしろさ3倍増はしている。

Francesca Da Rimini [DVD] [Import](Zandonai)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|

ジェズイットを見習え