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

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

Goをherokuで自動実行する

## はじめに
ついにアドベントカレンダー最終日になってしまいました。
私のクリスマスは帰国によりホテルでの隔離生活であるため、時間だけがありました。

ずっとGoを勉強したかったこともあり、この機会に入門しました。
丁度良いタイミングで中学の頃からの先輩がGoでLIFFアプリを開発していたので、こちらで勉強させていただきました笑。

https://qiita.com/AsuyaKakegawa/items/2e8d27393f2955b32f6f

↑こちらの記事で作成したアプリをherokuにデプロイするところまでします。

## 作成したもの
↓LINEの友達追加から、デモがみれます。
![M_gainfriends_qr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648295/77b86edd-4cb3-810d-01cc-f4447865a076.png)
天気予報が雨であれば、毎朝6時に公式アカウントから通知が送られてきます。(写真はテスト実装なので、本来は6:00amになります。)

元記事を表示

後方互換性と和解せよ

# 後方互換性ってなに?

みんな大好き信頼の塊 Wikipedia さんの「[互換性](https://ja.wikipedia.org/wiki/互換性)」の記事によると、後方互換性は以下のように定義されています。

> 古いシステム向けのデータなどが新しいシステムでも全て使用できること。

ソフトウェアの文脈では「ソフトウェアのバージョンをアップしても、それに依存する既存のソフトウェアが正常に動作すること」と読み替えられる場面が多いかと思います。

# Goと後方互換性

Go言語は伝統的に後方互換性を大事にしてきた言語です。それは [Go 自体](https://go.dev/doc/go1compat)についてもそうですが Go を使って書かれたソフトウェアについても Go Modules の導入時に後方互換性について[具体的な指針](https://go.dev/blog/module-compatibility)が打ち出されたりしたこともありました。最近であれば Rob Pike が Go 1.18 について「[標準ライブラリの内部実装は変えずにリリースしよう](http

元記事を表示

New Relic Goエージェントの地雷は踏んでおいたので参考にしてくれ

# はじめに
この記事は[New Relic Advent Calendar 2021](https://qiita.com/advent-calendar/2021/newrelic “New Relic Advent Calendar 2021”)の25日目の記事です。
「[ミイダス](https://miidas.jp/ “ミイダス”)」という転職支援・採用支援サービスで、New Relic Goエージェントを導入した際に踏んだ地雷について、いくつかご紹介したいと思います。

New RelicのGoエージェントはまだ新しいサービスで資料が少ないこともあり、いくつかの地雷を踏むことになるかと思いますが、それを乗り越えるととても幸せな世界が待っています。
弊社のサービスでは、New Relicを活用して、より良いサービスになるよう数々の処理の改善や障害の早期発見などに役立てています。

APIの応答性能やエラー率を監視するダッシュボード作成例
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/

元記事を表示

OpenTelemetryをざっくりと知る

# はじめに

以前マイクロサービスの分散トレーシングを導入する機会を頂き、OpenTelemetryについて色々と調べていました。 そこで今回は備忘録も兼ねて、OpenTelemetryとOpenTelemetry Collectorについて概要をまとめてみました。

# OpenTelemetryとは

OpenTelemetryは、トレース、メトリック、ログなどのテレメトリデータの作成と管理用に設計された、API、SDK、ツール、および統合のセットです。ベンダーに依存しない実装を提供し、選択したバックエンドにテレメトリーデータを送信する方法を標準化することを目的としています。

OpenTracingやOpenCensusの後継にあたる新たな標準化ツールとなります。つい最近ですが、ついにv1.0が公開され、今後テレメトリデータを扱うツールとして広まっていくのではないのでしょうか。

## TraceとSpan

OpenTelemetryにおけるトレース情報は**Trace**と**Span**という概念で定義されています。

**Trace**: あるリクエストに対するSp

元記事を表示

Next.js+Goでクイズアプリを作ってみる

## はじめに

### 概要

インフラエンジニアだった私が、開発の勉強をするためにクイズアプリを開発してみました。文法や実装の仕方の記事はいろいろとあるので、どのように学習したかを重点的に書いています。私の勉強の備忘録の記事になってしまいましたが、勉強方法が分からず困っている人の参考になれば幸いです。

### 対象読者

* 開発の勉強をし始めている人
* Go言語初心者
* Next.js, TypeScriptちょっとわかる人

### 書いたきっかけ

* Go言語の製品やサンプルAppを多く見かけるようになったのでGo言語の勉強をしたくなった
* 部署内で技術用語を確認し合えるサービスがあったらいいなと思った
* Advent Calendarという目標と期限を決めて勉強したかった

### 完成品
いろいろやりたいことはありましたが、とりあえず一問一答までとなりました。
題材はとりあえず私に身近なクラウドネイティブにしてみました。
deepmap/oapi-codegen のカスタムテンプレートで required array が null で返ってしまうのを防ぐ

## はじめに

私が今関わっているプロジェクトでは、サーバーサイドにGo言語を採用し、Webフレームワークとして [labstack/echo](https://echo.labstack.com/) (以下、Echo) を採用しています。また、APIの定義を OpenAPI で行い、OpenAPI の定義から Echo のハンドラを一括登録するための関数やリクエスト/レスポンスの型を生成するために [deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)(以下、oapi-codegen)を利用しています。

OpenAPI を利用する目的の一つとして、クライアントとサーバー双方が一意な解釈が可能な API 定義を参照することによって認識の齟齬なく開発を進められるようすることが挙げられます。しかし、 oapi-codegen が生成するコードを使用した際に、 required な array と定義されているプロパティについて null として返却してしまう問題があります。これによって、 OpenAPI による定

元記事を表示

行列の積で見る2次元配列の例(Julia, Go, Rust)

# はじめに

別の言語の例を移植すると意外と考えさせられる。

環境

* The Go Playground (2021-12-23)
* Julia 1.6 (Julia Playground)
* Rust 1.5.7 (Rust Playground; rustc)

Rust は手元に環境があるのだが、サンプル程度でプロジェクトを作ったりのが面倒なときは、Playground を利用する。

## Julia

計算科学用途な言語だけあって、こういうところは強い。
この宣言の時点で行列の型だと決めつけができる。

“`julia
A = [1 2 1; 0 1 1]
B = [1 0; 0 1; 1 1]
println(A*B)
“`

“`
[2 3; 1 2]
“`

## Go

* 2次元配列
関数も含めてサイズを事前に決めておく必要があり、その結果、任意のサイズの行列の積を行う関数が作れない

“`golang
package main

import “fmt”

func mul(a [2][3]int, b [

元記事を表示

sql.Openを別の関数に切り出したら「sql: database is closed」エラー

## エラー内容
“`go:main.go
package main

import (
“database/sql”
“log”

_ “github.com/go-sql-driver/mysql”
)

func main() {
db := DbConnect() // 別の関数へ切り出し

err := db.Ping()
if err != nil {
log.Fatal(err) // → sql: database is closed
}
}

func DbConnect() *sql.DB {
db, err := sql.Open(“mysql”, “root@tcp(localhost)/dbname”)
if err != nil {
log.Fatal(err)
}
defer db.Close()

return db
}
“`
“`sh:zsh
$ go run main.go
2021/12/24 23:59:59 sql: database is closed
exit status 1
“`

## 対処法

元記事を表示

Go言語のinterfaceっぽいC++のクラスを自動生成するツールを作った話

初投稿記事です。

#結論
**・golangのinterfaceみたいなのをc++で自動生成するツール作ったよ**
**~~・よい子のみんなは普通にgolang使おうね~~**

#動機
http通信のライブラリを書いていた
tcpとかsslとかを動的に切り替えたい
継承とかは使いたくない。
なんなら、他人の作った他のプロトコルでも好きにすげ替えたい。~~需要あるのか?~~
golangを勉強する -> interfaceめっちゃ便利
C++でも似たようなことしたい -> [Type Erasure](https://ja.wikipedia.org/wiki/%E5%9E%8B%E6%B6%88%E5%8E%BB)でできるな。
一応できた -> めんどくさいしDRY原則に反するぜ。
**そうだ、自動生成ツールを作ろう!**

#前提:C++におけるType Erasureとは
テンプレートと継承を使って条件を満たす任意の型の値を動的に保持する技法で
標準ライブラリではstd::functionとかstd::anyとかstd::shared_ptrとかで使われている。
下のコードは

元記事を表示

【業務】Goが触りたいなぁってお話

Googleが開発した『Go』

流行らないわけがない…
今色んな言語がこれから統合されていく予感がするんですよねぇ。。。

実際リプレイス案件で
結構使われてるらしい…!(Javaみたいな感じ)

#理想の技術習得
フロントエンド:TypeScript
バックエンド:Go, Java

>フロントエンド界隈は半年で死ぬ技術もあるし
新規参画者も多い

###デザインは Google を真似ればイイ

元記事を表示

Goでファイル検索を行うサーバーを立てる

# はじめに

この記事はGo Advent Calender23日目の記事です。

ファイルパスを検索し結果をJSONで返すREST APIサーバーを立てます。
ひとまず動きのイメージを掴むデモです。

![out](https://user-images.githubusercontent.com/16408916/143503512-6e172a98-f973-4c80-b1dc-99ea0ede0a71.gif)

検索窓に検索キーワードを入力し、検索ボタンを押すとlocateコマンドを走らせて、結果をブラウザに表示します。

本記事は[locate-server](https://github.com/u1and0/locate-server) v3.1.0の時点のREADMEを補完するドキュメントを記事としました。

この記事を読むために必要な知識を挙げます。

* Go
* Gin(フレームワーク)
* ShellScript
* `locate`(検索エンジン)
* `updatedb`(データベース)
* HTML5
* JavaScript
* jQue

元記事を表示

Go 言語で Mattermost Bot を作成する

法政大学情報科学部 2 年の阿部哲也です。
今回は大好きな Go 言語で Mattermost の BOT を作成してみました。

# Mattermost とは

Mattermost (マターモスト) とは、オープンソースのセルフホスティング式のチャットツール。

自分で構築する Slack みたいな感じ!

# Mattermost を Docker compose で構築

docker-compose が導入されていることを確認します。

“`
>> docker-compose -v
docker-compose version 1.16.1, build 6d1ac21
“`

git clone で mattermost をクローンします。

“`
git clone https://github.com/mattermost/mattermost-docker.git
“`

起動します。

“`
cd mattermost-docker
docker-compose up -d
“`

なにも設定を変えていない場合は、http://localhost

元記事を表示

気象庁サイトから取得したJSON天気データを使って明日の天気をLINEで送信する機能を作ってみた

# はじめに
今年も終わりが近づいてきましたね。今年はじめの2月に気象庁の天気予報のAPIが公開されたと話題になりました。正確にいうとAPIではなく、気象庁の気象情報ページで使われるJSONデータを取得できるらしいです。以下が実際のURLです。340000のところを該当する場所のコードにすればその場所の天気情報を取得できます。
https://www.jma.go.jp/bosai/forecast/data/forecast/340000.json
今回は、このJSONデータを使って天気情報を取得し、LINEで送信するというところまで実装していこうと思います。個人的に雨が降るか降らないかだけが重要で尚且つ、雨の時だけ天気情報を知りたいと思っているので、そういった実装をgolangでしていこうと思います。
![LINE_capture_661874734.264569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869962/6ec6f95b-875d-472e-a5d6-50292912b7af.j

元記事を表示

カジュアルゲームをEbitenで作る

[Go Advent Calendar 2021](https://qiita.com/advent-calendar/2021/go) (カレンダー2) 22日目の記事です。
#はじめに
「気軽にゲームを作る」をテーマに、2DゲームエンジンEbitenで1つ作品を作ります。

EbitenはシンプルなAPIが特徴の、クロスプラットフォームで動く2Dゲームライブラリです。

詳しい機能や学習に役立つサイトなどは、

公式サイト

https://ebiten.org/

や別記事 [production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集](https://qiita.com/eihigh/items/1fd6077327f99245b807)(@eihighさん) にありますのでぜひご覧ください。
また、本カレンダー13日目にもEbitenの記事 [はじめてのゲームプログラミング(Ebiten)](https://zenn.dev/hokita/articles/66cc118b227ae3)(@hokita222さん)があります。

#プ

元記事を表示

GoでPadding Oracle Attackしたい!

「 [Applibot Advent Calendar 2021](https://qiita.com/advent-calendar/2021/applibot) 」 22日目の記事になります。
前日は @ref3000 さんの [Unity でサクッと機械学習を体験してみよう【ML-Agents】](https://qiita.com/ref3000/items/40a0915fbc4478b5cadb)という記事でした。

## はじめに
業務で暗号化に興味を持ってパディングオラクル攻撃という名前に惹かれたので今回はGo言語でパディングオラクル攻撃をやっていきます。

## AES CBCモードについて
今回のパディングオラクル攻撃をする対象の暗号文はAESのCBCモードを使用して暗号化しました。AESは平文をブロック長ごとに暗号化するブロック暗号で、ブロック長が128bit、鍵長が128/192/256bitの3種類です。

CBCモードは一つ前の暗号文ブロックと平文ブロックをXORとってから暗号化する方法で前のブロックに依存するため同じ平文であっても異なる暗号文になるため推測

元記事を表示

Gopacketでパケットをキャプチャしたり生成したりしてみる

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

昨日は@kodakkuさんの「**[教師なし学習で周期表(金属)を分析してみる【主成分分析・R・Python】](https://qiita.com/kodakku/items/e082965d2792bc51e2f1)**」でした。
主成分分析することで、同族の元素が似たような性質をもっているということが可視化されてて面白かったです。
私はデータ分析については素人なのですが、主成分分析をするときにはこの記事を参考にしたいと思います!

## はじめに

こんにちは。FJCT21卒新入社員の@kswです。
10月に仮想ネットワークの運用・開発を行うチームに配属され、一人前のインフラエンジニアになるために日々奮闘しています。

今回は、一人前のインフラエンジニアの必須スキルの一つである(と私が勝手に思っている)「パケットの気持ちがわかる」を身に付けるため、Gopacketを使って実際にパケッ

元記事を表示

Go 1.18 で追加される debug/buildinfo

Go 1.18 で新しく追加される [`debug/buildinfo`](https://pkg.go.dev/debug/buildinfo@go1.18beta1) パッケージについて調べました。

※ 特に記載がない限り 2021 年 12 月 19 日時点の情報になります。

## 概要

https://pkg.go.dev/debug/buildinfo@go1.18beta1

従来からビルドに使用された Go のバージョンや依存パッケージの情報はバイナリに含まれており `go version -m` で出力できましたが内部パッケージとして実装されているため外部からは利用できませんでした。 [^1] [^2]
これらの機能を外部から利用できるようにしたのが `debug/buildinfo` です。

https://github.com/golang/go/issues/39301

[^1]: https://github.com/rsc/goversion
[^2]: https://knqyf263.hatenablog.com/entry/2021/02/12

元記事を表示

nvim-dapを利用したGo言語デバッグ

# はじめに
Go言語のデバッグどのようにしていますか?
printデバッグだったり、Delveを使ってCLIでやったり、IDEのデバッグ機能だったりかと思います。
私は、nvim-dapを利用して、Neovimでデバッグしているので、その紹介となります。

![intro.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218282/c75c5e82-1ed1-b1f2-9ee8-f3f737d71846.gif)

# 準備
下記プラグインを利用していきます。
– [nvim-dap](https://github.com/mfussenegger/nvim-dap)
– [nvim-dap-ui](https://github.com/rcarriga/nvim-dap-ui)
– [nvim-dap-go](https://github.com/leoluz/nvim-dap-go)
– [nvim-dap-virtual-text](https://github.com/theHamsta/n

元記事を表示

AxumでGoのチュートリアル「Writing Web Application」をやってみた

[フューチャーアドベントカレンダー](https://qiita.com/advent-calendar/2021/future)の22日目の記事です

# はじめに
私はプログラミング初心者ですが、ITエンジニアリングスキルを高めて手に職をつけたい!という気持ちがあります。

そこで、まずは社会で比較的需要の多い(のか?)Webバックエンド開発の基礎を習得したいと思いました。Webバックエンドフレームワークは星の数ほどあれど、それらに共通した要素は多いはずで、どれか一つにある程度習熟してしまえば、新たなフレームワークを学ぶのは容易になるはずです。

と考えると何でもいいような気がしたので、自分の好きな言語であるRustのWebフレームワーク[`Axum`](https://github.com/tokio-rs/axum)を選びました。ただ、`Axum`はかなり新しいフレームワークで、チュートリアルなどが見当たらないので、Goの[`net/http`](https://pkg.go.dev/net/http)のチュートリアル[Writing Web Application](http

元記事を表示

Go 言語で GitLab Bot の作成

書き途中です

# GitLab の Bot を Golang で作成

します

# 準備

以下の Github を参考にして、Bot を作成します。

https://github.com/xanzy/go-gitlab

“`
go get github.com/xanzy/go-gitlab
“`

# ソースコード

“`
package main

import (
“log”

“github.com/xanzy/go-gitlab”
)

func main() {
git, err := gitlab.NewClient(“-eo1D7ZVkyczkvTt4G7V”,gitlab.WithBaseURL(“http://192.168.202.129:9010/api/v4”))
if err != nil {
log.Fatalf(“Failed to create client: %v”, err)
}

// Create new project
p := &gitlab.CreateProjectOptions{
Name:

元記事を表示

OTHERカテゴリの最新記事