
接触確認アプリCOCOA、地域ごとの日付フォーマットの違いで利用日数が狂う新たな不具合 97
不具合 部門より
重大な不具合の指摘が放置されていたことでも問題となった厚生労働省の接触確認アプリ「COCOA」だが、GitHubリポジトリの運用が内閣官房情報通信技術(IT)総合戦略室に移管され、PullRequestやIssueを歓迎する方針に変わったことで、OSSコミュニティとしての賑わいを見せ始めている。
そこで3月8日に報告されたIssueのひとつが端末の言語を変更後「プライバシーポリシーの改定」が再表示されるというものだ。話を総合すると、利用端末の地域と言語を日本に設定してCOCOAを利用開始すると日付が「年/月/日 時:分:秒」(yyyy/mm/dd hh:mm:ss)フォーマットで保存されるが、その後、地域と言語を欧州のものに変更してCOCOAを再起動すると日付を「日/月/年 時:分:秒」(dd/mm/yyyy hh:mm:ss)フォーマットで読み込もうとして月と日が入れ替わってしまう。その結果、利用開始日数の表示が狂ったり、同意したはずのプライバシーポリシーが再表示される、あるいは改定されたプライバシーポリシーが表示されないといった現象として表れるという。この不具合は今年2月にリリースされたVer.1.2.2で混入したものとみられている。
なお、先述のIssueは報告者自らcloseしたため、3月9日に別の報告者が各種日付がロケール依存のフォーマットで保存されるとしてIssueを上げ直している。その中で解決策として国際規格ISO 8601フォーマットの利用が提案されているが、既存の日付をどのように引き継ぐかが課題となっているようだ。3月14日現在、IT総合戦略室からの反応はない。
過去にも米国と欧州の日付フォーマットの違いにより、児童ポルノ送信容疑をかけられたスペインの家族が話題になっていることから、スラドの諸兄にはこれらの事例を教訓としてほしい。
決め打ち (スコア:0)
日本国内だけで利用されるから、タイムゾーン決め打ちで自前の時刻処理を使ってるんだね
Re: (スコア:0)
今回のはいわゆるタイムゾーンのせいではない。逆に自前処理だったら問題は小さかった。
変数の値をファイル保存/読み込み処理を、何も考えずに開発言語の標準ライブラリにお任せしたからこんな問題が起きた。
変数の値を自前でファイル保存してればいわゆるタイムゾーンの問題(時差で多少狂う程度の小さな問題)だけで済んだ。
#極論を言えばxamarinのせい!w
Re: (スコア:0)
それがホントならxamarin何やってんのって感じだな
Re:決め打ち (スコア:3, 興味深い)
いや、ロケールをデフォルト(実行環境依存)にしていたから起きるわけで、プログラマの責任だよ
今は発生する場面がなさそうだけど、小数点(カンマとドット)も同じ問題を孕んでる
全部 ISO 基準にしろよ、と思うかもしれないが、出力結果がどう使われるかは設計次第なわけで、人が読むテキストなのか機械が読むテキストなのかを区別するのはプログラマの責任
人が読むテキストなら、現地環境で可読性の高い現地ロケールで出力されて欲しいからね
Re: (スコア:0)
Dateをシリアライズして保存するのにロケールに依存する必要なんかなくないか?
「保存用の保存」してロケールに依存しちゃうんじゃxamarinおかしいっしょ
「表示用の文字列化して保存、読み込んだ後Dateに変換」してるんだったらプログラマがおかしいけど。
> Ver.1.2.2で混入したものとみられている。
らしいから、バイナリだった保存を「読めたほうが良いか!」と文字列化/復元に変えてやっちゃった、とかかなぁ
Re:決め打ち (スコア:1)
#3994406 はウソですね。.NETの標準ライブラリ関数の使い方が問題です。
DateTime.ToString メソッド (System) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.tostring [microsoft.com]
DateTime.Parse メソッド (System) | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.parse [microsoft.com]
いずれも引数にロケールを指定して日付⇔文字列の変換が可能です。
その指定を省略すると現在のロケールに応じた処理となるので今回のような問題が発生します。
Xamarin関係ないですし、自前でファイル保存する必要もありません。
Re:決め打ち (スコア:1)
某社にいたとき、海外支社から上がってきたプログラムがテストを通らなかったことを思い出した
現地の単体テストは通っているんだろう、とソースを読んでみたら日付を文字列化して月名で判断していた orz
つまり、ToString()すると英語圏だと "15-Mar-2021" とかになる
そこに"Jan"が含まれていれば1月、"Feb"が含まれていれば2月、"Mar"が含まれていれば3月……のように月を調べていた
日本語環境だとToString()で "2021/03/15" や "2021年3月15日" になるから英語名が含まれない
どの条件にも引っかからないわけ
# なんのことはない、月をDateTime.Monthで取るよう修正した
素人が良くやる不具合 (スコア:0)
文字コードを考えないとか言語や地域で違う設定を意識しないのとかタイムゾーンを考慮してないとかサマータイムを忘れてるとか素人が良くやる不具合。
こういう事をやらかす人はプロじゃない。反省して欲しい。
はいすいません、よく忘れます。
Re:素人が良くやる不具合 (スコア:1)
サマータイムを忘れてるとか素人が良くやる不具合。
Googleが素人だとでもいうのかお前は!
Some Google Pixel phones hit by Daylight Saving Time update bug [9to5google.com]
Re: (スコア:0)
プロはあらかじめトレードオフを検討した上で、仕様ですという。
Re: (スコア:0)
ゼロから組めば考慮してなくても問題は発生しないのだろうけど、ライブラリ組み合わせて使ってると直ぐに問題が表面化して考慮せざるを得ない。
サマータイム (スコア:0)
日付でロケールっていうとサマータイムが心配になるけど、大丈夫かね?
「現在時刻」の拾い方によっては1時間ずれるとかありそうだけど。
まぁ、日本でしかつかわれない想定で対応しないと明記するのでもいいとは思うが、
DXだなんだ言ってるんだし、今後を見据えて意識し始めておいてもいいと思う。
五輪でサマータイムとか言ってたのが懐かしいな。
# 自分も正しい対処方法はやったことないのでわからんのだけど。
Re: (スコア:0)
> 日付でロケールっていうとサマータイムが心配になるけど、大丈夫かね?
当然サマータイムでも問題が出るコードですね。
まあ最大1日前後のずれなんで実用上ほぼ問題にならないでしょうけど。
濃厚接触判定の日付フォーマットはGoogle/Appleが考えてくれてるので大丈夫のはず。
> まぁ、日本でしかつかわれない想定で対応しないと明記するのでもいいとは思うが、
日本でしか使われないにしても外国人が使う想定ではあるので日中英の3か国語に対応してるわけで。
特に中国と行き来する人はロケールを都度切り替えて使っている可能性がある。
Re: (スコア:0)
> # 自分も正しい対処方法はやったことないのでわからんのだけど。
サマータイムを無視した UTC-0 で保存、内部処理をして最終的なアウトプットで UTC やサマータイムを考慮した時刻にする、という形だったかと
こうしないと巻き戻って重なる時刻の処理とかで色々な問題になる
せっかくの国産アプリなのだから (スコア:0)
元号つきの和暦フォーマットで保存したれや。
Re:せっかくの国産アプリなのだから (スコア:1)
いっそのこと、旧暦不定時法でやろうぜ。
令和三年弥生廿日明九ツ半
Re: (スコア:0)
そして元号が変わるたびに四苦八苦すると
Re: (スコア:0)
さすがに陛下から弟殿下に皇位を譲るまでにはコロナに治まってもらわないと
だからISO 8601で扱えとあれほど (スコア:0)
普段Windowsしか使わない輩はこれだから困る。
どうせRTCも日本標準時になってるような奴だろ。
Re: (スコア:0)
Windowsプログラマーでも気にするよ。
必要なのは国際化とかの知識でしょう。
Re: (スコア:0)
なんでWindowsはRealTimeIsUniversalがデォフルトDWORD:1になってないのか。
Re:だからISO 8601で扱えとあれほど (スコア:2)
Re: (スコア:0)
手元で試してみたところ、ちゃんと書き込んでくれるようなので、
最近は直っているんだと思います。
Re: (スコア:0)
そうなんだよね。
Androidだと古いのをサポートしようとするとクラス使い分けないといけないんだよね。
だったらロケールの文字で、という手抜きしたくなるのもわかる。
そこらへんが素人仕事なんだけどな。
地域をコロコロ変えるやつおるんか? (スコア:0)
まぁ、UTCで保存したほうがいいというのはわかるけどよー
Re:地域をコロコロ変えるやつおるんか? (スコア:1)
中国では金盾でGoogleへのアクセスが遮断されている関係上、地域言語が中国なら百度地図(Baidu Maps)を、それ以外ならGoogle Mapsを表示するアプリというものが存在するので、滞在国によってコロコロ変える奴がいないとは言い切れないのがなー
Re: (スコア:0)
仕事で海外に行く人とかじゃない?
帰国する人数は分からないけど、訪日した外国人は1月のみで4万6千人くらいなので発生した人はそれなりに居るのでは?
元々は趣味のソフトだったんだから引き継いだ会社はテストから確認すべきだったよね。
12時間制 (スコア:0)
12時間制でフォーマットで保存した場合はどうなるんだろう。
「AM8:34:48」とか「PM5:42:34」はまだ良いんだけど、
「PM12:03:45」「AM12:50:12」「PM0:30:00」「AM0:24:35」を
上手く処理してくれるかどうか。
Re: (スコア:0)
「PM12:03:45」 →24時間制の12時
「AM12:50:12」 →24時間制の0時
「PM0:30:00」 →24時間制の12時
「AM0:24:35」 →24時間制の0時
#例外発生でエラーになりそうだけど例外にならない
Re: (スコア:0)
日本人感覚だと、
「PM12:03:45」夜中
「AM12:50:12」お昼
「PM0:30:00」お昼
「AM0:24:35」夜中
なんだけど、米国人は
「PM12:03:45」お昼
「AM12:50:12」夜中
「PM0:30:00」お昼
「AM0:24:35」夜中
なんだよね。
Re: (スコア:0)
それを書くならam/pmは小文字で時刻の後ろにつけないとな!(うるさい
Re:日月の順番嫌いだ (スコア:1)
ファイル名に日月年を付けてくる外国人とかいるんですよねぇ
XXXXX-YYY_05May21.docx みたいなやつ。ソートすると
XXXXX-YYY_08Jul21.docx
XXXXX-YYY_12Jun21.docx みたいな順に並ぶからすげー判別しづらい
更新日順に並べれば最新版が見られるからそこまで困るわけじゃないけど、特定の日付のファイルを見たい時にめんどい
文句言って直させるほどではないんだが、少しだけいらついちゃう
(まあ「XXX_May1921」なんてファイル名じゃないだけマシだが、さすがにそんなのは見たことない)
Re:日月の順番嫌いだ (スコア:1)
Re: (スコア:0)
メール送信だけで失われるからなぁ。
Re:日月の順番嫌いだ (スコア:1)
Re: (スコア:0)
ファイルとフォルダをきれいに整理しておかないと駄目だよね。
名前の付け方、フォルダの分け方なんかが重要。
適当にやっちゃうと後で分からなくなる。
数年後とか数ヶ月後でも分からなくなる。
上司はこれが駄目なのになぜか仕事はできる。
てか、これやればもっと仕事できるんだろう。
Re: (スコア:0)
後半の2行が何言いたいかわからん。それ日付と関係ある?
Re:日月の順番嫌いだ (スコア:1)
てかまだ解除して無くね?
Re:日月の順番嫌いだ (スコア:1)
ベンチャービジネスはダメか
Re: (スコア:0)
「段落を分けたら、何の脈絡もない話題に転換してもいい」などという慣習はありません。
せめて「ところで」とか「関係ないけど」ぐらいの前置きを入れるべきです。
読解力の問題ではありません。
Re: (スコア:0)
COCOAのストーリーだから脈絡が無いとも思わんけど。
いちゃもんじゃなくて本気で前置き入れないとこのぐらいでも分からなくなる人と話すのはしんどそうだ。
Re: (スコア:0)
いちゃもんってほどか?
関係ない話題をいきなりねじ込んでくることに対する嫌味だけど当然の指摘でしょ
書いてるほうは単に軽薄な皮肉を言いたいだけなんだろうけど、
何の脈絡もなくつまらんことを書く奴がいるとまでは思わない場合、
「急に何言ってんだ?何か意味あるのかな?」となっちゃうよ
今回のはネタが軽すぎてさすがにわかるけど、
文脈ぶった切りしてたら皮肉言われるぐらいは仕方ないだろうて
Re: (スコア:0)
どんどん動き回ってコロナが蔓延していいと思う。
そしてパニックを起こしている人に大騒ぎするほどの病気ではないと気づいてほしい。
Re: (スコア:0)
代々木公園のエボラも再発とかしそう
オリンピックだし
Re: (スコア:0)
それ言うなら、月日年より年月日の方が使い勝手が良い気がする。
Re: (スコア:0)
ソートする時になんであの順番で大丈夫なんだろう?
日付順に年月がまったく別なのが並んでしまうのも大概だが
月の順に並ばれてもマジで処理に困る
やはり日本式の年月日の順が唯一合理的だと思うんだが
Re:日月の順番嫌いだ (スコア:1)
// 座布団取れ
Re: (スコア:0)
原理主義的には、プログラム中で日付型を文字列にして扱うな(比較するな)、なのではないかな
いや、テキストファイルのソートの話なのであれば、年月日のフォーマットになっていて欲しいけど
Re:日月の順番嫌いだ (スコア:2)
ほんそれ。DBが使えるならDBに任せる(日付型のまま保存する)のが一番楽。それが無理なら数値型。
自前でシリアライズやファイル保存などをするハメになったときは、自分は UNIX time で保存するのが好みなんだけど、
上からの要求としては「もし目視で確認することがあったときにわかりやすい形式が良い」ってことで、YYYYMMDDHH24MISSな14桁数値で保存することが多いですね。
UNIX time は9桁→10桁になったとき [srad.jp]にソートでやらかしたところがちらほらありましたけど、今後しばらくは大丈夫だと思う。
#自分もやらかした一人なのでAC。と思ったけどIDでいいや、もう。
被害妄想 (スコア:1)
こんなのが自称“理系”なんだぜ