- 1. Go言語を簡単に勉強して思う、言語設計の違いについて
- 2. AtCoder Regular Contest 124 解説
- 3. Go言語のチュートリアルをやってみた。ついでにまとめて日本語化した。
- 4. Amazon ComprehendをAWS SDK for Go v2を使って呼び出す
- 5. GolangでFirebaseのFirestore Databaseを使う
- 6. [Go Snippet] マルチプレクサをざっくり
- 7. [Go Snippet] シンプル HTTP サーバー
- 8. Go のテストでプロジェクトの特定箇所のディレクトリをフルパス指定する
- 9. Ebitenで作ったHello WorldをiOS端末で表示させる その2
- 10. Ebitenで作ったHello WorldをiOS端末で表示させる その1
- 11. GoでCLIのTODOリストを作成した時の振り返り
- 12. 依存関係逆転の原則(DIP)を使ってテストしやすいコードを書いてみた
- 13. CLIでTODO管理を行うツールを作ったので紹介させてください
- 14. Go言語の特徴
- 15. 付け焼き刃でFargateにgoでマイグレーション&シード
- 16. ubuntu 21.04 に apt で golang をインストール
- 17. copier.Copyで変更できない構造体間のコピーには中間構造体を用いるとよい
- 18. GormからRDSのmysqlデータベースにアクセスするとき
- 19. 【プログラム初心者向け】golangのプログラミングノート
- 20. Go gin でチェックボックス取得
Go言語を簡単に勉強して思う、言語設計の違いについて
# GOを簡単に勉強して思う、言語設計の違いについて
## はじめに
この記事は、かる〜〜くGOに触り始めたpython使いが思ったことを書いた記事です。
歴戦のGO使いの方々がご覧になられ「それ、お前が知らないだけだわ」と思った場合、コメントいただけますと大変助かります(できれば、石と匙は投げないでね)## Goを触る動機
### CとPythonに対するほんの小さな不満
CとPythonは言語として使える(≠使いこなしている)状態の僕ですが、以下の様なほんの小さな不満がありました。* C: 手が遅い僕からすると、開発工数がちょっと重い
* Python: さっとかけるけど、他の人・環境へのリリースしにくい
* ①バイナリ形式でリリースしたい(ソースコード出したくない)
* ②リリース後の環境影響を受けたくないPythonの方だけ補足すると、①②ともにPyinstallerで一応は解決出来ます。
が、Pyinstaller はバイナリからソースコードへの逆変換自体が出来てしまいます。厳密にいうと、①で本当にやりたい「ソースコードを隠したい」
AtCoder Regular Contest 124 解説
# 感想
50分遅れて参加したら、WAが出るわ焦るわで散々な目に遭いました。南無三。
下記ではC問題までを解説しています。D問題以降は解くつもりがありません。
# [A問題](https://atcoder.jp/contests/arc124/tasks/arc124_a)
(以下では、簡略化のために「最も左」の条件があるマスを`マスL`、「最も右」の条件があるマスを`マスR`、とします。)
マスの間に依存関係はないので、それぞれのマスでありうる数の個数をかけ算すれば答え(`ans`を`998244353`で割った余り)が求まります。
まず、`マスL`または`マスR`となるマスを考えます。この時、複数の条件が被っているマスは、どの数をそのマスに選んでもいずれかの条件を満たさないので0通りです。よって、それぞれのマスに高々一つの条件がある場合を以降では考えます。
まず、条件のあるマスは自明に1通りなので、`ans`に1をかけます。次に、条件のないマスがそれぞれ何通りの数を選べるかを考えます。この時、問題の条件より、「そのマスよりも左側に`マスL`がある」or「そのマスよ
Go言語のチュートリアルをやってみた。ついでにまとめて日本語化した。
#はじめに
Go言語をさわりたくてチュートリアルをやりましたが、全部英語でした。
せっかくなので日本語版を作りました。
内容はほぼ一緒(なはず)で、最低限これでわかるであろうの感覚で書いたので
端折ってるところは多々ありますが参考になればうれしいです。#環境
– Windows10
– visual studio code
– Go言語バージョン 1.16.6 (現時点で最新)#Go言語をインストール
[ここからインストール](https://golang.org/doc/install)インストールが終わるとgoコマンドが打てるようになる。
#チュートリアル:Goを使い始める(Tutorial: Get started with Go)をやってみる
[チュートリアル:Goを使い始める](https://golang.org/doc/tutorial/create-module)任意のディレクトリを作る。
→デスクトップにgo/helloというフォルダを作成VScodeのターミナルでモジュールを初期化する。
go mod initで行うが、最初はこれをやるというお
Amazon ComprehendをAWS SDK for Go v2を使って呼び出す
# はじめに
[AWS SDK for Go](https://aws.amazon.com/jp/sdk-for-go/)がありますが、現在(2021年7月24日)のところ、AWS SDK for Go **v2**のAmazon Comporehendのコードサンプルがなかったので、とりあえず自分で作ってみることにしました。
個人的にはPythonを使用することが多いのですが、Go言語も業務で使用することがあるので、Go言語でもチャレンジしてみました。
※他の言語や他のサービスのコードサンプルは以下から参照できます。* [Developer Guide/Code Examples](https://aws.github.io/aws-sdk-go-v2/docs/code-examples/)
* [awsdocs/aws-doc-sdk-examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/gov2)# Amazon Comprehendを使用するための事前準備
Go言語のプログラム
GolangでFirebaseのFirestore Databaseを使う
# はじめに
FirebaseのFirestore Databaseに、GolangのSDKを用いて接続したい。
[公式Doc](https://firebase.google.com/docs/firestore/quickstart?hl=ja)を参考にFirestoreへの接続を試みたところ、以下のように「ファイルが見つからない」と怒られたので、その解決策を備忘録として残す。
“`
Init Firestore failed. err=cannot read credentials file: open ./firebase-adminsdk-key.json: no such file or directory”
“`ちなみに、解決方法をググると、GOPATHまわりを良い感じに変更する方法がたくさん出てくるが、よくわからなかったので、本記事では別の方法を採用している。
(一応、記事後半に採用理由も記載済み)# 失敗パターン
プログラム自体は概ねこれで問題ない
“`golang
// このpackageはあくまで筆者の環境
package infrastr
[Go Snippet] マルチプレクサをざっくり
## 自作で ServeHTTP を実装
`http.Handler` は、`ServeHTTP` を実装すれば OK。
([詳しくは「Golang での Web アプリ開発で、理解を早める 5 ステップ」をチェック](https://qiita.com/yNavS4Ki/items/5b7a0c7c41eb8da8f12a))“`go:maing.go
package mainimport (
“fmt”
“math/rand”
“net/http”
)type MyServeMux struct {
}// ServeHTTP を implement
func (p *MyServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == “/” {
fmt.Fprint(w, “hello, world!\n”)
return
}
if r.URL.Path == “/randomInt” {
fmt.Fprintf(w, “Random num
[Go Snippet] シンプル HTTP サーバー
## 基本
“`go:main.go
package mainimport (
“fmt”
“log”
“net/http”
)func hello(w http.ResponseWriter, r *http.Request) {
// io.WriteString(w, “hello, world!\n”) or
fmt.Fprint(w, “hello, world!\n”)
}func main() {
http.HandleFunc(“/hello”, hello)
log.Fatal(http.ListenAndServe(“:8000”, nil))
}
“``go run main.go` の後、コンソールから `curl http://localhost:8000/hello` を実行すると、`hello, world!` が返ってくる
ただ、POST で送信しても同様の結果になる (`curl -X POST http://localhost:8000/hello`)
## リクエストメソッドで出力変える
`GET` と
Go のテストでプロジェクトの特定箇所のディレクトリをフルパス指定する
Go のプロジェクトで、デバッグと、コマンド実行時のテストの挙動の違いが発生して、原因が、カレントディレクトリの違いということに気づいた。VSCode のデバッガでデバッグを実行するときは、プロジェクトルートをワーキングディレクトリにしているが、通常実行すると、現在テストのソースがあるディレクトリがある場所がカレントになる。
この場合、どうやって解決したらいいだろうか? という小ネタを調べたのでメモしておく
# ファイルの現在位置を取得する
`runtime.Caller` は、関数実行のファイルやライン行数を取得するための関数。この関数を利用して現在のファイルパスを取得する。
“`go
_, testSourceFilePath, _, _ := runtime.Caller(0)
“`# 相対パスを取得する
Win/Mac/Linux のファイルのパスの違いが気になるので、ライブラリで処理する。結局こんなメソッドを書いた。すると、プロジェクトルートからの相対パスを渡すと、そのパスの絶対パスを返すようになる。
“`go
func GetTargetPath(t
Ebitenで作ったHello WorldをiOS端末で表示させる その2
## はじめに
[前回(Ebitenで作ったHello WorldをiOS端末で表示させる その1)](https://qiita.com/krile136/items/eb46bb5ead9ddddd46fd)の続きです。
今回は、前回作ったMobile.frameworkを読み込んで実機で動かすところを解説します。
Xcodeの作業メインになるのでかなり画像多めです。## 作業内容
#### 1. 新規プロジェクトの作成
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/9a02f953-7f80-15ce-14d1-3e3836866155.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489761/c28c99a4-0576-36f1-0666-7502dd1c9de8.png)
![3.png](https://qiita-image-store.s3.ap-north
Ebitenで作ったHello WorldをiOS端末で表示させる その1
## はじめに
Ebitenは素晴らしいことにmobile対応もしているため、作ったゲームをiOS/andoridで動かすことができます。
とはいえ、コマンド一発で全てが完了するわけではなく、ebiten側の準備、iOS用ファイルの書き出し、Xcodeの準備をする必要があります。
まずはいつものHello worldをiOSの実機で表示させるためのサンプルコードと手順を解説する第1弾としてebiten側の準備とiOS用ファイルの書き出しを説明していきます。## 参考にしたもの
やっぱり公式の[go-inovation](https://github.com/hajimehoshi/go-inovation)に倣って作業するのが一番です## ディレクトリ構造
.
├── hello
│ └── hello.go // hello worldを表示させるコードが書かれている
│
├── mobile
│ └── mobile.go // mobile用にhello.goを呼び出す
│ └── tools.go &em
GoでCLIのTODOリストを作成した時の振り返り
https://dondakeshimo.github.io/tech-blog/blog/how-to-develop-toco-cli/
の転載です。
# 目次
* [開発管理や開発ルール](#sec1-0-0)
* [GitHub](#sec1-1-0)
* [GitHub Flow](#sec1-2-0)
* [GitHub Projects](#sec1-3-0)
* [英語](#sec1-4-0)
* [CI/CD GitHub Actions](#sec1-5-0)
* [設計](#sec2-0-0)
* [ディレクトリ構造](#sec2-1-0)
* [クリーンアーキテクチャ](#sec2-2-0)
* [テスト](#sec2-3-0)
* [コーディング](#sec3-0-0)
* [Makefile](#sec3-1-0)
* [Value Object](#sec3-2-0)
* [GoDoc](#sec3-3-0)
* [Table Driven Test](#sec3-4-0)
* [ライブラリ選定](#
依存関係逆転の原則(DIP)を使ってテストしやすいコードを書いてみた
# はじめに
依存関係逆転の原則を使用して、外部サービスに接続が必要だけど、接続部分はモックを使用してロジックだけ簡単にテストコードを実行できるコードを作ってみました。
作成プログラムはS3にファイルを転送する処理を作成して、転送する部分は別でモックを用意してテストコードを書くのを容易にしてみました。
ソースはgolangになっております。# 依存関係逆転の原則を使用する理由
## テストがしやすい
外部サービスに接続する処理のテストコードを書こうとすると、外部サービスを接続する準備が必要になります。
ただロジックだけ確認したい場合は、外部と接続している処理と同じ型を返すモックを代わりに作成し、テストコード実行時はそのモックを呼んで簡単にテスト実行を可能にします。## 変更に強くなる
例えば、元々S3にファイルを転送する処理があって、新しく他のサーバーにファイルを転送する処理を加えた時、S3にファイル転送するソースに影響がないように変更を加えられる。# 実際のソース
## ディレクトリ構成
factoryでs3 or test用のモックのftp用のインスタンスを
CLIでTODO管理を行うツールを作ったので紹介させてください
https://dondakeshimo.github.io/tech-blog/blog/introduce-todo-cli/
の転載になります
# TODO管理ツールを作りました
https://github.com/dondakeshimo/todo-clitodo-cliというTODO管理アプリを作りました。
こちら、Go製になります。モチベーションは大きく3つあり、以下それぞれについて述べていきます。
## TODO管理はCLIでやりたい
TODOリストにタスクを加える行為は記憶容量を多少減らしてくれたり、作業再開の際にスムーズに導入できるようにといった目的だと思いますが、そのリターンに対して面倒臭さが勝ってしまうことが往々にしてありました。
自分はキーボードで操作可能なものは全てキーボードで操作すべきという強迫観念にも似た信条を持っており、マウスやタッチパッドに手を伸ばすという行為はそれだけで多少の心象的ハードルを乗り越える必要があります。
そのため、タスクの管理におけるコストを極力下げるためにはCLI操作でサッとタスクを残しておき、またその作業に戻った時に
Go言語の特徴
静的型付け言語(⇔動的型付け言語)である。
学習コストは低い
Google製である。
Linux,macOS,Windows,Android,iOSに対応
高速である。
コンパイル言語である。並行処理が優れている。
GoroutineWebサーバ開発
モバイルアプリケーション開発
ツール開発ロブ・パイク氏(UNIX)&ケン・トンプソン(UNIX&C言語)が設計した。
時代に合わせて書きやすくしたC言語がGo言語
付け焼き刃でFargateにgoでマイグレーション&シード
## 目的
go-ginで開発しているときにFargateに無理やりマイグレーション&シードを行いたかった感じです。
ただlayerが多すぎて肥大化しているので、あまりおすすめしません。
本当はfargateで新しいタスク立てたり、code pipeline使うべきなんでしょうけど、急いでいるのでこれで。## ファイル
以下fargateにデプロイするようのDockerfileです。
migrationとseedディレクトリにmain.goが入っているのでそれをbuildしてalpineのほうのイメージに移動させます。“`Dockerfile
FROM golang:latest as builderENV CGO_ENABLED=0
ENV GOOS=linux
ENV GOARCH=amd64
COPY . /go/src/backendWORKDIR /go/src/backend
RUN go get github.com/line/line-bot-sdk-go/linebot && \
go get github.com/joho/godote
ubuntu 21.04 に apt で golang をインストール
# ubuntu 21.04 に apt で golang をインストール
[こちら記事](https://qiita.com/m-tmatma/items/dff66b3e294293115661) で `ubuntu に apt で golang をインストール` で go のインストール方法を説明しましたが、
ubuntu 21.04 では標準リポジトリで対応できるようになったみたいなので共有します。
“`
sudo apt install -y golang-go
“`
copier.Copyで変更できない構造体間のコピーには中間構造体を用いるとよい
# 対処方法
“`go
package mainimport (
“fmt”
“github.com/jinzhu/copier”
)// 変更してはいけない START
type Domain struct {
Name string
Age int
Weight float32
BodyHeight float32}
type OutSider struct {
Name string
Age int64
BodyWeight float64
Height *OutSiderHeight
}type OutSiderHeight struct {
Height float64
BodyHeight float64
}// 変更してはいけない END
// ポイントはコピー先と全く同じ名前、型の構造体にすること
type Middle struct {
Name string
Age int
Weight float32 `copier:”BodyWeight”`
BodyHeight float32 `copier:”
GormからRDSのmysqlデータベースにアクセスするとき
当たり前かもしれませんが、意外と情報がなくててこずったのでここにメモっておきます。
`user`: dbのユーザーネーム
`password`: dbのパスワード
`port`: 3306とかのポート
`dbName`: データベースの名前
`dbURL`: xxxx.xxxx.us-east-2.rds.amazonaws.com のようなrdsのURL“`sql_handler.go
import (
“os”
“time”“gorm.io/gorm”
“gorm.io/driver/mysql”
)// NewSQLHandler …
func NewSQLHandler() *SQLHandler {
user := os.Getenv(“DB_USERNAME”)
password := os.Getenv(“DB_PASSWORD”)
host := os.Getenv(“DB_HOST”)
port := os.Getenv(“DB_PORT”)
dbName := os.Getenv(“DB_DATABASE”)
dbUR
【プログラム初心者向け】golangのプログラミングノート
# はじめに
golangを学ぶにあたって、基本的な文法をまとめてみました。
超基本的な内容です。随時、アップデートします。# 環境構築(Mac)
“`:homebrewアップデート
brew update
“`
“`:goインストール
brew install go
“`
“`:goバージョン確認
go version
“`# 実行
“`:hello.go
package mainimport (“fmt”)
func main(){
fmt.Println(“おはよう”)
fmt.Println(“こんにちは”)
fmt.Println(“こんばんは”)
}
“`
・Goのプログラムは、何らかのパッケージに属している必要がある
・Goのプログラムは、そのうち1つは、必ずmainパッケージに属している必要がある
・ここでは、プログラム内で使う「fmt」というパッケージをインポートしている
・fmtパッケージをインポートすることで、fmtパッケージの中にある関数などを使えるようになる
・fmtパッケージには、文字列を表示させる関数
Go gin でチェックボックス取得
# ginでチェックボックスを取得・表示
大したものではないですが、一応調べる必要があったので記載してみます。
参考になれば幸いです。“` html
趣味
“`
まずフォーム自体はこんな感じですね。