アメリカだと日本ほど競技プログラミングに取り組んでる人いない?

なんとなく思ったことを書く

アメリカだと日本ほど競技プログラミングに取り組んでる人いない?」 これについて思ったことでも書いてみよう

ちなみにわたくしは競技プログラミングやってなくて、Paizaでたまに問題を解くくらいである。

個人的に思うのはそもそもアメリカのプログラマってコンピューターサイエンスの学士が必要とか もともとそれなりに詳しいのでは?

という気がしている。

自分がPaizaとかでアルゴリズムの問題に取り組むのは知らないからであって 知っているものをわざわざやるかといえばやらないよなぁって思う。

極端な話、東大生とかはやらんだろうけど 高卒とか無知な人はやるっていう類のものなんじゃないかと思うんだよね こういうのは

桃色メロイック感想

www.amazon.co.jp

シスコンのアニキと妹JKのギャグ漫画

10年ほど前に少し読んだけど金欠になり途中から読めていなかったのだが ふと読みたくなって一気読みしてしもうた。

実に面白かった。

まず登場するJKがとにかく可愛い。 作者はJKを書くために進化した人類だと勝手に思っている。

前半はアニキのシスコンっぷりのキモさが目立つけど徐々に慣れる。 人間は慣れる生き物だし、慣れは癖になるので問題ない。

個人的には妹よりも妹の友達の愛梨ちゃんが好き

https://chie-pctr.c.yimg.jp/dk/iwiz-chie/que-11231798916?w=200&h=200&up=0

というかわりと登場人物全部好きだ。

最終的になんにもならず打ち切りかなーって感じの終わりなのはモヤモヤするけど よい作品でした。

もっと続きが読みたかった。

【勉強日記】英語はどうやって学ぶのがいいのだろうか

英語ができない以上はどうやって学ぶかなんてわからないという話でしかないけど


色んな人が英語はこう学んだ方がいい!というのを見ていると千差万別なので

結局は自分が納得できる方法でいいのだろうと思っている。


英語をいちいち日本語にするのがダメなんだというのもわかるけど

こっちは日本人なんだから、いきなりネイティブと同じ感覚になれるか?

と言えばそれはそれでごもっとも


できないなりに思うのは、「全然わからん」という状態が長く続くのが一番きつい

正攻法かどうかはおいておいて「わかる部分がある」、「出来たと思えることがある」というのが

ある程度ないとそもそも続けるのがきつい。

できないなりに多少は手ごたえを感じられた方法

日本の漫画の海外版を読む

漫画は絵もあるし、1つ1つの文章が短めなのでイメージを結びつきやすい。 よくわからないけど、なんとなくこういう事言ってるんだろうなという感覚が少しわかったきもする

英文法

中学の英文法を一通り復習した。 多くは忘れたけど、なんかこういうルールあったなーと思えることは増えたかもしれない。 ただ英文法は例外が多すぎて、ルールばかり意識してると逆には?なんで?ってなる事も多い

品詞に着目する

これは名詞?動詞?副詞?みたいに品詞に着目すると英文が理解しやすくなった。
ただこれは分析しているという感じで、英語力?ではない気もする

ただ、分析してなるほどと腑に落ちる感覚があるのは楽しくもある。

理屈脳なので、比較的楽しみながらやれるので割とよい。

愚直に分析する

日本語を英語にする時、ほとんどの確率で間違える。

訳す単語が抜けてたりとかは日常茶飯事。

とりあえず日本語をある程度の単位で区切る。

例えばこんな英文

その公園にいる老人たちは今、何をしているのですか?

単語をスラッシュで区切る

その公園にいる老人たちは / 今、 / 何を / しているのですか?

疑問文だと混乱するレベルなので、ちょっと肯定文でも考えてみる。

その公園にいる老人たち / は / している。

こうすると

The senior citizens in the park are doing.

こんな感じになって、疑問文にすると

Are the senior citizens in the park doing.

何を?を加えると

What are the senior citizens in the park doing.

今を加えると

What are the senior citizens in the park doing now.

日本語を英語にするのにいちいちこの工程を踏んでいたら遅すぎるわけだけど 遅くてもできないよりはマシかなーとも思う。

後は繰り返して速度をあげていく、途中の過程をすっ飛ばす訓練 結局は慣れが大事だと思うけど、慣れるまえに出来ないと慣れもくそもないとこがある。

ツール

DeepLは手放せない。

【勉強日記】少なくとも一人は女子

間違いやすい問題

男子6人、女子4人の合わせて10人がおります。

このグループの中から、3人を選びます。

少なくとも1人は女子である選び方は、全部で何通りですか?


これの答えは「100通り」

よくやってしまうミス

とりあえず女子1人を選んで、さらに残りの9人から2人を選べばえんやろがいと思って

  • 4人から1人は4通り
  • 9人から2人は36通り
  • 4 × 36 = 144通り

とやって幾度となく間違えてきている。

しかしよくよく考えたら

男子を大文字のアルファベット、ABCDEF
女子を小文字のアルファベット、abcd

で表してみると

  • aちゃんを選ぶ
  • A君とbちゃんを選ぶ

abA という3人組が出来上がる

  • bちゃんを選ぶ
  • A君とaちゃんを選ぶ

bAaという3人組ができあがる

abAとbAaって同じやんけっていう重複を見落としていたのねとようやく理解

正しい考え方

まず10人から3人を選ぶという全体を考える、これは120通り

次に全員男という悲しい組み合わせは6人から3人を選ぶので 6×5×4 ÷ 6 = 20通り

なので少なくとも一人は女子がいる救いのある組み合わせは
120 - 20 = 100で100通り

めでたしめでたし

【勉強日記】品詞とか副詞とか

英語は前置詞が入ったり、入らなかったり謎が多い。

感覚で覚えてみようと思いもしたけど、脳みそが理屈脳なので
あえて文法とか品詞とかいろいろ分析してみるスタンスでやってみようかなと。


品詞がわかればなんとなく理解しやすくなる気がしたし
とりあえず英文を品詞で分ける練習中


  1. I went to school yesterday.
  2. I went there yesterday.


この2つとか、toが入ってたり入ってなかったりなんなん?
っていう


①を品詞でわけると多分

I / went / to / school / yesterday.

名詞 / 動詞 / 前置詞 / 名詞 / 副詞


自動詞の後ろに名詞を置くときは前置詞が必要で、went(go)はこの場合は自動詞で、schoolは名詞だから「to」がいる

(自動詞なのか他動詞なのかの見分けはよくわからんが)


②を品詞でわけると多分

I / went / there / yesterday.
名詞 / 動詞 / 副詞 / 副詞


副詞は前置詞つけないで置けるらしい、thereは副詞だからwentの後に前置詞がこない。

そしてこうやってみてみると

went(go)が自動詞というのもなんとなくなるほどーと思える気がする。

動詞の後ろに名詞が来ていない、①は前置詞がきているし、②は副詞が来ている

そう考えると、この英文は I went. で完結していて、①も②もその後ろにあれこれ付け足している。

付け足す時に名詞はそのままじゃおけないから前置詞でくっつける

副詞はそのまま置いていいから前置詞いらない。

理屈脳的には理屈が通っていてわりと理解しやすくなったなと思った。

ゲームプログラマーになる前に覚えておきたい技術のサンプルプロジェクトをVisual Studio 2019で動かした備忘録

ゲームプログラマーになる前にという書籍はとても良書なのだが、なにぶんちょっと古い書籍のためサンプルプロジェクトが最新の環境で動作しないようなので、Windows 10 Visual Studio 2019において、以下から取得したVisual Studio 2012用のプロジェクト起動する事にチャレンジしてみることにする。

GameLib2012.zip

環境

  • Visual Studio InstallerよりVisual Studio 2019をインストールしていること

  • ワークロードタブより、C++によるデスクトップ開発にチェックを入れ導入していること

    (これがないとC/C++による開発ができない) f:id:kazumichi96:20210305005524p:plain

まとめ

以下備忘録に実際にあれこれした流れを書いているが、とりあえずこれやれば動かせるであろうという事をまとめる。

  • 環境変数の設定 書籍にもあるけど、GAME_LIB_DIRという名前で、ダウンロードしてきたGameLibを展開した場所にPathを通しておく
  • ソリューションが古いので、基本的に全てのソリューション設定はプラットフォームツールをv142に変更する(Windows SDK バージョンはアップグレードなしにしている)
  • サンプルプロジェクトで参照しているstaticリンクライブラリがある場合は、まずstaticリンクライブラリをリビルドする。
    とりあえずプロジェクトをビルドしてリンクエラーが出たらだいたいstaticリンクライブラリのせいなので、プロジェクト設定ファイルから参照しているライブラリを特定して そのライブラリをリビルドするという事をすればいけると思われます。

備忘録

下記ファイルの文字コードをShift-JISからUTF-8に変更

下記ファイルがShift-JISでエディタによっては文字化けするのでUTF-8に変換

  • 2010以降固有の問題について.txt
  • この中にあるものについて.txt
  • 使用許諾規約.txt
  • 問題が起こったら.txt

src/01_FirstGame

  • ひとまずVisual Studio 2019でソリューションファイルFirstGame.slnを開いてみる。

    (ソリューションファイルを右クリック→プログラムから開く→Visual Studio 2019)

  • 以下のダイアログがでる

f:id:kazumichi96:20210305005726p:plain

もしソリューション操作の再ターゲットダイアログが表示されなければ、ソリューションエクスプローラーでソリューションを右クリック→プロジェクトの再ターゲットを選択すればいい。

Windows SDK バージョン プラットフォームツール 起動
アップグレードなし アップグレードなし ×
アップグレードなし v142へのアップグレード
10.0 アップグレードなし ×
10.0 v142へのアップグレード

いろいろ警告は表示されているが、プラットフォームツールをv142へのアップグレードをしておけばとりあえずこのソリューションに含まれるプロジェクトは全て動作した。

プラットフォームツールとは平たく言えば仕様するVisual Studioのバージョンを指定するようなものなので、Visual Studio 2019を使う以上、もともとの2012を指定していたら動かないというはまぁそうだろう。

Windows SDKバージョンは変えても変えなくても動作した、下手に変えると何がおこるかわからないのでとりあえずそのままにしている。

src/02_2DGraphics1

  • まず環境変数を設定する(これは書籍にも書いてある通り)

    GAME_LIB_DIRという名前で、最初にDLしてきたGameLib.zipを展開した先のパスを設定する

  • 最初のプロジェクトと同様にプラットフォームツールはv142にする

ここまではOKだが、残念ながらここから先はちょっとめんどくさいことになった。

依存してるlibファイルが古くてビルドが通らない。

まずは依存してるlibをビルドしなおさないと行けなそうだ。

ひとまずsrc/GameLibs/2DGraphics1をリビルドできればいけそうだが、このソリューションはsrc/GameLibs/Modulesに依存しているっぽいので先にこっちをリビルドする

  • src/GameLibs/Modulesを開き、プラットフォームツールをv142に再ターゲット
  • Windows SDKはアップグレードしない
  • Debug、Releaseそれぞれでリビルドをする
  • src/GameLibs/Modules/lib以下にModules.lib`Modules_d.libができる。
  • 次に以下
  • src/GameLibs/2DGraphics1のソリューションを開き、プラットフォームツールをv142に再ターゲット
  • Debug、Releaseそれぞれでリビルドする
  • 出力先がGameLibフォルダ直下の2DGraphics1/libになっているのでここにGameLib.libGameLib_d.libができていればOK

この状態でsrc/02_2DGraphics1のソリューションを開き実行すると動いた。

多分他のプロジェクトも同様に、まずstaticリンクライブラリが死んでいるので、そちらを先にリビルドすれば動くと思われるので、その他のプロジェクトについては今は調査しないことにする。

モノによってはソースコードを変えないとビルドが通らないケースがあるかもしれないが、その場合は頑張ってエラーを直してリビルドすればいけるでしょう。

追記

Chapter4

GameLib/src/04_RealTimeのソリューションをビルドしたらリンクエラー(MSC_VERの不一致など)が発生

このソリューションに含まれる各種プロジェクトはGameLib/RealTimeに含まれるライブラリを参照しており このライブラリをリビルドしてやる必要があった。

GameLib/src/GameLibs/RealTimeにあるソリューションファイルを開きリビルドすればOK

Chapter9

入力デバイスの章でJoyStickの入力が受け取れない(Xbox360コントローラー使用)ようだ 入力が受け取れないというかJoyStickをつないでても認識されないっぽい ライブラリ側のコードを見てないので原因は不明だけど、とりあえず現状は認識されない。

Chapter12

12_2DTransformは上記同様の処置を施してもビルドエラーが発生した。

main.cppに定義されているround関数が多重定義になってエラーになる。

(C++のどこかに定義されているround関数とぶつかってる?)

動作させたいプロジェクトのround関数をround2などに名前を変えてしまえば

とりあえず動作するので、サンプルを動かすだけなら暫定対処だがかまわないだろう。

【Unity】マウス操作でカメラの移動をコントロール①

とりあえずメインカメラにアタッチするだけで動く

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TargetCamera : MonoBehaviour
{
  // Inspectorから設定
  public GameObject ViewTarget = null;
  public float Speed = 0.02f;

  // 内部処理用
  private Transform cacheTransform;
  private Vector3 toPos = Vector3.zero;

  void Start()
  {
    this.cacheTransform = transform;
    toPos = this.cacheTransform.position;
  }

  void Update()
  {
    // 左クリックしながらマウスを動かすとXY方向にカメラを移動
    if (Input.GetMouseButton(0)) {
      toPos.x += Input.GetAxis("Mouse X");
      toPos.y += Input.GetAxis("Mouse Y");
    }

    // マウスホイールでZ方向に移動
    toPos.z += Input.mouseScrollDelta.y;

    // 目的地に向かって座標を補間(滑らかな移動)
    this.cacheTransform.position = Vector3.Lerp(transform.position, toPos, Speed);

    // カメラは常にターゲットを見る
    this.cacheTransform.LookAt(ViewTarget? ViewTarget.transform.position : Vector3.zero, Vector3.up);
  }
}