2018/10/14

GCP: Google App EngineのランタイムPython3.7を使ってみる2 -- Rest API

前回メモ(hello world with Python3.7)の続編。Restサービスの立上げ。
App Engine APIs が使えなくなっているので、代わりにGCPのPython用のライブラリを使う。(例えば、Datastoreの読み書きにndbは使えない。)

  • Goal
    GAE(Google App Engine) + python3.7ランタイム上にREST API(メソッドはPOST)を作成する。
    APIが呼び出されたら、GCP(Google Cloud Platform)のDatastoreに新規Entity(レコード)を追加する。
  • case
    名前、点数、教科名をjsonでPOSTしたら、GCPのDatastoreに書き込みして、Keyを返信する。
  • How
    1. 開発前準備
    1)開発環境に、google-cloud-datastoreをインストール
    2)
    GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定
    あくまで、ローカルでテストするために必要。
    以下コマンドを打つと、betaコンポーネントのダウンロードを聞かれる。
    「Y」を入力すると、ダウンロードされて環境変数の設定までしてくれる。
    $ gcloud beta auth application-default login

    2. requirements.txt の中身。google-cloud-datastoreも追加すること。

    # This requirements file lists all third-party dependencies for this project.
    #
    # Run 'pip install -r requirements.txt -t lib/' to install these dependencies
    # in `lib/` subdirectory.
    Flask==1.0.2
    google-cloud-datastore==1.7.0


    3. main.py の中身。

    # -*- coding: utf-8 -*-
    # Import the Flask Framework
    from flask import Flask, request, jsonify, abort
    from google.cloud import datastore
    import datetime
    app = Flask(__name__)
    # rootにアクセスされた場合のコントロール
    @app.route('/')
    def hello():
    """Return a friendly HTTP greeting."""
    return 'Hello!' # abort(402) -- abortにしてもよい
    # 今回は、/addtest を Postで呼び出すという想定
    @app.route('/addtest', methods=['POST'])
    def runaddtest():
    # jsonがなかったり、Nameがなければ、400で返す
    if not request.json or not 'name' in request.json:
    abort(400)
    # 認証
    datastore_client = datastore.Client(project='<project name>')
    # Kind名を設定--- テーブル名みたいなもの
    kind = '<kind name>'
    # KEYを作成−−− このケースは、自分で設定せずに、GCPがKEYを作成
    item_key = datastore_client.key(kind)
    # それぞれの要素をjsonからパース
    item = datastore.Entity(key=item_key)
    item['name'] = request.json['name']
    item['points'] = request.json['points']
    item['subject'] = request.json['subject']
    item['creationdate'] = datetime.datetime.now()
    # datastoreに登録する
    datastore_client.put(item)
    # 返信用のjson作成。登録したEntityのKeyを返す
    replymes = {
    'id': item.key.id
    }
    # json と STATUS 201を返す
    return jsonify({'result': replymes}), 201
    @app.errorhandler(404)
    def page_not_found(e):
    """Return a custom 404 error."""
    return 'Sorry, Nothing at this URL.', 404
    @app.errorhandler(500)
    def application_error(e):
    """Return a custom 500 error."""
    return 'Sorry, unexpected error: {}'.format(e), 500
    # For local testing
    if __name__ == '__main__':
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app. This
    # can be configured by adding an `entrypoint` to app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

  • Result --- curlのサンプルと結果
    Toshiのhistoryが67点


    $ curl -i -H "Content-Type: application/json" -X POST -d '{"name":"toshi","points":67,"subject":"history"}' https://.appspot.com/addtest
    HTTP/2 201 
    content-type: application/json
    x-cloud-trace-context: 4140694e3538666bb96627febc6130e4;o=1
    date: Sun, 14 Oct 2018 14:08:21 GMT
    server: Google Frontend
    content-length: 35
    alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
    {"result":{"id":5635703144710144}}



GCP: Google App EngineのランタイムPython3.7を使ってみる1 -- Hello World

GAEのStandard Environment に、Python3のランタイムがbeta版でリリースされていたので使ってみる。SecondGenerationというらしい。OPENCVかPillowが使えるかどうか?までテストする予定。まずはHello Worldまで。
https://cloud.google.com/appengine/docs/standard/python3/
  • Goal
    GAEのStandardEnvironmentにおいて、Python3.7のランタイムを使ってHelloWorldする。
  • How
    1. app.yaml, main.py, requirement.txt を用意する。サンプルは以下。
      https://github.com/pumpkinpietea/py37.git
    $ ls -lt
    total 32
    -rw-r--r--@ 1 Toshi_Admin  staff  817 Oct 14 11:22 app.yaml
    -rw-r--r--  1 Toshi_Admin  staff  101 Oct 14 10:08 README.md
    -rw-r--r--@ 1 Toshi_Admin  staff  956 Oct 14 01:17 main.py
    -rw-r--r--@ 1 Toshi_Admin  staff  197 Oct 14 00:11 requirements.txt
    2. ローカルでテスト
         $ pip install -r requirements.txt
         $ python main.py
    3. deploy

          $ gcloud app deploy ./py37/app.yaml


  • Comment
    1. libフォルダーに、pip -t でインストールは不要。逆にすべてrequirements.txtに記入する必要がある。
    2. ローカルテスト用のdev_appsever.py は、使えない。
      逆に普通に、local で実行すればよい。便利になった!
    3. deploy は、gcloud コマンドで実施が必要、appcfg.py は、使えない。
    4. 普通のpython3をそのままGAE上で動かす事を狙っているようなので、Cとかのライブラリも動くと思われる。別途テスト予定。

2018/10/13

3ヶ月の使い方で人生は変わる 佐々木大輔 ー 本

メモ
 1.ある意味「いらない」と言われていること自体が業界のニッチな状況を作る参入障壁となっている。p57 --- 問題の本質が見えにくくなることはよくあり、Userにいらないと言われたとしても、本当に価値があるかどうかまでUserがわかっている訳ではない。
 2.「これとこれを組み合わせるだけ」=イノベーション p61
 3.長期的なゴールも、3ヶ月ごとのテーマ設定が肝心
 4.まず考えるべきは「理想」や「本質的な価値」。自分の能力や、できることにとらわれる必要はない。理想を軸に考える癖をつければ、自分の能力を自分で制限することはなくなる。P71
 5.目標は自分がコントロールできること。ゴールは、「売上100万円(達成目標)」ではなく、「クライアントへの訪問回数20回(行動目標)」というように自分がやることに的を絞る。P73
 6.グーグルで働きながら、インターネットやAIを中心とするテクノロジーの活用で日本のすべてのビジネスをアップデートできるのではないか、という思いが強くなっていった。P76 
 7.長期的なゴールは、「世の中にどれだけ貢献できるか」p79
 8.どんな条件より「ストーリー」が大切。誰もが納得できる「腹落ち感」が欠かせない。p87
 ・誰に対して、何がしたいのか?
 ・それを実現できたら何がおきるのか?
 ・それにはどんな意味があるのか?
 9.意思決定の場を振り分ける「それは自分で決めたらいいんじゃない」「それは、あのチームの確認だけ取ってすすめる」「それは難しいから、だれを集めてミーティングしてきめよう」p95
 10.「他人の目を気にすると時間を奪われる」P102
 11.「この文書はわかりやすいか?これを読んだ人は行動してくれるか?」mail p111

平積みされてて、帯みて購入。あまり、3ヶ月の使い方って感じの本ではない。後半は、いわゆる仕事の効率化テクの記述がおおい。