はてなキーワード: Beginとは
https://oomnitza.zendesk.com/hc/en-us/community/posts/360041943414-26-03-2020-Место-под-солнцем-29-серия-смотреть-бесплатно-в-хорошем-качестве-от-26-марта-
https://oomnitza.zendesk.com/hc/en-us/community/posts/360041947494--В-шаге-от-рая-17-серия-Россия-1-26-03-2020-смотреть-бесплатно-в-хорошем-качестве-
https://oomnitza.zendesk.com/hc/tvv/community/posts/360042121373-26-03-2020-Жизнь-после-жизни-9-серия-смотреть-качество-HD-от-26-марта
https://oomnitza.zendesk.com/hc/yjb/community/posts/360042126793-26-03-2020-В-шаге-от-рая-15-серия-Россия-1-смотреть-бесплатно-в-хорошем-качестве-
https://oomnitza.zendesk.com/hc/en-us/community/posts/360041949154--Доктор-Вера-15-серия-26-03-2020-качество-HD-от-26-марта-
https://oomnitza.zendesk.com/hc/tvv/community/posts/360041947494--В-шаге-от-рая-17-серия-Россия-1-26-03-2020-смотреть-бесплатно-в-хорошем-качестве-
https://oomnitza.zendesk.com/hc/tvv/community/posts/360042121893--Жизнь-после-жизни-11-серия-26-03-2020-смотреть-качество-HD-от-26-марта-
https://oomnitza.zendesk.com/hc/ltv/community/posts/360041942874--Место-под-солнцем-27-серия-26-03-2020-смотреть-качество-HD-
https://oomnitza.zendesk.com/hc/yjb/community/posts/360041942874--Место-под-солнцем-27-серия-26-03-2020-смотреть-качество-HD-
https://oomnitza.zendesk.com/hc/en-us/community/posts/360041949454--Доктор-Вера-17-серия-26-03-2020-хорошее-качество-смотреть-от-26-марта-
https://oomnitza.zendesk.com/hc/en-us/community/posts/360042127973--Отречение-23-серия-украина-26-03-2020-в-хорошем-качестве-от-26-марта-
https://oomnitza.zendesk.com/hc/ltv/community/posts/360041949614--Доктор-Вера-17-серия-26-03-2020-качество-HD-
https://oomnitza.zendesk.com/hc/yjb/community/posts/360041943614-26-03-2020-Отражение-радуги-11-серия-в-хорошем-качестве-от-26-марта-
https://oomnitza.zendesk.com/hc/yjb/community/posts/360042128353--Отречение-25-серия-украина-ТРК-26-03-2020-хорошее-качество-смотреть-от-26-марта-
https://oomnitza.zendesk.com/hc/ltv/community/posts/360042125953--Отражение-радуги-13-серия-26-03-2020-смотреть-в-хорошем-качестве-
https://oomnitza.zendesk.com/hc/tvv/community/posts/360042122893-26-03-2020-Отражение-радуги-11-серия-последние-серии-смотреть-
https://oomnitza.zendesk.com/hc/tvv/community/posts/360042126173-26-03-2020-В-шаге-от-рая-13-серия-Россия-1-все-серии-сезона-
https://oomnitza.zendesk.com/hc/ltv/community/posts/360041949514-26-03-2020-Доктор-Вера-17-серия-смотреть-качество-HD-от-26-марта
People are joking about politicians trying to ban anime. But it's no joking matter. If those politicians succeed, then soon fans will begin to be arrested. Netflix will cancel shows. Amazon will receive warrants to give up data on its customers. All for what? https://t.co/oLW9lc5Ln4— Prostasia Foundation (@ProstasiaInc) 2020年2月28日
こちらの記事を至急ご覧ください。例のオーストラリアの議会演説の裏側にいたConnie Bonarosとヒューマンライツ・ナウの伊藤和子が会っている写真が掲載されています。この記事によると、「日本の規制派」は海外の外圧を要請しており、Connie Bonarosはその声に応えたいと。https://t.co/aWAxhhvfHi— alamaineu (@alamaineu) 2020年2月28日
BBCの番組。
「日本は子供を性的に搾取」
BBCに協力する「伊藤和子」氏。 pic.twitter.com/1RTR1zZWh0— 青いクラゲ (@masugominikatu) 2020年2月21日
大方またECPATかヒューマンライツナウ辺りだろうとは思っていたけどまんま予想通りだと笑えないね。
しかしこの人達昔からこの手の海外を使ったポリシーロンダリング所謂マッチポンプを使う手口が当時から全く変わっていないから呆れ果てるよね。
当時の児童ポルノの件にしても国連の件にしてもそうだけど、この手の手法は当時から行っている事だから。
でも最近ではこの手の手法を多用しすぎた事でその手口も世間に認識され、尚且つ創作物規制を行った国では日本より遥かに犯罪率が高い現状をみても効果がないか悪化を招いたのは事実なのに今だ児童ポルノや子供を盾にすれば、規制を推し進めるのも許されると言う思い上がりが本当に腹が立つよね。
現状どう見てもこの手の規制の弊害が出てしまっているのは事実だし、これ等の規制は捜査の撹乱を逆に非難されても良い状況にまでなりつつあるのにね。
何より今までこの手の創作物規制を推し進めていた国連やらキリスト教内部やらで実在児童に対して性的虐待が多く行われていましたと言う事実もある訳だし。
それこそまたいつもの様にこの手の規制を進めようとしていた人が実は実在児童に対して性的虐待を行う人でしたと言ういつものパターンもあり得るかもね(苦笑)
それと当時から反捕鯨や環境問題には多くのフェミニスト団体が関係していたのは指摘されていたし、この件でも指摘されているのを見てもそういう事なのだろうと思う。
本当にこの人達はただ自分の嫌いなものを潰す為に児童ポルノやら子供の権利を悪用して、実在児童保護に関しては寄り状況を悪化させているのだから最悪だと思う。
愛犬を焼き殺したり自分の尿を飲ませたり暗殺のために病院を爆破したりと、暴力に次ぐ暴力描写で頭のネジが吹っ飛んでる漫画だが、原作者は『美味しんぼ』の雁屋哲。
ヤクザの青年と官僚の青年のデュアル主人公が、二人三脚で片方は暴力で、もう片方は政治の力で日本を変えようとする漫画。
ヤクザの方は日本の暴力団→マカオのマフィア→共産党の重鎮→習近平と中国の中枢に接近し、日本の国防上の驚異を無くすため中国の民主化を画策する。
官僚の方は政治家になり「沖縄から米軍基地を追い出すには、核武装と40歳"以上"の徴兵制が必要だ」と主張して、米国依存からの脱却を目指す。
自立しようとする日本に激怒した米国は中国に「尖閣諸島に侵略して良いよ。黙ってみてるから。これで日本も米軍の有り難みが分かるだろ」と密約して…みたいな話。
主人公は、アレクサンドロス大王に仕えた書記官エウメネス。
アレクサンドロス大王と言えば、「世界の果てに到達する」というジャンプ漫画的な夢を持ってヨーロッパから中東、アジアあたりまで進攻したものの、部下たちから「もう勘弁してくれ」と悲願され帰還。死ぬ間際に「一番強えヤツが俺の後継者だ!」と大迷惑な遺言を残し王国分裂を招いたことで知られる大英雄。
そんなアレクサンドロス大王をそばで見守り歴史に記録するのが主人公の仕事。漫画の中のアレクサンドロス大王はまだ青年に成り立ての歳で、歴史に残るようなことは成し遂げていない。ひょっとしたら今後「歴史書に残された記述は主人公が歴史改竄したデマだった」なんて展開もあるかもしれない。
import random
''.join(random.SystemRandom().choice(string.ascii_letters) for _ in range(8))
パスワードも許されている文字の範囲を気にしつつこんな感じで作ってる。
{
std::string input = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::random_device rnd;
input.end(),
8,
rnd);
std::cout << result << std::endl;
return 0;
}
今、黒いレザーのライダースジャケットを探している。
以前着ていたものはものは合皮が劣化してしまい、ある日ポロポロと崩れてきた。
余計なところにポケットがついていたり、シンプルすぎたりちょうどいいものはなかなかない。
次の休日には、先週届いた青いスカートを履くのを楽しみにしている。紺ではなく原色に近いロング。
白いトップスを合わせたいけど、どんなのにしようか悩んでいる。
今はsnidelのノースリーブブラウスを合わせるつもりでいるが、他にも合うものを探したい。
女性の服っていいよねー。
男性には男性のおしゃれがあるしそっちを楽しめばいいかと思うんだろうが、
私はBeginよりもFINEBOYSよりもLEONよりもPOPEYEよりもwithやmoreやminaやSPURやFEDGEが好きである。
SQLアンチパターンではないが、デッドロックについても投げっぱなしのあのSELECT FOR UPDATEの説明はなんなのかね。
1回のトランザクションでupdateを2回発行する場合と1回のSQLで複数行のアップデートをする時はデッドロックのリスクを考慮するってだけで、かなり初心者にはありがたいと思うんだけどね。
tA =# begin; tA =# update t1 set column = value where id = 1; tB =# begin; tB =# update t1 set column = value where id = 2; tA =# update t1 set column = value where id = 2; tB =# update t1 set column = value where id = 1; tB =# ERROR: デッドロックを検出しました
tA =# begin; tA =# update t1 set column = value where id = 1; tB =# begin; tB =# update t1 set column = value -- update all record tA =# update t1 set column = value where id = 2; tA =# ERROR: デッドロックを検出しました
あと、先勝ち後負けを実現するのはSELECT FOR UPDATEではなく楽観的ロックな。
tA =# begin; tA =# select updated_at from t1 where id = 1; updated_at ---------------------------- 2019-03-24 06:17:37.952893 tB =# begin; tB =# select updated_at from t1 where id = 1; updated_at ---------------------------- 2019-03-24 06:17:37.952893 tA =# update t1 set column = column - 1 where id = 1 and update_at = '2019-03-24 06:17:37.952893' and column > 0; UPDATE 1 tB =# update t1 set column = column - 1 where id = 1 and update_at = '2019-03-24 06:17:37.952893' and column > 0; UPDATE 0
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // int blocks[100][100]; BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); for(int x = 0 ; x < 100 ; x++) { for (int y = 0; y < 100; y++) { blocks[y][x] = 0; } } if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 100 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBoxOLDBox() { int width = 24; HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 48)); for (int y = 0; y < 30; y++) { for (int x = 0; x < 8; x++) { if (blocks[y][x] == 0) { continue; } RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); } } DeleteObject(hBrush); return FALSE; } BOOL WriteBox() { WriteBoxOLDBox(); switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } return TRUE; } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 246 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB( 246 , 48 , 48)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL SaveBoxI() { blocks[y ][x] = 1; blocks[y+1][x] = 1; blocks[y+2][x] = 1; blocks[y+3][x] = 1; return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 20) { switch (boxType) { case 0: SaveBoxI(); break; case 1: break; case 2: break; } y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey(WPARAM wParam) { if (wParam == VK_LEFT) { x++; } if (wParam == VK_RIGHT) { x--; } return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(wParam); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
テトリス風
落ちてくるブロックの描き方
まずはブロックの種類は3種類
の違いをよく見比べて
自力で違いがわかれば
プログラマーにはなれるとおもう
とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな
BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; boxType = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } int boxType; BOOL WriteBox() { switch (boxType) { case 0: return WriteBoxI(); case 1: return WriteBoxL(); case 2: return WriteBoxZ(); } } BOOL WriteBoxZ() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxL() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) -1 ; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) -1; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.left += width; Rect.right += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL WriteBoxI() { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); int width = 24; RECT Rect = { 0,0,48,48 }; BOOL ret; Rect.left = width * x + 1; Rect.right = width * (x + 1) - 1; Rect.top = width * y + 1; Rect.bottom = width * (y + 1) - 1; ret = FillRect(hdc, &amp;Rect, hBrush); //Rect.left += width; //Rect.right += width; Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); Rect.top += width; Rect.bottom += width; ret = FillRect(hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; boxType++; if (boxType > 2) { boxType = 0; } } this->WriteBox(); return TRUE; } BOOL OnKey() { x++; return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
第何回だろうな
まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ)
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); x = 0; y = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int x; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48*9,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; Rect.left = 48 * x; Rect.right = 48 * (x+1); Rect.top = 48 * y; Rect.bottom = 48 * (y+1); if (x > 8) { x = 0; } if (x <0) { x = 8; } if (y > 8) { y = 0; } BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } BOOL OnKey() { x++; return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_KEYDOWN: { MyWindow *target = MyWindow::find(hWnd); target->OnKey(); } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); y = 0; hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL run; int y; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); run = true; int rc; // メイン メッセージ ループ: while (run) { DWORD obj = MsgWaitForMultipleObjectsEx(0, NULL, 100 , QS_PAINT| QS_ALLEVENTS,0); if (obj <= WAIT_OBJECT_0) { while (PeekMessage(&amp;msg, NULL, 0, 0, PM_REMOVE)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } if (msg.message == WM_QUIT) { run = FALSE; } if (msg.message == WM_CLOSE) { run = FALSE; } } } else if (obj == WAIT_TIMEOUT) { y++; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); this->OnPaint(ps); EndPaint(hWnd, &amp;ps); ::UpdateWindow(hWnd); RECT Rect2 = { 0,0,48,48 * 8 }; InvalidateRect(hWnd, &amp;Rect2, TRUE); } else if (obj == WAIT_FAILED) { rc = GetLastError(); } else { } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HDC hdc = GetDC(hWnd); HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; Rect.top = 48 * y; Rect.bottom = 48 * (y+1); if (y > 8) { y = 0; } BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
青い■を表示するだけ
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); // メイン メッセージ ループ: while (GetMessage(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } } return TRUE; } BOOL OnPaint(PAINTSTRUCT &amp;ps) { HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246)); RECT Rect = { 0,0,48,48 }; BOOL ret = FillRect(ps.hdc, &amp;Rect, hBrush); DeleteObject(hBrush); return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(ps); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
次の解説
staticキーワードを付けることで
これでHWNDを通して
static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; }
解説を入れておくと
std::list&lt; MyWindow *&gt; windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list&lt; MyWindow *&gt;::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } }
// WindowsProject7.cpp: アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include "WindowsProject7.h" #define MAX_LOADSTRING 100 // グローバル変数: HINSTANCE hInst; // 現在のインターフェイス WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名 // このコード モジュールに含まれる関数の宣言を転送します: //ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); #include <list> class MyWindow; std::list< MyWindow *> windows; class MyWindow { public: HWND hWnd; MyWindow() :hWnd(NULL) { windows.push_back(this); } virtual ~MyWindow() { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { if (*it == this) { windows.erase(it); break; } } } static MyWindow * find(HWND key) { std::list< MyWindow *>::iterator it; for (it = windows.begin(); it != windows.end(); it++) { MyWindow *target = *it; if (target->hWnd == key) { return target; } } return NULL; } // // 関数: MyRegisterClass() // // 目的: ウィンドウ クラスを登録します。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT7)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT7); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&amp;wcex); } // // 関数: InitInstance(HINSTANCE, int) // // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。 // // コメント: // // この関数で、グローバル変数でインスタンス ハンドルを保存し、 // メイン プログラム ウィンドウを作成および表示します。 // BOOL InitInstance() { hInst = hInstance; // グローバル変数にインスタンス処理を格納します。 ATOM c = MyRegisterClass(hInstance); hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); if (!hWnd) { return FALSE; } return TRUE; } BOOL ShowWindow() { BOOL ret; ret = ::ShowWindow(hWnd, SW_SHOW); ::UpdateWindow(hWnd); return ret; } HINSTANCE hInstance; MSG msg; BOOL Main() { HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT7)); // メイン メッセージ ループ: while (GetMessage(&amp;msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &amp;msg)) { TranslateMessage(&amp;msg); DispatchMessage(&amp;msg); } } return TRUE; } BOOL OnPaint() { return TRUE; } }; int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: ここにコードを挿入してください。 // グローバル文字列を初期化しています。 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT7, szWindowClass, MAX_LOADSTRING); //MyRegisterClass(hInstance); MyWindow win; win.hInstance = hInstance; // アプリケーションの初期化を実行します: if (!win.InitInstance()) { return FALSE; } BOOL ret; win.ShowWindow(); ret = win.Main(); if (ret) { return 0; }else { return (int)win.msg.wParam; } } // // 関数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: メイン ウィンドウのメッセージを処理します。 // // WM_COMMAND - アプリケーション メニューの処理 // WM_PAINT - メイン ウィンドウの描画 // WM_DESTROY - 中止メッセージを表示して戻る // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 選択されたメニューの解析: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &amp;ps); MyWindow *target = MyWindow::find(hWnd); target->OnPaint(); // TODO: HDC を使用する描画コードをここに追加してください... EndPaint(hWnd, &amp;ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // バージョン情報ボックスのメッセージ ハンドラーです。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
In 2001 Kofi Annan received the Nobel Prize in conjunction with the United Nations.
The focus of his speech was global inequality.
"Ladies and gentlemen,
Today in Afghanistan a girl will be born.
Her mother will hold her, feed her and comfort her and care for her just as any mother would anywhere else in the world.
In those most basic acts of human nature, humanity knows no divisions.
But to be born a girl in Afghanistan today, is to begin life centuries away from the prosperity that one small part of humanity has achieved.
Even thought her mother would do all in her power, to protect her and sustain her.
There is a one in four risk that the girl will not live to see her fifth birthday.
Whether she does is just one of the tests of our common humanity of our belief in our individual responsibility for our fellow men and women.
But it is the only test that matters.
Remember this girl then our large aims to fight poverty, prevent conflict or cure disease will nothing distant or impossible.
Indeed those aims would seem very near and very achievable as they should.
Because beneath the surface of stats and nations, ideas and language lies the fate of individual human beings in need.
Answering their needs will be the mission of the United Nations in the century to come.
「え、次はなにって?」\\
STAFF「ですので、みなさんの力を結集して
世界で一番のラズベリー・パイを作っていただこうと………」\\
〜メンバー宅〜\\
「いきなり呼び出してどうしたんですか………?」\\
「マドモアゼル、お忙しいところをすまない。東京村の新企画はご存知ですかな?」\\
「ええ、パイを作るとかなんとか………」\\
「スタッフめ。俺たちに無理させてまで番組を大きくしようとしやがって………
だが俺は俺の席がそこにある限り続けていくしかないんだ。
……… ところで君は女の子がなにで出来ているか知ってるかね?」\\
「マザーグースでは``砂糖''と``スパイス''と``素敵なもの''って……… まさか!!」\\
「そのまさかだ。君にはラズベリー・パイの材料になってもらう」\\
「いや……… あの……… 砂糖とかスパイスって比喩的なもので………」\\
「なんだ?出し惜しみするのか?」\\
「ちょっ///// いきなり……… いきなり口に………//////
ボバーーーーーーーーーーーーーン!!!!!\\\\
「な、なに今のは………??」\\
エベン・アプトン\footnote{Raspberry Pi Foundationの創始者。}!!!!\\
助けてくれたんですね!!でもどうしてここに………?」\\
「ホンモノのラズベリー・パイを教えるのが俺のミッションなのさ」\\
「かっこいい………!ありがとう!!エベン・アプトン!!!」\\\\
\begin{flushright}
どれほど人は見上げねばならぬのか
ほんとの空をみるために
どれほど多くの耳を持たねばならぬのか
どれほど多くの人が死なねばならぬのか
死が無益だと知るために
その答えは 風に吹かれて
(Bob Dylan ``Blowin' In The Wind'' 訳・壺齋散人)\\
\end{flushright}
False friendsとは、二つの外国語で綴りが似ているが意味が違う単語のこと。特に、世界中のほとんどで非英語話者は英語を第一外国語として学習すると思うので、第二外国語を学ぶときに英語とのfalse friendsについて注意しないといけない。ここでは特に英語と仏語について特に述べます。
たとえば英単語 "library(ライブラリー)" は図書館だが、仏単語 "libraire(リブレール)" は本屋である。仏語で図書館はbibliothèque(ビブリオテーク)、逆に英語の本屋は、もちろんbookstore。
この例から、false friendsが学習上問題になることがわかると思う。そんなfalse friendsを挙げていこうムーブメント。
今回は下の記事を例にしよう!(というか下の記事を見たのでこれを書こうと思った)
Trump dossierとは何かというと、アメリカのCIA、FBI、NSAによる「プーチンがサーバー攻撃をしかけた」という報告書のこと。つまり"dossier"は、英語では「調査・捜査資料、関係書類」という意味になるようだ。
この単語は仏語にもあり・・・というよりは明らかに仏語発祥で、こちらでの意味は単に書類、つまりdossier (fr.) = file (en.)となる。しかしdossier (fr.) != dossier (en.)というわけ。
このように、仏単語と同じつづりの英単語が、仏語よりもかなりフォーマルな意味を持つということはよくある。
たとえばcommencer (fr.)は単に始まるを意味しstartやbeginと同じ程度だが、commence (en.)はめちゃくちゃ厳かな開始で、例えば戦争が始まるときとかに使うレベル。
こういうのはなぜかというと、かつてノルマン時代にイギリスはフランス貴族に占領され、その後も長らく貴族は英語よりも仏語を嗜むのがよいとされたため、上流階級の使う単語的なものが仏語で、一般的な言葉が英語という住み分けがなされたらしい。他に有名なのは、英語では生きた牛はcow、食べる牛はbeefだが、仏語ではどちらもbœuf。牛を飼う下層民はアングロサクソン系のcowと呼び、牛を食べる貴族は仏語でbeefと読んでいたという身も蓋もない言い伝えだ。
英語の不規則動詞はおおまかに,過去分詞がtかdで終わるもの(以下dtタイプ)とnで終わるもの(以下nタイプ)に分けられる。ほとんどのdtタイプの動詞は過去形と過去分詞形が同じ形で,A-B-B(一部はA-A-A)のように変化する。また,原形の末尾がdかtの不規則動詞はほとんどがdtタイプに属する。(例外:eat,get,bid等)一方,ほとんどのnタイプの不規則動詞は原形,過去形,過去分詞形がすべて異なり,A-B-Cのように変化する。
原形から過去・過去分詞形になるときに起こる変化は基本的に母音が変化するか末尾にdtnが加わるかの2種類,あるいはその両方で,原形にあった子音がなくなることは原則としてない。(例外:-ught型,went,had,made)
分類は以下の通り
become,forgetなど末尾にほかの不規則動詞を含むものは省いた。
表中の*は規則変化もし得ることを,#は他の不規則変化もし得ることを,!は意味によって変化が異なる単語であることを示す。
すべてdかtで終わる。特に末尾tで短母音のものが多い。get,sitが含まれないことに注意。形が1種類で覚えやすいが,英文中の「have put」「is put」等を見てもビビらない心構えが必要。
bet * | bust * | cast | cost | cut |
hit | knit! | let | put | quit * |
set | shit *# | shut | sweat * | thrust |
wet* | burst * | hurt | beat # | bid # |
clad | glid * | rid* | shed | spread |
wed* |
原形がdで終わる動詞が母音を変化させて過去形・過去分詞形になる型。最後のplead,readは発音のみ変化する。
breed | bred |
feed | fed |
lead | led |
plead *# | pled |
speed ! | sped |
tread # | trod |
bind | bound |
find | found |
grind | ground |
wind | wound |
chide *# | chid |
slide # | slid |
hold | held |
stand | stood |
abide * | abode |
plead *# | plead |
read | read |
原形の末尾のdがtに置き換わり,それ以外は綴りも発音も変わらない。endで終わる動詞が多いが,end自体は規則動詞。原形のほうが過去形っぽく見えたりするので注意が必要。逆パターン(At-Ad-Ad)は存在しない。
bend | bent |
lend | lent |
rend | rent |
send | sent |
spend | spent |
build | built |
geld * | gelt |
gird * | girt |
【Ad-Bd-Bd】の末尾tバージョン。get,sitはこちらに含まれる。
fight | fought |
light * | lit |
meet | met |
shoot | shot |
get # | got |
shit *# | shat |
sit | sat |
末尾にdが加わるという点で規則動詞に近いが,付き方が特殊で母音も変化する。
lay | laid |
pay | paid |
say | said |
sell | sold |
tell | told |
hear | heard |
flee | fled |
shoe * | shod |
baa * | baa'd |
make | made |
have | had |
末尾にtが加わる。原形の/iː/が/e/に変化するものが多い。
feel | felt |
keep | kept |
sleep | slept |
weep | wept |
creep | crept |
kneel * | knelt |
sweep | swept |
leave | left |
bereave ! | bereft |
cleave *# | cleft |
deal | dealt |
mean | meant |
dream * | dreamt |
lean * | leant |
leap * | leapt |
lose | lost |
spoil * | spoilt |
burn * | burnt |
learn * | learnt |
dwell | dwelt |
smell * | smelt |
spell * | spelt |
spill * | spilt |
drip * | dript |
grip * | gript |
wrap * | wrapt |
pen * | pent |
末尾が-oughtか-aughtに変化する。どちらも発音は/ɔːt/。wentを除けばもっとも原型をとどめない変化が起こるので過去形から原形を思い出せるようにしておく必要がある。
beseech * | besought |
bring | brought |
buy | bought |
overwork * | overwrought |
seek | sought |
think | thought |
catch | caught |
teach | taught |
過去分詞形が原形+nとなるもの。過去形では母音が変化している。fall,eatにはenが,do,goにはneが付くことに注意。
blow | blew | blown |
grow | grew | grown |
know | knew | known |
throw | threw | thrown |
draw | drew | drawn |
shake | shook | shaken |
take | took | taken |
drive | drove | driven |
rise | rose | risen |
strive | strove | striven |
thrive * | throve | thriven |
see | saw | seen |
give | gave | given |
eat | ate | eaten |
fall | fell | fallen |
do | did | done |
go | went | gone |
【A-B-An】の亜種で,showに代表される過去形が規則変化(-ed)になっているもの。
grave * | graved | graven |
hew * | hewed | hewn |
mow * | mowed | mown |
prove * | proved | proven |
saw * | sawed | sawn |
sew * | sewed | sewn |
shave * | shaved | shaven |
show * | showed | shown |
sow * | sowed | sown |
strew * | strewed | strewn |
過去分詞形が過去形+nとなるもの。eが脱落するtear-tore-tornのパターンに注意。wakeはtake,makeと異なり,この型に属する。
break | broke | broken |
cleave *# | clove | cloven |
freeze | froze | frozen |
speak | spoke | spoken |
steal | stole | stolen |
weave ! | wove | woven |
shrink # | shrunk | shrunken |
wake | woke | woken |
bear ! | bore | born |
swear | swore | sworn |
tear | tore | torn |
wear | wore | worn |
bear ! | bore | borne |
原型にd,tを含み,過去分詞形でそれが重なるもの。get以外は【A-B-An】に近いがgetは【A-B-Bn】に近い。
smite # | smote | smitten |
ride | rode | ridden |
write | wrote | written |
bite | bit | bitten |
chide *# | chid | chidden |
hide | hid | hidden |
slide | slid | slidden |
bid # | bade | bidden |
forbid # | forbade | forbidden |
forbid # | forbad | forbidden |
get # | got | gotten |
過去分詞形にnが付くが,【A-B-An】でも【A-B-Bn】でもないもの。
fly | flew | flown |
lie | lay | lain |
slay | slew | slain |
shear * | sheared | shorn |
swell * | swelled | swollen |
tread # | treaded | trodden |
原型にiを含み,それがi-a-uと変化していくもの。わかりやすい変化だが数は少ない。
begin | began | begun |
drink | drank | drunk |
ring | rang | rung |
shrink # | shrank | shrunk |
sing | sang | sung |
sink | sank | sunk |
spring # | sprang | sprung |
stink # | stank | stunk |
swim | swam | swum |
dt型でないが,A-B-CではなくA-B-Bと変化するもの。末尾が-ingのものが多いが,bringやring,singが含まれないことに注意。
cling | clung |
fling | flung |
sling | slung |
slink | slunk |
spling # | splung |
sting | stung |
stink | stunk |
string | strung |
swing | swung |
wring | wrung |
hang ! | hung |
dig | dug |
stick | stuck |
strike | struck |
heave ! | hove |
reeve * | rove |
stave * | stove |
shine ! | shone |
win | won |
dive * | dove | dived |
smite # | smote | smit |
beat # | beat | beaten |
come | came | come |
run | ran | run |
今回はモアイ
第70回ちばてつや賞の受賞作への雑感。
舞台はもちろん、日常まで漫才の延長線上なノリは、テーマをとても意識しており一貫している。
一つ一つのネタ自体は実のところ、そこまで上手くも面白いとは思わないんだけれども、ちゃんと作りこんであるということが伝わってくる出来だと感じた。
テーマ自体が難しい題材でありながら、細かいところでコマ割やフキダシを使い分ける演出は、読者がノリを迷いにくいようする配慮にもなっていて感心した。
主役にセリフがほぼないこともあって、キャラクターをひたすら動かしているだけの描写が多いね。
無口な分、ストーリー上で主役の行動理由を言葉で説明しなくても読者に伝えるために丁寧に見せる工夫は多少あったほうがいいだろうからね。
けれども、個人的には「そんなに丁寧に描かんでも」、「たるいなあ」と思ってしまった。
それで、なお読みかえさないと分かりにくい箇所も多少あるので、演出上必要なことも大事だが、構成上分かりやすいことも大事かなあ。
ちょっと不思議な設定を含ませた話と見せかけて……という構成はいい感じ。
後半に明かされる「てっちゃん」の隠された真実ってのは、それなりに意味も納得できる理屈も提示されているんだけれども、それ以外が舞台装置的かつ必然性も感じないかなあ。
あと、個人的に「おっ」と思ってフックがかかるシーンがなかった。
ほおー、謎の生物の生態を調べ、そこからドラマを紡いでいくというのがいい。
この生物のメカニズムが徐々に紐解かれ、そこから真相が読み解かれる構成が引き込まれる。
ただ、所々入る回想らしきシーンの描写は、演出の工夫は評価したいんだけれども、やや分かりにくいところがあったかなあ。
主人公が四苦八苦したり、赤ん坊とのやり取りがコミカルで楽しい。
読後感もよろしいが、割と肝心な部分を省略したりして解決させているのが気がかりかな。
主人公と赤ん坊との対話が本筋だから、はしょっても問題ないとはいえ、そこに力を入れて描きたいがために、他がやや杜撰な印象も感じた。
あと、異質な設定の赤ん坊であるにも関わらず素性が明確に明かされないままなこともあって、父と子のハートフルストーリーや、主人公の芸能界による再構成物語と本筋がブレていると感じる部分もあった。
キャラクター自体はデザイン含めてさっぱり気味なんだけれども、背景とか細々とした箇所は丁寧に描かれていて全体的に華やか。
心情描写含めて、言葉で説明しすぎなキライがあるのが気がかりかな。
夢か幻想のような状態でとある人物たちの対話シーンがあるのだが、ここは言葉で説明しすぎ問題が特に顕著で、演出力は総じてイマイチ。
あーいう場面こそ丁寧な絵で彩って演出したほうがいいと思うんだけれどもね。
主人公自身のバックボーン、葛藤や、それゆえの問題解決のための言動にも説得力が出ている。
生徒が小学生というのもあるが、小難しい理屈を捏ねずに主人公なりにベストなアンサーにたどり着く過程は無理がなく読後感もよろしい。
強いて言うなら、やや人物相関や設定が読みきりとしては過多に感じたかな(このあたり主人公の言動に説得力を持たせたり、感情移入させる一助になっているので、一概にいらないとはいいにくいが)。
絵が全体的にカタいなあ、ぎこちない。
いや、身もふたもないことをいえば上手くないってことなんだけれども。
題材自体は興味深いんだけれども、作者の力量がそれについてこれていない。
やや荒い絵だけれども、魅せ方を多少理解しているのかボクシングシーンでは熱量が伝わってくる。
ストーリーやセリフ回し含めて、それっぽいことを言って煙に巻いている構成が気になるかなあ。
そこまで一つの作品に長々と感想書いているわけでもないのに、結構時間かかってしまった。
総括としてはレベル高くて、かつジャンルやテーマも多種多様だったかな。
私があんまり直接的に褒めるような感想を書かないからアレだと受け取られているかもしれないけれども、ベクトルこそ違えど総合的にはどれも良かったよ。
まあ今回の中で、私が単純に好きな作品となると『先生失格!』や『海へ還る』かなあ。
大賞が上手いってことは分かるので、それに異議を唱えるつもりはないけれども。