- 1. GoでO/Rマッパーと生SQLの違いを比較してみた
- 2. 【Go 言語】interface のポインタからメソッドコールできないのはなぜ?
- 3. Rustにおける「厳密な型付け」という文化
- 4. Rubyで理解するポリモーフィズムから、Goのインターフェースへ①
- 5. Golangでzipファイルを解凍する
- 6. Polymorphism with Interfaces
- 7. M5StickC Plus (ESP32) とTinyGoでLチカ
- 8. Goでnslookupする
- 9. deferに入門してみた
- 10. Golangで依存パッケージの脆弱性を調査するならNancyがおすすめ
- 11. Golangでインストールしたパッケージ(依存パッケージも含む)のversion確認方法
- 12. 日報Go
- 13. プログラミング超入門(6)〜GO言語〜
- 14. WindowsベースのDockerコンテナを動かす
- 15. Goでテスト用Dockerコンテナ(MySQL, Redis)などを動かす
- 16. カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)
- 17. 【Golang】標準入力から1文字のキー入力を読み込む(enter いらずの On KeyPress/KeyDown っぽいやつ)
- 18. Macローカル上にDocker Composeでアプリを立ち上げてみた
- 19. Go1.16新機能embedを使ってメッセージが定義されたファイルを読み込む
- 20. JWT を Go で処理するためのパッケージ
GoでO/Rマッパーと生SQLの違いを比較してみた
# はじめに
Ruby on Railsを学習している方はActiveRecordという名称のORマッパーを目にする事が度々あると思います。
私もプログラミングの学習をRubyから始めたのですが、ORマッパーと聞くとなんとなく「DBからのデータの取り出しを簡単にやってくれているんだな」くらいの認識でした。
Railsがあまりに様々な事をよしなにしてくれるので、Rails初学者の方は生のSQLを書く機会もほとんどないのではないかと思います。
最近Goを勉強し始めた事で、そのRailsがよしなにしてくれていた部分を基本から学び直す必要が出てきたので、ORMに関しても一つ学び直してここに備忘録として残したいと思います。# 対象者
– プログラミング初学者
– SQLは書いた事があるがORMは利用した事がない。あるいはORMは利用した事があるが生のSQLを書く事はあまりない。# 概要
Goのデータベースとのやり取りを、生のSQLで行った場合とORマッパーを利用した場合とでどうコードの違いが出るのかを比較して見ていきます。
Goを扱っていますが、簡単なコードなのでGoを触った事が無い方で
【Go 言語】interface のポインタからメソッドコールできないのはなぜ?
## 結論
簡潔に言うと「interface を指すポインタは interface を実装した構造体のポインタのポインタになるから」です。
これだけではよくわからないので詳しくみていきましょう。## interface のポインタからメソッドコールができないとは?
interface の Mammal とそれを実装した Human という構造体を考えましょう。
“`go
type Mammal interface {
GetAge() int
}type Human struct {
Age int
}func (h *Human) GetAge() int {
return h.Age
}
“`この時、以下のように Mammal というインターフェースのポインタから GetAge() をコールしようとするとコンパイルエラーになってしまいます。
“`go
func Foo(human *Mammal) {
_ = human.GetAge() // コンパイルエラー
}
“`GetAge() をコールするためには *Mammal ではなく
Rustにおける「厳密な型付け」という文化
# はじめに
Rustの特徴としてはメモリ安全性やGCなしで高速といったことがよく挙げられます。それらもRustの利点ではありますが、個人的に魅力を感じる部分の一つに「厳密な型付けをする文化」があると思っています。それはあまり明文化されておらず、個人的に感じているだけなのですが、Rustを使う動機の1つになりうると思うので、ここで宣伝してみます。
ちなみにこの記事のきっかけの1つが
[アンサー: なぜTypeScriptの型定義に凝るのか](https://qiita.com/uhyo/items/3bc5f951f922804ede51)
です。これを読んでいて、「自分はRustの型付け方針が好きなんだなぁ」とあらためて気づきました。
技術的な正確性より「気持ち」多めなのでポエムということで。# 「厳密な型付けをする文化」とは
Rustは静的型付き言語なので、ソースコード上の様々なところで型付けが行われます。これ自体は他の静的型付き言語と同様ですが、Rustではどのような型を付けるかということについて、比較的厳密に考える傾向があると思っています。
例えば標準ライブラリ
Rubyで理解するポリモーフィズムから、Goのインターフェースへ①
#何を書くか
私は現在、Go言語の学習に取り組んでいます。
そこで、**「インターフェース」**という概念を学びました。##何やこれ
正直、教本を読んでも全然なんのこっちゃと言った感じだったので、[こちら](https://qiita.com/k-penguin-sato/items/885a61d819cc431304f5)の記事を覗いてみました。すると
>interface(インターフェース) を利用することで、オブジェクト指向言語でいうところのポリモーフィズムと同様の機能を実現できます。
との説明がありました。ふむふむ。ポリモーフィズムね。
何だそりゃ。
##ということで
Rubyの学習も兼ねて、まずはオブジェクト指向のポリモーフィズムを理解し、それからインターフェースを学習していこうと思います。一応二部作の予定で書いていきます。
1部目の今回は、**ポリモーフィズム**について、自分が調べただけつらつらとお話ししていこうと思います。#ポリモーフィズムとは
**オブジェクト指向言語(Rubyが持つプログラミング言語が持つ概念的な捉え方)**には、守べき設計
Golangでzipファイルを解凍する
こんにちは。初投稿です。どうぞお手柔らかにm(__)m。
Go言語に触れ始めて数か月、それほどガッツリ書いてるわけではないですが、少しわかってきた気がします(危険な時期)
さて、タイトルの通りZipファイルを解凍するのですが、よくあるZip解凍ツールのように「ファイル名を展開先のディレクトリ名に使う」のってよくありませんか?ないですかそうですか。
例えば「test20210318.zip」であれば「test20210318」というディレクトリを作って、その下層に展開する、というものです。
実際に業務でニーズがありまして、同じファイル構成でzip圧縮されたファイル群を、繰り返し解凍するような仕組みです。作ったサンプルがこちら。
“`Go:sample/unzip/main.go
package mainimport (
“archive/zip”
“fmt”
“io”
“os”
“path/filepath”
“regexp”
)// unZip zipファイルを展開する
func unZip(src, dest string) error {
r,
Polymorphism with Interfaces
https://play.golang.org/p/ojRqAxy5JYm
https://medium.com/technofunnel/polymorphism-with-golang-interfaces-b2f58a05b221
# work
“`
package mainimport (
“fmt”
)type Test interface{
Run()
// Debug()
}type My struct{
body string
}func (m My)Run(){
fmt.Println(m.body)
}func main() {
my := &My{body: “DOOOOOOOO”}
fmt.Println(“Hello, playground”)
testRun(my)
}func testRun(t Test){
t.Run()
}“`
↓
“`
Hello, playground
DOOOOOOOO
“`# Error
“`
package mainimport (
“fmt”
M5StickC Plus (ESP32) とTinyGoでLチカ
# はじめに
最近、仕事でGO使ってて、趣味ではESP32を使ってるので、TinyGoでESP32をプログラミングしたくなってきた。ということで、Lチカすることにした。# 環境
macOS Big Sur Ver 11.1# インストール
## TinyGo
tinygoは、ここを参考にして、インストールした。
[macOS :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/getting-started/macos/)いろいろ書かれてるけど、これだけで動くはず。
“`zsh
brew tap tinygo-org/tools
brew install tinygo
“`## ESP32のためのツール群
これにしたがって下記ツールを入れた。[ESP32 – mini32 :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/microcontrollers/esp32-mini32/)
– pyserial
Goでnslookupする
“`golang
package mainimport (
“fmt”
“log”
“net”
)func main() {
addr, err := net.LookupHost(“vamdemicsystem.black”)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(addr)
}
“`“`
⋊> /t/golang go run main.go 23:06:26
[183.181.88.32]
“`
deferに入門してみた
# deferに入門してみた
ちょっと退屈してたたので、deferについて調べてまとめてみます。
この記事を書き始めている今時点のdeferに対する認識は、
– 処理を実行を遅らせてくれる便利なやつ
– どこで実行しても最後に処理してくれるから、忘れてた!!ってことを防止できるやつこんなイメージを持ってます。
## では早速ごちゃごちゃ動かしてみます。
“`go
package mainimport (
“fmt”
)func main() {
defer fmt.Println(“defer Hello, playground”)
fmt.Println(“Hello, playground”)
}
“`実行結果
“`
Hello, playground
defer Hello, playground
“`イメージした通り、処理が遅れましたね。
では、deferが2つあったときは??
“`go
package mainimport (
“fmt”
)func main() {
defer fmt.Println(“def
Golangで依存パッケージの脆弱性を調査するならNancyがおすすめ
# 概要
* Goで使用する外部パッケージが安全かどうかを調べる時にオススメなのが、[nancy](https://gonancy.dev/)です。
* ちなみにnancyとは、Sonatype OSS Indexを利用して、Golangの依存関係の脆弱性をチェックするツールです。
* nancyではdepまたはgo modの依存関係を調査してくれます。![nancy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/79fec195-ab17-3383-03db-e5319d156c58.png)
# 導入方法
* install方法“`
> brew tap sonatype-nexus-community/tap
> brew install nancy
“`# 試す
* helpを見てみる
* 見てみると、引数にGopkg.lockまたは、go.sumのpathを指定してあげるようです。“`
❯ nancy –help
Usage:
nancy [opti
Golangでインストールしたパッケージ(依存パッケージも含む)のversion確認方法
# 概要
Go言語で依存パッケージも含めてパッケージのversionを確認したいときに利用するコマンドです。
ただ、注意点としては、パッケージの開発が別のリポジトリに移動すると最新のversionを追えません。“`
go list -m -u all
“`# 試してみた
試しに、goのsample projectで上記のコマンドを試してみたいと思います。
cloneしたsample => https://github.com/golang/example“`
❯ go list -m -u all
go: finding github.com/yuin/goldmark v1.2.1
go: finding golang.org/x/net v0.0.0-20201021035429-f5854403a974
go: finding golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
go: finding golang.org/x/tools v0.0.0-20210112183307-1e6ecd4bf1b0
日報Go
# きっかけ
「リモートワークで勤怠入力が必須になってしまった…」
「いちいちブラウザ開いて入力したくない….」
ということでGolangの勉強がてらに作りました:fist:上司に許可とって、きちんとやっている内容出していればOKとのことだったので自動化してみた感じです。:tea:
簡単な内容ですが、同僚には受けがよかったです…w間違いなどありましたらご指摘していただけると幸いです。
# ソース
https://github.com/sgash708/go_chatwork_notice# 前提
* Golang ver1.15
* goquery
* Agouti
* ChromeDriver ver88.0.4324.96
* zsh
* macOS ver10.15.7https://chromedriver.chromium.org/downloads
# 注意
スクレイピングは脅威にもなります。
サイトごとに行ってよいか注意しながら行いましょう。
待ち処理などを適宜入れてください。# 前準備
goファイルが走るように設定しま
プログラミング超入門(6)〜GO言語〜
#for文(繰り返し制御)
配列から要素を一つずつ取り出せるようになります。GO言語の繰り返し処理には、**while文**(データの個数がわからない時に使用する条件式)が無くシンプルにfor文というデータの個数分までループ構造を繰り返す処理のみになります。`for スタート値; 継続条件; 増減式 { }`スタート値は第一引数にあたり、繰り返し処理をスタートさせる値になります。変数名に**i**(indexやintegerの頭文字)が使われるのが一般的です。0からスタートとなる**カウンタ変数**(アクションの実行回数)を省略形**(:=)**で代入し定義します。継続条件の部分は繰り返しをやめるまでの条件としてブール値を返す式を記述します。通常はiの値に関する式となり、式の値がfalseとなったら繰り返しをやめ、{ }の中から抜けることになります。例として`i <= 4;` `i < len(aprices)`を記述します。増減式は1回の繰り返し処理で1ずつ増やすインクリメント演算子「++」を使用します**「i++」**は、「i += 1」の略です。{ }波括弧の中には繰り返したい処
WindowsベースのDockerコンテナを動かす
#Windowsのコンテナを作ろう
Dockerといえば、普通はLinuxのコンテナですが、Windowsのコンテナを使いたいときもあると思います。
そんなボーイズ&ガールズにWindowsのコンテナを作るDockerfileをお贈りしよう。#GO言語の実行環境を構築
試しにGO言語の実行環境を構築してみます。
環境が変わればプレイングも変わるのが常ですが、
GOはオールラウンダーなので、さほど変わりませんから楽ですね。“`
FROM mcr.microsoft.com/windows:1909ENV GOLANG_VERSION 1.14.10
ENV GOLANG_DOWNLOAD_URL “https://golang.org/dl/go$GOLANG_VERSION.windows-amd64.zip”RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
(New-Object System.Net.WebClient).DownloadFile(‘%GOLANG_DOWNLO
Goでテスト用Dockerコンテナ(MySQL, Redis)などを動かす
# はじめに
Goで書いたアプリケーションのテスト時に、データベースへの接続や、キャッシュへの接続などが必要になることが多いかと思います。その際に手軽にテスト用データベースやキャッシュなどをを立ち上げられる[testcontainer-go](https://github.com/testcontainers/testcontainers-go)というツールを利用してみて、非常に簡単に利用することができました。どなたかのお役に立てたら幸いです。動作するコードは以下のリポジトリに置いてあります。(02_DB_baseのブランチに実装してあります)
[yasuflatland-lf/go-test-sample](https://github.com/yasuflatland-lf/go-test-sample/tree/02_DB_base)# 動作環境
– Mac 11.2.3 (BigSur)
– Go 1.15.8
– Docker Desktop for Mac (3.2.1)
– Git 2.23.0# 実行方法
1. [https://github.com/yas
カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)
# おしゃれなカフェで…
私はエンジニア。
コーヒー片手にWindowsのノートPCでプログラミングしています。っていうのは置いといて・・・
[カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b)を見た後に、職場であがった話題を絡めたネタ記事です。# 唐突ですがCRについて
最近、職場でCRについてのこんな話題があがりました。
> 恥ずかしながら、キャリッジリターンの意味を初めて理解した、ただの改行コードと思ってた。
> これ、カーソルを先頭に戻すコードだったんですね例えばこんな感じ。
“`
opt = ‘aaa’
opt += ‘bbb\r’
print opt # aaabbbopt += ‘ccc’
print opt # cccaaa
“``\r (キャリッジリターン)` はカーソルを先頭に戻す動きなので、元々の`aaabbb`に対して`ccc`が上書きされます。
カーソルは`ccc`の位置なので、
【Golang】標準入力から1文字のキー入力を読み込む(enter いらずの On KeyPress/KeyDown っぽいやつ)
# Go言語で標準入力のキー押下(`KeyPress`)を検知する
> Golang で**標準入力から1行ごとではなく、1文字だけ取得する方法**を知りたい。
正確には [TTY](https://ja.wikipedia.org/wiki/Tty) からの標準入力を 1 文字欲しいのです。つまり、ターミナルやコマンドラインなどでのユーザー入力(標準入力)で `y` -> `enter` でなく、`y` キーを押しただけで `y` を検知したいのです。
[「golang 標準入力 1文字 読み込む」で Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+golang+%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B+1%E6%96%87%E5%AD%97+%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80)も、[競プロ](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E
Macローカル上にDocker Composeでアプリを立ち上げてみた
#Dockerアプリケーションのアーキテクチャー
![スクリーンショット 2021-03-15 10.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/580193e7-2961-57ea-6239-dce0b7315012.png)##ざっくりとやること・できることの説明
– docker-composeでNginxとGo言語のAPI, DBとしてMySQLのコンテナを3つ立ち上げる
– Nginxのindex.htmlからGo言語で書いたREST API(go-ginのフレームワーク使用)を経由して、DBに問い合わせ
– DBにCRUD(gormのフレームワーク使用)ができることを確認
– ※DockerとDocker Composeはインストールされているものとする。##バージョン確認
確認してみたら、以下のバージョンでした。“`
Docker version 20.10.2
docker-compose version 1.27.4
golang:1.14
Go1.16新機能embedを使ってメッセージが定義されたファイルを読み込む
# はじめに
## Go1.16リリース
Go1.16が2021年2月にリリースされましたね!– [Go 1.16 Release Notes](https://golang.org/doc/go1.16)
– [Go 1.16連載が始まります | フューチャー技術ブログ](https://future-architect.github.io/articles/20210207/)様々なアップデートがありましたが、主要でわかりやすい変更点は以下の通りでしょうか。
– M1 Macに対応
– 処理速度やメモリ使用量の改善
– `go:embed`の追加> Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as Apple Silicon) with GOOS=darwin, GOARCH=arm64.
> For a representative set of large Go programs, linking is 20-25% faster than 1.15 and requi
JWT を Go で処理するためのパッケージ
Go 言語で JWT (JSON Web Tokens) を処理したい。
以前に書いたコードを見直す機会があって調べたら状況が変化していたので記録に残しておきます。特に記載がない限り 2021 年 3 月 14 日時点の情報になります。
## 調査対象
– https://github.com/dgrijalva/jwt-go
– https://github.com/square/go-jose
– https://github.com/lestrrat-go/jwxこのうち実際に使ったことがあるのは dgrijalva/jwt-go と square/go-jose です。
## dgrijalva/jwt-go
https://github.com/dgrijalva/jwt-go
最終リリース: [v3.2.0](https://github.com/dgrijalva/jwt-go/releases/tag/v3.2.0) (2018 年 3 月 9 日)
dgrijalva/jwt-go (fork を含む) を使用しているリポジトリの例
– http