ゲーム作りは楽しい

なんか書く

Haskellの実行環境をVSCode DevContainerで作成

まえがき

関数型パラダイムの言語をあまり触れてこなかったので、最近Haskellを勉強中

書籍として すごいH本 を読んで勉強してます。

勉強用に実行環境を作りたかったのですが、だいたいいつも自分はちょっとした環境作成はDockerでやりたくなるので
今回もDockerでやろうと思っていたのですが
エディタ補完とかを考えると、どうしたものかと考えていたら DevContainer という便利拡張に出会った。

code.visualstudio.com

こいつを使ってHaskellの実行環境を用意することに

設定ファイル等の用意

repo
├ .devcointainer
│ ├ devcontainer.json
│ ├ Dockerfile
│ └ docker-compose.yml
└ src

devcontainer.json

{
    "name": "Haskell Dev Container",
    "dockerComposeFile": "docker-compose.yml",
    "service": "haskell-dev",
    "workspaceFolder": "/workspace",
    "extensions": [
        "haskell.haskell",
        "justusadam.language-haskell",
 ]
}

Dockerfile

# Dockerfile
FROM haskell:latest

# Install GHCup
RUN curl https://get-ghcup.haskell.org -sSf | sh
ENV PATH="/root/.ghcup/bin:${PATH}"

RUN ghcup install hls

# Set working directory
WORKDIR /workspace

# Copy project files to the container
COPY . /workspace

docker-compose.yml

version: '3'
services:
  haskell-dev:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: haskell-dev
    volumes:
      - ../src:/workspace
    tty: true

ちなみに、ほぼChatGPTに書かせました。

おまけ

ぶっちゃけちょっとコードを書くくらいならオンラインコンパイラが最強

wandbox.org

0=1の証明

本日のギャグです。


こちらのコードを見てください。

#include <cctype>
#include <iostream>
int main()
{
    using namespace std;

    int32_t x = 0;
    if (x = x + 1)
        std::cout << "true";
}

C++で以下のコードを実行したら「true」と出力されたので、 「x = x + 1」はtrueになります。
したがって、x = 0より「0 = 1」である。


...

これは間違いですよね、、

C++で等値判定は「==」にしないといけないので正しくは以下のようにしないと判定できません。

- if (x = x + 1)
+ if (x == x + 1)

「=」にした場合はifの条件評価時にxにx + 1が代入されて「1」になるのでif文を通ったわけです。


では、「==」にして再確認してみましょう。以下のコードの実行はどうでしょうか?

#include <cctype>
#include <iostraem>
int main()
{
    using namespace std;

    int32_t x = 0;
    if (x == x + 1)
        std::cout << "true";
}

なんとこれも「true」と表示されました。

やっぱり「0 == 1」なんですね!

ネタバレ

iostraemに以下のコードを書いています。

#pragma once
#include <iostream>
struct kuso
{
    constexpr kuso(){}
    constexpr kuso(int){}
    constexpr kuso operator + (int)const {return {};}
    constexpr bool operator == (kuso)const {return true;}
};
#define int32_t kuso

くそすぎ

プリパラを見すぎた人がやりがちなプログラミングミス

本日のギャグです。


よくわからないコンパイルエラーが発生

#include <iostream>
#include <algorithm>

int main()
{
    int a, b;
    std::cin >> a >> b;
    
    int max = std::max(a, b);
    int relax = std::relax(a, b);
    
    std::cout << max << ' ' << relax << std::endl;
}

上記プログラム、一見正しそうですが、実はコンパイルエラーになります。
どこがいけないのでしょうか?

prog.cc:10:22: error: 'relax' is not a member of 'std'; did you mean 'replace'?
   10 |     int relax = std::relax(a, b);
      |                      ^~~~~

エラーを見ると上記のような記載があります。

    int relax = std::relax(a, b);

これは、ついやってしまいがちなミスですが、relax関数はC++の標準ライブラリに定義されていないのです。

こちらの修正方法を調べてたところ、以下の一行を追加することでコンパイルエラーを解消するようでした。

#define relax min

ちなみに、std名前空間に新しく関数を勝手に追加してはいけないので、std::relaxを追加することはできない。

まとめ

テンション マックス!リラックス~

VisualStudio複数プロジェクトで共通コードを使う

VisualStudioのソリューションに複数のプロジェクトを追加する際に 共通のコードを使用する方法のメモです。

  1. 新しいプロジェクトを追加 > 共有アイテムプロジェクト

  2. プロジェクトへ参照の追加


以上

VisualStudio2022を最新にしたらモジュールがビルドできんくなった

先日VisualStudio2022を更新した(17.7.266.26423)

そしたらモジュールがビルドできなくなったので、なんでだろうってなった

以下みたいなエラー

MSB3191
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\modules" を作成できません。指定されたパスのフォーマットはサポートされていません。
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets 1016

調べていたところどうも

C++出力ファイルの オブジェクトファイル名を %(IntDir)%(RelativeDir)にしていたのが原因のようだった

※なお%(IntDir)%(RelativeDir)にすると別フォルダにある同じファイル名をビルドできるようになる
この辺に書いてある

learn.microsoft.com


stack overflowにそれっぽい解決法を見つけたのでこれでいけた
いつもありがとうstack overflow。大好きだ

stackoverflow.com

  1. C/C++ > 言語 > ISO C++標準ライブラリモジュールのビルドNoにする
  2. .slnをエディタで開いて以下をProject直下に挟む
<PropertyGroup>
    <EnableStdModules>false</EnableStdModules>
</PropertyGroup>

まぁ備忘録としてメモですわ

ちなみに、stdモジュールも使いたい場合はどうするんだろう??
こんなもんVisualStudioのバグだろって気持ちになってます

無職からゲームエンジニアになりました。

夢がかないました。

私は、最近無職です。今もニートライフを楽しんでいます。
そんな私ですが、ありがたいことにモバイル系のゲーム会社から内定をいただいて無事に将来の夢であった”ゲームエンジニア”になることができました。
来年度から仕事が始まります!!

さて、無職だった私がどのようなことをして、ゲームエンジニアになったのか、これまでやってきたことを振り返ります。

  1. まずゲーム会社に就職して実績を残す
  2. なんやかんやで無職になる
  3. 就活をする

このような経歴が評価されて、無職だった私も無事にゲームエンジニアになることができました。
来年から改めて頑張ります!

さいごに

釣りでした。ごめんなさい。

niko and … に対して思う事

ショッピングモールとかを歩いていると「niko and …」をよく見る

もしあなたがC++erなら、すぐに気が付いたかもしれない。

あ、これC++のコードだって

int main()
{ 
    auto f = [](auto... niko) constexpr {
        return (niko and ...);
    };
    static_assert(f(true, true, true));
}

[C++] gcc 11.1.0 - Wandbox

まとめ

fold expression はいいぞ