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

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

Producer-Consumer Problemとふれあう

# はじめに

この記事は [Wano Group Advent Calendar](https://qiita.com/advent-calendar/2023/wano-group) 2023の21日目の記事となります。

平行プログラミングの古典的な問題であるProducer-Consumer Problemの典型的な解を実装・確認していきます。実装には、golangを用います。golangは業務で扱うこともあるのですが、平行プログラミングを陽に意識したコードを書く機会は普段ないので、golangによる平行プログラミングの個人的な入門も兼ねた備忘録になります。

# Producer-Consumer Problem

登場人物は、あるアイテムをためることができる有限サイズのキュー、そこにアイテムを入れるProducer、そこからアイテムを取り出すConsumerです。Producerはキューがいっぱいの時はアイテムを入れることはできないので待機する必要があり、Consumerはキューが空の時はアイテムを取り出せないので待機する必要があります。ProducerとConsumerが

元記事を表示

人に運勢があるなら、HTTPリクエストにも運勢があるはず(謎

本記事は[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct) 21日目の記事です。
昨日の記事は@ometora_sateyanの[Python初学者がToDoリストリマインダーbotを作ってみた](https://qiita.com/ometora_sateyan/items/da75b9f8c90d8b9d5452)でした。
個人的にこういったBotのトリガーにGitLabのPipeline Scheduleを利用するのはおもしろい発想だなーと思いました。軽いBotであれば、Pipeline Schedule -> Gitlab-CI -> Incoming Webhook -> Slackでシュッと作れてますね。

## TL;DR

HTTPリクエストのヘッダーに一定の確率でGoodを設定するTraefikのPluginをシュッと作りました。
– https://github.com/ystkfujii/traefik-plugin-fortune

おわり

元記事を表示

Golang: 並行処理で何百万ものデータを簡単にフェッチする

## Golang: 並行処理で何百万ものデータを簡単にフェッチする

### 紹介
ソフトウェア・エンジニアとして、私たちはより少ない労力とメンテナンスで非常に強力なシステムを提供することを求められている。バックエンドの皆さんは、docやCSV、APIから何百万ものデータをフェッチするタスクがあるかもしれません。

巨大なデータをフェッチする際の問題は以下の通りです:

1. パフォーマンス
2. リソースの利用
3. データのフィルタリングとソート

### ケーススタディ
例えば、商品データを取得するためにパートナーのAPIと統合する必要があり、10分ごとに新鮮なデータを取得し、データが変更された場合はDBにアップサートする必要があるとします。

データのフェッチにいくつかの同時実行を使用することをお勧めします。データの異なるバッチで5つの同時実行があるとします。そうすると
1. スレッド1は1-100000のデータを取得するために実行されます。
2. スレッド2が100001-200000のデータをフェッチする。
3. 別のスレッドで続行

#### 並行処理とは
並行処理とは

元記事を表示

tcellを使ってアプリケーションを作る

## はじめに

この記事は、[2023年Advent Calendar](https://qiita.com/advent-calendar/2023)の[12月21日](https://qiita.com/advent-calendar/2021/12/21)の記事です。

私はGoで[ov](https://github.com/noborus/ov)というターミナルページャーをまじめに作っています。
ovは[tcell](https://github.com/gdamore/tcell)を使って構築されていて、tcellを使い倒している方だと思うので、tcellの使い方を解説します。

## GoのTUIライブラリ

その前に、GoのTUIライブラリについて説明します。

Goでターミナル上でアプリケーションを作る(いわゆるTUIアプリケーション)には、以下のライブラリが多く使われています。

* [charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea)
* [gdamore/tcell](htt

元記事を表示

【Go言語】Github Actionsを使って自動テストを回す

開発をする上でテストを使って検証することは重要です。今回はそのテストをgithub actionsを使って自動で行うことに挑戦したので備忘録を残します。

## ファイルを準備する

まずは今回テストする関数を用意します。
今回は簡単な例として、足し算を行う`Add`関数を用意しました。

“`go
// calc.go

package main

func Add(a, b int) int {
return a + b
}
“`

次に早速テストを用意します。テストケースは5つほど用意します。

“`go
// calc_test.go
package main

import “testing”

// TestAdd はAdd関数のテストを行う
func TestAdd(t *testing.T) {
testCases := []struct {
name string
a, b int
expected int
}{
{“Add 1 and 2”, 1, 2, 3},

元記事を表示

認証認可基盤にパスキーを実装するときに悩んだRPID管理の話

この記事は株式会社ビットキー Advent Calendar 2023、21日目の記事です。

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

# はじめに

ビットキーは現在、パスキー認証を導入しようとしています。

ビットキーのシステムは、お客様が実際に触れられるサービス——[workhub](https://www.workhub.site/), [homehub](https://www.homehub.site/homehubapp) を開発するhubsuite領域と、hubsuiteの認証認可を支えるプラットフォーム領域とで構成されています。

私は認証認可を支えるbitkey platform(以下、BKP)を開発するチームに属しており、つい最近パスキー認証のライブラリ選定から設計・実装までを一通り完了しました。

この記事では、「複数サービスを運営する企業の認証認可基盤」ならではの課題とその解決策を共有します。

# 対象読者

– パスキー認証についてはご存知の方
– パスキー認証を自分のアプリケーションに実装予定の方

元記事を表示

Go言語でGCSの巨大な複数ファイルを省メモリでzipファイルに圧縮してまとめる

こちらは、HRBrain Advent Calendar 2023 21日目の記事です。

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

# はじめに
どうもこんにちは、HRBrainでバックエンドエンジニアとして働いてる藤原です。

アプリケーションをつくる上で、一定のメモリ消費で処理が成り立つかどうかを検討することは重要だと思います。
特にWebアプリケーションでは1つのアプリケーションインスタンスで複数のリクエストを同時に処理する必要があります。できるだけ少ないメモリで処理が成り立つとメモリ不足に陥りにくくなり動作が安定しますし、確保するリソースも少なくなり費用も抑えることができます。

今回は巨大な複数のファイルを一定のメモリ消費で1つのzipファイルにまとめる方法について実装を交え説明します。GCSを利用する実用的な内容になってます。

# やること
GCSに置かれている動画ファイルを1ファイルずつストリームで読み、同じくGCSに作成したzipファイルにストリームで書き込んでいきます。
GCSの部分はエミュレータの [

元記事を表示

【Go言語】データ型の拡張

Goでは、`int`や`string`などの**組み込み型**、`スライス`や`map`などの**複合型**を拡張して新しい型を作成することが可能。

新しい型を定義する際、元となる型を「**基底型(underlying type)**」と呼ぶ。
新しい型を作ることで、基底型の特性を引き継ぎつつ新しいメソッドを追加することができる。

### メソッドを追加する
`int`型を基底型として`HTTPStatus`型を定義し、`String()`メソッドを追加する

“`go
package main

import (
“fmt”
)

// HTTPStatus型の定義
type HTTPStatus int

// HTTPStatusの定数
const (
StatusOK HTTPStatus = 200
StatusUnauthorized HTTPStatus = 401
StatusPaymentRequired HTTPStatus = 402
StatusForbidden HTTPStatus = 403
)

元記事を表示

Go × GraphQL(gqlgen)にNewRelicのAPMを導入した話し

## はじめに
[New Relic Advent Calendar](https://qiita.com/advent-calendar/2023/newrelic) 21日目の記事になります。
こんにちは、いしです。
[株式会社フォトクリエイト](https://www.photocreate.co.jp/)でエンジニアをやっています。
普段はフロントエンドをメインで担当していますが、今年はありがたいことにGoでAPI実装する機会を頂きました。その際にNew Relicの機能をいくつか導入したので、まだまだ勉強中の身ではありますがNew Relic APM導入について簡単に紹介します。

## New Relic APMとは
APMとは、Application Performance Managementの略で、アプリケーションやシステムの性能を管理・監視することを指します。
APMを導入していると、アプリケーションやシステムの応答時間やそのアプリケーションを構成する様々な要素のパフォーマンスを可視化でき、何か問題があれば迅速に調査することができるようになります。

## 導入して

元記事を表示

【Go言語】echoでパスのグループ化をする

## echoについて

`echo`はLabStack LLCという企業が開発を行っているマイクロフレームワークです。
Goのマイクロフレームワークといえば`echo`か`gin`のどちらかという感じが個人的にあります。

## グルーピングについて

echoでAPIを開発しているとき、以下のように同じようなパスが複数できることがあります。特にAPIであれば`/api/v1`などを先頭に付けたりすることになるでしょうから、この手間を省きたいですよね。

“`go
func main() {
e := echo.New()
e.GET(“/api/v1/xxx”, func(c echo.Context) error {
return c.String(http.StatusOK, “xxx”)
})
e.GET(“/api/v1/yyy”, func(c echo.Context) error {
return c.String(http.StatusOK, “yyy”)
})
e.GET(“/api

元記事を表示

【Go】airを用いたホットリロード開発

# air

## インストール
“`bash
curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s
cosmtrek/air info checking GitHub for latest tag
cosmtrek/air info found version: 1.49.0 for v1.49.0/darwin/arm64
cosmtrek/air info installed ./bin/air
“`

“`bash
ls bin/
air
“`

初期化処理
“`bash
./bin/air init

__ _ ___
/ /\ | | | |_)
/_/–\ |_| |_| \_ 1.49.0, built with Go 1.21.3

.air.toml file created to the current directory with the default settings
“`
`.air.toml`が生成さ

元記事を表示

僕がRustを推したい理由

どうも。暇すぎてミイラになった人です。

最近、というよりここ数年はGoではなくRust推しな僕ですが、僕がなぜRustを推したいのか解説します。

:::note warn
この記事では他の言語のディスりが含まれています。PythonもしくはGoを使っていてRustが嫌いな人はアレしてください。
:::

# Pythonで例外を書いてみる。

“`python
def exc(text: str) -> str:
if len(text) == 0:
raise ValueError(text)
return text
“`

これは`text`の長さが0なら例外をスローし、それ以外なら`text`を返すという、ごくごく一般的なPythonのコードです。そして僕も昔はPythonを推していました。しかし、今になってわかる。この書き方はダメだという事が分かります。**例外をスローするという事は、str型以外の型が返されたうえで異常終了する可能性がある。** という解釈ができます。つまり、`exc`の挙動を何も知らない人がこれを使うと、**ValueErrorがスロ

元記事を表示

【Docker】Goのプログラムをマルチステージビルドして動かす

## マルチステージビルドとは
マルチステージビルドとは、Dockerイメージをビルドする際に複数のコンテナ、ステージを使用する手法です。基本的に最初のステージでビルドや依存関係の解決を行い、最終のステージではコンテナに実行ファイルとその他実行に必要なものだけを入れるようにします。

これにより、最終的なDockerイメージのサイズを小さく抑えることができます。

:::note info
基本的にコンテナの考え方としてコンテナの中には余分なものがないことが望まれています。セキュリティ的な面だけでなく、`CI/CD`だったり`pull` `push`などのいろいろな面で軽量であったほうが良いからです
:::

マルチステージ`ビルド`という用語から、この手法はコンパイル・ビルドがあるCやRustなどの言語だけで利用できる手法かと思われがちですが、PythonやPHPなどのランタイムを必要とする言語でも軽量化を行う目的で利用されることがあります。

## Dockerfileを書く

以下はGoのプログラムをマルチステージビルドでDockerイメージにするためのDockerfileの例で

元記事を表示

Azure AI Search機能と実装

# Azure AI Searchの概要と機能

## 目次
1. 概要
2. 機能/詳細
3. サンプルコード
4. まとめ

## 1. 概要
Azure AI Searchは、Microsoft Azureの一部であり、機械学習と自然言語処理を活用した高度な検索エクスペリエンスを提供します。企業や開発者は、このサービスを利用して、顧客が求める情報を簡単かつ正確に取得できる検索エンジンを構築できます。

Azure AI Searchは、以下のような主な特徴を備えています:
– 豊富な機能セット: テキスト検索、フィルタリング、スペルチェック、敏感情報の検出、自動補完、類似結果の提案など、様々な機能を提供します。
– AIによる向上: 高度な機械学習アルゴリズムと自然言語処理技術により、検索の精度と品質を継続的に改善します。
– スケーラビリティ: クラウドベースのサービスであるため、スケーラブルで高性能な検索エンジンを提供します。
– カスタマイズ可能: カスタムスキーマの作成、自動インデックス作成、自動スケーリングなどの機能により、個々のニーズに合わせてカスタマイズできます。

元記事を表示

LangChainで業務アプリの機能を作ろうとして学んだこと(失敗談)

初めまして。人事業界のSaaS企業でバックエンドエンジニアをしている蔭山です。

この度、私は業務の一環として3か月ほどlangChanを活用した新規機能開発を行っていました。
最終的に精度の問題で開発はストップになったのですが、初心者ながら業務で生成系AIに向き合った中で学んだことを記事にしたいと思います。

私は初心者であり生成系AIに詳しいわけではないので、あくまで新卒やインターンに生成系AI機能開発をさせる場合のイチ参考にして頂けると幸いです。
また、内容に間違いや勘違いが含まれている可能性があります。その際はコメントでご指摘くださると幸いです。

## 作成しようとした機能
弊社のサービスでは、顧客側で自由にエクセル関数のような計算式を組める機能を提供しています。
非常に便利な機能である反面、顧客にとっては使いこなすまでが難しく、必然的に社内でもお問い合わせ対応に時間を割かれてしまう状態でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605179/ecaa29f7-

元記事を表示

Windows11でGo言語開発環境構築 ~WSL2+Docker+VSCode+Remote Developmentを添えて~

## はじめに

この記事は「[Qiita Advent Calendar 2023 Go言語](https://qiita.com/advent-calendar/2023/go)」の20日目の記事です

## ゴール

Windows11上でGo言語で開発したHello Worldアプリケーションをexeとして他の方に使ってもらえる形を目指します

## 全体の流れ

1. WSL2 のインストール
1. Ubuntu の初期設定
1. Windows Terminalの設定
1. Docker のインストール
1. VSCode のインストール
1. WSL から VSCode を起動する
1. Go 開発環境を構築する
1. VSCode拡張の自動インストール
1. Gitのインストール
1. Goアプリケーションのビルド

## WSL2 のインストール

1. 管理者権限でターミナルを開く
1. `wsl –install` を実行する
1. デフォルトだと Ubuntu がインストールされる
3. インストールが完了したら、PCを再起動する

![image.

元記事を表示

WebAssembly の過去・現在・未来

## はじめに

WebAssembly (略して Wasm) では WASI や WIT、 Component Model など様々な仕様があります。
それぞれが登場した背景、モチベーションなどを理解することでなんとなく概要を掴んでいくことができるのではないかと考えたため、過去・現在・未来と時間軸で整理してみました。

まず Wasm とその特徴に関して簡単に紹介した後、Wasm の過去として生まれた背景やモチベーションを紹介します。
そして現在の Wasm がなぜ注目を集めているのか、そして現在策定中の仕様と目指している未来について紹介します。

## WebAssembly とはなにか

web-assembly-logo

WebAssembly はスタックベースの仮想マシン用バイナリ命令フォーマットの仕様です。Wa

元記事を表示

Goとvegetaで行うHTTP負荷テスト

この記事は [カバー株式会社 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cover) の20日目です。

こんにちは。カバー株式会社エンジニアのDです。
よろしくお願いいたします。

本記事では、 [tsenart/vegeta](https://github.com/tsenart/vegeta) をライブラリとしてGoで用いての負荷試験について記載します。

前回の記事は [@kura_cvr](https://qiita.com/kura_cvr) による [ホロライブアプリのアーキテクチャ その3 ~これまでとこれから~](https://qiita.com/kura_cvr/items/67529e8e50b5283369b9) です。こちらも是非ご覧ください。

# はじめに

[tsenart/vegeta](https://github.com/tsenart/vegeta) は、HTTP負荷テストツールです。
CLIおよびGoライブラリとして利用可能です。

ライブラリとして利

元記事を表示

S3互換ストレージWasabiの内容をSendGridでメール配信してみる

# 概要

こんにちは。Wano株式会社でエンジニアをしている[@kotobuki5991](https://qiita.com/kotobuki5991) です。
この記事はWano Group Advent Calendar20223 20日目の記事です。

弊社のプロダクトで新しく実装中の機能の一部に、S3(等のストレージ)に保存されたデータを読み取りメールを送信するという要件があります。

技術選定の中で、ストレージとしてWasabiを、メール配信サービスとしてSendGridを試しに触ってみたので設定・実装などを紹介します。

# Wasabiとは?

S3 API互換性認証取得|Wasabi Hot クラウドストレージ

S3完全互換のクラウドストレージで、現在13のリージョンが使用可能です。
すでにS3を使用しているアプリケーションであれば、修正の必要なく移行することが可能です。
また、S3に対して以下のような利点があります。

– 高速
– 下り料金無料!!!

![wasabiの値段.gif](htt

元記事を表示

RCONをGoで自前実装してMinecraftサーバーに”/say Hello!”を送るまで

## はじめに

この記事は[KLab Engineer Advent Calendar 2023](https://qiita.com/advent-calendar/2023/klab) 20日目の記事です。

RCONを実装したライブラリは既存のものがすでにたくさんありますが、今回はあえて一からプロトコルを実装してみる記事となっています。

## RCONとは?

TCP/IPベースの通信を介してゲームサーバーにコマンドを送信するプロトコルです。

Minecraftのサーバーでは[Source RCON Protocol](https://developer.valvesoftware.com/wiki/Source_RCON_Protocol)をベースにしたRCONを利用してリモートでコマンドを実行できます。

なお、Minecraftに限らず、[Ark: Survival Evolved](https://store.steampowered.com/app/346110/ARK_Survival_Evolved/?l=japanese)や[Rust](https://st

元記事を表示

OTHERカテゴリの最新記事