開発覚え書き

ソフトウェアシステムの開発に関わるさまざまなことの覚え書き

Vine LinuxへのPostgreSQLインストールと設定の覚え

2005-04-27 15:29:42 | Weblog
Vine Linux 3.1に PostgreSQL 7.4.7 をインストール・設定。

(1) インストール
簡単に

# apt-get install postgresql-server

で。
postgres というユーザが作成される。
/var/lib/pgsql がPostgreSQLのディレクトリに、
/var/lib/pgsql/data がデータディレクトリになる。

WEB+DB PRESS Vol.24 の記事を参考にして、
(この記事ではソースから構築しているので
相違点が多いので注意)

/etc/profile.d に

POSTGRES_HOME=/var/lib/pgsql
PGDATA=$POSTGRES_HOME/data

という2つの環境変数を設定するスクリプトファイルを作成。
ルートで

# /etc/init.d/postgresql start

で最初の起動。
最初の起動時にデータベースの初期化が行われる。
WEB+DB PRESSに書かれている initdb コマンドを
こちらで明示的に実行する必要はなく、initスクリプトの
startの中で最初に一回データベースの初期化が行われる。

# chkconfig --level 2345 postgresql on

とし、再起動。


(2) ユーザ設定など

$ su - postgres

でpostgresユーザになり、

$ createuser ユーザ名

でPostgreSQLにアクセスできるユーザを作る。
その際、「データベース作成権限」と「ユーザ追加権限」
の有無を指定する。
ユーザ名はLinuxアカウントと同じにしておく。

(3) データベース作成

「データベース作成権限」のあるユーザで、

$ createdb データベース名

とする。

(4) データベースのマニュアル操作

psql というコマンドで行う。

$ psql データベース名

でPostgreSQLに入り、SQLコマンドを使って操作する。
なお psql 中では、
¥?
でPostgreSQL特有の制御コマンドのヘルプ、
¥h
でSQL文のヘルプが表示される。
(¥は半角バックスラッシュまたは円記号に読み替え)

(5) データベースの一覧

$ psql -l

C言語rand()関数

2005-04-25 15:47:33 | Weblog
C言語 rand()関数は、<stdlib.h> で宣言されており、 0 から RAND_MAX
の間の擬似ランダム整数を返す決まりである。

int rand(void);
void srand(unsigned int seed);

Windows Visual Studio .NET 2003 では
RAND_MAX = 7fff = 32767

であるのに対し

Fedora Core 2 Linux gcc 3.3.3 では

RAND_MAX = 7fffffff = 2147483647

Linuxの方はいいが、Windowsのrandは範囲が狭すぎて
使えない感じ。

HTML Tidy : HTMLのチェック、XHTML化

2005-04-22 17:14:37 | Weblog
HTMLのチェック、XHTML化のツール HTML Tidy を使ってみた。
文法的におかしいHTMLファイルでも、そこそこ柔軟に解釈し、何とかXHTMLを出力してくれるようだ。
エンコーディングもシフトJISとUTF-8には対応していた。
EUCはオプション指定にはなかった。他のエンコーディング指定でいけるかどうかは
未チェック。
Linux版のバイナリ、Windows版のバイナリなどそろっているようだ。

C言語の時間関係の関数のまとめ

2005-04-21 13:12:10 | Weblog
久しぶりにC言語に触って、ベンチマークなど。
C言語の時間関係の関数をまとめてみた。
特に、clock関数はWindowsとUNIX(Linux)では
求められる時間の意味が異なるのは注意が必要。
ほとんどこのことに言及しているページがないのが
もっと問題だと思う。
----------


time関数


	#include <time.h>

	time_t start_time, end_time;
	double sec_time;

	time( &start_time );

	/* 処理 */

	time( &end_time );
	sec_time = difftime( end_time, start_time );
	


<p>精度・分解能:
WindowsでもLinuxでも秒単位。time_t は整数型。</p>





clock関数


	#include <time.h>

	clock_t start_clock, end_clock;
	double sec_clock;

	start_clock = clock();

	/* 処理 */

	end_clock = clock();
	sec_clock = (end_clock - start_clock) / (double)CLOCKS_PER_SEC;
	


<p>精度・分解能:
CLOCKS_PER_SEC 分の1秒。clock_t は整数型。
Windows Visual C++ では CLOCKS_PER_SEC = 1000
Fedora Core2 Linux では CLOCKS_PER_SEC = 1000000
ただ、実際の精度・分解能は計測してみないと分からない。</p>

<p style="color: red; font-weight: bolder; font-size: 110%">注意:
Windows で返ってくる値は実時間。それに対し
UNIX (Linux) では、伝統的に、CPU時間が返る。
この仕様の違いにより両者は比較できないので要注意。</p>





gettimeofday


	#include <sys/time.h>
	int gettimeofday( struct timeval *tv, struct timezone *tz );

	struct timeval {
		time_t tv_sec; /* 紀元 (1970年1月1日00:00:00 UTC) からの経過時間の秒数 */
		suseconds_t tv_usec; /* マイクロ秒 */
	};

	struct timezone {
		int tz_minuteswest; /* グリニッジ標準時との差 (西方に分単位) */
		int tz_dsttime; /* 夏時間調整の型 */
	};
	


処理系:
Linux

使用法:
	struct timeval start_timeval, end_timeval;
	double sec_timeofday;

	gettimeofday( &start_timeval, NULL );

	/* 処理 */

	gettimeofday( &end_timeval, NULL );
	sec_timeofday = (end_timeval.tv_sec - start_timeval.tv_sec)
			+ (end_timeval.tv_usec - start_timeval.tv_usec) / 1000000.0;
	


<p>精度・分解能:
マイクロ秒。
ただ、実際の精度・分解能は計測してみないと分からない。</p>





QueryPerformanceCounter
QueryFrequency


	#include <windows.h>
	


処理系:
Windows

使用法:
	LARGE_INTEGER start_pc, end_pc, freq_pc;
	double sec_pc;

	QueryPerformanceFrequency( &freq_pc );
	QueryPerformanceCounter( &start_pc );

	/* 処理 */

	QueryPerformanceCounter( &end_pc );
	sec_pc = (end_pc.QuadPart - start_pc.QuadPart) / (double)freq_pc.QuadPart;
	


<p>精度・分解能:
非常に良い。
実際の精度・分解能は計測してみないと分からない。
Pentium機では内部で RDTSC 命令を使ってクロックを得ていると思われる。</p>





RDTSC


<p>処理系:
Pentium系CPU搭載マシン</p>

<p>内容:
Pentium系CPUで RDTSC 命令を実行すると、経過クロック数が
上位32ビット edx
下位32ビット dax
の形の64ビット整数として求められる。
これを周波数で割れば秒数が計算できる。
ただし、周波数は別の方法で求める必要がある。</p>