全力で怠けたい

怠けるために全力を尽くしたいブログ。

TortoiseHg で一手間省いてコミットメッセージやリビジョンハッシュをコピーする方法

f:id:ebc_2in2crc:20160614231039j:plain

TortoiseHg のリビジョングラフにはコミットメッセージやリビジョンハッシュなど好きな列を表示できる。この列をクリックして Command + C するとその列の内容がクリップボードにコピーされる。メールや IM に貼り付けるときに大変重宝している *1

*1:Mac 版と Windows 版の TortoiseHg 3.8.3 で確認したけど多分もっと古いバージョンでもできると思う

Mercurial のキーワード拡張を使うと改名が追跡されない問題の対応方法

Mercurial でバージョン管理しているファイルを Mercurial を通さずに改名したときに変更前ファイルが追跡できなかったときのメモ *1

普通は追跡できる

[shrimp]$ hg init hoge; cd hoge

# 適当にファイルを作ってコミット
[shrimp]$ echo 'hoge' > a.txt
[shrimp]$ hg add
adding a.txt
[shrimp]$ hg commit -m "add a.txt"

# Mercurial を通さずにファイル名を変更
[shrimp]$ mv a.txt b.txt

# 変更前ファイルの削除と変更後ファイルを登録してコミット
[shrimp]$ hg addremove
adding b.txt
removing a.txt
[shrimp]$ hg commit -m "a.txt rename to b.txt"

# b.txt の変更履歴を見る
# 改名前の a.txt を作成したリビジョン0も出力される
[shrimp]$ hg log --follow --template '{rev} {desc}\n' b.txt
1 a.txt rename to b.txt
0 add a.txt

キーワード拡張を使うと追跡できない

キーワード拡張の設定はこんな感じ。

[shrimp]$ cat .hg/hgrc
[extensions]
keyword =

[keyword]
**.txt =

[keywordmaps]
Header = {file|basename} {node|short}

こうしておいてファイルの中に $Header$ と書いておくと $Header: a.txt 714c62379545 $ みたいに展開してくれるのだが、こうしておいて先ほどと同じようにしても今度はファイル名変更前の a.txt を作成したリビジョン0 が出力されない。

[shrimp]$ hg init fuga; cd fuga

# ./.hg/hgrc にキーワード拡張を設定

# 適当にファイルを作ってコミット
[shrimp]$ echo '$Header$
ほげほげ' > a.txt
[shrimp]$ hg add
adding a.txt
[shrimp]$ hg commit -m "add a.txt"

# Mercurial を通さずにファイル名を変更
[shrimp]$ mv a.txt b.txt

# 変更前ファイルの削除と変更後ファイルを登録してコミット
[shrimp]$ hg addremove
adding b.txt
removing a.txt
[shrimp]$ hg commit -m "a.txt rename to b.txt"

# b.txt の変更履歴を見る
# 改名前の a.txt を作成したリビジョン0が出力されない
[shrimp]$ hg log --follow --template '{rev} {desc}\n' b.txt
1 a.txt rename to b.txt

解決方法

addremove するときに --similarity オプションを指定すればいい。

[shrimp]$ hg init piyo; cd piyo

# ./.hg/hgrc にキーワード拡張を設定

# 適当にファイルを作ってコミット
[shrimp]$ echo '$Header$
ほげほげ' > a.txt
[shrimp]$ hg add
adding a.txt
[shrimp]$ hg commit -m "add a.txt"

# Mercurial を通さずにファイル名を変更
[shrimp]$ mv a.txt b.txt

# 変更前ファイルの削除と変更後ファイルを登録してコミット
# このとき --similarity オプションを指定する
[shrimp]$ hg addremove --similarity 1
adding b.txt
removing a.txt
recording removal of a.txt as rename to b.txt (37% similar)
[shrimp]$ hg commit -m "a.txt rename to b.txt"

# b.txt の変更履歴を見る
# 改名前の a.txt を作成したリビジョン0も出力される
[shrimp]$ hg log --follow --template '{rev} {desc}\n' b.txt
1 a.txt rename to b.txt
0 add a.txt

まとめ

--similarity オプションは、ファイルの類似度をパーセンテージで指定して改名検知するためのオプション。指定しない場合は100が指定されたものとみなされて、完全一致するファイルのみが改名とみなされる。キーワード拡張を使っているときに Mercurial を通さずに改名するとキーワード部分が一致しないため改名検知されない。しかし、リファクタリングで改名した場合などはそれが明らかであるから、--similarity オプションで意図的に類似度を下げて Mercurial に改名を検知させればいい *2

IntelliJ IDEA は大丈夫

IntelliJ IDEA + hg4Idea の場合は IntelliJリファクタリング機能で改名しても、ちゃんと hg log --follow で改名前のファイルが出力される。便利。

*1:IDEリファクタリング機能でディレクトリを移動しまくった

*2:--similarity オプションに0を指定すると改名を一切検知しなくなるので注意

「シンタックス・ハイライト機能で対応してほしい言語」と聞いて真っ先に PowerShell が浮かんだ

お題「シンタックス・ハイライト機能で対応してほしい言語」

PowerShell は言わずと知れた Microsoft 謹製のシェルスクリプティング言語ですが、残念なことにシンタックス・ハイライト機能に対応していません。 自分の周りでは WindowsCLI, シェルスクリプティングといえばいまだにバッチファイルや WSH といったイメージがありますが、PowerShell とて Windows 7 (2009年登場。もう7年前) 以降は標準搭載ですし、はてなさんもそろそろ対応くるんじゃないかなーと期待しています。

PowerShell 未対応の現状

PowerShell 書くときは GitHub に書いてリンクしたり http://alexgorbatchev.com/SyntaxHighlighter/ 使う人が多いみたいですね。

とても同感なエントリ

matarillo.hateblo.jp

Java で文字列を16進ダンプする方法

ときどき使うけど覚えていられないメモ。

だいたいはコレで OK

String str = "ジャバ";

// EUC-JP 
for (byte aByte : str.getBytes("EUC-JP")) {
    System.out.printf("%2X", aByte);
}
// A5B8A5E3A5D0
String str = "ジャバ";

// Shift_JIS
for (byte aByte : str.getBytes("Shift_JIS")) {
    System.out.printf("%2X", aByte);
}
// 83578383836F

こういうのも

UTF-16 *1 でいいときはなぜかこう書いてしまう。

String str = "ジャバ";

for (int i = 0; i < str.length(); i++) {
    String hex = Integer.toHexString(str.charAt(i));
    System.out.print(hex.toUpperCase());
}
// 30B830E330D0

なぜか周囲は ASCII どころか JIS X 0208 まるごと覚えているような人が珍しくない。

*1:UTF-16BE

Rhino で JavaScript の予約語と同じ名前をもつメソッドを呼び出す方法

Rhino の jrunscript で File#delete() が動かなかった時のメモ *1

起きたこと

File#delete() メソッドを呼ぶとエラーになる。delete は JavaScript予約語だからダメってことらしい → https://bugzilla.mozilla.org/show_bug.cgi?id=229895

> jrunscript
js> new java.io.File('C:\\Users\\shrimp\\hoge.txt').delete();
script error: sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator (<STDIN>#1) in <STDIN> at line number 1

JavaScript予約語ということで typeof を試したけどダメ。他の予約語もダメ。

package hoge;

public class JSRW {

    public void hoge() {
        System.out.println("hoge");
    }

    public void typeof() {
        System.out.println("typeof");
    }
}
$ jrunscript -q
Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2

$ jrunscript -cp .
js> var jsrw = new Packages.hoge.JSRW();
js> jsrw.hoge();
hoge
js> jsrw.typeof();
script error: sun.org.mozilla.javascript.internal.EvaluatorException: missing name after . operator (<STDIN>#1) in <STDIN> at line number 1

解決策

ブラケット表記なら OK.

> jrunscript
js> new java.io.File('C:\\Users\\shrimp\\hoge.txt')['delete']();
true

少し気になったこと

https://bugzilla.mozilla.org/show_bug.cgi?id=229895 では「1.5R5 で直るよー」みたいに書かれてるけど、1.6 でも直ってない?

> C:\Program Files\Java\jdk1.6.0_45\bin\jrunscript.exe -q
Language ECMAScript 1.6 implemention "Mozilla Rhino" 1.6 release 2

Nashorn はちゃんと動く

> C:\Program Files\Java\jdk1.8.0_77\bin\jrunscript.exe -q
Language ECMAScript ECMA - 262 Edition 5.1 implementation "Oracle Nashorn" 1.8.0_77

> C:\Program Files\Java\jdk1.8.0_77\bin\jrunscript.exe
nashorn> new java.io.File('C:\\Users\\shrimp\\hoge.txt').delete();
true

結論

来年には Java 9 がリリースされるという2016年、Java 6 なんて環境はあまりないだろうから実質無問題(^^)

*1:Ant で allbutlast リソースコレクションを使いたかったのだけどバージョンが古くてが使えず、taskdef タスクで JavaScript 書いたのが元ネタ

Windows で空のドットファイルを作る方法。

隣の人が Windowsドットファイルを作ろうとしてはまったときのメモ。

エクスプローラではドットファイルを作れない

エクスプローラのメニューで [新規作成] -> [テキストドキュメント] を選んで .dotfile のようなファイル名にすると「ファイル名を入力して下さい」というメッセージが表示されて作成できない。既存ファイル名の変更も先頭をドット (.) にすると同じメッセージが表示される。すごく不便。

CLI を使う

PowerShell を使う

個人的にはこれが手に馴染んでる。

PS C:\Users\shrimp>New-Item -Type File .dotfile

    ディレクトリ: C:\Users\shrimp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2016/03/25     12:06          0 .dotfile
cmd.exe を使う
>type nul > .dotfile

>dir .dotfile

 C:\Users\shrimp のディレクトリ

2016/03/25  12:07                 0 .dotfile

echo でもいいけど空ファイルにならない。

>echo.> .dotfile

>dir .dotfile

 C:\Users\shrimp のディレクトリ

2016/03/25  12:07                 2 .dotfile
               1 個のファイル                   2 バイト

他のやり方

適当なテキストエディタで新規ファイル作ってファイル保存したり、スクリプトを書くとか。面倒くさいからやらないけど。

HogeれるところでひたすらHogeってみた + 1

HogeれるところでひたすらHogeってみた #hogedriven - 日々常々

Hoge といえばこんなんあるよー」と Twitter で教えてもらったので Hoge 的なものをもう1つ書いてみる *1

public class Hoge {

    public static void main(String[] args) {
        ((Hoge)(null)).hoge();
    }

    public static void hoge() {
        System.out.println("hoge");
    }
}

コンパイルは通るし実行時エラーも発生しない。ちゃんと "hoge" と出力される。

一瞬「?」と思うけど文法的にはまったくおかしいところもないし動くのも理解できる。まあ、こんな変な書き方する人いないだろうけど。

*1:何年遅れかってツッコミは事実すぎて何も言えない