戯言

つらつらと気づいたことを書いていきます。人狼とか。

teraterm マクロ/INIファイル/Menu


最近はサーバにログインして同じようなコマンドばかり打っているので、作業を簡略化するために、今更ながらteratermのマクロを導入しようと思い立ちました。

どんなことができるかはなんとなく知っていますが、実際に使うのは初めてです。
定義ファイル(TTLファイル)を作成すると、自動でログインして任意のコマンドを発行できます。
拡張子TTLをttpmacro.exeに関連付ければ、TTLファイルをダブルクリックするだけで実行できます。便利。


ただ、表示するログが長いので、teratermのウィンドウサイズを横長にしたかったのですが、マクロではどうもできない模様。そこで、teratermのINIファイルにウィンドウサイズを設定して、読み込むようにしました。
teratermのショートカットを作って、

  ttermpro.exe /F="INIファイルのパス" /M="TTLファイルのパス"

でできます。
これで、指定したINIファイルでteratermを開き、指定したマクロを実行します。便利便利。


この調子で、いくつかマクロを作ると、管理が面倒になってきたので、teraterm Menu を導入。
接続に使用するユーザ名、マクロ、INIファイルなどをまとめて1つの接続として定義し、それを複数登録できます。

20130406_tmenu.png

登録した接続を、タスクメニューからすぐに呼び出せます。便利便利便利。


これは英語のページです。翻訳しますか?


Chromeで閲覧していると、日本語のサイトなのに「これは英語のページです。翻訳しますか?]と表示される場合があります。このブログもそうでしたが、修正しました。

次のように、meta タグで日本語を指定すると回避できます。



文書の内容に英語の割合が多いと、英語のページだと判断してしまうと、いろんなサイトに書いてありますが、本当なんでしょうか? meta タグを見てるだけでは?(確かめてはいません^^;)


Illegal group reference


Illegal group reference のエラー対応

掲示板で報告のあった「Illegal group reference」について調べていたら、どうやら文字列置換メソッドで発生するらしい。

人狼プログラム上での発生箇所は、>>123 などの文字列を置換している場所でした。
「>>123」などの文字列があると、「<span onMouseOver='引用先文字列を取得する関数()'> >>123</span>」のように span タグを追加するようにしているのですが、その変換のために matcher.appendReplacement() を使っていました。

appendReplacement(StringBuffer sb, String replacement) は、置換後文字列を表す第2引数の replacement を、第1引数の sb に追加するメソッドです。
replacement は正規表現文字列であり、()などでグループ化したマッチ結果を $1 などで受け取れる仕様なので、replacement に「$」が含まれると「$1」などを探すのですが、それが見当たらないので「Illegal group reference」となります。

簡単に言えば、置換後文字列 replacement に「$」が含まれると「Illegal group reference」が発生します。
発生原因は、「$」を文字列としてではなく正規表現上の制御文字として扱ってしまうためです。

対策としては、「$」を文字列として扱うようにエスケープすればOKです。
人狼プログラムでは、replacement に対して、StringUtils.replace(replacement, "$", "\\$"); を事前に行い、「\\$」にエスケープしました。

「\\」は Java 文字列内でのエスケープ文字で「\」文字列を示します。
「\$」は正規表現では「$」文字列となります。
結果、「\\$」は「$」文字列として扱われます。

また、簡単な置換のみであれば、StringUtils.replace() を使えば、正規表現指定では無いので「$」があってもこの問題は発生しません。