- 1. Go で AtCoder を半年やってみたのを思い出す
- 2. 自作RDBのためにオンディスク 並行Skip List を作ってみた
- 3. 【Golang/gin】いつも使ってるgin.Contextの中身、覗いていきませんか?
- 4. Docker x Golang x PostgreSQL で環境構築
- 5. S3に保存されているCSVファイルをjsonレスポンスで受け取る
- 6. 【Go】テーブルをcollyでスクレイピングしてCSV出力する
- 7. Go言語の「アプリケーション なになに への接続を許可しますか? 」が何回も出てくる問題 (mac)
- 8. 【Go】# command-line-arguments undefined: への対応
- 9. 2022年の振り返り(KPT)と今年の目標
- 10. dockerを安くデプロイしたい【備忘録】【読みづらい】
- 11. Get started with Fx
- 12. gqlgen 1対多のデータの取得【実装編-Part3】
- 13. 【小ネタ】AWS CDK を使って ECS に LoadBalancer に独自ドメインを設定した話
- 14. Dockerで始めるgRPC
- 15. GqlgenでDB(postgreSQL)の導入【実装編-Part2】
- 16. GoとGraphQLでサーバー実装 【実装編-Part1】
- 17. GoとGraphQLでサーバー実装 【環境構築編(Docker)】
- 18. 【小ネタ】Lambda の Dockerイメージをコードから作成した話
- 19. 【Golang】Print系関数の違い
- 20. 自作言語にdefer文を実装した(がGoと微妙に挙動が違う)
Go で AtCoder を半年やってみたのを思い出す
# はじめに
おはこんハロチャオ!
正月実家でやることがなく暇すぎるので昨年半年の振り返りと言う意味も込めて Go で AtCoder をやった感想をまとめようと思います。正月らしく(?)アニメを観ながらだらだら書きます。
![Screenshot from 2023-01-04 03-31-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088500/671ff032-d891-3d80-58ad-e6c62b2d8384.png)
# Go で始めた理由
2022年の4月からコードを書くバイトを始めました。そこで Go を使うかもと言われていたので勉強しようと思っていたところ、それと同時期に複数の知人から AtCoder を勧められました。それ以前には Python しか書いたことがなかったのですが、実行速度が気にかかったのと、どうせなら新しい言語を勉強しようということで Go で始めてみることにしました。
# アカウント作成時
レートの画像を見てわかるとおり実はアカウントを作成したのは202
自作RDBのためにオンディスク 並行Skip List を作ってみた
どうも ryo_grid です。
今回は自作RDBMS [SamehadaDB](https://github.com/ryogrid/SamehadaDB) の開発の中で、インデックスとして用いるためのコンテナとして、オンディスク並行Skip Listなるものを作ってみたので、それについて書きたいと思います。
(以降、文体が変わりますが気にしないで下さい)## はじめに
– 本文書は筆者がオンディスク並行Skip Listを設計・実装してみた中で得た、知識や知見の共有を目的とするものである
– 英語圏含めて、本文書で共有する種の情報がまとまった形で提供されているWebページ等は筆者が探した範囲で見当たらなかったので、その点で、価値のある知識・知見として、多くの人の役に立つものとなれば幸いである# Skip Listについて
## Skip Listとは
– いわゆる Key-Value ストアを実現する確率的なデータ構造
– 他の同様の機能性を提供するデータ構造に対し、”確率的”というところが特徴的
– O (log N) でデータの探索(取得)、挿入、削除が可能
【Golang/gin】いつも使ってるgin.Contextの中身、覗いていきませんか?
# Step Up Gin! gin.Contextの中身を覗いてみよう!
GolangでGinを使ってAPIサーバーの開発をしていると必ず目にするのがgin.Contextという構造体。
実装されているコードに書かれているgin.Context説明を訳すとこのように紹介されています。
>Context is the most important part of gin. It allows us to pass variables between middleware, manage the flow, validate the JSON of a request and render a JSON response for example.
> Contextはginのフレームワークの中でも最も重要な部品の一つです。
> gin.Contextを使うことで、ミドルウェア間での変数の受け渡しや、処理の管理、JSONリクエストのバリデーション、JSONレスポンスの出力等が可能になります。APIサーバーを立てるとなると、メタ情報の管理やリクエストのデータの受け渡しが必要になる
Docker x Golang x PostgreSQL で環境構築
# 概要
現場でGo言語の使用する予定があるのでDockerを使用して環境構築をしてみました。
ディレクトリ構成などはブログ記事など参考にしました。
(書籍なども読んでいってデファクトを見つけていきます。)ソースコードだけ見たいという方は[こちら](https://github.com/suzu12/docker-go-postgresql-sampleapp)から見ることができます。
# 環境
– go 19.1
– PostgreSQL 15.1
– macOS Monterey version12.6# 対象読者
– docker x Go x PostgreSQL の環境で簡単に動かしてみたい方
– dockerでの環境構築を試そうとされている方# 目次
– [概要](#概要)
– [環境](#環境)
– [対象読者](#対象読者)
– [目次](#目次)
– [ディレクトリ構成](#ディレクトリ構成)
– [Docker](#docker)
– [cmd](#cmd)
– [sampleプログラム](#sample-プログラム)
– [まとめ](#まと
S3に保存されているCSVファイルをjsonレスポンスで受け取る
## 概要
この記事では、S3上に保存されたCSVファイルをLambdaで取り出し、jsonで返す方法を紹介します。
HTTP通信の窓口にはAPIGatewayを使用しています。
APIGatewayのイベントをトリガーにLambdaからS3へアクセスします。この記事では、S3のポリシー設定、Lambdaのロール設定、LambdaとAPIGatewayの設定は割愛し、Lambdaの実装にフォーカスします。
## 前提条件
CSVファイルは以下のものを使用しました。
全体のソースコードは下に載せます。
またAWSサービスの認証はそれぞれの環境でお願いします。“`csvs:hoge.csv
“name”,”age”
“fuga”,”22″
“hoge”,”20″“`
## `Lambda`の実装
実装には`Go`を用います。
大まかに以下の流れです。
1. s3にアクセスするためのクライアントを作成
2. s3からオブジェクトを取得する
3. オブジェクトを構造体にマーシャルする
4. 全ての処理が成功したらレスポンスを返す以下で詳しく説明していきます。
###
【Go】テーブルをcollyでスクレイピングしてCSV出力する
## やりたいこと
こんなテーブルをスクレイピングして
Excelでこんな感じで開きたい。
テーブルはNext.jsで作り、ローカル(`http://localhost:3000`)で動かしている。
“`index.tsx
import type { NextPage } from ‘next’const Home: NextPage = () => {
const table1 = [{ id: “1”, fn: “aaa”, l
Go言語の「アプリケーション なになに への接続を許可しますか? 」が何回も出てくる問題 (mac)
「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)
を読んでいた時に少しハマったのでメモしておきます.
[本: 詳解GO言語WEBアプリケーション](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3Go%E8%A8%80%E8%AA%9EWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%B8%85%E6%B0%B4-%E9%99%BD%E4%B8%80%E9%83%8E/dp/4863543727)
# 問題
「詳解GO言語WEBアプリケーション」の本(p127 kindole版はp130?)のコードを実行した際に
**アプリケーション“main”へのネットワーク受信接続を許可しますか?**
と出る.
この 承諾ボタン を押すのが一回きりならいいのですが, ctrl + c でプログラムを終了して,
再度プログラムを走らせる度に出てきます.
![スクリーンショット 202
【Go】# command-line-arguments undefined: への対応
### はじめに
簡単な動作確認時にいつも忘れそうになるのでメモ。
### やりたいこと
1. 以下のようにsample-app内にmain.goとanother.goを作る。
2. main関数内でanother関数を呼び出す。
3. `go run main.go` コマンドを実行“`
sample-app
└ main.go
└ another.go
└ go.mod
“`“`main.go
package mainimport “fmt”
func main() {
fmt.Println(“main関数です。”)
another()
}
“`“`another.go
package mainimport “fmt”
func another() {
fmt.Println(“another関数です。”)
}“`
### 出力されるエラー
“`
# command-line-arguments
./main.go:7:2: undefined: another
“`### 解消法
実行時のコマンドライン引数
2022年の振り返り(KPT)と今年の目標
明けましておめでとうございます。Esper0328です。
昨年は1月から無職で6月半ばにIOTベンチャーに就職して働くという一年でした。
昨年の振り返り(KPT)と今年の目標を書きます。# 振り返り
## Keep
一言で言うと振返りを継続的にしつつ勉強を1年続けられたのが良かったです。
* KPTを毎週実施したおかげで生活のリズムがとても良くなった
* 前職までは月80H近く残業しており新しいことをやろうという気力が湧かず
* 時間に余裕ができ、少し先のことをやっておこうと思えた
* 意思決定も早くなり、何かトラブルがあっても悪化する前に手を打てていた
* 昨年は計画的に大量に勉強した
* **読んだ専門書の数 7冊**
* [プログラミング言語Go](https://www.maruzen-publishing.co.jp/item/?book_no=295039)
* 練習問題135 問をテスト書いてプログラミングした
* 仕事でテストを書くのが苦にならなかった
* [Distributed Services Wi
dockerを安くデプロイしたい【備忘録】【読みづらい】
# はじめに
ローカルでdockerを用いて簡単なアプリケーションを作った。
それをデプロイしようと思ったのだが、なんせ高い。
amazonのVPCとか使うと高そう。なのでそれをどう安く公開できるのかを探りながら実装してみた。
そして、備忘録なので読みづらいですよ。
もくじを見ながら読むと読みやすいかも。# 決定方針メモ
– deployするものはすでに作成済みのものを使う。
– AWSは使わない
– すでにできているものを使うのは本質を理解できづらいし、何より高い
– さくらインターネットを使う
– https://vps.sakura.ad.jp/
– 安いし、メンターの人におすすめされたのでとりあえず
– 本番環境でdockerは使わない# こんどやるメモ(今回はやらない)
– domain設定
– ロードバランサー設定
– CICD
– サーバー間通信
– https://vps.sakura.ad.jp/feature/lnw.html
– applicationの日本語化
– なんかmysqlに日本語かとうろくできない。
Get started with Fx
※ソース記事は[こちら](https://uber-go.github.io/fx/get-started/)
ここではFxの基礎を紹介する。このチュートリアルで、以下を行う。
– 空のアプリケーションを開始
– HTTPサーバーを追加
– サーバーにハンドラーを登録
– アプリケーションにロギングを追加
– ハンドラの結びつきを離すようリファクタリング
– サーバーに別のハンドラーの追加
– 実装の一般化初めに、チュートリアルの残りのためにセットアップをする。
1. 新しい空のプロジェクトを始める。
“`bash
mkdir fxdemo
cd fxdemo
go mod init example.com/fxdemo
“`
1. 最新バージョンのFxをインストールする。
“`bash
go get go.uber.org/fx@latest
“`# 最小限のアプリケーションの作成
Fxアプリケーションのhello-world相当のものをビルドしよう。このアプリケーションは、一連のログを出力する以外はまだ何もしない。
1
gqlgen 1対多のデータの取得【実装編-Part3】
# 1対多のデータの取得
:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::## 今回はPart4になります。
**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**
前回:公式ドキュメントを用いて作成した物にデータベースの導入を行いました。
https://qiita.com/shion0625/items/7448d39451a626e453bd
## この記事の内容
前回までに作成Todoアプリを改修していきます。
– createUserのmutationの追加
– usersのqueryを追加
– usersからそのユーザの複数のTodoを取得する## Github Repo
この記事で紹介するコードはGithubに置いています。**Part4までの切り取り**
https:
【小ネタ】AWS CDK を使って ECS に LoadBalancer に独自ドメインを設定した話
# 概要
`AWS CDK for Golang` を使って `AWS` の `ECS` のクラスタにロードバランサを設定し、そのロードバランサに独自のドメインを設定します。
# この記事で伝えたいこと
* `AWS CDK` を使うことで、簡単にロードバランサの設定を行うことができる
# 課題を解決する技術、手法
こんな感じのコードを書きます。
“`go
import (
“fmt”“github.com/aws/aws-cdk-go/awscdk/v2/awscertificatemanager”
“github.com/aws/aws-cdk-go/awscdk/v2/awsec2”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecr”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecs”
“github.com/aws/aws-cdk-go/awscdk/v2/awsecspatterns”
“github.com/aws/aws-cdk-go/awscdk/v2/awsel
Dockerで始めるgRPC
# はじめに
dockerを使ったgrpcをまとめたいと思います。
内容は、クイックスタートに準拠しています。https://grpc.io/docs/languages/go/quickstart/
レポジトリーを作りました。
https://github.com/sugiyama404/practice_grpc
## gRPCとは
gRPCとは、http2とバイナリを使用した高速通信可能なgoogleが開発したPRCフレームワークです。
![Qiita](https://grpc.io/img/landing-2.svg)
## プロトコルバッファとは
構造化データ定義し、シリアライズするためのオープンソースメカニズムです。
protocコマンドを打つことで、goファイルを自動生成します。# コーディング
## Dockerをbuild“`console:ファイル構成
.
├── client
│ ├── Dockerfile
│ └── go_grpc
│ └── bin
│ └── go_starter
├
GqlgenでDB(postgreSQL)の導入【実装編-Part2】
# GqlgenでDB(postgreSQL)の導入
:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::## 今回はPart3になります。
**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**前回:公式ドキュメントを参考にGraphqlのスケルトンプロジェクトを作成いたしました。
https://qiita.com/shion0625/items/be454f94a99cac461d5e
## この記事の内容
前回作成した公式のドキュメントで作成したプロジェクトにデータベースを導入していきます。
– migrationファイルの作成
– gormを用いたデータベースの操作## Github Repo
この記事で紹介するコードはGithubに置いています。**Part3までの切り取り**
GoとGraphQLでサーバー実装 【実装編-Part1】
# gqlgenを用いてGoサーバを構築する
:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::## 今回はPart2になります。
**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**
前回:Dockerを使用してGoとPostgreSQLの環境構築https://qiita.com/shion0625/items/0f4e919c6b7eb2092233
## この記事の内容
実際にgqlgenを使用してGraphQLサーバを立ち上げて動かします!## Github Repo
この記事で紹介するコードはGithubに置いています。
### Part2までの切り取り
https://github.com/shion0625/gqlgen-todos/tree/part2
## 最初にd
GoとGraphQLでサーバー実装 【環境構築編(Docker)】
# DockerでGoとPostgreSQLの環境構築
:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::## この記事の内容
この記事はGo,GraphQL,PostgreSQLと使用してサーバの実装の**Part1**になります。
今回はDockerを用いてGoとPostgreSQLの環境構築を行います。## Github Repo
この記事で紹介するコードはGithubに置いています。https://github.com/shion0625/gqlgen-todos/tree/part1
## dockerファイルの作成
### 今回のディレクトリ構成
“`
gqlgen-todos
├── docker
│ └── go
│ └── Dockerfile
└── docker-compose.yaml
“`#### Dockerfile
Goのイメージには軽量なalpineを使用しています。– **git:** go getが内部的に呼び出し
【小ネタ】Lambda の Dockerイメージをコードから作成した話
# はじめに
[Releaseタグ作成からEKSへのデプロイを自動化した話](https://qiita.com/ijufumi/items/c8c54c2295baf04113b2) でやった内容のうち、 `Lambda` に焦点を当てた内容です。
載せているコードは一部だけなので、全体を見たい方は上記の記事から辿ってください。
# 環境
* `Kubernetes`: `1.24`
* `AWS CDK for Golang`: `v2.56.1`# やったこと
## Lambda用のコードを準備
`lambda` ディレクトリに、必要なファイルを用意します。
`Dockerfile` のみ載せています。
他は、`Github` リポジトリを参照。* `Dockerfile`
“`Dockerfile
FROM public.ecr.aws/lambda/python:3.9COPY . ${LAMBDA_TASK_ROOT}
COPY requirements.txt .
RUN pip install –upgrade pip && pip3
【Golang】Print系関数の違い
# 出力系関数の違い
## fmtパッケージに含まれるPrint系関数
golangを勉強している中で文字列を出力する関数を調べた所、標準パッケージに複数種類含まれていることがわかった。
まだまだ初心者の自分ではどの関数が今書いているコードに適切な関数か調べる必要があったため、自分の備忘録も含めて記事にしようと思う。:::note warn
警告
下記まとめ内容は、公式ドキュメントをもとに書き出したものです。
詳細については、各段落記載の公式ドキュメントをご参照ください。
:::## 全体像
Print系関数についてしらべたところ、ざっくりと下記種類が存在していた。
後述にて、それぞれの関数について記載する。
“`go:Golang:fmtパッケージ
// (1)標準出力へ出力する関数
func Print(a …any) (n int, err error)
func Printf(format string, a …any) (n int, err error)
func Println(a …any) (n int, err error)// (2)書
自作言語にdefer文を実装した(がGoと微妙に挙動が違う)
# TL; DR
– 本家(Go)は関数呼び出しのみ遅延
– 自作言語の実装では式の評価全体を遅延してしまった# はじめに
Go言語の `defer` 文を使うと、関数を抜ける際に必ず処理を実行することが可能です。
panicした場合も後処理の実行が保証され重宝しています。“`go
file, err := os.Open(“file.go”)
if err != nil {
// …
}
defer f.Close()
“`https://go.dev/ref/spec#Defer_statements
便利なので拙作の言語 [Pangaea](https://github.com/Syuparn/Pangaea) でも `defer` 文を導入しています。
(Pangaea言語自体は過去の記事でも紹介しておりますので、よろしければご覧ください)
https://qiita.com/Syuparn/items/87cafc7fd206016a0f8d
しかし、先日 「Go Quizzes 101」というGoの文法のクイズ[^quiz]を解いて