分散システムと柔軟なデータの処理

5章終わりました。

かなり難しく、説明もなく困りました。
しかし動くものは作れましたといった感じです。

分散型テクノロジーを使ってスケールアウト可能なシステムということみたいです。

将来的に自分がこんなテクノロジーが必要になることがあるだろうかと思ってしまいました。

NoSQLの分散データベースMongoDB
分散メッセージキューNSQ
といったものを使い、この本でtwittervotesとcounterという2つのアプリを作ります。

SQLは使ったことがあるのですが、MongoDBというものは使ったことがありませんでした。

NSQというものは出来上がった今も殆どわかっていません。

TwitterAPIを使うためには200文字以上で作文をしなければならないとは知りませんでした。
140文字ではだめですか?と思いました。

nsqdで「dial tcp: i/o timeout」となり、うまく行かなかったのですが
リンク
こちらを参考に、--broadcast-address=localhostとつければ動きました。

かなり消化不良です。
ほとんど理解できていません。
本来1冊の本になるような気がするのですが、それが30pそこそこで終わってしまいました。

監訳者さんによる全面的に書き直されたコードもあるのですが読んでられません。
それなら最初から本を書き直してほしかったと思いました。

f:id:thi_shu:20200829151611p:plain
調査

.Textフィールドを見てみると、「elm」は「エルム街の悪夢」や「ニレの木」が引っかかっててまともに調査できてなさそうでした。

今までgomniauthを使っていたのが、今回はgithub.com/garyburd/go-oauth/oauthを使いました。
何か意味があるんでしょうか?

envdecodeという物を使い環境変数を読み込むのですが、ネット上で見かけたgodotenvというものも気になりました。

ドメイン名を検索するコマンドラインツール

4章終わりました。

5つのコマンドラインツールを作成し、それぞれ単体で使えたり、パイプでつなげて1つのアプリにしたりしました。

"chat"という入力から、synonyms | sprinkle | coolify | domainify | availableと連鎖していき、whoisで空いているドメイン名を見つけるツールです。

  • synonyms
    入力からいくつかの類語を出力します。APIキーを環境変数を通じて利用し、APIサーバーへ問い合わせ、JSONをデコードということをします。
  • sprinkle
    入力に"lets"なとの接頭辞や、"app"などの接尾辞を加えたり加えなかったりして出力します。
  • coolify
    入力から母音をランダムに取り除き出力します。
  • domainify
    入力の空白を"-"に置き換えたり、接尾辞に".com"をつけたりします。
  • available
    HTTPではなくTCPを使ってWhoisサーバーにアクセスして、入力されたドメインが有効かどうか調べます。

今まで>|をなんとなく使ったことはあるのですが、こんな起動しっぱなしのものを作れるとは知りませんでした。

自分で作ったスクリプトへの入力を<にして使ったことがあるくらいで、本を見ながらとはいえ自分で|を使うプログラムを初めて作成しました。

プロフィール画像を追加する3つの方法

3章終わりました。

Getという接頭辞は必要なければ付けない方が良いというのが初耳でした。

リンク
GetOwnerとSetOwnerではなく、OwnerとSetOwnerになるのでしょうか?

いきなりインタフェース型を作っていくやり方に慣れることができなくて難しく感じます。

認証サーバーからプロフィール画像を取得するか、Gravatarから取得するか、画像ファイルをユーザーがアップロードしてそれを取得するか、この3つの方法を実装したのですが、最初はコンパイル時に指定するやり方でした。

これで割り切るのかと思っていたところ、インタフェース型のスライスにメソッドを関連付けて、3つの方法の内どれか成功したものが採用されるというように解決され驚きました。

どうも方法が多そうで、慣れることができるか不安です。

今の所、他人の画像ファイルのファイル名を見てuiqueIDがわかってしまいそうですが、これでいいのでしょうか?

プロフィール画像を追加する3つの方法

3章です。

  • 認証サービスから提供されるアバターの画像を利用
  • Gravatar
  • ユーザーがアップロード

まずは1番上の認証サービスからです。

RailsチュートリアルではGravatarでしたが、今回の認証サービスからという方法がとても簡単に済んでしまい驚きまし。た。

次にGravatarの利用です。

これは入力するのが面倒くさいなと、公式のGitHubリポジトリを見ると、随分書き方が変更されていました。

とても悩ましく困りました。

と思ったら、その後リファクタリングとしてコードを変えていくので、書籍のまま進めていけば良さそうです。

認証機能

2章です。

OAuth2で認証機能の追加をします。
なにかのウェブアプリで「GitHubアカウントでログインする」「Googleアカウントでログインする」というやつです。

gomniauthというライブラリを使います。

感想や、気になったところなどのメモです。

秘密の値などをハードコーディングしているのが気になりました。
Railsチュートリアルでは環境変数を使っていたような覚えがあります。
ということで、ちょっと書籍のコードを変えて環境変数を使うようにしてみました。

私はwindowsを使用しているのですが、git bashをもっと使ってみようかなと思いました。

日本語が文字化けしてしまったのですが、%HOMEPATH%/.bashrc

chcp.com 65001

としたら、なんとかなったようです。

書籍のコードではlog.Fatalを使用していて、エラーを感知するとchat.exeは落ちてしまうのですが、これでいいんでしょうか?
panicだとリカバーで終了してしまわないようですが、log.Fatalpanicに置き換えたほうが良いのでしょうか?

ログイン処理時にGoogleからユーザーの名前を取得して、Cookieに名前をセットしています。
チャット方では送られてきたCookieから名前を読み出して、message構造体を作り、それをJSONへ変換しブラウザに送っています。

今の所、名前など簡単に偽造できてしまうのでしょうか?
5章になりデータベースを利用することで回避したりするのでしょうか?

自作アプリ側でユーザーのデータをデータベースに保存するとき、何をキーにするのでしょうか?

まだ気になる点が多いのですが、とりあえずログインしチャットに名前を表示させることに成功して感動しました。