「バージョン」を含む日記 RSS

はてなキーワード: バージョンとは

2019-01-16

元号

10年以上前VB.NETシステムを組んで、西暦和暦返還.NETAPIでやってたけど、あのシステムがまだ使われてたらどうなるんだろう。

MSは古いバージョン.NET新元号対応したアップデートを入れてくれるのだろうか。

2019-01-13

白菜乳酸菌発酵させる

白菜を25℃もしくは30℃の環境に保ち、乳酸菌繁殖させる。漬物とかザワークラウト白菜バージョンだ。

有害なばい菌は、PH3くらい、25度で1.4日だったっけ?保たれれば 大半死滅するらしい。


PH3に到達するのに1.6日って仮定すると、丸3日放置


キャベツ場合は細かく切り刻む必要がある。そうすると取り出すときも壁面に キャベツカスが残っていろいろと不便だ。焼肉店で出てくるキャベツとかもっとザックリ切ってあるし・・あれでもいいのかな?

あと塩の割合が、野菜重量の2%とか・・・しょっぱすぎだ!!!1.5%というレシピ最近テレビで放映していた。ここでは 1パーセントまで減らしてみた。おなかを壊すかな?

リトマス試験紙買おうかな??

2019-01-12

ブギーポップは口笛を吹かない」あるいは「木村明雄の消失

アニメブギーポップは笑わない」1〜3話および原作ライトノベルブギーポップは笑わない』の内容に触れています

TVアニメブギーポップは笑わない」が放送中だ。ほぼ20年前にスタートしたラノベ原作であり、アニメ自体は二作目だが、原作の内容に沿ったアニメ化は今回が初めてとなる。

さて、そんなアニメブギーポップの「ブギーポップは笑わない」(原作シリーズ一作目)編が、最新の第三話で完結となった。平均的なラノベアニメ化としては、原作1巻を3話で消化というのは、極端に速いペースというわけでもない。それでも、もともとが5話で構成された原作を3話に再構成する上で、大小さまざまな省略・変更が発生することは避けられなかった。

そのうち、特に目についた二つの変更点について、思うところを少し書いてみる。

「君と星空を」&木村明雄

上で述べたように、原作ブギーポップは笑わない』は5つのエピソード構成された物語となっている。一話にそれぞれ主人公視点人物)が設定されており、一つの事件複数人間の目から見ることで立体的な世界が立ち上がってくる、といったような、今となっては(当時でも?)さほど珍しくはない仕掛けだ。

原作構成及び各話の主人公はこうなっている。

ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム


これがアニメでは、

ねこういう形に変換されている。話数単位で大雑把に見れば、各パートの分量はともかく原作の流れを大枠では引き継いだ構成と言えるだろう。

ただひとつ原作第四話がその主人公存在ごと抜け落ちている点を除いて。

原作第四話は、木村明雄という男子高校卒業後(事件から二年後)に、当時「失踪」した紙木城直子と過ごした日々のことを回想する、という内容になっている。

木村は、紙木城の交際相手の一人(アニメでははっきりと描かれないが原作の紙木城は木村田中を含めて複数の男と付き合っている)であり、事件にはあくま彼女を通して間接的にしか関与していない。紙木城から保護したエコーズについての話も聞くことになるが、何かのたとえ話だとばかり思っていた。

紙木城の失踪後、色々あったもの普通高校卒業普通大学生として普通生活していた彼の元に一通の手紙が届くことで高校時代記憶が蘇り……という、1話竹田と同じかそれ以上に青春小説的な色合いが濃く、いわゆる「一般人」の目線から見た章となっている。

アニメ化にあたって、章はともかく仮にも原作主人公の一人を丸ごとカットするのはあまり乱暴に思えるが、ここには一応それなりに納得できる理由がある。

第一に、事件の真の姿あるいはその存在すら知らないまま全てが終わってしまっていた、という木村明雄の立場は、程度の違いこそあれ竹田啓司(一話)や末真和子(二話)と重複している。一人一人に見える現実には限りがあるというテーマを示すためには、この二話だけで既に必要最低限のノルマは達成していると言えなくもない。

第二に、竹田と末真は以後の巻でも登場している(末真は準レギュラーに近い)が、二人と違って木村明雄は今のところ少なくともブギーポップシリーズ内では再登場しておらず、カットしても今後の展開に特に影響がない。

第三。エコーズの素性に関する情報は、原作では第四話で木村が紙木城から話を聞くという形で最初に明かされる。物語の本筋との関係においては四話の存在価値と言ってもよい部分だが、アニメでは2話後半、紙木城と凪の会話でほぼ同じ内容が補完されている。これは、原作でもそのようなやり取りがあったと事件後に凪の口から語られていたものであり(木村自分にだけ話してくれたと思い込んでいたが)、オリジナル展開というより変則的原作再現に近い。木村カットしてもそういう軽度の改変で済む部分なのだ

驚くべきことに原作『笑わない』には、凪と紙木城が親友であるという情報こそあるが、二人が直接会話するシーンは存在しない。にもかかわらず、読者にはちゃん彼女らが親友同士に感じられていたというのは小説マジックというほかないが、ともあれ、今アニメで凪と紙木城の会話が追加されたこ自体ファンにとって喜ばしくさえある。

これらの理由から、『笑わない』をTVアニメ3話分に収めるために章と主人公をどうしても一つ削らなければならないとすれば、やはり第四話と木村妥当ということになるだろう。アニメスタッフ判断は間違っていない。

間違ってはいないのだが。

口笛

原作において、ブギーポップというキャラクターはいくつかの記号によって構成されている(もちろんその全てが記号還元され得るというわけではない)

都市伝説死神世界の敵の敵、黒い帽子と黒いマントと黒いルージュ、ワイヤー、そして口笛。

ブギーポップは、常にというわけではないが誰かの前に姿を現す時、特に世界の敵と向かい合う瞬間には、なぜか「ニュルンベルクのマイスタージンガー第一幕への前奏曲を口笛で吹きながら登場する、ということになっている。

過去メディア展開でも、多くの場合はこの口笛が再現されてきた。

実写映画はあらすじの時点で「口笛を吹く死神」と紹介されているし、旧アニメファントム)ではブギーポップ登場時の口笛はもちろん、次回予告のBGMとしてオリジナルアレンジマイスタージンガーが毎回使われ、最終回ではテルミンバージョン???)すら流れるという充実ぶり。

メインの使用キャラクターではなくサポートキャラとしての出演に過ぎない、格闘ゲーム電撃文庫 FIGHTING CLIMAX」でさえ、ブギーポップはやはり口笛を吹いて登場している(実際にプレイしているわけではないので又聞きだが、そのせいで攻撃判定の発生が遅いとかなんとか)

このように、「マイスタージンガー」「口笛」はこれまで原作の内外で、ブギーポップというキャラクター作品象徴する、代名詞と言ってもいい扱いをされてきた。

原作『笑わない』では、ブギーポップは二度口笛を吹いている。一度目は、一話の竹田屋上で会話をしている時。

第一話 浪漫の騎士 4 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

ブギーポップが口笛を吹き始めた。明るく、アップテンポな曲で、しかも呼吸に緩急があってすっごく上手だったが、しかし口笛なので、やっぱりそれはどこか寂しげだった。

 そして、藤花は口笛が吹けないことを思い出した。

うまいんだな。なんて曲だい?」

「〝ニュルンベルクのマイスタージンガー第一幕への前奏曲さ」

「なんだいそれ」

ワーグナーって大昔のやかましロマンチストがつくった、一番派手な曲だよ」

二度目は五話終盤、早乙女を失って荒れ狂うマンティコアに追われる新刻の前に姿を現す時。

第五話 ハートブレイカー 4 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

 恐怖のあまり、私はついにおかしくなった、と思った。

 幻聴が聞こえだしたのだ。

 現実にはあり得ないほど不自然な曲が、目の前の並木の植え込みから聞こえてきたのだ。

 それは口笛であった。

 しかも、口笛にはまるで似合わない曲、ワーグナーの〝ニュルンベルクのマイスタージンガーなのだった。

いずれも、古くからの読者には印象深いシーンだろう。

しかし、今アニメの「笑わない」編ではこれらの口笛演奏存在しない。ブギーポップは、一度も口笛を吹かなかったのだ。

これも木村同様に尺の都合なのだろうか?

マイスタージンガーといえば、あの、ふぁーふぁーふぁふぁーという力強いイントロが印象的な曲だ。口笛でいうと、ぴーひょーろろーとなる。最低限この、ぴーひょーろろーさえ吹いてくれれば、少なくとも原作読者には「あの口笛」だと一発で分かるし、初見視聴者にも、ブギーポップというのは口笛を吹くキャラらしいということだけはなんとなく伝わっていただろう。

前回のアニメや電撃FC使用された口笛バージョンマイスタージンガーで、ぴーひょーろろーの部分の所要時間確認してみると、せいぜい2〜3秒というところだった。2、3秒。もちろん1秒24コマで動くアニメ世界での2、3秒は、日常的な感覚のそれよりも遥かに長い時間ではあるのだろう。だが本当に、今回のアニメ「笑わない」編は、ぴーひょーろろーを挿入するだけの余裕が一切存在しないほどに緊密な内容だったのだろうか。

どうしても時間が足りないなら、いっそセリフを喋りながら同時に口笛を吹かせてもよかったのではないかブギーポップというのは、そのぐらいの物理法則を超えた無茶も読者視聴者笑って許してもらえるような、良くも悪くも異質なキャラだったはずなのだが。口笛のためにそこまで冒険するほどの価値はない、と判断されたのか。

これが、今回のアニメではブギーポップは口笛を吹かない存在として設定されているということなのか、それともあくまで「笑わない」編だけの変更なのかはまだ分からない。次回からの「VSイマジネーター」編ではしれっとぴーひょろ吹き始めたりする可能性もある。しかし仮にそうなるとしても、「笑わない」で口笛を吹かなかったという事実は、もはや取り返しがつかないのだ。

原作未読者の中には、口笛が無いとなにか物語の展開に支障が出るのか?という疑問を持った人もいるかもしれない。たしかに、どうしても口笛が無ければ成立しないという場面は、原作にもほとんどない。もちろん口笛自体に、特殊振動波か何かで敵の脳に直接揺さぶりをかける、などという実用的な効果存在するわけもない。はっきり言ってしまえば、口笛は基本的雰囲気づくりの賑やかしでしかないということになる。

その意味では、削る必要はないが削ったところでどうということはない要素だったのだ、とも言える。

言えるのだが。

昔語り+α

ここで唐突に昔の話をする。

ブギーポップがちょうど一度目のアニメ化や実写映画化をしていた頃のこと。とある個人サイトにて、「実写映画になるっていうから読んでみたけど単なる化け物退治の話だった」というような『笑わない』の感想を見かけた。当時の自分シリーズ純粋ファンだったので、そのあまりにも大雑把なまとめ方に、大雑把にまとめてんじゃねーわよ!と素朴に憤慨したものだ。

しかし、今にして思えばあの感想示唆である複数視点による眩惑を取り払った一本の話として『笑わない』の本筋だけを眺めてみれば、それはたしかに「単なる化け物退治」の話でしかないのだ。

では、自分を含めた多くの読者に『笑わない』を「単なる化け物退治」ではないと感じさせた、「本筋」以外の部分とはなんだったのか。それは、自分の進路について語る竹田とそれを半ば無責任肯定してくれるブギーポップであり、

第一話 浪漫の騎士 4 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

「へえ、君は受験しないのかい

「うん。親父の知り合いでデザイン事務所をやってる人がいて、ずっとバイトしてたんだけど、その人が〝おまえは見込みがある。センスを感じる〟とか褒めてくれてさ、大学なんか行かずに俺のところに来いって言うんで」

「すごいじゃないか親方に見込まれ職人ってヤツだな」

“対決”を望んで走る末真であり、

第二話 炎の魔女、帰る 3 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

(そうよ──中途半端はもううんざりよ!)

 霧間凪はほんとうに魔女なのかも知れない。でも、それこそ望むところだった。

「No One Lives Forever」を口ずさむ早乙女であり、

第三話 世に永遠に生くる者なし 5 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

「……誰も、誰も、誰も、誰も、誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も誰も………」

新刻の意志の強さを賞賛するブギーポップであり、

第五話 ハートブレイカー 4 - ブギーポップは笑わない/上遠野浩平(電撃文庫) - カクヨム

しかし、新刻敬──君の意志の強さは見事だ。君のような人がいるから、世界はかろうじてマシなレベルを保っている。世界に代わって感謝するよ」

そして、木村であり口笛であり、そういった一見取るに足りない枝葉こそが作品の印象を形成していたのではないか

枝葉とは言うものの、ひたすら枝と葉を切り落として純化していった先にあるのは、ただ一本の幹だけがまっすぐ天を突く寒々しい樹の姿だ。口笛や木村が本筋に不必要だというなら、ブギーポップあんな格好をしている必要別にない。『笑わない』のプロトタイプとなる作品には早乙女存在していなかったともいうし、この巻に限って言えばブギーポップだって無くても成立しそうな内容だ(シリーズ全体で見てもブギーポップ世界設定の中で異物として浮き続けていている)。必要不要物差し物語を測れば究極的には、そもそもアニメ化する“必要”とは……?原作が書かれる“必要”はあったのか……?という不毛なところにまで踏み込みかねない。

ブギーポップというシリーズは、ことに『笑わない』は、この「剪定」の影響を大きく受けやす作品であるように思う。本筋に関わらない細部が、作品本質とは思いがけなく深く結びついてるかもしれない、という面倒くささがある。アニメ側にとっては、原作の味を再現するためにどこを切ってどこを残すべきなのか、という判断が非常に難しい題材だったのではないか

いや、ブギーポップに限らずどんな作品であっても、ファンアニメ化や映画化などのメディア展開のたびに、アレがないと○○本来の良さが失われてしまう!と感じてはいるのだろうけど。

まとめ

木村明雄の省略に関しては、大きな変更ではあるし非常に残念ではあるが、三話という尺を考えれば致し方ない(そもそも『笑わない』を三話でというタイト過ぎる構成の是非はともかく)

口笛に関しては、小さい部分かもしれないが逆にそんな小さいところを敢えて削る意味が分からないし、監督でもシリーズ構成でもプロデューサーでもいいので早めに誰かに何らかの説明をしてもらいたい。

ということになる。

原作から変えること自体は、いい。メディアの違いに加えて、予算時間など様々な制約もある以上、どうしたって変えざるを得ないところは出てくるだろう。だが、その変更に意図というか大げさに言うと「思想」があまり感じられないのはちょっと困る。原作から変えてまで実現したかたこととは何なのか。

前回のアニメ、「ブギーポップは笑わない Boogiepop Phantom」は、初アニメ化にもかかわらず『笑わない』のオリジナル後日談という暴挙とすら言える内容となっており、それだけにとどまらず「霧間凪一人称が『オレ』じゃない」など、原作からの変更点がいくつか存在した。当然、原作ファンから評価も当時はあまり良くないものが多かった。

しかし、ファントムというアニメからは、これが作りたい、こうした方が面白いはずだ、という意志は強く感じられた。原作からの変更点自体に納得できるかどうかはともかく、そういう姿勢を打ち出されればこちらも、へぇ……あなた達はこういう画面も話も異常に暗いアニメがカッコイイと思ってるんだ?「オレ」女はリアルじゃないって?へーえええええ……?と正面から受けて立つことができるというものだ(こめかみに血管浮き上がらせつつ)

今のところ、今回のアニメブギーポップは、原作読者の目から見ても決して悪い出来ではない。悪くはないのだが、どうも、どこに芯があるのか分かりにくいアニメ化となっているように見える。

公式が「アクションファンタジー」と銘打っているということは、「笑わない」編では終盤に集中して存在する程度だったアクション部分が徐々に増えていく、これからエピソードが本番ということなのかもしれない。たしかに、最初に公開されたPVでもアクション描写はひときわ光っていた。

次の4話からは、原作では上下巻の大がかりなエピソード「VSイマジネーター」編が始まる。そこでは、このアニメと思いきりVSできることを願っている。

追記

”『笑わない』のプロトタイプとなる作品には早乙女が存在していなかったともいうし” へえ  それどこ情報? - maturiのコメント / はてなブックマーク

”『笑わない』のプロトタイプとなる作品には早乙女存在していなかったともいうし” へえ  それどこ情報

電子版『笑わない』新規書き下ろし「後書き」。プロト版のタイトルは、「エコーズ──人喰いの谺」だって

2019-01-10

GIMP翻訳に参加してくれる人はいませんかー?

GIMPって知ってます

パソコン用で無料で使えて割と有名だと思うお絵かきアプリなんですけど、

https://forest.watch.impress.co.jp/library/software/gimp/

そのGIMPバージョン2.10.10がもうすぐ公開されるらしいです。

https://hub.packtpub.com/gimp-2-10-x-and-3-0-will-support-gtk3-smart-colorization-feature-and-more/

でもGIMP日本語にする作業全然進んでないらしいです(5ちゃんで見た)

そこで、普段GIMPを使っている人!

GIMPちょっとしか使ったことないけどメニュー英語なのが気になった人!

GIMP日本語にするのを手伝ってみませんか?

GIMP日本語化する方法GNOMEというサイトでやっているそうです。

GNOME 日本語翻訳チーム参加者ガイド

http://www.gnome.gr.jp/l10n/gnomeja-guide/gnomeja-guide.html

ここにある手順でユーザー登録をして、

https://l10n.gnome.org/vertimus/gimp/master/po/ja/

多分ここのサイト翻訳を行うんだと思います

http://mail.gnome.gr.jp/mailman/listinfo

メーリングリストもあるので、そちらに投稿するのもありかもしれません。

僕は英語が苦手だしGIMPちょっと使っただけなので、

日本語にするのを手伝ったりはできません。

なのでこうやって増田宣伝してみることにしました!

よろしくオナシャス!

2019-01-09

anond:20190103021736

クソみたいな検索性のストアに30%の法外なマージン

バージョン機能が変わっていないのに突然独断での長期リジェクト

マジでクソだよAppleは。ユーザを囲い込んで開発者を締め付けてWindowsとの競争にボロ負けした過去を覚えてないのか?

労働人口で不足するのは高度人材ですよっと

ワイは常々、

『ながいながい自分自身職業人生を生き抜く方法』か『道端で3億円を拾う方法

このどちらかを考えた方がええぞ?って思ってるやで

2030年 驚きの労働人口クライシス


2020年までは、イタリアフランスアメリカなどいくつかの国ではまだ労働力供給過剰が見られますしかし、2030年までにはこの状況は一変します。ほとんどの経済大国世界的な労働人口危機を迎えるのです。


BRICのうちの3カ国も同様です。これまでの一人っ子政策の影響を受ける中国に加え、ブラジルロシアも打撃を受けます


さて、実を言うと、現実さらに困難な状況になるでしょう。ここでご覧いただいているのは平均値です。これを異なる技術レベルごとに分けて個々に見てみると、
高度なスキルを持つ人材の不足率が高く、低いスキルの労働者たちは部分的に供給過剰になることがわかったのです。


まり、全体的な労働力不足に加え、私たちは将来深刻なスキルミスマッチに直面することになります。これは、政府企業が、教育資格スキルアップに関連した大きな課題を負うことを意味します。

科学技術労働人口危機解決することができるのか


次に私たちが目を向けたのは、ロボット自動化科学技術です。科学技術生産性を押し上げ、この状況を変えるでしょうか。


短い答えは、私たちが算出した数字は、科学技術による顕著な生産性の向上をすでに含んでいるというものです。長い答えはこんなふうです。またドイツを例にとってみましょう。


ドイツ人というのは、生産性に関しては世界一定の評価を得ています90年代に私はボストンオフィスで約2年間働きました。私がそこを去る時、年老いシニアパートナーがこう言いました。


もっとドイツ人をよこしてくれ。機械のように働くから(笑)


  1998年のことです。16年後、きっと反対のことが言われています

もっと機械を送ってくれ。ドイツ人のように働くから」とね(笑)


科学技術は多くの仕事特に規則性のある仕事に取って代わるでしょう。製造業だけではなく、事務職も安泰ではありません。ロボット人工知能ビッグデータ自動化と入れ替えられる可能性があります


ですから重要な問いは「科学技術がこれらの仕事に取って代わるのか」ではなく「いつ、どれぐらい早く、どの程度の規模で取って代わるのか」なのです。科学技術はこの世界的な労働人口危機解決する手助けになるのでしょうか。


どちらとも言えません。この答えは「時と場合によります」のより洗練されたバージョンです(笑)

高いスキルを持つ人材重要になる


例として自動車産業を見てみましょう。自動車産業では産業ロボットの40%以上が働いており、自動化も進んでいます


1980年には電子部品は車の生産コスト10%以下しか占めていませんでした。今日この数字は30%以上で、2030年までには50%以上にまで増えるでしょう。


これらの新しい電子部品とその応用は新たな技術必要とし、たくさんの仕事を作り出しました。運転手電子装置のやりとりを最適化する認知システム工学のような仕事です。1980年には、そのような仕事存在するようになるとは誰も夢にも思いませんでした。


事実ロボット自動化が導入されたにも関わらず、自動車製造に携わる全体的な人の数は過去10年の間にわずかに変化しただけです。


これは何を意味しているのでしょうか。確かに科学技術は多くの仕事に取って代わりますしかし同時に多くの新しい仕事技術が生まれるのです。これは、科学技術が全体のスキルミスマッチ悪化させることを意味します。


このように個々に見ていくと、政府企業には非常に重要課題があることが明らかになります


次の10年間は、高いスキルを持つ人材重要になるでしょう。これらの人材が貴重な資源だったとしたら、私たちは彼らのことを今よりもっと良く理解しなくてはいけません。


2030年 驚きの労働人口クライシス―そして今からどう対策を始めるか/ライナー・ストラック
https://www.ted.com/talks/rainer_strack_the_surprising_workforce_crisis_of_2030_and_how_to_start_solving_it_now?

はい

anond:20190109122332 anond:20190114084110

2019-01-08

anond:20190108140701

長い上に専門用語だらけで何がなんだかわからなかったのでNHKの7時ニュースで流せる程度まで平易に要約したバージョンも頼む。

デザイン料は高いかいか

【2.9万RT底辺デザイナーの私が“デザイン料金表”を作ったわけ。

https://note.mu/h_n_o_z/n/nd7c6d4d2b162

このnoteホッテントリにあがっている。

で、本当にいろいろと思うところがあるので、現役デザイナー立場からとりとめなく書いてみようと思う。別に暇ではない。忙しい業務の合間合間に書いているのだ。いやほんと。

名刺発注してみよう

わかりやすく、具体的な例からいこう。

あなたは若きステーキ屋さんで、ついに念願叶い自分店舗を持つことができた。

士業や取引先と関わる機会も増えたので、名刺が無いとどうにも格好がつかない。よし作ろう。

名刺の手に入れ方は、大別すると2つだ。印刷屋に頼むか、デザイナーに頼むか。どう違うのか?

大抵の印刷屋にはDTPオペレーター、つまりデザイン印刷データにする人」がいる。特に名刺に特化したサービスをやってる印刷屋は、テキストを流し込む(これがDTPオペレーション)だけで印刷データまで進められるテンプレートを持っている。印刷屋に支払う料金は、おおむねこDTPオペレーション業務印刷代をあわせた額で計算される。一方、デザイナーに払う料金は、これに加えて「デザイン費」がかかる。デザイン費ってなんだよ?

デザインかい概念

ここで言うデザインとは、かなり抽象的な概念である。例えばあなたが「名刺には自分顔写真を載せたいな」と思ったとしよう。なぜならあなたヒゲサングラスと、肉に塩を振る仕草の似合うナイスガイを自負しているかである。そして印刷屋に「顔写真も載せてくれ」と頼んだとする。これもデザインである。えー!

小難しく言えば、デザインとは機能設計のことである顔写真も載せましょう。なぜか? あなたナイスガイから写真があれば店の紹介をするときに「あのナイスガイがやっている店です」と説明やすくなる。名刺を見た人は、「あぁ、あのナイスガイがやってる店ね!」となる。これは紛れもなく機能なのだ。一方、あなた別にナイスガイでもなんでもないなら、写真を載せる必要はなくなる。失礼だけど、正直言ってインク無駄からである(まぁ、顔を覚えてもらうためとかはあるけどね)。

たか名刺といえど、できることは無限にありうる。「どうせ名刺を配るなら、もっと機能的な名刺が良い。そのためなら金を多少かけてもいい(そのほうが儲かりそうだから)」そういう時はデザイナーの出番である。このデザイナーという生き物は、あなた普通の人よりもステーキに関して熟練しているように、デザインに関してはなかなか熟練している(してないのもいる)。そういうわけで、普通の人よりは良い(=機能的な)デザイン、例えば「お前はそんなにナイスガイじゃないぞ」とか……を持ってくるわけだ。この作業結構時間技術知識店舗とそのイメージ、配る層、名刺目的名刺が要るスタッフの人数、人が増えるかもしれないなら、その展開も印刷やすい版面、チラシやショップカードへの展開etcetc…)がいるので、少なくともテンプレートに流し込むよりはお金がかかるわけである

-

気づいた人もいるだろうが、普通の人も結構日常的にデザインをやっている。まぁ普通の人が日常的に肉を焼くのと大体同じ理屈である自分会社にはもっと機能的な名刺パンフレットwebページ必要だ、と判断されたとき、その仕事プロデザイナーに任せられる。なぜならその方が早いし機能的なものが出てくるからだ。そういうわけで我々デザイナーは、デザインしかできないのにメシが食えるわけである(あとDTP業務チョットデキル)。

それで題名に戻ると、安いかどうかは経営判断。小さなステーキ店舗設計を、何百億もかけて世界一建築士に頼みはしないだろう。しかしだからといって、大きめのテントで間に合わせたりもしないだろう(やるかもしれないが……)。

いかどうかは……デザイナー生活次第。デザイナーも、あまり安すぎると生活が終わってしまうので、極端に安い金額ではやりたくてもできない。一方で、好きなジャンル案件にはかけちゃいけないくらいの時間を使いがちだ。そんなわけで、たいして儲かってもないのに(ほんとだよ)我々は常に寝不足である

無論、我々には常に業務改善(DTP業務において特に)の義務があるが、業界全体では正直言ってあまり進展しているようには見えん。バージョン管理すら知らないのは怠慢といえる。我々はよりよいデザインで世の中を満たすために、僅かな努力も惜しむべきではない。最後にかっこいいことを言ってみた。

適当にQandAコーナー

いや、きれいな飾り罫やイラストを足すのがデザインでしょ?

これそのものデザインではない。載せるかどうか、どれを載せるかを決めるのがデザインであるデザイナーは飾り罫を追加する「作業DTP業務)」も兼任していることが多いので、よく勘違いされる。

でも、「ここに飾り罫置いてください」って頼んだら黙って置いてくれたよ。っていうか全部自分で決めて(=自分デザインして)発注してる

あなたが頼んでいる相手は多分デザイナーではなく、DTPオペレーターだ。最悪の場合、その仲介業者である。その実態は、仲介業者あなたの指示をDTPオペに丸投げし、言われた通りのものあなたに返すという仕組みである。そこにデザイナーはいない。

同人活動発注しようとしたら高すぎるんだけど

これは「同人ストーリープロ脚本家発注しようとしたら高すぎるんだけど」と同じ理屈なので、どうせなら自分たちでやろうぜ。僕は自分でやった(偶然にも自分プロだった)。プロデザイナーサークルに引き込むのは本当にオススメだとアドバイスします(私信デザイナーへ。今のうちに逃げろ!)

なんでこの業界料金表無いの?

一応ある。例えばJAGDAとか。http://www.jagda.or.jp/designfee/cf_fee.html

あの料金表でも十分稼げるんじゃね?

病気になったり、一時的にヒマになったら詰みそう。会社でもフリーランスでも理屈は一緒。ちなみに時給2000円で仕事をみっちり埋められても、32万円/人月である。僕はもっと稼がないと怒られる(リアル話)。

クイズ 正解は一年

TBSで放送しているテレビ番組の、2019年はてな村バージョン作成しようかと思ってるのだけど、なんかい質問ある?

Q1、2019年離婚しそうなはてな村民は?

Q2、2019年結婚しそうなはてな村民は?

Q3、ブレイクするはてな村民は?

とりあえずこれだけ作成しておいた。

追記(2019-01-09)

トラバより

・「今年買って良かったもの」みたいなブログホッテントリ数は?

退職エントリホッテントリ数は?

その他

はてな匿名ダイアリーホッテントリになった「うんこもらした報告」の記事数は?

はてなブックマークで1000以上ブックマークされた、はてな匿名ダイアリー記事数は?

4月1日に発表される新しい元号は?

ラグビーワールドカップ2019優勝国は?

・某x氏の運動瞑想睡眠野菜350gに続くパワーワードは?

裏紅白歌合戦に初出場する歌手は?

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

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

ブリッジ関数を書いた

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

医学的なエビデンスがない詐欺

奇跡着うた(R)「バストアップ特殊音源(強力バージョン)」 http://recochoku.jp/song/S21547261/

カーネギーメロン大学博士であり、脳機能学者苫米地英人(とまべち・ひでと)博士の長年の研究成果を応用した、特殊な刺激を脳に与える音源が埋め込まれています

この音源制作には、多くの被験者参加による心理物理実験のデータを利用した特殊なプログラムが利用されており、脳内のいくつかの機能部位に同時に働きかけることにより、望む効果が発揮されるよう設計されています

 

※本楽曲には各種効果が期待されると考えられる音源が組み込まれておりますが、その品質効果有効性についてなんら保証されるものではなく、ご利用はお客様自己責任においてなされるものします。

2018-12-29

セガ赤羽駅前店へ行った

増田(住んでいる場所がバレたくないので)。開店初日、つまり今日行きました。

店舗データ

https://sega.jp/topics/181227_location_1/

Google ストリートビューによると、パチンコ店が閉店してから建物再利用してオープンしているみたいです。

補足すると、エレベーターなし・禁煙喫煙室あり)です。

設置ゲーム

明記なき場合最新バージョンアップデート済みです。

3F - ビデオゲーム
2F - プライズプリクラ

本当にUFOキャッチャー等のプライズゲームプリクラしかないフロア

ただしポンターミナルはここにあります

1F - プライズ+その他

残りはプライズ電子マネーチャージ機はここです。

この階のみトイレはありません。

B1F - 音楽ゲームプライズビデオゲーム

残りはプライズ(小さいタイプのもの)。

PASELIチャージ機はここです。というかコナミ製品はここにしかありません。

音楽ゲームの料金設定(明記すべきもののみ)

IIDXの料金設定が間違っていたらしい(修正済)こと以外は、セガ赤羽店や他のお店と同じ料金設定です。

ついさっき、今更のようにSwitchポケモンピカチュウバージョンリメイクが出てることを知った。

ポケモンリメイク出しすぎじゃね?っていうのは置いといて、新しい伝説のポケモンっぽいナットみたいな奴、進化条件が廃仕様すぎないかポケモンGOでアメ400個て・・・

まぁ、昔からポケモンって廃ゲー感強かったし、隠し要素だから・・・っていうのはあるけど。

そもそも、金銀のライコウエンテイスイクンかめちゃくちゃ面倒くさかったし、イベント限定で逃したら手に入る見込みない昔の幻とか、モバイルアダプタGB必要小中学生には手が出ないクリスタルセレビィかに比べたら、頑張れば手に入る点では優しい仕様なのかも・・・うーん。

マイクロソフト日本語IMEキー定義はどう変わる?

マイクロソフト日本語IMEオンオフ方法が変わるという記事をここ数日何本か見かけた。

現在はどうなっているのだろうと注意して触ってみたが、英数キーひらがなキーの設定はしばらく意識してない間に変わっている気がする。

例えばAlt+ひらがなローマ字入力、カナ入力が切り換えられた気がするのだが、切り替えられなくなった気がする。

10月に配布された現行バージョンキー定義サポートサイトに書かれている次期バージョンキー定義を見比べてみると、

キーバージョン1809次期バージョン
全角/半角IMEオンオフ(トグル)IMEオンオフ(トグル)
英数かな英数(かなと英数をトグル、直接入力モードならIMEオン)IMEオンオフ?
無変換かな切替(直接入力モードでは何も起きない)IMEオフ(オプション扱い)
変換再変換(直接入力モードならIMEオン)IMEオン(オプション扱い)
ひらがなひらがなキー(IMEオンと同じ動作をした)?
Ctrl+Space未割当IMEオンオフ
Alt+~未割当IMEオンオフ(USキーボード)
Ctrl+変換メニュー表示(アイコン右クリック時と同じもの)?

ニュースを読んで全角/半角キー機能が無くなると思っている人がいるが、この操作は引き続き使えるようだ。

一方変換キーIMEオン、無変換キーIMEオフデフォルト設定ではなさそうな記述である現在との違いは設定変更メニューが目立つところに来るという程度なのではないか

サポートページの記述あいまいなので、実物を触ってみないとどうなってるのか分からないけれど。

参考にしたページ

Announcing Windows 10 Insider Preview Build 18305 | Microsoft Windows Blog

https://blogs.windows.com/windowsexperience/2018/12/19/announcing-windows-10-insider-preview-build-18305/

日本語IME | マイクロソフトサポート

https://support.microsoft.com/ja-jp/help/4462244/microsoft-ime

[半角/全角]キー不要に? WindowsIME切り替えがMac方式ITMedia

http://www.itmedia.co.jp/news/articles/1812/26/news094.html

日本ニュースサイトはどういう主義か知らないけれど、頑なに情報ソースリンクを張ろうとしない。ITmedia言及したのは上のブログエントリだと思うのだけど、違うかもしれない。上のエントリだと画像では変換キー=IMEオン、無変換キー=IMEオフになってはいるが、本文中にデフォルト動作をそう変更するという記述は見当たらない。

2018-12-25

anond:20181225102720

おじいちゃんが頑なにPDFガーとか言うのは結構なんだけど

ワイが期待した超簡単でいいか理解している?はこう言う事な?

CUPSについて

1. ユーザプリントの依頼をする

2. スケジューラに依頼がもちこまれキューになげこまれ

3. ポストスクリプトドライバとPPDや、GhostScriptによりプリンタ解釈できるものに変換される

4. バックエンド情報がひきわたされ、プリンタ情報がわたされる

5. 印刷がなされ、完了となる

その話、必要

PDF投げてる状態だとすると、不具合があった場合は、ネットワークハードソフト)かプリンタかどっちかが原因で、プリンタボードなら取っ替えでメーカー保守担当電話だよ。後者ならパソコン先生が出る幕ないよ。

んで、メーカー製のドライバ必要なのはプリント画面で直接プリントPDF送信するやつじゃないかな。オプション設備必要だし。

オープンソースドライバでできるかどうかはちょっとどうかと思う。

MacOSXバージョンによっては、メーカードライバを用意してないケースが多々あって、Macデフォルトで用意してるドライバとかオープンソースドライバ必要になるわな。懐かし。

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