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) を除外しておく。
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')"
-8896204801.8 では結果が狂っていたが、1.9 では正常な値を返す。
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 のバージョン
$ 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にあります。
主な変更点
- 正規表現エンジンを鬼車に入れ換えた
- 正規表現での置換に括弧の内容を使える (
$$,$&,$0~9)
- 正規表現での置換に括弧の内容を使える (
- 文字エンコーディング判定に nkf も利用するようになった
- Shift_JIS, UTF-8, EUC-JP, ISO-2022-JP の判定に使用
- 文字エンコーディングが判らなかった場合に Ruby のマジックコメントを参考にするようになった
バイナリはwantora / greenpad / Downloads — Bitbucketに一応あります。が、まだアルファ版なので利用には注意が必要です。
f4b24 用のミニパネルプラグインを修正してみた
f4b24 用のミニパネルプラグインに minipaneu.fgp がありますが、うちの Windows 7 では開くたびに少しずつ幅が減ってしまいます。*1
その不具合を修正してみました。修正の差分はchangeset / dc4830249609にあります。
バイナリも作成しましたので、wantora / fittle-minipane / Downloads — Bitbucketからダウンロードできます。
一部のテストだけ実行したい
例えば、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をビルドしてみた。その作業メモ。
(しかし、どの拡張ライブラリがビルドされていないのか簡単に確認する方法はないのだろうか。)
変数
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
参考文献
NYAOSの更新をするコマンドを修正しました
NYAOSの更新作業を補助するLuaスクリプトです。以前に作ったもの*1が動かなくなっていたので修正しました。
つかいかた
ソースコード
-- 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