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.メタキャラクタの利用

2009年10月5日月曜日

WordPress をインストールした。

昔、とても気になったJavascriptがあったが、そちら側の専門でもなかったので、検索キーワードが浮かばず抽象的な説明しかできなかったせいで、せっかくの優秀な検索サイトを活用できなかった。最近、違う探し物をしていた時に、それは見つかった。(と言っても…。)Thickbox と Lightbox だ。
ThickBox は jQuery 、Lightbox は prototype.js 。
とにかく、ThickBoxをWordPressで使ってみたくて、WordPress, phpmyadmin,を入れなおした。しかし、ここで行き詰った。楽をしようと、WordPress をaptでインストールしたのだが、apache2の設定も分かってないのにやったのが良くなかった。そこで、ちゃんとダウンロードしてから展開した。
「mv のオプション、-t の使い方。」
# mv -t 移動先ディレクトリ名 移動元のディレクトリ
逆にしてしまい、とても焦った。

また、wp-config-sample.php からwp-config.phpを作ったが、viで文字化けしたので、あるサイトを参考にさせて頂き、下のように書いた。
# vi ~/.vimrc
set encoding=euc-jp
set fileencodings=iso-2022-jp,sjis,utf-8

#vi wp-config.phpを開くとまだ文字化けしていたが、このUbuntuは utf-8 であることを思い出し、1行目を utf-8 に変更した。

後は、MYSQLにDBとユーザーを作り、WordPressのインストールが出来た。
ThickBox は次回。

2009年10月3日土曜日

crontabの設定をした。

自宅での勉強のため、Ubuntu のサーバー版を入れて、主にCUIで作業を行っているが、時々、電源を入れたまま寝てしまう事がある。
朝、起きて気付けばいいのだが、夕方になって電源が入りっぱなしに気付くこともある。これは電気の無駄遣いであり、なんとかしなければとは思っていたが、なかなか動けないでいた。
というのも、自動で電源が落ちるようにすればいいのだが、「何時に落とすか」というので迷っていた。cronでスケジュールできる事は知っていたが、作業している時に、自動でshutdownが行われても困るからである。
こんな風にどうしようかとは思いつつ、先延ばしにしていたわけだが、また昨日も点けっぱなしで朝になって気付くという事態になったこと、Linuxのお勉強がおろそかになっていたこともあり、ついに動き出した。
結局、「何時に落とすか」は解決せず、とりあえず、2:30にメッセージ、3:00に落ちる、という設定にした。
設定する前にテストをしていて、何か機能を実装する時はやはり色々テストをしないとダメだなと、改めて確認し、知識として持っておくことも大事だが、それを「経験」として積むことも大切だと、改めて感じた。

内容はこんな感じである。

#crontab -l
30 2 * * * /sbin/shutdown -k now "Please LogOut Immediately"
0 3 * * * /sbin/shutdown -h now
0 6 * * * /sbin/shutdwon -h now

テストは、
#crontab -e
で、エディタが起動し、今の時間プラス1分で、shutdown -k now "test" で、自動でメッセージが表示されることを確認した。

2009年10月2日金曜日

【復習】第1章システムアーキテクチャ

1.システムアーキテクチャ
1.1.ハードウェアの基本知識と設定
1.1.1.基本的なシステムハードウェア

・CPU
・メモリ
・ハードディスク
・入力装置
・拡張カード
・USB機器

1.1.2.BIOS

・BIOS:Basic Input Output System 入出力基本システム

1.1.3.デバイスの確認

・/proc以下
・LINUXは、ハードウェアへのアクセスを抽象化するデバイスファイルを持っている。/dev以下
・lsusb(コマンド):USBデバイスの情報を表示する。
・lspci(コマンド):PCIデバイスの情報を表示する。

1.1.4.デバイスドライバのロード
・デバイスドライバ:デバイスを利用するために必要な制御プログラム。
・lsmod(コマンド):ロードされているカーネルモジュールを確認する。
・modporbe(コマンド):手動でデバイスドライバをロードする。

1.2.システムの起動
1.2.1.システムが起動するまでの流れ

 BIOS → ブートローダ → カーネル → init

1.2.2.ブートオプションの指定

・ブートローダ起動時に、様々なブートオプションを指定できる。

1.2.3.起動時のイベント確認

・dmesg(コマンド):カーネルが出力したメッセージを一時的に蓄えておくバッファの内容を表示する。
・システムの起動時の状況は、/var/log/messasges や/var/log/boot.logにログが格納されている。

1.3.ランレベルとシャットダウン
1.3.1.ランレベル

・LINUXではランレベル(実行レベル)と呼ばれるいくつかの動作モードがある。
・シングルユーザーモードは、rootユーザーだけが利用できる。
・runlevel(コマンド):現在とその前のランレベルを表示する。
・init(コマンド):ランレベルを変更する。
・telinit(コマンド):ランレベルを変更する。
・デフォルトのランレベルの設定は、/etc/inittab を編集する。

1.3.2.システムのシャットダウンと再起動

・shutdown(コマンド):システムのシャットダウン、再起動をする。
・shutdown -k は実際にシャットダウンせず警告メッセージを通知する。
・shutdownコマンド実行後は、ユーザーがログインできなくなる。

よし!LINUXをちゃんと取り組もう!

とりあえず、仕事ではSolarisを触って、自宅でも少しLINUXを触ってみたが、出来ることと言えば、lsとかviとか、本当に簡単なのしかない。インターネットには色々な情報があって、それ通りにRAIDとかWordPressとかWebminとか、とにかくやったものの、ちゃんと分かっていない。そこで、今からでもちゃんと取り組んでみようかと思い、まずはLPIの本を読みだしてみた。

まだ基本的な事からだけど、日々積み重ねていきたい。

2009年10月1日木曜日

時間の使い方を変えるのだ!

【はじめに・・・】

2009年 9月30日、 いろいろあった。
J-WAVEの『GrooveLine』の最終回(@渋谷HMVスタジオ)を見に行った。
すごい人数だった・・・。

ある本を読み、心が動かされた。

日進月歩で変化していくIT世界のこれからについて、とても勉強になる内容だった。
数年前に出版された物だったが、要するに、Googleは凄いこと、世界中と繋がっているインターネットが実現できる(しようという)世界の可能性は無限大であることが、今現在でも世界がどんどん進化している事実を感じてはいても、とても衝撃的だった。

すでに分かっていることだが、自分は技術、知識、経験、そして文章力も乏しい。
そしてそれを認識しつつも内向きな思考で、自分の殻に閉じこもっていた。
能力が低いことを認めたくない・・・。
真実の自分を晒してしまうことを、とても恐れているのだ。
なんとなく分かってはいたけど、その問題を直視せずに避けていた。
「逃げ癖」が抜けないのだ。

最近は世界中の多くの人がブログやらtwitterやらの道具で色々な表現ができるようになった。
ジャンルもカテゴリも内容も本当に色々なモノがあり、誰かにとっては重要であったり自分にとっては無用であったりするが、それを見分け、自分の骨肉としていくのは大変に労力のかかることである。
本当に、「情報が玉石混交している」とは、本質をついた表現だと思い、自分はその「石」の一つでしかないと思う。

この数年を振り返って本当に色々なことがあり、自分の事やこれからの事を今まで以上に考えた。そして、今のままの「石」の状態では良くないので、なんとしても抜け出したいとも思っている。
その為の務めの第一歩として、このブログをできるだけ更新していくようにしたい。
その際には、次のルールを忘れないようにして頑張っていこう。

・真面目に文章を書く。(口語表現、タメ口をなくす。)
・たぶん後々恥ずかしくなるだろうけど、書き出したら公開する。

そして、

「玉磨かざれば光なし(たまみがかざればひかりなし)」

これを体験できるように頑張ろう。