「モジュール」を含む日記 RSS

はてなキーワード: モジュールとは

2019-05-17

下心と軟禁貧困情弱商法 前編

つい今しがたまで軟禁されてたので、あった事を書いてく。色々ありすぎてどう報告していいかからなくてぐちゃぐちゃで読みづらいと思うけど許して。なお全部本当の話です。嘘松でこんな状況になるなら嘘松であって欲しいレベル

普段から自宅作業してるんだけど、昼飯食べてからコンビニ飲み物買い込みに行った時に近くの駐車場パンツ丸見えのネグリジェ女性が本を読んでたの。

文句言われたらやだからなるべく見ないようにしようと無視してコンビニでさっさと買い物を済ませた所、まだ読書してた。

帰り道もなるべく見ない様にしてたんだけど、「お兄さん、パソコン詳しい?」って声掛けられて応えてしまったのが運の尽き。

だってパンツ丸見えだったのでワンチャンいい事あるかもとかスケベ心で股間勃起させてしまうじゃない?

状況を聞いたら、何をしたいのか全く要領を得ない。

昨日秋葉家電屋さんで買ったUSBが繋がらんとかなんとか。

そんで目の前にある一軒家に上がって見てくれと。

いやいや普通そんな事しないでしょ。こわっ。と思ったので家の前でならと言うと、ボロッボロのWindowsXPノートPCUSBメモリと無線LANの中継機の箱を持ってきた訳よ。

それを見てインターネット繋いでくれ案件かなと思った。

ただその気持ちは直ぐに上書きされてしまう。何故なら玄関に置いたPCを持ち上げる時に女の子ネグリジェも持ち上がりパンツが後ろから丸見えで何なら股間も少し透けてた訳よ。なんなのこの状況。下心が止まらないんですけど。勃起

まあそんなで、その子PCを起動してUSBメモリを挿してたんだけど何も出て来ない。

USBポートを変えさせたところ認識したのだが、やはりどう見てもただのUSBメモリぽい。そして中身はどうやら空っぽ

でよーく話を噛み砕いて聞いてみると、やはりインターネット繋いで案件である事は間違いなさそう。

ただ、そのUSBメモリがなんなのかは分から無い。ドライバーでも入ってるのかと思ったけど空っぽだし。

本人はジョーシン?の店員に聞いたのだからこれでインターネット繋がらないのはおかしいって言い張る。

そもそもノートPCWiFiモジュールついて無い奴(デバイス一覧で確認した)で、インターネットには繋がらないよといくら説得しても理解出来そうにない。

いつ買ったのと聞いたら中学生の頃だと。え、あんたいくつなの?未成年じゃないよね?タバコ吸ってるし。

そんなやり取りをしてたら

158G(多分128GBと言いたいのだと思う)のUSBから絶対に繋がるはず!だってインターネットもGでしょ?と。

どうやら"ギガ"と言うのはネットに関するキーワードだと勘違いしてるご様子。

秋葉ソフマック(多分ソフマップ)でも聞いたのだから間違いない!」とご立腹。

そもそも無線LANの中継機だけではなくてモデムが無いとダメなんだけどと言うと、そんな物は無いと。なんとかなるっしょと。

この時点で情弱適当対応適当商品を売りつけたソフマップジョーシンにキレそうになってるんだけど、その間も股間はずっと勃起してた。

後この時点でコンビニで買ったアイス2個が溶けそうだったので1個上げて、自分も食べながら作業した。マジ勘弁。

でもそうする事で股間も少しは収まった。

埒があかなくなってきて困っていた所若いお兄さん?彼氏旦那さんが帰ってきたの。

ああこれ美人局ってやつか?と思ったら何も言わずにそのまま家に入っていった。

まあ家の前だし何もしてないからね。

家の中でやらなくて良かった。変な気を起さなくて良かった。

そう考えていた時期が私にもありました。

とにかく中継機の方だけでもなんかするかとセットアップ開始。ノートPCは繋がらないので手持ちのスマホで中継機に繋いでセットアップ

家はボロい感じの2階建て一軒家だけど、どうせどっかの無線LANタダ乗りしてんだろうと。今はモラルを説いてる場合じゃな

いし、仕事あるからさっさと終わらせよって思ったので、普段どれに繋げてた?って聞いてそのSSIDパスワードを設定、繋がった!と思ったらセットアップ完了しただけで、無線LANから先に繋がってなかった。こりゃそもそもタダ乗りすら怪しいレベルだわ。

でも女の子は、そんなスマホの状況をみてネットに繋がったと勘違いしており、

真似して自分携帯に設定してネットに繋がらないと癇癪起こしてた。

そしてこの時点で勃起は完全に収まった。よし、必要な物だけメモさせて帰ろう!と決心する事が出来た。

そんな折、先程の男性が家から出てきて「暑いんだから家の中でやって見てもらいな」とか言うので話がおかしくなった。

そう告げるとそのまま男性はどこかに出かけてしまったのだ。

女の子は言う「あれは父だ」と。

普通さ、親ならなんか言わね!?そこらで捕まえた知らん男性と娘を家に2人きりにするか?

いや、普段からこんな事してるのかも。

そう思った瞬間に股間が復活してた。アホか俺。

玄関まで入ってしまったけど、良心と下心のバトルが続いており。それでも最低限の事だけ伝えて帰ろうとしたら再び癇癪を起こして誰かに電話

だが彼女スマホネットには繋がっておらず俺のスマホを取り上げて電話を始めたのだ。しかも誰にかけてんの!?

母親にでも言うつもりか?と焦った所、

どうも今回の元凶を作った兄貴ぽい。

元々ノートPCにはWiFiモジュールが刺さっていたぽいのだが「もう使わねーよな?」と兄に持ってかれてしまったのだ。

話を聞くと兄はエンジニアで少しは話が通じそうな感じがした。

なので電話が終わった後で、話通じそうだから俺が直接状況を説明しようと言った瞬間にまた癇癪起こして泣きはじめたのだ。

個人情報から携帯から履歴消せ!と。

そもそも彼女は「スマホ」という単語を知らなかった。

兄への説明も「USBメモリ)のぐるっと回る所が光るから絶対に繋がるはずなのよ。プラスチックなやつ」などと聞いてる方は意味不明な事を連呼していて、それでも兄はなんとか型番を聞こうとしてる様子で、「タイムって書いてある(チラッとしか見えなかったけどteamて書いてある様に見える)、128GB/USB3.0とも書いてある。」

でなんかもう兄貴も諦めた雰囲気が伝わってきた。

ただ彼女だけは異様に前向きで、事態はほぼ収束したと。癇癪起こしてたのに立ち直りはえーなこやつ。などと間抜けな事を考えていたら話は更に変な方向に。

母親が5時に帰って来たら一緒に機材買いに行ったり設定するから車出して欲しい。それとは別に30分くらいで良いから上がってコーヒーでも飲んで行きなよ。暇だし。」

!?!??!

車出さねーよ?

つか仕事あるから帰るよ?

「君は(パンツ丸見えで)魅力はあるけど、ごめんね。30分でも2人きりにはなれないよ。」

そう告げると、「どうして!?どうしてこうなるの!?インターネット繋ぎたいだけなのに。彼氏にもデータ消されて捨てられるし!」と今までで最高レベルの癇癪とカミングアウトを発動した。

だが効いた。なんか可哀想になってきちゃって。見た目も可愛い感じだし。30分お茶するだけなら良いかなと。

そしてなんかスケベももしかしたら出来そうかもとか思ってしまったのだ。

この時きっぱり帰ればよかったのだが、なんか家の中で女性が泣いてる状況てヤバくね?みたいなのもあって油断したのだ。

で家に上がる事になった。

狭い階段を上がると全く洗ってなくてガビガビの黒猫ちゃんが居た。

ここまでで半分くらいです。

長いので2回に分けます

2019-05-14

生体工学応用デバイス実用化状況調査結果

加工技術限界、消費電力の増大などにより、従来デバイス技術的な限界が大きな課題となっている。

この課題解決するために各国研究機関大学企業などにおいて、多方面でのアプローチによる解決策の模索が行われている。

そのような状況の中で、進化によって洗練された生物の生体機構工学的な応用は、有力な解決策の一つとしてとして大きく期待されている。

今回、わが国を代表する電気電子機器ハイテク企業における生体工学応用デバイス実用化状況について、1年以内にインターネット上に公開された情報をもとに調査実施した。

また、比較対象として外資系企業1社についても同様の調査を行った。

調査対象企業

 ・富士通株式会社

 ・日本電気株式会社

 ・ソニー株式会社

 ・パナソニック株式会社

 ・株式会社東芝

 ・日本アイ・ビー・エム株式会社

調査結果

生体工学応用デバイス実用化が確認できたのは、わが国を代表するコンピュータメーカである日本電気株式会社及び、富士通株式会社であった。

その2社のうち日本電気株式会社が質、量ともに富士通を大きくリードする結果となった。

その他の企業及び外資系企業においては現時点で実用化を確認することができなかった。


■具体的な調査結果。

富士通株式会社

 https://jp.fujitsu.com/solutions/cloud/k5/document/pdf/k5-specification-iaas.pdf

 内臓ストレージ

日本電気株式会社

 https://jpn.nec.com/lpgasmdms/service.html

 内臓バッテリー

 https://jpn.nec.com/embedded/solution/index.html

 LTEモジュール内臓ルータ

 https://jpn.nec.com/express/systemguide/100/1904/tower/t120h.pdf

 内臓バックアップドライブ搭載キット

 内臓 DVD ドライブ

 http://club.express.nec.co.jp/NaviSearch/reference.asp?code=NP8100-2757YP1Y

 内臓ドライブ

 https://www.manuals.nec.co.jp/contents/system/files/2019-02/qx-s5200g_opr_1_11_ns.pdf

 内臓ファン

 内臓電源

 https://support.express.nec.co.jp/usersguide/UCnas/NS300Rg_a/7010702-00101.pdf

 内臓RAIDコントローラー

ソニー株式会社

 確認できなかった

パナソニック株式会社

 ユーザーによる希望的な投稿のみ、企業から提供情報には確認できなかった

株式会社東芝

 確認できなかった

日本アイ・ビー・エム株式会社

 確認できなかった


最後

今回の調査では電気電子機器系の企業対象としたが、生体工学技術の応用はモーターやエンジンなど機械部品や、カメラなど光学機器への応用も進んでおり、今後他業種での事例も多くなっていくことが予想される。

以上

上記結果は2019年5月14日現在のものであり、技術の発展や担当者気づきもしくは不注意等により変化する可能性がある

2019-04-20

いじめは、人間本能の一部らしい

中野信子氏による著書をアマゾンaudible で途中まで、読んだ。

『ヒトは「いじめ」をやめられない(小学館新書)』

概要は、下記のリンク

https://cancam.jp/archives/510587

https://ddnavi.com/review/418437/a

「ヒトにとっていじめという行為は、種を保存するための本能に組み込まれている」

集団形成された時点で、いじめが発生する条件は、整っているとのこと。

また、1600年代から、続いた江戸時代日本人の同質性を重視する遺伝特性を持つ人間割合が増えたと推測されるとか。

対応策は、リンク先を読んでもらうとして、個人的には、日本人は、いじめをしやす遺伝特性割合が高いという事実理解して欲しい。

ブラック企業とか毒親とかは以前は、一般的ではなかったけど、かなり一般的になったように。

日本人いじめについての特異性もみんな認識した方が良い。

いじめ自体は、悪であることは間違い無いが、自動車事故と同じように生きている限り必ず発生してしまもの

いじめを根絶することは、できない。

なぜなら、人間本能の一部だから

個人としては、いじめをする人間いじめを発生する場所システムから、逃げる方法をでとりあえずは、対処しよう。

もちろん、システム構築側の人、権限のある人は、いじめを発生させにくい、解消、解決やすい組織づくりを頑張ってもらう。

追記:

https://www.news-postseven.com/archives/20171010_619712.html?DETAIL

ももクロって、緑の子いじめられてたんじゃなかった?

追記2

https://www.excite.co.jp/news/article/Cyzowoman_201711_post_160760

転記

「とても嫌な呼び方ですが、『裏切り者検出モジュール』といって、集団内における将来的リスクを感知する能力人間にはあります特に日本人は、海外の人よりもその能力が高く、グループからはみ出しそうな人に対して、敏感に反応する国民性を備えているともいえるのです」

追記3

転記

「少なくつくりなさいよ」と命令する遺伝子S型が、29カ国でどのくらいの割合分布になるのかを調べた人達がいます日本は、どうなのか。私がここで話しているからには面白い結果だろうなと予測できると思いますが、調査した29カ国中、ダントツ日本はS型が多かったんです。つまり心配性の人の国なんです。リスクをすごく高く評価して、それに対して準備する。先々のことを考えて、それに対して計画を立てる緻密な人たち。少しの傷も気になってしまう。どのくらいの割合かというと、S型遺伝子の割合が80%を超えます。80%を超えるのは日本だけでした。一方で、日本比較しうる国としてアメリカを例に挙げてみますと、S型の割合は43%。

https://www.kouenirai.com/closeup/002.html

追記4

2009年に発表された調査では、29カ国50,135人の遺伝調査の結果。東アジア人はS型遺伝子を持っている割合が70~80%と高く、ヨーロッパの40~45%と比べると倍近い数値になっています

S型遺伝保有者の割合が一番高いのが日本で80.25%、2番目が韓国で79.45%、以下、中国75.2%、シンガポール71.24%、台湾70.57%となっています

https://jsca.co.jp/stressnews/2015/11/26/%E6%97%A5%E6%9C%AC%E4%BA%BA%E3%81%AF%E9%AB%98%E5%BA%A6%E4%B8%8D%E5%AE%89%E6%B0%91%E6%97%8F%EF%BC%9F%EF%BC%81/

2019-04-12

anond:20190411215811

プログラミングができるわけでもない一般人だが書かれている内容はだいたい分かった。

ただし何を言いたいのかはサッパリからない。

なぜ「数字」にこだわるのかも分からないし唐突に現れたサンプルプログラム意図が分からない。

ドレミファソラシは「261、293、329、349、391、440、493」

単位ヘルツが抜けていて分かりづらい。

可視光の波長

コンピュータディスプレイは波長ではなくRGB表現されるので分かりづらい。

電気がそれほど流れてないときは白色に光り、たくさん流れているとき赤色に光るLEDがあるとする。

そんなよく分からないLEDを使わずともフルカラーLEDがある。

たとえにマイナー電子部品(?)が登場すると逆に分かりづらい。

それから縦30x横30のLEDから縦70x横70のLEDまでに内接する円の内部(x^2+y^2≦40)がすべて色001であれば、赤い円ができる。

このあたりはよく分からない。

中心座標(50,50)から距離(20)ではないのか?

(「点と円の当たり判定」を各座標ごとに実行)

めちゃくちゃ強い電気

なんかすごそう(小並感)。

ハイレベルとローレベルでなくアナログ値になるということなのだろうか?

その意図が分からない。

コンピュータ内部では数字で何もかもを表現する。

それはたぶん現代人ならみんな知ってると思う。

(ただし数字というよりはビットが基本だが)

「Aは41と表現する」のように人間が決めた

どの文字コードのことを言っているのか分からないので集中できない。

(ためしASCIIコードを調べてみたがAは65だった。また小文字にするとき足す値は32)

かなりシンプルになることが多い。

このサンプルコードは言うほどシンプルだろうか?

一般的には適当なrandomモジュールのようなものを利用するのではないか

(ついでに実用的かを考えるなら曲数が60以上あったときのことが気になる)

今の仕事でも、既存マクロエラー出たときに原因箇所を調べたりするのは出来るけど、そこから何を直したら直るのかわかんない。

欲しいマクロ機能要望とかフローチャートとかは作れるけど、それがプログラムにならない。

フローチャートを作れるのなら元増田必要なのはポケットリファレンス」とか「逆引き~」とかいう類の本ではないだろうか?

(普通に考えればさすがに知っているだろうが念のため)

2019-04-07

日曜日が終わってしまうので、ここらで一発、何らかの生産的な行動をやっていきたいぞ、と思ったわけですけども、なぜかこうして増田に張り付いています

人はなぜ、このような選択をしてしまうのでしょうか。

前頭前野の敗北であり、辺縁系勝利です。勝利勝利、大勝利長良辺縁系ではありません。

なぜか私のPCデスクには知恵の輪が転がっています。なぜでしょう。お見舞いでもらった品です。なぜ知恵の輪。ボケ防止にとのことでしたが。

ところで、先程PCデスクと言いましたが、これは厳密に言うと、いえ別にそんな厳密とかじゃなくて普通に言ってそうなんですが、私が今パソコンを置いている場所は、PCデスクなどという大層な代物ではありません。

というかデスクですらありません。

私は椅子の上にディスプレイキーボードマウスを置いています

正確には、椅子の上に、ホームセンターで買った合板を乗せて、それを机とし、周辺機器を乗っけているのです。

これは案外便利です。広い、安い、手軽、収納やすい。見た目のアレさにさえ目をつむれば、非常に合理的選択であると言ってよいでしょう。

あるいは、見た目などという些事に囚われていないことが、余計に合理的選択であることを強調している、とさえ言ってもよいかもしれません。

ところで、さっきまで、やむを得ない事情により、VBAなる恐ろしい言語を使っていたのですが、これには様々な謎仕様があるようです。それらは名状しがたき恐怖で我々を戦かせます

一般的に知られていると思われる謎仕様と致しましては、例えば、配列におけるReDimなるステートメントが上げられるでしょう。

他にも、例えばマクロ高速化のための方策として、範囲配列に代入するというテクニックが紹介されることがありますが、この配列範囲との間にも謎の関係性が存在しています

この手のソフトウェアを扱うに当たり、いちいち一つずつセルに値を書き込むことはご法度、というのが定番ではありまして、私も素直にこの定石にしたがい、セル範囲二次元配列に格納したりしております

しかし、範囲配列に代入した場合、その配列の要素のインデックスは、どうも1から始まるようなのです。

なぜ1スタートなのでしょうか。VBA仕様においても、配列の添字はいちおう0から始まることになっているのですが、範囲配列に格納した場合、0行0列の要素は空となっており、Array(1,1)にRangeの始点の値が格納されております

まあたとえ1スタートであっても、言語内で仕様統一されているのであれば、まだよいのです。

しかしここが彼の言語の恐怖ポイントなのでありまして、どういうことかといいますと、

すなわち、今度は逆に配列範囲に代入、すなわち配列の各要素の値を対応する範囲セルに書き込む場合インデックスが0である要素から順に処理されるのです。

範囲配列に代入するときインデックスが1から始まるのに、配列範囲に代入するときインデックスが0から始まるのです。

Array = Range

Range = Array

とすると、一番上の行と一番左の列が、空白行、空白列になってしまうのです。

なんですかこれは。誰が考えたんですか。おかしいでしょう。私はおかしさのあまり死にました。

この理不尽さに比べれば、Collectionなる連想配列の添字が1から始まることなど些事に過ぎません。

昨日までJavaJavaしていた人は、どうやら配列なんぞには目もくれていなかった様子でしたので、この謎仕様に気づくこともなかったのでしょうが、悲しいことに、この謎仕様配列を用いた高速化テクニックはほぼ必須スキルでありますので、例の御人も、遅かれ早かれ、この罠に絡め取られていたことでしょう。

あるいは、この謎現象回避するための方策はきちんと用意されており、無知な私はそれを知らないがゆえに、このような的はずれな不満をぶちまけているのかもしれません。

しかし、上述したような単純かつ直感的な代入が上手くいかないという仕様は、やはり、なかなかの欠陥ではないかと思うわけです。

まあそんな愚痴はどうでもいいのです。変な仕様適当にハックしてやればよいのです。

でもクラスモジュールとやらのパワーは貧弱なのでそれも大変困難ではあります

標準モジュールライブラリもどきをちまちまと作っていくしかないのでしょうか。

とてもではありませんが、こんなもんを極める気にはなりませんので、そこら辺のことをいい感じにまとめてくれている知見があればよいのですけれども、しかし、まともな人間はこんなもんを相手にしたりはしない、というパラドックスがあります

https://sites.google.com/site/compositiosystemae/home/vbaworld/upper/interface はわりとよかったような気がします。システムハンガリアン使ってますけど)

こんなもんを扱わざるを得ないような環境に留まってしまっている私がおかしいという話もあります

悪いことは言いません。pythonで書かせてください。お願いします。

そんな増田の切なる願いは、社会という名の抗いがたい泥沼に絡め取られ、今日も悲しみに満ち満ちたコードを生成していくのであります

そういえば今日休日でした。休日普通楽しいものなのではないでしょうか。どうしてこんな悲しい気分になっているのでしょう。

答えは簡単でして、悲しいことを書いているからです。楽しい気分になるには、楽しいことを書く必要があります

楽しいこととは何でしょうか。例えばオナニーなどが挙げられます人生において、オナニーよりも楽しいことは、あまりありません。

よって、楽しくなるには、オナニーの話をすればよいです。

私は一時期、DLditeで同人音声を漁っておりまして、催眠に掛かるべく邁進していた時期もありました。

しかし一度も催眠に掛かれませんでした。

なぜ私は催眠に掛かれないのか。

集中力の欠如、衝動性の強さ、慢心、環境の違いなど、様々な要因が考えられますが、最も大きな原因と思われるのは、台詞めっちゃ気になることです。

おっさんが考えた可愛い二次元女の子みたいな台詞が、えらく癇に障るのです。

そのために、可愛らしい女性の声に没頭できないばかりか、声によって現実に引き戻されてしまう、という逆説に襲われるのです。

おっさんは蓮を咲かせる泥だという話もありますが、恐らく、真に良質な泥おっさんというのは、非常に稀な存在なのでしょう。

まり、いいおっさんは泥ですが、悪いおっさんゲロということです。

しかし、これもおっさんに限らず、大抵のことに言える話でありまして、良質なものはどこでも少ないものです。

生の増田を見てもそうでしょう。

ホッテントリに上がる増田しか見ないライト増田、あるいはブクマカには想像もできない世界が、生の増田には広がっています。例えばこの増田とかです。

(これは私見ですが、VIPやなんj、あるいは虹裏などと比べても、増田の毛色は違います

増田ほとんどは泥であり、ホッテントリに上がった増田は花なのです。

私も泥として、増田たちに養分供給していきたいと思います

何だかまた悲しい話になってるじゃないですか。なぜ私はいつも悲しい話をしてしまうのですか。

それは恐らく、心の通奏低音(俗用)のようなものが、悲しみに染まっているからです。

基本的に悲しんでいるので、無意識に任せて話すと、悲しい話ばかりが飛び出てくる、というわけです。

この休日も悲しいまま終わりそうです。恐ろしい恐ろしい。これも人生という感じですね。

2019-04-06

世の中にはきっとソースがないプログラムがやまほどあるんだろうな

あるいは「最新」と書かれてZIPファイルに固められてるとか

以前働いていた会社であったのは下請けからきたソースコンパイルしたらエラーがでたことかな

ソースと動いているモジュールが同一である保証なんてまったくないし

そういうのも含めてテストしろって言ってるんだろうかバカ

「必ず不具合がでる」とは言ってない

ちゃんと動くという検証作業物理的に終わらない」と言ってるんだよ

不具合が出るとも出ないともその時にならないとわからない

2019-03-27

公式なり非公式なりのフォーラム使わずに、プログラム分かりませんだのとTwitterなどで匿名で喚いた挙句

「あーこの{言語|モジュール|ライブラリ|ミドルウェア}はクソだわ」って言って終わるの

そろそろ辞めてもらっていいですかね。

 

三流以下っすよ、あなた

2019-03-03

Julia 言語

データサイエンス界隈で Julia 言語を推す向きは多い。

だが、私はあまり Julia を好きになれない・・・

Julia は、少し Ruby に似すぎている。


私は Python 式のモジュールインポートが好きだ。

Python では、1ファイルが暗黙のうちに1つのモジュールとして扱われていて、他のファイルからそれを明示的に読み込むことになっている。

これがファイル数が増えてくるととても有効

RubyPythonコードを読んでいると、あきらかに Pythonコードのほうが読みやすい。

システムが大きくなればなるほどそうだ。

それは Python の明示的なモジュールインポート形式のおかげだ。

Julia は Ruby 風に、end でブロックが終わる。これもかなりうざい。

Julia の良い所は、

1. 速い

2. より数学に近い記法ができる

の2点だろう。

並列プログラミングがどうのとか、他にもいろいろあるみたいだが、データサイエンス現実用途でどれくらい使うものかどうか・・・

Julia は一部の信者たちの間で盛り上がっているみたいだが・・・

私がもう歳を取ったからこういう風に新しいもの拒否的になっている可能性も否定できないので、増田に書くに留める。

言語としては、Python のほうが好きだが、もし Julia が主流になるなら、ためらいなく Julia に移行するつもりだ。

時流には逆らえないからだ。

ただ、本当にそんなことが起こるのだろうか・・・

長くソフトウェア業界にいて、私が学んだことは、「従来より若干よい程度の技術は決して主流にはならない」ということだ。

みんなが新しい技術のほうがよいことは認める。ただ、既存資産をすべて放棄してまで移行する価値があるか、という質問

yes で答えられない場合、結局誰も移行せず、新しい技術の周りにはいつまでたってもエコシステム形成されない。

そうやって滅んできた技術を無数に見てきた。

本当に生き残る新しい技術もっと disruptive なものだ。

「何かをするにはそれを使うしかない」という場面がないと、新しい技術採用されない。

まさに最近Python がそうだ。機械学習をやるには Python を使うしかない。だからPython をやる。

そうやって私も Ruby コミュニティから移住してきた。

Julia と Python はできることが似すぎている。煎じ詰めれば Julia は単なる速い Python というだけだ。だったらすでに Cython があるじゃないか

私はたぶん Julia は主流になることなく、一部の熱心なファンに愛されるだけの言語になるだろうと予測している。

趣味としてやることはまったく否定しない。

部分的に Julia に適した問題もあるだろうし、それは Julia で解けばいい。

だが、機械学習が続くかぎり、Python がこの先もおそらくは主流だろうな(願望も入っているのは認める)。

・・・その機械学習永遠には続かないだろうけど。そのときは新しい問題に対して、新しい言語が使われるようになるだろう。

2019-02-27

[]なんでもスマート……

アイ・ワナビースマート

2019年現在、みんながスマートフォンを持ってる。

老若男女を問わず子供も持ってる。老人も持ってる。

先進国でも、発展途上国でも、みんながこのハイテクな板切れに夢中だ。

スマートフォンだけじゃない。なんでもスマート

スマートウォッチ!スマートグラス!スマートスピーカースマート冷蔵庫

「さぁ、君もスマート○○を手に入れて、もっとスマートになろう」

現代社会は、賢くなければ生き残れない。

スマートフォンはなにがスマートなのか

スマートデバイスの代表例と言えば、やはりスマートフォンだろう。

スマートフォンはフィーチャーフォン(ガラパゴス・ケータイ)と比べて、どこがスマートなのか?

スマートフォンが登場した当初は既存ケータイと比べて「パソコンライク」に扱える印象があった。

パソコンのようにサイトを見ることができ、パソコンのようにマウスキーボード接続でき、パソコンのようにファイルアクセスができる。

フィーチャーフォンはそれらのことが(基本的に)出来なかった。

ケータイパソコンに著しく劣る」という前提からスマートフォンなのである

成功例はスマートフォンだけ?

比較知名度の高いスマートウォッチやスマートグラス、スマートスピーカーであるスマートフォンほどはヒットしていない。

スマートウォッチやスマートグラスは、まぁスマートフォンの周辺機器のようなものだ。

(スマートグラスに至っては盗撮問題解決されない限り普及は困難だろう)

スマートスピーカーは主に裕福層<ブルジョワジー>や最先端技術愛好家<ギーク>が愛用しているにとどまるようだ。

(裕福層は豪邸に住んでおり手足を使わずスイッチを音声コントロールするためスマートスピーカーを買う)

スマートデバイスは無数にあるが大成功といえるのは実質スマートフォンぐらいではないか

他にはスマートフォン人気にあやかった周辺機器がそれなりに売れている程度だろう。

別にスマートでないヒット商品

最近流行商品はなにもスマートものばかりじゃない。

例えばドローンHMD(ヘッドマウントディスプレイ)、VRヘッドセット3Dプリンタロボット掃除機シングルボードコンピュータなどが挙げられる。

これらは別にスマート○○と名づけられていない点が興味深い。

安易スマート○○と名づけてしまうのは方向性が明確でないためではあるまいか

スマートフォンの特異さ

スマートデバイスのネーミングについて考えているうちに思ったことがある。

実はスマートフォンは、他のスマートデバイスと比べても特異なのではないか

スマートフォン以外のスマートデバイスは「非コンピュータ搭載」→「コンピュータ搭載」というコンセプトのものが多い。

しかスマートフォンに限って言えばフィーチャーフォンコンピュータ(SymbianOSなど)には違いなかったはずだ。

(なおガラケーが本当コンピュータなのかについては知識不足により掘り下げて説明することができない)

スマートデバイスの代表スマートフォンは、しかスマートデバイスの中でも特異なのである

スマートな使命

思いついたスマートデバイスは大抵もうある。

スマートペンスマート義肢スマートカー。スマートバイクスマートエレベータースマート監視カメラスマートインターホンスマートドラッグスマートダスト

無数のスマートデバイスが存在する。

皆さん、いくらなんでもスマートに惹かれすぎでは?

から見るとあらゆる業界開発者スマートな使命感に燃えているようである

それにしても製品を作っている当の本人たちは本当にヒットすると思っているのだろうか?

あるいは「これからスマート時代だ。IoT時代だ」という有難いアドバイスのおかげかもしれない。

スマート椅子取りゲーム

スマート○○というネーミングにはひとつ欠点がある。

スマート○○を名乗れるのは早い者勝ち最初ひとつだけなのである

最初ひとつスマート○○をうまく解釈して、うまく顕在化させて、うまくアピールできればヒットする可能性はある。

しかし、いまいちシックリこないもの最初スマート○○を名乗ってしまえば、そこでおしまいだ。

先に商標などを押さえられてしまえば後続者は身動きが取れない。

スマートの今後

新しいスマートデバイスのコンセプトとして、既にあるものスマートにする方向性は厳しいように思える。

なぜならコンピュータを搭載しないで普及したものは、コンピュータを搭載しないでも普及できたためだ。

もし成功するスマートデバイスがあるとするなら、それは恐らくコンピュータを搭載しないと実現できないものだろう。

個人的には「スマートフォンを制御モジュールとしてドッキングする製品」という方向性シフトしていくと予想する。

規格化されたスマートフォンスロットがあり(ファミコンカセットみたいに)スマートフォンを差し込むことで機能をゲットできるという仕組みだ。

(オーディオインターフェイススピーカーなどのジャンルドッキングする製品はすでにある)

スマートデバイスはスマートフォンの一強だということに、みんなそろそろ気づくだろう。

スマートフォンがすごいのならスマートフォンとひとつになればいいというわけだ。

そして……、最終的に人類スマートフォンは同義語となるであろう。

すなわち「ホモスマート」の誕生である

2019-02-06

テスラアーキテクチャ

テスラの車は、トヨタメルセデスの古いプラットフォームから派生した純電気自動車だ。まあ、旧型カムリだ。各ECUインパネ(IC)間がCANバスで結ばれ、ゲートウェイを通して車内インフォテインメント(カーナビ)が接続できる。そして、ゲートウェイにはセンターコンソール(MCU)、自動運転モジュール(APE)が接続されている。まあマツコネみたいなものだ。ただし、通常のカーナビと違い、このMCUTegra 3(旧世代)または超高速なIntel Atomプロセッサ(現行)が採用されている(マジ)。そして、海賊版Ubuntu GNU/Linuxを実行している(マジ)。そしてLTE回線に直結し、テスラ本社サーバ(mothership.tesla.com)にOpenVPN接続している。

機能

LTE接続

古いモデル3G、新しいモデルLTEモジュールを標準搭載している。明示的に特別注文しない限り無効化や取り外しは行われない。本社Mothershipは各車の動作状況を監視操作するほか、オートパイロット起動通知を受け取り、またssh接続のためのパスワードを保持する。これによりファームウェアrootが取られた場合オーナーを蹴り出したり、あるいは事故発生時に「オートパイロットは(直前でエラーを吐いて運転をぶん投げたため)使用されておりませんでした」と発表するなどいち早くメディア対策を行うことができる。

アップデート

更新パッケージは前述のOpenVPN経由でダウンロードされ、その中にAPEファームウェアのほかにもドアハンドルブレーキインバータECUなどのファームウェアが含まれていれば、MCU更新処理を行う。これまでに配信されたアップデートには、Linux Kernelを含むMCUOS更新インバータ出力アップ(設計の三倍程度)、緊急制動距離の延長と短縮、自動緊急ブレーキの追加、自動運転の警告間隔延長・短縮(事故報道の頻度に応じて調整)、自動運転機能のものの搭載や根本的な入れ替えなどがある。現在仕様ではファームウェアバージョン表記はYYYY.WW.x.y.zで、GitコミットIDが末尾に付き、平均して月2回程度のローリングリリースが行われる。つまりリポジトリのheadがざっと社内検証を通るとLTEで降ってくる。非常にまれなケースでは社長(@elonmusk)の「やりましょう」ツイートから時間バージョンが上がる。

駆動

電気自動車なので、エンジンは搭載しない。代わりに車体下面にリチウムイオン電池パック(ノミナル電圧480Vまたは400V)を搭載する。パックは火薬ヒューズを含む高電圧コンタクタ(リレー)を介してモータおよびインバータ接続され、インバータモータ進角を監視しながらスロットル指示に合わせて三相交流電源を供給する。この辺りはCPUファンと変わりない。

https://anond.hatelabo.jp/20190206135710

2019-01-06

anond:20190106145821

今のセキュリティというやつはソフトウェア偏重すぎてハードウェアを攻めたら脆弱性だらけだよ

例えば今のパソコンOS情報を抜き出すのが難しくなっているけど、ディスプレイが付いてるんだからディスプレイを表示するためのケーブルへ延長ケーブル的に機械式読み取り機を接続しておいて「中抜き」したら良い

今のモバイル通信モジュールなんて小型なんだから中抜き」した情報モバイル通信送信してしまえば良い

パソコンOSで実行が難しいならパソコンOSの外でやると良いんだ

これらを行う全体のユニット自体タバコの箱よりも小さくできるだろう

断言するよ、日本会社ディスプレイケーブル毎日確認している会社なんて100社も無いと

これをするには泥棒侵入技術必要からハッカー必要とあれば泥棒にもなる

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: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システムは基本 グローバル関数なので

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

ブリッジ関数を書いた

Graphviz を使って Python抽象構文木を生成する。



1. こんな感じで使います


1.1. スクリプトとして使用する。

$ python parser.py sample.py


1.2. モジュールとして使用する。

import parser
code = '''
a  = 1 + 1
print(a)
'''
graph = parser.create_graph(code)
graph.render("sample")


2. ソースコード parser.py はこんな感じです。

import ast
import sys
import graphviz


def create_graph(lines):
    graph = graphviz.Graph(format='png')
    root = ast.parse(lines)
    node_list = [root]
    _setup(graph, node_list)
    return graph


def _setup(graph, node_list):
    # node
    node = node_list[-1]
    node_identity = str(len(node_list))
    node_name = type(node).__name__
    graph.node(node_identity, node_name)

    # children
    for child in ast.iter_child_nodes(node):
        node_list.append(child)
        child_identity = str(len(node_list))
        graph.edge(node_identity, child_identity)
        _setup(graph, node_list)


if __name__ == '__main__':
    file_name = sys.argv[1]
    with open(file_name) as file:
        lines = file.read()
    graph = create_graph(lines)
    graph.render(file_name)

2018-12-31

anond:20181228211250

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


class MyWindow
{
public:

	HWND hWnd;

	MyWindow()
		:hWnd(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;

	}



};


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);
            // TODO: HDC を使用する描画コードをここに追加してください...
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

// バージョン情報ボックスメッセージ ハンドラーです。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}

こんなかんじ。クラス化した

2018-12-25

モジュラーシンセモジュールをあれこれセレクトしてると脳汁が出てきて

いつか買っちゃうんだろうが

今回はやばかった

なんとか物欲を凌いだ

2018-12-11

anond:20181211072336

http://b.hatena.ne.jp/entry/374820954/comment/watarux

id:watarux 職業プログラマなら言語の構文ぐらい1日でなんとかしよう。実際はモジュールライブラリを知る・見つけるのが大変なんであって。特にGoはA Tour of Goかいう超良心的なのがあるのに会社問題"だけ"じゃないでしょ

すげーなあ、こういう「経営者目線持ったぷろぐらま」様を雇いたいぜw

2018-12-02

[] Webプログラミング面白いほどわかる本

みんなで一緒に勉強してみよう!

 

Webプログラミング面白いほどわかる本 環境構築からWebサービスの作成まで、はじめからいねいに (N高校プログラミング教育) 単行本 - 2018/6/22

吉村 総一郎 (著)

https://www.amazon.co.jp/dp/4046023023/

https://www.kadokawa.co.jp/product/321712000860/

 

サーバーサイドの入門に最適な、Webプログラミングテキストが登場!

Linuxでの環境構築からGitGitHubによるコード管理Node.jsによるサーバーサイドのプログラミングが学べる!

インターネットで学ぶ話題通信制学校「N高校」が展開する、プログラミング教育メソッド大公開第2弾!

約1000人の高校生にWebプログラミングを教えてきた名物講師が、入門者がつまずきやすポイントを、ていねいに解説!

 

【本書の対象読者】

環境構築で挫折した方

サーバーサイドに挑戦したいと思っている方

SIerからWeb系への転職を考えている方

 

【本書の内容】

■Chapter1 Linuxの基本を身に付けよう

LinuxというOS

コンピューター構成要素

コマンドファイル操作する

標準出力

viの使い方を学ぼう

 

■Chapter2 シェルプログラミングをやってみよう

シェルプログラミング

通信ネットワークサーバークライアント

HTTP通信

通信をするボットの開発

 

■Chapter3 GitHubで始めるソーシャルコーディング

GitHubでWebサイトを公開する

イシュー管理Wikiによるドキュメント作成

GitGitHub

GitHubへのpush

Gitブランチ

ソーシャルコーディング

 

■Chapter4 Node.jsプログラミングをやってみよう

Node.js

集計処理を行うプログラム

アルゴリズム改善

ライブラリ

 

■Chapter5 Slackボットを作ろう

Slackボット開発

HubotとSlackアダプター

モジュール化された処理

ボットインタフェースとの連携

 

■Chapter6 HTTPサーバーを作ってみよう

同期I/Oと非同期I/O

例外処理

HTTPサーバー

 

Webプログラミング面白いほどわかる本」を出版させてもらいました

https://note.mu/sifue/n/n69fdeadc4612

この本の利用の想定としては、Webプログラミングサーバーサイドにチャレンジしていきたい方や、システムインテグレーターとしてWebプログラミングを知らずに仕事をしてきたシステムエンジニアの方が、Webプログラミングを学んで行くための下準備の知識を蓄えるために利用することを想定しています

 

実際、N予備校プログラミング入門コースは、Web業界Web活用する企業の社内エンジニア研修テキストとして利用して頂いている事例も増えており、本書の内容の学習必要とされている場所は増えて来ていると感じています

 

2018-11-19

画像印刷に関する新機能を追加することになったのだけど、楽勝楽勝とちゃちゃっと実装終わらせて、いざ印刷をしたら真っ白な紙しか出てこない...いや左上にごみみたいな黒ずんだ点がある。

最初は汚れかと無視したが何回印刷しても出てくるのでもしやとPDF出力、拡大してみれば豆粒大の罫線が...

ローバイナリ復元するところかそれをGraphicsに書き出すところかなーと半日費やしてガチャガチャするも埒があかない。

サイズ値をデバッガで途中で100倍に書き換えればぼやけてるけど反応するので、なんやろなーと何気なく隣のモジュールを見てみればDisableScaleというわけわからないプロパティが...

試しにtrueにしてみると綺麗に印刷できた。誰だよ、こんなクソ設定値入れたの。修正履歴をみれば、なんてことない三年前の自分だった。

サポート外だった旧システム対応するために急遽ぶち込んだスケール設定値がいつのまにかそっちのお客様が増えて

基本false運用するようになってめっちゃ経つ代物だった。今思い出した。恥ずかしいくら死にたい。超死にたい

そしてそれに気づいた今、やっぱりここを直す余裕も工数もあまり残されていない。どうするべ、お家帰りたい。

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