- 1. Golangで対話型CLIツールの作り方
- 2. Ruby微経験者がGo言語の基本的な文法を学んでみた
- 3. KEDA ScaledJob の Podが自動削除されなかった理由と対策
- 4. apollo federationをgqlgenで使う際にunable to bind to interfaceエラーが発生する
- 5. GoとDockerでLet’s try gRPC
- 6. 【Golang】 Go言語 ProducerとConsumerについて
- 7. apiにgo言語、フロントをreactの最小構成作った
- 8. Go×Qiita API×LambdaでTwitter Bot作った
- 9. 【Go言語】mux + cors + alice でサーバーを作成する時に注意すること。特にCORS周りでハマったことについて。
- 10. 【Golang】Go言語 channel(チャネル)について
- 11. 【Go】基本文法③ ポインタ
- 12. Go/GinでHTTPSサーバにする方法
- 13. Excelize 2.3.1 がリリース–スプレッドシート(Excel)ファイル用の Go ライブラリ、パスワードで保護されたスプレッドシートの読み取りをサポート
- 14. Googleマップで宝探し!たんけんぼくのかそうまちゲーム
- 15. Goの環境変数を扱う(viper)
- 16. AtCoder Chokudai Contest 005 参戦記
- 17. 【Go】基本文法② ステートメント
- 18. gRPCで使う.protoファイルの書き方まとめ
- 19. 【Golang】Go言語基礎 Goroutineとは?
- 20. Golang + Gin + Dockerのホットリロード、VSCodeデバッグ環境の構築
Golangで対話型CLIツールの作り方
golangで対話型のCLIツールを作成する。
コマンドを叩くと入力待ちの状態となり、
適切な値を入力するまで無限ループする。## 必要なパッケージ
– bufio
– os## サンプルコード
“`go
package mainimport (
“fmt”
“bufio”
“os”
)func main() {
fmt.Println(“stop と入力して下さい。”)
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
if scanner.Text() == “stop” {
break
}
fmt.Println(“stop と入力されるまでループします。”)
}
fmt.Println(“終了します。”)
}
“`
“`go
// このメソッドで入力待ちとなる
scanner.Scan()
“`
“`go
// 正常に入力値を受け取ると true を返す
val := scanner.Scan()
fmt.Println(val)
// => tr
Ruby微経験者がGo言語の基本的な文法を学んでみた
# 概要
Rubyを学習して半年たちたまには別言語を学びたいなと思いGoを少し触ってみました。
# RubyとGoの違い(FizzBuzz)
RubyでFizzBuzz問題をとく場合for,whileなど色々書き方がありますが今回はtimesメソッドで書きました。
“`fizzbuzz.rb
1..100.times do |i|
if i%15==0
puts “FizzBuzz”
elsif i%3==0
puts “Fizz”
elsif i%5==0
puts “Buzz”
else
puts i
end
end
“`Goで書いた場合は下記のようになりました。
“`fizzbuzz.go
package mainimport (
“fmt”
)func main() {
for i := 0; i < 100; i++ { if i%5 == 0 && i%3 == 0 { fmt.Println("Fizz Buzz")
KEDA ScaledJob の Podが自動削除されなかった理由と対策
KEDA の ScaledJobで、`successfulJobsHistoryLimit` で指定した個数以上になると、完了した Jobが削除されるようになるのだが、なぜか、Job で作成されたPodが削除されない。
“`go
func (e *scaleExecutor) deleteJobsWithHistoryLimit(logger logr.Logger, jobs []batchv1.Job, historyLimit int32) error {
if len(jobs) <= int(historyLimit) { return nil } deleteJobLength := len(jobs) - int(historyLimit) for _, j := range (jobs)[0:deleteJobLength] { err := e.client.Delete(context.TODO(), j.DeepCopyObject()) if err != nil { return err } logger.Info("R
apollo federationをgqlgenで使う際にunable to bind to interfaceエラーが発生する
マイクロサービス化のためにApollo Federationを使おうと思ってgqlgenで試していたところ、`go run github.com/99designs/gqlgen`で`unable to bind to interface`エラーが発生。
自分はgoの構造体をschemaにマッピングしていたのだが、そこでエラーが発生していました。
gqlgenのコードを見るとgoのstructにはやさないとinterfaceを満たせないようなので、以下のようにIsEntity()メソッドを追加したところ、エラーが出なくなった。“`
type User struct {
ID: int
Name: string
}func (m User) IsEntity() {}
“`
GoとDockerでLet’s try gRPC
**※ この記事は2019年11月7日に作成した [GoとDockerでLet’s try gRPC – LiBz Tech Blog](https://tech.libinc.co.jp/entry/2019/11/07/111548) と同じ内容です**
# はじめに
こんにちは!エンジニアの渡邊です。早いもので、11月でLiBに入社して丸1年がたちました。
このブログへの投稿も4回目になります。前回の「[とってもRailsライクなサーバーレスフレームワーク「Ruby on Jets」を本番環境に導入した話](https://tech.libinc.co.jp/entry/2019/07/12/113215)」では、jetsの開発者である**[tongueroo氏](https://twitter.com/tongueroo)**や、Rubyの生みの親**[まつもとゆきひろ氏](https://twitter.com/yukihiro_matz)**をはじめ、多くの方にシェアをしていただき大変励みになりました!
みなさんありがとうございました。今回はGoogleが開発した
【Golang】 Go言語 ProducerとConsumerについて
今日はGoのProducerとConsumerというものについて学習したのでそれについてアウトプットしていきます。
##前提知識
– Goの基礎文法
– チャネル
– Goroutineこのあたりの知識があると今回の記事は理解しやすいと思います。
分からない方はチャネルとGoroutineについては僕の方でも記事を書いているので良ければ参考にしてください!
[【Golang】Go言語 channel(チャネル)について](https://qiita.com/Kiyo_Karl2/items/94a269632725eb100cd0)
[【Golang】Go言語基礎 Goroutineとは?](https://qiita.com/Kiyo_Karl2/items/626502fa116881933aad)##Producer、Consumerとは?
まずは、以下の図をご覧下さい。
![スクリーンショット 2020-09-30 223000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6326
apiにgo言語、フロントをreactの最小構成作った
よくフロントをreact、apiをgo言語でアプリケーションを書くので最小構成のリポジトリ作った
https://github.com/kosukeKK/simple-react-golang-app
構成
“`
├docker-compose.yml
├Web/
│ ├Dockerfile
│ └app/
└api/
├Dockerfile
└main.go
“`“`
$ docker-compose up
“`
Go×Qiita API×LambdaでTwitter Bot作った
# はじめに
Goを勉強しているのですが、自分から情報を探しにいくと当たり前ですが自分が欲しい情報しか得られません。全体的な知識を広げていくには様々な記事を読んだりする必要があると思うのですが、なかなか腰が重い。
ということで、QiitaのGoタグがついた記事をツイートしてくれるTwitter Botを作成しました![@BotQiita](https://twitter.com/BotQiita)
↑フォローしてね。# アーキテクチャ
文章で説明してもわかるくらいの構成なのですが、アーキテクチャ図作ってみました。
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631794/f1a9c70e-9e61-fcb4-a3d8-228d77793753.png)– Qiita APIでGoタグがついた記事を取得
– Twitter APIで認証&ツイート
– lambdaはGoで書かれており、cloudwatchで1時間毎に定期実行といった感じになってます。
#
【Go言語】mux + cors + alice でサーバーを作成する時に注意すること。特にCORS周りでハマったことについて。
## はじめに
[gorilla/mux](https://github.com/gorilla/mux)、[rs/cors](https://github.com/rs/cors)、[justinas/alice](https://github.com/justinas/alice)を組み合わせてサーバーを作る方法を紹介します。特に、パスによって適用するミドルウェアを分けようとした時に、CORSでハマったので、そこに関わる部分を重点的に説明します。掲載するコード中では、基本的にエラーを無視する書き方なので、適宜書き換えてください。また、コード中の `…` は単純に省略を意味し、文法的な意味はありませんのでコピペする際は注意してください。
## tl;dr
プリフライトリクエストの `OPTIONS` メソッドに気をつけましょう。
## mux、cors、aliceの簡単な概要
いくつかの例を示しますが、それぞれのREADMEに書かれているような基本的な内容ですので、分かっている方は[実装本題](#実装本題)まで飛ばしてください。
### gorilla/mux
mu
【Golang】Go言語 channel(チャネル)について
##channelとは?
Goroutineは並行実行されているので、通常だとデータのやりとりができません。
しかし、channelというのををつかうとデータのやりとりができます。トンネルをつなぐようなイメージです!
“`golang
package main
import (
“fmt”
)func goroutine1(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
//チャネルにデータを送信
c <- sum } func main() { s := []int{1, 2, 3, 4} c := make(chan int) go goroutine1(s, c) //送られてきたデータを受信 p := <-c fmt.Println(p) // => 10
}
“`c <- sum でcに値を送信し、p := <-c で受信しています。ここでは受信するまでブロッキングされていて、pはsumを受信するまで待っている状態です。syn
【Go】基本文法③ ポインタ
udemy講座の「ポインタ」編を見終わったので、まとめとふりかえり。
今回もコンソール上に出力しながら基本的な動作を学習しました。
##前提
・udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発)](https://www.udemy.com/course/go-fintech/)を視聴してGoを学習中
※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用しています。・開発環境はVSCode + プラグイン(Goのバージョンは1.15)
・OSはWindows
・普段はJavaを使用しています。##ポインタ
・ポインタ型の変数を指定すると、メモリの中身を直接上書きできる。
・理解しにくい場合は、「&」「*」をつけて適当に動かしつつ理解すると良い。
・ポインタ型の生成時は、”make”ではなく”new”を使用する。“`go:
func one(x int) {
// main関数からは値だけを受け取る
fmt.Println(&x)
x = 1
}fun
Go/GinでHTTPSサーバにする方法
Go/GinでHTTPSサーバにする方法をGinのGithubから見つけたので、
メモ代わりに記載しておきます。[環境]
go version go1.15.2 darwin/amd64[参考URL]
https://github.com/gin-gonic/gin
README.md###HTTPサーバの場合
“`httpd.go
r := gin.Default()
r.GET(“/”, func(c *gin.Context) {
c.String(200, “Hello Gin!!”)
})
r.Run()
“`###HTTPSサーバの場合
“`httpd.go
r := gin.Default()
r.GET(“/”, func(c *gin.Context) {
c.String(200, “Hello Gin!!”)
})
r.RunTLS(“:8080”, “./testdata/server.pem”, “./testdata/server.key”)
“`上記のように、
「r.Run」を「r.RunTLS」に変更すれ
Excelize 2.3.1 がリリース–スプレッドシート(Excel)ファイル用の Go ライブラリ、パスワードで保護されたスプレッドシートの読み取りをサポート
[Excelize](https://github.com/xuri/excelize) は、ECMA-376 Office OpenXML 標準に基づいて Office Excel ドキュメントを操作するための Go 言語で書かれたクラスライブラリです。 XLSX ファイルの読み書きに使用できます。Excelize は、他のオープンソースライブラリと比較して、イメージ(テーブル)付きのドキュメントの作成、Excel へのイメージの挿入、および保存後のチャートスタイルの保存をサポートしており、さまざまなレポートシステムに適用できます。
場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント(テンプレート)に基づく新しい Excel
Googleマップで宝探し!たんけんぼくのかそうまちゲーム
前々から温めてたのに実装方法が思いつかなかったんだけど、ようやくプロト出来た!
# まえせつ
**自分の住んでいる町を迷路とかゲームのマップ**として簡単に使えたら、遊び方が広がらないかなって思ってて*OpenStreetMap→Blender*変換とかやってたけどうまくいかなくって。
で、とある日、ぼーっとGoogleマップ見てたら
“`
https://www.google.co.jp/maps/@35.6608375,139.7008749,3a,75y,43.91h,92.5t/data=!3m6!1e1!3m4!1sDrFpHa0VreQbapnpTC-QgA!2e0!7i16384!8i8192
“`あれ・・?この**URLの”@”の後って緯度経度**・・・?
### !!!!!!!!
こっからの実装へのブレークスルーは実に早かった。
# つくってみたわ
### 宝探しを通じて現実の町探検を仮想で楽しむゲームです。
![goToMap4.gif](https://qiita-image-store.s3.ap-northeast-1.amaz
Goの環境変数を扱う(viper)
# はじめに
golangで環境設定ファイルを簡単にするライブラリとしてviperというものがあります。
今回はそのviperの使い方を簡単に紹介します# viper
シンプルにviperを使ってみる
今回は構造体にマッピングしてそれを引き回して使うように実装を行います“` :ソースツリー
.
├── config
│ ├── config.yaml
│ └── definition.go
└── main.go
“`“`yaml:config.yaml
# 環境変数設定用のyamlファイル
user:
name: “kosuke”
“`
本来はデータベースのユーザー名等を入れることが多いですが、今回は簡単に上記のような環境変数を設定します。“`go:definition.go
package configimport (
“fmt”“github.com/spf13/viper”
)// マッピング用の構造体
type Config struct {
User User `yaml:user`
}type User
AtCoder Chokudai Contest 005 参戦記
# AtCoder Chokudai Contest 005 参戦記
参加しなくていいかなあと思いつつ、結局参加してしまうやつ.
結果は49,656,737点で、AC 528人中240位でした. 最終コードは以下で Go 言語で提出しました.
“`go
package mainimport (
“bufio”
“fmt”
“math”
“os”
“strconv”
)func min(x, y int) int {
if x < y { return x } return y } func fill(d [][]byte, i, j int, x, y byte) { q := [][2]int{{i, j}} for len(q) != 0 { m, n := q[0][0], q[0][1] q = q[1:] d[m][n] = x if m > 0 {
if d[m-1][n] == y {
q = append(q, [2]int{m – 1, n})
}
}
if m < N-1 {
【Go】基本文法② ステートメント
udemy講座の「ステートメント」編を見終わったので、まとめとふりかえり。
今回もコンソール上に出力しながら基本的な動作を学習しました。
##前提
・udemyで[現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発)](https://www.udemy.com/course/go-fintech/)を視聴してGoを学習中
※「ブログ等で数行のコードの紹介は可能」とのことなので、講義で扱ったコードを引用しています。・開発環境はVSCode + プラグイン(Goのバージョンは1.15)
・OSはWindows
・普段はJavaを使用しています。##if文・switch文
・書き方はjavaと似ている。
・if文で条件文に括弧をつけるとエラーになる。
(癖で括弧を記述しても、VSCodeが自動で括弧を取り除いてくれます。)##for文
・for文もjavaと同じ書き方でOK。
・”range”を使用するとより簡単に記述できる。
・”range”はmapでも使用可能。講座で出題された演習問題の自分の回答と解答例を比
gRPCで使う.protoファイルの書き方まとめ
– gRPCでは、Protocol Buffersのフォーマットでシリアライズしてデータのやり取りを行う。
– `.proto`ファイルにてスキーマ定義を行い、ツールを使ってコード生成ができる。そのため、クライアント・サーバーそれぞれでこの.protoファイルを共有できれば、仕様のズレなく開発をすすめることが可能。
– この記事では、.protoファイルの文法をざっとまとめてみる## サンプル全体
– [GitHub](https://github.com/captain-blue210/starting-gRPC/blob/main/proto/sample.proto)“`proto
// バージョン定義
syntax = “proto3”;// パッケージ定義
package sample;// import
import “google/protobuf/timestamp.proto”;
import “google/protobuf/duration.proto”;// サービスとRPCメソッド定義
service SampleService {
【Golang】Go言語基礎 Goroutineとは?
本日はgoroutineについて勉強しましたのでここでアウトプットさせて頂きます!
##Goroutineとは?
Goroutineとはgoステートメントで関数を指定することで、並行実行されるものです!まずは普通の関数を書いてみます。
“`go
package main
import (
“fmt”
“time”
)func goroutine(s string) {
for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func hoge(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { goroutine("world") hoge("hello") } ``` ``` 実行結果 world world world world world hello hello hel
Golang + Gin + Dockerのホットリロード、VSCodeデバッグ環境の構築
# 概要
Go言語のフレームワークGinの開発環境の構築。(ホットリロード、VSCodeデバッグ対応)今回のコードはGitHubに公開してあります。
https://github.com/yolo-lin/go-demo# 環境
– MacOS 10.15.6
– go version go1.15.2 darwin/amd64# 導入するパッケージ
[Gin](https://github.com/gin-gonic/gin):Goのフレームワーク
[cosmtrek/air](https://github.com/cosmtrek/air):ホットリロード
[delve](https://github.com/go-delve/delve):デバッグ# 事前準備
– Goのインストール:[公式](https://golang.org/)からインストール
– Go Modulesで依存関係を管理するため、環境変数GO111MODULEをonにする“`bash:.zshrc
export GO111MODULE=on
“`– Go Modulesの初期化