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

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

Go言語の機械学習パッケージで異常検知する方法

# はじめに

Go言語の機械学習パッケージを使って異常検知する方法の紹介です。数値データーの配列から異常値(外れ値)を見つける2つのアルゴリズムを実装したパッケージの使い方を紹介します。

# Local Outlier Factor(LOF)

日本語では「局所外れ値因子法」というらしいです。

https://ja.wikipedia.org/wiki/%E5%B1%80%E6%89%80%E5%A4%96%E3%82%8C%E5%80%A4%E5%9B%A0%E5%AD%90%E6%B3%95

### LOFのGo言語実装

https://github.com/zavgorodnii/golof

メンテナンスされていないようなのとログの出力が多いのでパッケージとして使いやすようにForkしたのが

https://github.com/twsnmp/golof

です。

### サンプルプログラム

“`go

package main

import (
“image/color”
“log”

“github.com/twsnmp/golof/lof”

元記事を表示

【Golang】Q-dog練習アプリケーションの開発に関する備忘録

適性検査の一つであるQ-dog練習アプリケーションを開発したので、備忘録としてその過程を記述します。フロントエンドは`TypeScript`、バックエンドでは`Golang`を使用しています。フレームワークは`Gin`と`React`です。
# Q-dogとは?
ストレスに強い人材を見抜くための適性検査であり、今回実装したのはその中の図形問題です。
図形問題では以下のように図形が二つ表示されます。その角の合計を答えるテストになっています。
△□

:::note info
今回の答えは3+4で7になります
:::

# 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787468/66c76a69-5384-0870-5a9d-ddd72d8b0169.png)

# 開発の流れ
## ディレクトリ構成
cssファイル等は省略しています。
“`md:ディレクトリ構成
/
├─ backend
│ ├─ go.mod
│ ├─ go.sum
│ └─ main.go

元記事を表示

Golang入門: 初めてのGoプログラムを書こう!

はじめに
Golang(Go)は、Googleによって開発されたプログラミング言語で、シンプルで効率的な構文が特徴です。高いパフォーマンス、並行処理が得意な点から、近年のWeb開発やバックエンドシステムで人気が高まっています。今回は、Golangの基本を学び、簡単なプログラムを実際に書いていきましょう。

# 1. Golangのセットアップ
まずは、Golangを自分の環境にインストールしましょう。

### Goのインストール
公式サイトから最新版をダウンロードします。

Go公式サイト: https://golang.org/dl/
ダウンロードしてインストール。
インストール後、ターミナルで以下のコマンドを実行して、インストールが正しく行われたか確認します。

“`

go version

“`
### 環境設定
GolangではプロジェクトごとにGOPATHとGOROOTを設定しますが、基本的には自動設定されるので、初心者は特に気にしなくても大丈夫です。

# 2. 最初のGoプログラムを作成しよう
次に、最初のGoプログラムを書いてみましょう。

プログラムの作成

元記事を表示

【ent】複合主キーで `edge schema primary key can only be defined on “id” or … in the same order` が発生した場合の対処法

複合主キー関連のその他のエラーはこちら

https://qiita.com/Syuparn/items/cb473dbf5c9917e52f46

# TL; DR

複合主キーの `field.ID` の引数の順序を逆にすれば解消する

“`go
func (StudentCourse) Annotations() []schema.Annotation {
return []schema.Annotation{
// 複合主キー
field.ID(“student_id”, “course_id”),
}
}
“`

# エラーの再現

まずはスキーマを作成します。今回は以下のテーブルを考えます。

“`sql
— 講義受講者の成績
CREATE TABLE StudentCourses
(student_id integer NOT NULL.
course_id integer NOT NULL,
grade integer NOT NULL
PRIMARY KEY (student_id, course_id));

— 学生一覧
CREATE T

元記事を表示

Goでのファイル操作と非推奨機能:os.SEEK_ENDからio.SeekEndへ

## 背景

下記のUdemy講座で、Goでのファイル操作について学びましたが、その中で`os.SEEK_END`が非推奨であることを知りました。
Go 1.9以降では、osパッケージのシーク定数(`os.SEEK_SET`、`os.SEEK_CUR`、`os.SEEK_END`)の代わりに、ioパッケージの`io.SeekStart`、`io.SeekCurrent`、`io.SeekEnd`を使うのが推奨されているぽいです。

https://www.udemy.com/course/golang-webgosql

## 変更点
#### 元のコード
“`go
package main

import (
“os”
)

func main() {
// ファイル操作
// — Create —
f, _ := os.Create(“foo.txt”)

f.Write([]byte(“Hello\n”))

f.WriteAt([]byte(“Golang”), 6)

// ファイルの末尾にオフセットを移動
f.Seek(0, os.SEEK_END)

元記事を表示

【Go】timeパッケージのAfter, Before, Equalの使い方

## 概要

Goの日時比較のサンプルコードをまとめたもの

## サンプルコード

### **time.After()・・・timeAがtimeBを超える日時の場合にtrue**

“`go
func main() {
timeA := time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC)
timeB := time.Date(2024, 1, 10, 0, 0, 0, 0, time.UTC)

result := timeA.After(timeB)
fmt.Println(result) // true
}

func main() {
timeA := time.Date(2024, 1, 15, 0, 0, 0, 0, time.UTC)
timeB := time.Date(2024, 1, 20, 0, 0, 0, 0, time.UTC)

result := timeA.After(timeB)
fmt.Println(result) // false
}

func main() {
timeA

元記事を表示

ISUCON過去問関連の計装に関するメモ書き

# はじめに

いったんメモとして書きなぐる内容、あんまり人に見せることを想定していない

## 計装(instrumenting) とは

>システムやアプリケーションに計測機構を実装し観測を実現すること

https://x-tech5.co.jp/2023/08/28/490/

o11yを実現するうえで、ログ・メトリクス・トレースといった情報をアプリ等からとれるようにすることだと理解した。

## 自動計装と手動計装

こういったテレメトリーを取得できるような状態にするには、手動でアプリのソースコードに変更を加え、テレメトリーを送信できる状態にする(=手動計装)か、アプリ側には修正を与えない形で送信できる状態にする(自動計装)がある。

もちろん、自動でやってくれるのがうれしいのは間違いない。
ただ、ISUCON上での問題は、人気のあるGo言語に対しては自動計装のツールはまだ

元記事を表示

【ent】複合主キーで `nil pointer evaluating interface {}.id` が発生した場合の対処法

# TL; DR

– 複合主キーを使用する場合、スキーマの `Edges` メソッドで関連テーブルの指定が必要

https://entgo.io/docs/schema-edges/#user-likes-example

# はじめに

entで複合主キーを持つテーブルのスキーマを作成した際、ソースコード自動生成時に表題のエラーが発生してしまいました。本記事ではエラーの解消法と原因について紹介します。

# エラーの再現

まずはスキーマを作成します。今回は以下のテーブルを考えます。

“`sql
— 講義受講者の成績
CREATE TABLE StudentCourses
(student_id integer NOT NULL.
course_id integer NOT NULL,
grade integer NOT NULL
PRIMARY KEY (student_id, course_id));
“`

以下コマンドで空のスキーマが生成されます。

“`bash
$ go run -mod=mod entgo.io/ent/cmd/ent new Stud

元記事を表示

ToDoアプリの作成(User編)

はじめに

今回は,前回に続きユーザーの新規作成、ログイン、ログアウト機能を実装していきます。

https://qiita.com/sawadashinji0526/items/06ce740776bfc919df8b

※動作確認にPgAdminとPostmanを使います。

リポジトリの実装

User関係のリポジトリインターフェースを実装していきます。
このコードは、ユーザー情報を扱うためのリポジトリインターフェース IUserRepository と、そのインターフェースを実装する具体的なリポジトリ構造体 userRepository を定義しています。
NewUserRepository 関数は、userRepository 構造体のインスタンスを作成するために使用されます。

“`repository/user_repository.go
package repository

import (
“go-rest-api/model”

“gorm.io/gorm”
)

type IUserRepository

元記事を表示

Connect-go ハンズオン

# はじめに
現代のバックエンド開発では、柔軟性があり高速な通信プロトコルが求められています。
そこで注目されるのが、Googleが開発した`gRPC`という通信技術です。`gRPC`は、`HTTP/2`を使って、低遅延かつ効率的にクライアントとサーバー間でのデータ通信を行います。また、バイナリ形式の`Protocol Buffers`を用いることで、`JSON`や`XML`などに比べて非常に軽量な通信を実現します。

しかし、従来の`gRPC`はブラウザ対応の難しさや、認証・HTTPサポートの実装コストが課題でした。ここで登場するのが、今回使用する **Connect-go**です。
`Connect-go`は、`gRPC`だけでなく`gRPC-Web`や`HTTP/JSON`通信にも対応しており、シンプルで拡張性の高いAPI構築を支援するフレームワークです。


本記事では、Connect-goを使ったgRPCサービスの構築手順を、公式ドキュメントに沿って実践します。モジュールの初期化から、Protocol Buffersを用いたサービス定義、Bufによるコード生成、Goサ

元記事を表示

Goで実装したdll(so)から取得した文字列のメモリを開放する

# TL;DR
文字列をctypes.c_char_pではなく、ctypes.POINTER(ctypes.c_char)で受け取り、ctypes.string_atで文字列を取得した後メモリを適切に開放する。
“`python
lib = ctypes.CDLL(“./mydll.dll”)
lib.GetString.restype = ctypes.POINTER(ctypes.c_char)
#コールバックの引数の場合も同様
CALLBACKFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.POINTER(ctypes.c_char))

result_pointer = lib.GetString()
result_str = ctypes.string_at(result_pointer)
print(result_str) # -> hogehoge
ctypes.cdll.msvcrt.free(result_pointer) #メモリを解放
“`
# 経緯
諸事情があり、受け取ったデータを適切に処理してJSON形式で返すプロ

元記事を表示

サイバーエージェントのACEインターン体験記

## はじめに

2024年夏に、株式会社サイバーエージェントさんの「次世代トップエンジニア創出インターンシップ ACE」に参加しました!!

今回はインターンで得た学びや感想をブログにまとめておこうと思います。

## 概要

このインターンは、学生がチームに分かれて、与えられた仕様に沿ってプロダクトを開発するハッカソン形式のインターンです。
学生1人につき社員さんが1人メンターとしてついてくださり、技術的な相談などをさせていただきました。

### 日程

9/11 ~ 9/24 の2週間で行われました。

### チーム構成

チームはB, Cの2チームで、それぞれ5人ずつの学生で構成されていました。

私のチームでは、5人のうち3人がバックエンド、2人がフロントエンドを担当しました。

### プロジェクトテーマ

与えられたお題は「架空の動画配信サービス『あれまぁTV』の番組表を作成する」でした。

番組表には「マイリスト登録」機能があり、マイリストに登録した番組は「マイリスト」ページに表示されるようにします。

番組表という1ページの中に様々な情報が詰まっており、UIも複雑

元記事を表示

testifyパッケージのassert/requireとは? [Go]

Goのテストケースを実装した際に、testifyパッケージのrequireとasserを使ったのですが、あまり違いがわからなかったことありませんか?

今回は、Goのテストコードでよく使われる`testify/assert`パッケージと`testify/require`パッケージの違いと、それぞれのメソッドについて調べてみようと思います。

https://github.com/stretchr/testify

# assertとrequireはどのような役割をしているのか

この二つは、testifyパッケージに入っているテスト用ツールです。

違いは以下のようになっています。

|パッケージ名|違い
|—|—
|assert|テストが失敗しても実行し続ける
|require|テストが失敗したら即時終了

主な違いはテストが失敗しても実行し続けるか終了するかの違いになっています。

# インストール

下のコマンドで、go.modに依存関係を追加してください。

“`go:zsh
go get github.com/stretchr/testify
“`

# as

元記事を表示

golangのsamber/loを使って複数の構造体スライスを一気にマッピングしたい

# 概要
ある構造体の値を、別の構造体にマッピングしたいことがあると思います。

例えばインフラ層にはSELECT文を実行した結果をマッピングするための構造体Aがあって、それをドメイン層のモデルである構造体Bにマッピングして、さらにそれをクライアントに返すレスポンス用の構造体Cにマッピングして…

というように層ごとにデータ構造が変わる場合は適宜こうした操作が必要になります。
一般的にはこうした操作はヘルパー関数を作って対応されているのでしょうか。
自分はこれに対するベストプラクティスが分からないので、いい方法を知っていればぜひ教えていただきたいのですが、自分なりに `samber/lo` を使ってやってみたので小ネタ的な紹介です。

https://github.com/samber/lo

# ユースケース
2つ以上の構造体スライスの内容を1つの構造体スライスにマッピングしたいときなどです。
例えばあるメソッドを実行すると `構造体Userのスライス` と `構造体BlogPostのスライス` が返ってくるので、それらの内容を合わせたレスポンスを生成するために `構造体UserPo

元記事を表示

自作オブジェクトストレージ日記.part4

# part4の概要

前回は1MBごとにファイルを分割し、ハッシュ値を計算してフッターとして書き込みました。今回はリード・ソロモン符号を用いて、データの冗長性を持たせ、復元可能にします。

## 必要なパッケージのインストール

“`shell
go get -u github.com/klauspost/reedsolomon
“`

### リード・ソロモン符号の設定
データシャードとパリティシャードの数を設定します。

“`go
const (
DataShard = 6 //リード・ソロモン符号のパラメータ データの分割数
Parity = 2 //リード・ソロモン符号のパラメータ パリティーの数
)

var ErasureSetNum = DataShard + Parity //リード・ソロモン符号のパラメータ
“`

### データの分割とエンコード
データを分割し、リード・ソロモン符号を用いてパリティシャードを生成します。
datashrdsには この場合[8][1024*1024] のバイト配列を入力します。
“`go
func

元記事を表示

自作オブジェクトストレージ日記.part3

## part3
前回は1MBごとにファイルを分割し、マージしました。今回はデータ部分のハッシュ値を計算し、ファイルの最後に書き込みます。

まず、必要なパッケージをインストールします。
“`sh
go get -u github.com/minio/highwayhash
“`

### フッター構造体の追加
第2回ではフッターがありませんでしたが、第3回ではハッシュ値を格納するためのフッターを追加しました。
“`go
type Footer struct {
HashType uint8 //ハッシュの種類, 0:HighwayHash256
Hash [32]byte //ブロックのハッシュ値
}
“`
ハッシュの方法を今後変更する可能性を考えてハッシュタイプも追加します。今のところ唯一登録されている、ハッシュタイプ0はhighway hashの256bitです。

### ハッシュ値の計算とフッターの書き込み
データを分割して書き込む際に、ハッシュ値を計算し、フッターとして書き込む処理を追加しました。

“`go
key := make

元記事を表示

自作オブジェクトストレージ日記.part2

前回 : 自作オブジェクトストレージ日記.part1

# 第2回 1MBごとにファイルを分割する

前回は20GBのファイルを5GB事に分割しました。今回は1MBごとに分割し、マージします

リード・ソロモン符号を使ったイレイジャーコーディングを利用するための下準備です。
先頭にヘッダーを付け、ファイルサイズを記録しました。これによって最後のファイルサイズが1mBぴったりにならなかったとしても安心です。
“`go
package main

import (
“encoding/binary”
“fmt”
“os”

“github.com/cheggaaa/pb/v3”
)

type Header struct {
FileSize uint32 //ブロックのファイルサイズ
I_Counter uint32 //Iのカウンタ. 0から始まる
}

func main() {
fmt.Println(“Hello World!”)
// binary/inputをバイナリファイルとして読み込み、1MBごとに分割してbinary/fragments/%dに書き込

元記事を表示

自作オブジェクトストレージ日記.part1

# はじめに
今回作成するストレージは個人用のものであり、これを利用したことに起こった損害について一切の責任を負いませんのであしからず。

# なぜ作るのか
自分のデータを預けるのに他人の作ったソフトウェアだと不都合がありそうだから。あと自分にあったストレージソフトウェアが見つからなかったため

# 背景
## 大容量ストレージにおける状況
大容量ストレージを扱う技術はすでにあります。企業などでは昔から大容量ストレージを扱っていたため当然でしょう。しかし個人で使うにあたってそのソリューションを導入するのは高価で現実的ではありません。例としてSANストレージを束ねるスイッチの価格はまともな速度なもので10万円を超える。(Lenovo ThinkSystem DB610S、8 ポート )
## 私の求めるストレージ要件
ここは人によって異なるでしょうが、私の用途はデータ置き場に近いものなので以下のような要件になりました
– ストレージ効率が良い
値段に直結するので当たり前です。HDDはもちろん容量単価の一番安い16TBのものを使用します
– 待ち時間無しで拡張可能
毎日保存処理が走るのでR

元記事を表示

動的にGoroutinesのワーカーを増減させる

Goはゴルーチンを使うことで簡単に並行処理を行うことができます。
また、ゴルーチンはかなり軽量で大量に生成することができるとされています。

とはいえ上限はあるわけで、短時間であまりに大量にゴルーチンを作成した場合はパフォーマンスが悪化したり、リソースを確保しすぎてエラーが発生することもある(と思います)

そのためよく行われるのは、以下の2つかと思います(少なくとも自分は)

1. あらかじめ規定数の worker を作成しておく
1. セマフォを使って同時起動数を制限する

個人的にはどんどんゴルーチンを作るのがあまり好きではないので、あらかじめ規定数のworkerを作成することが多いです。

ただ設定ファイルなどで worker 数を設定していて、設定をリロードさせた場合に worker 数を反映させる際など動的に worker 数を変更したい場合に困ります。
セマフォを使っている場合であれば、セマフォの作りを工夫すれば動的に変更することは比較的簡単です。

ただ、随時ゴルーチンを起動するパターンだと、動作しているworker数をメトリクスとして取得しようとした場合に増減が激しい

元記事を表示

【個人開発】GoでECSの定義ファイルを生成するアプリを作ってみた

# 概要
久しぶりに人様のための個人開発をしてみました。

AWS Fargateにデプロイする際、環境ごとに異なる値をECSのタスク定義に埋め込む必要がありますよね。最初はシェルスクリプトで環境変数を埋め込んでいたのですが、シェルって意外と繊細でエラーも出やすい。少し書き間違えただけで動かない…なんてことも多く、もっと簡単に管理できないかと考えた結果、ECSタスク定義ジェネレーターをGoで作ってみることにしました。

Goならシェルスクリプトよりも読みやすく、go installで簡単にインストールして使うことができます。Go CLIアプリとして、このツールを導入することで、効率的で安定したタスク定義の生成が可能になりました。

# 作ったもの
https://github.com/rendaman0215/ECSBuilder

## 使い方
– 必要なファイルの用意
– タスク定義のテンプレートファイル
– .envファイル
– インストール
– “`go
go install github.com/rendaman0215/ECSbuilder

元記事を表示

OTHERカテゴリの最新記事