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

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

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

元記事を表示

「IDOLY PRIDE」でGo、gRPC、Cloud Spannerに挑戦してみた

[QualiArts AdventCalendar](https://qiita.com/advent-calendar/2021/qualiarts) 2日目の記事は、「[IDOLY PRIDE](https://idolypride.jp/game/)」のバックエンドエンジニアをしている朝倉が担当します。

# はじめに

2021年6月にリリースした「[IDOLY PRIDE](https://idolypride.jp/game/)」では、QualiArtsのゲームバックエンドとしては初めてGo、gRPC、Cloud Spannerを採用しました。本記事では、それらの技術に挑戦した理由やリリース・運用を経験してそれぞれの技術の良かった点・苦労した点をまとめたいと思います。

それぞれの技術に対してバックエンドメンバーにアンケートを記入してもらい、そのアンケートをもとに(ゲームバックエンドでのユースケースにおける)良かった点・苦労した点を振り返りしました。次章から振り返りで話し合った良かった点・苦労した点を品質特性の軸で紹介していきます。

**アンケートの内容**
それぞれの

元記事を表示

1つのKubernetesクラスタで複数のシングルテナント向けの証明書を取り扱う

# 背景
あるところに、[Azure Kubernetes Service](https://azure.microsoft.com/ja-jp/services/kubernetes-service/)を用いたWebサービス公開に携わる一人のエンジニアがおりました。
ある日彼はこんなことを考えました。

(-“-)「今開発中の機能はサーバー負荷がかなり大きい…」
(-“-)「利用が集中すると他のユーザーに影響する恐れがある…」
(-“-)「でもユーザーによってはそういった形での業務影響が許されない…」
(・_・)!「よし、シングルテナント構成を取れるようにしよう」

そこで彼はハイパフォーマンスを要求するユーザー向けに個別のクラスタ構成を定義し、それぞれを別のnamespaceで動かすことを考えました。また各ユーザー向けには専用のサブドメインを切り、[Azure DNS](https://azure.microsoft.com/ja-jp/services/dns/)を用いてドメイン毎に別のクラスタが利用されるよう振り分けを行うことにしました。

めちゃ雑に図にするとこんな感じです。

元記事を表示

Go の image/color パッケージの color.RGBA に透明度を正しく指定する&過ちの共有

# まえがき
これは[株式会社ピーアールオー(あったらいいな!を作ります) Advent Calendar 2021](https://qiita.com/advent-calendar/2021/pro-japan1) 2日目の記事です。
初日は [pro_matuzaki](https://qiita.com/pro_matuzaki) さんの「[周回遅れで試すNotion API](https://qiita.com/pro_matuzaki/items/43d492f6491410e68e5d)」でした。
また本記事の内容は[個人ブログの記事](https://blog.84b9cb.info/posts/go-colorcode-to-rgba/)の再編です。

**開発環境**
go version go1.16.5 linux/amd64
# 要約
Go の image/color パッケージの color.RGBA に設定する RGB 値は、透明度を 0 ~ 1 に正規化した値を RGB 値に掛け合わせた値を用います。
つまり R: 162, G: 173, B: 5,

元記事を表示

【AWS SAM Go】Go*SAM で環境変数を導入するには

## 前提
AWS SAM を用いてAWSのリソースをコードで管理できるようにしています。(Infrastructure as Code)
今回はSAMでAWS lambdaを作成し、その上でGoで書かれた関数を実行できるようにしております。
また、今回利用するSAMはAWS SAM [テンプレート](https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html)を使用してサーバーレスアプリケーションを作って作成しました。
環境は“default“環境のみで動作させてます。

## 結論
ローカル起動時(sam local start-api / sam local invoke)とデプロイ時(sam deploy)とで、環境変数の読み込み方法には違いがあります.

### ローカル起動時に環境変数を読み込むには
#### 1. env.jsonを利用する方法
1. ルートディレクトリに“en

元記事を表示

Fake Time

# Overview
Fake Time for test. not best way.

# Detail
“`golang

var now = Time.Now

// if you want to use specify time, you call it. then replace time to argument valuen.
// then, you receive function is for revert original time module. for finish test, recommend call by defer
func switchFakeTime(t time.Time) (revertFakeTime func()) {
now = func() time.Time {
return t
}

return func() {
now = time.Now
}
}

fmt.Println(now())

revertFunc := switchFakeTime.(Time.Now())

fmt.Println(now(

元記事を表示

golangはじめました

# 概要
素人としてこの1ヶ月間Golangでアプリケーション作ることになりましたので、所感や実際調べたことについて共有し、少しでも参考になれれば幸いです。

# とりあえず現時点でのディレクトリ構成を貼ります

左が`root`ディレクトリで右が`src`ディレクトリ配下です。
`src`というディレクトリを切るかどうかで結構悩んでいましたが、とりあえず切ることにしました。

# IDE、開発環境、実行環境
**IDEは下記の理由でVSCodeにしました。**

元記事を表示

【Go言語】はじめてのGraphQLサーバ実装 | gqlgen

# この記事について

この記事は、Go言語でGraphQLサーバの開発をする方法を書きます。

### この記事で書くこと

– GraphQLのスキーマ定義
– Go言語でGraphQLサーバの開発方法
– フレームワークとして[gqlgen](https://gqlgen.com)を利用
– エラー処理
– 負荷対策
– N+1問題
– クエリの大きさ判定

### この記事で書かないこと

– Go言語の説明
– GraphQLの概要について
– バックエンドのデータベース(MySQL等)への接続方法

### ソースコード

この記事で紹介するコードはGithubに置いております。
https://github.com/hiroyky/go_graphql_server_sample

# 前提条件

– Go言語の基本的な知識があり、お使いのマシンでGo言語のビルドや実行ができる。
– GraphQLの概要について知識がある。

GraphQLの概要は[公式](https://graphql.org)が詳しく説明をしています。
また、2021年11月

元記事を表示

ファイルパーミッションでスロットがしたい

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

ファイルパーミッションでスロットするコマンドラインツールを作りました。

# 経緯

ある日、サーバ上のとあるファイルの実行権限を変更する事がありました。

“`bash
$ ls -lah sample_cmd
-rwxr–r– 1 jiro4989 jiro4989 0 Nov 21 15:14 sample_cmd*

$ chmod 0777 ./sample_cmd

$ ls -lah sample_cmd
-rwxrwxrwx 1 jiro4989 jiro4989 0 Nov 21 15:14 sample_cmd*
“`

この `chmod 0777`って数字が3つ並んでるからパチスロみたいだなーーーと唐突に思いました。[^1]
(パチスロやったことないですが)

[^1]: `chmod` は8進数モード以外にも `chmod +x` で実行権限をつけたり、`chmod u+rwx,o-x,g=r`など

元記事を表示

引越し業界初の新サービスを支えるバックエンドの技術

この記事はエイチーム引越し侍/エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect)一日目の記事です。

2021年も終わりが近づいて来ましたね〜!
初日は、エイチーム引越し侍でバックエンドを主に担当している**新卒2年目・完全感覚programmer**の@sho-hataが担当します!!

## はじめに
**「引越し侍 ネット見積もりサービス」**

https://hikkoshizamurai.jp/moving

というサービスを11月1日にリリースしました(β版)?
![Screenshot 2021-11-30 22.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/72885172-7ed5-8591-50e1-99d88

元記事を表示

Go言語で整数を5バイトに押し込む簡単なお仕事

[![Github](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1646184/0e201e0c-e21f-a715-4353-142b23059ccd.png)](https://github.com/Soliton-Analytics-Team/GoUint40/) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Soliton-Analytics-Team/GoUint40/blob/main/GoUint40.ipynb)

ご覧いただきありがとうございます。[ソリトンシステムズのセキュリティ分析チーム](https://www.soliton-cyber.com/)です。

Google Colaboratoryにアカウントをお持ちの方は、上の「Open in Colab」という青いボタンを押せば直接noteboo

元記事を表示

ghzでgRPCの負荷試験(Benchmark Test)を行います hz

## はじめに
gRPCの負荷試験の為に[ghz](https://github.com/bojand/ghz)というツールを使おうと思うのですが、「hz」の意味がわからず読み方がわかりません。?
ちょっと洋式トイレにも見えます。

## 基本的な使い方

### インストール方法

githubのどトップに書いてあるので説明するまでも感がありますが、一応。
MACerなのでbrewでインストールしております。

“` sh
brew install ghz
“`

### 実行コマンド

“` sh
ghz –config=./config.json
“`

### configファイルの中身

“` json:config.json
{
“name”: “Otsuka Test”,
“call”: “akame.Linebot.ReplyMessage”,
“host”: “0.0.0.0:50051”,
“total”: 15000,
“concurrency”: 300,
“connections”: 300,
“rps”: 3000,

元記事を表示

Cloud FunctionsをGo言語で動かす

# 概要

firebase で Cloud Functions を使ったときに、JavaScript と golang で作った function とで性能に差がでるかを簡単に確認したのでそのメモ

## firebase の Cloud Functions で Go言語使える?

らしい。のでやってみました。
やり方としては、以下参考の「[go言語でCloud Functions + FireStoreをhttpで使ってみた](https://www.wheatandcat.me/entry/2019/01/29/001032)」を参照しつつ、ざっくりとは次の手順で環境を構築しました

– firebase のコンソールでプロジェクトを作成
– firebase に javascript 版の Cloud Functions の関数をデプロイする
– golang で Cloud Functions の関数を作成し、GCP にデプロイする
– firebase のプロジェクトを使いまわして、GCP の Cloud Functions を作成するのがミソ

### 参考

元記事を表示

【os.FileInfo】ファイルの属性情報【Golang】

# はじめに
Golangでファイルに関するインターフェースの一つ、os.FileInfoを簡単に調べたのでメモ

# 定義

“`go
type FileInfo interface {
Name() string // base name of the file
Size() int64 // length in bytes for regular files; system-dependent for others
Mode() FileMode // file mode bits
ModTime() time.Time // modification time
IsDir() bool // abbreviation for Mode().IsDir()
Sys() interface{} // underlying data source (can return nil)
}
“`
その名の通り、ファイルの情報に関するインターフェース
FileInfoはファイル情報を取得するメソッドが使用できる

FileI

元記事を表示

【Golang/ goenv】goenv install -lで古いバージョンしか表示されないときの解消法

## 原因

goenvのバージョンが古い

## 解消方法

アンインストールしてから新しいバージョンをインストール

“`
brew uninstall goenv && brew install –HEAD goenv
“`

で解消しました!

元記事を表示

AWSLambda(Golang)×DynamoDBのローカル開発環境を整える

# 目的
AWS LambdaでバックエンドAPIを構築しているとき、関数の挙動を確認したいときは都度devにデプロイしていました。流石にローカルでの開発環境を整えたいと思ったのですがGoでの使い方の情報が少なかったので個人メモとしてまとめてみました。
今回はAPI GatewayがトリガーのLambda関数になります。
APIトリガー以外は
→[`serverless invoke local -f ` で十分らしいです](https://blog.70-10.net/2018/08/29/serverless-typescript/#4-code-classlanguage-textserverless-offlinecode%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)

# 全体の流れ

以下のJavascript filesのところを今回はGolangにしてやってみます

元記事を表示

Goで Quick Select を書いた

日本語の資料が乏しかったので,ここにまとめます。
必要な前提知識も多く、この記事単体では完結していないです。
詳しくは、参考文献等をご参照ください。
また、書かれているコードは、以下の問題で検証済みですが、
不十分であるため、コピペされる方は自己責任でお願いいたします。

https://atcoder.jp/contests/abc228/tasks/abc228_c

## Quick Select とは
「ある配列の中で、k番目に小さい値はいくつ?」に答えるアルゴリズム。
クイックソートの要領で pivot を選択し、pivotを元に、配列を分割しながら答えを探す。
愚直に考えると、ソートしてk番目をとればいいが、その場合は、最悪計算量がソートがボトルネックになり$O(nlogn)$になる。
一方、このアルゴリズムは、平均計算量$O(n)$で解くことができる。

## 実装方針
pivot の選択方法には、以下の方法があるが、今回は中央値の中央値をpivotにすることにした。

– 常に左の要素を採用する
– ランダムに取得した要素を採用する
– 中央値の中央値を採用する

また

元記事を表示

Golang + EchoでJWTを使ってみる

#はじめに
JWT(JSON Web Token)をSPAに使用するべきか否かの議論はありますが、今回はそれは度外視にGolangのEchoでJWTを使用するケースを想定し、実装をしてみようと思います。今回は説明を省きますが、当方フロントエンドにNext.js、AuthenticateにFirebaseを一部使用しています。またJWTの基本的な説明は公式サイトや他参考記事をご覧ください。

# ゴール
– 任意のペイロードを設定できる
– GoアプリケーションでJWTが発行できる
– リクエスト内にJWTトークンを認可し適切な処理ができる
– JWTの送信者の本人認証ができる

# 実行環境
– Mac 11.5.2
– Docker Desktop 4.0.0
– Golang
– Echo
– Gorm

# イメージ図
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/932783/36b0a2f0-ea77-fdb4-5188-fc86641b2636.png)

# 手順一覧
– E

元記事を表示

いろいろな言語でAPIコールするよ!

## 導入
webAPIの叩き方を各言語でまとめました。
後で見返す用です。
2021年11月23日時点:Postリクエスト送信

### json リクエストのサンプルパラメータ

“`python
sample_endpoint = “http://localhost:8888/sample”
sample_parameter = {
“title”: “トマトスープ”,
“making_time”: “15分”,
“serves”: “5人”,
“ingredients”: “玉ねぎ, トマト, スパイス, 水”,
“cost”: “450”
}
“`
### Curl
“`terminal
curl –location –request POST ‘http://localhost:8888/recipes’ \
–header ‘Content-Type: application/json’ \
–data-raw ‘{
“title”: “トマトスープ”,
“making_time”: “15分”,

元記事を表示

【Golang】ポインタ型の int 変数に値をセットする

ここ 1 年で作成・更新された記事を[「”golang” ポインタに値をセットする int」でググって](https://www.google.com/search?q=%22golang%22+%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E3%81%AB%E5%80%A4%E3%82%92%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B+int&tbs=qdr:y)も、わかりやすいタイトルがヒットしなかったので、自分のググラビリティとして。

## TL; DR (今北産業)

“`go:変数の前に*を付ける
func resetToTen(i *int) {
*i = 10 // <- ここ } ``` ```go:動くサンプル package main import "fmt" func main() { i := 100 resetToTen(&i) fmt.Println(i) } func res

元記事を表示

OTHERカテゴリの最新記事