C/C++で警告レベルを高くしていると、意外なところで引っかかる。
自分で書いたモノならいくらでも直すのだが、他のライブラリや、IDEが勝手に作ったコードなんかの場合できる限り触りたくない。自分の管理下にないコードをいじると、アップデートが入ったとき修正箇所が多くなり大変である。
よく知られた方法として、
#pragma warning (disable : 4996 )
は特定の警告だけを無視できるが、そうではなく、特定の「箇所」だけに対してそれを行いたい。
触りたくないから触らないで居ると結局は直せない警告に埋もれて重要な警告を見落とす可能性が出てくる。
以下のコードは、VC++2012で/W4でコンパイルすると、
warning C4100: 'B' : 引数は関数の本体部で 1 度も参照されません。
だけが表示される。
#pragma warning(push) #pragma warning(disable:4100) void function_nouse_arg_A(int A){ printf("hello world!"); } #pragma warning(pop) void function_nouse_arg_B(int B){ printf("hello world!"); }
勿論普通はこんなことは行うべきではない。あくまで、警告に対応できない(すべきでない)合理的理由がある場合にだけ用いるべきだ。
鳩を飛ばせに行くんです、という曲があって、感覚が正常な人たちはみんな絶賛しているわけだが、私はどうしても納得できない。
http://www.utagoekissa.com/utagoe.php?title=hatowotobaseniyukundesu
考えてほしい。
靴が破れたらはきかえて
代わりがなければはだしでも
おなかがすいたらパンを食べ
なんにもなければがまんして
ぼくはずんずん行くんです
道をまっすぐどこまでも
嵐にあったらひなんして
熊にあったらうちとって
熊に会ったら避難してはいかんのか。
なぜ殺す。
じゃなくて、なんで鳩を飛ばすだけでこんな大冒険になるんだ?
鳩だってへんぴな山奥で放されても困るんじゃ無いか。そもそもどうやって連れて行くつもりだろう。
篭に入れてか?こんな大冒険を篭の中でじっと見ているのか?骨折るぞ。最悪死ぬぞ。
いやそれ以前に、なぜこの鳩は人間に飛ばされなければならなくなったのか。
怪我をして飛べなくなったのか?だったら拾ったところで放してやるべきだろう。もしやそんな山奥で拾ったのか?だとしたらこの冒険は二度目なんだが、それで歌にするほどの大冒険になるのか。
それとも人の元で育った鳩だろうか。だったら都会で放しても良さそうなものだが。というか山で生きていけないだろう。まさか獅子が子を千尋の谷に落とすがごとくのスパルタ教育か。なるほど学校で教わるわけだ。
考えられる最も納得のいくストーリーはこうだ。つまりこの鳩は異世界の生き物で、時空の裂け目的なところからこちらに迷い込んで蛇ににらまれた蛙のように困惑していたところを主人公が保護して、なんやかやで元の世界に帰るには○月×日の△山頂上に行かなければならないと言うことに・・・・
だめだ。鳩。自力でいけよ、飛べるんだから。
ちなみに、一つわかったことがある。子を谷に落とす獅子は中国の架空の生き物らしい。何にでも疑問を持てば、何かしら新たな知見が得られるということだろう。
アメリカ側の手続きが進んでいなくて先にアパートを追い出されたので☆の家に荷物共々転がり込んでいる。
☆もあまりいい顔をしていないが、震災に備えて貯めておいた無駄に高価な粉末青汁とか、真空パック玄米とか、比較的新しい洗濯機とかがただで手に入ったんでなんとか収まっている。賞味期限が切れていることはいわないでおいた方が良さそうである。
それはさておき、黒猫大和に問い合わせたら荷物30個をヤマト便で送ってくれるというので頼んだら、集配の人がものすごくいやな顔をしていた。というか梱包を自分でするなら引っ越し便使えないといったのはヤマト側なんだが、どうもそんなことはないらしい。受付と現場の認識の乖離が激しい。
さて、四月からの職場の上司との打ち合わせで、VC++2005を使っていることが発覚。でGDIで一生懸命図を書いていて、この人プログラマでもないのに凄いなと思ったんだが、アルファチャンネルをどんなに頑張っても加えられないと嘆いていたので、GDI+使うといいよと教えてあげたら喜んでた。
で、gdiplusを使うのはいいんだが、コントロール自作してたらDrawImageでちらつくことが発覚し、仕方が無いのでオフスクリーンレンダリングしてAlpaBlendしようと思った。
のだが、問題が発覚した。
OnPaintの中で以下のコードを走らせる。その際、OnSizingでInvalidateするようにして、マウスパッドを消しゴムで消すようにマウスで振り回しウィンドウサイズを変えていると、だいたい1~2分すると描画が一切されなくなる。
絶対メモリリーク的な何かがおこってると思ったが、案の定、それを指摘している人がいた。
CPaintDC dc(this); // 描画のデバイス コンテキスト RECT rect; rect.top = 20; rect.left = 40; rect.right = 200; rect.bottom = 200; Gdiplus::Bitmap backbuffer(rect.right, rect.bottom); CDC memDC; memDC.CreateCompatibleDC(&dc); HBITMAP hbmp; backbuffer.GetHBITMAP(Gdiplus::Color(0, 0, 0, 0), &hbmp); HBITMAP oldbmp = (HBITMAP)memDC.SelectObject(hbmp); Gdiplus::Graphics g(memDC); for (size_t i = 0; i < 10; i++) { Gdiplus::Rect rct(0, i * 50, 50, 50); Gdiplus::SolidBrush brush(Gdiplus::Color(100, 255, 0, 0)); g.FillRectangle(&brush, rct); } dc.BitBlt(0, 0, rect.right, rect.bottom, &memDC, 0, 0, SRCCOPY); memDC.SelectObject(oldbmp); //DeleteObject(hbmp); ① CDialogEx::OnPaint();
解決策は最後から三行目、①のコメントを外すこと。
というか
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms536295%28v=vs.85%29.aspx
説明読むと、
The Bitmap::GetHBITMAP method creates a Windows Graphics Device Interface (GDI) bitmap from this Bitmap object.
つまりGDI bitmapを作るっていう関数なので、作ったら破棄しなければいけないのは当たり前だ。
こんばんわ。ぬです。お久しぶりでございます。
ええ、このたび、私、仕事をさぼっているのがばれたのか、
アメリカに飛ばされることになりまして、
まあその絡みで、アップル社もソフトバンクもアメリカも嫌いなのに
ソフトバンクのiPhoneもってアメリカいかにゃならんのですよ。
http://www.softbank.jp/mobile/service/global/america-hodai/
なにこの禁忌のちゃんぽん。
そう思っていたこの頃、中国人留学生から晩飯に招待されて、鍋食べてきました。
おいしいですが辛いです。
え、何、おまえベジタリアンじゃなかったのかって?
少し拘りを捨てろと言われてる気がします。
タイトル:モラル・ハラスメントの心理構造
著者: 加藤諦三
ページ数:230ページ
この本で扱うモラル・ハラスメントは、「美徳によって他人を支配する」行為を指すという。美徳とは、「人間はみんな仲良く」とか「人を疑ってはいけない」とか「親には感謝するべき」とかそういうものだ。
注意点として、この本、読みやすくはあるのだが、
・同じことを何度もいうタイプの文章
・とりとめのない文章
・学術的なことは載っていない
という感じなので、知識をつけるための教科書としてはお勧めできない。美徳による支配がどのように行われ、その結果人はどうなってしまうのか、それをざっくりと知りたい場合に読む本だ。
本文には、親子関係からのモラハラを特に重要視しているようで、その例が随所に出てくる。
P28 喧嘩にならない喧嘩
いじめを正当化する、それがモラル・ハラスメントである。
(略)
とにかくこういう人は、要求の仕方が間接的である。モラル・ハラスメントは美徳による支配だから、喧嘩にならない。
喧嘩にならない喧嘩がモラル・ハラスメントである。
「そうですか?」「そうとってしまうのですね」と言われる。喧嘩ができない。
親が子共に、「好きにしなさい。自分で考えなさい」と言う。しかし、非言語的メッセージとしては、「勉強しなさい」である。
子供は仕方なく勉強する。すると後で母親に、「遊んでくればよかったのに」と言われる。子供は不満だけれども母親に嚙みつけない。何となく不愉快である。母親は責任を逃れている。
言葉として「好きにしなさい」と言いながら、非言語的なメッセージとしては「勉強しなさい」である。どっちに転んでも親に責任はない。
(略)親の偽善である。親がその時その時で立場を変える。だから喧嘩にならない喧嘩しかできない。
P132
「人間は皆同じだ」という教えは、純粋な人を地獄に堕とす教えである。現実の世の中には質の悪い人もいれば、質のよい人もいる。悪魔から天使までいるのが人間社会である。犬にはこれほどの違いはない。
それなのに、「人間は皆同じだ」と教えることは、純粋な人に「あなたは悪魔の餌食になれ」と言うのと同じである。断じて人間は同じではない。
(略)
搾取タイプの人も相手から取ることしか考えていない。そういう人と「仲良くする」ということは、「あなたは搾取されなさい」ということでしかない。「仲良く」という良識の内容は相手を見ないで言えば、質の悪い人の天国である。
人間ほど違わない犬でさえも同じことが起きる。五匹の犬が生まれる。そこに何も考慮しないで食事を与える。
すると気の弱い犬は食べられない。この気の弱い犬に「仲良く」ということは、「あなたは死になさい」ということでしかない。
「仲良く」という良識は、気の弱い犬を退け、あるいは無視して自分の食べたいものを食べる犬に向かって言うべきことで、五匹の犬皆に言うべきことではない。
そういえば311の頃、津波とか原発で混沌としていた時期に、他の地域に逃げる人に対して「自分だけ良ければいいのか」なんて嚙みつく人が非常に多かったが、あれもここでいうモラハラと同種の発想だろう。他人の土地を騙し取って移住するなら確かに自己中だが、危ないから他に行くというだけでどうして自分最優先という発想になるのか理解に苦しんだ。
むろんモラハラをするサディストが"目立った"のか、それとも人間だれしもそういう側面を持っている、という事なのかは定かではない。
ちなみに、Fusion360を触ってみた限り、SolidWorksのほうがずっと好印象なんだけど、SolidWorksに似たインタフェース持ってるDesignSpark Mechanicalがミラーが使えないというとんでもない欠点を抱えているので、やっぱりこっちでいこう。で、Fusion360はデータをクラウドに保存するんだけども、保存したデータを削除する方法がわからなかったのでここに書く
つもりだったんだが、
この記事書くためにFusion360起動したんですよ。そしたらなんか更新入って、日本語化されたじゃないですか。それはまあ設定の問題だろうとして、データパネル上の一覧から右クリック→削除って項目ができた訳で、とどのつまりは
意味ないなこの記事
一応書いておくと、もし上記ができない場合、右上の名前が書いてあるところから[マイ プロファイル]でWebへとんで、左上の[Data]をクリックする。現れた一覧の[○○'s First Project]などをクリックすると、ファイル一覧が出てくる。 ファイル名を右クリックするとDeleteが出てくる。
●プリミティブを配置
左上の箱の描かれたCREATEボタンをクリックすると、プリミティブ一覧が出てくる。
クリックすると、配置する面を選択する状態になるので、黄色い三面のどれかをクリック。
面にドラッグで図を描き終わると、高さ指定ができる
![]() |
![]() |
![]() |
●ブーリアン
配置するときに、Operationを指定すると、ブーリアンができる
![]() |
![]() |
●面を作る
立体の面を選択し、CONSTRUCT-Offset Planeを選ぶと、新たに面を作成できる
立体のエッジを選択し、CONSTRUCT-Plane at Angleを選択すると、自由な角度の面を作成できる
![]() |
![]() |
![]() |
●スケッチ
スケッチはSKETCHの中。
プリミティブと同じように、描画する面を選択してから描く。
![]() |
![]() |
●ロフト
面を沢山作って、そこにスケッチする。
CREATE-Loftを選択するとつなげられる
![]() |
![]() |
●スイープ
スケッチでパスを描画
CONSTRUCT-Plane Along Pathを選択
スケッチの端点を選択し、面を作成
作成した面にスイープの断面になる面を描く
CONSTRUCT-Sweepを選択。PathとProfileを指定
![]() |
![]() |
![]() |
![]() |
●PATCH
面だけで、体積を持たない、現実には存在しないオブジェクト。
一番左上のボタンを「MODEL」から「PATCH」へ変更。
普通にスケッチ描いて、CREATE→Extrudeで押し出しすると面ができる
![]() |
![]() |
![]() |
●面に厚みをつける
PATCHで面を作ったらMODELに戻ってCREATE→Thickenを選択。
厚みをつけたい面を選択して矢印で引っ張るか数値を入力する
![]() |
![]() |
●obj形式で保存
メッシュに変換してobjで保存できる。
CREATE→Create Base Featureを選択
MODFY→Mesh→BRep to Mesh
メッシュ化したいオブジェクトを選択してOK
三角形になるので、画面左のツリーの中の「MeshBody1」を右クリック→Save as obj
![]() |
![]() |
![]() |
![]() |
![]() |
http://headlines.yahoo.co.jp/hl?a=20150903-00000078-mai-bus_all
<マイナンバー>適用拡大 金融資産監視強化 改正法成立
10月から国民全員に通知されるマイナンバーを、2018年から任意で預金口座にも適用する改正マイナンバー法が3日の衆院本会議で成立し、マイナンバーの活用範囲が現在決まっている制度より広がり、国による金融資産の監視体制が強化されることになった。
究極のITオンチが年金情報を流出させたのを見て、こいつらに「個人情報」を管理させても大丈夫だと思う国民はいないと思うのだが、個人情報流出の恐ろしさという意味では、
マイナンバー占い:
あなたの名前とマイナンバーを入力してください!
なんていう詐欺に引っかかりそうな人が沢山いるとどこかの誰かが懸念していたので、一応周知しておこう。迂闊に入力するもんじゃない。
コンビニから住民票をとれるというのはメリットではあるのだが、そもそも土日祝日に役所を開けてくれさえすれば不便さの七割ぐらいは解消するので、べつにマイナンバーがうれしいわけではない。何も休むなと言ってるんじゃない。休日空けとけといっているだけである。
今の日本政府がやろうとしているくらいだからどうせろくな事ではないだろうが、徴兵制、預金封鎖を見据えてのことだともっぱらの噂である。不安に思ったらマイナンバー+上記キーワードで検索してみると良い。
さて、普段なんとなく使っているglViewportだが、画面を四分割したくなって混乱したのでここに挙動を整理。
glViewportは基準点がウィンドウの左下なので、ウィンドウズの左上基準で考えると混乱する。
あとglClearでの指定はglViewportの範囲内だと思っていたのだが、描画領域全部らしいと初めて知った。何年GLいじってるんだ私は。
void wm_Paint(HWND hwnd){ RECT rect; GetClientRect(hwnd,&rect); long width = rect.right; long height = rect.bottom; HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hwnd , &ps); wglMakeCurrent(hdc,hRC); glClearColor(0 , 0 , 0 , 0); glClear(GL_COLOR_BUFFER_BIT); //緑の四角を描画 glViewport(0,0,width/2,height/2); glColor3d(0,1,0); glRectd(-0.5,-0.5,0.5,0.5); //青の四角を描画 glViewport(0,height/2,width/2,height/2); glColor3d(0,0,1); glRectd(-0.5,-0.5,0.5,0.5); //赤の四角を描画 glViewport(width/2,0,width/2,height/2); glColor3d(1,0,0); glRectd(-0.5,-0.5,0.5,0.5); //黄色の四角を描画 glViewport(width/2,height/2,width/2,height/2); glColor3d(1,1,0); glRectd(-0.5,-0.5,0.5,0.5); glFlush(); SwapBuffers(hdc); wglMakeCurrent(0,0); EndPaint(hwnd , &ps); }
あれだ。サンプル作れといわれたので即興で書きました。仕事は普段CLIなんで個人的には使う機会すくないです。
#include <stdio.h> #include <process.h> //スレッドを使用するために読み込む #include <windows.h> //HANDLE型のために読み込む //スレッドのサンプル(Windows,C言語, beginthread版) #define COUNT 40 //スレッドとなる関数 戻り値void , 引数void*、呼び出し規約__stdcall指定の関数である必要がある unsigned __stdcall Thread_Function(void* p); //スレッドに渡す引数を束ねた構造体 struct arg_forThread{ HANDLE hMutex; int uid; int start; int end; int *pInteger; double* pDouble; int *pprogress; }; //////////////////////////////////////////////////////// //エントリポイント //////////////////////////////////////////////////////// int main(int argc,char* argv[]){ //処理内容 //Integer配列の中身を1/2した結果をDouble配列に格納します。 int Integer[COUNT]; //元データが入った配列 double Double[COUNT]; //結果を格納する配列 HANDLE hMutex; //排他処理用の変数 HANDLE hThread[2]; int progress = 0; for(int i = 0; i < COUNT; i++){ Integer[i] = i; } //スレッド開始の前に排他処理の設定 hMutex = CreateMutex(NULL,FALSE,NULL); //引数を設定 arg_forThread arg1 = { hMutex, 0, 0, COUNT/2-1, Integer, Double, &progress }; //引数を設定 arg_forThread arg2 = { hMutex, 1, COUNT/2, COUNT-1, Integer, Double, &progress }; //スレッド開始 //スレッドどなる関数へは引数を一つしか渡せないため、void*へキャストした構造体のインスタンスへのポインタを渡す hThread[0] = (HANDLE)_beginthreadex( NULL, 0, Thread_Function , //スレッドとして走らせる関数を指定 (void*)&arg1, //(Thread_Function)が受け取る引数 0, //すぐ実行 NULL ); hThread[1] = (HANDLE)_beginthreadex( NULL, 0, Thread_Function , //スレッドとして走らせる関数を指定 (void*)&arg2, //(Thread_Function)が受け取る引数 0, //すぐ実行 NULL ); //両方のスレッドが終了するまで待ちます。 //スレッドがすべて終了するまでフリーズすることになります。 WaitForMultipleObjects(2,hThread,TRUE,INFINITE); CloseHandle(hThread[0]); CloseHandle(hThread[1]); CloseHandle(hMutex); getchar(); //結果をゆっくり見るためのgetchar return 0; } unsigned __stdcall Thread_Function(void* p){ //引数を受け取る struct arg_forThread* parg = (arg_forThread*)(p); HANDLE hMutex = parg->hMutex; int uid = parg->uid; int start = parg->start; int end = parg->end; int* pInteger = parg->pInteger; double* pDouble = parg->pDouble; int* pprogress = parg->pprogress; for(int i = start; i <= end; i++){ Sleep(uid?7:3); //重い処理を入れないと結果がわかりにくい pDouble[i] = pInteger[i]/2.0; //処理本体 //Mutexは同一領域に書き込まない場合は必要ないので、呼出元でstart-endがダブらないようにしているpDoubleに対してはかける必要がない //pprogressが指す先のメモリは同時に変更される可能性があるので、排他処理をしないといけない WaitForSingleObject( hMutex , INFINITE ); //他のスレッドから参照できなくする (*pprogress)++; printf("%s\t%.2lf%%\t%d %lf %d\n",uid?"*":"***",(double)(*pprogress)/COUNT*100,i, pDouble[i],pInteger[i]); ReleaseMutex( hMutex ); } return 0; }