- 1. grpc(golang)ぷちメモ
- 2. 【Golang】「go.mod file not found」のエラー
- 3. 【Go言語】byte型ってなんだ
- 4. AtCoder Beginner Contest 210 復習
- 5. golangで始めるstate machine
- 6. メソッドをもっているかのtype assertion
- 7. ebitenでキャラクターが歩くモーションを作ってみる
- 8. AtCoder Beginner Contest 195 ~Goの練習~
- 9. go-cmpでpanicがおきたら
- 10. Pythonしか知らない人がGoに入門した時モジュール管理がわからんかった
- 11. 【GO言語】Twitterで自動いいねbotの作り方
- 12. 今更Qラーニングを学習する
- 13. 【tmux】smugを利用したワークフロー管理及び自動化
- 14. 【Go】fmt.Printfには改行を入れよう
- 15. AtCoder Beginner Contest 196 ~Goの練習~
- 16. 【Go】入門(メソッドとレシーバ)
- 17. ebitenで画像の表示を関数化する
- 18. ホットリロードツールの作り方(GoCon 2021 Spring)
- 19. Rubyから始めるGo ~ 文法 ~
- 20. 【Golang】空の rune をセットする(はたまた rune の初期化)
grpc(golang)ぷちメモ
## 背景
1秒間で複数のクライアントから10回以上パケットを送られ、それを全クライアントに打ち返すというような状態を想定した時、ちゃんとパフォーマンスが出るか気になり簡単な検証コードを書いて試したところ、一定時間経過後エラーが発生せず処理が止まってしまう現象に見舞われた## 検証コード
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/server/main.go
https://github.com/syanhaiD/envoy-grpc-prac/blob/verify_grpc/cmd/verify/client/main.go## 原因
`internal/transport` 下のコードを追っていくとざっくりつかめるが、
どうにもrecvされてないパケットはstreamにたまっていき、それの許容サイズは`defaultWriteQuota`までであり、
達してしまうとrecvされるなり無理矢理flushするなりで解放しない限り処理がブロックされる## つまり
クライアン
【Golang】「go.mod file not found」のエラー
「Go言語ハンズオン」という参考書のSection4-1をやっています。
## エラー内容
goバージョン 1.16.6“`sh:zsh
$ go run hello.go
hello.go:4:3: no required module provides package fyne.io/fyne/app: go.mod file not found in current directory or any parent directory; see ‘go help modules’
hello.go:5:3: no required module provides package fyne.io/fyne/widget: go.mod file not found in current directory or any parent directory; see ‘go help modules’
“`“`go:hello.go
package mainimport (
“fyne.
【Go言語】byte型ってなんだ
# byte型
Go言語ではファイルの読み込みの際に以下のように、byte型の配列やスライスを扱っていることがよくあります。“`golang
buf := make([]byte, 64)
for {
n, err := fp.Read(buf)
if n == 0 {
break
}
if err != nil {
panic(err)
}
}
“`そもそもbyte型とは何でしょうか。
`byte型`とは`uint8型`の別名です。
uint8型は8bit、つまり1バイト分の表現が可能です。(10進数では 0~255)
分かりやすさの点から、1バイトを単位として処理を行う際にuint8ではなく、byte型を行うという慣習がGo言語ではあると考えられます。|型|最小値|最大値|
|:-:|:-:|:-:|
|byte (uint8)|0|255|
|uint16|0|65535|# Go言語とUTF-8
Go言語では、文字型は
AtCoder Beginner Contest 210 復習
![IMG_83EFEFFF036C-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331393/5bdb97fe-404d-4fff-add3-47e51a5e0ea6.jpeg)
# 感想今日もコンテストに間に合わなかったので、ダラダラ解いていた。
Dの方針がすぐに思い浮かんだものの、実装に面倒さを感じて他のことに怠けてしまった。
この怠け癖を無くさないと、競技プログラミングだけでなく他のことでも大成できない気がする。
# [A問題](https://atcoder.jp/contests/abc210/tasks/abc210_a)
## 考察
$n$が$a$以下であるかで場合分けすれば良い。$a$以下の時は$n \times x$を出力し、$a$より大きいときは$a \times x+(n-a) \times y$を出力する。
“`go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
scin
golangで始めるstate machine
仕事でチャットボットを作る可能性があり、セリフ管理にstate machineが使えるかもということで、golang で state machineを触ってみました。
# state machine とは?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179800/b6ef245f-fa59-bb4a-5751-4e111a829f09.png)図のように、ある状態からある状態へ遷移するなどの構造を表したものです。
なので、現在のstate -> 遷移可能なstate -> 次のstateの情報をそれぞれのnodeが持つことになります。尚正式名称は finite state machine と呼ぶ、 state machine は省略形のようです。
# golangでのFSM
https://github.com/looplab/fsm
今回使ったライブラリは上のものです。## nodeの生成
“`go
const (
start = “start”
m
メソッドをもっているかのtype assertion
# Overview
Timeoutのエラーかどうか判別する等で使える。## ex)
“`go_, ok := err.(interface{ Timeout() bool })
if ok {
// ex) retry or something
}return error
“`
ebitenでキャラクターが歩くモーションを作ってみる
## はじめに
ゲームを作ろうと思ったら、やっぱりキャラクターに動きは必要ですよね。
とりあえず歩くモーションだけでも作りたいですよね。
私は作りたいので、作ってみました。## サンプルコードのanimationを見てみる
ebitenインストール→サンプルのanimationをみる→めっちゃヌルヌル動くやん。。。
まずはこのサンプルを解析しましょう。必要なところだけ抽出して解説します。
~~~go
const (
screenWidth = 320
screenHeight = 240frameOX = 0 // フレーム開始時点のX座標
frameOY = 32 // フレーム開始時点のY座標
frameWidth = 32 // 1フレームで表示する横幅
frameHeight = 32 // 1フレームで表示する縦幅
frameNum = 8 // 表示させる画像の数
)var (
// イメージの宣言(今回省略したmain関数の中で画像自体の読み込みをしています)
runnerImage *ebit
AtCoder Beginner Contest 195 ~Goの練習~
# [A問題](https://atcoder.jp/contests/abc195/tasks/abc195_a)
## 考察
$h$が$m$の倍数になるかを判定するには$h\%m$が0になるかを判定すれば良い。
“`go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()// code
var m, h int
fmt.Fscan(scin, &m, &h)
if h%m == 0 {
fmt.Fprintln(prout, “Yes”)
} else {
fmt.Fprintln(prout, “No”)
}
}
“`# [B問題](https://atcoder.jp/contests/abc195/tasks/abc195_b)
## 考察
みかんを$i$個選んだ時の重さは$A
go-cmpでpanicがおきたら
# 対処方法
“`go
package mainimport (
“fmt”“github.com/google/go-cmp/cmp”
“github.com/google/go-cmp/cmp/cmpopts”
)type Struct struct {
XXX int
xxx int
}func main() {
s1 := Struct{ 1, 1}
s2 := Struct{ 1, 2}opt := cmpopts.IgnoreUnexported(Struct{}) // ここ大事
fmt.Println(“Diff: “, cmp.Diff(s1, s2, opt))
}
“`
[PlayGroundで試す](https://play.golang.org/p/bSXVpa_XKnR)# もう少し詳しく
どうやら`go-cmp`は、プライベートな変数があるとパニックになってしまうらしい。
実はこのプライベートの取り扱い方でいくつかパターンが用意されている。+ [プライベート変数は一致しなくてよい場合](#プライベート変
Pythonしか知らない人がGoに入門した時モジュール管理がわからんかった
## 注意
この記事は 2021/03/16 にGoを始めたときに書いた記事です。
あとからもうちょい修正しようと思って寝かしてたんですが、結局直さなかったので
途中までになりますが、載せておきます。## Goはじめたい理由
噂によるとGoは動作が速いらしいので、PythonのFlaskで書いてたAPIをGoのEchoで置き換えたい。
大体それだけが理由です。()## 用意したもの
Windows 10
– Macは持っていないのでとりあえずPython 3.8.6 windows/amd64
– いつもよく使っているPythonくん
- 公式サイトからインストーラをダウンロードして実行しただけGo 1.15.6 windows/amd64
- 割と最近入れたGoくん
- 公式サイトからインストーラをダウンロードして実行しただけVSCode
– メインで使っているエディタ## まずはじめにしたこと
Go 入門 でググってみる。
すると [Go言語の初心者が見ると幸せになれる場所](https://qiita.com/tenntenn/ite
【GO言語】Twitterで自動いいねbotの作り方
久しぶりに投稿します。
今回はタイムラインに流れてくるツイートに対して、
自動いいねできるコードを作成したので、そのご紹介です。
1ヶ月くらいやるとフォローが減ったりします。####やったこと
・Go言語で自動いいねbotの作成####環境
・Go (version 1.158.8)
・WindowsServer2019
※実行方法はタスクスケジューラで定期実行してました。####実装
#####Twiter認証“`Twiter認証.go
import (
“github.com/ChimeraCoder/anaconda”
)
//Twitterの認証を行うメソッド
func GetTwitterApi() *anaconda.TwitterApi {
anaconda.SetConsumerKey(“XXXXXX”)
anaconda.SetConsumerSecret(“XXXXXXXX”)
api := anaconda.NewTwitterApi(“XXXXXX”, “XXXXXXXX”)
return a
今更Qラーニングを学習する
## 公開もしてないのに移転しました
https://zenn.dev/ttrsq/articles/83872e7fff4021
【tmux】smugを利用したワークフロー管理及び自動化
– 普段tmuxを利用して複数端末を起動した状態で作業することが多い。
– 非常に便利だが、以下の点を解消するべく調査。
– 定型作業の自動化
– 同様のサーバー接続や複数画面分割等の定型的なtmuxワークフローの手間。
– プロジェクトや作業単位での管理
– 日々行なっている複数作業の内容の把握が難航。
– 調査の結果、複数の類似プロジェクトがあるが比較的導入が容易であろうsmugというツールがあったため、今回は利用方法を記録する。## 概要
– Go製のtmuxワークフロー管理ツール
– ウィンドウやペイン分割数、起動コマンド等の単一のファイル(yaml)で管理可能。
– 同様のツールにRuby製の[tmuxinator](https://github.com/tmuxinator/tmuxinator)がある。
– [Github](https://github.com/ivaaaan/smug)## 結果
– 以下のように単一の構成ファイルを作成して、単一のコマンドでペインの分割や起動時のコマンドを管理することが可能。
【Go】fmt.Printfには改行を入れよう
##概要
先日、db周りの変数を調べるためにfmt.Printfを使って確認していたらfmt.Printfの中身が出力されなくなったので、自分の解決方法を書いておきます。
##解決方法“`go:main.go
fmt.Printf(“hoge変数の中身=%v”,hoge)//これを
fmt.Printf(“hoge変数の中身=%v\n”,hoge)//こうする(\nを付ける)
“`初歩的な事だとは思いますが改行とともに何の変数かがわかる文字列も一緒に出力すると分かりやすくていいと思います。
AtCoder Beginner Contest 196 ~Goの練習~
# [A問題](https://atcoder.jp/contests/abc196/tasks/abc196_a)
## 考察
$x$の最大値から$y$の最小値を引けばよく、$b-c$を出力するのみ。
## コード
“`go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()// code
var a, b, c, d int
fmt.Fscan(scin, &a, &b)
fmt.Fscan(scin, &c, &d)
fmt.Fprintln(prout, b-c)
}
“`# [B問題](https://atcoder.jp/contests/abc196/tasks/abc196_b)
## 考察
浮動小数点数であってもおそらく表現できないので、文字列として扱えば良い。
以下では、`.`
【Go】入門(メソッドとレシーバ)
# はじめに
Go初心者です。
メソッドとレシーバについてまとめてみました。# メソッド / レシーバとは
メソッドとはレシーバに呼び出される関数のこと。
レシーバとはメソッドを呼び出す側のオブジェクトのこと。以下のコードだと、
(p Person)がレシーバで、 Greet()がメソッド。“`golang
type Person struct {
Name string
}func (p Person) Greet() string {
return “Hi, ” + p.Name
}
“`# メソッドを使ってみる
メソッドはレシーバで定義した構造体の変数から呼ぶことができる。
下の例では、Person型の変数personが、Greetメソッドを呼んでいる。“`golang
type Person struct {
Name string
}func (p Person) Greet() string {
return “Hi, ” + p.Name
}func main() {
person := Person{Name: “hog
ebitenで画像の表示を関数化する
## はじめに
先日、この[ゲームエンジンはアートである](https://note.com/hajimehoshi/n/nc09751f2dbf9)という記事を読んで、go言語のことやebitenの設計思想を見ているうちに「これは自分に合ってるかもしれない!」と強く思い手を出してみた。しかしebitenはじめgo言語は触ったことがなく、とりあえず学習として画像の表示を関数化することを目標にした。## ebitenとは?
go言語で作られた汎用2Dゲームエンジンで、設計思想にある「ミニマムな API で実用的な 2D ゲームが作れるかどうか」の部分で、RigidChipsをやっていた頃を思い出し、今回手を出してみることにしました。## インストールとかチュートリアル
公式がとてもよくわかりやすいのでまずは[こちら](https://ebiten.org/)へ## サンプルの画像が回転するやつのソースコードを見てみる
公式の[ソースコード](https://github.com/hajimehoshi/ebiten/blob/main/examples/rotate/ma
ホットリロードツールの作り方(GoCon 2021 Spring)
http://makiuchi-d.github.io/2021/06/13/gocon2021spring-hotreload-tool.ja.html
Rubyから始めるGo ~ 文法 ~
# はじめに
Rubyを知っている状態で、Goを勉強してみました。
GoはGoogleが開発したプログラミング言語で実行速度が速いのが持ち味らしいです。
# バージョン
| Ruby | Go |
| :—- | :—– |
| 2.7.1 | 1.16.5 |# 基本形
“`go:main.go
package mainimport “fmt” // コンソールに出力する用のパッケージ
func main() {
// コンソールに出力
fmt.Println(“Hello World”)
}
“`# Rubyで解釈
## 変数定義(例:文字列型)
“`ruby:ruby
message = “Hello World”
“`“`go:go
// 通常系
var message string = “Hello World”
// 省略形 その1
var message = “Hello World 2”
// 省略形 その2
message := “Hello World 3”
“`### 論理値型
【Golang】空の rune をセットする(はたまた rune の初期化)
> 空のルーン文字を返したいが、返り血をあびるし、戻り値で吐血する
“`golang:””で切り返すと返り血をあびる
func Foo() (rune, error) {
err := errors.New(“my error”)return “”, err
}
// Output: cannot use “” (untyped string constant) as rune value in return statement
“`
“`golang:new()で戻すと吐血する
func Bar() (rune, error) {
err := errors.New(“my error”)return new(rune), err
}
// Output: cannot use new(rune) (value of type *rune) as rune value in return statement
“`
“`golang:nilても焼いても食えない
func Buzz() (rune, error) {
err := errors.New(“m