ねのさん名前診断のコードレビュー(?)をした
クソ診断アドベントカレンダー3日目です!
昨日はふすまさんが
を書いてくれました。ありがとうございます。
今回は診断のレビューをした話です。
発端
作者のねのさんとは、ビルの屋上から飛び降りていることで有名なイソギンチャクです
そのねのさんが、9/26 21:04にこのような診断をリリースしました。
メモ#日替わり名前欄https://t.co/FtjvrzR40T
— ねのぎんちゃく/冬コミ落選 (@neno_n0) September 26, 2018
どうやらねのさんの過去の名前がでてくるみたいです。
リリースから1分後(21:05)、いきなりひくたすさんがバグを踏みます。
=IF(75 <= 59 ,痛み入り〼 ,針の筵耐久試験)#日替わり名前欄https://t.co/asi4eJcBOP
— ひくたす (@hiktus) September 26, 2018
こわい
15分後(21:21)にκeenさんが
=IF(21 <= 59 ,ねの(27さいになりました) ,すきな名前をいれてね)#日替わり名前欄https://t.co/bXD8ooWiwe
— κeen (@blackenedgold) September 26, 2018
このようなツイートをしています。
そして21:29のいてづきさんのツイートを最後に、非公開にされました。
IF とは
公式のヘルプにはこのように書いてあります。
おそらく、一部の記号は使用することはできませんとあるので”〼”や”(” ")" がそれに引っかかってIFが実行されなくなってしまったのではないかと思います。
名古屋芋煮会2018
名古屋芋煮会でねのさんとエンカウントしたので、診断作成画面を見せてもらいました。
診断メーカーのリストには文字の制限があり、
- 1つのリストは999個まで
- 1つのリストのデータ容量は65535バイトまで(全角日本語であれば21845文字まで)
となっています。
ねのさんは、名前が多すぎてリストを2つに分けた。どちらのリストから値を選択するかIFを使って選択するようにしようとしたが、不適切な文字によりIFが動かないようだ
といっていました。
こちらからは、IFではなく
のようにしてどちらかを選ぶようにすればいいと思うと答えました。
その結果うまくいったらしく、11/13に
新年#日替わり名前欄https://t.co/FtjvrA8ESr
— ねのぎんちゃく/冬コミ落選 (@neno_n0) November 13, 2018
無事再リリースされました。
めでたしめでたし。
なぜIFが動かなかったのか
問題は解決したのでここで終わってもいいのですが、それではただのクソ診断ブログです。
ここからは原因を考察していこうと思います。
このような診断を用意しました。
リスト1の値から0か1が出てきて、1ならリスト2,0ならリスト3の値を呼び出します。 JSONで表すならこんな感じです。
{ "text": "=IF([LIST1] = 1 , [LIST2] , [LIST3] )", "LIST1": [ 0, 1 ], "LIST2": [ 1 ], "LIST3": [ 0 ] }
この状態で診断を回すと、結果は0か1になります。
ねのさんの例ではIFの返り値に〼が含まれていたときに失敗していたので、リスト2の値を〼にしてみます。
{ "text": "=IF([LIST1] = 1 , [LIST2] , [LIST3] )", "LIST1": [ 0, 1 ], "LIST2": [ 1, 〼 ], "LIST3": [ 0 ] }
これで回すと、”0”や”1”が出力され成功するときもありますが、たまに”=IF( 0= 1 , 〼 , 0 )”のようにIFが解釈されずに出力されます。
想定通り、返り値の候補に不適切な文字が入っているとIFの解釈が行われないようです。
不適切な文字とは
では不適切な文字とはなんでしょうか。IF内で使用される文字 ’(’ ’)’ ’,’ はわかるけど
だめだった文字
大丈夫だった文字
どうも一部環境依存文字がだめっぽい。*1
さっき書いたように、
1つのリストのデータ容量は65535バイトまで(全角日本語であれば21845文字まで)
とあるので日本語は1文字3バイト、つまりutf-8ではないかと考えました。
しかし utf-8 にある文字でも使えるものと使えないものが存在し、JISコードに〠は存在し✔は存在しないのにどちらも失敗します。
結局文字による成功失敗条件は判明しませんでした。つらい。
疲れたのでおしまいです。またなにかわかったら書きます。
*1:だめだった文字を単体でリストに入れて回した結果は問題なく表示された