- 1. やっぱギャンブルはやべぇなってことを学ぶためにコイントスを作るなど
- 2. [Go] fmt.Scanのように使えて、fmt.Scanより高速な関数(競プロ向け)
- 3. logパッケージの定数を出力する
- 4. Go言語向けNCMB SDKの使い方(配列の追加・削除操作)
- 5. [Go] Go言語で簡単なじゃんけんプログラムを作成してみよう!(初心者向け)
- 6. Goのホットリロードツール (Air) で変更反映時のtcpポート競合を回避する方法
- 7. CARTA HOLDINGS の秋季インターンシップ【Sunrise】に参加してきた話
- 8. [GCP] Workflows機能x実装
- 9. GoでFizzBuzz
- 10. Go言語で高速JSONライブラリをメモリ安全にしたらさらに速くなった話
- 11. GoでWebアプリケーションを作る(8)ーテスト
- 12. [Go] defer, panic, recover 簡単整理 (備忘録)
- 13. Argocdのapiserverをvscodeでデバッグしてブレークポイントをヒットさせる
- 14. Go言語でバックエンドサーバーを作成する
- 15. Golangデザインパターン入門:インターフェース継承とチャネル並行処理
- 16. Discord Bot作成を完全に理解する
- 17. GoでWebアプリケーションを作る(7)ーWebアプリケーション
- 18. [MAC OS]VSCodeでGolangの環境構築してHelloWorld出力までの記録
- 19. Go言語+WindowsTerminalで「ブロック崩し」を作ろうと挑戦したが四苦八苦[termbox-goは未使用]
- 20. gormでtime.Time型を使用する
やっぱギャンブルはやべぇなってことを学ぶためにコイントスを作るなど
# こんな記事を見かけた
https://gigazine.net/news/20230812-ergodicity-breaking-peters-coin-toss/>「ピータースのコイントス」は「大勢の参加者の平均」を求めると必ずプラスになる賭け事に見えるのに、実際に何度も挑むと大敗を喫することになる魔のコインゲームです。
コイントスはコインを投げて裏が出るか表が出るかで賭ける運ゲーです。
ピーターのコイントスは、特定の条件の状態ではコイントスを繰り返せば損をする確率が上がるというアルゴリズムだそうです。この記事ではコイントスを何度も繰り返して行い統計を出すツールが紹介されていますが、実際に投げてみて体感できるページは貼られていないように見受けられました…
おあー…
## やってみたいな
ということで実際にピーターと同じ条件でコイントスを投げてみるコマンドツールをGoで作ってみました。
## 作戦
Goで作るところまで決まったのでざっくり目標を立てて、どういったコードにするかを考えていきます。
今回はこんな感じで考えてみました。目標:ピータ
[Go] fmt.Scanのように使えて、fmt.Scanより高速な関数(競プロ向け)
fmt.Scanは遅いので、大量のデータを標準入力から受け取るには不向き。
競プロだと、fmt.Scanしているだけで実行時間の上限をオーバーしてしまう。fmt.Scanのように使えて、fmt.Scanより高速なScan関数を定義してみた。
## コード
“`go
var sc = bufio.NewScanner(os.Stdin)func init() {
sc.Split(bufio.ScanWords)
}func Scan(a …any) {
for _, arg := range a {
sc.Scan()
switch v := arg.(type) {
case *int:
n, err := strconv.Atoi(sc.Text())
if err != nil {
panic(err)
}
*v = n
case *int32:
n, err := strconv.Atoi(sc.Text())
if err != nil {
panic(err)
}
*v
logパッケージの定数を出力する
“`go:main.go
package mainimport (
“log”
)func main() { // 出力は10進数 //2進数に直すと
log.Print(log.Ldate) // 1 // 1
log.Print(log.Ltime) // 2 // 10
log.Print(log.LstdFlags) // 3 Ldate | Ltime // 11
log.Print(log.Lmicroseconds) // 4 // 100
log.Print(log.Llongfile) // 8 // 1000
log.Print(log.Lshortfile) // 16 /
Go言語向けNCMB SDKの使い方(配列の追加・削除操作)
NCMBはモバイル向けのBaaS(mobile Backend as a Service)ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。
そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります(すべて公式サポート対象外の、コミュニティSDKという位置づけです)。
新しくGo言語向けのSDK開発をはじめたので、その使い方を紹介します。今回はデータストアの配列フィールドに対する要素追加・削除の処理について解説します。
## ソースコード
ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。
[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)
## インストール
SDKのインストールは下記コマンドで行います。
“`bash
go get -u github.com/NCMBMania/ncmb_go
“`## インポート
続けてSDKをインポート
[Go] Go言語で簡単なじゃんけんプログラムを作成してみよう!(初心者向け)
## この記事の目的
Go言語に興味がある初学者の方が簡易なじゃんけんプログラムを理解することができる## 何はともあれまずはコードを確認してみましょう!
“`main.go
package mainimport (
“fmt”
“math/rand”
“time”
)func main() {
rand.Seed(time.Now().UnixNano())
userChoice := getUserChoice()
computerChoice := getComputerChoice()
result := determineWinner(userChoice, computerChoice)
displayResult(userChoice, computerChoice, result)
}func getUserChoice() string {
var choice string
fmt.Println(“じゃんけんを始めます!”)
fmt.Println(“1:
Goのホットリロードツール (Air) で変更反映時のtcpポート競合を回避する方法
# 環境
Docker: 4.20.1
Nginx: 1.23
Air: 1.45.0## 記事の要約
Goのホットリロードツール(Air)による再実行時にtcpポート競合が起きてしまっていた問題を**Airの設定ファイル**を修正することで解決したという記事。## 前提
– Dockerについてある程度知っている
– Docker環境でのAirの導入は既に出来ている# 目次
– [背景](#背景)
– [問題](#問題)
– [解決](#解決)
– [終わりに](#終わりに)# 背景
Goは(RubyやPHPとは異なり)コンパイル言語であるため、実行中のアプリケーションのソースコードへの変更を反映させるためには**実行停止+コンパイル+実行**を毎回行う必要がある。
これは明らかに面倒だし効率が悪すぎるということで、この辺りの不満を解決してくれるホットリロードという機能が提供されている(GoではAirというモジュールが主流らしい)。# 問題
Go言語での開発においてソースコードを書き換えを勝手に検知してbuild+再実行をしてくれるAirであるが、
`
CARTA HOLDINGS の秋季インターンシップ【Sunrise】に参加してきた話
CARTA HOLDINGS の秋季インターンシップ 【Sunrise】 に参加してきました!
![PXL_20230912_035503570.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/3720eedb-4361-70f6-4fb7-afffc9ba1cf0.jpeg)
![PXL_20230912_004727084.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3143089/21f2a69c-b87c-c48c-a04f-98da7583b8c0.jpeg)インターンを振り返りつつ行ったことや感想などをまとめます!
# インターン概要
5日間の対面インターンで、イベント計測サーバーを秒間30,000リクエスト捌けるように、インフラ・Golangアプリの両方からパフォーマンスチューニングを行うという内容でした。
4人1組でチームを組み、そこに技術メンターと人事メンターの2名(私たちの
[GCP] Workflows機能x実装
# GCPのWorkflowsについて
GCPのWorkflowsは、タスクの実行と制御のための単純で柔軟な実行環境です。このサービスを使用することで、異なるサービスやAPIの呼び出しや、条件に基づいた制御フローの定義が可能。
## 機能
### 1. ワークフローの定義と制御
GCPのWorkflowsでは、YAML形式でワークフローを定義することができる。この定義には、各タスクの手順と条件、依存関係などを設定する。また、複数のタスクを直列に実行したり、並行して実行したりすることもできる。
### 2. サードパーティのAPIとの連携
Workflowsは、様々なサードパーティのAPIとの連携をサポートしている。RESTやgRPCで公開されたAPIを使用する場合、タスクとして呼び出しを追加することができる。また、自動的に再試行やエラーハンドリングを行ってくれるため、信頼性の高いAPI呼び出しを簡単に実現することができる。
### 3. 高度な制御フロー
Workflowsでは、条件に基づいた処理や反復処理を簡単に定義することができる。たとえば、ある条件が成立した場合の
GoでFizzBuzz
### FizzBuzzとは
数列を1つずつ表示する。ただし3で割れる数が来たら「Fizz」
5で割れる数が来たら「Buzz」。3でも5でも割れる数が来たら「FizzBuzz」と表示する### ソースコード
“`
package mainimport “fmt”
func main() {
for i := 1; i <= 20; i++ { if i%3 == 0 && i%5 == 0 { fmt.Println("FizzBuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } } ``` 有名すぎて何度もやってるけど違う言語で初めて書くと改めて楽しい。
Go言語で高速JSONライブラリをメモリ安全にしたらさらに速くなった話
## はじめに
こんにちは。Sugawara Yuutaです。”Go言語で最速のJSONデコーダーを作った話”, “それでも僕はGoで最速のJSONデコーダーを作りたかった”…以来の方はまた読んでいただきありがとうございます。まだの方は、経緯を伝えやすくなると思うので、そちらの方も読んでいただけたら幸いです。
https://qiita.com/sugawarayuuta/items/526b34547bf6ca53535a
https://qiita.com/sugawarayuuta/items/a4135dd49d28e9baf2dc## その後
Go言語チームのメンバーが取り組んでいる新しいバージョンのJSONライブラリである[go-json-experiment/json](https://github.com/go-json-experiment/json)というレポジトリを発見しました。(厳密に言うと、知ってはいたのですが中身等は見ていない状態でした。) そこで学んだことが少しでも役に立てばとissueを提出したところ、そのときのJSONデコーダーに足りないも
GoでWebアプリケーションを作る(8)ーテスト
こんにちは。
今日は「テスト」についてです。
これまで作り上げてきたGyudon型にテストを追加してもらいます。
# Go言語でのテストのやり方
Go言語にはテストをサポートする標準パッケージ [testing](https://pkg.go.dev/testing)があります。 そのためなにかテストフレームワークを使うのではなく、標準のライブラリを使用してテストを行うケースが多いです。
テストは以下のコマンドだけで実行できます。 `./…`でカレントディレクトリ以下のすべてのファイルが対象となります。
“`go
$ go test ./…
“``<機能>.go`というファイルがある時、テストは`<機能>_test.go`という名前のファイルに記述していきます。
テストの関数は下のような書き出しで始めます。
“`go
func Test<テスト名>(*testing.T)
“`このような関数のテストを書くときを考えます。
“`go
func IsTopping(food string)bool{
switch food {
cas
[Go] defer, panic, recover 簡単整理 (備忘録)
> 記事の内容は間違いがあり得ますので、ご了承いただけると幸いです。内容の間違い、認識の違い、違う意見などありましたら、コメント大歓迎です!
# defer
deferとして定義した構文や関数をStackに保持しておき、現在の関数処理の終了とともにPOPされて実行する
### Example
“`go
package mainimport “fmt”
func main() {
fmt.Println(“Main func start”) // 1
defer func() { fmt.Println(“First defer”) }() // 4
defer func() { fmt.Println(“Second defer”) }() // 3
fmt.Println(“Main func end”) // 2
}
“`### Result
“`
Main func start
Main func end
Second defer
First defer
“`# panic
現在の関数処理を止めて、Stackに登録
Argocdのapiserverをvscodeでデバッグしてブレークポイントをヒットさせる
# モチベーション
1.Argocdのapiserverの動きを読んでバグフィックスしコントリビュートしたいため。
2.https://github.com/KouWakai/argo-cd/pull/2
のプルリクをあげる際にbadgeの動作を確認したかったため。# 概要
公式ではtelepresenseを使った方法などありますが、準備も大変で結構複雑です。
apiserverをvscodeで動かすだけならお手軽でまずはとりかかりにapiserverのみをデバッグする方法をメモっておきます。やることとしては、Argocdのプロセスはgoremanで実行されています。そのうちapiserverのプロセスをvscodeで実行してデバッグします。
一応make stat-local BIN_MODE=trueでサービスを起動してvscodeでローカルプロセスにアタッチする形でデバッグもできますがコードの反映する際に都度make build-localしないといけないのが手間です。
そのためvsocdeでgo run ./cmd/main.goを使ってapiserverを起動する方
Go言語でバックエンドサーバーを作成する
## やりたいこと
Go言語を使用して簡易的なバックエンドサーバーを作成します。“`Go:main.go
package mainimport (
“fmt”
“net/http”
)var count int
func main() {
// ハンドラを登録
http.HandleFunc(“/”, hanlder)
http.HandleFunc(“/get”, countHanlder)// サーバーを起動
http.ListenAndServe(“:8080”, nil)
}// lcoalhost:8080/で呼び出されるハンドラ
func hanlder(w http.ResponseWriter, _ *http.Request) {
count++
fmt.Fprintln(w, count)
}// lcoalhost:8080/getで呼び出されるハンドラ
func countHanlder(w http.ResponseWriter, _ *http.Request) {
fmt.Fprintln(w,
Golangデザインパターン入門:インターフェース継承とチャネル並行処理
Golangが伝統的なオブジェクト指向言語ではないことはよく知られていますが、
他の方法で実装することができます。例として、入室と退室の操作があるシステムを想定してみましょう。
まず、StudentとTeacherの2つのオブジェクト(Golangでは構造体)を定義します。
これらはID、Name、ClassInfoという属性を持っています。
“`
type ClassInfo struct {
Class int
No int
}type Student struct {
Class ClassInfo
Name string
id int
}type Teacher struct {
Class ClassInfo
Name string
id int
}
“`
それから、入室と退室のメソッドを書きます。“`
func (stu Student) inRoom() {
fmt.Println(stu.Name, “student in room”)
ch <- stu.Name } func (stu Studen
Discord Bot作成を完全に理解する
## 1. はじめに
この記事は下記と同じものです。
https://zenn.dev/king/articles/4201f4ee821a27
Discord Bot は SDK を使用することで簡単に作成することが可能です。
テキストでのメッセージの送信はもちろん、埋め込み、音声メッセージなど Discord Bot で表現できることの幅は広くなっています。
今回は新たに Discord Bot を作成する上で Discord Bot で表現できること、および運用する上での注意点を紹介します。本記事の内容は`Go(v1.20)とdiscordgo(v0.27.1)`を使用し作成しています。
また記事内の内容は章ごとに独立しているので、必要に応じて目次から参照してください。### 対象読者
– Discord Bot で何ができるかよくわからない人
– Discord Bot を作成したい人
– Discord Bot の運用について知りたい人## 2. Discord Bot で表現できるメッセージの種類
### 2.1. テキストメッセージ
– 基本的
GoでWebアプリケーションを作る(7)ーWebアプリケーション
こんにちは。
今日は「Webアプリケーション」についてです。
これまで順番に作り上げてきたGyudon型をWebアプリケーションサーバとして起動する方法を確認してもらいます。
本章までを通して、Go言語の基本的な扱い方を学習した皆さんには、最も簡単な章かもしれません。# 準備
複数のターミナルを用い、ハンズオンいただきます。
既存のコンテナに接続し利用するため、それぞれターミナルを起動し、以下コマンドを実行ください。
VSCodeをお使いの方はターミナルを追加で起動してください。“`terminal
:# TERMINAL 1
$ docker exec -it go-tutor /bin/bash:# TERMINAL 2
$ docker exec -it go-tutor /bin/bash
“`# httpを起動する方法
Go言語の標準パッケージ [net/http](https://pkg.go.dev/net/http)を活用するだけで起動します。
特に細かい処理に拘らず、デフォルト動作でWebアプリケーションサーバをコーディングするのであれば、
[MAC OS]VSCodeでGolangの環境構築してHelloWorld出力までの記録
## 初めに
今回はVSCodeでgo言語を使用して環境構築〜HelloWorldの出力までの方法を記載していきます。
割と備忘録的な感じになりますが、ご容赦ください。
※筆者ですが、普段はアプリエンジニアをしており、flutterやswiftを弄っていて、goの経験はないのでもし何か間違い等あればご指摘いただけると助かります。。
なお,筆者の環境ですが、以下の通りです。
cpu: **Apple M1**
os: **Monterey**
os version: **12.5**## 環境構築
まずはgoのダウンロードからです。
以下のURLからアクセスして、ご自身の環境似合った物をダウンロードしてください。
https://go.dev/dl/
ダウンロードできたら、macではターミナル、windowsではコマンドプロンプトを開きます。
“`
go version
“`と入力して確認します。
インストールされていたら、Goのバージョンが出力されます。
“`
go version go1.14.2 darwin/amd64
“`
※ダウンロー
Go言語+WindowsTerminalで「ブロック崩し」を作ろうと挑戦したが四苦八苦[termbox-goは未使用]
# 動作画面
![PowerShell-2023-09-18-00-45-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157498/924897a2-6555-6cc9-4fd7-bda33c87d146.gif)
## 説明
– 白棒(バー)は、[a]を押すと左方向、[s]を押すと右方向に動きます。
– ボールは、対角斜め(45度・135度・225度・315度)のみ動きます。
– スタート画面はないです。コンパイルすると、いきなりゲーム開始。
– ブロックを全部消しても、ゲームクリアーにならないです。
– ゲームオーバーも無いです。
– (とりあえず動けば良いということで)# 車輪の再発明
↓先人が2016年に今回と同じテーマを投稿しており、車輪(タイヤ)の再発名ですが、私個人として「色」と「日本語や絵文字」がGo言語の定番ライブラリ「termbox-go」だと思い通りに使用できなかったので改めて挑戦しました。https://qiita.com/kurehajime/items
gormでtime.Time型を使用する
gormでレコード取得をする際に以下のエラーが出ました。
“`bash
sql: Scan error on column index 3, name \”updated_at\”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time
“`updated_atカラムの型をサポートしてない的なことが書いてあるので少し調べました。
## 解決策
gormの公式ドキュメントにも記載がありましたが、
time.Time型を扱うには、接続時のDSN情報に`parseTime`を指定する必要がありました。> 注 time.Time を正しく処理するには、パラメータとして parseTime を含める必要があります。 (その他のパラメータ) UTF-8 エンコーディングを完全にサポートするには、 charset=utf8 を charset=utf8mb4 に変更する必要があります。
https://gorm.io/ja_JP/docs/connecting_to_the_databas