- 1. A Tour of Goエラー:zsh: command not found: gotour
- 2. A Tour of Go: Equivalent Binary Trees の回答例
- 3. ポインタでつまづいたあなたに向けたアドレス空間の世界【Go言語】
- 4. [Go] Echo+NginxのDockerCompose環境
- 5. Go言語のジェネリクスについて
- 6. Goインストール(goenv)
- 7. golang 標準パッケージ archive の紹介
- 8. フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20
- 9. 【1年後の1年前は今日ではない!】Go でうるう年に落ちるテストがあった話
- 10. asdfでWSL+UbuntuにGoをインストール
- 11. フロントNextjsで入力した文字をGinで受け取りRedisに登録
- 12. Datadog APMで測定するアプリケーションパフォーマンス
- 13. Gin Web Frameworkでのnpmライブラリを使った静的ファイルの取り扱いに関するメモ
- 14. Goのentでスキーマに変更があったときにGithub Actionsで自動的にマイグレーションファイルを作成するWorkflow
- 15. [翻訳転載] Golang Tip #14: エラーメッセージを大文字で始めたり区切り記号で終えたりしない
- 16. [翻訳転載] Golang Tip #13: 空スライスとnilスライス
- 17. Github ActionsでもPrivate Repoをgo getしたい
- 18. [翻訳転載] Golang Tip #12: 鍵作成時はmath/randの使用を避ける
- 19. [翻訳転載] Golang Tip #9: コンパイル時のインターフェイス検証
- 20. Go 言語スプレッドシートライブラリ:Excelize 2.8.1 がリリースされました
A Tour of Goエラー:zsh: command not found: gotour
# 概要
A Tour of Goをスタンドアロンで動かそうとした時に出たエラーの解消方法について記載しています。
(所要時間1分)
![スクリーンショット 2024-03-02 16.27.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/8e357352-ce46-dd56-0c68-a91f018a6907.png)## 今回起きたエラー
記事に書いてある通りに下のコマンドを実行した時にエラーが出ました
“`
go tool tour
“`エラー:
![スクリーンショット 2024-03-02 16.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/d915dd23-8014-ac05-b1ed-365325ea70ff.png)## 解決方法
下のコマンドを実行
“`
# install
go install golang.org/x/website/tou
A Tour of Go: Equivalent Binary Trees の回答例
# はじめに
Go を学習し始めの時はあまり納得のいく回答ができなかったが、少し Go にも慣れてきて再度挑戦してある程度納得のいく回答ができたので書き留めます。
※ 実装には基本的な型のみを利用し、`context`といったものの利用は避けています# 問題の意図
問題文から読み取れる意図をまとめます。
問題文(もしくは Tree のドキュメント)には> 関数 tree.New(k) は、値( k, 2k, 3k, …, 10k )をもつ、ランダムに構造化 (しかし常にソートされています) した二分木を生成します。
と書かれているので生成される**必ず10個のノードを持つ二分探索木**となります。
実際、`tree` パッケージの `tree.New()` の実装を確認すると確かに10個の値を持つ二分探索木を作成していることがわかります。つまり、この問題では
– 生成される二分木は二分探索木である
– その二分探索木は必ず10個のノードを持つということを前提として処理を実装してみてくださいという意図があるのかなと思います。
“`go
func New(k i
ポインタでつまづいたあなたに向けたアドレス空間の世界【Go言語】
# メモリ空間なんて意識してこなかった
私はこれまでPython、JavaScript/TypeScript、PHPといった言語を中心にコーディングしてきました。しかし、仕事の都合上、Go言語の学習が必要になり、少しずつ学び始めてから2週間が経ちました。
その過程で、ポインタの概念に何度も躓いています。私のように他の言語からGoに移行し、ポインタに頭を悩ませる人は少なくないようです。実際、QiitaなどのプラットフォームではGoのポインタに関する記事がたくさん投稿されています。
ポインタに関する説明を読むと、最初は理解できた気になるものの、すぐにそのイメージが掴めなくなってしまいます。これまで高級言語のぬるま湯にどっぷり浸かっていたため、メモリに関連する話題が出ると、認知の負担が爆増し、一度理解したこともすぐに忘れてしまうのです。
そんなわけで、ポインタに限らず、メモリ空間内で何が起こっているのかをしっかりとイメージしながらGoを学んでみたところ、徐々に霧が晴れてきました。付随的にポインタ以外の多くの疑問も解決できたため、その過程の一部を備忘録としてここに記録しておきます。
[Go] Echo+NginxのDockerCompose環境
# はじめに
Go言語フレームワーク[Echo](https://echo.labstack.com/)のローカル開発環境の簡易テンプレートを作成しました。(目的は、今後触る必要が出たときに速やかに開始するためです。)
https://echo.labstack.com/
[Gin](https://gin-gonic.com/ja/)か[Echo](https://echo.labstack.com/)かで悩みましたが、ドキュメントが整理されている雰囲気があったためEchoを選択しました。
[Go言語の本家ではGinが紹介されていますが、それはさておき…。](https://go.dev/doc/tutorial/web-service-gin)違う言語ですが、PHPの[LaravelのAPIリファレンス](https://laravel.com/api/10.x/index.html)は、リファレンスから該当するフレームワーク内ソースコードまで追いやすいため、かなり親切かと思います。自分の実装の問題か、フレームワークの問題かの切り分けを行う際は、フレームワ
Go言語のジェネリクスについて
### はじめに
Go言語のジェネリクスは、Go 1.18から導入され、異なるデータ型に対応可能な汎用的な関数や型を作成することができます。他の言語におけるジェネリクスと同様、Goのジェネリクスもまた、型パラメータを用いて抽象化されたコードを書くことができます。たとえば、C#やJavaでは長年ジェネリクスが利用されており、コレクションライブラリなどでその力を発揮していますし、TypeScriptのような言語では、ジェネリクスを使ってより柔軟かつ型安全なコードを書くことができます。
少しサンプルコードを参考として使い方を紹介しようかと思います。### 考え方
ジェネリクスがよくわからん。という人のために少し説明すると、「型に柔軟性を持たせる仕組み」です。プログラミングするとき、色んなデータ型がありますよね。整数や文字列、あるいはもっと複雑なカスタム型まで。でも、多くの場合、異なる型であっても「同じような処理」をしたい時があります。そこで登場するのがジェネリクスです。簡単に言うと、ジェネリクスを使うと「この関数は、どんな型にも対応するよ」と宣言できるんです。例えば、配列の要素を逆順にす
Goインストール(goenv)
## 前提
anyenvがインストールされていること
## goenvをインストールする
“`zsh
anyenv install goenv
“`“`
exec $SHELL -l
“`## goenvを使ってGoをインストールする
ここでは最新バージョンのGoをインストールする
“`zsh
go_version=$(goenv install –list | egrep -v ‘rc|beta’ | perl -pe ‘s/^ +([0-9]+\.[0-9]+\.[0-9]+)$/$1/’ | tail -n 1)
“`“`zsh
goenv install ${go_version}
“`“`zsh
goenv global ${go_version}
“`“`zsh
goenv rehash
“`“`zsh
go version
“`“`:出力
go version go1.22.0 darwin/arm64
“`
golang 標準パッケージ archive の紹介
# 前提知識
—
# アーカイブと圧縮の違い
アーカイブと圧縮はどちらもファイルやディレクトリを一つにまとめる手法ですが、それぞれ目的が異なります。—
## アーカイブ
アーカイブは複数のファイルやディレクトリをまとめるために使用されます。
ただし、圧縮は行いません。—
### Q. 圧縮せず、まとめるだけなんて使い道あるの?
—
### A. CUIで作業を行う場合は意外とあります。
例えば、`find` で再帰的にファイルを探索する場合、利用しなくなったディレクトリをアーカイブしておくと、探索対象が少なくなり、効率的に探索ができるようになります。
他には、ディレクトリの移動や転送を行う際、配下の構造が複雑だと、扱いが複雑になります。
ここでディレクトリをアーカイブすると、一つのファイルのように扱うことができ、移動や転送が簡単にできるようになります。—
## 圧縮
圧縮はファイルを圧縮しサイズを小さくすることが目的です。
よく使われる形式として、zip, gzip, rar などがあります。圧縮形式にはアーカイブ機能を含むものと、
フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20
# フォアグラウンドジョブ/バックグラウンドジョブの実現方法 – シェルもどきをgoで自作する#20
## おさらい
– [シェルってなに?コマンドラインインタプリタってなに? – シェルもどきをgoで自作する#1](https://hackmd.io/@jyami/HJzohRn2D)
– [コマンドと引数の分解、環境変数PATHから探索、外部コマンドと内部コマンド – シェルもどきをgoで自作する #2](https://hackmd.io/@jyami/HyeSkkThP)
– [字句解析その1 – シェルもどきをgoで自作する #3](https://hackmd.io/@jyami/Hk3bWSMQO)
– [字句解析その2 – シェルもどきをgoで自作する #4](https://hackmd.io/@jyami/S1BkltxQu)
– [リダイレクションってなに? – シェルもどきをgoで自作する #5](https://hackmd.io/@jyami/S113NQx8u)
– [リダイレクションの種類 – シェルもどきをgoで自作する #6](https://h
【1年後の1年前は今日ではない!】Go でうるう年に落ちるテストがあった話
# 概要
本日は2024はうるう年で2月29日が追加され、1年が366日ある年です。
そんな2024/02/29に落ちるテストがあっておもしろかったので共有です# テスト概要
ユーザーの会員期限の再アクティベートのテスト。一度会員になって失効して再度会員になったときに正常に有効化できるか、というような旨のてすとです。
1. 失効期限を今日から1年後にする
1. 失効期限を1年前に戻す
1. 期限が切れていることを期待する
1. 再度アクティベートするという流れの3でうるう年の今日だけ有効期限が切れなくなっていました。
# 原因
Golang でうるう年2/29の1年後を取得すると、翌年の2025年は2/29 がないので3/1 に繰り上げされ、1年後の1年前が今日じゃなくて翌日になっていたため!
例:
**1/ 失効期限を今日から1年後にする**
→ 2025年に2/29 はないので3/1**2/ 失効期限を1年前に戻す**
→ 2025年3/1 だったので2024 3/1 になる**3/ 期限が切れていることを期待する**
Now() = 2029 2
asdfでWSL+UbuntuにGoをインストール
# はじめに
以前インストールしたプログラミング言語管理ツールのasdfを使って、WSL UbuntuにGoをインストールします。
# 前提環境
https://qiita.com/perilla/items/69bc6f89001dbceb0cde
https://qiita.com/perilla/items/ef73cf57ade24bc94f19
# asdf更新
asdfを更新します。
“`sh:Ubuntu
asdf update
“`# Goの存在確認
“`sh:Ubuntu
asdf plugin list all | grep -e golang
# golang https://github.com/asdf-community/asdf-golang.git
“`https://github.com/asdf-community/asdf-golang.git
# asdfにGoを追加
“`sh:Ubuntu
asdf plugin add golang
“`# 依存パッケー
フロントNextjsで入力した文字をGinで受け取りRedisに登録
# やりたいこと
フロント側で入力した文字をバックエンドに送信して、データベースに登録する## 環境構築
https://qiita.com/zukka/items/5a6831bef702d8c910e0
https://qiita.com/zukka/items/f019b7a384feaf03c65a
## フロントエンド
フォルダ・ファイル作成
個別用にlayoutファイルとCSSモジュールを作成“`
react/src/
┣ app
┃ ┗ input-text
┃ ┣ page.tsx
┃ ┣ layout.tsx
┃
┗ components
┗ ui-elements
┗ input-test.module.css“`
### page.tsx
ページ表示部分“`react
“use client”;import axios from “axios”;
import { useState } from “react”;// CSS Modulesの読み込み
import styles fr
Datadog APMで測定するアプリケーションパフォーマンス
# 運用で困っていること
– インフラで発生するインシデント(メールが送られない、画面表示が遅いなど)が発生しても、即座の原因特定が難しい
– イベント(画面表示やデータ登録)ごとの発生頻度や利用時間帯がつかめない
– 時系列的に記録されたログでは、複数同時に来るリクエスト処理がごちゃごちゃに記録され、特定の関心のあるリクエストだけを追うのが難しい
– 処理が複数のサービスに分散されていると、関心のある処理を追いづらい# Datadog APMとは
– Datadog社が提供する、アプリケーションのパフォーマンスをリアルタイムで監視し、分析するためのツール(SaaS)
– ユーザーのリクエストがシステムを通過するパスを追跡し、各モジュールでの処理時間を把握できる
– アプリケーションのパフォーマンスを監視し、異常が発生した場合に検知
– 詳細なレポーティング
– 分散システムのサポート# 実際に組み込んでみた
ソースコードでライブラリを組み込む必要がある(Goの場合)
“`go
// アプリケーション開始時
tracer.Start(tracer.WithServic
Gin Web Frameworkでのnpmライブラリを使った静的ファイルの取り扱いに関するメモ
[Golang フレームワークでStaticファイルをemmbeddingして](https://gin-gonic.com/docs/examples/serving-static-files/)をnpmライブラリを使いたい。例えば[http-status-code](https://www.npmjs.com/package/http-status-codes)など。
ハマったのでメモします。
## 解決策
具体的には、サーバーサイドで
“`go:main.go
r.StaticFS(“/node_modules”, http.Dir(“static/node_modules”))
“`クライアントサイドで
“`typescript:main.ts
import { StatusCodes } from “../node_modules/http-status-codes/build/es/status-codes.js”
“`ライブラリはあらかじめ`npm`使ってインストールしておく必要がある。
“`sh
$ npm install -D http-
Goのentでスキーマに変更があったときにGithub Actionsで自動的にマイグレーションファイルを作成するWorkflow
諸処の事情で不要になった代物ですが、自分の備忘録代わりに残しておきます。
## モチベーション
チーム開発でGo言語のORMツールであるEntを使っていると、わりと他人のマイグレーションを取り込み忘れて開発しちゃったテヘ!という事態に遭遇することがあります。
それをなるべく自動で回避するために、自分のPRがマージされたときに、Github Actionsを使って勝手に開発のベースブランチ(今回はdevelop)にマイグレーションファイルを作成・commit・pushしてしまおうというワークフローです。## 前提条件
* Entのマイグレーションにはdbmateを使用
確かRuby on RailsのActiveRecordのmigrationぽく使える(マイグレーションとロールバック用のSQLどっちも生成される)という理由で採用したような記憶があります。TypeScriptのPrismaのマイグレーションファイルに移植しやすいからという理由もあったような気がします。* 2022年くらいの実装
ちょっと情報が古いかもなので、適宜アップデートするともっと良いソリューションがある
[翻訳転載] Golang Tip #14: エラーメッセージを大文字で始めたり区切り記号で終えたりしない
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1755232851401076925?s=20
# エラーメッセージを大文字で始めたり区切り記号で終えたりしない
これは、最初は少し変に見えるかもしれないですが、実用的な理由があります。
**なぜ小文字で始めるのでしょうか?**
エラーメッセージは他のメッセージと組み合わされることがあります。
もしエラー文字列が大文字で始まっていると、それが文の途中に挟まれたときに不自然に見えたり、場違いに見えたりします。
![image](https://pbs.twimg.com/media/GFvVNPvbYAAX3-r?format=jpg&name=medium)
エラーメッセージを小文字で始めると、組み合わされたメッセージに、そのメッセージをより自然になじませることができます。
“` console
// application startup failed
[翻訳転載] Golang Tip #13: 空スライスとnilスライス
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1754852685369524574?s=20
# 空スライスとnilスライス
値を持たないスライスを使用するには2つの方法があります。
– **`var`の使用: `var t []int`**
この方法は`int`型のスライス`t`を初期化せずに宣言します。
このスライスはnilとみなされます。これは、実際には基底となる配列が存在しないことを意味します。
スライスの長さ (`len`) と容量 (`cap`) はどちらも`0`です。**- リテラルの使用: `t := []int{}`**
`var`の使用とは異なり、このスライスは`nil`ではありません。
これは要素を持たない配列を基底するスライスです。**さて、慣例とみなされるのはどちらでしょうか。**
1 . **nilスライスはメモリを割り当てません**
空スライスが基底となる配列に
Github ActionsでもPrivate Repoをgo getしたい
# 目的
CIを回している時に、プライベートリポジトリの`go get`に失敗したので、それを解決します。
普段ローカルでプライベートリポジトリをインポートする際、`GOPRIVATE`環境変数を利用しているかと思いますが、同様のことをCI環境(Github Actions)で行うといった内容です。# 準備
Githubの自動トークン認証を使います。
Personal Access Token(PAT)はセキュリティ的な観点から利用しません。
自動トークン認証は`${{ secrets.GITHUB_TOKEN }}`で一時的なトークンを発行できます。権限はPATより弱いですが、`go get`するには十分です。https://docs.github.com/ja/actions/security-guides/automatic-token-authentication
# 解決方法
このように指定すると解決されます。
“`
run: |
git config –global url.”https://github-actions:${{ secrets.GIT
[翻訳転載] Golang Tip #12: 鍵作成時はmath/randの使用を避ける
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1754477930531680532?s=20
# 鍵作成時は`math/rand`の使用を避ける
暗号化や一意な識別子の作成など、鍵の生成が必要なプロジェクトでは、鍵の品質とセキュリティは重要になります。
なぜ`math/rand`を避けるべきなのでしょうか。
`math/rand`パッケージは擬似的に乱数を生成します。
つまり、乱数の生成方法(と生成時に使用されるシード)を知っていれば、生成される乱数は予測されてしまいます。
![image](https://pbs.twimg.com/media/GFkoBkAakAAJ3wS?format=jpg&name=medium)
現在時刻をシードとして使用したとしても、実行ごとに現在時刻が大きく変動することはないため、予測不可能性(`unpredictability (entropy)`)は低いままです。
[翻訳転載] Golang Tip #9: コンパイル時のインターフェイス検証
# はじめに
https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2
本記事は以下のツイートの翻訳転載です。
https://x.com/func25/status/1729871737343643902?s=20
# コンパイル時のインターフェイス検証
`Write()`関数を持つ`Buffer`インターフェースと、
それを実装した`StringBuffer`構造体を想像してほしい。以下のように、誤って`Write()`ではなく`Writeee()`のようにタイプミスをした関数を実装してしまった場合、
![image](https://pbs.twimg.com/media/GAG85AFaIAAvqvt?format=jpg&name=medium)
The error isn’t caught until runtime. By using the trick below, the compiler will alert you with an IDE error message:
エラーは実行時まで発見されません。
Go 言語スプレッドシートライブラリ:Excelize 2.8.1 がリリースされました
Excelize は、純粋な Go で記述されたライブラリで、XLAM / XLSM / XLSX / XLTM / XLTX ファイルの読み書きを可能にする一連の関数を提供します。Microsoft Excel™ 2007 以降で生成されたスプレッドシートドキュメントの読み取りと書き込みをサポートします。高い互換性により複雑なコンポーネントをサポートし、大量のデータを含むワークシートからデータを生成または読み取るためのストリーミング API を提供します。このライブラリには Go バージョン 1.18 以降が必要です。
場合によっては、既存の Excel ドキュメントコン