2009年3月19日木曜日

X-Forwarded-Forを使って、バックエンドでアクセス制限



バックエンドサーバーで、IPを使ったアクセス制限をすると


クライアントがフロントエンドのIPアドレスになってしまうため


意味が無い。そこで、X-Forwarded-Forを使って制限をする。




.htaccess

SetEnvIf X-Forwarded-For "192\.168\.0\.[0-9]{1,3}" apal

order deny,allow
deny from all
allow from env=apal



すぐに書き方を忘れてしまうので、備忘録です。





2009年2月13日金曜日

バックエンドサーバでも、リモートIPアドレスを取得する



気がつけば、2ヶ月近く日記を書いてなかった。。。。




$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] ;



mod_proxy とかを使って、バックエンドでPHPを実行しているときとかに


クライアントの接続元IPアドレスを取得する際に利用。


知ってると、どうってことないけど、わからないときは結構調べたりするようなことかな。





2008年12月9日火曜日

Linux環境でスクリーンショット






こちらを参考にして、khtml2png をCentos5.2にインストールしてみました。


http://d.hatena.ne.jp/holidayworking/20081124/1227501839


必要なソフトをインストール



yum install gcc gcc-c++ automake autoconf nano zlib zlib-devel
yum groupinstall "X Window System" "KDE (K Desktop Environment)"
yum install kdelibs kdelibs-devel
yum install Xvfb xorg "xorg-x11-font*"
yum install cmake





参考サイトには、書いてませんでしたが、


以下のソフトも必要ならいてれおいたほうがいいかも。



yum groupinstall "KDE Software Development"
yum install kdelibs4-dev





khtml2png は、yum でインストールできないので、ファイルをダウンロード



wget http://downloads.sourceforge.net/khtml2png/khtml2png-2.7.6.tar.gz?modtime=1224606904&big_mirror=0
tar zxvf khtml2png-2.7.6.tar.gz
cd khtml2png-2.7.6
./configure
make
make install



ここで ./configure の時に、 QT_INCLUDE_DIR を設定しろと、エラーが出た人は、


configure を以下のように書き換えてください。



vi configure

cmake -G KDevelop3 -D QT_INCLUDE_DIR:PATH=/usr/lib/qt-3.3/include .
cmake -D QT_INCLUDE_DIR:PATH=/usr/lib/qt-3.3/include .



これでたぶん、makeまでいけると思います。





インストールが一通り終わったら、Xvfbを起動する。



Xvfb :2 -screen 0 1024x768x24&
export DISPLAY=localhost:2.0


ここで、以下のようなエラーが出るかもしれないが無視する



Could not init font path element unix/:7100, removing from list!





ようやくスクリーンショットをとる準備ができたので


とりあえず、yahoo のトップページを見てみる



khtml2png2 --get-body http://www.yahoo.co.jp yahoo.png


なんかつらつらとエラーが出るが気にしない



DCOPClient::attachInternal. Attach failed Could not open network socket
kbuildsycoca running...
ScimInputContextPlugin()
~ScimInputContextPlugin()


f:id:bushimichi:20081208212326p:image:w400


対応外のブラウザだと、こんな風にyahooが見えるんですね。





その他、以下のようなメッセージも出たがとりあえず気にしない。



FreeFontPath: FPE "built-ins" refcount is 2, should be 1; fixing.
Could not init font path element unix/:7100, removing from list!





参考のサイトにも書いてありますが、


Cookieとか、Javascriptの設定で、うまくスクリーンショトが表示されない場合は


以下のファイルを修正する。



cd ~/.kde/share/config

vi kcookiejarrc

[$Version]
update_info=kcookiescfg.upd:kde2.2/b1,kcookiescfg.upd:kde3.1/cvs

[Cookie Dialog]
PreferredPolicy=2
ShowCookieDetails=false

[Cookie Policy]
CookieDomainAdvice=
CookieGlobalAdvice=Accept




vi khtml2pngrc

[HTML Settings]
AutomaticDetectionLanguage=0

[Java/JavaScript Settings]
PopupBlockerPassivePopup=false


意外と、HTMLのレンダリングがきれいで、崩れている部分も少ない気がします。


フォントとか、ちゃんといれたら文字ももっときれいに表示されるでしょう。


FireFoxとかでも、同様のスクリーンショットがとれるらしいですが


こっちのほうが、お手軽な気がします。





オプション一覧



khtml2png2 --help

Usage: khtml2png2 [Qt-options] [KDE-options] [options] url outfile

Render HTML to a PNG from the command line
Example:
khtml2png2 --width 800 --height 600 http://www.kde.org/ kde-org.png
or
khtml2png --auto ID_border http://www.kde.org/ kde-org.png

Generic options:
--help Show help about options
--help-qt Show Qt specific options
--help-kde Show KDE specific options
--help-all Show all options
--author Show author information
-v, --version Show version information
--license Show license information
-- End of options

Options:
-w, --width <width> Width of canvas on which to render html [800]
-h, --height <height> Height of canvas on which to render html [600]
--sw, --scaled-width <width> Width of image to produce []
--sh, --scaled-height <height> Height of image to produce []
-t, --time <time> Maximum time in seconds to spend loading page [30]
--auto <id> Use this option if you to autodetect the bottom/right border []
--get-body Autodected the body of the page (if width is not detected, use --width)
-b, --disable-window If set, don't show the window when doing rendering (can lead to missing items)
--disable-js Enable/Disable javascript (enabled by default)
--disable-java Enable/Disable java (enabled by default)
--disable-plugins Enable/Disable KHTML plugins (like Flash player, enabled by default)
--disable-redirect Enable/Disable auto-redirect by header <meta > (enabled by default)
--disable-popupkiller Enable/Disable popup auto-kill (enabled by default)

Arguments:
url URL of page to render
outfile Output file



スクロール画面も最後までスクリーン取ってくれるオプション、 --get-body が結構重宝するかも


Window環境でも、スクロールまで対応してスクリーンショット取ってくれるソフトは少ないからね。


指定の画像サイズで保存したい場合は、 -w -h --sw --sh あたりを駆使すればできそうな感じかな。








開発中のWebサイトの進捗を自動で画像に変換して、PDFとかに出力するとか


してみようかと考えています。


特に、画面イメージをみんなで共有する時に、


印刷したり、PowerPointに貼るのに、役に立ちそう。


あとサイトマップを作るときに、画面イメージをサムネイルとして


出力するのもいいかも。





2008年12月3日水曜日

coLinuxにCentos5.2をインストール






先月の話ですが、coLinuxのインストールにまつわる話です。





いままで、自分のWindows環境にわざわざLinux環境を用意するのもなんだなぁと思って


共有のLinuxマシンをLANでつないで開発をしておりました。


しかし、最近ノートパソコンを買いまして(ThinkPad SL500)


外で使ったり、場所を移動したりできるようになると、今までのように


特定のLANにつないで作業をするのが、とってもめんどくさくなりました。


しょうがないので、ノートパソコンに開発環境を作ってしまおうと


考え始めたのが、きっかけです。





とりあえず、いろいろエミュレータとか、仮想環境、VMwareとか考えたのですが


手軽そうな coLinuxがなんとなくよさそうな気がして


coLinuxにCentos5.2 をインストールすることにしました。


(しかし、これがなかなか曲者で後で考えると VMwareとかのほうがよかったかも。)





coLinuxのインストールは、比較的、ネットで情報を集めやすかったので


いろいろ調べて、最新版のcoLinux0.7.3 に開発で使っているCentos5.2を入れることに。


coLinuxのインストールとは別に、installer なるものが有志の方によって作られており


手順に従ってやれば何とかなりそうだ!と、情報を集めつつ進めていきました。





ところが


最新のcoLinux0.7.3 になんとか、Centos5.2をいれようと、1日努力しましたが


どうにもこうにもインストールできませんでした。





ネットの情報も、最新版のインストールではなく、ちょっと前のものなので


ちょうど問題になっているエラーとかの情報が見当たらず、自前でごりごり


いろいろ試してみるがどれも駄目。





インストールの途中で、エラーがでてそれ以上進んでくれない状態で


もう、何が悪いのかまったくわからずあきらめました。





そこで、ちょっと前のバージョンのcoLinux0.7.1で、


Centos5.2がインストールできないか試すことにしました。


(最新版好きの私としてはかなり不本意でしたが。。。)





インストーラーも、それにあわせてcoLinux-installer-20080115を使うことに。


coLinux-installer-20080115 は、Centos5.1 用のインストーラーですが、


Centos5.2.iso ファイル名を Centos5.1.iso に変えて使うことに。








結果は、問題なくインストールができました。


coLinux0.7.3で、エラーが出て進めなかったところも無事クリアーできて、インストール完了。


長時間の苦労が報われました。





しかし、


できたぁ~!という気持ちよりも、無理にcoLinux0.7.3にこだわらず、とっとと0.7.1にしておけば


無駄な時間をかけずにすんだのに。。。と、ちょっとへこみました。








今回書きたかったのは、





coLinux0.7.3 + Centos5.2 は、インストールできずにはまるので回避してください。(笑)





という結論です。








用意したもの


coLinux0.7.1


http://www.colinux.org/


coLinux-installer-20080115


http://www.geocities.jp/xmlinux2004/coLinux/colinux.html


CentOS-5.2-i386-bin-1of6.iso ~ 6of6.iso


http://wiki.centos.org/FrontPage





2008年11月18日火曜日

jQueryでSelectの表示を変えるプラグイン



元ネタは、こちらを参考にさせていただきました。



プルダウンで都道府県などを入力(選択)するイライラを解消するPrefSupport.js


http://moto-mono.net/2008/07/19/prefsupport.html



プルダウンでたくさんの選択肢を表示するときに、スクロールバーがでてしまうのは


どうも、不恰好だなぁと思ったことのあるかたなら、利用してみてください。


デモ


JQueryでselectタグのプルダウンをカスタマイズする demo


ダウンロード


jquery.cs.js


利用には、jQueryが必要です。


追記(2009/11/20):jQuery-1.3.2 に対応いたしました。








特に、デザイン的に配慮はあまりしていませんので、シックで無骨な感じが気になる方は


素敵なデザインでサンプルを作ってもらえるとうれしいです。


プログラム的に、いろいろ悩んだところは


select タグをクリックすると、デフォルトのプルダウンが即座に出てしまうのを


Javascriptでどうやって制御するのかに苦労しました。


ブラウザごとに、プルダウン表示のタイミングが違うみたいで最終的に



1 mousedown event 取得
2 focus 実行
3 select disabled 属性 ture
4 blur 実行
5 event stop 実行


この順番で、処理をすると、意図した通りになりました。


(IE6,IE7,FF3,GC)


この辺は、ソースを見てもらえればわかると思います。


また、もっと上手な方法があるよーって方は、教えてもらえるとうれしいです。





2008年11月7日金曜日

MySQL の Out of memoryで悩む



mysql で、最近たまにエラーログに以下のような Out of memory が出ていた。


サーバは、メモリーを 6G 積んでるので Out of memory ってのが


そんなに簡単にでるとは思ってなかったので困惑してしまった。


(半年前までは、1G で、増強したばっかりだったので。。。)


今回の環境


MySQL-server-5.0.51a-tritonn.1.0.9


CentOS5.2


すべてのクエリーに対して出ているわけではなく、たまに出るって感じ。


毎秒100件程度のクエリーに対して、1日で10~20件程度、時間帯も混んでる時間帯のような気がするが


それほどでもないときもたまに出ていた。




081106 12:12:05 [ERROR] /usr/sbin/mysqld: Out of memory (Needed 2091016 bytes)



いろいろ調べてみたのだが、これといってぴったりの情報もなし。


海外のコミュニティーで同様の質問している人は見つけたけど、


読み進めても、英語なもんでどういう風に話が進んだのか詳細はわからず。


http://forum.mysqlperformanceblog.com/s/mv/tree/577/


クライアント側でメモリーがたらないかもとか、mysql の本家にはあったけど


どうもそういうわけではない。。。


http://dev.mysql.com/doc/refman/5.1/ja/out-of-memory.html


MySqlユーザMLのほうで、スレッドごとにメモリを消費する、sort_buffer_size あたりを


小さくすれば解決したらしい内容があったので試してみる


(ちょっと内容は古いし、バージョンも異なるけど)


http://www.mysql.gr.jp/mysqlml/mysql/msg/14193




myisam_sort_buffer_size=64M <- 128M
sort_buffer_size=2M <- 8M



とりあえずは、エラーログはでなくなったんだけど、


これでよかったのかな。何か間違った解決をした気がしてならない。


(行き当たりばったりだな、ホンと)


スレッドで使用するメモリー量 × 同時接続スレッド数=メモリ消費量


ってのは、わかるんだけど オーバーしたら即 Out of memory ってのもなんだかなぁ。


古いメモリーを自動的に解放したりしないのかなぁ。GC的なものは期待しすぎ?


ちょっとこの辺の仕組みにうといです。勉強不足ですみません。


まぁどのクエリーのときに、Out of memory がでるのかトレースできたら


一番よかったんだけど、毎秒 100 件近く走ってるクエリーを時間もばらばらなものを特定するのは


至難の業だなぁーっと。。。ものぐさな考えで、あきらめていました。


MySQLのパラメータの設定は、1からちゃんと勉強しなおした方がよさそうだなぁ。





2008年9月11日木曜日

AUの携帯端末でselect 内が改行される



以下のようなHTMLをAUの端末(W41H)で書いたときの話です。


DocomoやSoftBankでは起こりませんでした。




<div style="font-size:12px">
<select name="y">
<option>2008</option>
<option>2009</option>
<option>2010</option>
</select>
</div>



フォントのサイズ(12px)が小さいために


select の中の幅もそれに合わせて小さくなります。



20
08
--
20
09
--
20
10


こんな風に折れてしまいます。


selectの style属性 に width 指定や、font-size 指定をしましたが解消されず。


最終的には、以下のように、span で select をくくってそこだけフォントサイズを変えて対応しました。




<div style="font-size:12px">
<span style="font-size:20px;">
<select name="y">
<option>2008</option>
<option>2009</option>
<option>2010</option>
</select>
</span>
</div>



他にもよいやり方がありましたら、教えてください。