- 1. 写経から初の練習問題へ
- 2. [Go] VSCodeでジャンプできなかった時にやったことのメモ
- 3. Golangの環境構築って、いつの間にか変更されていたんですね
- 4. gRPCを使用した例
- 5. 【GO】ある構造体のポイント型に定義されたメソッドは、nilポインタからでも実行できる話
- 6. S3・SQS・Lambdaで自動マスタリングアプリを作る
- 7. Go の net/http(とecho) で HTTP リクエストを見てみる
- 8. HackTheBox Gobox WriteUp
- 9. Goで重複削除したスライスを作成する
- 10. Go + Amazon Bedrock Claude 3 使ってみる
- 11. 【Go言語】指定したパスがファイルなのかディレクトリなのかを判別する関数
- 12. 【Go, AWS】低予算APIサーバー構築を最初から最後まで【Golang, Lambda, DynamoDB, API Gateway, Cognito】
- 13. ログファイルが邪魔でテストが実行できない
- 14. A Tour of GoでExercise: rot13Readerをやってみた
- 15. dial error直った方法 – migrateできない
- 16. Go言語の圧縮ライブラリ比較
- 17. PulumiでAPI Gateway + Lambda(Go)をデプロイしてみた
- 18. mockが期待した値を返さない
- 19. Goでenumを使用する
- 20. Go言語におけるAtoiとItoa
写経から初の練習問題へ
Golangの勉強を始めるにあたって、昨年友人から頂いた書籍を使っていきます。
https://amzn.asia/d/4NaB7sH
「入門Goプログラミング」という書籍です。
火星探査機を構築しながら学べるので、夢がありますね(・ω・`)基本的には、写経をしていきます。
そして、練習問題を解いていきます。—
昨日解いた問題は、下記の通りです。
>「マラカンドラ(火星の別名)」に28日で到着するには、どれだけの速度(km/時)で宇宙船を飛ばせば良いのかを調べるプログラムを書きましょう。距離は、56,000,000km と仮定します。
私の解答は、こちら。
“`
package mainimport (
“fmt”
)func main() {
const distance = 56000000
var speed = distance / 28
fmt.Println(speed)
}
“`模範解答は、こちら。
“`
package mainimport “fmt”
func main() {
const hoursPerDay
[Go] VSCodeでジャンプできなかった時にやったことのメモ
# はじめに
時々、「別のリポジトリであれば定義元や利用先にコードジャンプできるのに、このリポジトリだとなぜかできない。」みたいなことがありました。
Goの拡張やインストール済みだし、最新だし、なぜ?という感じでした。# 対処したこと
VSCodeが使用するGoバージョンを変えました。なぜか問題のあるリポジトリでは、スクショのようにtoolchainのものになっていたため、対象バージョンを選択してダウンロードして、それを使うようにしたら、ジャンプできるようになりました!
![スクリーンショット_2024-03-19_9_56_21(2)_png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221948/a68983f5-ee2d-72c6-5828-f826fda37b29.png)
Golangの環境構築って、いつの間にか変更されていたんですね
はじめまして。
さっとんと申します(・ω・`)
Golangは、2019年~2020年にかけて、ほんの少し齧ったことがある程度のレベルです。
なので、**初心者よりたちが悪い**です。—
当時と比較しながら、記事を執筆していこうと思います。
当時のGolangの環境構築は、
“`
1. 公式サイトからインストーラをダウンロード
2. インストーラを実行
3. システムの詳細設定から、環境変数を追加
4. VScodeをインストール
5. インストーラを実行
6. Golangの拡張機能を追加
“`
をしていました。—
先日、久々にGolangを勉強しようと思い環境構築をしました。
手順は、**ほぼ**上記の通りでした。
ほぼと記載したのは、3.の工程が不要で、自動で追加されていたからでした。試しにHello Worldを表示させようとデバッグしたら、VScodeでエラーが表示されました。
見たことのないエラーって、焦りますよね(;´・ω・)—
自力で解決することはできず、Google先生に尋ねました。
すると、まず下記のサイトを教えてくれました。
gRPCを使用した例
## はじめに
gRPCをGo言語で使用する基本的な例を提供します。
例では、簡単なgRPCサービスを定義し、そのサービスを実装したサーバーとクライアントを作成します。## 一般的な流れ
### Step 1: Protocol Buffers (protobuf) の定義まず、`.proto` ファイルを作成して、gRPCサービスとメッセージ形式を定義します。`helloworld.proto` という名前のファイルを作成し、以下の内容を記述します。
“`proto
syntax = “proto3”;package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}// The request message containing the user’s name.
message HelloRequest {
string
【GO】ある構造体のポイント型に定義されたメソッドは、nilポインタからでも実行できる話
# 結論
“`go
type Dog struct {
Name string
}func (d *Dog) Speak() {
fmt.Printf(“Woof”)
}func main() {
var nilPoint *Dog
nilPoint.Speak()
}
“`
上記のコード動くと思いますか?
.
.
.
タイトルがネタバレになってる感すごいですが、動きます。
ちゃんと`Woof`が出力されます。
ポインタレシーバに対するメソッド呼び出しは、nilポインタに対してでも正常に行えます。
あまり業務で使う機会はないと思いますが、初めて知った時結構びっくりしたので備忘録として残しておきます。
# 余談
当然ですが、構造体のプロパティを参照している場合panicが発生します。
“`go
type Dog struct {
Name string
}func (d *Dog) Speak() {
fmt.Printf(“Woof, I am %s\n”, d.Name)
}func main() {
var nilPoint *Dog
nilP
S3・SQS・Lambdaで自動マスタリングアプリを作る
# 概要
今回は、AWSのSQS・Lambdaを練習も兼ねて触ってみようということで自動マスタリングアプリを開発しました。
ちなみにマスタリングとは、音楽制作の最終工程であり、最終的に配信やCDプレスするために音質を整える作業のことです。※ファイルをS3にアップロード・ダウンロードするUI等は実装しません。
# 音圧爆上げくんとは
AIを使用したマスタリングを、オンラインで自動的に行なってくれるサービスです。
以前は有料機能もあったようですが、2024年3月17日現在は無料で使えます。APIが提供されており、今回使用させていただきました。
https://bakuage.com/
https://qiita.com/bakuage/items/5e383be930477ca6f148
実装には、こちらのチュートリアルが役立ちます。
https://github.com/ai-mastering/tutorial-go
# 成果物
今回開発したアプリの使い方の説明です。
### 1. 音声ファイルをS3バケットに配置する
Go の net/http(とecho) で HTTP リクエストを見てみる
## Go で HTTP リクエストを見てみよう!
Go で HTTP リクエストを見てみる。
HTTP リクエストとは、**クライアント => サーバ** に送られるもので、クライアントの情報が書いてある。サーバはこれを頼りに情報を送り返す。例
“`HTTPResponse
GET /req-header HTTP/1.1 # メソッド URI HTTPバージョン
Accept-Encoding: gzip, deflate, br # ヘッダ
Accept-Language: ja
Host: localhost:8080
# 空行
# あればボディ
“`まずは復習。シンプルに `hello!` と返すサーバを立ててみる。
“`go
func main(){
http.HandleFunc(“/simple”, simple)
http.ListenAndServe(“:8080”, nil)
HackTheBox Gobox WriteUp
今回はHackTheBoxのMediumマシン「Gobox」のWriteUpです!
名前からして、Go言語が使用されていそうですが、どのようなマシンなのでしょうか!※ 2024/03/14 に行われました Security Days のオープンセッションにて攻略したマシンとなります!セッションへの参加ありがとうございました!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/fd3a62db-cc0d-c230-4d5a-939a633dc4af.png)
グラフはよくあるMediumの感じですね。
評価はなんと★5!これは期待できます!攻略目指して頑張ります~!HackTheBoxってなに?という方はこちらの記事を見てみてください。一緒にハッキングしましょう!
https://qiita.com/WhizOwl/items/165783694cb4791cff34
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合
Goで重複削除したスライスを作成する
Go の slice で、重複をする項目を除外したい時があり、その実装をしたので方法を書き留めます。
# int 型のスライスで重複している値を削除する
map を用いて重複の削除を行います。
map の key に slice の値を設定し、value に bool を設定します。
同じ key の場合は上書きで値が更新されるため、一度 true を設定することで、それ以後重複を除いた新たな slice に追加しなければ、重複除外が可能です。“`golang
package mainimport “fmt”
func deleteDuplicate(slice []int64) []int64 {
uniqueCheck := make(map[int64]bool)
newSlice := []int64{}for _, i := range slice {
// 重複している場合uniqueCheck[i]の値はtrueのためスキップされる
if !uniqueCheck[i] {
uniqueCheck[i] = true
//
Go + Amazon Bedrock Claude 3 使ってみる
Claude3がどうもGPTより良いと評判になっているので気になって使ってみる事にしました。Goで書いてみたので備忘録も兼ねて残します!
https://aws.amazon.com/jp/about-aws/whats-new/2024/03/anthropics-claude-3-sonnet-model-amazon-bedrock/
## やってみる
Bedrock + Claude3-sonnetが使用可能であり、必要なアクセス権も付与済みである事を前提とします。まず、`.env`を準備します。私の場合は`us-east-1`に`Claude3-sonnet`を準備しました。
“`.env
AWS_ACCESS_KEY_ID=<アクセスキーID>
AWS_SECRET_ACCESS_KEY=<シークレットキー>
AWS_DEFAULT_REGION=us-east-1
“`### 通常のメッセージ
以下は通常のメッセージAPIです。
[GoのSDKの情報](https://docs.aws.amazon.com/ja_jp/code-library/lat
【Go言語】指定したパスがファイルなのかディレクトリなのかを判別する関数
### ファイルの存在確認
“`go
func IsFile(path string) bool {
info, err := os.Stat(path)
if err != nil {
return false
}
return !info.IsDir()
}
“`1. `os.Stat(path)`を使って、指定したパスの情報を取得
2. エラーが発生した場合(`err != nil`)、指定したパスにファイルまたはディレクトリが存在しないため、`false`を返却
3. `!info.IsDir()`が`true`の場合、指定したパスはファイルであるため、`true`を返却### ディレクトリの存在確認
“`go
func IsDir(path string) bool {
info, err := os.Stat(path)
if err != nil {
return false
}
return info.IsDir()
}
“`1. `os.Stat(
【Go, AWS】低予算APIサーバー構築を最初から最後まで【Golang, Lambda, DynamoDB, API Gateway, Cognito】
:::note
* `Go` -> `Python`差し替え編
* クライアント(`Vue.js`)編執筆中です。
::::::note warn
価格・安全性など重要事項は随時ご自分で調べ、自己責任で作業をしてください。
筆者はいかなる損害について責任を負いかねます。
:::## はじめに
低予算(規模が十分小さければ無料)で[REST APIサーバー](https://qiita.com/masato44gm/items/dffb8281536ad321fb08)を作りましょう。DBあるよ!
## 概要
まず、低予算で推奨されるのが [**サーバーレス**](https://business.ntt-east.co.jp/content/cloudsolution/column-414.html) です。
厳密性を無視して簡単に言うと、 **常時待機するのではなく、必要な時だけ動作するサーバー** というイメージです。低予算でいける理由がこれでわかりますね。思ったよりやること、というよりかは扱わないといけない機能が多いです。
![AWS_Rest.drawi
ログファイルが邪魔でテストが実行できない
## 状況
– ファイルをログ出力に行う
– テストコードを書いている## 問題
– VSCodeでユニットテストを行うとき、File Not Found エラーによりテストが実行できない## 原因
– テスト時、作業ディレクトリがテストファイルの存在するディレクトリに移動してしまう
– このため、相対パスで記述したログファイルがNot Foundになってしまう## 解決策
– テスト実行時はログファイルを使わないようにしよう## 具体的に
– go runをする際、環境変数に起動モードのフラグを記述する
– さらに、本番モードで起動されたときはログファイルを起動しないようにする## コード
– Bash
“`makefile
run:
MODE=”prod” go run $(CMD)test:
MODE=”test” go run $(CMD)
“`– ログファイルを扱うコード
“`go
if os.Getenv(“MODE”) == “prod”
A Tour of GoでExercise: rot13Readerをやってみた
Goの学習でA Tour of Goをさらっています。
Methods and interfacesの章で[Exercise: rot13Reader](https://go-tour-jp.appspot.com/methods/23)をやったのでメモです。# 解答
https://go.dev/play/p/-rVIDII1EaL# やったこと
やったことは下記です1. 状況把握
1. Readメソッドの返り値とReadメソッド中で変換するための文字列を取得する
1. Readメソッド内でROT13の処理をする## 1. 状況把握
“Lbh penpxrq gur pbqr!”をROT13という変換方法を利用して文字列変換したものを出力する。
初期状態として下記が与えられている。このまま実行するとrot13Readerにio.Reader(Readメソッド)がないと言われます。“`
package mainimport (
“io”
“os”
“strings”
)type rot13Reader struct {
r io.Reader
}
dial error直った方法 – migrateできない
## 想定読者
– GO言語でMigrateしようとしたらdialエラーが出た人
– udemyでto do アプリ作ってる人## 結論
dockerを起動するの忘れていた
![スクリーンショット 2024-03-12 175805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551481/326245e2-f95e-a274-5d97-830447bacfbd.png)
## 試したこと
* ENVファイルの変数名チェック
* `db, err := gorm.Open(postgres.Open(url), &gorm.Config{})`を睨んだ## 教訓
~~あるある言いたい~~
作業を中断して時間おくとdockerの存在忘れがち
Go言語の圧縮ライブラリ比較
Go言語における圧縮ライブラリの性能を比較検討したので、その結果を共有します。
この評価は2024年2月頃に実施しています。
## 背景
Apache Cassandraのデータ圧縮アルゴリズムをGo言語で実装する際にのライブラリ選定のためのものです。
そのため、Apache Cassandraのサポートする圧縮アルゴリズムを中心に検証しています。また、Apache Cassandraではスループットが最も高いLZ4がデフォルトの圧縮フォーマットとして採用されています。
Go言語でもLZ4はデフォルトで適用して問題ないような負荷なのかを評価するのが目的なので、主に圧縮率よりもスループットに注目しています。また、データサイズもDBMSが取り扱うようなもの、具体的には数KiB〜100KiB程度を想定しています。
# 結論
## フォーマットが選べる場合のライブラリ選定
圧縮フォーマットを選べる場合、cgoを使ったライブラリが使えるかどうかによって2パターンに分けておすすめを紹介します。
### cgoを使っても問題ない
* バランス型
* github.co
PulumiでAPI Gateway + Lambda(Go)をデプロイしてみた
# はじめに
以前から気になっていたIaCツールであるPulumiでAPI Gateway + Lambda(Go)のサーバレスなAPIを作成してみたので記事にしたいと思います。### Pulumiとは
TerraformやCloudFormationなどと同じくIaCツールとなっていて、YAMLだけでなくGoやPython、TypeScriptなどで記述できることやAWS、Google Cloud、Azureなど様々なクラウドサービスに対応してることも特徴です。
さらにPulumiには**Pulumi AI**というChat GPTのように自然言語でチャットするだけでIaCのコードを生成してくれる機能があります。### そもそもIaCとは
IaC(Infrastructure as Code)はインフラ(サーバー、ネットワーク、ストレージ)をコードで定義して管理する手法のことです。手動での管理と違ってコードで記述するので、手作業でのミスがなくなることやGitなどを用いることで管理の効率化が可能になっています。# 開発環境
M1 MacBookで開発しています。# 手順
mockが期待した値を返さない
## 問題
– mockが期待した値を返してくれない## 回答
– mockオブジェクトを使いまわしてないですか?
– mockに異なる振る舞いをさせたいときは、新たなmockオブジェクトを用意する必要があります
– 逆に、新たに用意しないと、前回の`on`メソッドの指示が更新されず、残ってしまいます## 例
“`GO
// Test 1
uc := usecase.NewMockUseCase()
uc.On(“FetchData”, mock.Anything, 1).
Return(&model.Data{}, nil)
h = NewHandler(uc, nil)
uc.On(“FetchCollectionsList”, mock.Anything, 1).
Return(&model.Collections{}, nil)_, err := h.HandleCollectionList()(writer, request)
assert.Equal(t, nil, err)// Test 2
uc = useca
Goでenumを使用する
Go で機能を作成しているときに、enum のような形で文字列を扱いたい場面がでてきました。
しかし、Go には厳密な意味での enum 型が存在しないため、その類似した機能を実現する方法を書き留めます。# 方法 1: iota を用いた定数ブロックの作成をする
iota は定数宣言(const)で利用できる識別子で、型なしの整数の連番を生成します。
以下では、iota を用いて連番を生成し、それに対して String()メソッドを定義します。“`
package mainimport “fmt”
type YearNumberEnum int
// iotaを用いて連番を生成する
const (
Showa YearNumberEnum = iota
Heisei
Reiwa
)// iotaを用いて生成した連番に対して、別名を与えて定義する
func (yn YearNumberEnum) String() string {
switch yn {
case Showa:
return “昭和”
case Heisei:
return “
Go言語におけるAtoiとItoa
# AtoiやItoaに使われるAはASCIIのこと
AtoiとItoaは文字列と整数間の変換を行う際の関数です。
Atoiは「ASCII to Integer」の略になります。ASCII(アスキー)以外の文字列にも対応しています。
strconvのパッケージに属しています。# Atoi (ASCII to Integer):文字列→整数
このコードでは、文字列 “123” を整数 123 に変換しています。変換に失敗した場合、エラーが返されます。
“`golang
package mainimport (
“fmt”
“strconv”
)func main() {
str := “123”
num, err := strconv.Atoi(str)
fmt.Println(“変換結果:”, num)
}
“`# Itoa (Integer to ASCII):整数→文字列
“`golang
package mainimport (
“fmt”
“strconv”
)func main() {