oinume journal

Scratchpad of what I learned

2019年01月の振り返り

アウトプット

OAuth 2.0について以下の記事を書いた。少しかじった程度だけど、その知識をアウトプットした感じ。

journal.lampetty.net

英語

  • Daily Tech News Showをほぼ毎日聞いている
    • 1エピソードが5分以内なので聞きやすい。長い英語のpodcastは途中で集中が切れてしまうと離脱してしまうけど、5分なら集中できる
    • また、テック業界のニュースが多いので基本的な文脈はわかっているため内容も理解しやすい
    • これを聞いていて思ったのは、日本に流れてこないニュースが意外とあるのだということ。なんとなく得した気分になる
  • DMM英会話で、Daily Newsだけではなく文法をやり始めた。難易度が高い方から逆順にやっているのだけど、意外と忘れていることが多いので良い。
  • 6月にIELTSの試験を受ける予定

アルゴリズム

本は読んでいるけど特にアウトプットはなし。

アルゴリズムイントロダクション 第3版 総合版:世界標準MIT教科書

アルゴリズムイントロダクション 第3版 総合版:世界標準MIT教科書

睡眠時間

今年に入ってからなるべく早くベッドに入るようにしていい感じのペースができている。1月の平均だと5時間59分だった。6時間以上寝た次の日は頭がちゃんと働いているのがよい。

仕事

チームが変わってそのチームにさらにインターナショナルなメンバーが増えて、英語を使うことがさらに多くなった。

  • インド
  • 台湾
  • 中国
  • ノルウェー
  • 日本

というめちゃくちゃ多国籍なチームになっている。隣に座っている人はノルウェーの人は日本語もけっこう得意なんだけど、彼と話す時はだいたい英語。Slackも3分の1ぐらいは英語になっている気がする。意外なのは、英語を覚えても日本語自体の語彙や会話力は衰えていなさそうなので、これは良いことだ。

2月重点的に頑張ること

  • アルゴリズム
  • Spannerの勉強

クライアントを作って理解するOAuth2(準備編)

はじめに

GoogleやFacebookなどの外部サービスのAPIを利用する上で欠かせないのがOAuth2という仕様なんだけど、この仕様だけ読んでいてもつまらないしよーわからんので、実際に手を動かしてみて理解を深めよう、というのがこの記事の趣旨です。実際にはOAuth2素人が少し仕事でかじった知識をアウトプットしたものです。

OAuthとは

エンドユーザーのデータを3rd party applicationに渡すための仕組み。日本語だとこのページの説明が一番わかりやすい。

qiita.com

OAuth 2.0自体のRFCの仕様は以下にある。

必要なもの

  • Googleアカウント。GCPプロジェクトを作成するために必要
  • Go runtime(optional)

準備

  • 今回はOAuth 2.0のAuthorization Code grantというGrant typeを使って認可を行う
  • この記事で作成するGmail Fetcherというものを3rd party applicationとしてGoogleに登録し、Access tokenを取得してGoogleのAPIを呼び出す

そのためには以下の手順でGoogleにアプリケーションを登録する必要がある。まずはGCPのConsoleからプロジェクトを作成する。詳細は以下の動画を見てほしい。

youtu.be

  1. プロジェクト名はoinume-gmail-fetcherにする。ただ、他の人がプロジェクトを作る場合、oinumeは自分のアカウント名とか適当な文字列にしておく。でないと重複して作れないので。
  2. 次に、左上のメニューからAPIs & Servicesを選んで、APIs & Servicesのページを開き、ENABLE APIS AND SERVICES のボタンをクリックする。
  3. そうするとAPIの一覧の画面に行くので、スクロールしてGmailのAPIを探してクリックする。
  4. そしてENABLEボタンをクリックしてGmailのAPIを有効にする。
  5. 次にCredentialsの画面を開き、CREATE CREDENTIALSのボタンをクリックする。
  6. フォームが出てくるので以下のように入力し、What credentials do I need?ボタンをクリックする。
    • Which API are you using?: Gmail API
    • Where will you be calling the API from: Web server
    • What data will you be accessing?: User data

上の手続きを行ってClient idの発行が終わったら準備は完了。長くなるので、実際にOAuth2のフローの説明については次の記事で説明する。

用語の説明

ClientというのはGoogleで登録するあなたの3rd party applicationのこと。今回はgoogle profile getterというアプリケーションを作ってみるとする。

Resource owner or End user

エンドユーザー。Resource serverにデータ(リソース)を預けている。

Client

3rd party applicationのこと。今回だとgmail-fetcherのことを指す。End userからの認可を得てResource serverのデータにアクセスするアプリケーションのこと。

Resource server

End userのリソースを保持するサーバー。今回だとGoogleがこれに該当する。

Authorization server

End userからの認可を得てAccess tokenを生成するもの。日本語では認可サーバーと呼ばれる。

Client id

ClientのID

Client secret

Clientごとに発行される秘密鍵のようなもの。access tokenを取得する際に使用する。これが漏洩すると自分のアプリケーションを詐称してEnd userのデータにアクセスできてしまうので、漏洩しないようにする。 参考 - https://ja.stackoverflow.com/questions/26469/ - https://oauth.jp/blog/2012/08/03/re-oauth-20clientsecret/

OAuth consent screen

End userに表示する認可画面のこと。

Authorized redirect URIs

End userが認可画面でClientに認可をしたあとにコールバックされるURI

Scopes for Google APIs

End userがClientに対して認可を求めるスコープ。権限ともいう。例えばGmailのAPIを使ってメール送信したい場合は、メール送信をするためのscopeを要求する必要がある。

Access token

ClientからResource server(今回だとGoogle)のAPIを呼び出すためのトークン文字列。

次回作

1月中にはアップすると思うので乞うご期待。

OAuth徹底入門 セキュアな認可システムを適用するための原則と実践

OAuth徹底入門 セキュアな認可システムを適用するための原則と実践

  • 作者: Justin Richer,Antonio Sanso,Inc. Authlete,須田智之
  • 出版社/メーカー: 翔泳社
  • 発売日: 2019/01/30
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

2019年の抱負

もう10日以上経ってしまったけど2019年の抱負。

大方針:アウトプット

今年のテーマは アウトプット を第一にする。昨年は本を読んだりUdemyでいろいろ勉強していたけど、雑でもいいからアウトプットすることで自分の血肉にしていきたいと思っている。

1日6時間以上寝る

よい自分はショートスリーパーなので、去年はだいたい1日5時間ぐらいしか寝ていない。ただ、これだと仕事でやる気が出なかったり、体調を崩したりする原因になるので、最低でも6時間は寝るようにする。朝はだいたい6:30には起きるので、0時にはベッドに入るようにする。

アルゴリズムもっと勉強する

とりあえずこの辺。

  • BTree
  • Graph
  • オートマトン

暗号技術を勉強する

暗号技術に対する理解が圧倒的に低いため、アルゴリズムを終えたら以下の本を読んでしっかり勉強する。

暗号技術入門 第3版

暗号技術入門 第3版

業務で必要なものを身につける

  • gRPC
  • Cloud Spanner
  • Cloud PubSub
  • SQLを復習する

英語を再開する

惰性でDMM英会話を続けているけど、まだまだ文法も表現力も少ないのでちゃんと自分の今の状態をmeasurableにしてステップアップして行きたい。そのためにIELTSを今年は受ける。目標としては6.5以上を目指したい。なぜTOEICではなくIELTSかというと、海外の大学の入学基準だったり、例えばカナダだとVISAの条件になっていて、TOEICより圧倒的に汎用性が高いため。

ブログ

ちゃんとした記事を月に1つは書く!

2018年の振り返り

あけましておめでとうございます。年末年始は親戚とハワイで過ごしていました。冬なのに海に入るという謎の体験をして、正月感はまったくなかったけどこれはこれで新鮮でした。

仕事

年始からチームを異動してPlatform開発の仕事をしていた。あまり具体的なことは言えないけど、メルカリのmicroservice化を進めるにあたり重要なコンポーネントの開発・運用をやっていた。自分にはこういうPlatformや基盤のようなものは向いていないかなと思っていたけど、やっていくうちにそれなりに知識がついてきて意外と楽しくなってきたのと、チームメンバーにも恵まれて自分の意見を臆せずバンバン言える雰囲気で良かったと思う。

2019年からはそんなチームを離れて、エンドユーザーに近い機能開発をしていく予定。

上海出張

gophercon.vn

年初の抱負に対する実績

今年は3ヶ月ごとに必ず振り返りをするということを行ったおかげでまったく目標が達成できない、ということはなかったように思う。ただ、やりたいことに対して圧倒的に時間が足りないというのは例年と変わらずで、2019年はやりたいことをもっと絞らないと駄目だと思っている。

アルゴリズム

  • ハッシュテーブルを実装した
  • 文字列検索でブルートフォースを実装した
  • 文字列検索でBoyer Moore法を実装した
  • 2分探索木を実装した
  • B木を実装中

ブロックチェーン

機械学習をやめて途中からブロックチェーンを学ぼうと思ったけど、途中からやる気がなくなりあまり進捗が良くなかった

lekcijeに課金機能をつける

途中からGKEに移行することを優先したので進捗がほぼない。

書いたブログ

2018年の前半はわりとブログを書く余裕があったのだけど、後半になって仕事が忙しくなってきてからはあまり書けていない。自分の学んだことをアウトプットしないとどんどん忘れてしまうので書きたいとは思いつつも後回しになってしまっていてこれは良くないなと思う。来年は月に1本ぐらいはちゃんとした内容のものを書きたい。

プライベート

サンフランシスコ行った

1月に奥さんの出張に付き合ってロス+サンフランシスコに家族で行ってきた

e-Residencyカードとマイナンバーカードを作成

2017年の12月にエストニアに行った勢いでe-Residencyカードという、エストニアに住んでいなくても銀行口座が作れたり会社作れたりするマイナンバーカードみたいなものを作った。ついでに日本のマイナンバーカードも作った。

病気になって人生初入院

こいぬめ氏の扁桃炎を被弾して自分も扁桃炎にかかる。息子はなんと扁桃腺を手術で切除する事態に... 自分はそこまではいかなかったけど、血液検査したら「今すぐ入院しないとまずいレベル」と医者に言われて即日病院送りに... 5日間入院して、ひたすら点滴を打つ毎日。

KORN

退院した直後にKORNのライブを観に行った。

副業的なもの

友達の仕事を手伝うなどした。まぁWordPressのセットアップをしてデータをサルベージしただけなんだけど。

2019年に向けて

まず仕事が忙しくなるとブログを書かなくなったり個人の勉強をおろそかにしてしまうのが本当に良くないと思っている。そもそも仕事が忙しいこと自体、自分にも責任があるのでちゃんとコントロールするようにしないといけない。この辺の課題をクリアしつつ、もう40歳になってしまうので、人生設計を真面目に考えないとマズい...

  • 達成したい目標を絞る
  • 仕事を忙しくし過ぎない
  • 今後10年の大まかな計画を立てる

あたりを2019年は頑張ろうと思う。

Satisfying a large interface quickly in Go

Sometimes it's painful to safisfy a large interface in Go. Here is a simple answer for this, just embed interface on struct like bellow:

package main

import (
    "fmt"
)

type Foo interface {
    MethodA()
    MethodB()  
    MethodC()
    MethodD()   
}

type FooImpl struct {
    Foo
}

func (fi *FooImpl) MethodA() {
    fmt.Println("MethodA called")
}

func main() {
    foo := new(FooImpl)
    foo.MethodA() // Implemented
    foo.MethodB() // Not implemented, runtime error will happen
}

You can check the result on https://play.golang.org/p/0y8ICTWCfpy.

  • MethodA called is printed
  • And then a runtime error happens by calling foo.MethodB

This technique is useful in unit test.