いやーっ、ハマったね、iconv。 たとえば下のようなことをやると、printf() での変数 outbuf は、変換後の文字列の先頭へのポインタとならない。
char *inbuf, *outbuf;
size_t inbufleft, outbufleft;
.... 省略 ....
inbufleft = strlen(inbuf);
outbufleft = BUFSIZE;
outbuf = calloc(BUFSIZE, sizeof(char));
iconv(cd, &inbuf, &inbufleft, &outbuf, &outbufleft);
printf("%s\n", outbuf);
上の場合、変換後の文字列の最後の部分 (文字 '\0')へのポインタとなっている。 outbuf に保持されるポインタの値を iconv() が書き換えている。 なので、以下のように書くと、期待していたとおりに動いてくれる。
char *in, *out, *inbuf, *outbuf;
size_t inbufleft, outbufleft;
.... 省略 ....
inbuf = in;
inbuflen = strlen(inbuf);
outbuflen = BUFSIZE;
out = outbuf = calloc(BUFSIZE, sizeof(char));
iconv(cd, &inbuf, &inbufleft, &outbuf, &outbufleft);
printf("%s\n", out);
free(out);
char* 型の変数 in, out に、それぞれの始点ポインタを保持させておくことが重要。 iconv() 実行後は out != outbuf な状態になる。 これに気づくのに数時間かけてしまった.... のである。
久しぶりに NetBSD インストールしようなんていうことで VMWare を動かしたわけですが、Network interface の bridged interface が使えなかったんですよ。 最後に VMWare 使ってから変更したことを考えてみたところ、先日に coLinux の設定で Ethernet と Win32 TAP のブリッジ接続したぐらいかなぁなんて思ってみたいのですけどね。 で、調べてわかったのですが、ネットワーク接続の「ネットワークブリッジ」の利用する項目で「VMWare Bridge Protocol」にチェックが入っていなかった…と。 そういえばブリッジ接続前には Ethernet Interface のほうには VMWare Bridge Protocol にチェック入っていたなぁ… と。
例の玄箱に MacOS X なマシンから iTunes のファイルを rsync でコピーしたのですが、ディレクトリ名で「つのだ☆ひろ」とか「加藤いづみ」とか「モーニング娘」とかの濁点のあるファイル名が UTF-8 で「つのた??☆ひろ」とかに文字化けしてしまっている。んで、そのまま iconv -f utf-8 -t euc-jp ってやると iconv stop するし。で、ちと調べてみましたよ。 文字列の中身はこのような感じでしたよ。
|つ |の |た |?? |☆ |ひ |ろ
UTF-8 |e3 81 a4|e3 81 ae|e3 81 9f|e3 82 99|e2 98 86|e3 81 b2|e3 82 8d
UCS-2 |30 64 |30 6e |30 5f |30 99 |26 06 |30 72 |30 8d
んで、この U+3099 ってなにさ? ってことで調べてみたところ
$ grep ^3099 UnicodeData-4.1.0d8.txt 3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;;
あ、Unicode にある2つをあわせて1文字になる、ってやつね。 で、調べた結果なのだが、Windows や gconv (glibc) とかは precomposed characters にのみ対応しているみたいで、Mac は 本体 + 合成文字 になるみたいだ。 何とかならないものか・・・。
でcombining char ってこのようなものがあるらしい。
302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; 302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; 302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; 302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; 302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; 302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; 3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; 309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;;
ほんとうに車買うことしか頭にない今日この頃。
まずは近辺の駐車場探し。 うちの近所(東京都渋谷区本町)だと野ざらしとかで一番安いところで25千円で高くても30千円ぐらい。 これならイケる! 理想としては、機械式で安くて雨にあたらないところがいいんですけど、渋谷区本町だと微妙に都心感が消えたところになるので、なかなか立体とかないんですよねぇ。 カシオ本社の地下とか貸してもらえるとベストなんですけどねぇカシオさん貸してくれませんかねぇ。w
んで車種選びしているのですが、値段的に Alfa 147 か RX-8 のどちらかに絞って選び中。 Lexus IS 250 は予算より100万円ぐらい高いので out of 眼中になりました。 ってことでアルファロメオに冷やかしにいったのですが、12月が決算期らしく、12月中に登録すれば20万円以上値引きしますよダンナって感じで、「1月でも同じように値引きするなら考えてもいいよ」とか言ったり。 あたらめて selespeed を試乗したのですが、エンジンの音とかはご機嫌でよろしいかったり、内装のデザインがよかったりするのですが、 RX-8 と比べると走った感覚がすこしチャチい。 RX-8 は 5MT の方に乗ってみました。 試乗したコースでは6MTのクルマとの違いはほとんど感じない程度で、タイヤの偏平率の差をサスペンションコイル+ショックアブソーバの硬さでフォローされているのかもって感じだった。
RX-8の見積もりとかもらって、家に帰って中古車価格調べてみたところ・・・。 RX-8 って1・2年たった中古車の販売価格って新車の取得価格の3分の2ぐらいになるのですか。 ってか登録2年で2万キロいかない程度で200万なら、それでもいいかもっておもったり。 だって5年ローン組むつもりだったのが3年ですむもんね。
ということで、こんどは中古車屋冷やかしに行こうかと。
別の不動産屋とかあたってみたところ、2.8万円だけどキツキツにとめてギリギリ道路に出ない程度なので車庫証明取れない、とかあったりしてワロタ。 野ざらしで3万円、屋根つきで3.5万円とかですかねぇ。 契約時に払わなければならないのが敷金1ヶ月〜2ヶ月分に仲介手数料1月分と日割り駐車料金で最大3〜4ヶ月とかだってさ。 前借りていたのは公団だったから仲介手数料なかったんだよな、そういえば。
普段、皆さんはSSHでログインをするときに、非対称鍵による認証を使われているかと思います。 SSHでパスワード認証してるとかって、運用サボっているとしか言いようがないですけどね。
んで、非対称鍵でパスワードの解かれた秘密鍵をオンメモリに保存しておく ssh-agent をまじめに使おうと思い、チラチラとスクリプトを書いていました。やりたいこととしては、こんなところ。
Windows上のputtyならばpagentを動かせば一発。 Ubuntu desktopの環境ならば、この辺も一発で完了。 フツーにシェルでログインする場合はどうするんだ?ってところで、自分でスクリプト書いてみた。
とりあえず、こんなbashスクリプトを書いておきました。
#!/bin/bash
function kick_sshagent () { ssh-agent |grep -v ^echo > "$agent_vars" source "$agent_vars" }
function start_sshagent () { agent_vars=~/.ssh/agent_vars.sh if [ "$SSH_AUTH_SOCK" != "" -a -e "$SSH_AUTH_SOCK" ] ; then # Already agent is running (e.g. ForwardAgent) return 0 fi if ! [ -f "$agent_vars" ] ; then kick_sshagent return 0 fi source "$agent_vars"
if test "$SSH_AUTH_SOCK" = "" -o ! -e "$SSH_AUTH_SOCK" ; then kick_sshagent return 0 fi unset agent_vars }
# 上記のコードを実行 start_sshagent
例えばこのファイルを ~/.ssh/start_agent.sh というファイル名にした場合、bash から . ~/.ssh/start_agent.sh と実行すれば動きます。 ~/.bashrc にこの記述を書いてしまってもよいかもしれませんね。 ちなみに .bashrc の編集をしたあと、動作確認もせずにログアウトすると、ログイン出来なくなる罠がありますので。 編集後、別の端末からログインしたり、同じ端末から localhost にログインし直すなどして、お試し下さい。
ssh-agentの基本的な使い方ですが、ssh-agentを実行すると、自分のプロセスに接続するための環境変数を shell script で記したデータを出力します。 こいつを shell の変数にするのです。 ssh-agent は起動直後は、秘密鍵のパスフレーズを保持していないので、ssh-addでパスフレーズを登録します
$ ssh-add Enter passphrase for /home/masaru/.ssh/id_dsa:
こうすることで、この先の別のマシンにSSHでログインするときに、秘密鍵のパスワードを聞いてこなくなります。
この agentの状態を、ログイン先のマシンにも転送するのが Forward Agent と呼ばれている機能です。 信頼できるマシンにのみ転送してください。 利用するには、ssh の設定ファイル ~/.ssh/config に、下記のような内容を書いて下さい。
Host * # 対象となるホスト ForwardAgent yes
ある程度、非対称鍵での運用に慣れた頃に、SSHDのパスワード認証を外しましょう。 /etc/ssh/sshd_config に「PasswordAuthentication no」って書けばOKです。
・ 名乗るほどでは [iconv()が動かなくて、悩んで、検索したらヒットしました。 outが動いていたとは気づきませんでした。 これで解..]