- 1. Go言語によるWebアプリケーション開発 チャットアプリのその後
- 2. Go-twitter で GET friendships/lookup
- 3. なぜサーバAPIプログラムはJavaではなくGoなのか?
- 4. OSSに参加にする敷居を下げるコマンドgossを作ったよ
- 5. 【LIFF入門?】LIFFでLINE Offical Account(旧LINE@)上に予約フォームを作成する
- 6. GoでGET/POST
- 7. How to print struct variables data?
- 8. Go言語でKibana(Elastic Cloud)へのプロキシを作成する
- 9. gRPC: そもそもRPC って何?
- 10. Go言語でのインターフェースの遅さ
- 11. S3へファイルをアップロードするLambda関数をSAMで書く
- 12. goで作ったツールインストールするの面倒くさい
- 13. PostgreSQLのNotifyを使ってGraphQL Subscriptionを実装する(バックエンド構築編)
- 14. S3バケット別概算コスト算出ツールを作ってみた
- 15. AtCoder Beginner Contest 161 参戦記
- 16. Protocol Buffersのメッセージ定義からHTMLのフォームを生成してみる実験
- 17. もう二度と迷わない!絶対にバグらない二分探索の実装法
- 18. GormでIN、OR、UNION ALLのクエリ書いてみた
- 19. Go言語の環境構築
- 20. web開発独学のためのロードマップと参考資料
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 言語でのス
S3へファイルをアップロードするLambda関数をSAMで書く
# はじめに
この記事は、AWS SAMを用いてファイルをS3にアップロードするLambda関数を作成する記事です。
# やりたいこと
今回は、何かしらのファイル(本記事ではJSON)をS3にアップロードする処理を、AWS SAMを用いてCloutWatchイベントから定期的に発火させる、ということをやっていきます。
![スクリーンショット 2020-04-05 23.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264906/0831c4ce-9697-a768-098b-27c6b111db09.png)# 開発環境
– macOS Catalina
– vim
– Golang (1.12.6)
– aws-sam-cli
– Minio# SAMの設定
今回は[AWS SAM](
goで作ったツールインストールするの面倒くさい
## goでツール作ろう
「まくる」と言うほどには作ってないけど。
ところで、go製のツールいっぱいあるけど、管理だるくない?install は楽ちん。
“`
$ go get github.com/foo/bar
“`で、一月ほど経った頃に、 `bar` がアップデートしたらしいことを知る。
さて、なんだっけなと思いながら“`console
$ go get github.com/bar/bar
“`あれ、通らねえやとなる。しょうがないので、調べてああそうだ、fooさんだったこれ、となる。
…ならまだしも、変なツールインストールしちゃったりしたら目も当てられない。そしてさて、新しい環境作るかな、となるとこれをインストールしたツール分繰り返す。
だるい。## homebrewっぽくしたい
作った。
https://github.com/kyoh86/gordon“`console
$ gordon install foo/bar
$ which bar
/home/kyoh86/.local/bin/bar
$ gordon update
$
PostgreSQLのNotifyを使ってGraphQL Subscriptionを実装する(バックエンド構築編)
# 前置き
**前提**– prisma2インストール済み
– docker環境インストール済み
– 記事内のgqlgenはエイリアスに登録して使っています。
– gqlgenとprisma2のliftをある程度使っている人向け**サンプル**
https://github.com/graphql-lab/subscription-with-postgres-notify**こんな感じの作っていきます**
最終的にpythonのスクリプトを叩くと
異なる端末の画面がリアルタイムに更新されるというもの
これを応用すればスクレイピングした結果を定期的にwebサイトにつぶやかせる、というbotが
作れるかと
![subscription.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/764903ec-199e-224e-6ae3-b07de328deea.gif)# 下準備
`gqlgen init`からビルドし、必要なディレクトリを作って…とやっても良いのですが
今回は
S3バケット別概算コスト算出ツールを作ってみた
# はじめに
S3って安価なストレージなので、容量気にせずとりあえずなんでも格納して放置なんてことが多いですよね?
将来的に分析するかもってことでデータレイクに蓄積して結果使わないなんてことも多い。(my観測範囲)で、新型コロナウィルスの影響で先行き不安な状況なので、収束まではどうにか支出を抑えて凌ぎたいという
人も多いと思い、要否判断(&不要であれば削除)しやすいように、S3バケットごとに使用量/概算コストを
一覧表示するツールを作ったので、紹介します。# ツール概要
一言で言えば、
`全リージョン/全バケット別にオブジェクト数/使用バイト数/概算月額料金を出力するツール`
です。(誰かが作ってそうなんですが探してもなかったので作りました)[CloudWatchからバケットサイズなど取得できる](https://dev.classmethod.jp/articles/s3-cloudwatch/)ようになってるので、それを実行すればawscliでも取得できる
のですが、リージョン指定しないといけないとか、メトリクス/ディメンションを指定するのがダルイので
そこらへんう
AtCoder Beginner Contest 161 参戦記
# AtCoder Beginner Contest 161 参戦記
## [ABC161A – ABC Swap](https://atcoder.jp/contests/abc161/tasks/abc161_a)
3分で突破. 書くだけ. オンラインのコードテストが詰まってて時間がかかってしまった.
“`python
X, Y, Z = map(int, input().split())X, Y = Y, X
X, Z = Z, X
print(X, Y, Z)
“`## [ABC161B – Popular Vote](https://atcoder.jp/contests/abc161/tasks/abc161_b)
4分で突破. 閾値が総投票数の 4 * M 分の一なのでまずそれを求め、その閾値を超える票数の商品がM個以上あるかを調べる. オンラインのコードテストが詰まってて時間がかかってしまった.
“`python
N, M = map(int, input().split())
A = list(map(int, input().split())
Protocol Buffersのメッセージ定義からHTMLのフォームを生成してみる実験
# はじめに
HTMLでフォームを作るのは技術的には簡単なのですが、何度もやることになると作業の重複が多くなって疲れるかと思います。ここではProtocol Buffersを用いてフォームの表示と処理の自動化を試みてみます。実運用するには足りない点も多々ありますので、一つの実験として読んでみて頂ければと思います。
コードは https://github.com/yt76/pbforms にあるので、cloneして(もしくはcloneしたつもりになって)お読みください。
# Protocol Buffersによるフォームの定義
例えば、名前(string)と年齢(int32)と同意の有無(bool)を取得したいとします。このメッセージを my_form.proto というファイルにあるように次の内容で定義します。
“`
message MyForm {
optional string name = 1;
optional int32 age = 2;
optional bool agree = 3;
}
“`こ
もう二度と迷わない!絶対にバグらない二分探索の実装法
# この記事について
二分探索アルゴリズムの概念自体はかなり基本的なものですが、いざ実装するとなると「ここのif文やwhile文の条件には=を入れていいんだっけ?」「leftやrightを動かすときはmiddle+1だっけ?middleそのままだっけ?」などたくさんの迷いポイントがあります。
この記事では、考えられる二分探索アルゴリズム全ての実装についてユニットテストを実施して結果を載せ、そこから見えるアルゴリズムの詳しい挙動について考察します。
この記事を全て読んだときには、正しい実装はどうすればいいのかきっちり覚えるはずです。## 前提条件
– アルゴリズムの実装はGo(ver1.14)で行います。
– 考察すっ飛ばして結果だけ知りたい方は本記事の末尾まで一気に飛ばしてください。## 読者に要求する前提知識
– 二分探索アルゴリズムの概要がわかっていること。(本記事では解説しません)# ループ条件一覧
二分探索の実装でポイントになる箇所は大きく4箇所です。“`golang
func bisect(array []int, key int) {
var left,
GormでIN、OR、UNION ALLのクエリ書いてみた
Gormで色々とクエリ書いて見て少し理解したのでメモ
UNION ALLに関しては公式にそれらしいものがなかったので独自で書いてみた
“`user.go
package domainimport “time”
type User struct {
ID string
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
“`“`repository.go
func (repo *Repository) FindAllByNames(names []string) ([]*domain.User, error) {
var users []*domain.User// IN
// SELECT * FROM `users` WHERE (name IN (‘taro’,’hanako’))
repo.db.Debug().Find(&users, “name IN (?)”, names)// OR
// SELECT * FROM `use
Go言語の環境構築
# Go言語の環境構築
備忘録がてら
## 実施環境
– macOS Catalina 10.15.3## Home brewのインストール
割愛
## Goのインストール
“`
$ brew install go
$ go version
go version go1.13.8 darwin/amd64
“`## GoPathの設定
“`bash
$ mkdir $HOME/go
$ vi ~/.bash_profile以下を追加
————————————
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
————————————$ source ~/.bash_profile
“`## vscodeの設定
– Goの拡張機能を追加
– 便利ツールたちの追加
– shift + command + P
– Go install/Update Tools をクリック
web開発独学のためのロードマップと参考資料
# WEB開発
友達のために最初の取っ掛かりのためのカリキュラムを書きます。
これを見ながら勉強の方針を立て、それをもとに自分で検索して、いろいろな勉強サイトを使って勉強していく感じで。
全部やろうとしなくていいです。
随時更新予定。
環境はwindowsを想定してます。## はじめに
プログラミングは挫折しやすいです。
すべてを理解しようとはせず、ある程度できたらアウトプットしてまた次の新しいものを学び、飽きたり挫折したりしないようにがんばりましょう。
ググってもわからないことがあったら、なるべく早めにできる人に聞くといいと思います。
時間を無駄にしている可能性が高いです。## 開発環境構築
まずは自分のパソコンにプログラミングをする環境を作ります。#### [VSCode](https://code.visualstudio.com)をインストール
これはエディタです。これを使ってプログラムを書いていきます。
便利な拡張機能を紹介
* Bracket Pair Colorizer(括弧に色がつく)
* ESLint
* HTML CSS Support
* HTML