2017年02月01日の日記です


些細な綴り間違い  2017-02-01 12:43:47  コンピュータ

お仕事で、とあるWEBサイトの内容修正を手伝った。


スマホと PC で同じ html で動作して、それぞれの環境にあった見栄えになるように作られている。

いわゆるレスポンシブデザイン。


ところが、スマホで表示すると、本来画像が出るはずの部分で消えてしまうという。

僕への依頼は、このバグを解消することだった。




PC の Chrome には、開発者モードがあって、表示中の html などを調べたり書き換えたりできる。

また、この際スマホをエミュレートするモードがある。


スマホの時だけうまくいかない、というので PC 用のページとスマホ用ページを見比べる。


同じ html のはずなのに、読み込んでいる画像のファイル名が違う。

でも、「ファイル名が間違っていて読み込めない」とかではない。読み込みエラーは出ていない。


画像に対する style 指定で、width:0px が指定されていた。

なるほど、画像は表示されているけど、小さすぎて見えないのか。


いったいどこでそんなことをしているのか…

と、読み込んでいる複数の javascript プログラムを探してみると、見つけた。




スマホでは「物理ピクセル」と「論理ピクセル」が一致していない。

文字の大きさとして 12px と指定された文字は、24px で美しく描画される。


というのも、初期の iPhone などでは、12px は 12px だったのだ。

Retina ディスプレイが搭載され、解像度が2倍になった時に、過去との互換性のために「解像度は2倍だが文字の大きさは変わらない」仕組みがとられた。

そのため、12px は 24px で描画される。


横方向が 120px の画像があれば、240px に引き伸ばして描画されることになる。

解像度をあえて落とす表示だ。


問題となるプログラムでは、この問題を解消するために、画像サイズを半分にして表示しようとしていた。

そのために、画像サイズの半分のピクセル数で表示するように、style 指定を行う。


ここにバグがあり、必ず 0px になってしまうようだった。




まぁ、WEB プログラム経験がある人なら「画像のサイズを半分にして設定」でどんなミスをしたかわかるだろう。


問題のプログラムでは、jQuery を使い、$(document).ready イベントで画像の width を指定していた。思った通りだ。


WEB ページは、まず HTML が読み込まれる。

読み込まれた後でタグの内容などの「解釈」が行われ、img タグがあれば、その src を読み込む。


読み込み終われば、img 部分を読み込んだ画像サイズに整え、ページ全体を配置し、表示する。

もっと細かな話もあるが、これが大まかな流れだ。


そして、$(document).ready は、「HTML を読み込み終わり、まだ画像など関連ファイルは読み込み終わっていない」段階でプログラムを動かす。

関連ファイルの読み込みって遅いから、遅い作業を待たずに必要な処理を始めることで、全体の速度を上げるためのものだ。



もうわかると思うが、元のプログラムでは、「画像サイズを半分に設定」しようとする時点で、画像がまだ読み込まれていない。

画像サイズの半分を設定するが、そもそも画像がないので 0 になってしまう。


解決方法は簡単で、$(document).ready ではなく、$(window).load を使えばいい。

前者は、HTML を読み込み終わったら実行されるが、後者はページに関連するすべてのファイルを読み込み終わったら実行される。




プログラムでは、スマホか PC かを見分けて、違う画像を読み込ませる仕組みも用意されていた。


…と、説明しようと思っていい例がないか探したら、こちらのページで紹介されているプログラム、ほぼそのままだった。


HTML を読み込んだら、画像を読み込む前にファイル名を加工してしまう。

違う画像にしたい場合に与える class まで同じだ。


こちらはうまく動いている、と思ってたのだけど、検索してコピペしただけだったのか。


…あー、なんかわかった。わかっちゃった。

「画像サイズを半分にするプログラム」も、これと同じだと思って改造したんだな。


だから、$(document).ready をそのまま使っていて、$(window).load なんてそもそも知らなかったのか。




ところで、プログラムでは、半分サイズにしたい画像を指定できるようになっていた。

画像の class として、 harf という文字列を与えておけばよい。


…半分にするのだから half じゃないかと思うのだけど、プログラムは harf と指定していた。

そして、HTML 内にも当然のように harf という class が大量に…


もうね、この時点で「このプログラムは信用できない」と考えていいと思うよ。


この class 名は、「なんだっていい」ので、綴りをミスしたこととプログラムは関係ない。

でも、こんな単純な単語を綴りミスして、人様から見える HTML 内に大量に書き込んでいるという時点で、かなり注意力の低い人であることがわかる。


「些細なミス」だけど、バグというのはもともと些細なミスなのだ。

些細なミスを残す人のプログラムというのは、些細なバグもいっぱい残っているに違いない。


とりあえず、この仕事は「1時間程度で解決できないようなら保留で」と言われたくらい締め切りが短かったので、他の部分は見なかったけど。

(余計な仕事が増えそうなので見たくもない)



同じテーマの日記(最近の一覧)

コンピュータ

別年同日の日記

03年 システム改変

12年 インフルエンザ

18年 ネットワーク管理


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -