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

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

proxy-wasm を使って JWT 検証を go 言語で実装できるのか?

proxy-wasm での JWT 検証の実装を通して proxy-wasm でどこまでできるのかを調べた。
proxy-wasm は将来性に期待できる技術なものの、WebAssembly(wasm) のメインの用途はブラウザ上と思われる。
そのため proxy-wasm は発展途上で、現時点では色々な制約・将来性がある中でその魅力・使いやすさなどを知るために触ってみた。

# 要約
– proxy-wasm で JWT 検証を go 言語で実装するのは下記理由で困難だった。おそらく他言語でも同様だと思われる。
– proxy-wasm では tinygo を使う必要があるが、[利用可能な package に制約がある](https://tinygo.org/docs/reference/lang-support/stdlib/)
– proxy-wasm における [http アクセス](https://github.com/proxy-wasm/spec/tree/master/abi-versions/vNEXT#proxy_dispatch_http_call)の

元記事を表示

【Golang】日付の月を数値で取得する

## 結論

“`go:main.go
package main

import (
“fmt”
“time”
)

func main() {

// Januaryなどの英語表記で取得
targetMonthString := time.Now().Month()
fmt.Println(“targetMonthString: “,targetMonthString)

// 1や2などの数値で取得
targetMonthInt := int(time.Now().Month())
fmt.Println(“targetMonthInt: “,targetMonthInt)
}
“`

“`実行結果
~/go/src/jikken$ go run main.go
targetMonthString: January
targetMonthInt: 1
“`

元記事を表示

【Go+gorm】sql.Openとmysql.Openの違い

# はじめに
gorm.Openの第一引数にデータベース接続情報をもったsql.Openの返り値を渡せないことが気になりました。
正しくはmysql.Openを渡してあげることになるのですが、名称も似ていてよく分からなかったので調べてまとめてみます。
“`
gorm.Open(mysql.Open(dbConn), &gorm.Config{})
“`

# 結論
そもそも返り値の型や数が違いました

# sql.Openとmysql.Openの違い

sqlパッケージの公式ドキュメントでは以下のように定義されていました

“`sql.Open
func Open(driverName, dataSourceName string) (*DB, error)
“`

一方、mysqlパッケージの公式ドキュメントでは以下のように定義されていました

“`mysql.Open
func Open(dsn string) gorm.Dialector
“`

また、gormパッケージの公式ドキュメントでは以下のように定義されていました
第一引数のDialector型はmysql.

元記事を表示

go言語 ent migrationメモ

golang + ent のmigrationメモ

“`hoge.go
func (Hoge) Fields() []ent.Field {
return []ent.Field{
field.String(“name”).Optional().Annotations(entsql.Annotation{Size: 200}),
}
}
“`
– null可
.Optional()

– varcharのmax length
.Annotations(entsql.Annotation{Size: 200}),

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処 (1対多のデータの取得)【実装編-Part4-2】

# DataLoaderを用いてN+1問題対処(1対多のデータの取得)

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5-2になります。

**前回の内容を実装した上での実装になります。**

前回:1対1のデータの取得の際のDataLoaderの実装を行いました。
(todoに紐づいている一人のユーザをDataLoaderを用いて取得しました)

https://qiita.com/shion0625/items/47c2b73c1b2d652d8e6c

## この記事の内容
– 1対多のDataLoaderの実装(ユーザに対して紐づいている複数のTodoをDataLoaderを用いて取得する)

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part5-2までの切り取り**

https://github.com/shion0625/gqlgen-todos/tree/part5-2

## DataLoader(1

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処【実装編-Part4】

# DataLoaderを用いてN+1 問題対処

:::note alert
2023/1/4 20時30分以前のコードのuser.goのBatchGetUsersに不備がございました。
:::

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5になります。

**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:一人のユーザから複数のTodoを取得する処理を実装しました。

https://qiita.com/shion0625/items/e59fecfd14843f20bd8b

## この記事の内容
前回一人のユーザから複数のTodoを取得する処理で発覚したN+1問題を対処していきます。
– 前回のおさらい
– DataLoaderの実装

## Github R

元記事を表示

Go で AtCoder を半年やってみたのを思い出す

# はじめに
おはこんハロチャオ!
正月実家でやることがなく暇すぎるので昨年半年の振り返りと言う意味も込めて Go で AtCoder をやった感想をまとめようと思います。正月らしく(?)アニメを観ながらだらだら書きます。
![Screenshot from 2023-01-04 03-31-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088500/671ff032-d891-3d80-58ad-e6c62b2d8384.png)
# Go で始めた理由
2022年の4月からコードを書くバイトを始めました。そこで Go を使うかもと言われていたので勉強しようと思っていたところ、それと同時期に複数の知人から AtCoder を勧められました。それ以前には Python しか書いたことがなかったのですが、実行速度が気にかかったのと、どうせなら新しい言語を勉強しようということで Go で始めてみることにしました。
# アカウント作成時
レートの画像を見てわかるとおり実はアカウントを作成したのは202

元記事を表示

自作RDBのためにオンディスク並行Skip Listを作ってみた

どうも ryo_grid です。
今回は自作RDBMS [SamehadaDB](https://github.com/ryogrid/SamehadaDB) の開発の中で、インデックスとして用いるためのコンテナとして、オンディスク並行Skip Listなるものを作ってみたので、それについて書きたいと思います。
(以降、文体が変わりますが気にしないで下さい)

## はじめに
– 本文書は筆者がオンディスク並行Skip Listを設計・実装してみた中で得た、知識や知見の共有を目的とするものである
– 英語なものも含めて、本文書で共有する種の情報がまとまった形で提供されているWebページ等は筆者が探した範囲で見当たらなかったので、その点で、価値のある知識・知見として、多くの人の役に立つものとなれば幸いである

# Skip Listについて

## Skip Listとは
– いわゆる Key-Value ストアを実現する確率的なデータ構造
– 他の同様の機能性を提供するデータ構造に対し、”確率的”というところが特徴的
– O (log N) でデータの探索(取得)、挿入、削除が

元記事を表示

【Golang/gin】いつも使ってるgin.Contextの中身、覗いていきませんか?

# Step Up Gin! gin.Contextの中身を覗いてみよう!

GolangでGinを使ってAPIサーバーの開発をしていると必ず目にするのがgin.Contextという構造体。

実装されているコードに書かれているgin.Context説明を訳すとこのように紹介されています。

>Context is the most important part of gin. It allows us to pass variables between middleware, manage the flow, validate the JSON of a request and render a JSON response for example.

> Contextはginのフレームワークの中でも最も重要な部品の一つです。
> gin.Contextを使うことで、ミドルウェア間での変数の受け渡しや、処理の管理、JSONリクエストのバリデーション、JSONレスポンスの出力等が可能になります。

APIサーバーを立てるとなると、メタ情報の管理やリクエストのデータの受け渡しが必要になる

元記事を表示

Docker x Golang x PostgreSQL で環境構築

# 概要

現場でGo言語の使用する予定があるのでDockerを使用して環境構築をしてみました。
ディレクトリ構成などはブログ記事など参考にしました。
(書籍なども読んでいってデファクトを見つけていきます。)

ソースコードだけ見たいという方は[こちら](https://github.com/suzu12/docker-go-postgresql-sampleapp)から見ることができます。

# 環境

– go 19.1
– PostgreSQL 15.1
– macOS Monterey version12.6

# 対象読者

– docker x Go x PostgreSQL の環境で簡単に動かしてみたい方
– dockerでの環境構築を試そうとされている方

# 目次

– [概要](#概要)
– [環境](#環境)
– [対象読者](#対象読者)
– [目次](#目次)
– [ディレクトリ構成](#ディレクトリ構成)
– [Docker](#docker)
– [cmd](#cmd)
– [sampleプログラム](#sample-プログラム)
– [まとめ](#まと

元記事を表示

S3に保存されているCSVファイルをjsonレスポンスで受け取る

## 概要
この記事では、S3上に保存されたCSVファイルをLambdaで取り出し、jsonで返す方法を紹介します。
HTTP通信の窓口にはAPIGatewayを使用しています。
APIGatewayのイベントをトリガーにLambdaからS3へアクセスします。

この記事では、S3のポリシー設定、Lambdaのロール設定、LambdaとAPIGatewayの設定は割愛し、Lambdaの実装にフォーカスします。

## 前提条件
CSVファイルは以下のものを使用しました。
全体のソースコードは下に載せます。
またAWSサービスの認証はそれぞれの環境でお願いします。

“`csvs:hoge.csv
“name”,”age”
“fuga”,”22″
“hoge”,”20″

“`

## `Lambda`の実装
実装には`Go`を用います。
大まかに以下の流れです。
1. s3にアクセスするためのクライアントを作成
2. s3からオブジェクトを取得する
3. オブジェクトを構造体にマーシャルする
4. 全ての処理が成功したらレスポンスを返す

以下で詳しく説明していきます。

###

元記事を表示

【Go】テーブルをcollyでスクレイピングしてCSV出力する

## やりたいこと

こんなテーブルをスクレイピングして

Excelでこんな感じで開きたい。

テーブルはNext.jsで作り、ローカル(`http://localhost:3000`)で動かしている。

“`index.tsx
import type { NextPage } from ‘next’

const Home: NextPage = () => {
const table1 = [{ id: “1”, fn: “aaa”, l

元記事を表示

Go言語の「アプリケーション なになに への接続を許可しますか? 」が何回も出てくる問題 (mac)

「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)
を読んでいた時に少しハマったのでメモしておきます.
[本: 詳解GO言語WEBアプリケーション](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3Go%E8%A8%80%E8%AA%9EWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%B8%85%E6%B0%B4-%E9%99%BD%E4%B8%80%E9%83%8E/dp/4863543727)
# 問題
「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)のコードを実行した際に
**アプリケーション“main”へのネットワーク受信接続を許可しますか?**
と出る.
この 承諾ボタン を押すのが一回きりならいいのですが, ctrl + c でプログラムを終了して,
再度プログラムを走らせる度に出てきます.
![スクリーンショット 202

元記事を表示

【Go】# command-line-arguments undefined: への対応

### はじめに

簡単な動作確認時にいつも忘れそうになるのでメモ。

### やりたいこと

1. 以下のようにsample-app内にmain.goとanother.goを作る。
2. main関数内でanother関数を呼び出す。
3. `go run main.go` コマンドを実行

“`
sample-app
└ main.go
└ another.go
└ go.mod
“`

“`main.go
package main

import “fmt”

func main() {
fmt.Println(“main関数です。”)
another()
}
“`

“`another.go
package main

import “fmt”

func another() {
fmt.Println(“another関数です。”)
}

“`

### 出力されるエラー

“`
# command-line-arguments
./main.go:7:2: undefined: another
“`

### 解消法

実行時のコマンドライン引数

元記事を表示

2022年の振り返り(KPT)と今年の目標

明けましておめでとうございます。Esper0328です。
昨年は1月から無職で6月半ばにIOTベンチャーに就職して働くという一年でした。
昨年の振り返り(KPT)と今年の目標を書きます。

# 振り返り

## Keep

一言で言うと振返りを継続的にしつつ勉強を1年続けられたのが良かったです。

* KPTを毎週実施したおかげで生活のリズムがとても良くなった
* 前職までは月80H近く残業しており新しいことをやろうという気力が湧かず
* 時間に余裕ができ、少し先のことをやっておこうと思えた
* 意思決定も早くなり、何かトラブルがあっても悪化する前に手を打てていた
* 昨年は計画的に大量に勉強した
* **読んだ専門書の数 7冊**
* [プログラミング言語Go](https://www.maruzen-publishing.co.jp/item/?book_no=295039)
* 練習問題135 問をテスト書いてプログラミングした
* 仕事でテストを書くのが苦にならなかった
* [Distributed Services Wi

元記事を表示

dockerを安くデプロイしたい【備忘録】【読みづらい】

# はじめに
ローカルでdockerを用いて簡単なアプリケーションを作った。
それをデプロイしようと思ったのだが、なんせ高い。
amazonのVPCとか使うと高そう。

なのでそれをどう安く公開できるのかを探りながら実装してみた。

そして、備忘録なので読みづらいですよ。
もくじを見ながら読むと読みやすいかも。

# 決定方針メモ
– deployするものはすでに作成済みのものを使う。
– AWSは使わない
– すでにできているものを使うのは本質を理解できづらいし、何より高い
– さくらインターネットを使う
– https://vps.sakura.ad.jp/
– 安いし、メンターの人におすすめされたのでとりあえず
– 本番環境でdockerは使わない

# こんどやるメモ(今回はやらない)
– domain設定
– ロードバランサー設定
– CICD
– サーバー間通信
– https://vps.sakura.ad.jp/feature/lnw.html
– applicationの日本語化
– なんかmysqlに日本語かとうろくできない。

元記事を表示

Get started with Fx

※ソース記事は[こちら](https://uber-go.github.io/fx/get-started/)
ここではFxの基礎を紹介する。このチュートリアルで、以下を行う。
– 空のアプリケーションを開始
– HTTPサーバーを追加
– サーバーにハンドラーを登録
– アプリケーションにロギングを追加
– ハンドラの結びつきを離すようリファクタリング
– サーバーに別のハンドラーの追加
– 実装の一般化

初めに、チュートリアルの残りのためにセットアップをする。
1. 新しい空のプロジェクトを始める。
“`bash
mkdir fxdemo
cd fxdemo
go mod init example.com/fxdemo
“`
1. 最新バージョンのFxをインストールする。
“`bash
go get go.uber.org/fx@latest
“`

# 最小限のアプリケーションの作成
Fxアプリケーションのhello-world相当のものをビルドしよう。このアプリケーションは、一連のログを出力する以外はまだ何もしない。
1

元記事を表示

gqlgen 1対多のデータの取得【実装編-Part3】

# 1対多のデータの取得

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart4になります。

**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:公式ドキュメントを用いて作成した物にデータベースの導入を行いました。

https://qiita.com/shion0625/items/7448d39451a626e453bd

## この記事の内容
前回までに作成Todoアプリを改修していきます。
– createUserのmutationの追加
– usersのqueryを追加
– usersからそのユーザの複数のTodoを取得する

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part4までの切り取り**

https:

元記事を表示

【小ネタ】AWS CDK を使って ECS に LoadBalancer に独自ドメインを設定した話

# 概要

`AWS CDK for Golang` を使って `AWS` の `ECS` のクラスタにロードバランサを設定し、そのロードバランサに独自のドメインを設定します。

# この記事で伝えたいこと

* `AWS CDK` を使うことで、簡単にロードバランサの設定を行うことができる

# 課題を解決する技術、手法

こんな感じのコードを書きます。

“`go
import (
“fmt”

“github.com/aws/aws-cdk-go/awscdk/v2/awscertificatemanager”
“github.com/aws/aws-cdk-go/awscdk/v2/awsec2”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecr”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecs”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecspatterns”
“github.com/aws/aws-cdk-go/awscdk/v2/awsel

元記事を表示

Dockerで始めるgRPC

# はじめに

dockerを使ったgrpcをまとめたいと思います。
内容は、クイックスタートに準拠しています。

https://grpc.io/docs/languages/go/quickstart/

レポジトリーを作りました。

https://github.com/sugiyama404/practice_grpc

## gRPCとは

gRPCとは、http2とバイナリを使用した高速通信可能なgoogleが開発したPRCフレームワークです。

![Qiita](https://grpc.io/img/landing-2.svg)

## プロトコルバッファとは

構造化データ定義し、シリアライズするためのオープンソースメカニズムです。
protocコマンドを打つことで、goファイルを自動生成します。

# コーディング
## Dockerをbuild

“`console:ファイル構成
.
├── client
│ ├── Dockerfile
│ └── go_grpc
│ └── bin
│ └── go_starter

元記事を表示

OTHERカテゴリの最新記事