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

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

TinyGo×leavesでLightGBMのWASMを作る

## 概要
この記事では、LightGBMを用いた推論処理をWASMにしてブラウザ上で実行させる方法を紹介します。具体的には、軽量なビルドアセットが作成可能なTinyGoと全てGo言語で実装されているleavesを使い、軽量でランタイムやモデルファイルが内包されているWASMを作ります。

## leaves
leavesは純粋なGo言語だけでGBRTモデルの予測コードを実装しているライブラリで、対応モデルはLightGBM、XGBoost、scikit-learnのtree modelです。今回はLightGBMの学習済みモデルを推論で利用させるために使用します。LightGBMのモデル読み込みは、txt形式とjson形式の2種類が対応しており、自分の環境ではLightGBMのモデルファイルサイズが小さいtxtの方を利用しました。また、標準でカテゴリ特徴量がサポートされていたり、バッチ推論もできるのが特徴量です。推論速度はREADMEによるとC言語実装と比較してもそれなりに高速みたいです。また、External (Unofficial) RepositoriesとしてLightGBM

元記事を表示

クリーンアーキテクチャへの第一歩

## 1. **はじめに**

本記事では、ソフトウェアアーキテクチャの一つであるクリーンアーキテクチャの基本的な理解を深めることができます。
具体的な実装方法として、Go言語を用いた例を紹介します。クリーンアーキテクチャとGo言語の特性を初めて学ぶことで、ソフトウェア開発がより効率的でメンテナンス性の高いものになる第一歩を踏み出せると思います!
また、クリーンアーキテクチャの全体像を掴みたい方や、Go言語の実用例を知りたい方にも役立つ内容となっていますー!

## 2. **クリーンアーキテクチャとは何か**

ソフトウェアの設計と組織を明確にし、可読性とメンテナンス性を高めることを目的とした設計原則です。
これにより、ソフトウェアはテストが容易で、柔軟性があり、独立した開発とデプロイが可能となります。

## 3. **クリーンアーキテクチャの構造**

円状に層を配置した構造を持ちます。内側の層が外側の層に依存する一方で、外側の層は内側の層に依存しないようになっています。

![CleanArchitecture.jpg](https://qiita-image-store.s3

元記事を表示

Goのinternalパッケージを使ったPackage by Featureを意識した構成

https://qiita.com/advent-calendar/2023/kaonavi

この記事は カオナビ Advent Calendar 2023(シーズン2) 11日目です。

最近はinternalパッケージを使用した開発をしているので、どのような構成でやっているかを書きます。

# internalパッケージ

Goでは先頭を大文字にした関数・interface等はどこからでも参照できます。
ただモジュール開発などをしていると内部で共通化のためにパッケージを切り出したいが、外部から参照はさせたくないということはよくあります。

そこで以下のようにinternalパッケージを使用することで、配下パッケージの実装を外部パッケージから参照できなくすることができます。

以下の構成の場合は`a/b/b.go`からは`a/b/internal`を参照できますが、
`a/a.go`からはinternalパッケージ配下は参照できなくなります。

“`
a/
├ b/
│ ├ internal/
│ │ ├ d/
│ │ │ └ d.go
│ │ └ c.

元記事を表示

Goの書式付きフォーマットをpkg.go.devを見ながらまとめる

# Goのfmt.Printf()をpkg.go.devを見て勉強する

Goの書式付きフォーマットを見ると最初はびっくりしませんか?

過去の私と同じ経験をしているあなたと一緒にこの記事で勉強していきたいと思います。

参考サイト
https://pkg.go.dev/fmt

## 忙しい方向けにサマリ

– 個人的に良く使うもの

| フォーマット | 出力 |
| — | — |
| %v | 通常のフォーマット |
| %+v | フィールド名つきのフォーマット |
| %d | int |
| %s | string |

– デバッグ時には%+vを進めたい

## 参考サイトを見ていきましょう

“`go
package main

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

func main() {
// A basic set of examples showing that %v is the default format, in this
// case decimal for integers, which can be

元記事を表示

技術書典15で「Go言語で構築するクリーンアーキテクチャ設計」を頒布した話

# はじめに
技術書典15にサークル名「コードカキタイ」で初参加し「Go言語で構築するクリーンアーキテクチャ設計」を頒布しました。

https://techbookfest.org/product/9a3U54LBdKDE30ewPS6Ugn?productVariantID=itEzQN5gKZX8gXMmLTEXAB

本記事では初めて出展するまでの話を書きます。

# 参加までの背景
社内の定期輪読会にて技術書を読み、意見交換をしていく中で、技術書を書く側も面白そうと感じていました。また技術書典に参加経験がなく、いつか経験してみたいと考えていました。

そんな時エンジニア仲間が技術書典参加メンバーを募集しており、参加を決意しました。結果として、別々の企業に所属する4人のGoエンジニアが集まり、約半年にわたるプロジェクトが始まりました。

# 頒布までに大事にした点
企画~出展までのストーリーは共著者の@hiroaki-u さんの記事にまとまっているため、自分は書籍を執筆する中で大事にした点を書きます。

https://qiita.com/hiroaki-u/items/b85

元記事を表示

【Go言語】簡単なウェブアプリケーションの作成

Goで作成されたアプリケーションは配布が容易で、特にコマンドラインツールの実装に優れているが、ウェブアプリケーションの作成にも適している。

## 基礎的なウェブサービス

`http://localhost:8080/hello`にアクセスすると`Hello, World`を返すウェブアプリを作成する

### サンプル
“`go
package main

import (
“fmt”
“io”
“net/http”
“os”

“github.com/rs/zerolog/log”
)

func main() {
// URLごとの処理を登録
http.HandleFunc(“/hello”, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, World”)
log.Info().Msg(“receive hello world request”)
})

// サーバーの起動を画面に表示
fmt.Println(“Start listening at :80

元記事を表示

gRPCに入門しよう!

## はじめにーgRPCとは?
![gRPC-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618249/ad4468c0-e4d1-486b-60da-550ecdd34809.png)

現代のソフトウェア開発の分野において、分散システムは重要性を持ちます。効率的なコミュニケーション手段が不可欠であり、Googleが開発したフレームワーク-gRPCが重要な役割を果たしてきました。gRPCはRPCの効率を活用しつつ、HTTP/2の機能と共に進化しています。

簡単に言うと、gRPCは、クライアントがローカルのオブジェクトを呼び出すかのように直接異なるマシン上のサーバーアプリケーションのメソッドを直接に呼び出すことができるというフレームワークです。

サーバーサイドでは、サーバーがインターフェースを実装し、gRPCサーバーを実行してクライアントからの呼び出しを処理します。一方、クライアントサイドでは、クライアントがサーバーと同じメソッドを提供するStub(クライアント)を持っています。

!

元記事を表示

gormでMigration+Seedingを実行する

# はじめに
Qiita初投稿です。

Go言語のORMツールであるGORMでマイグレーションとシーディングを実装したところ、何点か詰まったところがあったので、記事にしてみようと思いました。

# GitHub
今回のソースコードはGitHub上にあるので、詳細はそちらを参考にしてください。
https://github.com/yasu2122yasu/article/tree/main/gorm-migration-seeding

# 前提条件
– M2 Macbook Air
– GoとDBのコンテナを使用
– Goのバージョンは1.18
– GoのフレームワークであるGinを利用(今回の実装はmain.goのみでも可能です)
– DBのイメージはMysql:8.0を使用

# doceker-compose
“`yml:docker-compose.yml
version: ‘3.8’

services:
api:
container_name: api
build:
context: ./api
dockerfile: Doc

元記事を表示

これから学び始める人へ伝えたいGoの性質と特徴

この記事は[ディップ株式会社 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dip-dev)の11日目の記事になります。

こんにちは!
2023年の4月にディップ株式会社に入社し、現在Goを使って開発をしている[@imkaoru](https://qiita.com/imkaoru)です!

社会人としては9ヶ月目に突入しましたが、日々初めてのこと・わからないことの連続で、なんかずっとバタバタしています。
生まれて初めて師走を実感している今日この頃です!

![gopher_fiveyears.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2612580/795beaef-1a60-dfe0-4857-e2d98edf05cc.jpeg)
by [Renee French](https://reneefrench.blogspot.com/)

# はじめに

さて、今回は「これから学び始める人へ伝えたいGoの性質と

元記事を表示

Go製の2Dゲームエンジン「Ebitengine」でレイマーチングしてみる

この記事は[クラスター Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cluster) シリーズ2の11日目の記事です。

こんにちは。クラスター株式会社でソフトウェアエンジニアをしている @catGPT です。えびのてんぷらとクリエイティブコーディングとおっきいねこが好きです。

前日の記事は もなしー monac(@monac) さんの「なにか」でした! // TODO: 後日fix

普段はサーバーサイドをGoで書いたりしているのですが、趣味では言語やツールを問わず表現の領域が好きだったりします。先日、Go製の2Dゲームエンジン「Ebitengine」のシェーディング言語「Kage」でレイマーチングに入門してみたのでその紹介の記事を書きたいと思います。

なおshaderに関する知識は趣味として得たもので、誤った内容等なとはお目溢しいただければ幸いです。

# Goの2Dゲームエンジン「Ebitengine」
Ebitengineの説明は、公式Webページに一番端的な説明がありましたので引用させていただき

元記事を表示

Goでcsv

アドベントカレンダー10日目。
csvファイルの扱いについてです。

以下のCSVファイルを用意しておきます。
“`bash
cat app/day10/sample.csv
Name,Age,City
Alice,25,New York
Bob,30,Los Angeles
Charlie,35,Chicago
“`

## 読み取り
“`go
package main

import (
“encoding/csv”
“fmt”
“os”
)

func main() {
file, err := os.Open(“app/day10/sample.csv”)
if err != nil {
return
}
defer file.Close()

r := csv.NewReader(file)
for {
record, err := r.Read()
if err != nil {
return
}
fmt.Println(record)
}
}
“`

“`bash
$ go run app/day10/main.go

元記事を表示

[Go] ゴミ箱にファイルを移動するgo-trashを作ってみた

この記事はゴミ箱について得た知見[^1] [^2]を基に、ファイルをゴミ箱に移動する`go-trash`を作ってみました。

https://github.com/Redh00k-k/go-trash

# ゴミ箱にファイルやディレクトリを移動
## Linux
ゴミ箱に移動させたいファイルを`$HOME/.local/share/files`に移動させることと、`$HOME/.local/share/info`に`<移動させたいファイル名>.trashinfo`ファイルを用意する必要があるだけです。

気を付けないといけないのは、ファイルやディレクトリをゴミ箱に移動させる前に`$trash/info`に対応するファイルを作成しなければならないことです。

実装は以下の通りです。こちらはオプション等を一切考えずファイル/ディレクトリをゴミ箱に移動させる機能だけ実装してあります。
“`go
package main

import (
“fmt”
“os”
“os/user”
“path/filepath”
“strings”
“time”
)

// ~/.local/

元記事を表示

【VSCode】Goツールで発生したエラーについて

この記事は、[海洋大技術系サークル Advent Calender 2023](https://qiita.com/advent-calendar/2023/kaiyo-tech)の10日目です。

# 1. はじめに
こんにちは!
主にバックエンドを中心に開発している、大学生です!
最近Goを書く機会が多いのですが、VScodeでGoの拡張機能の依存関係のパッケージインストールでエラーにハマったのでそちらについて書いていきたいと思います。

# 2. 何をしたのか
VSCodeでGoツールをインストールするために、パレッドで以下のように`Go: Install/Update tools`を行いました。
![スクリーンショット 2023-12-09 23.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2970275/d27651f0-8abc-ed0e-fcd5-6406af7899fd.png)

![スクリーンショット 2023-12-10 0.04.02.png](https://qi

元記事を表示

GCP Vertex AI の生成 AI機能と実装

# GCPのVertex AIの生成AIの概要と機能

## 概要
GCPのVertex AI(バーテックス エーアイ)は、人工知能(AI)のモデルを簡単に作成、トレーニング、デプロイするためのクラウドベースのサービスです。Vertex AIは、Google Cloudの強力なコンピューティングパワーを利用して高品質なAIモデルを構築するためのツールとリソースを提供します。また、Java、Go、C#を含むさまざまなプログラミング言語に対応しており、開発者が利便性を重視しながらAIモデルの開発を行うことができます。

## 機能
1. **データ前処理**: Vertex AIは、トレーニングデータの前処理を簡素化するための機能を提供します。データのスケーリング、欠損値の処理、カテゴリカルデータのエンコーディングなど、さまざまな前処理タスクを自動化することができます。

2. **モデルトレーニング**: Vertex AIは、トレーニングデータを使用してAIモデルをトレーニングするための機能を提供します。トレーニングジョブの作成や管理、ハイパーパラメータのチューニングなど、モデルトレー

元記事を表示

ゲーム開発におけるログインボーナスAPIの仕様

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

こんにちは、都内在住の大学生をしている[Daina](https://qiita.com/nishiumidaina)です!普段はゲームの開発や研究をしています。
今回はゲームのサーバーサイド開発に焦点を当てて、ログインボーナスAPIのロジックや実装方法に関する内容を中心に取り扱います!

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

※重要なディレクトリのみ記載
“`
.
├─ api
| ├─ di: wire
| └─ presentation
| ├─ controller: ハンドリングを記述する
| ├─ middleware
| ├─ request: 自動生成
| ├─ response: 自動生成
|

元記事を表示

12/08にリリースされたFrankenPHP触ってみた

# FrankenPHPってなに?
Go言語で書かれたモダンなPHPアプリケーションサーバーだそうです。
サイトはこちら👇
https://frankenphp.dev/docs/

![スクリーンショット 2023-12-08 12.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14268/9daeaeaa-3cc5-6732-7bbb-ee8f94920972.png)

[ドキュメントサイト](https://frankenphp.dev/docs/)も作成されていました。

AdventCalendarの締め切りも近づいてたので、ちょっと触ってみるかということで触ってみました。

# インストール
インストールというよりは、Dockerで動かしてみることができるようです。

“`bash
$ docker run -v $PWD:/app/public \
-p 80:80 -p 443:443 \
dunglas/frankenphp
“`

Go言語で書かれ

元記事を表示

[Golang]レイヤードアーキテクチャから学ぶ密結合と疎結合

## 本記事でやること
– レイヤードアーキテクチャを題材として密結合なコードを紹介
– 密結合だとどういう問題があるのかを紹介
– 疎結合なコードに変更
– 疎結合にするとどういうメリットがあるのかを紹介

今回実装したコードはこちらのレポジトリで公開しております。

https://github.com/kurakura967/go-layered-architecture-anti-pattern

## 対象読者
– 「密結合」・「疎結合」というワードは知っているが、実際にどういう状態を指すのかわからない方
– 「密結合」だとどういう問題があるのかを知りたい方
– 「疎結合」だとどういう利点があるのかを知りたい方

## 使用言語
– Go言語 1.21.0

## 背景
システム設計やソースコードなど含め、「疎結合」に保つことが重要というのはよく耳にすると思います。
筆者の過去の経験ですが、インターネットで「密結合」や「疎結合」について調べてみても、モノに例えて説明している記事が多く、腑に落ちないことがありました。
そこで、より実務に沿った内容で密結合と疎結合について考えるこ

元記事を表示

ミーティング中を検知して周囲の人間に知らせる(1)

# ミーティング中を検知して周囲の人間に知らせる(1)

私は同居人と2人で暮らしているのですが、在宅ワークをしているとミーティングの際に不意に同居人から話しかけられたりすることがあります。
これを防ぐため、ミーティングする前には一言声をかけるのですが、こんどはミーティングが終わったことを知らせるのを忘れてずっと音を抑えたまま不便な思いをさせてしまうことが何度かありました。
この問題をシステムで解決しようと思い立ちました。

内容は長くなりそうなので2部か3部構成にします。

## アプローチ

### ミーティングかどうかを検知する方法

在宅では基本的にMeetやHaddleでミーティングを行うため、ミュート、アンミュートに限らずPCのマイクの使用を検知すれば現在がミーティング中かどうかは判断できそうです。
さらに言えば、プロセスの名前等からhaddleやMeetに入っているかどうかも検知できそうです。

### 周囲の人間に知らせる方法

これはラズパイ等のマイコンとパトランプを用意し、パトランプをピカピカさせることで周知できそうです。
また、マイコンでLAN内のサーバーをホスト

元記事を表示

GCP Contact Center AI機能と実装

# GCPのContact Center AIの概要と機能

## 概要
GCP(Google Cloud Platform)のContact Center AIは人工知能(AI)と自然言語処理(NLP)を活用したクラウドベースのコンタクトセンターソリューションです。このソリューションは、企業が顧客との対話を自動化し、効率的かつパーソナライズされたカスタマーエクスペリエンスを提供することを支援します。

## 機能
1. 対話フローマネージャー:GCPのContact Center AIは、ビジュアルなエディターやAPIを通じて対話フローの作成と管理を提供します。顧客との対話の流れや質問に基づいて対話フローを定義し、顧客が問題を解決するための情報を収集します。

2. 自然言語処理(NLP):Contact Center AIは、顧客の発言やテキストメッセージを解釈し、意図やエンティティを抽出する自然言語処理を提供します。これにより、顧客の要求や問題を正確に理解し、適切な返答やアクションを提供できます。

3. オムニチャネルサポート:GCPのContact Center AIは、電話

元記事を表示

[Go]パート3

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

## if文

“`go:main.go
package main

import “fmt”

func main() {

var hoge string = “apple”

if hoge == “apple” {
fmt.Println(“○”)
} else {
fmt.Println(“×”)
}

}

“`
結果
“`

“`
条件部分に()を付けなくて良いです。

## Switch文
“`go:main.go
package main

import “fmt”

func main() {

var hoge string = “apple”

switch hoge {
case “apple”:
fallthrough
case “coffee”:
fmt.Println(“りんご”)
fmt.Println(“コーヒー”)
default:
fmt.Println(“その

元記事を表示

OTHERカテゴリの最新記事