Go関連のことを調べてみた

Go関連のことを調べてみた

GCP Document AI機能と実装

### GCPのDocument AIの概要

GCP(Google Cloud Platform)のDocument AI(Artificial Intelligence)は、文書処理にAI技術を利用するためのクラウドサービスです。Document AIは、自然言語処理や機械学習などの先進的な技術を活用することで、大量の文書を自動的に処理・分析することができます。主な機能としては、文書のOCR(光学式文字認識)、テキスト抽出、情報の分類、自動要約、機密情報の検出などがあります。

### Document AIの機能

1. OCR(Optical Character Recognition): Document AIは、画像やスキャンされた文書からテキストを抽出するOCR機能を提供します。複数の言語に対応しており、高い精度で文字を認識できます。

2. テキスト抽出: Document AIは、文書内の特定の情報を抽出する機能も備えています。例えば、契約書からの特定の項目や注文書からの商品情報などを自動的に抽出することができます。

3. 情報の分類: Document AIは、文

元記事を表示

Go:sqlc generate コマンドによって生成された3つのGoファイル

# sqlc とは
SQLクエリから型安全なGoのコードを生成するツールです。
これにより、SQLクエリとアプリケーションコード間の不整合を減らし、データベース操作の安全性と効率を向上させることができます。

# sqlc generate とは
sqlc の主要な機能の一つで、事前に定義されたSQLクエリからGoのコードを生成します。

# sqlc generate コマンドの実行例
## ディレクトリ構成&コード
“`sh
$ tree
.
├── db
│   ├── db.go ← sqlc generateコマンドで生成されたファイル
│   ├── models.go ← sqlc generateコマンドで生成されたファイル
│   ├── create_user.sql.go ← sqlc generateコマンドで生成されたファイル
│   ├── migration
│   │   └── 001_create_users_table.up.sql
│   └── sql
│   └──

元記事を表示

Ưu điểm cửa thép vân gỗ

Hiện nay, cửa thép vân gỗ đáp ứng được các yêu cầu khắt khe lắp đặt cửa cho kết cấu nhà ở, thay thế được cho mẫu cửa gỗ tự nhiên.
Trên thị trường, các sản phẩm cửa thép vân gỗ có mức giá chỉ khoảng 70% so với mẫu cửa gỗ tự nhiên cùng loại, kích thước. Do đó, ưu điểm giá thành rẻ là điểm thu hút nhiều gia đình Việt chọn cửa thép vân gỗ trang bị cho nhà ở, thay thế cho các mẫu cửa truyền thống.
Nếu bạn đang tìm kiếm nơi bán cửa vân gỗ uy tín thì Saigondoor.vn – Một trong những nhà sản xuất và cung

元記事を表示

【Golang】Invalid go version ‘**’: must match format ** の対処法

# はじめに
こちらは、go.modのパースに関するエラーです。
コマンド以外ではgo.modを触っていなかったので対処法が分からず苦労したので、バグレポートのような感じで残しておきます。

# 原因と対処法
原因は、go.mod内で記述するgoのバージョン指定方法に誤りがあるためでした。
“` go.mod
module hoge

go 1.21.3 // ここが原因(バージョン指定方法ミス)

require (

)
“`

そのため、以下の記述方法に変更します。
“` go.mod
module hoge

go 1.21 // 変更

require (

)
“`

そうすると、エラーが発生せずに動かすことができました。

元記事を表示

[Go]パート2

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## 型に別名

“`go:main.go
package main

import “fmt”

func main() {
type UtcTime string
var utctime UtcTime = “piyo”
fmt.Println(utctime)
}

“`
結果
“`shell
piyo
“`

“`go:main.go
package main

import “fmt”

func main() {

type UtcDate string
type UtcTime string
var hoge UtcDate = “20231208”
var piyo UtcTime = “170000”

piyo = UtcTime(hoge)
fmt.Println(piyo)

}

“`
結果
“`
20231208
“`
キャストも可能です。

## 配列

“`go:main.go
pack

元記事を表示

ory/dockertest で網羅性を取り戻す

## はじめに

この記事は、[Kyash Advent Calendar 2023](https://adventar.org/calendars/8604) 9日目の記事です。

こんにちは。Kyash でエンジニアをしている [reo](https://twitter.com/_uhzz_) です。
今年は、開発基盤チームメンバーとして[TechTalk](https://speakerdeck.com/uhzz/an-quan-niqawoxing-eruhuan-jing-gazheng-imasita-kyash-techtalk-number-6-kyashnokai-fa-wotirajian-se)に登壇デビューしたり、新機能チームに入ってゴリゴリ開発したりあっという間の一年でした。

今回は日頃のユニットテストにおける認知負荷を下げて[^1]、よりテストケースに集中できる方法を紹介します。

## 前提

この記事で扱うアーキテクチャは、DDD+オニオンアーキテクチャ+Repositoryパターンを想定しています。
掲載内容は私自身の見解であり、必ずしも所属する企業

元記事を表示

Golangを用いたゲームAPIの開発におけるアーキテクチャ

## はじめに
この記事は[サイバーエージェント24卒内定者 Advent Calendar](https://qiita.com/advent-calendar/2023/ca24engineer)の9日目です。

こんにちは、都内在住の大学生をしている[Daina](https://qiita.com/nishiumidaina)です!普段はゲームの開発や研究をしています。
今回はDDDで構築されたGolangのゲームAPIに自動生成を組み合わせたアーキテクチャについて解説します!

本記事で扱うプロジェクトは[ゲーム開発におけるのサーバー負荷と戦う工夫](https://qiita.com/nishiumidaina/items/aa48c7a4eb3d2a49dadf)でも解説しているため、興味のある方は是非ご覧ください!

## プロジェクト構成
– 言語:Golang
– フレームワーク: Echo
– DB: MySQL
– ORM: gorm
– キャッシュ:go-cache

※重要なディレクトリのみ記載
“`
.
├─ api
| ├─ di: wire
|

元記事を表示

Go(present)でプログラムが実行できるスライド作ってみる

# はじめに
スライドを作る時に、大抵はgoogleスライドかパワーポイントを使うと思います。僕もそうです。GUI操作で簡単に作れますし、多くを覚えなくても作れることはすごく楽です。
ですが、スライド上でプログラムを実行したい場面がきっとあるはずです(こじつけ)。そこでGoの`present`を使うことで、リアルタイムにプログラムを実行してみます。

## 動作イメージ
![画面収録-2023-11-25-17-imageonline.co-4052414.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1939085/c067e7f1-aa4f-b06c-9d52-14835e97318b.gif)

こんな感じで`present`を使うことで、プログラムが実行できるスライドが作れます。

## フォルダ構成
スライド上でプログラムが実行できれば目標は達成ですが、せっかくなのでスライドっぽく何枚か作りました。
“`
── .
├─ image
│ ├─ golang.png

元記事を表示

linebotをgolangで開発した際のTips

初めまして!マレーシアで大学生をしているりゅうじんと申します!
マレーシアに来てから友人との金銭管理をLINEで行いたく思いMessagingAPIを使用したので、その時得たTipsを共有したく思っていました。
その折にアドベントカレンダーの9日目が空いていたので、そこに投稿していきたいと思います。

## Messaging APIとは?
> Messaging APIは、あなたのサービスとLINEユーザーの双方向コミュニケーションを可能にする機能です。

https://developers.line.biz/ja/services/messaging-api/

LINEで受け取った何らかのアクションをきっかけにしてあなたが用意したサーバーに転送して処理を実行できるよ。(意訳)

素晴らしい機能ですね!!これだけでもbotの作り甲斐がありそうです。

さてさてTipsを共有していきたいと思います!!!準備はいいですか!?

## ローカルで開発するにはngrokを使え!
LINEはWebhookである以上、自前で建てたローカルサーバーをWebhookサーバーとして設定することがで

元記事を表示

connect-go+dockerでサーバー開発環境を構築する

本記事 `Cocone Advent Calendar 2023` 9日目の記事となります。

## はじめに

最近では様々な事情もあり、connect-goの利用を始めています。
今回は簡単な利用方法と、protocol bufferのコンパイルもDockerを利用し、すぐに開発開始できるようにしたいよね、ということで、その為に必要な作業をまとめました。
`※golang及びDockerの利用が可能、という前提で進めて行きます`

## connect-goについて

gRPC互換で、よりスリムに、よりスマートに利用できるHTTP APIライブラリです。今回はgolangで利用しますが、web/kotlin/swift/nodeなど、様々な環境への対応も進んでいます。
`Unary RPC` `Client Streaming RPC` `Server Streaming RPC` `Bidirectional Streaming RPC` へも対応しており、今回は触れませんが、各種interceptorも利用できます。

既にgRPCで構築されているシステムでも比較的容易に切り替

元記事を表示

【Go言語】関数・エラー処理

## 関数
関数は一連の処理をまとめ、名前をつけたもの。

`main()`関数や`fmt.Println()`関数はそれぞれ特別な用途の関数。
`main()`はプログラムのエントリーポイント、`fmt.Println()`は標準出力への出力を行う。
標準ライブラリや外部ライブラリの関数を使用し、自分自身の関数や型を作成することができる。

### 関数の定義
関数は引数と返り値を持つことができる

“`go
func calc(x, y int) int {
return x + y
}
“`

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

import (
“fmt”
“math/rand”
“time”
)

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

func main() {
rand.Seed(time.Now().UnixNano())
x := rand.Intn(5)
y := rand.Intn(5)

fmt.Println(calc(x, y))
}

“`

### 返り値に

元記事を表示

GoでGoroutine・Mutexのメモ

# はじめに

どうも僕です。
最近Goroutineを使った処理を書くことがあって、毎回うろ覚えだったのでメモしていきます。

# Goroutine・Mutexについて
**Goroutine**(ゴルーチン)は言わずもがな、プログラムで並列に実行される作業単位のことです。
Goのいいところポイントの1つでもありますね。

**Mutex**はGoroutineが同時に実行される場合、共有リソースへのアクセス制限・保護をするのがMutexです。

ゴルーチンで回す関数の中で特定のデータを更新していく場合、そのデータの競合を防ぐのがMutexってワケですな

# サンプルコード
[PlayGround](https://go.dev/play/p/ebF0AJ6o36R)
“`go:sample.go
package main

import (
“fmt”
“sync”
“time”
)

var (
mutex sync.Mutex
requestCount int
requestCount2 int
)

func main() {
count

元記事を表示

【Go】「http.Get」で取得したhtmlについて文字コードを考慮する

## 概要
`http.Get`でhtmlを取得する際に[GoでGETを使ってHTMLを文字列で取得してみる](https://saitodev.co/article/Go%E3%81%A7GET%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6HTML%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)のような実装を行うと思います。大体のページはこれで大丈夫なのですが、ただこの実装だと文字コードutf-8以外だと文字化けしてしまいます。
というわけで、utf-8以外の文字コードが設定されたhtmlをどう取得するかのメモ書きを残しておきます。

## 対応方針
今回はstackoverflowの[golang HTML charset decoding](https://stackoverflow.com/a/40230300)の回答にある、`charset.DetermineEncoding`メソッドを使用する方法

元記事を表示

[Go]パート1

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## import

“`
import “fmt”

import (
“fmt”
“string”
)
“`
単一で書いたり、グループ化もできます。

## main(Javaで言うMainクラス的な)

“`
package main

func main() {

}
“`
一番ベースとなる形。
Javaと比べると記述の量が少ないです。
## 出力

“`
package main

import “fmt”

func main() {
fmt.Println(“Hello”)
}
“`
System.out.println()みたいなやつ。

## 変数
“`
package main

import “fmt”

func main() {
var hoge int = 123

fmt.Println(hoge)
}

“`
結果
“`
123
“`
Javaの場合は型が先頭でしたね。
Goは逆で

元記事を表示

Lambda go1.xランタイムからprovided.al2に変更時の備忘

## 変更に至った経緯
>Lambda 用の Go 1.x マネージドランタイムは Amazon Linux AMI (AL1) に基づいています。Amazon Linux AMI のメンテナンスサポートが 2023 年 12 月 31 日に終了するまで、Lambda は引き続き Go 1.x マネージドランタイムをサポートします。Go 1.x ランタイムを使用している場合は、関数を provided.al2 に移行する必要があります。この移行ではコードの変更は必要ありません。必要な変更は、デプロイパッケージの構築方法と、関数の作成に使用するランタイムに関するもののみです。

Lambdaのgo1.xランタイムのサポートが2023/12/31で終了になるとの話を受け、急遽go1.xランタイムからprovided.al2に変更する必要が出たため、変更に至りました。

## 環境について
まず、当方の環境はDEV、STG、検証、本番環境と4つあり、DEV環境以外はすべてCIでビルドして
CloudFormationを用いてLambdaの更新を行なっている。goのbuildコマンドで実行ファ

元記事を表示

goでredis

# Goでredis
アドベントカレンダー8日目です。
redisを扱います。
## 環境を作る
“`yml
version: ‘3’
services:
golang:
build: .
tty: true
volumes:
– ./:/app/
ports:
– “1323:1323”
mysql:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: golang
MYSQL_USER: golang
MYSQL_PASSWORD: golang
restart: always
ports:
– “3310:3306”
volumes:
– ./mysql:/var/lib/mysql
redis:
image: “redis:latest”
ports:
– “6379:6379”

元記事を表示

goの基本的な文法をまとめてみた

goを勉強中なので、javaScriptと比較しながら基本的な文法をまとめてみました。

基本的なループ

“`
【javaScript】
for (let i = 0; i < 10; i++) { console.log(i); } 【go】 for i := 0; i < 10; i++ { fmt.Println(i) } ```

条件分岐

“`
【javaScript】
if (x > 0) {
console.log(“xは正です”);
} else if (x < 0) { console.log("xは負です"); } else { console.log("xは0です"); } 【go】 if x > 0 {
fmt.Println(“xは正です”)
} else if x < 0 { fmt.Println("xは負です") } else { fmt.Println("xは0です") } ``` ``` 【javaScript】 switch (x) {

元記事を表示

GolangとFirestoreの開発環境をDockerで作る

# 概要
Firestoreのエミュレータ構築は **[gcloud CLIを使う方法](https://cloud.google.com/firestore/docs/emulator?hl=ja)** と **[Firebase CLIを使う方法](https://firebase.google.com/docs/emulator-suite/connect_and_prototype?hl=ja)** があります。

どちらを使ってもよいのですがFirebase CLIを使う場合は、ブラウザ上でFirestoreのUIが使えるため、開発効率が上がりそうです。
ということでFirebase CLIでの構築をしていきます。

## こんな人向け
– CLIをローカル環境に入れたくない(Dockerを使いたい)
– FirestoreにGoで読み書きをしたい
– デプロイは特に考えず、お手軽にFirestoreの動作確認ができる環境を作りたい

# 環境構築
## Dockerfileの設定
### Firebaseエミュレータコンテナ用
>Emulator Suite をインストール

元記事を表示

【Go】ターミナルからWebサイトを開くCLIツールを作ってみた

# はじめに

 どうも、Shakkuです。
 都内某高専情報科の3年生です。(2023/12/8時点)

 普段Chromeとかブラウザを使っていて、ブックマークに登録したいサイトが多すぎる!とか、ブックマークに入れたくはないけどよく開くサイトがあるな〜ってことありますよね?(あるよね…?)
 ということで今回は、ターミナル上からWebサイトを「URL」で開いたり、「サイト名」で開いたり、「検索」したりできるCLIツールを作ってみました。

 githubにリリースしているので、ぜひ使ってみてください。(https://github.com/Shakkuuu/website-cli)

# 仕様
 CLI上で以下のコマンドを実行することで使用できる。
“`
website-cli [-search 検索したい用語][site サイト名][url URL]
“`

`-search string`
 searchフラグでは、検索したい用語を入れることで、Googleでの検索結果が開かれる。
 スペースを入れて複数用語を検索したいような場合は、クオーテーション`”,””`で囲

元記事を表示

【Go言語】制御構文

## 制御構文とは
プログラムの流れを制御するための重要な構成要素。
Go言語には`if`,`for`,`switch`など基本的な制御構文がある。

### if文
`if`は条件節がブール型である必要がある

“`go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
rand.Seed(time.Now().UnixNano())
// 0か1をランダムに生成
x := rand.Intn(2)

if x == 0 {
fmt.Println(“x=0”)
} else {
fmt.Println(“x=1”)
}

}

“`

Goでは`falsy`という概念がないので以下のコードはビルドエラーとなる

“`go
package main

import (
“fmt”
“math/rand”
“time”
)

func main() {
rand.Seed(time.Now().UnixNano())
// 0か1をランダムに生成
x := ran

元記事を表示

OTHERカテゴリの最新記事