投稿

ラベル(python)が付いた投稿を表示しています

Dockerで自己証明書https環境のJupyterlabを構築

何となく自分のPC環境で JupyterNotebook 試したくなったのでお手軽に準備できるものないか探していたところDockerで環境構築できるとのことで早速準備してみました。まぁすべてコピペで完成ですが、とりあえず備忘録として載せておこうかなと。 Google Colab 使った方がお手軽なのはわかっているんですが、気軽に試したいのといろいろと環境を足しこんでいくとかあるかもしれないので・・・手許にほしいと思って準備しました。 ◆事前準備およびDockerfile等 ・Dockerfile FROM jupyter/datascience-notebook USER root WORKDIR /tmp # MeCab + mecab-ipadic-NEologd (/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd) RUN apt-get update \ && apt-get install -y git mecab libmecab-dev mecab-ipadic mecab-ipadic-utf8 file patch make RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git RUN mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -y RUN pip install mecab-python3 RUN cp /etc/mecabrc /usr/local/etc/ # CRF++ (Cabochaで必要) RUN wget -O /tmp/CRF++-0.58.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7QVR6VXJ5dWExSTQ' \ && cd /tmp/ \ && tar zxf CRF++-0.58.tar.gz \ && cd CRF++-0.58 \ && ./config...

AWSのSESでサンクスメール配信のひな形作ってみた

イメージ
諸般の事情でAWSの SES を使わないといけなくなっちゃって、検証がてら いじっていて、結構ややこしかったので備忘録的に手順をまとめておきます。 全体の手順としては以下の様な感じ。SDK組み込んだプログラムからしか SES送信用のAPIを叩けない様に設定しています。 1.SESの設定 2.SNSから呼び出すLambda作成 3.SNSの設定(BOUNCE対応) 4.DynamoDB作成(BOUNCE対応) 5.SESを使うLambdaの作成 6.Cognitoの設定 7.APIGateway設定 8.フロントプログラムの準備 9.SESのBOUNCE設定 ◆作業手順(やや省略) 1.SES設定 先人が色々とまとめてくださっているので割愛、東京で使えるようになったので 東京リージョンで設定したほうが色々と楽です。 注意点としてはsandboxの解除申請を行うこと。これを忘れていると外部にメール 送信できません。 2.SNSから呼び出すLambda作成 BOUNCE時にBOUNCEになったメールアドレスをDynamoDBに登録する Lambdaを準備します。 import datetime import json import os import boto3 BOUNCE_TABLE = os.getenv('TABLE_NAME') dynamodb = boto3.resource('dynamodb') def lambda_handler(event, context): try: table = dynamodb.Table(BOUNCE_TABLE) msg = event['Records'][0]['Sns']['Message'] b = json.loads(msg) bounce_type = b['bounce']['bounceType'] bounce_mail = b['bounce']['bouncedRecipients'][0]['emailAddress'] ...

AWS-CLIとGCP:Cloud-SDK環境のバージョンアップ

以前Hyper-Vに作成していた GCPの開発環境 と AWSの開発環境 が1年くらいたつのでそろそろバージョンアップでもしておくかと思って、作業してみた。 定期的にランタイムとかのバージョンとか上がるし、CLIツールも新しい方が色々とできたりするみたいなので、一応バージョンアップ方法も備忘録的に置いておこうと思った次第です。作業自体は難しくないですが、 pyenv のバージョン切り替えが少し落とし穴だったりする。ちなみにpython3.8にはAWS-CLIがpipで拾えなかったのとGCP側も不安しかなかったのとバージョンが双方でずれるのも嫌だったので両方とも3.7.7にて作業しました。 CloudSDKについては以前は apt でやってたんですが、sudo使わないと開発できないとか厄介なのが嫌なので、今回は tar.gz の方で対応することにしました。 希望を言うとそれぞれのクラウド用開発環境を個別に作るんじゃなくて一括でボンと入れたら全部が入ってくれるようなのが欲しいんだがなぁ。そして自動化にしても各社ばらばらでなく統一的に記述できるような方式の標準規格が欲しい。 近しいとしたらこんな感じだけど、、、ただ個社の独自仕様まで吸収できていないので Teraform SevelessFramework その辺がつらい、、、 理想を言えばプログラムを書いてなんか中間の ライブラリ を インポート してそのライブラリを利用して、設定ファイルと一緒に デプロイ すれば各 クラウドベンダー の マネージドサービス を使う サーバレス なアプリが1コードでできるというのが理想なのよなぁ。 ◆作業手順 1.pyenvバージョンアップ $ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update $ pyenv update $ pyenv versions system * 2.7.16 (set by /home/users/.python-version) 3.7.3 $ pyenv install --list $ pyenv install 3.7.7 $ pyenv install 3.8.2 2.pythonバージョ...

LambdaにてIPアドレスから逆引きして環境を振分するパターン

小ネタです。 前回 の振り分けをいじくって、 X-Forwarded-For から IPアドレス を取ってきてそいつを 逆引き して判定する様に一部修正してみた。 ◆プログラム 呼出し元Lambda ---------- import json import os import socket import boto3 def lambda_handler(event, context): result = '' param = '' geh = os.getenv('REFER_OBJ') gev = os.getenv('KEY_NAME') mt = os.getenv('MATCH_VAL') hs = event[geh] #ヘッダー判定 if hs: if gev in hs: ipaddr = event[geh][gev] hostname=socket.gethostbyaddr(ipaddr)[0] if hostname == mt: fn = 'distribution-test-back' else: fn = 'distribution-prd-back' #クエリストリング取得 cp = event['company'] ds = event['destination'] input_event = { "param1": str(cp), "param2": str(ds) } Payload = json.dumps(input_event) response = boto3.client('lambda').invoke( FunctionName=fn, InvocationType='RequestResp...

ヘッダーに埋められた値見て本番LambdaとステージングLambdaに振分け

イメージ
小ネタですね。今まで APIGateway でステージングと本番環境を分けるようなことしていたのですが、静的サイトとかする時にフロントのjsで一々書替すると事故りそうなので 静的ジェネレータ で書き出すときに ステージング 環境の場合はヘッダに何か付与するので、そのヘッダのパラメータを元にステージングと 本番 で見る先を1個のAPIGatewayで分けたいなぁというのがそもそものきっかけです。どこの項目のどういうキーがどういう値ならという部分は環境変数で切り出して修正できるようにしています。 そして未だに SAM とか Serveless は使わず マネジメントコンソール のエディタで触っています(爆 呼出し先でデータベース抽出してきて返す様にしておけばステージングで新しいテーブルを見させつつ、本番では旧テーブル参照とかいうことも簡単にできます。 ◆プログラム とりあえずは Lambda でサクッと関数作ります。先に IAM で[lambda:InvokeFunction]を持つロールを作る必要あります。その辺はググってください。 呼出し元Lambda -------------------- import json import os import boto3 def lambda_handler(event, context): result = '' param = '' geh = os.getenv('REFER_OBJ') gev = os.getenv('KEY_NAME') mt = os.getenv('MATCH_VAL') hs = event[geh] #ヘッダー判定 if hs: if gev in hs: param = event[geh][gev] if param == mt: fn = 'distribution-test-back' else: fn = 'distribution-prd-back' #クエリストリング取得 cp = ...

はてなブックマークを投稿するためのpython

イメージ
はてブ の投稿用のpythonスクリプトで ボット してたら あれげなこと になってしまったので取りあえず アカウント復活 のためにメールで問合せしつつも、結局はAPIは使えない状態になったので結局ConsumerKeyとか全部発行しなおさないといけない。 で、どうやって発行したのか試行錯誤の過程がまるで残っていないので、非常に困った。 将来の自分が同じようなことで困ったときに備えてはてなのAPIを使うためのシークレットの発行方法とかまとめておくことにしました。 ◆APIキー発行までの作業 1.APIの有効化 ・以下のURLにアクセスする。   http://developer.hatena.ne.jp/ ・[アプリケーション登録]をクリックする。 ・[新しいアプリケーションの追加]をクリック ・[アプリケーションの名称]、[アプリケーションの説明]、[アプリケーションのURL]を入力する。 ・[read_private]、[write_private]にチェックを付けて[変更]をクリック 2.OauthKey発行プログラム ・以下のコードを[oauth_consumer.py]という名前で保存 import urllib import webbrowser import requests from requests_oauthlib import OAuth1 API_KEY = 'OAuth Consumer Key' SECRET_KEY = 'OAuth Consumer Secret' request_url = 'https://www.hatena.ne.jp/oauth/initiate?scope=read_public%2Cread_private%2Cwrite_public%2Cwrite_private' authorize_url = 'https://www.hatena.ne.jp/oauth/authorize' access_token_url = 'https://www.hatena.ne.jp/oauth...

pythonでChromeHeadless使ってスクショしてみた

RPA が流行っているみたいだけど。色々( コストの問題 )とあって導入できないので、なんか解決につながるような方策ないかなぁと思っていたら。 python で ゴニョゴニョすれば うまくいけば自分の労力のみでRPA入れられるんではないかと思って、調査。 その気になればEXCELからURLリストと拾ってくる項目名とか指定して、取得した値をEXCELに転記とかいうこともできるのではなかろうかと思って、少し試してみた。 まずは SIer さんが大好きなWebアプリのスクショを取る部分について試してみることにした。色々とアレンジがいるみたいなので、まずは Google 検索で「 yahoo 」を検索した1ページ目のスクショを取得するとかいうサンプルを作ってみた。 まぁこれは色々と先人がやっているので、そいつをコピペっとしただけなので、またしてもゴミ記事を量産したわけですww ◆事前準備 1.Chromeインストールとフォントの準備 # Chrome Install $ curl https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - $ echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list $ sudo apt update $ sudo apt -y install google-chrome-stable # IPA Font Install $ sudo apt install -y fonts-ipafont $ fc-cache -fv $ fc-list | grep -i ipa 2.追加ライブラリのインストール $ pip install --upgrade selenium $ pip install --upgrade chromedriver-binary $ pip install --upgrade pyvirtualdisplay ◆ソース import chromedriver_binary impor...

pythonでmongoDBを操作してみた。

昨年に mongoDB を入れてみて色々とやってるんですが、せっかくなので python からmongoを制御できたら面白いのではないかと思い、少し試してみました。 ほとんど ここの コピペ貼付けでやってるので残念感しかありませんが、まぁ 写経 でもアウトプットすることはきっと大事でしょうということで残しておきます。 後はmongoで 日付時刻をそのまま格納したい場合 はUTCが使用できる圏以外はあれやこれや大変なので日付を検索する仕様があるときはあまりmongoの日付時刻をそのまま使うと色々と大変な思いをします。 *現在、絶賛苦悩中 やるとするなら以下の様な感じになりそうです。 ・日本時刻を一旦UTCに変換する ・mongoDBに格納 ・mongoDBからデータ取り出し ・UTCの時刻を日本時間に変換する。 なので僕はへっぽこだったので datetime にかなり苦しめられてます。(今も) けど、結果的に時間でデータ格納せずに文字列で格納しちゃってて、さらに時間を条件にして検索するという要件を結果として採用しなかったのでここで出てくる日付で検索というケースは使用しなかったのですがね。 ■プログラム 1.mongo_oerate.py ------------------ import datetime import json import pprint import re import sys import traceback from bson.objectid import ObjectId import mongo_crud as mon def insert_mongo(): """ データ追加 """ try: print("INSERT START") mongo = mon.MongoInsert('database', 'test1') find = mongo.find({'_id':0}) print('--------------------登録前--------------------'...

LambdaでキーのみのDynamoDBテーブルを作成させてみた

業務で色々とDynamoDBをもてあそぶ機会があるんですが、DynamoDBのテーブル設定するのが面倒くさいのとキーのところのコピペがうまくいかなかったりと、なんだかイライラとするところが多くて、これ何とかなんないのかと思って、少し調べました。 既に データをインポートするところ は作っているのでキーだけを付与するDynamoDB作成用のツールがほしかったわけです。ググってコピペって完成です。いつも通り とりあえず個人で使用するので環境変数を書き替えてLambdaのコンソールで[テスト]ってすれば動くようになっています。後は単独 ハッシュキー のプライマリキーか ハッシュ+ソート の複合プライマリーキーを設定して作成できるようにしています。 セカンダリ―インデックス は使用しないので今回は対象外です。そして オンデマンド です。 エラー処理はほぼないです。相変わらずのへぼちんです。そして追加ライブラリはなしです。一応、Lambdaのpython3.8ランタイムで動きました。 ■ソースコード import datetime import logging import json import os import urllib import boto3 LOGGER = logging.getLogger() LOGGER.setLevel(logging.INFO) dynamodb = boto3.resource('dynamodb') # DynamoDB def make_table(table_name,key_name,tag_value): try: if type(key_name) is str: attrdef = [{ 'AttributeName': key_name ,'AttributeType': 'S'}] keyschem = [{ 'AttributeName': key_name ,'KeyType': 'HASH'}] elif len(key_name) == 2: attr...

GCPのGAEでDataStoreにデータ投入して検索するAPIのサンプル作ってみた

前回 の続き、 GCP の開発環境は作ってみたものの。肝心の GAE + DataStore の環境ができていないのでローカル環境でサンプル的なものを作って動かしてみることにした。 もしかしたら DynamoDB でも似た様な事をできるのかもしれないけど グローバルセカンダリインデックス の考え方がよく分からなかったのと複合条件とかが結構複雑な考え方でやらないといけないっぽかったのでGCPとAWSを適材に応じて使えますとか言ったら、 転職に有利になるかと 、会社のお役に立てると思い今回はGAEでやってみました。 1.環境構築 (1)作業用ディレクトリ作成 $ mkdir flasksample $ cd flasksample (2)DataStore用cloud-gui導入 参考サイト: https://engineer.crowdworks.jp/entry/2019/03/08/161559 https://qiita.com/kerupani129/items/60ee8c8becc2fe9f0d28 $ mkdir datastore $ cd datastore $ cd ../ $ sudo apt update $ sudo apt install -y nodejs npm $ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - $ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list $ sudo apt update $ sudo apt -y install yarn $ sudo yarn global add google-cloud-gui $ sudo npm i -g google-cloud-gui (3)CloudSDK設定 参考サイト: https://qiita.com/G-awa/items/e6904b040caa0096fba0 https://qiita.com/sky0621/items/597d4de7ed9ba7e31f6d h...

aptでGCloud入れてみた。

GoogleCloudPlatform で DataStore と flask を利用して GAE でAPIを作れないかと色々と調べているものの 前回作成した環境 だと2020年1月サービス終了のpython2系環境に固定されちゃうんで嫌だなぁと思って、何か他にうまい手がないか調べたところ、 公式 ではaptで入れられるらしいし ここ を調べるとpython2系と3系をpyenvで併存させられるみたいなので、こっちの 環境でgcloudを入れ直してみた。 ■以下はコマンド #pyenv設定 $ pyenv global 2.7.16 3.7.3 $ pyenv global 2.7.16 3.7.3 #CloudSDKインストール $ export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)" $ echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ sudo apt-get update && sudo apt-get -y install google-cloud-sdk google-cloud-sdk-app-engine-python google-cloud-sdk-app-engine-python-extras google-cloud-sdk-datastore-emulator google-cloud-sdk-pubsub-emulator google-cloud-sdk-cbt google-cloud-sdk-bigtable-emulator kubectl #インストール後確認 $ gcloud --version Google Cloud SDK 259.0.0 alpha 2019.08.16 app-engine-python 1.9.86 ap...

python2.7のLambdaEC2自動起動スクリプトをpython3.7化してみた

https://dev.classmethod.jp/cloud/aws/simple-auto-start-stop-for-ec2/ 上記のサイトを丸写ししてEC2の自動起動をしていたんだけれども、 python2.7のサポート終了 が近付いてきているので、Lambda関数をpython3.7化してみた。 最初にLambdaをそのまま3.7に切替えてみたんですが動作しない。 CloudWatchのログ を見てみるとエラー出てるじゃないですか。 ※先にログ見ろよな [ERROR] Runtime.UserCodeSyntaxError: Syntax error in module 'lambda_function': invalid syntax (lambda_function.py, line 10) Traceback (most recent call last): File "/var/task/lambda_function.py" Line 10 print 'started your instances: ' + ", ".join(instances) そりゃそうですよねぇ。そのままで動くと思ったらprint文で引っかかるんですね。 ひとまずエラーの内容を元に以下の通り書き替えました。 import boto3 def lambda_handler(event, context): region = event['Region'] operate = event['Action'] instances = event['Instances'] ec2 = boto3.client('ec2', region_name=region) if operate == 'start': ec2.start_instances(InstanceIds=instances) msg = 'started your instances: ' + ", ...