Hatena::ブログ(Diary)

=== SANDmark 19106 === beginning stress test このページをアンテナに追加 RSSフィード

2017年03月30日

続・OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ(GUI対応)


前回の記事からの続きです。

変更点

使い方

前提として、このスクリプト正規表現グループ参照を用いた置き換えを行うものです。通常の正規表現検索・置換はOmegaTのみで可能です。

regexp = /Sample segment named (.+) could be replaced with (.*)./
def replace(m) { "サンプル分節${m[1]}が${m[2]}に置き換えられます。" }

  • とある部分を変更し、検索に使う正規表現と置換後の文字列を設定します。
  • 『実行』をクリックするとプレビューウィンドウが出てきます。
  • メニュー -> 実行を選択すると、実際に置換を行います。

デフォルトでは

  • Sample segment named something could be replaced with RegExp.
  • Sample segment named whatever could be replaced with script.

上記パターンにマッチする分節すべてがそれぞれ

  • サンプル分節somethingがRegExpに置き換えられます。
  • サンプル分節whateverがscriptに置き換えられます。

と置換されます。

謝辞

OmegaTに含まれるGroovyスクリプトをおおいに参考にさせていただきました。感謝!

技術的な話

GUIなんてやるもんじゃない。
Groovy経由だからJavaほど構築が面倒なわけではないけど、やっぱりコード内でUIを定義しようとするとやっぱりすごいことになりました。長年見なかった感じのコードというか。ほとんどコピペなのでSwingなにそれな私でもなんとかなりました。いろんなサンプルを用意してくれるOmegaTプロジェクトに改めて感謝です。未だにimport staticの意味がわかってないけど許して。

ただ、他のスクリプトを見るとあんまりeachイテレータ使ってなくて、トラディショナルなforループが多いです。分節区切りを変更したらeachで拾えなくなる分節があったんですが、インデックスで参照してたら拾えてたのかな?

OmegaTスクリプトを書こうっていう人がどれくらいいるのかわかりませんが、書いてみると意外と簡単だったりします。現在のベータ版(4.1.1)ではシンタックスハイライトが実装されてたりするので、興味のある人は触ってみてくださいねー。

2017年03月29日

OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ


2017-03-30: 更新しました -> 続・OmegaT用: 正規表現のグループ参照を使って訳文を置き換えるスクリプトを書いたよ(GUI対応) - === SANDmark 19106 === beginning stress test

経緯と使い方

なんか前の記事から一年以上経ってて引きました。

最近は翻訳のお仕事をしているんですが、支援ツールとして翻訳メモリソフトOmegaTno title)を使ってます。Javaで書かれたオープンソースソフトウェアで、実はTRADOSの体験版ダウンロードしている最中に暇つぶしで触ってみたらそのまま実務用になってしまったという、脅威の機能性を持つあなどれないやつです。TRADOS体験版の試用期間はまだあるんだけど、多分触らないまま終わりそう。基本的な使い方はマニュアルが充実しているのでそっちに任せるとして、今回はややマニアックな需要です。

チャットログなんかを翻訳していると定型文が大量に引っかかるわけで、いくら参考訳文に出てきても200件あったら大変なわけですよ。もちろん置き換え機能はOmegaTにありますし、正規表現も使えるのだけど、これが "John talked to Jessie", "Jack talked to Jimmy" とか、そういうのが大量にあると単純には置き換えられない。

ので、スクリプトを書きました。ダウンロードしてOmegaTインストールディレクトリにあるscripts/にぶち込んでください。あとはOmegaTを起動してツール→スクリプト→regexp_replacement.groovy→実行です。コンソールにプレビューが表示されるので、キャンセルを繰り返しながら置き換え後の文章を確認しつつ、これだと思ったところで置き換えてください。操作は元に戻せないのでtmxファイルのバックアップを強く推奨します。自己責任でどうぞ。

Groovy自体はじめてだったのでいろいろ調べながらのわくわくさんクオリティでごめんなさい。自分でも相当使いづらいのでそのうち直します。

5行目が検索正規表現とグループ指定、6行目が置き換え後の文字列です。置き換え後の文字列がちょっと読みづらいですが仕様です。""でくくられた部分だけ編集しましょう。${m[1]}がひとつめの括弧、${m[2]}がふたつめの括弧…というように対応してます。

regexp = /(.*) talked to (.*)./
def replace(m) { "${m[1]}さんが${m[2]}さんに言いました。" }

/(.*) talked to (.*)./が例えば "(John) talked to (Jessie)" にヒットして、"JohnさんがJessieさんに言いました。" に置き換えられます。人名はがんばってください。

技術的な話

なんでハードコーディングしてるのかっていうと、OmegaTがグループマッチの部分参照に対応していないからです。どうもJavaのMatcherクラスが十分なメソッドを提供していないからっていう感じはしますが、Twitterでアドバイスをくれたエラリー・ジャンクリストフさんによると



とのことです。ひょっとすると将来的に実装されるかもしれませんが、現時点では他の機能のほうが需要が高い様子。まぁスクリプトでできたわけだしいいよね。

OmegaTはGroovyとJavaScriptの両方でスクリプトが書けますが、今回は好奇心もあってGroovyに挑戦しました。Rubyインスパイアされただけあってとりあえず書き下すのは楽でした。そのぶん処理の最適化とかまったくしていないコード(同じ処理を2回行う手抜き)なので、分節が10万とかになるとどうなるかわかりません。

置き換え後の文字列がStringじゃなくてクロージャになっているのは呼び出しの都合です。"_1さん_2さん"とかで参照したいんですが、面倒なので実装しません。

UIもハードコーディングでローカライズとかまったく考えてないんですが、よし海外ニーズがあったとしても、向こうにはもっといいものがあるでしょうきっと。

2013年06月28日

VMware上のUbuntu13.04でvmware-toolsが動かなかったので

タイトル通り vmware-tools が動かなかったのです。というより、

  • カーネルが 3.8 になったので vmware-tools をビルドしようとしたら
  • linux-headers に version.h が無いと怒られ失敗し
  • ln -s でリンクを貼ってビルドし直したんだけど
  • カーネル 2.8 の方法でビルドしようとしやがるので当たり前のように失敗する

というどうしようもない状態に陥っていました。
ちなみに vmware-tools のバージョンは 9.5.0.19712 (build-958366) だったらしい。
多分バージョンによってはビルドできる。

が、いまどき VMware Player で Ubuntu を動かすライトユーザーとしては
いちいち VMware® さんに個人情報を送信して有料版体験版ダウンロードし、
そこから vmware-tools だけを失敬してアップデート
などという苦行を強いられるのはさすがにもう嫌なので、
思い切って open-vm-tools に乗り換えてみました。

ようするにオープンソース版の vmware-tools らしい。

$ sudo apt-get install open-vm-tools       # 設定ファイルを置き換えるかどうか訊かれる。とりあえず全部置き換えた
$ sudo /etc/init.d/vmware-tools stop       # バッティング予防に既存の vmware-tools を停止
$ sudo /etc/init.d/open-vm-tools restart   # open-vm-tools 再起動

ここまでで特にエラーは無かったのだけれど、
共有フォルダが有効にならないという比較的フェイタルな事態に遭遇。

「これだから…」などという自分勝手な呆れ感を抱きながらグーグリングしていると
[ubuntu] Auto mounting shared folders with open-vm-tools というアメリカ語の記事を発見。
どうやら共有できないのではなく、自動でマウントしてくれないらしい。

上記URLに掲載されてる open-vm-tools (シェルスクリプト) をためらいもなく実行すると
Syntax Error と怒って仕事してくれなかった上に、
よくよく見るとオリジナルのスクリプトとあまりにも構造が違っていたので
手動で改造した結果がこちら。

#!/bin/sh

### BEGIN INIT INFO
# Provides:		open-vm-tools
# Required-Start:	$local_fs $remote_fs
# Required-Stop:	$local_fs $remote_fs
# X-Start-Before:
# X-Stop-After:
# Default-Start:	2 3 4 5
# Default-Stop:		0 1 6
# Description:		Runs the open-vm-tools services
# Short-Description:	Runs the open-vm-tools services
### END INIT INFO

. /lib/lsb/init-functions

exit_if_not_in_vm () {
	if [ ! -x /usr/bin/vmware-checkvm ] || ! /usr/bin/vmware-checkvm > /dev/null 2>&1
	then
		echo "Not starting as we're not running in a vm."
		exit 0
	fi
}

case "${1}" in
	start)
		# Check if we're running inside VMWare
		exit_if_not_in_vm

		log_daemon_msg "Loading open-vm-tools modules"
		log_progress_msg "vmhgfs"; modprobe vmhgfs
		log_progress_msg "vmxnet"; modprobe vmxnet
# ここに2行追加
		log_daemon_msg "Mounting hgfs"
		mount -t vmhgfs .host:/ /mnt/hgfs

		log_end_msg 0

		log_daemon_msg "Remove pcnet32 module, if vmxnet is loaded"
		# check if vmxnet module is loaded
		loaded="$(lsmod | grep -o vmxnet)"
		if [ "$loaded" = "vmxnet" ]; then
			# Removes pcnet32 module if vmxnet module is loaded
			modprobe -r vmxnet
			log_progress_msg "Removing pcnet32"; modprobe -r pcnet32
			modprobe vmxnet
		fi
		log_end_msg 0

		log_daemon_msg "Starting open-vm daemon" "vmtoolsd"
		/usr/bin/vmtoolsd --background /var/run/vmtoolsd.pid
		log_end_msg 0
		;;

	stop)
		# Check if we're running inside VMWare
		exit_if_not_in_vm
# ここにも2行追加
# ※ vmtoolsd のプロセスをころる前に umount するとエラーを吐くとコメントで情報を頂いたので位置だけ変更
		log_daemon_msg "Unmounting /mnt/hgfs"
		umount /mnt/hgfs

		log_daemon_msg "Stopping open-vm guest daemon" "vmtoolsd"

		if [ -f /var/run/vmtoolsd.pid ]
		then
			kill $(cat /var/run/vmtoolsd.pid)
		fi

		log_end_msg 0

		log_daemon_msg "Removing open-vm-tools modules"
		log_progress_msg "vmhgfs"; modprobe -r vmhgfs
		log_progress_msg "vmxnet"; modprobe -r vmxnet

		log_end_msg 0
		;;

	force-reload|restart)
		${0} stop
		sleep 1
		${0} start
		;;

	*)
		log_success_msg "Usage: ${0} {start|stop|restart|force-reload}"
		exit 1
		;;
esac

実際には mount,umount コマンドをそれぞれ start,stop に追加するだけなんですが、
mount -t vmhgfs .host:/ /mnt/hgfs ってなんだよ覚えられる気がしないよ。
起動時に毎回このコマンドを実行するのかと思うと何かこみ上げてくるものがありますね。

$ sudo /etc/init.d/open-vm-tools start
* Loading open-vm-tools modules                                         [ OK ]
* Mounting hgfs                                                         [ OK ] 
* Remove pcnet32 module, if vmxnet is loaded                            [ OK ] 
* Starting open-vm daemon vmtoolsd                                      [ OK ]
$ ls /mnt/hgfs/
C/ D/ E/ J/

何はともあれ、これで共有フォルダがゲスト側から見えるようになりました。
結論:

  • VMware Player ユーザには open-vm-tools のほうがいい
  • デフォルトで自動マウントするようにして欲しい
  • 作業が中断されて2時間経った

2012年11月28日

VMware Player 5 で vmnetcfg.exe を使おう!


VMware Playerでポートフォワーディングしたかったんですが、
使用中のバージョンが 5 だったので vmnetcfg.exe がない。
以前はインストーラを展開して、さらにcabアーカイブを展開すると入っていたはずなのですが、
どうやらバージョン5になってから完全に削除されてしまったようです。

そこで、以下の記事を参考に VMware Workstation のパッケージから引っ張ってくることに。

便宜上cygwin:

$ ./VMware-workstation-full-9.0.1-*****.exe /e .\\extract # cygwinだと \ を2つ打たないと展開先が .extract になるので注意
$ cd extract/
$ cabextract core.cab                                     # 実際はLhazでも何でもいいんだけど

core.cabの中にvmnetcfg.exeがあるので、それだけ展開すれば良さそうです。
Program Files(x86)以下VMware\...に適当に置いて
適当にいつも通り設定すればおしまいでした。

2012年04月04日

10分でできる: Emacs使いにすすめるリッチなVIM環境構築(Case Study of @naoty_k)

本気出してコーディングするときはEmacs、ちょっとした設定ファイルを変更するのはVi。
そんなスタイルで開発している方はいませんか?
そう、私です。^o^

例えばRailsしてるとき、コントローラやビューはEmacsで書くけど、
migrationはViで編集する
なんてことはしょっちゅうです。
他にも /etc にある各種ファイルを sudo vi で端末で作業できるのは魅力的。

だからいつも sudo apt-get install vim とするだけで
.vimrc? なにそれ? という状態で何も設定せず
Ubuntuデフォルトのまま作業していたのですが、やはり困ることがあります。

いや、困るというよりは「やりにくい」が正しい表現なんですが、
今回Twitter上で @naoty_k さんからさまざまなアドバイスをいただきました。
その設定をしたあとのViの快適さといったらありません。
透過的にサポートしてくれる機能満載なので、細かい設定や使い方は一切無し。*1

  • 追記:
    • コメント欄にて @naoty_k さんご本人が、一歩進んだ使い方を紹介してくれています。是非ご参照あれ。

さてそれでは、10分でVIMをバリバリチューニングしてみましょう。

vundle

VIMには vundle という、Rails3で言うところの bundler があります。
詳細については上記参考URLを見ていただくとして、まとめとして今回やったことをメモ。

シェル:

$ mkdir -p ~/.vim/bundle/  # 各種プラグイン用
$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle  # vundle をインストール

colorscheme railscasts

@naoty_k さんはVIMのカラーテーマに railscasts を採用なさっているそうです。
これでVIMがよりカラフルになると、多分そういうわけです。

上記URL(の下のほうのリンク)から railscasts.vim をダウンロードして、
~/.vim/colors/ ディレクトリに放り込みます。

$ mkdir -p ~/.vim/colors/
$ mv railscasts.vim ~/.vim/colors/

しかしこのままでは後述の.vimrcでは使えないので、
Ubuntuを使っている場合は以下のようにします。*2

$ sudo apt-get install ncurses-term

.vimrc

@naoty_k さんは github に普段使っている dot ファイルを公開されているので、
まずはそこから .vimrcパクって持ってきます。
中身は……Emacs使いの僕には何が何やらですが、凄そうです。

前述の railscasts を使うために、Ubuntu用の設定ちょっとだけ書き加えます。*3
.vimrc(7行目付近):

" ↓コメントアウト
" colorscheme railscasts

" for gnome-terminal on Ubuntu
if $COLORTERM == 'gnome-terminal'
  set term=gnome-256color
  colorscheme railscasts
else
  colorscheme default
endif

.vimrc のコメントは行頭に " (ダブルクォート)を置きます。

プラグインのインストール

ここまでの状態で vim を起動しても、まだ完璧ではありません。
vundle によるプラグインのインストールが終わっていないからです。
VIMを起動して、 :BundleInstall と入力してEnter。

すると .vimrc に記述されているプラグインが続々とインストールされていき、
"Done" と表示されたら正常にインストールされた証拠です。

完了!

これで全ての準備が整いました。
適当にファイルを編集してみるとすぐにわかるのはコードの自動補完ですね。
ちょうどEmacsで言うところの auto-complete のような感覚で使うことができます。

また、行番号が表示されていたり、行末に余計なスペースがあると表示してくれたり
自動でインデントしてくれたり、他にも他にも、まだ僕が触っていない便利な機能があることでしょう。
これまでとはまったく違う、何ともリッチなVIMが出来上がってしまいました。*4

これで思う存分VIMで快適なコーディングをすることが出来そうです。
@naoty_k さんどうもありがとうございました!

おまけ

プラグインのアップデート

VIMを起動した状態で :BundleInstall! を実行すると、
既存のプラグインを自動でアップデートしてくれるらしいです。
これは vundle の機能なので、詳しくはそちらを。

もしかしたら関係あるかも知れない「ハイライトが機能しない」問題

環境変数 $VIM と $VIMRUNTIME が関連しているかも?
VIMには膨大な数の syntax ファイルが用意されていますが、
これを探すのに $VIM もしくは $VIMRUNTIME のパスを探しに行くみたいです。

Ubuntuの場合は /usr/share/vim/vimcurrent というシンボリックリンクがそれなので、
.bashrc や .zshrc に

export VIM=/usr/share/vim/vimcurrent
export VIMRUNTIME=$VIM

と書いておくと、ある種のおまじないになるかも知れません。
このあたりは.vimrcというよりVIMそのものの仕様になってくるので
今回のエントリではあまり触れないようにしておきます。

*1:実を言うとまだプラグインについて完全に調査していないので、より便利な使い方はもちろんあります。ただ今回はあくまでも『まとめ』なので、それについては省略させてください。

*2:railscasts.vimのコメントから。

*3:これにより、gnome-terminalの提供する256色がVIM上で使用可能になる ハズ です。

*4:@naoty_kさんはガチVIM使いなので当然といえば当然ですけども。