programming

3DCGで良く使う数式

3DCGなどで良く使う数式をまとめてみました. ベクトルaとベクトルbの外積 ベクトルaとベクトルbの内積 点と平面の距離 点と平面 との距離は (は平面の法線ベクトル) 点と直線の距離(垂線の長さ) 点と直線 の距離は (は直線の方向ベクトル) 2点とを通る直線…

オブジェクトファイルのシンボルテーブルを見る方法

*.o や *.so などのファイルに含まれるシンボル名の一覧を見るには readelf コマンドを使う. $ readelf -s オブジェクトファイル 昔は nm コマンド や objdump コマンドで同様のことが実現できたが,これらの古いツール達は elf形式(Executable and Linking…

make の仕組みを理解する

前述*1のように Makefile は非常に簡潔に記述できます.ただし,簡潔なMakefileを記述するためには make の仕組みを理解する必要があります.結論から言うと, make は 簡潔な生成ルールのみを記述したMakefileから, 実際に必要となる詳細な生成ルールを自…

Makefile は簡潔に書きましょう

仕組みが判ってしまえば Makefile は簡潔に書けます.$(CC) とか $@ とか $ 基本(その1) ソースコード hoge.c から 実行形式のバイナリ hoge を生成するMakefileは,以下のように書きましょう all: hogeこれだけです.これで $ make all とすると hoge が生…

C/C++開発者向けemacsの設定

emacsで C/C++ でコーディングしている開発者向けの emacs の設定です. [F5]でビルド,[F4]でエラー行へジャンプといったことが出来,かなり便利です.具体的には以下のような事が出来ます. [F7]でコンパイル(バッファを全部保存して,make all します) [F…

linux2.6でDMA転送する方法

久しぶりにPCIデバイスでDMA転送するドライバ(linuxのカーネルモジュール)を書いたので,メモ.以下,論理アドレスと,物理アドレスは以下のように表記する. dma_addr DMAアドレス(物理アドレス,バスアドレスとも) cpu_addr CPUアドレス(論理アドレス) DMA…

詳解 Linuxカーネル 第3版

Linuxカーネルの仕組みを詳しく解説した「詳解 Linuxカーネル」の第3版が出るとのこと.詳解 Linuxカーネル 第3版作者: Daniel P. Bovet,Marco Cesati,高橋浩和,杉田由美子,清水正明,高杉昌督,平松雅巳,安井隆宏出版社/メーカー: オライリー・ジャパン発売日…

gcc-4.1.2 RC1

Mark Mitchell - GCC 4.1 Branch Frozen in Preparation for GCC 4.1.2 RC1 よりgcc-4.1系の次期バージョン gcc-4.1.2 がそろそろリリースされる運びになりそう。 バグ修正のリリースだが、例によって大量の修正が入っている。gccを使っている人はぜひチェッ…

illustratorでsin(x)を描く方法

illustratorでサインカーブ(sin x)を描く方法として、javascriptを使う方法を紹介します。このエントリは、はてな人力検索の質問 question:1167923268 に触発されて書きました。 illustrator用スクリプト illustratorでは、javascript でスクリプト(=プラグ…

valgrind でプロファイル対象から特定の共有ライブラリを除外する方法.

valgrind の --suppressions オプションを使うと,プロファイル対象から特定の共有ライブラリ(hoge.so)を除外出来ます. valgrind の問題点 valgrind はlinux用のメモリリーク検出ツールとして有名ですが,他にも 初期化していない変数値を参照している個所 …

emacs でソースコードを整形する方法

emacsの機能を駆使して,ソースコードを半自動的に整形する方法.手順はたったの2stepです.具体的には step-1 C-c C-q で自動インデント step-2 M-x align-regex でキーワードを指定してテキストを整列 という流れになります.以下例としてC言語で記述され…

viでスペルチェッカーを使う方法

vi (厳密にはviの改良版,vim)でスペルチェッカを使う方法. :set spellemacs だと M-x ispell-region とか M-$ で同様にスペルチェックできる.

std::ostream_iterator

#include <iostream> #include <iterator> #include <vector> using namespace std; int main() { vector<int> d; d.push_back(1); d.push_back(3); d.push_back(13); copy(d.begin(), d.end(), ostream_iterator<int> (cout, " ")); return 0; } #include <iostream> #include <iterator> using namespace std; int mai</iterator></iostream></int></int></vector></iterator></iostream>…

firefox をデバッガ上で動かす方法.

run-mozilla.sh というスクリプトを使うと,デバッガ gdb 経由でfirefoxが起動できる. $ /usr/lib/firefox-1.5.0.7/run-mozilla.sh -g ./firefox-bin -d gdbこれだけ.詳細は run-mozilla.sh のコメントにいろいろ書いてある. 10/23追記. 同じことが, $ …

glibc でバックトレースを表示する方法

2017年11月6日追記.demangle 処理を追加したコードを公開しています.詳細は http://d.hatena.ne.jp/pyopyopyo/edit?date=20171106 で.http://0xcc.net/blog/archives/000067.html にて知ったのだが,glibc はバックトレースを表示するための関数を提供し…

gdbでSTLのコンテナの値を表示する方法

STLを使ったコード,たとえば std::vector<int> array;というコードがあったとして,gdbでデバッグ中に array[0] の値を確認したい場合はどうするか?実はこれが結構面倒なのだ. gdbでデバッグ中に,変数の値を確認したい場合は print コマンドを使う.例えば in</int>…

double型 v.s. float型

浮動小数点演算を行う際に 浮動小数点型(floatかdoubleかlong doubleか) 計算精度 を変えると,実際にどれくらい計算速度が異なるのか測定してみた.測定した環境は fedora core 5 ベースのlinuxで,中身としては linux-2.6.17, glibc-2.4 Intel(R) Pentium(…

C99 における浮動小数点演算の丸め方,例外の取り扱い

C言語の新しい規格であるISO C99では, 浮動小数点演算の丸め方 例外の取り扱い を制御するために,11個の関数を定義している. #include <fenv.h> // 例外関係 int feclearexcept(int excepts); int fegetexceptflag(fexcept_t *flagp, int excepts); int feraiseex</fenv.h>…

C99における浮動小数点演算の計算精度(その2)

C99では,FLT_EVAL_METHODの値で float型 や double型の計算精度を制御できるようになっている.では FLT_EVAL_METHOD の初期値はどうなっているのか? Linux環境で調べてみた. 結論: デフォルトでは FLT_EVAL_METHOD は 2.つまり float でも double でも …

C99における浮動小数点演算の計算精度(その1)

C99では,FLT_EVAL_METHOD というラベルの値で,浮動小数点演算の計算精度が制御できる.FLT_EVAL_METHODの値と保証される精度の関係は以下の表の様になる. FLT_EVAL_METHODの値 float型が保証する精度 double型が保証する精度 0 float double 1 double dou…

objprelink2: Faster C++ program startups by improving runtime linking efficiency.

http://objprelink.sourceforge.net/ Objprelink is a code transformation tool that optimizes C++ shared libraries in order to reduce the runtime linking time.

Approximate Sorting

http://www.radiumsoftware.com/0605.html#060531より.Approximate Sorting というアルゴリズムがあるらしい.大変興味深い.

svn でファイルに実行権限を与える

subversion で管理しているファイルに実行権限を付けるには以下のようにする. $ svn propset svn:executable ファイル名ファイル名は複数同時に指定できるので,*.sh にまとめて実行権限を付ける場合は $ svn propset svn:executable *.shとする. Subversi…

bashのスクリプト用デバッガ (その1)

http://bashdb.sourceforge.net/ bashで書いたシェルスクリプトがデバッグできるみたい.ステップ実行とかも普通にできるみたい.

Tiny C Compiler

Tiny C Compilerhttp://fabrice.bellard.free.fr/tcc/

std::iomanip

よくマニピュレータにハマッている人がいるので,メモ.よく使うと思われる manipulator と,その動作. setw(n) 出力幅を最低n文字にする setprecision(n) 出力桁をn桁にする right 出力を右に詰める left 出力を左に詰める setw(n)の設定だけは一度なにか…

failmalloc

http://www.nongnu.org/failmalloc/メモリ関連のデバッグ用ライブラリ.failmalloc を使うと,malloc()がNULLを返した場合にプログラムが正常に処理を継続できるか調査できる.なんとも恐ろしい発想をする方がいらっしゃるものだということで,日記に書いて…

linuxで時刻を取得する方法

linuxで時刻を取得する方法について調査した.(2006/7/17更新) 時刻を取得する方法としては システムコールを呼び出し,時刻を管理しているデバイス(RTCとかカーネル内部のオブジェクト)を読む方法 userlandから直接CPUが持っているクロックのレジスタを読む…

cvs2svn cvsのリポジトリをsvnのリポジトリに変換

cvs上のrepositoryを svn用のrepository に変換する手順をメモ.手順は大まかには cvs2svn で cvsのリポジトリを svn形式でdump dumpした結果を,svnadmin load でsvnのリポジトリに読み込む の2段階. 手順1 まず,cvs2svn でリポジトリをsvn形式でdumpす…

gdb:New or Improved User-level Features

http://gccsummit.org/2006/2006-GCC-Summit-Proceedings.pdf より.gdbに追加された新機能について,個人的に面白そうだと思ったものをメモ. checkpoint レジスタとかスタックの内容を保存したり,復元する機能.たとえば,バグが発生する直前の状態を一度…