- 1. 本の新刊データをJSONで取得できるようにする。
- 2. 【祝!初投稿】LINEbotを利用し、GO言語で書いたプログラムから自分のLINEアカウントにメッセージ送信してみた
- 3. fireworqのメトリクスを収集する方法について考えた
- 4. GO言語基礎②(defer/map/range/Interface/goroutine/channel)
- 5. VSCodeでProject Managerを使っている場合にgoplsが動かない現象を解消する
- 6. AWS Cognitoでユーザー情報をAWS Lambda(Golang)から取得する方法
- 7. 備忘録 Goでginを使う時に、cssやjsのファイルが読み込めない問題の解決
- 8. ServerlessFrameworkでGoのアプリをデプロイする
- 9. Goのnew()とmake()の違いと、それぞれの使い所をさらっとまとめる
- 10. Adjust のリアルタイムコールバックを Cloud Logging に流す
- 11. アスキーアートコンパイラを作りました
- 12. [Go Unity React] 3Dでライフゲームを試せるサイト作りました
- 13. Go ポインタとは~なぜ必要?
- 14. 【Go】ログライブラリzapを使う時はglobal loggerが便利!
- 15. Mac VSCode dlvでGoのデバッグをする方法
- 16. Firestoreのセキュリティルール以外でPermissionDenied になった原因と解決策
- 17. Golang のテストカバレッジを効率的に確認する
- 18. Go言語入門 --Hello Worldまで--
- 19. 【Go】構造体のスライスからCSV生成
- 20. 【Golang】time.Timeのスライスをソート
本の新刊データをJSONで取得できるようにする。
# はじめに
コミックやラノベの新刊データ取得で、JSON形式で無料で取得しようとするAPIが見つからなかったので、[ゲーム、アニメ、CD発売日一覧](https://calendar.gameiroiro.com/)というサイトからスクレイピングして、JSONで出力するようなプログラムを作る# プログラム概要
[ゲーム、アニメ、CD発売日一覧](https://calendar.gameiroiro.com/)というサイトから、
新刊の発売日、名称、作者、画像が引っ張ってこれるので、これらのデータをJSONで出力するようにする
また、実行結果は標準出力するようにする。# プログラム内容
“`go:calendarscriping.go
package mainimport (
“fmt”
“strings”“github.com/PuerkitoBio/goquery”
)type BookList struct {
Type string `json:type`
Months string `json:months`
Days stri
【祝!初投稿】LINEbotを利用し、GO言語で書いたプログラムから自分のLINEアカウントにメッセージ送信してみた
## はじめに
はじめまして。初めて投稿します。何を投稿するか悩んだのですが、少し前からLINEbotを触っていて、色々試していたら
「LINEbotにHTTPリクエストを送ったら、オウム返しで自分のLINEアカウントにメッセージを送れる。」
のがちょっと面白かったので、この内容にしてみました。## LINEbotについて
– LINEが提供するボットサービスです
– LINEアカウントをお持ちでしたら、[LINE Developers](https://developers.line.biz/ja/)から作成できますので、
興味ある方は色々試してみてください## LINEbotを使用するための準備
1. LINEbot用のチャネルを作成(手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/getting-started/))
2. LINEbot作成(手順は[こちら](https://developers.line.biz/ja/docs/messaging-api/building-bot/))
fireworqのメトリクスを収集する方法について考えた
こんにちは。qudoを打倒している者です。
https://qiita.com/stk0724/items/269328262d5a1f0eaa28
以前上記の記事を書いたんですが、最近fireworqをサービスインしていくつかのqudoジョブをリプレイスしました。
動作は問題ないんですが、滞留してるジョブの数など、各種メトリクスがとれていない状態なので、今回はそれらのメトリクスをモニタリングする方法を考えます。
## mackerelを利用する
mackerelをモニタリングツールとして利用している場合、fireworq公式のmackerel-agent-pluginが存在するため、それを利用するだけで済みます。(fireworqははてな社が開発しているOSSです)
https://github.com/fireworq/mackerel-plugin-fireworq
## cloudwatch + telegrafを利用する
cloudwatchにメトリクスを保管する場合を考えます。
弊社はお金ないのでこちらです。
### メトリクスの収集パート
メトリク
GO言語基礎②(defer/map/range/Interface/goroutine/channel)
# 前回の記事
[GO言語基礎①(package/function/for/if/switch/struct/point/arrays/slice)](https://qiita.com/kenRp01/items/68e5c59dfafbb777d8dd)
# 基礎文法## Defer:遅延実行
`defer`へ渡した関数の実行を呼び出し元の関数の終わり(returnする)まで遅延させる。`Finally`のようなもの。
`defer`が複数ある場合、渡した順にスタックされていき、最後から順に実行されていきます。
defer内での処理でエラーが発生した場合、エラーハンドリングのreturnは無視されます。
対策は以下記事を参考にしてください。
[【Go】 deferに渡した関数内のエラーを呼び出し元に返す](https://qiita.com/vengavengavnega/items/fd0782c30574a983b8a5)“` :宣言方法
defer <処理>
“`
下記の順で`defer`に処理が渡されていた場合“`go
defer func() {
VSCodeでProject Managerを使っている場合にgoplsが動かない現象を解消する
# _VSCode_ で _Project Manager_ を使っている場合に _gopls_ が動かない現象を解消する
動作環境
– macOS: Catalina
– VSCode: 1.56.1
– gopls: v0.6.11
– GO: go1.16.3 darwin/amd64## _Project Manager_ を使って開発スペースを立ち上げるとエラーが発生する
“` text
Error loading workspace: gopls requires a module at the root of your workspace.
You can work with multiple modules by opening each one as a workspace folder.
Improvements to this workflow will be coming soon, and you can learn more here:
https://github.com/golang/tools/blob/master/gopls/doc/wo
AWS Cognitoでユーザー情報をAWS Lambda(Golang)から取得する方法
# 目的
APIを叩いてきたユーザー名によって変えたいということがありました。
そこで、Cognitoでオーソライズを行っているLambda関数にて、API Gatewayの認証情報をLambda(Golang)の中で取得する方法を調べました。# 結論
以下のコードでユーザー名を取得できます。
“`go
func handler(ctx context.Context, apiGWEvent events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {ユーザー名取得
diaryGetter := apiGWEvent.RequestContext.Authorizer[“claims”].(map[string]interface{})[“cognito:username”].(string)/// …略
}
“`割と途中のコードとかが謎ですので、以下に解説を載せておきます。(これより単純に取得できる方法がありましたらご教授いただけると幸いです。)
# 解説
備忘録 Goでginを使う時に、cssやjsのファイルが読み込めない問題の解決
# 書いた理由
go言語でginを使っていたら、htmlからjsが読み込めない問題が発生したので、忘れないようにメモっておきます。また、ginを使わない場合でも同様の操作が必要らしいです。
cssの読み込みも同様にやるので、省略します。## ディレクトリについて
[github](https://github.com/suzakutakumi/gin-staticJS)に今回のコードはおいてあります。
`correct.go`が正常に動作するプログラムで、`incorrect.go`が正常に動作しないプログラムです。“`
./
├── correct.go
├── incorrect.go
└── src
├── index.html
└── js
└── main.js
“`## htmlとjs
ボタンを押すと、alertで`Pushed!!`と出るだけの簡単なプログラムです。
“`html:index.html
gin-js
ServerlessFrameworkでGoのアプリをデプロイする
最近はCDKなどの他のツールに押され気味の印象のServerlessFrameworkですが、API Gateway+Lambda+ DynamoDBといったサーバレス構成の場合、記述のシンプルさ故、ServerlessFrameworkを選択するケースはまだ多い印象です。今回は、GoのアプリケーションをServerlessFrameworkで構築する方法について記載します。
ServerlessFrameworkで使用できるGoのテンプレートには以下の3つがあります。
- aws-go
- aws-go-dep
- aws-go-modGoではバージョン1.11から従来のGOPATHモードに加えてモジュールモードが用意されており、今後はこのモードが主流となることから、ここではaws-go-modを選択します。ちなみに、モジュールモードを使用すると、ソースコードを$GOPATH以外の任意のディレクトリに配置できるなどのメリットがあります。他にもメリットはありますが、ここでは割愛します(「GOPATHモード モジュールモード」などで検索いただければと思います)。
以降、このテン
Goのnew()とmake()の違いと、それぞれの使い所をさらっとまとめる
# new()
new(T)はtypeがTのインスタンスを、Tのゼロ値で生成して、そのポインタを返してくれる。
構造体でよく使われる。# make()
make(T, args)における、Tはsliceかmapかchannelのいずれかである。
make(T, args)はtypeがTのインスタンスをargsを元に初期化して返してくれる。# new()とmake()の使い分け
そもそも、make()はsliceかmapかchannelでしか使えない。
これら3つの型には初期化情報を与えることで事前にメモリを確保しておくことが可能だ。
sliceにはlenとcapを、mapとchannelにはlenを与えられる。
あらかじめ使用するメモリ幅が決まっているのなら事前に確保しておくことで、処理時間を短くできる。一応、new()でsliceやmapのインスタンスを生成することもできる。
```go
package mainimport (
"fmt"
)func main() {
s := new([]string)
(*s) = append((*s), "
Adjust のリアルタイムコールバックを Cloud Logging に流す
# 1. はじめに
Adjust のリアルタイムコールバックを利用すると、 Adjust の計測結果を指定のサーバーに送信する事ができます。
この記事では、 Adjust のデータを Cloud Functions に送信して Cloud Logging へ流すための設計をまとめます。# 2. アーキテクチャ
Adjust でリアルタイムコールバックを利用する際、受け口となるサーバーが必要となります。
今回は Cloud Logging へ送る事が目的なので、同じ GCP の Cloud Functions を使います。アーキテクチャの完成予想図はこちらです。
![adjust-architect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66083/74c86b93-98e3-d6eb-84f6-efe1ff68ee10.png)# 3. サーバーを建てる
アーキテクチャで記述した通り、サーバーには Cloud Functions を利用します。
以下のパラメータで Cloud
アスキーアートコンパイラを作りました
# はじめに
アスキーアートというのを皆さんはご存知でしょうか?
文字だけで構成されたイラストや画像のようなものです。例
```
---------------------------------------
|acsc file (The ASCII Art Source Code)|
---------------------------------------
|
|ASCII Art Compiler(acc) output
|
|------------|-----------|
| | |
| | |
|---------- |--------- |---------
|HTML File| |png File| |pdf File|
----------- ---------- ----------
```しかし、これだけだと、単なるテキストファイルです。
これを画像ファイルをはじめとする様々な形式に変えたいと思いました。# 成果物
[ASCII_art_com
[Go Unity React] 3Dでライフゲームを試せるサイト作りました
# はじめに
ライフゲーム(海外だとGame of Life)という生物学的モデルシュミレーションを3次元で作成してみました。
サーバーサイド Golang, クライアントUnity & React使用です。
ゲームリンク↓https://life3-dc-lient.vercel.app/#/tech
## そもそもライフゲームとは
聞いたことのない方が多いと思いますが、ライフゲームとは格子を生命とみなしたモデルシュミレーションです。
ユーザー自身がルールを定めてどのような生命活動が行われるかシュミレーションすることができます。
基本的には「縦 × 横」の二次元で作成されることが多いですが、
今回は「高さ」を加えた三次元で作ってみました!
Go ポインタとは~なぜ必要?AWSのLambda関数を触っててGoのチュートリアルが読めなかったので、基礎的なところから勉強したことを記す。
#ポインタの概念
ポインタ=実体(インスタンス)が格納されたメモリのアドレス```
package mainimport "fmt"
func main() {
var i int
//int型の100という実体
i = 100//int型のポインタ型変数pを定義
var p *int
p = &ifmt.Println(i) //100
fmt.Println(p) //0xc00018c008
fmt.Println(*p) //*をつけることでリテラル(数値や文字列を直接に記述した定数のこと)を参照できる
}```
ここで疑問が湧いた。
ポインタってなぜ必要なのか?
それは、値渡しだけではなく参照渡しができるから。## 値渡し
```
package mainimport "fmt"
func main() {
var i int
i = 100fmt.Println(i) //100
h
【Go】ログライブラリzapを使う時はglobal loggerが便利!
# はじめに
Goのログライブラリで人気なzap。
私も使っているのですが、インスタンスを引数で受け渡す必要があるのが少し面倒な気がします。```go:main.go
package mainimport "go.uber.org/zap"
func main() {
logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar()// 引数で渡す
hoge.Hoge(sugar)
}
``````go:hoge.go
package hoge// ログ出力したい
func Hoge(s *zap.SugaredLogger) {
url := "http://example.com"
s.Infof("error: %s", url)
}
```規模が小さい時はそこまで気になりませんでしたが、大きくなるにつれて徐々に気になるようになりました。
ネストされたところでログ出力したいがために、そこへ引数リレーしていくのがちょっと辛いです。別の使い方がないかと思
Mac VSCode dlvでGoのデバッグをする方法
goをVSCodeでデバッグするには、dlvというものが必要らしい。
dlvは、Goのデバッガのこと。静的型付け言語?のため、強者はlog.Printf("%+v")でも問題箇所に気づくことはできるらしいが、delveを使ったデバッグは便利とのこと。dlvをインストールするのに若干ハマったので備忘録として残しておく。
# 環境
VS Code
Mac Os
brew# goのインストール
```
brew install go
```
```
go version
go version go1.16.3 darwin/amd64kkk
```
GOPATHを通しておく。```
$echo 'export PATH=~/go/bin:$PATH'>>~/.bash_profile
```#dlvのインストール
## 試したこと
```
brew install go-delve/delve/delve
```
brew でdlvをインストールしようとしたら、↓で怒られた。```
Error:
homebrew-core is a shallow clone
Firestoreのセキュリティルール以外でPermissionDenied になった原因と解決策
# 前提
GCP内に作成されたProjectAとProjectBという2つのプロジェクトが登場します。
Cloud Firestoreへのアクセスは、ProjectAに「Firebase Admin SDK Service Agent」というサービスアカウントを作成し、ProjectBからもこのサービスアカウントを使用してFirestoreにアクセスします。
今回のサービスでは、Go言語で作成したAPIをApp Engineにデプロイした例を用いていますが、Cloud Functionsやその他のリソースを使用していても問題ないと思います。ざっくりとした構成図は下記のとおりです。
![sample_architect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228026/7ba796f6-9b9b-4104-fb46-0fff9cb9b135.png)# 発生した現象
ProjectA内に作成されたFirestore内のデータにProjectBからアクセスしようとすると、`rpc error:
Golang のテストカバレッジを効率的に確認する
# Golang のテストカバレッジを効率的に確認する
前回の記事でテストカバレッジをシェルスクリプトにしてそれを実行することで確認していました。
https://qiita.com/k_yuda/items/86f40bdf3e040560ade4今回これをDockerfileとMakefileにまとめてよりテストカバレッジを確認しやすいようにしたメモ。
# 流れ
+ マルチステージビルドのstage1においてテストカバレッジを確認するためのcover.outなどを生成する
+ stage2において、stage1のファイルをコピーする
+ Dockerコンテナーないにあるファイル、cover.outをhtmlにコンバートしたファイルをローカルにコピーする
+ Makefileで各種コマンドをまとめる## マルチステージビルドを実現しているDockerfileを記述し直す。
```docker:Dockerfile
FROM golang:latest AS stage1-buildphase
WORKDIR /go/src
COPY . .
RUN go test
Go言語入門 --Hello Worldまで--
# はじめに
最近Go言語へ入門したので学んだことを記憶の整理を兼ねて書く。この記事ではGoでHello Worldができるまでを書く。windows、linuxなどのMacOS以外の環境での動作は確認していないが、同様の方法で進められるように書いた。
# 環境
MacOS BigSur 11.2.3で行った。
# 使用方法
Goは他にも幾つかあるかもしれないが、[Playground](https://play.golang.org/)を使う方法とGoをインストールしてを使う方法がある。Playgroundはプログラムの作成と実行ができるwebアプリケーションであり、簡単なコードを試したいときなどに使うのが便利である。この記事では後者の方法で導入を行い、Hello Worldを行う(PlayGroundは開いてrunするとできる)。
# インストール
GoはMacを使っているのであれば`brew install go`でインストールできるが、今回はwindowsやlinuxでも同様の手法で行えるように[公式サイト](https://golang.org/dl/)からダウンロードしてイ
【Go】構造体のスライスからCSV生成
# はじめに
GoでCSVの生成をしたいときに縛りが緩い汎用的な処理が欲しかったので、構造体のスライスを突っ込めば良いだけの処理を作成しました。
#成果物
```golang:file.go
package fileimport (
"encoding/csv"
"fmt"
"os"
"reflect"
"strconv"
)func GenerateCSV(i interface{}, fileName string) {
reflectType := reflect.TypeOf(i)
reflectTypeElem := reflectType.Elem()if reflectType.Kind() != reflect.Slice || reflectTypeElem.Kind() != reflect.Struct {
fmt.Println("構造体のスライスのみ使えます")
return
}name := fmt.Sprintf("/tmp/%s.csv", fileName)
f, err := os.Create(name
【Golang】time.Timeのスライスをソート
## 概要
`timestamp.Timestamp`の型を持ったstructのスライスをソートする方法
sort interfaceを満たすメソッド(Len, Less, Swapメソッド)を用意する方法よりこちらの方が簡単なので、メモ## 実装
```go
package mainimport (
"fmt"
"time"
"sort"
)type User struct {
Name string
CreatedAt time.Time
}func main() {
us := []User{
{
Name: "john",
CreatedAt: time.Now().Add(time.Minute),
},
{
Name: "kenta",
CreatedAt: time.Now(),
},
}
fmt.Println(us)
sort.Slice(us, func(i, j int) bool {
return us[i].CreatedAt.Before(us[