- 1. 青いベンチ診断の結果をひたすらtwitterに投稿するアカウントをつくった
- 2. React+axiosでPOST送信したデータをGoで受け取る
- 3. Goroutineとselectとchannelを使って共同作業
- 4. SAMとGoのテンプレートエンジンでSSR
- 5. goroutineチートシート
- 6. “テストカバレッジ強制ギプス” 導入
- 7. 【Go】学習メモ② ~Goroutine, Channel~
- 8. クイックソートとヒープソートとシェルソートとGoのソートと
- 9. 自分の作ったモジュールをインストール時に”module declares its path as:”というエラーが出た
- 10. football-data.orgのAPIでサッカーのデータを取得する
- 11. json.Marshalの基礎理解
- 12. 【Go】学習メモ① ~Structs, ポインタ, Slice, Map, Interface~
- 13. fmt.Printfは中身をstringしないとエラーになる
- 14. go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。
- 15. Goの基本
- 16. GO goroutineを玉入れ競争に例えて理解しようとする
- 17. Goをherokuで自動実行する
- 18. 後方互換性と和解せよ
- 19. New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ
- 20. OpenTelemetryをざっくりと知る
青いベンチ診断の結果をひたすらtwitterに投稿するアカウントをつくった
[Zenn](https://zenn.dev/okaponta/articles/d89b8c99458b22)にも投稿したので、好きな方でお読みいただければと思います。
# はじめに
みなさま「青いベンチ」という曲はご存知でしょうか。
「この声が枯れるくらいに 君を好きと言えばよかった」からはじまるサビは聞いてて心地いいですね。さて、私がこの曲を知ったのは[青いベンチ診断](https://shindanmaker.com/240064)というものです。
これがまた面白くて、1/157464の確率で「青いベンチ/サスケ」という文字列が揃うものになります。
確率からしてだいたい外れるんですが、以下のような診断結果が出力されてクスってきてしまいます。サスチン青ベチ/ベンチ#shindanmakerhttps://t.co/X1WXZqTFWF
— Kohei Okamoto (@okaponta_) December 28, 2021
揃わなかった文字列を言い合うみたいなtogetterもありました。
https://togetter.com/li/452165
2021年の終わりになぜか「ひたすらこの診断結果を投稿するBotを作りたい」と強く
React+axiosでPOST送信したデータをGoで受け取る
JSON形式かx-www-form-urlencoded形式かで、実装方法が異なるみたいです。
## バージョン
axios 0.24.0
go 1.16.6
react ^17.0.2## それぞれの違い
### x-www-form-urlencoded形式
Content-Type ・・・ application/x-www-form-urlencoded
例 ・・・ a=1&b=1(エンコード後:%20a%3D1%26b%3D1)
Go(サーバー側)の実装の際にr.Form.Get(“name”)、r.FormValue(“name”)、r.PostFormValue(“name”)のメソッドで送信されたデータを取り出せる。multipart/form-data形式もGoの実装方法は同じだが、key-value型のデータを送るのでapplication/x-www-form-urlencoded形式を使うことにする。### JSON形式
Content-Type ・・・ application/json
例 ・・・ {“a”:1,”b”:2}
Go(サーバー側)の実装
Goroutineとselectとchannelを使って共同作業
田中君:1作業あたり1秒
鈴木君:1作業あたり1秒ルール
– 作業6個分になったら仕事終了
– 仕事が終了するまでにかかった時間を計測する田中君だけで作業をした場合 (鈴木君のgoroutineをコメントアウト)
“`go
package main
import (
“fmt”
“time”
)var total_work = []string{}
func tanaka(ch chan string) {
for {
time.Sleep(1 * time.Second)
ch <- "作業" } } func suzuki(ch chan string) { for { time.Sleep(1 * time.Second) ch <- "作業" } } func main() { start_time := time.Now() c1 := make(chan string) c2 := make(chan string) go tanaka(c1) // go suzuki(c2) for { fmt.Pr
SAMとGoのテンプレートエンジンでSSR
静的なテンプレートを読み込んでSSRを行うWebアプリケーションを作成します。
## 前提知識
* AWS SAM と Golang を利用して Severless なWebアプリケーションを作成することができる。
* Golang の html/template パッケージを利用してHTML形式の文字列を標準出力することができる。(以後AWSとlangは省略して記述します)
## Lambdaで静的なファイルを扱う
様々な方法があるかもしれませんが、今回は `AWS Lambda Layer`[^1] を利用します。
この機能を利用することで、 HTMLやCSS等の静的なデータをLambdaのzipファイルに含めることができます。SAMでは、SAMのテンプレートファイル内に設定を記述することでLambda Layerを構築することができます[^2]。
## 構築
早速SAMでLambda Layerを利用したアプリケーションを構築してみましょう。
今回は以下のような単純なページを作成していきます。# 概要
goroutineはGo言語において花形とも言える機能ですが、
実際に動くものを作ろうとなると落とし穴も多く非常に難しいです。これは防備録を兼ねたチートシートです。
そのままコピペして`go run`すれば動くと思います。
随時書き足していきますこのドキュメントで使用しているコードはgitHubにまとめてあります
https://github.com/nc30/golang_examples/tree/main/goroutine## 基本形
basic.go
https://github.com/nc30/golang_examples/blob/main/goroutine/basic.go
“`go
package mainimport (
“log”
“time”
)// goroutineはpythonで言うthureadingのようにfunction単位で並列処理を行う
// go言語の花形とも言えるもので、多言語よりも簡単で安全に行うことができる
// 今回は一次関数として渡しているが、もちろん関数を渡すことでも動かすことがで
“テストカバレッジ強制ギプス” 導入
## テストカバレッジ強制ギプスとは
* テストカバレッジが**基準値以下ならマージをできなくしてしまう**機構のこと (をこの記事で勝手にそう呼んでいます)
* この記事では、**Go のプロジェクト**を運用されている方を対象に**テストカバレッジ強制ギプス**を**15分**で導入できるように紹介します
* 具体的には、CI でテストカバレッジを計測して、[基準値以下なら fail](https://github.com/nrnrk/gotestcoveragecheck/pull/1) にさせるようにします
* テストカバレッジ強制ギプスを導入して、単体テストを充実させ快適な開発ライフを楽しみましょう![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150399/f6763328-6da4-ad39-164e-35a20f94b422.png)
## 背景
私のチームでは、 Go を用いたバックエンドサービスの開発をしています。開発の中でいくつか気になることが出て
【Go】学習メモ② ~Goroutine, Channel~
#はじめに
前回の学習メモの続きです。
GoroutineとChannelについてまとめました。https://qiita.com/suzuki0430/items/6674ffa239dc539e0fd7
#シリアル処理
本題の前に、シリアル処理についてまとめます。
まずは以下のように、5つのリンクにhttpリクエストが正常に送られるかどうかをチェックするコードを考えます。“`go:main.go
func main() {
links := []string {
“http://google.com”,
“http://facebook.com”,
“http://stackoverflow.com”,
“http://golang.org”,
“http://amazon.com”,
}for _, link := range links {
checkLink(link)
}
}func checkLink(link string) {
_, err := http.Get(link)
if err != nil {
クイックソートとヒープソートとシェルソートとGoのソートと
# はじめに
7年ぶりくらいにアルゴリズムとデータ構造を勉強し直しています。シェルソートなんてものもあったなーと名前すら忘れているアルゴリズムもあったりと、良い復習になったのですが、ソートに関していうと、様々なソート手法を紹介した後に、「言語の標準のソート実装はクイックソートがベースになっていることが多いです」で説明が終わっていることが多い気がします。
Goのソート実装がどのようになっているか気になり実装を確認したのでまとめたいと思います。
Goは通常の`Sort`と安定ソート(同じ値が元順序を維持する制約がつくもの)である`Stable`を提供しますが、`Sort`のみ取り扱います。`Sort`実装はクイックソートとヒープソートとシェルソートを柔軟に使い分けてます。それぞれのソート手法のポイントを簡単に説明したうえで最後にGoの`Sort`実装を紹介したいと思います。
# クイックソート
ポイントはなんといってもpivotの選択と部分ファイル(pivotをもとに分割されたファイルを指す)の構築方法です。### pivot
単純に端の要素をpivotとしてしまってはソー
自分の作ったモジュールをインストール時に”module declares its path as:”というエラーが出た
### エラー
“`
> go get github.com/okaponta/slack-kintai
go get: github.com/okaponta/slack-kintai@v1.1.0: parsing go.mod:
module declares its path as: slack-kintai
but was required as: github.com/okaponta/slack-kintai
“`### 原因
`go.mod`宣言時にモジュール名を外部公開を想定しない名前にしていたため発生しておりました。
`go mod init hogehoge`の`hogehoge`に`importpath`を入力するべきなのですが、リポジトリ名をいれていたため、外部から`go get`できなくなっておりました。
今回は外部公開する予定ですので、`github.com/okaponta/hogehoge`のように`github.com`のユーザつきで宣言するのが正解みたいです。修正完了後は再度タグ切るのを忘れずに・・・!!(私は
football-data.orgのAPIでサッカーのデータを取得する
サッカーチームや試合のデータをAPIで取得できないか?と思ったので探した結果よさそうなAPIサービスがあったのでデータ取得までまとめます。
## API概要
https://www.football-data.org/今回使ってみるAPI。アカウント登録すれば無料枠で12のコンペティション(5大リーグやCLなど)のデータを取得できる。[詳細は公式ページ](https://www.football-data.org/)にて
## アカウント登録
[登録画面](https://www.football-data.org/client/register)から名前、メールアドレス、言語を選んで登録。利用規約はしっかり読むこと!
@football-data.orgのメールアドレスからAPIトークンが送られてくる。
## データ取得
[公式ドキュメント](https://www.football-data.org/documentation/api)を参考に。今回はGO言語でサッカー史上最もクールなクラブチームを取得するように実装しました。
“`golang
package
json.Marshalの基礎理解
## 構造体 → json → 構造体
“`go
package main
import (
“encoding/json”
“fmt”
)// 横に`json:~`でjsonにした時のキーを記載
type Friend struct {
Name string `json:”name_json”`
Age int `json:”age_json”`
}func main() {
F := Friend{
Name: “murama”,
Age: 44,
}fmt.Println(“F: “, F)
// 構造体からjsonへ
j, err := json.Marshal(F)
if err != nil {
panic(err)
}
// string型に変換しないとbyte型で表示される。
fmt.Println(“j: “, j)
fmt.Println(“string(j): “, string(j))// 受皿となる空の構造体を作る。
new_s := Friend{}
fmt.Pri
【Go】学習メモ① ~Structs, ポインタ, Slice, Map, Interface~
#はじめに
調べれば星の数ほどでてくるGoの基礎をあえて自分用にまとめました。
現業のフロントエンドだけではなくバックエンドにも磨きをかけたいというのがGoの学習目的です。
基礎学習後は個人サービスつくって実践していきたいなと思っています。#Structs(構造体)
Goにはオブジェクト指向言語におけるClassがなく、その代わりにStructs(構造体)というものが存在します。
Structs型の変数を定義すると、Structsに定義されている各フィールドに必要なメモリ領域が確保され、それぞれのフィールドは型に合わせた初期値をとります。例えば、以下のように`person`というStructsをつくり、初期値を設定せずにそのまま出力してみます。
“`go:main.go
package mainimport “fmt”
type person struct {
firstName string
lastName string
}func main() {
mrSasuke := person{}
mrSasuke.print()
}func (p pe
fmt.Printfは中身をstringしないとエラーになる
go言語でfmt.Printfを扱う時にint型を表示しようとしてエラー出してしまうので、備忘録
“`go
package main
import (
“fmt”
“strconv”
)func main() {
var s string = “5”
// int型に変換
i, _ := strconv.Atoi(s)fmt.Printf(i) # こちらはエラーになる
// fmt.Printf(“%v”, i) # こちらはエラーにならない}
“`
実行結果
“`
# command-line-arguments
.\main.go:17:12: cannot use i (type int) as type string in argument to fmt.Printf“`
go チャネルから送る値がなくなっても チャネルから値を繰り返し受信し続けることによるエラーの確認。
closeしない場合のエラー内容確認
“`go
package main
import “fmt”
func routine1(int_slice []int, channel_kun chan int) {
sum := 0
for _, v := range int_slice {
sum += v
channel_kun <- sum } // close(channel_kun) } func main() { int_slice := []int{1, 2, 3, 4, 5} channel_kun := make(chan int, len(int_slice)) go routine1(int_slice, channel_kun) for i := range channel_kun { fmt.Println(i) } } ``` 実行結果 ``` 1 3 6 10 15 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan r
Goの基本
## 前書き
Goを初めて学習する中で大事だと思った点をまとめました。ノート代わりの記事です。
主に[A Tour of Go](https://go-tour-jp.appspot.com/list)を参考にまとめました。
間違っている箇所がある場合は指摘していただけると幸いです。
## Go言語とは
Googleが開発したプログラミング言語。また、オープンソースであり [GitHub](https://github.com/golang) に公開されている。
#### 特徴
– 静的型付け
– コンパイル言語
– メモリ安全性
– ガベージコレクション
– 構造的型付け
– 並列処理
以下からは実際のコードを交えて、基本的な文法を紹介していく。出力はコメントアウトで示している。
## Import Packages
Goのプログラムはmainパッケージから開始されている。
複数のパッケージをインポートするときは、グループ化した方が美しい。
“`go
package mainimport (
“fmt”
“math”
)
“`これ以降
GO goroutineを玉入れ競争に例えて理解しようとする
## 玉入れ
田中君:1投あたり2秒
鈴木君:1投あたり1秒ルール
– 先に10球投げた方の勝ち → ゲーム終了
– 玉入れ先は別々ポイント
– waitするスレッドを1として、1つでも並列スレッドが完了した場合、プログラムを終了させる。“`go
package main
import (
“fmt”
“strconv”
“sync”
“time”
)type Tomodachi struct {
name string
per_throw_time int
greeting string
}var greeting = “よろしくお願いします”
var tanaka = Tomodachi{
name: “tanaka”,
per_throw_time: 2,
greeting: greeting,
}var suzuki = Tomodachi{
name: “suzuki”,
per_throw_time: 1,
greeting:
Goをherokuで自動実行する
## はじめに
ついにアドベントカレンダー最終日になってしまいました。
私のクリスマスは帰国によりホテルでの隔離生活であるため、時間だけがありました。ずっとGoを勉強したかったこともあり、この機会に入門しました。
丁度良いタイミングで中学の頃からの先輩がGoでLIFFアプリを開発していたので、こちらで勉強させていただきました笑。https://qiita.com/AsuyaKakegawa/items/2e8d27393f2955b32f6f
↑こちらの記事で作成したアプリをherokuにデプロイするところまでします。
## 作成したもの
↓LINEの友達追加から、デモがみれます。
![M_gainfriends_qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/77b86edd-4cb3-810d-01cc-f4447865a076.png)
天気予報が雨であれば、毎朝6時に公式アカウントから通知が送られてきます。(写真はテスト実装なので、本来は6:00amになります。)
後方互換性と和解せよ
# 後方互換性ってなに?
みんな大好き信頼の塊 Wikipedia さんの「[互換性](https://ja.wikipedia.org/wiki/互換性)」の記事によると、後方互換性は以下のように定義されています。
> 古いシステム向けのデータなどが新しいシステムでも全て使用できること。
ソフトウェアの文脈では「ソフトウェアのバージョンをアップしても、それに依存する既存のソフトウェアが正常に動作すること」と読み替えられる場面が多いかと思います。
# Goと後方互換性
Go言語は伝統的に後方互換性を大事にしてきた言語です。それは [Go 自体](https://go.dev/doc/go1compat)についてもそうですが Go を使って書かれたソフトウェアについても Go Modules の導入時に後方互換性について[具体的な指針](https://go.dev/blog/module-compatibility)が打ち出されたりしたこともありました。最近であれば Rob Pike が Go 1.18 について「[標準ライブラリの内部実装は変えずにリリースしよう](http
New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ
# はじめに
この記事は[New Relic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/newrelic “New Relic Advent Calendar 2021”)の25日目の記事です。
「[ミイダス](https://miidas.jp/ “ミイダス”)」という転職支援・採用支援サービスで、New Relic Goエージェントを導入した際に踏んだ地雷について、いくつかご紹介したいと思います。New RelicのGoエージェントはまだ新しいサービスで資料が少ないこともあり、いくつかの地雷を踏むことになるかと思いますが、それを乗り越えるととても幸せな世界が待っています。
弊社のサービスでは、New Relicを活用して、より良いサービスになるよう数々の処理の改善や障害の早期発見などに役立てています。APIの応答性能やエラー率を監視するダッシュボード作成例
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/
OpenTelemetryをざっくりと知る
# はじめに
以前マイクロサービスの分散トレーシングを導入する機会を頂き、OpenTelemetryについて色々と調べていました。 そこで今回は備忘録も兼ねて、OpenTelemetryとOpenTelemetry Collectorについて概要をまとめてみました。
# OpenTelemetryとは
OpenTelemetryは、トレース、メトリック、ログなどのテレメトリデータの作成と管理用に設計された、API、SDK、ツール、および統合のセットです。ベンダーに依存しない実装を提供し、選択したバックエンドにテレメトリーデータを送信する方法を標準化することを目的としています。
OpenTracingやOpenCensusの後継にあたる新たな標準化ツールとなります。つい最近ですが、ついにv1.0が公開され、今後テレメトリデータを扱うツールとして広まっていくのではないのでしょうか。
## TraceとSpan
OpenTelemetryにおけるトレース情報は**Trace**と**Span**という概念で定義されています。
**Trace**: あるリクエストに対するSp