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

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

goで画像のトリム処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像のトリム処理の方法を紹介します。

## 動作環境
go 1.18.1

## 使用パッケージ

* icemint0828/imgedit
画像のトリム処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.3.0
“`

# 画像のトリム処理

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// 切り取り開始位置の指定(px)
left, top := 100, 100

// サイズの指定(px)
width, height := 400, 400

// FileConverter
fc, _, err := i

元記事を表示

Goで学ぶTEE入門(EGo)

# はじめに

コンピュータの処理で利用中のデータを保護することが求められている。
これはサービスの内部犯や、サーバに不正ログインした攻撃者といった脅威から、資産を守るためである。
(一般的な暗号技術は、転送中や保存したデータを保護するが、実行中は保護しない。)

そこで利用中のデータを保護するフレームワークである[EGo](https://www.edgeless.systems/products/ego/)について紹介する。
EGoはTEE(Trusted Execution Environment)と呼ばれる技術を用いて、利用中のデータを保護する。
TEEは外部からの不正なアクセスが難しいハードウェアを用いて利用中のデータを保護する。

EGoはGo言語を使ってTEEで動作するプログラムを記述できる。

TEEは主に以下の性質を持つ[^seisitu]。

– **機能1. 隔離性** OSやアプリケーションから隔離される
– **機能2. 機密性** メモリに保存する内容を暗号化する
– **機能3. 証明可能性** TEEで動いているプログラムについて証明できる

**この

元記事を表示

不変性とエイリアス参照と意味論と

## はじめに

これはGoに不変参照が存在しない理由を雑に推測してみたものを文章にまとめたものです。
ぜんぜん間違っている可能性があるので、そうだった場合はこっそり教えてください。

## Go

Goは値セマンティクスと参照セマンティクスを明確に使い分ける言語です。
それはだいたいの言語がそうなのですが、Goではどうやらこれを不変性と結びつける、すなわち不変セマンティクスと値セマンティクスが結びつき可変セマンティクスと参照セマンティクスが結びついているといった言説を目にすることが少なからずあります。

当然みなさんはC言語を履修していますから、const参照といった概念があるではないかと気がつかれたかと思います。

Goには参照に対して不変性を与えるセマンティクスはありません。
[公式のFAQ](https://go.dev/doc/faq#methods_on_values_or_pointers)では値を渡すか参照を渡すかによって使い分けるような設計を奨励しているようです。

なんということでしょう!Goは安全性のための意味論を無意味にゴミ箱に投げ捨てて、値は不変・参照は可変と

元記事を表示

クライアントサーバ方式とP2P (STUN)でファイルの転送速度を比較してみたらP2Pの方が圧倒的に遅かった件

# 初めに
タイトルが全てです。ファイル転送をクライアントサーバ型とP2Pで実装して速度を比較しようとしましたが、良い結果が得られなかったのでその過程をここで供養します。

# 目次
[クライアントサーバ型とP2Pの通信方式について](#クライアントサーバ型とp2pの通信方式について)
[P2Pに立ちはだかる課題「NAT越え」とは](#p2pに立ちはだかる課題nat越えとは)
[NATを越える為の技術](#natを越える為の技術)
[基本P2Pの方が早い](#基本p2pの方が早い)
[仮説](#仮説)
[検証方法](#検証方法)
[結果](#結果)
[考察](#考察)
[まとめ](#まとめ)

# クライアントサーバ型とP2Pの通信方式について
**クライアントサーバ型**
コンピュータをサーバ(サービスを共有する側)とクライアント(サービスを授受する側)に分け、役割を分担して運用する仕組みです。
クライアントはサーバに対してほしいデータをリクエストし、それに対してサーバは要求されたデータを送ります。
P2Pと比較したときに、クライアントサーバ型は中央集権型の構造として語られます。おそ

元記事を表示

WebSocket Byte、Stringの送受信の検証

ブラウザからWSを通して送受信できるデータについて確認、実装を行います。

## クライアントで扱うことができるデータタイプ

[規格](https://websockets.spec.whatwg.org/#ref-for-dom-websocket-send%E2%91%A0)のレファランスから「Blob、ArrayBuffer」を扱っていることがわかりますが、[MDNのレファランス](https://developer.mozilla.org/ja/docs/Web/API/WebSocket/send)からは「USVString」も追加でサポートしていることが記載されています。
「Blob」は基本的にファイルデータを指していますが、データを転送する際に「ArrayBuffer」からバイトを転送することと大きく変わりはないため、今回はByteデータの送信で検証します。

## クライアントが受け取るデータタイプ

データ転送時とは違く、[MDNのレファランス](https://developer.mozilla.org/en-US/docs/Web/API/MessageEve

元記事を表示

Go言語で Codewars の問題を解くための設定

# はじめに

Codewars の Go の問題はテスティングフレームワークとして Ginkgo https://onsi.github.io/ginkgo/ を使っているけれど、このフレームワークの使い方がわからなて試行錯誤して一応問題を解く上では困らなくなったのでメモを残す。
手順は以下の通り

– 作業ディレクトリの作成
– モジュールの初期化
– フレームワークのダウンロード
– テストコードのコピー・ペースト
– テストの実行

Codewars ではパッケージ名に kata を使うのが一般的なようなので、モジュール名を codewars、パッケージ名を kata にする。

## 作業ディレクトリの作成

“`
mkdir -p codewars/kata
“`

## モジュールの初期化

“`
cd codewars
go mod init codewars
“`

## フレームワークのダウンロード

ginko は v2 を使うことにした。特に理由はないが、Codewars のテストコードは v2 を使うように後で変更する。

“`
go ge

元記事を表示

Herokuにサブディレクトリをデプロイするのに命削った話

## この記事について

以下のようなプロジェクトでサブディレクトリ(server/)をherokuにデプロイする話です

今回のプロジェクトではgoを使ってます

“`dir:directory
├─data
├─db
├─docker
├─front
├─scraping
└─server
├─domain
├─infrastructure
├─interfaces
│ ├─controllers
│ └─database
├─usecase
└─utils
“`

## Docker環境のherokuへのよくあるデプロイ

トップディレクトリにmainファイルが存在し、そこにDockerfileやheroku.ymlが存在する

この場合だといろいろ設定して“`git push heroku master“`でいけそう

## 今回の場合

frontもserverも同じリポジトリで管理している

serverディレクトリのみをherokuでデプロイしたい

## 手順

以下のサイトに詳

元記事を表示

goで画像のリサイズ処理を行う

# はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像のリサイズ処理の方法を紹介します。

## 動作環境
go 1.18.1

## 使用パッケージ

* icemint0828/imgedit
画像のリサイズ処理に使用しています。
画像ファイルの拡張子の変換にも使用しています。

https://github.com/icemint0828/imgedit

## インストール

“`shell
$ go get github.com/icemint0828/imgedit@v1.3.0
“`

# 画像のリサイズ処理(サイズ指定)

“`main.go
package main

import (
“github.com/icemint0828/imgedit”
)

func main() {
// サイズの指定(px)
width, height := 500, 500

// FileConverter
fc, _, err := imgedit.NewFileConverter(“srcImage.p

元記事を表示

Goを触る①

# はじめに
業務でGoを使うことになったので備忘録としてメモ

# インストール
Mac環境なのでHomebrewを使う
“`
$ brew update
$ brew upgrade
$ brew install go
“`
インストールされているか確認
“`
$ go version
“`
パスを確認
“`
$ go env GOPATH
“`

# Hello world

“`go
package main
import “fmt”
func main() {
fmt.Println(“Hello world”)
}
“`
runでファイルをそのまま実行
“`
$ go run hello-world.go
“`
buildでバイナリを生成することでバイナリを直接実行できる
“`
$ go build hello-world.go
$ ./hello-world
“`

# 変数
変数 は var 変数名 型名で宣言
“`go
var hoge int
“`
初期値を設定することも可能
“`go
var hoge int = 1
“`

元記事を表示

今更Qラーニングを勉強したっていい

## この記事は何か
タイトルの通りです。
強化学習を勉強しようと思ってから長い月日が過ぎたので、書きはじめました。
勉強しながら書くのでだんだん言っていることが変わる可能性があります。
おそらく定性的な議論ばかりして定量的な事をいいません。

## なぜ
筆者は趣味で `botトレーディング`[^1] をしています。
結果は鳴かず飛ばずですですが、かなり楽しくやっております。
botはよく手入れをしている時は勝てるのですが、すぐに賞味期限が来て高速お金配りシステムへと変貌します。
Qラーニングは、せめて取引の手法がきまっているならその変数調整くらいは自動でやってほしいよねということで、諸々検討しているうちの一つです。

[^1]: システム連動できる取引所で自動売買するシステム(bot)を運用してお金を得たり失ったりすること。

## やること
いきなり複雑な系を扱うよりはまずイメージを掴みたかったので下記を題材として進めていきます。

![E00FD628-E316-4DB8-9571-03470679FED4_0.png](https://qiita-image-store.s3

元記事を表示

MySQL WorkBench でスロークエリをとってISUCON頑張る

# MySQL WorkBench でスロークエリをとってISUCON頑張る

MySQL WorkBench を 仕事で最近使うようになりました。
MWBを触っているうちに、結構いろいろなことができることに気が付きました。
例えば、ER図を作成したり、スロークエリログをとることです。

また、[達人が教えるWebパフォーマンスチューニング](https://gihyo.jp/book/2022/978-4-297-12846-3)が発売されて、Twitterで話題になっていて気になっていました。

元記事を表示

【Golang】Gitコミットのrevision番号(commit id)を取得するには

# Go 1.18以降でBuildInfoを使う場合
[BuildInfo](https://github.com/golang/go/blob/9cec77ac11b012283e654b423cf85cf9976bedd9/src/runtime/debug/mod.go#L40-L47)のSettingsにある”vcs.revision”を取得。

“`go:main.go
package main

import (
“fmt”
“runtime/debug”
)

func main() {
var rev string
info, _ := debug.ReadBuildInfo()
for _, s := range info.Settings {
if s.Key == “vcs.revision” {
rev = s.Value
}
}
fmt.Printf(“revision: %s\n”, rev)
}
“`

“`sh
$ go mod init sample
$ git init && git add . && git c

元記事を表示

go genericsメモ

go 1.18でchunk?が書きやすくなったのでメモ。

“`
import (
“fmt”
)

func chunks[T any](l []T, n int) chan []T {
ch := make(chan []T)
go func() {
for i := 0; i < len(l); i += n { fromIdx := i toIdx := i + n if toIdx > len(l) {
toIdx = len(l)
}
ch <- l[fromIdx:toIdx] } close(ch) }() return ch } func main() { mm := []map[string]interface{}{ {"a": 1, "b": 2}, {"a": 3, "b": 4}, {"a": 5, "b": 6}, {"a": 7, "b": 8}, {"a": 9, "b": 10}, } for m := range chunks(mm, 3) { log.P

元記事を表示

Go の net/http で Web サーバーを立てる

## 基本のコード

マルチプレクサとして `DefaultServeMux` を使用し、`http.HandlerFunc()` でハンドラを付与していきます。

“`go:main.go
package main

import (
“fmt”
“net/http”
)

func hoge(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “hoge”)
}

func fuga(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “fuga”)
}

func main() {
server := http.Server{
Addr: “:8080”,
Handler: nil,
}

http.HandleFunc(“/hoge”, hoge)
http.HandleFunc(“/fuga”, fuga)

server.ListenAndServe()
}

“`

## 解説

### 構造体 `http.Serv

元記事を表示

GOルーチンの非同期処理で context の取り扱いに気をつけないと事故る

`Go`の`context`パッケージの使い方がイマイチよく分からない。このように思っている方は、多いのではないでしょうか。

「**なんかリクエスト情報を持っている**」、今までなんとなくそう思いながら使っていました。そして、その`context`の使い方を間違えて本番にリリースした結果・・・ 見事に事故りました。

## 事故の経緯
今回使用したのは、`graphql`というライブラリです。GraphQLクエリ実行に便利なクライアントですね。
https://github.com/machinebox/graphql

社内のAPIからコールしていたのは、このライブラリの`graphql.Run()`メソッドです。今回の修正がこちら。
もともと`context.Backgrount()`で空の`context`を生成して使用していたのですが、同じリクエストスコープだからといって、パラメータの`context`を使用することにしたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27

元記事を表示

Golang 最新版を Amazon Linux2 へインストールする

Golang 最新版はこちら

https://go.dev/dl/

執筆時点の最新版は 1.18.3 でした

“`bash
wget https://go.dev/dl/go1.18.3.linux-amd64.tar.gz
“`

ファイルを解凍します

“`bash
sudo tar -C /usr/local -xzf go1.18.3.linux-amd64.tar.gz
“`

パスを追加します

“`bash
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> .bash_profile
“`

確認

“`bash
source ~/.bash_profile
go version
“`

結果
“`bash
go version go1.18.3 linux/amd64
“`

元記事を表示

(続) Ginフレームワークとsqlxを連携させた簡易プログラム例 (SelectとGetの違い、バルクインサート、トランザクション)

[前回の記事](https://qiita.com/rikimaru-odd-person/items/519053f24c20a3344f9c)に続いて、下記3つの使用方法についてお見せしたいと思います。

– SelectとGetの違い
– バルクインサート
– トランザクション

### 前回の記事
https://qiita.com/rikimaru-odd-person/items/519053f24c20a3344f9c

### 始めに、おことわり
– 「使えればいい」レベルでの内容ですので、セキュリティやコード品質は無視しております。ご了承ください。
– クリーンアーキテクチャではなく、ベタベタなController+Model形式での設計であることをご容赦ください。

### 環境とディレクトリ構成
前回と同じです

### 例題のソース
https://github.com/rikimaru-tokyo/gin_sqlx_lesson02

### 1: Select()とGet()の違い
– Select() : 複数行のデータ取得時に使用する。

元記事を表示

github.com/gin-gonic/gin がインストールできない?

## なにが発生した?
Go言語のWebフレームワーク **Gin** が気になったので、Hello,World!的なものを作ろうとした。
その際に、
“`
> go install github.com/gin-gonic/gin@latest
“`
を実行したが、`go build`でパッケージが見つからないエラーが発生した。

## この時の環境
“`
Microsoft Windows [Version 10.0.19044.1766]
(c) Microsoft Corporation. All rights reserved.

C:\Users\7280ayubihs>go version
go version go1.18.3 windows/amd64
“`

## 解決の備忘録

`go install`の実行後に調べてみると、`$GOPATH/pkg/mod`にGinが配置されており、`go build`実行時に`$GOPATH/pkg/mod`にパスが通っていないので、エラーになったようです。

で、この`$GOPATH/pkg/mod`は Go mod

元記事を表示

【自己学習】Go言語を学ぶ(2)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Functions

関数は、0個以上の引数を取ることができます。
この例では、 add 関数は、 int 型の2つのパラメータを取ります。
変数名の 後ろ に型名を書くことに注意してください。

概要
* 型指定が必要
* mainの引数から別のFunctionsを読み込んで返せる
* 必ずfunction内で`return`を忘れないこと

* サンプルコード
“`go
package main

import “fmt”

func add(x int, y int) int {
return x + y
}

func main() {
fmt.Println(add(42, 13))
}
“`
* 結果:55

`x int, y int`は `x, y int`に省略できる

* サンプルコード
“`
package main

import “fmt”

func add(x, y int) int {
return x + y
}

func

元記事を表示

goでpluginパッケージを使う

## Go Plugin
– lambda関数を共通化できるlambda layerがPluginで作る必要があるみたいなので調べました
– lambdaでなければ、git submoduleとかのほうが使い勝手が良さそう
– Pluginだとローカルファイルとして用意してあげないといけないから

## Plugin側

### サンプル

“`golang
package main

import “fmt”

var V int

func F() { fmt.Printf(“Hello, number %d\n”, V) }
“`

### ビルド

– `-buildmode=plugin`をつけて、`.so`でビルドする
– おそらく、カレントディレクトリでimport pluginをしていないファイルがプラグインとして認識されてビルドされる

“`bash
GOOS=linux go build -buildmode=plugin -o plugin.so
“`

## 呼び出し側
### サンプル
“`golang
package main

i

元記事を表示

OTHERカテゴリの最新記事