K.Maebashi's blog

幹事郎 不具合修正2件


以前この記事で公開したイベント日程調整ツール「幹事郎」について、不具合2件を修正しました。
https://kmaebashi.com/blog/kmaebashiblog/post/83

幹事郎 本体のページ
https://kmaebashi.com/kanjiro/

修正したのは以下の2点です。
①カメラによっては、掲示板に画像を貼れない問題の修正
②幹事がイベント編集画面を開いたとき、「幹事の名前」のところにそのイベントの幹事の名前を出すように修正

以下、わかる人にしかわからない話ですが、書いておきます。

①カメラによっては、掲示板に画像を貼れない問題の修正
スマホやデジカメで撮影した画像は通常JPEGと言われるフォーマットで保存されています。
スマホを縦にして写真を撮ると、縦長の画像が保存されますが、たいていのスマホやデジカメでは、これは本当に縦長の画像を保存しているのではなく、カメラの本来の角度で撮った画像に「向き」(orientation)の情報を付加する、という形になっています。だから時々頭の悪い画像ツールでJPEG画像を開くとひっくり返っていることがあります。
orientationはカメラをぐるぐる回した4方向、それになぜか裏向きも定義されていて1~8の番号で保持されています。幹事郎では、JPEGファイルの中からこの情報を読み取って、画像を適切にひっくり返しています。こういうのは普通はライブラリを使えばうまいことやってくれるのですが、Javaだと標準でこれを行うライブラリがなく、私は外部のライブラリを使うのが嫌いなので大昔に自作しました。最初に作った時の記録はここにあります。6年前か……
JavaでJPEGのExif情報を読む
https://kmaebashi.hatenablog.com/entry/2019/10/21/212228

6年前に原型を作って、このブログを含め、別の用途でも使っていたプログラムなのですっかり安心していたのですがそこにバグがありました。
コンピュータが数値を保持するとき、ビッグエンディアン、リトルエンディアンというふたつの方法があります。たとえば16進数で0x1234という数値があったとき、これを0x12, 0x34の順で持つのがビッグエンディアン、0x34, 0x12の順で持つのがリトルエンディアンです。リトルエンディアンは「なぜ逆?」と思うかもしれませんが、人間だって筆算で足し算するときには下の桁から足しますからCPUにとっては便利なこともあるんでしょう。
で、私のスマホはずっとリトルエンディアンで、今回幹事郎にビッグエンディアンのカメラで撮影した画像を上げた方がいたのでバグが発覚しました。
ビッグエンディアンには対応していたつもりでしたが、orientationは本来2バイトで保存されているのを私のバグったプログラムは4バイト単位で読んでいました。たとえばorientationが「3」のとき、リトルエンディアンなら0x03, 0x00です。これが4バイトの領域に保存されているので、4バイト単位で読むと0x03, 0x00, 0x00, 0x00となるので正しく「3」と読めてしまいます。しかしビッグエンディアンだと、0x00, 0x03, 0x00, 0x00となり、これをビッグエンディアンで10進数に直すと768になります。orientationは1~8なので、こんな値は不正なのでエラーで落ちていました。
このブログも長いこと使っていますが、私が自分のスマホ(リトルエンディアン)で撮った写真しか上げてないので問題が発覚しませんでした。
ところで、上で『たいていのスマホやデジカメでは、これは本当に縦長の画像を保存しているのではなく、カメラの本来の角度で撮った画像に「向き」(orientation)の情報を付加する、という形になっています』と書きましたが、私のスマホGoogle Pixel8は、たいていのスマホとは異なり本当にひっくり返した画像を保存します(なのでorientationは常に1)。なのでこの辺のバグが発覚しずらくてよろしくないです。

②幹事がイベント編集画面を開いたとき、「幹事の名前」のところにそのイベントの幹事の名前を出すように修正
幹事郎はブラウザのCookieで利用者の認証を行っているので、例えばイベントを新規作成するとき、以前「たろう」としてイベントを作ったり回答をした人は、幹事の名前のところに自動で「たろう」と表示されます。
ただし、イベントの幹事の名前は、「幹事に紐づけられた名前」とは別に憶えています。ひとりの人間が複数の顔を持つのはよくあることで、たとえばネット上のあるコミュニティで「黒炎の勇者サトウ」みたいな名前で活動していた人がお盆休みにオフ会しようと幹事郎でイベントを作って、お盆休みなので地元の友人とも集まるのでそっちのイベントも作ろう、となったとき、地元の友人との飲み会の幹事の名前は「佐藤一郎」とか本名などを入れるでしょう。そういうわけで幹事の名前はイベントごとに持つようにしていたのですが、今までは、イベントの編集画面を開いたとき、「幹事に紐づけられた名前」をデフォルトで表示してしまっていました。「幹事に紐づけられた名前」は、幹事としてイベントを保存したり参加者として回答したりした時に最後に入れていた名前で更新されます。
よって、うっかり前回「黒炎の勇者サトウ」の名前でイベントの保存とかをやっていると、次に地元の飲み会のイベント編集ページを開いたときに「黒炎の勇者サトウ」が表示されていました。気づいて直せばよいですが、うっかりそのまま保存したらだいぶ恥ずかしいことになりそうです。

以上、2点の修正でした。ご迷惑をおかけしまして申し訳ありません。

そういえばこのブログのプログラムの方はまだ差し替えてない。画像を貼るのは私だけだから問題ないんですが。


≪ より新しい記事
 ― 
より古い記事 ≫

このエントリーをはてなブックマークに追加

この記事へのコメント:

コメントを書く

名前: