- 1. Go言語 Docker開発環境構築方法 メモ
- 2. 最近登場したプログラミング言語の多様性:未来への道
- 3. Compute Engine に MySQLをインストール【CentOS 7】
- 4. TypeScript+React+Goで適当にアプリを作ってみる
- 5. [Go]スライスの破壊的なソート, 非破壊的なソート
- 6. Goの構文解析に入門してみる
- 7. LambdaでGoのHelloWorldをやってみた
- 8. 【個人開発】キリ番を祝ってくれるGithub Actionsをリリースしました🎉【Go】
- 9. [GO言語] GORM と Gen を導入した話
- 10. Go言語で作るDiscord Bot
- 11. Go言語でブロックチェーンのシステムを作成する(その4)
- 12. Go言語で作成した利用者専用のDiscord Bot スクショ送信Bot
- 13. go-ruleguardのルール定義でコンパイルエラーが起きたのはなぜ?―独自Goコンパイラを探る
- 14. Go言語における構造体(struct)の基本
- 15. Goを勉強してみた part1
- 16. Goでテンプレート文書を使用して文書を作成する
- 17. カテキョの生徒のために、英語読解問題生成サイトを作った
- 18. [Golang]go-elasticsearchでレスポンスをmockする方法
- 19. GoのbufconnでモックしたgRPCサーバーを使ってテストをするとUnavailableになる
- 20. Golangにおけるスライスの範囲指定:a[low : high]
Go言語 Docker開発環境構築方法 メモ
## 概要
* DockerでGo言語の開発環境を構築する方法について備忘録としてメモする。
## 環境情報
* OS:WSL2 Ubuntu-22.04
* Docker:24.0.7
* docker compose : v2.10.0
* Visual Studio Code:1.85.1## 手順
### 1. 作業用フォルダにDockerfile、docker-compose.ymlを作成する
* 任意の作業用フォルダの直下に次の2ファイルを作成する
* `Dockerfile`
“`dockerfile
# ベースイメージ
FROM golang:1.22rc1-alpine3.19
# コンテナ内のディレクトリ作成
RUN mkdir /go/src/app/
# 作業用ディレクトリ設定
WORKDIR /go/src/app/
# ホスト上のファイルをコンテナ作業用ディレクトリにコピー
COPY ./ /go/src/app/
“`※ベースイメージは[公
最近登場したプログラミング言語の多様性:未来への道
![Internship-Robby-Coding-1024×522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3771407/9f05d86d-9343-baab-3069-69c6dd97f2ad.jpeg)
近年、テクノロジーの進歩に伴い、新しいプログラミング言語の登場が加速しています。これらの言語は、異なる用途やニーズに応えるために設計され、開発者コミュニティに革新的なアプローチをもたらしています。以下では、最近注目されているいくつかの新しいプログラミング言語を紹介します。
Rust(ラスト):
Rustは、システムプログラミングのためのモダンで安全な言語として急速に人気を集めています。メモリの安全性と並行性を重視し、パフォーマンスと安全性を両立させることが特徴です。システムレベルのプログラミングや組み込みシステムの開発に適しています。
Kotlin(コトリン):
Kotlinは、Java Virtual Machine(JVM)上で動作する静的型付けのプログラミング言語です。An
Compute Engine に MySQLをインストール【CentOS 7】
# はしがき
ネットにある記事を参考にしながら作業を行うと躓くことが多くありました。この記事では、Compute Engine上でMySQLが動き、ローカルからログインできるところまでの手順を記載します。
無料枠のCompute EngineでMySQLを使いたい人には参考になるかもしれません。
最後には、Go言語を使ったGCEのインスタンスの起動と停止、IPアドレス取得プログラムが書いてあります。
## 環境
* 2024年4月17日
* Mac OS 14.0 (Intel Mac)
* Google Chrome# 手順
## Compute Engineのインスタンスを作成
有効になっていない場合は、Compute Engine APIを有効化
* リージョン:us-west1
* ゾーン:us-west1-b* マシンタイプ:e2-micro
* ブートディスク:
* OS:CentOS
* バージョン:CentOS 7
* ブートディスクの種類:標準永続ディスク
* サイズ:30GB* 「詳細オプション」→「ネット
TypeScript+React+Goで適当にアプリを作ってみる
# この記事について
色々あってReact+Goについて知る必要が出てきたので、勉強がてら適当にアプリ作ってみました。React+TypeScript+Goのアプリって結構世間にありそうだし、ネットに情報たくさんあるから勉強しやすいかなとか思ってたらとんでもない。これをトレースすればOKみたいな記事がなくって結構苦労したので、何なら自分が記事書くか、という感じ。# 記事の作者について
最近はPMしかやっていないザコRubyist。ReactとGoの経験はなく、TypeScriptは実務でほんのりやったくらい。ちなみに次の職場ではエンジニアやらない。# ソースはここ
https://github.com/gitk47320/go_react
* ReactとかGoとかど素人で、ネットの情報かき集めてとりあえず動くところまで何とかしたというレベルなので、使用時はその辺気をつけてほしい
* 言い訳がましいですが、命名とか細かいところでイケてないなあって思うところはありますので、そこはご愛敬。気が向いたら直す予定# アプリの構成について
* ローカル環境はdockerで構築
* フ
[Go]スライスの破壊的なソート, 非破壊的なソート
# 概要
golangでは標準で破壊的なソートをする関数が用意されているが、非破壊的なソートをする手段は用意されていないため、自前で実装する必要がある。この記事では、それぞれの実装コードを例示する。# 破壊的ソート(`sort.Slice()`)
golangでスライスをソートする際には、標準パッケージの関数`sort.Slice(x any, less func(i, j int) bool)`を使う。“`sample.go
package mainimport (
“fmt”
“sort”
)// sampleStruct スライスの要素の型となる構造体
type sampleStruct struct {
a int
}// String サンプルコード内でのPrintf()でのキレイな出力用に定義してるだけ
func (s *sampleStruct) String() string {
return fmt.Sprintf(“{a: %d}”, s.a)
}func main() {
sampleStructs := []*sampleSt
Goの構文解析に入門してみる
Goのソースコードを処理するツール(コードチェックやデータ生成など)を作ってみたいと思ったので、Goの構文解析に入門してみました。
## まえがき
ソースコードを何らかのツールにかけて処理したいことはよくあるかと思います。
例えばコードのルールチェックやフォーマットを行うとか、特定のフォーマットで書かれたコード(やコメント)から何らかのデータ(APIドキュメントなど)を自動生成するなどです。昨今ではこのような処理を行うためのツールが多数提供されており、多くのプロジェクトで利用されています。
しかし、プロジェクトに固有なルールであるとか、独自のデータファイルを生成したいとなったとき、それら既存のツールでは対応できないこともあります。
そのような場合は「自分たちでツールを作る」ということが考えられますが、その際にはどのようにしてソースコードを処理すればよいのでしょうか?簡単なツールであればちょっとしたスクリプトと正規表現などの文字列処理で実現することも可能かと思いますが、そういった単純な実装では文法を考慮した厳密な処理が難しかったり、謎の正規表現だらけでツール自身の保守性が悪く
LambdaでGoのHelloWorldをやってみた
GoはシングルバイナリでLambdaと相性が良いらしい・・・といったレベルの初心者なので、まずは公式のドキュメントのとおりにやってみる。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html
“`go mod init main“`して、“`go.mod“`を作成し、“`main.go“`に例示されたコードを張り付ける
“`go
package mainimport (
“context”
“fmt”
“github.com/aws/aws-lambda-go/lambda”
)type MyEvent struct {
Name string `json:”name”`
}func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
if event == nil {
return nil, fmt.Errorf(“received nil event”)
}
【個人開発】キリ番を祝ってくれるGithub Actionsをリリースしました🎉【Go】
# 宣伝
GithubのIssue, Pull Requestには連番で番号が振られています。
この番号においてキリ番(キリの良い番号の略)を踏んだときに、誰も祝ってくれないのは寂しくないですか?
[kumackey/kiriban](https://github.com/kumackey/kiriban)を使えば、キリ番を踏んだときにコメントで祝ってくれます!🎉![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/43ffb89d-136a-f8dc-be04-1f279c9cd070.png)
![comment.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/f3ab73df-60e2-e482-e452-cf010d08dc37.png)
今までキリ番を踏んだ人のリストや、次のキリ番も予告してくれます。
# 使い方
[README](https://github.co
[GO言語] GORM と Gen を導入した話
# はじめに
Go 言語を使った DB 処理に ORM として GORM/Gen を入れてみたので、その作業時に備忘録として記事にしました。
これから GORM/Gen を使った開発環境を構築する方の一助になれば幸いです。なお [GORM](https://gorm.io) は Go 言語 における ORM。 [Gen](https://github.com/go-gorm/gen) は GORM をサポートしたコードジェネレーターです。
# 環境と各ツール
| | バージョン | 備考 |
| ————————————————————– | ——— | —————————————————- |
|
Go言語で作るDiscord Bot
# Go言語で作ったDiscord Botのお話
## 開発経緯
当時、スマホMMOをやっていた時ですが
血盟(チームのようなもの)でいろいろアンケート?参加集計?等を取る際に
Discordを使っていました。それに特化したBotが欲しいなと思い作成しました。
## システム構成
今回も、いつも放置で使っている自分のPCでBotを動かしました。
というのも、永続的に動作されるサーバーの用意が結構面倒な状況に現在なっている為
致し方なくな構成ではあります。ローカルの場合には、外部定義ファイルにデータ保管するのもお手軽であり
Googleスプレットシート等で十分にお手軽なDBのような事ができました。今回は、外部定義の絡みが多いため
プログラム一式の公開はちょっと面倒なので避けます。## 開発した機能
・メッセージのリアクション集計
・リアクションを集計する為のリストをBOTに作成させる
※実際には18機能ぐらいありますが、どれも組み合わせみたいなものなので・・・・# プログラムのお話
なかなかきれいに作るのが難しく、過去に作成したプログラムから情報を抽出しています。
Go言語でブロックチェーンのシステムを作成する(その4)
## はじめに
前回は、transactionsの実装までやりましたが、今回はnonceの実装をしていきます。– 前回までの記事
https://qiita.com/jun_11/items/a1adf93ba02292321b25
https://qiita.com/jun_11/items/259f0a777e12b3fa1b32
https://qiita.com/jun_11/items/61adfc340792cdb2af08
– バージョン
– Go 1.22.0## nonceとは
nonceは、新しいブロックを作成する時に、そのブロックが正しいものだと証明するために使われます。
下の図のように新しいブロックを作成する時に、challenge、prev hashとtransactionsを使用してハッシュを生成します。このときchallengeはnonceに入れる候補となる値です。
例えば下の図では、生成したハッシュの先頭が000となるまでchallengeを増やしていって、challengeが10の時ハッシュの先頭が000になったので、challen
Go言語で作成した利用者専用のDiscord Bot スクショ送信Bot
## 作ったもの
私、スマホゲーマーなんです。
そして、PCゲーマーでもあります。
という事は、PCに入れたNox等で複数キャラ同時育成なんかやっちゃいます。私のPCこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764841/41128204-ad23-3f0c-343a-442a59ff9abc.png)外出時等、アプリが落ちてしまったりしていないか
キャラが死んでいないかいつもドキドキしています。そのチェックをするために今回開発を行ったのが
DiscordのBotを利用して、Discordで話しかけるたびに
デスクトップのスクショを送ってくれるソフトを開発しました!!!![discord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764841/5c32de5b-39f8-1ae8-46bb-ce4dd77abd13.png)
このBotに話かけるだけで
な
go-ruleguardのルール定義でコンパイルエラーが起きたのはなぜ?―独自Goコンパイラを探る
# TL; DR
– `go-ruleguard` のルールファイル `rules.go` は独自Goコンパイラでコンパイルされる
– そのため、専用のオブジェクト、メソッド呼び出し以外は使えない:::note info
本記事ではruleguardの実践的な活用方法については触れていないので、予めご了承ください :bow:(エラーが発生したときの原因調査には少しだけ役立つかもしれません)
:::# go-ruleguardとは?
(ご存じの方は次の章まで読み飛ばしてください)go-ruleguardはGoのlinter(およびそのCLI)です。
https://github.com/quasilyte/go-ruleguard
特徴として、**ユーザーが1からルールを作成できる**ことが挙げられます。ASTに対するパターンマッチで記述できるため、**構文レベルでルールを設定可能**です。
(以下 `v0.4.2` 時点の内容です)
“`go:rules.go
// READMEより抜粋
//go:build ruleguard
// +build rule
Go言語における構造体(struct)の基本
### 構造体とは?
go構造体は、異なるデータ型の変数を一つにまとめるための複合データ型です。例えば、名前、年齢、住所を一つの「人」型としてグループ化することができます。これにより、データの管理と操作が容易になります。
### 構造体の宣言
構造体は`struct`キーワードを使用して宣言されます。以下に簡単な構造体の宣言例を示します。
> type キーワードで構造体をひとつ作るということは、struct で定義された新しい型 (type) を定義する、ということになります。
“`go
type {struct_name} struct {
filed1 type
filed2 type
…
}
“`
例“`go
type Person struct {
Name string
Age int
Address string
}
“`この例では、「Person」という名前の構造体を定義しています。この構造体には、Name、Age、Addressという3つのフィールドが含まれています。
### 構造体の利用
Goを勉強してみた part1
# はじめに
最近Go言語を勉強し始めたので、メモとしてGo言語の特徴をメモしていく# package
Goではソースコードの最初にpackageで名前空間を定義する必要がある
importの際にはこの名前空間でimportする“`go
package main // <- 名前空間 import ("fmt") // <- importするパッケージ func main() { //実行したい処理... } ``` 自作モジュールを読み込みたい場合はGOROOTで指定されたPATHにあるsrcから読み込まれる GOROOTは`go env GOROOT`で確認ができる # 変数 Goでは整数型や実数型、文字列型など他の言語と同じような型を利用する 変数の定義や値の代入は以下のようにvarで定義する ```go var int32 num // 変数の定義 num = 1000 // 変数の代入 ``` また、変数の定義と代入は同時に行うことができ、その場合は以下のように記載する 定義と代入を同時に行う場合には型の定義を省略することもできる ```go var
Goでテンプレート文書を使用して文書を作成する
会社名やメールアドレス等を一覧化しているExcelを読み込み、読み込んだ内容をもとにテンプレート文書に従ったメール本文を作成する、ということを行ったのでその方法をまとめます。
GoでExcelのデータを読み込む方法は先日別でまとめたので、[こちら](https://qiita.com/em1892/items/ae93a5f56b837391e775)をご参照ください。
https://qiita.com/em1892/items/ae93a5f56b837391e775
# Goでテンプレート文書を使用するには
公式パッケージである、[text/template](https://pkg.go.dev/text/template) を使用します。# テンプレート文書の作成
まず、テンプレート文書を作成します。今回、Excelの一覧にある宛先に、年末年始の休業期間のメールを作成するとします。
テンプレート文書は`.tmpl`の拡張子で保存します。テンプレート文書内で、`{{.メンバ名}}`の形式で構造体のメンバーを指定することで、動的に値を挿入することが可能となります
カテキョの生徒のために、英語読解問題生成サイトを作った
## はじめに
### 背景
バイトの家庭教師で、高校3年生の生徒に大学受験を指導しています。
その生徒は英語の素養がある一方、長文の読解速度・精度に課題を抱えていました。
一般に大学受験における英語は出題傾向として、西日本は精読重視、東日本は速読重視といわれていましたが、現代は共通テストとかいうので全国民が **速読** の能力が必要になりました。
**速読** の能力を底上げするにはとにかく **演習量** を通じて「問題で聞かれている箇所だけ目を通す」訓練を内面化することかと思います。### やったこと
演習量が欲しいので、今驚きのLLMを使って無限に英語読解問題を生成するサイト[「EnglishExamForever」](https://englishexamforever.pages.dev/#/)をサーバーからフロントまで一人で開発しました。[生徒思いの王、生徒思いキング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)ですね。
動作動画はこんな感じです。
[Golang]go-elasticsearchでレスポンスをmockする方法
## 本記事でやること
– [go-elasticsearch](https://github.com/elastic/go-elasticsearch)を使ってElasticsearchからのレスポンスをmockする
– レスポンスをmockした単体テストを書く
– 内部実装のコードリーディングを通して何をmockしているのかを理解する## 対象読者
– これから[go-elasticsearch](https://github.com/elastic/go-elasticsearch)を使って実装を始める方
## 使用言語
– Go 1.21.0
## 実装
### 前提
Elasticsearchにあるインデックスに対して検索クエリを実行し結果を返す`Search`メソッドを実装しました。
今回は、この`Search`メソッドが返すレスポンスをmockします。`Search`メソッドは、検索対象のインデックス名と実行するクエリを文字列として受け取り、検索結果をバイト配列で返します。
また、`Search`メソッドは`esapi.SearchRequest`構造
GoのbufconnでモックしたgRPCサーバーを使ってテストをするとUnavailableになる
# TL;DR
grpc v1.63.0でDialContext関数がdeprecatedになったため、NewClient関数に置き換えたことが原因。
targetに与えるURLのスキームとしてpassthroughを明示的に与えることで解決する。
“`go
//v1.63.0以前
conn, err := grpc.DialContext(
context.Background(),
“bufnet”,
grpc.WithContextDialer(dial),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
//v1.63.0以降
conn, err := grpc.NewClient(
“passthrough://bufnet”,
grpc.WithContextDialer(dial),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)
“`# 経緯
Goで書いたgRPCサ
Golangにおけるスライスの範囲指定:a[low : high]
`a[low : high]`: スライスの範囲を示します。startからendまでの要素を含みますが、end自体は含みません。つまり、start以上 end未満の要素が含まれます。
例えば、以下のようなスライスがあるとします。
“`go
a := []int{0, 1, 2, 3, 4, 5}
“`この場合、a[1:4]は、インデックス1(含む)からインデックス4(含まず)までの要素を抽出します。つまり、[1, 2, 3]が返されます。
– 範囲指定の際、startの値は含まれ、endの値は含まれないことに注意してください。
– 範囲指定は元のスライスの一部を参照するだけであり、元のデータを変更するわけではありません。https://go.dev/play/p/8twfG2cXA0N