ラベル 仕事 の投稿を表示しています。 すべての投稿を表示
ラベル 仕事 の投稿を表示しています。 すべての投稿を表示

2020/07/24

GCP: GAE node.js standard 環境で、Facebook Messanger のBot を立ち上げるまで


  • Goal
    FacebookMessengerのBOTをGoogle App Engine Node.js Standard 環境上に立ち上げる。
    ・テキストメッセージながらオウム返し
    ・それ以外のメッセージなら「ああ、それな〜」と返す
  • How
    1. Facebook Developerでの作業
      (1)アプリの作成

      (2)Messangerプラットフォームの設定
      ・トークン作成で、PAGE_ACCESS_TOKENを作成


      ・Webhookとして、まずはmessages と、messaging_postbacksを有効にする。
      ・コールバックURLに、Google app engine のURLを入力
      ・トークン欄には、自分自身で決めた文字列を入力する。この値がFacebook側からGAEのWebhookに渡されるので、GAEのアプリケーション内のVERIFY_TOKENにセットする必要がある。
    2. GAE アプリケーションの作成
      (1)GCPプロジェクトを作成 (割愛)
      (2)GITからサンプルコードをPull
      git clone https://github.com/pumpkinpietea/facebookMessengerBot.git



      (3)Facebook Developerで発行したPAGE_ACCESS_TOKENと自身で決めたVERIFY_TOKENを貼り付ける

      (4)gcloud コマンドでDeploy
      $ gcloud init
               $ gcloud app deploy
    3. 完成

2020/05/03

ファイルのバックアップ時に、ファイル名に時間を追加する -- Linux, dateコマンド


  • GOAL
    Linuxでファイルのバックアップ取るときに、日付情報を追記する
  • HOW
    date コマンドを使う。
-> % ll
total 8
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt

# Unix時間を追記する
-> % cp testfile.txt testfile.txt`date "+%s"`
-> % ll
total 16
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625

# YYYYMMDDHHMMSSを追記する
-> % cp testfile.txt testfile.txt`date "+%Y%m%d%H%M%S"`
-> % ll
total 24
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625
-rw-r--r--  1 toshi  staff    14B  5  3 00:51 testfile.txt20200503005117

# ハイフンでつなぐ -YYYY-MM-DDを追記する
-> % cp testfile.txt testfile.txt`date "+-%Y-%m-%d"`
-> % ll
total 48
-rw-r--r--  1 toshi  staff    14B  5  3 00:49 testfile.txt
-rw-r--r--  1 toshi  staff    14B  5  3 00:52 testfile.txt-2020-05-03
-rw-r--r--  1 toshi  staff    14B  5  3 00:50 testfile.txt1588434625
-rw-r--r--  1 toshi  staff    14B  5  3 00:51 testfile.txt20200503005117

2019/08/04

GCP: GAE/Py から、ElasticSearch(GCE上で稼働)を呼び出す -- Python

  • GOAL: レコメンドエンジンとしてElasticSearchを立ち上げ&セットアップする。その後、Google App Engine(GAE)から、ElasticSearchAPIを呼び出して使う。
  • POINT
    1.GAE
    からの外部HTTPREST API)呼び出しは、POSTで行うこと! GETは使うな!!
    (GAE/Py27の環境で、requestsを利用して呼び出す場合)
    2.Logstash
    は、必ず「Ctrl+D」で終了させること!
    Ctrl+Z
    で終了させていたため、サービスが起動中となりハマりました。
  • HOW
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
    2.Logstashを使って、CSVデータをElasticSearchにロード
    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得
    ----------------
    1.Martket Placeから、ELK(ElasticSearch+Logstash+Kibana)を起動
       ・Bitnamiの仮想マシンを選択
       ・手順に沿って、選択をしていくだけ


    2.Logstashを使って、CSVデータをElasticSearchにロード


    3.GAEから、ElasticSearchに検索クエリーを発行して結果を取得

2019/07/27

GCP: Iphoneから、端末位置情報をIoT分析環境に送信する -- python, GCP, IoTcore

Goal: 「IoTデータ分析環境立ち上げ on GCP」の環境に対して、Iphoneから位置情報データをPushするサンプル。Iphoneをエッジ端末として活用して、色々できそう。

How 

0. 前準備 Pythonista関連
   a)Pythonista のインストール
   https://apps.apple.com/jp/app/pythonista-3/id1085978097
   b)Gitを使いたかったら、stashをインストール
   https://github.com/ywangd/stash
   c)説明サイト ググったらたくさんあると思いますが、私は、以下のリンクを参照させていただきました。ありがとうございました。
   http://hitoriblog.com/?p=42145#Python-5




1. Pythonista を使って、端末の位置情報、スピード等を取得する
  a)Iphone上で、位置情報などを確認してみる




2. GCPのPub/Subにパブリッシュする。これの詳細は、前出のブログを参照

   a)GCP提供のサンプルプログラムをベースに追加加工する。

      https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iot/api-client/mqtt_example
   をローカルPCにクローンして、Pythonの環境などをセットする。
   cloudiot_mqtt_example.pyをベースに変更を加えたものが以下。



 
   

2019/06/09

文字列内の検索  str.find() str.rfind() --- Python3

Goal: 文字列の中に、特定の文字列が含まれているか? 含まれている場合は、INDEXを取得する。

How: 文字列メソッド find() 、rfind() を使う。

例)
01234567890123456789012345678901
THIS IS A PEN. THIS IS AN APPLE.

に、文字列が含まれているかどうかを確認する。

1: 'IS' を前から探す →  2が返ってくる
2: 'THIS' を前から探す → 0が返ってくる
3: 'THIS' を後ろから探す → 15が返ってくる
4: 'PINEAPPLE' を探す → 無いから、-1が返ってくる

Source:



Result:

-> % python test.py
2
0
15
-1

2019/05/27

2次元配列を複数のKeyでソートする --- Python3


  • Goal
    2次元配列を複数のKeyでソートしたい
  • How
    itemgetterを使う。
  • Example
    入力)
    Udon 500 大阪店
    Udon 700 東京店
    Ramen 1000 大阪店
    Ramen 1200 大阪店
    Udon 500 福岡店
    Apple 100 福岡店

    これを、メニュー(ABC順)→値段(高いものから)並べたい。
  • Source


  • Result
    % python sort_itemgetter.py
    Udon 500 大阪店
    Udon 700 東京店
    Ramen 1000 大阪店
    Ramen 1200 大阪店
    Udon 500 福岡店
    Apple 100 福岡店
    Before Sort
    [['Udon', 500, '大阪店'], ['Udon', 700, '東京店'], ['Ramen', 1000, '大阪店'], ['Ramen', 1200, '大阪店'], ['Udon', 500, '福岡店'], ['Apple', 100, '福岡店']]

    Sort by Price
    [['Ramen', 1200, '大阪店'], ['Ramen', 1000, '大阪店'], ['Udon', 700, '東京店'], ['Udon', 500, '大阪店'], ['Udon', 500, '福岡店'], ['Apple', 100, '福岡店']]

    Then sort by menu
    [['Apple', 100, '福岡店'], ['Ramen', 1200, '大阪店'], ['Ramen', 1000, '大阪店'], ['Udon', 700, '東京店'], ['Udon', 500, '大阪店'], ['Udon', 500, '福岡店']]

2019/05/12

素因数分解 (試し割り法) の根本理解  - Python3

競技プログラミングサイトで遊んでいると、素因数分解の知識が必要となり、再勉強をした。

1.素因数分解を思い出す。
小さい素数から、割り算を繰り返して、これ以上どの数字でも割れないとなったら終了という理解。(以下の画像のイメージ)

これを、試し割り法というとの事。

2.試し割り法のアルゴリズムの理解を深める。
以下のサイトを参考にさせて頂いて、試し割り法のアルゴリズムを見た。
Thanks!!
Pythonで素因数分解する
素数と仲良しになる3つのプログラム

が、素人の為、正直良くわからない部分があり、1行づつ理解を深めて見た。

私の理解としては。。。

ある数(素数候補)として、初期値を2とする。

①”ある数(素数候補)”で割り切れるかどうかを見る?
②入力数字を”ある数”で実際に割り、商に置き換える。

①と②を割りきれなくなるまで繰り返す。

割り切れなくなったら、
③次に、”ある数”を1つ大きくして、①と②を繰り返す。

で、④残りの数を、”ある数”で割った商が、”ある数”よりも小さくなったら終わり。
何故なら、2から初めて、1づつ”ある数”を大きくしながらで割っていくので、
これより先、割り切れる事はない。(割り切れるなら、この段階にくるまでに割り切れているはず。)

。。。。ということで、説明は上手くないが、以下を実行して、腹落ちした。



以下、上記プログラムの実行結果。360を素因数分解している。

-> % python factorization.py
360
360の素因数分解をする。

CP1: 2で割り切れるかどうか調べる。
CP2: 2で割り切れたから、2を出力する。
この時点の商:180
この時点の出力予定:[2]
まだ、2で割り切れるかどうかを確認する。

CP2: 2で割り切れたから、2を出力する。
この時点の商:90
この時点の出力予定:[2, 2]
まだ、2で割り切れるかどうかを確認する。

CP2: 2で割り切れたから、2を出力する。
この時点の商:45
この時点の出力予定:[2, 2, 2]
まだ、2で割り切れるかどうかを確認する。

CP3: 2では、もう割り切れなくなったので、
次は、3で割り切れるかどうかを試す。

CP1: 3で割り切れるかどうか調べる。
CP2: 3で割り切れたから、3を出力する。
この時点の商:15
この時点の出力予定:[2, 2, 2, 3]
まだ、3で割り切れるかどうかを確認する。

CP2: 3で割り切れたから、3を出力する。
この時点の商:5
この時点の出力予定:[2, 2, 2, 3, 3]
まだ、3で割り切れるかどうかを確認する。

CP3: 3では、もう割り切れなくなったので、
次は、4で割り切れるかどうかを試す。

CP4: 5を4で、割ったとしても、商は4より小さくなるので、これ以上は検討不要。
残っている数を、最後の約数として追加する。ただし、1の場合は、無視する。
5を出力して計算終了。

output----
[2, 2, 2, 3, 3, 5]

2019/02/24

MapオブジェクトをObject形式に変換する--- Javascript/ES6


  • Goal
    MapオブジェクトをObject形式に変換する
  • ソース



  • 出力結果

  • Thanks!!
    Map and object: converting nested objects
    https://www.xul.fr/javascript/map-and-object.php
    Arrayがネストされているケースの記載もありました。

2019/01/06

round() の四捨五入では上手くいかない! - python3

Python3 では、round()による四捨五入は使えない!!

How: decimal モジュールを使う。
サンプルコード

# -*- coding: utf-8 -*-
#
from decimal import Decimal, ROUND_HALF_UP
i = float(input())
print("入力値")
print(i)
#
print("roundの結果")
ex_round = round(i,1)
print(ex_round)
#
print("decimalの結果")
o = float(Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP))
print(o)

結果

入力値
12.25
roundの結果
12.2
decimalの結果

12.3

2019/01/05

Colaboratory すごい - Colaboratory + Python3 + Pandas

Google の Colaboratory を使ってデータサイエンス、機械学習にチャレンジをしてみる。

Goal:Google Colaboratory を立ち上げて、機械学習用のデータ・セットを読み込みデータをハンドリングする。主に、Pandas を使ってみるという内容。

How
1. Colaboratoryに新しいノートブックを作成する。以下にアクセスして、Python3のノートブックを作成する。

      https://colab.research.google.com/


2. Notebook

2019/01/01

標準入力の取扱 input と print - Python3

Goal:Python3での標準入力をハンドリングする。
#1 複数の値が1行に同時に入力された場合、数値として取り込む
入力値 --- 以下の3つの数値を入力したら、int型として取り込む
100 3 123456



(py3) toshi$ python python3-input.py
100 3 123456
output---
a=100
b=3
c=123456


#2 入力行数を最初に入力して、その後、複数行に渡る入力値を、配列として取り込む
入力値 --- 以下のように入力したら、3*3の行列として取り込む
3
1 2 3
4 5 6
7 8 9



(py3) toshi$ python python3-input2.py
3
1 2 3
4 5 6
7 8 9
output---
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

2018/12/16

GCP: IoTデータ分析環境立ち上げ on GCP

Goal:ローカルPCをIoTGateway端末と見立てて、Bigqueryに、気温データをストリーミングインサートする。利用するサービスは、IoT Core --- Pub/Sub --- Dataflow --- Bigquery と連係する。
Gateway側には、データをPushする処理が必要だが、それ以外は、コーディング不要!

How
0. 準備:仮想IoTGateway として、気温/計測時間/デバイスIDを送るプログラムを作成
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/iot/api-client/mqtt_example
をローカルPCにクローンして、Pythonの環境などをセットする。
cloudiot_mqtt_example.py を加工。変更箇所は、以下の通り。


1. Pub/Subのトピックを作成
(1)APIを有効にする
(2)トピックを作成する
トピックとは、メールボックスみたいなもの




2. デバイスをIoT Coreに登録する
(1)APIを有効にする
(2)端末レジストリを作成する
端末レジストリとは、デバイスのグループを作成すること
トピックの選択が必要。1で作成したトピックを選択する。
そうすると、この端末レジストリ内のデバイスから送られてきたメッセージは、そのトピックに投げ込まれる。
(3)端末を作成する(デバイスを登録する)
公開鍵の登録は一旦せずにデバイスを作成する。
公開鍵の種類は、 RS256_X509 とする。


3. 認証鍵の作成と登録
(1)デバイス側で、Google root certificate を取得する
wget https://pki.goog/roots.pem
あるいは、
curl https://pki.goog/roots.pem > roots.pem
で取得する
(2)鍵のペアを作成する
openssl req -x509 -newkey rsa:2048 -keyout rsa_private.pem -nodes -out rsa_cert.pem -subj "/CN=unused"
(3)公開鍵を、IoT Core のデバイスに貼り付ける
(4)private key は、ローカルマシンに保存

4. サブスクライバーのを登録する
デバイスが、パブリッシャーなので、そのトピックの購読者を登録する。
ここでは、Bigqueryにセンサーの値を書き出すので、エクスポート機能を使う。
登録すると、自動的にCloud DataflowのJobが立ち上がる。
(1)Bigqueryに、データを登録するためのテーブルを登録する

(2)トピックのエクスポート登録を行う





5. テスト実行!!
デバイスを稼働させて、データがBigqueryに流れ込むのを確認する。


$ python iotdemo.py --cloud_region=us-central1 --project_id=iotdemo1 --algorithm=RS256 --private_key_file=rsa_private.pem --registry_id=demo-reg --device_id=iotdemo



Bigquery側は。。。。
成功!!
実に簡単に、分析環境の構築が可能。

2018/11/18

GCP: Cloud Shell上でのサンプルコマンド

備忘録
Cloud Shell上でのオペレーション

### Storageの操作
### GCE関連、Snapshotの作成

2018/09/02

GCP: GCP外のサーバーからDatastoreへデータをインポートする(GCPのKeyを使う場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。

    前のPOSTのKeyを自分で設定しないバージョン

  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。keyは、GCPで自動設定されるKeyを使う。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81

  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

GCP: GCP外のサーバーからDatastoreへデータをインポートする(keyを自分で設定する場合)

  • Goal
    タブ区切りのテキストファイルをローカルマシン(OR AWSのEC2でも同じ)GCPのDatastoreにインポートする。pythonのプログラムで実施。
    Keyは自分で設定したい。

    Keyを自分で設定する必要がない場合はこちら
  • Case
    以下のようなテキストファイルを、Datastoreにインポートする。
    想定するのは、DatastoreをGAEのマスタのように利用していて、バッチで更新をするようなケース。id をKeyとして登録したい。
    list.txtの中身(タブ区切り)
    id     shimei   score
    1234   山田      89
    2341   田中      90
    1238   佐藤      81
  • How
    1.GCPのコンソールで、Service Account Keyを作成する
     形式は、JSON
     権限は、DatastoreのOwner(これは、Import&Exportでも良いのかも?)
     作成された、JSONはローカルマシンのどこかに設置する。
    2.Google cloud datastore のクライアントライブラリをインストールする。
     ~$ pip install google-cloud-datastore
    3.pythonのプログラムでインポートする。
      ##utf-8に変換⇒Unicodeに変換して、インポートすること!
       あとで、Pythonから呼び出しをする事を想定している。


  • Result

2018/07/29

リストの要素の重複排除とNone(空要素)の排除 − Python

  • Goal
    リスト型の要素の中の重複排除とNone(空要素)を排除する。
    集合型(set)なら、重複排除は自動でできて、.discardでNoneは排除可能だが、リスト型で行いたい。理由は、リスト内の順番をキープしたいから。
  • How
    if で要素があるかどうか?と長さが0より大きいかを確認する。
    ※filterを使うとか、内包表記を使うとか色々載っていたが、これが一番分かりやすかった。。。
  • Result

    ~$ python eliminating_duplication.py
    === inputtext
    Aaa
    bBbb

    CCddff

    Aaa


    === after normalize
    AAA
    BBBB

    CCDDFF

    AAA


    === normal list splitted by \n
    [u'AAA', u'BBBB', u'', u'CCDDFF', u'', u'AAA', u'', u'']
    === normal list with splitlines
    [u'AAA', u'BBBB', u'', u'CCDDFF', u'', u'AAA', u'']
    === eliminating duplication and None
    [u'AAA', u'BBBB', u'CCDDFF']

2018/07/01

GCP: gcloud コマンドで GAEのログを取る方法

備忘録
GAE アプリのログ解析をする場合、Stackdriver logging からログを取り出す必要あり。gcloud コマンドで簡単にできる。





2018/05/27

GCP: GAE appcfg.py の使い方

GAEの appcfg.py の使い方。Deploy以外にも使うことがあり、備忘録



2018/02/25

GCP: GAE上にAPI(POST)を作成ーDatastoreの操作(Create) ー Python



  • Goal
    GAE(Google App Engine)上にREST API(メソッドはPOST)を作成する。
    APIが呼び出されたら、GCP(Google Cloud Platform)のDatastoreに新規Entity(レコード)を追加する。言語・環境はPython+flask。
  • case
    名前、点数、教科名をjsonでPOSTしたら、GCPのDatastoreに書き込みして、Keyを返信する。
  • How
    1:開発環境は、以下でセットアップ
      Ubuntu16.4 + Pyenv:Python2.7.13 on GCE
      GCP: Google App Engine上にPython(Flask)アプリを立ち上げる手順

    2:ライブラリのセットアップ
      app.yaml に、flaskの記述を追加
      - name: flask
        version: 0.12

    3:mainプログラム と curl 結果


    4:Datastoreの結果

  • Thanks!

2017/10/28

CSVファイルを読み込んでlist型と辞書型に格納 - Python


  • Goal
    PythonでCSVファイルを読み込んで、List型と辞書型、集合型に格納する
  • How
    CSVモジュールのreaderメソッドを使う

    マスターファイルを作る。 テキストファイル menu.csv
     
    UDON001,500
    UDON0012,700
    SUSHI0123,1200
    TONKATSU001,2000
    RAMEN10,1000

  • Result
    (pytest2.7.13)~/pytest$ python CSVtoListDic.py 
    List
    [['UDON001', '500'], ['UDON0012', '700'], ['SUSHI0123', '1200'], ['TONKATSU001', '2000'], ['RAMEN10', '1000']]
    5
    Dic
    {'TONKATSU001': '2000', 'UDON001': '500', 'RAMEN10': '1000', 'UDON0012': '700', 'SUSHI0123': '1200'}
    5
    Set
    set(['TONKATSU001', 'UDON001', 'SUSHI0123', 'UDON0012', 'RAMEN10'])

    5