- 1. 1億レコードのテーブルを扱ってみた
- 2. 動的型付け・静的型付けの簡易的整理と Go 言語の魅力について
- 3. net/http で学ぶ interface
- 4. 【Go言語】爆速で変数の命名規則を調整するCLIを作る with cobra!!
- 5. GOで最初につまづいたこと
- 6. Go標準パッケージを利用したリクエスト・レスポンスの処理
- 7. GoでWebサーバーを作成する2
- 8. NeomuttでGmailにOAuth2.0する(2022版)
- 9. 【Golang】1 バイトデータの左シフト(ビットローテーション、循環シフト)
- 10. 【golang】net/httpのタイムアウト設定
- 11. GO言語で並列実行するサンプルコード。ワーカーのキャンセル機能付き
- 12. Go言語 go versionが出力されない
- 13. Google Open Source(Go)ではDeprecated(非推奨)なコードがわかりやすく表示される
- 14. Tree Maker_Convert Markdown to tree!_WebAssembly&ServiceWorker
- 15. Leetcode 263. Ugly Number
- 16. Go標準パッケージを利用したJsonデータの読み込み&出力
- 17. go のわかりにくい型推論
- 18. Goのdatabase/sqlを利用してPostgreSQL/MySQLへ接続&CRUD操作してみた
- 19. 「Go×Firebase×React」でJWT認証できる簡単なTODOアプリ作ってみた
- 20. [OCI]Autonomous Database:Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ
1億レコードのテーブルを扱ってみた
仕事で扱うレコード数は多くて1000万くらいだが、過去に1億レコードを扱ったという記事があり、どんなものなのか気になったため、過去に作成したポートフォリオにデータを追加してみた(ToDoアプリ)。なお調べるうちに某企業は130億レコードを扱ったみたいな記事もあり、1億レコードは決してかなり多いレコード数ではないと知った。
# 環境
* Go 1.18
* gorm
* mysql 8.0
# 1億レコード追加
tasksテーブルにレコードを追加すると、早速問題が起きた。
Gormなので“Debug()“を使ってどのようなクエリが発行されているのか確認してみた。“`sql
[0.000ms] [rows:11] SELECT * FROM `users` WHERE `users`.`id` IN (…)[1.000ms] [rows:3] SELECT * FROM `fields` WHERE `fields`.`id` IN (…)
[0.534ms] [rows:5] SELECT * FROM `milestones` WHERE `mileston
動的型付け・静的型付けの簡易的整理と Go 言語の魅力について
# 本記事の目的
* 動的型付け・静的型付けの概念がよくわかってなかったので簡潔に整理した。
* ついでに Go 言語が(個人的に見た感じ)人気な理由についても確認したので、そのメモ。# 結論
* 動的型付け言語 : 変数などのデータ型の宣言がいらないプログラミング言語
* 静的型付け言語 : 変数などのデータ型の宣言が必要なプログラミング言語| 種別 | 特徴 | 具体的言語 |
|—|—|—|
| 動的型付け | ・記述量が少なく、簡単に書ける
・解釈の余地がある書き方となるため、複数人での開発だと各コードの意味することが分からず、保守性で物足りないところあるかも | Python, Ruby, PHP… |
| 静的型付け | ・プログラム実行前にバグやエラー箇所を特定できる
・メモリを最適化しパフォーマンス向上させる | Java, C#, Go… |結論としては・・・
* 生産性をとるなら「動的型付け言語」
* すばやく学んですばやく実装する、とかであればこちらが向いてそう
* 実行速度や保守性をとるなら「静的型
net/http で学ぶ interface
# 自己紹介
普段はインターン先では Python を使って ML を用いた ソフトウェアの開発をしていますが、エンジニアとして成長するために静的型付け言語を学ぼうと思いました。その第一歩に選ばれた Go を学んでいくにあたり、interface 周りでつまづき、色々調べる中で自分なりに腑に落ちたので共有させていただきます。– [TL; DR](#tl-dr)
– [⭐️ interface とは](#️-interface-とは)
– [⭐️ http における紛らわしいやつらの違い](#️-http-における紛らわしいやつらの違い)
– [Handler](#handler)
– [HandlerFunc](#handlerfunc)
– [Handle](#handle)
– [HandlerFunc](#handlerfunc-1)
– [⭐️ 実際の関数の流れ](#️-実際の関数の流れ)
– [⭐️ 実装できるのは構造体だけじゃない](#️-実装できるのは構造体だけじゃない)
– [最後に](#最後に)
– [参考](#参考)
【Go言語】爆速で変数の命名規則を調整するCLIを作る with cobra!!
# 背景
最近Golangの勉強をしています。業務で若干触るもまだまだ表面的な理解しかできていない気がしており、色々手を動かしてもっと慣れたいと思ったのでCLI Applicationから作ってみようと思いました。今回開発したレポジトリはこちらです。
https://github.com/ishidao0910/valint# 準備
開発を進めるための準備をします。1. goのイニシャライズ
1. cobra cliのインストールご自身でレポジトリを用意していただくのがいい気がします。
この先何度か出てきて面倒なので、
– ishidao0910: ご自身のgithubユーザー名
– val
GOで最初につまづいたこと
# GOのパス設定がよくわからない
GOの勉強を始めようとしたが、つまづいたところがあったのでメモがてらに投稿。
## 問題:GOPATHやGOROOTとか何が何かわからない### $GOPATH
goのワークスペースのルートディレクトリ
GOPATHの中の構造は以下のようになっている
`src/` : Go ソースコードの場所(例: .go、.c、.g、.s)。
`pkg/` : コンパイルされたパッケージコードの場所(例: .a)。
`bin/` : Go によってビルドされたコンパイル済み実行可能プログラムの場所。### $GOROOT
異なるGoバージョンを変更する必要がないなら気にしなくていい。### $PATH
インストールしたパッケージのコマンドなどが記述されたバイナリファイルが格納される場所です。コマンドなどはここから参照してくる。## 結論
私はgoの開発をする際以下のようなディレクトリ構造で開発することにした。
(合っているかはわからないが…)### 階層構造
“`
home
├──そのほか
go ← ここがGOPATH
├── src
│
Go標準パッケージを利用したリクエスト・レスポンスの処理
# net/http
この記事ではGoの標準パッケージであるnet/httpを利用したリクエスト、レスポンスの処理の方法について解説する。
[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考にしており、この書籍のまとめでもある。# リクエストの受信
## ListenAndServe
GoにおいてHTTPサーバーを起動させるためのメソッド。
第一引数:ネットワークアドレス。「””」を指定した場合、80番ポートになる。
第二引数:リクエストを処理するハンドラ。nilを指定した場合、DefaultServeMuxが使われる。“`go
server.ListenAndServe(ネットワークアドレス, ハンドラ)
“`server構造体を使ってサーバーの設定ができる。ネットワークアドレスやハンドラもこの中で指定できるので、これを使った場合引数はいらない。
“`go
type Server struct {
Addr string
Handler Handler
GoでWebサーバーを作成する2
# はじめに
GolangでAPIサーバーを作るときに調べたことを自分用のメモとしてまとめます。## 文法関連
* 命名規則
他パッケージからアクセスできるものは先頭大文字にする[他言語プログラマが最低限、気にすべきGoのネーミングルール](https://zenn.dev/keitakn/articles/go-naming-rules)
[Golangでの命名規則におけるベストプラクティス](https://zenn.dev/kenghaya/articles/1b88417b1fa44d)* if文
* for文
[Go言語(golang)のループ for, for..range, foreach, while](https://golang.hateblo.jp/entry/2019/10/07/171630#foreach-for–range)* append関数
スライスに要素を追加する。
配列の長さを指定しないものがスライス。
C#でいうListみたいなもの。
“`cafes = append(cafes, cafe)“`[【Go】基本文法④
NeomuttでGmailにOAuth2.0する(2022版)
# NeomuttでGmailにOAuth2.0する(2022版)
## TL;DR
2020年に書いた内容が
古くなったから
更新した## まえがき
以前、NeomuttでGmailを利用するための手順を書き、Python2の環境では問題なく動きましたが、Pythonの利用環境整えるのが面倒なので、Golangで書き直しました。
## NeomuttでのOAuth2.0利用手順
### Google Cloud PlatformでOAuthクライアントIDを作成する
##### 1. 以下のURLを開き、Google Cloud PlatformのAPIサービス設定を開きます。
https://console.developers.google.com/apis/credentials
##### 2. [新しいプロジェクト]を作成から、mutt用のプロジェクトを作成します。
Google Cloud Platformのロゴの右側あたりの「▷hogehoge▽」の部分を押すと作れました。
![oauth0.png](https://qiit
【Golang】1 バイトデータの左シフト(ビットローテーション、循環シフト)
> Go 言語(以下 Golang)で、1 バイトのデータを[左シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E7%AE%97%E8%A1%93%E3%82%B7%E3%83%95%E3%83%88)させたのち、右側末尾に[ビット・ローテーション](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#(%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%BC%E3%81%AA%E3%81%97)%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%83%88)させたい。いわゆる、ひとつの[循環シフト](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97#%E8%AB%96%E7%90%86%E3%82%B7%E3%83%95%E3%
【golang】net/httpのタイムアウト設定
# 概要
先日golangci-lintのバージョンアップを行ったところ、lintの際に下記のような警告が発生しました。
“`bash
cmd/main.go:134:11: G114: Use of net/http serve function that has no support for setting timeouts (gosec)
if err = http.ListenAndServe(“:8080”, mux); err != nil {
“`
調べてみてなるほどと思ったので備忘録として残します。# 前提
– go version go1.19.3 linux/amd64
– golangci-lint version 1.50.1# net/httpのタイムアウト
golangの標準ライブラリのnet/httpでは、デフォルトではタイムアウト設定が存在しません。
つまりデフォルトではタイムアウトが発生せず、リクエストの処理終わりを常に待機し続けることになります。下記はnet/httpライブラリのServer構造体ですが、`Read
GO言語で並列実行するサンプルコード。ワーカーのキャンセル機能付き
個人的な備忘録として。
“`golang
package mainimport (
“context”
“fmt”
“time”“github.com/pkg/errors”
)type Result struct {
Task Task
Err error
}type Task struct {
Bar int
}func worker(workerID int, ctx context.Context, taskChannel <-chan Task, resultChannel chan<- Result) { // taskCannelがなくなるまで動作する for task := range taskChannel { select { case <-ctx.Done(): // 親からcancel()が実行された場合、動きを止める fmt.Printf("[%d] got Cancel\n", workerID) return default: fmt.Printf("[%d] do task
Go言語 go versionが出力されない
お疲れ様です。
go言語を始めようとしたところ出落ちしたので、情報共有します。
“`:開発環境
Apple m1 macbook
macOS 13.0.1(22A400)
“`# 対処法
1\.どこのファイルにPathを追記するか確認
下記コマンドをターミナルで実行
“`
echo $SHELL
“`
・bashなら、~/.bash_profile
・zshなら~/.zprofile
に追記していくことになります。2\.該当の設定ファイルにパスを追記
“`
$ open ~/.zshrc
または
$ open ~/.bash_profile
“`
openで設定ファイルが開かれるので、pathを追記してください。
自分はzshrcだったので以下のように追記しました。
※ドキュメントにも該当のPATHを追記しろと明記してあります。https://go.dev/doc/install
“`:zshrcの場合
$ export GO_HOME=/usr/local/go
$ export PATH=$PATH:$GO_HOME/bin
“`
ファイルを追記し
Google Open Source(Go)ではDeprecated(非推奨)なコードがわかりやすく表示される
netパッケージのソースコードを読んでいると、ファイル内で使われている[syscallパッケージの記述に打ち消し線が引かれていた](https://cs.opensource.google/go/go/+/refs/tags/go1.19.3:src/net/dial.go;l=609;bpv=0;bpt=1)。
![スクリーンショット 2022-11-19 15.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261575/0ab12f7b-1ac2-b249-e11f-56e0bc4d080f.png)
他にも、この画像でいうと`Cancel`にも打ち消し線が引かれている。
まあ、なんとなくどういうときに打ち消し線が引かれるのか予想はできるが、軽く調べてみた。—
どういうときに打ち消し線が引かれるかというと、そのパッケージやメソッド、型や変数が**deprecated**(非推奨)のとき。
Goでは、`Deprecated:`という修飾を含んだコメントを記述することで、対象
Tree Maker_Convert Markdown to tree!_WebAssembly&ServiceWorker
https://ddddddo.github.io/gtree/
![web_example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271313/83d52823-8f74-d5f8-14c3-4110f54110d6.gif)
# これは何か?
Markdown形式の入力を与えると、treeコマンド結果のような表示がされるWeb appです。
以下の4種類の記号が使えます。
`*`, `-`, `+`, `#`また、出力されるツリーの各階層は、入力となるMarkdownでは半角スペース2つずつインデントすることで表現します。
# このサイトの特徴は?
– Markdownからtreeを生成する処理はGoで書いており、その処理部分はTinyGoでWebAssembly(.wasm)としてコンパイルしています。
– コンパイルされたバイナリはJavaScriptから呼ばれます。
– ServiceWorkerを利用していて、このWeb appを構成する静的コンテンツ(.wasm含む)は
Leetcode 263. Ugly Number
# 263. Ugly Number
https://leetcode.com/problems/ugly-number/description/# 難易度
– EASY# アプローチ
– Bruthforce## Java
“`java
class Solution {
public boolean isUgly(int n) {
if (n == 0) {
return false;
}
if (2 <= n && n <= 6) { return true; } while (true) { if (n % 2 == 0) { n /= 2; continue; } if (n % 3 == 0) { n /= 3; co
Go標準パッケージを利用したJsonデータの読み込み&出力
## 概要
JSONの読み込みは「json.Unmarshal」「json.NewDecoder」の2種類、JSONの生成は「json.Marshal」「json.Marshalindent」「json.NewDecoder」の3種類を使った方法を紹介する。
## encoding/jsonパッケージ
JSONデータのエンコードとデコードをするためのパッケージ。
今回はこのパッケージを使用してJSONデータの解析を行う。## JSONデータの読み込み
### json.Unmarshal
`json.Unmarshal()`はJSONを構造体に変換する。
第一引数にJSON形式のデータを、第二引数にポインタを指定することでJSON形式で受け取った値を指定したポインタに保存することができる。
“`go
json.Unmarshal(JSON形式のデータ, ポインタ)
“`### JSONデータを解析してみる
今回は以下のようなJSONデータを用意する。ファイルの名前はtest.jsonとする。
“`json
{
“id” : 1,
“content”
go のわかりにくい型推論
# これは何?
go の型推論が思いがけない動作をしたのでその記録。
# 普通の例
“`go:go1.19
func main() {
f := func(i int) uint8 {
return uint8((1 << i) % 10) } fmt.Println("f(5) =", f(5)) //=> f(5) = 2
}
“`$2^n$ を 10で割った余りを `uint8` で返すという普通の関数。
2の5乗 は 32 なので、 `f(5)` は 2 になる。順当。
# 思いがけなかった例
上記の関数 `f` に 10 を入れると
“`go:go1.19
fmt.Println(“f(10) =”, f(10)) //=> f(10) = 0
“`$2^{10}$ は 1024 なので `f(10) = 4` となるかと思いきや、ゼロになる。
私は意外だった。
# いろいろ試した
## 一回変数で受ける
“`go:go1.19
f := func(i int) uint8 {
n := 1 << i return ui
Goのdatabase/sqlを利用してPostgreSQL/MySQLへ接続&CRUD操作してみた
[「**Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る」**](https://amzn.to/3UI1wa3)という書籍を参考に、database/sqlを利用したデータベースへの接続とCRUD操作についてまとめました。
# PostgreSQLへの接続
### ドライバーのインストール
ドライバーをインストールする必要がある。
“`bash
go get “github.com/lib/pq”
“`### 接続方法
“`bash
sql.Open(“postgres”, “user=ユーザー名 dbname=DB名 password=パスワード sslmode=disable”)
“`# MySQLへの接続方法
### ドライバーのインストール
こちらも同様にドライバーをインストールする必要がある。
“`bash
go get -u github.com/go-sql-driver/mysql
“`### 接続方法
“`sql
sql.Open(“mysql”, “ユーザー名:パスワード@tcp(ホスト:ポート番号
「Go×Firebase×React」でJWT認証できる簡単なTODOアプリ作ってみた
こんにちは。初投稿です。
来年から新卒でエンジニアになる予定の者です。## 初めに
実務未経験、独学ですので、何か勘違いがあるかもしれないということを予めご了承ください。間違いがあれば指摘していただけますと幸いです。またこの記事ではDockerやReactなどの詳しいことは触れていません。
## この記事でやること
Go,Reactを学習したので習作物としてバックエンドGo,フロントエンドReactを使ったFirebase×JWT認証つきの簡単なTODOアプリを開発しました。簡単にJWT(Json Web Token)だけ説明しますと、
* 認証用のトークンとして用いられる
* JSON形式でやり取りするため任意の情報を含むことができる
* 改ざんを検知できる
などの特徴がありますhttps://jwt.io/
こちらの記事がハンズオン形式でわかりやすかったです。↓
https://qiita.com/po3rin/items/740445d21487dfcb5d9f
# 完成イメージ
![TODO操作デモ.gif](https://qiita-image-st
[OCI]Autonomous Database:Goで書かれたアプリケーションからAutonomous Databaseに接続してみた時のメモ
# はじめに
OSがOracle Linux 7.9のComputeインスタンスに、Go言語とOracle Instant Client、Go DRiver for ORacle(godror)をインストールしてAutonomous Databaseに接続してみた時のメモです。# 1. GoとOracle Instant Clientのインストール
“`
sudo yum install -y oracle-instantclient-release-el7 oracle-golang-release-el7
sudo yum install -y git gcc golang
sudo yum install -y oracle-instantclient-sqlplus
“`
# 2. godrorのインストール“`
go mod init github.com/godror
go get github.com/godror/godror@latest
“`# 3. tnsnames.oraの作成
“`
mkdir /home/opc/tns
vi /ho