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

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

【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善

大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。

## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用

## 開発機能詳細

ピッチ資料を生成する機能です。

https://www.hear.co.jp/recruit/saiyoupitch-100sen

機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画

元記事を表示

Go未経験のバックエンドエンジニアがGoらしさに触れる(命名規則編)

## Go言語文化圏に踏み出す前に

Go言語ですが、「ただ一つのことをうまくやる(Do one thing and do it well)」という思想がある言語です。
つまり、かなり設計思想や原則を守った開発を求められることになります。
もし、Go言語文化圏について学ばずにGo言語のソフトウェアに足を踏み出してしまうとGo言語文化圏では厳しく罰せられるかもしれません。

もし、Go言語の原則を知らないまま開発を進めてしまうと、待っているのはチームや自分自身の疲弊、保守性の悪いセンスのないソフトウェア、のような地獄になるかもしれません。

そんな地獄には足を踏み入れたくない。そんな私がGo言語文化圏について学んだことをシェアしようと思います。

## 対象の読者

– Go言語知らないけど、どんな特徴があるかは抑えたい人
– Go言語をこれから勉強しようと思っている人、初学者

## この記事のゴール

– Go言語の命名規則をざっくりと把握する
– Go言語書いたことがなくても、「Go言語って、〜なところがある言語だよね」とドヤ顔で雑談ができる

## 参考書籍

– [実用Go言

元記事を表示

Go初心者の備忘録(1)

## はじめに
 個人開発でバックエンドにGoを使いたかったので、Goの勉強を始めました。
 疑問をその都度解決していく勉強法なため、横道にそれまくりますが、Goを勉強し始めて同じ壁にぶつかった人の助けになればと思っております。
## Goとは
 Goとは、Googleがサポートするオープンソースのプログラミング言語です。
## 環境構築編
 早速環境構築を始めます。
 まず、[Go公式](https://go.dev/dl/)からGoのインストーラーをダウンロードします。[homebrew](https://brew.sh/ja/)を使わないのは`brew upgrade`で意図せずバージョンアップさせそうだからです。
 インスターラーでのインストールが完了したら、[.zshrc](https://qiita.com/siakio/items/f9ab8a02d7b7fa6963ba)に下記(パス)を記述します。
“`
export PATH=$PATH:/usr/local/go/bin
“`
 次は、Goのバージョンを確認します。
“`zsh
% go version
go

元記事を表示

【Go言語学習】goroutine (ゴルーチン)

# A Tour of Goでの説明
Goroutines
goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです…
https://go-tour-jp.appspot.com/concurrency/1

# ザックリとした現状の理解
Goにおける並行処理の機能で、軽量、非同期的に複数のスレッドを容易に実行できる。
共有メモリへのアクセスは同期する必要がある。

# 動作の現状の理解
main()が終了すると、ゴルーチンも終了する。
論理的なスレッドであるものの、並行処理(Concurrency)と並列処理(Parallelism)の概念がある様で、裏っ側ではCPUにも依存する部分もある模様。
非常に軽量で何百万ものスレッドを同時に使える。

# ゴルーチン指向
https://github.com/kabasunny/GoPractice/tree/develop/goroutines
“`Go
package main

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

func say(s string, wg *syn

元記事を表示

Golang+Echo+Postgresのコンテナ開発環境をDockerfileとdocker-compose.ymlを使って構築しよう!

## 概要
GolangのWebフレームワークであるEchoとPostgresのコンテナ開発環境を構築する方法について解説します

## 前提
– Golangをインストール済み
– ホットリロードの際にAirを使用します

## ディレクトリ構成
“`
├── .gitignore
├── application
│ ├── .air.toml
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
├── containers
│ ├── go
│ │ └── Dockerfile
│ └── postgres
│ └── Dockerfile
└── docker-compose.yml
“`

## 初期設定
applicationフォルダへ移行し、`go mod init`コマンドで初期設定を行います
“`
cd application
go mod init github.com/username/app_name
“`

その後、echoをインストールします
“`
go get github.c

元記事を表示

【Go言語学習】txtファイルをgoファイルへ変換

「エキスパートたちのGo言語」という書籍を購入し(2022年1月12日)、勉強をし出したところ(2024年5月1日)、サンプルコードがありダウンロードした。https://gihyo.jp/book/2022/978-4-297-12519-6/support
サンプルコードは、txtファイルであった。

## txtファイルをgoファイルへ
せっかくならgoファイルに変換し、エディターを使っていじったり動かしたりしたかったので、取り急ぎ全ファイルを変換することに。
しかし、txtファイルのエンコードがまちまちで、そのまま変換すると文字化けするので、良い方法を探したが、結論から言うと見つからなかった。
一応、何をしたか備忘録をとることに。

## やったこと
pythonで、各txtファイルからエンコーディングの種類を読み込み、各txtファイルを各エンコーディングで開き、UTF-8でエンコーディングし閉じる
Go言語で、ファイルの拡張子を txt → go へ変換
結果、Windows-1254 は UTF-8 にうまくエンコードできず、文字化けした

## コード

https://

元記事を表示

ttrpc tutorial – 1 –

# ttrpc

## 問題
無駄なリソースをさらに削減できる点では活用したいですが、公式のマニュアルなどが揃ってない、個人的にはわかりにくいサンプルコードから少しハードルを感じているかと思いました。実際やってみたところ想定以上時間がかかったため、手順など残しておきたいと考えてます。

## ゴール
ttrpcのサンプルコードを変形してわかりやすく+すぐ動くようにチュートリアルを作りました。
動作確認と使っているライブラリなど確認できればと思います。

## 開発環境・ライブラリ
go 1.21.0
github.com/containerd/ttrpc v1.2.3

## ttrpcのprotoファイル生成(プラグイン)
`protoc-gen-go`と`protoc-gen-go-grpc`はインストール前提とします。
下記のコマンドから`rrtpc`生成のためのプラグインをインストールします。

`go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@v1.2.3`
`go install github.c

元記事を表示

RailsエンジニアがGolangでアプリ開発してみた

# 背景
今までRubyとRailsで開発をしていましたが、アプリ開発の解像度をあげるためにGolangでのアプリケーション開発を始めました。
RailsではMVCアーキテクチャにのっとりフロントでerbを使用する開発をしていましたが、Golangではアーキテクチャの設計からフロントエンドとAPI通信するプロダクトの開発も行いました。
この記事ではRubyを書いたことがあり、これからGolang開発の始める人へ、一つの踏み台として受け取ってもらえれば幸いです。

# 目次
1. RubyとGolangの違い
1. 動的言語と静的言語
1. コンパイル型言語とインタプリタ型言語
1. フレームワーク
1. Golangの基本文法
1. ポインタ渡し
1. 多値返却
1. 配列とリスト

# RubyとGolangの違い
### 1. 動的言語と静的言語
> **動的言語**: 実行時に変数の型を決定し、実行時に型チェックを行います。変数の型は実行時に決まるため、柔軟性が高いです。例えば、PythonやRubyは動的言語です。
**静的言語*

元記事を表示

Go言語でMYSQLからデータを取得する手順

最も簡易的なやり方で、GO言語使用時にMYSQLかららデータを取得する手順はメモしておく

# 事前準備
・XAMPPをインストールして、ローカル環境でMYSQLを立ち上げ、『User』というテーブルを作成しておく
※カラムは『Name(名前)』『Age(年齢)』『Sex(性別)』『Deleted_flag(削除フラグ)』とかにしておく

・go(バージョンは1.22.2)をインストールしておく

# ファイル構成
sampleapp/
 ├ go.mod
 ├ main.go
※go.modは下記コマンドで生成できる
“`
$ go mod init sampleapp(任意の文字列)
“`

# 実行手順
以下のコマンドを実行して、mysql driverをインストールする
※go.modファイルがないとコマンド実行時にエラーになった
“`
$ go get -u github.com/go-sql-driver/mysql

go: added filippo.io/edwards25519 v1.1.0
go: added github.com/go-sql-dri

元記事を表示

GoとJenkinsをWindows11にインストール

# 概要
今回はGoとJenkinsをWindows11にインストールしたので、
その参考記事を取り上げることにしました。
なお、メモ書き程度に記載していますので、ご了承ください。随時、情報を追加していきます。

# 実行環境
・windows:Windows11Pro 23H2

# 参考記事【Go】
以下を参考にしました。
go.modファイルを作成していなかったので、
以下のエラーが発生しました。
その際参考にした記事も載せます。
“`
go: go.mod file not found in current directory or any parent directory
“`

https://qiita.com/mochico_chicken/items/a37441813dc63dd87464

https://qiita.com/to3izo/items/f47bbc7b11ef6d2e24cd

# 参考記事【Jenkins】
以下を参考にしました。
なお、Jenkinsをダウンロードする前に、Javaをダウンロードしておく必要があります。
※必要とされるJav

元記事を表示

Golangでtorを使う

## Torとは
Torは、`the onion router`の略称で、インターネット上での通信の匿名性を保つためのネットワークシステムであり、情報が玉ねぎのように多層構造になっており包まれて転送することから来ています。

ダークウェブのイメージが強いですが、本来はユーザーのプライバシーを保護し、追跡や監視から逃れるための重要なツールです。

特徴としては以下のような特徴を持っています。

– 匿名性

ユーザーがwebサイトを訪問した際に、そのサイトがユーザーのIPアドレスを直接的に知ることができません。

– 分散ネットワーク

世界中に分散されたサーバー(ノード)から成るネットワークで、データがこれらのノードをランダムに経由して転送されるので、データの送受信元を特定することが難しくなります。(ただし、出入口のノードは通信内容を見ることが可能であるため、完全に特定できないわけではないです)

– E2E暗号化

データを複数の暗号化層で包み、各ノードで一層ずつ解読されるために、すべてのノードがデータの全体を見ることがなく、これによってデータの内容を保護しています。

– アクセ

元記事を表示

Golang 基礎 – 環境設定からプロジェクト管理まで

### Golangのインストールと環境設定

Golang(通称Go)は、効率的なコンパイル言語で、並行処理やネットワークサービスの開発に適しています。まず、[Golangの公式サイト](https://golang.org/dl/)から対応するOSに合わせてインストーラをダウンロードし、インストールします。インストール後は、コマンドラインで`go version`を実行して、インストールが正しく完了したか確認しましょう。

Macユーザーの場合、Goのバイナリへのパスをシェルの設定ファイルに追加する必要があります:

“`bash
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bash_profile
echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.zshrc
“`

### プロジェクトの初期設定

プロジェクトディレクトリを作成し、そこでGoのモジュールを初期化します:

“`bash
mkdir go-test
cd go-test
go mod init go-te

元記事を表示

gomarkdocを使ってGoのソースコードからpkg.go.dev風Markdownを生成する

## はじめに

設計とコードの整合性についての話は昔からよくある議題ですよね。
実装コードは直したけど文書の修正を忘れていて、気付けばコードと異なる仕様が文書に残ってしまったことは一度や二度では無いでしょう。

Go言語にはとても親切な [Go Doc](https://tip.golang.org/doc/comment) が提供されており、Go言語に関わったことがあれば https://pkg.go.dev でサードパーティ製のドキュメントを目にしたことがあるはずです。
しかし、プライベートなパッケージやhtmlではない方法でGo docと同様の内容が読みたいこともあります。
今回は [gomarkdoc](https://github.com/princjef/gomarkdoc) を使ってGithub ActionsでコードからMarkdownを生成することで、Githubサイトでプレビューしやすい文書にしてみたいと思います。

## Install go 1.21.6 on Ubuntu 20.04

これは導入のためのサンプル手順です。
お手元のGo言語

元記事を表示

Windows10のgolangでオレオレ証明書を作ってみた

golangのオマケのプログラムでオレオレ証明書が作れるのですが、windows10上での作成法を検索しても見つからなかったのでメモを残しておきます

“`
go run “C:\Program Files\Go\src\crypto\tls\generate_cert.go” –rsa-bits 2048 –host localhost
“`

実行ファイル化する方が使いやすいそうですよ

以上です

元記事を表示

atcoder_practice×online-judge-tools/oj サンプルコードを一発でフォルダに配置するスクリプト

## 概要
mookjpさんのatcoder_practiceでテンプレート構築したあと、サンプルコードを手動で取り込むのが面倒だったので、online-judge-toolsで取得して配置するスクリプトを作成してみた。

## 私の実行環境

Windows11/Ubuntu 22.04.4 LTS(WSL)
atcoder_practiceのinit.shがちゃんと動く環境なら大丈夫なはず。

## 前提

当然以下2つの準備が必要(手順は割愛)

https://github.com/mookjp/atcoder_practice

https://github.com/online-judge-tools/oj

## 手順

①atcoder_practiceのinit.shと同じフォルダにget_testcase.shを配置。

get_testcase.sh

“`bash:get_testcase.sh
#!/bin/bash -e

# ojコマンドで取得したものをatcoder_practiceに適合するよ

元記事を表示

gRPCでの簡易認証例(Go)

## はじめに
gRPCを使用し、簡単な認証を行ってみます。
言語はGoを使用します。

## 前提
以前行った環境例をもとに、認証を追加対応しています。

https://qiita.com/kenji123/items/c9ba70a6734d981055a7

## 認証用のメタデータのセット
クライアントが認証トークンをメタデータとして送信し、サーバーがそのメタデータを検証する方法を示します。

### クライアント側でのメタデータの追加

クライアントがリクエストを送信する際に、認証情報(例えばJWTトークン)をメタデータとして設定します。これを行うには、`metadata.NewOutgoingContext` 関数を使用して、認証トークンを含むコンテキストを作成します。

“`go
package main

import (
“log”
“context”

“google.golang.org/grpc”
“google.golang.org/grpc/metadata”
“github.com/example/grpc_sample”
)

func m

元記事を表示

テストコード例(Go)

## はじめに
Goを使用したテストコード例を記載します。
テスト例の記載に伴い、テストパターン、網羅性を少し検討してみました。

## テストコード例
以下は、Go言語で書かれたGORMを使用して、データベースにユーザーが存在しない場合に新しいユーザーを追加するテストケースの例です。

### テストケースの概要

– **関数の概要**: 特定の `UserID` と `TargetUserID` でユーザーを検索し、存在しない場合は新しいユーザーを追加する。
– **テストの目的**: ユーザーが存在しない場合に、新しいユーザーがデータベースに正しく追加されるかを確認する。

### テストコード

“`go
package main

import (
“log”
“testing”
“time”

“gorm.io/driver/sqlite”
“gorm.io/gorm”
)

type User struct {
UserID int `gorm:”primaryKey”`
TargetUserID i

元記事を表示

なっとく!関数型プログラミング を読んで関数型プログラミングを学んだ

[EDOCODE](https://www.edocode.co.jp/)でエンジニアをしているYutakaです。

– こちらは社内勉強会で発表した資料を元にしています。

– 関数型言語の知識がほとんどないエンジニアが[なっとく!関数型プログラミング](https://www.shoeisha.co.jp/book/detail/9784798179803)で学んだ用語を一部まとめました。原著は[Grokking Functional Programming](https://michalplachta.com/book/)です。本書はScalaとJavaで説明がされていますが、できる限り社内で使われている言語(Go, JavaScript, TypeScript)でサンプルコードを記載しました。

– 書籍のソースコードは[こちら](https://github.com/miciek/grokkingfp-examples)に全て公開されています。 

# そもそも関数型プログラミングとは?

プログラミングのパラダイムには大きく①命令型プログラミング②宣言型プログラミングがあり

元記事を表示

Docker構築にてGO言語のバージョンが原因でmailpit コマンドをインストールできなかった場合の対処法

# Dockerfile内で
– Go 言語をインストール(mailpit コマンドを go install でインストールするために必要)
RUN apt install -y golang-go

– mailpit コマンドをインストール
インストール先が /root 配下だと Web サーバーから実行できないので、
/usr/local/bin へ移動
RUN go install github.com/axllent/mailpit && mv /root/go/bin/mailpit /usr/local/bin

以前はこの記述でmailpit コマンドが機能したのですが
最近、新たにDocker構築すると
RUN go install github.com/axllent/mailpit && mv /root/go/bin/mailpit /usr/local/bin
の箇所で失敗しました。
原因を調べているとGo 言語のバージョンが原因のようでした。

Go 言語のインストールで仮想サーバーにインストールされるGo 言語のバージョンはgo-1.19
mailpit

元記事を表示

配列(Array)とスライス(Slice)について

配列(Array)とスライス(Slice)について
それぞれの特徴をまとめた

# 配列(Array)

・配列は固定長のデータ構造であり、要素数を宣言時に指定し、後から変更することはできない。
・配列は要素の型と要素数を指定して宣言する例えば、 var arr [5]int は、int型の要素を5つ持つ配列となる
・配列はメモリ上に連続した領域を確保し、要素のインデックスを使ってアクセスする
・配列は静的なサイズを持つため、動的に要素を追加したり削除したりする必要がある場合には適していない

“`
// 配列の定義
var arrayName [size]dataType

// 例: 整数型の配列を定義する
var numbers [5]int

// 初期化された配列
var numbers = [5]int{1, 2, 3, 4, 5}

// 要素数を省略することもできる(要素数は初期化された要素の数で決まる)
var numbers = […]int{1, 2, 3, 4, 5}

// 特定のインデックスに値を設定する
numbers[0] = 10
“`

#

元記事を表示

OTHERカテゴリの最新記事