taisablog

taisa's engineer blog

スクリーンショット 2019-08-27 14.21.45

投稿日:

-

執筆者:


comment

Your email address will not be published.

関連記事

Golangを使ってJWTを15分で理解する

JWTとは JWT(ジョットと言うらしい)はJSON Web Tokenの略で、JSONをベースとしたアクセストークンのためのオープン標準 (RFC 7519) です。色々記事を見ましたが、最終的にWikipediaが分かりやすく一番参考にしました。https://ja.wikipedia.org/wiki/JSON_Web_Token JWTの構造 JWTは以下の3つの要素をピリオドで区切った文字列で構成されます。 ヘッダー 署名生成に使用するアルゴリズムを格納します。下記のHS256は、このトークンがHMAC-SHA256で署名されていることを示しています。署名アルゴリズムとしては、SHA-256を使用したHMAC (HS256) や、SHA-256を使用したRSA署名 (RS256) がよく用いられます。 { “alg” : “HS256”, “typ” : “JWT” } ペイロード 認証情報などのクレームを格納します。クレームとはペイロードに含める以下のような標準フィールド(クレーム)を指します。JWTの仕様では、トークンに一般的に含まれる7つの標準フィールドが定義されています。また用途に応じた独自のカスタムフィールドを含むこともできます。下記の例では、トークン発行日時を示す標準のクレーム (iat) と、カスタムクレーム (loggedInAs) を格納しています。 { “loggedInAs” : “admin”, “iat” : 1422779638 } 7つのペイロードの標準クレーム 署名 トークン検証用の署名です。署名はヘッダーとペイロードをBase64urlエンコーディングしてピリオドで結合したものから生成します。署名はヘッダーで指定された暗号化アルゴリズムにより生成されます。下記はHMAC-SHA256形式でのコード例です。 HMAC-SHA256(base64urlEncoding(header) + ‘.’ + base64urlEncoding(payload), ‘secret key’) JWTを使用するにあたって JWTはトークンが返され、それをローカルに保存して利用します(主にlocal storageやsession storageが用いられますが、セッションIDのようにCookieを用いる場合もあります。) 認証時にはAuthorizationヘッダーでBearerスキーマを利用します。またサーバー上に認証状態を保持しないステートレスな認証方式です。その為JWT単体ではトークンを無効にすることが出来ません。サーバーに状態を保持すれば可能ですが、その場合ステートレスの利点は失われることになります。さて、ここまではほぼ Wikipedia に書いてある内容そのままです。ここから実際にGo/GinのJWT Middlewareを使って実際の動作を確認してみます。 Go/GinのJWT Middlewareを使った動作確認 利用するJWT Middlewareについて ここでは、「https://github.com/gin-gonic/gin」 を使う前提で、次のMiddlewareを利用します。「https://github.com/appleboy/gin-jwt」。このMiddlewareは、auth_jwt.goの1ファイルでで構成されていて、「https://github.com/dgrijalva/jwt-go」 をGin用に薄くラップしたものです。jwt-goはトークンを作成したりパースしたり様々な機能が用意されています。 サンプルソース サンプルソースは、https://github.com/appleboy/gin-jwt/blob/master/README.md に載っているのでこれを元に確認します。処理は大きく「ログイン時にToken発行する」と「トークン認証&処理実行する」の2種類あります。 ログイン時にToken発行する ログイン時にTokenを発行する処理は、LoginHandlerです。Routerでは次のように定義しています。LoginHandlerではAuthenticatorとPayloadFuncが呼ばれる為、Middlewareにてこれらを実装する必要があります。 r.POST(“/login”, authMiddleware.LoginHandler) Authenticatorはログイン認証の為の関数です。例では固定値が設定されていますが、実際は主にDBから値を取得することになると思います。PayloadFuncはペイロードに含めるクレームを設定します。ペイロードには任意のクレームを追加可能なので、ログインIDとなるuserIDをセットしています。 // ログインに基づいたユーザの認証振る舞いをするコールバック Authenticator: func(c *gin.Context) (interface{}, error) { var loginVals login if err := c.ShouldBind(&loginVals); err != nil { return “”, jwt.ErrMissingLoginValues } userID := loginVals.Username password := loginVals.Password // …

Python Bottleのソースを読む プラグイン編

Pythonの軽量WebフレームワークBottleのソースを読む プラグイン編Bottleを触ってみると通常のWebフレームワークには用意されているであろう機能がなかったりします。これはマイクロフレームワークであるが故であり、すべてがそろってない状態がむしろ正しい状態と言えます。Bottleではそういったものを補うためにプラグインが用意されていてある程度の機能はそちらでまかなうことができます。また、Plugin Development Guide を参考にしてプラグインを自作することも可能です。 Class Hierarchy plugin用クラスはなくインターフェースが定義されているのでそれにしたがって実装します。 プラグインの使い方 公式ドキュメントに簡単な使い方が乗っているのでこちらを参考にすれば簡単に導入することができます。以下がサンプルコードで、簡単な流れとしてはinstall()で任意のプラグインをインストールするリクエスト時にプラグイン実行となります。サンプルコードでは、プラグインでkwargsにdbをセットされている為ルートのアクションでdb変数が利用できるようになってます。 from bottle import route, install, template from bottle_sqlite import SQLitePlugin install(SQLitePlugin(dbfile=’/tmp/test.db’)) @route(‘/show/<post_id:int>’) def show(db, post_id): c = db.execute(‘SELECT title, content FROM posts WHERE id = ?’, (post_id,)) row = c.fetchone() return template(‘show_post’, title=row[‘title’], text=row[‘content’]) @route(‘/contact’) def contact_page(): ”’ This callback does not need a db connection. Because the ‘db’ keyword argument is missing, the sqlite plugin ignores this callback completely. ”’ return template(‘contact’) プラグインの作り方 プラグインの作り方も公式ドキュメントにもっともシンプルな形のサンプルがあります。これは実行速度をレスポンスヘッダーにつけて返す処理ですが、サーバ起動時にstopwatchをインストールし、リクエストが来た際にデコレータを実行(表現あってるか分からない)することでリクエストの処理時間は計測できるようになっています。 from bottle import response, install, route import time def stopwatch(callback): def wrapper(*args, **kwargs): start = time.time() body = callback(*args, **kwargs) end = time.time() response.headers[‘X-Exec-Time’] = …

FlaskをBottleと比較した雑感

以前Bottleのソースをチェックしてみた流れでFlaskも見てみた。結論から言うとBottleと大して変わらん。もちろんFlaskのほうがコード量が多く多少リッチではあるもののざっくり機能ベースで言うと大して変わらんのです。そもそも両方ともマイクロWebフレームワークが売りなので当たり前といえば当たり前ですが、歴史的にもBottleが2009年リリースでFlaskが2010年4月1日(エイプリルフールのネタとして)リリースと、名前もBottleに対抗してFlask(フラスコ)という名前をつけたということなので、もともとがBottleっぽいフレームワークを遊びで作ってみたという感じなんだと思います。それっぽいことはwikiに書かれています。 [Bottle Wiki](https://en.wikipedia.org/wiki/Bottle_(web_framework)Flask Wiki クラス構成に関しては以下にある通りで、Bottleが1ファイル構成でFlaskは機能にファイルが分かれてる構成という違いはあるものの、機能自体にほとんど違いはありません。ただFlaskはBlueprintという大規模アプリ対応の機能があります。なお、使い方については公式ドキュメントとサンプルコードも複数用意されているのでアプリの構成や使い方が確認しやすいです。

「PyCon APAC 2018 in Singapore」参加レポートを寄稿した

PyCon APAC 2018 in Singaporeに参加してgihyo.jpさんにてレポートを寄稿した。 今年のレポートはPyCon JPのスタッフと元スタッフメンバーで書いた。カンファレンスのセッションレポートだけでなくカンファレンス参加に関連するコラムも盛り込んでいてめちゃくちゃ読み応えのある内容になったと思う。 Day1レポート 目次 Day1 PyCon APACとは シンガポールと今年のカンファレンス会場 Keynote ~ Tell me your secrets – Privacy in machine learning systems セッション Build a Data-Driven Web App That Everyone Can Use TeaTeaching Computers ABCs: A Quick Intro to Natural Language Processing Better Care and Feeding of Machine Learning Model コラム APACで発表者をしてみて PyCon APACミーティング 終わりに Day1:プライバシーを機械学習でどう守るか?/機械学習の基礎と応用 こんにちは, taisaです。2018年5月31日(木)~6月2日(土)にかけて行われた「 PyCon APAC 2018 in Singapore 」に参加してきました。本レポートでは最後の2日間に行われたカンファレンスデイの様子やセッション以外の現地滞在の様子などを2回に分けて,当日参加したPyCon JPスタッフや元スタッフのメンバーがお届けします。 PyCon … Day2レポート 目次 Day2 keynote セッション Concurrency vs Parallelism Elements of Programming Interviews in Python Streaming data processing pipelines with Apache Beam in Python, naturally! コラム PyCon APACの開催国となったシンガポールについて 海外カンファレンスに参加してみて 2日目の夜について 終わりに …

機械学習におけるアルゴリズム

前回のパーセプトロンに引き続きこの勉強会用に仕事ではじめる機械学習を元に機械学習におけるアルゴリズムをまとめる。 AIPy (アイパイ) ハンズオン #3 (2018/07/19 19:30〜) この勉強会について しばらくは機械学習に特化した勉強会になります。仕事で機械学習などを活用したいけど何からはじめればよいか分からないような方向けのハンズオン形式の勉強会です。ハ ンズオン形式といいつつまず初めは力を養う為に 仕事ではじめる機械学習 の輪読会からはじめます。この会はみんなで集まって意見を交換したり協力したりしながら一気 … ※不適切な内容である場合はすぐに取り下げます。 そもそもどのアルゴリズムを選ぶべきか 機械学習にはどんな種類があるか 分類(Classification):正解となる離散的なカテゴリ(クラス)と入力データの組み合わせで学習し、未知のデータからクラスを予測する 回帰:正解となる数値と入力データの組み合わせで学習し、未知のデータから連続値を予測する クラスタリング:データを何かしらの基準でグルーピングする 次元削減:高次元のデータを可視化や計算量削減などのために低次元マッピングする その他 推薦:ユーザーが好みそうなアイテムや、閲覧しているアイテムに類似しているアイテムを提示する 異常検知:不審なアクセスなど、普段とは違う挙動を検知する 頻出パターンマイニング:データ中に高頻度に出現するパターンを抽出する 強化学習:囲碁や将棋のような局所的には正解が不明確な環境で、とるべき行動の方針を学習する アルゴリズムを選定するには以下のフローチャートを参考にするとよい。startからはじめて条件によって分類、回帰、クラスタリング、次元削減のどれを選べばよいかが分かる。 アルゴリズムを選定する、scikit-learnのフローチャート ※その他(推薦、異常検知、頻出パターンマイニング、強化学習)は覗く 参考:scikit-learn algorithm cheat-sheet 分類 教師あり学習の1つ 予測対象はカテゴリなどの離散的な値を予測する メールがスパムかどうかや画像が映っているのがどういった物体かなど クラスの数が2の場合を二値分類、3以上の場合を多値分類という 分類については以下のようなアルゴリズムが存在する パーセプトロン ロジスティック回帰 SVM (サポートベクターマシン) ニューラルネットワーク k-NN (k近傍方、k-Nearest Neighbor Method) 決定木、ランダムフォレスト、GBDT (Gradient Boosted Decision Tree) ナイーブベイズ HMM (Hidden Markov Model) 本記事では太字の分類アルゴリズムと回帰(少し)について触れる ロジスティック回帰 ロジスティック回帰の特徴 出力とは別に、その出力のクラスに所属する確率値が出せる 学習はオンライン学習でもバッチ学習でも可能 予測性能はまずまず、学習速度は早い 過学習を防ぐ為の正則化項が加わっている 特に出力の確率値が出せるという特徴のため、広告のクリック予測にもよく使われている。 実践系の参考記事 新シリーズ第8回「ロジスティック回帰分析でターゲットを確率的に予測する」 ロジスティック回帰 ロジスティック回帰を実装してみよう ロジスティック回帰の決定境界 決定境界は直線 ロジスティック回帰の仕組み 活性化関数はシグモイド関数 損失関数は交差エントロピー誤差関数 シグモイド関数 入力が0の時は0.5をとる 値が小さくなるほど0に近づく 値が大きくなる程に1に近づく シグモイド関数を記述するコード def sigmoid(x): return 1 / (1 + np.exp(-x)) 出力yは y= sigmoid(np.dot(w, x)) と表すことが可能で、2値分類時の交差エントロピー誤差関数は、N個のデータに対してyを出力、tを正解ラベル(正しい場合は1、間違っている場合は0とする)、logを底がeの自然対数とすると、次のような書式で表すことができる。 2値分類の時の交差エントロピー誤差関数をコードで書くと以下のようになる def cross_entropy_error(y, t, eps = 1e-15): y_clipped = …