メモの日々


2009年04月08日(水) [長年日記]

  • 久〜しぶりにC++を使ってる。

[c++] g++でCP932なソースをビルドしたらlexical_cast.hppでエラー

Ubuntu 8.10上でCP932で書かれたC++のソースコードを g++ に「-finput-charset=cp932」オプションを付けてビルドしようとしたら、boost/lexical_cast.hpp を include している個所でエラーになってしまった。

調べると、lexical_cast.hpp 内の最初のコメント内に

// who:   contributed by Kevlin Henney,
//        enhanced with contributions from Terje Sletteb■,

とあって、■の所に0xf8が書かれておりそこで文字コード変換に失敗してしまうようだった。

ひとまず問題の文字を削除してしまうことで対処。

でも、include先のソースの文字コードは不明なケースがあるので、g++(gcc) の -finput-charset を使うのはよいアプローチではない気がしてきた。

[c++] g++ではおかしなフレンド関数がエラーになる

WindowsではビルドできていたソースをUbuntuのg++でビルドしているんだが、フレンド関数の所でエラーになった。

フレンド関数なんて使ったことないので知らなかったのだが、調べると関数に対してクラスのプライベートメンバへのアクセスを許可したいときに使うようだ。

んで、ビルドエラーになる箇所を見ると、そのクラスと無関係なフレンド関数を使おうとするとエラーになるみたい。サンプルを作ってみた。

class A {
    friend void f(A& a); // Aと関係している
    friend void g();     // Aと無関係
private:
    int secret;
};

int main() {
    A a;
    f(a);
    g(); // ここがエラーになる
    return 0;
}

void f(A& a) {
    a.secret = 100;
}

void g() {
}

これをg++でコンパイルすると、g()を呼び出す所でエラーになる。

$ g++ --version
g++ (Ubuntu 4.3.2-1ubuntu12) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ -Wall friend.cpp
friend.cpp: In function ‘int main()’:
friend.cpp:11: error: ‘g’ was not declared in this scope

Windowsのコンパイラだとエラーにならないようだし、別にエラーにしなくてもいい気がするが、実装上の問題なのかな。 どうせなら呼び出し箇所ではなく宣言箇所でエラーになればいいのに。

[book] ジェネラル・ルージュの凱旋 (海堂尊)

読んだ。救命救急センターの「将軍」速水部長はできる男だという話。事件は何も起きなくて、病院内での政治の話が続く。ジェネラル・ルージュの凱旋(上) (宝島社文庫)(海堂 尊) ジェネラル・ルージュの凱旋(下) (宝島社文庫)(海堂 尊)

現場を率いる速水と対立する規約第一沼田助教授の振る舞いが、ソフトウェア開発現場を改善しようとするISO 9000活動とダブって見えて興味深かった。3.5点。

やること

  • 換金

2009年04月10日(金) [長年日記]

[shell] 更新されたファイルだけを文字コード変換

g++の-finput-charsetオプションを使うのはやめて、ビルド時に文字コード変換をするようにした。

更新されたファイルだけを文字コード変換するBashスクリプトを書いたのでメモしておく。

SRC_DIR2=src_utf8
mkdir -p $SRC_DIR2
cd src
for path in `find * -name '*.h' -o -name '*.cpp'`; do
    if [ $path -nt ../$SRC_DIR2/$path ]; then
        cp --parents --update -p $path ../$SRC_DIR2/
        nkf --ic=CP932 --oc=UTF-8 --overwrite ../$SRC_DIR2/$path
    fi
done

不格好。

  • srcディレクトリの親ディレクトリで実行する。src配下の拡張子がhまたはcppのファイルを$SRC_DIR2にコピーし文字コードを変換する。ただし、コピーするのは$SRC_DIR2にあるファイルよりも新しいものだけ。
  • [ file1 -nt file2 ] でfile1がfile2よりも新しいかを判定できる。(http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBR
  • cpは--parentオプションを付けると親ディレクトリ付きでコピーしてくれる。また、--updateオプションを付けるとファイルが新しい場合だけコピーするようになる。その前のif文で判定しているんだから--updateは不要か。
  • nkfの--overwriteオプションはファイルのタイムスタンプを更新しない。

2009年04月16日(木) [長年日記]

  • わりと暇。

[service][web] はてなブックマークFirefox拡張が動かなかった

はてなブックマークFirefox拡張がリリースされたのでインストールしてみたが、ほとんどの機能で「ログインする必要がある」と言われてしまい使えない。促されるままログインの手順を踏んでも、「すでにログインしています」という画面にリダイレクトされるだけで挙動は変わらない。

ヘルプを読むとFAQがあり、そこに「ログインしているのに「はてなにログイン」とツールバーに表示されてしまう」という項目があった。どうやら次の点に該当するようだ。

Cookie を受け入れていない/送信していない
Firefox拡張はログイン状態の確認のため、Firefox ブラウザでのサードパーティ Cookie の受け入れを必要とします。Firefoxブラウザの「ツール」 > 「プライバシー」> 「Cookie」から hatena.ne.jp ドメインの Cookie を(サードパーティ Cookie であった場合でも) 保存できるよう設定をお願いします。なお、標準の設定では Cookie を受け入れる設定になっています。

おれのFirefoxでは「サードパーティのCookieも保存する」のチェックボックスが外れていた。Firefoxの設定ダイアログだと、hatena.ne.jp だけサードパーティCookieの保存を許可するような設定はできないように思えたが、ダメもとで「例外サイト」に hatena.ne.jp を追加したら「はてなブックマークFirefox拡張」が動くようになったようだ。「サードパーティのCookieも保存する」のチェックはオフのまま。Firefoxの設定画面分かりにくい。