- 1. SQSメッセージ受信時に送信時刻を含めて取得する
- 2. Go でリフレクションを使って struct をバリデーションする
- 3. 【Golang】Module環境で相対パスmoduleとpackageをimport (Go:1.13)
- 4. Goが他の言語と違ったところ
- 5. error messageにコロンをつけたらlintに怒られた
- 6. fluentbitを使ってk8s上のGoアプリケーションのログやカスタムメトリクスを回収する
- 7. ゴリラに喋らせるコマンドを作った
- 8. embeded使い方【golang】
- 9. golintのcliの実装を読んでみる
- 10. データ分析基盤構築入門 サンプルアプリエラー
- 11. Kotlin vs Go 処理時間を比較してみる
- 12. Open状態のファイルに対して、Linuxだとos.Renameに成功するが、Windowsだとエラーになる
- 13. GAE/Go(2nd Gen)でDatastoreモードのFirestoreとFirestoreを使う
- 14. [Golang] sliceの重複処理を行う、array_unique関数みたいなものを作ってみた (解説付)
- 15. [Golang]slice内で特定の要素があるか調べる、contains関数を作ってみた(解説付)
- 16. Goのnet/httpの実装をちょっと読んでみる
- 17. Adafruit Trinket M0でTinyGo
- 18. サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする v2
- 19. govendorで依存関係のファイルが取得できないエラーについて
- 20. goenvでGolangのバージョン管理(最新版のGolangを使う)
SQSメッセージ受信時に送信時刻を含めて取得する
SQSからメッセージ受信時に送信時刻も含めて取得するサンプルです
### デフォルト(送信時刻は含まれない)
“`golang:main.go
package mainimport (
“fmt”“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/sqs”“os”
)func main() {
session := session.Must(session.NewSession(&aws.Config{Region: aws.String(“ap-northeast-1”)}))
sqsSvc := sqs.New(session)
queueURL := aws.String(os.Getenv(“SQS_URL”))
params := &sqs.ReceiveMessageInput{
QueueUrl: queueURL,
MaxNumberOfMe
Go でリフレクションを使って struct をバリデーションする
Go 言語で、テストに必要な Variables がちゃんとセットされているか確認したいという要望があった。その Variables もいろんなところに分散していたら面倒なので、一か所で書きたかった。つまりこんなイメージ。
“`go
type Foo struct {
Bar string `env:”TF_VAR_hello”`
Baz string `env:”TF_VAR_world”`
}
“`
こんな感じで構造体を書いておくと、自動で、`TF_VAR_hello` と `TF_VAR_world` の環境変数を読み込んで、それをそれぞれのフィールドにセットしてほしい、そしてすべてのフィールドがちゃんとなんかしらの値がセットされていてほしい。このような要件の時はリフレクションだけど、Goではやったことなかったので調べて試してみた。
# フィールドの読み込み
定義されたすべてのフィールドの読み込みは次のコードで可能になる。ちなみに、`s` は、ポインターでも実体でも良い。
“`go
func validate(s interface{}) {
val :=
【Golang】Module環境で相対パスmoduleとpackageをimport (Go:1.13)
ちょっとハマったので自分用メモ。
Go Modules環境でローカルに配置した共有moduleと、子packageを使う場合の指定の仕方。# TL;DR
別moduleならgo.modに`replace`で相対パスを記載する。
同一moduleなら`import 自module名/ディレクトリ名`で指定する。# フォルダ構成
“`
project_root
├── module_a
│ ├── go.mod
│ └── main.go … ここで common_module/common を使いたい
│
├── module_b
│ ├── go.mod
│ ├── main.go … ここで common_module/common と sub_package を使いたい
│ └── sub_package
│ └── sub.go
│
└── common_module
├── go.mod
└── common.go
“`# ソースコード
Goが他の言語と違ったところ
# まえがき
風邪をひいて会社を休んだので、この機会に前から気になっていたGoを勉強しようと思い、以下のサイトで勉強を始めた。
https://golang.org/doc/学んでいくうちに、これは他の言語にはなかった機能だなと思ったものを書いていく。
「他の言語にはなかった機能」とは、私にとって初めて目にする機能である。以下のプログラミング言語はだいたい分かるはずなので、これらの言語には無い機能なはず。
`Pascal, C, Java, Perl, Python, TypeScript`
他の言語には同じような機能があるのかもしれないが、容赦して欲しい。# スライスのcapacity
配列は、C言語と同じく固定長である。以下では、長さ6のint配列を定義をする。“`go
arrayedPrimes := [6]int{2, 3, 5, 7, 11, 13}
“`配列は固定長で使い勝手が悪いので、以下のようにスライスが多用される。
“`go
slicedPrimes := []int{2, 3, 5, 7, 11, 13}
“`スライスにはlengthと
error messageにコロンをつけたらlintに怒られた
Goを書いている時に怒られて何のことかわからなかったので、調べた覚書です。
# 起こったこと
“`
errors.New(“Not found.”)
“`
サンプルの記述ですが、上記の記述だと、下記のメッセージが出て記述を直すように言われます。“`
error strings should not be capitalized or end with punctuation or a newline
“`
エラーの文字列は大文字にしたり、句点、改行で終わらせたらいけないらしいです。
なぜ、そんな事になっているのか気になったので、公式のwikiで調べました。> Error strings should not be capitalized (unless beginning with proper nouns or acronyms) or end with punctuation, since they are usually printed following other context.
https://github.com/golang/go/wiki/Co
fluentbitを使ってk8s上のGoアプリケーションのログやカスタムメトリクスを回収する
# この記事でやること
この記事では、fluentbitを用いてk8s上のアプリケーションのログを回収してElasticSearchに送る方法をまとめます。またログの中にカスタムメトリクスを出力して、それをKibanaで可視化も行います。
具体的にはGoアプリに以下のようなログを吐き出させるようにして
“`json
{“count”:0,”file”:”main.go:16″,”func”:”main.main”,”level”:”info”,”msg”:”sample log”,”text_sample”:”fooooo”,”time”:”2020-03-02T18:22:24+09:00″}
“`Kibanaでちゃんとメトリクスとして扱えるように送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129577/192d94d0-be0e-aa7e-718c-3e9dd3edd456.png)
# fluentbitとは
![https://www.tre
ゴリラに喋らせるコマンドを作った
こんにちは、ゴリラです。
みなさん`cowsay`ってコマンド知っていますか?
牛を喋らせることができるコマンドですが、それのゴリラ版が欲しくて作ってみましたhttps://github.com/skanehira/gorillasay
![](https://camo.githubusercontent.com/99f06e7e79533e127ad59a9f3be6a9fa4fa795d5/68747470733a2f2f696d6775722e636f6d2f5a70776235756a2e706e67)
## 使い方
`gorillasay`に引数を渡すだけです。
スペースで改行されるので、改行したくない場合は`”`で囲ってあげてください。## 使いみち
ぱっと思いつかないのですが、`CI`とかに組み込むと楽しいかなと思います。
embeded使い方【golang】
# embeded
– golangで継承のようなことをしたいときに使うembeded
– イマイチ理解できなかったのでまとめました。
– Javaなどのオブジェクト指向言語の継承と同じ使い方をすると`スーパークラスとして初期化する際のエラー`や`オーバーライドできない`などの問題が発生する
– ※キャプチャと本記事のコードとで初期化時の値が異なることがありますが本質的なところは変わらないのでご了承ください。# embededの例
– まずは構造体に何らかのメソッドを持たせる
– Employees(従業員)とBoss(上司)にしてみる“`go:main.go
type Employees struct {
name string
}func newEmployees(n string) *Employees {
e := new(Employees)
e.name = n
return e
}func (e *Employees) Hello() string {
return “名前:” + e.name // >>
}
golintのcliの実装を読んでみる
Goでのプログラミングに欠かせない静的解析ツールgolintのソースコードリーディングをしてみました
リポジトリ: https://github.com/golang/lint
(2020/3/1 時点)# ディレクトリ構成
“`
.
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── go.mod
├── go.sum
├── golint
│ ├── golint.go
│ ├── import.go
│ └── importcomment.go
├── lint.go
├── lint_test.go
├── misc/
└── testdata/
“`パッケージが、ルートディレクトリ直下の**lint**パッケージとgolint/以下の**main**パッケージの2つに分かれています
– lint.go
静的解析のロジックはここに書かれています– golint/golint.go
cliツールの実装が書かれています– golint/import.go
golint.goで使う補助関数が書かれてい
データ分析基盤構築入門 サンプルアプリエラー
[データ分析基盤構築入門](https://amzn.to/2TaD1oC)のサンプルアプリケーションを、Dockerで立ち上げる際にエラーが出て、うまく立ち上がらなかったので、色々ソリューションを試しました。
その中で、2020/3/1現在のソリューションを書きます。
## エラー内容
“`shell
$ docker-compose up –build
“`dockerでelasticsearch fluentd goアプリケーションを立ち上げると、fluentdコンテナの立ち上げでエラーが出ます。
## ソリューション
### 1.fluentdのtd-agent-gemのバージョンをあげる。`blog-sample/Dockerfile-fluentd`の中身を以下のように変更します。
“`
FROM debian:jessieENV DEBIAN_FRONTEND=noninteractive
RUN apt-get -qq update && apt-get install –no-install-recommends -y curl c
Kotlin vs Go 処理時間を比較してみる
#1. はじめ
最近はどこもかしこもGoばっかり!
SE(笑)で化石のようなJavaを扱った経験を持つ人間としてはKotlinの方がしっくりくるのですが、なんだか肩身が狭いです。そこで今回はGoとKotlinで同じようなコードを書いてみて処理時間という点でどれだけ差があるか実験してみました。
#2. 内容
・Kotlinはコンパイラでjarにした後、Amazon Corretto8のランタイムで動かす
・Goは公式でリリースされてる最新のものを使用(Go 1.14)##1回目
・10万の要素を持つ配列に乱数で値をひたすら入れてみる
・とりあえずこれだけ“`main.kt
import kotlin.random.Randomfun main(args: Array
) { val startTime = System.currentTimeMillis()
var listData: Array
= Array(100000){it}
for (i in listData) {
listData[i
Open状態のファイルに対して、Linuxだとos.Renameに成功するが、Windowsだとエラーになる
# 環境情報
この記事は以下の環境で稼働確認を実施しました。
– Windows
– Microsoft Windows [Version 10.0.19041.84]
– go version go1.13.5 windows/amd64
– Linux
– Ubuntu 18.04 LTS (Bionic Beaver)
– go version go1.13.8 linux/amd64# 事象
Open状態のファイルに対して、`os.Rename`を呼び出すと、LinuxとWindowsでは結果が異なります。具体的にはLinuxでは`os.Rename`に成功しますが、Windowsではエラーになります。
以下はOpen状態のファイルに対して、`os.Rename`を利用するコマンドです。
“`go:main.go
package mainimport “os”
func main() {
fp, err := os.Open(“old.txt”)
if err != nil {
panic(err)
}
defe
GAE/Go(2nd Gen)でDatastoreモードのFirestoreとFirestoreを使う
# GAE/Goでのデータストア
GAE/GoでのデータストアはCloudSQLか、DatastoreモードのFirestore、Firestore、その他外部サービスを利用する方法が考えられます。(以前は、GAEのAPIにDatastoreがあったのですが、今は、[DatastoreモードのFirestoreを使う](https://cloud.google.com/appengine/docs/standard/go/using-cloud-datastore?hl=ja)ことになっているようです。)この記事では、DatastoreモードのFirestoreを使う方法と、Firestoreを使う方法をまとめておきます。## 本題に入る前の注意点
DatastoreモードのFirestoreを使うか、Firestoreを使うかは、GCPのプロジェクトでDatastoreを選択した時点で固定されてしまいますので注意してください。(興味本位でやっちゃうと、プロジェクトごと削除するしかなくなってしまう…)## DatastoreモードのFirestoreを使う。
Datastore
[Golang] sliceの重複処理を行う、array_unique関数みたいなものを作ってみた (解説付)
# はじめに
Go言語の標準に、PHPでいうところの、`array_unique`みたいな関数が見当たらず、関数にしてみたので共有します。
とはいえ、定番のmap式の重複処理を関数にしただけですが…笑初学者向けにしっかりめに解説してますので、ツッコミあれば、ぜひコメント欄に書いて頂けると嬉しいです!
# 今日のコード
## コピぺでそのまま使えるコード全文
“`golang
package main
import “fmt”func main(){
target := []string{“あ”, “い”, “う”, “あ”}unique := sliceUnique(target)
fmt.Println(unique) // -> [あ い う]
}func sliceUnique(target []string) (unique []string) {
m := map[string]bool{}for _, v := range target {
if !m[v] {
[Golang]slice内で特定の要素があるか調べる、contains関数を作ってみた(解説付)
# はじめに
Golangの標準パッケージで、PHPやJavaScriptでいうところの`contain`関数のようなものがなかったので、作ってみました。
気軽にコピペして使って頂けると嬉しいです。# 今回のコード
以下、今回共有したい本題です。
## コピペで使えるコード全文
“`golang
package main
import (
“fmt”
“reflect”
)func main(){
list := []uint64{1, 2, 3} // ここに対象のスライスを入れる
target := uint64(3) // ここに対象の要素を入れるresult, err := contains(target, list)
fmt.Println(result, err) // -> true
}func contains(target interface{}, list interface{}) (bool, error) {
switch list
Goのnet/httpの実装をちょっと読んでみる
# はじめに
Goは標準パッケージとしてHTTPサーバが組み込まれており、`net/http` パッケージを用いると簡単にHTTPサーバを動かすことができます。今回は `net/http` パッケージの一部(HTTPサーバの内容)の実装を読むことで、HTTPサーバが動く裏側をざっと見てみたいと思います。困ったら [公式ドキュメント](https://golang.org/pkg/net/http/) を見ましょう。
なお、読んでいるコード Go1.13 のものです。
# Doc
まずざっと公式ドキュメントに書いてあるサンプルとドキュメントを眺めて、仕様をおさらいしておきます。
## `type Handler`
> ハンドラはHTTPリクエストに対してレスポンスを返します。
>
> ServeHTTPはレスポンスヘッダーとデータをResponseWriterに書き込んでからreturnする必要があります。リクエストが終了したことを示すシグナルを返します。ServeHTTP呼び出しの完了後または完了と同時にResponseWriterを使用したり、Request.Bodyを読
Adafruit Trinket M0でTinyGo
#はじめに
Goで組み込み向けプログラミングができるTinyGoが盛り上がってきているようなので試してみた。
今回実行したのはAdafruit Trinket M0の搭載LEDを利用したLチカ。
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0#セットアップ
###Go
“`
$ brew update
$ brew install go
“`
###TinyGo
“`
$ brew tap tinygo-org/tools
$ brew install tinygo
$ brew tap osx-cross/avr
$ brew install avr-gcc avrdude
$ go get -u tinygo.org/x/drivers
“`
###BOSSA
[BOSSA](https://github.com/shumatech/BOSSA/releases)からMAC用パッケージをダウンロードしてインストール
#実行コード
“`go:main.
サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする v2
以前書いた記事がGoのアップデートと共にゴミ記事と化したので別アプローチを記録
[サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする](https://qiita.com/matopenKW/items/d1798a2f60bffdf719a8)結論から言うとgovendorをやめて、go modulesを使用する
#Goでアプリケーションを作成
Goアプリケーションの作り方は前回の作り方とほぼ同じ“`:main.go
package mainimport (
“github.com/gin-gonic/gin”
)type User struct {
Name string
Age int
}func main() {
router := gin.Default()
// css、js などの静的ファイルを読み込む場合。今回は使用しない。
// router.Static(“/assets”, “./assets”)router.LoadHTMLGlob(“templates/*.html”)
router.
govendorで依存関係のファイルが取得できないエラーについて
以前、govendorを使用してHerokuにデプロイするやり方を記事にしました。
[サードパッケージを使用したGoのアプリケーションをHerokuにデプロイする](https://qiita.com/matopenKW/items/d1798a2f60bffdf719a8)12月くらいにまたHerokuにアプリケーションをデプロイしようとした時にエラーが起きた。
書いた記事が1ヶ月でゴミ記事と化した…## 事象
とりまHerokuのエラーログ抜粋“`
remote: —–> Fetching any unsaved dependencies (govendor sync)
remote: —–> Running: go install -v -tags heroku .
remote: vendor/github.com/gin-gonic/gin/binding/default_validator.go:11:2: cannot find package “github.com/go-playground/validator/v10” in any
goenvでGolangのバージョン管理(最新版のGolangを使う)
`golang` を使った開発のため、バージョン管理を導入したときの手順を書きます。
## goenv について
**goenv** は Golang のバージョン管理ツールです。
https://github.com/syndbg/goenv
pyenv や rbenv など、他のバージョン管理ツールと同じようなものです。
## 環境情報
* macOS Catalina 10.15.3
* zsh 5.7.1 (x86_64-apple-darwin19.0)## goenv インストール
goenv のソースをリポジトリから取得する。
“`console:zsh
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
“`次は bash の場合 `.bashrc`、zsh の場合 `.zshrc` の設定をしていきます。
## goenv パス設定
`goenv` を使うためのパスを通します。
### .zshrc
“`.zshrc:.zshrc
…
export GOENV