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

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

Go言語にジェネリクスが入りそうなのでモナドを作って遊んでみた

この記事は [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 14日目の記事です。
前日は @naotoritty さんの「[Goでのベンチマークツールを作ろうとした話](https://qiita.com/naotoritty/items/3766d2d1aeef7fd17904)」という記事でした。

# はじめに

こんにちは。 (株)Applibotに勤める**型理論信者**エンジニアです。
現在、Goにジェネリクスを導入する動きが進んでいます。
ジェネリクスが入ることでGoは**「ダックタイピングなインタフェース」と「ジェネリクス」を持つ言語**になります。
静的型付けの言語としてはなかなか面白い特徴だと思ったので、モナドを題材にしてこれらがどのように機能するか試してみることにしました。

※この記事は「モナド」と「ジェネリクス(パラメータ多相)」を理解している方向けです

## Goのジェネリクス

はじめに、Goに導入されるであろうジェネリクスについてざっくりと

元記事を表示

GoシングルバイナリDockerイメージビルドでハマったこと

こんにちは、株式会社medibaでバックエンドエンジニアをしている @mdbr92 です。
この記事は [mediba Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mediba) の14日目です。
※記事の内容はあくまで個人の発信であり、会社を代表する意見や見解ではありません。

この記事では
Go 言語で記述した HTTP サーバプログラムを AWS ECS などで動かすために
シングルバイナリ Docker イメージを作成しようとした際に
ハマってしまったことを書きたいと思います。

# なぜシングルバイナリイメージにしたいのか?

Go言語で記述したプログラムはシングルバイナリ
(ランタイムを必要とせず単体で実行できるファイル)にビルドできます。

この実行ファイルのみを scratch(Docker の予約済みの最小限のイメージ)に乗せて
ビルドすると 10MB 前後の小さな Docker イメージを生成することができます。

イメージのサイズが小さいことで、
AWS ECR のようなレジストリへの保

元記事を表示

Goのソースコードのファイル名の末尾が_ios.goだとビルド対象にならない

# 問題
Goで以下のファイル名を使うと多くの場合に問題が生じます。
なぜでしょうか?

“`
hoge_ios.go
“`

# 解答
ファイル末尾の `_ios.go` がbuild constraintだとみなされるため。
Goにはビルド対象の環境毎にソースコードを変えることができるbuild constraintという仕組みがあります。

https://pkg.go.dev/go/build#hdr-Build_Constraints

そのため、Windows環境でのみ利用できる機能とLinux環境でのみ利用できる機能を混在させることもできます。
この指定はファイルの先頭に以下のように書くことができますが、ファイル名で指定することもできます。

“`go
// +build windows
“`

ファイル名で指定する場合は、ファイル名の末尾を `_windows.go` とすると、上記と同じ効果が得られます。

windowsやlinuxなどは良く知られたものなので、目にする機会も多いかと思います
しかし、このbuild constraintに指定できる対象は意

元記事を表示

エラーハンドリングをミスって大事故に

# はじめに
アドベントカレンダー初参加です!
とある企業でサーバーサイドエンジニアとして働いており、主にGoでAPIを実装しています。

今年に入って新規事業の開発を任され、色々やらかしを経験させていただきました。

その中でも一番のやらかしを自戒の念も込めて投稿したいと思います。

*特定を避けるために敢えて分かりづらく表現している箇所があります。その点ご了承くださいmm*

# 惨劇発覚前夜
とある会員制サイトのリリースを控えており、それに備えて色々準備を整えてました。
リリース当日はそれなりにアクセス急増が見込まれるので

– ALBの暖気申請
– フロントエンドサーバーのスケールアウト

等の対応を行いました。

今までも似たようなサイトをいくつかリリースしており、上記の対応でアクセスは捌けていたので今回も同様の対応で問題ないと思ってました。

リリース当日PM20:00 にサイトのURLを公開。

今までをはるかに上回るアクセスが来ましたが、特にサイトの表示につまることはなく、当日のリリース作業を終えることができました。

# 惨劇発覚
次の日、朝起きるとサポート用メアドに

元記事を表示

[Hands-On Serverless Applications with Go] やってみた感想

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

## はじめに
表題通り、**Hands-On Serverless Applications with Go**という書籍を一通り読んだ感想を書きます。

初めて英語の技術書を読みながら手を動かしましたが、英語で書かれていること自体はいいのですが、**約400P**となると数日で読み終えるのは難しいですね。
この書籍は夏の夏季休暇中に読破したので、2週間ちょっとかけて私は読み終えました。

最近は、[Udemy](https://www.udemy.com/)を筆頭に自分で勉強しようと思ったときにセール中なら書籍を購入するよりも安く学習できるサービスも増えてきています。
しかし、実際の業務レベルのハンズオンになるとweb上のサービスだけでは難しいとも思います。
この書籍は初心者向けでは決し

元記事を表示

誕生日CTFにてコードゴルフを裏開催した話

本記事は[23卒のエンジニア職志望向けAdvent Calendar Advent Calendar 2021](https://qiita.com/advent-calendar/2021/23grads) の10日目の枠が空いていたので、登録された記事です。
11日目の記事は、@yamamoto-yuta さんの [SlackをTweetDeckぽく使えるChrome拡張機能を作った話](https://qiita.com/yamamoto-yuta/items/c9c5ea0912b02aa14e23) です。中々イケてるので、ぜひ読んでみてください!

# はじめに
今年も、誕生日なので初心者から中級者向けに、taskCTFを開催させていただきました。
開催はこれで3回目です([過去の開催レポート](https://qiita.com/task4233/items/09f112076eb5855eeed3))

正の得点を獲得した参加者は36人で、そのうち全完した参加者は8人(22.2%)でした。
ご参加いただいた方々、ありがとうございました :bow:
おかげさまで、今年も楽

元記事を表示

ターミナル上でポーカーのヘッズアップがしたい

こんにちは!株式会社アトラエで「転職サイトGreen」のエンジニアをしている浅水です。

この記事では、僕がポーカーのヘッズアップを愛用のターミナル上でやってみたい!!と夢見そして、
半分成功、半分夢半ばで挫折した話を書いていきたいと思います。

## 作ったもの
![gamen_test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1743458/565d7d24-7ac5-4f35-e828-29ab4d80ea2e.gif)

こんな感じで、**[go_poker](https://github.com/klein-mask/go_poker)**というTUIで起動するポーカーゲーム(と言えるほどのクオリティではない)を作ってみました。

### 使用したもの
– **Go 1.17**
– **[tview](https://github.com/rivo/tview)**
– TUI作成のライブラリ的な

### できること
– ターミナルでテキサスホールデムのヘッズアップがなんと

元記事を表示

GoでDDDっぽいコードを書く方法をGo初心者が考えてみる

こちらは [ラクス Advent Calendar 2021](https://qiita.com/advent-calendar/2021/rakus) の13日目の記事です。

初めまして。今年の10月にラクスに入社した@Imamottyです。
入社して2ヶ月余りが経過しました。日々覚えることが多く大変ですが、成長を感じる毎日です。
新参者ですが、よろしくお願いします。

# テーマ:「アドベントカレンダー」のドメインモデルを考えて、GoでDDDっぽいコードを書いてみる

さて、本題ですが、チームで開発を担当するアプリケーションのバックエンドにGoを採用することになり、
せっかくなのでGoのコーディングの練習にもなりそうな形でアドベントカレンダーのテーマを考えました。

今回は **「アドベントカレンダー」** をテーマにドメインモデルを考えて、
DDDっぽくコーディングすることを目指していきたいと思います。

ちなみに[A Tour of Go](https://go-tour-jp.appspot.com/)をなんとか完走した感じのGo初心者なので、実装の稚拙さはお許しください

元記事を表示

【Golang】JSON を Unmarshal すると struct field tag `json: “ほげ”` not compatible with reflect.StructTag.Get 【bad syntax】

> Go 言語で JSON データを Unmarshal(Go オブジェクトにパース)する際に、JSON オブジェクトのキー名に日本語が使えないか試したら `bad syntax` エラーが出る。
>
> “`bash:エラー内容
> struct field tag `json: “ほげ”` not compatible with reflect.StructTag.Get: bad syntax for struct tag value
> “`

[「`”golang” json unmarshal struct field tag not compatible with reflect.StructTag.Get`」でググって](https://www.google.com/search?q=%22golang%22+json+unmarshal+struct+field+tag++not+compatible+with+reflect.StructTag.Get)も、日本語の情報がなかったので、自分のググラビリティとして。

## TL; DR

元記事を表示

Docker + Vue.js + Go言語で映画館の空席状況を取得する

[ディップ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/dip-dev)の13日目の記事です。

## はじめに
ディップ株式会社でPHP(Laravel)を使って求人系サービスの開発や社内向けツールの開発を行なっている@taku-0728です。
今回はタイトル通り`Docker + Vue.js + Go言語`を使って映画の上映状況を取得してみます。
Vue.jsとGo言語を使った記事を書くのは初めてでお作法的な部分もまだ理解が浅いため、
有識者の方からみると違和感を感じる部分もあると思いますが、こう書いた方がいい等あればコメントにてご指摘いただければ幸いです。

前置きがながいので、実装方法について詳しく知りたい方は[実装](#実装)からお読みください。

## こんなこと経験ありませんか?

:grin::話題のあの映画がついに公開だって!今度の週末見に行きたい!近くの映画館で空いてる時間ないかなー

:movie_camera::「「「全時間帯満席です」」」

:angry::1日予定がないから何時で

元記事を表示

[初心者向け] ゼロから始めるGo + Nuxt.js + Terraform + AWS + DockerでWebアプリ開発

# はじめに
はじめまして、大学院(非情報系)卒業後、Web系企業でインフラ業務を担当している新卒1年目です!
これまでWebアプリ開発の経験があまり無かったので、スキル向上のためGo (Echo)とNuxt.jsを使用し、1ヶ月程かけてアプリ開発を行いました。
GoとNuxt.jsに関しては完全に未経験の状態からのスタートでしたが、なんとか形にすることができたので、アプリケーションを完成させるまでの進め方や学習方法をまとめていきたいと思います。
皆様のご参考になれば幸いです!

# 開発したアプリケーション
![スクリーンショット 2021-12-12 14.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302831/93a519fa-fc5b-5ee3-319c-45e80a7c5875.png)

GitHubのissueやrepositoryを豊富なフィルタ機能を利用して検索できるサービス([gitnavi](https://gitnavi.dev/ja))を開発しました。
(今後も

元記事を表示

Go Fyneで遊んでみた

# はじめに
こんにちは。@af-2784です。
入社してから1年半、バッチやAPIなど、Goでバックエンド中心の開発をしてきましたが、
たまにはGUIの開発をしてみたい、オシャンな画面を作ってみたい…!
調べてみたら、Goには[Fyne](https://pkg.go.dev/fyne.io/fyne/v2)というGUIライブラリがあると知り、今回はこちらを少し触ってみたいと思います。

# 準備
Fyneをインストールします。

“`shell
$ go get fyne.io/fyne/v2/app
$ go get fyne.io/fyne/v2/widget
$ go get fyne.io/fyne/v2/container
$ go get fyne.io/fyne/v2/canvas
“`

# Hello World
何事もまずはHello Worldから。
`hello := widget.NewLabel(“Hello World!”)`のようにウィンドウに表示したいオブジェクトを定義し、SetContentの中に定義したオブジェクトを入れれば、GUIの画面に

元記事を表示

CDK for Terraform をニフクラ provider で試してみた

この記事は [富士通クラウドテクノロジーズ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/fjct) の13日目です。
12日目は @kzmake さんの [daprのActorをつかってみる](https://qiita.com/kzmake/items/ca0791350d941ce9d29a) でした。
dapr は数多くの機能があるので、ぜひ学習して使っていきたいですね。

# はじめに

我々、富士通クラウドテクノロジーズ株式会社が提供しているニフクラは現在 [Terraform NIFCLOUD Provider](https://registry.terraform.io/providers/nifcloud/nifcloud/latest) を提供しています。
こちらを用いることで、Terraformからニフクラのインフラストラクチャ(以降インフラ)を操作することができます。

今回はこの Terraform NIFCLOUD Provider と CDK for Terraform を使用

元記事を表示

Functional Options Patternで、「元に戻す」機能を実装してみた

# はじめに

この記事は、[Goアドベントカレンダー(カレンダー3)](https://qiita.com/advent-calendar/2021/go)の13日目になります!

[今年初めに書いた記事] (https://qiita.com/uh-zz/items/3a38f9ca0e195ed6e908)を振りかえってみて色々と思うところがあり、この1年の学びをもとに自分のコードをリファクタリングしてみました!

# 前提
元ネタは、[「元に戻す」のしくみ 【ゲーム・プログラミング】【JavaScriptサンプル】](https://youtu.be/XmS9NNX_59I)です。

「人」を使って「荷」を「★」まで運ぶゲームを想定しています。
![aps24-l8ndd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427090/5f7fba20-5f43-3047-3d25-beece8f5a57d.gif)

マップ全体の初期位置[^1]をx、右に1つ進む関数をf()、下に1つ進む関数を

元記事を表示

Goでのベンチマークツールを作ろうとした話

この記事は [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 13日目の記事です。
前日は@dears31さんの「[Zoomコメントから自由回答のクイズを集計してみた](https://qiita.com/dears31/items/62685ae0369276aa38fe)」という記事でした。

## はじめに

はじめまして。アプリボットでサーバサイドエンジニアをしているものです。
最近普段の業務で、サービスの性能を計測して、結果まとめ技術選定の材料にするといったことが少しずつですが、増えてきました。
最近で言うと、Elasticache Redisの性能を計測することがありました。

最近あったAurora3の登場や、TiDBやSpannerなどの分散DBの採用事例の増加、KeyDBがマネージドサービスとして提供が開始されるようになるなど、今後も様々なミドルウェアの技術選定、メジャーバージョンの更新などで既存の技術を大きく入れ替える機会が増えるのではないかと思ってい

元記事を表示

授業のために早押しクイズサイトを作った話

# 授業のために早押しクイズサイトを作った話

## 初めに

この記事は、[Aizu Advent Calendar 2021](https://adventar.org/calendars/6636)の12日目の記事です。
あと、誕生日です。

## 早押しクイズサイトとは

質問者が自由に、問題と解答を用意し、複数の解答者たちが早く答えるといったものです。

質問者用画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467463/2ba7b475-26d8-50a8-49b2-8d0bd948c438.png)

解答者用画面(左が名前を入れるところ、右が解答を書くところ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467463/89681a6d-65b8-2c5f-1e9c-03e38430261e.png)

## なぜ作ったの?

授業でチームで動画を撮ることになった

元記事を表示

Go製のCGIからSlackに投稿する

## はじめに

やったことはタイトルの通りですが、ひさびさにGoを触ってみようと思ったので軽く試してみました。
参考にあげてる記事を適当にそのままくっつけただけです。

## 環境

– go: 1.17.5
– Apache: 2.4

## Slack投稿準備

[Slack API を使用してメッセージを投稿する](https://zenn.dev/kou_pg_0131/articles/slack-api-post-message) を参考に、ボット用トークンを取得する。

– workspaceにアプリを作成
– `Bot Token Scopes`に`chat:write`を設定(ユーザーは今回使わないのでパス)
– ワークスペースにインストール
– `Bot User OAuth Token`取得

## コーディング準備

標準パッケージ以外に`slack-go`パッケージも利用するので準備する。

“`bash
cd your-dir
go mod init example.com/m
go get -u github.com/slack-go/slack

元記事を表示

Zoomコメントから自由回答のクイズを集計してみた

この記事は
[Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) の記事になります。
前日は[@yuucu](https://qiita.com/yuucu)さんの「[テキストファイルに対してSQLを発行できるツール「q」& vimから使う「vimq.vim」の紹介](https://zenn.dev/yuucu/articles/vim-plugin-vimq)」という記事でした。

# はじめに

こんにちは、(株)Applibotでバックエンドエンジニアを担当している小川です。
昨年のアドカレでは[社内勉強会についての記事](https://qiita.com/dears31/items/eb9b612507ab9df3cd46)を書きましたが、
社内でエンジニア間での交流を推進する横軸組織の一員としても活動しています。

年末年始といえば忘年会や新年会…
コミュニケーション上大人数で開催したいが昨今のコロナ禍によって直接集まることは減り、
Zoomなどでのオンラインでのコ

元記事を表示

Goの乱数生成について調べてみた(ベンチマーク)

# 初めに
オークファンの開発部に2021年に新卒入社した@isodaです。
業務でGoの乱数生成を使用する機会があったので、いろいろ調べてみました。

# Goの乱数生成について

GOの乱数生成には標準パッケージで、math/randとcrypto/randの2通りの方法が存在しています。

## math/rand
https://pkg.go.dev/math/rand

– 特徴
– 乱数の元になる、シード値が必要
– セキュリティ性が低い

## crypto/rand
https://pkg.go.dev/crypto/rand

– 特徴
– 乱数の元になる、シード値が必要ない
– 暗号的に安全な乱数ジェネレーター
– LinuxおよびFreeBSDでは、Readerは利用可能な場合はgetrandomを使用し、それ以外の場合は/dev/urandomを使用します

# ベンチマーク用のプログラム作成
Goでは標準パッケージでベンチマーク用の機能があるらしく、そちらを使用しました

https://pkg.go.dev/test

元記事を表示

Go 構造体はポインター型にするべき?

この記事はエイチーム引越し侍/エイチームコネクトの社員による、[Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/hikkoshizamurai-connect) 12日目の記事です。
本日は**1歳児の育児でちょくちょく離席が多いパパエンジニア**@lostfindが担当します。

:::note info
誤った内容や日本語の指摘は大歓迎です。とても助かります。
:::

## はじめに?
11月に**「引越し侍 ネット見積もりサービス」**をリリースしました。
こちらのBackend ビジネスロジックは`Go`による`Clean Architecture`の概念をベースで開発しました。

( 当サービスの詳細な技術の構成については[1日目の記事](https://qiita.com/sho-hata/items/054c77392cc61bc2f3ac)と、[2日目の記事](https://qiita.com/an

元記事を表示

OTHERカテゴリの最新記事