Rso's Jotter

日々の開発の知見のメモやその他雑記

Auth0 でUserMetadataを使う方法

ユーザに簡単な情報付与したいけどまじめにデータストア用意するまでもないような環境で、なんかいい方法ないかなと 思っていたのですが、Auth0にUser Metadataを付与できる機能があったので試しました。 (結論から言うと, 微妙でしたが...)

f:id:rso:20200127152957p:plain
Auth0ユーザ詳細画面

Auth0管理画面にUser Metadata なるものを設定できる画面があるから、これを参照したり更新したりできるんだろうと思い、リファレンス見てみました。 以下は試した内容のメモになります。

User Metadataの取得

  • userinfoの取得

auth0.com

上記の userinfo のエンドポイントからユーザ情報は取得できそうですが、どうやらuser_metadata はそのままでは返ってこないようです。

以下のような内容がRemarkにかかれています。

If you want this endpoint to return user_metadata or other custom information, you can use rules. For more information refer to User profile claims and scope.

user_metadataがほしければ Rules を作ってスコープを指定しろと、言うことのようです。思ったより簡単にはくれないようです。

Rulesというのは認証後に何かしらのアクションを追加できるようなものらしく、サンプルとして地域によってログインを弾いたり、追加情報を付与するみたいなのができるようです。

あまり詳細はよく分かっていないですが、以下のようなRulesスクリプトを書けば、namespace 以下にuser_metadataが入っている状態でuserinfoを取得することができました。

f:id:rso:20200127153842p:plain
Rulesスクリプト

どうしてこうなっているかというと、どうもuser_metadataはOIDCの仕様に則っていないから、そのままでは返せない、だからRulesを設定してやればいけるよ、といった感じのようです。

auth0.com

User Metadata の更新

先程の設定でめでたくuser_metadataの取得ができるようになりましたので、クライアントから更新方法を試します。

ユーザ情報の更新は PATCH /users/:id でいけるようです。 auth0.com

ただしそのままでは権限が不足しているので、scope に update:current_user_metadata を追加してやります。

自分はNuxt.js + Auth module で以下のようにscopeを追加します。

   strategies: {
      auth0: {
        domain: 'xxxx.auth0.com',
        client_id: 'xxxxx',
        scope: ['openid', 'profile', 'email', 'update:users', 'update:current_user_metadata']
      }
    },

そしてAPI仕様どおりのフォーマットでPATCHリクエストを投げると、無事更新されました。

更新はされました、が...

動作は確認できたのですが、ひとつ問題があり、更新後にもう一度 GET /userinfo を投げても更新前の情報が返ってきて、更新直後に反映されません。

いろいろググると、どうやらすぐには反映されず、アクセスキーの再生成が必要なようです.. community.auth0.com

所感

真面目にやるならちゃんとデータストアを別に用意したほうがよさそうです。 さくっとできるのかと思いきや、Rules, Scopeなどいくつか設定の手間がかかるだけでなく、即時にアップデートされなかったり、容量の制約などあるので、 あまり重要でない更新頻度の低いユーザに関連する情報をさくっと入れたいときには良いと思いますが、それ以外の用途では他の手段を検討したほうがよいかもしれません。

その他参考

Manage User Metadata

Nuxt.js の SSR, SPA時のイベント発火の違いを整理してみました

私は去年からNuxt.jsを真面目に触るようになったのですが、とりあえず動くものを作る優先だったので、 挙動の分かりやすいSPAモードでの開発をずっと行っていて、Nuxt.jsのSSRの機能を全く使っていませんでした。 最近になってパフォーマンスをチューニングしたいという話題があり、SSRの使用を検討していたのですが、どうもよくSPAモードでのモードとSSR(universal)モードの挙動の違いが理解できていませんでした。

そこで、universalモードとSPAモードでのイベントの発火状態を以下の表で整理してみました。

f:id:rso:20200126114530p:plain
SSR, SPAのイベント発火の違い

Webや公式リファレンスを読んだあとに自分の理解の整理で書いただけなので、あっているか分からないですが... ポイントは以下のようなところです。

  • SSRは初回ページアクセス時に実行される。それ以外(VueRouterなど)の遷移ではSSRは行われない。その挙動はSPAモードと同じ。
  • nuxtServerInitはサーバサイドでのみ実行される。SPAモードには存在しない。
  • SSR初回実行時は middleware, validate, asyncData, fetch はサーバサイドでのみ実行され、クライアントサイドでは実行されない。ただし初回アクセス時以降はクライアントサイドで実行される。
  • SSR初回実行時は created は サーバサイド、クライアントサイド両方で実行される。

上記をみてこうやって考えると、SPAモードは楽でいいんだけどなぁとも思います(さらにデプロイも超絶に楽)が、パフォーマンスを考えると SSRの選択肢は有力だと思うので、状況を見て取り入れていきたいなぁと考えています。

また、上記の挙動の確認には以下のプログラムを使用させていただきました。 github.com

読書メモ Design It! プログラマーのためのアーキテクティング入門

Design It! ―プログラマーのためのアーキテクティング入門

Design It! ―プログラマーのためのアーキテクティング入門

  • 作者:Michael Keeling
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2019/11/25
  • メディア: 単行本(ソフトカバー)

ざっくり概要

xxx It! 訳本シリーズ訳4冊目(原書は全7冊)。ソフトウェアの根幹となるソフトウェアアーキテクチャをいかにデザインするかを解説する本。 原題は Design It! From Programmer to Software Architect

第一部 ではソフトウェアアーテクチャとは何かについて解説し、第二部ではアーキテクチャを設計するために必要な基礎的な考え方を解説。 第三部では個々の詳細な方法論について解説しています。

参考になった箇所

全部を網羅できないので、私が参考になった、共感した部分を断片的に残します。

ソフトウェアアーキテクチャとは

望まれる品質特性やその他の性質を促進するためにソフトウェアをどう構成するかということに対する、重要な設計判断が集まったもの

デザイン思考

アーキテクチャを設計するにあたり、デザイン思考に則るのが有効。デザイン思考とは以下の4つの原則から成る。

  1. 人間性の規則 全てのデザイン活動は究極的に社会的な性質をもつ。
  2. 曖昧性の規則 デザイン思考者は曖昧性を保全せねばならない。

    -> 必要最小限のアーキテクチャ 目指す品質特性を促進するために、最小限の設計を行い、責任を持てる限り設計判断を遅らせる。それらは後続の設計者に委ねられる。

  3. 再デザインの規則 すべてのデザインは再デザインである。

  4. 触感性の規則 手に触れられるアイデアを作ることは常にコミュニケーションを促進する。

例えば、設計に関して言えば、設計は曖昧性を残し、設計を

デザインマインドセット

デザインマインドセットの観点からアーキテクチャを考える必要がある。デザインマインドセットとは以下の4つがある。

  • 理解
  • 探求
  • 作成
  • 評価

良い名前を使う(7Stage of naming)

"Good Naming Is a Process, Not a Single Step" という記事(?) において、名前づけは7段階あり、上のステージほど設計物の理解を反映している。

  1. 名無し 名前がない状態
  2. 無意味 名前に意味はないものの、つけられている状態
  3. 的確 要素の責務について 少なくとも1つ表している状態
  4. 的確かつ完全 要素の全ての責務を直接表している状態
  5. 適切な行い 要素の責務を進化させるという意識的な決定が名前に反映されている状態
  6. 意図 名前には要素の責務だけでなく目的も表わされている状態
  7. ドメイン抽象 個々の要素を超えた新しい抽象概念が作成されている状態

所感

ここでは内容を断片的にしか書けていないですが、ソフトウェアの設計に関する知見を幅広くカバーしています。アーキテクチャパターンなど技術的なトピックから、ミーティングの開催方法などチームビルディング的なところまで多岐に渡ります。 自分は現在そこまで大きなチームで開発しているのわけではないので、本書に記載のあったチームビルティングやアーキテクチャのドキュメント化方法など、そこまで実感のわくものではなく、ほーそうなのねというレベルでしたが、プロジェクトの規模が変わると再度立ち返れば良いかなと思います。

日頃ソフトウェア設計をやっていれば、やっぱそうだよねと思う部分があります。上記の内容と重複しますが、取り扱う内容がかなり広範なので、何かしら得るものはありそうです。

東京東エリアのおすすめ1日利用のコワーキングスペース

週末などはカフェで作業していることが多いのですが、 半日〜1日がっつり作業するときは近くのコワーキングスペースを利用していています。

備忘も兼ねて、わたしの行動範囲内の東京都の東側エリアでよく行くコワーキングスペースをメモしておきます。

コワーキングスペース茅場町 Co-Edo

www.coworking.tokyo.jp

  • 料金: 1000円/1日
  • 雰囲気: 静か
  • 飲食: 可
  • 貸し出しモニタ: 一部あり
  • フリードリンク: なし

東西線茅場町から徒歩三分ぐらでいける良立地。 1日 1000円で作業できるのはなかなか良いです。 勉強会などもけっこう開催されており、それによって貸し切りになっている場合もあるので、事前にスケジュールをチェックするのが良いです(上記のリンクから確認できます)。

パセラのコワーク 東神田店

https://www.pasela.co.jp/coworking/higashi-kanda/

  • 料金: 2500円/1日
  • 雰囲気: 静か
  • 飲食: 可
  • 貸し出しモニタ: あり
  • フリードリンク: あり

パセラグループが運営するコワーキングスペース。2019年5月ごとにオープンして比較的新しいです。 コーヒーなどのドリンクもついており、パンや味噌汁、ワインもありました。 モニタも自由に使用でき、比較的料金は高めですが、ガッツリ作業するのに向いています。

江戸遊 湯work

https://www.edoyu.com/ryougoku/yuwork

  • 料金: 2750円/1日
  • 雰囲気: ややにぎやか
  • 飲食: 館内で購入
  • 貸し出しモニタ: なし
  • フリードリンク: なし

銭湯スパの江戸遊のなかにあるコワーキングスペースです。料金はややお高めですがもちろんスパも入れます。リラックスできる環境ですが、スパに思ったより長く入っていたり、酒が飲みたくなったりと、集中を妨げる要素が多いのでガッツリ作業には向いていないかもしれません。スパメインでのんびりと作業するのに向いています。 銭湯スパなので、明け方まで滞在できるのも特徴です。残念ながら途中退出はできないので、入るタイミングには注意が必要です。

パズル浅草橋

https://puzzle-scs.jp/akb

  • 料金: 500円くらい(1ドリンク)
  • 雰囲気: イベントやってるとにぎやか
  • 貸し出しモニタ: なし
  • フリードリンク: なし

秋葉原、浅草橋の近くのイベントスペースです。 何かしらのイベントをよく開催しています。 ドリンク1杯頼めばドロップインで作業できます。 さくっと作業するのにちょうどよい環境です。

まとめ

電源とWi-Fiがある環境でそこそこしっかり作業したい場合は、コワーキングスペースのドロップインがおすすめです。

読書メモ しくみがわかるKubernetes

あけましておめでとうございます。

とりあえず100件書くまではブログ続けようと思いますので、今年も更新していきます。 2019年は 35件書いたので、今年の目標は65件にしようかなと思います。

さて早速投稿件数を増やすために、正月にパリから日本に帰るときに読んでいた以下の本に関する感想をメモしておきます。

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識

概要

簡単にまとめると以下のような内容でした。

  • DockerはわかるけどKubernetesこれから勉強したい人向け解説書
  • Azure の AKS サービス上でのクラスタ構築して、そこでの運用方法を解説。
  • どうやって使うかに加えて、なぜそうなっているのかも解説している。

twitterでも分かりやすいという良さげな評判が流れてきていたので読んでいたのですが、確かに分かりやすかったです。

あるべき姿を定義し(宣言的設定)、あるべき姿と差異がないか問い合わせ、収束させる(Reconciliation Loops)、などKubernetesの基礎となる考え方が解説されているおり、設計思想の一部を把握することができます。

本書で概要をつかんで、詳しく知りたいところはkubernetesの公式チュートリアルなどを参照して理解を深めるのが良いと思います。また本書でもさらに詳しく知りたい場合の参考URLがさまざまな箇所で記載されているのも良いです。

本書ではAzure のAWSのマネージドサービス上での解説を行っています。GCPやAWSのマネージドサービスを使っている場合、その部分は読み替える必要はあります。

ちなみに今回読んだ内容ではないですが、Dockerから改めて学習したい場合、以下の本がおすすめです。(私は先にこちらから読みました)

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門

  • 作者:山田 明憲
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/08/25
  • メディア: 単行本(ソフトカバー)

こちらの本は、Dockerの操作の基本からDocker compose, Docker swarm, Kubernetesと続いて幅広く解説されています。

Kubernetesは入門書1冊読んだ程度では到底全部把握しきれるようなものではないですが、とりあえず概要把握したい、試しに運用してみたい、という目的であれば十分かと思います。