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

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

Go開発環境構築(Windows)

# 環境構築
Goの開発環境を構築します。(Windows版)
今回使用する環境は以下の通りです。

## 0. 今回使用する環境
### 1. OS

 エディション: Windows 10 Pro
 バージョン: 21H2
 

### 2. IDE(総合開発環境)
 [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
 バージョン:1.71.0
※今回、Visual Studio Codeは既にインストール済みのものを使用します。

## 1. SDKのインストール
 Go SDK : [go1.19.1.windows-amd64.msi](https://go.dev/dl/)
Goの公式ページ[https://go.dev/dl/](https://go.dev/dl/)からWindws版インストーラをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazon

元記事を表示

[Go] Echo

# Echoとは

High performance, extensible, minimalist Go web framework

https://echo.labstack.com/

## Quick Start

### インストール

**Go**のバージョンは`1.16`を使う

“`shell
mkdir myapp && cd myapp
go mod init myapp
go get github.com/labstack/echo/v4
“`

## Hello, World!

“`go:server.go
package main

import (
“net/http”

“github.com/labstack/echo/v4”
)

func main() {
e := echo.New()
e.GET(“/”, func(c echo.Context) error {
return c.String(http.StatusOK, “Hello, World!”)
})
e.Logger.Fatal(e.Start(“:132

元記事を表示

ログイン認証時のパスワード比較(Golangで実装)

### はじめに
DBにパスワードを平文のまま保存してはいけません。万一、情報漏洩した場合、不正利用されないにパスワードを暗号化する必要があります。今回は、Golangでどう実装するのかを残していきたいと思います。

### 概要
まず、パスワードを生成します。その後、パスワードを特定されにくくするため、ソルト値を付与。最後に暗号化を実施するという流れで暗号化していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/da173c17-35a8-0748-83bf-88d3ebac7866.png)

### 実装

“`go:main.go
package main

import (
“fmt”

“golang.org/x/crypto/bcrypt”
)

func main() {

solt := “1234567890”
// パスワードのハッシュ化
hash, err := EncryptPassword(“password”+solt)

元記事を表示

GoReleaser でマルチプラットフォーム対応の Docker イメージを作る

https://goreleaser.com/

Go のクロスコンパイルやらリリースやらの面倒を見てくれる便利な [GoReleaser](https://goreleaser.com/) ですが、Docker イメージのビルドにも対応しています。

この記事では、GoReleaser を使用してマルチプラットフォーム (マルチ CPU アーキテクチャ) 対応の Docker イメージを作成する方法について紹介します。

記事中で使用する Go のバージョンは 1.19.1、GoReleaser のバージョンは 1.11.4 です。

## サンプルプロジェクト

次のようなサンプルプロジェクトを例として扱います。

“`console
$ tree
.
├── go.mod
└── main.go
“`

“`go:go.mod
module github.com/frozenbonito/helloworld

go 1.19
“`

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello,

元記事を表示

【Go】Go言語でDB接続

【前提】

editor:VsCode

DB:data.sqlite3
機能:スキャナーへ入力してDMLが出来るように実装する。

//スキャナの生成の為のパッケージを作成します。
※ファイル名は拡張子をgoにする。→input.go等
“`
package hello

import (
“bufio”
“fmt”
“os”
)

func Input(msg string) string {
scanner := bufio.NewScanner(os.Stdin)//入力を受け付けるスキャナ
scanner.Scan()//入力を取得する
return scanner.Text()//コンソールに出力
}
“`
Go>src>の階層に上記ファイルを保存する。

【import】

※data.sqlite3のインストールの仕方については省きます。

“`
package main

import (
“database/sql”
“fmt”
“hello”
“strconv”

_ “github.com/mattn

元記事を表示

Prismで建てたmockサーバーを使ってGoのリクエストをテストする

# はじめに
外部サービスへのHTTPリクエスト処理をテストする場合、mockサーバーを使うことが多いと思います。
挙動確認目的で実際にサーバーに何度もリクエストを送ると迷惑をかけてしまいますからね。

そこでこの記事ではYahooのTokenエンドポイントを例に、Prismでmockサーバーを建ててGoのリクエストをテストしてみたいと思います。

# 実装
dockerでprismイメージからmockサーバーを構築して、そのmockサーバーにリクエストを送ります。
リクエスト時のパラメータや想定されるレスポンスは、[Yahoo!デベロッパーネットワーク(Tokenエンドポイント)](https://developer.yahoo.co.jp/yconnect/v2/authorization_code/token.html)を参考にしています。
※以下のコードで実際にYahoo Tokenエンドポイントに正しくリクエストできるかは確認していないのであしからず。あくまでテストに焦点を当てた内容となっています。

まずはメインロジックとなるgoファイルから見ていきます。

“`go:m

元記事を表示

GOポインタの勉強

#メモリのしくみ

コンピュータのメモリにアドレス信号を制御する場所が10か所あるとしたら、それぞれに0か1が入るので、
2^10=1024とおりの住所が作成できる。言い換えると1024byte=1KBのメモリ容量となる。

現在のメモリは0か1かの制御を1.2~1.5Vの電圧の差で行い、3200MHz(32億回/秒)の送受信ができる。

#ポインタについて

住所は16進数で表され、その住所を直接知りたいときは「ポインタ型」という変数の型をつかい、
その型で宣言された変数を「ポインタ型変数」という。

「ポインタ型」だけでは宣言できない。どのリテラルのポインタ型か(intとかstrとか)も宣言する。

“`

func main() {

var a string = “hello”
fmt.Println(a)
//hello

//str型のポインタ型変数pを宣言する
var p *string

/* ×な例
p = a
上記ではポインタのアドレスpにaを格納することはできない

元記事を表示

【環境構築】VSCode:Remote-Container機能を利用した[Docker Compose+Go+MySQL]の開発用コンテナ構築

# はじめに
今回は**VSCodeの**【**Remote-Container機能**】と【**Docker**】を使用した、
「**開発用コンテナ**」が便利ということで環境構築を行いました。
最小構成から自分がやりたいことを増やしていく中で、
つまづいた点・検索してもなかなか効果的なサイトが見つからなかった点についてまとめてみました。

## この記事で分かること
* **VSCodeのRemote-Container機能**を使用した開発用コンテナ作成手順
* **GoおよびMySQLの`docker-compose & Dockerfile` `devcontainer.json`の設定で注意する点**
* 上記2点を含む、**webアプリ開発用Go+DBコンテナのソースコード**

# 環境とコンテナ起動までの流れ
## 動作環境
| | |
|:————–|:——————————–|
|Docker |Do

元記事を表示

BFFとmicroservicesアーキテクチャ

# はじめに

:::note warn
こちらはzennの記事の転載となります。
:::

sweeep CTOの平下です。先日CADDiさん主催のこちらで「BFFとmicroservicesアーキテクチャ」というテーマでLTさせていただきました。そのときのLT内容を記事にしました。

https://caddi.connpass.com/event/244672/

発表したスライドです。

https://speakerdeck.com/hirac1220/bfftomicroservicesakitekutiya

以下記事の内容です。
1. BFFとmicroservicesアーキテクチャ採用の背景
2. GraphQL/BFF導入のメリットと課題
3. まとめと今後の課題

# 1. BFFとmicroservicesアーキテクチャ採用の背景
## モノリスなアーキテクチャ
プロダクトローンチから3年経過し、技術負債がかなりたまっていました。

![old-archi.png](https://qiita-image-store.s3.ap-northeast-1.ama

元記事を表示

時間割変更アプリの説明

作成サイト: http://timetable.torimari.site:8080/
コード: https://github.com/moririn2528/timetable
# 背景
学校の先生は急な出張が入ることがあります。その出張と授業が被っていたとき、その授業を時間割変更する必要があります。この時間割変更を自動的に行うアプリがこちらです。
これはある学校においてかなり難しいことです。その理由は以下の 2 つです。

– クラス分けが複雑であること。
ある高校の 3 年 A 組の授業は、数学の授業は A 組と I 組合同、英語は A 組、国語は 2 次試験に必要かどうかで分かれ A 組と I 組合同、理科は物理か生物どちらを取るかで分かれて A 組と I 組合同、社会は地理、日本史、世界史、倫理政経どれを取るかで分かれて A,B,C 組合同という風にかなり複雑です。
– 研究日、非常勤講師など、授業できない時間帯が多いこと。
ある高校では、非常勤講師が 1/3 くらいいます。また、常勤講師においても週 1 で研究日があり、その日は休みです。さらに、出張日など授業できない時間帯

元記事を表示

GoでWebサーバーを作成する

# はじめに
Goでwebサーバーを作成するときに調べたことをまとめます

# プログラミングの基本
・オブジェクト指向
カプセル化、継承、ポリモーフィズム
[オブジェクト指向とは?誰でもわかるようにやさしく解説](https://www.sejuku.net/blog/5973#i)

・コンストラクタ
クラスをnew時点で実施されるもの

・インターフェース
持つべき関数を定義する
[インターフェースとは?](https://www.gixo.jp/blog/5159/#i-2)

・dto
>DTOとは、オブジェクト指向プログラミングでよく用いられる典型的なオブジェクトの設計パターン(デザインパターン)の一つで、関連するデータを一つにまとめ、データの格納・読み出しのためのメソッドを定義したオブジェクトのこと。

[IT用語辞典 DTO 【Data Transfer Object】](https://e-words.jp/w/DTO.html)

# Goの文法で調べたこと

・Goでのコンストラクタの使用方法
[Goでのコンストラクタの定義](https://qiita.com/

元記事を表示

GoでメールのFrom/Toをエンコードする一番簡単な方法

Amazon SESを使ってメールを送信する際に、aws-sdk-goではFromに日本語名を使うと文字化けしてしまったので。

“`go
func main() {
addr := mail.Address{
Name: “太田豊太郎”,
Address: “mail@example.com”,
}
fmt.Println(addr.String()) // =?utf-8?q?=E5=A4=AA=E7=94=B0=E8=B1=8A=E5=A4=AA=E9=83=8E?=
}
“`

元記事を表示

GoでJWT生成/認証を実装する。(ロジック編)

# はじめに
Webの認証で扱われるJWT。誰かが作成した認証・認可の部品を利用する事で自然に触れている。自然に触れているけど、JWTって何?どうやって作ってるの?セキュリティ周りなんでそれで大丈夫なの?って所がいまいちイメージできていなかった。今回、JWTの所を改めて勉強することにしたので、記事にして残しておきます。

## JWTって何?
JWTとはJsonWebTokenの略で、ジョットと読みます。[RFC7519](https://www.rfc-editor.org/rfc/rfc7519)で定義されたインターネット標準の認証方式です。公式リファレンスの抜粋では下記のように定義されています。
![スクリーンショット 2022-09-24 14.34.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8c6af326-de3c-269b-8166-d2d620942716.png)
[日本語訳]
“`
JSON Web Token (JWT) は、コンパクトでURLセーフな表現

元記事を表示

Go言語 WebSocket サーバー&クライアント

## WebSocket
WebSocketは、サーバーとクライアントの間で双方向の非同期通信を可能にする技術である。
クライアントに即座に通知したり、サーバーからクライアントにデータをプッシュしたりするために使用される。

## サーバーコード
“`Go
import (
“log”
“net/http”

“golang.org/x/net/websocket”
)

// WebSocket Server Sample
func main() {
log.SetFlags(log.Lmicroseconds)

http.Handle(
“/”,
websocket.Handler(func(ws *websocket.Conn) {
defer ws.Close()
for {
// Receive Logic
var msg string
recvErr := websocket.Message.Receive(ws, &msg)
if recvErr != nil {
log.Fatal(recv

元記事を表示

Go言語、Visual Studio Code でのデバッグ方法を調べる

# Go言語、Visual Studio Code でのデバッグ方法を調べる

Windows を使っているとする

? とりあえずググって適当に記事を読む。大筋で、以下の記事の通りやるとできる

? [Goのデバッグ環境 on VSCode](https://future-architect.github.io/articles/20201117/)

とりあえず真似する

# Step [O1o0] はじめに

## Step [O1o1o0] エディター

Visual studio code を使っているとする

## Step [O1o2o0] プログラム言語

Go 言語をインストール済みとする

## Step [O1o3o0] Go エクステンションを入れる

? [Go for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=golang.Go)

## Step [O1o4o0] 関連するツールをインストールする

`[Ctrl] + [Shi

元記事を表示

go getを使わずにメインモジュールが無いリポジトリをモジュールとして導入する

#### 背景
https://qiita.com/eihigh/items/9fe52804610a8c4b7e41

しかし、メインモジュールが無いリポジトリは、go installできない。
#### How to
モジュールとしてインストールしたいリポジトリは以下とする。
“`
https://github.com//
“`
以下の手順で、インストールできるはず。
go1.19.1
“`
cd $GOPATH

git clone https://github.com//

cd

go install
“`
#### 【参考・引用】

https://new-lamp.hatenablog.com/entry/2021/10/27/124054

https://blog.applibot.co.jp/2021/04/20/go-install/

元記事を表示

SVGファイルからdrawioのライブラリを作成するスクリプトを作ってみた

[この記事](https://qiita.com/capybara-alt/items/033596584f26cd96d94c)の実践編
## 背景
モックアップをdraw.ioを何度か使うことがあった。フロントエンドをAngular+PrimeNGで実装するため、draw.ioでPrimeNGのアインコンを使いたかった。しかし、draw.ioにPrimeNGのアイコンが使えなかった(ライブラリがなかった)ため、手作業でライブラリを作る必要があった。
今後、このような作業を手作業でしたくないので、本ツールを作成した。
## 本ツールでできること
以下3点の処理をすることで、draw.ioでSVGアイコンのライブラリを自動で作成する。また、ライブラリ内のSVGの色などもdraw.ioで変更できるようになる。
+ SVGファイルを読み込み、draw.ioのライブラリとして出力する
+ SVGにstyleタグがない場合、自動でタグを挿入する
+ draw.ioのstyle情報に”editableCssRules=.*”を追加する
## 動作
CLIツールなので、ターミナルで実行する
1

元記事を表示

GoとC#を速度比較してみた

# ★記事更新しました (2022/09/24 23:00更新)
比較ソースがGoとC#とで差異があったため、再測定を行い、記事更新しました。
修正前ソースは、for文のループ変数の型がintになっており、内部的にはGoはint64[^1]、C#はint32で差異がありました。
記事本文は、以下3つのソースの測定結果を並記しております。(③が更新前の記載内容)
 →変数の型が、①int64 ②int32 ③int (Goはint64、C#はint32)

以下、本文です。

[^1]:Goのint型は、環境依存でint64またはint32になります。

———-
GoとC#の速度比較を行いました。
普段C#を扱っているのですが、Goを使う機会があり、Goは早いと噂なので実際に測ってみたのが動機です。

# 計測内容
2~Nの整数が素数かどうか、愚直にループと判定を行う処理をGoとC#で実行しました。

* 変数の型が以下3パターンのソースで実施。
* int64 →ソース:[Github(Int64ブランチ)](https://github.com/takeITe

元記事を表示

Hyper-Vをコマンドから操作する!

# はじめに
powershellからHyper-Vを操作しようとすると、Start-VMだの、Resume-VMだのコマンドの先頭が違います。Bashとかに慣れた身からすると違和感ありまくりで使いにくいです(笑)。そこで、manahyというツールを作成(中)したので紹介したいと思います。

# manahyとは
Go言語で開発したHyper-Vを管理するためのツールです。現在は機能は少ないですが、今後、追加していく予定です。
レポジトリ

## 実装している機能
– Hyper-Vが有効化されているか確認する
– VMの一覧取得
– VMの電源操作

## 今後実装する(したい)機能
– Hyper-Vの有効化
– VMSwitchの一覧取得
– VHD / VMSwitch / VMの作成・削除機能
– VHD / VMSwitch / VMの各種パラメータの変更機能

# インストール
[Go] echo で session 管理を実装してみた時の話

## 環境
* MacBook Air (M1, 2020)
* MacOS Monterey 12.0.1
* VSCode 1.71.0
* go version go1.18 darwin/arm64
* echo v4.7.2
* gorilla/sessions v1.2.1

## やりたいこと & この記事で書くこと
go の [echo](https://echo.labstack.com) と [gorilla/sessions](https://github.com/gorilla/sessions) を用いて、以下のような処理を実装します。

1. クライアントからアプリケーションサーバーに認証が必要なリクエストをする。
1. アプリケーションサーバーがセッションファイルを作成して、セッション管理する。
1. ブラウザが cookie を保存する。
1. 以降同様のリクエストがきた場合にセッションを確認してユーザーの判別を行う。

と言っても、ほとんどの実装は echo や gorilla/sessions が提供してくれているので、こちらで

元記事を表示

OTHERカテゴリの最新記事