白いカレー
ということで、サンスポから。
北海道でターメリックを使わず、牛乳をたっぷりと使った白いカレーが開発され人気だとか。
その人気の白いカレーのルーをハウスが8月7日より全国で発売するそうな。
これは、面白そうだし、一度は買って食べてみなければなるまい。
--ryuuri/りゅうり/流離
キケンなETC
ということで。
まあ、リンクの表題のままだが、かなりETC関連の事故が起きているようだ。
ETCで運転手が油断する、というのは仕方がない。
なぜなら、そもそも、それが目的だからだ。
運転手が常に緊張していなければならないとか、手動でオカネを払うのと同じ程度に時間がかかったり手間がかかったりするのであれば、導入するメリットは何もないことになる。
だから。
この記事に書いてあるような、運転手に注意を呼びかけると言う方法は、本来的な解決ではない気がするのだ。
本来ならば、ETCを2段にして、1段目は読み取りだけ。そして、ここで期限切れやカードの挿入忘れがあっても、ゲートが閉じずに、警告だけしてETCレーン外に排出する仕組みを作ればよいのだ。
そもそも。
その手のミスが起こるのは、想定されていたはずだ。
最初から、その手のミスをカバーするような設計にするべきだったところを、金をケチって手抜きするから発生したのではないか、などと穿った見方をしてしまうな。
--ryuuri/りゅうり/流離
鏡の法則
ということで、リンク。
どうやら、読んだ90%の人が泣いたという触れ込みらしい。
イマイチ、どこが泣くところか良く分からなかったが(笑
まあ、なんというか。
真に受けても、それほど問題はないと思う。至極まっとうな行動だしな。
そして、実際にこういうことがあったとしてもおかしくない、とも思う。
だが、この行動と結果の間に因果関係があったとは、思えない。
すくなくとも、この1例だけでは。
直接はそんなに関係ないのだが。
昔、友人に、おそらく捕まらないだろうサギを考え出して話をしたことがある。
なんとなく、その話を思い出した。
とりあえず、適当にご利益になりそうな絵を適当にでっち上げ、カラープリンターで印刷して売る。
当然、この絵を買ったら、ご利益があるとして。
その値段は、まあ、3万程度か。そして、効果がなかったら送料手数料を除いて全額返金します、と歌う。
買った人のうち10%くらいは、買って暫くすると何かしら良いことがあるだろう。そうすると、実際に効果があってと考え、返金をしないだろう。
十分な数を売れれば、かなり儲かるんじゃないか・・・という話だ。
まあ、実現可能かどうか、という所は置いておいて。
まったく関係ない事象でも、因果関係があるように勘違いさせれば、因果関係があると思い込んでしまう、というところが似ているような気がするのだ。
とりあえず、間に受けさえしなければ、十分に面白いと思うし、もしかしたら、実際に効力があるかもしれない。そして、効力がなくても、結果はでるかもしれない。
とりあえず、リンク先の文章を読んで、感動したり、泣いたりした場合は、そのことだけは、頭の片隅にでも置いておいて欲しい。
あ、そうそう、もう一つ。
宗教では、なにか悪いことがあると、信心が足りないことに理由を求めたりする。
そして、その悪いことを排除するために、もっと神様を信じなさい、と言う訳だ。
そして。
もし、悪いことが排除されなかったら、信心がまだ足りないからだ、ということにする。
さて。
もし、言われたとおりのことをしても子供のイジメが無くならなかったらカウンセラーが次になんと言っただろう?(笑
上の宗教の論理から、そんなんことを類推するのも面白いとおもう。
--ryuuri/りゅうり/流離
CreateProcessで起動したプログラムのリダイレクト
さて。
昨日と同じで、WindowsでC++を使ったプログラムをするときの話題。
題名そのわけなままだが。
CreateProcessで起動するプログラムを仮に、prog1としよう。
この、prog1を通常のコマンドプロンプトで出力をリダイレクトするときは、
$ prog1 > result.txt
のようにリダイレクトする。
そこで、最初
CreateProcess(NULL, "prog1 > result", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
とやろうとした。(ここで、普通に"prog1 > result"とリテラルを書くと、char[]と互換がないからと怒られる。実際のプログラムでは、一旦 Stringにデータが格納されているので、そこから、昨日の方法でLPTSTRへ変換している。)
ところが、この方法では、”>”がリダイレクトの記号としてではなく、引数の一つとしてprog1にわたってしまって、うまく動かない、そこでcmd.exeを使ってリダイレクトを理解させようとしてみた。
CreateProcess(NULL, "cmd.exe /c prog1 > result.txt", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
ところが、やはり、結果は同じ。
仕方ないので、プログラム中でファイルを開き、CreateProcessのStdOutとして、そのファイルのハンドルを登録することにした。
hOutput = CreateFile("result.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput =hOutput;
CreateProcess(NULL, "prog1", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
ところが、これだと、うまく行かない。なぜか。
1.CreateProcessの5つ目の引数が、FALSEになっている。ここFALSEだと、ファイルハンドルが子プロセスに引き継がれない。
2.CreateFileの4つ目の引数がNULLになっている。ここは、セキュリティ情報構造体へのポインタを設定して、その構造体のメンバに子プロセスへのハンドルを継承するよう設定する必要がある。
3.CreateProcessの第3引数、第4引数がNULLになっている。ここは、CreateFileと同様にセキュリティ情報構造体でハンドル継承設定する必要がある。
ということで、正解は、以下のとおり。
SECURITY_ATTRIBUTES sec_attr;
ZeroMemory(&sec_attr,sizeof(sec_attr));
sec_attr.bInheritHandle = TRUE;
hOutput = CreateFile("result.txt", GENERIC_WRITE, FILE_SHARE_WRITE, &sec_attr,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput =hOutput;
CreateProcess(NULL, "prog1", &sec_attr, &sec_attr, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
いやぁ、ここまで到達するのに結構かかってしまった。
なので、メモっておくことにした。
--ryuuri/りゅうり/流離
System::StringをLPTSTRに変換する方法
今日、VC++でさくさくと、ツールを作ってみた。
まあ、簡単なものだ。
ファイルダイアログを開き、そこで指定したファイルを引数にして、別の外部プログラムを起動する、といったものだ。
まあ、VisualStudioのフォームエディタで、サクサクと作って、CreateProcessを呼ぶだけ・・・と考えていた。いや、実際そうなのだが。
ここで、問題が。
ファイルダイアログの引数は、System::String型の文字列。
CreateProcessに渡すのは、LPTSTR型。
この変換をしなくてはならない。
とこころが、この、System::String型。LPTSTRに変換するメンバ関数が用意されていない。
LPTSTR型というのは、実のところ、wchar_t *型なので、array<wchar_t>を戻すSystem::String型のToCharArrayメンバ関数を呼べばいいと思ったのだが、うまく行かない。
このToCharArrayメンバ関数で変換した array<wchar_t>を(wchar_t *)でキャストすると、managedからunmanagedへキャストしたらダメだと怒られてしまうのだ。
基本的に、arrayというのは、配列と同じなので、理論上はイケるハズなのだが、どうしてだろう、ネットを色々としらべてみた。
やはり、同じところで、引っかかる人が多いようで、同じような質問はアチコチにあったのだが、回答が見つからない。
どうしたものかと、array<>の実装を調べ始めたところ、いいサイトを見つけた。
C++/CLIでmanagedなバイト配列をネイティブなバイト配列を処理する関数に渡す
managedなarrayは、array<型>で表現されるのだが、この型が基本型の場合、managedとunmanagedでデータ形式が同じだ。ところが、このページの解説によると、managedは、ガベージコレクタによって管理されているため、素直にunmanagedに変換できないらしい。
それを解決するために、pin_ptrを使う。
pin_ptr<型>で、array<型>を指すことにより、この領域が、使用済みであることを宣言する。こうしてしまえば、ガベージコレクターに回収されることがなくなる為、データをunmanage型に変換可能になる。
つまり、こんな感じだ。
String^ str = "ryuuri";
array<wchar_t> awc = str->ToCharArray();
pin_ptr<wchar_t> ppwc = &awc[0];
LPTSTR lpst = ppwc;
まあ、ちゃんとコンパイルが通ったものをコピー&ペイストで持ってきたわけではなく、記憶で書いているので、多少間違っているかもしれない。
が、まあ、大体、こんな感じだってのはわかるはずだ。
2007/2/25 無名氏の指摘により、リンクを追加。
signe.japan.webmatrixhosting.net/prog/CppCli_strings.aspxは、リンクが切れていたので、探してみたところ、以下のURLが氏が言っていたページの引越し先らしい。
--ryuuri/りゅうり/流離
SCOが着実な一敗
ということで。
ずいぶんと、長いこと話題に上っていなかったが、SCOが不当にIBMを訴えている問題で、SCOの卑怯な戦法が裁判所から非難されている。
ということで、ITmediaへのリンク。
まあ、なんてか。
正しいほうが、勝ったというニュースは気分がいいもんだ。
--ryuuri/りゅうり/流離
Google Spreadsheets
2連続でgoogleがらみのネタを扱うと、私がgoogleの信者なのではないかと疑われるかもしれない。
が、決してそんなことはない・・・とは、チト断言できないか(笑
結構、google好きだしな。
ということで、googleの表計算 Webアプリ、Google Spreadsheetsのβテストが開始された。
ちと使ってみたが、なかなか面白い。
ちょっと使う分には、excelの代用として十分だ。
Webブラウザが入っていて、インターネットにさえつながっていれば、どの環境でも、このアプリケーションを使うことができるというのは、非常に魅力的だ。
まあ、部屋の環境では、マイクロソフトのOfficeと OpenOffice.orgが入っているので、特に使うことはないのだが(笑
ただ、こいつ特有の機能として、スプレッドシートの共有がある。
インターネット上でシートを、複数人で同時に編集することが出来、それが、リアルタイムに反映されるらしい。実際にやってみていないので、どんな感じかはわからないのだが、なかなか面白そうだ。
--ryuuri/りゅうり/流離
Google Checkout
まあ、日本での展開はまだなのだが。
アメリカで、googleが、Google Checkoutという小額決済サービスの提供を開始した。
米Google、サイト横断的決済サービス「Google Checkout」提供開始
Googleのアカウントを入力するだけで、各店舗でクレジット決済ができる。
これによって、Googleさえ信頼できれば、他の店舗を信頼できなくてもクレジットカードでの商品購入が可能となる。
また、異なるショップでもGoogle Checkoutを使って購入すると、購入履歴がgoogleに残る。
その情報を一覧することができ、ネットのどこで何を買ったのかというのを把握できるのだ。
googleとしては、
検索する=>広告、もしくは検索結果から店に入る=>Google Checkoutで購入
という形を考えているんだろう。
それは、非常に便利なサービスになる気がする。
将来的には日本でもサービスを展開する模様。今から非常に楽しみだ。
--ryuuri/りゅうり/流離
メガネを買った
さて、先週の木曜日。
雨の中を走っていた。
駐車場から車が出ようとしているのだが、なにかモタモタしていて、なかなか出てこない。
半分くらい出ているので、非常にジャマだった。
仕方ないので、駐車場の方をショートカットして・・・と足を踏み入れた途端、駐車場の何かに引っかかって転んだ。
派手に転んだため、傘はボロボロになり、腕時計は破損し、メガネはフレームがこれでもかというほどゆがんでしまった。
まだ慣れていない街を、メガネなしで歩くのは、視力0.01以下の私にとってはかなり冒険だ。冒険、という言葉も生温いかもしれない。むしろ不可能に近い。
仕方ないので、メガネのフレームのゆがみをなんとなく直し、掛けてみる。視界がゆがんでいるし、ちゃんと安定しない。微調整を続けて・・・やっと安定するようになったが、はずしてみると、フレームがかなりゆがんでいる。
まあ、仕方ないので、その状態であきらめ、傘も応急処置をして部屋に戻った。
部屋に帰ってメガネを見てみると、レンズにかなり傷が入っている。
私のメガネは、ガラス製なので、通常傷はつきにくい。
なにせ、ガラスはサファイア並みの硬度を誇っていて、傷が付くということはほとんどありえないのだ。
だが・・・ガラスはもろいので、割れやすいし、ある程度衝撃を与えると欠けてしまう。
そんな感じで、傷というよりも、表面の一部が細かく欠けてしまっている感じだ。
フレームは直るかもしれないが、この傷では使い物にならない。
仕方ないので次の日、メガネを新調するべくメガネ屋へ向かった。
今使っているメガネは、もう10年近くも前に作ったものだ。かなりレンズのサイズが大きいもので、視界が広いため気に入っていた。
そこで、店に入って「これと同じものをお願いします」と言って探してもらった。店長は、本店に問い合わせをしていたが、結局見つけることが出来ず、結局、新しいものを買うことにした。
「細いものでも、それほど視界は悪くなりませんよ」と店長が説明する。たしかに、度の入っていないフレームをかけてみる限り、それほど視界が悪くはならない。
「これなんかは、形が前とほぼ同じです」と、確かに前のメガネと似た形で、それをかなり細くした感じのメガネを差し出す。
・・・いや、私は別に前のメガネの形が気に入っていたわけではなく、視界の広さが気に入っていたのだ(笑
同じ形であっても、細くなっていては意味がない。
まあ、前のものから乗り換える際に違和感が少ないだろうと候補の一つに入れた。
「これなんかも似合いますよ」と、かなり細いフレームのものを渡してくる。
まあ、それはメガネ屋は似合うというだろうよ、などと考えていることはおくびにも出さず、差し出されたメガネをかけて、鏡を覗き込む。
実のところ、私の0.01以下の超低視力ではフレームだけ渡されてもさっぱり見えん。
「ちょっと、前と違うので違和感があるかもしれませんが、すぐ慣れますよ」
まあ、それはそうなのだろう。
しかし、この細いフレームのものは、ありえないほど視界が悪いので却下することにした。
そうやって、いくつかかけてみて。
結局は、「これなんかは、頑丈ですよ」、という殺し文句に負けて、その頑丈なフレームにした。
いや、今回転んでフレームがゆがんだので、ちょっとでも強い方が良いかなと思ったのだ。
形は元のものとかなり変わるが、それほど細すぎず視界は十分に確保される。
「これにします」と言って、フレームを決めると、次は、レンズの選定に移った。
ガラス・球面・片面フラット・両面フラットの4種類があり、それぞれにグレードが4つほど存在していた。
ただし、ガラスはありえないということだったので、今回はガラスはあきらめた。
確かに、この細いフレームに分厚いガラスはムリだろう。これで選択肢は12種類。
そして、このプラスチックレンズ、硬化コーティングというものがあるらしい。なるべく頑丈なものが欲しかったため、硬化コーティングを施せるものを選択することにした。
硬化コーティグを施させるのは、12種類中4種類。
「お客様の視力ですと、このレベルじゃないと難しいですね」と、グレードの1番目と2番目を指す。
ただし、グレードの一番高いものと、球面の二番に高いものは、硬化コーティング出来なかったため、残りは、片面フラットか両面フラットの2番目のグレードのものだけ。
まあ、せっかくだからということで、両面フラットのものを買うことに。
その日はそれで帰って、受け取りは1週間後ということになった。
そして、それから一週間経った今日、受け取りに行ってきた。
いやいや、これは、かなり良いものだ。
似合っているかどうかとか、そういうことではなく。
両面フラットのメガネは、レンズの縁でもゆがみが少ない。そのため、掛けていて全然違和感がないのだ。
まあ、やはり、今までより視界が狭くなってやや不便な感じもあるが。
この裸眼に近い違和感のなさは、すばらしい。
なんとういか。
技術の進歩って凄いと感じる体験だった。
--ryuuri/りゅうり/流離