Archive for the ‘program’ Category

MySQLのMyISAM型テーブルは、レコードの追加・削除を繰り返しているとどんどん効率が悪くなっていく。そこで定期的にoptimize tableを発行して統計情報の更新や、インデックスページのソートを行ってやることでテーブルの状態を最適化することが出来る。のだが…そこで思いっきり嵌った。

全部のテーブルをoptimizeして、今までslow-logに出ていたあるSQLを実行すると7秒かかっていた処理が1秒かからないまでに実行時間が短縮されたため、効果が出たと喜んでいたのだが。しばらく経って普通にシステムを使ってみると、時折異様に処理が遅いことがある。いままでDBの構成はMaster1+Slave1の2台構成だったのだが、メンテナンスでSlaveを2台増やした。どうも増設したSlaveにアクセスすると重いことがわかった。既存のSlaveと増設Slaveでの違いは、optimizeしたかどうか。optimizeしたSlaveのほうが、ある特定のSQLで200倍も遅くなっていることが判明した…200倍って!

問題になったSQLは、outer joinやunionを使いまくった、一目見ただけでは何をしているのかサッパリわからないほど複雑なSQLだった。保守性を考えれば、そういう複雑なSQLは使わずに、プログラム側でループを使うなりハッシュを使うなりしてわかりやすくするべきだ。しかし今回はあくまで処理速度重視というかアプリサーバとDBサーバ間の通信を極力減らす必要があったため、複雑なSQL1発で済ませなければならない事情があった。

最適化していないDBでは、explainしてみるときちんとインデックスが使われているのに対し、最適化したほうのDBではkeyがnullになっており、あるテーブルがフルスキャンされていた。そのフルスキャンされているテーブルはレコードが100万近く入っており、そりゃ時間かかるわなって話。2000秒以上テーブルロックして(MyISAM型は行ロックではなくテーブルロックがかかる…その間readもwriteも不可)、そのせいでアプリサーバもウェブサーバもコネクション使い切って死ぬ。

結局その問題はforce indexを使うことで無理矢理解決。あるいはstraight joinを使うことでも同様の効果が得られた。たまたま同じデータで最適化したものとしてないものがあったので、explainでどのindexを使えば速くなるのかすぐわかったので助かった…

実際のところforce joinよりもstraight joinのほうが、optimizerが順序を考えなくて済む分若干速いのかな?その辺はちゃんと調べる余裕がなかったので謎。まぁ複雑なクエリを投げるときはoptimizerに頼っちゃダメってことですな…

, ,

bashで本格的なCSVを扱うにはPerlなんかを使うほか道はないっぽいけど、ダブルクォート内のカンマは文字列として扱うとか、そういうことを無視して極単純なCSVを扱うだけならbashだけで以下のようにいける。

$ cat read_csv
IFS=,
while read FILE
do
set -- $FILE
echo "field1:" $1 ",field2:" $2
done
$ cat data.csv
aiueo,12345
hogehoge,mogemoge
$ sh ./read_csv < ./data.csv
field1:aiueo,field2:12345
field1:hogehoge,field2:mogemoge

なんかPerlとか使うと負けた気がするのよね…

, ,
  • lessでファイルを開いてshift+f押すとtail -fのように動作する。止めるときはctrl+c
  • tail -fと同じ動作をする(厳密には微妙に違うが)その名もズバリtailfというコマンドがある

知らなかった…

, , ,

新しもの好きの俺的には、仕事にも新しいものをガンガン取り入れて行きたい派。なので、今回のプロジェクトもJavaは5.0、MySQLも5.0ととにかく最新の安定版を使った開発を提案して実践していた。幸いPMも新しもの好きだったので、あっさりOK出て良かったのだが。

でも客としてはやはり枯れた技術に拘りたいみたいだ。つか最初に確認したハズなんだが、今更になってJavaは1.4じゃなきゃダメとかいいだして大惨事に。なんとか1日でコンパイルは通るように修正したが、殆ど全部のファイルを修正する羽目になってしまった。

Generics使え、enum使えと口うるさくメンバーに言っていたので、非常に気が重かった…。せめてもの罪滅ぼしに(って俺が悪いわけではないのだが)、2/3ほどひとりで修正してenumもTypesafe Enumパターン使って全部置き換えた。Typesafe Enumは日本語のドキュメントがあまりないのだが、まぁEffective Java読めってことです。

しかしこれ、switch文で使えないのが難点なのよね。Java5.0でも逆コンパイルしてみたら結局if-elseになってた。なにか美しい方法はないのかな……

, ,

Winnyの技術
買って読んだ。ソースコードは一行も書いてないが、ネットワークに関する深い知識が無くても(基本的な知識さえあれば)普通に読める。ノードの管理方法、クエリやキーの管理方法、暗号化、プロトコルに至るまで、一通りの説明がなされている。これを読んだらWinnyと同等の機能を持ったソフトを作ることも、ある程度の知識がある人ならば可能だろう。

なんか金子勇氏本人が、この書籍をPDF化したものをWinnyに流すとか言っているようだが、興味があるならそんなケチくさいこと言わないで買うべき。説明も凄くわかりやすいので、やっぱこの人は頭がいいのだなぁと改めて思う。

, ,

JSFでAjaxを簡単に実現 - AjaxFaces 1.0公開

AjaxはWebのUIにおいては、とても有益な技術というか手法であることは間違いないのだけど、実装が異様に面倒だという点で敬遠していた人も多いのではないかと思う。なので、こういったツールが出現することは必然ではあったのだけど、吉報ですな。他にもDWRSajaxなんかがあるけど、選択肢が増えるのはいいことだわ。早速明日にでも、会社で遊んでみようかと。

, , ,

新しいプロジェクトの絡みで、RSS関連のサービスについてあれこれ調べたり使ってみたりしている。主に調べているのはソフトをダウンロードして、クライアント側で使うRSSリーダーではなく、Web型のもの。で、単なるRSSリーダーではなく、なんらかの付加機能(たとえば今注目されている記事をお勧めしてくれる、とかそんなような機能)の付いているものを調査中。

今日Internet Watchで紹介されていたFeedBringer、凄い。Alpha版ということで、まだ実装されていない機能があったりするんだけど、使い勝手がいい。個人的にはBloglinesより好きだ。ドラッグ&ドロップ使えるのが新しい感じ。Ajax駆使してますな…

今日も今日とてさんで言及されているが、個人的にありがたいのはフォルダが2階層掘れる点。元々Sageを使っていたんだけど、このOPMLをエクスポートしてBloglinesでインポートしてみたら上手くいかなくて、イラついていたのです。FeedBringerではサックリとインポートできた。

あとはユーザ数が増えたときに、どれだけ安定して動作するかって点が問題か。こればっかりは時間が経ってみたいと評価しようがないのだけど。これからBeta、正式版とバージョンがあがるにつれて、どんなサービスが提供されるのか注目していきたい。

ていうかぶっちゃけた話、非常においしいタイミングで出てきてくれたサービスなんだな。今、某所某プロジェクトの企画書書いてる段階なんだけど、ガッツリ参考にさせてもらいますよw

, , ,

Firefoxのプラグインとして、とあるものを作りたいと思っている。あまり受けそうなものではないが、少なくともうちの会社の人はあれば便利と思ってくれるものになる……予定w

以下、参考になりそうなとこ。

その絡みで@ITの連載、役に立つXMLツール集も一通り目を通したい。

,

リンクなんかにカーソルをあわせた時に、ポップアップウィンドウで情報を表示させるようにあれこれポップアップを入れてみた。便利だし、なかなかカコイイではないか。
Continue reading ‘あれこれポップアップ’ »

, ,

前のエントリーで書いたSP2だが、Microsoftのダウンロードセンターで正式に公開された。
Continue reading ‘Windows XP SP2 続報’ »

,