Go関連のことを調べてみた

Go関連のことを調べてみた

GolangとFirestoreの開発環境をDockerで作る

# 概要
Firestoreのエミュレータ構築は **[gcloud CLIを使う方法](https://cloud.google.com/firestore/docs/emulator?hl=ja)** と **[Firebase CLIを使う方法](https://firebase.google.com/docs/emulator-suite/connect_and_prototype?hl=ja)** があります。

どちらを使ってもよいのですがFirebase CLIを使う場合は、ブラウザ上でFirestoreのUIが使えるため、開発効率が上がりそうです。
ということでFirebase CLIでの構築をしていきます。

## こんな人向け
– CLIをローカル環境に入れたくない(Dockerを使いたい)
– FirestoreにGoで読み書きをしたい
– デプロイは特に考えず、お手軽にFirestoreの動作確認ができる環境を作りたい

# 環境構築
## Dockerfileの設定
### Firebaseエミュレータコンテナ用
>Emulator Suite をインストール

元記事を表示

【Go】ターミナルからWebサイトを開くCLIツールを作ってみた

# はじめに

 どうも、Shakkuです。
 都内某高専情報科の3年生です。(2023/12/8時点)

 普段Chromeとかブラウザを使っていて、ブックマークに登録したいサイトが多すぎる!とか、ブックマークに入れたくはないけどよく開くサイトがあるな〜ってことありますよね?(あるよね…?)
 ということで今回は、ターミナル上からWebサイトを「URL」で開いたり、「サイト名」で開いたり、「検索」したりできるCLIツールを作ってみました。

 githubにリリースしているので、ぜひ使ってみてください。(https://github.com/Shakkuuu/website-cli)

# 仕様
 CLI上で以下のコマンドを実行することで使用できる。
“`
website-cli [-search 検索したい用語][site サイト名][url URL]
“`

`-search string`
 searchフラグでは、検索したい用語を入れることで、Googleでの検索結果が開かれる。
 スペースを入れて複数用語を検索したいような場合は、クオーテーション`”,””`で囲

元記事を表示

【Go言語】制御構文

## 制御構文とは
プログラムの流れを制御するための重要な構成要素。
Go言語には`if`,`for`,`switch`など基本的な制御構文がある。

### if文
`if`は条件節がブール型である必要がある

“`go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
rand.Seed(time.Now().UnixNano())
// 0か1をランダムに生成
x := rand.Intn(2)

if x == 0 {
fmt.Println(“x=0”)
} else {
fmt.Println(“x=1”)
}

}

“`

Goでは`falsy`という概念がないので以下のコードはビルドエラーとなる

“`go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
rand.Seed(time.Now().UnixNano())
// 0か1をランダムに生成
x := ran

元記事を表示

Go + ドローンで最高の世界へ飛び立つ その1 導入編

本記事は [オルトプラス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/altplus2023) の12/08の記事です。

# はじめに
こんにちは!オルトプラスの中村です!
普段はサーバサイドがメインですが、フロントエンドやインフラ周りなども触りつつ、業務外では興味あるものがあったら突撃する雑食系です。
今回は趣味で始めたドローンで面白そうなことができそうなので、まずは導入編として書いてみます。
教育現場でもプログラミングの入り口としてドローンを使用することもあるそうです。
なので本記事ではそのような初学者あたりの方からIT関係ないワクワクしたいおじさんまで幅広く楽しんでいただけたらと思っています。

# 概要
Mac PCでDJI TelloのドローンをGoフレームワークGobotで操作していきます。
より応用した操作や映像周りに関しては次回の記事で触れようと思います。
それぞれの環境等は、詳細の冒頭あたりで説明していきます。

# 詳細
## 環境
### PC
– OS: Mac (Ventura 1

元記事を表示

Pokémon sleepの睡眠タイプ決定ロジックが知りたい

# はじめに
みなさん、Pokémon sleep 遊んでいますか?
自分はすでに過去最長プレイ時間であるポケモン本編のポケモンブラックのプレイ時間、999:59を超え、1200時間遊んでいます[^1]。

そこまで爆ハマりしている Pokémon sleep ですが、強いポケモンと出会うためには睡眠タイプのコントロールが必要になります。

## Pokémon sleep の睡眠タイプ
例えばピカチュウと出会うためにはすやすやタイプの睡眠が必要になります。
Pokémon sleep には3種類の睡眠タイプである、うとうとタイプ・すやすやタイプ・ぐっすりタイプ、があり、この内訳は自分のこれまでの睡眠の平均との比較になります。すやすやタイプを出そうとすると、寝ている間の動きがある程度出るような睡眠を目指して、意図的にスマホをいい感じのところにセットするなど、睡眠計測アプリとしては意図されていない行為が必要になります。

## 今回の目的
睡眠タイプはこれまでの睡眠の平均と比較して決定されると明記されていますが、これがどの期間の睡眠との比較かは明示されていません。実際コントロールしよう

元記事を表示

New RelicでQOL爆上げした陰でLambdaがタイムアウトしていた話

# はじめに
この記事は[ディップ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dip-dev)の8日目の投稿です。

皆さんはNew Relicを使っていますか?
ディップでは各プロダクトへのNew Relic導入を進めています。
New Relicは開発から運用、またセキュリティといったアプリケーションに関わる各種メトリクスやパフォーマンスを確認することができる非常に便利なプラットフォームです。
特にダッシュボードは以下のように高い自由度で作り込めるので ~~気がついたら半日過ぎているなんてこともザラ~~ QOLが爆上がりします。

“`plantuml
@startuml

footer 1リクエストあたりの処理時間や、SQSからのメッセージ受信数、モード毎の処理件数などいろいろ作り込める。楽しい。
title

元記事を表示

コマンドラインで作曲したい!〜 MML to MIDI compiler のようなものを作ってみた〜

https://qiita.com/advent-calendar/2023/42tokyo

どうもこんにちは。エンジニア養成機関 42 Tokyo の在校生 @snara-42 と申します。
こちらは 42 Tokyo Advent Calendarの7日目の記事です。

12/7 という数字を見てまず思いつくものといえば、そう、ピアノの鍵盤🎹ですよね | !|! | !|!|! |

ということで、なんとなく作曲したい気分の時に、コマンドラインから手軽に作曲できるように、MML文字列をMIDIファイルに変換するプログラムを作ろうとしてみました。

そこまで便利なものができたかと言うとまだそうでもないのですが、もっと便利にしてみたいと思っています。

コードはこちら (そのうち予告なく変更します)

https://github.com/snara-42/musica/blob/main/midi_writer/midi.go

## MML (Music Macro Language) って?
https://ja.wikipedia.org/wiki/Music_Macro_

元記事を表示

EC2に建てたマイクラのサーバーをDiscordから起動する

# EC2に建てたマイクラのサーバーをDiscordから起動する

だいぶ前にマイクラにハマっていた時がありました。
その時に一緒に遊んでいた仲間内で自由にサーバーの起動ができるように、DiccordからEC2上に建てたマイクラのサーバーを起動するBotを作成したので、作り方を簡単に紹介します。

## 構成

– EC2(マイクラサーバー)
– Lambda(サーバー側)
– DiscordBot(クライアント側)

DiscordBotからLambdaにリクエストを飛ばし、LambdaからEC2を起動します。

## EC2

起動スクリプトです。
これをEC2起動時に自動で実行するようにします。
マイクラ内でstopコマンドを叩くことでマイクラサーバーが終了し、そのままEC2を終了させるリクエストをLambdaに投げます。
ついでに、DiscordのWebHookでサーバーが終了したときに通知するようにします。

“` shell
java -Xms$XMS_SIZE -Xmx$XMX_SIZE -jar {マイクラサーバーのJarファイル} -nogui
curl -X PO

元記事を表示

goでsql

アドベントカレンダー7日目です。
goでmysqlを扱います。

`docker-compose`にmysql関連の記述を追加します。
“`yml
version: ‘3’
services:
golang:
build: .
tty: true
volumes:
– ./:/app/
ports:
– “1323:1323”
mysql:
image: mariadb # mysqlと言いつつmariadb使っています
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: golang
MYSQL_USER: golang
MYSQL_PASSWORD: golang
ports:
– “3310:3306”
volumes:
– ./mysql:/var/lib/mysql

“`

コンテナを起動します。
“`bash
docker-compose up

元記事を表示

「バンダイナムコスタジオ」様のワークショップに参加してきました【Go言語】

# はしがき

 2023年12月2日、バンダイナムコスタジオ様が開催された『**サーバーエンジニア編「Go 言語でゲームサーバーを作ろう!ゲームサーバー API プログラミング ワークショップ」**』に参加してきました。

 本記事では、参加レポートを記述します(ほとんど個人的な感想です)。今後、同社のインターンやワークショップに参加を検討されている方の参考なればと思います。

 ちなみに、リモートで1日の開催です。

* 参考

https://www.bandainamcostudios.com/recruit/graduate/news/12604

* プレイ画像
![インゲーム画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621804/b1f51763-c710-83ed-8886-94472d970a24.png)

# 全体的な感想

### 参加した理由

 日常的に書いている言語がGoであったため、「Go言語のワークショップ」という言葉に惹かれ、気づいたらエントリーしてい

元記事を表示

【Nginx&Golang&MySql】Dockerで開発環境の構築

# 1. はじめに
[MYJLab Advent Calendar 2023](https://qiita.com/advent-calendar/2023/myjlab)の7日目の記事になります。
昨日は片平さんの[マイクラをヴァンサバライクにするプラグインの開発](https://qiita.com/kata110/items/2366effe7aa957e5be59)でした。ヴァンサバはやったことないですが、マイクラでできるのはおもしろそうでやってみたいです。

# 2. やること
Dockerを使ってgo,mysqlのAPIサーバー開発の環境を作ります。nginxはリバースプロキシのような形でリクエストをgoのコンテナに流すだけになってます。環境を構築するだけなので中身はとくに何もないです。

_ 自分で1から環境構築するのが初めてなのでわかってない部分や、間違っている部分があるかもしれません。 _

# 3.ディレクトリ構成
全体像は以下のようになります。できるだけ小さい構成にしたつもりです。viewの下にあるhtmlファイルは動作確認のためのものなので必須ではないです。
.

元記事を表示

【Go言語】マップ

## マップ
マップは、キーと値のペアを格納するためのデータ構造で、キーを使ってデータの検索、更新、削除ができる。
Pythonの辞書やJavaのハッシュマップに似ている。

### マップの作成
“`go
package main

import “fmt”

func main() {
// リテラルを使用する
m1 := map[string]int{
“foo”: 1,
“bar”: 2,
}
fmt.Println(m1) // map[bar:2 foo:1]

// `make`関数を使用する
m2 := make(map[string]int)
fmt.Println(m2) // map[]

}

“`
### マップの操作
“`go
package main

import “fmt”

func main() {
m := make(map[string]int)

// 追加
m[“foo”] = 1
m[“bar”] = 2
fmt.Println(m) // map[bar:2 foo:1]

// 更新
m[“f

元記事を表示

【Go言語】ゼロ値・スライス

## ゼロ値
変数宣言したが、値を設定していない変数は**ゼロ値**で初期化される。

### 型ごとのゼロ値

|型|ゼロ値|
|—-|——|
|数値|`0`|
|ブール型|`false`|
|文字列|`””`|
|ポインタ、インターフェース|`nil`|

### サンプル
“`go
package main

import “fmt”

func main() {
var n int
fmt.Println(n) // 0
var b bool
fmt.Println(b) // false
var s string
fmt.Println(s) // “”
var err error
fmt.Println(err) // nil
}

“`

## スライス
スライスは動的なサイズを持つ配列のようなデータ構造で、同じ型の要素を順序つけて格納する。
スライスは宣言時にサイズを指定する必要がない。
配列よりも柔軟で、スライスの方がより一般的に使用される。

### スライスの作成
スライスの作成には複数の方法がある
“`go
package m

元記事を表示

GoでよしなにJSONをパースする

# よしなにJSONをパース
Goは静的型付け言語であるため、JSONを利用するにも型を宣言しなければならない。
自らが作成したアプリケーションが返すJSONならば良いのだが、
頻繁に変更されるような外部のAPIや巨大JSONの型を都度宣言し直すのは嬉しくない。

そこで、型を宣言せずともJSONから値を取れるライブラリの紹介。

## jsonparser
https://github.com/buger/jsonparser

“`bash
mkdir app/day6/ && touch app/day6/main.go
“`

“`go
package main

import (
“fmt”

“github.com/buger/jsonparser”
)
func main() {
var jsonStr =`
{
“name”: “山田太郎”,
“age”: 30,
“isStudent”: false,
“address”: {
“street”: “桜通り1-2-3”,
“city”: “東京”,
“zip”:

元記事を表示

golang から Application Insights にログを送信する

# golang から Application Insights にログを送信する

先だって、こんなアナウンスがありました。

[Making Azure the Best Place to Observe Your Apps with OpenTelemetry](https://techcommunity.microsoft.com/t5/azure-observability-blog/making-azure-the-best-place-to-observe-your-apps-with/ba-p/3995896?utm_source=pocket_saves)

> GoやRustなど、現在Distroが提供されていない言語はコミュニティのライブラリで計装して、Azure Monitor Agent経由でAzute Monitor/Application Insightsに送る、という方針

らしいのですが、このあたりあまり情報が整理されていないので、現時点で何ができているのか備忘録代わりに整理しておこうと思います。

全般的に、この辺りについては素人なので、用語や理解が

元記事を表示

Goの構造体をGhidraで逆アセンブルして静的解析する

## お詫び

執筆中インフルエンザにり患してダウンしていたため、書ききれませんでした。

アドカレ中には書き切りますので温かい目で見守っていただけますと幸いです。

## はじめに

普段はVR企業でバックエンドエンジニアをやっています。

弊社では今までバックエンドのAPIを主にRuby/Railsで実装していたのですが、最近ではGoで実装することが増えてきております。

そこで今回はGoの内部実装の理解を進めるため、サイバーセキュリティでは有名なGhidraでGoの実行ファイルを逆アセンブルしてみます。

## Ghidraとは

Ghidra
– https://www.ghidra-sre.org/

リバースエンジニアリングツールです。

アメリカのNSA(国家安全保障局)が開発したもので、2019年にOSSとして公開されました。

開発自体は2000年前半から始まっていて、十数年の時を経て誰でも利用できるようになりました。

– https://netagent.co.jp/study/blog/hard/20190530.html

今回はこのGhidr

元記事を表示

Goの複数バージョンをインストールして切り替える

:::note info
この記事は[ZOZO AdventCalender 2023](https://qiita.com/advent-calendar/2023/zozo)シリーズ4の6日目の記事です。
:::

# 始めに
go言語で複数バージョンをPCにインストールして切り替える方法について説明します。
なおgo言語では[Go1.x系の間には後方互換性を破壊するような変更は加えないということがルール化](https://go.dev/doc/go1compat)されているので、
基本的には最新バージョンを使用すれば良く、複数バージョンをPCに入れる必要はありません。
後方互換性を破壊するような変更を加えないといけないといった状況になった際にはGo2としてリリースされるという方針になっているようです。
しかしながら諸般の事情で複数バージョンをPCに入れて切り替えたいということはありえます。
筆者も最新バージョンではビルドができないというプロジェクトに最近関わることになり、最新バージョンとは別に1.17系を入れる必要が出てきて複数バージョンを扱う方法を調べました。
この記事ではそ

元記事を表示

apimachineryのQuantity型の扱い

::: note info
これは [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) カレンダー Vol.5 の 6日目の記事です。
:::

本記事では、GoでKubernetesリソースのメトリクスを扱う際に登場する、`k8s.io/apimachinery`モジュールの`api/resource`パッケージに含まれる`Quantity`型の扱いについてご紹介します。

# k8s.io/metricsモジュール
Kubernetesクラスタ内のPodやNode、コンテナといったオブジェクトのリソース使用量を取得する際、Kubernetes Metrics APIを利用することができます。
Go言語でこれらのリソース使用量を取得するプログラムを実装する場合、`k8s.io/metrics`モジュールが提供する型やメソッドを利用することで、簡単にこれを実現することができます。

## Quantity型の利用箇所
`k8s.io/metrics`モジュールの中でもコンテナメトリクスの値

元記事を表示

GoでEnumを自前実装したら結構使えた話

この記事は [Go 言語 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/go) 6日目の記事です。

# はじめに

GoでEnumってどう実現するんだという話をSNSでたびたび目撃します。
[GoとEnumについて](https://zenn.dev/nobonobo/articles/986fea54fdc1c1)にベストプラクティスは紹介されていますが、今回は私の関わっているチームで自前実装した方式を紹介します。

すでに本番導入している方式で、数年間本番で追加開発/保守運用する中でもうまく機能していると感じています。

# 実装したもの

こんな感じです。
定義ファイルから以下のコードを生成して使っています。

“`order_status_gen.go
// Code generated; DO NOT EDIT.

// 追加でメソッドを定義したい場合は、別ファイルでメソッドを追加してください。
// 別ファイルはこのファイルから、「_gen」を取った名前で作成してください。
// 例:hogeh

元記事を表示

Goで競技プログラミングをするときに作っておくと便利な関数

この記事は[and factory.inc Advent Calendar 2023](https://qiita.com/advent-calendar/2023/andfactory)の6日目の記事です。
昨日は @MatsuNaoPen さんの「[使って便利なmermaid記法(flowchart編)](https://qiita.com/MatsuNaoPen/items/c052d012d62f1046baca)」でした。

急遽埋めたので完全に業務に関係ない話で恐縮です…。もう一枠取っているのでそちらではもう少し業務絡みの事を書ければと思います。

# 概要
この記事ではGoで競技プログラミングをする時に作っておくよい関数をお伝えしたいと思います。

Goで競技プログラミングをするに当たってのテクニックは既に詳しくまとめていただいている方がおり、こちらがとても参考になるかと思います。

https://qiita.com/ktateish/items/ab2df3e0864d2e931bf2

上記を踏まえた上で実際にどんな関数があると便利かは日々試行錯誤しているのですが、

元記事を表示

OTHERカテゴリの最新記事