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





2007年12月29日土曜日

レプリケーション時のエラースキップ



MySQLのレプリケーションで、稼動中のマスターDBからスレーブDBに


データをコピーし、レプリケーションを開始したところ


ところどころで、error 1060 プライマリーキーの重複などのエラーがでました。


最初は、



SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE SQL_THREAD;


として、処理を再開していましたが、大量に出てきてこりゃ手に負えないわということで


my.cnf に以下を追記し再起動



[mysqld]
slave-skip-errors=1060


一応、今のところ問題なくレプリケーションしてます。


そもそも、稼動中のMySQLのレプリケーションのやり方を詳しく説明しているのを見つけることができず


とりあえずで、以下の手順でスレーブを作りました。


(1)マスターをコピーして、スレーブに移動


(2)マスターのバイナリーログをながめてレプリケーション開始のポジションを決める。


(3)スレーブの設定に slave-skip-errors をセットして問題ないエラーを回避する


マスターをシャットダウン(テーブルロック)できたら、こんなことにはならなかったと思うのですが


まぁ、止めたくなかったのでコピーを稼動中にするはめに。


更新処理がどんどん進めば、スレーブのデータのずれも


上書きされて、まぁ問題ないかと。


スレーブは基本参照用に使うつもりなので


致命的なデータのずれさえなければ、そんなに整合性にはこだわらなくても


いいのかとおもいます。マスターとの同期に時間的なずれがそもそもあるしね。





2007年11月30日金曜日

アバターの仕組み



アバターって、自分のキャラクターに容姿を自由に変更できるあれね。


Yahooのアバターってどうなってるんだろうと、興味本位からちょっとみてみると


透過画像を重ねて、部分的に入れ替えれるようにしてる。


GDとか使って、まるまる画像生成ってしてるのかとおもったら


意外と単純。(よく考えたらアニメーションGIFとか、そのまま合成できないからあたりまえか。。。)






<style>
div{
width :100px;
height: 100px;
position:absolute;
window. }
#img1 {background: url(img1.gif) transparent no-repeat; z-index:10;}
#img1 {background: url(img2.gif) transparent no-repeat; z-index:20;}
#img1 {background: url(img3.gif) transparent no-repeat; z-index:30;}
#img1 {background: url(img4.gif) transparent no-repeat; z-index:40;}
#img1 {background: url(img5.gif) transparent no-repeat; z-index:50;}
</style>

<div id="img1"></div>
<div id="img2"></div>
<div id="img3"></div>
<div id="img4"></div>
<div id="img5"></div>



こんな感じのHTMLに img1.gif ~ img5.gif の同じサイズの透過GIFでも用意したら


できあがり。


要は、その画像の組み合わせが大変だってことやね。


コンテンツ生成に高額な費用がかかるのがネック!





2007年11月11日日曜日

JQuery でごりごりJavascriptのプログラムを書いていたときに、



急にFireFoxの挙動がおかしくなり困ったことに。


画面の更新を何回かすると、アプリごと落ちる現象です。(更新回数とかは不規則)


Exception Interface Code:0xc00000005 Flags:0x00000000 Record: 0x0000000000000000 。。。。


詳細を見ると上記のようなエラーコードとか、モジュールの情報とかいろいろ詳でてくるんだけど


細かくちまちま調べる気になれず、何が起こったかを調べるより


Javascriptを順番にコメントアウトしてどの記述が影響しているのかを調べるほうに注力しました。


結論から言うと以下のコードは、落ちる可能性がある。(原因は不明)


リスト1



$(function($){

(function($){
コード1。。。
})($);

(function($){
コード2。。。
})($);

(function($){
  コード3。。。
 })($);

});


以下のように書き直すと、問題解決しました。


リスト2



$(function($){
コード1。。。
});

$(function($){
コード2。。。
});

$(function($){
  コード3。。。
});


どちらも、HTML読み込み完了後にJavascriptが実行されるような記述です。(JQuery参照)


リスト1のように、とりあえず内容別に名前空間を分けて書きたいなぁと、


深い意味も考えず書き始めました。


最初のコード1までは特に問題なく、コード2を書き足したあたりから、


不穏な動きが始まりコード3を書き足したときにようやく何かがおかしいなぁと思い始めた次第です。


(特にコードの量が増えると、落ちる頻度があがるような気がしました。)


もともと、FireFoxにFireBug、YSlow、Greasemonkeyなどのアドオンを


複数インストールしていた関係もあって、


FireFoxの挙動がおかしく強制終了するようなことはしょっちゅうありました。


プログラムを書いているときも、そういう別原因の要素が働いているのかとも思い、


納期もあるしあんまり原因追求へ脱線している時間もないと放置していたわけです。


(たまにIEで確認したりするときも問題はなかったので、余計放置していました。)


しかし、他のPCのFireFoxでも落ちる現象を確認したときは


さすがに自分のコードが原因だと確信しました。


Javascriptを書いているときって環境依存の部分の検出ってほんとに


めんどくさいし、手間のかかることだから蓋をしておきたくなりますよね。


でも、見つけた時は、あきらめてとりかかるしかない。。。


(もちろん、見つかっていない部分も探さないといけないですけどね。)


結局、現象はおさまりましたが、JQuery(Javascript)の勉強不足で


原因というのは分かっていません。


ただ、いろいろ調べてみて自分自身、原因特定の糸口もつかめず苦労したので


同じような現象になったかたがおられたら、とりあえずでもいいので


上記のように書き直してみて、現象がおさまれば幸いと思った次第です。


(書き直しによる解決は、あくまで自己責任でお願いします)


原因の調査はできるときにしたいと思いますが、誰か教えてくれる


親切な人がいましたら、是非ともトラックバックやコメントでお願いします。





2007年10月12日金曜日

PHPについて一言いっておくか

PHPさいこー。

・へぼプログラマーでも、がりがりかけちゃう。
・直感的で理解しやすい。
・テキストエディタで十分。IEDとか重いのいらない。
・組み込み関数がたくさんあって、リファレンス読めばたいがいできる。
・Webの仕組みに特化している

言語仕様的には、プログラマーにかなりやさしい言語ではないかと思います。
下手なデザインパターンや、オブジェクト指向できる言語より
PHP4ぐらいの中途半端な仕上がりで、がりがり書くほうが意外と効率的です。

設計重視の言語は、とりあえずガリガリ書いてみる派の私には向きません。
まぁ、PHPは私に向いている言語だと思います。