- 1. AtCoder Beginner Contest 195 ~Goの練習~
- 2. go-cmpでpanicがおきたら
- 3. Pythonしか知らない人がGoに入門した時モジュール管理がわからんかった
- 4. 【GO言語】Twitterで自動いいねbotの作り方
- 5. 今更Qラーニングを学習する
- 6. 【tmux】smugを利用したワークフロー管理及び自動化
- 7. 【Go】fmt.Printfには改行を入れよう
- 8. AtCoder Beginner Contest 196 ~Goの練習~
- 9. 【Go】入門(メソッドとレシーバ)
- 10. ebitenで画像の表示を関数化する
- 11. ホットリロードツールの作り方(GoCon 2021 Spring)
- 12. Rubyから始めるGo ~ 文法 ~
- 13. 【Golang】空の rune をセットする(はたまた rune の初期化)
- 14. gormとタグの指定
- 15. Golang で enum 。 enum に多様な属性や振る舞いを効率よく実装したい。
- 16. AtCoder Beginner Contest 197 ~Goの練習~
- 17. Google Cloud Storage を使用した分散ロックはどのように実装されているのか?
- 18. Cloud Tasks API は context に設定したタイムアウトが 30 秒より大きいとエラーになる
- 19. [Go] YAMLファイルを埋め込み構造体に読み込む
- 20. AtCoder Beginner Contest 198 ~Goの練習~
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/
ホットリロードツールの作り方(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
gormとタグの指定
# 概要
Go言語にて、gormを利用してみました。
構造体を利用してORマッピングを行うことができます。gormでのモデルの宣言は以下。
“` golang
import (
“gorm.io/gorm”
)type User struct {
gorm.Model
Name string
}
“`gorm.Modelをフィールドに持つことで、自動的に
“`created_at“`,“`updated_at“`,“`deleted_at“`,“`id“`フィールドを付与してくれます。この場合、主キーは自動的に“`id“`になります。## タグでの指定
データベースの構造に対応して、各フィールドの設定を変更したい場合、タグを利用します。“` golang
type User struct {
gorm.Model
ID int `gorm:”column:_id”`
Name string `gorm:”primaryKey column:user_name”`
Golang で enum 。 enum に多様な属性や振る舞いを効率よく実装したい。
https://qiita.com/ikngtty/items/ad135599a2f92e6035fa
https://qiita.com/kyoh86/items/18b8bfc6ffe045aaf380
自分だったらどうするかな、というのを書いてみました。2つ目の記事でも指摘されているような Switch 文はたしかに書きたくないので、配列のインデックスアクセスにする方法を採用しています。
個人的には `enum` は固有の情報を色々持てるのが嬉しいので、単に「分かりやすい文字列で識別できればいい」というわけではないんですよね。以下の例でも
– 日本語での表現
– 英語での表現
– 次の季節が何か
– 前の季節は何か
– めぐる季節の順序判定などの機能が `enum` の値に応じてちゃんと挙動を変えて動いてくれるようになっています。
### 使い方:
“`go
hoge := enum.SeasonValueOf(“ほげ”)
fmt.Printf(“‘ほげ’ は ‘%s’ の季節です。\n”, hoge.Ja())fmt.Println(“—-
AtCoder Beginner Contest 197 ~Goの練習~
# [A問題](https://atcoder.jp/contests/abc197/tasks/abc197_a)
## 考察
文字列の二文字目以降をスライシングし、その後ろに文字列の一文字目を付け足して実装する。
## 文法
実装時にGoでは2通りのパターンが生まれると思う。
1パターン目は`s[1:]+string(s[0])`とする場合。Pythonの場合は一文字を切り出してもstringなので、このような書き方をすると思う。
2パターン目は`s[1:]+s[:1]`とする場合。文字列のスライシングではstring型のままなので、明示的な型変換の必要のないこちらを競プロでは採用するべきだと思う。
“`go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()// code
var s string
Google Cloud Storage を使用した分散ロックはどのように実装されているのか?
次の記事を読んでどのように実装しているのだろうと疑問に思い調べた結果を残しておきます。
https://cloud.google.com/blog/ja/products/storage-data-transfer/implementing-leader-election-google-cloud-storage
以下、本文中では Google Cloud Storage を GCS と表記しています。
## 調査対象
軽く調べたところ冒頭の記事で紹介されていた [hashicorp/vault](https://github.com/hashicorp/vault) 内のパッケージ以外にも類似機能を提供している OSS があったのでそちらも調べてみました。
### mco-gh/gcslock
https://github.com/mco-gh/gcslock
Go で実装されたライブラリとコマンドですがシェルスクリプト実装も公開されています。
mco-gh/gcslock は GCS が備えている [世代番号と前提条件](https://cloud.google.c
Cloud Tasks API は context に設定したタイムアウトが 30 秒より大きいとエラーになる
[googleapis/google-cloud-go](https://github.com/googleapis/google-cloud-go) を使用して [Cloud Tasks API](https://cloud.google.com/tasks/docs/creating-appengine-tasks#go) の `CreateTask()` 実行したところ 30 秒より大きいタイムアウトは設定できないというエラーメッセージ (`The deadline cannot be more than 30s in the future.`) が返ってきたので調べてみました。
## 同じ問題に遭遇した例がないか探す
エラーメッセージで調べたところ次の Issue が見つかりました。
(クローズされていますが内容を見る限りでは未解決のままです)https://github.com/googleapis/google-cloud-go/issues/1577
個々のリクエストでタイムアウトを指定したつもりはなかったのですが context に設定したタイムアウトが 30
[Go] YAMLファイルを埋め込み構造体に読み込む
以前、Go言語でYAMLファイルを埋め込み構造体に読み込もうとした際に、JSONを読み込むのと同じように実装したらうまく読み込めなかったことがあった。
その時調べた内容をまとめておく。# 結論
このようなYAMLファイルがあった場合
“`yaml
# tmp.yaml
wheels: 4
tons: 10
“`下記のように構造体の埋め込みフィールドに`inline`タグをつけることで埋め込み構造体に読み込むことができる。
“`go
package mainimport (
“fmt”
“os”“gopkg.in/yaml.v2″
)type Car struct {
Wheels int `yaml:”wheels”`
}type Truck struct {
// 埋め込み のフィールドに ‘inline’ タグをつける
Car `yaml:”,inline”`
Tons int `yaml:”tons”`
}func main() {
truck := Truck{}
b, _ := os.ReadFile(“tmp.
AtCoder Beginner Contest 198 ~Goの練習~
# 感想
今回は時間がなかったので、内容があまり充実していません。
# [A問題](https://atcoder.jp/contests/abc198/tasks/abc198_a)
## 考察
$i,n-i$で$i \geqq 1$となるように配れば良いので、$n-1$通りが答え。これを出力する。
## 文法
特になし。
“`go
package mainimport (
“bufio”
“fmt”
“os”
)func main() {
scin := bufio.NewReader(os.Stdin)
prout := bufio.NewWriter(os.Stdout)
defer prout.Flush()// code
var n int
fmt.Fscan(scin, &n)
fmt.Fprintln(prout, n-1)
}“`
# [B問題](https://atcoder.jp/contests/abc198/tasks/abc198_b)
## 考察
本解説とは異なる方法。
左側に0を付け足すのでは