投稿者のアーカイブ

jqGridの設定はsetGridParamで(以下略

他人の褌で相撲を取るような内容ですが、jqGridネタが有ったので少し。
getが有るならsetも(多分)有る、と言うのがプログラムです。

データを読み書きに行くURLを変更したい場合は以下のような感じで

$("#grid").jqGrid('setGridParam', {url:rurl,editurl:surl});

任意にリロードを発生させる必要が有るなら
$("#grid").trigger("reloadGrid");

jqGridは他にもonSortColでソート順をいじる、
onSelectRowで判定後にdatepickerを表示したりさせなかったりcss()で背景色を変えたり、
なんて事も出来ます。

Facebooktwitterlinkedintumblrmail

正規化しないと駄目かな

PostgreSQL8.1を使ったあるシステムでのお話しです。

まずユーザデータのテーブルが有り、そのユーザはID(連番)で管理されています。
そしてユーザが登録するデータテーブルには、データごとにそのデータを共有するユーザのIDが複数登録されています。
これはユーザIDをCSV形式の文字列で格納をしているんですが、条件文でLIKEとORを連発するのでデータ量が多くなると検索が非常に重くなります。

正規化しないと駄目かなと考えたんですが、対象となるテーブルが複数有るので修正に必要な箇所が散在していて、そのうえデータ量が多くなるテーブルは1つか2つしかないので、構造を変えずにどうにかならないかと別の方法を探しました。

結果として一応、postgresql-contribに含まれるtsearch2が、分かち書き形式の全文検索が出来るので良い感じかなと言う事でやってみました。
日本語には対応していませんが、今回は不要なので構いません。
(GINインデックスは対応が8.2からだったのでパスしました)

postgresql-contribは既にインストールされているので、postgresユーザになって、
psql dbname -f /usr/share/pgsql/contrib/tsearch2.sql

次にpsql dbnameでログインして、GRANTを掛けます。
GRANT ALL ON pg_ts_cfg TO PUBLIC;
GRANT ALL ON pg_ts_cfgmap TO PUBLIC;
GRANT ALL ON pg_ts_dict TO PUBLIC;
GRANT ALL ON pg_ts_parser TO PUBLIC;

とりあえずテスト。
CREATE TABLE test_tb(testts tsvector);
CREATE INDEX test_tb_testts ON test_tb USING gist (testts);

何事もなく作成されたので、データを入れてみて、SELECT。
データ中に2と4の含まれるデータを検索します。
SELECT * FROM test_tb WHERE testts @@ to_tsquery('default', '2&4'); -- and検索
SELECT * FROM test_tb WHERE testts @@ to_tsquery('default', '2|4'); -- or検索

EXPLAINすると、INDEXを使用しているようです。
Bitmap Heap Scan on test_tb (cost=4.10..108.72 rows=27 width=32)
Filter: (testts @@ ”’2” & ”4”’::tsquery)
-> Bitmap Index Scan on test_tb_index (cost=0.00..4.10 rows=27 width=0)
Index Cond: (testts @@ ”’2” & ”4”’::tsquery)

これを応用して、対象となるhogeテーブルのcol列にtsvector型に対応させたインデックスを作成します。
一応カンマからスペースに変更して、格納するようにreplaceしています。
CREATE INDEX hoge_col ON hoge USING gist (to_tsvector('default', replace(col,',',' ')));
SELECT * FROM hoge WHERE to_tsvector('default', replace(col,',',' ')) @@ to_tsquery('default', '2|4');

これで一応インデックスは効いているようです。
今までのクエリはインデックスを使わないでそのまま使えるし、インデックススキャンが必要なところは都度対応する事が出来ます。
とはいえ、かなり強引かなと思える方法なので、今後見て行かないとこれでOKかは分かりませんが・・・。
それと、どちらも許容範囲では有りますが、メモリ上に一度乗るとインデックス使わない検索の方が早い事も有ります。

何か他に良い方法は無いものか。

Facebooktwitterlinkedintumblrmail

PHP5.1.6-27でのファイルアップロードと文字コード変換

OSはCentOS5.4でphp-5.1.6-27で確認しました。

この状態でencoding_translation = OnにしてFormタグにenctype=”multipart/form-data”を指定すると、同じForm内に入力した文字コードは自動変換されません。
encoding_translation = OffにしてPHPで全変換するか、事前にチェックして書き換えるか、悩みどころです。
encoding_translationの必要があるシステムは可能な限り避けたいなと思いますけどね。

Facebooktwitterlinkedintumblrmail

いつか通った道

富士通のWindows 7ケータイ F-07C ですが、これに似たような物を持っていたなと。
思い出してみると、SHARPのWillcom D4でした。

D4と比べてみるとサイズは少し小さくて、重量に至っては218グラムでD4の半分以下。
非力とはいえ、今この重量でWindows OSの機種は他に無さそうです。
が、iPhoneやGalaxySよりは大きいので、それで大きいと感じる人には向かないですね。
携帯用OSが入っているから、普段は困らないかも知れないですが、それならWindowsは不要じゃないかと言う事にも。

必要か、必要無いかと言えば必要無いんですが。
必要無いんですが。
そろそろ携帯買い替えようかと思っていたところでこんな物が出たら・・・。

取り合えず、安く済ませる事だけ考えるように、他は何も考えないようにしています。

Facebooktwitterlinkedintumblrmail

どうでも良い話

タッチパッドが苦手です。
キータッチしているうちに、触って別の場所にフォーカスしてしまう。
果てはWeb上のフォームで入力中にPostしてしまう。
そんな経験を何度もしているうちに、苦手になりました。
設定やアプリで変更出来ますよと言う人もいるけど、割と設定画面が違ったりして面倒です。

今使っているノートPCはUSBマウスを挿すと自動的にタッチパッドが無効化されるので、
設定で出来ます、じゃなくて初期設定でそうなるように作ってある事が良いと感じました。
Firefoxのアドオンやコンフィグが一部で評価が悪いのが分かった気がします。WindowsMobileも。

そもそもタッチパッド付けなければ良いじゃないか、
とかタッチパッド嫌いはThinkPad買えと言う話が出るんですがまぁそれは別の話で。

Facebooktwitterlinkedintumblrmail

make不要になっていたRed5

Red5はバージョンは追っていたんですが、0.6以降全く触っていなかったので、とりあえずインストールだけでもやっておくかなと0.9.1をダウンロード。
http://code.google.com/p/red5/

ちょっと調べてみるともうmakeしなくてもそのまま動作するらしいので、antも入れないで良いかと、CentOS5にJAVAだけインストールしてその後、環境変数を設定。

export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin

red5を解凍して適当に放り込んで起動。
/usr/local/red5/red5.sh &

するとエラー。
 Exception in thread “main” java.lang.NoClassDefFoundError: org/red5/server/Bootstrap

調べてみても、それらしいものは見当たりません。
シェルなんだしと、とりあえず中身を見てみるとRED5_HOMEと言ういかにもな環境変数が無い時にpwdで取ろうとしていたので、ああ、なるほど、とカレントに移動してやってみる。
 cd /usr/local/red5
 ./red5.sh
見事に起動。時々やった事はあるけど、pwdで取っても意味が無い奴ですね。一応環境変数に追加しておきます。これでどこからでも起動可能でした。
 export RED5_HOME=/usr/local/red5

あ、exportはbashrc等のファイルに書いておかないと次回起動した時に消えるので忘れずに。

Facebooktwitterlinkedintumblrmail

PostgreSQL9.0が正式リリースされたようですね

http://www.postgresql.jp/

やはり最大の特徴はレプリケーションやホットスタンバイ等が統合されている点でしょうか。
これでマスタースレーブへの導入が進むとか、新しい使い方も出て来そうな気もしますが、試すには時間が無いかな。

Facebooktwitterlinkedintumblrmail

複数テーブルをまたいで重複しないIDを自動的に振る(PostgreSQL)


CREATE TABLE test(id serial, hoge text, primary key(id));
CREATE TABLE test2(id int default nextval(pg_get_serial_sequence('test'::text,'id'::text)::regclass), hoge text);

INSERT INTO test(hoge) VALUES('hoge');
INSERT INTO test2(hoge) VALUES('hoge');
INSERT INTO test(hoge) VALUES('hoge');

PostgreSQL8.1.9で確認。

testのidには1,3が、test2のidには2が入ります。
立っているclassは親でも使えと言う感じです。
デフォルト値にはcurrvalも使えますが、setvalで初期値を忘れずに。

普通に使う機会が無さそうなものばかりで。

Facebooktwitterlinkedintumblrmail

文字コードの話(EUC-JP)

大体知ってるという人も多いと思うので、概略だけ。

EUC-JPは拡張としてマイクロソフトが規定したCP51932と 日本ベンダ協議会が規定したeucJP-msが有ります。何が違うかと言うと
前者はJIS X 0212が無い、NEC選定IBM拡張文字が有る、ユーザ定義文字が入らない
後者はJIS X 0212が有る、NEC選定IBM拡張文字が無い、ユーザ定義文字が入る
と言う事のようです。
因みにブラウザではIEはCP51932のみ対応で、FirefoxやOperaは両方対応しているようです(表示に関して)。
で、またややこしい話ですが、これらの3ブラウザ全て送信時はCP51932らしいんですが
FirefoxだけはJIS X 0212をエンティティ化(数値文字列化って言うのかな)しないで送るので、Firefoxで送信した文字だけはFirefox以外で見ると文字化けする事があるという。
追記:今もそうなのか時間があれば調べたいと思います。

またSQLサーバではPostgreSQLとMySQLはeucJP-msですので、同じEUC-JPでも微妙に違う文字が送られて来る事を意識しないといけないんですね。

PHPでは5.2.1以降でしかeucJP-msは対応していませんので、中間処理もこれより前のバージョンでは手で修正が必要になるようです。

あとは他の文字コードからの変換で微妙に違う字体になったりする事もあるらしいです。

まぁ、SJISもEUC-JPも色々と問題があるんですが、UTF-8も問題が無いわけではないんですね。
その辺はサロゲートペアで調べれば出ると思います。対応アプリとかメモ帳でバックスペースとか。

間違いに関して、突っ込みお待ちしております。

Facebooktwitterlinkedintumblrmail

PostgreSQLメモ

多分使わないメモ。

・カラム名column_nameのあるテーブルを探す。
 select t.relname,c.attname,format_type(c.atttypid, c.atttypmod) from pg_attribute as c
 inner join pg_stat_user_tables as t on(c.attrelid = t.relid)
 where attname = 'column_name';

・テーブルとインデックスのサイズを確認する(ブロックサイズ*ブロック数)。
 SELECT tablename,pg_relation_size(tablename::text) from pg_tables where tableowner != 'postgres';

 SELECT indexname,pg_relation_size(indexname::text) as indexsize from pg_indexes where schemaname != 'pg_catalog';

・今ロックされているテーブルを調べる。
 SELECT relname from pg_stat_all_tables where relid in(select relation from pg_locks) and schemaname != 'pg_catalog';

Facebooktwitterlinkedintumblrmail