SSブログ

第1正規形である理由の常套句 [exam]

DB スペシャリストの午後問題向け。あるテーブルがどの正規形であるかを、その理由と共に答える問題の常套句。

第1正規形である理由

全ての属性が単一で、候補キー{A、B}の一部であるBに非キー属性Cが関数従属するため。

第2正規形である理由

全ての属性が単一で、候補キーからの部分関数従属性はなく、推移的関数従属性A→B→Cがあるため。

第3正規形である理由

全ての属性が単一で、全ての非キー属性が候補キーに完全関数従属し、候補キーからの推移的関数従属性がないため。

情報処理教科書 データベーススペシャリスト 2010年度版 (CD-ROM付) より。ここで、A、B、C は属性名とし、試験では問題文中の語句に置き換えること。

過去問題を見る限り、テクニカルエンジニア データベースよりもデータベーススペシャリストの方が問題が易しめ。IPA が公開している統計値を見ても合格率が高い。

が、私にとっては午後問題はかなり難しいと感じる。受からないだろうな...。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

C++/C のデバッグとプロファイルのメモ [C/C++]

C++/C で作成したアプリケーションのデバッグとプロファイルのメモ。

OCXのコントロールの登録

VC6 で OCX のデバッグをしたい。開いているプロジェクトがその OCX で、デバッグセッションの実行可能ファイルが OCX のクライアントアプリケーションだったとする。この場合であっても、OCX をビルドしたらその都度、「コントロールの登録」を行わなければならない。

gprof

gcc/g++ で -pg オプションを付けてコンパイルする。make コマンドを使う場合は Makefile の CFLAGS,LDFLAGS の両方に -pg オプションを付ける必要がある。


マクロ展開後のコードを出力するには? [C/C++]

C/C++ のデバッグ関係のメモ。

マクロ展開後のコードを出力するには?

gcc -E hoge.c

assertを無効にするには?

#define NDEBUG
#include <assert.h>

とする。

ちなみに、

(static_cast<void>  (0)) ;

に置換された。

segmentation fault したときに core を生成させるには?

プログラムが異常終了した場合、 Segmantation falt する。しかし、 core dumped しない環境がある。これは、core の出力が制限されている可能性がある。

ulimit -c unlimited

とすると、core が全て出力される。大きくなりすぎるで、適当に容量制限を付けても良い。 0 になっていると core が出力されない。

gdb

gcc で -g,-ggdb オプションを CFLAGS につけてコンパイルする。

参考文献


タグ:C linux C++ gcc Debug

C/C++ でメモリ関連のバグを調べるには? [C/C++]

C/C++ でメモリ関連のバグを調べるには、Valgrind が使用できそうだ。

Valgrind はメモリとスレッドに関するバグを検出するデバッガである。Valgrind Home では、

Valgrind is an award-winning instrumentation framework for building dynamic analysis tools. There are Valgrind tools that can automatically detect many memory management and threading bugs, and profile your programs in detail. You can also use Valgrind to build new tools. 

と紹介されている。 私はメモリに関するバグを調べたくて使ったことはあるが、スレッド関連のバグを調べるために使用したと経験は今のところ無い。

Valgrind の仕組みは Valgrind によると次のようになっているらしい。

Your program is then run on a synthetic CPU provided by the Valgrind core. As new code is executed for the first time, the core hands the code to the selected tool. The tool adds its own instrumentation code to this and hands the result back to the core, which coordinates the continued execution of this instrumented code.

つまり、デバッグされるプログラムは Valgrind が提供する仮想的な CPU 上で動作すると言うことかな?

※以下、古い話なので、最新の Valgrind には該当しない場合がある。

@@ unlikely looking definition in unparsed remains ";"

と出力されるときは、Valgrind を コンパイルした g++ のバージョンと Valgrind に実行させるプログラムをコンパイルした g++ のバージョンが異なる可能性がある。というか、私はそれにはまった過去が...。どちらも g++ は3.3.0 以上を用いた方が良いと思う。

と書いたが、http://sourceforge.net/mailarchive/forum.php?forum_id=32038&max_rows=25&style=nested&viewmonth=200409 に2004-09-30 13:06 時点の reply で

    Those errors can safely be ignored - they are fixed in the CVS code.

だそうな。Valgrind の ver. は 2.2.0。 詳しくは、該当スレッド参照。

また、STL(stringを含む)を用いたプログラムの場合、プログラムにバグが無くても

==19482== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==19482== malloc/free: in use at exit: 1280 bytes in 1 blocks.
==19482== malloc/free: 1 allocs, 0 frees, 1280 bytes allocated.
==19482== For counts of detected errors, rerun with: -v
==19482== searching for pointers to 1 not-freed blocks.
==19482== checked 1873888 bytes.
==19482==
==19482== LEAK SUMMARY:
==19482==    definitely lost: 0 bytes in 0 blocks.
==19482==    possibly lost:   0 bytes in 0 blocks.
==19482==    still reachable: 1280 bytes in 1 blocks.
==19482==         suppressed: 0 bytes in 0 blocks.
==19482== Reachable blocks (those to which a pointer was found) are not shown.
==19482== To see them, rerun with: --show-reachable=yes

と alloc に対して free が一致しないことがある。これは g++ 2.9.5 の場合は g++ に -D__USE_MALLOC オプションをつけて試すと良いらしい。ここら辺も、古い話。最新を追いかけていないので、もしかすると修正されているかもしれない。

※以上、古い話おしまい。最新の Valgrind には該当しないかもしれない。

Valdgind はもともと http://valgrind.kde.org/ で公開されていたんだけど、 http://valgrind.org/ に移動したらしい。


Linux 向け Acrobat Reader の旧バージョンを入手するには? [Linux]

色々な事情により古いバージョンの Acrobat Reader が必要になることがある。それも Linux 版の。

Acrobat Reader の旧バージョンは  ftp://ftp.adobe.com/pub/adobe/acrobatreader/unix/ からダウンロードできる。日本語を表示させたい場合は、同サイトからダウンロード可能な jpnfont.tar.gz も必要。

Acrobat Reader はバージョン 7 以降、Adobe Reader という名称に変更された。こちらは ftp://ftp.adobe.com/pub/adobe/reader/unix/ からダウンロードできる。

ftp の上位ディレクトリには windows や mac など Linux 以外の OS 向けのソフトウェアも公開されている。

ちなみに、古いバージョンの Java JDK/JRE (要するに Java の実行環境と開発環境) を入手したい場合は 古いバージョンの JDK/JRE を入手するには? を参照。


konsole 上で rdic のバックスケープを有効にするには? [Linux]

konsole とは KDE に標準で付属する端末。rdic とは英辞郎という英日辞書を検索するための ruby プログラムである。

konsole 上で rdic を動作させるとなぜか Backspace が効かない。rdic 以外のアプリケーションは問題なく Backspace が効いている。これを修正するにはあらかじめ、.rdic1.8/keymap を

addkey  backspace backspace
addkey  delete  backspace
addkey  M-v     prev_page
addkey  C-v     next_page

と記述する(ここでは、Delete も Backspace と同じ機能にしている。また、C-v を next_page、M-v を prev_page に設定している)。そして、次のように起動すると良いらしい。

stty erase ^H
rdic -bp --indent=4 ~/jisho/EIJIRO52.euc ~/jisho/RYAKU52.euc ~/jisho/OTOJIRO.euc ~/jisho/WAEIJI52.euc
stty erase ^?

ファイルシステムをマウントするには? [Linux]

Linux の TIPS のメモ。ファイルシステムのマウント関連の話。

Linux から別の Windows PC のディレクトリをマウントしたい。

/bin/mount -t smbfs or /usr/bin/smbmount

これらのコマンドは、SMB ファイルシステム(Windows でのファイル共有)をマウントする。

例えば、Windows マシン 192.168.0.1 の 共有名 data を /mnt/data にマウントするには次のように記述する。

# mount -t smbfs -o uid=XX,username=XX //192.168.0.1/data /mnt/data/

ここで uid は /mnt/data の所有者、username は 192.168.0.1 に接続するときに使われるユーザ名である。

Windows XP Home Edition のように、共有してもユーザ名によるアクセス制限をかけることができない場合は

mount  -t smbfs -o uid=XX //192.168.0.1/data /mnt/data/

でマウントできる。/etc/fstab に書けば自動的にマウントさせることもできるが、当然 192.168.0.1 が Linux よりも先に起動していなければ自動的なマウントは失敗する。

尚、Windows上のリソースをLinuxから使うとき (smbclient/smbmount/mount -t smbfs) は LAN の設定で、NetBIOS over TCP/IP を有効にしておく必要がある。

samba、samba-client の違い

  • samba-client パッケージは Windows上のリソースをLinuxで使うときのコマンド。
  • samba パッケージは Samba サーバ。Linux 上のリソースをWindowsからでも利用できるようにする。

/bin/mount -t ntfs

デュアルブート環境や外付け HDD が NTFS でフォーマットされている場合、NTFS をマウントしたいことがある。-t ntfs オプションは、NTFS をマウントするためのオプションだ。

カーネル2.6では書き込みもサポートしているようだが、カーネル 2.4 の場合は読み込みのみ対応。

/etc/fstab に例えば、次のように追加すれば、/dev/hda9 の ntfs パーテーションを /mnt/ntfs に所有者(uid=500)としてLinux を起動するごと自動的にマウントできる。

/dev/hda9    /mnt/ntfs    ntfs    auto,users,ro,uid=500 0 0

Linux 向けコマンドのメモ [Linux]

脈絡無く、思いつき。Linux のコマンドのメモ。

/sbin/update-alternatives

  • 様々なシンボリックリンクを変更するコマンド。デフォルトでは/etc/alternativesにシンボリックリンクの一覧がある。これにより、プログラムの複数のバージョンを切り替えたりできる(Java に使えば、j2sdk1.5.xとj2sdk1.4.xを切り替えるのに便利)。
  • 例えば gcc のバージョンを変更するには
    # /sbin/update-alternatives --config gcc
    とする。gccの場合はg++などもバージョンを合わせといた方がなにかと便利。

/usr/bin/a2ps

  •  ascii to postscript.ソースコードなどのテキストを印刷するのに適したPSファイルに変換する。
  • 各行の左端に行番号を出力するには、
    $ a2ps in.txt --line-number=1 -o out.ps
    とする。"1"を変更すれば、N行ごとになる。

/usr/bin/gs

  • gs は GhostScript の略。GhostScript は Postscript/PDF のインタプリタ兼ビュアーである。
  • 例えば、gs を使うと次のように記述することで PostScript ファイルを連結できる。
  • gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=out.ps -c save pop -f in1.ps in2.ps ...

/usr/bin/ssh-agent

SSH-AGENT (1) によると ssh-agent とは

ssh-agent は (RSA や DSA の) 公開鍵認証で使われる認証鍵を保持するプログラムです。基本的には、まずssh-agent を X セッションあるいはログインセッションの始めに起動させ、これ以外のすべてのウインドウやプログラムがそのssh-agent プログラムのクライアントとして起動するようにします。エージェントは環境変数を使うことにより、他のマシンにssh (1) を使ってログインするときに自動的に検出され、認証に利用できます。 

とある。ちなみに bash で使うなら、

eval `ssh-agent -s`

として、起動したあと、ssh-add して認証鍵を追加すればよいらしい。

kplayer

kplayer は、動画や音声の再生ソフトウェア mplayer のフロントエンドである。Windows で言えば Windows Media Player が該当するだろうか。kplayer はプレイリストを xmms みたいにビデオウィンドウにくっつけたりできて便利。
  • kplayer-0.5.1 は gcc 2.95.3 ではなく、gcc 3.3.2 でないと /configure を実行させるたとき qt-mt が存在しないというメッセージが出る。
  • 少なくとも qt-devel、kdelibs-devel が必要っぽい。

ただし、上記は kplayer バージョン 0.5.1 のときの話。現在は 0.7 なので変化があるかもしれない。


シェルスクリプトで日付を得るには? [Linux]

ファイル名に日付を付けたいことがある。場合によってはシェルスクリプト中で何かのファイルのファイル名を日付付きで変更したい場合もあるだろう。

例えば、log.txt → log20100101.txt みたいな。

指定した書式で日付を得るには date コマンドを使うと便利だ。

例えば、

%date '+%Y%m%d'
20060312
%date '+%a'
Sun

のような結果が得られる。


CUPS/LIPS4 で割り付け印刷をするには? [Linux]

PostScript ファイルを Linux 上で印刷するときのメモ。

PostScript ファイルを 1シート2ページの割り付け印刷を行いたい場合、

psnup -nup 2 input.ps output.ps

とすれば良い。しかし、こうして得られた output.ps を CUPS/LIPS4 を経由しプリンタで印刷すると紙のサイズが80用紙になってしまう。このとき、psnup のオプションで紙のサイズを指定しても変わらない。一方、PostScript プリンタで印刷する場合は、オプションを追加しなくとも正常に印刷される。

この状況を暫定的に解決するには、ps2ps を通してラスタライズすれば一応、指定したサイズで印刷される。

ps2ps -r600 -sPAPERSIZE=a4 input.ps output.ps

タグ:linux PostScript

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。