かなり嵌ったので備忘録。sennaをインストールする際、configureのオプションを指定しないと、デフォルトの文字コードはeuc-jpでconfigureをすることになる。mecabで文字コードをutf8に設定するならば、sennaもそれに合わせて文字コードをutf8に設定しなければならない。あとsennaのconfigure時に何箇所か問題が起こるところがある。
マシンスペックとデータベースのパフォーマンスの関係
マシンが高性能であればあるほど良いに越したことはないが、データベースソフトウェアのパフォーマンスにおいてはマシンの高性能化はあまり意味があるとはいえない。データベースのパフォーマンスを向上させるためには、データベースのテーブルの設計とそれに合わせたsql文のチューニング、そしてデータベースソフトウェア自体のチューニングがほとんどを占める。マシンスペックをあげても、たとえばcpuの処理の能力とメモリ容量を倍にしたとしても、パフォーマンス面ではその投資分の効果は得られない。 例えばメモリを増強すると同時接続やキャッシュなどのサイズを大きく取ることができる。cpuの処理速度はどうかというと、一回のsql文を実行した速度では、高スペックマシンと低スペックマシンではさほど差が表れなかった。試してみたところ、cpuがppc200Mhzでメモリ64MBの玄箱と、cpuがクアッドコア2.1Ghzでメモリ2GBのサーバーマシンでmysqlを使って速度比較をしたてみたら、sqlのselect文の実行にかかる時間は両者ほとんど変わらなかった。
SQL_CALC_FOUND_ROWSの効果
mysqlでは行数のカウントをするのにSQL_CALC_FOUND_ROWSというのを使うことができるようだが、where句に条件を指定した場合だとcount(*)でレコードをカウントする場合と大差ない結果となった。SQL_CALC_FOUND_ROWSを使うことで速度的には向上は見込めない。レコード数が100万件を超える場合にwhere句で条件を指定してそのレコード数をカウントするという場合には、一度グループ化で行数をカウントした後でその結果を合計したほうが若干速く処理することができる。
インデックス列には日本語よりも英数字を使うほうが良いのか悪いのか
テーブル内に存在するレコード数をカウントする時、where句にインデックス列を条件として指定して実行時間がどれほどかかるかテストをしてみた。テーブルの全レコード数は約1600万レコードで、カウントすべきレコード数はそのうちおよそ約70万レコードであるとする。サーバのスペックとしてはcpuがAMDのクアッドコア2.1GHzでメモリ2GB、DBソフトウェアはmysql5.0といったところ。
結果の行数をカウントする
mysqlで結果の行数をカウントするsql文は、
seletc count(*) from foo;
で取得するのが最も簡単ではあるけれど、レコード数が膨大な場合にはパフォーマンスの面で問題になる場合がある。パターンマッチングで検索する場合、Like演算子を使って
xbox360がまた壊れた
前回リングランプが3つ点灯して画面がフリーズするという故障で修理をして、マザーを交換して帰ってきた私のxbox360がまた故障した。故障は前回と同じくリングランプ3つ点灯してフリーズ、以降なにも入力操作を受け付けない状態となる。修理以来、ほとんど起動してなったのに、たまにゲームしようかと起動してみると同じ故障とは如何に。あと、故障とは関係ないことだけれど、修理から帰ってきたときの電源の差込み位置が微妙にずれていた。しかも電源を本体に差し込むのにかなり強引に差し込む必要になった。ぐだぐだな感じがいっぱいなxbox360だけれど、2回目の修理に出すことにした。リングランプ3つ点灯の故障は修理費用がいらないとのことなのでその点だけは救いがある。
vb2005のカスタムコントロールの初期表示イベント
UserControl イベント
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.usercontrol_events.aspx
一覧を見渡してみたが、shownイベントは存在しない模様。loadイベントはあるが、その次に起こるイベントのshownイベント、つまりコントロールの部品が描画されてから起こるイベントはないようだ。独自のカスタムコントロールを作って公開して配布をするというような場合には、結構重要なイベントなのだが・・・。
windows formにはshownイベントは存在するが、そこでform上に配置した独自カスタムの描画後の処理もやれということなのだろうか。しかし他に描画後に処理をするイベントが存在しないため、面倒でも親のフォームのshownイベントを使うしかないのか。できればカスタムコントロール(ユーザコントロールとも言うかな?あるいはクラスライブラリ?)だけで完結したかったのだけれども。
テーブルの列の型を変える(列属性の変更)
mysqlの場合。
ケース1:テーブルのある列の型をtext型で作成してシステムを運用してみたところ、実際にはせいぜい8000文字程度しか使用されていないことがわかったためvarchar型の可変長10000文字に変更する、というような場合。
sql文。targetRowの列属性をvarchar(10000)に変えるというもの。これを実行すると既存のtargetRowの列のデータをすべてvarchar(10000)に変更する。
- alter table targetTable modify targetRow varchar(10000);
VirtualHost *:80 — mixing * ports and non-* ports with a NameVirtualHost
cdn-project:/etc/apache2# /etc/init.d/apache2 restart Forcing reload of web server (apache2)...[Fri Oct 03 21:16:08 2008] [error] VirtualHost *:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results [Fri Oct 03 21:16:08 2008] [warn] NameVirtualHost *:80 has no VirtualHosts waiting [Fri Oct 03 21:16:10 2008] [error] VirtualHost *:80 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results [Fri Oct 03 21:16:10 2008] [warn] NameVirtualHost *:80 has no VirtualHosts
debianのapache2.2を起動しようとしたら上記のエラーが発生するようになった。設定ファイルの内容は何度も確認したので間違いはないはず。
ServerName 127.0.0.1 Listen 80 NameVirtualHost *:80(省略)
エラーの内容がよくわからなかったが、”VirtualHost *:80 — mixing * ports and non-* ports”という部分、この部分の意味は、VirtualHost *:80 とポートの設定をしている箇所と、VirtualHost *とポートが設定されてない箇所があり、重複していると指摘している。はて?他にVirtualHost *というような記述はapache2のconfファイル内にはないはずだが・・・と思っていたら、設定前バックアップをとっていたことを忘れていた。
cdn-project:/etc/apache2# cp ./sites-enabled/000-default ./sites-enabled/000-default.org
というような感じで。どうも/etc/apache2以下にある記述は全て起動時に読まれることをしらなかった。このバックアップファイルを別の場所へ移動させてapacheの起動を試してみると問題なく起動できるようになった。
debianにopensslをインストール
opensslをインストールしてセキュアなhttps通信ができるようにする。