2009年3 月21日  |  Written by matsumoto  |  under Java Yahoo!ブックマークに登録    はてなブックマーク - Linux(CentOS)でのJavaのインストール・動作環境の構築

圧縮だけじゃない。CSSを解析した上で圧縮する「CSS Compressor」をインストールしたくて、Linux(CentOS)上で動作する、Javaの動作環境を構築しました。
以下インストール記録です。

Javaのライブラリをダウンロード

以下のURLから必要なライブラリをダウンロードします。
Java(JavaSE)のダウンロードページ

今回は "Java SE Development Kit (JDK) 6 Update 12 " を選択しました。

Java SE Development Kit (JDK) 6 Update 12

Java SE Development Kit (JDK) には、Java Runtime Environment (JRE) に加えて、
アプレットやアプリケーション開発に有用なコマンドライン開発ツールが含まれています。

とのことです。

この項目の右側の”ダウンロード”ボタンをクリックします。

ダウンロード画面で

I agree to the  Java SE Development Kit 6 License Agreement

をチェックしてプラットフォームのOSを選択します。

CentOS5を使っているのですが、普通の32Bit版(x86)と、64Bit版(x86_64)のどちらも運用しているので
Platform: のプルダウンでは

  • Linux
  • Linux x64
    の2つをそれぞれダウンロードしました。

wget(fetch)で、/usr/local/src にダウンロードし ls で確認します。

ls /usr/local/src/jdk*
jdk-6u12-linux-i586.bin  jdk-6u12-linux-x64.bin</blockquote>

Javaのインストール

通常のインストール(rpm無し)

rpmを実行し、インストールするため実行権限を追加します

chmod +x jdk-6u12-linux-*

管理者権限で 上記の実行属性をつけたバイナリファイルを実行します

sudo ./jdk-6u12-linux-i586.bin

※sudoコマンドが実行できない場合は
su root
# ./jdk-6u12-linux-i586.bin

上記のバイナリファイルを実行させると、数回の確認画面が続きます。
すべて Y(yes)を選択します。

more(less)経由でライセンスに対する規約の同意画面が出てくるので、確認後に "q" でライセンス画面終了。

その後に同意に対してのメッセージがでるので、同意する場合"yes"を選択。

Do you agree to the above license terms? [yes or no]
yes

インストール作業が続き、しばらくすると

Press Enter to continue.....
[ Enterキーを入力 ]

Done.

Doneでインストール完了です。

/usr/local/src/jdk1.6.0_12 に展開されているので /usr/local 以下に移動させました。

sudo mv ./jdk1.6.0_12 ../

※sudoコマンドが実行できない場合は
su root
sudo mv ./jdk1.6.0_12 ../

RPMを使ったJavaのインストール

RPM版は普通のバイナリよりも簡単にインストールできます。

Javaのダウンロードサイトから 先ほどのダウンロードページで” rpm.bin”で終わる同名のファイルをダウンロードし、
同様に実行属性を付け、実行します。

sudo ./jdk-6u12-linux-i586-rpm.bin

※sudoコマンドが実行できない場合は
su root

あとは同様に"yes"や"Enterの入力"を進めていけばインストール完了です。

Javaの実行環境の設定

JavaのPathを設定

zshを使用しているので、.zshrcに以下を追加します。

  • 通常のインストール(RPM無し)の場合

    JAVA_HOME="/usr/local/jdk1.6.0_12"
  • ※RPMでインストールした場合
    実ディレクトリはシンボリックリンクが張られますので /usr/java/latest というディレクトリに対してPathを通します。
JAVA_HOME="/usr/java/latest"

また、exportするPathを以下のように変更します。

  • 変更前

    export PATH=$PATH:/usr/local/pgsql/bin
  • 変更後
    ※"${JAVA_HOME}/bin"を先頭に追加しています。

    export PATH=${JAVA_HOME}/bin:$PATH:/usr/local/pgsql/bin

環境変数を読み直し、javaのPathが通っているか、確認します。

 source ~/.zshrc

 which java
 /usr/local/jdk1.6.0_12/bin/java

versionはインストールしたものになっているか確認します。

java -version
java version "1.6.0_12"
Java(TM) SE Runtime Environment (build 1.6.0_12-b04)
Java HotSpot(TM) Server VM (build 11.2-b01, mixed mode)</blockquote>

これでJavaの環境は一通り完了しました。

<参考リンク>

2009年3 月21日  |  Written by matsumoto  |  under CSS Yahoo!ブックマークに登録    はてなブックマーク - CSSの圧縮と"CSS Compressor"

CSSファイルは圧縮することができます。改行コードやコメント・無駄なインデントなどを削除し、必要最小限の状態にすることを圧縮と呼んでいます。

2009.03.25 CSSの圧縮を行うWebサービス「CSS Minify!!」を公開しました。

CSS圧縮には様々なメリットがあります。

目次

CSS圧縮とは?

CSS圧縮とはブラウザがCSSを読み込む時に生じる無駄な処理をなるべく少なくするために、記述方法をブラウザに対して最適化する事を指します。実際には改行コードやコメント・無駄なインデントなどを削除し、細かい部分での最適化を行っています。

CSS圧縮を行うことで、CSS自体のファイルサイズが小さくなるため、特に中規模~大規模なサイトではネットワーク帯域の節約を行うことができます。

また、ブラウザでのレンダリングスピードの向上も期待できるため、IEなどのレンダリングが遅いブラウザではサイトの描画速度の向上も期待できます。
(もちろんレンダリングが速いブラウザではより速くなります。)

ですので、小規模サイトから大規模サイトまで、CSSは圧縮した方が良いことが多く
弊社ではリリース時にCSSの圧縮を行い、プロダクション環境(本番環境)のCSSは圧縮した物を使っています。

開発環境 非圧縮CSS インデント・コメントなどが多く入った視覚的に管理しやすい状態
本番環境 圧縮したCSS 改行・インデントなしで視覚的には読み難い状態

これまではPerl/CPANモジュールのCSS::Minifierを使って圧縮していました。

なのですが、それ以上に効率的に圧縮するという、圧縮だけじゃない。CSSを解析した上で圧縮する「CSS Compressor」のブログを見て、早速ですがCSS Compressorを試してみました。


今回のCSS Compressorでは、YUIのCSS圧縮ツールをベースにして更に最適化されているので、現在利用しているPerlモジュールでの出力結果と比べてみました。

※CSS Compressorを利用するにはJava version 1.5/5.0 以降のJavaが必要です。詳しくはJavaのインストール、動作環境の構築をご覧下さい。

CSS Compressorのインストール

ユーティリティー系のツールは自分のホームディレクトリ内に"bin"ディレクトリを作って
そこにおくようにしていますので、今回も同様に行います。

> cd ~/bin
> mkdir css_compressor
> cd css_compressor

jarファイル(Java上で動く実行ファイル)をダウンロード

> wget http://www.andy-roberts.net/software/csscompressor/releases/1.0/CssCompressor-1.0.zip

zip圧縮されているのでunzipコマンドで解凍

> unzip CssCompressor-1.0.zip

解凍されたディレクトリ内にjarファイルが存在するかを確認

> cd CssCompressor-1.0
> ls
CssCompressor.jar LICENSE.txt README.txt lib

このCSSCompressor.jarをJavaから実行させます。
README.txtに書いてありますが、実行形式、主なオプションは以下の通りです。

java -jar CssCompressor.jar [オプション] [入力するファイル]

使い方: java -jar CssCompressor-x.y.z.jar [オプション] [入力するファイル]
オプション
-h, –help 使い方を表示します
–charset 入力するファイルの文字コードを明示的にセットします。(例:utf-8)
–line-break 指定されたカラム番号の部分で改行を入れます
-v, –verbose 処理時にメッセージ、警告を表示します
-o 出力する先のファイル名を指定します(指定なしだと標準出力に表示します)

元ファイルの指定がない場合、標準入力を読み込みます

※フォント指定で、"MS P ゴシック"など、日本語の表記をCSSの設定内に入れていると思いますので必ず文字コードは指定してください。
(指定なしだとマルチバイト文字は"??????????"みたいに文字化けしてしまいます)

CSS Compressorの実行

インストールが終了したら、実際に圧縮してみます。今回は、このBlogのCSSファイル(styles-site.css)を圧縮します。

一応warningやnoticeがあった場合に表示されるよう、verboseオプションを指定しています。
また、UTF-8の文字コードですので、 –charsetオプションも指定しています。
ファイル本体の命名規則は ファイル名と拡張子の間に "min"を入れるようにルール付けしています。

java -jar ~/bin/CssCompressor-1.0/CssCompressor.jar –charset=utf-8 -o styles-site.min.css -v styles-site.css

これで、 styles-site.cssと同一ディレクトリにstyles-site.min.cssが出力されます。

この圧縮されたCSSファイルとPerlモジュールのCSS::Minifierで圧縮したCSSファイルを比較してみました。

perlでのCSS圧縮プログラム

CSS::Minifierを使ったPerlでの圧縮プログラムを以前から使っていました。プログラムのソースコードは以下になります。

#!/usr/local/bin/perl

use strict;
use warnings;
use CSS::Minifier qw(minify);

do_task(@ARGV);

sub do_task {
my $input_filename = shift;
my $output_filename = $input_filename;
$output_filename =~ s/.css/.min.css/;
open(INFILE, $input_filename) or die;
open(OUTFILE, '>'.$output_filename) or die;
minify(input => *INFILE, outfile => *OUTFILE);
close(INFILE);
close(OUTFILE);
}

このプログラムを実行し圧縮したCSSを作成します。

./css_minify.pl styles-site.css

CSSの圧縮結果

CSSをCSS Compressorで圧縮したもの、Perlモジュールで圧縮したもの、元のCSSファイルを比較してみました。

対象ファイル:site-style.css
圧縮方法 ファイルサイズ(KB)
元のファイル 21.08KB
CSS Compressor 14.12KB
Perlモジュール(CSS::Minifier) 16.0KB

だいぶ違いますね。やはりCSS Compressorを使ったものが一番小さく最適化されるようです。

今後はPerlベースのモジュールではなく、CSS Compressorを使ってCSSを圧縮したいと思います。

Apache(httpd.conf)の設定例

弊社では、本番環境のサーバでは、"/css/" と "/css-min/"を同一階層に用意していて、それぞれ元のCSS、圧縮したCSSを同一のファイル名で保存しています。

この構造を利用して"/css/" へのアクセスがあった場合、サーバ内部の実体は"/css-min/"を参照させるようにrewriteしています。

httpd.confの設定例

RewriteRule ^/css/(.*)$ /path/to/css-min/$1 [L]

結論

上記の結果から、今後は CSS Compressorを使って、CSS圧縮かけたものを
本番環境で運用することが望ましいかと思います。

メリット・デメリットとして、以下が挙げられます。

メリット

 ・ネットワーク帯域を節約できる
 ・ブラウザのレンダリングスピードを向上できる

デメリット

 ・ファイル管理が複雑になる

”ファイル管理が複雑になる”という面は特に、本番環境と開発環境で物理的に違うCSSを参照するため、デプロイ時には注意する必要があります。

Java環境のインストールをしないと動かない面もありますが、環境さえ整えてしまえば非常にいい事ずくめなので、かなりお勧めです。

参考リンク
2009年3 月22日  |  Written by matsumoto  |  under Apache, Perl Yahoo!ブックマークに登録    はてなブックマーク - Apache1.3+mod_perlのインストール、セットアップ(CentOS)

Apache 1.3とmod_perl 1.30をCentOS(Linux)にインストールし、
mod_perlハンドラでWebアプリケーションが動作する環境を作ります。

まずは"Hello, World!"を表示させるというステップまで進みます。

mod_perl(モドパール)について

昔からWebアプリケーションの言語として利用されているPerlですが、「Perl=CGI(遅い)」という認識が未だに多く、
mod_perl(モドパール)の存在はあまりメジャーではないかもしれません。

しかし、安定性や速度の面でも非常に評価が高いモジュールで、大規模サイトでの運用でも利用されています。
例えばはてなMixilivedoorではmod_perlで構築されたWebサイトのシステムが運用されています。

mod_perlは普通のCGIペースでのPerlプログラムとは、根本的な動作概念が異なります。

まず、初回のロードでソースコードを読み込んでコンパイルし、コンパイル状態のプログラムをメモリ上に保存します。

次回からはそのメモリ上に存在するプログラムを参照するので、
毎回ファイルからプログラムを解析して実行するインタプリタ方式のCGIに比べて高速に動作します。

サーバーの環境や、プログラムの動作にもよりますが、普通のCGIでの動作に比べて数倍~数十倍の速度で動作します。

CGI(PurePerl) Apache::PerlRun mod_perl・Apache::Registory
速度
動作 リクエスト毎にソースコードを解析して直接perlに実行させる。 リクエスト毎にソースコードを解析→コンパイルして、mod_perlに実行させる。 初回ロード時にコンパイルして、次回からはコンパイルしたバイナリを読む

Perl自体、元々20年近くもの歴史があり、モジュールも豊富です。CPAN(Perlモジュールをダウンロードできるサイト)からダウンロードし、様々なモジュールを利用する事ができます。
言語としても枯れており、安定して動作します。

mod_perlハンドラはCPANにアップされている様々なモジュールを利用し、高速なWebアプリケーションを作ることができます。

素のPerlコード(CGIで動くプログラム)をmod_perlベースで動かすためのモジュールApache::Registryや、(mod_perlとは別ですが)FastCGIperliteも存在しますが、今回はmod_perlハンドラでの動作のみを対象とします。

 

mod_perlのバージョンによる差異について

mod_perlはバージョンが1のものと、バージョンが2のものが存在します。

それぞれのバージョンでモジュールの名称が異なり、mod_perlハンドラ自体の互換性は事実上ありません。
今回はバージョン1(mod_perl 1.30)を対象としますが、追ってバージョン2系も追記する予定です。

話題性という面ではmod_php(PHP)や、mod_ruby(Ruby)に押されがちなmod_perlですが、使い勝手が非常に良いため、弊社ではメインの言語として利用しています。

Apache(Webサーバ)のインストール

Apache 1.3をソースコードからインストールします。

Linuxのrpm/yumでもApache(httpd)をインストールできますが、バージョンが2系になってしまうため、今回の対象であるApache 1.3はインストールできません。

Apacheの本家のサイトhttpd.apache.org)からApacheのソースコードをダウンロードします。

今回はmod_perl 1.30を利用する事が前提ですので、Apache 1.3を選択します。

Apacheのインストール

  1. ページの左カラムの "Download!" という部分に"from a mirror"というリンクがあります。このリンクをクリックします。
    クリックするとダウンロード用のページに遷移します。
  • ダウンロードページでは、地域に合わせて近しいと予想されたサーバがデフォルトで選択されています。
  • HTTP経由でのダウンロードとFTP経由でのダウンロードがありますが、ダウンロードできるものであれば、内容は同じですのでどれを選択されてもかまいません。
  1. ページ中部に "Apache 1.3.41 is also available" という部分があります。
    ここの下に "Unix Source: apache_1.3.41.tar.gzというリンクがあります。
    これを右クリックして "リンクのURLをコピー" (IEの場合は"ショートカットのコピー")を選択し、ダウンロード用のURLをコピーします。

    ※Apache 1.3.41のバージョンの部分(41など)は今後マイナーチェンジされる都度変更になりますので、ご注意ください。
  2. コピーしたURLを Putty、teratermなどのターミナルに貼り付けダウンロードします。
    ソースからインストールする際には"/usr/local/src"にソースコードを置くようにルール付けしていますので、ダウンロードする際には、そのディレクトリでダウンロードします。

    > cd /usr/local/src
    > wget http://ftp.riken.jp/net/apache/httpd/apache_1.3.41.tar.gz
  3. ダウンロードしたファイルを解凍します。
    > tar xvzf apache_1.3.41.tar.gz
  4. make(コンパイル)してインストールします。
    初期設定を決める"configure"を実行します。
    今回は、インストールする先はデフォルトの"/usr/local/apache"、Apache内部で利用するモジュールはとりあえずおおよそのものは一括でインストールします。

    > cd apache_1.3.41
    > ./configure --enable-shared=max --enable-module=all

    root(管理者)権限でインストールします

    # make install

    メッセージがずらずらと表示され続け・・・最後に以下が表示されればインストール完了です。

+--------------------------------------------------------+
| You now have successfully built and installed the      |
| Apache 1.3 HTTP server. To verify that Apache actually |
| works correctly you now should first check the         |
| (initially created or preserved) configuration files   |
|                                                        |
|   /usr/local/apache/conf/httpd.conf |
|                                                        |
| and then you should be able to immediately fire up     |
| Apache the first time by running:                      |
|                                                        |
|   /usr/local/apache/bin/apachectl start
|                                                        |
| Thanks for using Apache.       The Apache Group        |
|                                http://www.apache.org/  |
+--------------------------------------------------------+
  • 2009.04.29追記
    CentOS 4.4 i386の最小構成の状態へのApache1.3.41のインストールでは、yumで以下のインストールが必要でした。

    yum install gcc*
    yum install db4*
    yum install gdbm*

    また、configureのコマンドも若干変更になります。

    CLFAG=/usr/include/gdbm ./configure --enable-shared=max --enable-module=all

mod_perlのインストール

Apacheで利用するための、mod_perlモジュールをダウンロードします。

Apacheのソースコードをダウンロードしたディレクトリと同じディレクトリ(/usr/local/src)で行います。

ダウンロード後に解凍します。

> cd /usr/local/src
> wget http://perl.apache.org/dist/mod_perl-1.0-current.tar.gz
> tar xvzf mod_perl-1.0-current.tar.gz

作成されたディレクトリ内でmod_perlをコンパイルし、ApacheモジュールのDSOライブラリとしてインストールします。

> perl Makefile.PL USE_APXS=1 WITH_APXS=/usr/local/apache/bin/apxs EVERYTHING=1

root(管理者権限)でインストールします

# make install clean

Apache上でmod_perlの動作を確認

インストールしたApacheの上でmod_perlが正常に動作するかチェックします。

Apacheの設定情報(httpd.conf)の確認・変更、mod_perlのステータスをチェックする設定を行います。

Apacheの設定情報(httpd.conf)の確認・変更

Apacheをインストールしたディレクトリ(/usr/local/apache)以下に「conf」というディレクトリが存在します。

この中に「httpd.conf」という、Apacheの動作を定義するファイルがありますので、こちらを変更・修正します。

 > vim /usr/local/apache/conf/httpd.conf 

まず、mod_perlのモジュールがロードされる設定になっているか確認します。
以下の2つの設定が有効になっていればOKです。

ほとんどの場合、mod_perlのインストール後に自動で設定が上書きされているかと思いますので、特に修正しなくても良いかと思います。

 LoadModule perl_module libexec/libperl.so

 AddModule mod_perl.c

httpd.confの一番最後に以下の記述を追加します。
mod_perlの動作状況を確認するApache::Statusを動作させる設定を行います。

<Location /perl-status>
   SetHandler perl-script
   PerlHandler Apache::Status
   ORDER deny,allow
   deny FROM all
   allow FROM <自分のIPアドレス>
</Location>

allow FROM は自分のIPアドレスを定義します。

3行目の「ORDER…」から、5行目の「allow FROM…」にかけては、閲覧制限の設定です。

この設定を行うことで、他者から不用意に閲覧されることを防ぎます。

自分のIPアドレスが分からない場合は診断くんなどで、表示されるIPアドレスを入力すれば良いかと思います。

上記設定を行い、httpd.confの保存後に Apacheを再起動します。

Apache上でmod_perlの動作を確認

Apacheを再起動させる前に、httpd.confが適切な文法で記述されているか、チェックします。

/usr/local/apache/bin/apachectl configtest
Syntax OK
"Syntax OK" が出ていれば設定情報の文法的な記述ミスはクリアできたのでOKです。

Apacheの再起動を行います。

 # /usr/local/apache/bin/apachectl stop
 # /usr/local/apache/bin/apachectl stop: httpd stopped
 # /usr/local/apache/bin/apachectl start
    /usr/local/apache/bin/apachectl restart: httpd started

「apachectl restart」について

※mod_perlはメモリ上にコンパイルしたデータを保存するため、apachectl restart での再起動では以前の情報を完全にクリアできません。

apachectl restart のコマンドでは rootで動いているApacheは再起動せず、子プロセスのみを再起動させます。
このためrootのプロセス上に残っているメモリはそのままの継続する状態になり、
mod_perlハンドラの変更箇所が反映されないという事になります。

きちんとメモリ上からクリアするために、上記のapacheの再起動では

apachectl stop → apachectl  start と2回コマンドを実行させています。

実際の運用では、毎回2回コマンドを実行させるのも面倒ですので、

以下のようなシェルを作成し

 # /usr/local/apache/bin/apachectl-restart

と打つことで、Stop->Startの2回実行させるようにしています。

#!/bin/sh
 /usr/local/apache/bin/apachectl stop
 /bin/sleep 5;
 /usr/local/apache/bin/apachectl start
2009年3 月24日  |  Written by matsumoto  |  under CSS Yahoo!ブックマークに登録    はてなブックマーク - [CSS] CSS圧縮ツール 「CSS Minify!!」

CSSの圧縮をコマンドラインで行っていたのですが、どうもわずらわしいことが多く、
Web上でCSSの圧縮ができるサービスを公開しました。

CSS Minfy!!で使っている、CSSファイル(css_minify.min.css)自体も
同サービスの「CSS Compressor(Java)」の方で圧縮したものを利用しています。

※CSSの圧縮についての詳細はCSSの圧縮と"CSS Compressorをご覧ください。


履歴

  • 2009.03.25

    • 入力したCSSファイルと出力したCSSファイルの差分が分かるようにしました。
  • 2009.03.30
    • JavaScriptを圧縮できる JS Minify!! をリリースしました。
2009年3 月29日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - ClearSilverをSledgeから使う

ClearSilverというテンプレートエンジンが存在します。
非常に高速に動作するテンプレートエンジンで、trac+mod_pythonなどでも使用されているらしいです。

mod_perl環境では、もっぱら Template-Toolkit か HTML::Templateなどがメジャーどころとして利用されてきましたが、ClearSilverを利用した超高速の処理は中々の魅力です。

ざっくりと比較すると下記のような感じでしょうか。
ClearSilverはセットできる内容・ルールがシンプルな分、高速に処理されます。

複雑なロジック(処理が重い) 簡単なロジック(処理が軽い) 簡単なロジック(処理が更に軽い)
Template-Toolkit HTML::Template ClearSilver

今回、特にSledgeから利用する部分をまとめてみました。

ClearSilver自体の文法やHDFの取り扱いなど、まだ調べきれていない部分がありますが、
随時追加していきたいと思います。

2009年3 月31日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - [JavaScript] JS Minify!!

CSSの圧縮と同様、JavaScriptも圧縮することができます。
ブラウザでのJSの実行速度が変わるので、特にIE6などの比較的レガシーなブラウザで
より効果を感じることができます。

CSS Minify!!でもJSを圧縮することができなくもないのですが、CPANでアップされている、

JavaScript::Minifier::XSを利用して、JS用として改めて作ってみました。
使ってみて下さい。

私はチーム・マイナス6%です