iframeを使った非同期ファイルアップロードの実装

2007年7月29日(日)

Ajaxってカテゴリー作って、最初に書くのが微妙に違うような話題。まぁ、広義のAjaxってことで。

Ajax系のシステムでファイルアップロードをする必要があっていろいろググってみたんだけど、あまり私のイメージにぴったりくる解説がないので、実装した結果をちょっとまとめてみました。

題材としてはタグを使ってアップロードするけど、ファイルが指定された時点でアップロードを実行してサムネールを表示、って感じのありがちな仕様。
手順を動作順に分けると
(1) (3)がアップロード結果を出力するiframe を準備
(2)ユーザが入力するフォーム上の
タグのonChangeイベントで、不可視にした(1)のiframeをtargetにしたsubmitを実行
(3)実行されたPHPスクリプトはファイルアップロード処理をしてiframeに出力(print)
(4)iframeのonLoadイベントで、親フォーム(ユーザー入力フォーム)にサムネール(必要ならその他情報)を表示
と大まかに書くとこんな手順。

実際のコード例
※ちょっとだけprototype.js を使用してます(これ無しでは生きられない体になってる)
(1)
< iframe name="upload_iframe" style="width:0px;height:0px;">

(2)
・フォーム
< form action="index.php" method="post" target="upload_iframe" enctype="multipart/form-data">
・ファイルタグ
< input type="file" onChange="showThumbNail(this);"/>
・スクリプト
function showThumbNail(self){
self.form.submit();
}

(3)iframeへの出力内容
  〔$_FILESのエラーチェック処理諸々〕
//正常終了
$wkHTML = < <<__HTML
<html>
< head>
< script type="text/javascript">
window.onload = function(){
parent.previewPhoto();
}

< body>
         ※出力する情報の一例
< input type="hidden" id="upload_preview" value=サムネールを表示するエレメント名 />
< input type="hidden" id="upload_rc" value=アップロード結果 />
< input type="hidden" id="upload_path" value=アップロードしたファイルの保存パス />

__HTML;
print($wkHTML);
</body>
</html>

(4)
function previewPhoto(){
if (async_upload_iframe.upload_rc.value == ‘OK’){
$(upload_iframe.upload_preview.value).src = upload_iframe.upload_path.value;
}
}

うーん、やっぱり非同期は処理が分散するから、分かりづらいな...
※なんかwordpressでソースコードを表示するやり方がよく分からないのでタグの最初を全角文字にしているのでこのままコピペしても使えません、なんで<pre>とか<code>とか効かないんだろう....

Webalizer によるアクセスログ解析 インストール編

2007年6月21日(木)

いやぁ、PHPとDelphiとAjaxの仕事を3本同時並行的にやっていて勝手にデスマーチになってしまっていたら、ずいぶんとしばらくぶりの投稿になってしまった。

ということでインストール(というか何かいていたか忘れていた(xx;))
まずはダウンロード

# ftp ftp.mrunix.net

pubの下にある最新版をGet
ftp> get webalizer-2.xx-xx-src.tgz

でもって、展開・configure・makeのいつもの流れ

# tar xzf webalizer-2.xx-xx-src.tgz

# cd webalizer-2.xx-xx

※日本語が使えるように設定
# ./configure –with-language=japanese –enable-dns –with-db=/usr/include/db4
# make
# make install

といった感じでインストールはあっけなく終了

ということで、設定は次回(仕事しなきゃ(^^;))

Webalizer によるアクセスログ解析 前準備編

2007年5月2日(水)

怒濤の忙しさで久々の投稿になってしまった、今回は忙しさの中でクライアント様用にセッティングしたWebalizerのおはなし。
世の中にはいろいろなアクセスログ解析ツールがありますが、いろいろ試した結果、最近うちではWebalizerが多いです。
提供するのにそこそこグラフィカルできれいだし、ある程度の情報はあるし。

ということでインストール
本体の前に、libpngとgdが必要なので入っていなければインストール
〔libpng〕
わたしがもってきたのはこれ
# wget http://prdownloads.sourceforge.net/libpng/libpng-1.2.16.tar.gz?download

で、いつものsrcに展開
# cd /usr/local/src/
# tar xzf libpng-1.2.16.tar.gz
# cd libpng-1.2.16

でインストール
# ./configure
# make
# make install

同様に
〔gd〕
# wget http://www.libgd.org/releases/gd-2.0.34.tar.gz
# cd /usr/local/src/
# tar xzf gd-2.0.34.tar.gz
# cd gd-2.0.34/
# ./configure
# make
# make install

ということで、疲れたので今回はここまで

Xen 仮想マシン4台以上の起動

2007年4月12日(木)

4台の仮想マシンで快調に活躍していたXenサーバーに、開発用にWindowsServer2003が必要になったので、さっそくディスクイメージをコピーして起動(ライセンスはちゃんとしているので大丈夫)、なんて便利なんだろう、うんうん、と悦に入っていたところ

Error: Device 769 (vbd) could not be connected. Backend device not found.

おいおい、なんだよオープンソース版に4台までの制限はなかったよなぁ、
とググってみたところポピュラーなお話のようで単にループバックデバイスが足りないらしい。
CentOS4のデフォルトでは8個のようで、これを使い切ったらしい。
ふむふむとしらべていると、どの方のサイトも微妙に書いてあることが違う。カーネルパニックしたりして蒼くなりながら何とか解決したのでうちの環境限定での解決策をご紹介(かなり簡単)。

結局、下記の max_loop=32 を追加しただけ

# vi /etc/grub.conf または # vi /boot/grub/menu.lst

title CentOS-4.4 with Xen (2.6.16.33-xen_3.0.4.1)
root (hd0,0)
kernel /xen-3.0.4-1.gz dom0_mem=512M
module /vmlinuz-2.6.16.33-xen ro root=/dev/VolGroup00/LogVol00 max_loop=32
module /initrd-2.6.16.33-xen.img
※表示は改行しているかもですがmax_loopの行はmodule から始まる1つの行です

これで再起動すると、わらわらと /dev/loop* ができています。

私の環境
Domain0:CentOS4.4 カーネル2.6.16.33
CPU Xeon 物理X2/論理×8
メモリ4G

あんまり関係ないけど
DomainU:CentOS4.4×3/WindowsServer2003×2

autofs によるnfsファイルの自動マウント

2007年4月5日(木)

うちの会社はソフトウエア開発を生業としているのでサーバーが結構な数そこらに転がっている。
これらの間のデータのやりとりやバックアップにはNFSは欠かせないのですが、fstabに書いて起動時にマウントすると、気づかずマウントされたサーバーをリブートしたり止めたりするとひどい目に遭いますね、でもスクリプトに毎回マウント・アンマウントを書くのもめんどくさい、ということでnfsの自動マウント。

[マウントされる側の準備]
通常のnfsの設定ですね

# vi /etc/exports
/dokoka/kokowomount 192.168.111.1(rw,no_root_squash)

[マウントする側の準備]
# vi /etc/auto.master
/home/asoko /etc/auto.asoko –timeout 60

/home/asoko:マウントする基点
/etc/auto.asoko:マウントの詳細を記述したファイルのパス
–timeout 60:60秒アクセスなかったら切るよ、の指定

# vi /etc/auto.asoko
koko -fstype=nfs 192.168.111.2:/dokoka/kokowomount/koko
koko:基点の下のマウントポイント
あとは通常のnfsの指定と同じですね

[autofsの起動]
# /etc/init.d/autofs start

これで、あの煩わしいマウント作業から解放されました、ぱちぱち。

Delphi2007がやってきた

2007年3月27日(火)

Delphi2007
ついに手元にDelphi2007がやってきました(ほんとはDelphiForPHPの方が楽しみだったんだけど)。
我々の会社は基本的にWindowsアプリはほとんどDelphiで開発を行っています。でもずっとDelphi6でした。時は流れVistaがリリースされたのを機に、さすがに徐々に移行していくことにしました。

まだインストールもしていないので書くことがない....

Xen3.0による仮想サーバーの構築シリーズ その2

2007年3月23日(金)

ということで(?)、その2、起動編

ドメイン0用の設定をします(ドメイン0ってなに?って人は入門書をあたってみてね、でもまだあんまりいい本ないんだよね、苦労しました)

initrd の作成
# depmod 2.6.16.33-xen
# mkinitrd /boot/initrd-2.6.16.33-xen.img 2.6.16.33-xen
※作る位置は環境によって違うかも

起動時にXenカーネルで立ち上がるようにgrub.conf を書き換えます

# vi /etc/grub.conf
以下を追加
title CentOS-4.4 with Xen (2.6.16.33-xen_3.0.3.0)
root (hd0,1)
kernel /xen-3.0.4-1.gz
module /vmlinuz-2.6.16.33-xen_3.0.3.0 ro root=/dev/vm/Domain0
module /initrd-2.6.16.33-xen_3.0.3.0.img

追加した位置によって、default= の値を変えます(0オリジン)

書き換えたら自動起動の設定をして再起動

# chkconfig xend on
# chkconfig xendomains on
# reboot

再起動されたOSは見事Xenカーネルになって、xendもたちあがっています(多分)
で、ファイアーウォールが動いたままだとドメインUの動きにいろいろ不具合があったし、どうせドメイン0の表のNICは殺してしまうのでファイアーウォールも切りました。

# service iptables stop
# chkconfig iptables off

で、あとはばりばりドメインUを動かすサーバー起動編に続く...(いつ書くかわからないけど...)

Xen3.0による仮想サーバーの構築シリーズ その1

2007年3月21日(水)

データセンターにサーバーをごろごろ並べるのも、見栄え的にはかっこよくて良いのですが、コストがかかってしょうがないし、大体そんなアクセスのあるサーバーはないので最近話題のXenでトレンドに乗ってみよう、というのでXenを始めました。今では2台のサーバーに8つの仮想サーバーが仲良くかつ元気に同居しています。

ということで「その1」はインストール編
ちなみに、このシリーズはVT対応のXenについてのお話になります
例によってCentOS4.xです(Xeon3GHz・デュアルでHT込みで見た目8CPUという構成です)

まずは最新版のダウンロード(2007/3/21現在)・解凍
# wget http://bits.xensource.com/oss-xen/release/3.0.4-1/bin.tgz/xen-3.0.4_1-install-x86_64.tgz

# tar xzf xen-3.0.4_1-install-x86_64.tgz

インストーラは解凍した中のdistディレクトリに有ります

# cd dist

# ./install.sh

とやると、うちの標準セットのインストール状態ではブリッジ関係のライブラリがないと怒られます
Checking check_brctl:
*** Check for the bridge control utils (brctl) FAILED

ということで、あらかじめインストール
# yum install -y bridge-utils

で、気を取り直して再度インストーラ起動
# ./install.sh

Installing Xen from ‘./install’ to ‘/’…
- installing for hotplug-based system
- modifying permissions
All done.
Checking to see whether prerequisite tools are installed…
Xen CHECK-INSTALL 2006年 12月 1日 金曜日 15:06:34 JST
Checking check_brctl: OK
Checking check_hotplug: OK
Checking check_iproute: OK
Checking check_python: OK
Checking check_zlib_lib: OK
All done.

で、無事インストールは終了
「その2」はドメイン0起動編の予定

postfixでサブミッションポートを使えるように設定

2007年3月20日(火)

最近、うちのお客様の使用しているプロバイダーが徐々に自社メールサーバー以外のポート25を通さなくなってきて、突然「メールが出せなくなったんだけど」とかの電話がやってくるようになりました。
最初は原因がわからず焦ったのですが、メールサーバでサブミッションポートをサポートするようにして、クライアントのSMTPサーバーの指定を変えるだけで問題なくなるようになり一安心。
(仕方ないんだろうけど、プロバイダーももう少しアナウンスをわかりやすくして欲しいねぇ、契約しちゃった後はプロバイダーのホームページなんて見ないしね、まぁプロバイダのメールサーバー使えよ、ってことかな)

ということで、postfixの設定です。
例のごとく、master.cf を修正

# vi /etc/postfix/master.cf

※以下の設定を有効にする
submission inet n - n - - smtpd
-o smtpd_etrn_restrictions=reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

postfixを再起動
# postfix reload

postfix/postfix-script: refreshing the Postfix mail system

ファイアーウォールの設定で submissionポート(tcp:587) を通すようにする

で、メールクライアントのSMTPサーバーのポートを587に変更して万事解決。

Firebird1.5.xをCentOS4.xにインストール(ビルド)

2007年3月19日(月)

うちの会社では小・中規模システムやWebアプリのデータベースにFirebirdを使うことが多いのですが、なぜかFedoraCore3ベース以降(CentOS4.xはこれですね)はインストーラではうまくインストールできないのでソースからビルドしています。
ちなみに、Firebird これ良いですよ、なぜもっとメジャーにならないのか不思議です。

最新版はここでチェック
http://www.firebirdsql.org/index.php?op=files

最新ソースコードを取得して解凍(2007/3/19現在これが最新)
# wget http://prdownloads.sourceforge.net/firebird/firebird-1.5.4.4910.tar.bz2
# bunzip2 firebird-1.5.4.4910.tar.bz2
# tar xf ~/download/firebird-1.5.4.4910.tar

ビルド(SuperServerにしています)
# ./autogen.sh –enable-superserver
# make
# make install

※最後に下記のような入力指示が表示されるので[Eter]キーを押す
Press Enter to start installation or ^C to abort
Extracting install data
Starting Firebird server: [ OK ]

#管理者パスワードを入力
Please enter new password for SYSDBA user: hoge

これで、下記のプロセスが起動しています。
4876 pts/0 S 0:00 /opt/firebird/bin/fbguard -f
4877 ? S 0:00 /opt/firebird/bin/fbserver

インストーラが使えると1分かからないでインストールできるのですが、ビルドするとそれなりにかかりますね。
デフォルトの設定では /usr/local/firebird にインストールされます。