- 1. どこからでもDatabricks SQLに接続する
- 2. go.mod file not found in current directory or any parent directoryと言われたら公式チュートリアルを見よう
- 3. DockerのLambdaコンテナイメージをgolangで動かしてみた
- 4. Goの競技プログラミングチートシート
- 5. gorm & sqliteで時刻を上手に扱う方法
- 6. Go言語でディレクトリを作成する方法
- 7. ApacheBeam-Tutorial(GoLangVersion)
- 8. Golangで学ぶGithubActions入門
- 9. 【Golang】json.Marshal のエラーをテストする【json.MarshalIndent 含む失敗ケースの作成】
- 10. DDDをざっくり理解してみる② ~ドメインサービスとリポジトリ編~
- 11. Let’s EncryptでHTTPSを終端させたいだけならNginxよりCaddyを使うと楽だった件
- 12. Cloud Run + API Gateway で自作 API を作って検証してみた
- 13. Qiita Night〜これだけは伝えたい!Goのすごさとその将来性〜のイベントレポート
- 14. go言語 time.Format() time.Round() の挙動に注意
- 15. 動かして覚える!Goでデータベースの基本的な接続方法とCRUD操作
- 16. GoでLinebotとLIFFを使ってGoogleDriveとMoneyForwardに領収書をアップロードしてみる
- 17. koanfの罠:空文字をスライスにUnmarshalしても空スライスにならない
- 18. Laravelのようなmake controllerコマンドをGoで作成
- 19. Golangでrubyライクな配列処理をしたい!
- 20. Goでコマンド作成
どこからでもDatabricks SQLに接続する
[Connect From Anywhere to Databricks SQL \- The Databricks Blog](https://databricks.com/blog/2022/06/29/connect-from-anywhere-to-databricks-sql.html)の翻訳です。
:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::# Databricks SQL向けGo、Node.js、Python、CLIオープンソースコネクターの発表
開発者がお好きなアプリケーションからDatabricks SQLへの接続をシンプルにできるようにするために、本日、[Go](https://github.com/databricks/databricks-sql-go)、[Node\.js](https://github.com/databricks/databricks-sql-nodejs)、[Python](https://github.com/databricks/datab
go.mod file not found in current directory or any parent directoryと言われたら公式チュートリアルを見よう
# はじめに
最近Go言語を触り初めて、よく`go.mod`がないよと怒られるので、備忘録として残しておきます。もしくは[公式のチュートリアル](https://go.dev/doc/tutorial/create-module)を参照しましょう。
# 結論
#### `go mod init`を実行しよう
以下を実行して`go.mod`ファイルを作成しましょう。
“`
% go mod init“` #### `go get`で使用するgitリポジトリを指定しよう
以下のように外部のリポジトリを使用する場合は指定しましょう。下のリポジトリは例です。
“`
% go get github.com/rwcarlsen/goexif/exif
“`
DockerのLambdaコンテナイメージをgolangで動かしてみた
AWSで公開されているgolangのLambdaコンテナイメージを動かしてみました。
## パッケージの構成
“`
├── docker
│ └── lambda-go-test
│ └── Dockerfile
├── docker-compose.yml
└── lambda
├── go.mod
├── go.sum
├── main
├── main.go
└── pkg
“`## Dockerファイル作成
[こちら](https://gallery.ecr.aws/lambda/go)を参考にDockerファイル等を作成。
“`dockerfile
FROM public.ecr.aws/lambda/go:1# Copy function code
COPY ../../lambda ${LAMBDA_TASK_ROOT}WORKDIR ${LAMBDA_TASK_ROOT}
# golangをinstall
RUN yum install -y golang# Set the CMD to y
Goの競技プログラミングチートシート
# このチートシートについて
「**Trackなどのコードテスト**」や「**Atcoder**」や「**Paiza**」などといった競技プログラミングでよく使われる処理をサンプルコードとして書いていきます。
また、何か追加情報やより良いものなど変更があった場合は更新していきます。
:::note warn
私自信が競技プログラミングを受けた時に、頻出したコードを随時更新していきます。なので、実際には足りていないところもあると思います。
そこはご了承いただけると幸いです。
:::# 概要
自動の目次生成のあるがあるため必要ないかもしれないが、念の為目次の作成|No|概要|
|:–|:–:|
|1| [標準出力](#標準出力) |
|2| [標準入力](#標準入力) |
|3| [文字列分割して配列に格納](#文字列分割して配列に格納) |
|4|[文字列、整数変換](#文字列、整数変換)|
|5|[スライス](#スライス) |
|6| [マップ](#マップ) |
|7| [ソート](#ソート) |## 標準出力
主に使われる、**fmt.Println()
gorm & sqliteで時刻を上手に扱う方法
gormはgo言語でSQLを扱うためのORMパッケージ。
sqliteを扱うときに時刻で想定外の挙動となったため、調査した。
※sqliteは時刻型に対応しておらず、文字列型として扱う。そこに由来する問題だと思う。https://gorm.io/ja_JP/docs/index.html
# 問題
localTimeやフォーマットのずれが出てくるため、単純に time.Now() を使ってinsert や select させると、想定通りに動作しなかった。# 対処方針
unixtimeに揃えたり、timeのフォーマット(文字列)を意識して揃えたりすることでおそらく正常に動作する。# 対策1 unixtimeに統一する
`CreatedAt int64` などに揃える。
これがシンプルで確実そうではあるのだが、 `time.Time` のまま使いたいときはちょっと不満が残る。# 対策2 文字列フォーマットを意識して操作する
`timeFormat = “2006-01-02 15:04:05.000-07:00″` を利用して、insertもselectも
Go言語でディレクトリを作成する方法
# はじめに
Pythonメインだったのですが、興味があってGo言語の勉強をしています。
趣味で撮った写真を自動で振り分ける際にディレクトリの作成を調べたのでまとめておきます。さらに詳しい操作については[公式ドキュメント](https://pkg.go.dev/os)を参照しましょう。
#### 2022/7/11 00:59追記
`os.Mkdir(“test”, os.ModePerm)`と記載していましたが、`os.ModePerm`は[使用しない](https://twitter.com/mattn_jp/status/1546038794637672451?s=20&t=bqbMFn2ZyLs3fXdvc97QcA)みたいです。調べてみて`FileInfo.Mode() & os.ModePerm`を利用した方法に変更しましたが、間違っていたら教えていただえると嬉しいです!# ディレクトリを作成する方法
以下のコードを`main.go`に記載し、`go run main.go`を実行すれば実行したディレクトリで`/test`が作成されているはずです。“`
p
ApacheBeam-Tutorial(GoLangVersion)
Apacheのアプリを調べてたところ、AzureDataFactoryのようなものを発見しました。
こちらになります。https://beam.apache.org/
SaaSではなく、コードベースになっているデータインテグレーションフレームワークになります。
まだ詳しくない状況ですが、GUI等がないので、直感的にわかりにくいです。
これを使う利点として、他のApacheのアプリと結合しやすい点ぐらいしか思い浮かばないのです。早速ですが、上記のページの公式ドキュメントについて説明になります。
## 使うテストデータ
Apache Beamのところから適当に取得しました。
ここはセットしたいデータで問題ないです。
“`text
The SDK-provided Count transform is a generic transform that takes a PCollection of any type, and returns a PCollection of key/value pairs. Each key represents a unique element
Golangで学ぶGithubActions入門
## Github actionsでできること
より良い開発者体験や開発効率を求めてCI/CDの構築は今や欠かせないものになりつつあります。
そこで、Github actionsでどのようにCI/CDを構築すればよいか、開発にGolangを使っている場合をサンプルに説明します。Github actionsをこれから始めていく人が概要を掴みやすい内容の記事になっています。初めにGithub actionsの説明について見ていきます。
以下は公式サイトからの引用です。
>ソフトウェア開発ワークフローをリポジトリの中で自動化し、カスタマイズし、実行しましょう。
CI/CDを含む好きなジョブを実行してくれるアクションを、見つけたり、作成したり、共有したり、完全にカスタマイズされたワークフロー中でアクションを組み合わせたりできます。要するにソフトウェア開発の中でやらないといけない作業を自動化することができ、それを自分の好きなようにカスタマイズできるということができるみたいです。
## 自動化できること
では、Github actionsで何が自動化できるのでしょうか。
主によく使われる
【Golang】json.Marshal のエラーをテストする【json.MarshalIndent 含む失敗ケースの作成】
> Go 言語(以下 Golang)で、俺様関数内の `json.Marshal`/`json.MarshalIndent` が JSON 変換に失敗するケースをテストしたい。
“`go:テストしたい関数
type Foo intfunc (f Foo) Dump(w io.Writer) (n int, err error) {
if w == nil {
return 0, errors.New(“dump failed: the io.Writer w is nil”)
}byteJSON, err := json.Marshal(f)
if err != nil {
// ここのエラーに、たどり着けない
return 0, errors.Wrap(err, “dump failed: can not marshal NodeLog to JSON”)
}return w.Write(byteJSON)
}
“`
– [オンラインでユニット・テストをみる](https://go.dev/play/p/eJgx-pYQnvQ)
DDDをざっくり理解してみる② ~ドメインサービスとリポジトリ編~
# はじめに
この記事は以下の続きです。まだご覧になっていない方はまずこちらお目通しください。https://qiita.com/2san/items/eb9d7df6961542069233
今回も以下書籍を参考にさせていただいております。
# 前回の復習
– ドメイン
Let’s EncryptでHTTPSを終端させたいだけならNginxよりCaddyを使うと楽だった件
みなさん!Webサーバ立ててますか?HTTPSしてますか?
弊社でも、よく自社向けの開発サーバをDockerで立てており、開発サービスは生HTTPで運用、そのフロントにHTTPS終端用のNginxをたてて、その証明書はメンテ&費用フリーの[Let’s Encrypt](https://letsencrypt.org/ja/)で取得するようにしています。
“`
インターネット → (HTTPS) → [ Nginx → (HTTP) → 開発サービス ]
“`こういうDockerでLet’s EncryptでHTTPSしたいだけなら、同一のDockerネットワークに特定条件のDockerコンテナが生えるたびにNginxファイルを動的生成してLet’s Encryptの[ACME](https://ja.wikipedia.org/wiki/Automated_Certificate_Management_Environment)も通してなど全部やってくれる、下記を組み合わせるのが定番なのですが、
– [nginx-proxy](https://github.com/ngin
Cloud Run + API Gateway で自作 API を作って検証してみた
本記事は note にて有料記事で公開しています m(_ _)m
https://note.com/wezardnet/n/nf2d413ba49b0
Qiita Night〜これだけは伝えたい!Goのすごさとその将来性〜のイベントレポート
# 概要
– 2022年7月1日に開催された[Qiita Night〜これだけは伝えたい!Goのすごさとその将来性〜](https://increments.connpass.com/event/250648/)のイベントレポート
– Qiita社の中の人ですが、当日は主に視聴者として参加したので、LT及びトークセッションの視聴レポートをまとめてみました# コンテンツ
– LT
– 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」/ @bikun_bikun
– スケールするGo / @tenntenn
– Googleソフトウェアエンジニアリングに沿った開発をするためのGoの利便性 / @po3rin
– トークセッション / @tenntenn , @po3rin
– Goはどんな風に使える?ここが便利!
– Goを使う仲間をもっと増やしたい!Goの魅力と将来性## LT
### 弊社でのGoの取り組み〜どう広げたか、その後の人員戦略〜」
– スピーカー:@bikun_bikun
– 所属:ディップ株式会社(2018/05〜
go言語 time.Format() time.Round() の挙動に注意
# まとめ
– `time.Round(time.Second)`を使うと、時刻は四捨五入的に処理される(真ん中で切り分ける)
– `time.Format(“2006-01-02 15:04:05”)`を使うと、秒未満は切り捨てられる# 場面
SQLiteを使っていて、秒単位の時刻を記録していた。その際に想定外の値のズレが発生したため、調査していた。上記の仕様を確認した。# コード
“`golang
a := time.Date(2000, 1, 1, 1, 1, 1, 300_000_000, time.UTC)
b := time.Date(2000, 1, 1, 1, 1, 1, 700_000_000, time.UTC)fmt.Printf(“round a %v\n”, a.Round(time.Second))//round a 2000-01-01 01:01:01 +0000 UTC
fmt.Printf(“round b %v\n”, b.Round(time.Second))//round b 2000-01-01 01:01:02 +00
動かして覚える!Goでデータベースの基本的な接続方法とCRUD操作
# なぜ「動かして覚える!」なのか
自分はどんな技術でも初めて勉強する時、文字を読んだり説明だけされても正直理解できず、実際に自分で書いてみて動きを見てから出ないとなかなか理解しにくいと感じました。
なのでこの記事は、自分のような「文字や説明だけじゃ分からん!」って人向けに実際にコードを書いて動かすことをメインに説明してみました。
データベースはよく使われているMySQLに接続してデータを操作していきます。
Dockerなどのコンテナを利用するか、GoとMySQLが同じPCにインストールされていれば同じように出来るので、良かったらこの記事を見ながらご自身の環境で試してみてください!
この記事の一番最後に丁寧に書かれているMySQLのインストール方法の記事があったので載せておきます。
# この記事の対象者
– **Goの勉強を始めた人**
– **文字や説明だけでは理解しにくいと感じる人**
– **GoでDBをいじってみたい人**
– **基本的なSQLを理解している人**# 実行環境
– M1 Macbook Air
– macOS Monterey 12.4
–
GoでLinebotとLIFFを使ってGoogleDriveとMoneyForwardに領収書をアップロードしてみる
# 概要
これまで自分は、経費管理のために様々なレシートを保存してきた。
しかし、レシートの保管やアップロードのために使う工数がばかにならないので、**無料**で簡単にGoogleDriveとMoneyForwardに画像アップロードする方法がないか探したところ表題のシステムを実装するに至った。**LINEで画像とタイトルを入力して送信すると、GoogleDriveとMoneyForwardにアップロードされる**というシンプルなもの。
公式docsでも書いていないことがあったり、結合して動かした時とかログが途中で禿げてたりしてよくわからないことも多かったので個人的な詰まりポイントをメモした。(拙い内容です)
# できたこと
**1.LIFFでフォームを表示して、ファイル名・経費申請者・画像ファイル を入力し送信・アップロードすること**iPhoneで撮ったレシートの写真を1枚選び、現在時刻をファイル名としてGoogleDriveの該当月フォルダにアップロードし、その後入力フォームにあるファイル名と経費申請者、画像ファイルを元として、マネーフォワードに経費明細をアップロー
koanfの罠:空文字をスライスにUnmarshalしても空スライスにならない
# はじめに
[koanf](https://github.com/knadh/koanf) で環境変数を読み込む際、`ProviderWithValue` を使うことでスライスに設定を流し込むことができます。
“`go:readmeより一部改変
// 設定オブジェクト。環境変数を読み込んでここにセット
type config struct {
Vals []string
}func main() {
k := koanf.New(“.”)k.Load(env.ProviderWithValue(“MYVAR_”, “.”, func(s string, v string) (string, interface{}) {
key := strings.Replace(strings.ToLower(strings.TrimPrefix(s, “MYVAR_”)), “_”, “.”, -1)// 値にスペースがあれば、値をスペース区切りでスライス化
if strings.Contains(v, ” “) {
return key, string
Laravelのようなmake controllerコマンドをGoで作成
# 引数を取得
まずはコマンドの引数を取得。
“`go:main.go
package main
import (
“flag”
cmd “backend/commands”
)func main() {
flag.Parse()
cmd.CMD()
}
“`
“`go:command.go
package commandsimport (
“bufio”
“flag”
“fmt”
“os”
)var verb string
var object string
var name stringfunc CMD() {
nArgs := flag.NArg()
if nArgs > 3 { //引数が3以上あったらコマンドエラー
errMessage := fmt.Sprintf(`no command “go run main.go %v”`, CreateArgsText())
fmt.Println(errMessage)
return
}
// 引数の値を取得
verb = flag.Arg(0)
objec
Golangでrubyライクな配列処理をしたい!
# TL;DR
golangでrubyライクに配列操作ができるライブラリを書いたので、興味があったら使ってみてね!
https://github.com/ppmasa8/rbarr## なぜ作ったか
rubyを普段使っている僕が、golangを使ったときに配列操作のやりにくさにキレそうになったので、作ってしまいました。
結果的に作っていく段階でgolangの配列操作に慣れてしまったので、なんとも言えませんが。## 実装したメソッド
https://github.com/ppmasa8/rbarr#index
“`
[]intの場合
pop
shift
push
unshift
delete
sum
max
min
size
uniq
include
first
last
combination
reverse
empty
sort[]stringの場合
pop
shift
push
unshift
delete
size
uniq
include
first
last
combination
reverse
empty
sort“`
## 使い方
https://
Goでコマンド作成
# コマンドを配列で取得
“`go:main.gopackage main
import (
“flag”
cmd “backend/commands”
)func main() {
flag.Parse()
args := flag.Args()
fmt.Println(args)
}“`
これでだけでコマンドの引数を取得できる。“`bash:terminal
$ go run main.go hello world
# [hello world]
“`# コマンドの一部分を取得
“`go:main.gopackage main
import (
“flag”
cmd “backend/commands”
)func main() {
flag.Parse()
secondArg := flag.Arg(1)
fmt.Println(secondArg)
}“`
“`bash:terminal
$ go run main.go hello world
# world
“`
指定した場所の