- 1. JSON から C#、TypeScript、Swift、Go などの型定義を生成してくれる VS Code 拡張機能
- 2. Datadog APMをGoで使う
- 3. アーキテクチャのアの字も知らない駆け出しエンジニアがドメイン駆動開発における依存性の逆転をgolangで実装しながら理解してみた
- 4. Goで日本語曜日を含む日付format
- 5. Goで設定ファイルを扱う
- 6. 【Go】log.Fatalは気軽に使わない
- 7. Go-twitter で相互フォローを実装する
- 8. gRPC: prototoolからbufへの道 ~ vol. 1 ~
- 9. Go言語でWebAssemblyを使う際の型変換
- 10. [Go] Realizeで実行ファイルを指定する
- 11. Go言語によるWebアプリケーション開発 チャットアプリのその後
- 12. Go-twitter で GET friendships/lookup
- 13. なぜサーバAPIプログラムはJavaではなくGoなのか?
- 14. OSSに参加にする敷居を下げるコマンドgossを作ったよ
- 15. 【LIFF入門?】LIFFでLINE Offical Account(旧LINE@)上に予約フォームを作成する
- 16. GoでGET/POST
- 17. How to print struct variables data?
- 18. Go言語でKibana(Elastic Cloud)へのプロキシを作成する
- 19. gRPC: そもそもRPC って何?
- 20. Go言語でのインターフェースの遅さ
JSON から C#、TypeScript、Swift、Go などの型定義を生成してくれる VS Code 拡張機能
いつも、https://quicktype.io を使ってたのですが、VS Code 拡張機能があることにさっき気づきました。
[Paste JSON as Code](https://marketplace.visualstudio.com/items?itemName=quicktype.quicktype)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/6c31afd8-1b2f-7fff-e031-1e0c8c2d38af.png)
例えば OpenWeather のレスポンスの JSON をクリップボードに格納してる状態で VS Code のコードパレットから `Paste JSON as Code` を選択すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/eb9fb42e-f3f5-6507-6a7c-1e568bab264f.png)
Datadog APMをGoで使う
# はじめに
Datadog APMの簡単な特徴とGoで使用するための方法をまとめました。
公式サイトのドキュメントを見ていただくことを勧めますが、
補足資料として見ていただければと思います。[公式ドキュメント](https://docs.datadoghq.com/ja/tracing/)
[TraceパッケージのGoDoc](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace)また、ここではDatadogのAPM以外の機能については割愛します。
# APMとは
Application Performance Managementの頭文字をとった略語で、一般的にはアプリケーションやシステムの性能を管理・監視するものです。
DatadogのAPMではマネージドクライド、オンプレミスに関わらず分散トレーシングに対応しています。
Flame GraphやSpan Listなど整理された形でトレース結果を取得できるようになっています。– Flame Graph
アーキテクチャのアの字も知らない駆け出しエンジニアがドメイン駆動開発における依存性の逆転をgolangで実装しながら理解してみた# アーキテクチャのアの字も知らない駆け出しエンジニアがドメイン駆動開発における依存性の逆転をgolangで実装しながら理解してみた
こんにちは!例のウイルスで大学の休みが延期されて、引きこもりながらますます楽しいプログラミングライフを送っているとさです。
今回は、ドメイン駆動開発における「アプリケーションサービス」と「リポジトリ」の部分の実装をしながら、
学習していきたいと思います。機能を分割して、コードをわかりやすくすることを目標にやっていきます。# アプリケーションサービス
A君
アプリケーションサービスは、ユーザーのユースケースの機能を実装する部分になります。B君
ユースケースってなんぞや??A君
ユースケースっていうのは、ユーザーがシステムに対してできること
例えば、よくあるSNSで言えば、「ユーザーデータを登録」したり「ユーザー情報を更新」したり「ツイート」したり
なんてものがユースケースに当たるよ。B君
へ〜、つまりはユーザーがシステムに対してできることって感じだな。A君
そうそう、その機能を実装する部分を今回はアプリケーションサービスって読んで
Goで日本語曜日を含む日付format
Goに限った話じゃないけど、日本語の曜日(月, 火, 水…)を表示したいときは、先に言語公式の機能でformatしてしまい、英語の曜日を文字列置換で置き換えるとコードがきれいになる。(効率的には文字列置換は重いと思うけど、読みやすさはだいぶ上がると思う)
“`go
package mainimport (
“fmt”
“time”
“strings”
)func main() {
t := time.Now()
weekdayja := strings.NewReplacer(
“Sun”, “日”,
“Mon”, “月”,
“Tue”, “火”,
“Wed”, “水”,
“Thu”, “木”,
“Fri”, “金”,
“Sat”, “土”,
)
fmt.Println(weekdayja.Replace(t.Format(“2006年1月2日(Mon曜日)”)))
// 2009年11月10日(火曜日)
}
“`Goで複数の文字の組を一括置換したいときは、Replacerを使うとよいようだ。
https://golan
Goで設定ファイルを扱う
# はじめに
本記事は、Goでアプリケーションで使用する設定値を外部ファイルから取得する方法についてのメモです。## 設定ファイルのフォーマット
設定ファイルを定義するフォーマットとして、メジャーなものは以下のとおりです。|フォーマット|特徴|
|:–|:–|
|ini|Windowsで主に使用。明確な仕様がないため実装に差異がある。|
|json|対応言語が多い。拡張性もあるが、コメントが書けない。[RFC4627](https://www.ietf.org/rfc/rfc4627.txt)に仕様が明記|
|yaml|JSON相当の汎用性があり、コメントが書ける。若干の学習が必要。|
|toml|新しいフォーマットでライブラリによる品質に差異がある。|
参考: [みんなのGo言語 改訂2版 ISBN978-4-297-10727-7](https://gihyo.jp/book/2019/978-4-297-10727-7)どのフォーマットを使うかは好きなもので良いですが、オススメできそうなのはjsonかyamlです。
今回は、[以前の記事](https://qii
【Go】log.Fatalは気軽に使わない
Goのエラーハンドリングでよく見る形のこんなコードを書いていました
“`go
if err != nil {
log.Fatal(err)
return err
}
“`コレで試してみるとエラーのときに強制的にプログラム終了。。。
# 何が起こっていたか
`log.Fatal` の挙動を調べてみたらすぐに分かりました。
“`go
// Fatal is equivalent to Print() followed by a call to os.Exit(1).
func Fatal(v …interface{}) {
std.Output(2, fmt.Sprint(v…))
os.Exit(1)
}
“``os.Exit(1)` でプログラムが終了してしまうみたい。。。
# ついでにログレベルを調べてみた
| ログレベル | 説明 | 例 |
|:——-|:——|:—–|
| emergency |システムが使用不可能な状態||
| fatal |致命的なエラー|プログラムの異常終了を伴うよ
Go-twitter で相互フォローを実装する
[Go-twitter で GET friendships/lookup](https://qiita.com/manymanyuni/items/8599c8397054a141fcc3) で作成した lookup API を利用して、go-twitter で相互フォローを実装してみます。
“`go:twitterut.go
package twitterutimport (
“bytes”
“context”
“fmt”
“net/http”
“strings”“cloud.google.com/go/logging”
“github.com/dghubble/go-twitter/twitter”
“github.com/dghubble/oauth1”
“github.com/dghubble/sling”
)type Client struct {
HTTPClient *http.Client
*twitter.Client
}func NewClient() *Client {
config := oauth1.NewConfi
gRPC: prototoolからbufへの道 ~ vol. 1 ~
# gRPC: prototoolからbufへの道 ~ vol. 1 ~
## Bufとは
Protobufが技術的なメリットの良い選択になるだけでなく、非常に使いやすく決定が簡単になることです## 機能
– 自動ファイル検出
– prototoolとは違い、任意に指定も可能
– 正確なlintとbreaking checkersの構成が選択可能になる
– lint: 40 breaking checkers: 50
– エラー出力はどのエディターでも簡単に解析可能
– コンパイルの高速化
– protoc: 4.3sに対して 4コアでbuf: 0.8s
– protocのプロトコルプラグインとして使用## Buf CLIツール
### サポートされている機能
– 優れたAPI設計の選択と構造を強制するリンター
– ソースコードまたはワイヤレベルでの互換性を強制する重大な変更検出器
– FileDescriptorSetsの拡張機能であるイメージを生成する構成可能なファイルビルダー### インストール方法
“`
brew tap bufbuild/bu
Go言語でWebAssemblyを使う際の型変換
ちょっとつまづいたので、忘れないようにメモ代わりに書いておきます。
実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0“`:index.html
該当部分だけ表示
結果“`
“`:エラーになります
func act(this js.Value, i []js.Value) interface{} {value1 := i[0]
value2 := i[0].String()
value3 := i[0].Int()
fmt.Println(reflect.TypeOf(value1)) //=> js.value
fmt.Println(reflect.TypeOf(value2)) /
[Go] Realizeで実行ファイルを指定する
## Realizeとは
realizeが分からない人はぜひこちらのページをみてください
https://qiita.com/enta0701/items/9f60ad18600acab8c93d## Ralizeでのディレクトリ指定
go言語にはディレクトリ構成のスタンダードがあり、実行ファイルはcmd配下、他のファイルはinternalなどの配下に保存するようです。
参考:https://qiita.com/sueken/items/87093e5941bfbc09bea8しかし、プロジェクトルートでrealizeを起動したところ、以下のエラーが出てしまいました
“`console
$ realize start
[01:09:22][GO_BASE_REST] : Watching 7 file/s 15 folder/s
[01:09:22][GO_BASE_REST] : Install started
[01:09:23][GO_BASE_REST] : Install
build .: cannot find module for path .
“`
Go言語によるWebアプリケーション開発 チャットアプリのその後
# 本記事について
[Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/)のチャットアプリでちょっと遊んでみます
チャットアプリを外部公開する方法と、なりすましについての説明があります。
後者は手元のサーバ以外に実施すると、法に触れる可能性があります。**悪用厳禁です**## 外部公開
`ngrok`を使用し、指定したポートを外部に公開することができます。
(画像にある通り、セッションは8時間で途切れてしまうみたいなので。実用的ではないですね)“`
$ ngrok http 8080
“`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/696c807d-f354-5a55-f740-39016b4de18f.png)
実行すると、URLなどの情報がでてきます。後でhttpの方を使用します。本の手順でgoogle developer consoleを設定したら、
認証情報の*
Go-twitter で GET friendships/lookup
[go-twitter](https://github.com/dghubble/go-twitter) で GET friendships/lookup.json を呼び出す際のサンプルです。
go-twitter は現在 GET friendships/show をサポートしていますが GET friendships/lookup はサポートされていないようです。show だと
Requests / 15-min window (user auth) 180
Requests / 15-min window (app auth) 15
つまり最大 180 ユーザlookup だと
Requests / 15-min window (user auth) 15
up to 100 are allowed in a single request.
つまり最大 15*100=1500 ユーザと一回の API コールで取得できるユーザ数が全然違うため、なるべくなら lookup を使いたいため頑張って実装してみました。
“`go:twitterut.go
package t
なぜサーバAPIプログラムはJavaではなくGoなのか?
# 背景
最近、プロジェクトのアプリケーション開発で選択する言語で迷う事が多い。
今一度なぜGoでアプリケーションを書くべきなのかをアーキテクトな視点でまとめてみる。
特に、既存あるいは新規プロジェクトで、サーバアプリケーションをjavaで開発すべきかGoで開発すべきか、という議論から始まる事が多い。
特にサーバサイドをコンテナ化していく、という際にAPI用プログラムにGoを選択する。
JavaではなくGoを選択する理由とは何なのか。# なぜ、「ナウいGo使おうぜ」では満足しないのか
もちろん、新しい技術を採用し知見を溜めたい。
今後の潮流にのっかるために、目の前のプロジェクトをお試しとしてGoを選択する、という案もある。
一方で、既に技術者や知見が残っている、安全性の高い言語で目の前のプロジェクトを安全に終わらせたい、という人間も少なからずいる。
そういった人間を説得しなければならず、そういった人たちには「新しいこと」は害悪である。
彼らは分からないことが怖い。新しい技術だからこそ、採用を見送りたく思うのである。
だから、新しい言語を選択したときに考慮しなければならない点、デ
OSSに参加にする敷居を下げるコマンドgossを作ったよ
#ご挨拶
こんにちは。
職業は盛り上げマスター(MM)です。
盛り上げマスターとは、最近新しくアジャイルな開発で導入され話題になっている役割で(嘘)
チーム内の居心地の良さを最大化することが仕事です。要はワイガヤ担当。Goを最近勉強しています。Go歴は1ヶ月です。
間違っている箇所など優しくご指摘いただけると嬉しいです。そしてGo初心者が作った物なので、このコマンドを実行して何か問題が発生しても自己責任でお願いします。
#作った物
https://github.com/kankanSunaga/goss
#何を作るか考えた
最近これ話題になってますよね。
https://github.com/tokyo-metropolitan-gov/covid19
東京都のコロナ対策アプリです。私もプルリクを出しましたが、案の定マージはされませんでしたw
でもこういった取り組みに参加できて良かったなと思っています。参加して思ったのが、もっとOSSの文化が根付ばいいな〜と思いました。
そこでできるだけOSSの参加の敷居を下げたいと思い、
コマンド一発で、fork,clone,
【LIFF入門?】LIFFでLINE Offical Account(旧LINE@)上に予約フォームを作成する
# はじめに
## こんな感じの作ります
## 使用技術
– LIFF (LINE Front-en
GoでGET/POST
Go の勉強がてら http リクエストを行うプログラムを作成したので適当に貼っておきます。
検索して引っかかってきた人の一助になれば幸いです。“`go:httput.go
package httputimport (
“context”
“fmt”
“io”
“io/ioutil”
“net/http”
“net/http/cookiejar”
“net/url”
“strings”
“time”“golang.org/x/text/encoding”
“golang.org/x/text/transform”
)const UserAgent = “My User Agent” // FIXME
type HTTPClient struct {
http.Client
CookieJar http.CookieJar
UserAgent string
}func NewClient(ctx context.Context, timeout time.Duration) (*HTTPClient, error) {
cookieJ
How to print struct variables data?
“`
package mainimport “fmt”
type Employee struct {
Id int64
Name string
}func main() {
emp := Employee{Id:1200, Name: “hoge fuge”}
fmt.Printf(“%+v\n”,emp) // Print with Variable Name
fmt.Printf(“%v\n”,emp) // Without Variable Name
fmt.Printf(“%d\n”,emp.Id)
fmt.Printf(“%s\n”,emp.Name)
}
“`
Go言語でKibana(Elastic Cloud)へのプロキシを作成する
この記事では App Engine Standard Environment(2nd gen) を用いて Kibana へのプロキシを作成する方法について紹介しています。
Elastic Cloud の一番安いプランで一つデプロイを持っているのですが、今回そこで可視化しているダッシュボードを不特定多数に公開したくなりました。
そこで困ったのが、Elastic Cloud には Anonymous ユーザ機能がない・・・。
ダッシュボードにアクセスさせるにはユーザにログインしてもらう必要があり、しかしパスワードとかは勝手に変更されないようにしなければならないので、みなさんどうやってるのか調べた結果、* nginx や Apache でリバースプロキシ
* Bearer basic ヘッダーで自動でログイン
* https://{ユーザ名}:{パスワード}@yoursubdomain.yourdomain/kibana では自動ログインできないので、ヘッダーで送る必要がある(ただ、ヘッダーの方がユーザパスワードを iframe の url に書かなくていいので安心できそう
*
gRPC: そもそもRPC って何?
# gRPC: そもそもRPC って何?
今回gRPC を学ぶ上で`RPC`の説明をできるようにするためにRPCとはについてご説明します。
## 概要
リモートプロシージャコール(RPC)は、分散コンピューティングのサブルーチンです。
RPCのリモート実装はローカル呼び出しに似ていますが、通常は同じではありません。
RPCでは通常、オブジェクト名、関数名、またはパラメーターがリモートサーバーに渡され、 サーバーは処理された結果をクライアント側に返します(要求/応答)。
RPCは、TCP、UDP、またはHTTPプロトコルを介して通信できます。
## Go での実装
今回はGoで server / client を実装して体験します。
Goでは、[公式ドキュメント](https://golang.org/pkg/net/rpc/)にあるように
明示的なCodecの指定をしない限り、`gob`を使用してマーシャリングされます。### サーバーの実装
“`
package mainimport (
“fmt”
“log”
“net”
“net/rpc”
Go言語でのインターフェースの遅さ
## TL;DR
Go 言語において:
1. 関数のパラメータに構造体を渡したい場合、実体コピーで渡すよりポインタを使用したほうが速い。
2. ポインタのダウンキャストはオーバーヘッドが存在する。
3. インターフェースを介したメソッド呼び出しはかなり高コスト。これらはどれも C/C++ や Java で同様の思い当たることがあるだろう。3 に関しては少し影響が大きいように見受けられ、パフォーマンスを目的として Go 言語を採用したのであればオブジェクト指向や責務の分担といった設計と両立が難しいコストとなるかもしれない。
なお筆者は Go 言語やランタイムの構造にあまり詳しくない点に注意。
## 経緯
以下のようなコードでパラメータの型 `Image` が比較的大きな構造体のポインタとなるインターフェースの場合にパフォーマンスはどうなのかという話がまずあり。
“`go
func (n Entity) LessThan(other Image) bool {
return n.Value < other.(*Entity).Value } ``` Go 言語でのス