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

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

ES自動生成AIを作ってみた

この記事では以下の拡張機能(ES-writer)を作成した時のことについて記していく。

https://github.com/Yutosaki/es-writer/tree/main

目次
* なぜ作ったか
* どの様に作り始めたか (技術構成など)
* 機能
* 推しポイント
* 上手くいったところ
* どこが苦労したか
* 今後の展望

また、別記事でコードについての解説などもしようと考えている。

# なぜ作ったか
現在自分が大学3年で様々な企業にエントリーシート (ES) を出していたが、毎回おんなじ様な内容をちょっとフォーマットが違ったり、文字数の制限があったりでわざわざ書き換えるのが面倒に感じたため、これらをもっと簡単にできないかと考えた。

# どの様に作り始めたか
そもそもなのだが、これはハッカソンで作ったものである。
(Progateハッカソン powered by AWS エムスリー株式会社賞 受賞 🎉)
最初は、普通にWebアプリケーションで作ろうと考えていた。期間も約1週間ほどで、5人で挑んだのだが5人中2人がハッカソンなどの開発が初めて、という状況もあり、

元記事を表示

動体検知監視カメラ

# はじめに

今回、自作で動体検知のできる監視カメラを作成しました。本記事では、開発にあたって設定した要件をまとめてご紹介します。

# 1.テーマ
「自身で開発から運用までを行い監視カメラを作る」という目標のもと開発した、動体検知で人間のみを検知し、discord(メッセージアプリ)に検知時の画像を送信するアプリケーションです。

# 2.課題の定義
## 解決すべき課題
実家に空き巣が入り、急遽、市販の監視カメラを設置しました。しかし、運用するにあたって、いくつかの課題を発見するに至りました。
#### 2.1 可用性の問題
– 上手く動体検知しないことがある
– デバイスに送信される画像がコマ送りになっており、前後の映像が取得できない
– 画質が悪く、正確な情報を得られない
#### 2.2 ユーザビリティの問題
– 専用アプリが使いにくく、独自の設定をユーザ側が手動で行う必要がある
– アプリの通知が届かない時があり、検知した場合に即座の対応が難しい

## 3.解決方法
フルHDのwebカメラを使用し、Discordを介して画像を送受信することで、画質の問題・通知の不安定

元記事を表示

Go のリスト分割

リストを指定のサイズで分割して返す関数を用意した。
誰かが使うかも知れないので、共有しておく。誰も使わなかったら自分で使おう。

“`go
func Split[T any](elms []T, size int) [][]T {
if size <= 0 { return [][]T{elms} } var split [][]T for 0 < len(elms) { s := size if len(elms) < size { s = len(elms) } split = append(split, elms[0:s]) elms = elms[s:] } return split } ``` テストケースも併せて用意。 ```go func TestSplit(t *testing.T) { tests := []struct { name string elms []string size int want [][]string }{ { name: "partial", elms: []s

元記事を表示

Cloud Functions(2nd Gen)を使い始める上で知っておきたいことメモ(Go)

Cloud Functions で非同期ワーカーをサクッと作ろうと着手し始めたら、第二世代になって色々と変わっていて「あ、ここに書いてあったの?」というものが多かった…。

そこで当記事では、「チュートリアル以上のことをしようとした時に、ドキュメントを読み始める前に知っておくとつまづきが減るかもしれない前提知識」 を整理していきたいと思います。

:::note info
* 当記事では Go 言語を前提として説明していきます
* 2024年8月時点の情報ですので、最新情報はドキュメントをご確認ください
:::

## Cloud Functions 2nd Gen. のアーキテクチャ
ドキュメントを読んでいくと、Go 言語での実装は以下のように案内されている。

**・HTTP関数のサンプル**
“`go
package myhttpfunction

import (
    “fmt”
    “net/http”

    “github.com/GoogleCloudPlatform/functions-framework-go/functions”
)

func ini

元記事を表示

Goの簡易文付きif文について

# Goの簡易文付きif文についての個人的な考察

Goでは、簡易文付きif文を使用することで、エラーハンドリングをより簡潔に書くことができる
しかし、個人的には早期リターンを用いた従来の書き方の方が可読性が高まると考える

## 書き方
ReadAlbumTitle関数からの戻り値(album構造体とerror)を処理する例

“`golang:簡易文付きif文
if album, err := ReadAlbumTitle(file); err != nil {
return err
} else {
albumList = append(albumList, album)
}
“`

“`golang:従来の書き方(早期リターン)
album, err := ReadAlbumTitle(file)
if err != nil {
return err
}
albumList = append(albumList, album)
“`
## 可読性
・簡易文付きif文で

元記事を表示

Goでスクレイピングをやってみる

みなさんスクレイピングを知っていますか?

スクレイピングとは、webサイトのHTML要素をプログラムを使って取得することです。

今回は、以下のスクレイピング練習サイトでGoの`colly`というライブラリを使って、スクレイピングを行ってみました。

https://books.toscrape.com/

# スクレイピングを行う際の注意事項
スクレイピングは、注意して行わないと違法になる可能性があります。
今回、自分が調べられる範囲で注意しなければならないことを調べてみました。

### まず利用規約を確認する
利用規約には、スクレイピングを禁止しているサイトがいくつかあるそうです。
例えば、`Amazon`の利用規約には以下のような文言があります。
>この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、アマゾンサービスまたはそのコンテンツの二次的利用、第三者のために行うアカウント情報のダウンロードとコピーやその他の利用、データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。

元記事を表示

バックスラッシュエスケープされたタブ区切りテキストをCSVに変換する

以下サンプル

“`tsv2csv.go
//usr/bin/go run $0 $@ ; exit
package main

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

func main() {
// 標準入力からデータを読み込む
scanner := bufio.NewScanner(os.Stdin)

// CSVライターを作成し、標準出力に書き込む
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()

// 標準入力を1行ずつ読み込み
for scanner.Scan() {
// タブ区切りでフィールドを分割
line := scanner.Text()
fi

元記事を表示

初心者向けGo言語入門講座。今日から開発したい方向け

# Go言語入門講座

## Chapter 1: Go言語の紹介
Goは、Googleによって開発されたオープンソースのプログラミング言語で、シンプルで効率的なコードを書くことができます。Goの特徴や利点について説明します。

## Chapter 2: 開発環境のセットアップ
Goのインストール方法と開発環境のセットアップについて説明します。Goの公式サイトからダウンロードし、インストールします。

“`bash
# macOSの場合
brew install go

# Windowsの場合
# Goの公式サイトからインストーラーをダウンロードして実行
“`

## Chapter 3: Goプログラムの基本構造
Goプログラムの基本構造を学びます。`main`関数と`package`宣言について説明します。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

## Chapter 4: 変数と定数
Goでの変数と定数の宣言方法を学びます。型推論と型指

元記事を表示

Docker 環境と Go Gin で最小 API を実装する:MongoDB

# Docker 環境と Go Gin で最小 API を実装する:MongoDB

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 24.04 で Go Gin Web アプリケーションを作成し、最小限の REST API を実装する方法を紹介します。
![gin_and_mongodb_on_docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/7c454da9-77e3-ef2a-7052-6019a0146e32.png)

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8

## 実現すること

ローカル環境の Ubuntu の Docker 環境で、Dockerfile からビルドした Go Gin サービスのカスタムコンテナーと Mongo

元記事を表示

go-mysql-serverを使ってテンポラリなDBを立ち上げてテストを行う

最近、新しいプロジェクトで、久しぶりにGoを書いています。

DBを使ったコードのテストをしたいという要求が自分の中にあってどうしようかなと考えたところ、[go-mysql-server](https://github.com/dolthub/go-mysql-server)を使ってみることにしました。
dockertestやtestcontainersとかもあるよう(参考: [紹介記事](https://zenn.dev/jy8752/articles/419ab77b2b6a61))ですが、こっちのが速いかなというただの印象で、使うことにしました。後々dockertestやtestcontainersも使えるようにしても良いかなとは思ってはいます。

なお、本当のMySQLではないので、[制限](https://github.com/dolthub/go-mysql-server?tab=readme-ov-file#limitations-of-the-in-memory-database-implementation)はあります。
制限の簡単な訳と使ってみての追加(最後の2つ)

元記事を表示

自分がよく個人開発で使うターミナルコマンドまとめ(フレームワークなど)

## はじめに
初めましての人もそうでない人もこんにちは!
今回は自分がよく使うターミナルコマンドをまとめたいと思います!

皆さんは個人開発をよくしますか?
自分はコミュ障なのでなかなかチーム開発の機会なんてほとんどありません

まぁ自分がコミュ障なのは置いておいて個人開発する時って大抵Reactを使うためにnpx・・・と長いコマンドを使ったりしてませんか?

そんな長いコマンドを毎回のように入力することが大変面倒でChatGPTとかに毎回教えてもらっています!

コマンド用のテキストファイルを作成しましたが毎回のようにローカルファイルの海に漂っています・・・

なので今回は主に自分用という部分が大きいですが、皆さんにも共有できたらと思いこの記事を作成しました!

## React + TypeScript
“`
npx create-react-app frontend –template typescript
cd frontend
npm start
“`

## venv + Python
### MacOS/Linuxの場合
“`
python -m venv ve

元記事を表示

Goのモックライブラリを比較検討する

# 概要
Goのモックライブラリはいくつか存在しており、検討を始めるにあたって [Comparison of golang mocking libraries](https://gist.github.com/maratori/8772fe158ff705ca543a0620863977c2#user-content-fn-12-14e5dadb9d5bbfc4c34632f365c8a95b)の内容が大変参考になった。

このうち候補として考えた gomock, mockery, moq をそれぞれ使ってテストコードを書いてみた所感を元に、比較検討した結果をまとめる。

# はじめに:なぜモックライブラリが必要なのか
Goのテストコードで依存するインターフェースをモックする時、モックライブラリを使わずとも自前でモックを実装することは可能である。
例えば、以下のような `GetUserService.Get()` のテストコードを考えてみる。

“`go
type UserRepository interface {
GetUser(userId string) (User, er

元記事を表示

初めてGo言語をやってみて分かったこと。

# C言語と最近のモダンな言語(Java、C#、Pythonなど)のいいとこ取りをした感じ

* C言語的要素

基本的にGo言語はコンパイラ言語であり、ビルドを実行すると機械語に変換されるのですが、
機械語は直接CPUに命令を出す形式なので、めちゃくちゃ動作スピードが早いです。
コンパイラ言語はGo言語以外に、C言語、C++、Rust等があります。

また、Go言語はクラスという概念は存在しないので(似たようなパッケージという概念はありますが)、
その点も同じと言えます。

* Java的要素

モダンな言語だと、C言語には無かったListのような、要素を自由に追加削除できるるような仕組みがあります。
最近の言語だから、こういった仕組みなども扱えるようになっています。

また、例外処理(try-catch)のような仕組み(panic-recover)も用意されています。

* Python的要素

Pythonのようなスクリプト言語はソースファイルをあれこれ変換しなくてもすぐに実行できるのが特徴ですが、Go言語もいちいちビルドする必要は無く、ソースコードの状態のままで実行できるオプシ

元記事を表示

Goのネットワークプログラミングでよくあるエラーのbroken pipeを深く理解するために

Goでネットワークアプリケーションを開発する際、時々「broken pipe」というエラーに遭遇することがあるでしょう。この記事では、このエラーの意味を説明して、再現するためのコードを示して、基本的な対処法をいくつか紹介します。

「broken pipe」は通常、**(通信している同士の一方が)相手がリセットした(RST)TCPコネクション**にデータを書き込もうとしたときに発生する。このエラーは以下のコードで再現できる。

“`go
// …
var done = make(chan struct{})

func server() {
listener, err := net.Listen(“tcp”, “:8080”)
if err != nil {
log.Fatal(err)
}
defer listener.Close()

done <- struct{}{} conn, err := listener.Accept() if err != nil { log.Fatal("S

元記事を表示

CloudBuildでgolangci-lintを実行する

## 結論
`cloudbuild.yaml`に以下を追加すれば、実装できます

“`yml: cloudbuild.yaml
steps:
# golangci-lintのDockerイメージを指定する
– name: ‘golangci/golangci-lint’
# デフォルトの設定でgolangci-lintを実行する
args: [‘golangci-lint’, ‘run’]
“`

## golangci-lint[^1]とは
[^1]: https://github.com/golangci/golangci-lint

> `golangci-lint` is a fast Go linters runner.
>It runs linters in parallel, uses caching, supports YAML configuration, integrates with all major IDEs, and includes over a hundred linters.

`golangci-lint`は高速なGoリン

元記事を表示

entでeager_loadingを実装する

# 書くこと
– GolangのORMであるentでEager Loadingを実現する方法
– INNER JOIN、LEFT JOINなど
– 他テーブルのWHERE、ORDERなど
– 他テーブルのデータの取得はPreloadになってしまう

# 書かないこと
– テーブルの定義方法
– schemaの書き方

# なぜ記事を書いたか
– INNER JOINやLEFT JOINの方法が書かれている記事や公式が少なく、自分で色々試して知見が深まったため

# 参考文献
https://entgo.io/ja/docs/predicates/

# JOINの行い方
## ER図
“`mermaid
erDiagram
organizations ||–o{ users : has
organizations {
int id
string name
}
users {
int id
string name
int organization_id
}
“`

## Source
“`golang
import (
ent

元記事を表示

C# -> Golang

# 目次

# まえがき
C#使いがGo言語に移行するときに役立ててほしいと思い書きました。

C#についての詳しい説明は割愛します。

# 言語概要

– Google が開発したプログラミング言語です。「**Go言語**」や「**Golang**」と表記されます。
– UNIX、B言語(C言語の元)、UTF-8の開発者ケン・トンプソンや、UNIX、Plan 9、UTF-8の開発者ロブ・パイクによって設計されました。
– 静的型付け、メモリ安全性、ガベージコレクションを備えるコンパイル言語です。
– シンプル、高速、メモリ効率が良い、メモリ破壊が無い、並行処理が得意などの特徴を備えています。
– メモリ破壊が無く、並行処理を得意とする、進化したC言語という側面があります。
– Linux、Mac OS X、Windows、Android、iOS で動作します。

# 言語仕様

### セミコロン

C系統の言語と違い、基本的にセミコロンは必要ない

“`csharp:C#
int hoge = 123;
int fuga = 456;
“`

“`go:Go
// セミコロン

元記事を表示

コンパイル型言語とは

# コンパイル型言語とは
人間が書いたソースコードを、コンピュータが分かるように機械語に変換(コンパイル)してからプログラムを実行する言語のこと。インタプリタ型言語とは違い、一度にすべてのソースコードを変換してから実行する。
(インタプリタ型言語は、ソースコードを一行ずつ実行してプログラムを実行する言語である)

### コンパイル型言語の例
Java, C#, Go

### インタプリタ型言語の例
JavaScript, Python, Ruby, PHPなど

元記事を表示

ユニクロのTシャツのコードを実行しようとしたら意図せずGO言語に入門した

# はじめに
ユニクロのバラエティゾーンで売ってるプログラムが書かれたTシャツありますよね。
そもそもGOで書かれているとすら知らなかったのですが、GOについて何も知らない状態から動かしてみました。
筆者は普段C#とPHPをメインに使用していて、GOは全くの素人です。
意図せずGOのHelloWorldみたいになったので記事にします。

とりあえず実行してみたい方は以下のレポジトリで実行できます。
Dockerが入っていればGOが入ってなくても動きます。

https://github.com/Pokeyama/uniqlo-tshirt-app

# シャツとコード
uniqlo-shirt.jpg

iPhoneで撮ると勝手にOCRして文字として読み取ってくれたので、そのままGPTに整形してもらっ

元記事を表示

WSL2にインストールしたtinygoでtinygo monitorをraspberry pi picoで実行

# WSL2にインストールしたtinygoでtinygo monitorを実行

どうしてもWSL2でtinygoを動かして、
rapberry pi pico相手に `tinygo monitor`を実行したかった。

備忘録としてメモをまとめる。

## 実行環境
– Windows 11
– WSL2 Ubuntu 22.04LTS
– golang 1.22.5
– tinygo 0.32.0

## 手順
### 1. golang, tinygoをインストール
### 2. ソースコードを作成
今回は下記 `sample.go`

“`golang
package main

import “time”

func main() {
for {
println(“hello world!”)
time.Sleep(time.Second)
}
}
“`

### 3.モジュール解決

`go mod init sample`
`go mod tidy`

### 4. コンパイル
`tinygo build -target=pico -o ./sample.

元記事を表示

OTHERカテゴリの最新記事