2011-02-03
■IEの互換性検証用 XP/Vista の仮想マシンイメージの日本語化に挑戦 
仕事の中で、必要に迫られて、これを試すことになったのでちょっとメモ。
Microsoft、IEの互換性検証用にXP/Vistaの仮想マシンイメージを無償公開
記事の中に注があるとおり、提供されるVHDファイルのOSは英語版。
こいつで日本語を使える(表示、入力)ようにするには、ちょっとした工夫が必要らしい。
VHDファイルへインストールされているOSは英語版になっているので注意。たとえばWindows XPの場合、そのままではIEで日本語サイトを正常に表示できない。別途日本語フォントのインストールや、ボリュームライセンスでのみ提供される「Multilingual User Interface Pack(MUI)」の適用といった作業が必要となる。
ということでGoogle先生に尋ねたところ、いろんな人がチャレンジしてました。
- E2J WindowsXP Pro VPC
- とろテク - Virtual PC 内の英語版Windowsで日本語表示をする(Windows CDの無い人向け)
- VirtualPC用のXP Proインスト済みイメージファイルを無料でゲット :教えて君.net
- 英語版XPで日本語の表示ができるようにする手順
完全に日本語化するには、ボリュームライセンスプログラムでのみ入手可能な"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適用済みとして日本語化できてました。
2007-04-03 【続編】Lotus Notes CalendarからGoogle Calendarへイベントを登録 
1年ほど前に"Lotus Notes CalendarからGoogle Calendarへイベントを登録する"という記事でコードを書いたんだけど、ときどきリクエストを投げると"Bad Request Error 400"となって帰ってくることがあって困ってました。
今日はちょっと時間があったので、原因究明とコードの改修に挑戦。
今まではGoogle CalendarのDescriptionにあたるフィールド、NotesカレンダーのBody部分を一度空の状態にしてリクエストを投げると成功するので、あとは手作業でコピペしていたため、ここが問題なんだろうということは察しがついてました。
なので原因として推測されるのは
1.開こうとしている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;
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)));
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アクションが不要になるのに!!!
2006-05-31 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 )
)
furuyan_jp
2007.2.8現在、4行目は
gtimezone := ”Z=-18$DO=0”;
で日本時間で登録できています。
ひでまる
furuyam.jp さんの設定の場合は、1日のスケジュールが前日にずれてしまう事があるようですので、オリジナルに戻して使っています。 ありがとうございます。
furuyan_jp
時々”Bad Request”となって登録できない不具合を修正しました。
http://d.hatena.ne.jp/furuyan_jp/20070403
を参照ください。
ひでまる
今になって気がつきました。確かに、ご指摘のエラーも見たことがありました。その後で開いて、手で入力していました。 早速新しいものへ入れ替えてみます。 ありがとうございます。
2005-11-07 締め切られてた〜 (ToT)/~~~ 
XML 開発者の日、見どころ聞きどころで見つけたイベント第八回XML開発者の日
参加したいなと思っていたんだけど、申込をすっかり忘れていて、今見たら申し込み締め切られてたぁ。(ーー゛)
2005-11-02 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」を公開した。Windows、Mac OS X、Linuxのそれぞれ日本語版がダウンロード可能。
Mozillaによれば、これはFirefox 1.5の最終リリースではなく、テスト目的で公開されたもの。エンドユーザー向けサポートは行われない。現在の最新の安定版はFirefox 1.0。
ようやくですか。入れてみようかな。
今使ってる1.0.7とは別ディレクトリに入れて様子をみよっと。
最近転職した先がノーツで、外部カレンダーとの同期で悩んでいましたが、解決の糸口がみつかりました。感謝感謝。
ただね、わたしは1ユーザーなのでデザイナーが使えないのですね。なのでエージェントにしました。アクションボタンだと使い勝手が良いのですけど。
目指すは携帯 - Google - ノーツ の同期です。Googleからノーツ方向は無理なのかな。。。
コメントありがとうございます。
何人かの知人から直接、同じような問合せをもらったのですが、Notesって自分でツールバーのボタンを作ることができるので、僕はツールバーにボタンを作って上記のコードを貼り付けてます。
ツールバーを右クリックして[ツールバーの設定]を選んでください。既存のツールバーにボタンを追加する場合は[カスタマイズ]を選択、新規にツールバーを作る場合は[ツールバー]を選択して[新規ツールバー]をクリックしてツールバーを作成します。
新規で作った後は、既存のツールバーへのボタンの追加と同様に[カスタマイズ]として、ボタンを追加したいツールバーを選択してからボタンを追加して、コードを貼り付けます。
ちなみに僕も携帯・Notes・Googleの連携をさせたくてこのコードを作成しました。
かなり手間がかかりますが、やろうと思えばできます。
まず携帯のカレンダーに予定を作成したら、自分のNotesメール宛にカレンダーの予定データを添付ファイルとして送信します。
Notesでメールを受信したら添付ファイルを右クリックして[表示]−[すべて呼び出し]として受信ボックスを[F9]でリフレッシュすると、カレンダーからの一斉通知文書が表示されますので、その文書を開いて[Add to Calendar]ボタンを押すと、自分のNotesカレンダーのエントリーとして登録されます。
最後に登録されたカレンダーエントリーを選択して、作成したボタンからGoogle Calendarへ登録します。
もっと簡単にやるには、Gmailの表示を英語にしてメール作成画面でカレンダーのエントリーを作成することができるので、そこから携帯とNotesのアドレス宛にInvitationを送るって方法もあります。
僕は常に持ち歩いてる携帯を、情報のInputにしたかったのですが、GmailをInputにするのであればこっちのほうが簡単ですね。