IEの互換性検証用 XP/Vista の仮想マシンイメージの日本語化に挑戦


仕事の中で、必要に迫られて、これを試すことになったのでちょっとメモ。




Microsoft、IEの互換性検証用にXP/Vistaの仮想マシンイメージを無償公開




記事の中に注があるとおり、提供されるVHDファイルのOSは英語版。

こいつで日本語を使える(表示、入力)ようにするには、ちょっとした工夫が必要らしい。



VHDファイルへインストールされているOSは英語版になっているので注意。たとえばWindows XPの場合、そのままではIEで日本語サイトを正常に表示できない。別途日本語フォントのインストールや、ボリュームライセンスでのみ提供される「Multilingual User Interface Pack(MUI)」の適用といった作業が必要となる。


ということでGoogle先生に尋ねたところ、いろんな人がチャレンジしてました。


完全に日本語化するには、ボリュームライセンスプログラムでのみ入手可能な"Windows XP Multilingual User Interface Pack"が必要とのこと。

Windows XP Professional の多言語機能


ただ、フォントファイルをコピーしたり、日本語IMEをインストールすることで、日本語版のソフトをインストールすれば、日本語は表示や入力はできる環境にはできましたが、OS上のメニュー類は英語のまま。このままでも問題はないのだけれど、もうちょっと頑張れないかと試行錯誤。




で以下は、上記のページを参考にだいぶ日本語化できたのですが、書かれていない情報があったので備忘録も兼ねてのメモ。




日本語入力は、こことかここでで無料で入手できるようなので、それらを使ってください。



くれぐれもライセンス違反にならないように。




一つわかったことは、IEも日本語化できるということ。



VHDの配布サイト上ではIEのバージョンごとにイメージが提供されているけれど、日本語版のIEを使いたい場合はバージョンの低いイメージを使って、日本語版の上位バージョンをインストールすると、IEも日本語化できました。




で、意外な盲点だったのはこれ。



Windows XP Service Pack 3 - ISO-9660 CD イメージ ファイル



提供されているVHDファイルは、Windows XPのSP3適用済みのイメージだったのですが、ダメもとで日本語版のSP3をインストールしてみたら、あら不思議。「スタート」メニューほか、一部のメニューが日本語化されて、IE6もSP3適用済みとして日本語化できてました。

【続編】Lotus Notes CalendarからGoogle Calendarへイベントを登録

1年ほど前に"Lotus Notes CalendarからGoogle Calendarへイベントを登録する"という記事でコードを書いたんだけど、ときどきリクエストを投げると"Bad Request Error 400"となって帰ってくることがあって困ってました。

今日はちょっと時間があったので、原因究明とコードの改修に挑戦。

今まではGoogle CalendarのDescriptionにあたるフィールド、NotesカレンダーのBody部分を一度空の状態にしてリクエストを投げると成功するので、あとは手作業でコピペしていたため、ここが問題なんだろうということは察しがついてました。

なので原因として推測されるのは
1.開こうとしているURLの長さの問題
2.Body部のURLエンコードの問題
のどちらか、または両方かなと。

まず、1については"Bad Request"となったリクエストのURLの長さを数えてみると720バイトありました。これは特定のスケジュールからだけでなく、複数の"Bad Request"となるスケジュールからも確認できたので、おそらくHTTPで受け付けられるURLの長さは720バイトだろうと判断。

でも720バイトちょうどのリクエストを送っても"Bad Request"となるということは、URLエンコードの問題かなと思って、720バイトから何文字か削ってみたところ、ちゃんと登録画面が開けました。"日本語"という文字をURLエンコードすると"%E6%97%A5%E6%9C%AC%E8%AA%9E"というように"%"+"99"とう形式でエンコードされるのに、"Bad Request"となったURLは"%"で終わっていたり、"%"の後の数字が1桁だったりと、この条件を満たしてませんでした。

上記のことから、
1.開くURLを@Left()をつかって720バイト以内に収める
2.そのURLから@LeftBack()を使って、最後の"%"から左の文字列を@URLOpen()関数に渡す
ということで実現できそうです。

ちなみにIEでのURLの長さの制限は 2,083 文字だそうです。
[IE] URL に使用可能な文字数は最大 2,083 文字

ついでにちょっとだけコードをいじってみました。

このコードをツールバーにボタンを追加して、埋め込んであげればOK。
本当はボタンを押したときに、選択されてる文書のフォームをチェックして、カレンダーの文書じゃなかったらメッセージを返して〜なんてこともしたかったんだけど、めんどくさいのでやめました。

ちなみにLotus Notesは7.0の日本語版、Google Calendarの言語は英語、タイムゾーンは日本(GMT +09:00)で使ってます。

REM {@TimeMerge()で、Googleタイムゾーンにあわせる};
gtimezone := "Z=-18$DO=0";
gStartDateTime := @TimeMerge( StartDateTime; StartDateTime ; gtimezone );
gEndDateTime := @TimeMerge( EndDateTime; EndDateTime ; gtimezone );

REM {月、日、時、分、秒の1桁を@Replace()で2桁に変換するためのリスト};
short := "0" :"1" :"2" : "3" : "4" : "5" : "6" : "7" : "8" : "9";
long := "00" :"01" :"02" :"03" :"04" :"05" :"06" :"07" :"08" :"09";

REM {開始年月日・時刻をyyyymmdd、hhmmss形式にフォーマット};
syear := @Text(@Year(gStartDateTime));
smonth := @Replace(@Text(@Month(gStartDateTime)); short; long);
sday := @Replace(@Text(@Day(gStartDateTime)); short; long);
shour := @Replace(@Text(@Hour(gStartDateTime)); short; long);
sminute := @Replace(@Text(@Minute(gStartDateTime)); short; long);
ssecond := @Replace(@Text(@Second(gStartDateTime)); short; long);

startDate := syear + smonth + sday;
startTime := shour + sminute + ssecond;

REM {終了年月日・時刻をyyyymmdd、hhmmss形式にフォーマット};
eyear := @Text(@Year(gEndDateTime));
emonth := @Replace(@Text(@Month(gEndDateTime)); short; long);
eday := @Replace(@Text(@Day(gEndDateTime)); short; long);
ehour := @Replace(@Text(@Hour(gEndDateTime)); short; long);
eminute := @Replace(@Text(@Minute(gEndDateTime)); short; long);
esecond := @Replace(@Text(@Second(gEndDateTime)); short; long);

endDate := eyear + emonth + eday;
endTime := ehour + eminute + esecond;

REM {SubjectフィールドをURLエンコード};
subject := @URLEncode ("Domino"; Subject);

REM {開始終了日時を作成};
REM {AppointmentTypeがAnniversary、All Day Eventは時間指定なしでリクエスト};
dates := @If(
AppointmentType="1" | AppointmentType="2" ;
startDate + "/" + endDate ;
startDate +"T" + startTime + "Z/" + endDate + "T" + endTime +"Z"
);

REM {リッチテキストのBodyフィールドをテキストに変換してURLエンコード};
details := @URLEncode("Domino"; @Trim(@Text(Body)));

REM {LocationフィールドをURLエンコード};
location := @URLEncode ("Domino"; @Text(Location));

REM {Google CalendarのベースとなるURLを変数にセット};
REM {将来URLが変更したら、ここを修正する};
REM {イベントの公開属性を変えるには &icc=PUBLIC に変更(ここではPRIVATE)};
REM {スケジュールの空き状態を変えるには &trp=FALSE に変更(ここではBusy)};
gcalurl := "https://www.google.com/calendar/event?action=TEMPLATE&icc=PRIVATE&trp=TRUE";

REM {URLを組み立て};
url := gcalurl + "&text=" + subject + "&dates=" + dates + "&location=" + location + "&details=" + details;

REM {URLは720バイト以下で、URLエンコードが途中で切れないように調整};
accessurl := @LeftBack(@Left(url ;720);"%");

REM {@URLOpen()でHTTPSリクエストを作成};
@URLOpen(accessurl; 1);

@All;

ブラウザはFirefoxを使っているので、このボタンから開いた画面の"Submit"ボタンを勝手に押してくれるようなGreasemonkeyスクリプトを書こうと思って、現在あれこれ格闘中です。
それができたら、最後の1アクションが不要になるのに!!!

Lotus Notes CalendarからGoogle Calendarへイベントを登録する

【注 意】
こちらのエントリーのコードは、そのまま実行すると"Bad Request Error 400"というエラーが発生するケースがあったため、修正しています。
最新のコードはこちらに掲載しています。

Google Calendarが発表されてから、自分のスケジュール管理をどうするかいろいろ悩んでいたんだけれど、会社のグループウェアであるLotus NotesからスケジュールデータをGoogle Calendarへ登録できないか悩むこと数日。
昨日になってこのページを見つけてから、ごにょごにょと...。

で、できたのが以下のコード。なんだか美しくないコードで恥ずかしいんだけど...。(^^ゞ

NotesのメールDBをデザイナーで開いて、"Appointment"フォームにでもアクションを追加して、以下のコードを貼り付けてください。
登録済みのNotesカレンダーイベントを開いて作成したアクションボタンを押すと、ブラウザが起動して、Google Calendarへのイベント登録画面にNotesカレンダーに登録したデータが埋められた状態で開きます。
保存する前にイベントのステータスを"Private"にしないと、他の人から見られちゃうのでご注意ください。

ちなみにテストした環境は、Lotsu Notes Client R7.0 HF144 と会社標準のメールテンプレートです。
フィールド名が違ったりしたら、ごにょごにょと直しちゃってください。

REM {リッチテキストのBodyフィールドをテキストタイプに変換};
details := @Trim(@Text(Body));

REM {@TimeMerge()で、Googleタイムゾーンにあわせる};
gtimezone := "Z=7$DO=1$DL=4 1 1 10 -1 1";
gStartDateTime := @TimeMerge( StartDateTime; StartDateTime ; gtimezone );
gEndDateTime := @TimeMerge( EndDateTime; EndDateTime ; gtimezone );

REM {月、日、時、分、秒の1桁を@Replace()で2桁に変換するためのリスト。};
short := "0" :"1" :"2" : "3" : "4" : "5" : "6" : "7" : "8" : "9";
long := "00" :"01" :"02" :"03" :"04" :"05" :"06" :"07" :"08" :"09";

REM {開始年月日と時刻をフォーマット};
syear := @Text(@Year(gStartDateTime));
smonth := @Replace(@Text(@Month(gStartDateTime)); short; long);
sday := @Replace(@Text(@Day(gStartDateTime)); short; long);
shour := @Replace(@Text(@Hour(gStartDateTime)); short; long);
sminute := @Replace(@Text(@Minute(gStartDateTime)); short; long);
ssecond := @Replace(@Text(@Second(gStartDateTime)); short; long);

startDate := syear + smonth + sday;
startTime := shour + sminute + ssecond;

REM {終了年月日と時刻をフォーマット};
eyear := @Text(@Year(gEndDateTime));
emonth := @Replace(@Text(@Month(gEndDateTime)); short; long);
eday := @Replace(@Text(@Day(gEndDateTime)); short; long);
ehour := @Replace(@Text(@Hour(gEndDateTime)); short; long);
eminute := @Replace(@Text(@Minute(gEndDateTime)); short; long);
esecond := @Replace(@Text(@Second(gEndDateTime)); short; long);

endDate := eyear + emonth + eday;
endTime := ehour + eminute + esecond;


REM {@URLOpen()でHTTP(S)リクエストを作成};
REM {@If()でアポイントメントタイプがAnniversary、All Day Eventは時間指定なしでリクエスト};
@URLOpen(
"https://www.google.com/calendar/event?action=TEMPLATE&" +
"text=" + @URLEncode ("Domino"; Subject) +
@If(
AppointmentType="1" | AppointmentType="2" ;
"&dates=" + startDate + "/" + endDate ;
"&dates=" + startDate +"T" + startTime + "Z/" + endDate + "T" + endTime +"Z"
) +
"&location=" + @URLEncode ("Domino"; Location) +
"&trp=true&sprop=&sprop=name:" +
"&details=" + @URLEncode("Domino"; details )
)

締め切られてた〜 (ToT)/~~~

XML 開発者の日、見どころ聞きどころで見つけたイベント第八回XML開発者の日
参加したいなと思っていたんだけど、申込をすっかり忘れていて、今見たら申し込み締め切られてたぁ。(ーー゛)

Firefox 1.5 RC1リリース

http://www.itmedia.co.jp/news/articles/0511/02/news035.html

 MozillaオープンソースWebブラウザFirefoxの次期メジャーリリースであるバージョン1.5の最初のリリース候補「Firefox 1.5 Release Candidate 1」を公開した。WindowsMac OS XLinuxのそれぞれ日本語版がダウンロード可能。

 Mozillaによれば、これはFirefox 1.5の最終リリースではなく、テスト目的で公開されたもの。エンドユーザー向けサポートは行われない。現在の最新の安定版はFirefox 1.0。

ようやくですか。入れてみようかな。
今使ってる1.0.7とは別ディレクトリに入れて様子をみよっと。

体年齢が、な、な、なんと!!

furuyan_jp2005-11-01

先週の土曜日に会社の同期の二次会へ行ってきました。新郎とは大学も一緒で、二人とは2年前のラフティングで会っていて、とても仲の良い、お似合いのカップルだったので、そんな二人が結婚へ至ったのはホントにめでたい!今頃新婚旅行でイタリアのハズ。いいなぁ。

その二次会のゲームでなんと体重計をゲットしました。香取慎吾がCMやってるカラダスキャンとかいうやつですよ。いただいたのは"HBF-357"というモデル。紺色のカッコイイやつでした。

で、昨晩早速試してみたのさ。食後2時間後がオススメの測定時間だったけど、1時間後に計ってみた。

身長:181cm 年齢:29歳(あと10日間は28歳!) 性別:男

で登録して、いざ、あのポーズ。

グリップ部分の液晶になにやらメーターがピコピコして、、、待つこと数秒。

出ました!

体 重 :60.9kg
B M I:18.6
基礎代謝:1502Kcal
体脂肪率:13.8%
内臓脂肪:レベル2
骨格筋率:36.8%

体 年 齢:18歳

ちょっと、ちょっと。18歳って何ですか?
ありえない、故障だ、と信じていない自分。

今朝、寝起きにもう1回計ったら、今度は19歳だって!
ってことは、昨晩の数値もそんなに間違いじゃなかったってことか!

おれもまだまだ若いな。

甲子園大改修

聖地に誕生!甲子園砂かぶり席
http://sports.yahoo.co.jp/hl?c=sports&d=20051031&a=20051031-00000006-dal-spo
2005年10月31日(月) 10時55分 デイリースポーツ

 06年に着工する阪神甲子園球場兵庫県西宮市)のリニューアル計画の全容が30日、デイリースポーツの取材で明らかになった。アルプス席まで覆う本紙既報の「大銀傘」のほか、ネット裏に砂かぶり席、最上段には部屋付きバルコニー席を設置。バリアフリーの観点から座席間隔も拡大されるなど快適性向上にも細心の工夫が凝らされている。近日中に阪神電鉄本社から正式発表される。
 外装の落ち着いた雰囲気を保持し、内部構造と観客席は世界最高水準の豪華さ―。「クラシック&モダン」を基本コンセプトに進められてきた甲子園リニューアル計画の全容が、間もなく姿を現す。
 目玉は何と言っても「砂かぶり席」だ。一塁側から三塁側ベンチにかけてのフェンスを従来より2〜3メートルグラウンド側へ拡充し、その部分に新たな観戦シートを設置。グラウンドレベルより数十センチ掘り込まれる形となっており、試合の臨場感を「ベンチの目線」で体感できる設計という。
 ネット裏スタンドの最上部には、部屋付きバルコニー席が数室設けられる予定だ。高級リゾートホテルを思わせる室内からグラウンドが一望できる。「リニューアルに合わせてこれまでの甲子園にはなかった高級感も組み込みたかった」(本社関係者)という狙いが、このVIPルームに込められている。
 既存の内外野席も通路の数を増やし、座席の前後スペースをワイド化するなどバリアフリー化に努める。障害者、介護者用の席も十分に確保される。
 グラウンド部分の改造では、スタンドがせり出した関係でファウルゾーンはこれまでより狭くなり、選手と観客の距離を近くする傾向にある最近のメジャー球場に則したリニューアルとなる。内野天然芝化も検討されてているが、コンディション維持が難しく今回は見送られるもようだ。
 現在の銀傘に代わり、構造柱のない新デザインの「大銀傘」をアルプススタンド付近まで延長して設置する。関係者によると新・旧銀傘の撤去―設置工期に間隔があり、完成までの一時期はシーズン中に「銀傘のない甲子園」が出現する可能性もあるという。
 来年春に着工し、外装工事はシーズン中、内装工事は10月から3月までの間に集中的に行われる。そのため06年から09年の間に阪神がリーグ優勝した場合、甲子園球場での日本シリーズ開催が不可能となり、その場合の代替球場として大阪ドームなどが候補に挙がりそうだ。
 竣工予定は2010年の開幕前。「砂かぶり席」を目玉とし、ツタ絡まるクラシックな外装で再びよみがえる新・甲子園―。常勝猛虎にふさわしい夢のボールパークの完成が待ち遠しい。

だそうな。甲子園で日本シリーズできないなんて!!