Apache日記

mod_deflateでコンテンツ圧縮

1 Mins read

Apacheでは結構、昔からコンテンツの圧縮が可能だったが、
久しぶりに設定したのを忘れないように覚書!

今回はApache2.2系に設定

そもそもgzipでの圧縮のメリット、デメリットは?
■メリット
・ネットワークトラフック軽減
・ファイル減による通信速度向上
・トラフックの低下に伴うネットワークアクセスに使用されていたサーバーCPU使用量が軽減

■デメリット
・圧縮の処理為にタイムロス
・圧縮の処理為、サーバーCPU負荷増
・解凍の処理為、クライアントCPU負荷増
・HTTP1.1以上の通信が必要
・圧縮によりProxyサーバーなどへの影響

こんなもんでしょうか。

圧縮はサーバーマシンもクライアントマシンもスペックが上がってきている為、
問題(サーバーサイドは確認してくださいね。)はないでしょうし、
ネットワーク負荷も下がれば公共に対しても良いことしているので
速度Upと一日一善?ってことでやりましょう。

まずは「mod_deflate.so」をconfファイルに設定し以下の記述を追加してください。

#
# Deflate gzipにてコンテンツ圧縮
# 
 
#==============================================
#ディレクティブは zlib が一度に圧縮する塊の大きさをバイト単位で指定します。
#==============================================
DeflateBufferSize 8096
 
#==============================================
#ディレクティブは 圧縮の程度を設定します。大きな値では、
#より圧縮が行なわれますが、 CPU 資源を消費します。
#値は 1 (低圧縮) から 9 (高圧縮) です。
#==============================================
DeflateCompressionLevel 9
 
#==============================================
#圧縮比に関するメモがリクエストに付加されることを指定します。
#メモ (note) の名前はディレクティブに指定された値です。
#メモはアクセスログに 値を記録し、統計を取る目的にも使えます。
#確認できたらコメントしておくほうがパフォーマンスによろしい
#==============================================
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
 
#LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
#CustomLog /hoge/logs/deflate_log deflate
 
#==============================================
#zlib が圧縮に使うメモリのレベルを設定します (1 から 9 の間の値)。
#(訳注: 2 を底とする対数の値になります。 8 程度が良いでしょう。)
#==============================================
DeflateMemLevel 8
 
#==============================================
#zlib の圧縮用ウィンドウ (訳注: zlib で使用される履歴バッファ) の大きさを指
#定します (1 から 15 の間の値)。
# 一般的に大きなウィンドウサイズを使用すると圧縮率が向上します。
# (訳注: 2 を底とする対数の値になります。 8 から 15 にするのが良いでしょう。)
#==============================================
DeflateWindowSize 15
 
#==============================================
#Output Compression
#圧縮機能は DEFLATEフィルタ により実装されています。
#以下のディレクティブはそのディレクティブのある コンテナ中のドキュメントを
#圧縮するようにします:
 
#上位Pathより機能を有効にする
#==============================================

 
# Insert filter
SetOutputFilter DEFLATE
 
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
 
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
 
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
 
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
 
# Don't compress images
#SetEnvIfNoCase Request_URI \\.(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
 
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
 
#通常、特定のMIMEタイプについてのみ圧縮したいのであれば、
#AddOutputFilterByType ディレクティブを使用します。
#次に Apache のドキュメントの html ファイルのみの圧縮を有効にする例を示します。
#AddOutputFilterByType DEFLATE text/html text/plain text/xml #連続指定可
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rdf+xml

注意!Win版では以下をコメント!Proxyなどバッティングは調査が必要
「Header append Vary User-Agent env=!dont-vary」

こんな感じであとはYSlowを使って確認してみましょう!

Read more
日記

究極のオブジェクト指向はJavaScript?

1 Mins read

数年前から、Ajaxなどが出てきてJavaScriptをいじる機会が増えてきた。

昔はVBAライクな記述しかしなかったのに、今じゃクラス化しバンバンのオブジェクト思考なScriptが
ちまたに溢れ、拝借して活用させてもらっている。

しかし、この言語は本当に追っかけるのが大変!(苦笑)

C#やJava、C++などはプロパティやメソッドは決まった法則で宣言してから
使用可能になるが、JavaScriptといったら好き勝手に動的に?プロパティやメソッドを追加できるし
prototypeとかいって拡張を促すメソッド(便利なのだが)が初めから存在し
時として永久的に再帰的な動きを繰り返す・・・
(余談、普通は使用しないがC#などもシリアル化した情報からクラスを動的に拡張することも出来る)
(XML通信で、SOAPなどがシリアル化、逆シリアル化の考えで動いている)

また、既存のクラスもこやつのおかげで勝手に拡張されて、知らない間に継承(拡張)されていたりする。
「String.prototype.hoge = function{};」などとして
せめて「partial」するぞ!ってぐらいちゃんと書いてよ(笑)

特に記述方法が宣言もくそもなく、記述した次の瞬間からそのプロパティやメソッドは使えてしまう・・・
もちろん変数に型など指定することはない・・・しまいには文字列すらeval()などでシリアル化から
メソッドなど生成するしまつ・・・

また、確実に「これだ」っていうデバッグ方法が無く最終的にはEdit君とニラメッコしアラートやログ吐きで
匍匐前進するしかないのが、さらに難易度を加速させている。

こやつを使いこなせればオブジェクト思考はマスターか(笑)

でもC++はクラスの多重継承が出来るので、こやつの方が頭痛いかも(苦笑)
基本的にクラスの多重継承は使ってはいけません!!

あ~

Read more
日記

インターネットで半角カナは文字化け?

1 Mins read

Webの世界では昔から
「半角カナ文字は使用しないでください」
との表記を良く見かける。

昨今の上記問題点について改めて確認した情報を記載しておく
・7bit以降に半角カナ番地が存在する為にEUCなどで半角カナが文字化けする
 ようするに日本語Windows(Shift-jis)などでない場合に文字化け対象になる
 
・昨今のWeb文字コードはUTF-8になっておりWindowsはもちろん、Linux環境でも半角カナも使用可能
 
・使用Webソフトが対応しているかも重要(Japanで使用できるブラウザは、ほぼ使用できる)
 
・HTTPの規定では8bt=1オクテットでの伝達を認めている
 RFC-Translations related HTTP
 
・伝送経路によってUnixサーバーなどが7bit対応しかしていないので、
 そこで文字化けするという話はHTTP規定を守っているなら嘘になる
 しかし、海外経路サーバーにてなんらかの変換プログラムを走らせている場合は文字化けする可能性がある
 HTTP規定を考えれば変換プログラムが7Bit対応しかしていない(海外では7bitが当たり前)のであれば
 これはこれで問題である

ということになっている

結果、現状の日本では半角カナのやりとりは可能と判断する。

そもそも2000年頃からJavaScriptで半角カナをCheckする関数が存在しているて、
そのjsファイルだってクライアント環境までHTTP経由で運ばれるのであるからその中に記述されている
チェック用の半角カナ文字が文字化けしてしまう可能性があるのにと管理人はいつも思っていた(苦笑)
function tozenkaku(){
       //配列を用意する
       hankaku = new Array("ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ");
       zenkaku = new Array("ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ");
       thismoji = document.test.moji.value;
       //変換開始
       for (i=0; i= 0){
                     thismoji = thismoji.replace(hankaku[i], zenkaku[i]);
              }
       }
       window.alert(thismoji);
}

これは文字コードとぶつけるべきじゃないと(上記半角カナ文字はちゃんと表示されてるでしょ?)
ここに便利なのがあります。作者様感謝です!

この問題はWebアプリとDBの絡みでも文字コード問題として発生している、やはり海外では7bitのことしか
考えていない製品が昔は多く、半角カナがそもそも入らないDBもあればSort処理が機能しないというのもあったが
現在ではshift-jisはもちろんIBMのDB2ではwindows-31jの使用も可になっており大分、半角カナも使用に耐える
ようになってきており、UTF-8の登場で使用環境が整ってきた感じがある。

DBまで話が広がったが、要するにWebServer、AppServer(perl,php,Javaなど)、DBServerとアプリに欠かせない
オーケストラ者たちが外国圏から生まれており、おのおので8bit動作にそれぞれ問題を抱えていたために
「使えないのは仕様です」で開発者が逃げていた感じだと(笑)

なぜ半角カナにこだわるのか?

日本の金融業では昔から半角カナが顧客管理(読み方)に必須項目になっており、ホストにも情報があがっている
情報管理として読み方なんてアルファベット圏ビジネスでは無いのでは?(笑)
ここが日本のストロングポイント?じゃなくて半角カナの切っても切れない日本事情になっている

今尚、金融は絶対ホスト至上なのでどうしても最後にはInで半角カナ、Outで半角カナが存在するcsvが多い。
銀行間などでは全銀手順プロトコルで半角カナも通している

まとめるとシステムの役割は人間の行動を潤滑させるためにあり、日本の習慣、文化で半角カナを昔から必然的に
使用しているのだから、システムは仕様で出来なくさせるのではなく、人間に優しい機能を充実させるべきである。
システムに人間があわせるのではなく人間にシステムが合わせるのが正しい。

最後に半角カナを全面的にWebで使用することをお勧めしないしているのではなく、可能性として
使用に耐えるだけの環境になってきていると感じる今日この頃である。

補足:メールですが、ESTMPやクライアント環境は8bit化されていると思いますが、7bitの考えですので、Base64使うか、半角カナはやめましょう(苦笑)

Read more
Apache日記

Windowsで.htaccessを使用する

1 Mins read

Windows環境で.htaccessを使用するための覚書。

1.もっとも標準的な手段

エクスプローラーなどからは「.htaccess」など先頭ドットファイルが作成できないが、
メモ帳などで名前付けて保存を選択し、「.htaccess」などにして保存すると作成できる。
ポイントはメモ帳でも秀丸でも保存する際にファイル種類を「すべてのファイル」にすること

2.番外編、めんどくさがり屋なあなたはこんな手もあるよ(笑)

知ってのとおり、「.ht*」という先頭ドットファイル名はUnix系では隠し属性ファイルだが、
Windows系では初めにドットを指定することがファイル名で許されていないため使用できない。

そもそもWondws環境でApacheを使うな!この邪道が!・・・ってのが原則ですが(汗)
テスト環境や開発環境をお手軽に立ち上げるには、Windowsでも有りでしょ!?

「s.htaccess」や「s.htpasswd」等を認識するために
まずは「http.conf」内に以下の修正処理を加える

修正前:<FilesMatch "^\.ht">

修正後:<FilesMatch "^s\.ht">

次に以下の項目に修正を加える

修正前:AccessFileName .htaccess

修正後:AccessFileName s.htaccess

最後にApacheをrestart Or reloadすればOK!

注意!Directryタグ内に「AllowOverride All」が指定されてないと下層で使えなくなるよ(笑)

Read more
LinuxVMware日記

VMware上にCentOS 5.2(Linux)の時刻がずれる

1 Mins read

最新版はこちらです

VMware上でバーチャルにてLinuxを動かしているとntpdを使用しても一定期間後に時刻が狂ってくる?
しかも「ntpq -p」が一定時間後から不能に???

何故かと言うとCPU周波数が正常に捕らえられないことやLinux2.6カーネルからtimer.h内のdefine HZ値 が1000Hz になっており(2.4カーネルでは 100Hz )VM上では割り込めないということらしい。。。

いくつか解決方法がある、管理人がやっている方法が以下のとおり
(確認はCentOS5.2)

1.LinuxバーチャにVMware-Toolsをインスト

2.ntp設定はしておく「ntp.conf」
server ntp.nict.jp #など

3.起動時にLinux のカーネルオプションを設定する方法「/etc/grub.conf」内に
「clock=pit nosmp noapic nolapic」を追加
# kernel /vmlinuz-2.6.18-92.1.13.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
kernel /vmlinuz-2.6.18-92.1.13.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet clock=pit nosmp noapic nolapic

時計が早いときは、”clock=pit”
時計が遅いときは、”nosmp noapic nolapic”
両方入れても問題なし

4.バーチャOSを停止して「hoge.vmx」ファイル内に以下を追加
tools.syncTime = "TRUE"
これはホストOSの時刻をVMwareToolを使用の元バーチャOSの時刻を合わせるオプション

上記の設定で「ntpq -p」もまともに動いているみたいで、OK!

Read more