Yahoo!対応版に、8603があるとダウンロードに失敗する問題が発生する問題を修正しました。
具体的には、 index.txt の8603 に OBS フラグを立てて、
OBSフラグがたっている銘柄はダウンロードしないように修正しました。
ダウンロード
ファイル名は前と一緒です。
OmegaRTIV3 バイナリ
OmegaRTIV3 ソース
2008年01月24日
2008年01月19日
OmegaChart RTIビルド ver3(誤発注対策とYahoo!対応)
もう更新する予定はなかったけど、この前8732で誤発注やってしもうたので、記念に更新する(www
ダウンロード
OmegaRTIV3 バイナリ
OmegaRTIV3 ソース
注意
何が起こっても一切責任は取りません。
投資も自己責任で行ってください。
バグ報告はしてくれるとうれしいけど直すかどうかわからないんだかね。<-ツンデレ
基本的な改良点(RSS/資産シュミレーション etc..)はOmega Chart RTI版に書いているので省略するとして、
今回の修正内容は、次の2点です。
1.誤発注対策

スクリーニング時に、予算の範囲で買うことができる枚数を表示するようにしました。

設定は、ツール -> カスタマイズ -> 実質売買検証 -> 本日買い付けにまわせる金額 で設定します。
何で、設定をスクーリングの下にないのか? 手向きだからです。 <-結論
計算式は、このようになります。
本日買い付けにまわせる金額 / スクリーニング件数 = 1銘柄に回せる金額
1銘柄に回せる金額 / 株価 / 単元 = 買い付けできる数数
自動売買検証で計算する枚数と一緒です。
今までこの計算を電卓で行っていたんですが、
80000としなければならないところを 8000として計算して死ぬ目にあったので、この機能を実装しました。
2.Yahoo!対応
無尽蔵が更新を停止するらしいので、無尽蔵からではなく、Yahoo!からデータを取得するようにしました。

Yahoo!の場合、多分この機能は使えないと思います。

Yahoo!の場合ダウンロードするのにたくさんのリクエストを出す必要があるのでダウンロード時間が10倍ぐらいになりました。
メシで食って待っててください。
ダウンロード
OmegaRTIV3 バイナリ
OmegaRTIV3 ソース
注意
何が起こっても一切責任は取りません。
投資も自己責任で行ってください。
バグ報告はしてくれるとうれしいけど直すかどうかわからないんだかね。<-ツンデレ
基本的な改良点(RSS/資産シュミレーション etc..)はOmega Chart RTI版に書いているので省略するとして、
今回の修正内容は、次の2点です。
1.誤発注対策

スクリーニング時に、予算の範囲で買うことができる枚数を表示するようにしました。

設定は、ツール -> カスタマイズ -> 実質売買検証 -> 本日買い付けにまわせる金額 で設定します。
何で、設定をスクーリングの下にないのか? 手向きだからです。 <-結論
計算式は、このようになります。
本日買い付けにまわせる金額 / スクリーニング件数 = 1銘柄に回せる金額
1銘柄に回せる金額 / 株価 / 単元 = 買い付けできる数数
自動売買検証で計算する枚数と一緒です。
今までこの計算を電卓で行っていたんですが、
80000としなければならないところを 8000として計算して死ぬ目にあったので、この機能を実装しました。
2.Yahoo!対応
無尽蔵が更新を停止するらしいので、無尽蔵からではなく、Yahoo!からデータを取得するようにしました。

Yahoo!の場合、多分この機能は使えないと思います。

Yahoo!の場合ダウンロードするのにたくさんのリクエストを出す必要があるのでダウンロード時間が10倍ぐらいになりました。
メシで食って待っててください。
2007年05月23日
VOC@LOID すげーな
いまさら知ったんだけど、ヤマハのVOC@LOID(ボーカロイド)っていう合成音声ソフト凄いな。
合成音でここまで歌えるのか。
静かなコーラス曲とかは聞いていて違和感がそれどないのが恐ろしい。
FF6 オペライベント 歌わせてみた(VOC@LOID ver.)
愛・おぼえていますか(VOC@LOID ver.)
蒼い鳥(VOC@LOID ver.)
逆に、セリフが多かったり、アップダウンがあったりする曲は苦手のようだが。
「エージェント夜を往く」(VOC@LOID ver.)
巫女みこナースのテーマでナースウィッチ小麦ちゃんでVOCALOID
それでも、合成音でここまで出来るのは感動した。
ヤマハの技術力はすげぇな。
合成音でここまで歌えるのか。
静かなコーラス曲とかは聞いていて違和感がそれどないのが恐ろしい。
FF6 オペライベント 歌わせてみた(VOC@LOID ver.)
愛・おぼえていますか(VOC@LOID ver.)
蒼い鳥(VOC@LOID ver.)
逆に、セリフが多かったり、アップダウンがあったりする曲は苦手のようだが。
「エージェント夜を往く」(VOC@LOID ver.)
巫女みこナースのテーマでナースウィッチ小麦ちゃんでVOCALOID
それでも、合成音でここまで出来るのは感動した。
ヤマハの技術力はすげぇな。
2007年05月16日
フレッツの障害
大規模障害、オソロシス。
保守とサポートは泊り込みで復旧だよな、、、
保守陣営は、何とか復旧させても、原因の調査と再発防止策の検討と導入でてんてこ舞いだろうな。
サポートは電話対応でものすごい勢いで恫喝されているんだろうなぁ。
それと、最近システムに変更を加えた人たちはドキドキものだろうな。
お気の毒さまです。
こーゆー超大規模システムだと、システムが停止した時間に比例してクビが飛ぶって噂を聞いたことが歩けど、本当なんだろうか。
数十分ごとにクビが飛んでいくことになるとか。
ある日突然、こーゆーのはやってくる。
突然の凶報によって、お泊りコース決定になるわけだ、恐ろしい。
私的には、こーゆーとまってから気づくのではなく、
止まり始める前に気が付いて事前対処が出来る状態になってほしいと思う。
ヒヤリハットみたいな感じかな。
人が作るものは必ず壊れるわけで、壊れなくすることは不可能。
だから、壊れる前に気が付くって感じであってほしい。
それには、システムの監視、自己診断、通知の仕組みを備えなくては行けないんだけど、、、ここら辺はいまいちパッとしない地味な部分だし、正常に動作させるだけなら不要な部分なので、後回しにさせ、忘れ去られる部分でもあるよね。
システムって開発期間よりも運用・保守していく期間のほうが長いわけだから、運用・保守しやすいようにデザインされるべきなんだろうな。
保守とサポートは泊り込みで復旧だよな、、、
保守陣営は、何とか復旧させても、原因の調査と再発防止策の検討と導入でてんてこ舞いだろうな。
サポートは電話対応でものすごい勢いで恫喝されているんだろうなぁ。
それと、最近システムに変更を加えた人たちはドキドキものだろうな。
お気の毒さまです。
こーゆー超大規模システムだと、システムが停止した時間に比例してクビが飛ぶって噂を聞いたことが歩けど、本当なんだろうか。
数十分ごとにクビが飛んでいくことになるとか。
ある日突然、こーゆーのはやってくる。
突然の凶報によって、お泊りコース決定になるわけだ、恐ろしい。
私的には、こーゆーとまってから気づくのではなく、
止まり始める前に気が付いて事前対処が出来る状態になってほしいと思う。
ヒヤリハットみたいな感じかな。
人が作るものは必ず壊れるわけで、壊れなくすることは不可能。
だから、壊れる前に気が付くって感じであってほしい。
それには、システムの監視、自己診断、通知の仕組みを備えなくては行けないんだけど、、、ここら辺はいまいちパッとしない地味な部分だし、正常に動作させるだけなら不要な部分なので、後回しにさせ、忘れ去られる部分でもあるよね。
システムって開発期間よりも運用・保守していく期間のほうが長いわけだから、運用・保守しやすいようにデザインされるべきなんだろうな。
2007年05月15日
オセロ(リバーシ)に勝てません
このオセロ強い。
ずっと挑戦しているけど、一勝もできない。
中盤の追い上げがすごい、、
こっちが取れる選択肢をドンドンつぶしていって、とりたくない手をとらせる。
最後にはパスに追い込み、あっという間に逆転される。
俺がヘタクソなだけなんだろうが、、、
ずっと挑戦しているけど、一勝もできない。
中盤の追い上げがすごい、、
こっちが取れる選択肢をドンドンつぶしていって、とりたくない手をとらせる。
最後にはパスに追い込み、あっという間に逆転される。
俺がヘタクソなだけなんだろうが、、、
KENJI'S HOMEPAGEさんがしばらく更新お休みされるそうだ
KENJI'S HOMEPAGE
コアな話題を日本語で読めるんで、楽しみにしていたんだけど、
病気のため、しばらく更新ができないそうだ、、、
一日でも早く回復されることを願っています。
KENJI氏のページにある、APIフックとかは結構参考にさせてもらったし、
dllを LoadLibraryを使わずに読み込む話題とか、感激したものだ。
たとえしゃべっている言葉が違えどプログラマーならコードで語れって事どおり、英語のサイトとか、中国語のサイトとかをサンプルコードだけ抽出して読んでは入るものの、、やっぱり、日本人には日本語で説明されるのが一番だ┐(´ー`)┌ やれやれ
このサイトにも、googleしても答えがナカナカでない問題や、日本語で解説がない問題について、コード付きで説明をしているつもり。
コアな話題を日本語で読めるんで、楽しみにしていたんだけど、
病気のため、しばらく更新ができないそうだ、、、
一日でも早く回復されることを願っています。
KENJI氏のページにある、APIフックとかは結構参考にさせてもらったし、
dllを LoadLibraryを使わずに読み込む話題とか、感激したものだ。
たとえしゃべっている言葉が違えどプログラマーならコードで語れって事どおり、英語のサイトとか、中国語のサイトとかをサンプルコードだけ抽出して読んでは入るものの、、やっぱり、日本人には日本語で説明されるのが一番だ┐(´ー`)┌ やれやれ
このサイトにも、googleしても答えがナカナカでない問題や、日本語で解説がない問題について、コード付きで説明をしているつもり。
髭マニア
最近、髭マニアが流行しているらしい。
一ヶ月前にもこんな事件があった。
ヒゲ部が暗躍しているのか、
新ジャンル ヒゲマニアが確立されようとしているのか。
ともあれ、凄い時代になったでしょう、これが21世紀なんだよね。
個人的に、立派なヒゲよりも、語尾が「〜あるね」っていう中国人のような、2本のヒゲが軽く反り返ってウェーブを作っているような感じが胡散臭くて好きなんだけど、こんなヒゲって現実に可能なのか? やっぱ、反り返らせるために毎日お手入れをしているんだろうな、大変な努力家だと思うね。
川西容疑者は、おもちゃの1万円札をちらりと見せた後、封筒に入れたまま店員に渡し、発覚を遅らせていた。両替に使われた1万円札は、福沢諭吉の肖像画にひげが描かれていた。
おもちゃの1万円札を両替=封筒入り、コンビニで−大阪
一ヶ月前にもこんな事件があった。
調べでは、河内容疑者は3日午前3時半ごろ、江戸川区の都知事選の公設掲示板に張られた候補者のポスターにマジックでひげなどを書き込んだ。河内容疑者は「一度書いてみたかった」と供述しているという。
選挙ポスターにヒゲ…70男逮捕「一度書いてみたかった」
ヒゲ部が暗躍しているのか、
新ジャンル ヒゲマニアが確立されようとしているのか。
ともあれ、凄い時代になったでしょう、これが21世紀なんだよね。
個人的に、立派なヒゲよりも、語尾が「〜あるね」っていう中国人のような、2本のヒゲが軽く反り返ってウェーブを作っているような感じが胡散臭くて好きなんだけど、こんなヒゲって現実に可能なのか? やっぱ、反り返らせるために毎日お手入れをしているんだろうな、大変な努力家だと思うね。
2007年05月10日
ゼロコピーTCP/IP
早いサーバを作る上で、一番のネックになっていると思われるのがメモリ転送。
ディスク > メモリ > CPU
一番遅いディスクはキャッシュされるし、
動画配信サーバでも作らない限り、ほとんどがメモリ上で処理が完結するだろう。
なんで、ディスクは考えないとする。
すると、一番足を引っ張るのがメモリだ。
メモリを使わないで転送することは出来ないからね。
あんま、詳しいことは知らないが、
ファイルの読み込み
↓
転送バッファにセット
↓
TCP/IPスタック
↓
ドライバ(?)
って、感じ?
TransmitFile 系のAPIだと、
ファイルの読み込みと転送が一緒にできそうな気がする(w
それでも、数回は絶対にコピーされる。
コピーすればするほど、時間がかかる。
そーなんで、メモリ転送に最適化されたヤツがあってもいいんぢゃないかと、数年前思ってはいたんだけど(後だしジャンケンぢゃないよ)、
世の中、同じことを考える人がいるみたいで、ゼロコピーTCP/IPってのがあるのね。
TCP/IP ゼロコピー
ネット上でDVDを4秒で転送した人たちはこれを使っていたらしい。
これって、Linuxだったら、すぐにでも利用できるのかな?
検索したら BSD系の資料がいろいろ出てきた。。。
ついでに、ハイエンドサーバ向けにメモリ帯域に最適化したサーバがあってもいいんぢゃないかと思うんだよな。
プログラム最適化するのメンドイから、ハードウェアで最適化できないものか(w
データベースだって、フルメモリDBがあるぐらいなんだから、
固定ファイル転送用に最適化されたアーキテクチャがあってもいいような気がする。
動的ファイルは絶対無理だけど、
閲覧が書き込みより多い処理だと、固定ファイルを作成してキャッシュするぢゃん、普通。
だから、固定ファイルで問題ないのだ。
超負荷に悩んでいるサイトとかには需用が有りそうな気もしないでもないが、、、、
どーなんだろうか。
ディスク > メモリ > CPU
一番遅いディスクはキャッシュされるし、
動画配信サーバでも作らない限り、ほとんどがメモリ上で処理が完結するだろう。
なんで、ディスクは考えないとする。
すると、一番足を引っ張るのがメモリだ。
メモリを使わないで転送することは出来ないからね。
あんま、詳しいことは知らないが、
ファイルの読み込み
↓
転送バッファにセット
↓
TCP/IPスタック
↓
ドライバ(?)
って、感じ?
TransmitFile 系のAPIだと、
ファイルの読み込みと転送が一緒にできそうな気がする(w
それでも、数回は絶対にコピーされる。
コピーすればするほど、時間がかかる。
そーなんで、メモリ転送に最適化されたヤツがあってもいいんぢゃないかと、数年前思ってはいたんだけど(後だしジャンケンぢゃないよ)、
世の中、同じことを考える人がいるみたいで、ゼロコピーTCP/IPってのがあるのね。
TCP/IP ゼロコピー
ネット上でDVDを4秒で転送した人たちはこれを使っていたらしい。
平木氏によると、ゼロコピーTCP通信は通信時にユーザーメモリからカーネルメモリへのデータコピーを行わず、メモリを共有することでプロセッサの負荷を下げる技術
DVD転送が5秒から4秒に、東大がネット最高速を更新
これって、Linuxだったら、すぐにでも利用できるのかな?
検索したら BSD系の資料がいろいろ出てきた。。。
ついでに、ハイエンドサーバ向けにメモリ帯域に最適化したサーバがあってもいいんぢゃないかと思うんだよな。
プログラム最適化するのメンドイから、ハードウェアで最適化できないものか(w
データベースだって、フルメモリDBがあるぐらいなんだから、
固定ファイル転送用に最適化されたアーキテクチャがあってもいいような気がする。
動的ファイルは絶対無理だけど、
閲覧が書き込みより多い処理だと、固定ファイルを作成してキャッシュするぢゃん、普通。
だから、固定ファイルで問題ないのだ。
超負荷に悩んでいるサイトとかには需用が有りそうな気もしないでもないが、、、、
どーなんだろうか。
2007年05月07日
ジェットコースターに乗るなら今しかない
遊園地事故で入場者が減少したらしいが、
今、問題を起こせばものすごい糾弾を受けるはずなので、安全管理にもっとも力を入れている今が一番安全だろう。
コースター事故 近畿の遊園地 事故の影響…入場者減る
ゴールデンウィークも終わったし、事故で入場者も減っている今なら、人が少ない遊園地で心行くまで遊べるはず。
今、問題を起こせばものすごい糾弾を受けるはずなので、安全管理にもっとも力を入れている今が一番安全だろう。
コースター事故 近畿の遊園地 事故の影響…入場者減る
ゴールデンウィークも終わったし、事故で入場者も減っている今なら、人が少ない遊園地で心行くまで遊べるはず。
2007年04月29日
宇宙葬って6万あればできるのか
宇宙葬って金持ちだけのものかと思ったら以外とリーズナブルなお値段になっているぢゃん。
遺灰1グラム当たり495ドル(約5万9200円)って安くないか。
ロケットは無重力空間に達した後、遺灰を積んだカプセルが地上に無事帰還。遺灰は遺族に手渡された。宇宙葬はスペース・サービシズ社が企画し、料金は遺灰1グラム当たり495ドル(約5万9200円)。
スタートレック機関長の「宇宙葬」=遺灰を無重力空間へ−米
坊さんのお経はありがたすぎて理解できないので、そんなもんやるぐらいだったら、宇宙葬にした方がマシだ、何より夢がある。
kakaku.comの相場 によると、通常の葬儀だけでも 50万以上はかかるみたいだ。
50万あれば 約10gも遺灰を宇宙に上げられるぢゃん。
それに、死亡すると健康保険から、埋葬料が出るわけだし。
社会保険か国民健康保険皆さんどちらかの保険には入っていると思います。
葬儀を挙げると健康保険から7万円とか10万円あまり大きな金額ではないですが
葬祭費(埋葬料)としての支給があります。
葬祭費(埋葬費)需給の手続き 葬儀・葬式・密葬の佐藤葬祭
7万円とか10万円が相場なら十分、宇宙にいけるね。
C# プロパティの憂鬱
C#のプロパティって便利なようで使えなくないか、微妙な感じ。
名前そのままで、読み込みは public だけど、値を書き換えるのは protected or private でって設定ができないんだよなぁ。
もうちょっと空気を読んで欲しい。。。
ちなみに MSのサンプルだとこげな風に書いてある事が多い気がする。
外には見栄えの良い大文字で表現して内部は小文字って感じ。
内部は見えないところだから見栄を張らなくていいらしい。将軍様の国か、どっかの温泉街か。
やっぱ、メンバってクラスの中ではグローバルであって危険な変数だから先頭を大文字にして強調したいよ。
だからといって、
//昔のようなハンガリアン!
this.m_Otakara
ってのはイヤだなー。
そもそも、メンバに m_ をつける癖をつけるぐらいだったら、this. をつける癖をつけたほうが合理的だ。
ローカル変数に this. をつけたらコンパイラが怒ってくれる。
こっちの方が誰が見てもメンバとわかる。
話がズレたけど、つまり、
this.Aaaaaaaa ってな感じになればいいわけよ。
そんで、外からは読み込みのみで書き込みは内部だけって感じにできないかなぁ。
プロハティの発想はいいと思うんだよなぁ。
いちいち、 getXXX setXXX ってアクセッサを定義するのは面倒。
だから、楽チンにかけるようにしたよ!! ってところは十分評価できる。
だけど、実際使ってみると、なかなか思うようには行かないですよ。。。
ふつーアクセッサの大部分は getXXX であって、 setXXX はめったに使われないよね。
setXXX で設定するぐらいなら、初期化ならコンストラクタか初期化用のメソッド呼ぶし、計算したいなら普通にメソッドたたくし。
そう考えると、読み込みは public だけど、値を書き換えるのはprotected or private って設定ができるのが一番楽のような気がするんだが、
どーなんでしょうか。
はっ!!
そうか、、、もしかしてプロパティをアクセッサ代わりに使おうという考えが間違っているのかもしれない!
プロパティの起源をよくよく考えてみれば、
ってヤツをやりたかったために プロパティって作ったんぢゃないのかと。
this.Text の実装は WinAPI ベースで行けば、 setWindowText() で値の書き換え。
やっていることは、アクセッサってレベルぢゃねーぞ。
立派なメソッドだね。
プロパティは、アクセッサとしても使えるかもしれないが、それはたまたま利用できただけで、本当の目的はメソッドをラップして自然に見せるための機能って考えれば、現在の実装も理解できる。
名前そのままで、読み込みは public だけど、値を書き換えるのは protected or private でって設定ができないんだよなぁ。
もうちょっと空気を読んで欲しい。。。
//プロパティを利用しない書き形
class Test
{
private int Otakara;
public int GetOtakara()
{
return this.Otakara;
}
public Test(int inOtakara)
{
this.Otakara = inOtakara;
}
};
//プロパティを使ってみよう!!
class Test
{
private int Otakara
{
//読み込みは public で
public get //エラー!!
{
return this.Otakara;
}
//書き込みは private で
set
{
this.Otakara = value;
}
}
public Test(int inOtakara)
{
this.Otakara = inOtakara;
}
};
ちなみに MSのサンプルだとこげな風に書いてある事が多い気がする。
//MS推奨??
class Test
{
//小文字でメンバを定義するよ.
private int otakara;
//外側には見栄えが良い大文字で定義するよ.
public int Otakara
{
get
{
return this.otakara;
}
}
public Test(int inOtakara)
{
//メンバの先頭を小文字にしたくないよね。。。
this.otakara = inOtakara;
}
};
外には見栄えの良い大文字で表現して内部は小文字って感じ。
内部は見えないところだから見栄を張らなくていいらしい。将軍様の国か、どっかの温泉街か。
やっぱ、メンバってクラスの中ではグローバルであって危険な変数だから先頭を大文字にして強調したいよ。
だからといって、
//昔のようなハンガリアン!
this.m_Otakara
ってのはイヤだなー。
そもそも、メンバに m_ をつける癖をつけるぐらいだったら、this. をつける癖をつけたほうが合理的だ。
ローカル変数に this. をつけたらコンパイラが怒ってくれる。
こっちの方が誰が見てもメンバとわかる。
話がズレたけど、つまり、
this.Aaaaaaaa ってな感じになればいいわけよ。
そんで、外からは読み込みのみで書き込みは内部だけって感じにできないかなぁ。
プロハティの発想はいいと思うんだよなぁ。
いちいち、 getXXX setXXX ってアクセッサを定義するのは面倒。
だから、楽チンにかけるようにしたよ!! ってところは十分評価できる。
だけど、実際使ってみると、なかなか思うようには行かないですよ。。。
ふつーアクセッサの大部分は getXXX であって、 setXXX はめったに使われないよね。
setXXX で設定するぐらいなら、初期化ならコンストラクタか初期化用のメソッド呼ぶし、計算したいなら普通にメソッドたたくし。
そう考えると、読み込みは public だけど、値を書き換えるのはprotected or private って設定ができるのが一番楽のような気がするんだが、
どーなんでしょうか。
はっ!!
そうか、、、もしかしてプロパティをアクセッサ代わりに使おうという考えが間違っているのかもしれない!
プロパティの起源をよくよく考えてみれば、
private void Form1_Load(object sender, EventArgs e)
{
this.Text = "うがー";
//Builder だと、 this.Cation = "うがー"; ね。
}
ってヤツをやりたかったために プロパティって作ったんぢゃないのかと。
this.Text の実装は WinAPI ベースで行けば、 setWindowText() で値の書き換え。
やっていることは、アクセッサってレベルぢゃねーぞ。
立派なメソッドだね。
プロパティは、アクセッサとしても使えるかもしれないが、それはたまたま利用できただけで、本当の目的はメソッドをラップして自然に見せるための機能って考えれば、現在の実装も理解できる。
2007年04月28日
skype + 音声認識
skype-in で電話を受けて、音声認識でなんかできないかなーと、
思っていたら、既にやっている人がいた。
音声認識でハンズフリーレストラン検索「声探」
音声認識でハンズフリーレストラン検索 「声探」
俺的にやりたかったのは、
ニワンゴのサービスのようなやつの音声化。
ケータイ世代ではないので、ケータイのキーが討ちづらくてしかたないため、電話口でしゃべれば結果を返してくれるって感じのサービスがほしい。
本人認証の仕組みとかがあれば、結果をメールで受信もありかなぁ。
音声読み上げだと長い文章は大変だしね。
たとえば、あらかじめ発信者番号(自分の電話番号)をサーバに登録しておけば、簡易本人確認ができるよね。
ついでに、PCの制御とかもできるようになれば、
ラピュタのあのシーンを再現できるかもしれない。
コマンド バルス。
さっと、ケータイを取り出して、バルスってシャウトするとPCが勝手にシャットダウンするって感じかな。
すげーかっこよくないか。
PCをメールで遠隔操作するソフトがあるんだから、ケータイの音声で操作するソフトもありでしょう。
思っていたら、既にやっている人がいた。
音声認識でハンズフリーレストラン検索「声探」
音声認識でハンズフリーレストラン検索 「声探」
俺的にやりたかったのは、
ニワンゴのサービスのようなやつの音声化。
ケータイ世代ではないので、ケータイのキーが討ちづらくてしかたないため、電話口でしゃべれば結果を返してくれるって感じのサービスがほしい。
本人認証の仕組みとかがあれば、結果をメールで受信もありかなぁ。
音声読み上げだと長い文章は大変だしね。
たとえば、あらかじめ発信者番号(自分の電話番号)をサーバに登録しておけば、簡易本人確認ができるよね。
ついでに、PCの制御とかもできるようになれば、
ラピュタのあのシーンを再現できるかもしれない。
コマンド バルス。
さっと、ケータイを取り出して、バルスってシャウトするとPCが勝手にシャットダウンするって感じかな。
すげーかっこよくないか。
PCをメールで遠隔操作するソフトがあるんだから、ケータイの音声で操作するソフトもありでしょう。
2007年04月23日
自分に火の粉が降りかかるまでは傍観
トリビアの泉でアキバの人たちは電車男のように助けてくれるのか?
って実験で、アキバでは、被験者の約半分の人たちが助けに入ったという結果が出たが、特急にのっている人はそうではないらしい。
アキバが異常なだけか??
俺様が同じ常態に居たらどうなんだろう、、、やっぱ助けないのかなぁ。
だめぢゃん。
人は自分に火の粉がふりかかってくるまで動かないものだ。
なんで強引に当事者にして火の粉を振り掛けるってのがもっとも簡単な解決法というのを聞いたことがある。
例えば、夜、暴漢に襲われたときに、助けを呼ぶ一番良い方法は、
「助けて!」と叫ぶ
ではなく、
「火事だ!」と叫ぶ
ことらしい。
「助けて!」だと逆に怖がって家から出てこない場合があるそうだ。
しかし、火事の場合は逃げないと自分に危害が加わるために家から出ずにはいられないわけだ。
奴らは目撃者を恐れるから、これで撃退できるということらしい。
#銀河英雄伝説でも似たようなシーンがあったなぁ
実際に効果があるのか? といわれると、幸いなことに一度も試す機会に恵まれなかったので、効果があるか謎。
ついでに、、、この記事のように暴漢に襲われたときも、
「誰か助けて」
ではなくて、
「そこのxx色の服を着ている人、助けを呼んで!」
ってな感じに指名するといいらしい。
ようするに、強引に関係者にしてしまう。
関係者になったからには、もう傍観は出来ない、と。
今まで傍観者Aだったのがいっせいにギャラリーの視線を浴び、関係者になるわけで、
この状態で見殺し(?)にできますか?ってわけだね。
まぁ、指名されたほうは迷惑だろうが(w 、これが一番らしい。
実際に効果があるのか? といわれると、
これも、幸いなことに一度も試す機会に恵まれなかったので、効果があるか謎。
俺様的には、かなり効果があるような気がするんだけどね。
昔、大夜逃げ学ってサイトがあって、
ゴネたり、居留守を利用して借金をなかなか支払ってくれない人に対して、効果的な取立ての方法として、
家を差し押さえるって方法をあげていた。
どんだけくらりくらりと借金取りから逃げる人も自分の住処を追われるのだけ容認できないらしい。
すぐに向こうから怒りの電話がかかってきてコンタクトを取ることが出来るそうな。
恐ろしい。
結局は、人は自分に害が加わるまで問題を先送りするものらしい。
マーチン神父の教えをほとんどの人は、守れていない。
逆にいえば、
他人になんかやって欲しいときは、強引に関係者にして火の粉を振り掛ければOKってことだね。
黙ってて欲しいときには、火の粉を振り掛けないようにするってことかなぁ。
これにかかわってもあなたに得はありませんよって感じに思わせるって感じか。
って実験で、アキバでは、被験者の約半分の人たちが助けに入ったという結果が出たが、特急にのっている人はそうではないらしい。
アキバが異常なだけか??
大阪府警淀川署は21日、JR北陸線の富山発大阪行きの特急「サンダーバード」の車内で昨年8月、大阪市内の会社員の女性(当時21歳)に暴行したとして、滋賀県湖南市石部南、解体工、植園貴光被告(36)を強姦(ごうかん)容疑で再逮捕した。当時、同じ車両には約40人の乗客がおり、一部の乗客は異変に気付いたものの、植園容疑者にすごまれ、制止できなかったという。
強姦:特急内で暴行、容疑の36歳再逮捕 乗客沈黙
俺様が同じ常態に居たらどうなんだろう、、、やっぱ助けないのかなぁ。
だめぢゃん。
人は自分に火の粉がふりかかってくるまで動かないものだ。
なんで強引に当事者にして火の粉を振り掛けるってのがもっとも簡単な解決法というのを聞いたことがある。
例えば、夜、暴漢に襲われたときに、助けを呼ぶ一番良い方法は、
「助けて!」と叫ぶ
ではなく、
「火事だ!」と叫ぶ
ことらしい。
「助けて!」だと逆に怖がって家から出てこない場合があるそうだ。
しかし、火事の場合は逃げないと自分に危害が加わるために家から出ずにはいられないわけだ。
奴らは目撃者を恐れるから、これで撃退できるということらしい。
#銀河英雄伝説でも似たようなシーンがあったなぁ
実際に効果があるのか? といわれると、幸いなことに一度も試す機会に恵まれなかったので、効果があるか謎。
ついでに、、、この記事のように暴漢に襲われたときも、
「誰か助けて」
ではなくて、
「そこのxx色の服を着ている人、助けを呼んで!」
ってな感じに指名するといいらしい。
ようするに、強引に関係者にしてしまう。
関係者になったからには、もう傍観は出来ない、と。
今まで傍観者Aだったのがいっせいにギャラリーの視線を浴び、関係者になるわけで、
この状態で見殺し(?)にできますか?ってわけだね。
まぁ、指名されたほうは迷惑だろうが(w 、これが一番らしい。
実際に効果があるのか? といわれると、
これも、幸いなことに一度も試す機会に恵まれなかったので、効果があるか謎。
俺様的には、かなり効果があるような気がするんだけどね。
昔、大夜逃げ学ってサイトがあって、
ゴネたり、居留守を利用して借金をなかなか支払ってくれない人に対して、効果的な取立ての方法として、
家を差し押さえるって方法をあげていた。
どんだけくらりくらりと借金取りから逃げる人も自分の住処を追われるのだけ容認できないらしい。
すぐに向こうから怒りの電話がかかってきてコンタクトを取ることが出来るそうな。
恐ろしい。
結局は、人は自分に害が加わるまで問題を先送りするものらしい。
マーチン神父の教えをほとんどの人は、守れていない。
逆にいえば、
他人になんかやって欲しいときは、強引に関係者にして火の粉を振り掛ければOKってことだね。
黙ってて欲しいときには、火の粉を振り掛けないようにするってことかなぁ。
これにかかわってもあなたに得はありませんよって感じに思わせるって感じか。
2007年04月22日
C# メモ System.XML の憂鬱、というか空気を呼んでくれないところ
System.XML(XmlDocument) でノードから行番号が取得できない。
特定のノードが xml ファイルのどこにあるのか取得できない。
XMLの文法エラーのときだけは 行番号を取得できるんだけどねぇ。
例えば、エロゲ屋の顧客リスト管理プログラムがあったとして、
なんてデータが来たら、15才の未成年に売れないので、データがおかしいよってエラーを出してあげたい。
「ファイル xxx.xml の 128行目 name 上上下下の年齢がおかしいよ」ぐらいは表示してあげたい。
ついでに言えば、 128行目にスクロールしてあげるとかすれば空気を読めているだろう。
だけど、行番号を取得する方法がないのだ。
「name 上上下下の年齢がおかしいよ」ぐらいしか表示できない。
後は、上上下下で全文検索でもして該当データを直すって感じか。
めんどくさ。
もうちょっとMSFTのアーキテクトさんが空気読んで設計してくれていたら良かったのにね。設計は大切だ。
ライブラリに依存すると、ライブラリの手のひらで遊んでいるうちはいいんだけど、それを外れるとどうしようもなくなるところが困ったものだ。
一応、別解して次の方法があるらしいが、、、
面倒だなぁ。。。
Line number information in XmlDocument? - .NET XML
TopXML : Using LINQ to XML Annotations - tracking line numbers, in .NET XML, System.XML
特定のノードが xml ファイルのどこにあるのか取得できない。
XMLの文法エラーのときだけは 行番号を取得できるんだけどねぇ。
例えば、エロゲ屋の顧客リスト管理プログラムがあったとして、
<data>
<name>上上下下</name>
<age>15</age>
</data>
なんてデータが来たら、15才の未成年に売れないので、データがおかしいよってエラーを出してあげたい。
「ファイル xxx.xml の 128行目 name 上上下下の年齢がおかしいよ」ぐらいは表示してあげたい。
ついでに言えば、 128行目にスクロールしてあげるとかすれば空気を読めているだろう。
だけど、行番号を取得する方法がないのだ。
「name 上上下下の年齢がおかしいよ」ぐらいしか表示できない。
後は、上上下下で全文検索でもして該当データを直すって感じか。
めんどくさ。
もうちょっとMSFTのアーキテクトさんが空気読んで設計してくれていたら良かったのにね。設計は大切だ。
ライブラリに依存すると、ライブラリの手のひらで遊んでいるうちはいいんだけど、それを外れるとどうしようもなくなるところが困ったものだ。
一応、別解して次の方法があるらしいが、、、
面倒だなぁ。。。
Line number information in XmlDocument? - .NET XML
TopXML : Using LINQ to XML Annotations - tracking line numbers, in .NET XML, System.XML
2007年04月20日
スカイジャガー
うわー懐かしい。
SKYJAGUAR [MSX]
コナミから発売された縦シューですね。
めっちゃいきこんで攻略していたのに、途中で挫折してしまったヨ。
まさか、ループゲームなんて思ってもなかったよ。
俺の記憶が確かなら、デモ画面に背景が黒の宇宙みたいなところで戦っているでもシーンがあって、いつかこのシーンが登場するものだと思っていた。
SCENE8 のハンマーみたいなボスを倒すともう一度最初に戻されるわけ。
でも、 SCENE3 をクリアしても SCENE1 のような市街地に戻されるから、 もう一度ハンマーを倒せば、宇宙にいけるんぢゃねぇ? って淡い期待を抱いて、プレーしていた。
俺が操縦して弟が玉を打つとかやって、分担作業とかやったりして何とか攻略を試みていた。
ゲームセンターCX「高橋名人の冒険島」の課長と東島みたいな感じだ。
それでも、結局2度目のハンマーを撃墜することが出来なかったけどね。
紅白帽 頭にウルトラマン、ウルトラマンな感じに懐かしい思い出です。
SKYJAGUAR [MSX]
コナミから発売された縦シューですね。
めっちゃいきこんで攻略していたのに、途中で挫折してしまったヨ。
まさか、ループゲームなんて思ってもなかったよ。
俺の記憶が確かなら、デモ画面に背景が黒の宇宙みたいなところで戦っているでもシーンがあって、いつかこのシーンが登場するものだと思っていた。
SCENE8 のハンマーみたいなボスを倒すともう一度最初に戻されるわけ。
でも、 SCENE3 をクリアしても SCENE1 のような市街地に戻されるから、 もう一度ハンマーを倒せば、宇宙にいけるんぢゃねぇ? って淡い期待を抱いて、プレーしていた。
俺が操縦して弟が玉を打つとかやって、分担作業とかやったりして何とか攻略を試みていた。
ゲームセンターCX「高橋名人の冒険島」の課長と東島みたいな感じだ。
それでも、結局2度目のハンマーを撃墜することが出来なかったけどね。
紅白帽 頭にウルトラマン、ウルトラマンな感じに懐かしい思い出です。
俺のプログラムの師匠を見つけた
BASIC入門
俺様にプログラムってやつを教えてくれたソフトだった。
テラナツカシス。
発売はカシオだったのか。。。
ドット絵で飛行機飛ばしたり、mmlを記述して音楽鳴らしたりしていたもんだ。
基本はファミコンで遊んでいて、親からファミコンを取り上げられたら、「ゲームが無いければ作ればいいんぢゃね?」って感じでMSXで遊んでいた。
俺様にプログラムってやつを教えてくれたソフトだった。
テラナツカシス。
発売はカシオだったのか。。。
ドット絵で飛行機飛ばしたり、mmlを記述して音楽鳴らしたりしていたもんだ。
基本はファミコンで遊んでいて、親からファミコンを取り上げられたら、「ゲームが無いければ作ればいいんぢゃね?」って感じでMSXで遊んでいた。
2007年04月18日
SAPI Windows音声認識
何か、音声認識ネタが/.に出ていたので、昔書いた SAPI周りのやつでも上げとくか。
数年前に書いたやつなので、もう時代遅れになっている個所もあるかもしれんが何か役に立つといいかもね。
マイクから自由単語で認識するには?
認識した結果が、ResultString に入ります。
wave から認識させるには?
認識した結果が、ResultString に入ります。
音声認識のテストは、音がうるさいので、引きこもりが最も活動的になる夜にやりにいくですからねー。
録音した wav を使ってテストすれば、ご近所からも不審者と思われずに大丈夫です。
マイクからXMLで指定したルールにより認識するには?
認識した結果が、ResultString に入ります。
また、 XML で指定した名前と結果の配列が ResultMap に格納されます。
PHP でいう _POST みたいな感じで格納されるといえばわかりやすいでしょうか。
ここら辺は、http://julius.sourceforge.jp/sapi/index.html を参考にしました。
ありがとうございました。
マイクから自由単語で認識した結果を wav で保存するには?
あなたがコンピュータさまに、話し掛けたキモイ声が、 C:\output.wav に保存されます。
WindowsXPの人は SAPI 5.1 ぐらいが入っているから何もしなくてもいいけど、
Windows2Kの人は、 SAPIが入っていない?? っぽいんで、
http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en#filelist
からダウンロードして入れるといいよ。
上のドキュメント書いているときは、 SAPI4 で試しているので、5で動くかは謎。後で確認するかも。
数年前に書いたやつなので、もう時代遅れになっている個所もあるかもしれんが何か役に立つといいかもね。
マイクから自由単語で認識するには?
USES_CONVERSION;
HRESULT hr;
CComPtrEngine; // 認識エンジンオブジェクト
CComPtrRecoCtxt; // 認識エンジンオブジェクトの作成
// CLSID_SpSharedRecognizer マイクから録音するとき?
// CLSID_SpInprocRecognizer Waveから変換するとき?
hr = Engine.CoCreateInstance(CLSID_SpSharedRecognizer);
if(FAILED(hr)) throw RComException(hr , "CLSID_SpSharedRecognizer 構築 に失敗");
// 認識コンテクストオブジェクトの作成
hr = Engine->CreateRecoContext(&RecoCtxt);
if(FAILED(hr)) throw RComException(hr , "CreateRecoContext に失敗");
hr = RecoCtxt->SetNotifyWin32Event();
if ( FAILED(hr) ) throw RComException(hr , "SetNotifyWin32Event に失敗");
hr = RecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
if ( FAILED(hr) ) throw RComException(hr , "SetInterest に失敗");
hr = RecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
if ( FAILED(hr) ) throw RComException(hr , "SetAudioOptions に失敗");
CComPtrdictationGrammar;
//メインとなる文法の作成
hr = RecoCtxt->CreateGrammar(0, &dictationGrammar);
if ( FAILED(hr) ) throw RComException(hr , "CreateGrammar に失敗");
hr = dictationGrammar->LoadDictation(NULL, SPLO_STATIC);
if ( FAILED(hr) ) throw RComException(hr , "LoadDictation に失敗");
//録音開始
hr = dictationGrammar->SetDictationState( SPRS_ACTIVE );
if ( FAILED(hr) ) throw RComException(hr , "SetDictationState に失敗");
puts("go!");
CSpEvent event;
//録音が終わるまで大待機
hr = RecoCtxt->WaitForNotifyEvent(INFINITE);
if ( FAILED(hr) ) throw RComException(hr , "WaitForNotifyEvent に失敗");
hr = event.GetFrom( RecoCtxt );
if ( FAILED(hr) ) throw RComException(hr , "GetFrom に失敗");
//認識した結果
ISpRecoResult* result;
result = event.RecoResult();
//認識した文字列の取得
CSpDynamicString dstrText;
hr = result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
if ( FAILED(hr) ) throw RComException(hr , "録音したテキストの取得に失敗しました");
string ResultString = W2A(dstrText);
認識した結果が、ResultString に入ります。
wave から認識させるには?
CLSID_SpSharedRecognizer ではなくて、 CLSID_SpInprocRecognizer からオブジェクトを作成し、 BindToFileします。
USES_CONVERSION;
HRESULT hr;
CComPtrEngine; // 認識エンジンオブジェクト
CComPtrRecoCtxt;
// 認識エンジンオブジェクトの作成
// CLSID_SpSharedRecognizer マイクから録音するとき?
// CLSID_SpInprocRecognizer Waveから変換するとき?
/* これを
hr = Engine.CoCreateInstance(CLSID_SpSharedRecognizer);
if(FAILED(hr)) throw RComException(hr , "CLSID_SpSharedRecognizer 構築 に失敗");
*/
///こういう風に書き換える---------------------
CComPtrcpStream;
hr = Engine.CoCreateInstance(CLSID_SpInprocRecognizer); //CLSID_SpSharedRecognizerではないよ
if(FAILED(hr)) throw RComException(hr , "CLSID_SpInprocRecognizer 構築 に失敗");
hr = cpStream.CoCreateInstance(CLSID_SpStream);
if(FAILED(hr)) throw RComException(hr , "CoCreateInstance CLSID_SpStream に失敗");
hr = cpStream->BindToFile( L"c:\\test.wav" , SPFM_OPEN_READONLY , NULL , NULL, SPFEI_ALL_EVENTS);
if(FAILED(hr)) throw RComException(hr , "BindToFile に失敗");
hr = Engine->SetInput( cpStream, TRUE);
if(FAILED(hr)) throw RComException( Engine , CLSID_SpSharedRecognizer , hr , "SetInput に失敗");
/// ------------------------
// 認識コンテクストオブジェクトの作成
hr = Engine->CreateRecoContext(&RecoCtxt);
if(FAILED(hr)) throw RComException(hr , "CreateRecoContext に失敗");
hr = RecoCtxt->SetNotifyWin32Event();
if ( FAILED(hr) ) throw RComException(hr , "SetNotifyWin32Event に失敗");
hr = RecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
if ( FAILED(hr) ) throw RComException(hr , "SetInterest に失敗");
hr = RecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
if ( FAILED(hr) ) throw RComException(hr , "SetAudioOptions に失敗");
CComPtrdictationGrammar;
//メインとなる文法の作成
hr = RecoCtxt->CreateGrammar(0, &dictationGrammar);
if ( FAILED(hr) ) throw RComException(hr , "CreateGrammar に失敗");
hr = dictationGrammar->LoadDictation(NULL, SPLO_STATIC);
if ( FAILED(hr) ) throw RComException(hr , "LoadDictation に失敗");
//録音開始
hr = dictationGrammar->SetDictationState( SPRS_ACTIVE );
if ( FAILED(hr) ) throw RComException(hr , "SetDictationState に失敗");
puts("go!");
CSpEvent event;
//録音が終わるまで大待機
hr = RecoCtxt->WaitForNotifyEvent(INFINITE);
if ( FAILED(hr) ) throw RComException(hr , "WaitForNotifyEvent に失敗");
hr = event.GetFrom( RecoCtxt );
if ( FAILED(hr) ) throw RComException(hr , "GetFrom に失敗");
//認識した結果
ISpRecoResult* result;
result = event.RecoResult();
//認識した文字列の取得
CSpDynamicString dstrText;
hr = result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
if ( FAILED(hr) ) throw RComException(hr , "録音したテキストの取得に失敗しました");
string ResultString = W2A(dstrText);
認識した結果が、ResultString に入ります。
音声認識のテストは、音がうるさいので、引きこもりが最も活動的になる夜にやりにいくですからねー。
録音した wav を使ってテストすれば、ご近所からも不審者と思われずに大丈夫です。
マイクからXMLで指定したルールにより認識するには?
USES_CONVERSION;
HRESULT hr;
CComPtrEngine; // 認識エンジンオブジェクト
CComPtrRecoCtxt;
// 認識エンジンオブジェクトの作成
// CLSID_SpSharedRecognizer マイクから録音するとき?
// CLSID_SpInprocRecognizer Waveから変換するとき?
hr = Engine.CoCreateInstance(CLSID_SpSharedRecognizer);
if(FAILED(hr)) throw RComException(hr , "CLSID_SpSharedRecognizer 構築 に失敗");
// 認識コンテクストオブジェクトの作成
hr = Engine->CreateRecoContext(&RecoCtxt);
if(FAILED(hr)) throw RComException(hr , "CreateRecoContext に失敗");
hr = RecoCtxt->SetNotifyWin32Event();
if ( FAILED(hr) ) throw RComException(hr , "SetNotifyWin32Event に失敗");
hr = RecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
if ( FAILED(hr) ) throw RComException(hr , "SetInterest に失敗");
hr = RecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
if ( FAILED(hr) ) throw RComException(hr , "SetAudioOptions に失敗");
CComPtrdictationGrammar;
//メインとなる文法の作成
hr = RecoCtxt->CreateGrammar(0, &dictationGrammar);
if ( FAILED(hr) ) throw RComException(hr , "CreateGrammar に失敗");
//録音開始
/*これを
hr = dictationGrammar->SetDictationState( SPRS_ACTIVE );
if ( FAILED(hr) ) throw RComException(hr , "SetDictationState に失敗");
*/
///こういう風に書き換える---------------------
//ユーザ指定ファイルからのロード
hr = dictationGrammar->LoadCmdFromFile( L"c:\\test.xml" ,SPLO_STATIC);
if ( FAILED(hr) ) throw RComException(hr , "LoadCmdFromFile に失敗");
//録音開始
hr = dictationGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE );
if ( FAILED(hr) ) throw RComException(hr , "SetRuleState に失敗");
////--------------------------------------
puts("go!");
CSpEvent event;
//録音が終わるまで大待機
hr = RecoCtxt->WaitForNotifyEvent(INFINITE);
if ( FAILED(hr) ) throw RComException(hr , "WaitForNotifyEvent に失敗");
hr = event.GetFrom( RecoCtxt );
if ( FAILED(hr) ) throw RComException(hr , "GetFrom に失敗");
//認識した結果
ISpRecoResult* result;
result = event.RecoResult();
//認識した文字列の取得
CSpDynamicString dstrText;
hr = result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
if ( FAILED(hr) ) throw RComException(hr , "録音したテキストの取得に失敗しました");
string ResultString = W2A(dstrText);
//追加------------------------------
//認識に XMLを使用した場合、代入された結果を得る.
map
ResultMap; //これに結果を代入する
SPPHRASE *pPhrase;
event.RecoResult()->GetPhrase(&pPhrase);
const SPPHRASEPROPERTY *pProp;
for (pProp = pPhrase->pProperties; pProp; pProp = pProp->pNextSibling)
{
string a = W2A(pProp->pszName);
ResultMap[ W2A(pProp->pszName) ] = W2A(pProp->pszValue);
}
CoTaskMemFree(pPhrase);
///---------------------------------
認識した結果が、ResultString に入ります。
また、 XML で指定した名前と結果の配列が ResultMap に格納されます。
PHP でいう _POST みたいな感じで格納されるといえばわかりやすいでしょうか。
ここら辺は、http://julius.sourceforge.jp/sapi/index.html を参考にしました。
ありがとうございました。
マイクから自由単語で認識した結果を wav で保存するには?
USES_CONVERSION;
HRESULT hr;
CComPtrEngine; // 認識エンジンオブジェクト
CComPtrRecoCtxt;
// 認識エンジンオブジェクトの作成
// CLSID_SpSharedRecognizer マイクから録音するとき?
// CLSID_SpInprocRecognizer Waveから変換するとき?
hr = Engine.CoCreateInstance(CLSID_SpSharedRecognizer);
if(FAILED(hr)) throw RComException(hr , "CLSID_SpSharedRecognizer 構築 に失敗");
// 認識コンテクストオブジェクトの作成
hr = Engine->CreateRecoContext(&RecoCtxt);
if(FAILED(hr)) throw RComException(hr , "CreateRecoContext に失敗");
hr = RecoCtxt->SetNotifyWin32Event();
if ( FAILED(hr) ) throw RComException(hr , "SetNotifyWin32Event に失敗");
hr = RecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION));
if ( FAILED(hr) ) throw RComException(hr , "SetInterest に失敗");
hr = RecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL);
if ( FAILED(hr) ) throw RComException(hr , "SetAudioOptions に失敗");
CComPtrdictationGrammar;
//メインとなる文法の作成
hr = RecoCtxt->CreateGrammar(0, &dictationGrammar);
if ( FAILED(hr) ) throw RComException(hr , "CreateGrammar に失敗");
hr = dictationGrammar->LoadDictation(NULL, SPLO_STATIC);
if ( FAILED(hr) ) throw RComException(hr , "LoadDictation に失敗");
//録音開始
hr = dictationGrammar->SetDictationState( SPRS_ACTIVE );
if ( FAILED(hr) ) throw RComException(hr , "SetDictationState に失敗");
puts("go!");
CSpEvent event;
//録音が終わるまで大待機
hr = RecoCtxt->WaitForNotifyEvent(INFINITE);
if ( FAILED(hr) ) throw RComException(hr , "WaitForNotifyEvent に失敗");
hr = event.GetFrom( RecoCtxt );
if ( FAILED(hr) ) throw RComException(hr , "GetFrom に失敗");
//認識した結果
ISpRecoResult* result;
result = event.RecoResult();
//認識した文字列の取得
CSpDynamicString dstrText;
hr = result->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
if ( FAILED(hr) ) throw RComException(hr , "録音したテキストの取得に失敗しました");
string ResultString = W2A(dstrText);
//追加------------------------------
CComPtrResultStream;
CComPtrvoice;
hr = RecoCtxt->GetVoice(&voice);
if(FAILED(hr)) throw RComException(hr , "GetVoice に失敗");
hr = event.RecoResult()->GetAudio( 0, 0, &ResultStream );
if ( FAILED(hr) ) throw RComException(hr , "GetAudio に失敗しました");
CComPtrcpWavStream;
CComPtrcpOldStream;
CSpStreamFormat OriginalFmt;
voice->GetOutputStream( &cpOldStream );
OriginalFmt.AssignFormat(cpOldStream);
hr = SPBindToFile( L"C:\\output.wav",SPFM_CREATE_ALWAYS, &cpWavStream,&OriginalFmt.FormatId(), OriginalFmt.WaveFormatExPtr() )
voice->SetOutput(cpWavStream,TRUE);
hr = voice->SpeakStream( ResultStream , SPF_DEFAULT, 0 );
if ( FAILED(hr) ) throw RComException(hr , "SpeakStream に失敗しました");
///---------------------------------
あなたがコンピュータさまに、話し掛けたキモイ声が、 C:\output.wav に保存されます。
WindowsXPの人は SAPI 5.1 ぐらいが入っているから何もしなくてもいいけど、
Windows2Kの人は、 SAPIが入っていない?? っぽいんで、
http://www.microsoft.com/downloads/details.aspx?FamilyId=5E86EC97-40A7-453F-B0EE-6583171B4530&displaylang=en#filelist
からダウンロードして入れるといいよ。
上のドキュメント書いているときは、 SAPI4 で試しているので、5で動くかは謎。後で確認するかも。
C# eval先から自分の関数を呼び出させる
あんまりにも面白かったので作ってみた。
動的に 1+1+自分のクラスのAAAの値を求める。
サンプルでは、 AAA=13 なので、 1+1+13=15 と表示される。
自分
↓
動的に作成したルーチン
↓
自分の関数
これ使えば、簡易スクリプト言語なんて不要ぢゃねーの??
参考
文字列の計算式の計算結果を取得する
Evaluating Mathematical Expressions by Compiling C# Code at Runtime
動的に 1+1+自分のクラスのAAAの値を求める。
サンプルでは、 AAA=13 なので、 1+1+13=15 と表示される。
自分
↓
動的に作成したルーチン
↓
自分の関数
これ使えば、簡易スクリプト言語なんて不要ぢゃねーの??
参考
文字列の計算式の計算結果を取得する
Evaluating Mathematical Expressions by Compiling C# Code at Runtime
using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom.Compiler;
using System.Reflection;
namespace @ref
{
//int AAA を保護するクラス
public class Himitsu
{
private int AAA;
public int getAAA()
{
return this.AAA;
}
public Himitsu(int inAAA)
{
this.AAA = inAAA;
}
};
public class Program
{
static private Himitsu HimitsuInstance;
public static int MyCallBack()
{
return HimitsuInstance.getAAA();
}
static void Main(string[] args)
{
//計算するためのコード
string source = @"
public class MainClass
{
public static double EVal()
{
int aaa = @ref.Program.MyCallBack(); //秘密の数字にアクセス
return 1+1+aaa;
}
}";
//秘密の数字13を渡す.
HimitsuInstance = new Himitsu(13);
//コンパイルするための準備
CodeDomProvider cp = new Microsoft.CSharp.CSharpCodeProvider();
ICodeCompiler icc = cp.CreateCompiler();
CompilerParameters cps = new CompilerParameters();
CompilerResults cres;
//メモリ内で出力を生成する
cps.GenerateInMemory = true;
cps.ReferencedAssemblies.Add("system.dll");
cps.ReferencedAssemblies.Add("ref.exe"); //自分自身のexe名
//コンパイルする
cres = icc.CompileAssemblyFromSource(cps, source);
if (cres.Errors.Count > 0)
{
string errors = "Compilation failed:\n";
foreach (CompilerError err in cres.Errors)
{
errors += err.ToString() + "\n";
}
Console.WriteLine(errors);
return;
}
//コンパイルしたアセンブリを取得
Assembly asm = cres.CompiledAssembly;
//MainClassクラスのTypeを取得
Type t = asm.GetType("MainClass");
//EValメソッドを実行し、結果を取得
double d = (double) t.InvokeMember("EVal",
BindingFlags.InvokeMethod,
null,
null,
null);
//結果を表示
Console.WriteLine(d);
}
}
}
2007年04月17日
メモ プログラムの中でプログラムを実行する
文字列の計算式の計算結果を取得する
面白い。
Microsoft Script Controlを利用する方法については、サクラエディタが実装していると思う(たぶん)。
C++で書くと死ぬほど面倒くさくてまわりっくどい。
こーゆーのを見ていると、
Windows環境での自作スクリプトとか、Luaとかいらなくねぇ?って感じになるね。
自前スクリプトだと文法覚えるの面倒だし。
エラー処理がいい加減で、エラーメッセージが異常にわかりづらかったりするし。
スクリプト自体にバグがあったりしたら地獄だし。
何より、デバッカーがない!! っての最大の問題だ。
Windows環境で、何らかのスクリプトが欲しくて、自前で実装とかしているやつがいたら今すぐそのコードを破棄するべきだ。
その方が世の中平和になるし、何より楽で良い。
面白い。
Microsoft Script Controlを利用する方法については、サクラエディタが実装していると思う(たぶん)。
C++で書くと死ぬほど面倒くさくてまわりっくどい。
こーゆーのを見ていると、
Windows環境での自作スクリプトとか、Luaとかいらなくねぇ?って感じになるね。
自前スクリプトだと文法覚えるの面倒だし。
エラー処理がいい加減で、エラーメッセージが異常にわかりづらかったりするし。
スクリプト自体にバグがあったりしたら地獄だし。
何より、デバッカーがない!! っての最大の問題だ。
Windows環境で、何らかのスクリプトが欲しくて、自前で実装とかしているやつがいたら今すぐそのコードを破棄するべきだ。
その方が世の中平和になるし、何より楽で良い。

