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の設定画面分かりにくい。