「std」を含む日記 RSS

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

2022-01-15

事務に使う業務パソコンに限ってはVDIも良い


「最低限必要パソコンスペックって」の話の続き。

事務パソコンに限った話だが、もし一拠点事務パソコンの台数が15台以上あるならVDI(Virtual Desktop Infrastructure、仮想デスクトップ基盤)を検討してみるのもよい。

VDIには様々なソリューションがあるが、おすすめしたいのは、最もコストパフォーマンスに優れる、Windows Server 2016にRDPで接続する、正確にはSBC(Server Based Computing)と呼ばれるタイプ

パソコンを購入する場合、処理のピークを短い時間で終わらせるために十分な性能のCPUストレージを用意する必要があります。ですが処理のピークが続くのは数秒(ピークが数秒で終わる程度の性能を持つCPUストレージを準備したのだから当然だ)でしかありません。それ以外の時にはパソコンの持つ性能の数%しか使っていないので、潜在性能の10%も活用できていない事になります

もしCPUSSD複数ユーザーで共有できるなら、メモリを16GBも積めば1台のパソコンで8人程度が同時に作業しても、体感速度はほとんど変わらないはずです。

そこで十分に高い性能を持つサーバーを用意します。そのサーバシンクライアント端末という低性能な端末(モニターマウスキーボードが繋がっているだけで、実質的CPUメモリストレージはありません。単体ではパソコンとして機能しません。)で接続して使います。それでもユーザーにとっては、普通にパソコンを使っているのと操作は変わりません。

仮に15人の場合には概ね下記のような金額になります

サーバー(8コアCPUメモリ32GB、SSD1.4TB RAID5)が90万円。シンクライアントモニター込み)が5万円×15台で75万円。Windows Server 2016のCALが5000円×15台で7.5万円。割安なOfficeプレインストールモデルを使うことは出来ないので、Office 2016 Std(約5万円)を購入するか、Office 365 ProPlus(月額1,310円)を契約する必要がありますトータルで250万円ぐらいで導入できるはずです。

15万のパソコンを15台買うなら225万円ですから25万円ほど割高になっています。でもそれ以上にメリットもあるのです。

メンテナンスの手間が激減

サーバーにだけ設定すればよいので、手間が激減します。新しいプリンタドライバ業務アプリケーションインストールするにも、15台のパソコンインストールしてあるく必要はありません。VDI用サーバ1台にインストールすればOKです。

バックアップの手間が激減

クライアントパソコン内に保存されている設定やデータバックアップはかなり大変です。実際にはパソコン内のデータバックアップは諦めている事が多いでしょう。VDI用サーバーバックアップさえ取っていれば、各自デスクトップやマイドキュメントファイルもしっかりバックアップをとれます

故障時の復旧作業が激減

パソコンが壊れた場合、新しいパソコン必要アプリケーションインストールや設定を施し、故障したパソコンHDD必要データを取り出してコピーする。場合によっては1日~2日は潰れてしまます。VDI環境なら設定やデータはVDI用サーバーに保持されているので、新しいシンクライアント端末をつなぐだけで復旧します。予備にシンクライアント端末を1台余計に買っておくなら、30秒で復旧できるのです。

サーバが壊れた場合ですが「5年間24時間365日4時間以内に訪問修理」とかを購入時に申し込んでも+30万円程度です。年間6万円程度の支出に過ぎません。同じ事をパソコンで申し込んだら+100万円、年間20万円程度かかるであろう事を考えたら、安いものです。

体感速度はむしろ向上

サーバー全体ではCPUのコア数もSSDの速度も、個人パソコンを与えていた場合の2倍ほどになってます。したがってピーク時の処理性能も個人パソコンを持たせていたときの2倍、ユーザーを待たせるような重たい処理も短時間で終わるようになり、体感速度も増します。

・在宅勤務やサテライトオフィスにも対応

VPNによる社内ネットワークへの接続方法さえ準備すれば、流行の在宅勤務やサテライトオフィスにも対応できます。全従業員対象とするのは内部統制的な難しさもあるでしょうけど、部長の自宅にVPNルーターシンクライアントを設置(10万円程度)するだけで「自宅でも会社と同じ作業ができる」ぐらいの事は簡単に実現できます

ちなみに15台だと25万円ほど高くついてますが、30台だとサーバ(16コアCPUメモリ64GB、SSD1.4TB RAID5)の価格が約160万円、他は同じだから総額で約320万円。15万のパソコンを30台買うと450万円なので、130万円くらい安くなる計算です。こうなると事務パソコンに限っては、VDIを使わない理由は無いですね。

ちなみに技術者パソコンWindows Server 2016のRDPで共有するのは無理です。一般ユーザーよりも強い、管理者権限デバッグ権限を与えてもらわないと仕事になりません。頻繁に管理者権限で設定を変更することになるので、ちょっとしたミスで全員巻き添えで仕事がとまる可能性が高いです。Hyper-VVMWareを使ったVDIなら行けますが、さらコストが高くなります

またデザイナ用パソコンをVDIにするのは完全に無理です。GPUが使えなくなる上に、画面上の表示品質下がるので、おそらく仕事になりません。

https://www.code-lab.net/?p=21783

2022-01-02

anond:20220102135531

いやだから、そこを多数の他人と共用すると結局伝染病から逃れられない。

この100年どれだけのお金持ちやインテリ梅毒その他のSTDで苦しんだか。

なぜはてなHPVワクチン無料化大歓迎大絶賛されているのか。

その裏にはフリーセックス性病蔓延とがある。

風俗でややこしい病気貰った人は、あの診療台で開脚する覚悟があるのか。

本当に好きな人に再感染させない覚悟があるのか。

2021-09-05

HPV子宮頸がん、の話はセーフセックスの話を隠すからよくわからなくなるんだよな

HPVワクチン問題だけど、

HPV子宮頸がんになる」っていうのがSTD,はっきり言えば性病セックス感染するので、

反対派は副作用を全面に出すけれども、

実際には、言外に「みんながセーフセックスに徹すればそもそもセックスワーカーなど一部の人を除いて

ワクチン要らないのでは?」が含まれていると思うんだ。

推進派もセーフセックスクリーンセックスリスク行動の啓発をせずに、「ワクチン女子尊い人命を救え」

だけ大声で言うからなんだかなーって感じになる。

2021-04-05

自分納得するまで理解するということである。去年のノートでもよいし、教科書の独学でもよいし、先生にしつこく聞いて理解してもよい。KMBのXXは基本的ものなので、がんばってやる。KMB理科系科目は、いずれも将来のSTDのために必要不可欠な技術であるしかしそれ以上に大事なことは、論理的思考法を身につけるという点

2021-01-07

anond:20210107121743

性病に詳しくないやつに限って、滅多にうつらないとか、無責任なことをいう。

50人別の人間とヤッてたら何らかのSTD感染してる可能性はかなり高いぞ。

それで、例えばクラミジアもった状態HIVもってる相手にあたったら感染確立爆上がりになることぐらいしってるよな?

自分の為にも早く検査を受けたほうがいいし、世の中的にも感染を広げないで欲しいね

2020-12-13

anond:20201213022017

男女差()とかトラバつけた奴、全員答えろよ。大好きな彼女仕事お金のために性的サービス提供するのは、責められるべきことではないんだよな?

だって好きにすりゃいいんだよ。

少なくとも俺はとやかく言わないし。

ただし、新コロとかSTDもらってくるのは困る。

2020-09-14

anond:20200914225421

std::threadって毎回かかないほうがいいよ

using std つかうと簡単にきりかわるよ

 

そうだな、フリー版にそんなふうにかかれていたら、使いにくくて邪魔だろうな 俺もそう思うよ。threadって書いてあると、簡単に書き換えられてフリーもっと使いやす成るのにな

 

ふつう そうおもうよね?

2020-07-05

C++C++ C++インタプリタ

int moin(int argc.char*argv[]){

  std::cout<<"Hello world\n"<<std::flush;

  __asm__("mov ax,0");

}

2020-06-26

You Winとか 雑音を信じるな ゲージが尽きるまで叩き込め 月は出ている

コンボ中はためらうな、弾幕が薄い。理屈ではない、体の導きに従って野性的にいくのだ。

C言語

std::cout <<L"アスナぁ"<<std::flush;

2020-06-19

anond:20200619150831

渡部に関して言うとトイレに何度も呼び出して1万渡すってのは買春行為なので相手売春婦だという認識がない限り侮辱だと取られてもおかしくはない。

なので性的合意(性行為強要ないし強姦)じゃなくて他人侮辱して軽んじるか、そういうことをすると相手にどういう逆襲をされるかっていう話だと思う。

せいやに関して言うとそもそも既婚者の女性テレフォンセックスをしてるのからしおかしいが、相手の女の言い分としては「やめてくれと言った」というので、それが本当なら合意はなかったんじゃないの。もしそれが嘘で、やろうやろうと言ってたなら話は違うが。

そもそも特定パートナー以外とのカジュアルセックスSTDとか含め、いろんな意味リスクが高いので、望ましくない。

しかも両者ともに手軽にやり捨てようとしたら牙を剥かれたってケースだと思うので、人を手軽にやり捨てようという根性そもそも良くない。

それでもどうしても特定パートナー以外とやりたくて、それこそなんらかの形で両者合意の上で双方の意思メールに残すとかするしかないんじゃないの。

2020-06-14

std::vector XXXとして

for(auto &x:XXX) ;

というコードに対して ;は無意味ってnoteではなくwarningで挙げてくるんだが

こんなコード わざとかいている以外 どんな理由があるんだ・・・

わざわざプリプロセッサでWarining OFFにしなきゃいけねーのかよ つれーな

std::parallel/std::multi task SIMD

std::thread Multi core

の違いを答えられない人がいるんだ

グループ内:で、答えられなくて落ちそうだからカンニングしようとかそりゃちがうわな)

A線とD線のちがいなんて、おれにはわからん。だけど演奏家にとっては、違うだろうねぇ どっちでもAはだせるわなぁ

2020-06-06

std::vectorstd::thread> VTs(NumberOfThreads);

 

auto join = [&VTs]{ for(auto &t:VTs) t.join(); } ;

func1(VTs);

join();

//if

auto doMain = [&VTs]{func1(VTs);};

auto join = [&VTs]{ for(auto &t:VTs) t.join(); } ;

doMain();

join();//wait all thread done.

2020-05-30

atom int x=0;

std::vectorstd::threadth;

th.resize(2048);

for(int i=0;i<2048;i++) th[i] =std::thread( [&]{x++;while( x <= 2048) Sleep(1);} );

for(int i=0;i<2048;i++) th[i].join();

|gcc -O5

 

time ./a.out

2020-05-28

ダングリンポインタはSEGVするという仕様なのに、なぜstd::move必要なのか?

メモリの不整合は呼び出し側の責任。呼び出し側が明示的に所有権放棄するという仕様に対して

なぜmove(呼び出される側が暗示的にに所有権を取得する)という概念を追加したか?(いまこれにたいする回答を準備中

 

move許可制なので、実装している段階でわかるから

 ↓

2回目の利用(別ライブラリ)だった場合で1回目はエラーで気がつくが、2回目は意図せず呼ばれた場合は?

 

他のライブラリのために、所有権放棄実装したら、第3のライブラリがそれを自由に呼び出せるのは望ましい実装か?

所有権を共有しようとしたら、占有されたでござる。

一緒に使おうね、って広場においておいたら、自宅に持ってかえられて、所有権を主張されたでござる

2020-05-22

どちらの副作用のほうが大きいか

意図しないstd::moveがない=だけのmoveコンストラクタが呼ばれる場合

コピーコンストラクトと使い方に差がある

という弊害constなのにmoveコンストなのに所有権を失うというコンストとは違う動作が行われる)である という もとからconst には前コンスト 後コンストの問題はあるが 同じような弊害を生むのではないか

難しいけど ごめんなさい。

2020-01-29

std::timedoubleに突っ込むなよ…std::time仕様を知らなかったワイも悪いけど、その変数名なら、絶対小数点以下もあると思うやろ…

2019-10-23

anond:20191023190834

Pythonインタプリタがあるならこれだな

import random

import string

''.join(random.SystemRandom().choice(string.ascii_letters) for _ in range(8))

パスワードも許されている文字範囲を気にしつつこんな感じで作ってる。

C++17が使えるならこんな感じかなぁ...

#include <algorithm>

#include <iostream>

#include <random>

#include <string>

int main(void)

{

std::string input = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

std::random_device rnd;

std::string result;

std::sample(input.begin(),

input.end(),

std::back_inserter(result),

8,

rnd);

std::cout << result << std::endl;

return 0;

}

2019-05-07

C++に再挑戦してる

大学時代C++が嫌いだった。

というより最初Hello Worldでつまずいてそこでやめてしまった。

「なんでstd::coutなんだ?printfじゃダメなのか?どうしてstdio.hを使わないんだ?」

とどっちも使えるという状態がとても気持ち悪くて、結局拡張子をcppとしただけのベターCを使うだけだった。

リーナス・トーバルズC++使わないって言ってるらしいぞ。やっぱりできる人はC言語なんだ」などとも考えていたような気がする。

あれから幾年か経った今になって、仕事の都合上C++に触れることになった。

もう長い間CやC++で書かれたより高レイヤー位置するプログラミング言語ばかり触ってきたので今更感があったが、今もう一度勉強し直す機会を得たと前向きに捉えてやってみることにした。

実際やってみると、なるほどstd::coutはフォーマット指定子に寄らない分便利だなと素直に受け入れられた。

他にもファイルの読み込みにはfopenじゃなくifstreamを使うとか、いろんなものC++用に書きやす方法があるのだと知り、それを素直に受け入れられた。

大学時代はその素直さがなかった。年月は俺に素直さを与えた。

2019-05-06

anond:20121001010448

梅毒(第1期・第2期)

感染してから症状が出るまで:3週間~3ヶ月程度 治療期間:2~3ヶ月程度

皮ふや粘膜の小さなからトレポネーマという病原菌侵入することで発症する性感染症STD)です。

第1期は性器に痛みをともなわない硬いしこりができ、第2期になると全身(特に手足)に小さな斑点が多数出てきます

男女とも症状が出ないタイプがあり、この場合は専用の血液検査で判明することが多いようです。

梅毒検査もしようぜ。

2019-01-03

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;
}

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