2011/02/28

HTML::Shakanで文字化けしない方法

VERSION

関連モジュールのVERSIONは以下の通り
HTML::Shakan 0.09
Formvalidator::Lite 0.23

対処方法

先に現状での対処方法を書きます

HTML::ShakanのField定義はbinary stringsで行う

但し、この対処方法では以下の状態になる

  • $form->get_error_messagesはtext strings
  • $form->renderはbinary strings
  • use utf8しない状態なのが気持ち悪い

文字化けの原因

Shakanで使用するField定義データにtext stringsを使用すると、HTML生成時にbinary stringsと結合されるため文字化けが発生する

各モジュールの文字列の扱い

FormValidator::Lite

  • FV::L::Message::jaはuse utf8しているのでtext strings

HTML::Shakan

  • 内部でencode, decodeはしない
  • HTML生成時はbinary stringsとField定義データ、requestデータとの結合

希望の動作

  • Field定義はtext stringsで行いたい
  • $form->renderはtext stringsを返す
  • $form->get_error_messagesもtext stringsを返す

2011/02/27

perlbrewでinstallしたperlをquickrun.vimで使用する方法

解決 2011-11-05 16:58

再度調べたらさっくりと解決したので追記

shellにzshを使っているなら、.zshenvにperlbrewのsourceを設定するとよい

source $HOME/perl5/perlbrew/etc/bashrc


誰か教えてください!

とりあえず~/.vimrcに↓を書いてしのぐ
let g:quickrun_config={'perl': {'command': '/Users/yourname/perl5/perlbrew/perls/perl-5.12.2/bin/perl'}}

2011/02/26

[修正済み] Plack::Request + HTML::Shakan 0.08 or 0.09 + FormValidator::Lite 0.23の組み合わせで空のFileFieldを扱うとdieする

追記 2011/03/01
pull requestを送ったところmergeして頂きました。ありがとうございます!
FormValidator::Lite 0.24で修正されています。
近いうちにCPANにもアップされるんじゃないでしょうか。


追記 2011/02/28
forkして治したけど、まだpull requestは送ってない
git://github.com/ysasaki/formvalidator-lite-perl.git



今日は眠いので明日に治すかもしれない

多分、以下の条件の場合にdieする

  1. FILE_*をconstraitに指定している
  2. Plack::Request使用
  3. FormValidator::Liteが0.23


Plack::RequestのparamまわりとFormValidator::Liteのファイル関連のconstraintのチェックタイミング、HTML::Shakanのuploadsの挙動あたりの問題っぽい。
Shakanだけ変更しても直せないかもしれない。

再現コード

2011/02/20

Hokkaido.pm #4のスライドと感想

Hokkaido.pm #4に参加しました。 参加者、ゲストのyusukebeさん、スタッフの皆様お疲れ様でした。

まずは今回の発表したスライドを貼っておきます。
CPAN/便利モジュール


View more presentations from aloelight.

反省会や懇親会等で聞いたこと等を忘れる前に書いておきます。

  • 会計は誤差がほとんどなかった
  • 反省会はスタッフっぽい人だけでなく、他の人も参加すべきではないか
  • 懇親会は終わった後そのままなだれ込める店が望ましい
    • #1はそうだった
    • 今の会場だと17時で閉まるので、やってる店が近くにない
    • 会場を移すべきか?
    • 金曜の夜にやるのも手(東京ではこれが多いらしい)
  • ハンズオンは思ったよりも人がくる
    • 高校生の彼はまたやって欲しいとか言ってた
    • ライブコーディングが見たい
    • 準備が大変なので何をやるか予め希望を取るとかしたほうがいいかも
  • 次回はスピーカーをやってくれそうな人がいる
  • 地元の人がそろそろ40分枠でやってみてもいいんじゃないか
  • 呼んでみたいゲストはまだまだ模様
    • JPAのゲストの派遣支援はかなり嬉しい
  • ustがピンクだった

2011/01/12

TeraTerm Menuからパスワード入力待ちでTeraTermを起動する方法

昨日ヘルプを読んで、初めて気がついたのでメモ
  1. TeraTerm Menuで通常通りにホスト名、ユーザ名、SSHの鍵を指定する
  2. 詳細設定をクリックして、オプションに/ask4passwdを追加
これでリストから起動するとパスワード以外が入力された状態になるので、
後はパスワードを入力してサーバにログインする

2010/11/28

sedとperlで置換処理をするとファイルのownerが変更される

HTMLの置換処理をしていたときに,全ファイルのownerが変更されていたので気になって調べたのでメモ.

実行したコマンド

$ find . -type f -name "*.html" | xargs perl -i -pe 's/aaa/bbb/g'

perlをsedに置き換えても同様の現象が起きたので,内部で何が起きているのかstraceで確かめてみた

perlの場合

下記コマンドを実行して,perl-outの中身を確認

$ sudo strace -o perl-out perl -i -pe 's/aaa/bbb/' a.txt 
open("a.txt", O_RDONLY|O_LARGEFILE)     = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbf96cae8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(3, 0, [0], SEEK_CUR)            = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0
fcntl64(3, F_SETFD, FD_CLOEXEC)         = 0
unlink("a.txt")                         = 0
open("a.txt", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbf96cae8) = -1 ENOTTY (Inappropriate ioctl for device)
_llseek(4, 0, [0], SEEK_CUR)            = 0
fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fcntl64(4, F_SETFD, FD_CLOEXEC)         = 0
fstat64(4, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fchmod(4, 0100644)                      = 0
fchown32(4, 1000, 1000)                 = 0
read(3, "ddd\nbbb\nccc\n", 4096)        = 12
read(3, "", 4096)                       = 0
write(4, "ddd\nbbb\nccc\n", 12)         = 12
close(4)                                = 0
close(3)                                = 0
exit_group(0)                           = ?
  1. a.txtをO_RDONLYでopen (fd=3)
  2. a.txtをunlink
  3. a.txtを今度はO_WRONLYでopen (fd=4)
  4. fd=3のa.txtからreadして,fd=4のa.txtに書き込み
  5. fd=4, fd=3をclose

2でunlinkして,同じ名前のファイルを再度作成しているのでownerがかわる模様

sedの場合

こんな感じのコマンドを実行して

$ sudo strace -e trace=open,close,rename,write,read -o sed-out sed -i 's/aaa/ddd/' a.txt

set-outに吐き出されたログを確認

open("a.txt", O_RDONLY|O_LARGEFILE)     = 3 
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 4 
read(4, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 337 
read(4, "", 1024)                       = 0 
close(4)                                = 0 
open("./sedwfohhg", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4 
read(3, "ddd\nbbb\nccc\n", 4096)        = 12
write(4, "ddd\n", 4)                    = 4 
write(4, "bbb\n", 4)                    = 4 
write(4, "ccc\n", 4)                    = 4 
read(3, "", 4096)                       = 0 
close(3)                                = 0 
close(4)                                = 0 
rename("./sedwfohhg", "a.txt")          = 0 
close(1)                                = 0 
close(2)                                = 0 
  1. a.txtをopen
  2. 一時ファイルとして./sedwfohhgをopen
  3. a.txtをreadして,中身を./sedwfohhgにwrite
  4. a.txtをclose
  5. ./sedwfohhgをa.txtにrename

renameしちゃっているのでownerが変わることになる

2010/11/21

Hokkaido.pm #3の感想

スタッフとスピーカー,参加者の皆様,お疲れ様でした.
初心者向けと銘打ったおかげか大変盛況で,今後もこれが続くとよいな思っております.

とりあえず箇条書きでざっくりと
  1. Perlのことを誰に聞けばいいかわからない
  2. Perl Mongerは怖そう 
  3. 初心者向けじゃないと来なかった
  4. 他の言語経験者向けの本ってあるのか
1~3は今後もHokkaido.pmの活動を続けていけば解決してくれるんじゃないかと楽観的に考えてます.

4はPerlクイックリファレンスが良さそうだけど,実際に中身を見たことがない.2000年に出版なんで今だとちょっと内容が古いんじゃなかろうか.
プログラミング初心者には初めてのPerlでいいだろうけど,他言語の経験者にはまどろっこしい気がして勧めづらい

後は私のトークで使ったスライド貼っておきます.