「アプリケーション」を含む日記 RSS

はてなキーワード: アプリケーションとは

2019-04-22

例のアレ

Aさん

Vue.jsで大規模アプリケーション作れるの?ってよく聞かれるのですが、「ぼくがいれば大丈夫です」って返してます

Bさん

完成間近で突然連絡付かなくなってバックレたエンジニアが、僕がいればVue.jsの大規模案件大丈夫みたいにつぶやいてるツイートが流れてきてさすがに朝から不快感MAXになった。

途中清算の金振り込んだ瞬間連絡つかなくなるって、この狭い業界でよくできるよね

Bさんのは消えた?真相は如何に

2019-04-19

anond:20190419212411

SIerで働いてるけど、インフラ屋じゃなくてもAWSは使うしDB設計普通にアプリケーション開発の部分じゃないのか

100歩譲ってAWSインフラ屋の仕事だとして、DB触らないで作れる範囲ってずいぶん限られないか

Webデザイナーとかなら分からんでもないけど

2019-04-15

プログラミングスクールメンターやってるけどもうやめたい

オンラインスクールJavaを教えているけどもうやめたい。。。

やめたい理由1: 生徒さんのPCスキルがなさすぎる

プログラミングスクールの受講生が若いからある程度年とった人まで幅広いのだが、

プログラミング以前にPCスキル自体がない人が多すぎる。

中には「ファイル作成する」といったこともわからない生徒さんもいた。

基本的Slackでのサポートがメインになるので、そこまで細かく教えてあげることが難しい。。

またSlackでのレスポンスも遅いため、ちょっとした問題に何時間もかかってしまい、お互い疲弊するのがホントしんどい・・・


やめたい理由2: そもそもJava初心者に向いてない

Javaという言語プログラミング初心者向けじゃないなと感じている。

なぜかというと自分の書いたプログラミングの実行結果をすぐに得ることができないから。

特にWEBアプリケーションなんかだと画面に表示するまでの、プロジェクト作成ですら大変なので

やっていて面白くないだろうなって感じている。

だんだんモチベーションが下がってきて、ただ高い受講料を払っているので義務感を感じつつ学習を進めているので、

だんだん生徒さんの態度も厳しいものになってくる。。。つらい。。。

やめたい理由3: 他のメンターくそ

一番大きいのはこれかもしれない。

他のメンターが正直言って糞だと思う。

同じ時間に入っていて、まったく働かないメンター (自分10対応しているのに1人対応して終わるとか)がいたりとか、

生徒さんのメンタリングレポートにひどいこと書いてたりする(知能障害がおありでは? なんてお客さんに向かって書くことじゃないだろう)

メンターがいたりとか。


お金がほしかったのと自分勉強になればと思ってはじめたが、

人に教えるってストレスたまるんだなーと感じた

2019-04-10

https://crypto.watch.impress.co.jp/docs/news/1178850.html

> 経産省二次創作物著作権利益分配をブロックチェーン管理する技術要件定義をまとめ報告


> 検討にあたっては、音楽のn次創作二次三次もしくはそれ以降)を発信・視聴するプラットフォームとして、原作コンテンツとn次コンテンツ制作者の権利関係の記録や

> 利用者からの支払対価の分配を行うサービスアプリケーションを題材に議論。そのサービスアプリケーション必要な想定される機能として、権利権利者の特定をする

> 「登録機能権利者間の利益分配を行う「分配」機能、そして利用者からの対価を支払う「支払い」機能の3つを、ブロックチェーンに関する技術的な要件定義として

> 取りまとめている。


このあたり、正直役所企業には立ち入って欲しくないというか、下手をすると漫画同人JASRACみたいな物が出来て、音楽業界の二の舞になるですよw

てか、確かに儲けも欲しいけど、盛況になっているのは儲けだけが理由じゃないという辺りを分かって欲しいというか、分かっていない連中が触れると(グレーゾーン的な部分も含めて)バランスが大きく崩れて壊れてしま可能性があるというのを理解して欲しい

2019-04-04

anond:20190404160318

FM TOWNS が発売された当時は、なんて魅力的なハードウェアを作る会社なんだろうって

クワクしながら、広告を眺めていたんだ。

当時としては画期的な1677万色中256色発色機能PCM音源を標準搭載し、強力なグラフィック機能オーディオ機能を誇っていた。

また、当時の家庭用ゲーム機では一般的スプライト機能も搭載されており、ゲームプラットフォームとしても当時の人気機種だったシャープX68000に劣らぬ能力を持っていた。


ユーザが386以上を使用していることを前提にできること、DOSエクステンダを標準としたことから、当時は32ビット機でもリアルモードで単なる高速な16ビット機として使われていることが多かった他機種と比べ、TOWNSではほとんどのアプリケーションが32ビットプロテクトモードを利用していたため、動作速度やメモリ使用効率での大きなアドバンテージが有った

2019-03-29

anond:20190329120218

プログラムを書けるとは。

仕事の手順を整理し、

仕事コンピュータで行う手順を考え、

必要アプリケーション仕様を考えて、

コンピュータ動作するプログラム作成する。

これ一人でやる必要はないわけで、どの段階ができると「プログラムが書ける」といえるのだろう。

2019-03-28

Microsoftが開発を投げ出したプロダクトはアンインストールさせろって言いたい

Edgeしかり、InternetExplorerしか

ユーザーPCに非推奨のアプリケーションをいつまでインストールさせとくのか

2019-03-11

就活って難しい

3月入ってから2週間も経っていませんが、すでに第1志望会社に落ちました。とても辛いです

どうせもう縁が無いだろうからぶっちゃけると某アイドルゲームを作ってるB社です。

割と前から就職したいと思っていて、インターンシップにも参加して、早期応募で採用面接等を受けました。

1次面接からずっと「この会社とは何かズレてる気がする。人はめっちゃいいけど、なんか違う。」って心のどこかで感じてたんですよね。

ただ、まあ割と楽に最終の役員面接まで行けたので上手く行くと思ってました。

はい、最終で落とされました。この会社は割と早くに連絡をしてくるので1週間近く経ってる時点で怪しいとは感じていました。

お祈りメールを受け取ったときもそこまで落ち込みませんでしたね。割と自分的には鬱になるのでは?ぐらいに考えていたのですが、あっさり受け入れました。

で、その会社第1志望ですでに選考を受けていることは親に伝えていましたから、結果を報告しました。

すると「ちょっとゆっくりしてから探したらいい。最悪、院に行ってもいいから。」と言われました。

正直、お祈りメールを受けたショックよりこの親の優しさに泣きそうになりました。

よく考えると僕が何かの選考で落ちるって相当久々なんですよね。

僕は中学受験しましたが、その学校には割とすんなり入ることが出来ましたし、大学もあまり苦労せずに入ることが出来ました。

多分、そういう事情を知っているからこそ優しくしてくれるんだと思っています

親って大切にしないといけないですね。昔、迷惑を相当かけたので本当に申し訳なく感じます

ただ、実を言うとB社を受ける前に某白猫とか黒猫とかが付くゲームを作っているC社も受けて落ちてます

ただ、ここは第1志望では無いですし、元々インターンシップに応募して落としたにも関わらず新卒採用受けてくれとかいう謎なことを言ってきたので試しに受けたという感じなので、ほぼほぼノーカンです。


さて、ここからが本題です。第1志望最初に受けて、ここが通れば他の選考を受ける必要が無いと考えていたので、落ちた後のことを何も考えていません。

自分が行きたいのはゲーム業界のはずです。「はず」なんです。

なのですが、本当にこれでいいのか迷っています

今までの人生を振り返った時にゲームをそこまでやってきたかと言われたら、やってないとはっきり言えるレベルでやってません。

苦手なんですよね、ゲームプレイするのが。

ゲーム自体は好きなんですけど、自分プレイするのがとても苦手です。誰かがプレイしているのを見たり、自分ゲームを作ってみる分には結構面白いと感じるのですが。

ただ、今までゲームをそんなたくさん作ってきたかと言われてると、これも作ってないとはっきり言えます

基本的アイデア力が無いので、「こういうゲームがあると面白いかも」みたいなのが全然思いつきません。ただ、他人意見を聞いてそれにアドバイスみたいな感じで意見を出すのは割と得意だったりします。

さて、こんな僕にゲーム業界ゲームを作ることが出来るのでしょうか?もっとゲームが好きで昔から色んなゲームプレイしてきたっていう方のほうが向いてると自分では思います

でも、他に興味がある業界がありません。自分で作ってきたものには、機械学習を用いた画像認識Webアプリケーションなどがありますけど、これを仕事にしたいとは全く思っていません。

自分は飽きやすいので興味が無いことを始めたとしてもすぐにやる気が無くなります。多分、半年ももたないと思っています

からこそ、少しでも興味のあるゲーム業界を目指しているのですが、現実はとても厳しいものです。

自分がやりたいことも割とここ数年の間にコロコロ変わっているので、ゲーム業界就職したとしても5年10年後には多分違うことをやりたいと思っている気がするのですが。


あと、もう1つ悩んでいることがあります。勤務地です。

B社を志望していたときは「絶対東京がいい」みたいなことを考えていたのですが、落ちてから冷静に考えると「別に東京じゃなくてもよくない?」ってなってきています

正直、東京はたまに行く分には楽しいのですが、住むかってなるとなんか違う気がします。

ただ、イベントとか趣味関係(B社の某アイドルゲームですw)を考えると東京近郊に住んだほうが楽なんですよね。

今は実家の近くである大阪を中心に会社を探していますあんまりないんですけどね。

いっそのこと全然違う場所就職するのも面白いと考えています。例えば、金沢にあるD社とかはエントリーを考えていたりします。

どこで就職しても難易度はあまり変わらないとは思いますけど、東京よりかはちょっと離れた場所のほうが楽なのかなとかは思ったりします。


さて、ここまで色々書いてきましたが、多分殆どの人が「こいつ、文章書くの下手くそだな」って思っていると思います自分でも思っているぐらいですからw

文章力が無いとエントリーシート書くのもなかなか辛いんですよね。

てか、自己PRとか志望動機とかってどうやって皆さんひねり出しているんですかね。正直、第1志望以外はほぼ適当に見つけた会社なので、志望動機なんて書けないんですよ。

エントリーシートを書いていると自分が今までどれだけ何もせずに人生を過ごしてきたかがよく分かります


結局、自分がやりたいことを見つけることが出来ず、特にこれと言って特別なことをしてこなかった人には就活というのはとても辛いものということを少し実感しました。

就活なんてまだ始まったばかりなのに何言ってんだ、こいつ」と言われるかもしれません。ですが、第1志望をすでに落ちている身としては今後の就活なんて消化試合みたいなものです。やる気なんて全く出ません。

親に言われた通り、院に進むのも手だとは思っているのですが、今の研究室でやっていることを院に進んでまでやりたいか?ってなるとやりたくないです。

研究室も割と適当に選びましたからね。正直、結構後悔していたりします。ゲーム開発に全く関係の無いことですし。


新卒採用なんて人生で1度しか経験出来ないことなので、色々飛び込むのもありなんですかね...

2019-03-05

サイバー犯罪検挙件数

https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.npa.go.jp/cyber/statics/h25/pdf01-2.pdf&ved=2ahUKEwjyl9upjOrgAhXJPXAKHSyZBkoQFjAAegQIBRAB&usg=AOvVaw3JI-ek8KsH13Lk1HVih4EB

サイバー犯罪カテゴライズするのが???な検挙理由ばかりなんだよなあ。

3 主なサイバー犯罪検挙事例

不正アクセス禁止法違反

不正アクセス禁止法違反電子計算機使用詐欺

被疑者自営業男性・36歳)は、携帯電話販売店において、陳列中の携帯電話

使用し、携帯音声通信事業者サーバ不正アクセスした上、オンラインゲーム

イトで使用できる仮想通貨の購入手続を行い、携帯電話販売店に料金を課金させて支

払いを免れた。 (7月・愛知三重

コンピュータ・電磁的記録対象犯罪

電子計算機使用詐欺

被疑者無職男性・34歳)は、電子書籍購入代金の支払いを免れるため、自己

携帯用端末に不正アプリケーションインストールし、同アプリケーションを利用

して電子書籍販売事務処理に使用するサーバコンピュータに虚偽の情報を与え、不

実の電磁的記録を作り、電子書籍をだまし取った。 (6月・警視庁

不正指令電磁的記録に関する罪

不正指令電磁的記録供用】

被疑者出会い系サイト運営者・男性・59歳)らは、スパムメール配信に利用する

メールアドレス収集する為、スマートフォン電話データを抜き取るアプリを作

成し、これを電池改善されるアプリと偽って、事情を知らない者にダウンロード

せ、ウイルスを供用した。 (9月・京都大分

ネットワーク利用犯罪

詐欺及び組織犯罪処罰法違反組織的詐欺)】

被疑者出会い系サイト運営者・男・40歳)らは、同人らが運営する出会い系

イトにおいて、芸能人等を装ったサクラ従業員を使い、サイト会員からメール交換

等のサイト利用料金をだまし取っていた。 (6月・警視庁

出会い系サイト規制法違反届出義務違反禁止誘引行為幇助)】

被疑者会社員・男・34歳)は、公安委員会に届出をしないで、出会い系サイト

を開設するとともに、同サイト利用者援助交際目的に関する禁止誘引行為の書き

込みを容易ならしめた。 (6月・大阪

著作権法違反

被疑者会社員男性・39歳)は、テレビ番組データ著作権者の承諾を受ける

ことなく、ファイル共有ソフトを用いて不特定多数インターネット利用者配信した。

10月栃木

不正競争防止法違反

被疑者(会社役員男性・34歳)らは、有料の衛星放送無料で視聴できるように不

正に改ざんされた「B-CASカード」を、インターネット上に密売サイトを開設し

不特定多数インターネット利用者に閲覧させて客を募り、購入客に販売して不正

競争を行った。 (7月・警視庁

2019-02-27

生きるのが苦しかたから時給1100円のデータ入力派遣社員になった

https://anond.hatelabo.jp/20190225164120

これ読んでたらトラバ一人暮らししてることが発覚してオラ発狂。仲間かと思ったら俺のほうが底辺だった。

おっす!オラ、ジョブホッパーの28歳!最終学歴高卒偏差値38のゴミだ。頭もメンタルも激よわだぜ!よろしくな!

説明プレゼン、会話が苦手すぎて抑うつ気味になって発狂しながら仕事をバックレたり、

仕事についていけなくて仕事をバックレたり、

無能のくせに無能だと思われるのが嫌で自分無能さが周知になるとバックレるゴミとして活動してるぜ!

発達障害の症状一覧にだいたい当てはまるけどセカンドピニオンまで受けて健常者認定されるギリ健って奴だ!ワイパックスとか効かねーぜ!

====

BGM) https://www.youtube.com/watch?v=msyMDz2QdMo

オラが普通人間だったら間違いなくオラみたいなクズ死ねよぶっ殺すぞと思うけど、バックレるときは克己心が湧かないレベルキャパを超えているので正直もうどうすればいいのかわからなかった。

ある日、このままじゃやばい、と思い、オラが得意な事と、オラが絶対にやりたくないことを列挙した。

こうなると、手先使うわ命に係わるわで、工場は無理(一週間でばkk辞めた)。

介護?うっかりミスで人を怪我させたり殺してしまいそうで絶対無理。それでこそ立ち直れない。

タッチタイピングを生かして事務職になろうと思ったが、電話応対やマルチタスクゴミなので無理。

ビルメンを考えたが手先が不器用テナント対応業者対応で報告連絡が上手くいかない(特有の会話が苦手で正しく情報が伝えられない)ので無理。

清掃も考えたが、手先が不器用なのと潔癖症なので働く前に辞めた自分が見えた。

良く見直すと、俺は得意なことがタッチタイピングしかない。そこで仕事について調べてみるとデータ入力オペレーター派遣募集が見つけた。

募集要項をみると電話対応兼任で時給1700円、オラには無理だ。諦念にかられながら応募を眺めていたら、

なんと、「電話対応なし!データ入力作業!」の文言が!

「ついていけなかったらバックレればいいや」の気持ちで応募、年齢層が高い(40過ぎの主婦ゴロゴロいた)ため、割とすぐ採用された。

仕事内容はとある書類パソコンを使ってアプリケーション入力するだけの簡単お仕事

ノルマはないが生産性社員管理しているようで、増田君は入力が早いとお褒めの言葉をいただいた。高校卒業後、ボトルネックしかならなかったクズが初めて評価された。

これが……、自己肯定感か……。これが……、オラの力か……。

このままいけば正社員登用されるんじゃ……、と調子に乗ったが、現場で働いてる正社員管理側で対人折衝しまくりだったので俺には無理だと思った。

それから3年経った今でも、データ入力派遣社員をしている。この職場のおかげで派遣といえども長期職歴がついた。

しかし、働くうえでボトルネックだった会話能力プレゼン説明含む)の低さがボトルネックで、再就職に踏み切れずにいる。

克服しようと職場の人とコミュニケーションを取ろうとしたが疲れ果ててしまい翌日休んだ。言葉がでてこず吃音みたいになり、顔が熱くなり、酷く動悸がして、胃がむかむかした。凹んだ。

メンタルの弱さまで相変わらずなのだ

今働いているこのプロジェクトは、あと5年で終わるらしい。最長で5年いれるが、それまでに転職先を見つけるか、その後転職を見つけるか、いずれにせよ永遠に居ることはできないのだ。

自分にできる仕事があれば20代のうちに正社員になっておきたいが、電話対応なしデータ入力正社員なんてどこにもないし、正直将来を考えるとどんよりとした気持ちになる。

30代ぐらいまでは、派遣社員としてなんとかなるだろう。だが、40過ぎたとき、50過ぎたとき、俺はデータ入力派遣社員が出来るのだろうか?

若いんだし自信持てよ!と励ましてくれる人がいるが、さすがにオラみたいな低能が自信を持ったところで仕事できないくせに調子に乗ってるタンコブができることぐらいオラみたいな低能でもわかる。

自信がないのは本当だ。自信が欲しいとも思う。ただそれは無根拠な自信でなく、何か能力裏付けされた確かな自信だ。

この仕事がなくなったら、オラは間違いなく途方に暮れる。老後もこんな仕事があるとは思えないし、将来を考えるといつかはシフトチェンジしなければならない。

でも仕事……、オラにはできる仕事がない……。こうしてオラはKKOとして生きるのだろうか。安楽死ができるならはやくしたい。

2019-02-22

anond:20190222085809

IDE

原因の9割はこれだと思う

どこに何書こうかなとかファイルどうしようかなとかライブラリ環境構築終わってたかなとかgitどうだったかなとか思うならほぼこれ

最近流行りのリッチな)エディタで作れるようなやつで体慣らしたほうがいいよ

えっウィンドウ遷移アプリケーション作りたい?スマホゲーム?贅沢言うなまず黒い画面の作れ

2019-02-20

オンラインエロゲ終了でオフラインプレイヤーを書いたら感動した

「対魔忍アサギ 決戦アリーナ」というオンラインゲーム(エロゲ)が終了する

まあ終了自体は仕方ない。このゲームゲームと言うには余りに大きな設計ミスを抱えすぎており、また、システム的にもかなり古くなっている。

だいぶ前からオンラインゲーム終了時にどうするか、という話はあるけど、あまり進展はない(ソシャゲ、ネトゲ等のサービス終了後のゲームの保存について考える、とか、米国でサービス終了オンラインゲームを著作権法例外とする動き―ESAは反対とか)。一つ根本的な問題として、本当にオンライン重要ゲームオフラインモードに余り意味がないのも大きい。

でも、対象エロゲ特に抜きゲ)なら話は別

何せ、最低限エロシーンだけ再生出来れば需要を満たす。

逆に、ゲームとしてのサービスが終わろうが俺には見たいエロシーンがあるんだよ!

anond:20190209083051 とかでも書かれていたけど、エロの質はいいし、ここにしかないものも多い。しかもそれは(ゲーム上で)自分が苦労して手に入れたものだ。勝手に閉じてほしくない。

……けど、運営コストを考えたらそうも言ってられないのはよく分かる。

というわけで、今こそオフラインプレイヤーの出番だ。

自分入手した分のデータダウンロードして、後は各人がローカルPC再生すればいい。

必要機能は大きく分けて、サーバからデータダウンロードしてくる部分、それからデータカードエロシーン)を閲覧するパートだ。

ちなみにこのゲームは初期に作られただけあって(?)、エロシーンに機能が少なく、BGV はおろか BGM も無い。オーバレイも1枚のみで、基本的に背景(シーン画像含む)と、テキストに 1:1 対応するボイスしかない。

これなら割とできそうな気がしたので保存・再生するソフトウェアを書いてみることにした。

というわけで出来たものこち

https://aakeeper.appspot.com 驚くほどあっさりできてしまった。

でも、今はできた物自体の話はいい。それより作る過程で色々感動したのでその話をしたい。

今や OSS には巨人の肩どころか常にジェット機に乗ってるくらいのツールが揃っている

今回使ったのはざっくり以下のもの

これらのツールに関して、自分殆ど学者だ。

Quasar FrameworkNode.js も Electron も使うのははじめて、他はちょっと触ったことあるけどそんな詳しくない。 ES もあまり好きでなかったので基本的には避けてきた。

にもかかわらず、全体で余暇時間2週間分くらいで出来た。

Quasar Framework は、とにかく物凄くよく出来ていてびっくりした。今回 Electron モードしか使っていないけど、本来はこれで SPA/PWA/モバイル(Cordova) アプリケーションが作れるという凄まじい対応幅のプラットフォームになっている。着手時に 1.0beta の予告だけあるというタイミングの悪さ(数日後に出た)だったので、 0.17 系を使った。しかし、それでも十分すぎるほどよく出来ている。

ES は今でも嫌いな点は多いんだけど、今回 async/await を使って感動した。これは素晴らしい。他の言語にも欲しい。

CoffeeScript趣味だけど、とにかく短く書ける点が素晴らしい。あれは終わったという人もいるが、記述量の少なさは js 系では他の追従を一切許していない。今回みたいな急いでいるケースでは、括弧の世話を焼いたり eslint おばさんと語り合う時間はない。CoffeeScript ならコンパイラが全部上手くやってくれる。

HTML5 ベースGUI は今や chronium の各種アクセラレーションのおかげで、並のポータブル GUI ツールキットよりずっと高速に動作する。

また、Vue.js + pug は非常に記述量が小さくて目的の画面がすぐ作れ、カプセル化がしやすコンポーネント再利用も容易だ。

Babel/Webpack は正にバッドノウハウを煮詰めて固めた感じだが、こいつがバッドな部分を吸収してくれるおかげで開発者正気を保てる。ただし追求しだすとSAN値が減る。

ユーザから見ると、Electron 製のアプリメモリをやたら喰う、少しもっさりしている、配布バイナリが巨大になるという問題は確かにある。

しかし、そうだとしても何より、とてつもなく高速に作れて、各種プラットフォームで割とちゃんと動く。

自分は色々初めてだったので結局2週間分くらい掛かったけど、前提知識が揃っている人なら本当に数日でできたりするんじゃなかろうか。

状況は良くなっている

つい数年前まで、クロスプラットフォームアプリケーション作成というのは本当に本当に大仕事だった。こんなに早く手軽に書ける事は無かったし、ユーザ側でもラインタイムインストール必要とか環境側のハードルも非常に高かった。

自分は今まで知らなかったけど、最早そういう時代は終わっていた。

もちろん過去に数多くのクロスプラットフォームフレームワークが登場しては消えていったのと同じく、Electron もいつかその仲間入りをするだろう。

でも確実に、びっくりするくらい状況は良くなっている。

興味があるけどまだ触ってないという人は、ぜひ試して感動を味わってもらいたい。

Happy Hacking!

2019-02-10

36歳のITエンジニア収入晒す

生い立ち

地方公立で育つ。

県外の駅弁に進学。

学部卒業就職

何回か転職をして今に至る。

仕事

Webサービススマートフォンアプリケーションコードを書いている。

マネージメントも見よう見まねで行っている。

年収

月収が額面で60万+α。

手取りは40万くらい。

賞与は100万から140万を年に2回。

トータルで900万から1000万くらいの間。

基本は定時で仕事を終えている。

出世しない限りはこれ以上は増えないだろう。

出世はしたくないけどお金はほしい。

嫁と子1がいて、全部の生活費で30万くらい。

生活は苦しくもないが楽でもない。

いつ楽になるの。

幸せとは

同じ時間働いているのに周りの人よりお金がもらえないのはなんだか勿体無い気がして、年収アップのために転職をしている。

それなりにはもらっている方だとは思うが、以前と比べて幸せになったかといえばそうでもない気がする。

他人比較しているようでは幸せがこないというのをしみじみと感じる。

追記

30万は賃貸光熱費、食費、教育費、雑費などなど全部が入ってる。教育費がかかるのはこれからからまだ。でもかかるよね…

そして確かに通勤は辛い。家も普通賃貸だし。綺麗なおうちに住みたい。

共働きだけど、記載金額自分一人分。

控えめに考えても上位20%くらいなはずなんだけど平均的な暮らししかできないと感じてる。

こんなもんなのか。それとも東京に上位20%くらいの人が集まってるからこんな状況なのであろうか。

2019-02-09

IEを消すのは結構だけど、後始末するのはお前らじゃないの

はてなブックマーク - マイクロソフト、企業にInternet Explorerの使用をやめるよう要請。「IEは技術的負債もたらす」 - Engadget 日本版

なんかIE強制的に削除しろとか過激なことを書いてる人が多いなと思ったんだけど、IEでないと動かない既存業務アプリケーションをどうにかしろって言われるのは誰なんだろうね。私はやりません上司もそんな命令しません営業もそういう仕事は受注しませんて確信してるからそういうことが言えるのかな。

2019-02-06

COBOLってこんな言語

日経xTECHの元記事を読んでもCOBOLの特徴があんまり伝わってこない感じだし、かといってそれをディスってもしょうがないので、書いてみた。

https://anond.hatelabo.jp/20190205192741

COBOL本質的にはDSLなんだけど、一見汎用プログラミング言語に見えてしまってRubyPythonなんかと比較するのが誤解のもとではあると思う。今の人でも知ってそうなCOBOLに似ている言語はたぶんSQLで、データを処理するための専用言語。ただ、SQLは頑張ればすごく複雑なこともできるパワフルな言語で、だからこそ現代でも生き延びているわけだけど、COBOLはわりとシンプルデータ処理を想定している感じ。

SQLだけでアプリケーションを作れないのは触ったことある人なら誰でもわかると思う。普通JavaRubyで全体の流れを記述してデータベース入出力をSQLで書く。COBOLもそんな感じで、全体の流れをJCLやShellスクリプト、あるいはJP1のような運用管理ソフトで書く。SQLの1個の処理に相当するのがCOBOLコンパイル単位で、それごとにソースファイルが分割される。ひとつソースファイルに2個以上の処理を書くこともできるけど普通はしない。ここまで理解すると古いCOBOLに1ファイル内のすべての処理に影響するグローバル変数しかないのや、今のCOBOLコンパイル単位をまたぐ真のグローバル変数がないのも、それほどクリティカルではないことがわかると思う。もし、本当に複数の処理にまたがる値が必要なら、データベースに格納してしまえばいいんだし。

で、SQLでいうところのデータベースに相当するのがCOBOLではデータファイルsedawkテキストファイルCSVファイルを行ごとに処理するのとちょっと似てるけど、COBOL場合は固定長ファイルという点が違う。改行文字は入ってなくて、たとえば150バイトごとに次のレコードみたいな形式。これの1レコードごとに何月何日何時に〇〇という商品を□□円で売ったとか書いてあるのが典型的データの内容。それを集計して今日は〇〇が何個売れて売上がどれだけあったとか、出金合計がいくらで入金合計がいくらで、みたいな財務諸表を作ったり。SQLと同じように税率なんかが書いてあるマスタデータと、日々の売り上げが書いてあるトランザクションデータがあって、突き合わせたりということもする。こういう集計処理だからUIはなくて、夜中に自動起動するようなバッチプログラムが主な使われ方。(混乱するから余談だけど、今のCOBOLSQLを使って普通RDBにもアクセスできる。ただ使い方としては、RDBファイル処理→ファイル処理→ファイル処理→ファイル処理→ファイル処理→RDBみたいに、最初最後だけみたいなのが普通

入出力がファイルから今の感覚で考えるとアクセスは遅い。でもメリットもあって、1回に1行しかメモリに乗せないからどんな巨大なデータでも時間さえかければ処理できる。それこそ国民ひとりひとりの年金データとかね。あと、途中でバグ不正データで止まってもデータを失うのは最小限で済むので復旧が比較的楽だったり。

データベースの話に戻ると、テーブル定義はどこに書いてあるかというとデータファイル側ではなくてCOBOLプログラム側、というのがSQLと一番違うところかも。つまり、このデータファイル構造はこれこれこうなっていると想定して読みます、とソースコードに自分で書く。当然実際のデータ構造がそれと違ってたらおかしくなる。

まあそんな感じで80年代くらいに会計処理をする目的だったら悪い言語ではなかったので、銀行官公庁とか、電力水道ガスといったライフラインを扱う大企業がこぞって導入して今に至る感じ。普通大企業は途中でSunかに置き換えてその後Linuxクラウドさらに置き換えたりしたけど、最初に作ったシステムが大きければ大きいほど、重要であれば重要であるほど現代的な環境に置き換えられないというのが今の課題

2019-02-03

anond:20190203114658

アプリケーション起動する時間もったいない

メモのためにそんな物持って歩く手がない。

荷物に貼れない。気軽に落としちゃいけない。

  

メモを取る状況や普段仕事性質情報共有の規模によって便利なツールが違うのだから

紙の手書きメモを頭から否定するのは視野が狭いってもんじゃいかい?

2019-01-23

わからん(,,゚Д゚)

なにが?

パターン1: わからん(=駄目)

相手言葉否定するのに「わからん」っていう人です。

(,,゚Д゚)「以上で発表を終わります!」

(*゚∀゚)「その説明じゃ、ぜんっぜんわからんわ」

対処

Noの言い換えとして聞けばいいです。無難に「はい」と答えましょう。

パターン2: (なぜ必要なのか)わからん

どうしてそれが必要なのか、わからない人です。

(,,゚Д゚)「OAuth最近アプリケーション一般的ログイン方式で...」

(*゚ー゚)「わからないぁ(IDパスワードじゃだめなんだろうか...)」

対処

それがなぜ必要なのか教えてあげましょう

パターン3:(省略されていて)わからん

間をすっ飛ばされたり、論理が飛躍していてわからなくなっている人です

(,,゚Д゚)「AはすなわちBであるから...」

(´・ω・`)わからん、AからBはどうして求められたんだろう」

対処

自明だろと思っても、説明してあげましょう。

パターン4:わからん(腑に落ちてない)

理屈はわかるけど、脳が理解に追いついていなくてわけわからんくなっている人です。

(,,゚Д゚)「ここからすなわち1=0.999...は等しい事がわかります

(^ω^)「うーんわからん

対処

脳がなれるまで繰り返します。もしくは放置します。

パターン5:(何を言っているかわからん

知らない言葉専門用語があってわからない人です。

(,,゚Д゚)「青...いいよね...」

(^ν^)「(青?わからん...)」

(,,゚Д゚)「Il va pleuvoir demain」

('A`)「わからん

対処

分かる言葉で喋りましょう。

2019-01-10

anond:20190110164501

ゆうて今サンドボックス型のアプリケーション実行環境って正に配列使いまわしに相当するんだけどな。

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-02

変更に強いアーキテクチャみたいな話は、大抵の場合単一アプリケーション対象議論されている

それはそれで有意義なんだが、社内には数百から数千のアプリケーションが絡み合ってて、これらを別々のベンダ情シス担当ユーザ部門担当が開発や運用してるから何か変更しようとすると影響調査から修正テストやらで工数が爆発して身動きが取れないってことに悩んでる企業は多い

アプリケーションが1つだけ変更に強くてもどーにもならんの。全部書き換えるのに100年ぐらいかかっちゃう

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

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