Google App Engineでインデックスを使う

Google App Engineのキーバリューストア(DataStore)の特徴はSQLライクな構文による検索と、インデックスを使える事です。といっても、一般的なDBMSほどの機能を提供してくれるわけではありません。Google App EngineのDataStoreの特徴を踏まえて上手に使いましょう。
インデックスの制限
DataStoreのインデックスはstlのmapと同様の構造になっており、ソートの為に使用するインデックスと検索のために使用するインデックスは共有されているようです。そのために様々な制限が加わります。
制約1
検索条件で不等号を指定した場合には、検索条件と異なる並べ替えの指定をできません。where区で指定したフィールドは、order by区でも指定する必要があります。

×・・・WHERE col1 > 1 ORDER BY col2
○・・・WHERE col1 > 1 ORDER BY col1, col2

制約2
複数の不等号による比較条件を持つクエリーを実行できません。

×・・・WHERE col1 >= 10 AND col2 > 10

制約3
OR演算子がありません。代わりにIN演算子が用意されていなすが、異なるフィールドを指定したOR検索は出来ません。
制約4
ひとつのアプリケーションで作成できるインデックスの数は  個に制限されている。制限3と合わせて、無闇にインデックスを作成すると規模の大きなアプリケーションでは制約に引っかかる可能性があります。
制約5
セッション分離をサポートしません。一般的なDBMSは他のセッションから更新が行われても、他のセッションは新しいセッションを始めるまで影響を受けませんが、DataStoreでは即時に反映されます。
これらの制約を踏まえて如何にして旨く活用していくかが問題になります。
DataStoreを使いこなすには?
施策1 スクリーニングに留める
GQLによる検索はスクリーニングに留めます。例えば特定条件に一致するデータを日付順で取得したい場合には、日付によるソートのみをGQLで行い、条件に一致するか否かはコードで記述します。
施策2 頁番号フィールドを作る
大量のデータをすべて読み出しながら処理を行う場合には、一度に全てのレコードを読み出すことは出来ません。先頭レコードと読み出すレコード数を指定して、数百レコードずつ読み出して処理を行うことになります。この場合、処理中に他のプロセスからレコードの追加、削除が行われると、同じ行を二回処理したり、処理されないレコードが発生する恐れがあります。
これを防ぐために頁番号フィールドを作成して、数百レコード格納する毎に頁番号を繰り上げるようにします。読み出すときには、頁番号を指定することで一度に処理可能なレコード数を読み出します。頁番号を繰り上げながら順次読み出すことで、途中でレコードが追加されても最後まで読み出すことが出来ます。
施策3 検索条件、ソート条件の分離
検索条件やソート条件を別のエンティティに分離します。それぞれのエンティティ毎に検索・ソートを行うことで、全体として目的の結果を得ます。
例えば会員情報を格納したエンティティから年齢18歳以上の人を都道府県毎にソートして取得したい場合を考えてみます。都道府県を格納したエンティティからソートした状態でレコードを読み出します。次に会員情報に対して県名と年齢を検索条件として読み出します。ソートされた県名順にデータを読み出していくので、結果的に件名でソートされた18歳以上の会員一覧を得られます。
このように複数回の検索に分離することで望んだ結果を得ます。
施策4 検索を使わないように設計する
実は王道かもしれません。GQLに頼らなくても望みのデータを取得出来るようにエンティティを設計します。
この話は、別の記事にて。

Google App EngineのDataStoreインデックスの削除

Google App EngineのDataStoreに一度作成したインデックスを削除するには、下記のコマンドを実行します。
appcfg.py vacuum_indexes [プロジェクトパス名]
例:appcfg.py vacuum_indexes “C:\Users\narita\workspace\sample”
ただしこのコマンドはプロジェクトで作成したインデックスのうち、index.yamlに登録されていないインデックスを、すべて一括して削除してしまうので注意が必要です。

感染した未知のコンピュータウィルスを削除するには・・・実践編2/2

続いてレジストリの確認を取ります。実践編1/2でウィルスが起動しないようにしたあと、for VirusCheck OSを起動して、レジストリエディタから全レジストリの内容をエクスポートします。エクスポートしたレジストリはテキストファイルイン保存されますので、for Refrence OSのウィルス感染前のレジストリをエクスポートしたものと比較して変更箇所を検証していきます。
registry
実際に細かく追っていくとかなり根気のいる作業です。今回のウィルスでは以下の場所に改変がくわえられ、ログオン時にウィルスが起動されるようになっていました。

[HKEY_LOCAL_MACHINE&yenSOFTWARE&yenMicrosoft&yenWindows NT&yenCurrentVersion&yenWinlogon]
“Userinit”=”C:&yen&yenWINDOWS&yen&yensystem32&yen&yenuserinit.exe,C:&yen&yenProgram Files&yen&yenCommon Files&yen&yensvchost.exe -s”

今回のウィルスは比較的シンプルな作りになっていたので、ファイル1つ、レジストリ1箇所だけで済んでいます。etcやDNSサーバの情報を改ざんしたり、電子証明書を改ざんしたり、ドライバを組み込んだり、ブラウザやエクスプローラーにプラグインを組み込んだりと、複雑な動作をするウィルスもいます。気を抜かずに根気よく一つ一つ確認していく事が重要です。
ウィルスを駆除する為に削除するファイルやレジストリが明確になったら、実際に感染した環境でそれらのファイルを削除したり、あるいはレジストリを修復していく事になります。ウィルスが常駐している状態では削除などの操作はウィルスによってトラップされており、おこなえないのが常です。OSのモジュールの一部が置き換えられている場合には、たとえセーフモードで起動したとしてもウィルスは常駐してしまいます。KNOPPIXなどのCDからブートするLinux環境から、NTFSのファイルシステムをマウントして、ファイルの削除などをおこなうのが一番確実でしょう。
今回のウィルスは幸いな事に、セーフモードのコマンドプロンプトで起動すれば、ウィルスが常駐する事を防げます。したがってセーフモードのコマンドプロンプトで起動した後、C:¥Program Files¥Common Files¥svchost.exeのシステム属性と非表示属性を解除し、ファイルを削除することで除去できました。

感染した未知のコンピュータウィルスを削除するには・・・実践編1/2

手前の記事に続いて、感染した未知のウィルスの駆除を実践してみようと思う。今回使用するツールは仮想OSとしてVMWare。左から順番に感染させたHDDをマウントして操作する為の環境(Windows XP Professional、以下作業用OS)、実際にウィルスに感染させる環境(Windows XP for VirusCheck、以下for VirusCheck)、ウィルスに感染する前の環境と比較する為のコピー(Windows XP for Refrence、以下for Refrence)の三つのゲストOSを準備した。for Refrenceはfor VirusCheckの仮想OSをコピーして作成したので、この二つはほぼ完全に同一の環境です。
VMWare2
最初にfor VirusCheck環境にウィルスを感染させます。USBメモリを詳細表示してみると、下記のようにフォルダに見えるものは実行可能なアプリケーションになっています。この謎のアプリケーションを実行します。そのあとUSBメモリに新規にフォルダを作成すると、すかさずアプリケーションに置き換えられています。旨くウィルスに感染できたようです。
USBMemory
ここでfor VirusCheckをシャットダウンし、作業用OSからfor VirusCheckとfor RefrenceのHDDをマウントします。for VirusCheckとfor RefrenceのHDD同士を比較するのですが、ここではWinMergeと言うフリーウェアを活用しました。カーソル箇所のファイルを見てください。F:がfor VisrusCheck、G:がfor Refrenceです。F:\Program Files\Common Files\svchost.exeと言うファイルが追加されている事が分かります。svchost.exeはサービスの制御をおこなっているプロセスで、普通はC:\Windows\system32\svchost.exeにあるはずのファイルで、あからさまに怪しいです。
WinMerge
実は他にもpagefile.sysとか、NTUSER.DATとかいくつかのファイルが変更されているものとして抽出されます。pagefile.sysはスワップファイルでOSを起動すれば必ず更新されるファイルです。こういった正常でも更新されるファイルは多々ありますが、知識に照らし合わせて判断して言ってください。
今回はF:\Program Files\Common Files\svchost.exe以外にとくに問題となるファイルが見当たりませんし、作業OS上から該当するファイルを削除します。その後、あらためてfor VirusCheckゲストOSを起動してウィルスがどうなったか見てみましょう。
USBメモリにフォルダを作成しても、勝手に実行ファイルに置き換わっている様子はありません。とりあえずウィルスの動作は止まったようです。
その他の影響を見る為、続けてレジストリの確認に移ります。

感染した未知のコンピュータウィルスを削除するには・・・

先日、ウィルス対策ソフトのメーカーのページでも固有名が付いておらず、削除方法不明のウィルスを削除する機会があった。最近は新種の・・・というよりも亜種といったほうがよいのだろうか?ウィルスの発生頻度が高くなっているそうだ。とすると、今後はウィルスに感染した場合、昔のように除去方法までアナウンスするのは難しくなるのかもしれない。
そんなわけでこの機会に正体不明のコンピューターウィルスを削除する方法を調べる方法など紹介してみようと思う。実はたいしたことじゃない、誰にでもできる単純作業なのだ。
用意するもの。仮想OS環境。VMWareでもVirtualPCでもよいので仮想OS環境を用意します。実環境で作業でいなくもないけれど、HDDを外したりマウントしたり、同じ環境を複数用意したりと、仮想OS環境上じゃないと面倒な事、この上ないです。
まずは感染させるためのゲストOSを用意します。感染させるためのゲストOSは作業を楽にするために出来るだけシンプルで、かつ実際に使用している環境と同じように各種ツールをインストールしましょう。
たとえば複数の機能・・・例えばメールとWordのマクロを使って感染する能力も有している様なウィルスがいたとして、感染させる環境にWordがインストールされていなければ、Word感染にかかわる部分が分からないままになってしまいます。したがって実環境でインストールしているものは、できるだけインストールしている必要があるのです。同様の理由でサービスパックやIEのバージョンなどもできるだけ一致させましょう。
ゲストOSを準備したら、感染前にレジストリの全データをテキストファイルにエキスポートします。同時にHDD内の全ファイルのハッシュ値を算出し保存します。これでほとんどの場合、ウィルスが感染する時におこなったシステムへの変更を、ほとんどの場合追跡できます。
準備がすんだら実際にウィルスに感染させます。
誤ってホスト環境に感染させないように気をつけましょう。VMWareの場合は新しいPnPデバイスを自動で仮想OS環境にマウントする(ホスト環境にはマウントされない)機能があるので、この機能を忘れずに有効にします。
この時、必ずネットワークに接続した状態で感染させましょう。最近はインターネット上のサーバーからウィルス本体をダウンロードするタイプもあります。正常にきちんと感染させないと、ウィルスが感染時に何を行っているか正しく把握できません。
正常に感染したら仮想PCをシャットダウンします。別の仮想PCに感染した仮想PCのHDDをマウントします。その後、先ほどと同じ要領で全ファイルのハッシュ値の算出をおこない、感染前のファイルハッシュ値と比較して変更されたファイルや新たに追加されたファイルをリストアップします。
中には正常にOSが起動して終了しただけでも更新されるファイルもあります。それらは除外して考えましょう。レジストリファイルやスワップファイル、イベントログなど、それほど種類は多くありません。
続いて変更されたレジストリを調べます。そのためには一度感染したOSを起動しなくてはなりませんが、感染した状態ではウィルスがレジストリ情報を隠して、本当に正しいレジストリを取得できない恐れがあります。レジストリを取得する前に、感染によって置き換えられたファイルを削除、あるいは感染前のファイルに置き換えます。そのあと感染したOSを起動してレジストリをエクスポートし、感染前のレジストリと比較して変更箇所を把握します。
ここまでの作業によって感染によって作成変更されたファイルとレジストリの一覧が手に入りました。後はこれらのファイルとレジストリを元に戻す手順を確立するだけです。
運が良ければセーフモードで起動して削除できますが、実際にはセーフモードでも常駐するウィルスが多いです。したがって、実際的にはCDなどからブートしてHDD上のファイルを削除するのが一番確実です。感染したPCを起動しても、常駐しているウィルスが邪魔をして、なかなか思うように削除できませんからね。
感染ファイルを削除してしまえば、レジストリが残っていたとしても、ウィルスは活動できません。感染ファイルを修復した後に、改め感染したOSを起動してレジストリを修復するのがよいでしょう。
・・・というわけで、後日実際にデモって見るよ。続きをお楽しみに。