- 1. Go の気になったコミット (2022 年 5 月)
- 2. Excelデータベースをブラウザで絞り込み検索
- 3. 【A Tour of Go】メソッド編
- 4. Go 言語でスライスのポインタに対して Index を指定して要素を取得する
- 5. go開発環境をDockerで作成する②
- 6. ASP.NET Core Blazor WebAssembly 公開について
- 7. Go で文字列を for-range で回したら rune 型が出た件
- 8. Goのgoroutine, channelを使って並列処理
- 9. go開発環境をDockerで作成する
- 10. Goでシンプルなコマンドラインツールを作ってみた
- 11. GridDB クラウド Version 1.2 の紹介
- 12. GitHub ActionsでAWS ECS FargateにgRPCサービスを自動デプロイする
- 13. 【Golang】ステートメントまとめ
- 14. 【A Tour of Go】基本編③ 〜構造体、配列、スライス、マップ〜
- 15. 【A Tour of Go】基本編② 〜フロー制御〜
- 16. 【A Tour of Go】基本編① 〜パッケージ、変数、関数〜
- 17. grpcurlを用いてgRPCサービスの動作確認を行う
- 18. Goを小さく実行するための簡易シェルスクリプト
- 19. 【AtCoder】C++のmultisetを使う問題をGo言語で解く
- 20. Go を公式パッケージからインストール ( Ubuntu / RaspberryPi OS / WSL2 )
Go の気になったコミット (2022 年 5 月)
[golang/go](https://github.com/golang/go) の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
前回作成したリストはこちら。
https://qiita.com/sg0hsmt/items/a23550509237e06361f2
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
## Topic
– BoringCrypto を使うための `dev.boringcrypto` ブランチが master にマージされました。 :tada:
– 環境変数 `GOMEMLIMIT` でメモリ使用量のソフトリミットを設定できるようになりました。
– 標準パッケージにジェネリクスが導入されました。## Commits
### 2022-05-02
https://github.com/golang/go/commit/32acceb359717e434ceb48681426b377b722d11e
ファイルディスクリプタに対する書き込み処理にて内部で保持している使用済みバッファが
Excelデータベースをブラウザで絞り込み検索
# 概要
* サンプルデータの準備
* バックエンド実装
* HTMLテンプレート
* フロントエンド実装## モチベーション
Excelで管理されているデータベース()のデータをFZFライクに絞り込み検索できるようにします。
全員のPC内にfzfやらターミナルやらxlsx2csvのようなツールが入っていないので、ブラウザの表示を通してサーバー経由でExcelのFuzzy検索をできるようにします。
FZF本家の実行画面。ファイルを絞り込み検索しています。## 完成形

E
【A Tour of Go】メソッド編
公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、メソッドについて学んだことのメモ。前回の記事(基本編)はこちら
https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce
https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7
https://qiita.com/BitterBamboo/items/6732a7a9fb2c904641b1
## メソッド
### 基本
* Go にはクラスの仕組みはないが、型にメソッドを定義できる
* メソッドは、レシーバを引数にとる
* レシーバはメソッドを定義する対象となる型
* 構造体だけでなく任意の型にメソッドを定義できる
* `type MyFloat float64`
* レシーバを伴うメソッドを宣言するには、レシーバの型が同じパッケージ内に存在しなければならない“` go
pa
Go 言語でスライスのポインタに対して Index を指定して要素を取得する
# Go 言語でスライスのポインタに対して Index を指定して要素を取得する
普通のデータ型のようにポインタ参照しようとするとできない。
“`go:構造体
type Users struct {
Name string
Score *[]int
}tanaka := Users{Name: “田中”, Score: &[]int{1, 2, 3}}
satou := Users{Name: “佐藤”, Score: &[]int{1, 2, 3}}
users := &[]Users{tanaka, satou}
“`“`go:NG パターン
for i, v := range *users {
log.Printf(“名前 %v”, v.Name[i]) // こっちはポインタじゃないので問題なし
log.Printf(“スコア %v”, *v.Score[i]) // こっちはポインタ参照してるのにダメ
}
// エラー: invalid operation: cannot index v.Score (variable of type *[]
go開発環境をDockerで作成する②
# 最終目的
– go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。# 目標
– [Docker上にコンソール立ち上げ環境を作る。](https://qiita.com/eigetsu/items/555efb6f1fec0425d35f)
– フレームワークginを使った簡単なREST APIサーバーを立ち上げる。← 今ここ## Goのフレームワークの選定
フロントエンドはWebだけとは限らない。バックエンドとフロントエンドは分け、JSONでやり取りするRESTful APIとする。
GitHubのStars、Forks、日本での利用数、Echoはリリースが頻繁なのも(良いも悪いも)気になったので、ginを選択。https://github.com/gin-gonic/gin
## 簡単なAPIサーバーを考える
環境構築がまずの目的なので、APIサーバーは単純なものをginを使用して作る。
状態(とりあえずは必ずOK)を返すヘルスチェックAPIのみとする。~~~apiblueprint: API仕様
# GET /api/health-c
ASP.NET Core Blazor WebAssembly 公開について
あ、すいません
過去に投稿された記事、現在進行系で書いている記事についてですが
あくまでも、私のメモなので
チュートリアル、ドキュメントではないので、注意してください
それでも、よかったら見てください用事で、ASP.NET Core Blazor WebAssembly(以下blazorWasm)を使うことがあり、
アプリケーションを公開するときに、すごく困ったのでメモ;環境
.net6.0 version 6.0.300 windows
go version go1.18.3 windows/amd64VisualStudio 2022(以下vs2022)
vs2022のテンプレートから、アプリケーションを作成後のリリースで
Blazor Serverであれば、dllを実行できる環境でdotnet runしまえば、問題は特にないのですが、
blazorWasmには、dllがなく当時私が困ったので、今後や、たまたま記事を見つけた人のためのメモblazorWasmは公開後、指定のフォルダーにwwwrootフォルダーがあり、その中身が
リリースに必要なフォルダーですが、中
Go で文字列を for-range で回したら rune 型が出た件
やっぱりGoでも文字列は配列みたいなノリで扱えるのか〜という所感
— BitterBamboo (@bitter_bamboo) June 4, 2022
このように、文字列を直感的に配列の如く扱っていいだろうと高を括っていたら、
`for-range` でまさかの `rune` 型が飛び出してきて、見事にぶちのめされました。## 問題のコード
文字列から “ぴえん(?)” を全て除去するプログラムです。
今回は標準パッケージの `strings.ReplaceAll
Goのgoroutine, channelを使って並列処理
goのgoroutine,channelを使って並列処理をしてみました。
今回は[郵便局](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)のサイトから各都道府県の郵便番号データを全都道府県分ダウンロードした上で、
これを10件ずつ並列処理で解凍してDBに登録するところまでを試してみました。## 郵便番号データは以下からダウンロード
[https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)## 前提環境
go1.8
“`
# 郵便番号データのcsvはSJISの為、以下のパッケージをダウンロード
go get -u golang.org/x/text/encoding/japanese golang.org/x/text/transform# DBはmysql ORMはgormを利用
go get -u github.com/go-sq
go開発環境をDockerで作成する
# 最終目的
go言語でWebアプリを構築するためのgo開発環境をDockerで作成する。# 目標
* Docker上にコンソール立ち上げ環境を作る。## goの選定
https://go.dev/doc/devel/release
現在(2022/06/04)、最新のgoは1.18.3。
https://go.dev/doc/go1.18
1.17と1.18で大きな仕様変更(Genericsの導入、Fuzzingが標準機能)あり。今までのアップグレードに比べて最大の変更ではないか?
Genericsは1.19で正式になり、1.18では試験的実装とのこと。
安定している1.17にしようかと思っていたが、勉強のためなので最新の1.18にして、Genericsを使用し始めよう。
なので、1.18系とする。## dockerイメージの選定
クラウド上にDeployすることを考えると、linux環境になる。destributionを考える。開発中にいろいろやりたいとするとubuntu。
https://hub.docker.com/_/golang?tab=tags&p
Goでシンプルなコマンドラインツールを作ってみた
## はじめに
Goを使ったWebアプリケーション開発を半年以上経験していますが、業務外ではこれまで技術本を読んだり、Udemyなどを使った学習を主にしてきました。
これまでインプットをメインに自己学習をてきたので、これからはアウトプットもしていきたいと思い、Goを使ってコマンドラインツールを作ってみました。## 作成したもの
今回作成したツールは **[pn-checker](https://github.com/gracefulm/pn-checker)** という「引数で指定した数字が素数かどうか判定するだけのシンプルなコマンドラインツール」です。
**実用性のない**且つ**くだらない**ツールを作ってみたいという思いから、さらに、50%くらいの割合で `Think for yourself, stupid!(自分で考えろバカ!)` と言ってくる仕様にしてみました。
まあ、いわゆるクソコマンドです。コマンド作成には以下のパッケージを使用しました。
– [spf13/cobra](https://github.com/spf13/cobra)
– コマンドライン
GridDB クラウド Version 1.2 の紹介
今回は、以前のブログに続いて新しい GridDB クラウドサービスについて紹介します。クラウドサービスの基本については、以前のブログ [GridDB Cloudの紹介][1] をご覧ください。今回は、クラウドサービスのバージョン1.2の新機能について説明します。
GridDBの新バージョンのリリースに伴い、GridDB クラウドに組み込まれた [GridDB Web API][2]が利用可能になりました。WebAPIの基本的な使い方は、[こちら][3]で紹介しています。WebAPIの主な利点は、HTTPリクエストを使ってコンテナを作成し、データを直接データベースにプッシュできることです。これにより、[Telegraf][4]のような他のサービスを使用して、メトリクスや他のデータをGridDBデータベースに記録することが可能になります。
このブログでは、まず`curl`を使った簡単なWeb APIコマンドを紹介します。その後、Telegrafをクラウドサービスにインストールして使用する方法についても紹介します。
## クラウドでGridDB Web APIを使う
Web APIの
GitHub ActionsでAWS ECS FargateにgRPCサービスを自動デプロイする
# はじめに
AWS ECS にgRPCサービスをFargate起動タイプにて自動デプロイするための設定を作成いたしました。# 参考にしたテンプレート
GitHub Actions 公式docsに設定に関する解説とテンプレートが記載されているので、そちらを参考にして設定を進めました。https://docs.github.com/en/actions/deployment/deploying-to-your-cloud-provider/deploying-to-amazon-elastic-container-service
# クラスターとサービスの作成
GitHub Acitonsを使用して自動デプロイを行うためには、あらかじめECS上にクラスターとサービスを作成しておく必要があります。
`aws-cli`を用いてローカル環境からリソースの作成を行うか、もしくはAWSコンソール画面からリソースの作成を行なってください。# タスク定義について
タスク定義のテンプレートリポジトリ内部にコミットしておきます。“`json:task-definition.json
{
【Golang】ステートメントまとめ
# 24 if文
“`go
if result2 := by2(10); result2 == “ok”{
fmt.Println(“great 2”)
}
“`
result2の値をこの式以降使用しない場合は、セミコロン;をつなげて条件式を一行で書くことができる。# 25 for文
“`go
func main() {
sum := 1
for sum < 10 { sum += sum fmt.Println(sum) } } ``` phpのようにfor文は書けるが、上記のように省略することもできる 初期値をforの前に定義、インクリメントは省略 # 26 range文 ```go func main() { l := []string{"Python", "go", "Java"} for i := 0; i < len(l); i++{ fmt.Println(i, l[i]) } for i, v := range l{ fm
【A Tour of Go】基本編③ 〜構造体、配列、スライス、マップ〜
公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、構造体、配列、スライス、マップについて学んだことのメモ。前回の記事はこちら
https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce
https://qiita.com/BitterBamboo/items/f72ce6f7ce20e6b5f6c7
## ポインタ
* ポインタは値のメモリアドレスを指す
* 変数`T`のポインタは`*T`型で、ゼロ値は`nil`“` go
var p *int
“`* `&`演算子は、そのオペランドへのポインタを引き出す
“` go
i := 42
p = &i
“`* `*`演算子は、ポインタの指す先の変数を示す(*間接参照*)
“` go
fmt.Println(*p)
*p = 21 // ポインタ p を介して i へ値を代入する
“`## 構造体
### 構造体とは
* 構造体(`
【A Tour of Go】基本編② 〜フロー制御〜
公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、フロー制御(for, if, switch, defer)について学んだことのメモ。前回の記事はこちら
https://qiita.com/BitterBamboo/items/58d80a1a1a85e18188ce
## `for`
* 初期化ステートメント: 最初のイテレーションの前に初期化が実行される
* 条件式: イテレーションごとに評価される
* 条件式の評価が false となった場合にイテレーションを停止
* 後処理ステートメント: イテレーションごとの最後に実行される“` go
package mainimport “fmt”
func main() {
sum := 0
for i := 0; i < 10; i++ { sum += i } fmt.Println(sum) // 0 + 1 + ... + 9 = 45 } ``` * 初期化ステートメントと後処理ステ
【A Tour of Go】基本編① 〜パッケージ、変数、関数〜
公式の [A Tour of Go](https://go-tour-jp.appspot.com/list) ではじめて Go 言語を触ってみました。
以下、パッケージ・変数・関数について学んだことのメモ。## パッケージ
### package
* Goのプログラムはパッケージで構成される
“` go
// プログラムは main パッケージから開始される
package main// “fmt” と “math/rand” パッケージを import
import (
“fmt”
“math/rand” // `package rand` ステートメントで始まるファイル群
)func main() {
fmt.Println(“My favorite number is”, rand.Intn(18))
}
“`### import
* `import`ステートメントの書き方
* 括弧で複数の`import`を整理する(*better*)
* 複数の`import`ステートメントを書く“` go
// factored import
grpcurlを用いてgRPCサービスの動作確認を行う
# はじめに
gRPCサーバーの開発を進めている際に、gRPCサーバーに対しての動作確認をローカル環境で行いたい場合があると思います。
そこで、動作確認の際に、便利なツールが公開されているので紹介します。# grpcurl
https://github.com/fullstorydev/grpcurl
# install
今回はMacにて使用するので、以下のコマンドでinstallを行います。
“`
brew install grpcurl
“`# 事前準備
gRPCサーバーの`main.go`に以下の処理を追記しておきます。下記のソースを追加
“`
s := services.NewServer(client)reflection.Register(s) ⇦追記
log.Printf(“server listening at %v”, lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatal(err)
}
“`
上記の設定を追加しておかないと、grpcurlコマンド使用時に以下のよ
Goを小さく実行するための簡易シェルスクリプト
# はじめに
昨日初めてGoを書きました。筆者は新しい言語を書くときは`haskell-playground`や`javascript-playground`みたいなディレクトリを作り、「ネットで見つけた便利なコード」や「試しに動かしたいちょっとしたコード」などをそこで動かしながら、少しずつ新しい言語を学びます。
なので今回も同様に`go-playground`というディレクトリを作って、そこでgoのコードをあれやこれやと動かして遊んでいました。
# なぜシェルスクリプトを書いたのか
そこまでは良かったのですが、書いているうちに**試しにコードを動かすたびにmain関数を毎回書き換えること**がちょっと面倒だなぁと思いました。具体的に説明しますと、例えば`gob`というgoでバイナリデータを扱うプログラムをちょっと動かしてみたいと思い、以下のようなコードを書いたとしましょう
“`gob.go
package main// importは省略
func store(data interface{}, filename string) {
//バイナリデータ
【AtCoder】C++のmultisetを使う問題をGo言語で解く
# 概要
2022-05-28(土)に開催されました[NOMURA プログラミングコンテスト2022(AtCoder Beginner Contest 253)](https://atcoder.jp/contests/abc253)の[C – Max – Min Query](https://atcoder.jp/contests/abc253/tasks/abc253_c)をGo言語で解く方法を紹介します。# 問題と解答のアプローチ
Go言語で、問題文に沿って実装してみます。
$x$について下記のような制約がありますので、
問題文の多重集合$S$を、mapで書くことでメモリ制限を超えないようにします。
“`math
0 \leq x \leq 10^9
“`
下記の書いてみますと、クエリ3で$S$の最大値と最小値を求めるところを
工夫をしないと、実行時間制限をオーバーしてしまいます。“`go
package mainimport (
“bufio”
“fmt”
“os”
“strconv”
)var sc = bufio.NewScanner(os.S
Go を公式パッケージからインストール ( Ubuntu / RaspberryPi OS / WSL2 )
インストール方法は、こちらを基にしています。
「ラズパイに Go をインストールする」
https://zenn.dev/ysmtegsr/articles/20d6e0c7159be2# 環境
– Go Version 1.18.2
– Raspberry Pi OS Lite
– Release date: April 4th 2022
– System: 32-bit
– Kernel version: 5.15
– Debian version: 11 (bullseye)また、同様にして Ubuntu20.04 , WSL2 にもインストールできました。
# ダウンロード
https://go.dev/dl/
こちらから、該当のアーキテクチャを選択し、リンク先をコピーして使います。
– Raspberr