- 1. Go案件を狙うなら他に何を学べばいいの?
- 2. 値レシーバとポインタレシーバ
- 3. Dapr の Actor 機能を試してみる
- 4. [Go言語] Apple Store Server API を使ってServer Notifications API のテストを要求してみる
- 5. Goで作った自作のコマンドラインをGitHub Actionsで使用する
- 6. [書籍レビュー] 実用Go言語
- 7. XML,JSON,YAML のGo言語による操作について調べた結果
- 8. windowsのdocker上にgo言語の環境を作りたい(dockerチュートリアルまで)
- 9. コードは最上級のドキュメントになり得るか
- 10. jackc/pgxでクエリー実行時にconn busyと出る場合
- 11. jackc/pgxで始めるgo+Postgres
- 12. Dapr を Lima で実行してみる
- 13. 【Golang】Sentry (APMツール) の導入
- 14. Go言語のミドルウェア例
- 15. Go言語 ファイル操作 まとめ
- 16. Goを始めたときの自分のためのメモ
- 17. GCP AutoMLで解くリンゴとトマトの画像分類
- 18. gRPCに関して簡単にまとめてみた
- 19. Golangのgoto文に関して
- 20. DDDとは?GOとは?って状態からAPIをつくってみた
Go案件を狙うなら他に何を学べばいいの?
# フリーランススタートでスキルをスクレイピング
[フリーランスエンジニア向けIT求人・案件サイト【フリーランススタート】](https://freelance-start.com/)
下記の絞り込み条件で検索。[スキル]をスクレイピングしカウントしてみた
– 絞り込み条件
– Go言語
– サーバーエンジニア
– 単価¥700,000-¥1000,000+
– 東京都## 結果発表
| skill | count |
| — | — |
| Go言語 | 800 |
| TypeScript | 234 |
| PHP | 186 |
| JavaScript | 151 |
| Google Cloud Platform(GCP) | 138 |
| React | 135 |
| GitHub | 132 |
| Kotlin | 131 |
| Java | 131 |
| Python | 130 |
| MySQL | 126 |
| Git | 124 |
| Docker | 124 |
| Vue.js | 115
値レシーバとポインタレシーバ
# はじめに
Golangをちょっと触れてみたので備忘録としての自分用メモ# レシーバとは
Goにはクラスは存在しない。そのためJavaで言うインスタンスメソッドも存在しない。
一方、構造体というものを定義することができ、構造体に対してメソッドを定義することができる。メソッドは以下の文法で記述される
`func (レシーバ 構造体) メソッド名(引数) 返り値`“`golang
package mainimport “fmt”
func main() {
s := Student{“nobita”, 60, 60}
fmt.Println(s.name, s.avg()) // nobita 60
}type Student struct {
name string
math float64
english float64
}func (s Student) avg() (avgRes float64) {
avgRes = (s.math + s.english) / 2
return
}
“`# 値レシーバとポインタレシ
Dapr の Actor 機能を試してみる
[Dapr](https://github.com/dapr/dapr) [^1]の Actor 機能を試してみました。
[^1]: Dapr の概要や環境構築に関しては [前回の記事](https://qiita.com/fits/items/3aab0d92e4f948c8cb3a) が参考になるかもしれません
個人的に、Dapr を使った実際のシステム開発では Actor の活用が重要そうな気がしています。
# Actor の実装方法
本来は、プログラミング言語毎に用意された Dapr SDK を使って Actor を実装する事になりそうですが、まずは仕組みを理解するために SDK 無しで実装してみました。
Actor の実装に必要な HTTP エンドポイントは [actors_api ドキュメント](https://docs.dapr.io/reference/api/actors_api) の “Dapr calling to user service code” 欄に記載されており、とりあえずはこのようになっていました。
||HTTP エンドポイント|概要|
|
[Go言語] Apple Store Server API を使ってServer Notifications API のテストを要求してみる
## 概要
本記事では、Apple Store Server API のリクエストに必要な JWT について説明し、Go言語で JWT を生成・使用する方法を紹介する。
また、実際に生成したJWTを利用して、Apple Server Notifications API のテストを要求する方法を紹介する。## JWT とは
JWT は、[JSON Web Token](https://tools.ietf.org/html/rfc7519) の略で、属性情報を JSON 形式で記述したトークンのことである。
JWT には関連する仕様として、[JWS](https://tools.ietf.org/html/rfc7515) と [JWE](https://tools.ietf.org/html/rfc7516) がある。
JWS は、JSON 形式で署名されたデータを記述する仕様であり、JWE は、JSON 形式で暗号化されたデータを記述する仕様である。
Apple Store Server API では、JWS を利用するため、今回は JWS を用いた JWT
Goで作った自作のコマンドラインをGitHub Actionsで使用する
最近、[こういったツール](https://github.com/iwashi623/gjobctl)を作りました。
せっかく作ったツールのなので、GitHub Actionsの中で実際に使ってみたいな〜と思ったのですが、自作のパッケージを配布する方法がわからなかったので調べました。その時のメモです。## ツール紹介
ツールの中身のことを語っても仕方ないので、軽く説明すると、AWS GlueのデプロイなどをするAPIをラップしたものです。
ディレクトリ構成は以下のようになっています。
“`
gjobctl
├── cmd/gjobctl
│ └── main.go
├── go.mod
├── go.sum
├── cli.go
├── deploy.go
├── create.go
.
.
.
└── RAEDME.md
“`Terminalで以下のようなコマンドが使えます。
“`bash
$ gjobctl
Usage: gjobctlFlags:
-h, –help Show context-sensitive help.
[書籍レビュー] 実用Go言語
## 書籍概要
[実用Go言語](https://www.oreilly.co.jp/books/9784873119694/)タイトルの通り実用的なGo言語の書き方について書かれた本です。
若干文章の結論が分かりづらい節がありましたがサンプルコード多めなので特に気にせずに読むことができました。
[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1) や入門書でGoの言語機能を一通り使えるようになった後に読むのをおすすめします。1〜6章まではGo言語についての基本と発展がまとまっているという感じで、7章以降はよりシステム開発チックな内容になっています。6章までは順に読みつつ7章以降は気になるトピックから読み進めるのが良さそうです。
## 本の目次
|章|内容|
|:-|:-|
|第1章|「Goらしさ」に触れる|
|第2章|定義型|
|第3章|構造体|
|第4章|インタフェース|
|第5章|エラーハンドリング|
|第6章|パッケージ、モジュール|
|第7章|Goプログラミングの環境を整備する|
|第8章|さまざまなデー
XML,JSON,YAML のGo言語による操作について調べた結果
データ交換やAPIの利用などで、YAML,JSON,XMLなどのエンコードとデコード処理は必須だ。そこで、Go言語初学者なので、これらの処理方法を調べてみたメモである。この記事に、間違いや、もっと良い方法があれば、教えてください。
## パッケージ共通的機能
XML,JSON,YAMLなどを扱うパッケージは、以下の共通的な機能を持っている。
* XML https://pkg.go.dev/encoding/xml
* JSON https://pkg.go.dev/encoding/json
* YAML https://pkg.go.dev/gopkg.in/yaml.v2### 共通的機能 Marshal/Unmarshal
バイト型配列を対象として機能する。Unmarshalは、XML,JSON,YAMLのバイト配列([]byte)を構造体型へ格納する。
* func Unmarshal(data []byte, v any) errorMarshalは構造体型のデータから、XML,JSON,YAMLのバイト配列([]byte)を返す。
* func M
windowsのdocker上にgo言語の環境を作りたい(dockerチュートリアルまで)
# はじめに
Go言語やりたい
↓
[WSL上に環境構築はできた](https://qiita.com/KoHey94/items/5abf60e612cfb6ec263e)
↓
今時ならdockerで環境作るべきか?
↓
なんもわからんからとりあえずやろう←いまここ~~自分用備忘録ってことにすればQiitaの肥やしを増やしてもいいと思いました~~
# 前提
Windows11です。# Dockerって有料になったのでは?
https://www.itmedia.co.jp/news/articles/2201/31/news096.html
正確にはDocker Desktopが有料になったが、個人利用もしくはスモールビジネス(従業員数250人未満かつ年間売上高1000万ドル未満(訳注:1ドル110円換算で11億円))、教育機関、非商用のオープンソースプロジェクトでは引き続き無料で利用できるという条件がついているそうです。
今回は学習用の個人利用なので問題なさそう。# docker hubのアカウント作成とDocker Desktopのインストール
imageのアップロ
コードは最上級のドキュメントになり得るか
# はじめに
https://qiita.com/saetegaljewp/items/a15d769f6553f4ed75d3
という記事を投稿したところ、多くの方からコメントいただきました。
上記事は私のマネジメント失敗談を書いたものですが、私と同じように設計ドキュメントを正とする考えもあれば、コメントやドキュメントよりもコード!という考えもあるとわかりました。そこで、**果たしてコードが最上級のドキュメントになりえるのか**を考察したいと思います。
## ディスクレーマー
本記事はコメントしてくださった方を批判するものではありません。
誤解のなきようお願いいたします。# 最上級とは
ここで最上級とは**ドキュメントに取って代わることができる**つまりコードだけでプロダクト活動に包含される概念を示すことができる、という意味とします。
つまり、コードさえあればドキュメント無しでプロダクト活動(プロジェクト)は成立するということです。
# ドキュメントとは
ここでドキュメントとは**DDDの文脈におけるドキュメント**を指すことにします。
* ドキュメントはコ
jackc/pgxでクエリー実行時にconn busyと出る場合
クエリーを複数回実行する場合は、一度も `Scan()` せず次のクエリーを実行しようとすると下記のエラーが出ます。
> conn busy
“`go:誤
err = conn.QueryRow(context.Background(), “INSERT INTO users(screen_name) VALUES (‘go’);”)
err = conn.QueryRow(context.Background(), “INSERT INTO users(screen_name) VALUES (‘mod’);”) // error!
rows, err := conn.Query(context.Background(), “INSERT INTO users(screen_name) VALUES (‘tidy’);”) // error!
“`次のクエリー実行前に必ず `Scan()` するか、 `INSERT`, `UPDATE` など値を取得する必要がないクエリーには `Query()` (`QueryRow()`) の代わりに `Exec()` を使います。
jackc/pgxで始めるgo+Postgres
Go言語でjackc/pgxを使ったPostgreSQLを使う機会ができたので、最小構成でスタートさせて理解を深めようとしました。
## 動作環境
“`console
$ cat /etc/os-release
PRETTY_NAME=”Ubuntu 22.04.1 LTS”
NAME=”Ubuntu”
VERSION_ID=”22.04″
VERSION=”22.04.1 LTS (Jammy Jellyfish)”
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
UBUNTU_CODENAME=jammy$ g
Dapr を Lima で実行してみる
[Dapr](https://github.com/dapr/dapr) という分散アプリケーション用のランタイムを [Lima](https://github.com/lima-vm/lima) で実行してみました。
# はじめに
## Dapr とは
Distributed Application Runtime の頭文字から Dapr と名付けられているように、分散アプリケーションの開発を容易にするためのランタイム(とフレームワーク)です。
マイクロサービスに特化したものではなく、考え方はサービスメッシュよりも Java/Scala の [Akka](https://github.com/akka/akka) に近い気がするので、マイクロサービス開発へ適用する際は注意が必要かもしれません。
### アプリケーションの開発モデル
Dapr のアプリケーションは、自身のサイドカーとして適用される Dapr Runtime とだけ直接やりとりする次のようなモデルを想定しているようです。
“`mermaid
flowchart LR
App1–>Dapr1[Da
【Golang】Sentry (APMツール) の導入
# 概要
GoのAPIプロジェクト上に、Sentry(APMツール)を導入します。# 環境構築
## 前提
Goプロジェクト上で動作するため、環境を用意します。
“`zsh:shell
go mod init
“`## アカウント作成
https://sentry.io/welcome/ホームページよりSentryのアカウントを作成します。
今回はTRIALで進めます。## Welcome to Sentry
今回は、SDKを使用するため「Install Sentry」を選択します。
![スクリーンショット 2023-01-30 17.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433195/51b29a7a-809b-b5f9-c663-f864b3093b83.png)## Select the platforms you want to monitor
Goを選択します。
![スクリーンショット 2023-01-30 17.37.14.png](https:
Go言語のミドルウェア例
**やりたいこと**
条件によって呼び出すハンドラーを分ける。
又、同じ2つのミドルウェアメソッドを呼んでから最後に対象ハンドラーを呼ぶ。
・middleware1⇒middleware2⇒handler1
・middleware1⇒middleware2⇒handler2**サンプル**
“`golang
// main.go
package mainimport “fmt”
type handlerFunc func(interface{})
type chainHandlerFunc func(handlerFunc)func main() {
middlewares := []chainHandlerFunc{middleware1(), middleware2()}
c := chainHandler(middlewares)
h1 := handler1()
c(h1)
h2 := handler2()
c(h2)}
func handler1() handlerFunc {
return func(i interface{}) {
Go言語 ファイル操作 まとめ
自分はリスキリングとして、Go言語の勉強を本格的に取り組んで、一ヶ月に満たない初心者だ。この記事は、学んだ事が、頭に定着するように、整理して書き残すものである。ここまで解った事として、Go言語を使いこなせるかどうかは、Go言語仕様を理解はもとより、Go言語のパッケージについての知識が大切だと感じた。そこで、設定ファイルの読み込みやログ出力、バッチ処理の基本となるファイル操作について必要な複数のパッケージについて整理を試みた。そのため、特定のパッケージの全機能を網羅するものではない。
## ファイル操作に有用なパッケージ
ファイル操作に活用されるパッケージは、以下の3つがある。これらを組み合わせて、目的の処理を記述すなければらなない。ファイル操作の開始時に必要なOpenとして、C言語では open, fopen の2系統があるが、Go言語では osパッケージに実装された open だけだ。これにより取得されたFile型変数を、bufio と io で利用することになる。
* [os パッケージ](https://pkg.go.dev/os) ファイルのOpen/Close, Re
Goを始めたときの自分のためのメモ
# ポインタにするか値にするか
正直、現時点では**ポインタにするのは参照渡しにしたいとき**という乱暴な理解。ちゃんと理解すべきだけど、こうすべき!と言う確固たるものを持っている人は少ない気がする。
## 構造体
* 構造体のフィールドに、スライスやmap、ポインタなどの参照型を持つ場合はポインタ
* 変更不可な構造体として、運用する場合は値でも良い(コンストラクタを定義し必ずコンストラクタで生成するようにする、不変なオブジェクトなど)
* 迷ったらポインタ構造体が値の場合、コピーしたときに参照型ではないフィールドの変更は、コピー元のインスタンスには影響が無いですが、参照型のフィールドの変更はコピー元のインスタンスも変更されます。このようにフィールドによって挙動が異なる状態になってしまうのはわかりにくい。
確かにポインタを意識しない言語で、arraylistやhash的なものは参照型で、メソッドでreturnする必要ないけど、意識するのがめんどいので何でもかんでもreturnするとかよくある。rubyなんかは最後の変数がreturnされるとかあるので、さらに複雑。##
GCP AutoMLで解くリンゴとトマトの画像分類
Kaggleにリンゴとトマトの画像を分類するという課題があります。
GCP Vertex AIを用いてこの課題を解いてみます。
また作成したモデルを使って、画像の自動分類器を作成します。https://www.kaggle.com/datasets/samuelcortinhas/apples-or-tomatoes-image-classification
# データセットをダウンロードする
上記のURLからデータセット(リンゴとトマトの画像)をダウンロードできます。(要ログイン)
データセット中にはモデルの訓練用の `train` と 検証用の `test` が含まれています。# データセットをアップロードする
画像ファイルをCloud Storageにアップロードします。
あとでVertex AIにとりこむ際に、以下2点が必要です。1. 画像ファイルそのもの
1. 画像ファイルのパスと、ラベルの対応を示したCSVファイルCSVファイルの書式は以下のとおりで、1列目がCloud Storage上のパス、2列目がラベルです。
https://cloud.goo
gRPCに関して簡単にまとめてみた
# 初めに
業務でgRPCを使用する機会があったので学習した内容をアウトプットのため投稿します。
プロトコルバッファに関しては[こちらの記事](https://qiita.com/shint_1/items/f7e9bf03f6b4033ba008)でまとめています。
また、使用する言語はGoを選択しています。# gRPCとは
gRPCとは、クライアントがサーバーのメソッドを呼び出して通信することができるRPC(Remote Procedure Calls)です。
HTTP/2を使用し、デフォルトではProtocol BuffersをIDL・データのエンコーディングとして用います。
クライアントはスタブというものを用いてサーバーのメソッドを呼び出します。
HTTP/2の使用や通信データのバイナリ化などを用いることで高速な通信が可能です。
下図のようなマイクロサービスで用いられることが多いです。###### 図
![スクリーンショット 2023-01-08 18.16.35.png](https://qiita-image-store.s3.ap-northeast-1.ama
Golangのgoto文に関して
### Golangのgoto文に関して興味を持った背景
[こちらの記事](https://www.includehelp.com/golang/goto-aptitude-questions-and-answers.aspx)でコーディングテストの勉強をする際に、恥ずかしながら初めてgoto文を知ったのでこちらの記事でまとめようと思います。
### 具体的にgoto文が使われている箇所
実際にgolangのgithubを覗くと、[こちらの箇所](https://github.com/golang/go/blob/master/src/math/rand/rand.go#L188)などで使われているようです。
“`rand/rand.go
func (r *Rand) Float64() float64 {
// A clearer, simpler implementation would be:
// return float64(r.Int63n(1<<53)) / (1<<53) // However, Go 1 shipped with // return floa
DDDとは?GOとは?って状態からAPIをつくってみた
# はじめに
Goは未経験。クリーンアーキテクチャは引き継いだプロジェクトで経験したけどよくわかっていない。(引き継いだクリーンアーキテクチャもちょっと読んだ記事とは違う実装をしている気がする。)
MVCはRuby on Railsや.net core MVCで経験あり。
最近、GoでAPIをDDDで開発するという話を耳にすることがあったので、興味を持って試しにやってみた。その時のメモと感想です。# DI
DDDに入る前にDIをある程度理解していないと挫折する・・・らしい。ので、DIを理解する。
DIを使うことのメリット。* 外部のDBに依存しないので、変更に強くなる
* ユニットテストがしやすくなる
* 単にコーディングがしやすくなるそうなんだろうなぁと思う。ただ、チーム開発ではなく一人PJや少数で人の入れ替えのないPJなんかだとあまりメリットを想像できない。
インタフェースを使う側が実装オブジェクトを意識しないで実装できるのは確かだけど、一人PJだともちろん関係ない。実装オブジェクトを意識してる。
ユニットテストがしやすくなるは、その通り。・・・なんだけど、実際のPJ