2010年04月04日(日) [長年日記]
■ [dream] 線路に自転車を落とした夢
さまーずの2人が、ガンキャノンみたいなので戦艦と戦っていた。でもあまり真剣ではなくふざけた感じで。
そこにおれも参戦。おれの武器は自転車で、タイヤの所から横に小さなミサイルがたくさん出る感じ。
自転車を漕ぐんだけど、そこは駅のホームで、端まで行ったらUターンせざるをえない。が、Uターンするとミサイルが味方の方に行っちゃうなあ、と思いながらUターンしていたらハンドル操作を誤り、ホームをはみ出してしまった。いかんとおれは自転車からホームへ飛び移る。自転車は線路上に落ちた。このままだと電車が来たときに大惨事になってしまう。駅員に知らせた方がいいかとも思ったが、そんな時間はないと考え自分で取りに行こうと線路へ飛び降りる直前に女の駅員さんが来て何しているんですかと怒られた。それで、その駅員さんと喫茶店で話して仲良くなった。そんな夢。
2010年04月15日(木) [長年日記]
■ [c++] Ubuntu 9.10 で Boost 1.35 と 1.42 をコンパイル
以前にBoostの1.34.1をコンパイルしたが、今日は1.35と1.42をコンパイルしたのでメモ。
1.35編
1.34.1の時と同じく、
% ./configure --prefix=/home/kenichi/boost1.35 --with-libraries=test,thread,program_options
とするとMakefileができて、
% make % make install
でいいはず、が、1.34.1と同じくコンパイルエラーに。エラーは
error: missing binary operator before token "("
と
error: ‘sscanf’ is not a member of ‘std’
の2種類。前者は1.34.1のときにも出ていたエラー。このバグが修正されたのは1.36なのか。仕方なく地道に前回と同じ方法で修正した。後者はエラーになるファイル boost/test/impl/debug.ipp に「#include <cstdio>」を追加すればよい。これでコンパイルできるようになった。
今回は修正内容にいまいち自信が無いのでパッチは示しません。
1.42編
1.42も同じようにしてビルドできると思いきや、展開したアーカイブ内に configure がなかった。代わりに bootstrap.sh というスクリプトがあったので中を見ると、configureと同じようなオプションが使える感じ。
% ./bootstrap.sh --help
でヘルプが表示される。configureと同じだな。
% ./bootstrap.sh --prefix=/home/kenichi/boost1.42 --with-libraries=test,thread,program_options
とした。すると、
Bootstrapping is done. To build, run: ./bjam To adjust configuration, edit 'project-config.jam'. Further information: - Command line help: ./bjam --help
と表示され、Makefileではなくbjamというファイルが作られた。--helpオプションでヘルプが表示されるけど長いなあ。stageって何?
% ./bjam
でコンパイルがなされ、
% ./bjam install
でインストールが行われると考えていいのかな。一応うまくいったみたい。
2010年04月16日(金) [長年日記]
■ [unix][howto] Linuxでディストリビューションのバージョンを表示
RedHat系のLinuxなら /etc/redhat-release にディストリビューションのバージョンが書かれていたけど、Ubuntuだとどうするのかと思って調べたら、/etc/lsb-release に書いてあるとのこと。
% cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=9.10 DISTRIB_CODENAME=karmic DISTRIB_DESCRIPTION="Ubuntu 9.10"
それで、更に調べると、lsb_releaseコマンドを使えば様々なディストリビューションにて同じ方法で調べられるようだった。
% lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 9.10 Release: 9.10 Codename: karmic
LSBって何の略だっけ。Linux Standard Baseか。すぐに忘れてしまうなあ。
2010年04月25日(日) [長年日記]
- ゴロゴロゴロ。
■ [book] 神の子どもたちはみな踊る (村上春樹)
読んだ。神戸で地震が起こったことに関連した短編が6編。でも地震を描いているのではなく、それをきっかけとしたよく分からない話が語られている。興味深く読めるけど、結末はいつものハテナ。3.5点。
「地震のおじさん」と沙羅は言った。「地震のおじさんがやってきて、さらを起こして、ママに言いなさいって言ったの。みんなのために箱のふたを開けて待っているからって。そう言えばわかるって」
■ [unix] Ubuntu 9.10で日本語のmanの表示が崩れるのは
Ubuntuを使っていて、いつの頃からか日本語版のmanの改行位置がおかしくなっていた。放置していたけれど、どうにも不便なので今日やっと検索してみたら、
- manの日本語段落でインデントされない (Ubuntu日本語フォーラム)
に
groff が 1.18 から 1.20 になったことが原因のバグのようです。
とあった。Ubuntu 9.10からみたい。groffのことは何も知らないが、現状簡単な対処方法はなさそう。
追記
Debian JP Announce MLにこの件と思われる問題が書かれたメールが流れてきた。
△ roff の新バージョンへの移行によって生ずる問題
- 日本語 man ページの表示で、空白や改行が意図しない表示になる.
上記 URL にある cjwatson の実装を完成させるか, 他の方法を提案する必要がある.
未だ直せる人が現れていないみたい。
■ やること
- 請求書
- 見積書
- クリーニング
2010年04月26日(月) [長年日記]
■ [windows] Excel 2007にて「/」でキーヒントが表示される
Excel 2007にて、キーボードの「/」を押すとメニュー部分にヘルプのようなものが出ることに気付いた。調べるとこれは「キーヒント」というもので、Altキーを押すと出るもののようだ。
- キーボードでリボンを操作する (Microsoft Office Online)
確かにAltでも表示されるが、/ でも表示されてしまう。なので、セルの先頭に / を入力できない。F2を押した後なら入力できるけど。
急にこういう動作に変わったように感じたが、検索するとこれで普通みたい。
- EXCELを使っていたらキーボードのスラッシュがAltキーのような動きをするようにな... (Yahoo!知恵袋)
設定で動作を変えられるみたいなんだけど、Excel 2007でどうやったらこれの設定画面に辿り着けるのかが分からない…。
追記
3年経って、遂にキーヒントを表示しないようにする設定方法が分かった。
[Officeボタン]→[Excelのオプション]→[詳細設定]の「Lotusとの互換性」欄の「Microsoft Office Excelメニューキー」欄にある「/」を削除すればよい。Lotusの機能なのか…。
設定方法はOKWaveの次の質問で知った。
■ やること
- 請求書
- 見積書
- クリーニング
2010年04月27日(火) [長年日記]
- ようやっとGitに手を出してみた。
■ [howto][unix][shell] findで .svn 以外のディレクトリを列挙する
Subversionも使う。邪魔な .svn ディレクトリは無視したい。
% find . -type d -not -path '*/.svn*'
これでできた。ただ、これだと .svnABC みたいなディレクトリがあるとそれも無視されてしまうなあ。
■ [c++][c][dev] C++用Makefileのサンプル (3)
上のコマンドを使えば、以前に書いたMakefileの
# ここにビルド対象とするディレクトリを全て書く src_dirs = src src_dirs += src/aaa src_dirs += src/aaa/ccc src_dirs += src/bbb
という部分を、
src_dirs = $(shell find src -type d -not -path '*/.svn*')
みたいに書ける。
■ やること
- 請求書
- 見積書
- クリーニング
2010年04月28日(水) [長年日記]
■ [dev][c++] google-perftoolsでプロファイリング
C++で作ったプログラムのプロファイリングがしたくて、google-perftoolsを使ってみた。バージョンは1.5。GNU gprofでもいいんだけど、GCC以外でも使いたかったので。
使い方
まず使い方を簡単にメモ。google-perftoolsにはいくつか機能があるが、使ったのはCPUプロファイラ機能のみ。
CPUプロファイラはLD_PRELOADを使って利用することもできるが、ドキュメントにその方法は非推奨とあったので、ビルド時にライブラリをリンクして使用した。単に、libprofiler をリンクすればよく、ソースコードは変更しなくてよい。
実行ファイルを作れたら、
% env CPUPROFILE=XXX ./program
などとして、環境変数CPUPROFILEに結果の出力先ファイル名を指定してプログラムを実行する。上の例だとファイルXXXが作られ、そこにプロファイリング結果が書き込まれる。結果ファイルが得られたら、それを
% pprof --text ./program XXX
のようにpprofコマンドへ渡すと、プロファイリング結果が表示される。結果の見方はドキュメントの「Analyzing Text Output」節に説明がある。
pprofコマンドにも色々機能があるがここでは割愛。図を作成できたりして楽しい。
64ビット環境での問題
google-perftoolsのREADMEには64ビット環境ではクラッシュすることがあると書かれている。また、INSTALL(バージョン1.5のアーカイブ内のものではなく、trunkにあるもの)には、64ビット環境ではlibunwindを使うよう書かれているように読めた。
はじめはlibunwindを使うようにgoogle-perftoolsをビルドしていたんだけど、そうすると長時間プロファイリングするとクラッシュしてしまい使えなかった。google-perftoolsのIssue 66に64ビットでの問題が報告されていて、これを読むと、google-perftoolsを --enable-frame-pointers でビルドすると一応動く感じ。試すとクラッシュしなくなったので、これでいいことにする。
具体的には、
- google-perftoolsをビルドする際、configureに --enable-frame-pointers を指定する。
- プロファイリング対象のプログラムをビルドする際、コンパイラに -fno-omit-frame-pointer オプションを指定する。
とする。使用するライブラリも -fno-omit-frame-pointer オプション付きでコンパイルすべきなようだけど、そうしなくてもコールグラフを構築できているみたい。あるいは、おれの使用している環境のライブラリが -fno-omit-frame-pointer オプション付きでコンパイルされていたものなのかもしれない。
マルチスレッドでの問題
CPUプロファイラのドキュメントには
In Linux 2.6 and above, profiling works correctly with threads, automatically profiling all threads.
と書かれているが、Linuxのカーネル2.6.9上でマルチスレッドアプリケーションのプロファイリングを行うと、メインスレッド以外をプロファイリングしてくれなかった。2.6.31上で試すと大丈夫っぽい。
プロファイル測定というページに、カーネル2.6.11以前ではgprofがマルチスレッドプログラムを正しくプロファイリングできないと書かれていたので、これと同じ原因なのかなと考えている。
それで、google-perftoolsのソースを読んでみたら、google/profiler.h で宣言されている ProfilerRegisterThread() を、スレッドが生成されたときに呼び出せば古いカーネル上でもうまく動きそうに思えた。試してみると想定通りに動いた。
試した結果をメモ。最後に示すプログラムをプロファイリングした結果である。
- カーネル2.6.9、ProfilerRegisterThread()なし(ソースの(A)の行をコメントアウト)。
Total: 192 samples 192 100.0% 100.0% 192 100.0% run
- カーネル2.6.9、ProfilerRegisterThread()あり。
Total: 581 samples 195 33.6% 33.6% 195 33.6% loop0 194 33.4% 67.0% 194 33.4% loop1 192 33.0% 100.0% 192 33.0% run 0 0.0% 100.0% 389 67.0% Worker::operator 0 0.0% 100.0% 192 33.0% __libc_start_main 0 0.0% 100.0% 389 67.0% boost::detail::thread_data::run 0 0.0% 100.0% 192 33.0% main 0 0.0% 100.0% 389 67.0% thread_proxy
- 使用したプログラム。
#include <iostream> #include <boost/lexical_cast.hpp> #include <boost/thread.hpp> #include "google/profiler.h" using namespace std; using namespace boost; double loop0(long count) { double result = 0; for (long i = 0; i < count; ++i) result += i + 0.1; return result; } double loop1(long count) { double result = 0; for (long i = 0; i < count; ++i) result += i + 0.1; return result; } class Worker { typedef double (*Function)(long); long count; Function function; public: Worker(long c, Function f) : count(c), function(f) {} void operator()() { ProfilerRegisterThread(); // ---- (A) cout << function(count) << endl; } }; double run(long count) { Worker w0(count, loop0); Worker w1(count, loop1); thread t0(w0); thread t1(w1); double result = 0; for (long i = 0; i < count; ++i) result += i + 0.1; t0.join(); t1.join(); return result; } int main(int argc, const char* argv[]) { if (argc != 2) { cerr << "error" << endl; return 1; } run(lexical_cast<long>(argv[1])); }
■ [dev][link] プロファイラの仕組み
プロファイラの仕組みについて、次のページが参考になるのでメモ。
- setitimer システムコールを使って簡単なプロファイラを作る (bkブログ)
- プロファイラのしくみ (steps to phantasien)
■ やること
- 請求書
- 見積書
- クリーニング
2010年04月29日(木) [長年日記]
■ [soft][unix][windows] sambaを使うと実行ビットがセットされてしまう (2)
Sambaを使っていて、WindowsからLinuxへテキストファイルをコピーすると、Linuxで見たときにそのファイルの実行ビットがオンになってしまう。この動作をなんとかしたいと思って調べていたら、以前にも同じことを書いていることを知った。このときは、create maskを0644に設定することで解決としていた。
が、今手元のSamba 3.4.0で create mask = 644 を試すと、Linux上でアクセス権を755に設定したファイルをWindowsから編集するとアクセス権が644に変わってしまう。これはこれで困る。
調べると、map archveというパラメータがあり、これがおれの求めていたものかと思ったが、試してみるとこれもうまくいかない。
動作をまとめてみる。表は、上2行のように設定すると下6行のようになるという意味。
create mask | 744 | 744 | 644 | 644 |
map archive | yes | no | yes | no |
Linuxに無いファイルをWindowsからコピー | 744 | 644 | 644 | 644 |
Linuxにある755なファイルにWindowsから上書きコピー | 755 | 755 | 755 | 755 |
Linuxにある644なファイルにWindowsから上書きコピー | 744 | 644 | 644 | 644 |
Linux上で755なファイルをWindowsから別名にコピー | 744 | 644 | 644 | 644 |
Linux上で644なファイルをWindowsから別名にコピー | 744 | 644 | 644 | 644 |
Linux上で755なファイルをWindowsから編集 | 744 | 644 | 644 | 644 |
Linux上で644なファイルをWindowsから編集 | 744 | 644 | 644 | 644 |
744,yesの組み合わせ以外では、どれも同じ結果になるみたい。
おれの望みは、
- WindowsからLinux上に新規ファイルを作成した場合、Linux上でのアクセス権が644になって欲しい。
- WindowsからLinux上のファイルを編集したとき、Linux上でのアクセス権を変更しないで欲しい。
なんだけど、後者を実現できていない。できないのかなあ。
map archiveのデフォルト値はなぜyesなのか
実行ビットがオンになるのは不便なので、map archiveのデフォルト値はnoにした方がいいと思うのに。検索すると、古いUsing Samba翻訳の5.3 MS-DOS と UNIX におけるファイルのアクセス権と属性に、
map archive オプションのデフォルト値だけが yesであり、他の二つのオプションのデフォルト値 noとは異なっていることに注意してほしい。これは、archive ビットが DOS や Windows のファイルに正しく設定されていないと、多くのプログラムが正しく動作しないためである。しかし、system と hidden 属性はプログラムの動作上に致命的な影響をおよぼさないため、管理者の判断に任されている。
と説明があった。
■ やること
請求書見積書- クリーニング
- 請書
2010年04月30日(金) [長年日記]
■ [life] コンタクトレンズを買った
見えにくくなっていたのでコンタクトレンズを新調した。今まではメガネチェーン店に直接買いに行っていたけど、今日は眼科へ。コンタクトレンズの処方を希望すると、視力の検査と目の状態の検査をしてくれた。目の状態は問題ないとのこと。眼圧の検査(プシュってくるやつ)はしてくれなかった。
検査の後で、コンタクトレンズを試着して度の調節。それで処方箋のような紙をもらえ、上のコンタクトレンズ屋へ持って行けとのこと。そういうシステムなのか。
別の店で買ってもいいんだろうけど、指示通り上のお店で買った。買ったのはメニコンZで、両目で27600円だった。
今まで使っていたのもメニコンZで、そのときの領収書があったので見てみたら36540円で買ってた。随分値下がりしているけど、ネット通販を調べると20000円以下で買える店もあるみたい。
それで、眼科は初めて行った所で、最後に診察券みたいのをくれたと思うんだけど帰って確認したら見当たらない。無くしちゃったみたい。うー。
■ やること
- クリーニング
- 請書
● Tokko [インストラクターです。 いまさらですが、2010、2013でも同じ問題で悩んでいました。 多分オプションにあるだろ..]