Goを複数バージョンインストールする

はじめに

これまでは、バックエンドの開発でgo1.17系を使っていましたが、別アプリケーションの開発をすることになりました。 そちらのアプリケーションではgo1.18で作成されていたため、最初の環境構築時にGoのバージョン違いによりエラーが発生しました。 今後もこれまで関わっていたアプリケーションの開発を行う可能性もあるため、複数Goバージョンでの開発が必要になり実施することにしました。

結論

複数バージョンのインストールする、というタイトルとは矛盾しますが、 下記にあるように、Go言語は後方互換性を保っているため、 特別な理由が無い場合は複数バージョン持たずに最新版をインストールしておけば問題ありません。 セキュリティ面や不具合等によっては互換性が保てない場合も出てくる可能性はありますが、これまでのところ出てはいないようです。

go.dev

インストーラでインストール

現在のバージョンをアンインストール後、ダウンロードページにて最新版を取得してイストールしましょう。 アンインストールは下記のように直接ディレクトリを削除することで完了します。

rm -rf /usr/local/go

go.dev

brewでインストール

# 最新版にアップグレード
brew upgrade go

バージョンを指定する場合

# アンインストール
brew remove go
# バージョンを指定してインストール
brew install go@1.18

go.dev

とはいえ

テストコードが十分ではないアプリケーションのバージョンを気軽に上げるのはやはり抵抗はありますよね? また、ベータバージョンのGoで搭載される新機能を試してみたい場合、 ローカルのバージョン上げてしまうと、プロダクトの開発で使用しているバージョンと異なってしまうため、業務に支障をきたします。 ということで、複数バージョンをインストールできる方法を知っておくと便利です。

バージョンが異なることでどんなエラーが発生するか

複数バージョンのインストール方法の前に、バージョンが合わない場合に、どのようなエラーが表示されるかを示しておきます。

go mod tidy

エラーが出て実行できません。

go mod tidy

go mod tidy: go.mod file indicates go 1.18, but maximum supported version is 1.17

go mod vendor

特にエラー発生せず。vendorディレクトリが作成されます。

go run

こちらも特にエラー発生せず。アプリケーションも動作しました。

go test

注意は出ますが、一応テストは実行可能。※下記「note:」の部分 上位バージョン特有の書き方が実行ファイルに存在する場合はエラーになるかもしれません。

go test ./...

〜〜 中略 〜〜
note: module requires Go 1.18
?       app/path  [no test files]
?       app/path/one   [no test files]
ok      app/path/two   0.532s

複数バージョンのインストール

他のプログラム言語では、複数バージョン管理するために○○env的なパッケージを用いるのが多いです。 Goにもgoenvなるものがありますが、公式で提示されている方法がありますので、そちらで実施していきます。

go.dev

下記のコマンドでの[バージョン]の部分を好きなバージョンに変えて実行すればOKです。

$ go install golang.org/dl/go[バージョン]@latest
$ go[バージョン] download

インストール可能なバージョンについては、ダウンロードページを確認することで、存在するバージョン番号を知ることができます。

go.dev

現時点の最新版はgo1.19.1、1.18系の最新版は、go1.18.6となっています。 go1.18の場合は下記のコマンドになります。

go install golang.org/dl/go1.18.6@latest
go1.18.6 download

# バージョン確認
go1.18.6 verion

go version go1.18.6 darwin/amd64

続けてgo1.17もインストールしてみます。 go1.17の最新版は1.17.13なので下記のコマンドです。

go install golang.org/dl/go1.17.13@latest
go1.17.13 download

# バージョン確認
go1.17.13 version

go version go1.17.13 darwin/amd64

ということで複数バージョンのGoをインストールすることができました。

使い方

各バージョンのGoを実行するには、goの後ろにインストールしたバージョンを付けてコマンドを実行することになります。

go1.18.6 verion

go1.18.6 env GOROOT

go1.18.6 run main.go

...etc

アンインストール

ダウンロードしたバージョンをアンインストールするには、 GOROOT環境変数で指定されたディレクトリを削除するだけです。

インストールしたGoはインストーラでインストールした場合と異なり$HOME/sdk 配下に保存されています。

Goのアンインストール

goのインストール先の確認

go1.18.6 env GOROOT

ディレクトリ削除

rm -rf $(go1.18.6 env GOROOT)

/etc/paths.d/goを削除する

rm -rf /etc/paths.d/go

おまけ

Go 2.0が登場すると今回の記事の内容がより活用できる場が増えるかもしれません。 Goは2月と8月にマイナーバージョンが上がりますので、 予定通りであればGo 1.20は、2023年2月のリリースとなります。

下記の記事ではGo 1.20がGo 2.0となるような内容にも読めるため、 来年Go 2.0がリリースされるかもしれませんね。

go.dev

reviewdogのmisspellとalexでエラーが発生したのを解決した件

事象

本日PullRequestした際の、CIでreviewdog/misspellとreviewdog/alexのエラーが発生

reviewdog: PullRequest needs 'git' command: failed to run 'git rev-parse --show-prefix': exit status 128

reviewdogのイシューも立ってるようで、割とリアルタイムにコミットされてそうなので、 このまま順調にマージされれば、対応版がすぐ出てきそうな雰囲気ですね。

https://github.com/reviewdog/reviewdog/issues/1158

解決策(暫定)

CIのyamlに下記を追記

 - run: sudo chown -R root:root $GITHUB_WORKSPACE

全体

  misspell:
    name: runner / misspell
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: sudo chown -R root:root $GITHUB_WORKSPACE
      - uses: reviewdog/action-misspell@v1
        with:
          github_token: ${{ secrets.github_token }}
          reporter: github-pr-review
          level: warning
          locale: "US"

  alex:
    name: runner / alex
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - run: sudo chown -R root:root $GITHUB_WORKSPACE
      - uses: reviewdog/action-alex@v1
        with:
          github_token: ${{ secrets.github_token }}
          reporter: github-pr-review
          level: warning

原因

Githubのセキュリティ アップデートが4/12にあったようで、これの影響ということらしい。

Git security vulnerability announced | The GitHub Blog

Cannot add parent directory to safe.directory on git - Stack Overflow

Go言語での日付型

任意の日付

import "time"

...

time.Date(2021, 10, 4, 16, 3, 0, 0, time.UTC)

日本時間

// ロケーションの設定
loc, err := time.LoadLocation("Asia/Tokyo")
if err != nil {
    // エラーが起きたら自前で9時間増やす
    loc = time.FixedZone("Asia/Tokyo", 9*60*60)
}

time.Date(2021, 10, 4, 16, 3, 0, 0, loc)

JavaScript学習に役立つサイト(入門用)

無料で学習できるサイト

基礎部分に関して言えば現状ではYouTubeに公開されている入門系の動画が一番わかりやすいと思います。

Youtube

javascriptの基礎となる文法をとても分かりやすく解説されています。

サンプルコードの実装を行っていますので、とても理解しやすいです。
動画内ではbootstrapの導入についても触れていますので、簡単なデザインの適用についても学べます。

こちらもサンプルコードの実装を行いながらなので分かりやすいです。
コードのテキスト内容が面白いので楽しみながら進められます。

Progate

prog-8.com

JavaScript I はすべて無料 JavaScript II以降は最初のいくつかが無料

ドットインストール

はじめてのJavaScript (全8回)

詳解JavaScript 基礎文法編 (全26回)

詳解JavaScript オブジェクト編 (全35回)

詳解JavaScript DOM編 (全21回)

CloudSQLへMySQLのデータをインポート(DBeaver)

はじめに

MySQLのDumpデータをGCSに置いてCloud SQLにインポートします。

DBeaverがあればGUIベースで完結できます。

事前準備

  • DBeaverでMySQLに接続できるようにしておく
  • CloudSQL(MySQL)のインスタンスを作っておく(テーブルは作らなくてOK)
  • dumpを置くためのGCSバケットを作成

Dump取得

DBeaverからdumpを取得します。

GUIベースで説明してますが、コマンドでもイケると思う。

# 全テーブル
mysqldump --single-transaction --routines --add-drop-table --extended-insert -u <ユーザ名> --host=<ホスト> --port=3306 <DB名>

# テーブル指定 スペース区切りでテーブルを指定する
mysqldump --single-transaction --add-drop-table --extended-insert -u <ユーザ名> --host=<ホスト> --port=3306 <DB名> <テーブル名> [<テーブル名> ...]

Dump databaseを選択

データベースを開いて、テーブルの一覧からどれでも良いのでテーブルを選択して右クリック

ツール ー> Dump databaseをクリック

テーブルを選択

必要に応じてテーブルにチェックして次へ

全部インポートしたい場合はAllで選択

出力の指定

Execution Method:Online backup in single transaction を選択

 ※デフォルトのNomal(no lock)だと権限の問題かエラーとなる。

Settings:Disable keysのチェックを外す

 ※チェックがついているとPrimary Keyなどの情報がdumpから落ちてしまう。

開始

しばし待つ

バケットにアップロード

Cloud SQLへインポート

  1. インポートしたいインスタンスのページを表示
  2. ページ上部のインポートをクリック

  3. インポートしたdumpファイルを選択

  4. インポートするデータベースを選択

  5. インポートボタンクリック 開始

Chromeでmailtoが反応しないので対応してみた。

はじめに

mailto周りの修正をした際に動作確認したところChromeで反応しなかったので原因を調べ解決しました。

今まで反応していなかった方が問題ですが・・・ gmailだけなのか不明

Gmail設定

Chromeからgmailを開き、アドレスバーを確認 f:id:katutoki:20211013232249p:plain

ひし形が二つ重なったアイコンをクリックすると下記のようなポップアップが表示されるので「許可」を選択します。 f:id:katutoki:20211013232529p:plain

すでにgmailを開いている場合、下記のような表示になる場合があるので、「許可」を選択しましょう。 f:id:katutoki:20211013233810p:plain

アイコンが表示されない場合はすでに許可済みか拒否済みなので次のChrome設定を確認します。

Chrome設定

設定よりプライバシーとセキュリティをクリックし、サイトの設定を選択 f:id:katutoki:20211013233122p:plain

「権限」よりその他の権限をクリックし詳細を開き、プロトコルハンドラを選択 f:id:katutoki:20211013233243p:plain

「サイトがプロトコルの処理を要求できるようにする」が選択されていることを確認
「サイトにプロトコルの処理を許可しない」が選択されている場合は、
「サイトがプロトコルの処理を要求できるようにする」を選択した後、Gmail設定の操作を行います。 f:id:katutoki:20211013234214p:plain

プロトコルの処理を許可しないサイト」の欄にmail.google.comが存在している場合、
×ボタンをクリックし一度削除した後、Gmail設定の操作を行います。 f:id:katutoki:20211013233709p:plain

下記のように、「メール」の欄にmail.google.comが存在していればOK f:id:katutoki:20211013233311p:plain

上記でもまだメールが開かない場合、拒否設定となっている場合があるため、
再度プロトコルハンドラの設定を開き、
mail.google.comの右にある縦3つの点「・・・」をクリックし、「デフォルトとして設定」をクリックします。
これにてmailtoが反応するようになります。

ちなみにmailtoでgmailを開くと下記のような表示になります。 f:id:katutoki:20211013235135p:plain