2010年1月14日木曜日

【よくわかる!実践Cプログラミング】のお勉強~第1部 Part 1 ~

前回はVisualStudio2008ExpressEdition をインストールしました。今回から少しずつ読んで、書いて、実行していこうと思います。 うすうす気付いていますが、きっとこのC言語の始め方は普通の入り方ではないと思います。しかし、どうしても飽きっぽい自分には、このような非常に面白い本から入れば3日坊主も7日坊主ぐらいになるかと思い、始めてみました。

~はじめてのC言語~「VC++でCプログラムを書く方法」
ホントは、テキストエディタで書いて、コンパイルし、実行の手順でやっていきたいのですが、とりあえず慣れるために IDEとしてVisualStudio、VC++を入れました。そして、C言語として作るには、少し手順があるので復習します。
1.プロジェクトの新規作成で、「Win32 コンソールアプリケーション」を選択し、プロジェクト名を入力する。
2.「Win32 アプリケーションウィザード」の画面で、「追加のオプション」の □空のプロジェクトにチェック☑をつける。
3.ソリューションエクスプローラの「ソースファイル」を右クリックし、「追加」→「新しい項目」を選び、C++テンプレートを選択し、ファイル名の末尾、拡張子を必ず「.c」にし、最後に「追加」をクリックする。
まずは「Hello World」からやりました。なんだか、JAVAでもやった気がします。

#include
int main(void)
{
  printf("Hello World");
  return 0;
}
と、ここがスタートになりました。
これをビルドして、デバッグしてみたのですが、正常に実行されたかわからないw ので、ブレークポイントを入れて、処理が途中で止まるようにしました。また、ステップインで1行ずつ実行できますね。。。

~C言語マイスターズ~「if文は畏怖すべき条件判断の冷徹宰相」
if文の書式 >> if( 条件式 ) 成立時に実行する文 else 不成立時に実行する文
えー、、、条件式に「0」が来たら、「成立」で、それ以外は「不成立」になるってことです。なので、
if( a ) printf("成立") else printf("不成立");
これの「a」に、「0」が入れば、「成立」と出ます。

●関連項目
switch文:複数の条件に分岐できる。
三項演算子:式に限定すれば、if文と同じ機能。   ・・・?

~ライブラリ紳士録~「ニャオ!猫の力で?文字列合体「strcat」
C言語では文字列を小さな整数(char型)の配列として扱う。(なるほど。。。)
puts関数だと、最後に「改行」が入るので、strcat関数で文字列をコピー追加する。
#include
#include
int main(void)
{
char name[19] = "よくわかる!";
char rank[] = "C言語";
strcat(name,rank);
puts(name);
return 0;
}
と、このようになるそうです。連結して全角9文字、18バイトですが、文字列の最後に「¥0」のnullが1バイトつくそうです。なので19バイトです。これは注意ですね。

●関連項目
strcpy関数:文字列を上書き。連結ではない。
strncat関数:追加バイト数を指定できるstrcat関数の派生形。
_mbscat関数:マルチバイト文字(シフトJISなど)の文字列を合体。
wcscat関数:ワイド文字(Unicodeなど)の文字列を合体。

~ライブラリ紳士録~「無駄に太るな,スリムに出力「puts」」
printf関数とputs関数で、似てるようだが違うので、使い分けもそうだし、メモリの消費も気をつけましょうといったことで、
puts関数とは・・・、引数の文字列と改行を標準出力に出力する。書き込みエラー発生時はEOFを返し、そうでない場合は負ではない値(←?)を返す。
と、実にシンプル・・・、負ではない値が気になるけど・・・。
printf関数のように、変数に入った整数を文字列に埋め込んで出力するような複雑な機能はありません・・・なるほど。そんなことができるのね。
puts関数の方が、より高速に処理できる、実行ファイルが小さい、必要メモリが少ない、そうです。実際に、比較してみました。VC++の設定は以下を変更しました。
・ビルドのターゲットをDebug からRelease に。
・構成プロパティを開き、コード生成 の ランタイムライブラリ を「マルチスレッド(/MT)」に。
・リビルドする。
すると、Release というフォルダに実行ファイルが生成されます。これをputs とpringf で書き換えて比較してみました。

●関連項目
fputs関数:fopenで開いたストリームなどに書き込みます。
gets関数:標準入力から1行入力します。

~C言語クイズ~「ifの迷宮」
リスト8から
#include
int main(void)
{
int a = 1, b = 0;
if( a ) if( b ) puts("Alfa") else puts("Bravo");
return 0;
}

これで、アルファとブラヴォのどちらが表示されるのか?
んー、1つ目のif が真で、2番目のif に行くけど、else に入ってBravo か?むむー、もしくは、、、つーか、1つ目と2つ目の見分けってするのか?うーん、疑問だ。

【よくわかる!実践Cプログラミング】のお勉強~プロローグ~

とりあえず、C言語を使うことになったので、お勉強を始めようと思うのだが、どれをとっても挫折しそうな予感がバリバリするので、ヨドバシで出会った面白そうなこの本をベースにお勉強を進めようと思う。実はタイピングが遅いので、また挑戦になるが、できるだけ素早くタイピングすることも心掛けてやっていこうと思う。

~この本の読み方~

とりあえず、(←口癖ですねw)どこからでも読み始めていいそうですが、まずはプロローグから読みましょう。「C言語はひとつ」の正体・・・これは、一番初めに策定された仕様からどんどん時代に合わせて標準化してきたが、ベースとなるものは変わっていない・・・当り前か。。。

無料のC言語開発ツールをインストールする
C言語でプログラムを書いて、動作させるためには主に2つのツールが必要となる。
1.テキストエディタ
2.C言語のコンパイラ
また、両方の機能を1つにまとめたIDE、統合開発環境と呼ばれるツールも使われる。

今回は、付録のDVD-ROMから「Visual Studio 2008 Express Editions with Service Pack 1」をインストールします。

DVD-ROMを入れ、セットアップの画面から「Visual C++ 2008 Express Edition」をクリックすると、インストールが開始されます。このVC++はC++言語での開発を想定して作られているので、C言語でのプログラミングに使うには、少し手順を踏む必要があるそうです。(それは次回)

2009年11月12日木曜日

モチベーションの向かう先は

今まで生きてきて、平凡かもしれないけれど色々なことがあり、そしてこれからも、色々なことが起こるだろう。しかし、果たして本当に自分が向かう先が分かっているのだろうか。
今の答えは「NO」だ。
向かう先が見えていない。

最近は特に、何かしなければと焦る、もどかしい、足掻いている、そんな状況だが、方向性がないために 、時間を無駄に浪費している。

ただ、だからと言って空回りしているわけにはいかない。

とにかく、基本に戻って全力を尽くす。
それをやっていきたい。
冷静に見つめながら、情熱的に進む。

2009年11月6日金曜日

仮想環境デビュー。VMwarePlayerを使ってみた。

「食わず嫌いはよくない」と常日頃から思っており、どんなことでも、まずはやってみてから考えるようにしているのだが、どうもソフトウェア系に関してだけ、逃げ腰な所がある。それは、インストールから設定して普通に使えるようになるまでに、かなりの時間が必要で、それが待てないからだ。下手すると半日潰れてしまう。
しょうがないと言えばそうかもしれないが、どうしても貧乏性な性格がこんな所にも出てしまう。

今日は、これまで敬遠してきたVMwarePlayerを使ってみた。
今回は、まずはLinuxの勉強のためのCUI操作できる環境「コマンドを打って確認できる」が目的で、高いゴールではなかったのもあるが、特に躓く所はなく、すぐにVMwarePlayer上でUbuntuが使えるようになった。
本当に最近はインストールから使えるようになるまで、簡単になった。
この記事もVISTAのVMwarePlayerから仮想でUbuntuのFireFoxから投稿している。

今、VMwarePlayer で Ubuntu8.04が動いている。
VMwareが、
「仮想CDROMからtarで解凍し「vmware-install.pl」を実行して「VMwareTools」をインストールしろ」
とメッセージがあったので、tarで解凍しようとして、苦戦した。
解凍先を指定したかった。
必要なかった。そのままその場所に解凍した。
解凍後「vmware-install.pl」を実行したかった。
実行する時は、./ に続けて、「vmware-install.pl」 で実行する。
root@ubuntu-vm:/home/ubuntu/vmware-tools-distrib# ./vmware-install.pl  (こんな感じ)
LINUXの「超」基本。。。勉強になります。

色々できそうなので、怠けず、色々やってみようと思った。

【復習】3.1.8.マニュアルの参照

Linuxでは、オンラインマニュアルページ(manページ)が標準で用意されており、manコマンドで表示できる。
マニュアルを構成するファイルは、/usr/share/man
manページの検索ディレクトリは、環境変数MANPATHが参照される。
MANPATHに何も指定されていない場合は、/etc/man.config(もしくは/etc/man.conf)ファイルに指定されたデフォルトのリストが使われる。manコマンドは環境変数PAGERで指定されたページャプログラム(通常はless)で表示を行うが、変更可能。

書式) man [オプション] [セクション] コマンド名/キーワード

・manコマンドの主なオプション
-a:すべてのセクションのマニュアルを表示する。
-f:指定されたキーワード(完全一致)を含むドキュメントを表示する。
-k:指定されたキーワード(部分一致)を含むドキュメントを表示する。
-w:マニュアルの置かれているディレクトリを表示する。

・manページの見出し
NAME(名前):コマンドやファイルの名前と簡単な説明。
SYNOPSIS(書式):書式(オプションや引数)
DESCRIPTION(説明):詳細な説明。
OPTIONS(オプション):指定できるオプションの説明。
FILES(ファイル):設定ファイルなど関連するファイル。
ENVIRONMENT(環境変数):関連する環境変数。
NOTES(注意):その他の注意事項
BUGS(バグ):既知の不具合
SEE ALSO(関連項目):関連項目
AUTHOR(著者):プログラムやドキュメントの著者

manのデフォルトのページャでlessが設定されている。lessコマンドは「テキストを1画面ずつ表示する」こと、moreコマンドの高機能版である。
・lessの主なキー操作
スペースキー、fキー:下方向に1画面スクロール
bキー:上方向に1画面スクロール
qキー:終了
/検索文字列:下方向に検索
?検索文字列:上方向に検索

☆/etc/passwdファイルについて調べたい場合、ドキュメントの内容による分類であるセクションを指定する。
・セクション
1:ユーザーコマンド
2:システムコール
3:ライブラリ
4:デバイスファイル
5:ファイルフォーマット
6:ゲーム
7:その他
8:システム管理コマンド
9:Linux独自のカーネル用ドキュメント

→ man 5 passwd  >> /etc/passwdのファイルのフォーマットに関するマニュアルが表示される。
PASSWD(5) PASSWD(5)

名前
passwd - パスワードファイル

説明
passwd ファイルには各ユーザアカウントの様々な情報が記録されている。書か
れているのは次の通り。
(以下略)

☆ -fオプションで、指定した検索キーワードと完全にマッチした一覧が表示される。
whatisコマンドと同じ。
・man -f
・whatis

crontabをキーワードとして、すべてのマニュアルを検索する。

ubuntu@ubuntu-vm:~$ man -f crontab
crontab (1) - maintain crontab files for individual users (V3)
crontab (5) - tables for driving cron
ubuntu@ubuntu-vm:~$
ubuntu@ubuntu-vm:~$ whatis crontab
crontab (1) - maintain crontab files for individual users (V3)
crontab (5) - tables for driving cron
ubuntu@ubuntu-vm:~$

☆コマンド名などの正確な名前が不明な場合、-kオプションを使う。
aproposコマンドと同じ。
指定されたキーワードが、マニュアルタイトルもしくはNAME欄に含まれるマニュアルの項目一覧を表示する。

ubuntu@ubuntu-vm:~$ man -k crontab
/etc/anacrontab (5) [anacrontab] - configuration file for anacron
anacrontab (5) - configuration file for anacron
crontab (1) - maintain crontab files for individual users (V3)
crontab (5) - tables for driving cron
ubuntu@ubuntu-vm:~$
ubuntu@ubuntu-vm:~$ apropos crontab
/etc/anacrontab (5) [anacrontab] - configuration file for anacron
anacrontab (5) - configuration file for anacron
crontab (1) - maintain crontab files for individual users (V3)
crontab (5) - tables for driving cron
ubuntu@ubuntu-vm:~$

これらは、whtaisデータベースを用意しておく必要があり、makewhatisコマンドで作成する。whatisコマンド、aproposコマンド、-k及び-fオプション付きのmanコマンドは、whatisデータベースを参照する。

※シェルの内部コマンドの説明を表示するには、helpコマンドを使う。

■感想:manコマンドは、マニュアルが表示されて便利で助かるが、ちゃんと読んで理解するのが大変な時がある。頑張って理解したい。

【復習】3.1.7.コマンド履歴

bashは実行したコマンドを保存しているので、historyコマンドでコマンド履歴を表示して確認できる。
「!履歴番号」で指定して、コマンドを再度実行できる。
コマンド履歴は、ユーザーのホームディレクトリの、.bash_historyファイルに保存されている。
環境変数HISTFILEで変更が可能。履歴数は、環境変数HISTSIZEで設定されている。

ubuntu@ubuntu-vm:~$ history
1 ls
2 cd /
3 ls
4 cd cdrom
5 ls

(中略)

34 echo `$DATE`
35 echo "$DATE"
36 echo "\$DATE"
37 history
ubuntu@ubuntu-vm:~$ !34
echo `$DATE`
2009年 11月 6日 金曜日 00:21:39 JST
ubuntu@ubuntu-vm:~$
ubuntu@ubuntu-vm:~$ echo "$HISTFILE"
/home/ubuntu/.bash_history
ubuntu@ubuntu-vm:~$ echo `$HISTFILE`
bash: /home/ubuntu/.bash_history: Permission denied

ubuntu@ubuntu-vm:~$ echo "$HISTSIZE"
500
ubuntu@ubuntu-vm:~$

●bashの履歴機能
↑(Ctrl+P):一つ前のコマンドを表示する。
↓(Ctrl+N):一つ次のコマンドを表示する。
!文字列:実行したコマンドの中で、指定した文字列から始まるコマンドを実行する。
!?文字列:実行したコマンドの中で、指定した文字列を含むコマンドを実行する。
!!:直前のコマンドを再実行する。
!履歴番号:履歴番号のコマンドを実行する。

■感想:「!文字列」と「!?文字列」は、どうも最新?のマッチしたものが実行されるようだ。ただ個人的には、どうしてもそのような指定が必要な時だけ「!文字列」を使おうと思う。

【復習】3.1.6.引用符

「'」単一引用符(シングルクォーテーション)
単一引用符の中は、すべて文字列であると解釈される。

「"」二重引用符(ダブルクォーテーション)
二重引用符内に変数があれば、その変数の内容が展開される。「`(バッククォーテーション)」が使われていると、その中も展開される。

「`」(バッククォーテーション)
引用符内にコマンドがあれば、素のコマンドを実行した結果が展開される。
変数の場合は、変数に格納されているコマンドを実行した結果が展開される。

「\」(バックスラッシュ)は、直後の文字を、通常の文字であるとみなす。(エスケープ文字)

ubuntu@ubuntu-vm:~$ echo "$DATE"
date
ubuntu@ubuntu-vm:~$ echo "\$DATE"
$DATE
ubuntu@ubuntu-vm:~$ echo "current is `pwd`"
current is /home/ubuntu
ubuntu@ubuntu-vm:~$

ubuntu@ubuntu-vm:~$ DATE=date
ubuntu@ubuntu-vm:~$ echo $DATE
date
ubuntu@ubuntu-vm:~$ echo '$DATE'
$DATE
ubuntu@ubuntu-vm:~$ echo "$DATE"
date
ubuntu@ubuntu-vm:~$ echo `$DATE`
2009年 11月 6日 金曜日 00:01:29 JST
ubuntu@ubuntu-vm:~$

■感想:「`」バッククォーテーションも、その単語を囲まないといけないが、ついついエスケープ文字の使い方のように、先頭に付けた時点で忘れてしまうので、注意しなければ。