2011/11/24


日本語を扱っていて困るのがgrep。正規表現パターンにマルチバイト文字を混ぜられなかったり、windowsで動かすと"表"の様に2バイト目にbackslashが混じる文字で動作しなくなったりします。
さらに複数のエンコーディングで書かれたファイルが散らばっていると一度のgrepで検索出来なかったりもします。
vimに限っては、内蔵のvimgrepを使う事で解決出来ますが、見つかったファイルをバッファに開いてしまうという挙動がある為、grepオリジナルの動作を求めている人にとっては都合の悪い物だったりもします。

vimgrepの様に複数のエンコーディングに対応していて、検索パターンにマルチバイト文字を含んだ正規表現が使えて、windowsでもちゃんと動いて、ついでといっちゃあなんだが、"**/*.txt"で再帰検索してくれる様なgrep無いかなぁと思ってたんですが、やっぱり無いので作りました。
こういう処理、実はGo言語が得意でして、意外と短いコードで書けてしまったりします。
もちろんバイナリが吐けるので配布も簡単。
mattn/jvgrep - GitHub

grep for japanese vimmer

https://github.com/mattn/jvgrep
内部ではgo-iconvという、元々別の方が作ったiconvモジュールをwindowsでダイナミックローディング対応させ使っています。もちろんスタティックリンクなので別途調達する必要もありませんが。なお、windows上での動作にはiconv.dllかlibiconv.dllが必要です。
Go言語の開発環境を持っていらっしゃる方ならば、最新までバージョンを上げて頂いた後 # goinstall github.com/mattn/jvgrep
として頂いたらインストールしてくれます。go-iconvが依存物としてインストールされますが、linux等ではiconvのヘッダおよびライブラリが必要になりますので注意です。windowsはダイナミックローディングしているので必要ありません。
ちなみに、win32版のみ最新版のjvgrepをダウンロード出来る様にしてあります。上記リンクから"Downloads"をクリックして"jvgrep-win32.tar.gz"を落とし、解凍して下さい。iconv.dllを同梱しています。ウィルスチェック済み。

使い方は普通のgrepです。 # jvgrep 表[現示] *.txt
この様に日本語で、しかもwindowsだと誤動作するダメ文字にも対応しています。
まぁGo言語は内部では全てutf-8なので、当たり前ですが。
尚、Goのregexpパッケージがまだ発達途上なので":alpha:"の様な文字クラスは使えません。使いたい人は今すぐGo Developer Teamに参加してpatchを書いて下さい。(使える様になりました)

vimmer向けに # jvgrep 表[現示] **/*.txt
という使い方も出来ます。 オプションは現状ありません。出力結果はgrepで"-n"オプションを付けた時の出力内容に合わせてあります。
サポートしているエンコーディングは
  • iso-2022-jp-3
  • iso-2022-jp
  • euc-jisx0213
  • euc-jp
  • utf-8
  • ucs-bom
  • euc-jp
  • eucjp-ms
  • cp932
と、ほぼ全ての日本人向けエンコーディングに対応出来ています。
仕組みはvimと同じです。 vimからは set grepprg=jvgrep
とvimrcに書けば使えます。
:grep 表[現示] **/*.txt
といった感じにお使い下さい。
Posted at by



2011/11/10


以前、「jekyllで始める簡単ブログ」という記事を書いたのですが
Big Sky :: Jekyllで始める簡単ブログ

GithubのユーザページでJekyllが使われる様になりました。 GitHub Pages Upgraded to Jekyll 0.5.0 - GitHub I just released Jek...

http://mattn.kaoriya.net/software/lang/ruby/20090409185248.htm
octopressというのを使うともっと簡単に出来る事が分かった。
Octopress

Octopress is a framework designed by Brandon Mathis for Jekyll , the blog aware static site generato...

http://octopress.org
imathis/octopress - GitHub

What is Octopress? Octopress is Jekyll blogging at its finest. Octopress sports a clean responsive t...

https://github.com/imathis/octopress
以下簡単な手順を示す。
このgithubリポジトリは基本的に、1ブログに対して1つcloneする。cloneしたら # rake install
する。octopressをシステムにインストールのではなく、このブログ用リポジトリにsassテーマをキャッシュさせる為の設定を行うだけなので安心してやって貰ってok。
次にgithubにブログを作るのであれば # rake setup_github_pages
を実行し、読み取り書き込み権限のあるgit URLを貼り付けて完了。
Windowsの場合はちょっとここで修正が必要で、config.rbとかRakefileに変なパスが書かれているので直す。実際にはpublic/c:/path/to/public...みたいなフルパスが重なっているはずなのでpublic...に直せばok。
これについては時間があったらパッチ書いてpull requestを送るつもり。

さて、これでブログを書く準備が出来ました。簡単すぎますね!

試しにsource/_posts/2011-10-17-github-jekyll.mkdというmarkdownのファイルを作ります。中身は以前ご紹介した内容と変わりませんが、ocotopressは幾らか拡張プラグインが入っているので色んな書き方が出来ます。
例えばgist tagプラグインを使って ---
layout: post
title: "githubとjekyllとoctopressで作るブログ"
date: 2011-07-03 5:59
comments: true
categories:
---
便利すぎる...

{% gist 1292428 %}
こう書いて # rake gen_deploy
すると
githubとjekyllとoctopressで作るブログ - ギッハブる日記

Recent Posts githubとjekyllとoctopressで作るブログ Github Repos Status updating... @mattn on Github Latest T...

http://mattn.github.com/blog/blog/2011/07/03/github-jekyll/
こんな記事が出来上がります。dateはファイル名じゃなくてdateの方が(設定されていれば)優先されるみたいですね。以後は記事を書いてrake den_deployするだけの簡単なお仕事です。
他にも、imageタグや、haml形式入力、html5 videoタグなど、色んなプラグインがあります。また、sassフォルダ内にあるsassファイルを弄れば簡単しかも柔軟なCSSを吐き出せます。
なお、_config.xmlを弄ってタイトルやサブタイトル、githubアカウント、twitterアカウントなんかを設定すると上述の様なサイトが簡単に出来上がります。
# ----------------------- #
#      Main Configs       #
# ----------------------- #

url: http://mattn.github.com/blog
title: "ギッハブる日記"
subtitle: ギッハブで作る開発日誌
author: mattn

気をつけておいて欲しいのは、github/jekyllはCGIで動いている訳じゃなくて、octopressが静的コンテンツを生成しているので、記事をアップする環境に依存する事。まぁここはbundleを使っているのでOSさえ変わらなければ大丈夫かと思います。Windowsからでも既述の様な修正を入れれば使えています。無料のgithubで簡単にしかもモダンなブログサイトを作りたい方は、一考してみてはどうでしょうか。
Posted at by



2011/11/02


Windowsで作業する事も多いので、普段からthincaさんが書いたCoffeeScript on JScriptを使ってたんだけど、JScriptを使ってるという点がどうも気持ち悪くて、コンパイルエラーメッセージに「Microsoft JScript 実行時エラー」とか出るとかなり (´・ω・`)ショボーンな気分でした。
あと、thincaさんのは-eオプションで動かした時にconsole.log()が無いのでエラー出る事もあって、ちょっとしたスクリプトを書くのに困ってました。

で、v8のソースリポジトリに含まれるシェルd8を使ってバッチファイルから呼び出して...ってやればうまく行くんじゃね?オレ天才!とか考えながら進めていったらd8では標準入力が使えないのもあって断念。
あと、この手のはcoffee-script.jsを一緒に持って歩く必要があって、なんか僕の趣味に合わなかったので(どんな趣味だよ)、実行モジュール1個だけで動いて、LinuxでもWindowsでも動いて、極力node(v8)と挙動の近い物が欲しくなった。

こうなれば...と思ってv8使ってC++だけで書いてみた。
mattn/coffee-script-v8 - GitHub

CoffeeScript compiler/runner

https://github.com/mattn/coffee-script-v8
coffee-script.jsのコードはソース埋め込みなので、実行モジュール1つあれば動きます。
v8は普通にコンパイルするとスタティックリンクなので、実行モジュールだけの依存になります。
Windowsだとコンパイルは g++ -o coffee coffee.cc -lv8 -lwinmm -lws2_32
こんな感じ。他の環境だと g++ -o coffee coffee.cc -lv8
で行けると思います。
「いや、coffee-script.jsのバージョン上がったらどないすんねん!」って人は、どうぞ改造して使って下さい!
Posted at by