☆のところの目のテストをやってみたら
が | ||
が |
と、楽天に取り込まれるとロゴがダサくなる。Edyとかe-bankとか、旧ロゴは利用者が特定の企業のサービスとして意識しなくていいようにとの配慮からああなっていたらしいのだが、楽天はそんなことは全くお構いなしなようだ。まあ、思想以前にセンスが全く感じられないところが問題なんだが・・・
ところが何故か野球チームだけは
なんかかっこいいんだけど、なんでこれだけ力入れてんの。
野球だけ特別扱いというのは日本人の三大欠点の一つだと思う。まあアメリカ人もアメリカンフットボールになると発狂するのでどこの国も似たようなものなのだろう。
そうはいっても、このEaglesのロゴは別の意味で酷い。なんといっても楽天ぽくない。
楽天のロゴなら、とりあえず”楽天”の文字が目に入って、「なんだまた楽天かよ・・・」とがっかりしてから、「で、こいつはなんだ?ああ、銀行か」と、サービスを理解するのに必ず一手間置き、まず一度落胆を経由させる効果がなければならない。
それが楽天という企業だ。
だから、楽天Eaglesははやくロゴを変えた方が良い。このままだと、楽天のチームだ、ということがわかりにくい。
具体的には:
絶対この方が良い。楽天ぽい。
中学の時のこと。全校でダンス会的なものが開かれたのだが、ルールが厄介で、
① ラブレターを三通用意する
② 二通を名前と”よろしく”的なことを書いた自己紹介カードにする
③ 一通は本気の恋文にする
④ 本番、男子の輪、女子の輪で◎を作る。
⑤ 男子は右回り、女子は左回りで回る
⑥ ストップの合図があったときに隣にいた人と踊る ⑤→⑥を三回繰り返す。
⑦ ⑥の際、相手が気になる人物だった場合は③を渡す
⑧ ⑥の際、相手がどうでもいい人物だった場合は②を渡す
⑨ 三回の間に意中の相手に③を渡せればよかったね、渡せなければ残念でした
誰がこんなふざけた催し物を考えついたのか。楽しそうにルール説明をしていた髪なし能無し配慮なしの脳筋ヤクザ体育教師以外に思いつかない。むろん私は状況証拠だけで特定個人の残虐性を確信するほど歪んだ性格はしていないが、かといって教員と名乗られれば無条件に忠犬を装えるほど純粋でもない。いずれにせよいずれでもないにせよ、ボイコットするほどの度胸はないので何らかの策を講じねばなるまい。ここに知恵が必要である。
ルールの特徴として、三回も機会がある。
仮に学校内に意中の相手がいた場合、当たってしまう確率は極めて低いとはいえゼロではない。特に、1・2回目で当たった場合、ルール通りなら本命用の恋文を渡すことになる。この時問題になるのは、
●1.本命を渡した時点で、相手にそれがばれる(それが目的なわけだが)
●2.三回目に自己紹介カードを渡さなければならなくなる。これは暗に、三回目の人物に、校内に意中の相手がいる、という内容を(その真偽に関わらず)示してしまう。
さらに、意中の相手が校内にいないか、最後まであたらなかった場合(ほとんどのケースはこれだろう)。
●3.三回目が必然的に本命カードになる。全く興味のない人間に自分の恋文が読まれることになる。
加えるなら、校内に相手がいる場合で、三回目に運悪く遭遇した場合。
●4.本命相手に恋文を渡したにもかかわらず、自己紹介カードの扱いを受ける。
●5. 本命にマジな恋文が読まれる
と、皆考えるはずだ。
4ならいいが5とセットのため、極力避けるべきである。1は確率的には低いが、当たったときのダメージが即死レベルだ。セットの2も必然的に除外されなければならない。すると3しか残らない。
しかし、3は確率が高いからカモフラージュとして有効というだけで、1や5の破壊力が軽減されるわけではない。確率しか根拠のない油断は死を招く。
ここは、「安全なのはどれか」ではなく「最悪のケースを避ける」という観点からの攻略が正解だろう。最悪なのはあくまで1と5だ。これを避けるのは簡単で、本命が来たら自己紹介カード、それ以外なら恋文を渡せばよい。
と、皆考えるはずだ。ここまでは容易に想像できる。だが、最悪なケースを避けられたからといって満足しているようでは危険だ。最悪のケースを避ける、という目標が達成できたら、最善の結果を生み出すための努力をしなければ、このサバイバルは生き残れない。
先の対策の問題は、確実に3と同等の現象が生じる点にある。ここで改めて、1~5を確認すると、セット効果を無視すれば5は3と同じ現象であることがわかる。その条件なら、マシなのは4>=2>5ということになる。今は最悪の5であるため、なんとか4または2にしたい。4は元々低確率(ないしゼロ)なので狙うべきではない。つまり、1と独立した2が最良の結果という事になる。
与えられた枠組みの中でそれを実現するのは不可能だ。
だが、もし、三枚とも自己紹介カードだったら?2以外の結果はありえないではないか。
思い返してみれば、 そもそもこの会は成績に影響しないし、ルール違反の罰則もない。
と、皆考えるはずだ。当日は悪徳教師の思惑は外れ、ただの自己紹介会となるに違いない。そんな中で一人恋文なんぞ持参するのは顔面にバカとかいて校舎を練り歩くようなものだ。
と、皆考えるはずだ。だからこそ、私は鉄壁の自信を持って三枚とも自己紹介カードで挑んだんである。
三回目に恋文が来た時は愕然としたね、実際。
お前ら少しは頭を使え。ルールに従うことが常に正解とは限らないんだぞ。
しかも教室に帰ったら卑怯者とか言われたし。
悪かったよ。学んだよ。
馬鹿の思考は深読みしちゃいけないってことをな。
というか人を卑怯者呼ばわりしたくなるくらい苦痛なら抗議するなり欠席するなりやりようはあるだろうが。こっちはその代りに落雁が作れるほどのブドウ糖を脳に流し込んでるんだよ。
だが今思えば私も人の事は言えないのかもしれない。
むしろ連中は、私が彼らの思考にたどり着いたとこにいち早く気づき、その裏をかいた可能性もある。
結論。敵はそこらじゅうにいる。教師の目をかいくぐり、不確定要素を極力排除してもなお、完璧な勝利を手にすることは難しいのである。渡る世間は鬼ばかり。中学時代の苦い思い出である。
と言うわけで、OpenCLのカーネルプログラムの引数に値を渡して、その結果を返してもらうサンプルを作った。
カーネル側の*var1,*var2にintの値を与え、*retへ結果を格納。
・clCreateBufferでデバイスにメモリ確保、
・clEnqueueWriteBufferで確保したメモリへ値を代入
・clSetKernelArgでカーネルプログラムの引数に確保したメモリのアドレスを指定
・clEnqueueReadBufferでデバイス上のメモリから値を取得
・clReleaseMemObjectでデバイスのメモリを解放
と言ったところだろうか。
http://www.fixstars.com/ja/news/books/opencl/
↑この本を参考に書いたが、これ、関数のインタフェースに関してはもちろん事典として記載はあるのだが、具体的にどう使うのかは実例を見て解読するしかないという所が多いように思う。clEnqueueWriteBufferとか、なんとかググらずに済んだが不親切だ。
#pragma warning(disable : 4996 ) #include <windows.h> #include <CL/cl.h> #include <string.h> #include <stdlib.h> #include <iostream> #pragma comment(lib,"OpenCL.lib") #define MAX_SOURCE_SIZE 0x100000 int cl_inout(){ cl_device_id device_id = NULL; cl_context context = NULL; cl_command_queue command_queue = NULL; cl_program program = NULL; cl_kernel kernel = NULL; cl_platform_id platform_id = NULL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int ret; char *source_str; size_t source_size; source_str = (char*)malloc(MAX_SOURCE_SIZE); strcpy(source_str, "__kernel void hello(" " __global int* var1," " __global int* var2," " __global int* ret" ")\n" "{\n" " *ret = *var1 + *var2;\n" "}\n" ); source_size = strlen(source_str); /* プラットフォーム・デバイスの情報の取得 */ ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms); ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices); /* OpenCLコンテキストの作成 */ context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret); /* コマンドキューの作成 */ command_queue = clCreateCommandQueue(context, device_id, 0, &ret); /* メモリバッファの作成 引数として使用 */ cl_mem arg1_X = NULL; cl_mem arg2_Y = NULL; cl_mem arg3_R = NULL; arg1_X = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(int), NULL, &ret); arg2_Y = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(int), NULL, &ret); arg3_R = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(int), NULL, &ret); /* 読み込んだソースからカーネルプログラムを作成 */ program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret); /* カーネルプログラムをビルド */ ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); /* OpenCL カーネルの作成 */ kernel = clCreateKernel(program, "hello", &ret); /* カーネルプログラムの引数に値を設定 */ int val1 = 20, val2 = 50; clEnqueueWriteBuffer(command_queue, arg1_X, CL_TRUE, 0, sizeof(int), &val1, 0, nullptr, nullptr); clEnqueueWriteBuffer(command_queue, arg2_Y, CL_TRUE, 0, sizeof(int), &val2, 0, nullptr, nullptr); /* OpenCLカーネル引数の設定 */ ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&arg1_X); ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&arg2_Y); ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&arg3_R); /* OpenCL カーネルを実行 */ ret = clEnqueueTask(command_queue, kernel, 0, NULL, NULL); /* メモリバッファから結果を取得 */ int ret_val; ret = clEnqueueReadBuffer(command_queue, arg3_R, CL_TRUE, 0, sizeof(int), &ret_val, 0, NULL, NULL); /* 終了処理 */ ret = clFlush(command_queue); ret = clFinish(command_queue); ret = clReleaseKernel(kernel); ret = clReleaseProgram(program); ret = clReleaseMemObject(arg1_X); ret = clReleaseMemObject(arg2_Y); ret = clReleaseMemObject(arg3_R); ret = clReleaseCommandQueue(command_queue); ret = clReleaseContext(context); free(source_str); /* 結果の表示 */ std::cout << ret_val; int k; std::cin >> k; return 0; }
こんな風にラジオボタンがある時
radioButton1をクリックしたら、そのチェックが消えてほしい。
という上司の要求にこたえるべく以下のように実装
まずラジオボタンがクリックされる直前の状態を記憶するメンバ変数を定義。
bool checkwhendown;
次にマウスダウンとクリックのイベントで呼び出す関数を以下に定義。
void RadioMouseDown(System::Object^ sender,System::Windows::Forms::MouseEventArgs^ e){ if (e->Button == System::Windows::Forms::MouseButtons::Left) { checkwhendown = dynamic_cast<RadioButton^>(sender)->Checked; } } void RadioMouseClick(System::Object^ sender,System::EventArgs^ e){ if (dynamic_cast<System::Windows::Forms::MouseEventArgs^>(e)->Button == System::Windows::Forms::MouseButtons::Left) { if( checkwhendown ) dynamic_cast<RadioButton^>(sender)->Checked = false; } }
各ラジオボタンの各メンバ関数から上記関数を呼び出す
_MouseDownがあったときに現在のラジオボタンの状態を保存。
その後「普通の」ラジオボタンの挙動が走ってしまい、クリックされたラジオボタンにチェックが入ってしまう。
そこでそのあとに飛んでくる_Clickイベントで保存していた状態を調べ、元々trueだったラジオボタンがクリックされていたら、falseをセットする
System::Void radioButton1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton2_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton3_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton4_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton5_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) { RadioMouseDown(sender,e); } System::Void radioButton1_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton2_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton3_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton4_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); } System::Void radioButton5_Click(System::Object^ sender, System::EventArgs^ e) { RadioMouseClick(sender,e); }