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

Go関連のことを調べてみた2021年09月30日
目次

GORMでMYSQLに接続してCRUD操作する

#はじめに
転職にあたりgo言語を使用することになったので勉強して2日くらいです。
書き方なんとなくだけど分かったので、文字読むより手を動かそうと思い、いきなりDB接続しようとしたらめちゃ時間かかった(当たり前)のでその備忘録です。
間違いや、よろしくない書き方などあったらぜひぜひコメントで教えていただけると嬉しいです。
とにかくDBつないで動かしてみることが目的なので実用的ではないかもしれません。

#環境
GOやMYSQLの環境構築は割愛。調べればたくさん出てきます。

OS: windows
go version: go1.17.1 windows/amd64
mysql version: Ver 8.0.26 for Win64 on x86_64 (MySQL Community Server – GPL)

#GORMとは
GO言語のORMライブラリです。公式がとても分かりやすい

https://gorm.io/ja_JP/

##ORMとは
`Object-relational mapping`の略です。
名前の通り、オブジェクト(オブジェクト指向におけるオブジェクト)

元記事を表示

ハウテレビジョン夏インターンが楽しかった!2021

# はじめに
2021年 9/13〜9/24 開催のハウテレビジョンさんのサマーインターンシップのレポートです。
はじめにメッセージとしては、
・2週間がっつり開発ができて非常に楽しい!
・開発に集中できる環境が整っている!
・技術者として成長できる!
です。

# 目次
[1.きっかけ](#1-きっかけ)
[2.選考](#2-選考)
[3.1day研修と事前課題](#3-事前研修)
[4.インターン本番](#4-インターン本番)
[5.開発以外の魅力](#5-開発以外の魅力)
[6.感想](#6-感想)

#1. きっかけ
ハウテレビジョンさんが運営する [外資就活ドットコム](https://gaishishukatsu.com) というサービスで募集を見つけました。
応募に至ったポイントは以下の通りです。
・東京(六本木)でのオフライン開催
・交通費&宿泊費 全支給
・報酬10万円(+優勝賞金10万円)
・同年代のハイレベルな方々とのチーム開発
・バックエンドの使用言語がGo (フロントならJavaScript等)
・実際に動いているサービス(外資就活ドットコム)をベースにした

元記事を表示

validatorのエラーフィールド名に構造体のフィールド名ではなくjsonタグ名をセットしたい

## この投稿で使用している言語、ライブラリのバージョン

* Go v1.17.1
* [github.com/go-playground/validator](https://github.com/go-playground/validator) v10.9.0

## やりたいこと

[github.com/go-playground/validator](https://github.com/go-playground/validator)で構造体をバリデーションした場合、
エラーの中には以下のように構造体のフィールド名が埋め込まれています。

“`go:main.go
package main

import (
“fmt”
“strings”

“github.com/go-playground/validator/v10″
)

type Person struct {
Name string `json:”name” validate:”required,max=100″`
Email string `json:”email” validate:”requ

元記事を表示

分岐もややこしい演算も無しの、クラス定義だけで書くFizzBuzz

## はじめに

プログラムに携わって一度もFizzBuzz書いたことないなと思ったので、サクッと書いてみました。
せっかくなので保守性高めるようなコードの書き方を意識して、分岐なしのコードをクラス表現を使って実現しています

## コード

golangのinterfaceクラスにより処理を分け、mapにより分岐を削除しました。
ポリモーフィズムがあって、mapのようなkeyから設定値を取り出せるものがある言語であれば、同様のコードが実現可能です

“`golang:main.go
package main

import “fmt”

//FizzBuzzのパターン分けをするための構造体
type FizzBuzz struct {
Fizz bool
Buzz bool
}

//パターン網羅する為の構造体生成関数
func NewFizz() FizzBuzz {
return FizzBuzz{Fizz: true, Buzz: false}
}
func NewBuzz() FizzBuzz {
return FizzBuzz{Fizz: false, Buzz:

元記事を表示

Go WebSocketを使ってみる

今回は Go言語 で WebSocket を使用してみたいと思います。

軽く感じをつかむだけなので、あまり手の込んだものは作りませんw

## やりたいこと

サーバー と クライアント で メッセージ を キャッチボール する。

・・・のを WebSocket を使ってやります。

~~これくらいなら ajax とかでいい感じもしますが、、、~~

## WebSocket とは?

下記の資料がわかりやすかったです。

理解した感じでざっくり説明すると、
Webのアクセスは、キャッチボールみたいな感じで

ブラウザ「〇〇のページをちょうだい」(要求)

サーバー「はいよ!」(応答)

で接続が切れてしまうのですが、

WebSocket を使用すると 電話のように常時つなぎっぱなしにできます。

利点としては、先ほどのキャッチボールを始める前に
いろいろな前処理がなくなるので応答が早くなります。

リアルタイム性を求めるものによく使われている感じですね。

##

元記事を表示

golangで動かして学ぶCognitoユーザプール、IDプール

# Cognitoをgolnagから操作してみる

イマイチ理解しきれてなかったので、ラッパーライブラリを作りつつ、勉強してみました。
元ネタはhttps://dev.classmethod.jp/articles/get-aws-temporary-security-credentials-with-cognito-id-pool-by-aws-cli
で、AWS CLIベースの記事だったのをgolangに書き起こしつつ理解するって形を取りました。

作ったラッパーは
https://gitlab.com/kuritayu/cognito
におきました。

## ユーザプール、IDプールの違い

1. ユーザプール: ユーザ情報、ログイン情報の管理(認証担当)
1. IDプール: ユーザに応じた一時クレデンシャルキーの発行(認可担当)

## パターン別のクレデンシャルキーの発行

1. 認証済・非認証に応じたクレデンシャルキーの発行(IAM Role)
1. ルールベースのクレデンシャルキーの発行
1. ユーザプールに設定したIAM Roleでクレデンシャルキーを発行

## 環境

元記事を表示

2022~2030年に学ぶべき未来のプログラミング言語3選

本記事は、[Eddy Goh](https://eddygte.medium.com/)氏による「[3 Future Programming Languages You Should Learn Between 2022 and 2030](https://betterprogramming.pub/3-future-programming-languages-you-should-learn-between-2022-and-2030-8a618a15eca6)」(2021年7月13日公開)の和訳を、著者の許可を得て掲載しているものです。

#2022~2030年に学ぶべき未来のプログラミング言語3選
>今後の世界を左右する可能性のあるプログラミング言語

![](https://miro.medium.com/max/630/0*K8FlUIxA-fmPj38z)
Programming Books. Source: [NeONBRAND from Unsplash](https://unsplash.com/photos/uEcSKKDB1pg)

テクノロジー市場で10年以上働

元記事を表示

【Golang】import したモジュール/パッケージのバージョン確認(外部モジュール情報を main から取得する)

> Go 言語(以下 Golang)のソースコードの `main` パッケージで、アプリが利用しているモジュール/外部パッケージのバージョンを取得したい。

[「”golang” import パッケージ モジュール バージョン 確認」でググって](https://www.google.com/search?q=%22golang%22+import+%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8+%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB+%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3+%E7%A2%BA%E8%AA%8D)も、`go get` するモジュールのバージョン指定しか出てこなかったので、自分のググラビリティとして。

## TS; DR (今北産業)

1. [runtime/debug](https://pkg.go.dev/runtime/debu

元記事を表示

Javaで飯食ってるエンジニアがGolangを学んでみる~Ginを使ってHelloWorld編~

今回は実際にローカルでGolangのフレームワークGinを用いて、ブラウザに「Hello World」を描画してみようじゃないかということで、
結構苦戦した結果、Hello Worldできたので、苦戦の証というか、はまりポイントを覚えている範囲で残しておこうと思います。

※結構雑になってしまってるので、適宜更新はするつもりではいますが、とりあえず自分がわかるので公開しちゃいます。

なおGolangについては、少なくとも弊社のプロダクトでは使われていない(と思う)し、周りにやっている人も(知る限り)聞いたことないので、完全独学です。
そのため、もがきあがいた結果なので、「もっとこうやったら楽なのに~」とかあったらコメントなどでご教示いただけるとありがたいです。

#ローカルの環境

– macOS Big sur11.6
– Safali 15.0
– Editor VSCode

※普段の仕事ではWindowsなのでマジで慣れてません(自宅にはWindowsのデスクトップとMacBook Airがあります)

#Hello worldまでの流れ

ざっくり、流れをメモっておきます。

元記事を表示

Docker で Go の開発環境を作る(Docker × Go × Mysql)

# やりたいこと
docker を使って go の開発環境を作る
ローカル環境で go の開発、実行ができるように docker で環境構築を行なっていきます。

# 作るもの
docker, docker-compose を使った go の開発環境
以下の環境をつくっていきます。
・ docker コンテナで go が動く
・ docker コンテナで mysql が動く
・ docker コンテナで phpadmin が動く(おまけ)

# やってき
## 今回作っていくものは以下の通りです。

“`
../
└── go-template
├── Dockerfile
├── docker-compose.yml
└── main.go
“`

### 1.Dockerfile の作成
go の動作環境を作るための Dockerfile です

“`ruby:Dockerfile
# ベースになる docker イメージを指定
FROM golang:1.17.1-alpine

# 作業ディレクトリの作成
RUN mkdir /go/src/ap

元記事を表示

VSCode + Remote Container + WSL2 Dockerで開発環境構築が捗る話

# 概要

VSCodeでDev Container使って開発環境作ると、OS環境汚さないしとても便利という話を聞いたので、周辺諸々調べてみたので、備忘録的に記事にまとめる。
環境はWindows10 pro。

# 経緯

Windows環境でDockerを使って開発環境作るのは昔から興味があったけど、特にコードを書くこともない人生だったので手を付けずにいた。
ただ、最近自宅IoTや電子工作周りでコードを書く機会が増えてきたのと、VSCode+Dev Containerがとても便利という話をTwitterで見かけたので、重い腰を上げてみた。
WSL2バックエンドのDockerもこの機会に設定。

# やったこと

## WSL2とDockerインストール
[こちらのサイト](https://dev.classmethod.jp/articles/docker-desktop-for-windows-on-wsl2/)の作業を手順通りにするだけ。
基本的にDockerは、WSL2バックエンドの設定がデフォルトみたい。
WSL2のディストリビューションはUbuntu20にしました。

#

元記事を表示

[Golang]GORMで論理削除を設定するときの注意

# はじめに
GORMの論理削除の設定にちょっとクセがあることが分かりました。

# やり方
GORMはdeleted_atカラムがあれば、自動で論理削除にすることが出来ます。
しかし、型の指定でtime.Timeにするとエラーが起きます。

### 修正前

“`go
type Presentation struct {
ID int `json:”id”`
Title string `json:”title”`
CreatedAt time.Time `json:”created_at”`
DeletedAt time.TIme `json:”deleted_at”`
}
“`

上記のように、“time.Time“型にしてしまうと、レコード作成時にデフォルトの値が入ってしまい、エラーが起きてしまいます。

### 修正後

“`go
type Presentation struct {
ID int `json:”id”`
Title

元記事を表示

[QUIC]iOS15でNetwork.frameworkにNWProtocolQUICが来たのでquic-goと双方向ストリーム

# iOS15でNetwork.frameworkにNWProtocolQUICが来たのでquic-goと双方向ストリームしてみた

* iOS15 から iOS が QUIC が諸々使えるようになりました???????
* WWDC2021 での発表はこちら

https://developer.apple.com/videos/play/wwdc2021/10094

* この中で紹介されているのですが、URLSession が http3 をサポートするので、http リクエストは複雑な事をしなくても QUIC が使えそうです
* また、Network.framework に NWProtocolQUIC が新しく入っており、ほかの TCP や UDP のソケットと同じインタフェースで QUIC のストリームを扱えるようになったようです

https://developer.apple.com/documentation/network/nwprotocolquic

* そこで、今回は **NWProtocolQUIC を使って、quic-go で建てたサーバと双方向ストリーム

元記事を表示

exForm: PNG to Thinreports(枠線)! なツールを作りました

[Thinreportsでの帳票作成をより手軽に](https://qiita.com/tkotobu1048/items/d103afa8588d3ea67c4b) はTLFから情報を抽出してコーディング等に活用する主旨でした。
今回はTLFそのものを手軽に作成するツールをGoで作って公開しました。
読みはエクスフォームのつもりです。

タイトルの通り、PNGを読み込んでTLFを生成します。

あ、OCRとかのフォースは使えないので罫線のみです。
テキストを除くよう鋭意努力しましたが、ゴミが出たらすみません。(不可避)

## 仕様

* 抽出対象: 水平線、垂直線
* 傾いていると残念な結果が。紙からスキャンした画像は要注意。
* 実線のみで点線・破線は非対応。

* 用紙サイズ: A4 (縦/横)
* 勝手にリサイズするので、画像はA4の比率に近い方が良いです。

## 使用方法
““
exForm -i=image.png
““

指定したファイル名 + “.tlf” が作成されます。

## 生成イメージ
左が元画像、右が生成したTLFをエディタで開いたも

元記事を表示

proto3 でGoのコードを proto ファイルと同じ場所に出力する

# はじめに

`protoc` を使って Go のコードを生成するときにハマったのでメモがてら気をつけることを書いておきます。

## 前提条件

– `protoc` がコマンドラインで使えるようになっていること
– Golang の知識があること
– proto3 の文法がわかっていること

## コマンドラインオプションを指定する

### paths=source_relative を使う

proto ファイルの中で `go_package` を指定しなければなりませんが、その proto ファイルが格納されているディレクトリと Go におけるパッケージ名は同一にすることが推奨されています。なので、proto ファイルの中の `go_package` は以下のようになります。

“`protobuf
option go_package = “github.com/your-account-name/protobuf-example-go/simple”;
“`

この上で、公式ドキュメントにも書いてあるのですが、`protoc` を実行するときにオプションを渡してあげま

元記事を表示

http.Handler あたりを 1 ページにざっくりまとめる

`http.Handle` 周りの知識をよく忘れてしますので、1 ページにまとめてみました。

思った以上に、シンプルにまとまってよかった。。。

これでもう忘れない!

いや、忘れてもすぐ思い出せる!

## ざっくりまとめた結果がこれ
![Go_ Http.Handler.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157574/d6f6949c-2dca-23c6-6efc-467a357f1c77.jpeg)

## 関連記事

過去に書いた関連記事。

より詳しく知りたい場合は、こちらを参照ください。

https://qiita.com/yNavS4Ki/items/5b7a0c7c41eb8da8f12a

https://qiita.com/yNavS4Ki/items/8bc2199e204d445ab6bc

元記事を表示

ebitenのwasm表示ではまった

 sakura.ne.jpでapplication/wasmを設定しても実行できなかったのでメモを残しておきます。ebitenでのwasmを扱うマニュアルは、 https://ebiten.org/documents/webassembly.html にあります。

まず、コンパイルはWindowsでは、&&を足して

“`bat
set GOOS=js&& set GOARCH=wasm&& go build -o ../build/game.wasm
“`

でコンパイル出来ます。

 sakura.ne.jpでサーバー設定が効かなかったので、PHPのスプリクトにて、

“`php:wasm.php

元記事を表示

containerd コンテナランタイムで情報収集

# はじめに
先日 [An experiment of how to detect OOMKilled events on Container-Optimized OS with containerd](https://medium.com/zeals-tech-blog/an-experiment-of-how-to-detect-oomkilled-events-on-container-optimized-os-with-containerd-a7e036a1b2f9) というタイトルでテックブログを執筆しました。ここでは必要最低限度の情報を取得するための方法だけ簡単に紹介しましたが、このブログを書くにあたって試行錯誤していたことを備忘録的に残しておきます。

# 環境
この実験に使用した環境は以下の通りです。

| 項目名 | 値 |
| — | — |
| GKE node version | v1.18.20-gke.901 |
| OS Image | Container-Optimized OS from Google |
| Kernel version |

元記事を表示

SPAのアプリケーションにおけるCookieの共有について

個人のアプリケーションを開発において、SPAにする機会が多いのですが、開発のたびにどのような設定をするんだっけ?と忘れてしまうことが多いです。
SPAの場合、バックエンドとフロントエンドをそれぞれデプロイし、オリジンが異なるケースがほとんどかと思いますが、この場合、知っておくべきこと、設定すべきことが多く忘れてしまいやすいので、バックエンドとフロントエンドに分けてまとめます。

## バックエンドで対応すべきこと

### リクエストを受け付ける別オリジンを指定する

これによって、レスポンスの `Access-Control-Allow-Origin` ヘッダーには許可するオリジンが入り返却される。
**`*` で全オリジンを指定すると資格情報を共有できないので注意**する。資格情報を伴わないオリジン間のリソース共有であれば、`*`指定でも(セキュリティ的には問題があるものの)可能である。

以下、`https://example.com`からのリクエストを受け付けるように指定した場合のレスポンスヘッダー例

“`
Access-Control-Allow-Origin: http

元記事を表示

Go(golang)で気圧低下をお知らせするLINE botを作ってみた

Goを使って、気圧低下をお知らせするLINE botを作ってみました。
1時間に1回、気圧の状態をチェックして、注意・警戒の場合は状態の場合は通知するようになっています。

![todomaru_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2066989/dc783a8d-e94c-b836-e807-e9e163122cfe.png)
(トド丸くんというのは我が家でいろいろお知らせ通知をしてくれる子です
 最初はtodoリストを通知するのが目的だった子なので、トド(todo)丸です)
**※今回はグループにLINE botを招待し、そこで通知する仕組みにしているのですこし特殊です**

今回実装したアプリのソースコードは以下にて公開しています

https://github.com/chasegawa1209/linebot-notify-barometric-pressure

## LINE developersの設定
[LINE developers 公式サイト](https://dev

元記事を表示

OTHERカテゴリの最新記事