- 1. プログラミング超入門(6)〜GO言語〜
- 2. WindowsベースのDockerコンテナを動かす
- 3. Goでテスト用Dockerコンテナ(MySQL, Redis)などを動かす
- 4. カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)
- 5. 【Golang】標準入力から1文字のキー入力を読み込む(enter いらずの On KeyPress/KeyDown っぽいやつ)
- 6. Macローカル上にDocker Composeでアプリを立ち上げてみた
- 7. Go1.16新機能embedを使ってメッセージが定義されたファイルを読み込む
- 8. JWT を Go で処理するためのパッケージ
- 9. 17rep – GolangでMySQLのトランザクションラッパー作成
- 10. 【Go言語/golang】ブロックチェーンの実装
- 11. 【Go/golang】sync.Mutex / sync.WaitGroupで排他制御をする
- 12. goroutineで値(変数)を共有する
- 13. DynamoDBでインクリメンタルなIDを管理する場合の実装
- 14. Goで実装したHyperledger FabricのChaincodeを単体テストしたい
- 15. Go module の Dependency 問題を解決する
- 16. Golang ハンドラ関数のチェインで詰まった過去の自分へ
- 17. [andlabs / ui] Windows GUI examples
- 18. パナソニックプログラミングコンテスト(AtCoder Beginner Contest 195)のメモ
- 19. Go の exec.Commandを調査する
- 20. GoでSSH接続してコマンドを叩く
プログラミング超入門(6)〜GO言語〜
#for文(繰り返し制御)
配列から要素を一つずつ取り出せるようになります。GO言語の繰り返し処理には、**while文**(データの個数がわからない時に使用する条件式)が無くシンプルにfor文というデータの個数分までループ構造を繰り返す処理のみになります。`for スタート値; 継続条件; 増減式 { }`スタート値は第一引数にあたり、繰り返し処理をスタートさせる値になります。変数名に**i**(indexやintegerの頭文字)が使われるのが一般的です。0からスタートとなる**カウンタ変数**(アクションの実行回数)を省略形**(:=)**で代入し定義します。継続条件の部分は繰り返しをやめるまでの条件としてブール値を返す式を記述します。通常はiの値に関する式となり、式の値がfalseとなったら繰り返しをやめ、{ }の中から抜けることになります。例として`i <= 4;` `i < len(aprices)`を記述します。増減式は1回の繰り返し処理で1ずつ増やすインクリメント演算子「++」を使用します**「i++」**は、「i += 1」の略です。{ }波括弧の中には繰り返したい処
WindowsベースのDockerコンテナを動かす
#Windowsのコンテナを作ろう
Dockerといえば、普通はLinuxのコンテナですが、Windowsのコンテナを使いたいときもあると思います。
そんなボーイズ&ガールズにWindowsのコンテナを作るDockerfileをお贈りしよう。#GO言語の実行環境を構築
試しにGO言語の実行環境を構築してみます。
環境が変わればプレイングも変わるのが常ですが、
GOはオールラウンダーなので、さほど変わりませんから楽ですね。“`
FROM mcr.microsoft.com/windows:1909ENV GOLANG_VERSION 1.14.10
ENV GOLANG_DOWNLOAD_URL “https://golang.org/dl/go$GOLANG_VERSION.windows-amd64.zip”RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
(New-Object System.Net.WebClient).DownloadFile(‘%GOLANG_DOWNLO
Goでテスト用Dockerコンテナ(MySQL, Redis)などを動かす
# はじめに
Goで書いたアプリケーションのテスト時に、データベースへの接続や、キャッシュへの接続などが必要になることが多いかと思います。その際に手軽にテスト用データベースやキャッシュなどをを立ち上げられる[testcontainer-go](https://github.com/testcontainers/testcontainers-go)というツールを利用してみて、非常に簡単に利用することができました。どなたかのお役に立てたら幸いです。動作するコードは以下のリポジトリに置いてあります。(02_DB_baseのブランチに実装してあります)
[yasuflatland-lf/go-test-sample](https://github.com/yasuflatland-lf/go-test-sample/tree/02_DB_base)# 動作環境
– Mac 11.2.3 (BigSur)
– Go 1.15.8
– Docker Desktop for Mac (3.2.1)
– Git 2.23.0# 実行方法
1. [https://github.com/yas
カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)
# おしゃれなカフェで…
私はエンジニア。
コーヒー片手にWindowsのノートPCでプログラミングしています。っていうのは置いといて・・・
[カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b)を見た後に、職場であがった話題を絡めたネタ記事です。# 唐突ですがCRについて
最近、職場でCRについてのこんな話題があがりました。
> 恥ずかしながら、キャリッジリターンの意味を初めて理解した、ただの改行コードと思ってた。
> これ、カーソルを先頭に戻すコードだったんですね例えばこんな感じ。
“`
opt = ‘aaa’
opt += ‘bbb\r’
print opt # aaabbbopt += ‘ccc’
print opt # cccaaa
“``\r (キャリッジリターン)` はカーソルを先頭に戻す動きなので、元々の`aaabbb`に対して`ccc`が上書きされます。
カーソルは`ccc`の位置なので、
【Golang】標準入力から1文字のキー入力を読み込む(enter いらずの On KeyPress/KeyDown っぽいやつ)
# Go言語で標準入力のキー押下(`KeyPress`)を検知する
> Golang で**標準入力から1行ごとではなく、1文字だけ取得する方法**を知りたい。
正確には [TTY](https://ja.wikipedia.org/wiki/Tty) からの標準入力を 1 文字欲しいのです。つまり、ターミナルやコマンドラインなどでのユーザー入力(標準入力)で `y` -> `enter` でなく、`y` キーを押しただけで `y` を検知したいのです。
[「golang 標準入力 1文字 読み込む」で Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+golang+%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B+1%E6%96%87%E5%AD%97+%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80)も、[競プロ](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E
Macローカル上にDocker Composeでアプリを立ち上げてみた
#Dockerアプリケーションのアーキテクチャー
![スクリーンショット 2021-03-15 10.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/580193e7-2961-57ea-6239-dce0b7315012.png)##ざっくりとやること・できることの説明
– docker-composeでNginxとGo言語のAPI, DBとしてMySQLのコンテナを3つ立ち上げる
– Nginxのindex.htmlからGo言語で書いたREST API(go-ginのフレームワーク使用)を経由して、DBに問い合わせ
– DBにCRUD(gormのフレームワーク使用)ができることを確認
– ※DockerとDocker Composeはインストールされているものとする。##バージョン確認
確認してみたら、以下のバージョンでした。“`
Docker version 20.10.2
docker-compose version 1.27.4
golang:1.14
Go1.16新機能embedを使ってメッセージが定義されたファイルを読み込む
# はじめに
## Go1.16リリース
Go1.16が2021年2月にリリースされましたね!– [Go 1.16 Release Notes](https://golang.org/doc/go1.16)
– [Go 1.16連載が始まります | フューチャー技術ブログ](https://future-architect.github.io/articles/20210207/)様々なアップデートがありましたが、主要でわかりやすい変更点は以下の通りでしょうか。
– M1 Macに対応
– 処理速度やメモリ使用量の改善
– `go:embed`の追加> Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as Apple Silicon) with GOOS=darwin, GOARCH=arm64.
> For a representative set of large Go programs, linking is 20-25% faster than 1.15 and requi
JWT を Go で処理するためのパッケージ
Go 言語で JWT (JSON Web Tokens) を処理したい。
以前に書いたコードを見直す機会があって調べたら状況が変化していたので記録に残しておきます。特に記載がない限り 2021 年 3 月 14 日時点の情報になります。
## 調査対象
– https://github.com/dgrijalva/jwt-go
– https://github.com/square/go-jose
– https://github.com/lestrrat-go/jwxこのうち実際に使ったことがあるのは dgrijalva/jwt-go と square/go-jose です。
## dgrijalva/jwt-go
https://github.com/dgrijalva/jwt-go
最終リリース: [v3.2.0](https://github.com/dgrijalva/jwt-go/releases/tag/v3.2.0) (2018 年 3 月 9 日)
dgrijalva/jwt-go (fork を含む) を使用しているリポジトリの例
– http
17rep – GolangでMySQLのトランザクションラッパー作成
# 使うシーン
– 一括で複数のInsert Updateで全部成功させないといけないシーン
– リレーションを貼っているテーブルに対してデータの更新や追加などを一括して追加変更しないといけないテーブルが存在するシーン# Go言語でトランザクション制御
– トランザクション制御のラッパー関数の作成
– トランザクションラッパー関数を開始し、エラーだったらrollbackを実行エラーじゃなければcommit# Begin()、Commit()、Rollback()が同じ関数内に定義(これは冗長)
– SqlHandlerポインタレシーバからDB接続を定義し同じ関数内で実行“` go
func (h *SqlHandler) WithTransaction() (err error) {
tx, err := h.db.Begin()
if err != nil {
return
}
defer func() {
if err != nil {
tx.Rollback()
【Go言語/golang】ブロックチェーンの実装
※備忘録として記載しますので、ご容赦ください。
“`go
package mainimport (
“bytes”
“crypto/sha256”
“fmt”
“strconv”
“time”
)type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}func (b *Block) SetHash() {
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
hash := sha256.Sum256(headers)b.Hash = hash[:]
}func NewBlock(data string, prevBlockHash []byte) *Block {
bloc
【Go/golang】sync.Mutex / sync.WaitGroupで排他制御をする
※本記事は備忘録として記述しておりますので、ご容赦ください。
# sync.Mutex
次のコードは、IDを作成するコードが同時に1つしか実行されないようにしています。
※goroutineにmutex構造体を渡すときは、**必ずポインタでわたすこと。**
値のまま渡してしまうと、ロックしている状態のまま別のsync.Mutexインスタンスを渡すことになってしまうので、注意が必要です。“`go
package mainimport (
“fmt”
“sync”
“time”
)var id int
func generateID(mutex *sync.Mutex) int {
// Lock() / Unlock()をペアで呼び出してロックする
mutex.Lock()
defer mutex.Unlock()id++
result := idreturn result
}func main(){
// sync.Mutex構造体の変数宣言
// 次の宣言をしてもポインタ型になるだけで正常に動作する
// mutex := new
goroutineで値(変数)を共有する
# go routineのスレッド間でデータを共有する
※本記事は備忘録として記載したものでありますため、ご容赦ください。goroutineで動作している関数でデータを共有するには、
1. 引数として渡す方法
2. クロージャのローカル変数にキャプチャして渡す方法
があります。“`go
package mainimport (
“fmt”
“time”
)func sub1(c int) {
fmt.Println(“share by arguments : “, c*c)
}func main() {
// 引数で渡す方法
go sub1(10)// クロージャのキャプチャで渡す方法
c := 20
go func() {
fmt.Println(“share by capture : “, c*c)
}()time.Sleep(time.Second)
}
“`
“`
# 結果
share by arguments : 100
share by capture : 400
“`クロージャのキャプチャ渡しの場合も、内
DynamoDBでインクリメンタルなIDを管理する場合の実装
# 概要
状況としては以下の様な場合を想定
– 各グループ毎にインクリメンタルなIDを管理する
– グループの設定を管理するテーブルに最新のIDを保存## 結論
1. 更新式でADDを使ってインクリメントしてIDを生成する
※ただしIDの間が抜ける可能性がある2. IDの抜けが許容できない場合はトランザクションでUpdateとPutする
※Lockをを考慮する必要がある### 1. インクリメントするやり方
サンプルはGoと[guregu/dynamo](https://github.com/guregu/dynamo)を使用したコードとなります
“`go
var domainConfig DomainConfig
err := configTable.Update(hashkey, target).
Add(“CurrentID”, 1).
Value(&domainConfig)
if err != nil {
// error処理
}data.ID = domainConfig.CurrentID
err = dataTable
Goで実装したHyperledger FabricのChaincodeを単体テストしたい
# はじめに
Hyperledger FabricのChaincodeをネットワークにデプロイする前に、機能チェックしておきたい。ということで、Go初学者がFabricのChaincodeを題材にして、Goで単体テストする方法を書き残しました。
# 環境
* Hyperledger Fabric v2.2.0
* サンプルソース、バイナリツール、Dockerイメージのインストール方法は[こちら](https://hyperledger-fabric.readthedocs.io/en/release-2.2/install.html)
* Go 1.15.8
* Visual Studio Codeのおすすめ拡張機能
* [Go for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=golang.Go)### 注意
本記事では、Chaincode開発用のGoパッケージとして[shim](https://pkg.go.dev/github.com/hyperledg
Go module の Dependency 問題を解決する
今日はGoの依存関係で躓いたので、次回躓かないようにいろいろ試してみる。
“`bash
go mod init
“`の後次の簡単なk8s client のプログラムを書いて実行する。サンプルのまんまなのに、失敗する。
“`go
package mainimport (
“flag”
“fmt”
“path/filepath”
“time”“k8s.io/apimachinery/pkg/api/errors”
metav1 “k8s.io/apimachinery/pkg/apis/meta/v1”
“k8s.io/client-go/kubernetes”
“k8s.io/client-go/tools/clientcmd”
“k8s.io/client-go/util/homedir”
)func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != “” {
kubeconfig = flag.String(“kubeconfig”, fil
Golang ハンドラ関数のチェインで詰まった過去の自分へ
[Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV)を読み進める中で、
第3章にある **3.10 ハンドラとハンドラ関数のチェイン** の項で最初理解不明だったけど向き合ったら理解できたのでその過程を書いていきます。↓(
[andlabs / ui] Windows GUI examples
GoでWindowsなGUIを作れるものを見つけたので、
exampleを動かして確認してみます。今回紹介するのは、andlabs/ui です。
https://github.com/andlabs/ui
この記事を書いている時点では、
まだ安定版ではなさそうなので使用される場合はご注意を。GoでWindowsなGUIを作成したいときは、
すこし安定している walk をオススメします。https://qiita.com/hiro_nico/items/08af4c01394527836fff
## examples
サンプルとなるコードは、以下のURLにあります。
https://github.com/andlabs/ui/tree/master/examples* Control Gallery
* テキストボックス・ボタン・ダイアログ・スライダー など
* Draw Text
* 様々なテキストの表示方法
* Histogram
* 折れ線グラフ
* Table
* 表(行内に画像・ボタン・プログレスバーがある)
* Upd
パナソニックプログラミングコンテスト(AtCoder Beginner Contest 195)のメモ
# 前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。# 問題
https://atcoder.jp/contests/abc195
# A
“`Q_A.go
package mainimport (
“fmt”
)func main() {
var M, H int
fmt.Scanf(“%d %d”, &M, &H)if H % M == 0{
fmt.Printf(“Yes\n”)
} else {
fmt.Printf(“No\n”)
}}
“`# B
“`Q_B.go
package mainimport (
“fmt”
)func main() {
var A, B, W int
fmt.Scanf(“%d %d %d”,&A, &B, &W)W = W * 1000
var min_n int = 10000000
var max_n int = 0
for i:=0; i*A
Go の exec.Commandを調査する
コマンド実行をたくさんするライブラリを書いているので、`exec.Command` をしっかりと理解したいと思った。
様々な側面でその挙動を見てみたい。# exec パッケージの概要
まずは公式の [Package exec](https://golang.org/pkg/os/exec/)の概要を訳してみよう。
> Package exec は外部コマンドを実行します。`os.StartProcess` をラップして、簡単に `stdin` と `stdout` リマップしたり、パイプで、 I/O と接続したり、他の調整も実施することが可能です。
> Cや他の言語のシステムライブラリコールと異なり、`os/exec` パッケージは意図的にシステムシェルを実行しません。そして、`glob` のパターンを展開しませんし、他の拡張、パイプライン、リダイレクションといったシェルが実施することを行いません。このパッケージは、Cの`exec`ファミリーのファンクションのように振るいまいます。glob パターンを展開するために、シェルを直接呼んで、危険なインプットをエスケープし、`path
GoでSSH接続してコマンドを叩く
下記にてWin10でSSHサーバーを立ててみたので、
ならGoからいじってみようということでいろいろ試してみます。https://qiita.com/hiro_nico/items/48d091a7200f2012650b
## 試した環境
* Windows 10 Pro (64bit) 20H2
* SSHサーバー別のPCに接続するわけではなく、同じPC内でやり取りする感じです。
## やりたいこと
Go から SSHサーバーに 接続してコマンド叩く!
## どうやるか
まずは golang.org/x/crypto/ssh の godoc を見てみる。
https://pkg.go.dev/golang.org/x/crypto/ssh?utm_source=godoc#Dial
Dial() の Example 使ったらできそう。
1. Dial する
2. Session 作る
3. Run する“`go:ssh.go
package mainimport (
“bytes”
“fmt”
“log”“golang.org