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

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

Test1

“`
package main

import (
“fmt”

ole “github.com/go-ole/go-ole”
“github.com/go-ole/go-ole/oleutil”
)

func main() {
ole.CoInitialize(0)
defer ole.CoUninitialize()

unknown, _ := oleutil.CreateObject(“Outlook.Application”)
outlook, _ := unknown.QueryInterface(ole.IID_IDispatch)
defer outlook.Release()

ns := oleutil.MustCallMethod(outlook, “GetNamespace”, “MAPI”).ToIDispatch()
defer ns.Release()

inbox := oleutil.MustGetProperty(ns, “GetDefaultFolder”, 6).ToIDispatch()
defer inbox.Re

元記事を表示

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

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

元記事を表示

aws lambdaカスタムランタイムでGoを動かす

# aws lambdaでGo
アドベントカレンダー5日目です。
Goはaws lambdaで正式にサポートされていましたが、Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するに伴い、Go 用ランタイムもサポートが終了してしまいます。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-golang.html

そのため、これからは`provided.al2`イメージ上に作成する必要があります。

## Dockerfile作成
“`bash
touch app/day5/Dockerfile
touch app/day5/main.go
“`
`day5`を独立したモジュールとしたいため、初期化しておきます。
“`bash
cd app/day5
got mod init github.com/shuyaeer/learn-go/app/day5
“`

Dockerfileです。ビルドしたバイナリを`provided:al2`上で実行しています。
“`do

元記事を表示

【Go言語】ポインタ

## ポインタとは
値のメモリアドレスを扱う機能のこと。
変数がメモリ上のどこに格納されているかを示すために使用する。

## 使い方
**ポインタの宣言**:`*` + `型`
**アドレスの取得**:`&`演算子
**値の参照**:`*`演算子

## サンプルコード
“`go
package main

import “fmt”

func main() {
var x int = 1
// xのアドレスをpに割り当てる
var p *int = &x
// pが指すアドレスの値を出力する
fmt.Println(*p) // 1

// pが指すアドレスの値を変更する
*p = 2
fmt.Println(x) // 2
}

“`

## 参考

https://www.oreilly.co.jp/books/9784873119694/

元記事を表示

Go! Kobe! に参加しました

# はじめに
この記事は[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato) 4日目の記事です。

今回は12/3(日)に神戸で開催された[Go! Kobe!](https://gdgkobe.connpass.com/event/303098/)に参加してきたのでまとめようと思います。

# 概要
 [@tenntenn](https://twitter.com/tenntenn)さんが主催するGoのハンズオンイベントです。

https://gdgkobe.connpass.com/event/303098/

↓ ハンズオンの資料です

https://github.com/gohandson/genai-ja

# ハンズオン
ハンズオンはステップアップ式にOpenAIを活用したChat Botを作成するというものでした。
普段Goをかじってはいるので、内容は比較的簡単に感じました。

が、このハンズオンを通して、学んだこともたくさんあったので、まとめたいと思います。

元記事を表示

gormのDB.Set関数利用時のエラーについて

これは[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)の3日目[^1]の記事です。
[^1]: 平日のみの投稿なので、投稿日は5日ですが3日目の記事としています。

# はじめに

契約書の作成から管理までを行える契約書管理クラウドの[Hubble](https://hubble-docs.com/)では、一部のサービスをGo言語で実装しています。
ORMに[gorm](https://gorm.io/)を使っているサービスがあり、その利用シーンにおいて問題が発生し、解決に時間を要したため、この記事にて紹介させていただきます。

# gormのDB.Set関数の振る舞いについて
## サンプル

“`go:sample.go
const key = “test_key”

type (
Form struct {
ID uint `json:”id” gorm:”primaryKey”`
Name

元記事を表示

ゲーム開発におけるのサーバー負荷と戦う工夫

# はじめに
こんにちは、都内在住の大学生をしている[Daina](https://qiita.com/nishiumidaina)です。普段はゲームの開発や研究をしています。

この記事は[サイバーエージェント24卒内定者 Advent Calendar](https://qiita.com/advent-calendar/2023/ca24engineer)の5日目です。

今回はゲームのサーバーサイド開発に焦点を当てて、golangを用いたゲームサーバーのメモリキャッシュとDBシャーディングに関する内容を中心に取り扱います!

## プロジェクト構成
– 言語:Golang
– フレームワーク: Echo
– DB: MySQL
– ORM: gorm
– キャッシュ:go-cache

※重要なディレクトリのみ記載
“`
.
├─ api
| ├─ di: wire
| └─ presentation
| ├─ controller: ハンドリングを記述する
| ├─ middleware
| ├─ request: 自動生成
| ├─ r

元記事を表示

spm-goでGoの結合度を計測する

よいパッケージ性の測り方

## 結合度を計測する
コードの良さを測る指標として循環的複雑度などがありますがどちらかというと単一ファイルの指標で、アーキテクチャの良さを測る指標として不足に感じました。

マイクロサービスでもモジュラーモノリスでもマルチモジュールの境界をどううまく引くかは悩みどころで、機械的なソフトウェアメトリクスである程度あたりをつけられると便利です。

Goの結合度を測るツールとして[spm-go](https://github.com/fdaines/spm-go)の存在を知ったので動かしてみます。

## spm-goとMattermostの準備
spm-goをインストールします。helpが出ればインストール成功。

“`bash
$ go version
go version go1.21.4 darwin/arm64
$ go install github.com/fdaines/spm-go@latest
$ spm-go
Software Package Metrics for Go

Usage:
spm-go [command]

Availa

元記事を表示

Goで作る Kubernetes Podで稼働するコンテナメトリクスを取得するプログラム

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

本記事では、Go言語でKubernetes Podで実行中のコンテナメトリクスを取得する方法をご紹介します。

Kubernetesでは、アドオンのコンポーネントであるmetrics-serverをデプロイすることで、Metrics APIを介してクラスタ内で実行中のPodやNodeのリソース使用量を取得することができます。
こちらのMetrics APIを利用して対象のPodで稼働中のコンテナメトリクスを取得するプログラムをGo言語で作成しつつ、各処理について説明します。

# `k8s.io/metrics`モジュールの紹介
Kubernetes Organization配下のリポジトリである`metrics`リポジトリでは、`k8s.io/metrics`モジュールを提供しています。
このモジュールには、Kubernetes Metri

元記事を表示

samber/loを使ってABC329のA-Fを解いてみた

# はじめに

これは、[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct) の5日目の記事です。

## 投稿動機

### その1

競技プログラミングのコツの一つとして、ライブラリを利用してコードの記述量を減らし、より早く問題を解くというものがあります。競技プログラミング用の自作ライブラリを設計する際は、この観点をはじめとして、使い勝手の良さ、コマンドの覚えやすさなどの様々な観点を加味しながら設計を行っていきます。他作のライブラリを使ってみたり、汎用のライブラリを触ってみたりもします。そんな中でlodashのエッセンスを取り込める[samber/lo](https://github.com/samber/lo)というライブラリを見つけたので、これを利用した場合にどのようなコードになるかを検証してみました。

### その2

[プログラミング文体練習](https://www.oreilly.co.jp/books/9784814400225/)というオライリー本を読ん

元記事を表示

Goで学ぶGraphQLサーバーサイド(9)ークエリ複雑度の制限

こんにちは。

今回はクエリ複雑度の制限について説明いたします。

# この章について

N+1問題に対してDataloaderを使い対処したように、複雑なクエリが来たとしてもDBにかける負担を減らす方法というのは確かに存在します。
しかし、どんなにリゾルバ内の処理を工夫したとしても、そもそものリクエストクエリが複雑で、取得対象となるデータが膨大になっている場合にはやはりサーバーにかかる負荷は重くなってしまいます。
そのため、「あまりにも複雑なクエリはそもそも受け付けないようにする」という機能をGraphQLサーバーにつけることがあります。
今回はその「クエリ複雑度の制限」をサーバーにつける方法を紹介します。

# クエリ複雑度の計算法

「あまりにも複雑なクエリはそもそも受け付けないようにする」という機能のためには、クエリの複雑度を定量的に決定する必要があります。
ここではまず、デフォルトでのクエリ複雑度の計算法を解説したいと思います。

## 具体例となるクエリ

今回具体的に複雑度を計算するクエリとして、以下のものを使用します。

“`graphql
query {
nod

元記事を表示

Go Conference mini 2023 Winter IN KYOTOに参加しました!

# はじめに
この記事は[Yamato Advent Calendar 2023](https://qiita.com/advent-calendar/2023/yamato) 3日目の記事です。

今回は12/2(土)に京都で開催された[Go Conference mini 2023 Winter IN KYOTO
](https://kyotogo.connpass.com/event/285351/)に当日スタッフとして参加してきたので、そのことについて色々まとめようと思います。

# 何で運営参加なのか?
元々、Go Conference mini IN KYOTOには3枠しかない学生枠で参加予定でした。
が、、、

kyoto.go運営のアカウントから以下のようなポストがありました。

とあり、当日スタッフを5名ほど募集していました。
自分はGoが好きで、Goのコミュニティにも関わりたいと思っていた矢先このようなチャンスが舞い込んできました。
Go Conf

元記事を表示

Goで並行処理を扱う

#並行処理
アドベントカレンダー4日目は並列処理についてです。[3日目はこちら](https://qiita.com/shuyaeer/items/60ce23324dc1063c4e98)

## Goにおける並行処理
Goは並行処理ととても相性がよく、最大の特徴の一つといってもいいでしょう。

次に並列処理のプログラムとその実行例を見てみます。
プログラムは0から4までの数字を2倍にして表示するというものです。
“`go
package main

import (
“fmt”
“sync”
“time”
)

func worker(id int, wg *sync.WaitGroup, results chan<- int) { defer wg.Done() fmt.Printf("Worker %d starting\n", id) time.Sleep(time.Second) fmt.Printf("Worker %d done\n", id) results <- id * 2 } func main() { const numWorkers

元記事を表示

Golangの開発生産性を上げるVSCodeスニペットランキング

本投稿はMIXI DEVELOPERS Advent Calendar 2023 4日目の記事です。

https://qiita.com/advent-calendar/2023/mixi

この記事では、Golang用のVSCodeユーザースニペットの中で自分が特に役に立っていると思うものをランキング形式で発表します!

# 前提:

### VSCode ユーザースニペットとは
コードとキーを予め登録することでキー入力するだけで設定したコードが簡単に呼び出せる機能です。
キーボードソフトの辞書機能に似ていて、特定のキーワード入力で予め設定されたコードが挿入されると考えていただけるとわかりやすいと思います。

### VSCode ユーザースニペット 登録方法

⌘ + Shift + P で検索フィールドを展開し、`snippets` を入力すると候補にあがってくるのでクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/75e71a57-d97c-19

元記事を表示

型システムから考えるPython, Java, Golangそれぞれの違い

# 初めに

## 背景

今までPythonを使ってきたのですが、転職先ではJavaとGolangを主に使用することになりました。特にPythonにはない型を意識した開発のメリット、JavaとGolangのintefaceの違いがあまりよく分からなかったので、調べてみました。
この記事では、PythonとJavaとGolangの違いについて触れ、そして記事の最後には GolangとJavaのintefaceを違いを明示しつつ、Pythonで書き直してみました。

## 対象読者

* 動的型付け言語しか使ったことない人
* JavaとGolangの違いがはっきり分からない人
* 型を意識したことがあまりない人

## シンプルな実装

まず、Python, Java, Golangの3つで一番シンプルなクラスを書いてみる。
Pythonは以下を見てもらうと分かる通り、Pythonを知らない人でも、理解できてしまうぐらいシンプル。

Pythonの場合

“`python:simpleなクラス(python)
clas

元記事を表示

OTHERカテゴリの最新記事