メモの日々


2003年04月28日(月) 岐阜の林道に白装束のパナウェーブ研究所

生活

  • アルバイトでやっと担当分を仕上げたのでリリース。作ったのはほんのちょこっと。

[web] B.2.2 URI属性値のアンパサンド記号 (HTML 4.01仕様書)

フォームデータをサーバへ送るとき「&」じゃなくて「;」で区切れという話。きたさんの日記から辿った。おれは問題点を理解できていない。

やること

  • ご飯を炊く
  • 家賃を払う
  • JavaWorldを買う

2004年04月28日(水)

  • 朝型になるべく5:30起きして巡回中。
  • 家の鍵を開けようとして定期券を出してしまうことはたまにあります。
  • 8:00巡回終了。ふー。
  • ライブリンクのPCなくなるのか。ライブリンク、部を挙げて導入を試みたのに見事に失敗したなあ。全然アジャイルじゃなかったものね。

[java] 第3回 Strutsをチーム開発に生かす「XDoclet」の活用 (IT media)

なんとなくメモ。

Struts利用で問題視される設定ファイルの肥大化、そして複数人でのファイル共有。これらの問題を解決すべく、XDocletは開発効率アップを実現してくれる。この特集では、Struts中級者へ向けた具体的な手法を解説していく。

む、とらねこ放浪記にちょこっと反論があった。

やること

  • プリンタ処分
  • 靴磨き
本日のツッコミ(全1件) [ツッコミを入れる]

しみず [あるある。逆に改札で家の鍵を出したときは周りに人がいて恥ずかしいです。]


2005年04月28日(木)

[php] PHP Fatal error: Call to undefined function: preg_match()

Smartyを使ってみたがブラウザに何も表示されない。Apacheのログをみたら表題のエラーが出ていた。

このエラーを直すには devel/php4-pcre をインストールする必要があるみたい。インストールしたら動いた。

pcreって知らなかったんだけど、Perl Compatible Regular Expressionsという正規表現ライブラリのようだ。

[php] PHP、Smarty、Mojavi

右も左も分からん。いくつかサイトをメモ。

(追記)

やること

  • リンク元のスリム化
  • tDiaryバージョンアップ
  • FSWikiバージョンアップ
  • オーブンレンジ用べんり棚
  • ブラウンの安い電動歯ブラシ買う
  • 蛍光灯を捨てる
  • 健康保険料
  • 定期券

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] プロファイラの仕組み

プロファイラの仕組みについて、次のページが参考になるのでメモ。

やること

  • 請求書
  • 見積書
  • クリーニング

2012年04月28日(土)

[life] 歯医者 10回目

親知らず抜歯後の痛みは木曜日の午後に消えた。

今日は抜歯時に縫った所の抜糸。傷口に問題ないようだが、穴が塞がるには1~2ヶ月掛かるとのこと。長い。

全体の歯を観られ、上の2本の親知らずに虫歯があるとのこと。抜くか治療するかの選択を迫られ、治療の方を選んでおいた。虫歯は抜いた親知らずの隣の歯にあるはずなんだけど、そちらは傷口が治るまで着手しないということみたい。先生が一人じゃないため、治療方針が一貫しない。

今日も130円だった。