- 1. Go言語を学んでみる #3
- 2. Go言語を学んでみる #2
- 3. Go×vscodeを使用してtestingを実行する際の環境変数を設定する
- 4. ざっくりDDD・クリーンアーキテクチャにおける各層の責務を理解したい②(インフラストラクチャ層・プレゼンテーション層編)
- 5. go基本構文メモ
- 6. GoとSpannerでフラグをビット管理
- 7. Golangのデータフレームライブラリでデータの結合処理
- 8. 【Go】mapや構造体を読みやすい形で標準出力させたい!!
- 9. 【Go】log.Printとlog.Printlnの違い (実はどちらも改行される)
- 10. Go言語を学んでみる #1
- 11. Telnetが話題になってたのでGoで受信して表示するをやっていきした日記
- 12. 現場で使いそうなので、GoのAPI入門する
- 13. GoでWebアプリケーションを作る(6)ー構造体
- 14. Go言語でOG:image用の画像を生成するAPIを作成してみた
- 15. Docker imageからDockerfileを抽出する
- 16. GoでPDFファイルを作成し、Zip化する
- 17. GoでPDFを作成する
- 18. Golangでファイルをzip化する
- 19. GoでGraphQLを導入する
- 20. [Go]並行処理
Go言語を学んでみる #3
for文等の繰り返し処理、分岐処理のあたりのまとめ。
# For
“`
for i := 0; i < 10; i++ { sum += i } ``` 値の初期化・条件式・後処理の部分は割と他の書き方と一緒。 違いはカッコが無いくらい? ``` func main() { sum := 1 for ; sum < 1000; { sum += sum } fmt.Println(sum) } ``` 条件式以外は任意で、省略することも可能。 ``` func main() { sum := 1 for sum < 1000 { sum += sum } fmt.Println(sum) } ``` セミコロンまで省略できちゃう。便利。 これでC言語にある`while`と同じような処理ができる。
Go言語を学んでみる #2
# Go Tour
ブラウザ上でもできるけど、Go言語をインストールすればローカルでもGo Tourが実行できるらしい。せっかくだからローカルでやってみようかな。
ダウンロードは済んでいるので、コマンドラインで以下のコマンドを実行。
“`
go tool tour
“`
動かない。
もう一つ記載されているコマンドを実行。“`
go get github.com/atotto/go-tour-jp/gotour
gotour
“`やっぱり動かない。
仕方ないので別サイトを調べてみる。https://learning-collection.com/go-tour%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%EF%BC%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E3%82%A2%E3%83%AD%E3%83%B3%EF%BC%89/
このサイトのやり方でうまくいきました。
完了すると、ブラウザ上にA Tour og Goが立ち上がる。
# Go言語の構成
パッケージ(`package`)で
Go×vscodeを使用してtestingを実行する際の環境変数を設定する
# 初めに
Go×vscodeを使用してtestingを実行する場合に下図のような「run test」などが表示される。
![スクリーンショット 2023-09-15 12.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/14fba813-5d17-c3f3-bc12-bb86658b26d9.png)その際に環境変数する必要があったので方法を記載する。
# やってみる
まず任意のディレクトリにenvファイルを作成する
“`
% touch .env
“`envファイルに任意の変数を定義する。
“`.env
ENV=local
“`vscodeの設定ファイルを開く。
macの場合は`command` + `,`で設定ファイルを開く`go configuration`で検索して`setting.json`を編集する
![スクリーンショット 2023-09-15 12.42.43.png](https://qiita-image-store.s3.ap-no
ざっくりDDD・クリーンアーキテクチャにおける各層の責務を理解したい②(インフラストラクチャ層・プレゼンテーション層編)
# 概要
弊社で開発中のプロダクトは、ドメイン駆動設計とクリーンアーキテクチャを組み合わせた設計となっています。
これまでフロントエンドの開発を担当することが多かった中で、golangでのAPI開発を担当した際に、「この処理はRepositoryに書くべき?」「Usecaseにこの処理を書いたら責務を持たせすぎ?」「Domain ServiceとUsecaseはどう分ける?」など迷うことが多々ありました。そこで、これら設計に関する考え方を整理するために具体的な実装を踏まえてこの記事を書いています。
この記事は第二回です。第一回[(記事はこちら)](https://qiita.com/kotobuki5991/items/22712c7d761c659a784f#%E3%81%BE%E3%81%A8%E3%82%81)ではドメイン層・ユースケース層について触れています。# DDD(ドメイン駆動設計)とは
> ドメインの専門家からの入力に従ってドメインに一致するようにソフトウェアをモデル化することに焦点を当てるソフトウェア設計手法である。
>[ドメイン駆動設計](https:
go基本構文メモ
すぐ見れるようにメモしておく
## for
“`go
for i := 0; i < 10; i++ { sum += i } ``` ## if ```go if x < 0 { return sqrt(-x) + "i" } ``` ### if short style ```go if v := math.Pow(x, n); v < lim { return v } ``` ### if and else ```go if v := math.Pow(x, n); v < lim { return v } else { fmt.Printf("%g >= %g\n”, v, lim)
}
“`
https://go-tour-jp.appspot.com/flowcontrol/7## Switch
### switch
“`go
switch os := runtime.GOOS; os {
case “darwin”:
fmt.Println(“OS X.”)
case “linux”:
fmt.Print
GoとSpannerでフラグをビット管理
## はじめに
ふと大量のフラグを持っているテーブルを見かけて、どうにかできないかなーと考える機会がありビットで管理することで保守性が高くなるのではと思い考えの整理とアプトプットのため記事を書きました。
## 利用言語/ツール
– Go
– Spanner## サンプルコード
https://github.com/boxkot11p/bit-flag-pattern
## bool値でのフラグ管理
テーブル定義を行い際にフラグを持たせるとすると下記のようなパターンが一般的だと思います。
“`sql
CREATE TABLE Users (
UserId STRING(64) NOT NULL,
Name STRING(128) NOT NULL,
EntranceNormalFlag BOOLEAN NOT NULL,
EntranceSpecialFlag BOOLEAN NOT NULL,
EntrancePremiumFlag BOOLEAN NOT NULL,
) PRIMARY KEY(UserId);
“`カラムが何の意味を持っ
Golangのデータフレームライブラリでデータの結合処理
Golangのデータフレームライブラリ [QFrame](https://github.com/tobgu/qframe)を扱っています。
高速でメソッドチェーンができるのが気に入っているのですが、込み入ったことをしようとすると複雑なコードを書かなければならなくなり、割と大変でした。
この記事では2つのデータフレームの結合を行いたい場合のなんとかやってみたコードを書きました。
サンプルデータのtestpidとteststockを左結合したいです。
要するに、teststockに品名と型式の情報をtestpidから持ってきたいのです。“`go
package mainimport (
“fmt”“github.com/tobgu/qframe”
)var (
testpid = qframe.New(map[string]interface{}{
“品番”: []string{“AAA-100”, “AAA-200”, “AAA-300”, “BBB-100”, “BBB-210”},
“品名”: []string{“製品1”, “製品2”, “製品
【Go】mapや構造体を読みやすい形で標準出力させたい!!
# はじめに
こんにちは、ken です。お仕事ではよく Go を書いています。
突然ですが、コーディングをしているときに「この変数がどんな状態なのか確認したい」と思って、一時的に標準出力することってありますよね。
例えば WebAPI を呼び出すとき、レスポンスがどんな形で送られてくるのかを見たくなる機会は少なくないはずです。
しかし、ただ `fmt.Println` をするだけだとちょっと見にくいときがあります。今回はそれを見やすくする方法を先輩から教えていただいたので紹介したいと思います。# fmt.Println だけだといかに見にくいか
まず、`fmt.Println` だけでの出力がいかに見にくいかを示します。
例として [PokeAPI](https://pokeapi.co/) という ポケモン の情報を呼び出す API を叩いてピカチュウの情報を取り出し、それを `fmt.Println` で標準出力します。“`go
package mainimport (
“bytes”
“encoding/json”
“fmt”
“io”
“net/ht
【Go】log.Printとlog.Printlnの違い (実はどちらも改行される)
# はじめに
こんにちは、kenです。お仕事ではよくGoを書きます。
突然ですが、みなさんは`log.Print`と`log.Println`の違いを即座に答えられますでしょうか。**「log.Printは末尾に改行が入らなくて、log.Printlnは改行が入るんでしょ…」**
私もそう思っていたのですが、実は`log.Print`と`log.Println`はどちらも末尾に改行が差し込まれます。
では一体この2つは何が違うのでしょうか。この記事はそんな小ネタの紹介をしたいと思います。
# ほんとに`log.Print`にも末尾に改行が入るの?
**「`log.Println`の『`ln`』は末尾に改行が入るという意味の『line』から由来しているのでは…?」**そう信じて疑わない人もいるはずなので実例をお見せしようと思います。
次のコードを実行したときには何が出力されるでしょうか。
“`go
package mainimport (
“fmt”
“log”
)func main() {
fmt.Println(“logパッケージ”)
log.Prin
Go言語を学んでみる #1
Go言語を使ってシステム開発してみたいと思ったので、まとめてみる。
参考: https://hnavi.co.jp/knowledge/blog/go/
# Go言語とは
– Googleが開発したサーバサイド言語
– シンプルかつ高速な処理が可能
– YouTubeやメルカリの開発で使用されていて、近年注目が集まっている言語のひとつ# インストール方法
下記リンクからインストーラをダウンロードしてインストール
https://go.dev/dl/# 学習方法
とりあえず基礎は公式サイトを見てみるのがいい感じ。
https://go.dev/learn/「Tour of Go」から、ブラウザ上で学習ができる。日本語にも対応。大変便利。
ロードマップのリンクもメモ。英語ができる人はこのロードマップから勉強するのがいいかも。
https://github.com/Alikhll/golang-developer-roadmap/blob/master/i18n/ja-JP/ReadMe-ja-JP.md
ということで次回から実際に公式サイトで学習したことをいろいろメモ
Telnetが話題になってたのでGoで受信して表示するをやっていきした日記
# いきさつ
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1528962.html
Twitter経由でこんな記事を見かけました。
ある社団法人が公告を行う際に、Telnetという伝統的な技術を使用されたようです。
ターミナルにアドレスとポート番号を打ち込むと、ニフティサーブみたいに文字がパラパラと浮かび上がってきて非常にノスタルジーな気分が味わえました。今回、皆さんが注目されたのはセキュリティの方、具体的には暗号化通信が堅牢でなかったため指摘が多数相次ぎ、法人側が迅速に修正した、という点と、Telnetの是非だったと思うんですけど、僕は
### え!!!なんじゃこれ!すげぇぇ!どうやって受信してんの!?
という部分だったので、Telnetの正体の興味もさながら、Goの練習に簡単な受信ツールを作ってみました。
### Telnetについてのメモ
・Telnetは伝統的な遠隔通信プロトコルである。IPを使い通信を行う
・SSHと同様に遠隔操作を行う事を目的としているが、SSHと異なる点はTelnet自
現場で使いそうなので、GoのAPI入門する
APIの実装やブロックチェーン系のプロジェクトで
Goが現場で使われてるのを良く見るようになりました。
入門しましょう。ChatGPTに書かせます。
# プロジェクトディレクトリと必要なファイルを作成
以下の構造でプロジェクトディレクトリを作成します:
“`bash
mkdir -p go-todo-api
cd go-todo-api
mkdir db
touch docker-compose.yml
touch db/init.sql
touch main.go
“`# Docker Compose ファイルの作成
docker-compose.yml ファイルに以下の内容を記述します:
“`docker
version: ‘3.8’services:
app:
image: golang:1.17
volumes:
– .:/go/src/go-todo-api
working_dir: /go/src/go-todo-api
command: go run main.go
depends_on:
GoでWebアプリケーションを作る(6)ー構造体
こんにちは。
今日は「構造体」についてです。
# 構造体とは
構造体は、任意の定義ずみの型を0個以上まとめることが可能な型です。
例えば、既存の型では収められる量が不足する際に扱います。
int64では、最大約923京`(9,223,372,036,854,775,807)` の京の桁(10^16)まで表せますが、1那由多(10^60)は、表すことができません。
int64をいくつか組み合わせ、このint64は、1の位から。このint64は、垓(がい)の位から。と役割を決めていくことで、1那由多以上を表せる型を定義できます。## 構造体の定義
Go言語では、`type`から始まる形で、名前付きの型を定義できます。
“`go
type <名称> <型>
“`
構造体の定義は、型部分に、予約された表現である、`struct {}`を用い定義します。
(変数に直接代入する構造体の定義方法もありますが、本講義ではふれません。)
“`go
type <名称> struct {
[<名前> <型>] //要素1
[<名前> <型>] //要素2
#…省略
}
“`
Go言語でOG:image用の画像を生成するAPIを作成してみた
# はじめに
おそらく、やい、確実にNode.js系のライブラリを使って作成した方が簡単だと思います
Goでももっと簡単に直感的に作る方法はあると思いますが# リポジトリ
https://github.com/chihiros/example-og-image-api
# まず、はじめにFigmaでレイアウトを決める
1. 1200×630の画像を作成します(なんか1200×630が推奨サイズらしいから)
1. ほか色々とレイアウトを決めましょう
1. フォントの種類・文字の太さ・文字を折り返す長さを決める
1. 今回は910px以上の文字サイズになったら折り返すようにしました
1. タイトル:[` Noto Sans Japanese – Midumu`](https://fonts.google.com/noto/specimen/Noto+Sans+JP) を使っています
1. ユーザー名:[` Noto Sans Japanese – Regular`](https://fonts.google.com/noto/specimen/Noto+S
Docker imageからDockerfileを抽出する
## 目的
Pullしてきたイメージが中で何をしているのかを確認したい場合があるので、今回はその方法を備忘録として残しておく## 方法1 (docker history)
“`bash
docker history –no-trunc| tac | tr -s ‘ ‘ | cut -d ” ” -f 5- | sed ‘s,^/bin/sh -c #(nop) ,,g’ | sed ‘s,^/bin/sh -c,RUN,g’ | sed ‘s, && ,\n & ,g’ | sed ‘s,\s*[0-9]*[\.]*[0-9]*[kMG]*B\s*$,,g’ | head -n -1
“`例
“`bash
root@shoma:/home/shoma/wireguard# docker history –no-trunc ghcr.io/linuxserver/wireguard | tac | tr -s ‘ ‘ | cut -d ” ” -f 5- | sed ‘s,^/bin/sh -c #(nop) ,,g’ | sed ‘s
GoでPDFファイルを作成し、Zip化する
## はじめに
標題通り、GoでPDFファイルを作成し、Zip化する記事です。本記事では、PDFをzipに直接保存する事でディレクトリにPDFファイルを保存しない方法です。## 実装
“`shell:ディレクトリ構成
~/go/src/go_pdf_zip$ tree
.
├── go.mod
├── go.sum
├── main.go
└── sample.zip
1 directory, 4 files
“`“`go:main.go
package mainimport (
“archive/zip”
“bytes”
“fmt”
“io”
“os”“github.com/jung-kurt/gofpdf”
)func createPDF() (*bytes.Buffer, error) {
var buf bytes.Bufferpdf := gofpdf.New(“P”, “mm”, “A4”, “”)
pdf.AddPage()
pdf.SetFont(“Arial”, “B”, 16)
pdf.Cell(40, 10, “
GoでPDFを作成する
## はじめに
表題通り、GoでPDFを作成する記事となります。## 成果物
“`shell:ディレクトリ構成
~/go/src/go_pdf$ tree
.
├── example.pdf
├── go.mod
├── go.sum
└── main.go1 directory, 4 files
“`“`go:main.go
package mainimport (
“fmt”“github.com/jung-kurt/gofpdf”
)func main() {
// PDFを新規作成
pdf := gofpdf.New(“P”, “mm”, “A4”, “”)
pdf.AddPage()// フォントの設定
pdf.SetFont(“Arial”, “B”, 16)
pdf.Cell(40, 10, “Hello World”)// ファイルに保存
err := pdf.OutputFileAndClose(“example.pdf”)
if err != nil {
Golangでファイルをzip化する
## はじめに
表題通り、Golangでファイルをzip化します。## 成果物
“`shell:ディレクトリ
~/go/src/go_zip$ tree
.
├── files
│ ├── pdf1.pdf
│ ├── pdf2.pdf
│ └── pdf3.pdf
├── go.mod
├── main.go1 directories, 5 files
“`## 1ファイルのみZip化
“`go:main.gofunc main() {
// ZIPファイルの作成
zipFile, err := os.Create(“output.zip”)
if err != nil {
fmt.Println(err)
return
}
defer zipFile.Close()// ZIPライターの初期化
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()// PDFファイルをZIPに追加
if err := addFileToZip(“files/pdf1
GoでGraphQLを導入する
今回は`gqlgen`を使ってGraphQLのサーバーを立ち上げるまでのチュートリアルを作成していきます
– Github: https://github.com/tf63/go-graph-exp
– 実行環境: https://github.com/tf63/go-graph-exp/blob/main/docker/backend/Dockerfile
### GraphQLってどういうもの?
RESTとの違いを示しますREST
– 複数のエンドポイント
– エンドポイントごとに固定のデータを取得
– HTTPメソッドによって実行する処理を決定
– HTTPステータスコードでエラーハンドリング
– 型定義があいまいGraphQL
– 単一のエンドポイント
– エンドポイントから必要なデータを指定して取得
– query, mutationによって実行する処理を決定
– メッセージでエラーハンドリング
– 型定義が厳密RESTでは,クライアントが必要なデータを取得するために複数のエンドポイントから過剰なデータを取得していました
GraphQLでは,クライアントは
[Go]並行処理
# 概要
* [前回](https://qiita.com/hasesiu/items/9d4298826bd7e791bd65)の続き
* 今回は並行処理について学習
* Goの並行処理はシンプルとのこと
* ゴルーチン、チャネル、select等の新しい用語が出てきた参考
https://www.oreilly.co.jp/books/9784814400041/#
# 並行処理について
* Goの並行性はスレッドのロックによるデータ共有ではない
* Goの並行性のモデルはCSP(Communicating Sequential Processes)
* 独立したプロセス群がメッセージパッシングを使用して相互にやり取りをする仕組みらしいhttps://ja.wikipedia.org/wiki/Communicating_Sequential_Processes
* 並行性と並列性は異なる
* 並行性はコードの性質を指し、並列性は動作するプログラムを指す
* 並行処理を実装しても、必ずしも並列で動作するとは限らない
*