「ToP」を含む日記 RSS

はてなキーワード: ToPとは

2019-01-28

嵐の活動休止

いや、大して国民全員興味ないよ

なんでTOPニュースレベルの大騒ぎなんだよ

芸能ニュールのTOPくらいでいいだろ。なんで国家の損失みたいな空気なの?

2019-01-26

貧乏くじひきまくった時の話

ふと貧乏くじひきまくる中学生時代を思い出したので吐き出し。

自分コミュ障なりそこそこ青春謳歌した。

当時は溢れ出る正義感と、ずっとつるむ友達はいない程度のコミュ力、そこそこの成績もあって

委員長的なのを押し付けられたもした。

そういったものに喜んでたのも小学校中学年くらいまでで、

どんどん「まとめあげる」的な中間管理職的なことの難しさだとか、

色々言われるのにも疲れて正直「向いてないな」って思ってた。

でも学期ごとのそういったもののの選出は名前が上がり、向いてないと正直に言いつつも結局やることになるのがほとんどだった。


それでも、文化祭だとか祭りごとは大好きで、

行事のための看板製作などは喜んで参加してたし、そうのには関わることはしたいと思ってた。

そういったものに最も関われるのは何か? そう、生徒会だ。

その流れで生徒会立候補するのは、自分でもまっとうな理由だったと思っている。

だがしかし、そこには大きな壁があった。

生徒会は内申にしっかり書かれ、影響する。そのため、やりたがる人間が多かったのだ。



自分中学校の生徒会選挙は1年任期。毎年3学期に1,2年が、投票する。

正直、自分容姿は良くない。演説もうまくない。

そこそこ付き合いのある同学年はともかく、何もしらない下級生、上級から票が入ってる気がしなかった。

おそらく同学年からも入ってないとは思わないが決め手なるほどの支持を得られてなかったのだろう。その程度のコミュ力だった。


だがしかし、まだチャンスはあった。

その後に選出される議長は、ほぼ生徒会と同じ行動をし、行事に関われる。

幸い自分は何度も役職を任された経験上司会を何度も経験し、そこそこできている自覚はある。

しかもこれは

・必ず2年生から

・先に決まった次期生徒会長と2年の担任たちの意向

で決められる。

他に枠はなくこれが最後のチャンス。だがしかしこれなら任されると思った。

…が、落ちた。

選ばれた子は友人だった。

だがしかし、その子は内申+αが目的で、本当にそういった仕事をしたかったのではないのは感じていた

生徒会とそれ以外では関われる行事や行動が全然違う。

生徒会長もよく知った中ではあったし、教師受けもよかった(実際、担当した教員から「この役職が向いてる、推薦する」とお墨付きももらっていた)。

だがしかし自分が良くないと思ったことは曲げられないタイプで「扱いにくい」と感じられていることも自覚していた。

多分敗因はそこだろう。そう自覚しつつも非常に悲しく悔しかった。

結局その他、内申に関係する「生徒会」と各種委員長

それまで面倒を避けてたような要領の良い子が7~8割(もしかしたらそれ以上)が占め、

いままでコツコツとクラス委員会運営を支えて来たような子たちはほとんど落ちていった。





それからしばらく進みできる限り行事に関わるものに参加しつつ、結果受け入れて生活していた。

中学3年にもなると受験意識し、更に「◯◯長」をしたがる人間が増えた。

総合的な学習の班分けも同様だった。

郷土関係することをテーマを分けて発表する、という内容だったのが、

自分が興味をもって提案したテーマ希望者が自分しかおらず、

他の希望者多数のテーマに組み込まれた。しかしそれでもやっぱりそのテーマちゃん学習したくて立候補した。

だがしかし、昨年までが何だったのかというくらい希望者多数となり、じゃんけんで負けた。

勝者は正直、同学年の支持がない子だった。

案の定自分のやりたかったテーマは影が薄れ、忘れ去られ、それでもやることはやって着々と作業を進めていた。

そして発表時テーマ班長は決まっていながら、それとは別に発表の「監督」を複数人選出することになった。

もちろんこれは内申に影響しないし、監督になると発表する側にはなれない。

そして後半は発表に準備だけになるし、実質、監督が指揮を取ることになる。

「船頭多くして船山に登る」状態になるのには反対したが通らず、やはりそこで自分担当することになった。

(今思えば、それまでの行動で求心力がなかった班長で進めるのを避けたかったのかとも疑っている)


発表側をやりたかった自分は不承不承、しかし決まったものは仕方ないと全力で発表に向けて走り回った。

発表側になった班長や、人員が不足したときつのまにか発表側に回った同じ監督だった子を羨ましいと思いながら。

そして発表当日、班長の子に嫌味を言われた。

確か、小道具場所を把握してないのは監督としてどうか、的なことだったかと思う(余談だが小道具係は別にいる)

些細なことだし苦笑いしてやり過ごしたが、これまでのことでパンク寸前だった自分にはだめ押しとなって

本番中誰も来ないところでうずくまってこっそり泣いた。

ちなみにこの後も班長やらかしくれた。


そして部活も同じようなものだった。

部長副部長は生徒の投票を加味して「顧問が選ぶ」という方式だった。

当時の部活は「顧問VS部員」の構造があった。その結果、明らかに顧問が付き合いやすい」

だが部活内での求心力はそこそこの子を選んでしまった。

「票が入ってないわけではない」と強調していたが、密な付き合いのある部員間の話では

それが嘘でなくても1,2人いる?という票数であるのは皆察していた。

ぶっちゃけ得票数TOPの子たちは顧問に不満は持ってなかったんだから

部長はそこから選べばよかったのに、と思う)

その結果、顧問が転属して居なくなると「部長副部長VS部員」の対立構造に変わり、

部長副部長が居づらい環境になり、不満を持つ子たちが言うことを聞かず、落ち込んでいってるのがわかった。

自分比較的その子達と仲良かったのもあり、緩衝材として連絡する、仕切る、やきもきするという謎の構造ができていた。

正直この行動は部長たちの孤立を加速させ、良かったのかは自分でも疑問であったが、そうしないと団体行動も怪しい状況だったのだ。

結果、最初に話した議長/各種委員長でもあった2人は生徒会に入り浸り、ますます対立を深めていった。

これに関しては正直、仕方ないことだと思うし、それほど2人は追い詰められて居たと思う。

だが、生徒会室で仕事がなくても談笑した姿をみると自分が本気でやりたかたことを逃げ場にしていること、

その一方で自分がやりたくもないことばかりしている状況にがすごく虚しかった。

その気持を抱えながら部活動はやりとげた。



今でもこの一連の流れは思い出す。

あー、内申ももらえないし、バイト代がでるわけでも無いのに、

評価もされ… あ、いやこれは幸い一部からはしてもらってた。

まあ、その程度でなにやってるんだろう、明らかに貧乏くじじゃないか

そして残念なことにこの正確、環境は今でも変わってない。


根本的な理由は「やりたがる」「でしゃばりたがる」正確と長年いじられ続ける容姿

心意気をうまく伝えられないコミュ力プレゼン力であり自業自得だ、と自覚している。

本気で「義」を理由に口を出ししても、「自己のため」と誤解されることも多々ある。

そこを変えないと…と思いつつも、「誰かがやらないといけないこと」をやり続けても「やりたいこと」がやれない思い出を愚痴らせてほしい

2019-01-18

anond:20190118195636

弊社、40時間の固定残業

そのためか40時間までは残業させろというTOPの風潮

末端は「一生懸命仕事してるのにまだ足りないのかよ」とモチベーションダダ下がり

2019-01-03

anond:20190103193157

結構面倒

過去ブロックを覚えておく領域

int blocks[100][100];

過去ブロックを再描画

	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, &Rect, hBrush);


			}
		}

		DeleteObject(hBrush);

		return FALSE;
	}

この辺は めんどくさくはあるけど みてわかってほしい

描画したWriteBoxとおなじ BOXが落ちた場所BOXの有無)を保存しておく

ここがわかりにくいといえば わかりにくい

	BOOL SaveBoxI()
	{
		blocks[y  ][x] = 1;
		blocks[y+1][x] = 1;
		blocks[y+2][x] = 1;
		blocks[y+3][x] = 1;
		return TRUE;
	}

anond:20190103184241

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 100 };
				InvalidateRect(hWnd, &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, &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, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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 &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

anond:20190103170543

テトリス

落ちてくるブロックの描き方

わかりやす関数化してみた

まずはブロックの種類は3種類

 

WriteBoxLとWriteBoxIとWriteBoxZ

の違いをよく見比べて

自力で違いがわかれば

プログラマーにはなれるとおもう

とはいえ、コレを自力でわかるならもっと儲かる仕事あるとはおもうけどな

 

	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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &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, &Rect, hBrush);


		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left += width;
		Rect.right += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.left   += width;
		Rect.right  += width;
		ret = FillRect(hdc, &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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

anond:20190103155208

これで、ブロックを4つ書くからテトリス

	BOOL WriteBox()
	{
		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, &Rect, hBrush);


		//Rect.left   += width;
		//Rect.right  += width;
		Rect.top    += width; 
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		Rect.top += width;
		Rect.bottom += width;
		ret = FillRect(hdc, &Rect, hBrush);

		DeleteObject(hBrush);

		return TRUE;
	}


	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		if (x > 8) {
			x = 0;
		}
		if (x <0) {
			x = 8;
		}
		if (y > 8) {
			y = 0;
		}

		this->WriteBox();

		return TRUE;
	}


anond:20190101175055

テトリス風?プログラムに向けて

第何回だろうな

キー入力を追加した

まだ、何を押してもブロックが右に移動するだけ(右端にいくと左にワープ

タイマー自動落下

 

でもまぁ ここまでサンプルがあるとほぼテトリスは見えてきた

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48*9,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &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, &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

2019-01-01

anond:20190101174449

描画部分の違い

変数 y をつかって

高さが8までで移動するように

yが変わると■のいちも変わるから

タイマーで呼び出されるたbに

下へ 下へと作画される

から まぁ アニメーションに見える

8のところを16に変えれば もっと長いアニメーションになる

次はタイマー部分を説明

	BOOL OnPaint(PAINTSTRUCT &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, &Rect, hBrush);
		DeleteObject(hBrush);

		return TRUE;
	}

anond:20190101172100

タイマーを使ったアニメーションを付けた

// 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(&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(&msg, NULL, 0, 0, PM_REMOVE))
				{
					if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
					{
						TranslateMessage(&msg);
						DispatchMessage(&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, &ps);
				this->OnPaint(ps);
				EndPaint(hWnd, &ps);
				::UpdateWindow(hWnd);
				RECT Rect2 = { 0,0,48,48 * 8 };
				InvalidateRect(hWnd, &Rect2, TRUE);
			}
			else if (obj == WAIT_FAILED)
			{
				rc = GetLastError();
			}
			else {

			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &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, &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, &ps);

			MyWindow *target = MyWindow::find(hWnd);
			target->OnPaint(ps);


            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &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;
}

2018-12-26

[] Masuda Advent calendar 2018

日付担当者URL
11/30(金)増田明日から!!!
12/01(土)増田そうだ 京都、行こう。
12/02(日)増田リフターツインpaのない家庭は悲惨だ。恐ろしい恐ろしい。
12/03(月)増田京都はオーバーツーリズム?
12/04(火)増田ルンバを使うのって手抜きじゃない?
12/05(水)増田「クックドゥ」って表記、変じゃない?
12/06(木)増田京都の歩道が狭い
12/07(金)増田これもシュリンクフレーション?
12/08(土)増田はてな、SEO弱くなった気がするんだけど。
12/09(日)増田プエルト・リコのような
12/10(月)増田パナソニックのジェットタオル
12/11(火)増田車あずける→代車 ストーブあずける→代ストーブ?
12/12(水)増田「風邪でも、絶対に休めない あなたへ」
12/13(木)増田午後ティーChaiがヌルい
12/14(金)増田はてブTOPのおすすめカテゴリが「アドベント」
12/15(土)増田週末は、ふるさと納税の広告ラッシュ
12/16(日)増田サンタの味
12/17(月)増田「期間限定 10g増量」
12/18(火)増田こんなルンバがほしい
12/19(水)増田♪エビバデ ワイモバーイル
12/20(木)増田膝で棒をへし折る
12/21(金)増田『けいおん!』の聖地巡礼いってきた
12/22(土)増田♪ベル打っても返事はなっしー だっしー
12/23(日)増田平成末期における外タレCM事情
12/24(月)増田想像もできなかった未来
12/25(火)増田Adventうんたらかんたら
12/26(水)増田Masuda Advent calendar 2018
12/27(木)増田増田は餅つき終わった?
12/28(金)増田「プレミアム冷蔵庫」って何?
12/29(土)増田平成最後のカレンダー
12/30(日)増田風情ある京都の町並み
12/31(月)増田次元号の増田アドベントカレンダーで、また会いましょう

2018-12-16

世界文学ベスト100」の英米バージョンを調べてみた

文学ベスト100と検索すると、国内に限ってもいろいろなランキングが出てくる。英語圏では、ベスト100を選んだときどのような小説ランクインするのか、気になって調べてみた。

そうすると、日本と同様にたくさんの種類のランキングが出てくるが、これらをひとつひとつ紹介するのも退屈だ。

から、それなりに信頼がありそうないくつかのランキングを選んで、それらにくり返し選出されている作品名をここに挙げてみたいと思う。

なにをもって信頼があるというのかは難しい問題だが、だいたい以下のような基準を満たしているランキングだけを取り上げることにした。

英語圏文学に偏っていないこと

 英語検索しているからには、英語で書かれた小説が多くランクインするのは当然なのだが、英語圏に限らず、世界文学を選出の対象にしていることを条件とした。なので英米文学オンリーとかなのは避けた。

・あまり最近小説大衆小説を選んでいないこと

 2000年以降に発表された小説割合が高すぎたり、「ハリー・ポッターシリーズ」のような、あまりエンタメ寄りの小説を選出しているものは除外した。

 「ハリー・ポッター」が文学かどうかは知らないが、それが文学ベスト100に選ばれているランキングが参考になるかというと、あまりならないんじゃないかな。

古今東西作品から選ぼうとする意思が認められるもの

 どのランキングにしても19世紀以降の西洋文学に偏りすぎなのだが、そこはもう仕方がない。


このような基準で選んだランキングは以下の4つ。検索すればソースはすぐ出てくると思う。

ガーディアン誌による「The 100 greatest novels of all time」(いつ誌上に掲載されたのかはわからなかった)

Goodreadsによる 「Top 100 Literary Novels of All Time」(国内でいうと読書メーター読書ログみたいな位置づけのサイトユーザー投票して選出している)

・Modern Library(アメリカ出版社)による「100 best novels」

アメリカ文学Daniel S. Burtによる「the Novel 100: A Ranking of the Greatest Novels of All Time」(同タイトル書籍がある。Burtは英文学講師をしていたらしい)

4つのランキングのうちすべてに選出された作品は、ナボコフの「ロリータ」と、ジョイスの「ユリシーズ」の2つだった。ロリータすごい。

4つのランキングのうち3つに選出されたのは、以下の28作品

タイトル作者
インドへの道 フォースター
アメリカの悲劇 ドライサー
アンナ・カレーニナトルストイ
すばらしい新世界クスリ
回想のブライズヘッド イーヴリン・ウォー
キャッチ=22 ジョセフ・ヘラ
ドン・キホーテセルバンテス
失われた時を求めてプルースト
フィネガンズ・ウェイクジョイス
見えない人間ラルフエリソン
ジェイン・エアシャーロット・ブロンテ
白鯨メルヴィル
アメリカの息子 リチャード・ライト
ストローコンラッド
オン・ザ・ロードケルアック
百年の孤独ガルシアマルケス
カラマーゾフの兄弟ドストエフスキー
ライ麦畑でつかまえてサリンジャー
善良な軍人フォード
怒りの葡萄スタインベック
グレート・ギャツビーフィッツジェラルド
緋文字ホーソーン
響きと怒りフォークナー
ブリキの太鼓ギュンター・グラス
崩れゆく絆 チヌア・アチェ
灯台へヴァージニア・ウルフ
火山の下で マルコム・ラウリー
嵐が丘エミリー・ブロンテ


このうち22作品はすでに読んでいた。

けっこうそれっぽいタイトルが並んでいるように見えるが、日本ではほとんどなじみのない作家も中にはいる。ジョセフ・ヘラーとかフォード・マドックス・フォードとか。

フォードの「善良な軍人」が翻訳されているかはわからなかったが、これを除けばすべて翻訳で読むことができる。すばらしい。

12/19追記

ブコメの指摘からフォードの"The Good Soldier"(上では「善良な軍人」と訳した)は、「かくも悲しい話を…」という邦題翻訳されていることがわかった。ありがとう

2018-12-14

[] はてブTOPおすすめカテゴリが「アドベント

「人気」と「新着」ダブり過ぎだろ。

枠余ってるなら俺も載せろや。

2018-12-05

「とにかく女性を避けよ」の記事、前半しか訳されていない

ウォール街、「#MeToo」時代新ルール-とにかく女性を避けよ - Bloomberg

http://b.hatena.ne.jp/entry/s/www.bloomberg.co.jp/news/articles/2018-12-03/PJ5GIH6JTSEL01

話題のこの記事、前半の抜粋部分しか日本語訳されてないので前半しか見てない人が多いと思うけど、

後半に『アフターパーティー飲み会での打ち合わせなど)をなくす』とか『ドアが開いたままのボスとのプライベートミーティングをする』『ミーティング第三者を呼ぶ』などの対策が挙げられていて、

最後にContext Capital Partnersのロン・ビスカルディ最高経営責任者CEO)の

ゲス野郎にならなければいい話。 それほど難しいことではない」

という発言結論を締めている。

また、『There’s a danger, too, for companies that fail to squash the isolating backlash and don’t take steps to have top managers be open about the issue and make it safe for everyone to discuss it, said Stephen Zweig, an employment attorney with FordHarrison.』とあるので、

me tooを恐れて女性仕事から遠ざけてしまうことで、セクハラ訴訟から性差別訴訟に発展するだろうと書いてある。

単純に『Avoid Women at All Cost』ではコスト回避にならないという結論だ。

どうして前半しか訳されてないのか。

訳者日本人が前半しか賛同できなかったのか、

それとも前半だけの方が日本人ウケる判断されたのか

何にせよ、日米の意識の違いというか、フェミニズム浸透の差を感じる。

どちらにせよブコメで騒いでる人たちは結論変わらないだろうけど

2018-12-01

ホームページ作成4万ってどう?

営業力のないワイ氏に舞い込む副業仕事ってこういうのしかない

ホームページ作成、この価格ならみんなやる?

自営業者副業頑張るマンなら小躍りしちゃう

なお、ワイ氏はいつもそれとなく逃げてる(お断り)

4万の作業内容

特に問題ないところ

レスポンシブWebデザインで、なんか1つTOPに動く絵があれば、凝っている必要はない

Twitterやその他SNSTOPページに表示

WordPressでもhtmlベタ打ちのWEBサイトでもいい

ドメイン取得などの作業も代行(ドメインサーバー費用請求可能)

継続性が見込める案件(年20数件程度の受注見込みあり)

ウンザリするところ

写真画像のご用意頂けない。頂けても数枚かつ写真画像リサイズ/リデザイン(合成や色味調整)を無限要求

テキストをご用意頂けない>何度も要求すれば最終的にはくれるが・・・

SEOを期待される>最終的にはホームページ看板身分証明書であって広告と考えない方が良い。どうしてもなら別料金>有料ならじゃあいいや で、ご納得は頂けるが・・・

2018-11-29

この人が絡むとプロジェクト炎上する

そういうのってあると思うけど

弊社の場合はそれが現場TOPだったりする

その人が来るまでは炎上なんてなかったのに

その人が来たとたんに絡んでるプロジェクト全て炎上してる

あーしんど

2018-11-19

防弾少年団騒動東方神起ファンネトウヨ化している件について

BTSの一連の件に関する記事ブコメを見ていて、この点が全然言及されてないのと、当の東方神起ファン達が他人事のように「残念」等のコメントをしてることに欺瞞を感じたので書く。

結論

長くなるので先に書くと、今年の春頃から東方神起ファンが激烈なアンチ化してネトウヨに取り込まれ東方神起のみならず、BTSはじめ他のK-POPアイドルも「反日認定してはテレビ局スポンサー企業へのクレーム電凸をしているという話です。

・流れ

事の発端は「地図消し」騒動である

(http://s.wowkorea.jp/news/read/210041/)

今年の4月東方神起韓国で発表した楽曲MVの中の1シーンで、日本列島が消えた世界地図CG使用されていた。

このMV4月3日0時にYouTube上にアップロードされたが、数時間ツイッター上で日本ファンから該当のシーンが指摘されたため、午前中に動画自体が非公開となり、16時に地図の部分を修正したものが再度公開された。

出来事だけ見れば、発覚から24時間以内に「映像制作会社ミス事務所のチェック漏れ」と事務所謝罪しているのだが、それまで東方神起とその日本ファン達は「東方神起だけは他の反日韓国芸能人たちとは違う!」と他のK-POPアイドルから切断し、特別視することでそのロイヤリティを高めていたため、日本ファン達は衝撃を受けた。

折り悪く、東方神起はその少し前にTwitterInstagram公式アカウントを開設していたため、本人達からコメントが無いことにも失望する声が出始めた。

やがて「東方神起に対するモヤモヤとしたわだかまり」と日本ファンクラブの名称「ビギスト」を組み合わせ、一連の出来事に対する不満や不信感の表明として「モヤビギ」と自称するファン達が現れた(後に、ファンクラブを辞めたことを表明する「辞めビギ」も現れる)。

MV騒動は日々韓国芸能人の「反日行為をチェックしているネトウヨにも捕捉されていたため、これら「モヤビギ」を名乗るファン(元ファン)達の一部が、ネトウヨと合流してしまった。

東方神起ファン達は仲間内東方神起に関連するツイートを片っ端から大量にRTしあって拡散する習性があったため、すぐに「#モヤビギ」や類似ハッシュタグ陰謀論めいた嫌韓ネタが混ざるようになった。

ネトウヨ化した元ファン達は東方神起のみならず、他の韓国芸能人K-POPアイドルも盛んに「反日認定を始め、「国交断絶」「日本での活動停止要求します」とハッシュタグ荒らしを始める。

元は東方神起を見るために韓国芸能情報もチェックしていた人達なので、その手の話題には詳しい(そして以前はそういう話題を見るたびに彼女たちは「東方神起はこういう反日行為を一切しない」と誇らしくなっていたのだ)。

また、東方神起ファンたちは、以前から彼らがCMに起用されたりテレビ番組に出演するたびに、企業に喜びや感謝電話メールをしたり反響の大きさで東方神起の人気ぶりを示そうと頑張っていたため、一昔前の2ちゃん鬼女的な行動力があった。

それはアンチ活動でも発揮されることとなり、ネトウヨが呼びかけるまま関連企業へのクレーム電凸を行うようになる。

その流れの中で、現在K-POP界でも人気頂点にいる防弾少年団(BTS)の「原爆Tシャツ」などのネタも掘り起こされ、やがて「3.11溺死連想させるようなMVを発表」といった言いがかりまで始まり、それをまたネトウヨ拡散し、更にアンチ化したファン拡散するというサイクルが生まれた。

防弾少年団デビュー当初は「ギャングスタラップ」を意識したイキったイメージで売り出しており、色々と配慮も欠けていたため、元々叩きネタが山程あった。

面倒臭くなってきたからここからは駆け足で行くけど、それから6月日産スタジアム公演で「猿真似騒動(https://news.nifty.com/article/entame/showbizd/12184-40791/)(https://matome.naver.jp/m/odai/2152891489182288101)や、「#セブンイレブンブロック事件」(https://togetter.com/li/1250859)が起きる。

セブンイレブンブロック事件」のTogetterまとめは一瞬はてブTOPにも入っていたので覚えている人もいるかもしれないが、ここで「ネトウヨ」とあしらわれていたアカウント達は大半が上記の流れでアンチ化・日本を取り戻す戦士化した元東方神起ファンだったのである

セブンイレブンブロック事件」では、皆大好きくたびれはてこ氏などはてなでもお馴染みの左巻きっぽい面々が元ファン対話を試みたが、多くのネトウヨがそうであるように、ネトウヨジャーゴンハッシュタグを繰り返すゾンビと化した元ファンが聞き入れるはずもなく、「モヤビギ同士で話していただけなのに、突然パヨク集団ネットリンチされた!」と態度を硬化させるだけだった。

上記TogetterNAVERまとめに載っている多くのアカウント現在も稼動していて、相変わらず東方神起BTSや他の韓国芸能人K-POPアイドルへのイチャモンを繰り返している。

2018-11-18

PornHubのVR動画PSVRで見る方法

はじめに

ここ1年~半年アダルトVRを取り巻く状況は大きく変わった。

具体的には、制作本数がここ半年10倍以上に増え、リリースされる全アダルト作品のうちVR作品はすでに3割を超えている。

また、PCという母艦必要としないスタンドアロン型の低価格VRゴーグルが発売されたり、PS4という母艦必要ではあるがPSVRが値下がりしたりと、ハードウェア面でも大きなモメンタムを持った流れになっている。

さて本稿では、無料アダルトVR動画の泉である「PornHub」をPSVRで楽しむ方法についてメモしておこうと思う。

ネットを探せばすぐに見つけられる程度のことしか書かないので、意欲的なVRユーザーにとっては旧聞に属することばかりになろうと思う。お許し願いたい。

流れ

1. PornHubから動画DLする

2. 画面レイアウトに応じてリネームする

3. USBメモリコピーする

4. LITTLSTARで再生する

1. PornHubから動画DLする

目的動画ページの動画の下、いいねボタンなどの並びに「VR」というタブがあるのでこれをクリックするとダウンロードボタンが下に現れる。

一番左の「VRビデオ ダウンロード」というボタンクリックするとMP4ファイルダウンロードが始まる。こんなに簡単でいいのかと思う。

ふつうデータダウンロード同様に右クリックメニューが使えるので、DL先やファイル名をここで指定してもよい。

ただしVR動画は巨大なので(20分で1GBを超えるものもある)、まずは再生時間の短いものから試すとよいだろう。

PornHubのCDNCDNといいつつスループットは悪く時間がかかるうえにちょいちょいエラーDLが止まる。停止してすぐなら止まったところから再開できることもあるが、気づかず放置するとまた最初からやり直しとなるので注意されたい(セッション寿命を短く設定しているのだろう)。

PornHubプレミアム会員への登録は、さしあたり必要ない。

ダウンロード速度 → たいして速くならない

ハイクオリティダウンロード可 → 解像度は同じ、ビットレートのみ倍。フリー版で十分

会員限定コンテンツ → たいしたことない

広告が出ない → まあ、出ないに越したことないけども

2. 画面レイアウトに応じてリネームする

後述するPS4アプリ「LITTLSTAR」はファイル名でVR動画タイプ判別するので、DLしてきた動画を実際にPC再生してみて、タイプに応じたファイル名をつけてやる。

VR動画の画面レイアウトは右眼用・左眼用ふたつの映像を「上下に並べるタイプ」と「左右に並べるタイプ」の2種類あり、PornHub上の動画も2つが混在している。

上下に並べるタイプを「オーバーアンダー」と呼び、左右に並べるタイプを「サイドバイサイド」と呼ぶ。

さらに、録画範囲も、「全天球360度」をカバーしたものと、「上下左右180度(前半球)だけ」を写したものがあり、これも作品によってまちまちである

まりVR動画には「360オーバーアンダー」「360度サイドバイサイド」「180度オーバーアンダー」「180度サイドバイサイド」の4種類があることになる。

もっとも、この中で「180度オーバーアンダー」は使われているのを見たことがない。

Google提唱するVR180というVR動画規格が180サイドバイサイドなので、今後はこれが主流になっていくだろう。

オーバーアンダー/サイドバイサイドは一目見ればわかるが、360度か180度かはよく見ないとわからない。わかりやす判別ポイントは「壁」。室内で録画されている作品場合(大半がそうだが)、壁が3面しか映っていなければ180度、4面の壁が映っていれば360動画である。また、360動画は画面の右端と左端がループしているのでこれも判別ポイントになるだろう。

さてタイプがわかったらファイルリネームする。

ファイル名の末尾を以下のようにする。

タイプファイル
360オーバーアンダー_ou.mp4
180度オーバーアンダー_180_ou.mp4
360度サイドバイサイド_sbs.mp4
180度サイドバイサイド_180_sbs.mp4

たとえば「180度サイドバイサイド」の「ハラビロカマキリの産卵.mp4」は「ハラビロカマキリの産卵_180_sbs.mp4」となる。

「_180」がない限り360度と解釈されるので、自分がわかりやすいように「_360_ou」などと書くことは問題ない(判別には影響しない)。

また、_ou (over under) の代わりに _tb (top bottom)、_bt (bottom top)、_sbs (side by side) の代わりに _lr (left right)、_rl (right left) などと書いてもよいようだ。

(失礼、ここでうっかり投稿してしまった。追記する)

3. USBメモリコピーする


リネームの済んだ動画ファイルUSBメモリコピーするが、フォルダが決まっている。

メモリのルートディレクトリ(一番浅いところ)に「LITTLSTAR」というフォルダを作り、その中にコピーする。リトルスターという名前だがスペルに「E」がないので注意。

LITTLSTARフォルダの中は階層化してもかまわないが、再生ソフト LITTLSTAR の一覧表示には反映しない(サブフォルダの中身も引き出されてフラットに一覧化される)。

コピーが済んだらUSBメモリPS4USBスロットに装着しよう。

4. LITTLSTARで再生する


PlayStationStoreで「Littlstar VR Cinema」というアプリ無料)をゲットする。

https://store.playstation.com/ja-jp/product/UP8821-CUSA06120_00-JPPS400000000001

起動するとメニューの一番右に「ライブラリ」という項目がある。ここを開くとUSBメモリの内容が一覧されているはずだ。

LITTLSTARは海外アプリのせいか、決定が「×」、キャンセルが「○」で日本とは逆の操作体系となっているので慣れないうちはイラッとすると思う。

以上。

本日以降この項は更新しない。2018年11月18日現在情報である

2018-11-17

anond:20181117012937

フィジカル問題だと思ってるよ

結局、対人間って見た目とボディアクションだから。どんな小賢しいこと言ってもね

なので、フィジカルで劣りながら一代で海外でそこそこの企業を作り上げたヤツや

見た目が完全にアジア大手企業TOPに登り詰めたヤツは

化け物か?!と思っているよ

こちとら同民族間でも苦労しているのにって思ってる

二足歩行しか共通点いね

ログイン ユーザー登録
ようこそ ゲスト さん