俺FAQ

これは一体・・・?

俺FAQは、「上様」という人間がよく尋ねる質問について「上様」という人間が調べ、その結果をまとめたページです。俺が良く聞く質問(とその答え)ってわけ。

記載されている情報は、「上様」が「つまり、こういうのなのでは!」と思っているだけであり、信頼性についてははなはだ疑問です。鵜呑みにしないようにしてください。

古いやつ

目次

Windows

Explorerの起動オプション

explorer.exeの起動状態はコマンドラインオプションで制御することが可能です。

例: e:\work をデフォルトにして起動させるには

EXPLORER.EXE /e,/root,e:\work
とすればよいです。

この項はhttp://www.nifty.ne.jp/forum/fgateway/gwfaq2/soft/w95/s130908.htmlを参照したというか、ほとんどコピペしました。

OS起動時にIPアドレス239.255.255.250に情報が送信される

OS起動時に、勝手にIPアドレス 239.255.255.250 に情報が送信されることがあります。はじめて気づいたときは「をを!俺、変なもん拾ってインストールしちゃったか?」とか思いましたが、ぜんぜんそんなんじゃありませんでした。

詳しくはwinFAQの「Windows Me/XP 起動時に 239.255.255.250 へのパケットが送信されます」を参照してくれればよいんですが、まあ「ユニバーサルプラグ&プレイ」機能が対応機器を探すために送信してるということのようです。

ビビらすなよ。

mpeg4-v3を再生できない

mpeg4-v3 を Windows Media Player 8 (WMP8)で再生すると、音声だけ再生されて映像が再生されません。これはどう頑張っても無理みたいです。WMP6 で再生できるのでそっちを使いましょう。WMP6 は C:\Program Files\Windows Media Player\mplayer2.exe にあります。この際 .avi ファイルは全てこの WMP6 に関連付けしておいてもよいかと。

この項はhttp://missinglink.systems.ne.jp/018.htmlを参照しました。

DivX5をインストールできない

DivX5のインストーラを用いてインストールしようとすると「Serching for Installed...」というダイアログメッセージが出た後、しばらくしてインストーラが終了してしまうことがあります。このダイアログはキャンセルして構いません。実際、キャンセルしてもインストールできます。

また、インストール先の指定などを行なった後、実際にインストール作業が開始されますが、ここでもインストーラが終了してしまうことがあります。これは旧バージョンのDivXがインストールされているためです。旧バージョンをアンインストールした後、再度DivX5をインストールしてみてください。。旧バージョンをアンインストールすることが出来ない(スタートメニューにアンインストールの項目がない、プログラムの追加と削除に項目がない等)場合は、旧バージョンをインストールし直してみるとよいでしょう。多分それで旧バージョンをアンインストールできるようになります。

音量を変えても、いつの間にか元に戻ってしまう

ボリュームコントロールで音量を変えても、いつのまにか変える前の音量にもどってしまうことがあります。これはサウンドを扱うソフトウェアが独自に音量設定を持っていることが原因かも知れません。

たとえばMP3プレイヤー「Wyvern」は独自のWAVE音量を持っており、ボリュームコントロールでWAVEの音量を変えたとしても、次の曲を再生するとWyvern独自のWAVE音量に戻ってしまいます。この場合、Wyvern側でWAVE音量を設定しておくしかないです。

特殊フォルダのターゲットを変更する

「デスクトップ」「スタートメニュー」「(右クリックメニュー)送る」などの特殊フォルダは、通常 C:\Documents and Settings\(ユーザー名) などにおかれていますが、これは変更することが出来ます。本来、レジストリをいじって設定するものですが、Microsoftにより配布されているTweakUIというソフトを用いれば、GUI上で設定することが出来ます。

特殊フォルダのターゲット変更以外にもいろいろ出来るんで、入れといて損はないでしょう。

環境変数などのシステムデータをファイルに書き出す

環境変数などの基本的なシステムデータを、コマンドプロンプト上で以下のようにすることでテキストファイルに書き出すことが出来ます。

perlスクリプトファイルに他のファイルをドラッグ&ドロップして起動する

perlにおいて、配列 @ARGV には実行時の引数が格納されており、スクリプトが処理対象とするファイルを指定するなどの使い方ができます。そこで、エクスプローラ上で処置対象ファイルをperlスクリプトファイルにドラッグ&ドロップすることで、引数指定と起動を同時に行いたくなります(perlスクリプトファイルを実行ファイルと同じように扱いたい)。

ところが、perlスクリプトファイルに他のファイルをドラッグ&ドロップすることはできません(perlスクリプトファイルの拡張子とperlコンパイラが関連付けされていても同様です)。だからといって、いちいち、実行時引数をキーボードから入力するのはめんどくさい! ドラッグ&ドロップで何とかしたい! 

Drop on Scriptというソフトを使えばできるようになりそうです。けど、「共用パソコンなのでシステム周りいじりたくないなぁ」というような場合は、妥協案として、バッチファイルを作ってそれにドロップするという方法があります。

バッチファイル内では、バッチファイルを起動したときの引数を変数「%1,%2...%9」に格納しています。そしてバッチファイルに対してはドラッグ&ドロップによる引数指定と起動が可能です。なので、

などと書いたバッチファイルを用意しておき、このバッチファイルに対してドラッグ&ドロップすることで、perlスクリプトを起動させることができます。

また、ちょっと違った方法として、バッチファイルにperlスクリプトを埋め込む方法もあります。

@echo off
perl -x %0 %1
goto endofperl

#!perl

  #
  #ここにperlスクリプト書く
  #

__END__
:endofperl

「-x」はperlの起動オプションで、与えられたスクリプトのうち、「!」で始まり[perl」で終わる行までを読み飛ばします。この場合「#!perl」の行まで読み飛ばします。また perl は「__END__」の行でスクリプト実行を終了します。

「%0」はバッチファイルで使えるパラメータで、バッチファイルそのもののファイルパスを表します。

「%1」はバッチファイルで使えるパラメータで、バッチファイル起動時に与えられた1つ目のパラメータを表します。

「goto」はバッチファイルで使えるコマンドで、あとにラベル名(この場合「endofperl」)を指定すると、当該ラベル行(この場合、先頭にコロンのついた「:endofperl」の行)にジャンプします。

というわけでこのバッチファイルは、まずこのバッチファイル自体を perl インタプリタに渡して起動します。perlインタプリタは「#!perl」から「__END__」までを perlスクリプトとみなして実行します。perl の実行が終了すると、「goto」によりperlスクリプト部分を読み飛ばして、終了します。

Rubyにも「-x」オプションがあるので同じことができます。こんなことできるように設計したやつ、スゲーな。

ローマ字入力とかな入力を切り替える

ALT+「カタカナ・ひらがな・ローマ字」を押すたびに切り替えることができます。

STARTコマンドでスペースを含むファイルを実行できない

DOSの START コマンドはファイルの関連付け起動や、プロセスの優先度指定、起動時のウインドウサイズ指定などができる、便利なコマンドです。

windows上では、起動するプログラムのパスにスペースを含む場合、通常はパス全体を2重引用符で囲みますが、START コマンドでそれをやると、もう一枚DOS窓が開くだけで、何も起こりません。なんだこりゃ。

回避するには、パスの「スペースを含むディレクトリ名・ファイル名だけ」を2重引用符で囲めばよいです。例えば以下のような感じです。

何なんだ、この仕様は。

インターネット一時ファイルのありか

InternetExplorer で表示したファイル(インターネット一時ファイル)は、C:\Documents and Settings\(user_name)\Local Settings\Temporary Internet Files フォルダに保存されていて(変更可能)、Explorer で見てもちゃんとそこにあるように表示されます。しかし、スクリプトなどでそのインターネット一時ファイルにアクセスすると、そんなファイルは無いと言われます。えー、あるじゃねぇかよう! でも、右クリックのメニューが通常と違うような・・・?

インターネット一時ファイルの実体は別のところにあるのですが、ゲイツさんが気を利かせて「Explorer では、こういう風に見えたほうが便利だろ?」ということで、そこにあるように見えているだけです。実体は Temporary Internet Files フォルダ内に Content.IE5 フォルダがあり、さらにその中の英数字羅列のフォルダの中にファイルはあります。Content.IE5 フォルダを Explorer で見る事はできません(?)がアドレスバーに C:\Documents and Settings\(user_name)\Local Settings\Temporary Internet Files\Content.IE5 などと入力すると中を見ることができます。またスクリプトでも同様のパスを指定すると、確かに存在を確認できます。

フォルダとファイルフォルダの違い

エクスプローラーの ツール > ファイルオプション で見られる「ファイルの種類」に、「ファイルフォルダ」と「フォルダ」というのがあるんだけれど、どう違うのだろう?

「ファイルフォルダ」は、いわゆるフォルダのことです。

一方「フォルダ」は、「ファイルフォルダ」の他に、ドライブ、コントロールパネル、ごみ箱などを含んでいます。

なので、「ファイルフォルダ」の関連付けを設定した場合は、いわゆるフォルダにしか適用されませんが、「フォルダ」に関連付けを設定した場合は、いわゆるフォルダだけでなく、ドライブやコントロールパネル、ごみ箱などにも適用されます。

http://nobumasa-web.hp.infoseek.co.jp/faq/windows/relate/folder/folder.htmlを参照。

ハードディスクの使用領域サイズが計算と合わない

ドライブのプロパティーで確認できる使用領域のサイズが、ドライブ内の全ファイルのサイズを足した値より大きいぞ?なぜだろう。

ファイル以外でドライブの領域が使用されています。以下の用途で使用されている可能性があります。

Win+Eでエクスプローラが表示されない

通常、キーボードショートカット Win+E はエクスプローラの起動が割り当てられていますが、いつの間にかエクスプローラが起動せず「パラメータが間違っています。」というダイアログが表示されるようになってしまいました。

原因は、 フォルダの右クリックメニュー「エクスプローラ」を消してしまったからのようで、戻すとキーボードショートカットが効くようになりました。

Contexterというソフトは 右クリックメニューの編集を行えるソフトで、項目を「削除」すると本当に元に戻せませんが、「表示」のチェックボックスを外すだけなら、あとでチェックしなおすことで元に戻せます。

一応、消してしまったキミのために、今回元に戻した項目を書いておこう。

拡張子 : Folder
ファイルの種類 : フォルダ
表示するテキスト: エクスプローラ(&X)
実行するプログラム : C:\WINDOWS\Explorer.exe
コマンドライン引数 : /e,/idlist,%I,%L

右クリックメニューの「再生待ちに追加」を削除する

Windows Media Playerをインストールしていると、音声、動画ファイルの右クリックメニューに「再生待ちに追加」などが表示されて、ウザイです。そんなの使いません。

表示しないようにするには、レジストリエディタを開いて、キー「{F1B9284F-E9DC-4E68-9D7E-42362A59F0FD}」の右クリックメニュー「名前の変更」で、キーの名前の先頭に セミコロンを追加してコメントアウトします。その後、メニュー > 表示 > 最新の情報に更新 を実行して、反映させます。これで「再生待ちに追加」が非表示になります。

その他の項目についてはマイコミジャーナルの記事を参照

ファイルをごみ箱に捨てる動作が異常に遅い

ファイルをごみ箱に捨てるだけなのに、なんか数十秒もハードディスクにアクセスするようになってしまいました。

この現象は、デフラグをやればましになりました。デフラグのやり方は以下のとおり。

  1. 「マイコンピュータ」を開く
  2. 表示されるドライブのどれかを右クリックし、「プロパティ」をクリック
  3. 「ツール」タブの「最適化する」ボタンをクリック
  4. 「ディスクデフラグツール」が起動するので、好きなドライブを選択して「最適化」ボタン

タイトルバーの「閉じる」「最大化」「最小化」ボタンの大きさを変える

タイトルバーの「閉じる」「最大化」「最小化」って、なんか小さくて押しにくい。クラシックスタイルだと、特に。画面のプロパティーで大きさ変えられるけど、縦横両方換わっちゃうんだよね。横幅だけ変えられないものかね。

レジストリ内に、そういう設定があります。「HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics」のエントリ「CaptionWidth」が通常 -270 に設定されていますがこれを -360位にすると約1.5倍の幅になります。縦も変えたい場合はエントリ「CaptionHeight」の値をいじればいい。

ソフトウエアのインストール,アンインストールに失敗する

,NET Framework 3.5 SP1 のインストールがうまくいきませんでした。ぐぐってみると、3.5のBeta版が入ってるとダメなので事前にアンインストールせよ、というような内容がありましたが、そもそも入っていませんでした。それでもとりあえず 3.5 をアンインストールしてみるかとやってみたのですが、アンインストールも失敗します。

なんやかんや調べてみると、どうも Windows インストーラ サービスとやらがぶっ壊れていたらしい。なので、Windows インストーラを利用したソフトのインストールが失敗していたようです。

直し方は、Windows XP または Windows Server 2003 を実行しているコンピューターでプログラムを追加または削除すると、エラー メッセージ "Windows インストーラー サービスにアクセスできませんでした" が表示されるを参照。「方法 1: Windows インストーラーを登録する」を実行すると ,NET Framework 3.5 SP1 をインストールできるようになりました。

タスクに登録したバッチファイルが起動しない - コピー

バッチファイルを作成して、タスクに登録して自動実行させようとすると、バッチファイルの起動に失敗しました。タスクからではなく、エクスプローラ上でバッチファイルをダブルクリックすると起動できるのに。

ファイル名としては使用できるが、コマンドプロンプト上では特別な意味を持つ文字というのがあります。

バッチファイルを指定するフルパス内にこれらの文字が入っている場合、そのままフルパスを指定しても正しく解釈されません。「^ (ハット)」をこれら文字の前においてエスケープすればいいです。タスクについても、プロパティを開いて、実行するファイル名欄で上記文字をエスケープすればいいです。

エクスプローラの詳細表示で表示項目を固定したい

エクスプローラはたいてい詳細表示で使うんですけど、mp3の入ったフォルダ開くと勝手に「タイトル」とか「時間」とかの項目が出てきてウザイ。変わらないようにしたい。

Windows Vistaのエクスプローラにおける自動フォルダ・タイプ設定を無効にする

[XP]  chkdscのログのありか

[コントロールパネル] > [管理ツール] > [コンピュータの管理]を起動して、ツリー内の[システムツール] > [イベントビューア] > [アプリケーション]を展開。右のリスト内のソースがwinlogonとなっている項目がログです。chkdscを実行した時間で分かれていますので、見たい項目をダブルクリックで開いて下さい。

ちなみにwinXPにスキャンディスクはなく、同等の機能を持つものがchkdscです。

[XP]  圧縮フォルダを無効にする

windowsXPでは標準でzip形式アーカイブを扱えるようになってますが、はっきりいってzip形式だけ扱えたところで邪魔なだけです。無効化してしまいましょう。方法は、スタートメニューの「ファイル名を指定して実行」に「regsvr32 /u %windir%\system32\zipfldr.dll」と入力して実行すればよいです。逆に再度利用する場合は「regsvr32 %windir%\system32\zipfldr.dll」とすればよいです。

この項はhttp://www.zdnet.co.jp/help/tips/windows/w0439.htmlを参考にしました。

[XP]  メモ帳トラッパーを用いてもIEでソースを開くとメモ帳が起動する

メモ帳に関連付けられたファイルを任意のテキストエディタで開くのに便利な「メモ帳トラッパー」(IE6使用の場合は「メモ帳トラッパー」をIE6対応に」を追加)ですが、普通にインストールしてテキストエディタを設定しても、IEの「ソースの表示」ではメモ帳が起動してしまうことがあります。

原因はよくわかりませんが、メモ帳トラッパーをセーフモードでインストールするとうまくいくようです。

[XP]  WIAサービスを停止してExplorerを高速化する

デジタルカメラやスキャナといったイメージングデバイスから画像を簡単に取り込むための機能である「Windows Image Acquisition(WIA)」を停止することで、Explorerを高速化することができます。

  1. スタートメニュー > ファイル名を指定して実行 をクリック。
  2. 「msconfig」と入力し、「システム構成ユーティリティ」を起動。
  3. 「サービス」タブ内のリストから「Windows Image Acquisition(WIA)」を探し、チェックをはずす。
  4. 「OK」ボタンをクリック。再起動が促されるので再起動する。

[XP]  OS起動後、よくわからないハードディスクアクセスがしばらく続く

OSが起動してデスクトップが表示された後、ハードディスクへのアクセスがしばらく続くことがあります。というか、毎回そーなんですけど。原因は不明なんですか、スタートアップ時に「Workstationサービス」が起動されるのを無効にしてやるとマシになりました。

  1. スタートメニュー > ファイル名を指定して実行 をクリック。
  2. 「msconfig」と入力し、「システム構成ユーティリティ」を起動。
  3. 「サービス」タブ内のリストから「Workstation」を探し、チェックをはずす。
  4. 「OK」ボタンをクリック。再起動が促されるので再起動する。

ただし、ネットワーク関連のサービスなので、無効にすることで他に出来なくなることがあるかもしれません。「Workstationサービス」の依存関係なんかを気にしてみてください。

  1. コントロールパネル > 管理ツール > サービス を開く。
  2. 表示される項目から「Workstation」を探し、ダブルクリック。
  3. 表示されるプロパティーダイアログ上で「依存関係」タブの内容を確認。

各サービスの内容は、各項目のプロパティーダイアログ上の「全般」タブ > 説明 欄に記載されています。

プログラミング

[Delphi6]  起動時にメインフォームを表示しない

起動時にメインフォームを表示しないようにするには、メインフォームの visible プロパティの値を false にするだけではダメです。プロジェクトファイル(.dpr)中で、Application.Run よりも前に Application の ShowMainForm プロパティーの値を false にしておく必要があります。

Delphi6 ヘルプ「TApplication.ShowMainForm」の項を参照してください

[Ruby]  エラー「can't modify frozen string (TypeError)」が発生する

このエラーの意味するところは「オブジェクトの内容の変更が禁止されている(フリーズしている)ので、変更できません。」です。

いや、俺、変更しようなんてしてねぇよ!と思うかもしれませんが、ちゃんとコードを眺めてみましょう。たとえば以下のコードは一見よさげですが・・・

i=ARGV[0]
i[0]='y' #=> can't modify frozen string (TypeError)
スクリプトに引数が与えられた場合、2行目で上記エラーが発生します。ARGV[0]が定数だからです。2行目で ARGV[0] を直接変更しようとはしていないように見えますが、そうではありません。変数 i はARGV[0]のコピーではなく、ARGV[0]そのものだからです。

まだこの例では簡単ですが、別の変数に変数 i が代入されて、さらに別の変数にそれが代入されて・・・となっていると、分かりづらいものです。

エラーが出ないようにするには dup メソッドで値を複製すればよいです。

i=ARGV[0].dup # ARGV[0]の内容のみを複製して、i に代入する
i[0]='y'

[Ruby]  Windowsのスピーカー音量を変える

WAVE音量を変えるには以下のようにします。(参考:windows-prMSDNライブラリ)

ただ、俺が変えたいの、「ボリュームコントロール」なんだよなぁ。これはデバイスに依存していて、変えるの大変らしい。他言語で書かれたサンプル見てもよく分からん。

とりあえず、nircmd の sysvolume 系コマンドをつかうこととする。

[Ruby]  ERB#run、ERB#resultの引数のbindingって何?

eRubyスクリプトを処理するクラス ERB のインスタンスメソッド #run、#result には、引数として binding というものが指定できますが、これって何? 具体的に何を渡せばいいの?

Binding というクラスがあって、それのインスタンスを渡せばよいそうです。

この引数は、eRubyスクリプトをコード中のどこで実行したことにするのか、ということを指定するために存在します。引数にどんな binding を渡すかによってeRubyスクリプトの挙動が変わります。例えば、eRubyスクリプト中で同じ変数名であっても、トップレベルの binding と ブロック内の binding では、変数のスコープが異なるので、結果が異なるかもしれません。たいていの場合、#run なり #result なりを行う場所での binding で処理することになると思いますので、その場合は組み込み関数 binding を指定すればいいと思います。

組み込み関数 eval の説明なんかも参照すればよいかも。

[Ruby]  長い正規表現リテラルを分割して見やすく記述する

なんに使うのか全く良くわからないということにしておきますが、以下のような正規表現リテラルがあるとします。

エスケープする必要のない文字までエスケースしているをの抜きにしても、後で見返すとさっぱり分かりませんよね。というわけで、次にように分割して記述しておくと、ちょっとは見やすいのではないかと。

ようは、区切れるところで区切って、個別に文字列として名前をつけて、あとで連結して正規表現オブジェクトを作ってるだけです。

いや、まあ、それにしても分からないわけですが。セガのアーケードゲーム「WCCF」のカードリストのページから、カードのパラメータを取得するために作った正規表現だ、なんて全く分からないですよね。

[Ruby]  case文でクラスに応じて場合分けする

メソッド定義などで、引数のクラスに応じて動作を変えたいということが割とあります。そんなわけで以下のコードを書いてみましたが、これは目的の動作をしてくれません。

def my_class(arg)
  case arg.class
  when String
    puts('My class is String.')
  else
    puts('My class is ...?')
  end
end

my_class('test') # => My class is ...?

メソッド my_class に与えた引数のクラスは String ですから、My class is String. と表示して欲しかったのですが、そうはなりません。

なぜこんなことになるのだろうか? case文は === メソッドを使って比較を行います。つまり、when String の行では、String==='test'.class が評価されています。('test'.class===Stringではありません。レファレンスマニュアルの制御構造 case の項参照) で、Class#===(arg) は arg.kind_of?(Class) と定義されています。(実際は Class クラスのスーパークラスである Module にて定義されています。)なので、先ほどの String==='test'.class は、'test'.class.kind_of?(String) と同じです。ちょっと評価を進めると、String.kind_of?(String) となり、「クラス String」 が 「クラス Stringのインスタンス」かどうかということになります。これは 偽 です。

じゃあ、どうすればいいのかといいますと、単純に以下のようにすればよいです。

def my_class(arg)
  case arg
  when String
    puts('My class is String.')
  else
    puts('My class is ...?')
  end
end

my_class('test') # => My class is String.

こうすれば when String の行は String==='test'、つまり 'test'.kind_of?(String),であり、「'test'」が「クラス String のインスタンス」かどうかを評価していることになり、期待通りの動作をします。

[Ruby]  Excelで条件付き書式の参照セルが勝手に書き換えられる

以下は、新たにExcelを立ち上げ、C列の1行目から20行目に数式と条件付き書式を設定するスクリプトです。(定数をロードするのに数秒かかります。)

require 'win32ole'
module ExcelConst
end

xl=WIN32OLE.new('Excel.Application')
xl.Visible=true

WIN32OLE.const_load(xl, ExcelConst)

book=xl.Workbooks.add
sheet=book.Worksheets.add
range=sheet.Range('C1','C20')

range.each do |cell|
  cell.Formula='=D1'
  cell.FormatConditions.Delete
  cell.FormatConditions.Add({ 'type'     => ExcelConst::XlCellValue,
                              'operator' => ExcelConst::XlEqual,
                              'formula1' => '=D1'})
end

・・・なんですけど、作成されたシートはちょっと変です。セルに設定された数式は期待した通りなんですが、条件付き書式の参照セルの場所が違っています。例えばセル C20 には数式 「=D1」が設定されていますが、条件付き書式には「=F20」が設定されています。どちらも同じ値「=D1」を設定しているはずなのに。

どうやら、条件付き書式に値が書き込まれるとき、その値はまずセル A1 を基準にした参照セルとして解釈されてから、解釈後の値が書き込まれているようです。例えば、例えばセル C20 の条件付き書式に値が書き込まれるとき、設定する値「D1」はセル A1 から見た位置 右3下0 と解釈され、セル C20から 右3下0 のセル F20 が書き込まれるという具合です。

なぜ条件付き書式のほうだけそんなことになるのか不明です。とりあえずは、参照セルの指定を絶対参照にすればよいです。(「$D$1」のように値の前にドル記号をつける。)相対参照にしたいときはどうすればいいんだろうな。

[Ruby]  Windowsでタイトルを指定してウインドウをアクティブにする

Windows Scripting Host の WScript.Shell オブジェクト を利用して、任意のタイトルを持つウインドウをアクティブにすることができます。下記は、タイトルに「WWWC」を含むウインドウをアクティブにするスクリプトです。

「該当するウインドウが複数ある場合は、どれが選択されるか決まっていない」という点に注意が必要です。タイトルの代わりに ProcessID を与えることで回避できますが、ProcessID が取得できない場合は、なるべく一意に決まるように指定するしかないです。

また、「失敗しても終了する」点にも注意が必要です。これは、AppActivate メソッドが、成功すれば true を、失敗すれば false を返すことを利用して、下記のように成功するまで繰り返せばよいです。

[Ruby]  InternetExplorerのタイトルが指定したとおりにならない

以下は InternetExplorer を新たに起動して、Google Japan にアクセスし、タイトルを改ざんするスクリプトです。

これはうまくいくんですが、複数のスペースが連続した文字列、例えば「G          oogle」をタイトルに指定した場合、連続スペースが1つのスペースに変換されてしまいます。

何でだろうな(投げっぱなし)

[Ruby]  Windowsでファイルオープンダイアログを表示する

Windows XP であれば、Win32OLE の UserAccounts.CommonDialog オブジェクトを利用して表示することが可能です。

require 'win32ole'

objDialog = WIN32OLE.new("UserAccounts.CommonDialog")
objDialog.Filter = "全てのファイル (*.*)|*.*|テキストファイル (*.txt)|*.txt"
objDialog.InitialDir = "C:\\"
if objDialog.ShowOpen then
  puts objDialog.FileName
else
  puts 'canceled'
end

ただし、Windows XP 未満では UserAccounts.CommonDialog オブジェクトは用意されていないので、この方法は使えません。代替案として、InternetExplorer を利用する方法があります。初期ディレクトリの設定とか、拡張子によるフィルタリングとかできませんけど。

require 'win32ole'

ie=WIN32OLE.new("InternetExplorer.Application")
ie.Navigate("about:blank")
ie.Document.GetElementsByTagName('BODY').Item(0).InnerHTML = '<INPUT type="file" id="FileOpen">'
ie.Document.GetElementById("FileOpen").Click
puts ie.Document.GetElementById("FileOpen").Value
ie.Quit

あと、Ruby標準添付ではないですが、VisualuRuby の SWin::CommonDialog モジュールの openFilename メソッドを使えば、たぶんWindowsのバージョンによらず実現できます。ActiveScriptRuby には VisualuRuby が添付されています。

require 'swin'
fname=SWin::CommonDialog.openFilename(nil,[["all(*.*)","*.*"]],0x1000,'select file') 
puts fname

SWin::CommonDialog モジュールについては配布サイトのリファレンスを参照。リファレンス中の第3引数 flag についてはたぶんここらへんを参考にすれば良いのでは?とりあえず 0x1000 を指定すると、存在しないファイルが入力されたとき警告が表示されます。

というか、たぶん Windows API を直接いじればできるんだろうなぁ。そんな科学力持ってないけど。

[Ruby]  web上のデータをローカルに保存する

require 'open-uri'

src='http://www.yahoo.co.jp/'
dst='C:\yahoo_top.html'

File.open(dst, 'wb'){|f| f.write(open(src).read) } 

バイナリファイルでもいけまっせ。

[Ruby]  MSOfficeでコレクションオブジェクト内のオブジェクトを参照しようとするとエラー

Rubyの配列のインデックスは 0 から始まりますが、MSOfficeのコレクションオブジェクトのインデックスは 1 から始まります。

以下のコードは、配列 sheet_name にしたがって、順番にシートの名前を変更しようとしています。 が、コレクションオブジェクト Worksheets の 0 番目を参照しようとしたときにエラーとなります。

require 'win32ole'
app=WIN32OLE.new('Excel.Application')
app.visible=true
book=app.Workbooks.Add

sheet_name=['first','second','third']

sheet_name.each_with_index{|name,idx|
  book.Worksheets(idx).Name=name  #=> idx=0 のとき WIN32OLERuntimeError
}

[Ruby]  ファイルに書き出したマーシャルデータを読み込めない

Marshal.dump で出力したデータをファイルに書き出した後、ファイルからデータを読み込んで Marshal.load でオブジェクトを復元しようとしたとき、復元ができずエラーとなることがあります。

もしかして、ファイルをテキストモードで開いてませんか? マーシャルデータはバイナリデータなので、ファイルへ読み書きする場合は、ファイルをバイナリモードで開く必要があります。

ary=[1,2,3,4]

data=Marshal.dump(ary)
File.open('c:\test.dat','wb'){|f| f.write(data)}

data2=File.read('c:\test.dat')
ary2=Marshal.load(data2)

p ary2

[Ruby]  Excelに大量のデータを一度に書き込めない

以下は、Excelを開き、新たなブック、シートを作成し、そのシートの「横256列、縦n(=10000)行」の領域に「1」を書き込むコードです。が、書き込まないまま終了してしまいます。

require 'win32ole'
app=WIN32OLE.new('Excel.Application')
app.Visible=true
sheet=app.Workbooks.Add.Worksheets.Add

n=10000
ary=Array.new(n,Array.new(256,1))

start_cell=sheet.Cells(1,1)
end_cell=sheet.Cells(ary.size,256)
sheet.Range(start_cell,end_cell).Value=ary

環境によって違うかもしれませんが、ウチの環境では n=2330 以下ではOK、n=2331 以上では書き込めませんでした。Ruby がエラーを出しているわけではなく、Windows のエラーのようです(エラーコード:-1073741819?)。

エラーの内容は分かりませんが、回避するには一度に書き込まず、分割して書き込むようにすれば良いです。以下では step=1000行ずつ書き出しています。チョット時間がかかりますが書き込むことができました。

require 'win32ole'
app=WIN32OLE.new('Excel.Application')
app.Visible=true
sheet=app.Workbooks.Add.Worksheets.Add

n=10000
ary=Array.new(n,Array.new(256,1))

step=1000
0.step(ary.size-1,step){|i|
  ary_t=ary[i,step]
  start_cell=sheet.Cells(i+1,1)
  end_cell=sheet.Cells(i+1+ary_t.size-1,256)
  sheet.range(start_cell,end_cell).Value=ary_t
}

また、Exerb で 実行ファイルに変換して実行すると、step=1000行ずつでも書き出せず、step=50行ずつにしてようやく書き出せるようになりました。

[Ruby]  Excelに対する処理を高速化する

Excelから大量の値を取得したり、書き込んだりしようとすると、結構時間がかかります。何とかして高速化する方法を以下に示します。といっても、スーパーハカーではないので、「いかにして作成するwin32oleオブジェクトの数を減らすか」という方法だけですけど。

例1:同じwin32oleオブジェクトを何度も作成しないようにする

以下は、セルから値を繰り返し取得するコードです。

# 準備
require 'win32ole'
xl=WIN32OLE.new('Excel.Application')
xl.Visible=true
xl.Workbooks.Add.Worksheets.Add.Cells.Item(1,1).Value=1

n=1000

# 例1-1:毎回、Excel アプリケーションオブジェクトからセルまで辿っていく
start=Time.now
n.times{
  a=xl.Workbooks(1).Worksheets(1).Cells.Item(1,1).Value
}
p Time.now-start #=>14.062


# 例1-2:ワークシートまで辿った結果を変数 sheet に格納しておいて、使いまわす
start=Time.now
sheet=xl.Workbooks(1).Worksheets(1)
n.times{
  a=sheet.Cells.Item(1,1).Value
}
p Time.now-start #=>9.375

毎回、Excelアプリケーション -> ワークブック -> ワークシート と辿っていくのは無駄なので、ワークシートを変数に格納しておいて、使いまわすようにすることで高速化できます

例2:コレクションオブジェクトからの要素取り出しに Item を使わない

以下は、セルから値を繰り返し取得するコードです。

# 準備
require 'win32ole'
xl=WIN32OLE.new('Excel.Application')
xl.Visible=true
sheet=xl.Workbooks.Add.Worksheets.Add
sheet.Cells.Item(1,1).Value=1

n=1000

# 例2-1:コレクションオブジェクトから Item メソッドを使って要素を取り出す
start=Time.now
n.times{
  a=sheet.Cells.Item(1,1).Value
}
p Time.now-start #=>9.375

# 例2-2:コレクションオブジェクトに引数を与えて直接要素を取り出す
start=Time.now
n.times{
  a=sheet.Cells(1,1).Value
}
p Time.now-start #=>6.907

cells は複数のセルを集めたコレクションオブジェクトです。コレクションオブジェクトから要素(セル)を取り出すために、Item というメソッドが用意されていますが、これを使わずに Cells に直接引数を与えて要素を取り出したほうが速いです。

例3:書き込む値を配列で一度にExcelに渡す

以下は、縦100x横10セルの範囲に値を書き込むコードです。

# Excel の準備
require 'win32ole'
xl=WIN32OLE.new('Excel.Application')
xl.Visible=true
sheet=xl.Workbooks.Add.Worksheets.Add

# 書き込む値(配列)の準備
row_num=100
col_num=10
ary1=Array.new(row_num,Array.new(col_num,1)) 
ary2=Array.new(row_num,Array.new(col_num,2))


# 例3-1:セルごとに値を設定する
start=Time.now
ary1.each_with_index{|item_a,idx_a|
  item_a.each_with_index{|item_b,idx_b|
    sheet.cells(idx_a+1,idx_b+1).Value=item_b
  }
}
p Time.now-start #=>6.953

# 例3-2:配列をそのまま Excel に渡す
start=Time.now
r=sheet.range(sheet.cells(1,1),sheet.cells(row_num,col_num))
r.value=ary2
p Time.now-start #=>0.032

セルごとに値を書き込もうとすると、そのたびごとにwin32oleオブジェクトを作成しなければならないので遅いです。値を配列(配列の配列)で用意し、同じ大きさの range オブジェクトの Value プロパティに渡してやると一気に書き込めます。

ただし、あまり多くの値を一度に書き込むことはできないようです。[Ruby] Excelに大量のデータを一度に書き込めないを参照してください。

例4:複数の非隣接セルに同じプロパティをまとめて設定する

以下は、複数の非隣接セルの背景色を設定するコードです。

#準備
require 'win32ole'
xl=WIN32OLE.new('Excel.Application')
xl.Visible=true
sheet=xl.Workbooks.Add.Worksheets.Add

cells=['A1','B2','C3','D4','E5','F6','G7','H8','I9']

# 例4-1:一つずつ設定する
start=Time.now
cells.each{|cell|
  sheet.Range(cell).Interior.ColorIndex=3
}
p Time.now-start #=>0.109

# 例4-2:まとめて設定する
start=Time.now
sheet.Range(cells.join(',')).Interior.ColorIndex=4
p Time.now-start #=>0.016

Rangeメソッドには、セルの名前をコンマで区切って複数列挙した文字列を渡すことができます。これを利用すれば、上記のように隣接していない複数のセルに、一括して同じプロパティを設定することができます。

ただし、Rangeメソッドに渡せる文字列のサイズは最大256文字(?)です。なので、セルの数がやたらと多い場合は、何個かずつに分けて処理するようにしましょう。

[Ruby]  ExcelのセルのValueプロパティが返す値

セル(の集合)をあらわす range オブジェクトの Value プロパティは、セルの値を返します。でもセルの値が無いときは何を返すの?

require 'win32ole'

app=WIN32OLE.new('Excel.Application')
app.Visible=true
book=app.Workbooks.Add
sheet=book.Worksheets.Add
cell=sheet.range('a1')

#値がない場合
p cell.Value  #=> nil

#Rubyから空文字列を書き込んだ場合
cell.Value=''
p cell.Value  #=> nil

#セルの数式に空文字を設定した場合
cell.Formula='=""'
p cell.Value  #=> ""  (空文字列)

というわけで、Excel上で何も書いて無いように見えていても、nil が返ってきたり、空文字列が返ってきたりします。

ちなみに上記ではRubyのwin32oleを通して Value や Formula を設定しましたが、Excel マクロで同じように設定したセルに対してRubyから値をとっても結果は同じでした。

[Ruby]  Win32OLEを用いて開いたExcelを閉じた後、オブジェクトが開放されない

以下のスクリプトは、WIN32OLE を用いて Excel を開き、閉じるスクリプトです。

require 'win32ole'

app=WIN32OLE.new('Excel.Application')
app.Visible=true
book=app.Workbooks.Add
sheet=book.Worksheets(1)
book.Close
app.Quit

p WIN32OLE.connect('Excel.Application')

最後の行の WIN32OLE.connect では、Excel オブジェクトが存在すればその WIN32OLE オブジェクトを返しますが、ここでは既に Excel オブジェクトは閉じている(app.Quit)ので、エラーを返すことが期待されます。が、実際には閉じたはずのExcel オブジェクトを返します。

タスクマネージャーを見ると、スクリプトが終了した後にはExcel オブジェクトは残ってないようです。なので、気にしないでも良いのですが、GUIアプリなどしばらくスクリプトが生きているような状態の場合、閉じたはずの Excel が残っているため、別途Excelを手動で開いたりすると、Excelの枠だけ表示されて中身が表示されない事態になります。

なるべく早く Excel オブジェクトを閉じたい場合には以下の方法があります。

  1. GC を開始する
  2. それでもダメな場合、さらに変数に明示的に nil を代入して、参照を切る
  3. それでもダメな場合、さらに WIN32OLE#ole_free を使う
require 'win32ole'

app=WIN32OLE.new('Excel.Application')
app.Visible=true
book=app.Workbooks.Add
sheet=book.Worksheets(1)
book.Close
app.Quit

app.ole_free

sheet=nil
book=nil
app=nil

GC.start

p WIN32OLE.connect('Excel.Application')

ただし、 WIN32OLE#ole_free はデバッグ用らしく、使用はあまり推奨されないようです。何でも、閉じたオブジェクトに再度アクセスしたとき、どうなるか分からないとか。んー。とりあえず、[ruby-list:35403] win32ole で excel が終了しない[ruby-talk:253090]How to completely terminate a WIN32OLE Excel object?を参照。

[Ruby]  exerbで作った実行ファイルを実行すると警告「already initialized constant」が出る

# test.rb

require 'vr/winconst'
require 'vr/winconst'
# test.exy

general:
  startup: test.rb
  core: cui
  kcode: sjis

file:
  test.rb:
  vr/winconst:
    file: c:/ruby/lib/ruby/site_ruby/1.8/vr/winconst.rb

上記スクリプト test.rb は、そのままインタプリタに渡して実行すると、特に何事も無く終了します。しかし、上記レシピファイル test.exy を使って exerb で実行ファイルを作り実行すると、以下のように定数を再定義しているという警告が表示されます。

vr/winconst:16: warning: already initialized constant WM_NULL
vr/winconst:17: warning: already initialized constant WM_CREATE
(・・・もっといっぱい続く)

何で exerb で作った実行ファイルでだけこんな警告が出るのだろう?

直すべきところをまず言うと、レシピファイルの「vr/winconst:」キーの部分を「vr/winconst.rb:」にすればよいです

# 修正後のtest.exy

general:
  startup: test.rb
  core: cui
  kcode: sjis

file:
  test.rb:
  vr/winconst.rb:
    file: c:/ruby/lib/ruby/site_ruby/1.8/vr/winconst.rb

recuire は同じライブラリがまだロードされていない時だけロードします。なので、同じライブラリ vr/winconst を2回 require しても、実際にロードされるのは1回目の require の時だけで、2回目の require ではロードされません。

ところが、レシピファイルで「vr/winconst:」として作った実行ファイルでは、キーが「vr/winconst:」なのに対し、実際のファイル名は「vr/winconst.rb」であるため、 ロードされたかどうかの判定に齟齬が出るようです。(よく分かりませんが。) require は実際にライブラリをロードした場合 true、ロードしなかった場合 false を返すことを使って確認すると、修正前レシピファイルで作った実行ファイルでは、2つの require がどちらも true を返します。一方、インタプリタでの実行、および修正後レシピファイルで作った実行ファイルでは、1回目の require は true を、2回目の require は false を返します。

[Ruby]  VisualuRubyでフォームをトップモースト(常に最前面に表示)にする

フォームの top メソッドでZオーダーを指定できます。VisualurubyリファレンスのSWin::Window#topの説明を参照のこと。

require 'vr/vrcontrol'

module MainForm
  def construct
    self.move(100,100,200,200)
    self.top(0xffffffff)
  end
end

frm=VRLocalScreen.newform
frm.extend MainForm
frm.create.show
VRLocalScreen.messageloop

[Ruby]  exerbで作る実行ファイルにloadで読み込むファイルは格納できない

exerb で実行ファイルを作るとき、レシピファイルの file ブロックにファイルを指定しておくことで、実行ファイル内にファイルを格納しておくことができます。

しかし、格納したファイルを読み込めるのは、ruby スクリプトの require のみです。load では読み込むことができませんので、load で読み込みたいファイルがある場合には、実行ファイルとは別にそのファイルを用意、配布する必要があります。

[Ruby]  windowsでファイルを関連付けられたアプリケーションで開く

以下は「C:\test.pdf」を pdf ファイルに関連付けられたアプリで開くスクリプトです。

require 'Win32API'

shellexecute = Win32API.new('shell32.dll','ShellExecuteA',%w(p p p p p i),'i')
shellexecute.call(0, 'open', 'C:\test.pdf', 0, 0, 1)

バリケンのRuby日記 - Rubyからブラウザを起動する(Windows版)を参考にしたというか、そのままです

[Ruby]  visualurubyのeditコントロールでEnterキー押下を検出する

edit コントロールに文字を入力した後で何か動作をさせたい場合、通常はボタンをクリックして何か動作させるようにしないといけません。でも、文字入力した後なんだから Enter キーで動作させたいです

以下のようにすればいいです。以下は edit コントロールに何か入力して Enter を押すと、標準出力にその内容を出力します。

require 'vr/vruby'
require 'vr/vrcontrol'
require 'vr/vrhandler'

class VRHookedEdit < VREdit
  include VRKeyFeasible
  def vrinit
    super
    add_parentcall("char")
  end
end

class MainForm < VRForm
  def construct
    addControl(VRHookedEdit,"edit1","",10,25,200,23)
  end
  
  def edit1_char(keycode,keydata)
    if keycode==13 #ENTER
      puts @edit1.text
      SKIP_DEFAULTHANDLER #beep音が消える
    end
  end
end

VRLocalScreen.start(MainForm)

通常の VREdit にキーボード入力を検出する機能を持たせた VRHookedEdit を作り、それを使っています。キーボード入力を検出したときには edit1_char メソッドが呼びだされ、入力されたキーが Enter だったら動作を行う、というような仕組みです。多分。SKIP_DEFAULTHANDLER はよくわかりませんが、これを入れておくと、Enter を押した時の音が消えます。

ruby 覚え書き(のGoogleキャッシュ)を参考にしました。

[Ruby]  windows上でNArray使いたい

でも、コンパイルとかよくわかんない、という場合はバイナリを配布していらっしゃるサイトがありますので利用します。

Ruby-mswin32 (ja)の「拡張ライブラリ」ってところからダウンロードできます。バージョンがちょっと古いけど、キニシナイ。

[Ruby]  任意の底を持つ対数を計算する

自然対数 Math.log(x)、常用対数 Math.log10(x) は提供されていますが、任意の底を持つ対数は提供されていません。底の変換公式を使って計算しましょう。

def Math.log_a(value,base)
  Math.log(value)/Math.log(base)
end

# 3 を底とする 10 の対数
Math.log_a(10.0, 3.0)  #=>2.09590327428938

[VBA]  正規表現を使う

VBScript.RegExp オブジェクトを利用することで、VBA 上で正規表現を使うことができます。ただし、VBScript.RegExp オブジェクトを利用するためには、InternetExplorer5.0 以上が必要です。

以下は、変数 str に格納された文字列が正規表現 WMF\d にマッチするかどうかをチェックする VBA スクリプトです

Sub sample()
  Dim str As String
  Set re = CreateObject("VBScript.RegExp")

  str = "WWF2"
  re.Pattern = "WMF\d"

  If re.test(str) Then
    MsgBox ("マッチしました")
  Else
    MsgBox ("マッチしませんでした")
  End If
    
  Set re = Nothing
End Sub

その他詳しくは MSDNの「Clinick's Clinic on Scripting: 正規表現による Visual Basic Scripting Edition (VBScript) の機能強化」あたりを参照。

[VBA]  コマンドボタンのキャプションに改行を含める

コマンドボタンに初期表示するキャプションを設定するには、表示 > ツールバー でコントロールツールボックスを表示、その中の デザインモード を ON 、コマンドボタン右クリック > プロパティ でプロパティダイアログを開く、Caption 欄を編集する、という具合で行います。

ですが、キャプションに改行を含めたい場合は、コードを書くしかなさそうです。ツール > マクロ > Visual Basic Editor でエディタを開き、左のツリーから ThisWorkbook をダブルクリック、右のエディタに以下のような感じに書く。すると、ワークブックがオープンされた段階でコマンドボタンのキャプションが書き換えられます。

Private Sub Workbook_Open()
    Worksheets("Sheet1").CommandButton1.Caption = "あけまして" & vbCr & "しめました"
End Sub

まあ、マクロ無効でオープンされると手も足も出ませんが、一旦コードで書き換えてその状態を保存しておけば、改行を含んだまま保存されます。

[VBA]  エラー「オブジェクト変数またはwithブロック変数が設定されていません」

エラー原因の可能性 その1 検索でヒットするセルがなかった
find メソッドの戻り値に対してさらにメソッドを呼び出すようなコードの場合、検索でヒットするセルがないと、find メソッドは Nothing を返し、Nothing に対してさらにメソッドを呼び出すことになります。このとき、エラーが生じます。ヒットしないはずが無い!と言う場合は、[Excel] 検索でヒットするはずのセルがヒットしないも参照してみてください。
エラー原因の可能性 その2 オブジェクト変数への代入に Set ステートメントを使っていない
宣言したオブジェクト変数にオブジェクトを代入するには、単なる代入文では駄目です。Set ステートメントを使用する必要があります。
Dim sheet As Worksheet

sheet = Worksheets("Sheet1") 'エラー
Set sheet = Worksheets("Sheet1") '正解
「代入する」ではなく「参照を作成する」らしいですが。変数に文字列や数値を代入するのと、何で区別するんだろう?

[VBA]  エラー「SeriesクラスのValuesプロパティを設定できません」

以下は、Sheet1上に散布図を新たに作成するスクリプトです。

Sub Macro1()
    Charts.Add
    With ActiveChart
        .ChartType = xlXYScatter
        .SeriesCollection.NewSeries
        .SeriesCollection(1).XValues = "=Sheet1!R1C1:R9C1"
        .SeriesCollection(1).Values = "=Sheet1!R1C2:R9C2" 'ここでエラー
        .Location Where:=xlLocationAsObject, Name:="Sheet1"
    End With
End Sub

しかし、実行すると ここでエラー とコメントした行で「SeriesクラスのValuesプロパティを設定できません」というエラーが発生します。原因は XL2000: Error Programmatically Accessing Data Series on a Chartを参照のこと。なにやら、グラフの表示されないデータ系列へアクセスしようとすると発生するらしいです。(ブランクのセルを参照してグラフを描かせようしてるからな!)

というわけで、回避方法としてはブランクセルでもグラフを書かせるようにすればよいです。

Sub Macro1()
    Charts.Add
    With ActiveChart
        .DisplayBlanksAs = xlZero
        .ChartType = xlXYScatter
        .SeriesCollection.NewSeries
        .SeriesCollection(1).XValues = "=Sheet1!R1C1:R9C1"
        .SeriesCollection(1).Values = "=Sheet1!R1C2:R9C2" 'ここでエラー
        .DisplayBlanksAs = xlNotPlotted
        .Location Where:=xlLocationAsObject, Name:="Sheet1"
    End With
End Sub

「.DisplayBlanksAs = xlZero」の行は、手動で下記の操作を行うことと同じ動作です。

また後の行では、「プロットしない(空白を残す)」に戻しています。

[VBA]  クラスモジュールの名前を変更する

挿入 > クラスモジュール で新たに作成したクラスモジュールは、デフォルトで Class1 などの名前がつきます。この名前を変更するには、表示 > プロパティーウインドウ でプロパティウインドウを表示させ、オブジェクト名欄に名前を入力します。

[VBA]  エラー「オーバーフローしました」

以下のプログラムを実行すると「オーバーフローしました」というエラーが出ます。

Sub test()
    a = 64 * 600
End Sub

変数 a はデータ型を宣言していないのでバリアント型となっていて、数値を入れる場合は Double (倍精度浮動小数点数型)と同じデータ範囲なので、64×600=30840 程度の数値を表現できないはずはありません。

実はこのエラーは、計算結果を a に代入するときではなく、64×600の計算をするときに発生していています。

64×600の計算は Integer(整数型)×Integer(整数型)の計算として行われます。この場合、VBA は結果を Integer(整数型)として処理しようとしますが、計算結果は 38400 であり Integer(整数型)のデータ範囲では表現できません。これがオーバーフローの原因となってます

回避するには以下のようにします。

Sub test()
    a = CLng(64) * 600
End Sub

CLng 関数は、引数を Long(長整数型)に変換して返します。こうすると、計算は Long(長整数型)× Integer(整数型)となり、VBA は 結果を Long(長整数型)として処理するようになります。

Office TANAKA - Excel VBAの実行時エラー[オーバーフローしました]を参照しました。

[VBA]  エラー「アプリケーション定義またはオブジェクト定義のエラーです」

以下のプログラムを実行すると「アプリケーション定義またはオブジェクト定義のエラーです。」というエラーが出ます。

Sub test()
    Worksheets("sheet1").Activate
    Worksheets("sheet2").Range("A1:C3").Select
End Sub

ワークシート内のセルなどを操作するには、あらかじめそのワークシートがアクティブである必要があるようです。上の例では、「sheet1」がアクティブな状態で、「sheet2」のレンジを操作しようとしてエラーとなっています。次の例のように、あらかじめ操作する「sheet2」をアクティブにしておくとエラーが出なくなります。

Sub test()
    Worksheets("sheet2").Activate
    Worksheets("sheet2").Range("A1:C3").Select
End Sub

ちなみに、ワークシートをアクティブにするには「Activate」メソッドのほかに「select」メソッドがあります。「Activate」メソッドのほうは非表示ワークシートでもアクティブにできるそうです。

Excelでワークシートを選択する場合にSelectではなくActivateを使った方がよい理由 - paz3のおもいつき:を参照しました。

[VBScript]  「On Error GoTo」で構文エラー

VBScriptでのエラー捕捉には「On Error Resume Next」と「On Error Goto 0」しか使えないらしいです。なので、エラー補足したい場所の直後で Err の値をチェックして、エラー処理しましょう。(エラーが発生してなければ Err=0)

On Error Resume Next

a=1/0            'エラー発生

Select Case Err  'エラー内容に応じてエラー処理
  Case 11
     msgbox Err & " : " & Err.Description
End Select

On Error Goto 0  'エラー捕捉停止

VBとVBScriptの違いを参照しました。

アプリケーション

ローカルWindowsPCでtDiaryを動かす

外部に公開せず、自分のPC内だけで tDiary を閲覧、編集できるようにします。ここでは、以下の3つのアプリケーションを使うことにします。

また以下のようなパスを想定します。

手順1:ActiveScriptRubyのインストール、設定

ActiveScriptRuby配布サイトよりインストーラ(ActiveRuby.msi)をダウンロードし、実行する。インストール先は C:\Ruby 。

ruby.exe の置いてあるフォルダ(C:\Ruby\bin)にパスを通す。

手順2:tDiaryのインストール、設定

tDiary配布サイトよりパッケージをダウンロードする。とりあえずフルセットで良いのでは?

パッケージを解凍し、D:\ApplicationData\tdiary に保存する。

index.rb と update.rb の一行目を次のように変更する。(httpdでrbにruby.exeを関連付けておくと、いらない?)

#!ruby.exe

tdiary.conf.sample をコピーし、コピーしたファイルのファイル名を tdiary.conf に変更する。

tdiary.conf をテキストエディタで開き、@data_path に日記データベースの保存するフォルダの絶対パス(D:/ApplicationData/diary)を指定する。円記号ではなくスラッシュにすること

@data_path = 'D:/ApplicationData/diary'

tdiary.conf内の @update に update.rb のURLを指定する

@update = 'http://localhost/tdiary/update.rb'

日記データベース保存フォルダが無ければ、あらかじめ作っておく( D:\ApplicationData\diary)。

手順3:AN HTTPD のインストール、設定

AN HTTPDの配布サイトからファイルを入手する。入手したファイルを解凍して出てくるファイルを、C:\Program Files\httpd に保存。

httpd.exe を実行。タスクトレイにアイコンが表示されるので、右クリックし、「オプション 一般」を選択。

一般タブ > デフォルトインデックスに index.rb を追加。(入力済みの index.html とは コンマ で区切る)

一般タブ > 追加 にて、拡張子.rb と 実行プログラム C:\Ruby\bin\ruby.exe を関連付け。チェックボックスは、なにもチェックしなくても動くっぽい。

エイリアスタブ > 実行パス > 追加 にて 仮想パス /tdiary に対して ローカルパス D:\ApplicationData\tdiary を設定。

アクセス制御タブ の パス欄 に最初から書かれている / の行を選択して 編集。許可IPの *.*.*.* を削除し、127.0.0.1と入力。これで外部からのアクセスを遮断する。

以上が終わったら http://localhost/tdiaryにアクセス!

あと便利のために2つほど設定など

tdiary-grep を導入して、日記内を grep できるようにする

青木さんとこから grep.rb を入手し、index.rbと同じフォルダ(D:\ApplicationData\tdiary)に保存。

grep.rb をテキストエディタで開き、一行目を以下のように修正。

#!ruby.exe

http://localhost/tdiary にアクセスし、右上の 追加 > 設定 、左欄の ヘッダ・フッタ と進む。

ヘッダのフォームに以下の文字をコピー

<form method="post" action="grep.rb">
<input type="text" name="q" size="20" value="">
<input type="submit" value="Return">
</form>

これでヘッダに検索フォームが表示されて、grep できるようになる。

RDスタイルを導入する

RAA - rdtoolより rdtool-0.6.20.tar.gz をダウンロードし、適当なフォルダに解凍する。

setup.rb を実行し、rdtoolをインストールする。

D:\ApplicationData\tdiary\misc\style\rd にある rd_style.rb を D:\ApplicationData\tdiary\tdiary にコピーする。

tdiary.conf内の @style に 'RD' を指定する

@style = 'RD'

ローカルファイルへのリンク

((<画像はこちら|URL:file:///E:/test.jpg>))

RDスタイルでは上記のような記述で、ローカルファイルへのリンクを貼れます。

しかし Firefox3 ではセキュリティー上の理由から、ローカルファイルへのリンクが許可されていないようです。まあ、なんかファイルを書き換えれば許可できるようなんですが「セキュリティー!」とかいわれるとなんか怖いですよ。というわけで、とりあえずの運用案として、リンクされるファイルは1つのフォルダにまとめて置く、ということにして、そのフォルダ内ファイルへリンクを貼れるようにしてみます。

まず、まとめるフォルダを準備します。

次に、AN HTTPD のタスクトレイアイコン 右クリックメニュー > オプション 一般 > エイリアス タブ > 実行パス 追加ボタンを押して、仮想パスとして例えば「/diary_ref」、ローカルパスとしてさっき作ったまとめるフォルダを指定します。

そうすると、「(まとめるフォルダ)\test.jpg」へのリンクを「http://localhost/diary_ref/test.jpg」として記述できるようになります。この場合、Firefoxからはweb上のファイルであるとみなされるので開くことができます。

サーバーをRubyで書く

(追記 2009-09-21)せっかくRuby入れてるんだから、サーバーだってRubyで書いて動かしたいです。tDiaryインストールメモ(1) - バリケンのRuby日記が参考になります。

[Thunderbird]  メッセージフィルタ、迷惑メールフィルタのログのありか

メッセージを保存しているフォルダの filterlog.html、junklog.html がそれです。

メッセージの保存先は メニュー > ツール > アカウント設定でダイアログを開き、各アカウントの サーバ設定 > メッセージの保存先 の項目で確認できます

[Thunderbird]  メール編集ウインドウに添付ファイルをドロップする

メール編集ウインドウに、添付したいファイルをエクスプローラからドラッグ&ドロップしたい。でもメール編集ウインドウが受け付けてくれない?

メール編集ウインドウ内の宛先や件名の欄なら、ドラッグ&ドロップを受け付けてくれます

[Sleipnir]  SleipnirAPIのisbusyメソッドが機能しない

SleipnirAPIに、現在読み込み中かどうかを返す isbusy メソッドがあります。しかし、読み込み中にもかかわらず、メソッドが 偽 を返すことがあります。Sleipnir 2.45 では直ってるはずらしいんだけど、ダメみたい。

GetDocumentObject メソッドで、document が取得できるかどうかで代用する方法があります。例えば、以下は、Sleipnir で Google を開いて、読み込みが完了するまで待機するスクリプトです。(Ruby スクリプト)

あと、あまり関係にない話ですが、この後すぐに Title を取得しようと思っても、Titleが設定されるまで、ちょっとだけタイムラグがあるようです。なので、Title を得たい場合、Titleが取得できるまでさらに待つ必要があります。以下は、Sleipnir で Google を開き、Sleipnir をアクティブにするスクリプトです。

上記スクリプトで、Title が設定されるまで待つ部分をなくすと、Sleipnirがアクティブにならない場合があります。なる場合もありますけど。

[Sleipnir]  ページ検索バーにテキストを設定する

Sleipnir.API の PageSearchBarString プロパティーを用いてページ検索バーのテキストを取得・設定できます。下記はページ検索バーにテキストを設定するスクリプトです。(Rubyスクリプト)

require 'win32ole'
pnir=WIN32OLE.new('Sleipnir.API')
pnir.PageSearchBarString='愛ゆえに'

ただ、ページ検索バーの中の右のほうにあるボタンには反映されないのよね。中途半端に使えない。

[AutoCAD]  複数の線からなる閉曲線の面積を求める

AutoCADには、面積を求める機能があります。順番に頂点を選択していくと、それを結んでできる多角形の面積を求めるというものです。

・・・閉曲線の面積ってどうやって求めるんだ?

閉曲線の面積を求めるには、下準備として「リージョン」を作成する必要があります。

[AutoCAD]  寸法値に接頭語、接尾語を付ける

オブジェクトに対して寸法線を作成すると、寸法値が設定され、オブジェクトが変更されても自動で寸法値は変更されます。けど、「φ2.5」とか「R3」とかのように、寸法値の前後に文字列を付け加えたい場合があります。

寸法線のオブジェクトプロパティーの文字>寸法値上書きに記入すればよいのですが、そのまま「φ2.5」と書いちゃうと、オブジェクトが変更された場合でも、寸法値が変更されず「φ2.5」のままです。

自動で変更されるようにするには「φ<>」のようにします。そうすると、表示、印刷時に「<>」の部分にオブジェクトの寸法が代入されるようになります。

[AutoCAD]  円が多角形として表示されてしまう

PC上では、描画を高速にするため、多角形で表示するそうです。例えば、小さく描いた円を大きく拡大すると、8角形として表示されたりします。内部の計算や印刷では真円として処理されるので問題ないのですが、曲線同士の交点をポイントしたい場合、画面上での交点と実際の交点とがずれて見えたりするので、ちょっと困ります。この場合、コマンドで regen と入力すると再描画されて、滑らかに見えるようになります

参考:mura's home - [ 円が多角形で表示されます。問題ないでしょうか。 ]

[AutoCAD]  ブロック定義を解除する

作成 > ブロック > ブロック定義 にて複数のオブジェクトをまとめてブロックとして扱うことが出来るようになりますが、解除するときはどうするの?

ブロックを選んだ状態で 修正 > 分解 とすると、個々のオブジェクトに分解できます。

しかし、ブロック作成のときに付けた名前は削除されてませんので、この状態では、同じ名前のブロックを作成することができません。ファイル > 図面ユーティリティ > 名前削除 にて表示されるダイアログで、該当する名前を選んで削除してください。

[AutoCAD]  オブジェクトのスナップ位置をON,OFFする

線の中点とか接点とかにスナップしたい、交点にはスナップしたくないなどの設定は 作図補助設定で可能です。

設定画面を呼び出すにはコマンド「DDRMODES」とします。オブジェクトスナップタブで設定できます。

設定画面はメニューにはないのかな。ずっと探してたのに。

[AutoCAD]  寸法線がAM_5と言う画層に勝手に設定される

現在の画層に関わらず、寸法線を作成すると AM_5 という画層に勝手に設定されてしまいます。

これは「自動プロパティ管理」という機能によるもので、作成したオブジェクトに応じて適切なプロパティーが設定されます。

「自動プロパティ管理」機能を OFF にするには、以下のようにします。

[AutoCAD]  リボン表示をやめて、クラシック表示にする

何で AutoCAD までリボンUIとか採用してんだよ。ホントに使いやすいのか、これ。

昔のクラシック表示に変更するには、以下のようにします

[AutoCAD]  名前をつけて保存しようとするとフェイタルエラー

「名前をつけて保存」を使用とすると「フェイタルエラー Unhandled Access Violation reading 0x0278 Exception at 278h」というダイアログが出て、ソフトが終了してしまいました。数字のところは毎回違う気がします。

その後、不具合を Autodesk に送信するダイアログが出るので送信すると、AutoCAD Mechanical 2010 Update 1 の導入で解消されるらしいとのメッセージが出た。実際に導入したら解消された。

AutoCAD Mechanical 2010 Update 1は http://www.autodesk.co.jp/acm_download > Service Pack & パッチ からダウンロードが可能です。

[Jw_cad]  全体表示を行っても図面が全体表示されない

左右両クリックしながら右上ドラッグで「全体」の表示を行うことができますが、この「全体」は、描画領域全体が1画面にちょうど入るように拡大縮小移動するという意味ではないようです。

「全体」とは「用紙全体」の意味です。「用紙」は見えるようにはなっていませんが次のような位置・大きさに設定されています。「用紙」の位置は、ファイルを新規作成した際に表示される最初の画面位置の中央で固定されています。「用紙」の大きさは メニュー>設定>用紙サイズ にて設定されている大きさです(変更可能)。つまり「全体」の表示を行なうと、画面中心が上記「最初の画面位置の中央」になるように移動し、用紙サイズで設定した範囲全体が画面内に収まるように拡大縮小されます。ちなみに、印刷するときの範囲の初期位置もこの「用紙」の位置のようです。

冒頭のように、その時の描画領域に応じた描画領域の全体表示を行う機能はなさそうです。なので使い方でカバーします。なるべく「全体」の中央を中心に描画を行う・ずれてきたらその都度描画領域全体を「全体」表示の中央に移動させる・だいたい全体が見渡せる用紙サイズを設定する、といったことを心がけておけばよさそうです。

もしくは、現在の表示状態を記憶させておいてあとで呼び出すことも可能です。メニュー>設定>画面倍率・文字表示 で、表示範囲記憶 ボタンをクリックすると、現在の表示状態を記憶できます。呼び出すには「全体」と同じように、左右両クリックしながら右上ドラッグです。(コマンドの内容が「全体」から「範囲」に変わっています) 解除するには表示範囲記憶 ボタンの右の 記憶解除 ボタンをクリックすればいいです。

[MSOffice]  描画オブジェクトの表示が遅い

WordやExcelなどで、描画オブジェクトの表示が異常に遅いことがあります。しかも、スクロールバーでウインドウをスクロールするたびに改めて表示しようとするもんだから、何度PCを叩き割ろうかと。

ウチでは、以下の手順で「ハードウェアアクセラレータ」設定を変更することで解決しました。

  1. [画面のプロパティ] を開く。(デスクトップ右クリック、プロパティ)
  2. [設定] タブの [詳細設定] をクリック。
  3. 表示されるダイアログ上で [トラブルシューティング] タブを表示
  4. [ハードウェアアクセラレータ] スライダの値を、最大→左から3つめ に変更

マイクロソフト サポートのOffice XP プログラムで文書のスクロールやウィンドウのサイズ変更を行うと、グラフィックスまたはテキストの表示が乱れるも参照してみると良いでしょう。

[Excel]  列幅をコピーするマクロが動作しない

「形式を選択して貼り付け」で「列幅」を貼り付けるマクロを動作させると、「RangeクラスのPasteSpecialメソッドが失敗しました。」というエラーメッセージが表示され、動作しないことがあります。

これは、「新しいマクロの記録」でマクロを作成すると、コード内で「列幅」を意味するExcelの定数 xlColumnWidths が使用されるが、実はその定数は定義されていないことが原因です。

ゲイツさんの脳内では xlColumnWidths = 8 だそうですので、コード内の定数 xlColumnWidths を全て 8 で置き換えてやれば良いです。

マイクロソフト サポートの[XL2000]マクロ記録でPasteSpecialの引数Pasteが正しく記録されないも参照してみると良いでしょう。

[Excel]  グラフオブジェクトに名前をつける

セルやオートシェイプに名前をつけておくと、マクロで操作するときにインデックスで指定しなくて良くなるので、何かと便利な場面があります。セルに名前をつけるには、名前をつけたいセルを選択した状態で、メニューの 挿入 > 名前 > 定義 で表示される 名前の定義 ダイアログで、最上欄に名前を入力して OK すればよいです。

オートシェイプには、作成した時点で自動で名前が付いています。オブジェクトを選択した状態で、ウインドウ右上の名前ボックスに表示されるものがそうです。ですが「四角形 1」とかなので、扱いにくいです。名前をつけなおすには、名前ボックス内のテキストを編集すればOKです。

で、グラフオブジェクトにも名前をつけたいのですが、グラフオブジェクトを選択しても名前ボックスに「グラフエリア」としか表示されなくて、グラフオブジェクトの名前が分からないのです。名前を知るには、図形描画ツールバー の オブジェクトの選択ボタンを押してから、グラフオブジェクトを選択します。すると名前ボックスに「グラフ 1」みたいな名前が表示されます。名前を付け直すには、上記オートシェイプでやったのと同じようにすれば良いです。

[Excel]  検索でヒットするはずのセルがヒットしない

原因1:検索の対象がずれている

通常、検索の対象は「数式」に設定されているので、数式の結果に対してはヒットしません。たとえはどこかのセルに数式「=A1&A2」が入力されていて、その結果が「ab」になっていた場合、「ab」を検索しても、検索の対象が「数式」に設定されているとヒットしません。検索の対象を「値」にするとヒットします。検索の対象の設定は、検索ダイアログ上で行うことができます。

原因2:オートフィルタがかかっている

メニュー > データ > オートフィルタ でオートフィルタがかかっているために表示されていないセルは、検索にも引っかかりません。オートフィルタをはずすか、(すべて)を選んですべて表示させましょう

[Excel]  同じファイル名のファイルを開きたい

例えば以下のような 2 つの Excel ファイルがあったとします。

これら 2 つのファイルをダブルクリックして開こうとすると、後で開こうとしたほうが「'光熱費.xls'と同じ名前のファイル名が既に開いています。・・・」といって開くことができません。別な場所にあっても、ファイル名が同じだと開けないのです。

名前を変えたくない。何とか開きたい。そんな場合は、Excel を OLE オブジェクトとして起動しすることで、多重起動すれば良いです。以下は、そんなことを実現する Ruby スクリプトです。

require 'win32ole'

app=WIN32OLE.new('Excel.Application')
app.Visible=true

if ARGV.empty? then
  app.Workbooks.add
else
  ARGV.each{|path|
   app.Workbooks.open(path)
  }
end

既 にExcel が起動している状態でこのスクリプトを実行すると、既存のエクセルとは別の Excel を起動します。引数にファイルパスを与えて起動すると、既存のエクセルとは別の Excel を開き、そこに与えられたファイルを開きます。既存の Excel と新規の Excel は別アプリケーションとみなされますので、双方に同じ名前のファイルを開いても注意されません。

[LibreOffice]  アップデートできない

LibreOffice 3.4.2 から 3.5.1 へアップデートしようとしました。公式サイトからインストーラを入手して、実行しましたが、次のメッセージが出て、インストールできませんでした。「続ける前に、LibreOffice 3.4 と LbreOffice 3.4 クイック起動を終了させてください。マルチユーザ環境を使用している場合は、他のだれも LbreOffice 3.4 を開いていないことを確認してください。」

LibreOfficeは終了していますし、クイック起動も使用していませんでした。LibreOfficeのオプション > メモリ の項目にクイック起動を使用するかどうか選択できる欄がありますが、OFFになっていました。タスクマネージャを見てもそれらしいタスクはありません。msconfig コマンドを使ってスタートアップを全部切った状態で Windows 再起動してインストーラ実行しても、状況は変わりません。

結局、3.4.2をアンインストールしてからであれば、3.5.1をインストールできました。それでいいのか?

[MigemizeExplorer]  入手できない

MigemizeExplorerの作者のサイトが既になくなっているため、正規の方法では入手できません。が、入手する方法はあります。Internet Archive にて入手可能です。いきなり直リンク貼ってもいいのだけれど、後学のために、やった手順を書いておこう。

  1. Google で MigemizeExplorer を検索。
  2. 作者のサイトがねぇよ。
  3. でも http://i.am/yoshi223/ がそれっぽい。
  4. Internet Archive で http://i.am/yoshi223/ を検索する。
  5. 時系列に沿って、保存されたリストが表示された
  6. 新しいほうから順に見ていくと、Jan 26, 2006 の分が作者サイトの最後っぽい。
  7. Jan 26, 2006 の分の中で、MigemizeExplorer へのリンク発見。
  8. リンクをクリックしても「ファイルが見つかりません」。まあそらそうだわな。
  9. MigemizeExplorer へのリンクのリンク先 http://www12.plala.or.jp/yoshi223/MigemizeExplorer/index.html を Internet Archive で再検索。
  10. Jul 12, 2006 の分の中に、バイナリへのリンクっぽい http://www12.plala.or.jp/yoshi223/MigemizeExplorer/dl.html へのリンクを発見
  11. リンクをクリックしても「ファイルが見つかりません」。まあ、さっきやったしな。
  12. http://www12.plala.or.jp/yoshi223/MigemizeExplorer/dl.html をInternet Archive で再検索。
  13. Jul 08, 2006 をクリックするとダウンロードできる。

2009-07-22追記:復活してるっぽい。http://www12.plala.or.jp/yoshi223/

[MigemizeExplorer]  自動的に有効状態するウィンドウの条件を複数設定する

例えば、ファイルオープンダイアログ・Explorer・MDIEの3つで MigemizeExplorer を有効にするには MigemizeExplorer.ini 内の TargetConditions キーの値を次のようにします。

TargetConditions=* #32770	*	Explorer.EXE	ExploreWClass	ExploreWClass	MDIE.exe	MDIEClass	MDIEClass

単に「実行ファイル名 [TAB] ルートウィンドウのクラス名 [TAB] ルートオーナーウィンドウのクラス名」のセットをさらに TAB 区切りで書けばいいだけなんですけど。

というか、そんなことは ini ファイル内に書いてあるんだけれども、こういう意味だとは読み取れなかった・・・

[サクラエディタ]  iniファイルの設定

[Types(n)] セクション (nは整数)

C[xxx] (xxxは下記参照)

タイプ別設定 > カラー > 色指定 で設定できる項目。「色分け/表示」「太字」「文字色」「背景色」「下線」の設定をカンマ区切りで設定する。例:0,1,000080,f0fbff,0

「色分け/表示」「太字」「下線」は 0 で無効、1 で有効。

「文字色」「背景色」は赤、緑、青の要素をそれぞれ 00 〜 ff であらわして、それらを連結した文字列。 ff0000 で赤、ffff00 で黄色など。

[サクラエディタ]  sakura.iniをサクラエディタで編集する

全てのファイルタイプ別設定のタブ幅を統一したい、とか言う場合、設定ダイアログ上で一つずつ変更していくのはめんどくさい。できれば sakura.ini をサクラエディタで編集したい。正規表現使って置換とかできるし。でも、サクラエディタは終了時に sakura.ini を上書きしてしまうので、せっかく編集した成果が台無しに。どうにかならんのか。

方法1:サクラエディタのプロセスを殺す

正しい手順でサクラエディタを終了させるから、sakura.ini が上書きされてしまう。ならば、上書きされる前にプロセスを殺せば・・・。というわけで、sakura.ini を編集して保存したあと、タスクマネージャ等でサクラエディタのプロセスを殺してしまえばいいです。

ちょっと心臓に悪いけど、手順としては簡単。

方法2:別名で保存する

sakura.ini として保存するから上書きされてしまう。ならば、別名で保存すれば・・・。というわけで、sakura.ini を編集し、別名で保存し、そのままサクラエディタを終了します。そのあと、sakura.ini を削除して、別名で保存したファイルを sakura.ini にリネームすればいいです。別のフォルダに同名で保存しておいて、サクラエディタ終了後に上書きしてもいいけど。

ちょっと手間がかかるけど、心臓には優しい。

[Firefox]  portable版で設定が保持されない

設定などを丸ごとUSBメモリなどに入れて持ち運べる Firefox Portableですが、なんか設定が保持されない場合があるような。

インストールディレクトリ直下にある FirefoxPortable.exe は Firefox 本体ではなく、Firefox 本体(Firefox.exe)にプロファイル(設定とか)のありかを伝えて起動するアプリのようです。なので、FirefoxPortable.exe を実行した場合は、設定が反映されます。

しかし、関連付けなどは Firefox.exe に対して行われているので、ショートカットなどから Firefox を起動した場合には、Firefox.exe が起動します。こうして起動された Firefox.exe はプロファイルのありかが伝えられていないので、設定が反映されません。

じゃあ 関連付けなんかは全部 FirefoxPortable.exe に対して行えばいいのではないか、と思って、contexter というソフトを使って、ひとまず .lnk を FirefoxPortable.exe に対して関連漬けしてみましたが、なんか 設定の反映されていない Firefox が起動しました。

あと、FirefoxPortable.exe を2回起動すると、Firefox が2つ立ち上がるしな。

FirefoxPortable は自分管理でない複数のパソコンで使うためのものであって、自分管理の複数のパソコンでファイルをコピーするだけで同じ環境を作りたいというような用途向けではない、ちゅーことやね。

[Firefox]  AutoPagerizeのねたミシュラン用設定

AutoPagerize は wedata から自動で SITEINFO を取得しますが、今日の時点でwedata 上にある ねたミシュラン のデータは、なぜか 古→新 へリンクを辿る設定なのよね。何とか逆にできないのか?(wedataのデータを書き換えずに)

PCのどこかに autopagerize.user.js というファイルがあるので、それを編集すれば、wedata から取得したデータに優先してそのデータを適用させられます。編集する箇所は SITEINFO の値で、以下のようにします。

var SITEINFO = [
    {
        pageElement:  '//td[@class="left_outline"]/../td[2]/*[position()<3]',
        url:          'http://netamichelin.blog68.fc2.com/blog.+',
        nextLink:     '//link[@rel="next"]',
        exampleUrl:   'http://netamichelin.blog68.fc2.com/blog-entry-1469.html',
    },
    /* sample
    {
        url:          'http://(.*).google.+/(search).+',
        nextLink:     'id("navbar")//td[last()]/a',
        pageElement:  '//div[@id="res"]/div',
        exampleUrl:   'http://www.google.com/search?q=nsIObserver',
    },
    */
    /* template
    {
        url:          '',
        nextLink:     '',
        pageElement:  '',
        exampleUrl:   '',
    },
    */
]

[Firefox]  アドオンViewSourceWithでソースを表示できない

Firefox の右クリックメニュー「ページのソースを表示」では、通所h Firefox 自前のビューアで草すが表示されますが、アドオン ViewSourceWith を使えば、任意のエディタで開くことができるようになります。

ただし、ページのパスに日本語を含む場合には処理できないらしく、開くことができません。ホームページにローカルのページを使用している場合には、そうなりがちです。

回避するにはどうすればよいのですか?分かりません。 とりあえず日本語を含まないディレクトリに移動して対応しました。

上記のような日本語パスをサクラエディタでソース表示させると、サクラエディタの設定が全部消えるのな。バックアップ取っといて良かった。

[Firefox]  インターネットショートカットをFirefoxで開く

ブラウザのアドレスバーのアイコンをデスクトップにドラッグすると作成される、拡張子が「.url」のファイル(インターネットショートカット)について、Firefoxを規定のブラウザに設定したあと、ダブルクリックで開こうとすると「指定されたファイルに対してこの操作を・・・」というダイアログが出てきて、開けなくなった

とりあえず InternetExplorer を規定のブラウザにすれば、ダブルクリックで InternetExplorer で開けるようになります。InternetExplorer を規定のブラウザにする方法は以下の通り

いや、どうしても Firefox で開きたいんだ、という場合は以下のようにする。

[Firefox]  LDRizeでスクロール位置がひとつずれる

LDRizeの動作が、いつの間にか変になりました。j キーを押すと次のパラグラフがウインドウの最上段になるように自動でスクロールし、そのパラグラフに「>」のアイコンが付くのが正常なのですが、前のパラグラフがウインドウの最上段になるようにスクロールするようになってしまいました。前のパラグラフの描画エリアの大きさによっては、次のパラグラフがウインドウ内に入らない場合もあります。

原因はよく分かりませんが、LDRize のスムーズスクロール機能を off にすると正常になりました。LDRize のスムーズスクロール機能を off にするには、: キーを押して Minibuffer ウインドウを出し、「LDRize::toggle-smooth-scroll」コマンドを実行します。(その度に on / off が切り替わります。)

[Firefox]  未対応のアドオンを使えるようにする

Firefox を新バージョンにアップデートすると、アドオンの互換性チェックに引っかかって、アドオンが使えなくなる(無効になる)ことがあります。そのアドオンが新バージョンの Firefox で、動作確認されていないからなんですけども、マイナーアップデートくらいなら結構動いたりします。

とりあえず有効にしたい場合には、以下のようにします。

  1. ロケーションバー(アドレスバー)に「about:config」と入力。
  2. フィルタ欄に「extensions.checkCompatibility」と入力。
  3. 設定名「extensions.checkCompatibility」の行が表示された場合、値を「false」へ切り替えて終了。表示されない場合は次へ。
  4. 右クリックメニュー > 新規作成 > 真偽値 を選択。
  5. 設定名「extensions.checkCompatibility」、真偽値「false」を選択して終了。

このあと、Firefox を再起動でアドオンの互換性チェックをスキップできます。この状態でアドオンマネージャを開くと「アドオンの互換性確認が無効になっています。」という常時がされます。また、新バージョンに未対応のアドオンには、アイコンに「!」マークが付きます。

(追記)Firefox 3.6 では仕様が変更になってます。新たに設定名「extensions.checkCompatibility.3.6」の値を、真偽値「false」にすれば、互換性チェックが無効になります。今後、メジャーアップデート(3.7とか?)のたびに設定名を変えて登録しなおす必要があるようです。まあ、しょうがないですね。

[Firefox]  ロケーションバーのデフォルト検索エンジンを変更する

ロケーションバーに何かキーワードを入力して Enter を押すと、デフォルトでは Google の I'm Feeling Lucky の結果のページへアクセスします。これを別の検索エンジンに変更したい場合は以下のようにします。

  1. ロケーションバー(アドレスバー)に「about:config」と入力。
  2. フィルタ欄に「keyword.URL」と入力。
  3. 設定名「keyword.URL」の値が「http://www.google.co.jp/search?ie=UTF-8&oe=UTF-8&sourceid=navclient&gfns=1&q=」と設定されているので、任意のアドレスを入力して終了。例えば Google 検索なら「http://www.google.co.jp/search?q=」

[Firefox]  アドオンStylishでnth-child擬似クラスが使えない

Stylishアドオンを使って、特定の要素のデザインを変えたいのだけれど、要素のタグに id も class も指定されていないし、特異な属性も持っていない場合、要素を特定できない(他の要素まで含んでしまう)ことがあります。そんな時、nth-child 擬似クラスを使えば「・・・の子要素の?番目の要素」なんていう風に特定できます。でもFirefox3は CSS3 の nth-child 擬似クラスをサポートしていませんので、Stylishで nth-child 擬似クラスを指定することはできません。

代わりに first-child 擬似クラスと隣接セレクタを使って指定できます。

<body>
  <h1>title</h1>
  <h1>title</h1>
  <h1>title</h1>
  <h1>title</h1>
</body>

上のような場合に、3つめのh1要素を指定するには、first-child 擬似クラスと隣接セレクタを使って以下のようにできます。

body > h1:first-child + h1 + h1

userstyles.org の掲示板を参照しました。

[Firefox]  アドオンStylishで指定したfont-sizeが反映されない

Stylishアドオンを使って、font-size を変更したのに反映されない場合、Firefox の最小フォントサイズの指定が優先されているのかもしれません。

Firefoxのオプション > コンテンツ > フォントと配色の詳細設定 で、最小フォントサイズを「なし」にすると良いです。

[Firefox]  PDFファイルがFirefox内で表示されない

リンク先の PDF ファイルをそのまま Firefox 内で開くには、Firefoxで以下のように設定すればいいはずです。(事前にプラグイン導入)

それなのに、何故か別途 Adobe Reader が立ち上がってそっちで開いてしまうという場合は、Adobe Reader の方の設定も必要です。 Adobe Reader で以下のように設定します。

[Firefox]  任意のページを新しいタブで開く

TabMixPlus よりも機能を絞って動作を軽くしたらしい Tabberwocky というアドオンを入れてみました。が、こちらは新しいタブを空白ページでしか開けないようです。

NewTabURL というアドオンは、新しいタブを開くと指定したURLを開いてくれるので、入れてみました。確かに期待した動作なのですが、echofon という twitter のためのアドオンのステータスバーアイコンをダブルクリックしたときに、twitter のサイトが開かず、NewTabURL で指定したURLが開くようになってしまいました。これはダメです。

まあ、他にも色々方法はありそうだけど、まず「空白ページが開かれたら任意のページにリダイレクトする Greasemonkey スクリプト」で対応してみました。この例では、空白ページが開かれたら、自動で Google にリダイレクトします。@name、@namespace は、他と干渉しないように適当に決めてください。

// ==UserScript==
// @name           blank_redirect
// @namespace      wue
// @include        about:blank
// ==/UserScript==
location.href = "http://www.google.co.jp/";

けど、一旦空白ページ開いた後リダイレクトするから、ワンテンポ引っかかるんだよねー。どうせマウスジェスチャでしか新しいタブとか開かないし。というわけで、次に「任意のページを新しいタブで開く FireGestures スクリプト」を作ってみました。

var linkURL = "http://www.google.co.jp/";
gBrowser.selectedTab=gBrowser.loadOneTab(linkURL, null, null, null, true, false);

まあ、素直に TabMixPlus に戻ったほうがいいかも。

[Firefox]  ARecX6プレイヤーのサイズを大きくする

ARecX6 プレイヤーの画面サイズが小さいので見にくいです。だからといって全画面にはしたくない。アドオン Stylish でスタイルをいじってやれば大きくできます。Stylishに以下のスタイルを登録してください。

@namespace url(http://www.w3.org/1999/xhtml);

@-moz-document domain("192.168.24.62") {
embed#player{
width:640px !important ;
height:390px !important ;
}
}

IPアドレス部分は、実際の ARecX6 のIPアドレスにあわせて書き換えてください。これで画面サイズは縦横2倍になります。width、height の値を増減させれば、好きなサイズに変えられます。

2010-07-31 追記。ARecX6 ファームウェアVer.2.10 にてプレイヤーサイズがウインドウサイズに追随するようになりました。このバージョンで上記スタイルを適用すると、ウインドウサイズにかかわらず固定になります。

[Firefox]  検索エンジンを自分で作って追加したい

大体の検索エンジンは Mycroft Project に登録されていたりしますが、自分で作りたい場合 Ready2Searchなんてサービスがあります。

たとえば「bing」を検索エンジンに追加するには、以下のような感じで。

アイコンを登録するには、「画像ファイルを送信」に何かファイルを登録して、「原色」をクリック。別のボタンでもいいけど。その後「検索プラグインを作成」

ちなみに、webサイトのfaviconを取得するには、HTMLソースから .ico ファイルへのリンク探して、それをダウンロードするなど。

[Googleカレンダー]  携帯電話からスケジュールを見る

Googkeカレンダーを携帯電話のブラウザで見るにはどうすればよいのか。

認証を行って見る
携帯電話で http://www.google.com/calendar にアクセスすると、ログインページが表示されるので、Gmailのアドレスとパスワードを入力すれば見れる。次回からは、「オートログイン」を押せば、携帯電話の製造番号を送信して、入力なしで見れる。でも、いくつか操作が必要な上に、たどり着くのに10秒ぐらいかかる。
認証なしで見る
PC上の操作で、左のマイカレンダーのうち、見たいカレンダーの▼印をクリック、カレンダー設定クリック、表示される設定画面の一番下の「非公開URL」欄の「HTML」ボタンをクリック、表示されるURLに携帯でアクセスする。たぶん「予定表リスト」表示でないと、携帯電話では辛いだろう。
この方法だと、カレンダー非公開でも認証なしで見ることが可能。定期的に「非公開 URL をリセット」してURLを変えれば、セキュリティー的にも大体問題なし。
でも、文字コードがUTF-8なためか、俺の premini-II では文字化けして見ることができない。むー。
Google Calendar Mobile Gateway
Google Calendar Mobile Gatewayというものを作ってサービスしている方もいます。これだと、スケジュールの追加も可能だそうで。が、premini-IIは XHTML 非対応なので使えません。
TAKE24/7
TAKE24/7 というサービスもあります。こっちは企業が運営。こちらもスケジュール追加可能。でも、premini-II でアクセスしてみると、生HTMLが見えるのみ。HTML のバージョン的な問題か?つか、今頃 premini-II とか使ってんじゃねえよってことか。
自力で何とか
なんか手詰まりなので、cgiで非公開URLにアクセスしてデータを取得し、文字コードをSJISに変換してわたすスクリプト作って使うことにした。いろいろ表示をいじりたければ、「非公開URL」の「XML」からデータを取得していじればよい。スクリプト作るのめんどいけど。

[Googleデスクトップ]  インデックス保存場所を変更する

Googleデスクトップのインデックスデータは GB クラスの結構大きなデータです。このデータは通常 C:\Documents and Settings\(ユーザー名)\Local Settings\Application Data\Google\Google Desktop あたりに保存されますが、そんな大きなデータは別のところに保存したいと思ったりします。

保存場所を変更するには、以下のようにすればよいです。

[WindowsMediaエンコーダ]  コマンドプロンプトから操作する

Windows Media エンコーダを使って複数の動画を連続してエンコードしたいとか、Windows Media エンコーダを別のプログラムから操作したいという場合、Windows Media エンコーダをコマンドプロンプトから操作できれば便利です。

Windows Media エンコーダにコマンドラインオプションは無いようですが、付属の WMCmd.vbs を経由して操作することが可能です。WMCmd.vbs の使い方・使用できるコマンドラインオプションについては、WMEncUtil.chm を参照しましょう。(「スタートメニュー > プログラム > Windows Media > ユーティリティー > Windows Media エンコード スクリプト」でも開けます)

ファイルのエンコード方法は 「ファイルおよびライブイベントをエンコードする > ファイルをエンコードするには」を参照。コマンドラインオプションは「高度なエンコード手法 > コマンドラインオプションを使う」を参照。

[GraphicsMagick]  コマンド一覧(の予定)

用語とかいろいろちがってたらごめんなさい。

サイズ変換 convert -geometry

640x480のサイズに収まるように拡大 or 縮小する。

>gm.exe convert -geometry 640x480 input_file output_file

2値化 convert -threshold

明度が24%以上を白、24%未満を黒に2値化する。

>gm.exe convert -threshold 24% input_file output_file

明暗をはっきりさせる comvert -normalize

明暗差が小さい画像を大きくする

>gm.exe convert -normalize input_file output_file

黒〜白のレンジを変える comvert -level

明度20%が黒、80%が白になるように明度を変える。ガンマ値を1.2にする。

>gm.exe convert -level 20%,1.2,80% input_file output_file

ガンマ値は0.1〜10.0。

一部分を切り出す comvert -crop

input_file のX位置50、Y位置70、横100x縦200の大きさの領域を切り出して、output_file に書き出す。

>gm.exe convert -crop 100x200+50+70 input_file output_file

[GraphicsMagick]  convertのdrawオプションで「Non-conforming drawing primitive definition 'line’」と表示される

GraphickMagickを使って、画像に直線を引こうとして以下のコマンドを実行しましたが、メッセージが表示されて、出力画像には直線が引かれていませんでした。

> gm.exe convert -draw 'line 0,0 200,200' src.png dst.png
convert: Non-conforming drawing primitive definition (line).

Windowsのコマンドラインでは、単引用符ではなく2重引用符を使わないとダメです。以下のようにすれば良いです。

gm.exe convert -draw "line 0,0 200,200" src.png dst.png

[MDIE]  「標準のファイラーに設定する」が効かない

マイコンピュータなどを開いたとき、標準のエクスプローラではなく、MDIEで開くようにするためには、MDIEのオプションで全般 > 動作 > 標準のファイラーに設定する をチェックすればよいです。が、Windows Vista では、MDIEを再起動するとチェックが外れてしまっています。また、実際にMDIEが標準のファイラーに設定されていません。

UAC(User Account Control)機能により、そういう危なげな設定変更がブロックされているようです。ブロックされないためには、MDIE.exeの右クリックメニューで「管理者として実行」をクリックして実行したあと、上記設定をすればよいです。

[ShorterLuncer]  起動時に「フック失敗」というダイアログが2回でる

Windows Vista で Shorter Launcher を起動すると、メニューが表示される前に、「フック失敗」というダイアログが2回でる様になりました。Shorter Launcher が Vista に対応していないからのようで、解決方法はありません。

代替アプリとしてはポチエス ランチャー版 がよさそう。設定ファイルの書き方が大分違うけど。例えば、実行オプションとか作業ディレクトリは設定ファイルでの指定ができない。(たぶん) 必要なときは、そういう設定をしたショートカットファイル(.lnk)を作って、それをポチエス ランチャー版に登録すると良い。

[TortoiseHg]  日本語ファイル、フォルダが扱えない

win32mbcs というものを使用すれば、日本語ファイル、フォルダが使用可能になるそうです。win32mbcs は TortoiseHg に同梱されており、設定を書き換えるだけでよいです。やり方は以下のとおり。

ただし、どうも「表」や「ソ」など 2 バイト目が「\」となる、いわゆるダメ文字が含まれる場合、右クリックメニューからは扱えないっぽい。(コマンドラインからは扱える?) あと、これを使っちゃうと、Windows 以外からは触れなくなるらしい。

参考:http://bitbucket.org/kuy/thg-ja/wiki/Japanese

Bazaar という分散型バージョン管理システムは、ファイル名を unicode で扱うので、その辺の問題がないらしいが、TortoiseBzrでも問題ないかどうかは、しらない。そのうち試す。

[TiddlyWiki]  カスタマイズの基礎の基礎

セッティングも「記事」として記述する。

このことを理解しておけば、取っ掛かりにはなるかと思います。例えば、タイトルは「SiteTitle」という記事として書かれています。この記事は隠し記事になっていて、右のタブ「More」 > タブ「Shadowed」と進むと表示されます。記事「SiteTitle」の本文を編集すれば、タイトルを変えることができます。

このタブ「Shadowed」には、他にも隠し記事が列挙されています。記事「MainMenu」はページ左に表示する内容が書かれています。記事「StyleSheet」にはページのデザインについて書かれています(最初は何も書かれてませんけど)。タブにどんな項目を表示するかというのも記事「SideBarTabs」や Tab で始まる記事に記述されています。

また、配布されている プラグイン も記事として導入します。こちらは隠し記事ではなく、タグ「systemConfig」がついた記事となっています。

ということで、つぎは、どのように記事を書けばよいかということになります。それには TiddlyWiki 固有の作法や、HTML・CSS・JavaScript の知識が必要となります。勉強すればいいじゃない。

[TiddlyWiki]メインメニューをスクロールに追従  させる

多数の記事を表示させると、縦に長くなって、メインメニューとかにアクセスしにくくなりますよね。というわけで、スクロールしてもメインメニューが追従するようにする方法です。

左のタブにある More > Shadowed > StyleSheet で隠し記事[StyleSheet」を表示。Edit を押して編集モードにはいります。で、以下にように本文に追記して done 。

#mainMenu{
  position: fixed;
}

んー、でもこの「position: fixed;」は IE6 では機能しません。でも方法はあります。IE だけに実装さいれているらしい CSS 中での expression 関数というのがありまして、コレを使って以下のようにすれば、IE6 でも IE8 でも Firefox3 でも、スクロール追従が可能です。

#mainMenu{
  position: fixed;
  position: expression("absolute");
  top: expression(eval(document.documentElement.scrollTop+100));
}

IE では多少カクカクした動きになりますがそこは我慢です。「+100」のところは好みに合わせて調整してください。あと今回はメインメニューでしたけども、他の要素にも適用可能です。

ppBlogの記事を参照しました。

[TiddlyWiki]  インポート用ファイルフォーマット

TiddlyWikiには、他のTiddlyWikiファイルからインポートできる機能があります。けど、俺の書きためてきた、独自フォーマットのメモ集をどうにかしてインポートできるようにしたい。

以下のようなフォーマットのファイルを用意すれば、TiddlyWikiにインポート可能です。なので、メモ集を以下のフォーマットに変換するプログラムを作ればいいわけです。(それが大変)

<html><body><div id="storeArea">

<div title="記事1のタイトル" modifier="氏名" created="201002020540" tags="記事1のタグA 記事1のタグB">
<pre>
記事1の本文
</pre></div>

<div title="記事2のタイトル" modifier="氏名" created="201002012100" tags="記事2のタグA 記事2のタグB">
<pre>
記事2の本文
</pre></div>

</div></body></html>

では、順に説明を。基本的に内容は HTML です。全体は <html><body> <div id="storeArea"> でくくられており、その中に記事が書かれています。文字コードは UTF-8 です。(hta で運用している場合は、さらに10進数値文字参照に変換しないとダメっぽい。)

1つの記事は、<div> でくくられていて、タイトルなど情報が div タグの属性として設定され、本文が <pre> 内に書かれています。

title 属性には、記事のタイトルを記載します。Wikiなので、他の記事と同じタイトルは付けられません(上書きされます)。重複しそうな場合は、日付や連番をつけるなどします。

modifier 属性には、記事を書いた人の氏名を記載します。

created 属性には記事を作成した時刻を記載します。時刻は協定世界時(UTC)で記載します。例えば、日本時間 2010年02月02日05時40分 の記事の場合、協定世界時(UTC)では9時間引いた 2010年02月01日20時40分 ですので、created="201002012040" とします。

tags 属性には、タグをスペース区切りで記載します。

他にも、modified や changecount といった属性がありますが、気にしなくていいのでは? 気になる人は、TiddlyWikiに適当に記事を書いて、ファイルをテキストエディタで開いて、<div id="storeArea"> 以下に書いてある記事データを見て、確認してください。

[X-Finder]  フォルダの表示形式を統一する

今開いてるフォルダの表示形式を全てのフォルダに適用するには以下のようにします。(表示形式とは、アイコン表示、詳細表示とか言うヤツのこと)

  1. メニュー > 表示 > フォルダの表示設定を保存
  2. 「名前」欄を適当な名前に(フォルダ表示デフォルトとか)、「拡張」欄を「*.*」に書き換えて「OK」

変更するには、メニュー > ツール > フォルダ設定 を開いて、さっき付けた名前のアイテムを削除して、やり直してください。分かる人はアイテムのプロパティを編集しても良い。

[X-Finder]  リンクバーに複数フォルダへのリンクをまとめたフォルダを作る

まずリンクバーにフォルダを作ります。

  1. メニュー > ツール > リンク
  2. 右クリック > フォルダの作成
  3. 名前欄に適当な名前を入力。次に出るダイアログは、そのまま「OK」

次にフォルダ内にアイテムを登録します。

  1. さっき作ったアイテムを右クリック > 拡張メニューの 新しいタブで開く を選択。(拡張メニューが表示されていない場合は メニュー > 表示 > コンテキストメニュー で拡張メニューが表示される設定にする。)
  2. 右クリック > 規定コマンドの作成 > 新規タブで開く
  3. 名前欄に適当な名前を入力。「パス」欄に「NewTab: 」に続けて開きたいフォルダのパスを入力して「OK」

作ったフォルダ内にフォルダへのショートカットをいれても良いけど、その場合には現在のタブに開かれることになります。

[X-Finder]  リストにフォルダを表示しないようにする

画像が保存されたフォルダでは、縮小版表示にすると便利ですが、フォルダも縮小版表示されてしまい、ちょっと邪魔です。指定したフォルダ内でリストにフォルダを表示させないようにするには以下のようにします。

  1. メニュー > ツール > フォルダ設定
  2. 右クリック > ファイルの作成
  3. 名前欄に適当な名前を入力。
  4. パス欄
    ViewStyle:5
    Sort:更新日時
    Open: ;!*.folder
    
  5. アイコン欄空欄。
  6. 拡張欄にこの表示を適用したいフォルダのパス。
  7. 動作欄「パスを実行」
  8. 送る動作欄「標準」にして「OK」

上記では並び順を更新日時にしていますが、名前順にしたければ「Sort:名前」にすればいいです。また、フォルダ設定に複数のアイテムが登録されている場合、下のものほど優先度が高いので、アイテムをマウスでドラッグして順番を変えてやります。

[GIMP]  画像中の指定した色を別の色に置換する

画像中に使われている色をマウスで指定して、その色を別の色に置換するには次のようにします。

  1. ツールボックス > 色域を選択
  2. マウスで、画像中の置換したい元の色を左クリックする → 同じ色の領域が選択状態になる
  3. ツールボックス > 【塗りつぶし】
  4. ツールボックス > 描画色をクリックして、置換後の色を選択
  5. ツールボックス下欄で塗りつぶし範囲:選択範囲を塗りつぶす
  6. マウスで選択範囲内の中を左クリック

色の選択時に厳密に同じ色だけを選択するには、選択する前にツールボックス下欄のしきい値の値を小さくしておきます。似た色も一緒に選択するには逆にしきい値を大きくします。実際には、マウスでひとまず色をクリックしておいて、しきい値を変えてもう一度色をクリック、しきい値を変えてクリックを繰り返して、望みの選択範囲になるように調節すればよいでしょう。

[GIMP]  日本語表示で起動する

普通にインストールするだけで、起動すれば日本語表示になるはずなのですが、そうならない場合があります。

原因として、環境変数LANG=ja以外の値がすでにセットされている可能性があります。 例えば、3D-CADソフトの PRO Engineer は日本語表示するためにLANG=jananeseと設定している(or する必要がある)ようです。

LANG=ja以外の値がすでにセットされている場合の対処方法としては、LANG=jaに設定する方法があります。環境変数を編集するには、スタートボタン > コントロールパネル > システム > 詳細設定 > 環境変数 と開いて、ユーザ環境変数を編集します。新規ボタンを押して、変数名:LANG、変数値:ja と入力してOKします。

しかしながら、この方法では上記 PRO Engineer のように LANG の値を読みに行くアプリケーションが他にもあった場合に、そのアプリが日本語表示でなくなってしまう可能性があります

そうならないために、バッチファイルを作り、一時的に環境変数を変更する方法があります。まず、以下のような内容のバッチファイル(.bat)を作成します。

set lang=ja
cd "C:\Program Files\GIMP-2.0\bin"
start gimp-2.6.exe

このバッチファイルを起動すると、LANGの値に関わらずGIMPが日本語で起動します。コマンド set は、実行中のコマンドプロンプトのみについて環境変数を変更したりするコマンドです。なので他のアプリには影響しません。GIMPを起動するときに常にこのバッチファイルを起動するようにすれば良いです。

G26 memo 2009年01月25日 使用言語を変更するを参照しました。

[SetPoint]  キーボードにないキーを割り当てる

ロジクールのマウスについて、SetPointという公式アプリを使えば、ボタンにいろんな機能を割り当てることができます。が、限界があるので、AutoHotKeyに処理を引き継がせようと思い、通常使わないキーをボタンに割り当てたいと思いました。Setpoint の設定ファイルを直接メモ帳で編集することで、F13 や F14 といったキーを割り当てることが可能です。割り当てられれば、AutoHotKeyで F13 や F14 をトリガーとしたコードを書けばよいわけです。

まずは、普通にSetPointを起動した状態で、SetPointを使って、割り当てたいボタンに何か適当に(F12とか)割り当てます。そのあと、タスクトレイのSetPointアイコン右クリックからSetPointを終了します。

次に設定ファイルを編集します。設定ファイルは C:\Users\(ユーザー名)\AppData\Roaming\Logitech\SetPoint\use.xml ですので、これをメモ帳で開きます。以下のような記載のある行を探してください。

<Param DisplayName="F12" LParam="4128769" Modifier="0" VirtualKey="123"/>

「DisplayName="F12"」のところに、先ほど割り当てたキーが記載されています。ここが、マウスのボタンの設定が記載された部分ですので、ここを編集します。F13 を割り当てるには、以下のように書き直して上書き保存します。

<Param DisplayName="F13" LParam="4128769" Modifier="0" VirtualKey="124"/>

「DisplayName="F13"」は自分がわかりやすければ何でもいいです。「LParam="4128769"」はよくわかりません。そのままでよいと思います。「Modifier="0"」はShiftとかCtrlなどの修飾キーの設定です。使ったことないのでよく知りません。試しににSetpoint上でボタンに Shift+Ctrl+F12など割り当ててみて、ここの記載がどうなるか見てみればわかるんじゃないでしょうか。「VirtualKey="124"」には仮想キーコードを記載します。Windowsの仮想キーコード一覧(Win32API) などを参照してください。

ファイルを保存した後、SetPointを起動すれば有効になります。

その他

ハードディスク間のデータ転送速度が遅い

買ったときに付いてた 120GB のハードディスクが一杯になってきたので、ハードディスクを増設した。新たに買ってきた 500GB のヤツをマスターの端子にさして、もともと付いてた 120GB のヤツをスレーブの端子にさしかえた。んで、500GBの方に WindowsXPをインストール。そのあと、古い 120GB のヤツから 新しい 500GB のヤツにデータ移してたんだけど、なんか、異常に転送速度が遅い、1MB/sec とかそんなくらい。さらに転送中、動画プレイヤーとかアプリの動作が不安定になる。んんー、なんでー?

BIOSの設定をいじると直りました。いじったところは Drive configuration > Primary Slave 何とか のところ。最初、ここが off になってたので auto にかえる。この時点で、表示が 「unknown device」になってるのだが、BIOS 設定を抜けて、再度入りなおすと 「harddisk device」になってた。この状態でデータ転送すると 35MB/sec 位になった。

[AX300]  SmartVisionがインストールできない

Windows7マシンに、AX300のユーティリティーソフトをインストールしようとしましたが、SmartVision/PLAYER をインストールすることができませんでした。「ご使用のパソコンにはサウンドデバイスがありません。」と出ます。サウンドデバイスはあるんだけどなぁ。また、AX連携ツール は SmartVision/PLAYER のインストールが必要なので、これもインストール不可です。

回避方法は不明です。どうしたものか。

[ARecX6]  プレイヤーが表示されない

ARecXプレイヤー 1.5 では番組を再生できるのですが、ARecX6プレイヤー 2.00-01 では、再生用の別ウインドウは表示されるものの、その中にプレイヤーが表示されず、番組を再生することができませんでした。

不具合については、まずARecX6 Ver.2.00ベータの不具合情報を参照するのが良いですが、ウチの場合は InternetExplorer をバージョン 6 からバージョン 8 にすることで再生できるようになりました。なぜか Firefox でも再生できなかったのですが、これも再生できるようになりました。

[はてなアンテナ]  ニコニコ動画のマイリストを更新チェックしたい

はてなアンテナに、ニコニコ動画の公開マイリストの更新チェックをさせたいと思いました。

まず普通にマイリストのURLをはてなアンテナに登録しましたが、内容が更新されていないのに更新されたことになってしまいます。マイリスト画面の最下部には総動画数やら総再生数やらが入ってて、この数値の変更が引っかかってるようです。なのではてなアンテナの更新無視文字列に「総動画数」を設定してみたところ、今度はマイリストが更新されてるのに、はてなアンテナは拾ってくれませんでした。マイリスト画面のソースを見てみると、どうも登録動画のデータがJavaScriptで書かれているようで、はてなアンテナはJavaScriptのコード部分の変更は検知しないようです。

次にマイリストのRSSのURLをはてなアンテナに登録しましたが、これも内容が更新されていないのに更新されたことになってしまいます。RSSデータ内の<pubDate>、<lastBuildDate>あたりがマイリスト更新とは無関係に変更されているようです。これを無視するために、はてなアンテナの更新無視文字列に、「(c) niwango, inc. All rights reserved.」を入れると、うまくいきそうな気がします。(確認中)