M1 MacでC++のGCC環境構築した時のメモ
はじめに
競プロ始めようかなと思ったのですが、言語選択で何にしようか若干悩みました。
普段慣れているKotlinやJavaScriptでもいいかなと思ったのですが、折角ならC++でやってみるかと思いました。
(サンプルコードもたくさん読めますしね)
ということで、C++の環境構築をしたので、そのメモです。
C++にはGCCやClangというコンパイルする環境があり、Macの標準ではClangが搭載されているようです。
GCCでは、stdc++.hをincludeすればC++の標準ライブラリを色々使えるので、競プロで使うにはいいという記事をたくさん目にしたので、自分もGCC環境構築していこうと思います。
環境構築
GCCインストール
homebrewを使って以下でやりました。
$ brew install gcc
以下のコマンドで、GCCが正しくインストールされているかどうかを確認するとともに、GCCのバージョンを確認します。
$ brew info gcc
これにより、インストールされているGCCのバージョンとその他の詳細情報が表示されます。
GCCが呼び出されるようにする
GCCインストールしただけだと、clangの方が呼び出される状態になっています。
なので、gccとg++のシンボリックリンクを作成します。
まずは、GCCがインストールされたパスの確認です。
M1 Macでは、/opt/homebrew/bin/
にインストールされるようです。
以下で確認してみます。パスが表示されていればOKです。
ls /opt/homebrew/bin/gcc-*
確認できたら、以下のコマンドを使用してgccとg++のシンボリックリンクを作成します。
ただし、{version}は確認したGCCのバージョンに置き換えてください(例だと13になっています)。
ln -s /opt/homebrew/bin/gcc-13 /usr/local/bin/gcc ln -s /opt/homebrew/bin/g++-13 /usr/local/bin/g++
これらのコマンドにより、/usr/local/bin/ ディレクトリ内に gcc と g++ の名前でシンボリックリンクを作成されます。それにより、gcc や g++ を実行したときに homebrew でインストールした GCC が使われるようになります。
g++の呼び出し先を確認してみましょう。
which g++
/usr/local/bin/g++
となっていればOKです。
参考
NestJS/Docker/postgreSQL/TypeORM で環境構築してDBにデータ登録する
NestJSのプロジェクトの新規作成から、DBへのデータ保存するところまでを書いていきます。
記事のゴール
- NestJSのプロジェクト作成
- docker-composeでpostgreSQL環境構築
- TypeORMインストール、DBとの接続設定
- DB migration
- DBへのデータ保存
バージョン
- nestjs/common: 8.0.0
- nestjs/core: 8.0.0
- typeorm: 0.2.45
- nestjs/typeorm: 8.0.2
- postgreSQL: 14.2
NestJSのプロジェクト作成
公式サイトを参考に、NestJSのプロジェクトを作成していきます。
- NestJS CLIインストール
CLIをインストールしていない方は、インストールしてください。
$ npm i -g @nestjs/cli
- プロジェクト新規作成
プロジェクト名はnestjs-sample
としています。
コマンド実行するとパッケージマネージャーについて聞かれます。
筆者はnpmを選択しましたが、お好きなものを選択してください。
$ nest new nestjs-sample
postgreSQLのDB環境構築
- 作成したプロジェクト(nestjs-sample)配下に
docker-compose.yml
ファイルを作成し、以下の内容を貼り付けてください。
version: '3.7' services: postgres: image: postgres:14.2-alpine container_name: postgres ports: - "5432:5432" volumes: - ./postgres_data:/var/lib/postgresql/data environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_INITDB_ARGS: '--encoding=UTF-8' POSTGRES_DB: postgres hostname: postgres restart: always
- ターミナルで以下コマンドを実行し、postgreSQLのコンテナを立ち上げてください。
$ docker-compose up -d $ docker-compose ps // DBコンテナが起動されていることを確認
TypeORMインストール・DBへの接続情報
- 公式サイト参考にTypeORMのインストールをします。
今回はpostgreSQLを使用するので、pg
としています。
$ npm install --save @nestjs/typeorm@8.0.2 typeorm@0.2.45 pg
- DBへの接続情報を
ormconfig.js
に書き出す
$ touch ormconfig.js
- 作成した
ormconfig.js
に以下の内容を貼り付けてください。
module.exports = { type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: 'postgres', autoLoadEntities: true, entities: ['dist/entities/*.entity.js'], migrations: ['dist/migrations/*.js'], cli: { entitiesDir: 'src/entities', migrationsDir: 'src/migrations', }, };
entities: ['dist/entities/*.entity.js']
部分はmigrationファイルを作成する際に読み込むEntityの設定となります。TypeORMはデフォルトの設定で、コンパイル済みのjsファイルを読み込むので、コンパイル済みのdistディレクトリを指定する必要があるようです。
migrations: ['dist/migrations/*.js']
部分はマイグレーションを行うファイルです。
cli: {...}
部分はCLIによってentitiesやmigrationsが生成されるときの出力先となります。
- TypeORMを使うために、TypeOrmModuleをAppModuleにインポートする
app.module.tsでTypeOrmModuleをインポート
import {TypeOrmModule} from "@nestjs/typeorm"; @Module({ imports: [TypeOrmModule.forRoot()], // TypeOrmModule.forRoot()をimportsに加える controllers: [AppController], providers: [AppService], }) export class AppModule {}
Entityt作成
- Entityでテーブルを定義します。nestjs-sample直下に
entities
ディレクトリを作成します。
$ mkdir src/entities $ touch src/entities/user.entity.ts
- 今回はuserテーブルを以下のように定義します。
import {Column, Entity, PrimaryGeneratedColumn} from "typeorm"; @Entity() export class User { @PrimaryGeneratedColumn('uuid') id: string; @Column({ unique: true }) username: string; @Column() password: string; }
- コンパイルすることで、nestjs-sample直下に
dist/entities/user.entity.js
が作成されていることを確認してください。
$ npm run start:dev
マイグレーション
マイグレーションファイルを生成
$ npx typeorm migration:generate -n CreateUser
これで、src/migrations以下にmigrationファイルが生成されます。 上記コマンド実行時にエラーとなる場合は、nestjs/typeormやtypeormのバージョンによる可能性が考えられますので、バージョンを見直してみてください。
マイグレーション実行
生成されたmigrationファイルをコンパイルしてから、migration実行する必要があります。
$ npm run start:dev $ npx typeorm migration:run
これでuserテーブルが作成されたことを確認してください。
intelliJでESLintの"TypeError: this.libOptions.parse is not a function"のエラーが出た
ESLint@8.0.1でTypeError: this.libOptions.parse is not a functionのエラーが出ました。ESLintのバージョンによっては、intelliJやWebStormで出てしまうようです。 以下を実行することでエラーが解消しました。
- ESLintのバージョンを8.22.0にする
- node_modulesを削除する
- 再度npm installする
$ npm install eslint@8.22.0 --save-exact $ rm -rf node_modules $ npm i