ふすま日記

忘れたくないことを書きます

ねのさん名前診断のコードレビュー(?)をした

クソ診断アドベントカレンダー3日目です!

adventar.org

昨日はふすまさんが

kjfsm4.hatenablog.com

を書いてくれました。ありがとうございます。

今回は診断のレビューをした話です。

発端

作者のねのさんとは、ビルの屋上から飛び降りていることで有名なイソギンチャクです

twitter.com

そのねのさんが、9/26 21:04にこのような診断をリリースしました。

どうやらねのさんの過去の名前がでてくるみたいです。

リリースから1分後(21:05)、いきなりひくたすさんがバグを踏みます。

15分後(21:21)にκeenさんが

このようなツイートをしています。

そして21:29のいてづきさんのツイートを最後に、非公開にされました。

IF とは

公式のヘルプにはこのように書いてあります。

f:id:kjfsm4:20181202164422p:plain

おそらく、一部の記号は使用することはできませんとあるので”〼”や”(” ")" がそれに引っかかってIFが実行されなくなってしまったのではないかと思います。

名古屋芋煮会2018

cookingnagoya.connpass.com

名古屋芋煮会でねのさんとエンカウントしたので、診断作成画面を見せてもらいました。

診断メーカーのリストには文字の制限があり、

  • 1つのリストは999個まで
  • 1つのリストのデータ容量は65535バイトまで(全角日本語であれば21845文字まで)

となっています。

ねのさんは、名前が多すぎてリストを2つに分けた。どちらのリストから値を選択するかIFを使って選択するようにしようとしたが、不適切な文字によりIFが動かないようだ

といっていました。

こちらからは、IFではなく

f:id:kjfsm4:20181202165358p:plain

のようにしてどちらかを選ぶようにすればいいと思うと答えました。

その結果うまくいったらしく、11/13に

無事再リリースされました。

めでたしめでたし。

なぜIFが動かなかったのか

問題は解決したのでここで終わってもいいのですが、それではただのクソ診断ブログです。

ここからは原因を考察していこうと思います。

このような診断を用意しました。

f:id:kjfsm4:20181202170527p:plain

f:id:kjfsm4:20181202170549p:plain

リスト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内で使用される文字 ’(’ ’)’ ’,’ はわかるけど

だめだった文字

f:id:kjfsm4:20181202174253p:plain

f:id:kjfsm4:20181202174418p:plain

大丈夫だった文字

f:id:kjfsm4:20181202174347p:plain

f:id:kjfsm4:20181202174930p:plain

どうも一部環境依存文字がだめっぽい。*1

さっき書いたように、

1つのリストのデータ容量は65535バイトまで(全角日本語であれば21845文字まで)

とあるので日本語は1文字3バイト、つまりutf-8ではないかと考えました。

しかし utf-8 にある文字でも使えるものと使えないものが存在し、JISコードに〠は存在し✔は存在しないのにどちらも失敗します。

結局文字による成功失敗条件は判明しませんでした。つらい。

疲れたのでおしまいです。またなにかわかったら書きます。

*1:だめだった文字を単体でリストに入れて回した結果は問題なく表示された