Heroku に Mercurial でデプロイする

準備

とりあえず hg, git, heroku コマンドは使えるようになっていること。

  • hg-git エクステンションを導入する。今回のキモ。ただし changeset 1189e52ba27c 以降でないとうまく動かない。
  • .hgrc の [git] セクションに intree = True を追加する。これを設定すると hg-git 用の git リポジトリの場所が /.hg/git から /.git に変わる。
  • ユーザー毎の無視指定((.hgrc の [ui] セクション ignore で指定できる。))で ^\.git$ (syntax: regexp) を除外しておく。

1. mercurial リポジトリを作成する

まずはアプリを作り、mercurial リポジトリにコミットする。

2. アプリケーションを作成する

git init したあとに、heroku create --stack cedar する。すると git リポジトリのリモートに heroku が登録される。

これを登録しないと heroku コマンドで毎回アプリケーションの名前を打ち込む羽目になる。

3. push する

hg-git を導入しているのでリモートの git リポジトリhg push する。

リモートリポジトリのパスは git config remote.heroku.url で見ることが出来る。ただし、先頭に git+ssh:// を付ける必要がある。((例. hg push git+ssh://git@heroku.com:APPLICATION-NAME.git))

毎回リモートリポジトリを指定するのは面倒なので、default-push を設定すると楽。(参考: JapaneseTipsAndTricks - Mercurial)

Ruby 1.9.3 & Windows でのファイル周りの話

Windows でのファイル周りを Ruby 1.8 と比較。

File.size が 4GB 以上のファイルでも正常に動く

$ ruby19 -e "p File.size('big')"
11995281408
$ ruby18 -e "p File.size('big')"
-889620480

1.8 では結果が狂っていたが、1.9 では正常な値を返す。

File 関係 APIUnicode 対応になっていた

軽く使った程度だか、UTF-8 のファイルパスを渡してもきちんと動くようになっている。File.size("啞.txt") とかも動く。

Dir.glob で UTF-8 のファイル名が取得できる

$ ruby19 -e "p Dir.glob('*'.encode('utf-8'))[0].encoding"
#<Encoding:UTF-8>

Dir.glob のパターン文字列の encoding で返ってくるファイルパスの encoding が決まる。
この仕様はドキュメントに書かれていない。Dir.glob の結果がスクリプトエンコーディングに影響された事があり、それで気付いた。

Dir.entries, Dir.foreach でも UTF-8 のファイル名が取得できる

$ ruby19 -e "p Dir.entries('.', :encoding => 'utf-8')[0].encoding"
#<Encoding:UTF-8>

こちらは :encoding 引数で指定する。
やはりドキュメントに書かれていない。[ruby-dev:35620] non-locale filename encoding のスレッドを読んでこのオプションを知った。

感想

Ruby 1.8 と比べて 1.9 は Windows でのファイル周りのサポートがしっかりしているので、Windows ユーザは Ruby 1.9 に移行すると幸せになれるかも。

使っている Ruby のバージョン

$ ruby19 -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [i386-mingw32]
$ ruby18 -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [i386-mingw32]

GreenPad を弄ってみた

私がいつも使っているテキストエディタGreenPad なのですが、正規表現が簡易だったり UTF-8 の判定によく失敗したりする問題があります。

それを解決するために少し GreenPad を弄ってみました。リポジトリwantora / greenpad — Bitbucketにあります。

主な変更点

バイナリはwantora / greenpad / Downloads — Bitbucketに一応あります。が、まだアルファ版なので利用には注意が必要です。

f4b24 用のミニパネルプラグインを修正してみた

f4b24 用のミニパネルプラグインに minipaneu.fgp がありますが、うちの Windows 7 では開くたびに少しずつ幅が減ってしまいます。*1

その不具合を修正してみました。修正の差分はchangeset / dc4830249609にあります。

バイナリも作成しましたので、wantora / fittle-minipane / Downloads — Bitbucketからダウンロードできます。

*1:minipaneu.fgp_110421.zip で確認

一部のテストだけ実行したい

例えば、Ruby本体をビルドしてnkfのテストだけを行いたい場合。

make test-all TESTS="nkf"

上記のコマンドをタイプすればできる。TESTS変数がrunner.rbに渡すコマンドラインオプションになっている。オプションの詳細はclass Test::Unit::AutoRunner (Ruby 1.8.7)に書いてある。

make check じゃなくて make test-all でした。

久しぶりにMinGWでRuby 1.8/1.9のビルドをしてみました

2012-03-04 色々と更新
2012-03-05 Tcl/Tkを追加
2012-04-03 Termcap は Ruby のビルドに必要ないことが判明したので削除

いい加減に1.9系に移行するためにRubyをビルドしてみた。その作業メモ。
(しかし、どの拡張ライブラリがビルドされていないのか簡単に確認する方法はないのだろうか。)

方針

  • ビルド済みバイナリは使わない
  • なるべく最新版を使用する
  • 拡張ライブラリが依存するライブラリは静的リンクする

ビルド環境はMinGW(GCC 4) + MSYS。シェルにはNYAOSを使用した。

変数

LIBS_PATH
拡張ライブラリ用のライブラリをインストールするディレクト
RUBY18_PATH
Ruby 1.8をインストールするディレクト
RUBY19_PATH
Ruby 1.9をインストールするディレクト

OpenSSL

展開に使用するtarはMSYSに入っている物にしなければならない。詳しくはINSTALL.W32を参照。

wget http://www.openssl.org/source/openssl-1.0.0g.tar.gz
tar zxf openssl-1.0.0g.tar.gz
cd openssl-1.0.0g

sh ./config --prefix=%LIBS_PATH% no-shared
make
make test
make install_sw

libiconv

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar zxf libiconv-1.14.tar.gz
cd libiconv-1.14

sh ./configure --prefix=%LIBS_PATH% --enable-static --disable-shared --disable-nls
make
make check
make install

GDBM

GDBM 1.8.3にパッチを当ててビルド。

wget ftp://ftp.gnu.org/gnu/gdbm/gdbm-1.8.3.tar.gz
wget http://sites.google.com/site/wantora/download/gdbm-1.8.3-mingw.patch --content-disposition
tar zxf gdbm-1.8.3.tar.gz
cd gdbm-1.8.3

patch -p1 < ../gdbm-1.8.3-mingw.patch
sh ./configure --prefix=%LIBS_PATH% --enable-static --disable-shared
make
make install
make install-compat

PDCurses

wget http://sourceforge.net/projects/pdcurses/files/pdcurses/3.4/PDCurses-3.4.tar.gz/download
tar zxf PDCurses-3.4.tar.gz
cd PDCurses-3.4/win32

make -f mingwin32.mak
cp ../curses.h %LIBS_PATH%/include
cp pdcurses.a %LIBS_PATH%/lib/libcurses.a

zlib

wget http://prdownloads.sourceforge.net/libpng/zlib-1.2.6.tar.bz2?download
tar jxf zlib-1.2.6.tar.bz2
cd zlib-1.2.6

make -f win32/Makefile.gcc
make -f win32/Makefile.gcc test
make -f win32/Makefile.gcc install INCLUDE_PATH=%LIBS_PATH%/include LIBRARY_PATH=%LIBS_PATH%/lib BINARY_PATH=%LIBS_PATH%/bin

Readline

最新版はうちの環境*1ではなぜか動作がもっさりするので、Index of /win32のソースを使用。

wget http://jarp.does.notwork.org/win32/readline-4.3-2-src.zip
unzip readline-4.3-2-src.zip
cd readline-4.3-2/win32

make DLL=0 CC=gcc
make DLL=0 install prefix=%LIBS_PATH%
mv %LIBS_PATH%/lib/libhistory-static.a %LIBS_PATH%/lib/libhistory.a
mv %LIBS_PATH%/lib/libreadline-static.a %LIBS_PATH%/lib/libreadline.a

LibYAML

wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar zxf yaml-0.1.4.tar.gz
cd yaml-0.1.4

sh ./configure --prefix=%LIBS_PATH% --enable-static --disable-shared CFLAGS=-DYAML_DECLARE_STATIC
make
make check
make install

libffi

wget ftp://sourceware.org/pub/libffi/libffi-3.0.10.tar.gz
tar zxf libffi-3.0.10.tar.gz
cd libffi-3.0.10

sh ./configure --prefix=%LIBS_PATH% --enable-static --disable-shared
make
make check
make install

Tcl/Tk

静的リンクだとうまく動かないので動的リンクにしている。

wget http://prdownloads.sourceforge.net/tcl/tcl8.5.11-src.tar.gz
wget http://prdownloads.sourceforge.net/tcl/tk8.5.11-src.tar.gz
tar zxf tcl8.5.11-src.tar.gz
tar zxf tk8.5.11-src.tar.gz
cd tcl8.5.11/win

sh ./configure --prefix=%LIBS_PATH% --enable-shared --enable-threads
make
make test
make install
cd ../../tk8.5.11/win

sh ./configure --prefix=%LIBS_PATH% --enable-shared  --enable-threads
make
make test
make install

Ruby 1.9

wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p125.tar.bz2
tar jxf ruby-1.9.3-p125.tar.bz2
cd ruby-1.9.3-p125

sh ./configure --prefix=%RUBY19_PATH% --enable-shared --with-opt-dir=%LIBS_PATH% --with-libffi-include=%LIBS_PATH%/lib/libffi-3.0.10/include --with-tclConfig-file=%LIBS_PATH%/lib/tclConfig.sh --with-tkConfig-file=%LIBS_PATH%/lib/tkConfig.sh CFLAGS="-DYAML_DECLARE_STATIC -DREADLINE_STATIC"
make
make check 2>&1 | tee make-check.log
make install-all

cd %LIBS_PATH%
cp -r lib/tcl8 lib/tcl8.5 lib/tk8.5 %RUBY19_PATH%/lib
cp bin/tcl85.dll bin/tk85.dll %RUBY19_PATH%/bin

Ruby 1.8

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p358.tar.bz2
tar jxf ruby-1.8.7-p358.tar.bz2
cd ruby-1.8.7-p358

sh ./configure --prefix=%RUBY18_PATH% --enable-shared --with-winsock2 --with-opt-dir=%LIBS_PATH% --with-tclConfig-file=%LIBS_PATH%/lib/tclConfig.sh --with-tkConfig-file=%LIBS_PATH%/lib/tkConfig.sh CFLAGS="-DREADLINE_STATIC"
make
make check 2>&1 | tee make-check.log
make install-all

cd %LIBS_PATH%
cp -r lib/tcl8 lib/tcl8.5 lib/tk8.5 %RUBY18_PATH%/lib
cp bin/tcl85.dll bin/tk85.dll %RUBY18_PATH%/bin

*1:Windows7 SP1 + NYAOS + ckw

NYAOSの更新をするコマンドを修正しました

NYAOSの更新作業を補助するLuaスクリプトです。以前に作ったもの*1が動かなくなっていたので修正しました。

つかいかた

  1. 実行には wgetコマンドunzipコマンド が必要です。パスの通った場所に置いてください。
  2. _nyaなどでsourceを使って下記のソースを読み込む。
  3. update_nyaos コマンドを実行する。すると自動で新しいバージョンを探して、ある場合はインストールできます。

ソースコード

-- nya_update.lua
-- MIT License (http://d.hatena.ne.jp/wantora/20101212/1292141801)

local function wget(url, output)
	local command = 'wget --no-check-certificate --user-agent="" -O "'..output..'" "'..url..'"'
	
	if output == "-" then
		local f = io.popen(command .. '2> NUL')
		local out = f:read("*a")
		f:close()
		return out
	else
		return os.execute(command)
	end
end

local function confirm(message, chars)
	local key
	
	io.write(message)
	repeat key = nyaos.getkey() until chars:find(key) ~= nil
	io.write(key.."\n")
	return key
end

local function fileread(filename)
	local f = io.open(filename, "rb")
	local body = f:read("*a")
	f:close()
	return body
end

local function check_mod(nyapath, zippath)
	local s, old = pcall(fileread, nyapath.."\\_nya")
	if s == false then return false end
	local new = nyaos.eval('unzip -cp "'..zippath..'" _nya')
	return (old:gsub("%s+$", "") ~= new:gsub("%s+$", ""))
end

local function setupdate(nyapath, zippath)
	local opt = ""
	if check_mod(nyapath, zippath) then
		if confirm("_nyaファイルを上書きしますか?(y/n)", "yn") == "n" then
			opt = "-x _nya"
		end
	end
	nyaos.goodbye.update_nyaos = function()
		nyaos.exec([[%COMSPEC% /c start %COMSPEC% /c "ping localhost -n 2 > nul & unzip -o "]]..zippath..[[" -d "]]..nyapath..[[" ]]..opt..[[ & pause"]])
	end
end

function nyaos.command.update_nyaos()
	local nyapath = nyaos.argv[0]:gsub("\\[^\\]+$", "")
	local html = wget("https://bitbucket.org/zetamatta/nyaos3000/downloads", "-")
	local url, name, version
	
	version = ""
	for u,n,v in html:gmatch('<td class="name"><a class="execute" href="([^"]*/([^"]-%-([^"]-)%-win%.zip))"') do
		if v > version then
			url, name, version = "https://bitbucket.org"..u, n, v
		end
	end
	
	if html == "" or url == nil then
		print("update_nyaos: ページの取得に失敗しました")
		return
	end
	
	if version > nyaos.version then
		if confirm(nyaos.version.." から "..version.." に更新しますか?(y/n)", "yn") == "y" then
			local zippath = nyapath.."\\"..name
			wget(url, zippath)
			setupdate(nyapath, zippath)
			print("NYAOS終了時に更新します")
		end
	else
		print("NYAOSは最新版です")
	end
end