はてなブログ

はてなブログ へ移行しようか、はてなダイアリーからのインポート(ブログの移行) - はてなブログ ヘルプ

ええと、まず  ブログを作成 - はてなブログ で移行先 hs9587’s diary を作成、すべての人に公開 でいいや。「まだ記事がありません」と。

はてなブログ画面右上の「hs9587’s diary」リンクから「設定」で管理画面、左辺メニューの「インポート」を選ぶ、インポートもとのタブで「一般のブログ」「はてなダイアリー 」とあるの「はてなダイアリー 」を選ぶ、所要の「Rubyとか Illustratorとか SFとか折紙とか」が(だけ)でてくるので「インポート設定」釦、「インポート設定」画面になる、この辺でこの記事は保存してそっちの画面での操作を続ける

Redirect と ProxyPass

Apacheにて、ちょっとサイトの一部を別サーバにリダイレクトすることになって RedirectMatch の設定をしてみたんだけど、後段の逆プロクシ設定に上書きされて踏み潰されてしまうみたい。
http://www.hietavirta.net/blog/item/335 によれば ProxyPass避けすればいいそうだ。

Redirect permanent /subfolder/ /
ProxyPass /subfolder !
ProxyPass / http://localhost:8080/site/
ProxyPassReverse / http://localhost:8080/site/
ProxyPassReverseCookiePath /site /

PHPのロケール、又はアパッチの環境変数 LANG

PHPにて、コマンドラインを使いたかった。引数をエスケープするのに escapeshellarg() を使ったのだけど、日本語のところが剥ぎ取られてしまった、英数字(それと少しの記号文字)しか残らない。調べてみると、PHPロケールの設定に合わない文字は通さないという事の様だ。

PHPロケール

それで PHPロケールの設定なんだけど、 setlocale(LC_CTYPE, 0) で訊いてみたら「C」だった。(LC_CTYPE についてはマニュアル参照、escapeshellarg() は文字の変換としてこの定数が対応する模様)

で、どうしようか。
PHPプログラム中で「setlocale(LC_CTYPE, 'ja_JP.UTF-8')」と書くのかな、というかこの「C」の値ってどっから来たんだっけ。

アパッチの環境変数 LANG

phpinfo() に依ると、最後の方 Environmentセクションに「LANG C」とある、そこから来てるわけだ。この環境変数はどうしてるんだっけ。
Apache的には SetEnvディレクティブで明示的にセットするというやり方もあり得るが、今度はその設定を何処に書くかという話になる。

/etc/apache2/envvars

ちょっと探したんだけど、Debian 6.0 (codename “squeeze”) では /etc/apache2/envvars で設定していた(grep -r LANG /etc/apache2)。
前述 Environmentセクションにある環境変数は基本的にここで値を与えられているようだ。LANG 関係は

## The locale used by some modules like mod_dav
export LANG=C
## Uncomment the following line to use the system default locale instead:
#. /etc/default/locale

export LANG

文中、初め「the following line」の意味がよく分からなかった、二度目の export文既に Uncomment になってると。直後の default locale 行の事ですね、そうすると default locale を読み、もう一度 LANG を export する。
まあ、そっち方面じゃなくて、ここで明示的にロケールを指定することにしましょう。

export LANG=ja_JP.UTF-8

そしてアパッチ restart 。(reload じゃ効かないみたいなの注意)

カラム名に相応しくない名前

カラム名に「type」を使ったら駄目だった。new のパラメータハッシュに載せても代入されない。generate して出て来るマイグレーションではカラム出来てるので、スペック書いてて「.new :type => '云々'」とかしてみるまで気付かなかった。newした後での代入と代入後の保存は出来たが、だからといって使うべきでは無いだろう。

参考

文字列の左に文字列を追加する

String を左にのばすにはどうしたら良いんだろう。

str = 'asdf'; str[0,0] = 'poiu'
str = 'asdf'; str[/\A/] = 'poiu'
str = 'asdf'; str.sub(/\A/, 'poiu')

くらいか、文字列自身を破壊的に(左に)伸張するのでなく、新しい文字列を返すのは「sub(/\A/)」

'asdf'.reverse.+('poiu'.reverse).reverse

はちょっとやり過ぎかな

文字列.send に与える用なのでやっぱり「sub(/\A/)」にしよう。

map が inject みたくシンボルでメソッド名受けてくれないかな

Enumerable#map が同#inject みたく Symbolでメソッド名引数に受けてくれないかなあと思った魔改造
# これどこかで要望にあがってたような気もするけどどうだったかな

module Enumerable
  def map(*vars, &block)
    (vars.size>0 ? collect{|e| e.send *vars} : self).collect &block
  end # def map(*vars, &block)
end # module Enumerable

或いは一行で書くなら

module Enumerable; def map(*vs, &b); (vs.size>0 ? collect{|e| e.send *vs} : self).collect &b; end; end

こんな感じか

ちょっと追記

Enumerable#map の改造では Array#map まではこうならない。Arrayクラスは何か特別な事してるのかな。

class Array; def map(*vs, &b); (vs.size>0 ? collect{|e| e.send *vs} : self).collect &b; end; end

直接 Arrayクラスを操作する。

ジェムの win32console を Ruby1.9.1 で(マジックコメント)

「spec -c」でスペックのカラー表示をして試るのだが、win32console の所でエラーが起きてしまう。環境は、Windows XP Pro. SP3 にartonさんの Ruby 1.9.1パッケージ(ActiveScriptRuby and Other packagesより)をいれたもの、ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mswin32]。(artonさんいつも有難うございます)
試しに irb してみるがエラー、「invalid multibyte char (US-ASCII)」。

[云々]>irb -r rubygems -r win32console
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32console-1.2.0-x86-mswin32-6
0/lib/win32console.rb:1:in `require': C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1
/gems/win32console-1.2.0-x86-mswin32-60/lib/Win32/Console/ANSI.rb:324: invalid m
ultibyte char (US-ASCII) (SyntaxError)
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32console-1.2.0-x86-mswin32-6
0/lib/Win32/Console/ANSI.rb:324: invalid multibyte char (US-ASCII)
C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32console-1.2.0-x86-mswin32-6
0/lib/Win32/Console/ANSI.rb:324: syntax error, unexpected $end, expecting ')'
              s.tr!("�≠ヤ・?炎牛誌髄駐舶沫・圀撼氈...
                       ^
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32console-1.2.0-
x86-mswin32-60/lib/win32console.rb:1:in `<top (required)>'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb/init.rb:262:in `require'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb/init.rb:262:in `block in
load_modules'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb/init.rb:260:in `each'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb/init.rb:260:in `load_modu
les'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb/init.rb:20:in `setup'
        from C:/PROGRA~1/RUBY-1~1.1/lib/ruby/1.9.1/irb.rb:53:in `start'
        from C:/PROGRA~1/RUBY-1~1.1/bin/irb.bat:20:in `<main>'

文字コードですね、所要のファイル、1.9系の gem の lib の Win32\Console\ANSI.rb 冒頭にマジックコメントを書いてやる。

# -*- coding: CP1250 -*-

コード指定は「CP1250」とした、ANSI.rb のエラー箇所ではその辺の判定をしてるっぽい。「Shift_JIS」では駄目でした。
で、また「irb -r rubygems -r win32console」今度はエラーダイアローグ「msvcrt-ruby18.dll」が見付りませんとの事、ダイアローグに答えれば irb 自体は起動する。ファイル見ると、1.9系の binディレクトリに「msvcrt-ruby191.dll」はあるんだけどね。「msvcrt-ruby18.dll」の方は 1.8系の binディレクトリに普通に存在する、1.9系コンソールではそっちへのパスを通してないので見付らないのでしょう。でもなんで 1.8系の dll を探しに行くかな。

そして「spec -c」でのカラー表示は出来るようになった、コマンド実行の毎にエラーダイアローグ出るけど。

それでもいいのか

(その後追記)

ちょっくら msvcrt-ruby191.dll をコピーして、191 を 18 に改名して誤魔化してみようとしたけど失敗、「lib/Console.so: [BUG] Segmentation fault」。
エラーメッセージみて lib/Win32/Console.rb を読んでみたんだけど、無いなら無いなりに何とかしてるみたい。Console.so の require に失敗したらピュアRuby版をとってくる(けどちょっと遅いよ)みたいな。
$DEBUGモードで実行するとその旨言ってくれるし、動くからいいや。

[云々]>irb -d -rrubygems -rwin32console
Exception `LoadError' at C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32co
nsole-1.2.0-x86-mswin32-60/lib/Console.so:0 - 126: 指定されたモジュールが見つか
りません。   - C:/PROGRA~1/RUBY-1~1.1/lib/ruby/gems/1.9.1/gems/win32console-1.2.
0-x86-mswin32-60/lib/Console.so
Using slower, non-DLL Console.rb
irb(main):001:0>