Go関連のことを調べてみた2021年12月05日

Go関連のことを調べてみた2021年12月05日

独自KVSデータベースを作ってみた

# 初めに
オークファンの開発部に2021年新卒入社した@isodaです。
題名の通り、独自KVSデータベースの設計と開発(実装は途中)を行いました。

# 経緯
通信プロトコル、ファイルシステム、バイナリなどの理解。
Goを使用した開発や1から設計を行う経験の為、研修の一環として、今回の独自KVSデータベースの設計と開発を行わせて頂きました。

# 通信プロトコルの設計
通信はTCPを使用し、バイナリデータでのやり取りを行います。

– DBサーバーへのリクエスト
– KeyとValueを送る際に、どこまでがKeyでどこまでがValueなどを識別するために、識別文字を入れる方法もありますが、
今回はバイナリセーフにしたいためKeyとValueのサイズを通信に内包する方法にしました
– DBサーバーからのレスポンス
– Create/Update/Deleteの際は正常を示す値(0x00) or 異常ならエラーコード
– Readの際は正常系はリクエストのKeyに対応するValueの値 or 異常ならエラーコードが返ってくる

## Create/Upda

元記事を表示

GoならわかるWindows API

この記事は[Goアドベントカレンダー](https://qiita.com/advent-calendar/2021/go)の5記事目です。
WindowsのAPIを叩いて遊んでみた記事です、あまりGoっぽくないです。

## ターミナルに文字を吐く以外のことをやってみたい

何らかの処理を行い、その実行結果をターミナルに出力するのはどの言語でもprint系の関数を利用すれば簡単に行う事ができます。
ターミナルに依存せず、起動するとGUIのウインドウが立ち上がるアプリケーションはいったいどのような仕組みで動いているんだろう、と疑問に思いました。

### ウインドウを自力で生成する方法を探す

普通にGUIアプリケーションを作りたいときはフレームワークに頼るでしょう。
[gotron](https://github.com/Equanox/gotron)や[fyne](https://github.com/fyne-io/fyne)、[qt](https://github.com/therecipe/qt)など様々な選択肢があります。
しかし今回は仕組みを学ぶことに意義があります。

元記事を表示

【Go】VsCodeで環境構築をやってみた

## はじめに
ブロックチェーンの勉強を行っていると、結構Go言語の話が出たり求人とかもGo言語が求められているので、
今後必要になりそうだなーと思ったので早速Udemyで講座を購入し、勉強をはじめました!!
が、収録されている時からGoのバージョンが上がっていて`go get`が使えなかったりして地味に環境構築に時間が取られたので、他の方にも参考になればと思い投稿することにしました。

>Udemy 講座
[現役シリコンバレーエンジニアが教えるGo入門+応用でビットコインのシストレFintechアプリの開発](https://www.udemy.com/course/go-fintech/)

# 環境
“`
OS : Mac
エディタ : VScode
Go : 1.17.4
“`

注※本記事ではVscodeのインストール方法は記載しておりません。

# Goのインストール

[Downloads](https://go.dev/dl/)のサイトからパッケージをダウンロードして、インストールしました。

![スクリーンショット 2021-12-04 1

元記事を表示

Tour of Goのスライスの挙動で引っかかってたら、色々分かった話

#目次
– [はじめに](#はじめに)
– [対象の読者](#対象の読者)
– [この記事で伝えたいこと](#この記事で伝えたいこと)
– [スライスとは](#スライスとは)
– [スライスのスライシング](#スライスのスライシング)
– [どこで引っかかったか](#どこで引っかかったか)
– [スライスの代入は元の配列のポインタを渡す](#スライスの代入は元の配列のポインタを渡す)
– [スライシングの仕様](#スライシングの仕様)
– [まとめ](#まとめ)
– [参考](#参考)

#はじめに
この記事は [カオナビ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/kaonavi) 5日目です。

初めまして!カオナビに新卒で入って現在2年目の@summer_shineです。

最近、自分が新しく所属することになったチームで、初めてGoを触ることになりました。
その際に、[A Tour of Go](https://go-tour-jp.appspot.com/list) (Goのチュートリアルができる場所

元記事を表示

マイクロサービスにひそむ複雑さに立ち向かう

# はじめに
はじめまして。Kyashでサーバサイドエンジニアを担当しているhirobeです。
[Kyash Advent Calendar 2021](https://adventar.org/calendars/6274)の12/5担当分です。

Kyashでは、約30ほどのマイクロサービスが動いてます。
マイクロサービスは難しいです。

私が入社して2年半ほどの間、マイクロサービスの複雑さに苦しめられ、あがいてきた実経験をもとに、マイクロサービスにひそむ難しさを紹介したいと思います。

ここでは、ケースとして、弊社の機能のひとつである[登録カードからのリンク](https://support.kyash.co/hc/ja/articles/360001524948)を実装する上で発生する問題を紹介したいと思います。もちろん弊社サービスを使ったことない人でもわかるように説明をしますのでご安心ください。

なお、最初に注意書きしておくと、本ブログではあくまで「マイクロサービスにひそむ複雑さとその対応法」を説明するためのわかりやすさを優先して説明していきます。事実とは異なるケースがあり

元記事を表示

Goのルーティングの設定の基本

備忘録です。

Goの基本的なルーティングの設定を記載します。

フレームワークである gin を使って説明を行っていきます。

## ファイルにルーティングを設定

“`go
package main

import (
“log”
“net/http”

“github.com/gin-gonic/gin”
)

func main() {
r := gin.Default() // ginのEngineインスタンスを生成
r.GET(“/”, sampleFunc) // ルーティング設定
r.Run() // サーバに接続。HTTPリクエストを受け付ける
}

func sampleFunc(c *gin.Context) {
log.Println(“I am sampleFunc”)
c.JSON(http.StatusOK, gin.H{“message”: “HELLO!”})
}
}
“`

コマンド実行

“`bash
go run main.go

[GIN-debug] [WARNING] Creati

元記事を表示

いいかんじにAWS上のネットワーク構成図を作りたいから手鍋した話

この記事は[ディップ株式会社 Advent Calendar 2021の](https://qiita.com/advent-calendar/2021/dip-dev) 5日目の記事ですっ

4日目は @bikun_bikunさんの [SendGridのDynamicTemplateでハマった話](https://tech-note.bikunbikun.com/entry/2021/12/04/162742) でした。
これはなかなか気づけない仕様ですね・・linterが欲しいレベルです・・

# やったこと

**ネットワーク構成図だけを描くシンプルなツールを書いた**。
~~やってみたかっただけのスカンクワーク~~

# 現状の課題

– **クラウドに移行したサーバーのネットワーク管理がぱっと見レベルの可視化ができていない**

簡略化した可視化が出来ていないので、セキュリティレベルを上げるための許可ポートのリファクタとか
何かあったときの侵入経路みたいなのがサクッとレベルで分からない。

# 実現したい事の分析

– **リスクがある通信の流れ**
– **リソース障害発

元記事を表示

【個人開発】大学生がTwitterと連携する掲示板サービス「AutoF2F」をリリースしました。

## はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286935/c1b9144b-bcd0-8e17-7dd4-009787743cbf.png)

https://autof2f.herokuapp.com/

突然ですが、皆さんはこんな経験はないでしょうか?

**「Twitterで誰をフォローしたら良いのかわからない、なにかフォローをする基準が欲しい」**

今回は、↑のような問題を解決するために匿名掲示板サービスとTwitterを連携することで自動的にフォローマッチングを行うようなサービスを開発しました!!!

## どのようにしてフォローの基準を設けたのか?

内部パラメータに友達カウンタという、あるユーザがあるユーザに対して何回匿名掲示板の投稿にいいねをしたかを記録したものを用いました。その値をベースにフォローの基準を設けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

Goでtemplateを使って、xmlを生成してみる

この記事は[Wanoグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) 4日目の記事になります

goのTemplateはtext/html二種類がある

しかしxml生成の際に、どっちでもそのまま使ってはいけません

例えば:

text/templateの場合

“`go
package main

import (
“bytes”
“fmt”
“text/template”
)

type XmlTemplateMeta struct {
Text string
}

func main() {

var xmlTemplateStr = “\n\n {{ .Text }}\n\n”

// & 入れたら。。。
x := XmlTemplateMeta{
Text: “test string1 & string2”,

元記事を表示

Backlog GitのWebフックを利用して自動デプロイの真似事をしてみる

# 前書き
[株式会社ピーアールオー(あったらいいな!を作ります)Advent Calendar 2021](https://qiita.com/advent-calendar/2021/pro-japan1) の4日目になります。
今回は、Backlogの[Git Webフック](https://backlog.com/ja/enterprise-help/userguide/userguide1581/)を自作のAPIで処理する方法を紹介したいと思います。
~~ちなみに、依頼されて作ったはいいもののなぜか使用されなかった、なんならそもそもSTG(相当)サーバすら作られなかったらしいので、その供養も兼ねています。~~

# 目的
弊社の新人研修では、BacklogのGitを使用してコード管理をしています。
作った成果物については、各自のローカル環境で動かす他、STG(相当)サーバにデプロイすることもあるようです。
これに伴い、研修担当者から以下の依頼がありました。

“`
Gitに上がったらSTG(相当)サーバに自動デプロイする仕組みを作ってほしい
> ソース管理 Back

元記事を表示

Bitfield を使った json.Marshal/Unmarshal の例

[2021年Goアドベントカレンダー](https://qiita.com/advent-calendar/2021/go) 4日目の記事です。

`encoding/json` パッケージには Marshaler/Unmarshaler インターフェイスがあります。
インターフェイスの実装を満たす構造体であれば、jsonをGoのデータへマッピングすることや、jsonデータをシリアライズして出力することが出来ます。

“`go
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
“`

“`go
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
“`

https://pkg.go.dev/encoding/json

`UnmarshalJSON` は、インプットの json データをハンドルして Go の型へ変換したい時、

`MarshalJSON` は、Goの構造体などを json データへシリアライズして出力する際などに利

元記事を表示

OSSのglTFライブラリにPull Requestを出した件について

この記事は[クラスター Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cluster)の12/3の分です。
昨日は [hattori88](https://qiita.com/hattori88) さんの 「[clusterに暮らすキャラクターAIについて思うことと、つくり方 ( Living AI in cluster )](https://qiita.com/hattori88/items/29781a8361ab830cd9e7)」でした。メタバース上でのキャラクターAI…とても興味ぶかいですね。

今年の7月からクラスターに所属している[neguse](https://twitter.com/neguse)と申します。
この記事では以下のPull Requestを解説します。

https://github.com/qmuntal/gltf/pull/42

#背景

クラスターにはGoでglTFを扱う処理が存在しており、そのために[qmuntal/gltf](https://github.com/qm

元記事を表示

beegoとgormでチャットapiを作成する

flutterのチュートリアル?codelabs(https://codelabs.developers.google.com/codelabs/flutter)
でチャットアプリの作成をやっている中で、チャットのメッセージ情報を腹持ちしているのをapiから取得したいと思いbeegoでサクッとapiを作成しました。

コード(https://github.com/fu-yuta/go_friendly_chat/tree/create_chat_api)

# 環境
go: v1.17
beego: v1.12.1
gorm: v1.9.16
mysql: v8.0.27 for macos11.6

# フォルダ構成
“`shell
├── conf
│   └── app.conf
├── controllers
│   ├── chat.go
│   ├── requests
│   │   └── chat.go
│   └── responses
│   └── chat.go
├── go.mod
├── main.go
├── models
│   └── c

元記事を表示

[Golang, Gorm]単方向リストの実装

Ginを用いたAPIでGormで単方向リストを用いたい際に、要素の追加、ソート済みのリスト取得の実装を行ったのでメモとして残してみました。
## ディレクトリ構成

go-app/svc/
├── components
│   ├── models.go
│   ├── repository.go
│   └── urls.go
└── services
   ├── models.go
   ├── repository.go
   └── urls.go

## モデルの条件
Serviceが一対多の関係で単方向リストとしてComponentを持つ
![Untitled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1678850/80681311-a333-a076-6fb6-0cabf77a65da.jpeg)

## 仕様
以下2つの実装を行いました。

1. service_idから単方向リストの条件でソートされたcomponentsを取得
2. service_id, comp

元記事を表示

Goのsync.Mutex

研究で[quic-go](https://github.com/lucas-clemente/quic-go)を使っていて、`sync.Mutex`というのが出てきて使い方を調べたのでメモ。

## そもそもmutexとは

> In computer science, a lock or mutex (from mutual exclusion) is a synchronization primitive: a mechanism that enforces limits on access to a resource when there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy, and with a variety of possible methods there exists multiple unique implementations for different applications.

([L

元記事を表示

【Vonage】最新CPaaSのユーザ認証APIをSDKを独自実装しながら理解する【Go】

この記事は[最新CPaaSコミュニケーションAPIを比べる or 使ってみよう! 【PR】Vonage Japan](https://qiita.com/advent-calendar/2021/vonage2021)の3日目の記事です。

## この記事の内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1553191/66e883d9-4f15-1cad-8c2b-3ed46072277a.png)

– Communication Platform as a Serviceの**Vonage**さんのVerify APIを触ってみて得た開発知見を共有します。**Verify APIは簡単にSMSやTELを使ったユーザ認証を実現できるAPIです。**
– **ただAPIを触るだけじゃつまらない! & 私はGoで使いたいんや!**という個人的な思いから、公式さんから正式提供されていない**Go版のSDK**を作るところまでやりました。その実装についての紹介です。

作成したSDKは下

元記事を表示

これから始めるなら気にしたいGoの作法

この記事は [Goのカレンダー | Advent Calendar 2021 – Qiita](https://qiita.com/advent-calendar/2021/go) の3つ目のカレンダーのの3日目です。

# これはなに?
– あくまで筆者の主観で、Golangを使ったアプリケーションはこういった書き方が多い/こういう風にすると良さそう、を書き連ねる記事
– 「主観で」とはいえど、なるべく有名どころのライブラリなどを参考に持ち出して執筆します
– Golangの基本文法が分かる人向け

# インデントはタブが主流
– Golangのデフォルトがタブ
– 標準ライブラリやPlayground、有名なライブラリなどを見るとタブ採用が多い
– 参考: [timeパッケージのSleepメソッド](https://cs.opensource.google/go/go/+/refs/tags/go1.17.3:src/time/sleep.go)
– 参考: [Go Playground](https://go.dev/play/)

元記事を表示

Go APIでのAuth0 JWT認証ハンズオン

こちらは [GAOGAO Advent Calendar 2021 ことしもGAOGAOまつりです ](https://qiita.com/advent-calendar/2021/gaogao) の2日目の記事です。昨日の記事は [ますみんさん](https://qiita.com/mass-min) の [リバースプロキシをDocker Compose環境で実現する](https://zenn.dev/masumi_sugae/articles/84c40d20c82cdd) でした。

こんにちは、[GAOGAO](https://gaogao.asia) の案件に携わらさせていただいている [こうりん](https://github.com/Kourin1996) と申します。 よろしくお願いいたします。

この記事では、GoのAPIでAuth0のJWT認証をする方法をハンズオン形式で説明します。今回実装するコードは以下のリポジトリに公開します。

https://github.com/Kourin1996/go-auth0-example

## 実行環境
maxOS Big

元記事を表示

2021年,Go言語でお世話になったライブラリ/検討したけど導入しなかったライブラリ

この記事は[Wanoグループ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/wano-group) 2日目の記事になります

今年、Go言語で新たにお世話になったライブラリや使用頻度が上がったライブラリを振り返ります。
けっこう今年は個人的にはGo周りは小ネタが多かったですね。。

# 2021年、お世話になったライブラリ
### [github.com/deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)
Open API 定義からGo言語のサーバーとかRequest/Response/構造体やモデル定義とかをGenerateするやつです。
今年は一部プロジェクトで新たにOpenAPIでのスキーマ駆動開発をとりいれましたので、その際に導入しました。
選定の理由は Open Api 3.0- に対応していた中で当時の言及数が多かったからです。

基本的にはモデル生成のみ使っています。

“`bash
oapi-codeg

元記事を表示

generic な golang gRPC サーバをつくる

# まえふり
gRPC サーバを実装するには protobuf ファイルから各言語のコードを自動生成し、各 RPC ごとの処理を実装することが一般的と思われる。一方で、どんな RPC に対しても同様な処理を行いたい generic な gRPC サーバを実現したい場合、もう少し簡単に RPC の追加を行いたい。

C++ の場合、このような generic な gRPC サーバを構築する方法はよく知られているように思う。[ここ](https://groups.google.com/g/grpc-io/c/NVtCvwiwIcE)のフォーラムで言及されているし、 一例を挙げると envoy の [json_grpc_transcoder](https://github.com/envoyproxy/envoy/blob/main/source/extensions/filters/http/grpc_json_transcoder/json_transcoder_filter.cc) で似たようなことは実装されている。
また、 Java でも[同様なことができる](https://gro

元記事を表示

OTHERカテゴリの最新記事