今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

vimを本気で使ってみる

Vim講座1 - think and errorに触発されて、本気でvimキーバインドを覚えて用と思った。

vimtutorでお勉強

ただ「覚える」だけではすぐに忘れる。練習問題で体に覚えこませるのが重要。

# vimtutor

を実行するとvimチュートリアルテキストが起動する。これで良く使うvimコマンドは勉強できる。これを作った人には本当に感謝したい。対機械ばかりに目が行きがちなプログラマーの中で、対人間を意識したチュートリアルを作れる人は尊敬する。

一度やっただけでは"身に"つかない。毎日繰り返し1週間くらいやればOKかなぁ。

vimperatorで普段からvim

Firefoxアドオンのvimperatorを使うと、Webブラウジングvimキーバインドで行える。vimと操作が被ってないところもあるが、毎日vimを使うって意味ではちょうどいい。Ubiquityよりは普段使いできそう。

Emacsとの違い

伝統的に

  • vi→設定ファイルなど簡単なテキストファイルを編集するためのもの。軽い。
  • Emacs→プログラムなど複雑なテキストを書くためのもの。重い。

ということになっている。もっとも今では両者が歩みつつあるらしいが、システム定義ファイルをいじるのはvi方式で行う場合が多い(visudoコマンドなど)。なのでシステム管理者はvi、プログラマEmacsを覚えるといいだろう。

bashの便利な使い方

Windowsユーザーに教えるLinuxの常識(9):bashの便利な機能を使いこなそう (1/2) - @IT

Tabによるファイル名補完は身についたので、覚えるのはこの2つ。

  • historyで過去に実行したコマンドを表示→![コマンドの数字]で再実行可能
  • Ctrl + Rでインクリメンタルサーチモード。過去に実行したコマンドを実行できる。

あとは簡単な操作方法を。

  • Ctlr + A:行頭に移動
  • Ctlr + E:行末に移動
  • Alt + F:一単語右に移動
  • Alt + B:一単語左に移動

いろいろな検索方法

ファイルを検索するのに一番早いのは、updatedbコマンドで作成したインデックスファイルを走査するlocateコマンドである。ただし複雑な正規表現はつかえずファイル名でしか検索が出来ない。これに対してfindはあまり早くないが多彩な検索が可能。速度だけなら、locateがgoogleデスクトップ並み、findが普通の検索。

whichならプログラムのみ(つまり実行ファイル属性)検索することができる。

# which httpd
/usr/sbin/httpd

※2008/11/23訂正
whichはパスの通ったディレクトリ配下の実行ファイルを探すようである。なので、/etc/init.d/以下の実行ファイルは検索してくれない。

# which yum-cron
/usr/bin/which: no yum-cron in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

whereisを使えば、実行ファイルのパス名やライブラリ、マニュアルの場所を検索できる。

# whereis httpd
httpd: /usr/sbin/httpd /usr/sbin/httpd.worker /etc/httpd /usr/lib/httpd /usr/share/man/man8/httpd.8.gz

Linux起動プロセスまとめ

Windowsユーザーに教えるLinuxの常識(10):Linux起動の仕組みを理解しよう[init/inittab編] (1/2) - @IT

前も纏めたけど理解が深まったので。

1./sbin/init

ブートローダーの読み込み、デバイスの初期化(Windowsでいうconfig.sys)を行った後、最初に実行されるLinuxプログラムは/sbin/initである。initの動作を決定する定義ファイルは/etc/inittabである。initは全ての親プロセスとなる。

2./etc/rc.d/rc.sysinit

/sbin/initから/etc/rc.d/rc.sysinitを呼び出す。これはネットワークの初期化やホスト名の設定を行っているシェルスクリプトで、どのランレベルでも動く。

3.ランレベルに応じて/etc/rc?.d/ディレクトリ以下のシェルスクリプトを実行

/etc/rc?.d/以下のシェルスクリプトで頭文字がS(sではない)のものは起動するもの、頭文字がK(kではない)のもの停止するものである。今からログインするのに停止する必要ないだろ、というツッコミはあるがマルチユーザーモードからシングルユーザーに移行する場合はプログラムの停止が必要となる。

S??とあるサービスは、Windowsでいう「スタートアップの種類」が「自動」のサービスである。逆に言うなら、自作スクリプトをPC起動時に自動起動したいのなら、自分でRCスクリプトを書いてrc?.d以下に設置すればよい。シェルスクリプトなので単に

/usr/local/bin/httpd

のように書くだけでもOKだが、引数でstart、stopくらいつけておくと便利かも。作りこめば、起動時にモジュールを読み込むなどもできる。

Windowsでもサービス開始時にパラメータつけることができるし。

/usr/binと/usr/local/binの違いについて

表題の通り、2つの違いが分からなかった。perlスクリプトをダウンロードして中身を見てみると、先頭にusr/bin/perlって書いてるものもあり、一方で/usr/local/bin/perlと書いてるものもある。

2つの違い

パッケージシステム(yumやYaST2)によってアップデートされるかどうか。つまり、usr/bin以下のperlyumを実行するとアップデートされる。しかし、usr/local/bin以下に導入した場合、勝手に中身が変わることはない(その代わり、自分でアップデートする必要がある。)

ん?それって/usr/local/bin使う意味なくない?

/usr/local/binの使い方

/usr/local/bin ‐ 通信用語の基礎知識
例えば、OS標準のmakeが使えず、GNU makeが必要、といったことは良くある話である。しかし標準のmakeを置き換えてしまうことは、望ましくない結果を生む可能性がある。

このような場合、/usr/local/binにGNUのmakeを入れ、コマンドパスで/usr/local/binを/usr/binより先に書くだけで、簡単にmakeを差し替える事ができる。

つまり、システムの標準は/usr/bin、そうでないものは/usr/local/bin、とすることで、ユーザは新しいコマンドをインストールして使うことができる。もし問題があれば、/usr/local/binのコマンドを削除するだけで良い。

これは、新しいバージョンのPerlなどを試したい、と言った時にも有効である。

ふむふむ。つまり安定版以外の評価版バージョンは/usr/local/bin以下に保存すると。んで、スクリプトの先頭に/usr/local/binを書いとくと評価版を使ってくれる。もし評価版に不具合があれば/usr/local/bin以下のファイルを削除するだけ。スクリプトの中身を書き換える必要はない。

自作スクリプトの保管場所

Windowsユーザーに教えるLinuxの常識(4):ユーザーとパーミッションにみるLinuxの設計思想 (1/2) - @IT
作業領域は/home以下にユーザー名と同じディレクトリが用意されているのが普通で、ここを「ホームディレクトリ」と呼びます。ちょっとしたツールなどは、この下にbinやscriptなどといったディレクトリを作ってインストールします。

自作スクリプトの保管場所は/home/ユーザーID/bin(script)でよかったみたい。

ファイル保存場所セオリー(ディレクトリ構造)

Windowsユーザーに教えるLinuxの常識(2):各ディレクトリの役割を知ろう(ルートディレクトリ編) (1/2) - @IT
Windowsユーザーに教えるLinuxの常識(3):各ディレクトリの役割を知ろう(サブディレクトリ編) (1/2) - @IT

一番知りたかったファイル保存場所の話。各ディストリビューションで違いはあっても、基本的にはFHSに基づいて設計されてるみたいです。

Filesystem Hierarchy Standard - Wikipedia

全部羅列するのもあれなんで一部だけ。

/etc
設定ファイルがたくさん入ってる場所。サブディレクトリもたくさんある。
/home
/home/[ユーザー名]が、Windowsでいう「マイドキュメント」的なとこ。大容量のパーティションを割り当てるとよい。
/bin、/sbin
システム系のプログラムファイルを保管します。binはcatなど全員が使うコマンド、sbinはshutdownなどrootが使うようなコマンドを保存。Windowsでいうと「C:\WINDOWS\system32」です。
/usr
「読み出し可能かつ共有可能なファイル」つまりプログラムファイルを保管します。/bin、/sbinとの違いは、アプリケーションプログラムを保存するってとこかな。Windowsでいうなら「C:\Program Files」。/usr/localにはパッケージシステム(yumやYaST2)管理外のプログラムファイルを保管。例えばLinux用のフリーソフトとかゲームとか。/usr/X11R6は歴史的な事情があるディレクトリ。
/var
「ホスト固有の可変データ(variable data)用領域」。ログ、lockファイル、キューディレクトリなどが存在する。…の割に、atacheの公開ディレクトリが/var/www/以下だったりするからややこしい。

ちょっと気持ち悪いのが、写真や動画データの推奨保存先が/home/[ユーザーID]だということ。俺はWindowsでDドライブ直下にフォルダを作成してデータを保存してる(つまり他のユーザーも見れる)んだけど、Linuxはマルチユーザー志向なので個人用PCでも/home/[ユーザーID]以下にデータを保存してしまう→まるで個人用データのような扱いに見えるし階層も深くなる。

あと、自作のスクリプトはどこで動作させればいいのかな…。/usr/local/binってレベルじゃないしな…。/home/[ユーザーID]/scrにしておくか。

まだ掴めてない部分はあるけど、基本は抑えたのでよし。

パーティション分割セオリー

@ITの「Windowsユーザーに教えるLinuxの常識」という記事を読んでます。
連載記事 「Windowsユーザーに教えるLinuxの常識」

2001年、つまり7年前の記事だけど、Linuxにおけるパーティション分割やファイル保存場所の「セオリー」つまりは「お約束」を教えてくれるのですんごい助かる。こういうのって教本や資格本には全然乗ってなく、雑誌の連載で断片的に知識を保管するのが主だったんだよなぁ。

パーティション分割について

Windowsユーザーに教えるLinuxの常識(1):パーティション分割/非分割のセオリー (1/2) - @IT

Windowsの場合、Cドライブをシステムファイルとして15GB〜20GB割り当て、残りをDドライブにするのが普通。HDDが2台あるなら、2台目はまるごとEドライブにして高速アクセスが必要なファイル(仮想メモリとか)はEドライブに保存するとよい。

Linuxの場合、ドライブ名がなく全て/以下にマウントされる。なので、作業用ディレクトリの/varや/tmp、データ保存用ディレクトリの/homeを独立させると後で拡張しやすいのかな?とはいえ、HDD分割すると未使用領域が分散して非効率的になるので、無駄に分割することはないのかも。WindowsでもC、Dに分割せずにCだけに纏めてフォルダで管理しても全然いいんだし。…あ、デフラグはめんどくさくなるか。

2台目のHDD増設時の動きは、新しいドライブ文字を割り当てるWindowsの方が分かりやすいかな。Linuxは好きなところにマウントできるので、ディレクトリだけ見てもどのHDDを使ってるのか分からない。まぁ「セオリー」を身につければ大丈夫なんだろうが。Windowsで例えるなら、Cドライブ以外は作れず追加HDDはCドライブ以下の空フォルダにNTFSマウントする感じかな。

Tips