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>



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





2008年8月26日火曜日

slow.log のlogrotate



slow.logは、自動的にlogroteしてくれないので、Cronで自前でやることにする。





#!/bin/sh


DATE=`date %Y%m%d`


mv /var/lib/mysql/slow.log /var/log/slow.$DATE.log


mysqladmin flush-logs (必要に応じてオプションをつける -u -h .... )






上記を 適当なファイルに記述して Cronで設定すればよい





2008年8月21日木曜日

携帯サイトで利用するJPG



携帯サイトで、JPG画像を利用して表示できない場合は、Content-Type を確認してみるとよい。



○ Content-Type: image/jpeg

× Content-Type: image/jpg


サーバ出力で画像を生成している場合などで、 image/jpg とするようなことは結構ある気がします。。。


私の場合は、PEAR::Image_Graph を使ったときに、Content-Type:image/jpg に出くわしました。





Image/Canvas/GD/JPG.php に、header 出力部分があるので利用の際は確認したほうがいいです。





2008年8月19日火曜日

PHPの最適化 12 PHP Optimization tips



(元ネタ http://www.ilia.ws/files/zend_performance.pdf)




  1. staticが使えるなら、staticを使う。速度は4倍になる。

  2. __get, __set, __autoload は避ける。

  3. require_once() はコストがかかる。

  4. include や require では絶対パスで指定する。

  5. スクリプトの開始時間は $_SERVER[’REQUEST_TIME’] で得る。

  6. 正規表現は、文字列関数で代用できないか探る。(文字を見つけるだけならstrposなどでもよい)

  7. str_replace は preg_replace より早いが、strtr は str_replace の4倍早い。

  8. 文字列/配列両方を受け入れる柔軟さを持つ関数は避ける。変わりに個別の関数を用意する。

  9. @によるエラー制御は遅い

  10. $row[’id’] は $row[id] より7倍早い

  11. エラーメッセージはコストがかかる

  12. for ($x=0; $x < count($array); $x) の count() のようにループの度に呼ばれる関数はさけ、変数に格納する。


ねた的には、古いですがふとしたときに思い出すと良いかも。


自社のフレームワークに、こういうエッセンスを入れていくのが重要なのかな。


個人的には、require_once は使いまくりなので、どうにかコスト削減に努めたいです。(便利だからねぇ)


弊社のプログラミングの基本的な方針



便利なコード >>>>(優先順位)>>>> パフォーマンスがでるコード(コスト小)


基本的に便利なほうを優先する傾向にあります。


ここで言う便利とは、使いやすく、理解しやすく、人間的に優しいもの。という意味です。


省略したり、コードを短くしたり、難解なテクニックを使うのは、プログラマーの質によって


ムラが出るため、チームで仕事をしたりしているといろいろ弊害が出てきます。


(みんながスーパープログラマーなら問題ないけどね。。。)


この辺はシステムの要件にもよります。


普通の公道を走るのに、F1のマシンは必要ないですね。


ただし、燃費が良いほうが好まれるのは、公道でも、F1でも同じです。


このあたりの必要なパフォーマンス要件をしっかりと事前に考えて取り組むのが重要かと。


また、必ずしもトレードオフとか限らないので


「人間にもマシンにとっても優しい方法」を考えるのはなかなか楽しいものです。


得てして、人間に優しいコードは、パフォーマンス的にも良い場合が少なくありません。


そういう気質は、すぐに目の前の仕事から脱線してあらぬ方向へ行ってしまいますが、


プログラマーには、必要な「遊びごころ」だと思ってます。





Xenコマンド備忘録



たまにしか使わないので良く忘れます。



・ドメインの起動( -c でコンソール接続)
xm create [ドメイン名]
xm create -c [ドメイン名]

・コンソールに接続
xm colsole [ドメイン名]

・稼動状況を表示
xm top

・ドメインのリスト表示
xm list

・終了
xm shutdown [ドメイン名]

・強制終了
xm destroy [ドメイン名]





2008年7月9日水曜日

IE6でJavascriptがうまく動かないとき






<a href="javascript:void(0);" onclick="javascript:location.href = 'http://www.example.com';">移動だ!</a>


上記のような、a タグの href 属性に javascript:void(0); をセットして


onclick 属性で、javascript処理をしようとしたときに、FireFoxや、IE7では、特に問題にならなかったのですが


IE6は、上記では動きませんでした。




<a href="javascript:void(0);" onclick="javascript:location.href = 'http://www.example.com';return false;">移動だ!</a>



解決策としては、onclick 属性の最後に return false; をつければOKです。(仕様?)


他のイベントハンドラーの場合も多分必要です。


文法的に間違ってないのに a タグに設定したJavascriptが、IE6で動かないって時は、一度試してみてください。





2008年6月12日木曜日

DELL サーバ PowerEdge SC1435 メモリー増強



Apacer製のメモリーを買ったがメモリーが認識せず撃沈


メーカーに問い合わせると、


『DELL PowerEdgeSC1435は、PC2-5300 ECC Registered.のメモリに対応していますが、


SPDが通常とは異なっているため、認識できるメモリに制限があります。』


とのこと。。。とりあえず、返品交換に対応してくれるとのことなので一安心。





買ったやつ


Apacer DDR2 667-REG2GB


メモリ型番: AP2048ASRE667



SC1435対応


メモリ型番: AP4096DLSC1435 (P/N: 75.A72A6.G03)





商品を買うときにメモリーの型番まではさすがにチェックするの難しいですね。


そこまで詳しく商品説明している店舗もあんまりないので


購入時には、販売店やメーカーにあらかじめ詳しく対応状況を


確認しておくことをお勧めします。





2008年6月1日日曜日

MySQL パフォーマンス



my.cnf




skip-name-resolve



接続元のIPアドレスから逆引きの名前解決をOFFにする。


アプリケーションからMySQLに接続する際に


接続プールをしていない場合は、結構な効果があるとおもう。





2008年5月22日木曜日

サーバの移転



ここ1ヶ月半くらいまともに日記もかけないほど


毎日仕事が忙しかった。


いやーほんというと、ちょっと位は書く時間はあったけど


書く内容を整理する時間が無かったというのが本音かな。


走り書きのメモが乱雑するデスクまわりをそろそろ片付けようかなと


思っているので、ぼちぼち日記も再開したい。


ここ1ヶ月半くらいは、既存のサーバの移転作業をしてました。


いままで、レンタルサーバでサーバ会社に設置作業などをお願いしてましたが


ハウジングのラックを借りて自前でサーバマシンを用意することになりました。


自社内に、開発用のテストサーバなんかは、いままでも自前で用意してきましたが


運用用のサーバを用意するのは初めてで、なんとなくで設定していることが多々あり


いざちゃんとやるとなると右往左往。。。


なかなかそのあたりの上手な手順なんかを公開しているドキュメントって


ないですよねぇ。


個人の自宅サーバなんてのはよくあるんですが、複数台構成(今回は8台)


各サーバごとのパフォーマンス設定(これがほんとに難しい)


なんかは、これといっていいのがわからない。


サーバのOSインストールからの立ち上げ作業のチュートリアルなんか


誰か公開してくれるとうれしいのですが。。。それって、企業秘密よねほとんど。


あと、いらないアプリケーションの停止ってのが難しい。


通常Webサーバとか、DBサーバに使われるアプリケーションのことはわかるけど


裏方で仕事しているアプリケーションまではよくわからないのが多い。


好き勝手に止めると、ネットワークがつながらなくなったり


なんかよくわからないが、いろいろパフォーマンスがおかしくなったり。


泣く泣く、何の仕事をしているかわからず念のため立ち上げているアプリがあります(情けない)


そのあたりも、今後もっと勉強していかないと、もっとシビアなパフォーマンスを要求されるようになると


たちうちできなくなるなぁ~っと、。。。


まだまだ、未熟な毎日です。





2008年4月3日木曜日

jakarta-poi でExcelファイルを操作したときにはまったこと



3年くらい前に作ったプログラムの修正を今になってする


ぐうたらな話です。



poi-2.5.1-final-20040804.jar


POIを利用して、Excelファイルを読み取って、DBにインポートする


プログラムです。


開発やテストをしているときは、特に問題がなかったのですが


運用しているうちに、たまにセルのデータを読み込むと、


文字の後に空白(スペース)がくっつく現象が起こりました。


すべてにスペースがつくわけではないし、


スペースがつかないセルをコピーして上書きすると


その現象が解消されます。


再現性はあり、一度だめになったExcelデータは何度やってもだめで


同じようになります。


これは、Excelのデータ形式と、POIの読み取りの間でなんかあるなぁ~と思って


いろいろネットで調べていると


http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31297&forum=12&4


どうも、ふりがな機能というのが悪さをしているようなことでした。(バグではないのか!?)


ん~、手っ取り早くなんとかならないかなぁ~ということで、バージョンアップ!!



poi-3.0.2-FINAL-20080204.jar


を使ってみることに。


ものの見事に、直っていました。(手抜きです。笑)


(※私の状況が改善されただけですので、直る保証はありません。)


特に、バージョン間の互換も問題なさそうだったので、そのまま使うことに。





とりあえず、同じ状況の人のために備忘録です。





2008年4月2日水曜日

validator-rule.xml の修正



struts1.2.4 -> struts1.2.9 にアップデートした際に


入力規制がことごとく、Exceptionを吐いていた。



validator.ValidatorForm (ValidatorForm.java:112) - org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
org.apache.commons.validator.ValidatorException: org.apache.struts.validator.FieldChecks.validateRequired(java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionMessages, javax.servlet.http.HttpServletRequest)
at org.apache.commons.validator.ValidatorAction.loadValidationMethod(ValidatorAction.java:627)
at org.apache.commons.validator.ValidatorAction.executeValidationMethod(ValidatorAction.java:557)
at org.apache.commons.validator.Field.validateForRule(Field.java:827)
at org.apache.commons.validator.Field.validate(Field.java:906)
at org.apache.commons.validator.Form.validate(Form.java:174)
at org.apache.commons.validator.Validator.validate(Validator.java:367)
at org.apache.struts.validator.ValidatorForm.validate(ValidatorForm.java:110)
at org.apache.struts.action.RequestProcessor.processValidate(RequestProcessor.java:950)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:207)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)






仕様は、そんなに変わってないだろーと、安易に考えていたのが間違い!!


設定ファイルの修正がいるとは、露知らず、あたふた。。。


どうも、struts1.2.7 くらいからそうなってたみたいね。


struts1.2.4 validator-rule.xml



<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>




struts1.2.9 validator-rule.xml



<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator, <---- ここ追加
javax.servlet.http.HttpServletRequest"
msg="errors.required"/>



org.apache.struts.validator.FieldChecks の引数の個数が


5→6個に変更って知りませんでした。。。


他の、validator もすべて、methodParamsの修正が必要です。


以後、バージョンアップは気をつけます。





2008年3月25日火曜日

syslog-ng と Permission denied



syslog-ng をインストールしたときのはまった箇所


起動時に、Permission denied が出て起動が失敗する


CentOS4.4


syslog-ng-1.6.8




/sbin/service syslog-ng start

Error opening file /proc/kmsg for reading (Permission denied)



単純に、SELinux が邪魔していただけでした。



/usr/sbin/setenforce 0


で解決!?起動はできました。


しかし、いつもSELinuxではまって、OFFにして解決というのはどうもまずいなぁ。


ちゃんと使い方をマスターしてセキュアーにしないとせっかくの機能が、宝の持ち腐れだなぁ。


しかし、SELinuxを考慮したドキュメントって少ないんだよねぇ。。。







2008年3月7日金曜日

java.lang.IllegalStateException: Cannot forward after response has been committed



tomcat5.0.28 + struts1.2.4 を利用した環境で




StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:324)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056)
at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)



上記のエラーが不定期に起こり、悩まされていました。


最終のstrutsのレスポンスが返る前に、


すでにレスポンスはコミットされてるよ的なメッセージと思います。


ServletのFilterなどを使って、HttpRequest HttpResponse まわりで


どの層で勝手にコミットされているのか追っていくと、


どう考えても struts のActionの処理の中で


なんか起こってるんじゃないかなぁという結論に。


むむむ、strutsのソースを追うのはちょっとめんどくさいなぁ。


とりあえず、strutsをバージョンアップ!!


struts1.2.9に変更してみたところ上記のエラーは、発生しなくなりました。


(結果オーライの姿勢は、次につながらないがとりあえず良しとしよう。)


どんなにGoogleとかで検索しても、上記のエラーがらみに関する情報が得られなかったので


(調べたの日本語だけだけどね)


同じように苦しんでるひとに、参考になればと思います。


(原因追求してないから、あんまり参考にならないかぁ。。。)


ってか、新しい struts2 JSF とかを使えって話かなぁ。。。


最近、Servlet使ってないから、だんだん遠い存在になってきたなぁ。





2008年3月6日木曜日

レプリケーションのスレーブオプション



特定のテーブルのみレプリケーションしたい場合の設定は、


my.cnf に記述してmysqlを再起動する



[mysqld]

replicate-do-table=dbname.tablename1
replicate-do-table=dbname.tablename2
replicate-do-table=dbname.tablename3



複数指定する場合は、そのテーブル数だけ記述すればよい。


再起動後、show slave status; で、上記の設定が表示されていればOK



mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 931
Relay_Log_File: slave1-relay-bin.000056
Relay_Log_Pos: 950
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table: dbname.tablename1,dbname.tablename2,dbname.tablename3
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 931
Relay_Log_Space: 1365
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.01 sec)





2008年3月3日月曜日

月末の日付を取得する



3月末の日付を取得したい場合




date("Y/m/d", strtotime("2008/4/1 -1 day"));

date("Y/m/d", mktime(0,0,0,4,0,2008));



どちらも、次月 2008年4月1日の1日前と考えれば取得できますね。





2008年2月28日木曜日

Tomcat5の環境別設定 server.xml に独自のパラメータを書く



サーブレットエンジンごとに設定するために server.xml にパラメータを記述してみました。


テスト環境と、本番環境などでデバック用の仕様を切り替えたりするのが


スムーズになるためです。


アプリケーションごとの WEB-INF/web.xml には、環境の違いによるパラメータを


書くとデプロイ時になにかと面倒なのでそうしました。


server.xml




<Host ...>
<Context ...>

<Parameter name="TEST_DEBUG" value="1" override="false"/>

</Context>
</Host>



ServerContext.getInitParameter("TEST_DEBUG");


で、アプリケーション側から取得できます。


Velocity なら $application.getInitParameter("TEST_DEBUG")


意外とこういったあってもなくても良い、パラメータの説明が少なく


探していて苦労しました。


必須の項目の説明は山ほどあるんですけどね。


レシピ的なもんが少ないのでなんども自分で試して




<Context ...>
<parameter>
<name>TEST_DEBUG</name>
<value>1</value>
</parameter>
</Context>



こんなことして撃沈してました。


まぁ、とりあえずできたので参考まで。





2008年2月14日木曜日

IEで、preタグにinnerHTMLで改行を入れると無視される



HTMLのタグに、記述したままを表示する pre タグがあります。



<pre>
ほげほげ
どもども
こんにちわ
</pre>


br を使わなくても、改行して表示してくれます。


しかし、IEで動的にJavascriptで pre タグにテキストを書き込むと


自動的に改行コードを半角スペースに変換するらしく


思ったとおりに表示できません。


FireFoxやOperaだとそんなことはないようです。


詳しくはこちら


http://d.hatena.ne.jp/brazil/20060917/1158465641


IE用に別に処理を書くしかなさそうです。



// jQuery.js を使用

var doc = "ほげほげ(改行)どもども(改行)こんにちわ(改行)";

if($.browser.msie){
doc = doc.replace(/\x0D\x0A|\x0D|\x0A/g,'\n\r');
$("pre").text(doc);
}else{
$("pre").text(doc);
}

---------------------------------------------------------------
<pre></pre>



IEの場合だけ、改行コードを置換したらうまくいきました。


この手のIE対応は、本当に自分じゃ解決しきれない


難しい現象が多いので、ネットで解法を公開なさってくれている方に


感謝いたします。





2008年2月6日水曜日

Senna クエリー



全文検索 FullText MySQL + Senna = Tritton を利用したときのメモ


http://qwik.jp/tritonn/


SQLのレシピが少ないので、自分で試したものを記述する。


条件を複数指定する場合は、*X*Y*Z とくっつけて記述すればよいことは


どこにも書いてなかった(見つけれませんでした。)が


試してみたらOKだったのでメモっておく。


キーワード「ほげほげ」を


検索カラム a の中から 完全一致 で見つける場合



select
*
from
table_name
where
match(a,b,c) against('*W1*E-1 ほげほげ' IN BOOLEAN MODE)

// *W1 検索カラム a
// *E-1 完全一致






Senna のクエリーの詳細は、http://qwik.jp/senna/query.html