- 1. GoとJenkinsをWindows11にインストール
- 2. Golangでtorを使う
- 3. Golang 基礎 – 環境設定からプロジェクト管理まで
- 4. gomarkdocを使ってGoのソースコードからpkg.go.dev風Markdownを生成する
- 5. Windows10のgolangでオレオレ証明書を作ってみた
- 6. atcoder_practice×online-judge-tools/oj サンプルコードを一発でフォルダに配置するスクリプト
- 7. gRPCでの簡易認証例(Go)
- 8. テストコード例(Go)
- 9. なっとく!関数型プログラミング を読んで関数型プログラミングを学んだ
- 10. Docker構築にてGO言語のバージョンが原因でmailpit コマンドをインストールできなかった場合の対処法
- 11. 配列(Array)とスライス(Slice)について
- 12. RDBの半構造化データをスキーマ定義してアプリで扱いやすくする
- 13. [GO+PostgreSQL+GitHub Actions] サービスコンテナを使ってdocker-composeを使わずにテストを実行しよう
- 14. Go言語で関数にデータを渡す方法について: 値渡しとポインタ渡しの違い
- 15. トランザクションの終了について
- 16. Goのポインタの簡単な例
- 17. エラーハンドリングの整理(Go)
- 18. Go言語について
- 19. 今後の勉強内容について(React + Go)
- 20. Makefile で同じようなコマンドのターゲット群をまとめる方法
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 mainimport (
“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 mainimport (
“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
“`#
RDBの半構造化データをスキーマ定義してアプリで扱いやすくする
## はじめに
RDBでもJSONなどで半構造化データを保存することはありますよね?データに柔軟性を持たせるためとはいえ、データのパターンやパターンごとに持ち得るプロパティ、各プロパティの型にある程度制限をかけたいケースは少なくないと思います。
今回はgo製アプリケーションでの読み書きに絞って、データの持ち方・制限のかけ方を検証してみようと思います。
記事中のコードは関連箇所のみ抽出して記述しています。リンク先のコードで実際の動作を確認できます。
https://github.com/h-rym/qiita_sample_code.git## 前準備
[docker](https://hub.docker.com/_/postgres)でもなんでも良いのでpostgresが起動している前提で進めます。
“`bash
docker run –name postgres -e POSTGRES_PASSWORD=password -e POSTGRES_DB=test_database -p 5432:5432 -d postgres
“`今回はシンプルにjsonb型
[GO+PostgreSQL+GitHub Actions] サービスコンテナを使ってdocker-composeを使わずにテストを実行しよう
## 前提
– GitHub Actionsの基本的な用語についてある程度理解している
– 言語はGOを使用
– DBはPostgresを使用## サービスコンテナとは
ワークフロー中でアプリケーションをテストもしくはビルドするのに必要なサービスを提供するためのDockerコンテナです
サービスコンテナを使うことでワークフロー内で例えばdocker-composeを使って自前でDBを作成せずにテストを実行することができます
runner内のリソースは限られているのでGitHub側で用意するサービスコンテナなどを使うケースが多いです
また、docker-composeを使わずにワークフローを実行するのでコンテナの起動時間分ワークフローの時間を短縮できます
今回はPostgresのサービスコンテナを使ってテストコードを実行させます## ファイル構成
ファイル構成は以下の通りです
“`
❯ tree
.
├── .github
│ └── workflows
│ └── test.yml
└── application # GOのプロジェクトファイルおよびgo.m
Go言語で関数にデータを渡す方法について: 値渡しとポインタ渡しの違い
Go言語において、「値渡し」と「ポインタ渡し」は関数にデータを渡す二つの基本的な方法です。
– 値渡し (Value Passing)
値渡しでは、関数に値のコピーを渡します。この方法で関数に値を渡すと、関数内で値を変更しても、元の値には影響を与えません。つまり、元のデータは安全で、変更されることはありません。これにより、予期しない副作用を避けることができますが、大きなデータ構造をコピーするとパフォーマンスが低下する可能性があります。“`go
func addOne(val int) int {
val += 1
return val
}func main() {
original := 2
new := addOne(original)
fmt.Println(original) // 出力: 2
fmt.Println(new) // 出力: 3
}
“`https://go.dev/play/p/pS8rcsaUXT1
– ポインタ渡し (Pointer Passing)
ポインタ渡しでは、値のアドレス
トランザクションの終了について
## はじめに
トランザクション処理で、エラーが発生してもトランザクションが終了していない場合の対応例を記載します。Goを例にします。
変更箇所は、トランザクションを閉じる処理がないので明示する、という修正です。## 例
変更前
“`golang
result := tx.Where(“user_id = ? AND target_user_id = ?”, checkUserID, checkTargetUserID).First(&matchedUser)
if result.Error != nil {
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
// レコードが見つからなかった場合の処理
newUser := User{UserID: checkUserID, TargetUserID: checkTargetUserID, Name: “New User”, Timestamp: time.Now()}
// newUser := User{UserID: checkUserID,
Goのポインタの簡単な例
## はじめに
Go言語での実体とポインタ、アドレスの扱いについて整理します。## 値渡しとポインタ渡しの違い
Go言語での実体とポインタ、アドレスの扱いについて、簡単な例を示します。
以下の例では、関数に値を渡す際にコピーが発生する場面と、ポインタを使って直接メモリアドレスを参照する場面を比較しています。### 実体のコピーが発生する例
値渡し(コピー渡し)
“`go
package mainimport “fmt”
type Person struct {
Name string
Age int
}// passByValue はPersonのコピーを受け取る
func passByValue(p Person) {
p.Age = 30 // この変更はコピーにのみ影響する
fmt.Println(“Inside passByValue:”, p)
}func main() {
p := Person{Name: “Alice”, Age: 25}
fmt.Println(“Original person:”, p)pa
エラーハンドリングの整理(Go)
## はじめに
Goでのエラーハンドリングについて整理します。
大体把握できたと思いますので、メモっておきます。## エラーハンドリング例
### コード例“`go
// メソッド呼び出し
if err := executeTransaction(db); err != nil {
fmt.Printf(“Transaction failed: %v\n”, err)
} else {
fmt.Println(“Transaction succeeded.”)
}func manageUser(tx *gorm.DB, checkUserID int, checkTargetUserID int) error {
var matchedUser User
result := tx.Where(“user_id = ? AND target_user_id = ?”, checkUserID, checkTargetUserID).First(&matchedUser)if result.Error != nil {
Go言語について
# Go言語についての概要と学習内容について
go言語を勉強にするにあたり、ますはgo言語についての概要をまとめていく
調べてヒットした特徴をコピペし、それぞれの感想を書いてみた### 概要
・シンプルで読みやすい構文: Go言語は、C言語のような伝統的な構文を持ちながら、冗長さを排除し、シンプルで読みやすいコードを書くことができます。
→まあ分かる・効率的な並行処理: Go言語は、ゴルーチン(Goroutine)とチャネル(Channel)という仕組みを使って並行処理をサポートしています。これにより、軽量で効率的なスレッドの生成と通信が可能になります。
→並行処理に関する知見が不足しているため正直ぱっとイメージが沸かない(要調査)・静的型付けと型推論: Go言語は静的型付け言語ですが、変数の型を推論する機能も持っています。これにより、型の記述が簡潔になります。
→いいね・ガベージコレクション: Go言語はガベージコレクションをサポートしており、メモリ管理を開発者が手動で行う必要がありません。これにより、安全で信頼性の高いコードを書くことができます。
→いいね・クロ
今後の勉強内容について(React + Go)
知人からホームページ作成を依頼されており、その中でブログの機能も追加してほしいとのことから興味があったgo+ reactで作成することにした。
こちらは無料で提供するかわりに時間がかかってもよいと言われているのでお言葉に甘えてじっくり調べながら作成していく。
goもreactも一旦は参考書を読んでいるがあまり身についていないような気がしているため備忘としてまとめていく。
3日坊主にならないよう気を付ける。。
Makefile で同じようなコマンドのターゲット群をまとめる方法
# tl;dr
– [Multiple Targets](https://www.gnu.org/software/make/manual/make.html#Multiple-Targets) 使うと、複数ターゲットを1つのターゲットで表現できて便利
– 複数ターゲットがほぼ同じコマンドで構成されるときに使えて便利
– Makefileは奥が深い
# はじめにほぼ同じコマンドで、パスだけ異なるターゲットを作成することがあり、そのときに知ったMakefileの機能を紹介します。
コードは以下においています。https://github.com/haru-256/blog-makefile-multiple-targets-20240501
# Makefileで複数ターゲットを1ターゲットで表現する方法
Golangでは、`cmd/` ディレクトリ配下に実行エンドポイントを複数置くことがあります。例えば、Web APIサーバーを開発する場合、APIサーバーの実行エンドポイント(`cmd/api/main.go`)と、APIサーバーが参照するDBのマイグレーションツール (`