2011年3月30日水曜日

wwwサーバとしてのApacheの役割

クライアントがURLを指定することで、httpdの様々な設定を記述しているWWWサーバ構成ファイル(/etc/httpd/conf/httpd.conf)に従い、指定されたルートディレクトリ(例えば /var/www/html )内のベージを提供します。

WWWサーバとしてはデファクトスタンダードとなっているApacheについて解説します。

httpdの起動と動作確認
httpdを起動させます。
# /sbin/service httpd restart

httpdを起動したらログを確認します。
# tail /var/log/httpd/error_log
# tail /var/log/httpd/access_log

動作確認
pingコマンドによるDNSサーバの名前解決テストとケーブルの接続確認テストを行います。
# ping ${ドメイン名}

ブラウザから http://${ドメイン名} で画面が表示されればOK

サーバーステータス情報の検索
ブラウザから http://${ドメイン名}/server-status/ でサーバステータスが表示されます。


Apacheの並行処理
不特定多数のクライアントから同時に接続されるネットワークサーバでは、処理が継続できるように並行処理を行う必要があります。Apacheは、多数の接続を同時に処理できるソフトウェアであり、並行処理の実装がサーバに大きな影響を与えます。

並行処理の実装モデルとしては下に挙げるものがあります。
*マルチプロセスモデル
        プロセスを複数生成して並行処理を実現する
*マルチスレッドモデル
        プロセスより軽量なスレッドを使い並行処理を実現する
*イベントドリブンモデル
        入出力を監視してイベント発生のタイミングで処理を切り替え、シングルスレッドで並行処理を実現する

Apacheの大きな特徴として、各種機能がモジュール化によりきれいに分離されています。並行処理を行う部分の実装もモジュールになっており、MPM ( Multi Processing Module ) と呼ばれています。MPMの設定次第で、並行処理のモデルを選択することができます。

どちらのモデルを選択しても基本的に、1クライアントに対して1プロセス/1スレッドが割り当てられます。Apacheの性能としては、同時にどれだけのプロセス/スレッドが生成できるかにかかっています。


■httpd.confの設定 (prefork)
UNIXとして代表的なMPMであるprefork ( マルチプロセスモデル ) を選択したとき、httpdの設定項目で重要となるのは、ServerLimitとMaxLimitです。

*ServerLimit
        サーバ数(プロセス数)の上限
*MaxLimit
        同時に接続できるクライアント数の上限

MaxClient > ServerLimit とすることはできません。さて、この値をどの程度に設定するかが問題になってきます。目安として、”サーバが搭載している物理メモリ量”と”1プロセスあたりの平均メモリ消費量”が挙げられます。

例えば下のようにして具体的に数を求めることになります。
・物理メモリ量:4GB
・httpdプロセス1つあたりのメモリ使用量:100MB
・OSが利用するメモリ:512MB
・(4GB-512MB) / 100MB = 35


preforkに関しては、コピーオンライトという親子でメモリを共有する機能があります。簡単にいうと、物理メモリに対して書き込みが行われていない領域は共有し続けることができ、これによりメモリ上のページの重複を避けて、メモリを効率的に利用することができます。なので、子プロセスのメモリ使用量は、親と共有していないメモリだけを考えればよく、MaxClientsの数はさらに増やすことができます。

しかし、コピーオンライトによるメモリの共有は、時間の経過とともに共有率が下がっていくことは簡単に想像できるでしょう。そこで、Apacheは、定期的に子プロセスを終了して新しい子プロセスを作成して、この状態を回避します。

*MaxRequestsPerChild
        例えば、1024と設定すると、1プロセスあたり1024リクエストを処理すると、このプロセスは終了して、
        親が新しい子を用意します。

2011年3月29日火曜日

『冷静と情熱のあいだ Blu』 辻仁成

PastedGraphic-2011-03-29-00-05.jpg


ここ最近、辻仁成さんばかり読んでいるな、と自覚しつつも彼の小説を手にとってしまいます。

読み終わって気付いたことですが、この小説は、辻仁成さんと江國香織さんによる恋愛小説とのことです。月刊誌に二人が交互に連載するという形で書き上げられたものです。当時(10年前ぐらい)は50万を超えるベストセラーでした。にも関わらず、恥ずかしながら僕は世間知らずなので、この小説は全く耳にしたことがありませんでした。今回は辻仁成さんのパートである『冷静と情熱のあいだ Blu』を読みました。機会があれば、江國香織さんのパートの『冷静と情熱のあいだ Rosso』も読んでみたいです。

これは男性の視点から描いた恋愛小説です。

やりがいのある仕事と大切な彼女をもつ主人公の心の中に、どうしても忘れられない女性あおいがいる。あおいを失ったあの日から、二度と会うことはないと分かっていながらも、「10年後にドォウモで会おう」そんな、たわいもない約束を信じて、生きてきた。

辻仁成さんらしい豊かな表現が使われた小説でした。

ここ最近僕は、恋愛小説にはまっていますね。普段の生活に不満はないですけど、彼の作品の主人公のごとく、思いっきりのめりこむ恋愛を一度ぐらいは経験したいです。彼の描く主人公のポイントとしては、一人の女性を真剣に愛すること、真剣な恋ゆえに苦しみを抱え込むこと、この点が僕にとって重要な気がしてなりません。

『恋は語るものではなく、貫き通すもの』


妄想だけが膨らんでいく今日この頃・・・

2011年3月26日土曜日

psコマンド使い方

ps (Report Process Status) コマンドはプロセスが持つ情報を出力します。すなわち、カーネル内部が保持するプロセスディスクリプタに保存された各種情報に、ユーザ空間からアクセスするツールです。

ps
書式        ps [オプション] [プロセス番号n]
オプション
u        ユーザー名と開始時刻を表示する
a        すべてのユーザープロセスを表示する
x        制御端末のないプロセス情報を表示する
l        より詳細な情報を表示する
f        プロセスの親子関係をツリー状に表示する
w        1プロセスあたりの表示行数を増やす
j        ジョブ形式で表示する



以下は ps auxw の表示です。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2616.36.16-2011-03-26-16-33.png

%CPU:osコマンドを実行した際のプロセスのCPU使用率
%MEM:プロセスが消費している物理メモリ量。ファク分立で表示
VSZ:そのプロセスが確保している仮想メモリ領域のサイズ
RSS:そのプロセスが確保している物理メモリ領域のサイズ
STAT:プロセスの状態
TIME:CPUを使った時間を表示する項目


物理メモリと仮想メモリ
VSZ(Virtual Set Size)はプロセスが確保した仮想メモリ領域のサイズ
RSS(Resident Set SIze)はプロセスが確保した物理メモリ領域のサイズ

どうして2つのメモリの指標があるのでしょうか?
仮想メモリとは、プログラムがメモリを使用するにあたって、物理的なメモリを扱うのではなく、物理メモリを抽象化したソフトウェア的なメモリを扱わせる機構です。ハードウェアが提供する「ページング(Paging)」と呼ばれる仮想メモリ機構を使って実現し、OSがその仮想メモリ領域の管理を行います。

仮想メモリ領域は、プロセスがカーネルからもらったその新品の仮想メモリ領域に対して書き込みを行った時点ではじめて物理メモリ領域との対応付けが行われます。

仮想メモリ機構によって得られる恩恵は大きく、ざっと以下のことを挙げることができます。
  • 本来物理メモリに搭載されている容量以上のメモリを扱えるかのようにプロセスにみせかけることができる
  • 物理メモリ上ではばらばらの領域を連続した一つのメモリ領域としてプロセスにみせかけることができる
  • それぞれのプロセスに対して、プロセスごとに独立したメモリ空間を持っているように見せかける
  • 物理メモリが不足した場合は、長時間使われていない領域の、仮想メモリと物理メモリ領域の対応を解除する。解除されたデータはディスクなどに対比してまた必要になったときに元に戻す。いわゆる「スワップ(Swap)」
  • 異なる2つのプロセスが参照する仮想メモリ領域を、同一の物理メモリ領域に対応させることで、2つのプロセスでメモリの内容を共有する。IPC共有メモリなどはこの方法で実装される。
■スワップが発生しているときの対処方法
スワップが発生している場合は物理メモリが不足している証拠。
RSSサイズを見て、極端に大きなプロセスがないかなどを探っていけばよい。



CPU使用時間
TIMEはプロセスが実際にCPUを使った時間を表示する項目です。つまり、プロセスディスクリプタに記録されたCPU使用時間のことです。

CPU負荷が極端に高いシステムがあったとき、psのTIMEを調べれば、どのプロセスがCPUをたくさん使っているのかを確認することができます。

sarコマンド使い方

sar (System Activity Reporter) は、OSが報告する各種指標を参照するツールです。以下の2つの使い方があります。
        ・過去の統計データをさかのぼってアクセスする
        ・現在のデータを周期的に確認する

sarにはsadcというバックグラウンドで動くプログラムが付属しています。sarコマンドを実行すると、sadcが集めたCPU使用率の過去の統計を参照することができます。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.15.11-2011-03-26-15-56.png

user:ユーザモードでCPUが消費された時間の割合
nice:niceでスケジューリングの優先度を変更していたプロセスがユーザモードでCPUを消費した時間の割合
system:システムモードでCPUが消費された時間の割合
iowait:CPUがディスクI/O待ちのためにアイドル状態で消費した時間の割合
steal:XenなどOSの仮想化を利用している場合に、ほかの仮想CPUの計算で待たされた時間の割合
idle:CPUがディスクI/Oなどで待たされることなく、アイドル状態で消費した時間の割合

サーバの性能を引き出す

1台で処理できる負荷をサーバー数台で分散させるのは無駄なことです。なのでここでは、単一のサーバの性能を十分に引き出すことに焦点をあててみます。

まず、単一ホストの性能を引き出すには、サーバリソースの利用状況を正確に把握しなければなりません。そのために負荷計測を調べる必要があります。では、どのように調べればいいのか?実は、負荷を知るのに必要な情報はOSが持っています。

例えばLinuxでは、ps・top・sarなどのツールを利用します。

■psコマンド
プロセス識別子名・CPU時間・コマンド名を表示するツールです。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.33.34-2011-03-26-12-46.png


■topコマンド
topコマンドはある瞬間のOSの状態のスナップショットを表示するツールです。CPU使用率やメモリの利用状況など、様々な値が報告されています。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.00.09-2011-03-26-12-46.png

■sarコマンド
sar(System Admin Reporter:システム管理者向けレポーター)はCPUやネットワーク、メモリ、ディスクなどのシステム情報を確認・出力できるツールです。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.15.11-2011-03-26-12-46.png



ボトルネック見極め作業
上のツールを使ったところで、報告される値が多種にわたることが分かります。報告された値の中で、どこを見ていけばいいのでしょうか。実は、ボトルネックを見極めるための作業は、大きく2つに分けることができます。

■ロードアベレージを見る
ロードアベレージとはシステム全体の負荷状況を示す指標のことです。top・uptimeなどのコマンドでロードアベレージを見ます。ロードアベレージの値をヒントに、問題の切り分けをすることになります。

例) ロードアベレージは低いのにシステムのスループットが上がらない
ソフトウェアの設定や不具合・ネットワーク・リモートホスト側に原因がないかを調査します

例) ロードアベレージが高い場合
後述するCPU・I/Oのいずれかの原因があるのかを調査します。


■CPU・I/Oのいずれがボトルネックかを探る
まず、sar・vmstatコマンドを利用して時間経過とともにCPU使用率やI/O待ち率の推移を確認します。

例) CPU負荷が高い場合
原因としては以下の二つが挙げられます。
・ディスクやメモリ容量などそのほかの部分がボトルネックにはなっていない理想的な状態
        - サーバ増設やプログラムのロジックなので改善対処
・プログラミングの暴走で、CPUに必要以上の負荷がかかっている
        - プログラムの不具合を取り除きます



例) I/O負荷が高い場合
原因としては以下の二つが挙げられます
・プログラムの入出力が多くて負荷が高い
        - メモリ増設でキャッシュ領域を拡大させられる場合は、メモリを増設する
        - メモリ増設出来ない場合は、データの分散・キャッシュサーバの導入
               
・スワップが発生してディスクアクセスが発生している
        - 特定のプロセスが極端にメモリを消費していないかをpsで確認
        - プログラムの不具合でメモリを使いすぎている場合は、プログラムを改善
        - 搭載メモリが不足している場合はメモリ増設で対応



マルチタスクOSと負荷
近年のマルチタスクOSでは複数の異なるタスクを実行することができます。これは、短い時間間隔で複数のタスクを切り替えながら処理をするめることで実現しています。しかし、実行するタスクが増えてくると、CPUが空くのを待たされるタスクが現れます。この待ち状態は、プログラムの実行遅延となって現れます。

topコマンドの出力として”load average”という数字があります。これは、左から順に1分・5分・15分の間に、単位時間当たりに待たされたタスクの数を表します。
       
        load average: 0.07, 0.11, 0.10

ロードアベレージが高い状況は、それだけ遅延がある、つまり負荷が高い状況ということです。

しかし、これだけでは、CPU・I/Oのボトルネックを探ることができません。もう少し細かい調査が必要になってきます。


CPU使用率とI/O待ち率
過負荷でシステムのパフォーマンスが劣化する原因は、ほとんどの場合CPUかI/Oのどちらかです。ここで、CPU使用率とI/O待ち率が生かされます。この指標の確認の方法としてはsar(System Activity Reporter)コマンドがあります。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-2613.15.11-2011-03-26-12-46.png

■ロードアベレージが高く、CPU使用率の値が高い
CPU使用率の値は、上の「%user」と「%system」で表示されます。

%user:CPUのユーザモードでの使用率
        ユーザプログラムが動作する際のCPUのモード、つまり通常のアプリケーションが動作するモード
        プログラムがCPUに負荷をかける場合、多くはユーザモードでの使用率が高くなります。

%system:CPUのシステムモードでの利用率
        システムプログラム=カーネルが動作する際のCPUモード
        大量のプロセスやスレッドを動作させている場合、システムモードでの使用率が高くなります


■ロードアベレージが高く、I/O待ち率の値が高い
I/O待ち率の値は、上の「%iowait」で表示されます。

%iowait:I/O待ち率



■ボトルネックを見極める
CPU、I/Oのどちらかが原因だということが分かったら、そこからさらに詳細に調査していきます。例えば、メモリの使用率やスワップ発生状況などです。

ボトルネックを見極める方法としては、
  1. ロードアベレージなどの総合的な数字
  2. CPU使用率やI/O待ち率などのより具体的な数字
  3. 各プロセスの状態
上のようにトップダウンで見ていく戦略が有効です。



ボトルネックを発見して取り除くことが性能向上につながる
チューニングは ”ハードウェア・ソフトウェアが性能を十分に発揮するために、問題があれば取り除く” という作業です。ハードウェア・ソフトウェアがもともと持っている性能以上の性能を出すことは不可能です。

つまり、サーバの性能を引き出すためには、ボトルネックが発生したときに原因と解決を見極めるための知識が必要になります。



       

2011年3月20日日曜日

Oracle文字化け

SQLを実行するさいに、文字化けをするので、色々調べてみました。

参考:
http://www.atmarkit.co.jp/fdb/rensai/ora_admin/05/oraadmin0501.html


文字化けが発生したとき、対処が困難になる場合がほとんどです。まず、Oracleの内部処理によるものなのか、別のソフトウェア製品の処理が介在したことによるものなのか、といった問題の切り分けが重要になります。そのため、Oracle内部の文字データと文字コードの処理を理解する必要があります。

日本では、歴史的な経緯から複数の文字コードが存在します。例えば、ShiftJIS・EUC・Unicodeといったものがあります。このため文字データをやりとりする場合、文字コードの変換が必要になってきます。ここでいう文字コードの変換とは次に紹介するビット列の変換に相当します。
       
        あらかじめ定められた変換表をに基づき変換
        ・ShiftJIS で「あ」に対応するビット列 = 0x82A0
        ・Unicodeで「あ」に対応するビット列 = 0xE38182


Oracleの文字コードの設定
Oracleでは、対象となるシステムに様々なOSが介在するため、システムごとに文字コードを指定・変換する必要があります。

Oracleでは、次のようなパラメータが存在します。
        ・データベースキャラクタセット
                データベースに文字データを保存するさいの文字コードを示す
                データベースに格納される文字データをある特定の文字コードで一元的に保管する仕組み
                データベースの作成時に指定する
        ・NLS_LANG
                クライアント環境に適した文字コードを指定する
                

■データベースキャラクタセット
データベースには、作成時に1つのデータベースキャラクタセットを指定します。

次のSQLを実行し確認することができます。
SQL> SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';

■NLS_LANG
NLS_LANGは環境変数として設定することができます。設定する値自体は、クライアント環境がサポートしているキャラクタセットを指定する必要があります。たとえば、Window環境では、一般的に日本語EUC文字コードには対応していないので、JA16EUCを指定すると文字化けが発生する場合があります。


Oracleは自動的に文字コード変換を行う
NLS_LANGとデータベースキャラクタセットが異なっていても、Oracleは自動的に文字コード変換を行います。

■クライアントからOracle Databaseに対して文字データを送信する
以下の手順が行われます。
  1. Oracleクライアントから入力された文字データをいったんUnicodeに変換する
  2. Unicodeからデータベースキャラクタセットに対応した文字コードに変換する
  3. Oracle Databaseに文字データを送信する
ただし、データベースキャラクタセットとNLS_LANGのキャラクタセットが同じ場合、Oracleは例外的に文字コードの変換を行いません。


Oracleの文字化けの原因と対処
■クライアント側で入力された文字が、データベース側のキャラクタセットで対応していない
クライアントのNLS_LANGとOracleのデータベースキャラクタセットが異なる場合に起きます。

NLS_LANGでは対応できる文字でも、データベースキャラクタセットでは対応できない一部の文字においては、文字コード変換が正常に実行されません。例えば、JA16EUCのデータベースキャラクタセットにShiftJisの「①」を格納する場合に起きます。

文字コードの変換が正常にできないとき、Oracleにより強制的に「?」文字に変換されます。このような状態になった場合、データベースでは元の文字の情報は失われています。つまり、復元はできません。

解決方法としては以下に示す通りです。
・システムの対応範囲外とする
・すべてのキャラクタセットを限定する
・すべてのキャラクタセットを統一する
・Unicodeとしてデータを格納する


■データ表示において文字化けする
OracleはNLS_LANGに指定したキャラクタセットに対応した文字コードをアプリケーションが適切に処理出来ると仮定しています。つまり、OSやアプリケーションが適切に処理できているかは考慮せず、決められた文字コードを出力しています。

このため、OS/アプリケーションが実際に処理できない文字コードをNLS_LANGのキャラクタセットに指定すると、文字化けが発生する原因になります。

解決策としては以下の方法があります。
・NLS_LANGのキャラクタセットをOS/アプリケーションが対応している文字コードに設定する
・OS/アプリケーションに文字コード設定が存在する場合は、それらをNLS_LANGのキャラクタセットに統一する


実際に、設定してみよう
僕の環境は、
OSはLinuxで、クライアントのアプリケーション
・ターミナル(文字コード:UTF8)
Oracle データベース
・Oracle11gR1 (データベースキャラクタセット:JA16EUC)

データベースキャラクタセットは以下のSQLで確認することができます。
SQL> select * from nls_database_parameters where parameter='NLS_CHARACTERSET';


何も設定しなければ、ものすごく文字化けするので、環境変数でNLS_LANGを設定しよう。
$ vi ~/.bash_profile

export NLS_LANG=Japanese_Japan.AL32UTF8
を追加する

$ source ~/.bash_profile

以上の設定で、文字化けの問題は解決しました。

2011年3月19日土曜日

OracleとPerlを連携

せっかくOracleをインストールしたので、OracleとPerlを連携しよう。

ということで、DBIとDBD:Oracleをインストールみました。

$ cpan install DBI
$ cpan install DBD::Oracle

DBD::Oracleのインストールがうまくいかない?
調べてみると、同様に上手くいかないという声が。
下のサイトで解決方法が書いてありました。
http://www.movabletype.jp/documentation/mt5/advanced/creating-an-oracle-database.html

$ cpan P/PY/PYTHIAN/DBD-Oracle-1.22.tar.gz

でうまくいきました。


dbtest.cgiプログラムを作成します。
%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1922.01.37-2011-03-19-22-00.png
さっそく、URLを打ち込む。
エラーが出る。

ORA-12541: TNS: リスナーがありません (DBD ERROR: OCIServerAttach) at /var/www/cgi-bin/dbtest.cgi line 7.

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1922.08.05-2011-03-19-22-00.png


んーsqlplusに接続してみた。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1922.08.59-2011-03-19-22-00.png

あ、Oracleがshutdownされていたんだ。
Oracleを起こしてみた。ついでに、リスナーも起こしてみる。

sql > startup
sql > quit

$ lsnrctl start


再度URLを入力
%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1922.37.57-2011-03-19-22-00.png


おし、完成。

Perlプログラムを実行する

perlのプログラムを実行してみる。

エディタはEmacsを使ってみました。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1911.31.15-2011-03-19-11-25.png

Perlプログラムをターミナルで実行してみました。
%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-1911.30.49-2011-03-19-11-25.png

解説
■#!/usr/bin/Perlって何を表しているの?
#!/usr/bin/Perlは特別なコメントです。このプログラムはファイル/usr/bin/Perlに格納されていることを意味しています。

Perlプログラムのうち最も移植性が低い部分です。各マシンごとに、どのように記述するのかを調べる必要があります。


■このプログラムのファイル名は、my_programになっているけど拡張子をつけなくてもいいの?
Unixシステムでは、Perlは拡張子をつける必要はありません。ただし、Unixシステム以外だと必要なものもあるので、各自調べる必要があります。

プログラムを使うだけの人にとっては、どの言語で書かれているのかは、必要ではないので、拡張子をつけないのが流行っていたりもします。


■ $ chmod a+x my_program で何をやっているの?
システムに対して、このファイルがプログラムであると教えることができます。


■ $ ./my_program ドットとスラッシュはなぜ必要なの?
シェルが同名の別プログラムを起動してしまうことを防ぎます。

これは、カレントディレクトリからmy_programファイルを探すという意味です。

2011年3月8日火曜日

『サヨナライツカ』『愛のあとにくるもの』辻仁成

ここ1週間に読んだ本です。
ぼくは、初めて辻仁成さんの作品を読みました。
勧められたわけではなく、書店でふとひきつけられた本です。

PastedGraphic4-2011-03-8-00-15.jpgPastedGraphic5-2011-03-8-00-15.jpg


『サヨナライツカ』は、結婚を控えた主人公 ”東垣内豊” が、バンコクで美女・沓子と出会い、激しい恋に溺れていくお話です。迷いの中、豊は誠実な光子との結婚を選択し、二人は愛の最中、離ればなれとなる。しかし25年後二人は再び出会うことになります。愛しているのに別れを決意した二人の熱い恋の物語です。

『愛のあとにくるもの』は、小説家を目指す潤吾が失恋の痛手のなか、韓国の留学生・チェホンと出会い、真実の愛に気付くお話です。愛し合う二人の小さな行き違いが、気付かぬうちに大きな隔たりとなり、やがて決別をする。しかし、7年の時を経て、二人は奇跡の再会を果たします。あの時、愛する人にどんな言葉をかければよかったのだろうか、そんな悩みをもつ人にお薦めの恋の物語です。


初めて辻仁成さんの作品を読ませていただきました。愛し合う二人が別れて、時を経て再会を果たす、という内容ですが、僕が魅かれたのはその内容よりも優しく甘い言葉遣いでした。愛の表現が非常に豊かだな、と感じました。美しい言葉に出会うとほめずにはいられません。

『サヨナライツカ』『愛のあとにくるもの』の主人公が愛する女性は、みな個性的です。美しい心を持ち、大胆で、負けず嫌いです。そして一途です。この小説で繰り返し表現されている、愛されるより愛することの大切さ、ひしひしと伝わります。

僕の見解ですが、愛を肯定的にとらえる人は輝いてみえます。真摯な態度で恋人に接する姿は同性からしても魅力的です。しかし、実行は言葉以上に難しいものです。相手を気遣える優しさがあの日僕にあれば・・・と、自分の経験を噛み締めながら読んだ本でした。

2011年3月7日月曜日

衝撃的な事実 32bit...

今朝、衝撃的な事実を知ってしまいました。
Oracleをインストールする際の出来事です。
はっきりと、Oracleに言われました。
“32bitのOSに64bitのOracleはインストールできないよ”

え、ぼくがインストールしたCentOSって32bitだったの?
ずっと64bitのCentOSをインストールしたものだと思っていたのでショックをうけました。
というか、64bitだと思い込んで動かし続けて、何も問題なかったことにびっくり。

試しに以下のコマンド
$ uname -a
『i386、i486、i586、i686、i786』のどれかが出力されたら32bit
『amd64』が出力されたら64bit
みたいです。

参考:
http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/Linux%E3%81%8C32bit%E3%81%8B64bit%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B.html

うん、見事に32bitでした。
気付けし。ま、いいや。当分32bitで動かしておこう。

今更ながら32bitと64bitについて考えさせられる良い機会でした。

参考:http://www.pasonisan.com/customnavi/os/os_32bit64bit.html

2011年3月6日日曜日

Q: HTTPリクエストがApacheまで到達していることの確認方法

Q: HTTPリクエストがApacheまで到達していることの確認方法を挙げよ        

*Apacheのアクセスログを確認する
$ tail -f /etc/httpd/logs/access_log


%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-0620.44.06-2011-03-6-20-44.png

*mod_statusでも確認できるみたい

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-0621.17.51-2011-03-6-20-44.png

しかし、mod_statusは、リクエスト処理の傾向の確認には向いているが、個別のリクエスト処理の調査には向いてないみたいです。

参考:http://www2h.biglobe.ne.jp/~hnakamur/technolab/freebsd/other/apache/apache_ne3_2.htm


☆まとめ
とにかく、ログを見慣れておくことが重要です。見慣れないことが起きたら異常だと判断ができるように。

apacheとTomcatの連携

ApacheとTomcatを連携して動作させるには、Apache側のTomcatコネクタを有効にする必要があります。CentOSでは、Tomcatコネクタはmod_proxy_ajpを採用しています。

初期設定では、ApacheとTomcatは連携されない設定になっているので、以下のコマンドを使って書き換えましょう。

$ vi /etc/httpd/conf.d/proxy_ajp.conf
%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-0615.42.23-2011-03-6-15-39.png
■LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
Apacheの起動時にproxy_ajp_moduleを読み込む設定になっています。

■ProxyPass /tomcat/ ajp://localhost:8009/
初期設定では、この部分はコメントアウトされています。
#を削除して、どのリクエストをTomcatに渡すかの設定をします。
ここでは、URLのパスが/tomcat/の場合、localhostの8009ポートで実行されているTomcatにajpというプロトコルを使って処理を依頼するという設定になります。


ApacheとTomcatが連携しているかを確かめる
http://localhost/tomcat/examples/servlet/
http://localhost/tomcat/examples/jsp/
上のリンクで、サンプルページが表示されれば、正常に動いています。

WWWサーバ -Apacheを起動する-

CentOSにはWWWサーバとして、Apache HTTP Server が採用されています。公開するコンテンツをサーバに保存すれば、Webページとして公開することができます。

WWWサーバ概要
WWWサーバの特徴は、Webブラウザ等を利用してHTTPによるデータの送受信を可能にすることです。WWWサーバーには、オープンソースのWWWサーバソフトウェアのほか、Sun Microsystems の Sun Java System Web Server や Microsoft の Internet Information Service など、商用のWWWサーバソフトウェアが存在します。

Apache HTTP Server概要
Apache HTTP Server は、Apache Software Foundation によって配布されているオープンソースソフトウェアです。UNIXにおける、WWWサーバソフトウェアのデファクトスタンダードとして地位を確立しています。

モジュールによって多くの機能を付加できるのもApacheの特徴です。普段はあまり必要とされない機能をモジュール化しておき、必要になった時点でロードし、メモリ資源を節約することも可能です。Apacheは、豊富な機能を持つのと同時に、機能を拡張するためのモジュールが様々な場所からリリースされています。

Apacheの導入
1 httpdパッケージをインストールする
        $ yum install httpd

2 パケットフィルタリングの設定
        ルータを使っている場合は、ルータの設定も必要
        TCP80番(http)ポートとTCP443番(https)ポートの解放

3 httpの基本設定ファイルhttpd.conf
        $vi /env/httpd/conf/httpd.conf
        以下のようにファイルの中身が見れます。      
        ここの中身を書き換える必要はありませんが、この部分の機能を理解しておくことは大事です。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-03-0611.27.03-2011-03-6-10-31.png

4 Apacheを起動する
        $ /etc/rc.d/init.d/httpd start
        http://localhost/ で画面が見れればOK

2011年3月5日土曜日

パッケージのメンテナンス

CentOSを使ってサーバを運営していく上で、アプリケーションの追加・削除・更新は欠かせません。

パッケージの概要
CentOSなどRedHat系のLinuxディストリビューションでは、パッケージの管理をRPM (RPM Package Manager) 形式のファイルで行います。RPMでは、導入されているパッケージに対応するファイル等のデータベースを保持しており、そこから検索・検証によってシステムの正当性をすぐに調べることができます。このようなRPMのパッケージ管理機構によって、CentOSの保守作業は非常に容易になっています。

RPMにて提供されるパッケージって具体的に何?
RPMでは単一のソフトウェアについて、通常バイナリパッケージとソースパッケージが別々のファイルで供給されます。
単にソフトウェアの機能だけを利用したい、この場合はバイナリパッケージで十分です。しかしさらに自分たちでカスタマイズする場合、ソースパッケージを入手する必要があります。ソースパッケージには、ソースコードとそのパッチファイルで構成されています。ソースパッケージを入手することで、内容の把握や新たな変更の追加を容易にしてくれます。

どうすれば、パッケージを操作することができるの?
CentOSには、パッケージの操作方法がいくつか容易されています。具体的に、
・rpm
・yum
・pirut

この中でも、yumには付加機能が多く、rpmの代替ができます。pirutも考え方や操作はyumと同じなので、yumの操作に慣れるようにしましょう。yumは、依存関係を考慮したパッケージインストールや、アップデートに必要なパッケージを自動的に検索しくれるので、非常に使い勝手が良いです。

yumの基本動作
$ yum [<option>] <command> [<package> ... ]

↓ yumの<command>よく使うもの
<command>    動作
install パッケージをインストールする。<package>必須       
list 指定パッケージのリストを出力する。
update パッケージをアップデートする。
remove 指定パッケージを削除する

*パッケージの削除に関して
$ yum remove [<package>]
これは、依存関係を解析して、指定したパッケージと依存関係にあるパッケージも全て削除します。

*インターネットからグループインストール
例:メールサーバー(Mail Server) のインストール
$ yum groupinstall “Mail server”

yumでは、グループインストールが可能です。上の例のように、メールサーバの構築に必要なパッケージを、個別のパッケージを指定することなく一気にインストールすることができます。

2011年3月4日金曜日

Tomcatの役割


Tomcatの概要
Tomcatは、the Apache Software Foundationが主催するApacheプロジェクトのサブプロジェクトであるJakartaプロジェクトによって開発・管理されているオープンソースのソフトウェアです。サーブレット/JSPベースのWebアプリケーションの開発、実行に利用できます。

通常のWebページには、画像などの静的な情報も多いため、すべてのページをJavaサーブレットやJSPで動的に生成すると効率が低下します。そのため、動的に生成する必要のある部分だけをTomcatが処理するように構成するのが一般的です。Webサーバ側には、Tomcatコネクタと呼ばれるプログラムモジュールが実装され、必要に応じてTomcatにリクエストを送ります。

Tomcatのディレクトリ
apache-tomcat
        |-- bin : 起動、停止などの吸うリプトのディレクトリ
        |-- conf : 設定ファイル系のディレクトリ
        |-- lib : クラス、JARファイルを配置するディレクトリ (Tomcat と Webアプリ共有)
        |-- logs : ログファイルが出力されるディレクトリ
        |-- temp : JVMの一時ファイルが出力されるディレクトリ
        |-- webapps : Webアプリケーションを配置するディレクトリ
        |-- work : Webアプリケーションの一時ファイルが出力されるディレクトリ


Tomcatが動かない原因
・ポートの競合

・Java6+Tomcat6+64bitだとサービスから起動できない
        別途処理が必要です。
        http://kamakura.cool.ne.jp/oppama/ssja/tomcat-install.html
        https://issues.apache.org/bugzilla/show_bug.cgi?id=41538

2011年3月2日水曜日

Shindo_Server公開

ブログの更新が遅れ気味・・・

Linuxに慣れるために、http://centossrv.com/のサイトを参考にLinuxの勉強の毎日です。
いつも問題が発生し、原因を調べていく作業が続いています。
ざっと、
・CentOSがインストールされない
・無線Lan環境でLinuxが動いてくれない
・ルータまでpingが届かない
・OpenSSHがつながらない

やっと、DNSを使って外部からアクセスできるようになりました。
htmlやphpといったファイルもアップロードできるので、立派?なサーバーです。

全体像をつかむのが目的なので、サイトにある内容を一通り動かしたら、また1から作り直します。
その際に、セットアップ手順をブログで公開できたらな、と思います。

なんか色々てこづっているけども、自分で構築したサーバーが出来ることって嬉しいものですね。
外部から(僕は携帯で確認した)つながったときは本当に感動しました。

もっと詳しくなりたいものです。