- 1. デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239) 参戦記
- 2. [Golang] enumを使いたい ~ structでも定数定義できるぞ
- 3. Ubnutu20.04.3 LTSにGo言語の開発環境を構築する (Golang + VSCode+Ubuntu)
- 4. 【Go】http.ResponseWriterのメソッドw.Header().Add()が効かない
- 5. [Golang] Cloud Runで構造化ログを出力できるように実装してみた
- 6. GolangにORM導入(go-pg migration編)
- 7. 【Go言語】time.Timeをjsonでunixtimeを返しつつ、time.Timeの型でGCP/DataStoreに保存する
- 8. Goの環境変数読み出しについて
- 9. # 【Go】無名関数について理解したこと
- 10. 0埋めの文字列にする
- 11. Go言語・SendGrid・REST APIでお問い合わせメール送信API
- 12. Go言語を0から習得してWeb開発をする
- 13. 【個人開発】Githubのプロフィールに、Qiita・Zennの記事などを一覧表示させる、Github Actionsのアクション作ったよ!
- 14. # 【Go】一人コードリーディング会を始めます。(4回目)
- 15. 【Go】組み込み関数makeとnewの違いについて
- 16. 区間選択アルゴリズム
- 17. Go言語の環境設定
- 18. DDDを意識したgolangでの実装
- 19. マイクロサービスのヘルスチェック実装において依存先への負荷を軽減したい
- 20. RaspberryPi4BにGoを入れる。
デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239) 参戦記
# デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239) 参戦記
## [ABC239A – Horizon](https://atcoder.jp/contests/abc239/tasks/abc239_a)
2分で突破. 書くだけ.
“`python
from math import sqrtH = int(input())
print(sqrt(H * (12800000 + H)))
“`## [ABC239B – Integer Division](https://atcoder.jp/contests/abc239/tasks/abc239_b)
4分半で突破. 試したら Python の除算そのままであれってなった.
“`python
X = int(input())print(X // 10)
“`## [ABC239C – Knight Fork](https://atcoder.jp/contests/abc239/tasks/abc239_c)
9分で突破. 2点の周
[Golang] enumを使いたい ~ structでも定数定義できるぞ
元々Javaエンジニアの私ですが、最近Goを趣味で使い始めたのでメモ程度に。
今回はJavaでよく使うenumをGoでもそれっぽく使う方法を残しておきます。## まずは基本的な使い方
よくGoogleで検索して見かけるやつ“`hoge1.go
package constant// 自動で採番してくれる
const (
HOGE1_1_1 = iota // 0
HOGE1_1_2 = // 1
HOGE1_1_3 = // 2
)// 1始まりにしたい
const (
HOGE1_2_1 = 1
HOGE1_2_2 = 2
HOGE1_2_3 = 3
)// 文字列で定義したい
const (
HOGE1_3_1 = “hoge1”
HOGE1_3_2 = “hoge2”
HOGE1_3_3 = “hoge3”
)// 基本型をベースにした独自の型で定義したい
type HOGE uint8
const (
HOGE1_4_1 HOGE = 1
HOGE1_4_2 HOGE = 2
HOGE1_4_3 HOGE =
Ubnutu20.04.3 LTSにGo言語の開発環境を構築する (Golang + VSCode+Ubuntu)
今更ながら、Ubnutu20.04.3にGoをインストールします。
## インストールするマシンについて
### os情報“`bash
user@machine:~/gotrain$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”20.04.3 LTS (Focal Fossa)”
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME=”Ubuntu 20.04.3 LTS”
VERSION_ID=”20.04″
HOME_URL=”https://www.ubuntu.com/”
SUPPORT_URL=”https://help.ubuntu.com/”
BUG_REPORT_URL=”https://bugs.launchpad.net/ubuntu/”
PRIVACY_POLICY_URL=”https://www.ubuntu.com/legal/terms-and-policies/privacy-policy”
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
`
【Go】http.ResponseWriterのメソッドw.Header().Add()が効かない
http.ResponseWriterのメソッドHeader().Add()でヘッダーを追加したはずなのに、レスポンスのヘッダーを見ると付与されていない。
単純にw.Header().Addの前に、w.Writeを呼び出していたことが原因だった。順番を逆にすると、想定どおり動作する。
“`go:改修前
func(w http.ResponseWriter, _ *http.Request) {
w.Write([]byte(“Hello, world”))w.Header().Add(“Access-Control-Allow-Origin”, “http://localhost:3000”)
w.Header().Add(“Access-Control-Allow-Headers”, “Content-Type, X-CSRF-Token”)
w.Header().Add(“Access-Control-Allow-Methods”, “POST, OPTIONS”)
w.Header().Add(“Access-Control-Expose-Headers”,
[Golang] Cloud Runで構造化ログを出力できるように実装してみた
## やったこと
* goの標準log出力をGCPの構造化ログのフォーマットで出力するようにしてみた。
* Cloud Runにデプロイして確認してみたところ無事ログが各ログレベルで出力されるようになった。
* 標準logライブラリのファイル名表示などされなくなったが、ログの出力をgrepすれば調査はできるので一旦よしとします。## 課題
* サービス運用では同時に複数のアクセスが考えられるため、traceId等でログを追跡できるようにする必要があります。アクセスがたまにしかないようなフェーズではいいかもしれないけど、`X-Cloud-Trace-Context`を使用してリクエストとログを一意にできるようにすることは必須だと思うので今後やる。
* Cloud loggingなどの仕組みをつかってERRORのログをSlackに通知する仕組みとか作ってみようと思います。## 内容ははてなブログに掲載してます
https://moritomo7315.hatenablog.com/entry/golang-gcp-log-output
GolangにORM導入(go-pg migration編)
#はじめに
GolangのORMであるgo-pgの導入です。本記事ではgo-pgのチュートリアルに沿ってマイグレーションを実行します。
※go-pgは現在メンテナンスモードのため、bunへの移行が推奨されています。今から学ばれている方はbunを利用することをお勧めいたします。私は諸事情があり、あえてgo-pgで開発をしています。#環境情報
PC:Mac(CPUはintel製)
Go:1.17.6 ←Goのver大事。versionは1.16以降をインストールしてください。
開発エディタ:Visual Studio Code#ディレクトリ構成
“`shell:ディレクトリ構成
~/go/src/go-pg-migrate $ tree
.
├── docker-compose.yml
├── examples
│ ├── 1_initial.go
│ ├── 2_add_id.go
│ ├── 3_seed_data.go
│ └── main.go
├── go.mod
└── go.sum1 directory, 7 files
“`#Hands-
【Go言語】time.Timeをjsonでunixtimeを返しつつ、time.Timeの型でGCP/DataStoreに保存する
# 概要
掲題の通りです。
ニッチな内容なので需要ないと思いますが、自分の備忘用としてのpostになります。# 課題
普段、Webサーバー側の開発はGAE/Goを利用しており、特に指定がない限りDBはDatastoreを利用しています。
ただ JSONの取り扱いでよく困るのが `time.Time` の挙動です。
この子、何も指定がない場合は `RFC3339` 形式の文字列としてJSONに格納されます。“`go
import (
“time”
“encoding/json”
)type Hoge struct {
ID int64 `json:”id” datastore:”-“`
Name string `json:”name” datastore:”name”`
CreatedAt time.Time `json:”createdAt” datastore:”createdAt”`
}var hoge := Hoge {
ID : 1,
Name : “te
Goの環境変数読み出しについて
環境変数をセットする際に、いくつかパターンがあるなと思ったのでまとめます。
# 基本
“`:basicEnv.go
package mainimport (
“os”
“fmt”
)func main() {
os.Setenv(“ENV”, “debug”)
env := os.Getenv(“ENV”)
fmt.Println(env)
}
“`# `joho/godotenv`
“`:.env
ENV=debug
“`“`:dotEnv.go
package mainimport (
“os”
“fmt”
“log”
dotenv “github.com/joho/godotenv”
)func main() {
if err := dotenv.Load(); err != nil {
log.Fatalln(err)
}
env := os.Getenv(“ENV”)
fmt.Println(env)
}
“`#
# 【Go】無名関数について理解したこと
無名関数ワカランの状態だったので理解を整理してみました。
## 用語の理解しよう
| 無名関数 | func 予約語の後に名前がない関数リテラルが表す関数値 |
| — | — |
| 関数リテラル | 関数値を表す式 |さらに理解を深めるため無名関数を利用した簡単なコードを書いてみました。
“`go
package mainimport “fmt”
func main() {
fmt.Println(“Hello, 世界”)
f := func() string { return “Hello, 世界” }
fmt.Println(f())
}
“`[https://go.dev/play/p/y-kmWRvL719](https://go.dev/play/p/y-kmWRvL719)
無名関数を代入した変数 `f` を用いて関数 `f()` の戻り値である文字列を `fmt.Println()` の引数に渡しています。これだけでは無名関数のメリットは感じられず、ややこしいコードを書いてる感覚になります。なので以下から書籍『プログラミング言語
0埋めの文字列にする
## やったこと
go言語で0埋めの関数なかったのでつくっった。
テストコードとか書いてないので確実に動くかはわかんないけど多分大丈夫(適当)“`golang
package mainimport (
“errors”
“fmt”
“strconv”“github.com/labstack/gommon/log”
)func main() {
n := 1000
width := 3
var s string
s, err := padNumberWithZeros(n, width)
if err != nil {
log.Error(“err : “, err)
return
}fmt.Println(s)
}// padNumberWithZeros : 数理をセロで埋めます
// n : 埋めたい数値
// width : 桁数
func padNumberWithZeros(n int, width int) (s string, err error) {
l := len(strconv.Itoa(n))
Go言語・SendGrid・REST APIでお問い合わせメール送信API
##概要
Go言語を使って、Jsonファイル形式で送られてきたデータをメールで送信する。
モバイル開発において、お問い合わせフォームの内容をWebを使って送信する必要があったので、モバイル側から送られてきたデータをWebを通してメール送信をするプログラムを作成した。
OSはWindows###参照した記事
https://qiita.com/katekichi/items/d94e078b376151858ca4
##事前準備
まずメール送信を肩代わりしてくれるサービスSendGridを登録する必要がある。
申請をして、早くて数時間、遅くても1営業日で審査は終わる。SendGridは月12,000通までのメール送信なら無料で使える。https://app.sendgrid.com/
審査が通ればログインしてAPIキーを所得。
Settings → API Keys → Create API Key(青いボタン)を押す。Permission はとりあえず Full Access で大丈夫。
AP
Go言語を0から習得してWeb開発をする
##基本このサイトだけで大丈夫
https://leben.mobi/go/このサイトで学習を進めれば入門レベルからWeb開発まで習得できます。
ただ一部古い部分があって、現在ではエラーが起きてしまう可能性のあるプログラムやコマンドがありました。本記事ではそういったような、私がこのサイトで学習していた際に必要になったその他の情報や備忘録を書いていきます。##Web開発編で出てくるデータベースの構築と操作
https://prog-8.com/docs/mysql-env-winこちらはprogateのサイトになっております。Windows環境と書いてありますが、Mac用のリンクもこのページにあります。このサイトを見るのはWeb開発編に入った後で大丈夫です。
##実行でエラーが起きたので備忘録
###Web開発編「JSON形式で外部設定ファイルを作成・利用する方法」で起きたエラー その1
~~~
\Go\goWeb> go run main.go
build command-line-arguments: cannot find module for path _/C_
【個人開発】Githubのプロフィールに、Qiita・Zennの記事などを一覧表示させる、Github Actionsのアクション作ったよ!
# 宣伝
GithubのプロフィールはREADMEによって管理できることはご存知かと思います。
[プロフィールの README を管理する – GitHub Docs](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/customizing-your-profile/managing-your-profile-readme)そのREADMEにて、Qiita・Zennで書いた記事や、connpassの参加イベントを取得することで、最新のアクティビティを表示したいという要望を叶えるのが本アクションです。
以下のようなプロフィールを作ることが出来ます。
# 【Go】一人コードリーディング会を始めます。(4回目)
## はじめに
元ネタはtenntennさんの伝説カンファレンスの一部になります。
[https://www.youtube.com/watch?v=X0tzCL5gqr8](https://www.youtube.com/watch?v=X0tzCL5gqr8)コードリーディング会とは何人かで同じコードを各々で読んで、発見を共有して理解を深めましょう!というのが趣旨と理解しています。しかし知人で一緒にGoを学んでくれる人も見つけられず、悲しくも一人でコードリーディング会を開催することになりました。
やってみたら読めない箇所が多すぎました。1文ずつ嚙み砕いてGo言語の理解を深めていく作業になりました。その過程の不明点と解釈を記事にして公表していこうと思います。僕と同じ程度の理解度(初学者)の方が、不明点を理解するきっかけになればうれしいです。
※1日の学びを1記事にするので情報量は少なめです。徐々に情報量を増やして有益な記事を書けるよう頑張ります。
※個人の解釈を投稿する記事なので誤った情報が多々あると思います。申し訳ありませんがご了承ください。誤りについてはご指摘いただけるとう
【Go】組み込み関数makeとnewの違いについて
Goには、組み込み関数(元々言語に用意されている関数のことです。)としてmakeというものと、newがあります。
それぞれ、スライスや構造体など何かを『生成』するのに使用します。使い方は多岐に渡りますが、何より慣れないうちは、
>「あれ、この場合はmakeか?それともnewの方か?どっちだ。。。」と混同される方も多いかと思います。
今回はそれらの違いについて、ざっくりと解説いたします。# 最初に結論から
組み込み関数makeは、**「スライス(slice)」**、**「マップ(map)」**、**「チャネル(channel)」** のデータ構造体を生成するために使用します。
そして組み込み関数newは、**指定した型のポインタ型**を生成するために使用します。# 一つずつ解説
## make
まず、上記でも「述べたように、組み込み関数makeは、**「参照型」** と呼ばれる、「スライス(slice)」、「マップ(map)」、「チャネル(channel)」の3つデータ構造を生成することができます。
makeによる参照型生成のパターンは以下の通りです。| 呼び出し形式 |
区間選択アルゴリズム
#何を書いているか
区間選択アルゴリズムの備忘録。
C++とGoで記述。
プログラミングスキルチェックの問題で選択アルゴリズムを使って解く問題に出会ったので。#コード
ここでは終わりと次の始まりがつながらない区間を選択するパターン。
つながった場合も選択可能とする場合はコードの示した箇所を等比較にすればよい。C++版
“`C++
#include
using namespace std;
int main() {
// cin.tie(0);
// ios::sync_with_stdio(false);int N;
cin >> N;
vectorX(N), L(N);
for (int i = 0; i < N; i++) { cin >> X.at(i) >> L.at(i);
}vector
> p(N);
for (int i = 0; i < N; i++) { p[i].firs
Go言語の環境設定
# Go言語の環境設定(mac)
### 1. インストール
“`
$ brew install go
$ go version
“`
`go version`で`go version ~~`とバージョンが出てきたらインストールできている証拠.### 2. PATHを通す
zshの方は`.zshrc`, bashの方は`.bashrc`に以下を追記.“`
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$GOPATH:bin
“`
(ちなみに、`.zshrc`や`.bashrc`は`/Users/(ユーザー名)/`にあります.
vimだのopenだのfinderから探すだのしてみてください.)
また, これらのファイルは隠しファイルなので, finderで見つけたい方はfinder上で`control`+`command`+`.`を押下してください. 隠しファイルが列挙されます.(もう一度押下すれば元に戻せます)なんとこれだけ. 意外と難しいようで簡単なようで, こういった文献を探すのが下手だとそれ
DDDを意識したgolangでの実装
本記事はDDDについて超わかりやすく記述されている以下書籍を読み、golangではどうなるかを記載したものです。
[ドメイン駆動設計 モデリング/実装ガイド](https://little-hands.booth.pm/items/1835632)
—
## ユースケース
例として、タスク管理アプリケーションを考える。・タスクを登録する
・タスクを延期する
・タスクを完了する—
## オブジェクトの生成や更新時に守らなければいけないルール(ドメイン知識)・タスクステータスは未完了/完了の2種類でタスク作成時は未完了ステータス
・タスク完了すると完了ステータスとなり、ステータスは戻せない
・タスクの期日は1日ずつ、3回まで延期できるDDDで重要なのは、ドメイン層にドメイン知識を寄せて、ドメイン知識がわからない途中参入した他のエンジニアにもドメイン知識の遵守を強制できる状態にすることである
—
駄目なケース(ドメイン知識がドメイン層にない)を見てみる。
ドメイン層
“`go
type Task struct {
ID str
マイクロサービスのヘルスチェック実装において依存先への負荷を軽減したい
## 概要
この記事は、ヘルスチェック実装で依存先の負荷を減らすためにキャッシュを検討してみた話と、Goで実装する場合は https://github.com/alexliesenfeld/health が便利そうなので実装してみた、という記事です。## はじめに
マイクロサービスにおいてヘルスチェック機能を実装する際は、DB等の正常性確認に加えて依存先のサービスの正常性も含めて確認したくなります。
そのような実装を加えた際に問題になるものの一つとして、**依存先のサービスへのリクエスト量が増える**点があります。原因としては次のようなものがあると思います。– KubernetesのReadiness Probeによって高頻度に実行される
– 自分自身も多くのサービスの依存先となっており、ヘルスチェックのリクエストを多く受けるそのような理由により依存先へのリクエストが増えた際に問題になるのが次のような点です。
– ヘルスチェック起因のリクエストが負荷になる
– 依存先サービス側のログにヘルスチェック起因のものが増え調査しづらくなるマイクロサービスにおいて負荷への対
RaspberryPi4BにGoを入れる。
#概要
ちょっとしたツールを使おうと思ったらGoで書かれてたからGoを入れようとしてハマった話。#手順
好きなところに“`wget https://golang.org/dl/go1.17.7.linux-armv6l.tar.gz“`でダウンロード。
“`sudo tar -C /usr/local -xzf go1.10.1.linux-armv6l.tar.gz“`で展開。今回は“`/usr/local“`を指定。
“`~/.bashrc“`に“`export PATH=$PATH:/usr/local/go/bin“`を追記してパスを通す。
“`source ~/.bashrc“`で適用。#ところが…
“`go version“`が通らず“`no such file or directory“`が返る…。
あちこち調べるもののピンとこない。
なんとなく“`uname -m“`を打ってみると“`aarch64“`と返ってきた。ここで気がついた…参考ページが結構古くてターゲットも**RaspberryPi**としか書いていないことに。