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

Go関連のことを調べてみた2023年02月13日
目次

OpenAIのAPIで自然言語(日本語)を使ってDBに問い合わせるCLIツールを作ってみた

## 概要

ChatGPTで話題になっているOpenAIが提供しているAPIを使って、自然言語(日本語)でデータベースに問い合わせすることができる[CLIツール](https://github.com/dotneet/natuql)を作成してみました。Go言語で実装しています。記事内で使い方と仕組みの説明をします。

https://github.com/dotneet/natuql

## 動機

ChatGPTがデータベースを理解することに驚いたことや、[gpt-index](https://github.com/jerryjliu/gpt_index) の仕組みなどを調べていて、自然言語でのDB問い合わせは比較的簡単に実現できそうで未来的な面白さを感じたので実験的に実装してみました。自然言語を使ってSQLクエリを発行できれば、SQLを書けない人でも柔軟にDBから情報を取得できるようになります。非エンジニアが分析を行うときのハードルを相当下げることができます。おそらく似たものは既に存在するのだと思いますが、ノンガチ勢でもこういったものが簡単に作れる時代になったのは本当に素晴らしい

元記事を表示

【Go】ハードコードしているSQLをバイナリに埋め込んですっきりさせよう

## はじめに

Goを書いていて、実行するSQLをハードコードしていることはないでしょうか

例えば、短いSQLだとこんなかんじ

https://pkg.go.dev/database/sql#example-DB.QueryContext

“`go
age := 27
rows, err := db.QueryContext(ctx, “SELECT name FROM users WHERE age=?”, age)
if err != nil {
log.Fatal(err)
}
“`

この例であれば、構文ミスがあっても実行前に気づくこともあるでしょう

ただ、次のように複数行にわたってSQLを書いてしまうこともあるのではないでしょうか

“`go
sqls := []string{
`UPDATE employees
SET salary = 5000;
`,
`UPDATE employees
SET salary = salary * 1.1
WHERE salary <= 10000; `, `UPDATE e

元記事を表示

GoでCLIを実行後にターミナルを閉じる

## やりたいこと

“`main.go
import “fmt”

func main() {
fmt.Println(“hello world.”)
fmt.Println(“Bye bye~”)
}
“`

上記ファイルを`go build`してできたCLIを実行すると、コマンド実行後はこのように表示される。

“`
hello world.
Bye bye~
logout

Saving session…
…copying shared history…
…saving history…truncating history files…
…completed.

[プロセスが完了しました]
“`

このCLIを実行後にターミナルウィンドウを閉じたい。

## やり方
この挙動はMac自体のターミナル設定によるもので、コマンドで指定はできない。

ターミナル > 設定 と進み
もう怖くない!Goのポインタを理解しよう!

## はじめに
僕がGoを触っていてまず最初に躓いたのがポインタでした。
「なんか値が上手く変わんない?」「あれ、今回って`&`だっけ?それとも`*`だっけ?」「ん?なんかsliceが変な挙動を示す?」
気づいたら色々な壁にぶつかって、ポインタはよく分からないしなんか怖いものと思っていました。
Goを初めて学ぶ人でそう思う人は僕以外にもいるはず!笑

ということで今回はそんな恐怖とおさらばしようという記事です!
Goのポインタで苦しんでる方、一緒にポインタを理解していきましょう!

**目次**
– [そもそもポインタって何?](#そもそもポインタって何)
– [関数とポインタ](#関数とポインタ)
– [sliceとポインタ](#sliceとポインタ)
– [sliceの構造](#sliceの構造)
– [append時のslice](#append時のslice)
– [mapとポインタ](#mapとポインタ)
– [おわりに](#おわりに)
– [参考文献](#参考文献)

## そもそもポインタって何?
[A tour of Go](https://go.dev/tou

元記事を表示

Go言語で最速のJSONデコーダーを作った話

## はじめに

こんにちは。Sugawara Yuutaです。今回は高校の休み時間に考え、空いた時間で作ったJSONデコーダーについて紹介したいと思います。
知ってる限りでは、汎用型受け入れ型をとっているデコーダー(つまり、標準パッケージと同じスタイルという意味です)の中では最速です。

## モチベーション

Go言語で開発を始めて、(Go言語のコミュニティーのスタイルがJavaScriptなどと比べるとなんでも標準ライブラリでやってしまうようなのにも関わらず)サードパーティー製のJSONデコーダーが多く作られていることに驚きました。

しかし、大規模なものから小規模なものまで試してみて、それぞれが必ずしも共通しているとは限らない、たくさんの問題を持っていることに気づきました。それについては下のセクションで詳しく取り上げます。

## 今までのJSONデコーダーが持つ問題

具体的なライブラリの名前は出さないでおきます。

– CPU依存(アセンブリを使ったりして、速くなる可能性を得る代わりにamd64以外が対応されなくなったりします。例えばM1やRaspberry Piはarm6

元記事を表示

GCP, Cloud RunでgRPCのサービスを動かす & サービスアカウントによりアクセス制御する

# はじめに
Cloud RunでgPRCのサービスを動作させます。
かつ、サービスアカウントによるアクセス制御をほどこします。

# 構成と検証ステップ

下図のようなフロント/バックともにCloud Runの構成とします。
フロントはHTTPS、バックはgRPCでリクエストを受け付けます。

![figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1950110/176ca430-8671-bba1-00d4-559e3a15b392.png)

フロント、バックの機能は以下のとおりです。

| コンポーネント | 機能 |
|-|-|
| バック | ランダムな緯度、経度の組み合わせを返す |
| フロント | 上の緯度、経度を中心とした地図を表示する (Google Maps使用) |

以下のステップで検証を進めていきます。

| ステップ | 構成 | フロントからバックへのアクセス可否 |
|-|-|-|
| 1 | フロント、バックともに認証不要 | OK |
| 2 | バッ

元記事を表示

[Go][備忘録] sliceをmake()する方法による挙動の違い

# はじめに

Go初心者です。
学習していて、今後つまずきそうと思ったのでメモしておきます。

# make()方法による挙動の違い

`make()`を使用してsliceを作成する場合、第2引数に`length`、第3引数に`capacity`を渡すようにしないと、`int`の初期値である`0`で埋められたsliceが作成されてしまう。

`make()`にsizeだけ渡す場合

“`go
package main

import “fmt”

func main() {
var s []int
s = make([]int, 5)

for i := 0; i < 5; i++ { s = append(s, i) fmt.Println(s) } fmt.Println(s) // -> [0 0 0 0 0 0 1 2 3 4]
}
“`

`make()`にsizeとcapcityどちらも渡す場合

“`diff_go
package main

import “fmt”

func main() {
var s []int
– s = m

元記事を表示

GoでSMTPを使用したメール二段階認証ページを作ってみた

# GoでSMTPを使用したメール二段階認証ページを作ってみた
Goでユーザー名/パスワード認証とワンタイムパスワードを使用した二段階認証を作ってみました。イメージをつかむためのテストとして作成したものでそのまま使用できるようなものではありませんが、ご参考になればと思います。

また、駆け出しなのでプログラムのミスや単語の誤用があるかと思いますので、コメントにてご指摘頂けると嬉しいです。

## 開発環境
* OS
* Microsoft Windows 10
* エディタ
* Visual Studio Code
* Go SDK
* go1.20 windows/amd64

## SMTPサーバーについて
SMTPサーバーは何でもよいのですが、試験的に使うものなのでGmailを利用しました。GmailのSMTPサーバー機能を使用する場合、以前は普段のログインと同じパスワードが使用できたのですが、現在はアプリパスワードを取得する必要があります。

アプリパスワードの取得方法は本筋から逸れる内容ですので割愛します。筆者は以下のサイトを参考にアプリパスワードを取得しました。

元記事を表示

Docker on WSL2でawesome-composeのnginx-golang-mysqlを立ち上げる

Dockerの勉強を兼ねていろんなサーバを構築して遊んでいるのですが、次のような素晴らしい(awesome!な)リポジトリがあったので、早速試しました。

https://github.com/docker/awesome-compose

基本的には好きなディレクトリに入って “` docker compose up -d “` するだけなのですが、自分の環境(WSL2)では少々詰まってしまったところがあったので、備忘録として残しておきます。

この記事では、アプリケーションサーバにGo、プロキシサーバ(Webサーバ)にNginx、データベースサーバにMySQLを使ったアーキテクチャ “` nginx-golang-mysql “` を立ち上げてみます。

### git clone & ディレクトリに入る
“`
$ git clone https://github.com/docker/awesome-compose.git
$ cd awesome-compose/nginx-golang-mysql/
“`

### docker compose実行
“` doc

元記事を表示

Asterisk AGIでGo言語を使う方法

# 1. AGIファイルを用意する

“`agi.go
package main

import (
“log”
)

func main() {
log.Println(“AGI TEST”)
}
“`

# 2. AGIファイルをビルドする

“`
# $ go build agi.go

$ ls
agi.go
agi
“`

# 3. extension.confでビルドしたバイナリを指定する
“`extensions.conf
same => n,AGI(agi)
“`

元記事を表示

CKADを駆け抜けろ!kubectl短縮コマンドを体に叩き込むツールを作った

# TL; DR

“`bash
# リソース名が長い!
$ k get replicasets
ERROR: too long! should be `kubectl get rs`

# オプション名が長い!
$ k get rs –namespace foo
ERROR: too long! should be `kubectl get rs -n foo`

# ヨシ!
$ k get rs -n foo
NAME DESIRED CURRENT READY AGE
nginx-76d6c9b8c 1 1 1 23h
“`

https://github.com/Syuparn/kuberta

# はじめに

CKADは、k8sを利用するアプリケーション開発者向けの試験です。

https://training.linuxfoundation.org/ja/certification/certified-kubernetes-application-developer-ckad/

元記事を表示

構造体の埋め込みを GORM で利用すると便利

## 構造体の埋め込み

“`go
type A struct{}

func (A) Execute() { println(“A”) }

type C struct { A }

func Test(t *testing.T) {
c := C{}
c.Execute()
}
“`

上記のコードは正しく動作します。
このように、構造体を別の構造体に埋め込むことを Struct Embedding と呼びます。

## GORM での利用

GORM では、構造体からテーブル名を得る際に、構造体の `TableName` メソッドが使われます。
たとえば次のコードを書いたとき、GORM は `a` というテーブル名を得ます。

“`go
type A struct{}

func (A) TableName() string { return “a” }
“`

Struct Embedding により、以下の `B` 構造体は、外から見ると `TableName` メソッドを持つかのように見えます。

“`go
type A struct{}
type B str

元記事を表示

DDDとは?GOとは?って状態からAPIのユニットテストをつくってみた

# テストコード

今回は[DDDとは?GOとは?って状態からAPIをつくってみた](https://qiita.com/tauemo/items/87e34c5a7d631236ab4d)で作ったプログラムにテストコードを作ってみます。

まず、テストコードはどこからどこまで作成するのか、と言うのが大きく意見が分かれてくるところです。
個人的にはテストコードを書くなら、徹底的に書く。書かないならまったく書かない。と言うのが好きです。

と言うのは、引き継いだプロジェクトで「テストコード書いててCI環境も構築してコミットしたらテストコードが走るようになってるから。」と言われて安心してたんだけど、テストコードは中途半端に実装されているだけで、当然バグとして発見されるべきものが発見されず、リリース後に気づくということが頻発したことがありました。
テストコードのおかげでバグを見つけられることもあり、捨てるのはもったいなく、メソッドに変更を加えるとテストコードの変更も加えないといけない、時間のある時にテストコードの漏れを補っていかないといけない。手動のテストもやらないといけない。と言う経験があ

元記事を表示

GOを使ってLaravelのSeederクラスを生成するプログラムを作った

最近、GOを学習しているのと、csvファイルのデータからLaravelのSeederを作成するタスクがあったので、Seederを作成するツールをGOを使って作ってみました。

## 作ったソース
ついでに、DBからデータを取得し、Seederを作成するプログラムも作りました。
使い方は、README.mdを参照してください。

https://github.com/murapon/generate_seeder_by_golang

## 参考にしたサイト
https://qiita.com/ikawaha/items/28186d965780fab5533d

https://chat.openai.com/chat
を使って、回答を得た。

スネークケースのファイル名をアッパーケースに変更する方法
![スクリーンショット 2023-02-08 17.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37929/358e0ba1-f95b-64c6-5903-526059b7780f.png)

元記事を表示

【Golang】go.mod file not found in current directory or any parent directory.の対処法

## はじめに
最近Golangの学習を始めました。ざっと[A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)を一通りやったので、実際に何かを書いてみようと思い、Go+Gin+Gorm+Mysql+Docker+Nginxで簡単なAPIを作成しようとしていました。そんな時に下記のようなエラーに遭遇したので、備忘録がてら記事にします。

## 実行手順とエラーの内容
さて、簡単なREST APIを作成するために、Dockerで環境を構築しようと下記のように最小構成でDockerfileを記載しました。

“`dockerfile:Dockerfile_修正前
FROM golang:1.20.0-bullseye

WORKDIR /data

RUN apt-get update \
&& apt-get install git \
&& go get github.com/gin-gonic/gin \
&& go get github.com/jinzhu/gorm \
&& go get

元記事を表示

helper = osxkeychainしながら自作のプライベートリポジトリーをGoで使う方法

## 検証環境
* macOS Monterey バージョン 12.4(21F79)
* git version 2.32.1 (Apple Git-133)
* go version 1.19.1 darwin/amd64

## 導入
[macOSのキーチェーンアクセスに自作のプライベートリポジトリーのユーザー名やパスワードを登録](https://support.apple.com/ja-jp/guide/keychain-access/kyca1120/mac)し、[Gitに`helper = osxkeychain`を設定してそれを読み込ませることで自動的にログインする](https://qiita.com/yurachika2020/items/4453fbf20b49fb93fcff)と便利です。
これを使って`go get`や`go build`ができたらどんなに良いかと思い、実行してみたら以下のようなエラーにぶち当たる人は多いでしょう。
“`zsh
% go build
go: git-codecommit.ap-northeast-1.amazonaws.com

元記事を表示

一周年記念に”THE FIRST CODE”を完走した感想

# `THE FIRST CODE` ってなあに?

`THE FIRST CODE` という遊びを皆様ご存知でしょうか?

「一度だけの実行しかできない条件で、指定のプログラムコードを開発する」という、プログラミング系Youtuberの間で流行っている遊びです。
音楽系Youtubeチャンネルの `THE FIRST TAKE` をモジったタイトルになっています。

YoutubeやTwitterで #thefirstcode というタグで検索するといろいろな方がUploadしている動画を見ることができます。

# ゆにるユニ一周年記念でやってみた!

ところで私はゆにるユニ、IT TechLeadのVTuberです。はじめましての方ははじめまして!
普段は [プログラミング言語を作った](https://qiita.com/yuniruyuni/items/2c4aa81097a4e5578d46) り、Yuniru’s HackerNews Summaryとして、ハッカーなニュースを毎週まとめてお伝えしています。。。!

実は2月5日に一周年を迎えたので、その日の遊びとして `T

元記事を表示

Golang、PresignURLでファイルをアップロードするときハマったところ

GolangでPresignURLを使ってファイルをアップロードすると下記のエラーが出てしまい
“`
NotImplemented
A header you provided implies functionality that is not implemented

Transfer-Encoding

“`

RequestのHeaderをDumpすると`Transfer-Encoding:chunked`になってる。この値だとAWS側が対応してないみたいです。

## 解決方法
go version 1.19
“`
req.ContentLength = #content size <- ファイルのサイズ値を設定する ``` ContentLengthを設定するだけで解決しました 因みに、`req.Header.Set("Content-Length", xxx)`を設定しても解決できないです。これのせいで結構ハマりました理由です。 Full Codeはここです

元記事を表示

Bun, Deno, Go, Node, Rust, Zig: ベンチマーク

# Bun, Deno, Go, Node, Rust, Zig: シンプルな Web Server ベンチマーク

vim-jp slack の #lang-go で、Go vs Node が土日に繰り広げられていました(月曜日気づいた)。
mattn さんが、Go と Node の速度を比較するベンチマークを書いていたので、それを bun, deno, go, node, rust, zig で書いてみました。
(zig わからないので未完成です ?)

https://github.com/ekusiadadus/bench-web-server

## ベンチマーク

### Apache Bench

| Language | Requests per second | Time per request |
| :——- | :———————- | :—————- |
| bun | 11793.40 [#/sec] (mean) | 0.848 [ms] (mean) |
| deno |

元記事を表示

gorm.DeletedAt と Delete をあれこれ検証してみた [GORM]

# はじめに
Go言語のORMパッケージとして、[GORM][GORM] があります。
「データの取得」「論理削除」「物理削除」について色々検証してみたので、その結果を共有します。

# 前提
– Go言語をある程度触ったことがある
– [GORM][GORM] パッケージをある程度触ったことがある
– 主に、`gorm.DeletedAt`とその周辺について話します
– データベースの内容は、VSCode 拡張機能の [MySQL](https://marketplace.visualstudio.com/items?itemName=cweijan.vscode-mysql-client2) で閲覧します
– [Gin][Gin] パッケージを触ったことがある
– 最終的にAPIレスポンスとして検証するので、Gin を使います
– APIへのリクエストは、VSCode 拡張機能の [RESTClient](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) を用います
– 論理

元記事を表示

OTHERカテゴリの最新記事