--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009/06/29

vimperator 2.1

出たっぽい。Release Note をぼんやり眺めていると、

(snip)

  • add 'encoding'

(snip)

Vimperator 2.1 released! - vimperator labs

encoding 指定が追加されていた。最近これで困ってて、毎度 "set go+=m, Alt-v, c, 文字コード選択" を繰り返していた。この機能追加はうれしい。

ふとその help を見てみると、fileencoding も載っていた。こっちは前からあったりしたのかな。

2009/06/21

dzen2 に日本語が出るようになった理由

単純な話で、xmonad-contrib 側ですでに UTF8 エンコードされていただけなのであった。UTF8 サポートオプションをつけて xmonad-contrib をビルドすると、そういう動作になる。少なくとも DynamicLog は。

XMonad.Util.Font

#if defined XFT || defined UTF8
import Codec.Binary.UTF8.String (encodeString, decodeString)
#endif

(snip)

encodeOutput :: String -> String
#if defined XFT || defined UTF8
encodeOutput = encodeString
#else
encodeOutput = id
#endif

2009/06/17

dzen2 に日本語が出るようになった

xmonad の LogHook から dzen2 に出力するようにしていたのだけど、どうしても化けていた日本語が出るようになった。確認はしてないけど、dzen2 は xft 対応版じゃないとだめかも。

日本語が化けていたときの xmonad.hs はこんな感じだった。

import qualified System.IO.UTF8 as U (hPutStrLn)
(snip)
main = do h <- spawnPipe $ dzen2
          xmonad $ defaultConfig {
                     (snip),
                     logHook = myLogHook h,
                     (snip)
                   }

dzen2 = (snip)
myLogHook = dynamicLogWithPP . myPP
myPP h = defaultPP {
           (snip)
           ppOutput = U.hPutStrLn h
         }

ごちゃごちゃと色々やってるけれど、注目すべきは System.IO.UTF8 モジュールの出力関数を使っているところ。UTF8 の入力を期待している dzen2 に出力したいのだから、当然 utf8-string の出力関数を使おうとする。しかしこれでは dzen2 に出力される文字が化ける。

ではどうするのかというと、普通の IO モジュールを使う。

import IO (hPutStrLn)
(snip)
main = do h <- spawnPipe $ dzen2
          xmonad $ defaultConfig {
                     (snip),
                     logHook = myLogHook h,
                     (snip)
                   }

dzen2 = (snip)
myLogHook = dynamicLogWithPP . myPP
myPP h = defaultPP {
           (snip)
           ppOutput = hPutStrLn h
         }

これでなぜか日本語が出るようになり、カレントウィンドウのタイトルが日本語でも化けることがなくなった。残念ながら、裏付けであるとかが何もない。ghc と xmonad のバージョンは、

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.10.1
$ xmonad --version
xmonad 0.8.1

ちなみに hPutStrLn は XMonad.Util.Run モジュールを import すると、System.IO モジュールのものが一緒に import される。

2009/06/17

Ubuntu/NetBSD on VAIO P

昨日サラッと「Vista なんてアンインストールするから...」と書いたけど、調べてみるとそんなに簡単ではない模様。ただどれも 2 月の情報だから、最近はまた事情が違うのかも。

2009/06/15

VAIO P

ヨドバシカメラに行ったついでに, PC コーナーを見てまわってきた. 特に目的もなく, 最近のノート PC を眺めたり, Mac OSX の bash で遊んだりしてきたのだけど, VAIO P なるものがあった. あのポケットに入れた広告の PC だ.

正直全然興味なかったのだけど, 触ってみると思ったよりはよかった. まず, 画面が横長なのがいい. 縦にスクロールするのは全く気にならないけど, 横にスクロールはしたくない. 横長だと縦スクロールが大変になるけど, 横スクロールの機会は減るはず.

あとはまぁふーんって感じなんだけど, 格好いいとか, コンパクトであるとか, 案外スペックがいいとか, そういう印象. Vista だったからなのか, メモ帳でテキスト書いてるだけで悲鳴を上げそうになってたのがちと気になったけど, アンインストールすればいい話なので, それはどうでもいい.

気になったのはキーボード. 真っ平らなせいか, なんか打ちにくかった. 狭さは感じなかった. これは筐体が横長なおかげだと思う.

とは言っても結構印象がよく, わりとほしいなーと思った.

2009/06/05

C++ の参照

C++の場合、リファレンスは初期化時のみ参照先の指定が可能で、 以降、参照先を変えることはできません。(ご存知の通り、)ポインタは アドレスの再代入により何度でも参照先を変えることができます。 既にポインタがあるので、リファレンスに上記のような制限が加えられて いるのだと解釈しています。

Ruby(Java)とC++のリファレンス(参照)の違い - エンジニア&Rubyistの徒然なるままに

できると思うんだけど。

#include <iostream>

class Foo {
    int x_;
public:
    explicit Foo(int x) : x_(x) { }
    int val() { return x_; }
};

int main(int argc, char** argv) {
    using namespace std;

    Foo f(1);
    Foo& fr = f;
    cout << fr.val() << endl;

    Foo g(2);
    fr = g;
    cout << fr.val() << endl;

    // fr = 0; // 無理

    return 0;
}

無理ってコメント入れてる行はコンパイルエラーになる。C++ のリファレンスは実体ありきだから、ポインタみたいに NULL ポインタを指させるようなことはできない。ポインタは "ある型の実体を指すアドレス値の型" だから、アドレスの代入によっていくらでも参照先を替えることができる。と思う。

2009/06/03

template とコピーコンストラクタ

参照カウント方式でポインタの破棄タイミングを管理するスマートポインタ、いわゆる shared_ptr を実装しててはまった。コピーコンストラクタはコピーコンストラクタで素直に用意しておきましょうという話。

はじめ、T 型に代入可能な U 型の shared_ptr を受け入れるコンストラクタを用意していた。つまりこんな感じ。

template<class T>
class shared_ptr
{
    template<class U>
    shared_ptr(const shared_ptr<U>& src);
};

もちろんこのコンストラクタの中では、カウントとポインタの共有、そして最も重要な参照カウントのインクリメントが行なわれる。T 型同士の時でも、なんとなく呼ばれそうだし、コピーコンストラクタの代用になりそうだ。しかし、これはまずい。

vector<shared_ptr<Foo> > v;
v.push_back(shared_ptr<Foo>(new Foo()));

一見問題ないように見えるけど、問題ありあり。というのも上で宣言した shared_ptr のコンストラクタが呼ばれなくて、デフォルトのコピーコンストラクタが呼ばれてしまう。普通のコピーコンストラクタが呼ばれれば、当然参照カウントのインクリメントもされない。参照カウントがインクリメントされなければ new した Foo も即刻破棄される。v には期待したオブジェクトではなく、 ラップした Foo が削除された、shared_ptr の残骸が残っているだけ。

じゃあどうすりゃいいのかと言うと、冒頭に述べたとおり、素直に普通のコピーコンストラクタを用意する。というかそもそもコピーコンストラクタってこのシグネチャ(値か参照か、const か非 const かは関係なかったような)しか認められないのかな。

template<class T>
class shared_ptr
{
    shared_ptr(const shared_ptr& src); // 追加
    template<class U>
    shared_ptr(const shared_ptr<U>& src);
};
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。