Archive for the ‘Debian’ Category

Debian GNU/Linux (Etch) でのシリアルコンソール接続

Sunday, January 6th, 2008

おそらくサーバ運用における基本のキなんだろうけど、シリアルコンソール接続をはじめて設定してみて、思いのほかてこずったので、メモしておく(DebianマシンにWindows PCからアクセスする想定)。

/etc/inittab の以下を修正。

■修正前
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
■修正後
T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100
#コメントアウトを削除の上、通信速度を変更。

反映のため、以下コマンドを実行。

# init q

/etc/securetty の以下を修正。

■修正前
#ttyS0
■修正後
ttyS0
#コメントアウトを削除

/boot/grub/menu.lst の以下を修正。

■追加
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console

■kernel部分に「console=ttyS0,115200n8」を追加
title       Debian GNU/Linux, kernel 2.6.18-5-686
root        (hd0,0)
kernel      /boot/vmlinuz-2.6.18-5-686 root=/dev/hda1 ro console=tty0 console=ttyS0,115200n8
initrd      /boot/initrd.img-2.6.18-5-686
savedefault
title       Debian GNU/Linux, kernel 2.6.18-5-686 (single-user mode)
root        (hd0,0)
kernel      /boot/vmlinuz-2.6.18-5-686 root=/dev/hda1 ro single console=tty0 console=ttyS0,115200n8
initrd      /boot/initrd.img-2.6.18-5-686
savedefault

シリアルコンソール接続の範疇ではないが、今回、常用している putty ではなく UTF-8 TeraTerm Pro with TTSSH2 を使用した。カーソルが点滅する設定を解除する方法を念のためメモ。

■修正前
NonblinkingCursor=off
■修正後
NonblinkingCursor=on

また、シリアルコンソール上で起動ログを見ていたところ、ipv6 モジュールが起動しようとして、エラーになっていたので(Etchではデフォルトで機能するらしい)、以下手順で無効化しておく。

/etc/modprobe.d/aliases の以下を修正。

■修正前
alias net-pf-10 ipv6
■修正後
alias net-pf-10 off

以下に参考にさせていただいたリソースを列挙しておく。

YUI Compressor on Debian GNU/Linux (Etch)

Sunday, December 30th, 2007

jsminpacker などと並び、定番になりつつある JavaScript コード圧縮ツール Yahoo! UI Library: YUI Compressor を Debian GNU/Linux (Etch) に導入したので、備忘までメモしておく。

以下 URL より YUI Compressor をダウンロードする。

Download the YUI Compressor
http://www.julienlecomte.net/yuicompressor/

YUI Compressor は Java によるコマンドラインツール、PHP でそれをラップしたウェブのインターフェースが用意されているが、両方を動かすため以下設定を行った。

/etc/apt/sources.list に non-free を追加し、以下のようにした(後述する sun-java5-jre パッケージのインストールにあたり、non-free の追加が必要になる)。

deb http://ftp.jp.debian.org/debian/ etch main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ etch main contrib non-free

deb http://security.debian.org/ etch/updates main contrib non-free
deb-src http://security.debian.org/ etch/updates main contrib non-free

以下コマンドでパッケージインストール。

aptitude install php5 php5-cli sun-java5-jre

詳細は未調査だが、デフォルトのままだと PHP のクオート文字のエスケープ処理が自動的に入ってしまうため、/etc/php5/apache2/php.ini の以下設定を Off にして、自動処理を解除しておく。

; Magic quotes
magic_quotes_gpc = Off ; magic quotes for incoming GET/POST/Cookie data

これで設定が完了。ブラウザで該当する URL をたたくと以下画面が表示される。

yuicompressor.png

ためしに以下を入力し、「Compress」ボタンを押すと

(function(){
    var _str = "Hello world!!";
    alert(_str);
})();

以下のような結果が得られた。

(function(){var A="Hello world!!";alert(A)})()

APCによるパフォーマンス改善

Monday, September 24th, 2007

YSlow に引き続き、PHP at Yahoo! JAPAN でも紹介されている APC (Alternative PHP Cache) を試してみた。

APC については以下が詳しい。

導入に当たって、必要(となりそう)なパッケージを apt-get でインストール(以下パッケージはすでに導入済みだったため、今回の導入に当たっての必要/不要の確認はできていない)。

# apt-get php4-dev gcc g++ make

APC の導入手順は以下のとおり。pecl コマンドが使える環境ではより簡単という話だが、Debian GNU/Linux Sarge では使えず、地道にコンパイルする方法をとった。

~# mkdir apc
~# cd apc/
~/apc# ls
~/apc# wget http://pecl.php.net/get/APC-3.0.14.tgz
~/apc# tar zxvf APC-3.0.14.tgz
~/apc# cd APC-3.0.14/
~/apc/APC-3.0.14# phpize
~/apc/APC-3.0.14# ./configure  --enable-apc
~/apc/APC-3.0.14# make
~/apc/APC-3.0.14# make install
~/apc/APC-3.0.14# ls /usr/lib/php4/20020429
apc.so    curl.so   gd.so     json.so   mysql.so
~/apc/APC-3.0.14# vim /etc/php4/apache/php.ini (以下を追記)
extension=apc.so
~/apc/APC-3.0.14# /etc/init.d/apache restart

導入が完了し、ここで効果測定を、、、行ってみたものの、APCデフォルト設定+HTML読み込み速度の簡単計測では、それほど差が見られず、もう少し検証が必要そうな状況。さらに設定など調整のうえ様子を見ていくつもり。

YSlowによるパフォーマンス改善

Sunday, September 23rd, 2007

サーバがアメリカ西部にある+サーバレンタル契約がエントリープランなので、やむなし的なところはあるけど、この blog の表示速度は概してよくなく、パフォーマンス改善が必要な状態にあった。そこで、YSlow を使って、ボトルネックの洗い出し、および、ボトルネック解消による効果検証を行った。

YSlow
http://developer.yahoo.com/yslow/

YSlow のベースとなる考え方は Exceptional PerformanceHigh Performance Web Sites (slides) に示されているが、以下13項目を実行に移すことがパフォーマンス改善につながるとしている。JavaScript/CSS を外部ファイルに、といった基本的なことのみならず、CSS はページ冒頭に、JavaScript はページ下部に、といったもう一歩踏み込んだ形で改善方法を示しているのが、興味深い。

Rules for High Performance Web Sites

  1. Make Fewer HTTP Requests
  2. Use a Content Delivery Network
  3. Add an Expires Header
  4. Gzip Components
  5. Put CSS at the Top
  6. Move Scripts to the Bottom
  7. Avoid CSS Expressions
  8. Make JavaScript and CSS External
  9. Reduce DNS Lookups
  10. Minify JavaScript
  11. Avoid Redirects
  12. Remove Duplicate Scripts
  13. Configure ETags

Exceptional Performance より)

この個人 blog で CDN なんて無理、広告やアクセス統計で外部ドメインの JavaScript を読み込んでるので、DNS Lookup を減らしようがない、といったところはあるけど、上記に基づき、いくつか改善を行ったので、メモしておく。

改善1 – mod_gzip による gzip 化

まず Gzip 化について。Gzip 化にあたり、使用しているサーバ環境(Debian GNU/Linux Sarge)では、以下パッケージが必要になるので、apt-get でインストール。

libapache-mod-gzip
http://packages.debian.org/sarge/libapache-mod-gzip

※注
apache 2.0 以降は、mod_gzip ではなく mod_deflate を使う模様。現在の環境が、apache 1.3 系なため、mod_gzip を使う前提で話を進める。

/etc/apache/modules.conf に以下記述が追加されていることを確認する。

LoadModule gzip_module /usr/lib/apache/1.3/mod_gzip.so

apache の設定ファイルに、以下記述を追加する。

<IfModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_can_negotiate Yes
mod_gzip_update_static No
mod_gzip_temp_dir /tmp
mod_gzip_keep_workfiles No

mod_gzip_minimum_file_size 500
mod_gzip_maximum_file_size 0
mod_gzip_maximum_inmem_size 60000
mod_gzip_min_http 1000
mod_gzip_handle_methods GET POST

mod_gzip_dechunk yes

mod_gzip_item_include file \.css$
mod_gzip_item_include file \.js$
</IfModule>

Netscape 3-4 で gzip 化された JavaScript が読めない、といった環境ごとに細かいバグがあるようだけど、取り急ぎ放置。

改善2 – PHP 側での gzip 化

上記だけでは、HTML ファイルの gzip 化がなされないので、PHP の設定ファイル /etc/php4/apache/php.ini に以下設定を追加した。

zlib.output_compression = On

改善3 – Expires Header

次に Expires Header について。以下を apache の設定ファイルに追加することにより対応完了。

ExpiresActive On
ExpiresDefault "access plus 10 years"

改善4 – ETag

次に ETag について。以下を apache の設定ファイルに追加することにより対応完了。

FileETag none

改善5 – CSS ファイル統合

この blog では、以下3つの CSS が使われており、YUI のものだったり、WordPress のテーマ付属のものだったり、と由来は異なるが、全ページに読み込まれるものなので、main.css ということでひとつにまとめた。

  • reset-fonts-grids.css
  • autocomplete.css
  • style.css

なお、JavaScript については、先日の 記事検索の autocomplete 化 の際に統合済み。

効果測定

上記の改善を踏まえ、http://blog.shimazu.org/ での読み込みスピードで実施前後の比較を行った。

まずページ容量について。Firebug でページ容量を比較すると、

  • 改善前: 276KB
  • 改善後: 148KB

ということで、同じコンテンツなのに gzip 化により半分近い容量削減となった。改善前(左)・改善後(右)のキャプチャは以下のとおり。

改善前改善後

YSlow の Performance Grade と呼ばれる指標でも比較してみた。すると、

  • 改善前: Performance Grade: F (56)
  • 改善後: Performance Grade: C (75)

といった感じで、こちらも改善が見られた。詳細結果は以下のとおり。

performance2.png

最後に、ページ読み込み速度を、yslow のステータスバーに読み込み時間を表示する機能を使って計測した。10回計って、平均を算出、という方法で、

  • 改善前: 3.9954秒
  • 改善後: 3.1822秒

という数字上はそれほど差が大きくないが、体感的には少し早くなったかな?という感じがする。詳細結果は以下のとおり。

performance.png

ということで、YSlow によるボトルネック洗い出しとその改善を行ったが、Gzip は設定に若干てこずったものの、その他は簡単に実行可能な改善策で、結果を見ても、これらの施策は非常に有用な印象を持った。今後開発など進めるうえで表示パフォーマンスが気になったら、まず今回のような改善策を試そうと思う。

‘Save This Page’ 件数表示の実装

Saturday, May 19th, 2007

今回の 表示機能 の実装は、

  • del.icio.us・はてブ の API をたたき、JSONP (JSON with Padding) 形式のデータを出力する Ruby スクリプト
  • JSONP 形式データを受け取り、整形・表示する JavaScript

の 2 つから構成される。実装にあたり、以下を参考にさせていただいた。

以下、個別にまとめておく。

はてなブックマーク の API をたたくスクリプト

はてなの場合、自分のブログに被ブックマーク数を表示する にあるような簡単な方法があるが、画像形式で表示され、デザインの調整がきかないことから、XML-RPC で API をたたく方法をとった。作成した getHatenaBookmarkCount.rbx の内容は以下のとおり。

#!/usr/bin/ruby -w
require 'cgi'
require 'xmlrpc/client'
require 'json/pure'

cgi = CGI.new
print cgi.header("type"=>"text/html")
end_point = 'http://b.hatena.ne.jp/xmlrpc'

url = cgi.params['url'][0] ? cgi.params['url'][0] : ""
callback = cgi.params['callback'][0] ? cgi.params['callback'][0] : nil

unless url =~ /^http:\\/\\/blog\\.shimazu\\.org\\//
	exit
end

urls = [ url ]
client = XMLRPC::Client.new2(end_point)
begin
	result = client.call('bookmark.getCount', *urls)
rescue XMLRPC::FaultException => e
	data = { 'error'=>e.faultCode, 'detailed'=>e.faultString }
	print data.to_json
	exit
end

data = [ { 'url'=>url, 'total_posts'=>result[url] } ]
if callback
	print callback ,'(', data.to_json ,')'
else
	print data.to_json
end

Ruby XMLRPC はてなブックマーク件数取得API というその名もずばりな参考資料があったので、それをベースにしている。

Ruby の json ライブラリは JSON implementation for Ruby から取得でき、rubygems でのインストールも可能。C で書かれたバージョン (json) と Pure Ruby のバージョン (json_pure) があるが、なぜか Debian GNU/Linux (Sarge) に前者 (json) がインストールできず、代わって後者 (json_pure) をインストールした。

del.icio.us の API をたたくスクリプト

del.icio.us / help / json / url にあるとおり、del.icio.us では普通に JSONP 形式の API が提供されてはいるものの、URL の指定に MD5 の暗号化が必要とのこと。Paul Johnson’s implementation of MD5 in JavaScript という凄腕ライブラリはあるものの、クライアント(ブラウザ)での処理は極力減らしたいので、MD5 処理する Ruby スクリプトをはさむかたちとした。作成した getDeliciousCount.rbx の内容は以下のとおり。

#!/usr/bin/ruby -w
require 'cgi'
require 'digest/md5'
require 'open-uri'

cgi = CGI.new
print cgi.header("type"=>"text/html")

api = 'http://badges.del.icio.us/feeds/json/url/data?hash='

url = cgi.params['url'][0] ? cgi.params['url'][0] : nil
callback = cgi.params['callback'][0] ? cgi.params['callback'][0] : nil

unless url =~ /^http:\\/\\/blog\\.shimazu\\.org\\//
	exit
end

request = api + Digest::MD5.hexdigest(url)
response = OpenURI.open_uri(request).read.chomp!

if callback
	print callback ,'(', response ,')'
else
	print response
end

出力結果

両者いずれも URL と callback 関数名 をパラメータ指定して、JSONP 形式のデータを出力するようになっている。出力例は以下のとおり(わかりやすくするため整形済み)。

例:getDeliciousCount?url=http://blog.shimazu.org/archives/95&callback=getDeliciousResponse

getDeliciousResponse([{
	"hash":"f021170bb35f553b70b7f392412babe4",
	"top_tags":{},"url":"http://blog.shimazu.org/archives/95",
	"total_posts":1
}])

例:getHatenaBookmarkCount?url=http://blog.shimazu.org/archives/89&callback=getHatenaBookmarkResponse

getHatenaBookmarkResponse([{
	"url":"http:\/\/blog.shimazu.org\/archives\/89",
	"total_posts":1
}])

なお、http://blog.shimazu.org/ で正規表現をかけているのは、http://blog.shimazu.org/ 以外のドメインでの利用を制限するため( XMLHttpRequest ではないので、クロスドメインでのアクセスが普通にできてしまうがそれを抑える目的)。

JSONP 形式データを受け取る JavaScript

データを受け取る処理を getcount.js としてまとめた。

function getDeliciousResponse(data){
if(!data||!data[0]||!data[0].total_posts){return false;}
var str = data[0].total_posts + (data[0].total_posts==1?'user':'users');
document.getElementById('delicious').innerHTML = '<a href="http://del.icio.us/url/' + data[0].hash + '">' + str + '</a>';
}
function getHatenaBookmarkResponse(data){
if(!data||!data[0]||!data[0].total_posts){return false;}
var str = data[0].total_posts + (data[0].total_posts==1?'user':'users');
document.getElementById('hatenabookmark').innerHTML = '<a href="http://b.hatena.ne.jp/entry/' + data[0].url + '">' + str + '</a>';
}
var el_delicious = document.createElement('script');
el_delicious.src = '/utils/getDeliciousCount?url=' + location.href + '&callback=getDeliciousResponse';
document.getElementsByTagName('head')[0].appendChild(el_delicious);
var el_hatena = document.createElement('script');
el_hatena.src = '/utils/getHatenaBookmarkCount?url=' + location.href + '&callback=getHatenaBookmarkResponse';
document.getElementsByTagName('head')[0].appendChild(el_hatena);

’Save This Page’ 件数表示

Sunday, May 13th, 2007

以前取り付けた ’Save This Page’ Button に「このページは何件ブックマークされているか」を表示させる仕組みをつけてみた。今回も del.icio.usはてなブックマーク の両方に対応している。

savebutton.png

目に見えるものはたったこれだけなのに、実装にやたら時間がかかってしまった。実装方法などについては、追ってまとめることにする。

追記
‘Save This Page’ 件数表示の実装 に実装詳細を記載。

JavaScript: How to build and deploy

Sunday, May 13th, 2007

1万行を超える比較的長大な JavaScript コードを deploy する際、どのような点に気をつけておくべきか、当たり前なこともあるけど、包括的にまとめている資料が見当たらないので、自分でまとめておく。

ファイルの統合

長大な JavaScript を書く際、機能別にファイルを分けることは、他の言語同様、有効な管理方法のひとつであるが、production 環境において同じファイル構成をとっていると、それが通信上のボトルネックになることがある。理由は、ページローディングの際に、大量の Request/Responce が発生するため。自分で計ったわけではないが、同じコード量でも、複数ファイルに分かれているよりも、単一のファイルにまとまっていたほうが、一回の Request/Responce で済み、処理が早いという。なので複数ファイルで構成される JavaScript の deploy にあたっては、事前にファイルの統合を行うことが望ましい。

コードの圧縮化・難読化

比較的長大な JavaScript コードは、圧縮化・難読化を行うことがよいとされている。圧縮化とは、コードの改行・インデント・コメント・余分なスペースをカットして、その名のとおりファイルサイズを圧縮することを指す。難読化とは、ファイル圧縮に加え、変数名の省略化(例えば A、B、C… といった文字に置換される)を行うことで、処理内容を読みづらくすることを指す。ツールを探すと、いくつか候補があるようで、すべて検証できたわけではないが、何点か掲載しておく。

検証済み

未検証

Build

JavaScript は interpreter 言語であり、当然 compiler は通常存在しないが、比較的長大な JavaScript コードを扱う際には、Linux/FreeBSD といった環境上で GNU make を使った build 環境を用意しておくと便利といわれている。理由は、上記に挙げた「ファイルの統合」「コードの圧縮化・難読化」を自動化させるため。ファイル修正のたびに手作業で行うのは、可能であるにしても、あまり効率的とはいえず、C/C++ や Java などと同様、Makefile というかたちで、必要な処理をまとめて自動化するほうが効率的で間違いがないとされている。

jsbuild.png

Build 環境の作り方

Debian GNU/Linux を前提に記すが、他の Linux あるいは FreeBSD ならば大差はないと思われる。圧縮化ツールには、jsmin (written by C) を使用した。

開発ツールとライブラリヘッダをインストール

# apt-get install gcc g++ make libc6-dev

開発者のサイトからソースコードをダウンロードする。(2007/05/13現在の最新版は、2007/03/27であり、比較的こまめに更新されていると思われる)

# wget http://www.crockford.com/javascript/jsmin.c

コンパイル

# gcc -o /usr/local/bin/jsmin jsmin.c

Makefile の作成

# vim Makefile

以下記述例

SRC = is1.js is2.js
COMP = is.compressed.js
COMB = /tmp/tmp.js
COMMENT = "Copyright (c) 2007 Yuki SHIMAZU. All rights reserved."
all: $(COMP)
$(COMB): $(SRC)
	cat $(SRC) > $(COMB)
$(COMP): $(COMB)
	jsmin < $(COMB) > $(COMP) $(COMMENT)

以下コマンドにて、必要な処理(ファイル統合・コード圧縮化・コード難読化)が行われたファイル(is.compressed.js)が生成される。

# make

以上でファイル生成が完了。このファイルを deploy することで、通信上の効率性を改善できると思われる。

参考ページ

VPS! (2)

Wednesday, May 2nd, 2007

前回の調査 から半年あまり、再度探してみたところ、他にもいくつか見つけることができた。自分が普段利用している Debian GNU/Linux が使えるか否か、という観点で探すと、ほとんどの日本語圏のサービスは選外になってしまうが、英語圏でいくつか選択肢が増えたのはうれしい。詳細は以下のとおり。

Debian GNU/Linux に対応する VPS

Debian GNU/Linux に対応しない VPS (CentOS, Fedora, RHEL などに対応)

日本だと、SAKURAロリポップ みたいに「通常のホームページスペース+ブログが動かせる最低限の環境(Perl, PHP, MySQLなど)」といったかたちでサービス提供されているのが主流だけど、いずれは root 権限があり、DNS の制御も可能な VPS も人気になりそうな気がするがどうなんだろうか。

heteml みたいに「容量 3GB」「Flash Media Server・Coldfusion に対応」といった異色な?サービスもあっておもしろいけど、root 権限などいくつかの機能がないことに変わりなく、普段サーバ管理とかしてるような人には物足りない気がする。

Debian GNU/Linux 4.0

Tuesday, April 17th, 2007

バージョン 3.1(コードネームSarge)のリリースから約2年。Debian GNU/Linux の新バージョン(コードネームetch)がリリースされた模様。

Debian GNU/Linux 4.0
http://www.debian.org/News/2007/20070408

文字コードが UTF-8 だとか、メディアが DVD で 3 枚・CD で 21 枚 (!) とか、いろいろびっくりなところはあるけど、以前の Debian に比べ、採用ソフトウェアが比較的新しめのバージョンで、おもしろそうな予感。package 的には以下に興味をもった。

とはいえ旧バージョンにいまのところ不満はないので、しばらくこのままのバージョンで使い続けていくつもり。

Captcha

Sunday, March 18th, 2007

以前からしたいと思っていた Captcha の導入が完了。これでコメントスパムの問題が(おそらく)解決し、コメント機能が復活となった。

以下の plugin を利用した。

自分の環境(Debian GNU/Linux)の場合、GD library 関係がなかったので、下記コマンドで導入。

# apt-get install php4-gd
(略)
The following NEW packages will be installed:
  defoma file fontconfig libfontconfig1 libfreetype6 libgd2-xpm libice6 libjpeg62
  libpng12-0 libsm6 libt1-5 libx11-6 libxext6 libxpm4 php4-gd ttf-bitstream-vera
  xfree86-common xlibs-data
(略)

リモートアクセスしかできないサーバに xfree86 が入るのには抵抗があるのだけど、文字画像生成に必須のようでやむなし。plugin と library の導入が完了したら、wordpress の管理画面の Plugins 画面で今回の plugin を activate しておおむね完了。過去分全の記事のコメント機能を有効にし、入力ルールについては当面以下とする。

  • 入力必須項目は Anti-spam word のみ。Name も必須にしたかったけど、必須にすると(wordpressの設定項目上)Mail も必須になってしまうので、見送り。Name 未入力の場合は Anonymous と表示。
  • コメントは表示されるまでの間に、管理者(=自分)によるモデレーションがはいる。

その他の plugin としては以下があった。念のため記載。