バックエンドサーバーで、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
すぐに書き方を忘れてしまうので、備忘録です。
バックエンドサーバーで、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
すぐに書き方を忘れてしまうので、備忘録です。
気がつけば、2ヶ月近く日記を書いてなかった。。。。
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'] ;
mod_proxy とかを使って、バックエンドでPHPを実行しているときとかに
クライアントの接続元IPアドレスを取得する際に利用。
知ってると、どうってことないけど、わからないときは結構調べたりするようなことかな。
こちらを参考にして、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()
対応外のブラウザだと、こんな風に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に貼るのに、役に立ちそう。
あとサイトマップを作るときに、画面イメージをサムネイルとして
出力するのもいいかも。
先月の話ですが、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
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
元ネタは、こちらを参考にさせていただきました。
プルダウンで都道府県などを入力(選択)するイライラを解消するPrefSupport.js
http://moto-mono.net/2008/07/19/prefsupport.html
プルダウンでたくさんの選択肢を表示するときに、スクロールバーがでてしまうのは
どうも、不恰好だなぁと思ったことのあるかたなら、利用してみてください。
JQueryでselectタグのプルダウンをカスタマイズする demo
利用には、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)
この辺は、ソースを見てもらえればわかると思います。
また、もっと上手な方法があるよーって方は、教えてもらえるとうれしいです。
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からちゃんと勉強しなおした方がよさそうだなぁ。
以下のような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>
他にもよいやり方がありましたら、教えてください。