Smartphonemoriyoshiの日記この広告は、90日以上更新していないブログに表示しています。2018-03-22無効値の話1moriyoshi.hatenablog.com先日このような駄エントリを書いた。十分ユニットテストがあればきっと防げたであろう問題であるが、それよりも、なぜnilが必要だったのかという点で疑問を感じるコメントが散見されたので、その点を補っておきたい。用いるか値型をそのポインタ型にする必要がある。*string}どちらを採用すべきかという点では議論がある。型のセマンティクスという観点では、SQLの文字列型は母言語の文字列型とは意味論的に違いがあるものなので、前者のように専用の型をあてがうのが妥当と言える。一方で、ORマッパーというからには、データストアの詳細ができるだけモデルに露出しないほうが望ましいという考え方がある。表現していたのである。表現されたモデルを対応付けする場合にも同じような問題がある。*val.Users[0].Name)}https://play.golang.org/p/bcKXLM8UoN1encoding/jsonのマーシャリングでも、JSONの文字列型を表現する専用の型を用意してあてがうことは可能だ。nullに対応付けることもできる。型システムにおいて、無効値に相当するものが定義されていた場合に、どう対応付けを行うかという視点で考えてきた。アプリケーションの設計という意味では、また別の観点もある。SQLであろうとJSONであろうと、母言語のデータ構造との1-to-1マッピングを前提とするならば、そもそもセマンティクス上の不整合が出るようなスキーマ設計をしないということものだ。NULL制約を付加すべきで、JSONであれば、null値が来るような仕様にしないといった具合である。後者の意味合いが強い。いう特別な組み込み型が用意されていることから、JSONにおけるnullの役割は、前者を示唆するものとなっている。このように、他方言語として取り上げている2つに関してだけでも、何も対処をせずに不整合を避けることはできず、そのような観点にも一理あるといえる。(たぶん続く)*1:ただし、異なるinterface型や異なるポインタ型同士の関係演算は定義されていて、異なるnil同士の同値関係が成立する。comment2018-03-19nilが欲しいからと言ってむやみにポインタを使うとひどい目にあう話スマートフォンアプリ側の実装担当として少し関わっているあるβ版のサービスで、奇妙だが比較的クリティカルな問題が発生していた。それもメッセージが関係ない人間に届くというものであった。なんとなくその問題を担当することになったが、常に状況が再現するわけではなく、他の仕事もあったので、問題への見当を付けられないまましばらく過ごしてしまった。そのメッセージを送信する部分はサーバサイドのコードで、Goで書かれていた。そのコードのエッセンスを抽出すると、以下のようになる。値はループの中で都度作られているので一見よさそうに思えるのだが、実行してみると、時として次のような結果になるのだ。UserId=2(Goroutineのyieldするタイミングによって結果が変わるので、期待値通りになることもある。UserId=1のように、タイトルに含まれるユーザ名とユーザのidが一致することである。メンバへのポインタが与えられ続けるためだ。「ループ外」と書くと、「userはfor文より外のスコープで扱えないわけだからループの中だろ」というツッコミが入りそうだが、実際のスコープの内実はこうだ。囲まれていない範囲なので意識しづらいのだ。このコードは取り急ぎ以下のように書き換えればよい。Playground書き換えればよい、とは書いたものの、こういうコードにすべきじゃないというのが正直なところだろうか。2017などというツイートをしたところ、思ったより反響があったのでまとめておく。上記ではあいまいに「バリエーション」などと書いたが、Unicodeとそれを扱う環境においては、バリエーションと一口に言っても次のような状況がある。同じ字形で異なるコードポイントの集合aは結構なじみ深いと思う。Ideographとは区別される。Radicalsが出現し、CP932に変換できないという事案が発生したからだ。JISX0208とJISX0213で例示字形が異なることからWindowsのバージョン間でもフォントの差異があり、しばしばやり玉に上げられる「辻」などでも、最近のOS標準のIMEがIVSにも対応していることから、同様の問題が起こりそうな予感がする。両者が意味論的に等価かどうか、というのは議論の余地がある、たとえば「R」と「R」は文脈の区別をしたいからこそ字形が異なっているわけなので。formがあるかないかを基準とすることにした。2016の12/4のコミットを補足する形で書かれました。贈呈するという慣習があります。はい、もちろんオリジナルApacheモジュールですね。2016ハンドルwozozoだしやっぱりOzネタで行くしかないだろうということで、OzのApacheモジュールを実装することにする。12/411:00起床。全日の京都での披露宴参加からの帰宅で思いのほか疲れており、8時起床予定が大幅にずれる。11:30鬼平犯科帳スペシャルを見始める13:40鬼平犯科帳スペシャルを見終わる。チェックアウト13:45ビルドインストラクションを見る。