- 1. http sample with go.uber.org/dig
- 2. Golang+Ginでswaggerを自動生成する(gin-swagger)
- 3. Istioはいかにしてサービス間通信のセキュリティを担保しているのか?
- 4. カリー化チートシート
- 5. golang の datastore の unittest でハマった話
- 6. Goのldapモジュールで認証をLDAP認証をかける
- 7. golangでOpenLDAPサーバへ接続する
- 8. [Go言語] 初心者必見シリーズ: 構造体(Structs)
- 9. VS Code の Remote Container で複数のコンテナを起動して作業を切り替える
- 10. Goでソースコードを画像化するCLIを作った
- 11. GoでMonth型をint型に変換
- 12. Golangを唐突に始めたい衝動に駆られた話
- 13. GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
- 14. azbill: Azure 利用明細・課金情報出力 CLI の紹介
- 15. Golangで再帰関数を書く
- 16. Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
- 17. 【Go】依存性注入ライブラリwireの使い方【DI】
- 18. Go 1.15 の reflect パッケージの変更の影響詳細について
- 19. Goでドメインの名前解決を強制的に行う(curl –resolveに相当することを行う)方法
- 20. React Nativeで作ったアプリをリリースしてから1年経ったので振り返ってみる
http sample with go.uber.org/dig
“`go
package main
import (
“fmt”
“net/http”“go.uber.org/dig”
)type Handler struct {
Greeting string
Path string
}func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “%s from %s”, h.Greeting, h.Path)
}func NewHello1Handler() HandlerResult {
return HandlerResult{
Handler: Handler{
Path: “/hello1”,
Greeting: “welcome”,
},
}
}func NewHello2Handler() HandlerResult {
return HandlerResult{
Handler: Handler{
Path: “/hello2”
Golang+Ginでswaggerを自動生成する(gin-swagger)
# はじめに
api開発の時に必須と言っても過言ではない`swagger`ですが、なんと言っても保守し続けるのがとても面倒くさい、、、
できればコードから勝手にswaggerを生成してくれるといいのですが、、、そんな要望に対しての解決策の1つとなるのがこのgin-swagger(https://github.com/swaggo/gin-swagger)
です。これはgoのコードに指定のコメントを追加していくことで自動的にswaggerのコードを作成していくためのツールです。
# 今回のゴール
今回はこのような簡単なCRUDのswaggerを`gin-swagger`を用いて作成していきたいと思います!
![スクリーンショット 2020-08-02 22.13.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/d5485bb3-42f0-abe1-68a7-88f58042b3cd.png)### ディレクトリツリーはこんな感じです!
rootディレクトリは`gin-swag
Istioはいかにしてサービス間通信のセキュリティを担保しているのか?
## この記事について
この記事では、Istioがどのような考え方でサービス間通信のセキュリティを担保し、
どのように担保しているかを概観レベルで整理する。## サービス間通信で担保したいものと従来のセキュリティモデル
サービス間通信として担保したいものとして、
通信するアクセス元を制御し、盗聴やなりすまし、改ざんといった攻撃から守ることが挙げられる。
つまり、– man in the middle攻撃への防御
– アクセス制御がセキュリティ要件として挙げられる。
従来のセキュリティモデルとしては、
プライベートネットワークを構築し、IPベースでアクセス元を制限することでこれらを担保してきた。
(AWSのPrivate VPCとSGがわかりやすい)## Istioではどういうアプローチをとったのか?
昨今のコンテナベースで構築されるシステムでは、IPアドレスは高頻度で動的に変更されるためこのアプローチだと破綻する。
そこでIsitoは各ワークロードに対してIDを定義し、IDベースでアクセス制御を行うことととした。
具体的にはどういうアプローチなのか?## コアコンセ
カリー化チートシート
拙作『[不動点コンビネータを用いた無名再帰関数の実行まとめ](https://qiita.com/ytaki0801/items/596efbbcb07d38630bc9)』の補足説明として書き始めたところ,カリー化関数を記述・利用するための独立したチートシートとした方が少なくとも約1名(自分自身)には役立ちそうだったので,新しく記事にした.なお,カリー化してくれる関数の定義[**ではない**](#%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96%E3%81%AE%E6%A6%82%E8%A6%81)ことに注意.複数言語にわたっている都合上,各言語に精通している方々のツッコミ歓迎.
記法のみの一覧は次の通り.なお,`f`は関数,`a`は引数を指す.
| 言語 | 各引数の戻り値 | 各引数の指定 | 備考 |
|:-:|:-:|:-:|:-:|
| Haskell | `\“->`による無名関数 | `(・・・(f a) a)・・・a` | 自動的にカリー化 |
| Scheme | `lambda`による無名関数 | `(・・・((f a) a)・・・a
golang の datastore の unittest でハマった話
# 概要
datastore.NewClient は実在の projectId を要求する
– context は aetest.NewContext を使う
– datastore client はテストでも使い方は同じ
– projectId が非実在のものだとエラーになる
– 実際の datastore には書き込まれていないのは確認済み–> **テストでも実在の ProjectId を指定する必要がある**
少し調べた範囲ではこれに関する情報が見つけられなかったため、あくまで推論。情報があれば教えて下さい。
# コード
“`go
func NewClient(ctx context.Context, projectId string) (*datastore.Client, error){
return datastore.NewClient(ctx, ProjectId)
}
“`“`go
func TestDatastore(t *testing.T) {
ctx, done, err := aetest.NewContext()
Goのldapモジュールで認証をLDAP認証をかける
## 認証したいユーザー
– `cn=yuta`
## ldapモジュールをインストール
“`bash
go get github.com/go-ldap/ldap
“`## サンプルコード
“`golang
package main
import (
“fmt”
“github.com/go-ldap/ldap/v3”
“log”
)var (
ldapServer = “ldap://localhost:389”
baseDN = “dc=vamdemic,dc=black”
username = “yuta”
password = “password”
bindusername = “cn=admin,dc=vamdemic,dc=black”
bindpassword = “password”)
// This example shows how a typical application can verify a login attempt
func Example_userAuthentication() {
l,
golangでOpenLDAPサーバへ接続する
# サーバを立てる
– DockerでOpenLdapを389で起動します
https://qiita.com/yuta_vamdemic/items/53cd67eea5af71ffd08a
# 認証する
### Ldapモジュールをインストール
“`bash
go get github.com/go-ldap/ldap
“`### コード
“`golang
package main
import (
“crypto/tls”
“errors”
“fmt”
“github.com/go-ldap/ldap”
)func ExampleconnSearch() (bool, error) {
ldapServer := “ldap://localhost:389”
err := errors.New(“connection error”)// ldapServerへの接続確認
l, err := ldap.DialURL(ldapServer, ldap.DialWithTLSConfig(&tls.Config{Insecur
[Go言語] 初心者必見シリーズ: 構造体(Structs)
# 構造体
構造体は、**フィールド(field)の集まり**です。
## 定義方法
構造体は下記のように `type` と `struct` を使用して定義します。
* 構文
“`go
type 構造体の名前 struct {
フィールド名 型名
フィールド名 型名
フィールド名 型名
…
}
“`**同じ型**のフィールド名は、**カンマ区切り**で書くことができます。
“`go
type 構造体の名前 struct {
フィールド名, フィールド名, フィールド名 型名
フィールド名 型名
}
“`* 例
人のデータをまとめた構造体です。
“`go
type People struct {
Name string
Sex string
Age int
Height int
Weight int
VS Code の Remote Container で複数のコンテナを起動して作業を切り替える
# はじめに
VSCode の Remote Container って便利ですよね。
ローカルPCの環境を汚さずにいろいろな言語を試すことのできるのが最高。ただ、サクッと試したいだけなのに、いちいち言語別に設定するのが面倒だったりしますよね。
この投稿では、1回起動するだけで複数のコンテナに接続できる設定を紹介します。
公式ドキュメントにも書かれているので、詳しく知りたい方はこちらを。
https://code.visualstudio.com/docs/remote/containers-advanced#_connecting-to-multiple-containers-at-once# デモコードの概要
ここでは、golang と python のコンテナを扱うこととします。
`.
├── golang
│ ├── .devcontainer.json
│ └── Dockerfile
├── python
│ ├── .devcontainer.json
│ └── Dockerfile
└── docker-compose.yml
`
## 設
Goでソースコードを画像化するCLIを作った
こんにちわ
ゴリラです普段、Twitterでたまにこういうふうにソースコードの画像を貼り付けることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/4bf71de8-abd8-ffee-27e5-af3968bbe859.png)
画像を作るのに[carbon](https://carbon.now.sh/)というサービスを使っています。
このサービスできれいな画像を生成できますが、インターネットとブラウザなしでは使えないためちょっと不便と感じています。
また、[slicon](https://github.com/Aloxaf/silicon)というrust製のツールもありますが、これもcarbonと同様の制限があります。
そこで、ブラウザやネットを使用せずCLIでソースコードを画像化できたら良いなと思いCLIを作りました。英語で表されるtime.Month型をintで型キャストしたら普通に変換できたのでメモ。
“`go:main.go
package mainimport (
“fmt”
“time”
)func main() {
now := time.Now()
year := now.Year()
month := now.Month()
monthToInt := int(month)
date := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()fmt.Printf(“年を表示:%v\n”, year)
fmt.Printf(“月をtime.Month型で表示:%v\n”, month)
fmt.Printf(“月をint型に変換して表示:%v\n”, monthToInt)
fmt.
Golangを唐突に始めたい衝動に駆られた話
# 金曜日の深夜に急にGoを始めたい衝動に駆られた
## 思い立った経緯
金曜日の夜にふと人気プログラミング言語について閲覧していた。そこでPythonやJavascript不動の人気に、「はい、そうですか。」気分でみていた。そこでみたGoLangをみて、「あ、せっかくだし触りだけでも今日やろうかな」と思ったので、自分への議事録のため記事を投稿。# やったこと
自分のPCでの動作環境構築と公式ドキュメントの「Packages, variables, and functions.
Learn the basic components of any Go progr」をやってみた## 動作環境
OS:macOS Catalina 10.15.6
Editor:Visual Studio Code 1.47.3
pkg管理:Homebrew 2.4.9## 環境構築
まずはGoLangのインストールから“`terminal
hoge@hoge-MacBook-Air ~ % brew install go
…省略…
hoge@hoge-MacBook-Air ~
GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
# 概要
モック化させたインターフェースの関数に、期待した値が入って呼ばれるかどうかをテストしたいシーンのお話です。引数に構造体のポインタを受け取る関数をテストする時、
* テストスイート内でアサーションのために宣言したオブジェクト
* 実際のビジネスロジックの中で生成されたオブジェクトはポインタが異なるため、オブジェクトのチェックが難しくなります。
gomockを使っている際に、この問題を解決する方法をまとめます。
# GoMock
GitHub: https://github.com/golang/mock今回使用したバージョンはv1.4.3です。
# ユースケース
概要だけだとイメージが湧きにくいかと思いますので、ここからは例を交えて説明します。
ユースケースは下記のようにシンプルなものを用意します。* タイトルと著者名を入力して、Bookオブジェクトを作成する
* タイトルに空文字を入れた時には、Bookオブジェクトのタイトルが「no title」になる## テストケース
テストでは、* **When**: ユースケースの関数に空文字のタイトルを
azbill: Azure 利用明細・課金情報出力 CLI の紹介
## はじめに
[azbill](https://github.com/yaegashi/azbill) という Azure クラウドサービスの利用明細・課金情報を出力してくれる CLI ツールを Go 言語で作ったので紹介します。主に Enterprise Agreement (EA) で Azure を導入している組織向けで、例えば部署ごと・リソースの種類ごと・タグごとの使用量を算出するといったようなコスト分析のためのデータを出力するツールです。
azbill を使うと EA の課金アカウントや Azure サブスクリプションに含まれるすべてのリソースの使用量・課金額を日次で取得し、CSV や JSONL の形式でファイルに保存できます。
このような利用明細の取得は Azure CLI でもできると思われるかもしれませんが、現行の Azure CLI は[新しいバージョンの Consumption API](https://docs.microsoft.com/en-us/rest/api/consumption/) に対応しておらず、予約 VM の利用状況といったような情報
Golangで再帰関数を書く
仕事でGoで再帰関数を書いた時に苦戦したので備忘録として残しておきます。
## サンプルコード
“`
func unpackStruct(data interface{}) interface{} {
switch d := data.(type) {
case *structpb.Struct:
_metadata := make(map[string]interface{})
for k, x := range d.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structpb.Value_StructValue:
_metadata := make(map[string]interface{})
for k, x := range d.StructValue.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structp
Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
構造体の埋め込みについてはよく書いてあるのだけど
埋め込んだ構造体に、埋め込んだ元の構造体を代入する方法があまりなかったのでメモ### 埋め込み
“`
type A struct {
A string
}
type B struct {
B string
}type C struct {
*A
*B
}
“`### 代入
“`
a := new(A)
b := new(B)
c := new(C)a.A = “hoge”
b.B = “hage”c = &C{B: b} // CにBを代入
“`### 代入済みのCにAを追加
“`
c = &C{
A: a,
B: c.B,
}
“`
【Go】依存性注入ライブラリwireの使い方【DI】
# Hello, World
## DI とは
[Weblio辞書から引用](https://www.weblio.jp/content/Di?edc=BINIT#:~:text=DI%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B,%E6%A6%82%E5%BF%B5%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82&text=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%88%90%E7%AB%8B%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE,%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%81%95%E3%82%8C%E3%82%8B)
*DIとは、プログ
Go 1.15 の reflect パッケージの変更の影響詳細について
# Go 1.15 の reflect パッケージの変更の影響詳細について
[Go 1.15 リリースノート 日本語訳](https://qiita.com/c-yan/items/dad49c9dce27e77a94e7#reflect) として、reflect パッケージの変更内容を日本語訳したものの、いまいち何を言っているのか分からなかったので確認してみた.
“`go
package mainimport “reflect”
type u struct{}
func (u) M() {}
type t struct {
u
u2 u
}func main() {
reflect.ValueOf(t{}).Method(0).Call(nil) // no problem
reflect.ValueOf(t{}).Field(0).Method(0).Call(nil) // panic on go1.15
reflect.ValueOf(t{}).Field(1).Method(0).Call(nil) // panic on go
Goでドメインの名前解決を強制的に行う(curl –resolveに相当することを行う)方法
## やりたいこと
Goでドメインの名前解決を強制的に行う。ドメインの名前解決を外部DNSを通して行うのではなくて自分でIPアドレスを指定して解決したい場合は、通常はローカルマシンのhostsファイルに以下のように記述すればよい。
“`
203.0.113.0 google.com # google.comを 203.0.113.0 に解決させる例
“`hostsファイルを使用する以外だと、`curl`コマンドに`–resolve`オプションというのがあり、以下のように指定することでコマンド実行時に直接名前解決を行わせることが可能だ。
“`
curl https://google.com –resolve “google.com:443:203.0.113.0”
“`今回はこのcurlの場合と同様に、hostsファイルを使わずにリクエスト実行時に強制的にドメインにIPアドレスを与えるということをGoでやりたかった。
そもそも可能なのか、可能だとしたらどういう方法でできるのか分からず色々と検索していたら、まさに同じことをやろうとしてた人の[stack
React Nativeで作ったアプリをリリースしてから1年経ったので振り返ってみる
![Frame 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170824/fcdbe13f-04d9-e44c-a53a-a7a7d2753a77.png)
[React Native製、予定作成アプリ「ペペロミア」を公開しました](https://qiita.com/wheatandcat/items/3324dfd141729e46009f)
以前記事にしたペペロミアが公開してから1年経ったので振り返りも兼ねて記事にまとめてみました。
個人プロダクトのアーキテクトとかの参考になれば良いかなと思います。# 主に使用している技術
* アプリ
* [Expo(React Native)](https://expo.io/)
* Backend
* [Golang](https://golang.org/)
* Web版
* [Nuxt.js](https://ja.nuxtjs.org/)
* ヘルプサイト
* [Gatsby.js](http