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

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

ECSでService Discoveryを使ってみよう

皆さんこんにちは!
シュークリーム大好きエンジニアの[くろちゃん](https://twitter.com/TakumaKurosawa)です。

こちらの記事は、[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)の23日目の記事です!
昨日は @h_km さんの[UnityプロジェクトにおけるSmartBeatの活用例紹介](https://qiita.com/h_km/items/50354e4864d0125c68fd)でした。是非チェックしてみてくださいね!

## 背景

11月と12月の2ヶ月間、[株式会社アプリボット](https://www.applibot.co.jp/)さんで内定者アルバイトをしていました。
そのうち、初めの1ヶ月間はゲームの新規タイトル開発プロジェクトのサーバサイド開発チームでお世話になっていました。

そこで一任していただいたタスクを実装した経験を元に、ECSでサービスディスカバリを使うための実装方法についてアウトプットしようと思います!

元記事を表示

goで ~~ is not a typeのエラーが出た原因と対応

goで独自で定義した型を使用していた時に`~~ is not a type`といったエラーが出たのでその原因と対応です。

## 何があったのか

“`go
type responce struct {
Ok bool `json:”ok”`
Messages []message `json:”messages”`
}

var responce responce

var replyResponce responce //responce is not a type
“`
このように独自で定義した構造体を使っていたら`responce is not a type`と言うエラーが出てきました。

## 原因
変数を定義する時の型が1回目はtypeを参照しているが、2回目は1回目で定義した変数を参照している。

## 対応

定義した構造体とは別の名前をつける。

“`go
type responce struct {
Ok bool `json:”ok”`
Me

元記事を表示

Firestore Emulator を使って GitHub Actions でテストを動かしてみる

この記事は [フラー Advent Calendar 2020](https://adventar.org/calendars/5034) の23日目の記事です。
22日目は [@ujikawa1026](https://adventar.org/users/33961) さんで
「[小さな開発組織のマネージャーになってから1on1で考えていることを少しだけ書く](https://namaninotiteti1026.hatenadiary.jp/entry/2020/12/22/000541)」でした。

#はじめに
はじめまして。
今年の4月から、フラー株式会社のエンジニアとしてアルバイトをさせていただいております。
普段は、サーバーサイドエンジニアとしてGoを用いたAPI開発を行っています。

今回は、Firestore EmulatorとGitHub Actionsによる自動テストを作成したので、記事にまとめてみました。

#きっかけ
3ヶ月ほど前にFirestoreとGoで書かれたAPIを作成する機会があり、
ついでにテストも書くことになったので、Github Actions

元記事を表示

LeetCodeに毎日挑戦してみた 121 Best Time to Buy and Sell Stock(Python、Go)

#### Leetcodeとは

[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。

golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。(Pythonは弱弱だが経験あり)

#### 30問目(問題121)

## 121 Best Time to Buy and Sell Stock

#### 問題内容

> Say you have an array for which the *i*th element is the price of a given stock on day *i*.
>
> If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design a

元記事を表示

GoLandを使いましょう 2020冬

# はじめに
この記事は[アドベントカレンダー Go5](https://qiita.com/advent-calendar/2020/go5)の22日目の記事です。

みなさん、Goのエディタ何を使っていますか?
Vim? Vscode?

そうですねGolandを使いましょう。

[去年](https://qiita.com/junpayment/items/f66e85af6a854ca2a296)も同じタイトルの記事を書いたのですが、最新バージョンも2020.3となり新機能が続々と加わっています。
基本的なセットアップの再掲とともに新機能で僕が良いなあと思ったものをピックアップして行きたいと思います。

# GoLandセットアップ
## 前提環境
mac
windowsやLinuxでも大体同じだと思います。多分。

##

元記事を表示

bitbucketのprivateリポジトリからgo modする

# 背景
* bitbucketで管理しているprivateなリポジトリから他のgo言語のモジュールを使いたい
* ソースコードは公開したくない

# 前提

* bitbucketにアクセスできるSSH鍵を登録している
* 補足:Personal settings > SSH 鍵
* この記事はgo version go1.14.2 darwin/amd64 で書いています
* これ以前のバージョンであると他の設定が必要かもしれません

# ローカル設定

SSH鍵を登録していればgitコマンドを使用してcloneやpushなどSSHプロトコルで行うことができるがgo get はhttpsプロトコルを使ってアクセスしている。

なのでgit(bitbuket)からSSHプロトコルを使って取得するために以下の設定を行う

“`
git config –global url.”git@bitbucket.org:”.insteadOf “https://bitbucket.org/”
“`

以下が追加されていること

“`
$ cat ~/.gitconfig
[ur

元記事を表示

terraform providerを作ったときのTips

Terraform の provider を試しにつくってみたときのTipsと苦労話をまとめてみました。

## 前提

今回つくったのは deploygate provider です。
まだまだ、作成途中ですが、アプリへのテスターの招待と削除の機能は実装しました。

– https://github.com/fnaoto/terraform-provider-deploygate

これを作るにあたって、 APIクライアントとしてこちらを使わせていただきました。

– https://github.com/recruit-mp/go-deploygate

参考にさせていただいたサイト

– https://learn.hashicorp.com/tutorials/terraform/provider-setup
– https://github.com/hashicorp/terraform-provider-aws
– https://github.com/jmatsu/terraform-provider-slack
– https://github.com/wizapla

元記事を表示

GoLandでgoimportsにショートカットを登録する

# はじめに

GoLandでは、importを自動で行ってくれるのですが、たまに良い感じにやってくれないときがあります。(自分だけでしょうか?)

そこで、goimportsを実行するのですが、デフォルトではgoimportsにはキーボードショートカットが割り当てられていないので登録してみました。

# やってみる

GoLandでgoimportsを使いたい時は以下の操作を行う必要があるのですが、めんどくさいです。
そして、キーボードショートカットが割り当てられていません。

![スクリーンショット 2020-12-20 19.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631794/97468325-9592-26e1-27de-b9681c00c865.png)

てことで、登録します。
デフォルトでは、 `⌥ + ⌘ + L` でコードをフォーマットできるのですが、goimportsはコード整形もやってくれるので、今回はこれに上書きしたいと思います。

やり方は、
`⌘ + ,

元記事を表示

MackerelでGoroutineのブロックを検知したい

[Mackerel Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mackerel) 22日目のエントリです。

先日、とあるGo製のアプリケーションで、Goroutineの処理がブロックされて停止していることで、アプリケーション全体の動作が停止するということがありました。
このような問題を検知するための監視をMackerelで行う方法を考えてみたので、このエントリで紹介します。

Mackerelでは、mackerel-agentのプラグイン機構やカスタムメトリックなどの機能によって、監視対象のシステム/アプリケーションの特性にあわせた様々な監視を実装することができます。これらの機能を使って監視実装をしてみます。

## アプリケーションの動作が停止したときの状態

まずはじめに、問題のアプリケーションの動作が停止していたときに、どのような事象が発生していたかを説明します。

以下は、アプリケーションに問題が発生していたタイミングにおけるGoroutineのスタックトレースの一部です。

“`
gorout

元記事を表示

Goクイズ: int = float64

以下のコードを実行すると何が起こるでしょうか?

“`go
package main

import “fmt”

const a int = 2

type number = int
type int = float64

func main() {
const b int = 2
const c number = 2
fmt.Println(1 / a, 1 / b, 1 / c)
}
“`

1. `0 0.5 0` が出力される
2. `0.5 0.5 0` が出力される
3. `0.5 0.5 0.5` が出力される
4. コンパイルエラー

回答

`0.5 0.5 0.5` が出力されます. [block と scope](https://golang.org/ref/spec#Declarations_and_scope) の問題で type alias はあまり関係ありません.
Go標準の `int` 等の識別子は最も外側のブロックである `universe block` に存在し,内側

元記事を表示

gRPCのGraceful Shutdown

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

gRPCのメトリクスを取得するためにPrometheusを使う際にGraceful Shutdown を行う際の例になります。
やりたいことは「どちらかのサーバでエラーや特定のシグナルが発生した場合すべてのサーバを安全に停止する」です。
## 注意
Goで作るgRPCのServerでのメトリクス取得が対象です。
## 要約
今回は[run](https://github.com/oklog/run)を使ってGraceful Shutdownを作ります。
[errgroup](https://godoc.org/golang.org/x/sync/errgroup)という便利なパッケージもあります。
## ざっくりとした背景
gRPCのメトリクスを取得しようとした際、[go-grpc-prometheus](https://github.com/grpc-ecosystem/go-grpc-prome

元記事を表示

ポリモーフィズムについて

# はじめに
こんにちはやまねです。アクシスに入社して8ヶ月が経ちました。毎日戸惑いながらも働いています。
今回は8ヶ月前にあまり理解できなかったポリモーフィズムについて取り上げたいと思います。

# ポリモーフィズム
ポリモーフィズムとはオブジェクト指向プログラミングの概念の1つであり、日本語で`多態性`、`多様性`と訳されます。
シンタックスシュガーが`糖衣構文`と訳されるくらいぱっと見よく分かりにくいですが、オブジェクト指向の文脈で言うと、
> 同じ名前のメソッドを複数のクラスで使用でき、かつ異なる振る舞いを実現することができる仕組み

だと説明されます。

ただ、これには二つ疑問点がありました。

– それより以前のプログラミングにはポリモーフィズムのような仕組みは存在しなかったのか?
– ポリモーフィズムって結局何が利点なのか?

です。

# オブジェクト指向プログラミング以前にはポリモーフィズムのような仕組みは存在しなかったのか?
調べたところポリモーフィズム自体がオブジェクト指向以前のプログラムになかったのかと問われれば、あったようです。(仕組みとしてはないみたい)

元記事を表示

始まる前に終わったJolojo、華麗に復活なるか?

[実用HeadlessCMSになりそうな『Jolojo』の紹介と、『SveltElm』な開発スタイル。](https://qiita.com/e-a-st/items/83778a69863af4f1b0d0)でも期待をもって紹介されている[Jolojo](https://www.jolojo.com/)。

Go言語で書かれており、フロントのSvelteと組み合わせることで、最強最速のプラットフォームが完成します。

# The World’s fastest CMS system

\>>> 世界で最も高速なコンテンツマネジメントシステム <<< ![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/af33a8aa-b2d5-6b42-c359-82140f97432e.png) と、なかなかに挑戦的な文言が目に入ります。 実際に[Googleのベンチマーク](https://developers.google.com/speed/pagespeed/insights/)で計

元記事を表示

Bazel の Remote caching を試してみた

この記事は 弁護士ドットコム Advent Calendar 2020 22日目の記事です。
昨日の記事は @komtaki さんの [オオカミ少年にならないフロントエンドエラー監視システムの工夫 – Qiita](https://qiita.com/komtaki/items/ca35d3e0aee73708a540) でした。システム監視。大事ですね。

本日は OSS ビルドツール **Bazel** のリモートキャッシュ機能を試してみた記事です。

# Bazel とは?
Bazel は Google が開発した Make, Maven, Gradle と似た OSS のビルド及びテストツールです。主な特徴としては下記が挙げられています。

– **High-level build language** : 抽象的でヒトが読める記述を採用していて、従来の複雑な記述からユーザーを保護します。(その分内部で何をやっているかぱっと見てわからないところもあるかもしれませんが、後述する拡張性の恩恵を受けていると思います)
– **Bazel is fast and reliable**

元記事を表示

go moduleリストにライセンス情報を付与して出力するツール作りました

この記事は [Go 4 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/go4) の23日目の記事ですʕ◔ϖ◔ʔ

普段は業務でC#を書いたり、CI/CD基盤の構築に頭を悩ませたり、ちょっとしたツールやWebサービスをGoで書いて人や組織の隙間を埋めるお仕事をしています、[kemokemo](https://github.com/kemokemo)と申します。お初にお目にかかる方、はじめまして。お久しぶりの方、お元気ですか?

Goを書き始めて、Goが大好きになって、Goでいろんなものを作り、Goを通じてたくさんのことを学びました。それこそ、「[^1]*I am the bone of my go…*」と詠唱のひとつもしたいぐらいに。

[^1]: 好きな魔術は、Unlimited Blade Worksです。

今日は、そんなGoでソフトウェアを開発して、OSSとして公開する時に使えそうなツールを作ったのでご紹介します!ʕ◔ϖ◔ʔ

## 作ったもの

![スクリーンショット 2020-12-20 20.3

元記事を表示

goで作るAPIのセキュリティを考えた

この記事は [Goodpatch Advent Calendar 2020](https://qiita.com/advent-calendar/2020/goodpatch) の21日目です。

## はじめに

golangによるAPI開発時のセキュリティについて考えてみました。

まず、サービスの前提条件。

– ステートレスな設計であること。
– コンテナ運用に適していること。
– マイクロサービス化も前提とすること。
– APIの利用先はWebサイト、もしくはアプリケーションを対象とする。

### APIのセキュリティを強化する一般的な方法

1. トークンを使用
信頼できるIDを確立してから、その後はIDに割り当てられたトークンを使用して、サービスおよびリソースへのアクセスを制御します。
2. 暗号化と署名を使用する。
TLSなどの手段を使用してデータを暗号化します。署名を使用して適切なユーザーがデータを復号化および変更が出来るようにします。
3. クォータとスロットリング
APIを呼び出す頻度についてクォータを設定し、使用履歴を追跡します。
4. APIゲートウ

元記事を表示

Google Slides APIを使ってみた

# はじめに
ABEMAの広告プロダクト開発でサーバーサイドエンジニアをしているimaiです。

今回は[CyberAgent PTA Advent Calendar 2020](https://adventar.org/calendars/5741)の22日目の記事になります。

# きっかけ
部署内でプレゼン資料を自動で作成したい。ってお話があったのでGoogle Slidesを編集するアプリを作成しました。
そこで **Golang** にて **Slides API** を実行して実現しておりその中で得た知見を気していこうと思います。

# 実行してみる
### サービスを作る
[クイックスタート](https://developers.google.com/slides/quickstart/go)では `slides.New(client *http.Client)` を使用していますがこれは **Deprecated** となっているので `slides.NewService(ctx context.Context, opts …option.ClientOption

元記事を表示

VSCode + Remote Containerで環境構築(go編)

n版煎じかなとも思いつつ、md思い出しがてらとか鮮度とかいろいろ考えてとりあえず書いてみる。

—–

# 1. 前提環境

– [VSCode](https://code.visualstudio.com/download)
– [Docker Desktop](https://www.docker.com/products/docker-desktop)

これ以外には基本的に準備不要。VSCode必要プラグイン(Remote Containers)については次項で途取り上げる。

Windows 10(Pro)で動作確認しているが、恐らくhome含め他OSでも問題ない(homeの場合は別途WSL2が必要)。

# 2. 必要プラグインの導入

[Remote – containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)

拡張機能(Extension)のタブを開き、検索欄に”Remote Containers”と入力する(記述現在では

元記事を表示

GoのBRMS(Grule)でビジネスロジックを管理する

この記事は、[株式会社アトラエ アドベントカレンダー](https://qiita.com/advent-calendar/2020/atrae)21日目の記事です。

# BRMS
ビジネスルールをアプリケーションと切り離して管理するためのもので、業務要件やビジネスの制約をルールとして定義してアプリケーションで実行することができます。

# BRMSを調査した背景
レガシーなサービスの大規模なリファクタを行っているのですが、その時に頭を悩ます問題なのが、 **何に使われているデータなのか分からない** ものと遭遇することです。
**状態を表すカラムが存在し、さらにパッと見同じようなカラムが複数存在したり、抽象的な名前だったり**で、コードを読みながら挙動を確認して理解するという調査の過程が作業時間のほとんどを占めています。
データの構造を理解した上でリファクタと同時にテストコードを書いていますが、進めるに連れて**過去にリファクタした機能のビジネスルールが記憶から薄れて**いきました。
**ビジネスルールをテストコードで確認する**のはいささか辛いなと思い(ドキュメントにまとめてない

元記事を表示

gormで一時的にPreloadやsave_assosiationの関係性を構築する

この記事は[Wanoグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/wano-group) 20日目の記事になります。20ったら20です。

突然ですが、ここに、image_assetというモデルがあるとします。
集約です。

“`json:image_asset
{
“id”: 13,
“user_id”: 1,
“asset_id”: 28,
“asset”: {
“bucket”: “988323dc-42e1-11eb-9c12-8c859050389c”,
“location”: “852cb6b4-f0d0-4ace-a1c3-2966c7027985”,
“mime_type”: “test/mimetype/image/repo”,
“upload_datetime”: null,
“filename”: “988323e6-42e1-11eb-9c12-8c859050389c”,
“s3_storage_clas

元記事を表示

OTHERカテゴリの最新記事