「key」を含む日記 RSS

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

2019-05-04

anond:20190504185952

オタクの人ら、70年代から内でも外でもひたすら喧嘩してる連中のあつまりなんですが…。

宮崎駿高畑勲組合作って労働争議やったり、庵野秀明らがアマチュアから商業業界に無理くり入り込んだり

ポルノ分野で力をつけてメジャーに乗り込んだり(Keyとかニトロ)、タフな人はたくさんいるんですよね。

もちろん弱い人もいるでしょうが、それはどのような属性の人にもいるかと思われます


社畜会社を訴える物語は、経済小説という分野になるのでファンタジー路線ライトノベルには向いてないという話ですよね。

オタクが逃げている、というのは全くそぐわない。やろうと思えばできるけど、市場に対して有効かどうかという問題です。

で、オタクのことをなんで逃げてると思ったんですかね。快楽的な物語を描くことは「逃げること」なんですか?

仕事疲れたから僕の好きな甘いもの食べよー、程度のことなのでは?

2019-04-26

anond:20190426001052

ほい。なんとなく波長に合わなかった面々も多いのであまり気にしないで欲しい

ただ、"死ねばいいのに"といった非生産的タグを使ってるid積極的非表示にしてる

最近ようやくブコメ生産的なコメントばかり並ぶようになったけどブクマ数2桁くらいの新規idが日々増殖しててなかなか大変

b:id:aaaaiyaaaa

b:id:abcd0035

b:id:abcdefghijklmnopqrstuvwxy5

b:id:abll

b:id:abracadabra321

b:id:ad2217

b:id:aflske

b:id:afurikamaimai

b:id:agricola

b:id:akatibarati

b:id:akiko0027

b:id:akutsu-koumi

b:id:allmanbrothers

b:id:alphaorange69

b:id:aneet

b:id:Annihilator

b:id:another931244

b:id:Apps

b:id:aquatofana

b:id:araikacang

b:id:arearekorekore

b:id:arrack

b:id:aruzentina

b:id:astefalcon

b:id:at_home_all_day

b:id:at25250410

b:id:atoz602

b:id:atsushieno

b:id:atsushifx

b:id:aUIDZTN97jhrRQK

b:id:AyanoIchijo

b:id:Ayrtonism

b:id:Balmaufula

b:id:barbarkun

b:id:Barton

b:id:baseb

b:id:beed

b:id:beginnerchang

b:id:behuckleberry02

b:id:beramines37

b:id:bigstrides

b:id:billword

b:id:bisuta

b:id:bitscreen

b:id:blackdragon

b:id:blueeyedpenguin

b:id:bobjoebobbob

b:id:bocbqcmn

b:id:bookmarker35

b:id:bornslippy

b:id:brendon

b:id:buhoho

b:id:bunkashiken

b:id:buu

b:id:bventi

b:id:bYMQ

b:id:c0ntinue

b:id:cabas

b:id:cafeduck

b:id:carios

b:id:catsnail

b:id:cha16

b:id:cheapcode

b:id:chiba1008

b:id:CIA1942

b:id:clamm0363

b:id:cleome088

b:id:cloudliner

b:id:comitlog

b:id:cook593

b:id:coper

b:id:corydalis

b:id:cotbormi

b:id:craprak

b:id:croissant2003

b:id:cruyf

b:id:Cunliffe

b:id:d_doridori

b:id:damae

b:id:dancel

b:id:danseikinametaro

b:id:dareshimu

b:id:daybeforeyesterday

b:id:dazz_2001

b:id:dededidou

b:id:differential

b:id:dimitrygorodok

b:id:djshacho

b:id:doko

b:id:don_ikura

b:id:dongdeng

b:id:douai

b:id:Dragoonriders

b:id:dreamfire

b:id:driving_hikkey

b:id:drying_flower

b:id:dsino

b:id:eggheadoscar

b:id:el-condor

b:id:emmie714

b:id:ene0kcal

b:id:EoH-GS

b:id:exshouqosa

b:id:falkbeer

b:id:fashi

b:id:ffrog

b:id:fishma

b:id:flookswing

b:id:FlowerLounge

b:id:flowing_chocolate

b:id:fn7

b:id:fourddoor

b:id:fujifavoric

b:id:fujitaweekend

b:id:FUKAMACHI

b:id:fumofff

b:id:furseal

b:id:fuzyy

b:id:gakkouhate

b:id:galapagosu

b:id:gbkmm

b:id:ge4678

b:id:gf_ra2

b:id:gfd00016

b:id:ginori446699

b:id:giyo381

b:id:gkmond

b:id:Gl17

b:id:gomaaji

b:id:gomunaga

b:id:gorgeous1020

b:id:goturu

b:id:grdgs

b:id:guguguguPC

b:id:ha8i1i8ah

b:id:hahihahi

b:id:hanajibuu

b:id:hanamizuruzuru

b:id:Hanpuu

b:id:hapilaki

b:id:hapoa

b:id:hase0510

b:id:hate_flag

b:id:hatebutabooboo

b:id:hatehenseifu

b:id:Hayano

b:id:hazlitt

b:id:hdance

b:id:heaco65

b:id:headspa

b:id:Helfard

b:id:hellshake

b:id:helvet

b:id:hetoheto

b:id:hikakinnouraaka

b:id:Hipparchus

b:id:hirokichin

b:id:hiroshe

b:id:hituzinosanpo

b:id:ho4416

b:id:hobbiel55

b:id:hocopi

b:id:houjiT

b:id:hryord

b:id:hunyoki

b:id:hutottyo3

b:id:hyoutenka20

b:id:hyujico

b:id:I_L_S

b:id:iasna

b:id:ifttt

b:id:II-O

b:id:IkaMaru

b:id:ikurii

b:id:imakimam

b:id:Ingunial

b:id:inouey

b:id:invalid_touhu

b:id:irbs

b:id:ironsand

b:id:ishikawake

b:id:iwagrandstar

b:id:j3q

b:id:japonium

b:id:jd9

b:id:jpmccartney-jo

b:id:julienataru

b:id:junk6

b:id:k-holy

b:id:k-wacky76

b:id:kaakaa_hoe

b:id:kae1990

b:id:kagehiens

b:id:kagobon

b:id:kajuido

b:id:kamenoseiji

b:id:kangiren

b:id:kantei3

b:id:kathew

b:id:KAZ99K

b:id:kei_1010

b:id:keisuker

b:id:kemboorg

b:id:kemononeko

b:id:kenjou

b:id:kettkett

b:id:keys250

b:id:khtokage

b:id:kibarashi9

b:id:kibiya

b:id:kiku72

b:id:kikurages

b:id:kimokute-kanenonai-obasan

b:id:kingate

b:id:kinnosabakan

b:id:Kitajgorodskij

b:id:kitamati

b:id:kiwi0120

b:id:kizimuna06

b:id:kk_clubm

b:id:kloud

b:id:knjname

b:id:kokosoko

b:id:Kouboku

b:id:kowyoshi

b:id:krarie

b:id:kudoku

b:id:kumanomiii

b:id:kumpote

b:id:kuro_pp

b:id:kurolab1028

b:id:kuxttoba

b:id:kuzira4ever

b:id:kuzumaji

b:id:kxkx5150

b:id:kyasarin123

b:id:kyogoku174

b:id:lady_joker

b:id:lag-o

b:id:laislanopira

b:id:layback

b:id:lc475nyks

b:id:lectro3000

b:id:localnavi

b:id:lololol_stWh2

b:id:Louis

b:id:Lumin

b:id:MacRocco

b:id:maeda124

b:id:makeyoulaugh

b:id:mame_3

b:id:mamezou_plus2

b:id:marimonbunny

b:id:marony0109

b:id:maruX

b:id:masa_bob

b:id:masabossa

b:id:masahiko_of_joytoy

b:id:masahiro1977

b:id:masakanou

b:id:masao_hg

b:id:masudatarou

b:id:matchy2

b:id:maturi

b:id:MCBYND

b:id:medakamaster

b:id:meshupecialshi1

b:id:mikawa_1964

b:id:millitant_girl_hana

b:id:miluru

b:id:mionhi

b:id:miraiez

b:id:Miroc

b:id:miruna

b:id:Mirunayo

b:id:misopi

b:id:miyakawa_taku

b:id:miz999

b:id:mku2

b:id:mmm143

b:id:moegi_yg

b:id:mohno

b:id:momojiro5200

b:id:mon_sat

b:id:monster-energy-zx14

b:id:mopo123

b:id:moppii

b:id:morikakeokawari

b:id:morimarii

b:id:motobitsrk

b:id:mouseion

b:id:mozukuyummy

b:id:mozz1207

b:id:muchonov

b:id:mugi-yama

b:id:mugicha1000

b:id:mujisoshina

b:id:munioka303

b:id:mur2

b:id:murasakizaru

b:id:mutinomuti

b:id:muutarosan

b:id:myaoko

b:id:n_231

b:id:nachurie

b:id:nack1024

b:id:nakag0711

b:id:nakami_midsuki

b:id:namawakari

b:id:nanana_nine

b:id:nankotsu2

b:id:nao_cw2

b:id:napsucks

b:id:nashirox

b:id:Nean

b:id:neogratche

b:id:nerineko1205

b:id:nissax

b:id:Nobeee

b:id:noemi_itoh

b:id:numtostring

b:id:o8i8s8k8a

b:id:ohayo0

b:id:ohchidani

b:id:ohisashiburi

b:id:oilanlion

b:id:Oji6

b:id:okemos

b:id:oktnzm

b:id:omanchi

b:id:omfnskkak

b:id:onesplat

b:id:ono_matope

b:id:oops_design

b:id:oreoreoore

b:id:osaan

b:id:oshisage

b:id:otation

b:id:Outfielder

b:id:p_funny

b:id:pandaporn

b:id:paradisemaker

b:id:parallel-world

b:id:Parama222

b:id:Pgm48p

b:id:pj_lim

b:id:plenao

b:id:Polyhymnia

b:id:ponjpi

b:id:ponyoponyokun

b:id:popoi

b:id:ppummu

b:id:pratto

b:id:preciar

b:id:proverb

b:id:pukarix

b:id:pzp

b:id:qpni

b:id:quality1

b:id:questiontime

b:id:rag_en

b:id:rakugoman

b:id:riawiththesam

b:id:ribbentrop189

b:id:rider250

b:id:rig

b:id:right_eye

b:id:ringonouen

b:id:RIP-1202

b:id:rKoneru_waiwai

b:id:rocoroco3310

b:id:rodprice

b:id:rti7743

b:id:rurisizimi

b:id:ryun_ryun

b:id:sanshiro921

b:id:sanui0822

b:id:sanukite

b:id:sawaglico

b:id:scopedog

b:id:scorelessdraw

b:id:segawashin

b:id:sekreto

b:id:senbuu

b:id:shea

b:id:shibainu46

b:id:shibaone

b:id:shibuya12

b:id:shimajitan

b:id:shimomurayoshiko

b:id:shin2rou1971

b:id:shinobue679fbea

b:id:shinonomen

b:id:shira0211tama

b:id:shiroikona333

b:id:shsh0shsh

b:id:sika2

b:id:silentliberater

b:id:sin4xe1

b:id:sink_kanpf

b:id:sippo_des

b:id:sisopt

b:id:skicco

b:id:snobbishinsomniac

b:id:songsfordrella

b:id:soratansu

b:id:spirobis

b:id:ss-vt

b:id:ssig33

b:id:starmiss

b:id:stkmkt

b:id:stonedlove

b:id:stp7

b:id:suikax

b:id:sumika_09

b:id:supu6000

b:id:surume000

b:id:sushi-K

b:id:sushisashimisushisashimi

b:id:syasara

b:id:syo-sa19820615

b:id:table

b:id:taimatu

b:id:takamurasachi

b:id:TAKAPPRS

b:id:takashi1211

b:id:takayoz

b:id:take1117

b:id:takuzo1213

b:id:tamu2822

b:id:tanzmuzik

b:id:techboon

b:id:tekitou-manga

b:id:tel30

b:id:teto2645

b:id:tetsuya_m

b:id:theta

b:id:timpotoolf

b:id:TKC1984

b:id:tmurakam

b:id:tnakamura

b:id:tnishimu

b:id:toakai

b:id:tokage3

b:id:tokatongtong

b:id:tomoeyabunko

b:id:Tora1014

b:id:toratsugumi

b:id:toririr

b:id:toro-chan

b:id:townphilosopher

b:id:triceratoppo

b:id:tukanpo-kazuki

b:id:u_xxxx

b:id:uehaj

b:id:ugutan

b:id:ujuki

b:id:unakowa

b:id:underhitpoint

b:id:unfallen_castle

b:id:unfettered

b:id:usi4444

b:id:ustam

b:id:utibori1

b:id:vanillayeti

b:id:vbwmle

b:id:vjdvnf43vd

b:id:vkgofboston

b:id:Wafer

b:id:warp9

b:id:warulaw

b:id:watarux

b:id:wumf0701

b:id:X-key

b:id:xevra

b:id:yakouhai

b:id:yamadatakasi

b:id:yamamoto-h

b:id:YarmUI

b:id:yas-mal

b:id:yasudeyasu

b:id:yasyas

b:id:yoiIT

b:id:yoko-hirom

b:id:yoshis1210

b:id:you1983

b:id:youco45

b:id:your

b:id:yuki_furu

b:id:YUKI14

b:id:z1h4784

b:id:zakinco

b:id:zentarou

b:id:ZeroFour

b:id:zu-ra

b:id:zu2

b:id:zyugem

b:id:zyzy

b:id:zzzbbb

2019-04-15

anond:20190415042641

ざっくりだし同じこと言ってるところもあるかもしれないけど、自分解釈はこんな感じ。

2000年以前は社員数名の弱小エロゲメーカーが小粒の良ゲーを発売できていたが、ボリューム重厚長大化によって開発期間が長期化、開発費は高騰化し、弱小エロゲメーカーの体力がもたなくなった

上記に関連して、そもそも小粒のエロゲーなら流通に乗せる必要もなく同人で出せばいいということに気づいた

2000年移行のファイル共有ソフトカジュアル化も弱小エロゲメーカー沈没を加速した

PS2/PSP(Vita)の頃に全年齢対象版を出す流れがあって割と売れたので、そもそもエロゲである必要があるのか?と気づいた(Key

エロゲが衰退したのはラノベのせい、、、ではない

http://kazenotori.hatenablog.com/entry/2019/04/14/113600

 

00年前後青春ど真ん中だったエロゲヲタのひとりとして衰退理由一言でまとめると、、、

オタクサブカル最前線という地位を失ったから」

だと思う。

あの当時の作品若いオタク熱狂させる力があった。

Leafでいえば『雫』『痕』『To Heart』。Tactics/keyでいえば『MOON.』『ONE』『Kanon』『AIR』『CLANNAD』。TYPE-MOONは『月姫』『Fate/stay night』。エロゲではないけど同人の流れをくんだ『ひぐらしのなく頃に』。

この辺のソフトプレイヤーを熱くさせ、語りたい欲を大いに刺激し(葉鍵板なんてのもあった)、「これエロゲーじゃないか泣きゲーから」などという妄言を口走りながら周囲にプレイを勧めさせるだけの力があった(売上だけなら『鬼作』とか『大悪司』も当時強かったけど語るもんでも勧めるもんでもないから伝播力に欠けた)。

これらはざっくり「伝奇/サスペンス」「泣き」に分けることができてそれぞれブームを作ったけど、かなしいかなそれに続くブームはつくれなかったし、フォロワー作品は年を追うごとに小粒化して(初期は『sense off』とか『みずいろ』とか『秋桜の空に』とか『それ散る』とか良質なフォロワー作品がいっぱいあった)エロゲ全体のブームを急速に沈下させた。エロゲ時代は突然やってきてあっというまに終わった。

自滅、というのは言い過ぎかもしれないが、文化として根付かせることができなかった、ぐらいは言ってもいいだろう。

粒が小さくなって新しい体験提供できなくなったエロゲ世代交代(『恋姫シリーズ世代はいると思ってる)に失敗したし、熱狂してた連中はエロゲといっしょにオタク卒業するか新たな最前線へと旅立っていった。

それは『ラグナロクオンライン』/『東方』(RO2002年開始だけどコミケ流行葉鍵/型月→RO東方と変わっていった(型月はしぶとく東方共存してたような記憶)のは大きなトピック)だったり、ラノベ西尾維新/『ハルヒ』/『とある』/『ゼロ魔』)だったり、ニコ動ボカロアイマス文化だったりした。

ブームが完全に去った現代ソシャゲ(『艦これ』/『デレマス』/『グラブル』/『FGO』)でゲーム体験を満たしつつエロはその同人摂取する時代から本格的にエロゲの出番はないだろう。ニッチ需要同人エロゲが担っているから尚更だ(『奴隷との生活』はヒットしたなあ)。

 

最初URLをはったブログではエロゲの衰退理由として

1. ラノベ深夜アニメソシャゲ(あるいはスマホゲー)など他のメディアに客を奪われた。

2. ファイル共有ソフトなどにより海賊版蔓延して購入者が減った。

3. CDからDVDへの移行、スマホの普及、光学ドライブのつかないノートパソコンの普及など、周辺環境の変化によりプレイヤーが減った。

4. エロゲ大長編化による制作コストプレイコストの上昇。

の4つがかかげられていたけど、

1. はラノベ以外時代がズレてる

2. は共有ソフト以前にコピー問題があったので要因とまではいえない

3. はスマホの普及以外論外(エロゲをやるためにパソコンを買う・組む連中は多数いた。DVDへの移行なんて屁でもないし、光学ドライブがつかない云々はDL販売とかUSBドライブ存在無視してる)

4. は正しい。制作コストの増加とプレイコストの上昇は別問題なので切り分ける必要はあるが、これらの問題は大きかった

という所感。

 

上記以外の理由としてはこのエントリの主張であるオタクサブカル最前線という地位を失ったから」と、もうひとつあるとすればスマホの登場による可処分時間の細切れ化。エロゲをやるようなオタクはもともとインターネットとの親和性が高かったわけで、スマホの登場でネット常時接続する消費スタイルへ移行すると、パソコンに向かってじっくりエロゲプレイするなんてことが難しくなった面はあると思う(ここに物語長大化によってプレイコストが上昇した問題からんでくる)。

 

まあ同人エロゲエロゲといえばエロゲだし、DMM GAMESのエロゲも形をかえたエロゲと言えるだろうし(大本オモコロ記事はまさにその宣伝だ)、FGOエロゲに含めれば(含めるな)過去最大のエロゲ市場爆誕してると言えるのかもしれないが。

 

追記

Q. 「オタクサブカル最前線という地位を失ったから」ってそれトートロジーじゃないの?

A. そう見えるかもしらんけど、オタク熱狂させる弾がなくなったから、という話をしてるつもり。

逆になんで00年前後にそういう作品雨後の筍のごとくでてきたかというとまあ割と謎なんだけどひとつ言えるとしたら若いクリエイター申し訳程度のエロさえつけてれば自分のやりたいことをやれる場所だって認知されたことがデカいんじゃないかなーって(日活ロマンポルノみたいなやつって言えば伝わるのかね)。

Phantom -PHANTOM OF INFERNO-』ってエロゲがある。ニトロプラス(今はたぶん刀剣乱舞で有名)の処女作シナリオぶっさん虚淵玄。今だと『まどマギ』で有名……ってそれももう古いか)。

アメリカ旅行した青年が殺しの現場を見たせいでマフィア拉致られ暗殺者をやらされるって話なんだけど、ハードボイルド小説映画かってあらすじでもうエロゲじゃないよね。で、なんとこのゲーム暗殺に使う銃を選べて、なおかつその銃がポリゴン表現されてた上に、どの銃を選んでもシナリオには一ミリも影響がない、というのが爆笑ポイントで単に作り手がそういうの好きなだけっていう。当時すでにIllusionとかがポリゴンエロゲを世に送り出してたとはいえ銃だけポリゴン表現にしたエロゲって『Phantom』が最初最後じゃねーかな(ゲームめっちゃ面白かったよ念の為)。

『雫』だって新興宗教オモイデ教』のフォロワーだし、菌糸類が菊地秀行とかの影響モロに受けてるの見ても、外の文化エロをつけてエロゲ流通に乗せる、は所謂たまによくあるってやつだった(そういうのの元祖はたぶん蛭田昌人と剣乃ひろゆき)。

まあ結局売り手も買い手もスケベ心があったんだよな。当時はエロさえ入れてれば一定の購買が見込める市場で、市場が未熟な分、制作コストが安くすんだ。買う方としてもエロがあるだけでオトクな感じがしたし地雷でも許せた(Tony絵に騙されて買った『Partner』ですら俺は許したよ)。上で挙げた諸作が仮に非エロだったらここまで売れてなかったと思うね(『CLANNAD』とか『ひぐらし』は地盤を築いた後だったからヒットした説)。

 

さら追記

エロゲ商業パッケージ)の売上は2015年に底を打っててV字回復しているとか,10年代でも名作はあるとか,本当に崩壊したのはエロゲ批評コミュニティだとかいう話をすればいいんです? / “エロゲが衰退したのはラノベのせい、、、ではない”

https://twitter.com/nix_in_desertis/status/1117750519840198656

なんだろな,一連の流れを読んでいて思うのは,『千桃』とか『サクラノ詩』とか『金色ラブリッチェ』とは言わんにせよ,『ホワルバ2』とか『はるくる』とか『つり乙』あたりをスルーされると,お前エロゲ追わなくなって10年近くないか感強くて,一気にもにょるんだよな。

https://twitter.com/nix_in_desertis/status/1117753560047898624

こういう論旨を理解せずに訳知り顔するやつが一番むかつくんだよね。

とりあえずエロゲ市場規模は02年の段階で560億(財界さっぽろ)、15年の実績値で150億(矢野総研)。V字回復というからには18年実績値で300億ぐらいに戻してるんだろうな?

そして本稿は00年台前半にエロゲ市場が盛り上がったあと衰退した理由をその当時オタクシーンの最前線をはれる弾がありその後そういうのがなくなったから、に求めてるのであって、それ以降にエロゲとして名作と呼ばれる作品があったかなかったかなんて話は一切していない。

俺が最後にやったエロゲは『もっと!孕ませ!炎のおっぱい異世界エロ魔法学園』(2018年4月27日発売)だ。ゲスパーすんなヴォケ。

 

またムカつくコメントがついたら全力で殴りに行く。

2019-03-13

anond:20190313104523

Light colorsとは (ライトカラーズとは) [単語記事] - ニコニコ大百科

https://dic.nicovideo.jp/a/light%20colors

... ないが、完成度の高いメロディーと深いテーマを持った作品ストーリーを上手く表現した歌詞は非常に評価が高く、key楽曲の中でも屈指の名曲との声も少なくない。 またこの曲を使用した動画では、1番及びラストのサビの「プリズムを通した」の部分が弾幕 ...

2019-03-12

anond:20190311205913

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13176679408

この歌詞どう思いますか?

鍵穴 平井堅

もっと奥深くまで触れて君に届きたい

新しい世界こじ開けたいこの鍵で

I've got a perfect key 右曲がりの

君の繊細な鍵穴にfitするかな

刺さったまんまで Stay with me 鏡越しに君と目が合って

淫らなポーズで Say my name 鍵をかけて遥かかなたへ

ふくませて 匂(かお)って にじませて

そんなすぐに欲しがらないで スペアキーは無い

君の顔が歪む度に 膨らんで

Do you want a special key? そびえ立ってる

君が隠してる鍵穴にjugしたいな

初めは焦らして1.2.3. 動物より露骨な僕等

おねだりするよに Say my name 卑猥なこと声にしてみて

刺さったまんまで Stay with me 鏡越しに君と目が合って

淫らなポーズで Say my name 鍵をかけて遥かかなたへ

絡まって 砕けて 溶け合って

2019-02-23

anond:20190223045232

perlでは連想配列

しかし、この話を読んでJavaだけ違うよなって思ってしまった。他のはみんな実装言語処理系にお任せだけれど、JavaだけはMapは単なるインタフェースで、どの実装にするかはお前が選べってところがねぇ。こいつだけはGenericsを使って、keyvalueの型を指定するのも違う。

Javascriptはプロトタイプベースオブジェクト指向言語から、こいつもこいつで思想が他のと違うんじゃないかとも思えてきた。

2019-01-22

[] Japanese research and development collapsed by the Chinese government

It is not acceptance of immigration as a labor force population to save the country from GDP reduction due to population reduction.

Many of the simple labor supplemented with foreign workers can be automated by computer.

By raising technological innovation in supercomputers and artificial intelligence development, increasing the productivity by fully automating the factory, increasing the productivity by means of the automation of the store by the AI ​​monitoring system leads to economic growth and it is not necessary to easily accept immigrants.

The key to supercomputer operation is "power consumption", while the U.S. and U.S. are fighting for supercomputing on the basis of computing capacity, Japan is always supercomputer with a low power supercomputer ranking, "Green 500" It is contained.

Japan has high technical capability in low power consumption supercomputer.

The third superior in "Green 500" in June, 2018 is supercomputer using Japanese PEZY computing technology led by Mr. Motoaki Saito.

However, there were only a few media to cover about this low power consumption type supercomputer technology that the US and China seek pursued behind PEZY's "grant fraud" report.

 

 

[中国] 中国政府に潰される日本研究開発 https://anond.hatelabo.jp/20190122195754

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

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

anond:20190101162210

やすいように フルソー

青い■を表示するだけ

// 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);


		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(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}


		return TRUE;

	}

	BOOL OnPaint(PAINTSTRUCT &ps)
	{
		HBRUSH hBrush = CreateSolidBrush(RGB(48, 48, 246));
		RECT Rect = { 0,0,48,48 };
		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;
}

anond:20190101161939

次の解説

staticキーワードを付けることで

クラス内にグローバル関数から呼べる関数を作る

これでHWNDを通して

グローバル関数にthisポインタを伝える

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

anond:20181231104029

// 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);


		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(&msg, nullptr, 0, 0))
		{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
			{
				TranslateMessage(&msg);
				DispatchMessage(&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, &ps);

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


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


Windowsシステムは基本 グローバル関数なので

グローバル関数<>クラス化されたメソッド

ブリッジ関数を書いた

2018-12-21

https://anond.hatelabo.jp/20181221162102

七福神 -- Key:雑学事典より。

後に福禄寿寿老人が加えられ、七福神誕生することとなった。この際、五福神福禄寿を加えただけでは六福神になるため、「福」と「禄」を福禄寿とし、「寿」だけを独立させて寿老人を作り、無理矢理七福神としたと伝えられる。

福禄寿寿老人神様ではなく仙人であり、元々数合わせ的に参加させられたためか、元禄10年(1697年)の『日本七福神伝』には、「福禄寿の変わりに吉祥天七福神に加えてもよい」と記され、また享保年間(1716-1735年)の『書言字考』では寿老人に代えて猩猩七福神の一柱とされている。また、寿老人福禄寿はともに南極老人星化身とされることから、この二神は本来同一とみなし、寿老人の代わりに吉祥天猩猩が入れられた時代もあったといわれている。

2018-12-20

自分デッドロック対策トランザクションかけてる時は、primary key昇順で更新するように気をつけるてるんだよ、

でも他の人はselect ... for updateで別トランザクション更新後の値を取得しつつデッドロック対策してて、自分もその書き方に直すとなると結構手間だな

2018-12-13

当時16歳の私から見た『涼宮ハルヒの憂鬱

私は1990年まれ高校の時にリアルタイムハルヒニコニコ動画出会った男性です。あまりアニメ全般については詳しくありませんが、私の経験の限りにおいてハルヒについて語ってみます

ハルヒは当時の印象では「わけがからないが、とにかく新時代のすごいアニメ」という作品でした。一つ一つの要素を見ると取り立てて珍しいものではないのですが、それらをアレンジするセンスと細部のクオリティがずば抜けていたと思います

まず、日常系学園ラブコメと高度なSFとを融合させたアニメが珍しかたことは記憶しています。当時の私はスクールランブルあずまんが大王にハマっていましたし、エヴァンゲリオンカウボーイビバップも大好きでした。しかし、両者の世界観が融合するような日常系アニメがあり得るとは思ってもいませんでした。その後六畳間の侵略者ニャル子さんなど似たような作品が出てきましたが、少なくとも当時の私にとっては斬新な世界観でした。

もちろん作画も素晴らしかったです。これについて私はほとんど語れませんが、日常系萌え作品であれだけぬるぬると人物を動かしたことには驚きました。それまではロボット飛行機をどれだけなめらかに動かすのかについては意識してきました。しか美少女の手足や顔を実写のように丁寧に動かすことについては、ほとんど注目していませんでした。明らかにキャラクター日常身体動作を美しく作画する流れは、けいおんやその他の萌えアニメに繋がっていったでしょう。

また、ブログや2chなどでの考察が盛んになったのもこの頃でした。ハルヒは謎が多い設定や話数シャッフルなど、視聴者探究心を刺激するギミックが多数仕掛けられていました。当時のアニメブログ上では考察記事参考書籍の一覧があちこちで見られ、2chでは解釈を巡る論争が白熱していました。その後、シュタインズ・ゲートまどマギでも同じような光景が繰り広げられることになります

さらにはニコニコ動画Youtubeの「ハレ晴レユカイ踊ってみた動画社会現象になりました。この流行高校生や大学生の社交的な人々の多くが参加したこと意味は大きかったです。これによって電車男以来続いてきた、社会におけるオタク文化容認の流れが加速することになったと思います。深夜に放送している萌えアニメが、陰気なオタクが見るものから「(女性も含めた)普通の」中高生も楽しめるものに変わる転機でした。

2000年代京アニは、Key作品のような男主人公ハーレムかららき☆すたけいおんのような百合日常物へと変化していきました。それは2000年代から2010年代にかけてアニメの潮流がエロゲ的な物からラノベきらら的な物、オタク的な物からサブカル的な物、男性作家原作から女性作家原作へと変化する動きと重なっているように私には見えました。そういったアニメ界の地殻変動結節点存在していたのがハルヒであり、90年代文化終焉10年代に続く新たな文化の始まりの両者を象徴するアニメだったのではないかと今にして思うのです。もしかするとハルヒのこうした両義的な立ち位置フォロワーの少なさに影響しているのかもしれません。

ちなみに2010年前後の私は一連のアニメ業界流行の変化を「男性向けアニメ少女マンガ化」だと漠然と感じ、個人的にそのことを嬉しく思っていました。というのも私はエロゲ象徴されるようなハーレム作品が苦手で、少女漫画百合が大好きだったからです。けいおん以降の百合アニメ全盛のこの10年間は私にとってアニメ黄金期でした。今後、ハルヒやその前後アニメの潮流は、どのように分析批評されるのでしょうか?近い内にどなたかが『10年代想像力』を書かれる日を楽しみにしています

ハルヒ第三次オタク黎明期〜隆盛期間だから分析は難しい

anond:20181212171225

ちょいちょい分析として抜けてるので勝手上から目線で補足してみたい。

下手くそ補足ってことは最初に謝っておく

あくま社会的観点として分析で、

作品の是非や好みは個人問題だと思う。

京アニについて

京アニハルヒ以前にAIRがあり、加えてもともと人気ラノベフルメタの二期もやりきり、

すでに実力派だったよね。Key作品もあったから、

人気原作 + 泣き演出 + 作画 という武器の多さもあったと思う。

ラノベブームは背景にエロゲブームもあったのよ

ラノベエロゲ同人月姫ひぐらし)が相互に影響を与えていったというのがある。

メディアミックス読み物コンテンツアニメ化が色々されてきた頃だった。

今はエロゲ原作ってほとんどないんだよな。。

音楽は歌だけでなく、劇伴人気もあった。

今はアニメ界のAKBであるアイドルマスター楽曲をやっていたMONOKAの人が

劇伴担当してコア層も確保してた。

メディアミックス展開のお手本というのがハルヒの一番の強み

まとめの通り社会的な変化が背景にあった。

加えて、ハルヒアニメ人気がでたあとも、二期までは本当に

毎月といってもいいくらい何かしらコンテンツを順繰りに出し続けてた。

アニメ

ラノベ新刊

マンガ

フィギュア

ゲーム

キャラソン

イベント

・毎年7月サイト更新とか

今はどの作品も当たり前のようにやりすぎてる手法麻痺してるけど、

オタクコンテンツがまだ少ない当時、

ここまで上手に展開し続けたのは当時少なかったじゃないかな。。

これも角川の資本があったからだと思う。

最後個人的な感想

なんだかんだハルヒ面白い

小説ラノベを初めてまとめ買いした作品だった。

SFとか全然しらなかったけど、

野ブタをプロデュースとか、蹴りたい背中とかもあったからかな、

当時は作品青春をすごく感じた記憶がある。

ほんと純粋に魅力があったよなーと思うわ。

2018-12-03

日本ポリコレって女性限定から男性オーケーな変更が多い

https://ja.m.wikipedia.org/wiki/ポリティカル・コレクトネス

これ見てて思った

性別限定する職業を男女共通で使えるようにするのもポリコレだが↓のように

職業 伝統的な表現 ポリティカル・コレクト表現

議長 chairman chairperson または chair

警察官 policeman police officer

消防官 fireman fire fighter

実業家 businessman businessperson

写真家 cameraman Photographer[要検証 – ノート]

要の人物 key man key person

英語で見ると男性限定表現だったもの女性も使えるようになった例が多い

それに対して日本女性限定名称男性も使えるように変更されたものが多い。

この違いはどこからまれたのか興味深い。

カメラマンビジネスマンキーマンのような海外では既に改定された用語はそのままなのは日本人はマン=男という意識が薄いからだろうか?

従来の用語 中立用語 備考

看護婦

看護士 看護師 2002年保健師助産師看護師法改正男性職業に就いているため。

障害者 障がい者

障碍者 「害」の字が使われていることに不満がある人の感じる悪い印象を回避するため。2001年平成13年)に東京都多摩市最初採用

助産婦 助産師 2002年保健師助産師看護師法改正。ただし現行では資格付与対象女性限定である同法3条)。

保健婦 保健師 2002年保健師助産師看護師法改正

保母

保父 保育士 1999年児童福祉法改正男性職業に就いているため。

スチュワーデス

スチュワード 客室乗務員

フライトアテンダント

キャビンアテンダント (CA) 1996年日本航空が従来の呼称廃止。他社も追随した。世界航空会社では、男性従事している。

土人 先住民 1997年北海道土人保護廃止

トルコ風呂 ソープランド トルコ人留学生、ヌスレットサンジャクリの抗議により、1984年に改称。

肌色 ペールオレンジ

うすだいだい 人種により、肌の色は異なることから

女優 俳優 男優という言葉があるのにもかかわらず、男性のみに俳優という肩書が使われることが多いため。

メクラフランジ 閉止フランジ JISなども改正済み 英語ではblank flange・blind flangeなどと云い、JISでも記号BLと残る

2018-11-26

商品名とかの頭文字にiつけるやつ

ここ10年くらいずっと思ってたんだけど、商品名とかサービス名の頭文字「i」つけるやつ多すぎて鬱陶しい。

なので、由来を調べてみた。

Apple製品

iMaciPodiPhoneiPadiCloudなど。統一感があるといえばそうだけど、アイアイうるさい。

由来は、

The person to ‘blame’ for the massive i-trend is Ken Segall. After presenting the see-through drop-shaped monitor, Jobs was in desperate need for a name that would suit it, and its follow-ups. The key importance of the new product was that it would be easily used for internet work – that was the design. And they wanted to incorporate the Macintosh brand in the name. So Segall proposed iMac – an internet-Mac. The ‘i’ as a prefix could also incorporate other adjectives such as individual, innovative, imaginative etc, depending on the product.

(HIGHNAMESより)

ということらしい。「i」頭文字に持つポジティブ英単語が多すぎるのが悪い。

ちなみに、Apple Watchが慣習に則ってiWatchと命名されなかった理由については、Why the Apple Watch isn't called the iWatchでは商標問題だとかApple Watchは、なぜ「iWatch」ではなかったのかではコンセプトの問題だとかいろいろ憶測が流れている。

iモード

iモード」の『i』は、インタラクティブ・インフォメーション・インターネット頭文字の『i』、そして英語で「私」の意味の『i』であるとされる。

(Wikipediaより)

ありがちなやつな。当時は先進的だったのかもしれないけど。

iGoogle

A prime example of a good product with a really bad name. Formerly Google Personalised Homepage, in a rare mistake by Google they chose to rename it using the faux Apple and now meaningless 'i' prefix, meaning 'Internet'.

(Urban Dictionaryより)

Urban Dictionaryなので信憑性はない。当初の名前が「Google Personalized Homepage」であったことを考えると、「私」の意味での「i」だと言われた方がしっくりくるけど、由来が何であれ、この名前はださい(愛用はしていた)。

IPython

Interactive Python

そういえばirbもInteractive Rubyか。

iframe

Inline Frame。

これはちょっと毛色が違う。一括りにしてごめんな。

===

実際書き出してみたら、意外とそんなに思いつかなかった。もうこれ以上出てこないでほしい。

2018-11-13

タッチタイピングの速度と仕事の速さ(出来不出来)は関係ない

5分で1200文字打てる自分の持論である

ほぼ関係ないと思う

20代前半から5分で7~800文字は打てていた。タイピングだけで言うなら日常業務レベルなら一級品だと思う(特殊仕事ではない限り)

しかし、当時一番残業が多かったのは自分だった

いつも定時に帰るおばちゃん(と言っても先輩)は、社内ではちょっとした有名人で俺もよく仕事の進め方を怒られてたし、俺もその人に頭を下げて仕事の進め方を教わった(その人はもともと人に教えたがる人ではない)

から、その時教わった事は今でも血肉になっている

そんな彼女キーボードを両手人差し指で打っていた。今でも覚えている。なのに一番早く帰る

彼女に口酸っぱく言われた事は「全体像の把握(試験開始後、問題用紙をすぐ解くのではなく、まずは一通り眺める・・というのに近い)」「ゴールから逆算する事」「何にどれだけ時間がかかるのか正確に把握する事」「他人をうまく使う事」「断る事(電話になんて全部出るな!など)」・・など目からうろこの話しばかりであったが、そこには「キーボード一生懸命早く打つこと」や「入力ミス率を下げる事」なんてワードはただの一度も出てこなかった。

その後彼女は辞めて、タイピングはコツコツ練習を続けて、5分900文字くらい打てるようになっていただろうか。それでも残業が多く、いつもストレスをためていた

当時所属していた部署課長。30代で課長になったらしく、うちの会社の中では出世スピードダントツで早いという人だった

その人もまた、キーボードを両手人差し指で打っていた。俺と課長で100m競争したら、90mハンデもらっても勝てるLV。それくらい彼は遅かった。

でも、仕事が遅かったのは俺だ

現在5分で1200文字前後。 1秒当たりの数字key/秒)はだいたい6~6.2ぐらいなのだけど、周囲の人間よりはダントツキー入力は早い

でも、ダントツ仕事が早い訳ではない。もうこの年齢になればわかる。

仕事段取り八分であってキー入力ではない、というのが俺の結論

追記

1秒当たりの数字key/秒)はだいたい6~6.2ぐらい・・がいまいち実感がない人たちへ。

http://neutral.x0.com/home/ghost/

ゴーストタイピング

上記サイトでは実際に登録したタイパー達のゴースト(実際にランキングに挑んだ時の残像が記録されている)と戦う事が出来る。

ハイレベルカテゴリの最下層がちょうど俺ぐらいなので、6.0当たりの奴と一度戦ってみるといい。スピードが実感出来ると思います

隣の芝生は青く見えるってね。

アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん