◆ 背景
Webサーバをサンドボックス(SB)上で運用する環境の管理をしているのですが、このWebサーバで、グラフィックを扱うCGIを設置する必要が出てきました。このCGIは、GDというグラフィックライブラリを使っていて、GDは文字を扱うためにfreetypeというTrueTypeフォント用エンジンを使っています。freetype自体は単独でインストール可能だったので問題なかったのですが、エンジンだけでは当然駄目で、フォントもSBにインストールする必要があります。ところが、Portsのフォント類は、実際には必要ないのに、X11ライブラリのインストールを大前提としていて、WITHOUT_X11オプションも効きません。SBに不要なライブラリをインストールするのはディスクの無駄な上、余計なものがSB内に存在するのはセキュリティ上好ましくないので、X11ライブラリをSBに入れるのは避ける方向での解決を図ります。
◆ フォントのインストール
要点を先にまとめると、インストールしたいフォントのportsを展開だけして、フォントファイルをSB内にコピーするというやり方です。例として、Portsに収録されているwebfontとIPAフォントのインストール手順を書きます。
# mkdir -p /[sandbox]/usr/local/share/fonts/TTF_en
# mkdir /[sandbox]/usr/local/share/fonts/TTF_ja
# cd /usr/ports/x11-fonts/webfontsインストールされるフォントはこんな感じ。基本的な書体はこれで一通りそろいます。
# make extract
# cp work/webfonts-0.30/*.ttf /[sandbox]/usr/local/share/fonts/TTF_en
# make clean
andalemo.ttf comicbd.ttf fonts.scale timesbd.ttf verdana.ttf
arial.ttf cour.ttf georgia.ttf timesbi.ttf verdanab.ttf
arialbd.ttf courbd.ttf georgiab.ttf timesi.ttf verdanai.ttf
arialbi.ttf courbi.ttf georgiai.ttf trebuc.ttf verdanaz.ttf
ariali.ttf couri.ttf georgiaz.ttf trebucbd.ttf webdings.ttf
ariblk.ttf fonts.cache-1 impact.ttf trebucbi.ttf
comic.ttf fonts.dir times.ttf trebucit.ttf
# cd /usr/ports/databases/grass-i18nインストールされるフォントはこんな感じ。ipag*がゴシック体でipam*が明朝体です。
# make extract
# cp work/fonts/*.ttf /[sandbox]/usr/local/share/fonts/TTF_ja/
# make clean
ipag.ttf ipagp.ttf ipagui.ttf ipam.ttf ipamp.ttf
◆ 余談
一番手間がかかったのは、フォント探しとライセンスの確認だったり。
近所に新しいホームセンターが出来たので、仕事上がりに見学。1Fがホームセンター、2Fがインテリアという構成で、かなりの床面積を持っているので期待していざ突入。
1Fについては、隣町の某ホームセンターとの比較で、工具:◎、ねじ:○、木材:≒、金物:×(無かったような…)、包装:◎、店舗用小物:○、塗料:≒、電材:△〜×、電化製品:?(興味なし)、日用品:○〜≒、アウトドア:≒、といった感じ。木材の加工場がなかったような気がするのと、金物系の印象が薄いのが気になりましたが、隣町のホームセンターに出かける事は大幅に少なくなりそうな感じでした。前から探していた電子レンジでスパゲッティをゆでられる容器があったので、トイレットペーパーその他と一緒に購入。
2Fは隣町の某ホームセンター隣にある某インテリア屋と比較。と思ったのですが、個人的にはぜんぜんダメ。下とのバランスからして、カラーボックスとかイレクターから高級家具までとかの品揃えを期待していたのですが、お手軽品はほとんど無し、高級品の方も百貨店の家具コーナーみたいな感じでした。椅子コーナーは特にひどく、当店オリジナルと書かれたアーロンチェアのバッタモンみたいなものをはじめ、どこかで見たような形をしているけど微妙にダサいものばかり。カーテンと時計屋はすこし良かったかも。クッションとかは売ってなかったかな。というわけで、2Fは10分で見学終了。
お店を回っていて、ネクタイを締めてるんだけど買い物籠を持っていない、偵察組と思しき男性2,3人のグループが3組ほどいたのにはちょっと笑いました。
さっそく挑戦。700Wで標準ゆで時間+4分。うん、ちょっと硬めで、いつも鍋でゆでているのとそん色ないパスタが出来ました。これだったら、朝にトーストと似たような感覚で、パスタとか出来そう。
今回は、あえ物系のソースを使ったので良かったのですが、問題はレトルト系のソースをどうやって暖めるかだな。
石鹸のストックが切れていたので、今日も突入。
木材加工場は屋外ではなく、木材売り場の奥まった所にありました。金物もよく探せばそこそこありましたが、網棚とかスチールラックが見当たりませんでした。木材も含めて、棚類が充実していないというのが、昨日のなんか物足りない印象に繋がっていたのかも。
あと、屋上駐車場から標識に従って出口に向かったところ、店舗の裏から近くの幹線道路に直接出られるのを発見。正面出口は信号無しの右折になってやたらと時間を食われるので、この裏出口は助かります。地上から回り込む道があるのか、次の機会に探してみよう。
GWあたりから、どうも外部への接続が不調で、Nagiosがfalse positiveを出しまくったり、SSHで外部ホストにアクセスするとログインに妙に時間がかかったり。変だなぁと思って調べると、外から逆引きできなくなってる!何でじゃあと思ってさらに調べると、逆引きの権限委譲をしてもらっている上位プロバイダの設定がおかしくなってました。以前、同じ設定ミスをされていたのですが、何かの拍子にそれが復活した模様。DNSの逆引きの権限委譲なんてマニアックな設定なので、作業のお知らせなんかするまでも無いという判断だったのかもしれませんが、それだったら、なおさら完璧にやってもらわないと。
お昼ごはんを食べに行ったラーメン屋で、隣に座っていた男性が、店中の人たちが振り返るぐらいの大声で携帯電話で話しだしました。
で、その彼が
会話の中には専門用語も入っていたので、私にはちんぷんかんぷんな部分もありましたが、建設業に明るい人であれば、もっと情報を取得できたに違いありません。自分の会社の業務内容に当てはめるとぞっとします。
いや、鬼に金棒…じゃないか。馬鹿に鋏と言うか、倫理観の無い人間に仕事で携帯を使わせるとこういうことになるんですね。表題のようなことを真面目に考えさせられる出来事でした。
- taru-k [まぁそれは、携帯電話が悪いのではなく、社員教育の問題かと.]
既存のCGI群をAjaxで書き直す作業をやってもらったところ、XMLHttpRequest()で取得したソースが、物によって文字化けしたりしなかったりするという報告が上がってきたので調査。IE6とFirefox(1.5.0.3)で試しました。私の調べた範囲では、Safari(1.3.2)の場合、IEやFirefoxで文字化けするページが、文字化けしませんでした。また、他のブラウザは調査する根性がありませんでした。あと、検証はEUC-JPでしかチェックしてません。本エントリは他で公開されている情報を補足するものであり否定するものではありませんし、JavaScript++かも日記やbricklife.weblog.*(敬称略)による網羅的なまとめが無ければここまでたどり着くことは出来なかったでしょう。お二方をはじめ、本件に関する情報を先立って公開して下さった皆様に、まずは感謝の意を表します。
関連するページの記述によると、基本的な対策としては文字コードをUTF-8にすると言うことらしいのですが、静的なファイルはともかくCGIまで含めてUTF-8対応させる余裕はありません。また、手元のデータの中には、CGIであるのに文字化けするものとしないものがあったりして、既存の調査結果と一見矛盾していました。さらに、いくつかのページで書かれていた、CGIだと文字化けしないが静的なファイルだと文字化けする、という結果は、プロトコル、およびクライアントの実装手法的にどうしても納得できませんでした。こうしたことから、既存の実験には、なにがしかの条件が不足していたのではないかと考え、とりあえず手元のCGIの場合の文字化けの有り無しで、出力されるデータを比較しました。
結果、文字化けしないCGIでは
Content-type: text/html; charset=EUC-JPと出力していたのに対し、文字化けするCGIでは、
Content-type: text/html;とだけ出力していました。これを見たとたんにapacheの挙動に思い至り、文字化けの原因が「htmlかcgiか」の違いではなく、「HTTPレスポンスのContent-typeに正しいcharsetが記述されているかどうか」の違いであると仮定したところ、これまでの自身の実験結果や他のページでまとめられている、一見不可解な挙動がすっきりと説明できます。つまり、ルールとしては
あとは実験。apacheの設定を変更して、EUCで書かれた静的なHTMLファイルの取得時には、charset=EUC-JPを含むContents-typeを返すようにしたところ、IE、FirefoxともにresponseTextでも文字化けしないようになりました。一方、responseXMLの場合、IEでは、Content-typeの方は無視されて文字化けしましたが、FirefoxではContent-typeのcharsetが正しく解釈され、文字化けしなくなるという結果でした。表にまとめると、以下のような感じです。
responsText | responseXML | |||||||||||||||||||
|
|
というわけで、XMLHttpRequest()の文字化けに対するWorkaroundとしては、responsTextを使用する場合、単純にHTTPレスポンスのContent-typeで正しいcharsetを返すようにサーバを設定/CGIを実装する。responsXMLを使用する場合、encoding属性を指定する。という事で大丈夫なようです。
全てのレスポンスでcharset=EUC-JPを返すというのは乱暴なので、正しいcharsetを返すための設定方法について調べてみました。何通りかやり方があるようです。
AddCharset EUC-JP .eucという行を追加してapacheを再起動し、EUC-JPを含むファイル foo.html/bar.txt を foo.euc.html/bar.euc.txtのように名前変更すると、foo.euc.html/bar.euc.txtにアクセスがあった場合に、charset=EUC-JPがつくようになります。ファイル名とリンクの変更が必要になるので、既に大量のファイルがある場合、ちょっと嫌かも。
<Files /path/to/foo.html>ちょっとトリッキーですね。FilesMatchもありますが、アクセスの度にファイル名と正規表現の比較が入ることになるので、これを使うぐらいなら上か下の方法を使うのが良いと思われます。
AddType "text/html; charset=EUC-JP" .html
</Files>
<Files /path/to/bar.txt>
AddType "text/plain; charset=EUC-JP" .txt
</Files>
で、上記設定ですが、apacheの設定ファイルで「AllowOverride FileInfo(だと思う)」が指定してあれば、.htaccessファイル内に記述することによって標準の設定を上書きできます。管理者権限が無い場合は、試してみる価値はあるかもしれません。が、ファイルアクセスのたびに.htaccessが読み込まれ、そこから条件比較という手順を踏むようになるので、パフォーマンスが落ちること間違いなしです。
◆ 超余談
で、ふと思ったのですが、これってCSSXSSで'{'や'}'に該当するコードを含む日本語文字の入ったHTMLファイルも脅威にさらされるという問題の、サーバ側でのWorkaroundになったりは…しないかな。
ボーダフォン改め、だそうです。
電話機にロゴを入れることを考えると、社名はせいぜい8文字までだと思うんですが。SBMとか略称使うつもりなら、なおさらもっと洗練された短い名前を考えた方が良いのに。あと、モバイルってどちらかというと携帯電話向けサービスの一般名称として定着しているので、かなり違和感があります。お、sbm.ne.jpは未登録ですね。今すぐダッシュだ。というか、この辺を押さえずにリークしているって事は、世間の評判を見極めたいだけかな。
ブランド名も統一するそうですが、「ソフトバンク」という字面は統一ブランドの冠言葉としては、あまりにも偏りすぎな気がします。コンピュータソフトウェア流通会社としては、センスの良い名前だとは思いますが。ヤフーはアメリカ法人傘下のように見えてしまうので却下として、いっそのことグランド・サン(grand-son)グループとかにすれば、洒落もきいて良かったのに。
- taru-k [“グループJUSTICE”も良いね.ソフトバンクって、年配の方には“新手の銀行”だと思われていないのだろうか.モバイ..]
ルノーF1→ニッサン F1へと名称変更という憶測があるそうです。「将来の話」としながらもチーム代表が否定していないところがなんとも。
開発に日産側の技術者が入っていくという話なら、引っかかりは残るもののまだましかなと思いますが、単なるバッジ・ネームだと悲しい話ですね。一般的には知名度が上がるのかもしれませんが、ファン心理的にはむしろ日産に、「あなたは堕落しました」とか言いたくなりそうです。
いつも入れているシェルがハイオク139円/L(レギュラー128円/L)でがんばってました。5月頭の一斉値上げに乗らなかったようです。観察していると、他は軒並み142-3円になっていたので、ちょっとうれしい。
お仕事方面で少し前から関心があったのと、表示される広告によってそのページがどういう風に判定されるかを見るという楽しみ方があるというのを知り、ちょっと入れてみました。いや、お金が入れば正直うれしいですが、そんなにビューの多いページではないので、過剰に期待せずに。このページのgoogleによる評価と思って読む人にも楽しんでもらえれば。
と書いたところで、さっそく表示されたまともな広告は、「商品先物」と「迷惑メール対策」でした。後者は納得いきますが前者はどこからきたんでしょう?あと、英語の広告が混ざるのはなぜ?それに、Firefoxの紹介バナーを付けたつもりなんですが、表示されません。時間差があるのかな?
さて、現実逃避もほどほどにしないと。
- taru-k [1Fのコストパフォーマンスと現在の混雑具合の情報希望]
- hs [値段は隣町ホームセンターと変わらない感じでした。参考になりそうなものとしては、液体ミューズ詰め替え用:198円、エリ..]