[PC][Program]CouchDBで検索ってどうすりゃいい?

会社で必死に検索システムを構築しようとPHPカリカリ書いている今日この頃。
ようやくデータの登録フォームを作ってデータ登録までは出来たんですが、検索に悩んでいる次第。
CouchDBで検索をしようと思ったらViewを作ってkeyで絞るしかないようなんですが、その絞った結果に対してさらに別のキーで絞るとかができそうにない。当然検索システムとしてはANDで絞って検索とかしたいんだからそこをどうにかしないとなぁ。
Viewのkeyに配列でも指定したらいいのかな? けどそれだとその配列にみごと合致するものしかヒットしないだろうし、startkeyとendkeyはそういう与え方できなさそう・・・。
となるとやっぱりMySQLに逆戻り・・・? なかなか難しいな。どうすりゃいいんだ? 登録はCouchDBが圧倒的に楽だけど、検索はMySQLが非常に柔軟。検索が複数キーでできたらCouchDBで決まりなんだけどなぁ。
とりあえず、明日には方針を考えよう。うーん、Viewで全部取ってきてPHP内で検索してもいいけど、なんだかなぁ。すごく微妙な気分だ・・・Orz

広告

[Program]ちょっと楽しいZendFramework

発端は会社にて。TLに
「こで君て、データベースとか検索システムって作れたりするん? 外注じゃなくて内製の方が融通利くから、作れるなら作って欲しいんやけど」
って言われたところから。
現状、ベンチマークでばらしたり、試作品作ったりして性能を見たりしてるわけですが、そいつらのまとまった情報が無い。だので、それを整理しつつ引っ張ってこれるシステムを構築したいとのこと。
まぁ言われた当初はめっちゃ要求がアバウトで、できるできないを回答し辛かったので、まずは要求をより具体化するところからスタート。来年度から私が飛び込むチームの方々は私以外全員非ソフト屋さんということで、ソフト屋の常識は一切通用しないんですね。そも、データベースといわれたもののどんな情報を貯めていきたいかも決まってないし、フロントエンドのイメージもない。
逆に言えば多分に私の意見が通るというわけでもあったんですが、作ったはいいけれどお蔵入りするのも嬉しくないのでイメージはしっかりすり合わせたつもり。
どうも話し合いを続けていくと、検索システムは通販サイトをお手本にしたらよさそうだって感じまして。
で、通販サイトを構築するOSSってのはいつくかあったよなーって早速ググる。
有名どころではEC-CUBE(EC-CUBE‐日本発の「ECオープンソース」)なんてのがあるのは知ってたので、早速ローカルにインストール。こいつインストールに意外と手間取ったんですよね。なぜかパーミッションが正しく無いとか言われて。Windowsでしかも全員に書き込み権限があるようなファイルを権限がないとか言われてしまったからどうしたものかと思っていたらTipsが本家フォーラムで提示されてました。Linux環境だと多分起きなかったんでしょう。
インストールして、商品登録をやってみたんですが、これが実に面倒くさい。まぁ通販サイトなんで商品画像がないってことは有り得ないだろってことで必須なんでしょうけれど、私が使いたい機能としては画像がない場合も多々ありまして。これはちと流用するのは難しいなーってことで却下。
続いて、かなり新しそうなLiveCommerce!(Live Commerce ! オープンソースECサイト構築プラットフォーム – 買うのは簡単売るのはもっと簡単に)ってのを発見。サイトはすごくおしゃれで、これは使える!って思ったんですが、非常に惜しかった。後一歩、痒いところに手が届きませんでした。
ただ、すごく惜しかったので、こいつを拡張できたらかなりいいんじゃなかろうか、私が1から作るよりはるかに完成度が高いしないよりおしゃれだ!(そう、私は見た目重視w)ってことでソースを眺めてみることに。
が、ソースが全くわからないOrz
どうもZendFrameworkというものを使っているらしく、こいつはMVCをかなり厳密に提供しているそうで。そのためLiveCommerceでは見た目とロジックは綺麗に分離されてました。
ただ、ZendFrmeworkについてまったく知らなかったので、まずはZendFrameworkについてお勉強。
するとまぁ、PHPってこんなに進んでたのねと目から鱗。私がPHPに触れたのはもう6、7年前なので、その頃からするとびっくりするほど進化していたようで。今必死でZendFrameworkをお勉強してますが、これかなり楽しいですね。実によくできてるなーと思います。
あと、CSSでそげなことできたのね!ってのも大きな収穫。そもそもHTMLを直で打ってサイト構築とかこれまた6、7年前に作ってたHP以来だし、もうそんなのやる元気ないなぁと思っていたので今更HTMLをゴリゴリ書く羽目になろうとは夢にも思ってませんでしたが。
まぁでもCSSでサイトデザインを行うのはすごく理に適ってるんですね。今頃そんなことに気がついたわけで。FireBug最高! これまでただぼんやりと眺めていたWebサイトも、今はFireBugでもって「へぇ、こうなってるのね」とか興味津々。いやはや、Webデザイナーは変態ぞろいだな・・・!
残念ながらLiveCommerceを拡張するのは骨だったので、結局1からサイトを構築してます。と言ってもZendFrameworkを使ってるのでかなり楽。Zend_Layoutでサイトレイアウトは自動的に共通化できるし、Zend_Navigationでカテゴリメニューも作れる。Zend_Formでフォームも作れるし、DBとの連携も抽象化されてるしACLやらAuthまで用意されていてもう何から何まで至れり尽くせり!
こんだけライブラリが提供されているので、あとはサイト構成とDB構成を考えるだけ。まぁ問題はDB構成かな。Webサイト構築もやったことなければ認証システムもやったことなければDB設計もやったことがないというこの状況。実に無茶ぶりだよね! 楽しいからいいんだけど!w
もちろん、そんな無茶を楽しんでいるのはこのシステムを外に公開する気が一切ないから。外に公開するようなシステムだったら絶対にやりませんが。うちうちなのでなんとかなるでしょう。
お面はそろそろ完成しそう。あとは中身ってことで、DBの設計やなぁ。その先はDBの編集というか、レコードの登録やら削除もWeb経由でできるようにしたいところ。
DBは盛り込む内容もまだFixできてないからなぁ。こっちの方が大変そうだ。どうすんのが理想的かしらなぁ。
既にDBがあったのなら引っ張ってくるだけだからいいんだけど、作るのは初めて。さてさてどうしたもんでしょかね。

[PC]TwitterのBot作ってた

ひょんなことから、GoogleAppEngineを使ってBotを作って見ようと思い立ちましてこの土日にひっさびさに家でプログラムなんぞ組んでました。いやまぁ組んだなんて大層な事言えたものは作ってないですが!
そもそもGoogleAppEngine(以下GAE)なんてものを全く知らず、まずはそこから。
どうやらPythonやJavaで作ったプログラムをGoogleのサーバ上にアップし、そこにアクセスしたらPythonやJavaのプログラムが実行されるという仕組みらしい。ようするにCGIみたいなもんかな?
Googleさんがやってるサービスってことでこれもまた無料。ただし登録できるアプリは10個で、しかも削除はできないということらしいのでテストで1個潰すのには躊躇しちゃうかも。
って場合にも大丈夫なように、サンドボックス環境は提供されております。SDKに同梱されているのでそこでがっつり試しておいていざ本番用にアップロードって形ですね。
で、いざBotをつくろうってたってまずはTwitterのAPIを扱わなきゃ仕方ない。ってことでAPIを調べようかと思ったんですが、どうやらtwiter-pythonってなPython用のライブラリがあるらしく、そちらを使うととても簡単にTwitterとやりとりができるとか。
しかもGAEはPythonに対応してるのでまさにうってつけ。つーことでPythonで作ってみることに。
ただ、私はPythonは全くの初心者。かろうじてインデントが重要な意味を持つってことを把握してるくらいで、構文も予約語も知らない状態ですw
まー習作って事で、cronでアクセスする度にてけとーなことをつぶやくBotを作成しました。
一応アカウントを晒しておくとします。
胡散臭い髭の男 (usankusai_hige) on Twitter
ただ、私の作り方が悪いのかなかなか呟いてくれません・・・。ランダムで適当に喋らせてはいるのですが、それがうまく反映されないようです。API制限に引っかかるほど呟いちゃいないんだけどなぁ。15分に1回だし。エラーは発生してないけど、つぶやきの内容が一切更新されないという謎。よー分からんので放置。忘れた頃に呟きます(笑)
後は追々台詞を増やしていくとか、フォロワーの発言からキーワードを拾ってリプライするとかいろいろやりたいんですが、実装ができないとかじゃなくてやって楽しそうな内容が思いつかないので(台詞を増やす以外)やってません。
ただ、思いのほか簡単にGAEは扱えたので、なんぞWebサービスを開発したいなら使い勝手がよさそう。いろいろと制約もきついですが、PythonやJavaがほぼネイティブで動かせるというのは大きいんじゃないかな?
twitter-pythonのライブラリもかなりGAEと相性いいし、ものすごく自分の趣味に特化したBot(情報収集系)を作るには向いていそうだ。
うーん、久々にプログラムした気がするなぁ。いやまぁ会社でもやってるんですけどね?Orz

[PC][プログラミング]たいふーん!

USBブートできない件について、一昨日GIGABYTEのサポートセンターへ質問メールを投げました。
その結果、
「なんとも言えんから代理店に聞いてくれ!箱に代理店のシール貼ってるだろ? そこに連絡してちょ」
という旨のメールがすぐ帰って来ました。定型文かもしれません^^;まぁ、すぐに回答が来たことはありがたい話です。
ということで、GIGABYTEに引き続き(というかたらい回された)、代理店のマスタードシード株式会社さんのサポートに質問を投げてみました。
その結果、これまた1日で回答が。
「まず、Linuxって対応OSじゃないからそこんとこ自己責任でよろしくな。 あと、USBブートできねぇってことだけど、うちでUSBメモリにVista SP2のセットアップイメージ作って、パーティションをアクティブにしてブートしたらHDDにインスコできたぜ? ちなみにUSBメモリはADATA製C801だったぜ!」(※注:超フランクに書き直してます)
ということで、できるらしいです。USBメモリのイメージを見直してみるかな・・・。あとはアクティブになっているかどうか。いずれにせよ、ボードとしては可能らしいので頑張ってみよう。サポートさんありがとう!
閑話休題。
教授より依頼されたプログラム変更ですが、本日無事に終了しました。ちょいと細かい部分を忘れていて過去と同じ結果をなかなか出せなくて試行錯誤しましたが、なんとかリカバリー。昨日はnewでstd::bad_allocなんて例外吐かれたからなぁ。原因がコンパイラのバージョン違いによるリンカミスとは思いも寄らなかった。
学生の時はVC++2005EE+PlatformSDK、今はVC++2008EEで、クリーンせずにリビルドしたからダメだったという罠。横着はいけませんね。そのバグ解消に半日潰しましたOrz
で、今日ちょこちょこ修正を施して過去の結果を再現成功。ついでにプログラムの見通しがよくなるように#ifdefとかで場合分けしまくっておきました。今後このプログラムを使うことがあるか知りませんがw
一応教授が欲しがっているデータは揃った(はず)なので、明日メールで提出しておきましょう。
とはいえ、やっぱ気にくわない部分も多いなぁ・・・。もう少しスマートに書けたら最高だったのだけれど。まぁ数学的にアヤシイ部分が数ヶ所あるので、そこを直したいけれどもう細かい計算をしたくないというのが本音ではありますが^^;
けどFFTWをC++のcomplexとコンパチで使っているのは使い勝手良さそうだから、もうちょっとしっかりとラッパークラスを整理して、チーム内に展開してもよいかもしれない。C/C++でシミュレーションプログラムを書いている人がどれくらいいるか分かりませんが・・・^^;
ま、信号処理のシミュレーションはMATLABが主流ですよねそうですよね・・・。だがうちの部署にそんなお金はないので、Octaveで動くスクリプトを書くと喜ばれます。MATLABは数台のPCにしか入っていないのですよ!
社内でまとめてライセンス買ってくれたらいいんだけどな。他にも使ってる部署あるんだし。提案したら通るかしら・・・?

[3行日記][プログラム]VC++6.0はほんと大嫌いだ・・・

仕様という名の壁に阻まれた今日の3行日記!
・VC++6.0では「complex<float> I(0,1);」は正しく動かない。値は不定となる(欲しいのは虚数単位)。
・VC++6.0では「#define _USE_MATH_DEFINES」を定義してもM_PIが定義されていない。(M_PIがANSIで定義されていないのである意味仕方ない)
・VC++9.0(VC++2008)では上記は両方とも正しく動く。
VB6用のDLLを作ろうとしてただけなんだけどね・・・。VB6だからVC++6.0の方がいいかなーと思ってVC++6.0を使ったのに無駄なところで時間を取られた。
VC++6.0、ほんとは使いたくないんだよなぁ。ANSIに準拠してない部分が多すぎて使いたくない。テンプレートに滅茶苦茶弱いし、特に信号処理で多用する複素数型のクラスがあんまりにも貧弱・・・。
個人的に作っているプログラムはVC++2008とかVC#2008、VB2008で作ってるけれど、チーム員に展開する必要がある可能性があるプログラムはプロジェクトが開けなくなると困るのでVC6.0で作っている。フリーなんだし、みんな移ってくれないかな・・・。VC++6.0って不安定なのに、みんななぜ気にならないの・・・?

[PC][プログラム][.NET]これは結構大きなことだと思うんだ

特許は主張しない:Microsoft、C#とCLIに「Community Promise」を適用 – ITmedia エンタープライズ
まぁこれが

C#実装をめぐっては、FSFの設立者、リチャード・ストールマン氏が6月26日、Microsoftがソフトウェア特許を主張する危険があるのでC#に依存するべきではないという文書を公開していた。

に対する措置ではないでしょうが(こんな大事な事、1週間なんかで決まるはずがない)、Monoにとってこれは非常に心強いんじゃないでしょうか。
WPFやWCFについてはMonoで実装するつもりはないとなっていたように思いますが、.Net2.0相等でもかなり強力です。できたらLINQくらいは取り込んでくれたらうれしいなぁ。と、思ってたらある程度実装してるらしいw やりおるなMono…。
このところはM$も随分とOSS陣営に協調路線を見せてきてますね。まぁ、ODFとかではちょいちょい横槍を入れてますが、それでも標準化としているのでサードパーティの参入を阻害するものではありません。囲い込み戦略が独禁法に引っ掛かるので、下手なことするよりもある程度OSS陣営を利用する方が得と考えているのかもしれませんね。お互いにいいところを持っていけばいいんじゃないでしょうか。
私としては、M$をはじめとするプロプライエタリなソフトウェアが面白いものを出してきて、OSS陣営がそれを真似てどっちかってーとさらにオマケ機能をつけてきてーみたいな展開が理想ですね。追い掛けるのは楽しいもんですw
それに引き換え、このところのAppleはかつてのM$ばりに強硬路線を突っ走っているように思えるなぁ。そんなにサードパーティを追い出したいかね。
まぁiPodを越えるケータイプレーヤーのヒット商品ってのは出てないですし、この先しばらく出そうにないですからねぇ。にしたって、Linuxでまともに使えないデバイスなんて興味が沸かないんですがね!(ぁ

[PC][Program]VB6に泣かされる今日この頃

今日もせっせこツールの開発。本来は2ヶ月後くらいにやる予定だった内容を訳あって前出ししてます。
業務で使用しているチューニングツールなんですが、VB6で書かれてるんですな。そのツールの改造及び新機能追加のノウハウを習得ってことでカリカリ書いてます。
改造と新機能追加のノウハウについてはおおよそ把握できたんですが、今日2つほど罠にはまっちゃいまして。
まず1つめは、VB6(というかVisualStudio6.0?)の仕様による罠。
IDEからデバッグモードで実行し、その実行中のプロセスが何らかの原因で暴走した場合(大抵の場合、WinAPIに絡んでの暴走)、IDEを巻き込んで落ちてしまいます。というか、暴走したプロセスを落とすのにIDEから落とす必要があります。
で、更に性質の悪いことに、ビルドしてexeを生成するか、明示的に保存しない限り、プロジェクトに対する変更は保存されていません。デバッグ実行毎に保存されているのかと思いきやそんなことはありません。
そのため、結構ノリノリでソースを書いてデバッグ実行で暴走したら、とても悲しいことになります。
…ってかなりましたOrz 2時間分くらいが吹っ飛んだかな…。
まぁ、その2時間の内訳は、8割方が実装方法の思案に費やされてましたので、復旧作業自体は20分程度で終わりました。気分としては悲しかったがな!
2つめは、設計上の罠。
とあるUIでは、設定したパラメータを保存はしているけれど読み出しがまだ実装できてなかったので、その読み出し機能を追加することとなりました。
パラメータを読み出して、各パラメータのテキストボックスに放り込むところまでできました。
で、それは割合あっさりとできたんですが(途中上の罠に引っ掛かって時間を浪費しましたがw)、それをさらにファイルへ保存しようとしたら、あらまびっくりパラメータの部分が空白。
っかしいなぁと思ってパラメータ保存のルーチンを確認すると、どうもテキストボックスの値を保存しているわけではない模様。テキストボックスの値を別の変数に入れてるんですが、そちらの値を参照しているらしい。
つーことで、いつその変数にテキストボックスの値を代入しているのか調べたら、なんとテキストボックスのLostFocusイベントでやってやがる。
VB6のテキストボックスにはバリデーションチェック機能は基本的についておらず、「数字だけしか入力しちゃダメ!」みたいなのは自前で実装しなきゃいけないんですよね。
まぁそれ以外にも、入力範囲が決まっている場合なんかも、入力された値がその中に収まっているかをチェックする必要があります。
で、それをどのタイミングで実行するかってのが実装者に委ねられるわけですが、ここを設計した人はどうもLostFocusイベントで実装していたようで。
ここは好みが分かれるところかも知れませんね。私はLostFocusのタイミングでは判断しないでほしい。なにか他の処理を実行するボタンを押したときのように、その値が確定した段階でチェックをする派です。
まぁ、「入力した時点で間違いは分かるだろ? だったらその場で教えてくれよ」って人もいるでしょうし、それは要求仕様次第、それが特になければ実装者次第なのは納得できます。
んが、どうもこれを設計した人はパラメータロードについては一切考慮してくれなかったようで(パラメータセーブは作ってるのになぁ…)、バリデーションチェックのコードはイベントハンドラの中にベタ書き。サブルーチンにはしてくれてませんでした…。
まぁその部分だけサブルーチンにしてもよかったんですが、面倒だったのでパラメータを呼び出してテキストボックスに放り込んだ後、テキストボックスのLostFocusイベントハンドラを直接叩くという暴挙に(絶対にマネしないでね!)。
するとどうでしょう! 片っ端からバリデーションエラーにwww
ただ、それもおかしな話なんですよ。そのテキストボックスには数字で「0〜1.0」が入るようになっており、それ以外の数値なり文字が入ったら「異常な入力値です!」というダイアログとともに、テキストボックスが赤に変化するというイベントハンドラの内容でした。
が、保存したパラメータファイルから読み出した値は「0.6」とか「0.3」など、バリデーションチェックが通るものばかり。
どないなっとるねんとか思いながら、手動でパラメータを打ち込んでみても結果は同じ。
なんじゃそらってことで、追加した暴挙の部分、イベントハンドラを直接読んでいる部分をコメントアウトして再挑戦。
…してもやっぱりバリデーションエラーが…Orz
おかしい。そもそもLostFocusのイベントに絡む部分を書き換えた覚えは一切ない。勝手に呼び出すコードは追加したけれど、別に呼び出しに問題はないだろう(是非はともかく)。大体、その追加した部分をコメントアウトしても発生してるんだからそもそもそこじゃない。
で、一体いつからこの現象が発生しているのかを調べるため、機能改造前のexeで確認したところ、件の現象は発生しませんでした。
ということは、私がコードを追加したことで何らかのバグが混入したか、あるいはもともとバグが潜んでいたけれど運良く(悪く?)発現してなかったものが発現したかどちらかでしょう。
とりあえず、もう定時だったのでこれ以上の追求は明日に回すことにしましたが、非常に気持ち悪い。そもこのプロジェクトがやたらめったらグローバル変数を使っていてなおかつパスタなコーディングをしているがために、どのタイミングでどの変数にどんな値が入っているかがイミフなんですよねぇ…。
明日詳しく解析はしていきますが、ほんっと早いとこ.Net版が使い物になるところまで持っていこう。これ以上こんなカオスなコードは増長させちゃいかんわ…。