全力で怠けたい

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

Vrapper のインデント動作が変わった

仕事で使っている PC の Vrapper を久しぶりにアップデートしたらインデント動作が変わっていたので、試行錯誤した時のメモ *1
また、ここでのインデント動作というのは、ノーマルモードでの「<<」「>>」やインサートモードでタブキーを押した時の動作を指す。

環境

変わったこと

アップデート前は Eclipse の設定 *2 と同じように動いていた。
そのため、.vrapperrc にはインデント関係の設定は一切書いていなかった。

しかしアップデート後はインサートモードでは Eclipse の設定通りに動いてくれるが、ノーマルモードでの「<<」「>>」が明らかに Eclipse の設定とは違う。
たとえば、Tab policy を Tabs only にしているのに「>>」するとスペースが挿入されるといった動きになる。

リリースノートを読んでもそういったことは書いていない。 *3

したこと

Eclipse と同じ動作になるように .vrapperrc に設定しておく。
例えば、タブ文字でインデントするには以下のようにする。

set noexpandtab

スペース4個でインデント、既存のタブ文字をスペース12個分の幅で表示するなら以下のようにする。

set expandtab
set tabstop=12
set shiftwidth=4

*1:アップデート後は 0.48 だけど、その前のバージョンを控えておくのを忘れたので、どのバージョンで動作が変わったのかは分からない

*2:Preferences - Java - Code Style - Formatter で Edit ボタン押した後の画面の Indentation タブ - General settings で指定する Tab policy, Indentation size, Tab size

*3:ような気がする

Windows で UNIX の find みたいなことをする

背景

forfiles コマンドを使えば Windows でも UNIX の find コマンドみたいなことが出来る。
が、Windows XP だったりすると forfiles なにそれおいしいの?ということは珍しくないと思う*1

解決策

dir コマンドを使って劣化 find コマンドを作る。

@echo off
setlocal

set target=%1

set exec_cmd=%2
if "%exec_cmd%"=="" (
  set exec_cmd=dir /b
) else (
  set exec_cmd=%exec_cmd:"=%
)

shift
shift

for /f "usebackq" %%i in (`dir /b /s %target%`) do (
  %exec_cmd% %1 %2 %3 %4 %5 %6 %7 %8 %9 %%i
)

ここでは wfind.bat としてパスを通しておく。
使う時はこんな感じ。
第一パラメータに処理対象ファイル、第二パラメータに実行コマンドを指定する*2

C:\Users\eb>wfind *.txt
abc.txt
def.txt

C:\Users\eb>wfind *.txt type
C:\Users\eb\abc.txt
C:\Users\eb\def.txt

第二パラメータの実行コマンドになんちゃって sed みたいな VBScript を、そしてこのバッチファイル自体は他のバッチファイルから呼び出す、みたいにして使っていた。
昔を思い出したので書いてみたけど、XP のサポートが終了した今となっては全く価値のないバッチファイル。

本当に今は良い時代になったものだと思う。

*1:リソースキットから入れれば済む話だがそれが出来ない環境も珍しくなかった

*2:実行コマンドを指定しなかった場合には dir /b コマンドとして動くようにしてある

Mercurial をホームディレクトリにインストールする

背景

評価用に Mercurial を一般ユーザーのホームディレクトリにインストールしたので、備忘録までに。
状況としてはディストリビューションがものすごく古い、一般ユーザー権限しか持っていない、パッケージ管理コマンドが使えない…といった良くあるもので、条件は以下のような感じ。

  • ソースからインストールする
  • 一般ユーザーのホームディレクトリにインストールする
  • 今回インストールしたマシンは Ubuntu (古い)
  • HTML / man 形式のヘルプテキストは不要 (hg help が使えれば良い)

依存関係

SupportedPythonVersions - Mercurial *1
※HTML/man 形式のヘルプテキストが必要な場合は Docutils もインストールする必要がありますが、今回は hg help で賄えるのでインストールしません。

Mercurial
- Python
|- zlib |- bzip2

ソースアーカイブの取得

アーカイブ形式は tar.gz として *2 ~/src にダウンロード。バージョンは以下のとおり *3

インストール

*4

# zlib
$ cd ~/src
$ tar zxvf zlib-1.2.8.tar.gz
$ cd zlib-1.2.8
$ ./configure --prefix=$HOME
$ make
$ make install

# bzip2
$ cd ~/src
$ tar zxvf bzip2-1.0.6.tar.gz
$ cd bzip2-1.0.6
$ make -f Makefile-libbz2_so
$ make
$ make install PREFIX=$HOME

# make で -fPIC オプションを指定しろ〜と言われた場合には
# Makefile-libbz2_so の CFLAGS に追加する。
# (ex.) CFLAGS=-fPIC (省略) 

# Python
$ cd ~/src
$ tar zxvf Python-2.7.6.tgz
$ cd Python-2.7.6
$ ./configure --prefix=$HOME
$ make
$ make install

~/bin にパスを通すために ~/.bash_profile を編集。

# ~/.bash_profile
export PATH=~/bin:$PATH

続いて Mercurial をインストール。

# Mercurial
# HTML / man 形式のヘルプテキストは不要なので make install-home-bin
$ cd ~/src
$ tar zxvf Mercurial-3f83fc5cfe71.tar.gz
$ cd Mercurial-3f83fc5cfe71
$ make install-home-bin

確認

$ hg version
Distributed SCM (version 2.9.2)
(see http://mercurial.selenic.com for more information)

Copyright (C) 2005-2014 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

まとめ

依存関係の解決等、もっときちんとしたやり方があるはず。
パッケージ管理コマンドは偉大。

謝辞

不正確な記述、冗長な手順について指摘して下さった @ さん、ありがとうございました><

*1:ちなみに Python をインストール時に readline 等なども足りないと言われるが Mercurial を使う分には不要っぽいので入れていない

*2:展開コマンドを揃えたかっただけ

*3:Mercurial のバージョンがデバッグ版だとの指摘を頂いたので訂正しました

*4:ファイル名、ディレクトリ名は適当に読み替える

Windows 環境で hg convert で pserver 接続の CVS リポジトリに接続できない

状況

実際にしたこと

> cvs -d:pserver:user@repository.host:/repo/path checkout somemodule
> hg convert somemodule somemodule-hg 

hg convert を実行すると早々に「そんなリポジトリはない」と言われてしまいます。

なぜ?

convert extension は変換元リポジトリ (CVS) の変更履歴を取得しようとしますが、この時に接続情報として以下が必要です。

  • "BEGIN AUTH REQUEST"
  • CVSROOT
  • ユーザー名
  • パスワード (気休め程度に暗号化されたもの)
  • "END AUTH REQUEST"

これらを LF で結合して送信するのですが、実際に送信したデータを見ると CVSROOT の後ろになぜか CR がありました。
これは convert extension が CVSROOT を作業ディレクトリの管理ファイル (Root) から取得するときの処理が原因でした。

self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1]

WinCVS なので Root ファイルの改行コードも CRLF になっていて、その CR を取りこぼしてしまったようです *1
「これかー」みたいなことを Twitter で呟いていたら @ さんに「リストから取り出すときに strip() すればいいですよ」と教えて頂いたので、早速試してみたところちゃんと接続出来ました *2

他にも落とし穴が

変換元リポジトリには接続できたのですが、その後の変更履歴を取り出す段になって cvs log コマンドの解析に失敗しているのか、変換後のリポジトリでは全てのリビジョンでファイルが "新規追加" になってしまいました。
リビジョン数も明らかに少なく、@ さんに相談しながら色々と試したのですが、原因究明までは至らずギブアップとなりました。

その後

cygwincvs コマンドでチェックアウトしたものを hg convert したら一発で出来ました。
どう見ても不注意です。@ さん本当にすみませんでした。

*1:ここはものすごく端折っているけど、結局は不注意ですみませんということに。

*2:他にも [:-1] してるところがあるので注意が必要です

TokyoVim#18 に参加してきました。

TokyoVim#18 - connpass に参加してきました。

What's TokyoVim?

  • たぶんもくもく会です。
  • ハッカソンという人もいます。
  • Vim プラグインの作者さんたちも参加しています *1
  • 私のような Vim 初心者も普通にいます。
  • 今回ももくもくしていましたが、後半はわりと賑やかに (!)
  • 懇親会はあったりなかったりします。
  • 気になったらぜひ一度参加してみましょう。

したこと

勉強会自体が1年ぶりくらいで内心緊張していたのですが、ほんの少しだけ遅刻して会場入りするといつもの TokyoVim な雰囲気でした *2
今日は長いこと更新をサボって陳腐化した vimrc をメンテしようと思っていたのですが、このところ JVM オペコードのリファレンスが欲しいと思っていたこともあり、vim-ref-jvmis を作ることにしました。
vim-ref-jvmis がそれなりに動くようになった後は、git でコミットメッセージを書く時になぜか 'c' が押された状態で Vim が起動してしまう謎現象を人力 bisect したりしていました *3
前回の KPT の Try で「中間成果発表しよう!」というのがあったようで、おやつタイムにプロジェクターを回しながら成果発表をしました。
残念ながら自分はほとんど成果がなかったのですが、周りの方々には大いに刺激を受け、そして学ぶものとても多かったです。
ぜひまた行きたいです。

vim-threes

vim-threes というゲームがありますが勉強会に行く時は封印しておいたほうが良いかもしれないです。
面白いです。ハマります。

*1:とても丁寧に教えてくれます

*2:というほど参加しているわけではないですが。

*3:問題が発生するコミットは特定出来たのですが、結局原因は分からず…

JVM オペコードのリファレンスビューアが便利

vim-ref-jvmis

使い方

" Vundle の場合
" vimrc に追記&再読込して :BundleInstall
Bundle 'ebc-2in2crc/vim-ref-jvmis'

" NeoBundle の場合
" vimrc に追記&再読込して :NeoBundleInstall
NeoBundle 'ebc-2in2crc/vim-ref-jvmis'

Jvmis というコマンドが勝手に定義されるので、調べたいオペコードの上にカーソルを置いて :Jvmis を実行すると ref.vim インタフェースでリファレンスを閲覧出来ます。
リファレンスは The Java Virtual Machine Instruction Set から引いて来るので環境によっては一瞬もたつきますが、デフォルトでキャッシュを有効にしているので2回目以降は素早く引くことが出来ます *1

これでバイトコードリーディングがはかどりますね。

*1:vimrc 等で let g:ref_source_webdict_jvmis_cache = 0 とするとキャッシュしなくなり、毎回ネットからリファレンスを引いてきます。

続きを読む

brew install mercurial で bin が入らない

現象

Homebrew で Mercurial をインストールしても /usr/local/Cellar/mercurial/<バージョン> に bin が入らない。
ログを見ても特にエラーや警告は出力されていないように見える。

解決

どうやら python の依存関係がおかしくなっていたようで、brewpython を入れ直したら Mercurial も上手く入った。

手順

$ brew uninstall mercurial
$ brew uninstall python
$ brew install python
$ brew install mercurial

補足

brew は依存関係を解決してくれるがユーザーが間違って依存関係を壊してしまうこともありえるので、上手くいかなかったら依存関係を疑ってみる、くらいはしてもいいかもしれない。
brew では deps コマンドで依存関係を確認でき、--tree オプションでツリー表示することも出来る。
使うとこんな感じ。

$ brew deps --tree mercurial
mercurial
|- :python

$ brew deps --tree python
python
|- pkg-config
|- openssl
|  |- makedepend
|  |  |- pkg-config
|- readline
|- sqlite
|  |- readline
|- gdbm