oinume journal

Scratchpad of what I learned

2018年9月の振り返り

9月は10日間の奥さんの出張があったこともあり、本当にあっという間だった。

アルゴリズム

次はBTreeをやろうと思って、その前にAVLTreeやらないとダメそうで、そういえばBinarySearchTreeも実装したことないなって思ってBinarySearchTreeを実装した

10月こそはAVLTreeとBTreeやる。

ブロックチェーン

進捗なし

lekcijeの月額課金

月額課金の前に、インフラ環境をherokuからGCPの東京リージョンのGKEに移そうかなと思っている。

というのは、7月ぐらいにeikaiwa.dmm.comがSSL対応されたことにより、スクレイピング時のレイテンシが大幅に悪化したため、通知処理に時間がかかるようになってしまった。よりeikaiwa.dmm.comに近い場所からスクレイピングを動かさないとダメそう、ということでGCPの東京リージョンに移したい。

欲をいえばGKEではなくGAEで済ませたいのだけど(GKE高いし)、内部的にgRPCを使っているせいでGAEが使えない。早くGAE SEでgRPCが動かせるようになってほしい!(切実)

読書

橋下さんの「政権奪取論 強い野党の作り方」を読んだ。日本はアメリカのように2大政党制ではないので、自民党が危機感を持たず政治が国民を向いてないっていうことを具体的なエピソードをもとに説明している本。最初の方は面白かったし納得することも多かったけど、途中から似たようなエピソードが多くなってきたので途中で読むのをやめた。

政権奪取論 強い野党の作り方 (朝日新書)

政権奪取論 強い野党の作り方 (朝日新書)

プライベート

  • ジャック・ライアンがAmazon Primeにあったので見てしまった
  • 24の新しいシーズンがAmazon Primeに来てたので見てしまった
  • 奥さんが出張で10日間不在だったので育児ワンオペしてた
    • めちゃくちゃ大変だったけど、息子氏とより親密な関係を築けた
  • 楽天マガジンは雑誌を読む時間が確保できなくなってきたので解約した。時間が増えてきたらまた復活するかも。

2018年8月の振り返り

アルゴリズム

Boyer Moore法やった

次は何をやろうかと悩んだ結果、データベースでよく使うBTreeをやることにした。

ブロックチェーン

https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&aEightID=s00000016735001

ノロノロと亀のように進めている。6%完了。やっとスマートコントラクトの話が出てきた。

FLOCは受講料26万円の割には大した内容ではなかったので解約した。正直あれならUdemyのコースとか書籍で十分。とにかく、1ヶ月以内なら解約できるのはいい制度だと思う。

lekcijeの月額課金

進捗なし

blog.lampetty.netのリダイレクト

今まではVPS上のNginxでやっていたけど、GAEでやるようにした。nginx.confをメンテしたくないしそもそもVPSでNginxを動かしたくないのでその第一歩。

https://github.com/oinume/blog-lampetty-net-redirector

GoogleCloudFunctions for Goがalpha版プレビューになっていたので、正式版が出たらこっちに置き換えたい。

読書

Google流 疲れない働き方

Google流 疲れない働き方

ピョートルさんの本を呼んだ。途中でメルカリという社名が3回ぐらい出てきたのが気になったところ、Mercari Tech Confを手伝われていたということを知った。

IIJmioから楽天モバイルに乗り換えた

格安SIMのIIJmioが遅すぎるので乗り換えた。楽天モバイルだと低速回線モードでも1Mbpsぐらい出る。これはギリギリYouTubeが見れる速度。そして低速回線モードはいくら使ってもそれ以上は制限されない。IIJmioではありえないことに、低速回線モードでも3日で500MBを超えるとさらに速度制限をするという意味不明な仕様だった。なので、だいたい1Mbpsで生活して、困ったら高速回線モードに切り替えるという運用になった。おかげで一番安いプランになったので結果的に月額コストが下げられた。

P20 Liteを買った

AndroidはずっとNexus4を使っていたのだけどさすがに限界だったので買い替えた。Android 8.0だとさすがに使いやすい。カメラ以外はiPhoneの代わりにメイン機にしても良いレベル。AndroidはGoogleと密結合されているのが良い。

その他プライベート

  • MacBookPro(2016)のバッテリーが壊れて無償交換対象だったので交換してもらった。GeniusBarでお願いしたら2日後には家に届いていて早さにびっくり。Apple製品は高いけどアフターサービスはやっぱり良いよね。
  • 楽天マガジンはまだ継続課金してる
  • 1Password Familiesは使いやすくて最高なので年間課金した

まとめ

  • 8月はブログをまったく書かなかった。頑張ろう。
  • 暑かったせいか仕事以外のものがすべてにおいて疎かになってしまっていた
  • 2018年もあと4ヶ月しかない!

2018年7月の振り返り

機械学習

進捗なし。次からは振り返り対象から外す。

アルゴリズム

  • 文字列探索で力まかせのアルゴリズム実装した

ブロックチェーン

https://www.udemy.com/ethereum-and-solidity-the-complete-developers-guide/?deal_code=JPA8DEAL2PERCENTAGE&aEightID=s00000016735001www.udemy.com

このコースを少しだけ進めた。まだブロックチェーンの基礎の部分だけど曖昧な理解だったところがクリアになって来ててよい。

あと、FLOCのエンジニアコースを受講してみたのだけど、払った値段に対して内容がイマイチなので解約手続き中。(1ヶ月以内ならキャンセルできる)

floc.jp

lekcijeの月額課金

進捗なし

プライベート

タスク管理

5月ぐらいからTrelloでプライベートのタスク管理をしているけど、いい感じでワークしている。iPhoneアプリがよくできているのが大きな理由かも。タスクごとに「これはどこまで終わっていて、あとはどういうことをやるべきか」というのを簡単にメモできるのもありがたい。

また、「今月何やったっけ?」っていう振り返りにも使える。

ブログ

7月は真面目な記事を4つ書いた。Goのhttpパッケージまわりは以前からもやもや中途半端な理解だったものをちゃんと整理できてアウトプットできたのが嬉しい。忘れてしまったらこのブログを検索すれば良いので安心して忘れられる(違

暗号技術入門

小難しい話が可能な限りわかりやすく説明されていて良い。なんで今まで読まなかったのだろうという後悔しかない。

暗号技術入門 第3版

暗号技術入門 第3版

1Password Families

  • 夫婦でアカウント管理を共通化したかったので契約
  • 今のところいい感じなので、$60とけっこうお高いけど必要経費だと思って年間サブスクリプションで課金した

資産運用

  • WealthNaviで2000円ぐらい利益出てきた。ただし手数料が預けている額の1%で高すぎ
  • 個別株はGoogleを売って利益が$200ぐらい
  • クラウドバンクにアカウント作ったので入金しないと

読書

中村俊輔 サッカー覚書

中村俊輔 サッカー覚書

中村俊輔は自分と同い年だけどまだ現役でJリーグでプレイしていてすごいなぁと思っていたので本を読んでみた。イタリア、アイルランド、スペインと世界のサッカークラブでプレイしてきた感想が書いてあって面白かった。俊輔といえばセルティック時代の対マンUとのフリーキックが本当すごいなぁと思っている。サッカー選手は年齢が高くなるとやはり引退するしかないけれど、40歳でも現役でやっていくポイントみたいなのも書かれていて参考になる。

この記事も面白かった。

コンビニ外国人 (新潮新書)

コンビニ外国人 (新潮新書)

日本で働いている外国人が120万人を超えてたという記事をみかけたのと、技能実習制度の闇が深そうだったので気になって読んでみた。最近は中国からだけでなく、ベトナムやネパールが増えてるらしい。日本のコンビニチェーンは海外展開もしているので、日本のコンビニで働いて自国に戻ってコンビニ関連の仕事をするという話はなんか良さそうだと思った。新宿のドラッグストアの店員とかほとんど中国人ですごいなぁと思う。

参考:「外国人雇用状況」の届出状況まとめ【本文】(平成 29 年 10 月末現在)

来月に向けて

7月はアルゴリズムがあまりできなかったので頑張らないと。最近、あらためて基礎を勉強することが大事だと痛感しているのだけど時間がいくらあっても足りない。何を勉強するべきかをまとめて効率良くやらないとなーと感じている。

Goのhttpパッケージだけでmiddlewareを実装する

標準ライブラリのhttpパッケージだけでもmiddlewareは簡単に作れますよ、というお話。

おさらい: http.Handlerまたはhttp.HandlerFuncでやり取りする

Goのhttp.Handlerやhttp.HandlerFuncをちゃんと理解する - oinume journalに書いたとおり、

  • http.ListenAndServe
  • ServeMux.Handle

に渡すのは http.Handler なので、何かしらのmiddlewareもこのinterfaceを満たすことを考えればよい。もしくは ServeMux.HandleFunc を使うのであれば http.HandlerFunc を使うでもよし。

middlewareはhttp.Handlerを引数に取り、http.Handlerを返す

例えば、 admin という名前のCookieを持っていないとアクセスできないようなmiddlewareを考えてみる。

func requireAdminCookie(h http.Handler) http.Handler {
    fn := func(w http.ResponseWriter, r *http.Request) {
        _, err := r.Cookie("admin") // Check `admin` cookie
        if err != nil {
            http.Error(w, "No admin cookie", http.StatusForbidden)
            return
        }
        h.ServeHTTP(w, r)
    }
    return http.HandlerFunc(fn)
}

こんな感じで、h.ServeHTTPを呼ぶ前にCookieがあるかをチェックする処理を入れる。

このmiddlewareを使って、「特定のURLはadmin cookieがないとアクセスできないようにする」ためには、以下のようにmiddlewareと実際のHandlerを組み合わせる必要がある。以下のコードだと /admin のURLはCookieがないと403 Forbiddenが返される。

func main() {
    mux := http.NewServeMux()
    mux.Handle("/admin", requireAdminCookie(http.HandlerFunc(handleAdmin)))
    if err := http.ListenAndServe(":8080", mux); err != nil {
        log.Fatal(err)
    }
}

// responseを返すHandler
func handleAdmin(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    fmt.Fprint(w, "This is admin page")
}

参考リンク

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】

GoのWeb Application Frameworkでオススメは?

GoのWeb Application Frameworkでオススメは?という質問をよく受ける。 標準ライブラリのhttpパッケージ使えばおk とまずは返答している。ただ、RESTで様々なHTTPメソッドをサポートする必要があり、かつ /v1/users/{id} のようなPath内にIDが入る場合の対応を行いたい場合は

あたりの標準のhttpパッケージに沿ったものをオススメしている。理由としては以下。

  • ユニットテストで標準ライブラリのhttptestパッケージが使える(これ重要)
  • 他の標準のhttpパッケージに沿ったフレームワークに乗り換えやすい
    • もし乗り換えた場合でもテストコードは書き換えなくてよいはず

標準のhttpパッケージに沿ったもの、というのは、 ハンドラを登録する時に http.Handler を受け付けられるものという意味で書いている。

パフォーマンスが気になる人は以下を見ておけばいいのではないかと思うが、個人的にはWeb Application FrameworkのパフォーマンスはDBアクセスなどのNetwork I/Oに比べれば誤差だと思うのであんまり気にしなくていいのではないかと思う。

github.com

参考までに、gorilla/mux でRESTfulなAPIをサポートするコードは以下のような感じ

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/v1/users/{id:[0-9]+}", usersHandler).Methods("GET")
    log.Fatal(http.ListenAndServe("localhost:5000", router))
}

func usersHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, "Your id is %v", vars["id"]) // Path内のid
}

Go言語によるWebアプリケーション開発

Go言語によるWebアプリケーション開発