2014年4月28日月曜日

testdiskをやってみた。

ひょんなこと、焦ったこと、ありがちなやっちまったで、大切な大切なデータがぶっ飛びになりました。
バックアップと称した剥き出しのHDDは、どのように保存されたかわかりません。
どうも、QNAPの同期後の片割れとして、コピーされ、抜き取られ、保存(放置)、最悪、これを入れてもう一台は空のHDD入れれば元に戻るだろーぐらいの安易な考え。甘かった。
対象のHDDを、Windows7から、 LiveのCentOS6から、GPartedから、と、色々見たり、修復しようと頑張ってます。いまはtestdiskちゅーのを試してます。
3つめ?のパーティーションが壊れてる?のかスーパーブロックがどうたらと、わけのわからん英語が並んでるので、もーいーやーの気持ちはありつつ、DeepSearchして・・・、結果も微妙ー。
んー、んーんー、って唸って、 あれ?NTFSって書いてなかった?まさかねー・・・。帰ったら試してみよう。(←いまここ)

2014年4月24日木曜日

StudyingHTTPを勉強させて頂きました。

やっと、HTTPのIntroductionを読みました。
変遷激しい。
SOAP、RPC、忘れないようにしないと。
今年、いや、今後は「7回読む」で認識→理解→血肉にしていこう。そうしよう。

2014年4月17日木曜日

途中経過をザッと書き残す。気紛れに、

2014年の出来事(1)「NAS事件」
・引っ越しからのファイルサーバ(QNAP)移転→実家へ。
・NAS(QNAP)の保存する内容を追加。←これがイケなかった。Orz
・NASの赤ランプ発見!
・ゴチャゴチャ弄ってたら、読み込めなく?なって、「あ。」フォーマット。
 →そう、アフォーマットなのだ。アフォー!
・・・(シーーーーン)・・・

(耳が壊れたかと思った。)

・過去の写真やら遊びに行ったときに撮った動画とか、とにかく自分には重要なものだった。
・とても焦った。そして、こんな時のためにコピーがあることを思い出した!

・「ん?」・・・復旧しない。むしろ、中身が読めない。…というか、どんな形式で保存したのか、忘れた。
~試行錯誤中(4週間)~

・ようやく、たぶん、QNAPのRAIDした片割れだと推測。
・しかし、普通EXT4の領域が「不明」と出てマウントできない。
・gpartでも、表示されなかった。なんかダメそうだ…。
・とりあえずddでコピッたドライブに、PhotoRecとか復旧系の操作をしてみようと計画中。←☆いまここ。

2014年の出来事(2)「ポチッとRAID ZでFS勃った!」
・「NAS事件」のショックからなのか、気づいたらWD RED 3TB ×4個、ポチってた。ビックリした。

・気づいたらカネが無くて、ポチったドライブを搭載する箱がない。
・しょうがないので、うちのパソコンドライブ大移動。スゲー疲れた。
・もう、肚を決めて、RAID Z、ZFS、なんかあったら死に物狂いで復旧すると、NAS4FREEを入れた。
・ビックリするぐらい何もせずに、USBメモリ起動のNASが出来た。 ←☆とりあえずココ。

2013年11月28日木曜日

リスタート。またやるよ。

またまたまたまた、久しぶり。
飽きやすいったらありゃしない。
もうね、しょうがない性分だよ、もう。
なんにせよ、また始めればいいじゃあないかぁー、ってことで、リスタート!

とりあえずのネタ。
1.パソコン組んだが、組んだだけ。
2.NASを買ったが、物欲満たしただけ。
3.ワードプレスでなんかやりたいかな。

ま、とりあえず。

2010年1月25日月曜日

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

じゃ、遅くなったがPart2を。
★「while 文」
#include
int main(void)
{
int sum, price;
printf("すでに使った金額は?\n"); // メッセージを出力し、
scanf("%d",&sum); // 変数sumに値を入力する
while( sum <= 300) // 繰り返しここから
{
printf("欲しい物の金額は?\n");
scanf("%d",&price);
sum += price;
} // 繰り返しここまで

printf("300円を超えています。\n");
return 0;
}

「sum += price; 」 は、sum と price の値を足したものになる。「sum = sum + price」
while文は実行する前に条件式を調べる。
do文は実行した後で条件式を調べる。
for文はあらかじめ回数が分かっている繰返しを記述するのに適している。

★「printf」の話
#include
int main(void)
{
printf("Hello World\n");
return 0;
}

Hello World の表示をする、プログラミングを勉強する時に1番初めに良く見るコード。
次の1行を入れて、「90%discount!」と表示させたい。
printf("大安売り!なんと90%disount!\n");
このままでは、「%d」と認識されてしまうので、「%%」と処理する。
printf("大安売り!なんと90%%discount!\n");
「%d」の本来の使い方は、
printf("計算結果は%dです\n",1+2);
と、2番目の引数として整数に置き換えられて出力する。「計算結果は3です」と表示される。
「%d」・・・整数型、10進数で出力
「%x」・・・整数型、16進数で出力
「%f」・・・浮動小数点型、実数
「%s」・・・文字列型、文字列、
「%c」・・・文字型、1文字
int a = 65;
printf("表示は、 %d %x %c %s です。", a, a, a, a);
「65 41 a a 」と表示させたかったが、”ハンドルされていない例外が発生”する・・・。本題から外れるので後回しにした。

■関連項目
sprintf関数:printf関数と同様の結果を、文字列として配列変数に入れます。
fprintf関数:fopenで開いたファイルなどにprintf関数と同様の出力を行います。

★「memset」配列をまとめてクリアする
memset( アドレス , バイト値 , サイズ);
※先頭に #include の追加

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:~$

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

2009年10月22日木曜日

改めて、経験も必要だが、理論も理解しておく。

現場の仕事では色々な作業を経験することがあるが、それが実際にどんな意味を持っているのか、「知っている」のと「知らない」のでは大きく違う。これは、広く一般常識として知られていると思うが、実際には
「経験重視」の考え方に偏っていると思う。意味を知らなくても、経験していればいいのだ。
確かに、資格だけ持っていて、実際の現場では役に立たないと言うこともよく聞く話だし、自分も持っているだけの資格というのがある。きっと現場では役に立たないだろう。
やはり経験は大事である。

ある時期、社会人になった後で学校に通っていたとき、毎日交代で講義が始まる前に「5分間で自分の興味のあることを紹介する」というプレゼンの練習があった。色々な職種の人がいたので色々なプレゼンがあったのだが、「調理師」の資格を持った人のプレゼンがとても印象的だった。内容は「調理するときの衛生面について」だったが、なかでも「100℃でも死なない菌がある」(大半は殺菌できるらしい)というのは全く知らなかった。
自分でも簡単な料理をすることはあり、一応、衛生面には気をつけているが、さすがに「何度でどの菌が殺菌できるか」は知らない。自宅で自己責任ならしょうがないが、「お客に提供する」となったら話は別だと思う。
食中毒が出てから「知りませんでした」ではお話にならない。だからこそ資格としての「調理師」というものがあるのだと思う。
「美味しい料理が作れる」だけではダメなのだ。

IT関連も色々な資格があるが、どうも「経験重視」な傾向が強い。よく聞く話が「資格はあるが経験がないから採用を見送った」などだ。確かに「資格のための勉強」と「実際の現場」は違うかもしれない。設定ファイル、環境、考え方、と色々な知っておかなければならない情報はあるが、技術のベースとなる知識が抜けていたら、「もしもの時の対処」や「応用したやり方で効率化すること」などは、なかなかできないだろうと思う。
「いやいや、そんなことはない。現場で苦労しながら叩き上げた技術があれば、どんな状況でもなんとかなる」と根性論を持っている人もいるだろう。(根性は大切だが)

よっぽどのことがない限り、なかなか食中毒は出ないかも知れないが、よっぽどのことがない限り、障害も発生しないと思う。どちらも同じで、それなりに経験があるなら「なんとかなってしまう」のだ。だから「経験重視」の考え方になりがちだと思うが、プロとしてやるのであれば「よっぽどのこと」が発生しないように、知識が必要だと思うのだ。
緊急事態が発生する前に、習得した知識で回避できた方が、費用も時間も無駄にならない。知識は重要だ。

だからといって「知識重視」へ傾くということではなく、偏っている「経験重視」の傾向が、その天秤が釣り合う所へ向かってくれたらいいと思い、それで発展できれば理想的だと思う。
「経験より知識」と「知識より経験」の議論ではく、自分が思うのは「どちらも重要である」と言うことだ。
これを忘れず、頑張っていきたい。

【復習】3.1.5.コマンドの実行

・コマンドは次の書式で実行する。
 書式) コマンド オプション 引数
・コマンドを記号で区切った場合、
 「;」 : 1番目が実行後、正常でもエラーでも、2番目が実行される。
 「&&」 : 最初のコマンドが正常に終了した場合、2番目のコマンドが実行される。
 「||」 : 最初のコマンドがエラーで終了した場合、2番目のコマンドが実行される。

ubuntu@ubuntu-laptop:~$ pwd
/home/ubuntu
ubuntu@ubuntu-laptop:~$ ls
Examples テンプレート ドキュメント 音楽 公開
kekka.log デスクトップ ビデオ 画像
ubuntu@ubuntu-laptop:~$
ubuntu@ubuntu-laptop:~$ pwd;ls   > 「;」で、続けて実行する。
/home/ubuntu
Examples テンプレート ドキュメント 音楽 公開
kekka.log デスクトップ ビデオ 画像
ubuntu@ubuntu-laptop:~$
ubuntu@ubuntu-laptop:~$ pwd&&ls   > 「&&」で、正常終了で実行する。
/home/ubuntu
Examples テンプレート ドキュメント 音楽 公開
kekka.log デスクトップ ビデオ 画像
ubuntu@ubuntu-laptop:~$ pwd||ls   > 「||」で、異常終了で実行する。
/home/ubuntu
ubuntu@ubuntu-laptop:~$    > ↑1番目が正常終了したので、2番目は実行されない。
ubuntu@ubuntu-laptop:~$ pwdd||ls   > 「||」で、わざと1番目をエラーにしてみる。
bash: pwdd: command not found
Examples テンプレート ドキュメント 音楽 公開
kekka.log デスクトップ ビデオ 画像
ubuntu@ubuntu-laptop:~$    > ↑1番目でエラーメッセージ、2番目が実行された。

・複数のコマンドを「ひとまとまり」として扱いたい場合は、「()」でくくる。

ubuntu@ubuntu-laptop:~$ date;pwd;ls > kekka.log    > 「date、pwd、ls」の結果を「kekka.log」に書きたい。
2009年 10月 22日 木曜日 21:42:53 JST
/home/ubuntu
ubuntu@ubuntu-laptop:~$ cat kekka.log    > lsの結果だけ書き込まれた。
Examples
kekka.log
テンプレート
デスクトップ
ドキュメント
ビデオ
音楽
画像
公開
ubuntu@ubuntu-laptop:~$ (date;pwd;ls) > kekka.log   > 「()」でコマンドをくくる。
ubuntu@ubuntu-laptop:~$ cat kekka.log
2009年 10月 22日 木曜日 21:43:12 JST
/home/ubuntu
Examples
kekka.log
テンプレート
デスクトップ
ドキュメント
ビデオ
音楽
画像
公開
ubuntu@ubuntu-laptop:~$    > ↑「()」でくくった「date、pwd、ls」の結果が出力された。

・コマンドを実行すると、シェルは新たなシェルを起動し、そのシェル上でコマンドを実行する。
・現在のシェル内でコマンドが実行されるようにするには、「{}」でくくる。
 (※うまく確認できなかった)

■感想:最後の、「{}」でくくって、そのシェル上でコマンドを実行する動作だけ、確認できなかった。悔しい。時間がかかりそうなので後で調べることにする。

【復習】3.1.4.環境変数PATH

・コマンドには、内部コマンドと外部コマンドの2種類がある。
・内部コマンド : シェル自体に組み込まれているもの。
・外部コマンド : 独立したプログラムとして存在するもの。
 (環境変数PATHに指定されたディレクトリを順に調べて見付だし実行する。)
・パスを追加するには、.bash_profile などの環境設定ファイルのPATH設定を修正するか、PATHコマンドを使用する。
 書式) PATH=$PATH:追加するディレクトリ名

ubuntu@ubuntu-laptop:~$ echo $PATH    > パスを表示する。
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
ubuntu@ubuntu-laptop:~$ PATH=$PATH:/mydir   > 最後に「/mydir」を追加する。
ubuntu@ubuntu-laptop:~$ echo $PATH    > 変更したパスを表示する。
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/mydir   > 追加された。
ubuntu@ubuntu-laptop:~$ export PATH   > エクスポートしておく。

 ※ $ PATH=/mydir のようにすると、/mydirだけになるので注意。

■感想:パスを常に追加しておくには、「.bash_profile」や「.bashrc」などの設定ファイルを修正すればいい(らしい(笑))が、どこを修正すれば管理しやすいのかは、もうちょっと勉強せねばならないと思った。

【復習】3.1.3.シェル変数と環境変数

・シェル変数の有効範囲は、その変数を定義したシェルのみになる。
・環境変数は、その変数を定義したシェル上、及びそのシェルで実行されるプログラムからも参照する事のできる変数。
・環境変数は、シェル変数を export コマンドでエクスポートすることによって設定できる。
ubuntu@ubuntu-laptop:~$ EV=world     > シェル変数を定義。
ubuntu@ubuntu-laptop:~$ SV=local     > シェル変数を定義。
ubuntu@ubuntu-laptop:~$ export EV     > エクスポートした。
ubuntu@ubuntu-laptop:~$ bash       > 新しくシェルを起動。
ubuntu@ubuntu-laptop:~$ echo $EV     > EVの内容を表示。
world                   > 「world」が表示した。
ubuntu@ubuntu-laptop:~$ echo $SV     > SVの内容を表示。 

ubuntu@ubuntu-laptop:~$          > ↑SVはエクスポートしていないので、表示されない。
ubuntu@ubuntu-laptop:~$ $EV=new world   > EVを「new world」で定義・・・。
bash: world=new: command not found     > できなかった。
ubuntu@ubuntu-laptop:~$ $EV="new world"  > 「”」をつけてみた。
bash: world=new world: command not found  > できなかった。
ubuntu@ubuntu-laptop:~$ EV=new world    > 先頭の「$」が不要なことに気づき、再度やった・・・。
bash: world: command not found       > が、できなかった。
ubuntu@ubuntu-laptop:~$ EV="new world"   > 「”」をつけて、定義した。
ubuntu@ubuntu-laptop:~$           > できた。
ubuntu@ubuntu-laptop:~$ echo $EV      > 表示すると、
new world
ubuntu@ubuntu-laptop:~$           > ↑変更した内容で表示された。
ubuntu@ubuntu-laptop:~$ exit        > このシェルから抜ける。
exit
ubuntu@ubuntu-laptop:~$           > 戻った。
ubuntu@ubuntu-laptop:~$ echo $EV      > EVの内容を表示する。
world
ubuntu@ubuntu-laptop:~$           > 元のまま。子のプロセスでの変更は反映されていない。

・主な環境変数
 PATH : コマンドやプログラムを検索するディレクトリリスト
 PWD : カレントディレクトリ
 HOSTNAME :ホスト名
 USER : 現在のユーザー
 LANG : ロケール
 HOME : カレントユーザーのホームディレクトリ
 LOGNAME : ログインシェルのユーザー名
 PS1 : プロンプトの表示文字列
 PS2 : 複数行に渡る入力時のプロンプト
 HISTSIZE : コマンド履歴の最大値
 HISTFILE : コマンド履歴を格納するファイル
 TERM : 端末の種類(端末エミュレータ、ktermやrxvtなど)
(参考:termcapというデータベースを使って、端末の種類に応じてエスケープシーケンスを使い分けれる。)

・変数は、英字、数字、アンダーバー、OK。先頭に数字はできない。大文字、小文字は区別される。
 書式) 変数名=値
 ※「=」の前後にスペースが入らないように注意。
・定義された変数は、echoコマンドで参照できる。(「$」を先頭に付ける。)
 書式) echo [$変数名または文字列]
・unsetコマンド : 変数を削除する。
 書式) unset 変数名
・envコマンド、printenvコマンド : 定義されている環境変数を一覧表示する。
・setコマンド : 環境変数とシェル変数を両方表示する。
・exportコマンド : エクスポートすることで、新たに起動したシェルからシェル変数が参照できる。
 書式) export 変数名[=値]
ubuntu@ubuntu-laptop:~$ export EV=world2   > 1行でエクスポートと変数を定義する。
 ※変数を定義するときは、「$」は不要。
 ※変数を参照するときは、「$」は必要。

■感想:変数を定義するときにスペースを入れたら、エラーが出て焦った。「"」でスペース入りでも定義できたけど、まぁ、ビックリした。

【復習】3.1.2.シェルの基本操作と設定

・bashにある様々な機能・・・補完機能、カーソルの移動、コマンドラインの編集、実行制御、ディレクトリの指定
・補完機能:tabキーで残りの部分が自動的に補完される。
・カーソルの移動:Ctrlキーと組み合わせてカーソルを移動できる。
・コマンドラインの編集:Ctrlキーと組み合わせて、編集できる。
・Ctrlキー +
 A : 行頭へカーソルを移動する。
 E : 行末へカーソルを移動する。 
 D : カーソル部分を1文字削除する。
 H : カーソルの左を1文字削除する。(Backspaceと同じ)
 L : 画面をクリアしてカレント行を再表示する。
 C : 処理を中断する。
 S : 画面への出力を停止する。
 Q : 画面への出力を再開する。
 Z : 処理を一時停止(サスペンド)する。

・ディレクトリの指定、特殊記号(メタキャラクタ)
 ~ : ホームディレクトリ
 . : カレントディレクトリ
 .. : 1つ上のディレクトリ

■感想:Ctrl+L の画面のクリアは、気分的にスッキリするけど、後で見直したいときはやらない方がいいかも。・・・と思ったけど、スクロールしたら残ってた。よかったよかった。

【復習】3.1.1.シェル(3.1.LINUXのコマンドライン操作)

3.1.1.シェル
・シェル:ユーザーからのコマンドを受け付け、必要なプログラムを実行しているのがシェル(shell)というプログラム
・代表的なシェル:Bourneシェル、bash、Cシェル、tcsh、kornシェル、Zシェルなど
・利用可能なシェルは、/etc/shells ファイルで確認できる。

ubuntu@ubuntu-laptop:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen
ubuntu@ubuntu-laptop:~$

・デフォルトのシェルを変更するには、「chsh」

ubuntu@ubuntu-laptop:~$ chsh
パスワード:
ubuntu のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
ログインシェル [/bin/bash]: /bin/sh
ubuntu@ubuntu-laptop:~$
ubuntu@ubuntu-laptop:~$ chsh
パスワード:
ubuntu のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
ログインシェル [/bin/sh]: /bin/bash
ubuntu@ubuntu-laptop:~$

・ユーザーごとのログインシェルは、/etc/passwd ファイルに記述されている。

ubuntu@ubuntu-laptop:~$ cat /etc/passwd |grep "ubuntu"
ubuntu:x:1000:1000:ubuntu,,,:/home/ubuntu:/bin/bash

・bash、一般ユーザーの場合は、「$」、rootは「#」(※環境変数PS1で設定する)

ubuntu@ubuntu-laptop:~$ echo $PS1
${debian_chroot:+($debian_chroot)}\u@\h:\w\$

【復習】3.1.LINUXのコマンドライン操作

3.1.1.シェル
3.1.2.シェルの基本操作と設定
(補完機能、カーソルの移動、コマンドラインの編集、実行制御、ディレクトリの指定)
3.1.3.シェル変数と環境変数
3.1.4.環境変数PATH
3.1.5.コマンドの実行
3.1.6.引用符
3.1.7.コマンド履歴
3.1.8.マニュアルの参照
3.1.9.ファイル操作コマンド
3.1.10.メタキャラクタの利用