perlでの日本語の取扱
昔と違っていろいろweb上に有用な記事がある.
これがいいかなあ.
http://www.rwds.net/kuroita/program/Perl_unicode.html
ほかにも,「perl encode 日本語」とかでgoogleを引くといろいろ出てくる.
STATUS_ACCESS_VIOLATION
cygwin をアップデートしたら,emacs の中で STATUS_ACCESS_VIOLATION が頻発するようになった.
http://x.cygwin.com/docs/faq/cygwin-x-faq.html の,9.8 (から誘導された9.16) に従って,rebaseall と peflagsall を実行したら直った.
Windows7のfile permission
変なタイトルだが,要は NTFS のファイルアクセス権の話.
Windows XP で運用していたマシンに Windows 7を入れた.特にアップグレードインストールをしたつもりではなかった (なかった...よなあ) のだが,いままで使っていたファイルがそれなりに残っていて,それなりに良かった反面,ファイルの使用権関係でたくさんトラブルも引き起こした.わかったことをメモしておく.
GUIから変更しようとすると大変になることが多い.死ぬほどボタンを押す羽目になったり.コマンドラインから行うのが得策.コマンドプロンプトを起動するとき,「管理者として実行」としないと,できないことがいろいろある.
アクセス権の変更は所有者にしかできない.したがって,まず所有者になる必要がある.takeown コマンドを使う.対象は「/F path」で指定する./Rをつけると再帰実行.例:
> takeown /R /F C:\tmp
変なpermissionがついている場合は,それを消したいかもしれない.その場合,以下のように実行.
> icacls C:\tmp /reset /t > icacls C:\tmp /inheritance:r
「/inheritance:r」によって,ACLの上位からの継承が無効になる./resetで各位置で指定しているACLが廃棄される./tは,再帰指定.
最後に,適当なACLを指定する.cygwinで使う場合はこんなものではないだろうか:
icacls C:\tmp /grant myname:(CI)(OI)F SYSTEM:(CI)(OI)F Administrators:(CI)(OI)F Everyone:(CI)(OI)RX "CREATOR OWNER:(CI)(OI)F" "CREATOR GROUP:(CI)(OI)RX" None:(CI)(OI)RX
もちろん,「myname」は,自分のログイン名.「F」がフルコントロールで,「RX」が読み取りと実行.「(CI)」と「(OI)」は,それぞれフォルダ(container)に対する継承指定とファイル(object)に対する継承指定.cygwinは,グループはデフォルトでNoneにするようだし,othersに対するパーミッションは,Everyone を使っているようである.
xml-rpc
ちょっと必要があって,xml-rpc をつかうことになった.perl インタフェースが何種類もあるようなのだが,どうも,RPC::XML というのが一番充実しているふうであるので,使ってみた.だいたいは期待したように動作しているのだが,ご多分にもれず(?)日本語がうまく動かない.いや,サーバから日本語データを引っ張ってくるのは問題なのだが,日本語データを送ろうとするとうまくいかない.
$param = "ascii data"; $resp = $xmlrpc->send_request('methodname', $param);
は,ちゃんと動くのだが,1行目を
$param = "日本語データ";
とすると,Wide character in subroutine entry at /usr/lib/perl5/site_perl/5.10/RPC/XML.pm line 409. といって怒られる.
この「Wide character in ....」というのを見ると,それだけで絶望的な気分になるのだけれど,まあ,見てみるか,と思って Google を引くと,すばらしいまとめがあることがわかった: http://www.rwds.net/kuroita/program/Perl_unicode.html ありがたいことである.
で,あらためて怒られている409行目やその呼び出し元などを見てみると,utf8::downgrade() なる関数に,この "日本語データ" という string がわたっていることがわかる.http://perldoc.perl.org/utf8.html を見てみると,どうも,ここには Latin-1 しか渡せないように見える.うーん.こりゃ,一般のUTF-8をサポートしているわけではないということなのかね.
というか,どうも,これを呼んでいるのは,perlの内部表現たるstringでなくて,バイトシークエンスとしてみたいからのようだ (違うのかな〜?).だったら,utf8::downgrade() じゃなくて,utf8::encode() を使ったらいいのでは,と思って,全部書き直してみる.(実際には,utf8::downgrade() が直接書いてあるのではなく,別の関数を utf8::downgrade() に定義し直していたので,1箇所直せばすむ.)
すると,ここは通過して,サーバにデータが送られるようになった.だが,サーバからエラーが返る.調べると,生成される XML データの先頭に encoding="us-ascii" と書いてある.なんのこっちゃ.(この辺で,やっぱりあんまり東洋のことなど考えていないのね,という気持ちになってくる) 幸い,これは,RPC::XML::ENCODING なる変数の値に "UTF-8" を設定しておけばよい,とのこと.
以上で,とりあえず動作するようになった.RPC::XML を1箇所書き直しているのが問題だけど.実際は,書き直さなくても,"日本語データ" を Encode::encode_utf8("日本語データ") で置き換えると動作するのだが,なんかあんまりだなー,と思う.
ランダムな文字列の生成
cat /dev/random \ | head -c 1024 \ | perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)'
1024のところは適当に
ファイアウォール外のMS Winクライアントから,MS Winファイルサーバにsshを使って接続
表題の件 (共有フォルダへの接続) をやりたいと思っていたのだが,方法がわからなかったのだけれど,
http://datafarm.apgrid.org/software/html/ja/user/smboverssh.html
に書いてあった.感謝.ポートフォワードするのは良いが,MS Winのエクスプローラからはアドレスしか指定できないので,マシンを2台使えないとだめだよな―,と思っていたのだけれど,「仮想ネットワークインタフェース」という手があるんですね.
上記のサイトからのコピーだが,手順は以下の通り.
まず,セットアップとして,以下を行う.
- コントロールパネルから,「ハードウェアの追加」を選び (Windows7 では,コマンドプロンプトを管理者権限で起動して hdwwiz.exe を実行),ネットワークアダプタのMicrosoft Loopback Adaptorというのをインストールする.
- すると,「ネットワーク接続」に,該当項目が現れるので,適当にリネームして,プロパティを選び,以下のように設定する.
アクセスするときは,次のようにすればよい.