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

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

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:

元記事を表示

goyacc で生成したコードに VSCode で Go to Definition できない場合の対処

下記のようなファイルを入力として

“`yacc:parser.go.y
%{
package parser

import (
“bytes”
“fmt”
“io”
“strconv”
“strings”
“unicode”
)

func DoSomething(s io.RuneScanner) (string, error) {

}

“`

goyacc を下記のように実行すると

“`winbatch
goyacc -o parser.go parser.go.y
“`

下記のような Go のコードが出力されますが

“`go:parser.go
// Code generated by goyacc -o parser.go parser.go.y. DO NOT EDIT.

//line parser.go.y:1

package parser

import __yyfmt__ “fmt”

//line parser.go.y:3

import (
“bytes”
“fmt”
“io”
“strconv”
“s

元記事を表示

Mattermost 403 エラー

# Go 言語で Mattermost BOT を作成する

Mattermost と Go 言語で Bot を作ろうとして、リクエストを投げると 403 エラーが出力された。

# ソースコード

“`
package main

import (
“fmt”
“net/http”
“net/http/httputil”
“bytes”
“os”
“encoding/json”
)

type BODY struct {
channel_id string
message string
}

func HTTPPost(mes string) {

requestBody := &BODY{
channel_id: “1ngefhpjojyabd9fc7n8twt3xh”,
message: “hello”,
}

//リクエストbodyをjson.Marshal関数を使って作成する
jsonString, err := json.Marshal(requestBody)
if err != nil {
fmt.Println(err)

元記事を表示

KubernetesでCloud Spanner Emulatorを用いたローカル開発環境を構築する

この投稿はグレンジ [Advent Calendar 2021][advent-calendar]の21日目の記事です。

[Cloud Spanner Emulator][cloud-spanner-emulator]を利用して、Kubernetes上でローカル開発環境を構築します。

appコンテナからspannerコンテナへ接続するサンプルを作ってみます。
環境は[Helm][helm]を使って構築していきます。

## イメージ作成

Go、gcloud、[spanner-cli][spanner-cli]を利用できるようにします。

“`dockerfile:build/app/Dockerfile
FROM golang:1.17.5-buster

# https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja
RUN echo “deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/

元記事を表示

Ubuntuに最新バージョンのGo言語をインストールする

#はじめに
UbuntuにaptでGo言語をインストールしようとすると、少し古いバージョンがインストールされてしまうので、最新バージョンがインストールされるようにします。

#環境
Ubuntu 20.04.3 LTS

#Goをインストール
以下のコマンドを実行すると、Goのバージョンは1.13でAPTのソースはUbuntuのサイトをさしています。

“`
$ apt info golang
Package: golang
Version: 2:1.13~1ubuntu2
Priority: optional
Section: devel
Source: golang-defaults
Origin: Ubuntu
Maintainer: Ubuntu Developers
Original-Maintainer: Go Compiler Team
Bugs: https://bugs.launchpad.net/ubuntu/

元記事を表示

OTHERカテゴリの最新記事