Python タグの一覧です(48 件)

[Python]Shizuoka.py #6 and shizudev に参加しました

昨年7月以来、7ヶ月ぶりの Shizuoka.py #6 and shizudev に参加及び発表してきました。今回は and shizudev とタイトルにある通り、shizudevの2016年題材がTensorFlowだった為、Shizuoka.pyと共催出来ますねという話で2016年内に実施する予定だったものが、ずれ込んだものです。shizudevに関してはこちらのスライドの4ページ目をご参照願います。因みに、最終的に11人参加して頂きました。わざわざ遠方(横浜)からいらっしゃった方がいたり、学生さんも参加してくれたりありがとうございました。

今回の発表一覧です

私の発表はAWS Lambda Pythonについてでしたが、AWS Lambdaに興味をもってくれた人もいたりして頑張ってまとめてよかったです。あとPythonでAWS Lambda書くならLamvery使いましょう。

個人的に嬉しかったこと

  • お会いしたいなと思っていた@tomofさんにようやく会えました。また@tomofさん自身も今回の勉強会を楽しんでもらえたようで良かったです。
  • @ike_jpnさんのTensorFlow x キュウリの仕分けの話が念願叶って聴けました。ハード、ソフト両方弄れる人は強いと感じました
  • 自分を含めてですが、農業関係者が4人も集まりました。地方都市らしくもあり、IT勉強会らしからぬようでもあり、不思議な感覚でしたが、楽しかったです。

最後に会場準備やイベント管理を行ってくれた@yajuさん、@fmkz___さんありがとうございました。特に@yajuさんのQiita渾身のエントリ、なぜ機械学習にPythonが選ばれるのかのお陰で参加者が増えた(!)のは凄い事だと思います。私もアウトプット頑張ろうと思いました。


[Python] ast.literal_evalを使って文字列を評価する

辞書型の文字列をPythonで評価する場合、他言語同様evalが使えます。

In [1]: s = eval("{'a':'aaa', 'b':'bbb', 'c':'ccc'}")

In [2]: s['a']
Out[2]: 'aaa'

evalは便利ですが、強力故にこのような文字列も評価可能です。

In [3]: ls -l
total 8
-rw-r--r--   1 aoshiman  staff    79 11 24 21:39 README.tmpenv
drwxr-xr-x   2 aoshiman  staff    68 11 24 21:40 a-path-you-really-care-about/
drwxr-xr-x  36 aoshiman  staff  1224 11 24 21:39 bin/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 include/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 lib/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 share/

In [4]: eval("__import__('os').system('rm -rf ./a-path-you-really-care-about')")
Out[4]: 0

In [5]: ls -l
total 8
-rw-r--r--   1 aoshiman  staff    79 11 24 21:39 README.tmpenv
drwxr-xr-x  36 aoshiman  staff  1224 11 24 21:39 bin/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 include/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 lib/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 share/

もう一つのやり方としてast.literal_evalを使う方法があります。literal_evalは文字列、バイト列、数、タプル、リスト、辞書、集合、ブール値など評価対象が限定されているのでevalより安全に評価出来ます。
rmコマンドを評価させると例外を発生させます。


In [8]: mkdir a-path-you-really-care-about

In [9]: ls -l
total 8
-rw-r--r--   1 aoshiman  staff    79 11 24 21:39 README.tmpenv
drwxr-xr-x   2 aoshiman  staff    68 11 24 21:48 a-path-you-really-care-about/
drwxr-xr-x  36 aoshiman  staff  1224 11 24 21:39 bin/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 include/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 lib/
drwxr-xr-x   3 aoshiman  staff   102 11 24 21:39 share/

In [10]: import ast

In [11]: s = ast.literal_eval("{'a':'aaa', 'b':'bbb', 'c':'ccc'}")

In [12]: s['a']
Out[12]: 'aaa'

In [13]: ast.literal_eval("__import__('os').system('rm -rf ./a-path-you-really-care-about')")
    ...:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-2546c9cde63c> in <module>()
----> 1 ast.literal_eval("__import__('os').system('rm -rf ./a-path-you-really-care-about')")

/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py in literal_eval(node_or_string)
     82                 return left - right
     83         raise ValueError('malformed node or string: ' + repr(node))
---> 84     return _convert(node_or_string)
     85
     86

/usr/local/Cellar/python3/3.5.1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ast.py in _convert(node)
     81             else:
     82                 return left - right
---> 83         raise ValueError('malformed node or string: ' + repr(node))
     84     return _convert(node_or_string)
     85

ValueError: malformed node or string: <_ast.Call object at 0x106c53c88>

In [14]:

そもそも辞書形式の文字列を使う場面なんかあるのかという疑問なのですが、 例えばAWS Lambdaで機密情報を取り扱う場合、KMSを利用して暗号化してしまうのが手っ取り早く且つ良い方法だと思うのですが、機密情報を辞書形式の文字列で暗号化しておくと復号後の値の取り扱いがやりやすくなります。

先ずSIDとSECRETをkeyに持つ辞書型文字列をKMSを使って暗号化します。ここでは暗号化、デプロイ、実行にLamveryを使っています。

$ lamvery encrypt -s -n conf "{'SID':'1234567890','SECRET':'abcdefghijklmn'}"

cipher_textsを確認すると暗号化されています。

$ cat .lamvery.secret.yml
cipher_texts:
  conf: AQECAHgtwl2B8ygtOB4TH6X5x0TAaeSX4r7lIOFdxo1SFZyMAgAAAI0wgYoGCSqGSIb3DQEHBqB9MHsCAQAwdgYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAx5ehDOIvYwyaZLmE8CARCASaNQOkC3tKi5tMpOAmEy0ChRkrrB7y0yJz1ldwtFBI2O6Kq1oWpsTbQJNAEbbxB4uvWXrR0vOid0G8hQAdy6lKy0D0FlFHzFoKg=
secret_files: {}

次に以下のようなコードを書き、AWS Lambdaにデプロイします。

import ast
import lamvery

def lambda_handler(event, context):
    conf = ast.literal_eval(lamvery.secret.get('conf'))
    print(conf['SECRET'])
$ lamvery deploy
lamvery: [Function-VPC] subnets: None -> []
lamvery: [Function-VPC] security_groups: None -> []
lamvery: [Function] Capacity: 7,594,304 Bytes -> 7,593,926 Bytes
lamvery: [Function] Deployed version: $LATEST

Lambdaを実行させるとSECRETの値が出力されているのがわかります。

$ lamvery invoke {}
START RequestId: 3b8da74d-b247-11e6-a8a7-45bdd8f2a5bd Version: $LATEST
abcdefghijklmn
END RequestId: 3b8da74d-b247-11e6-a8a7-45bdd8f2a5bd
REPORT RequestId: 3b8da74d-b247-11e6-a8a7-45bdd8f2a5bd	Duration: 725.51 ms	Billed Duration: 800 ms 	Memory Size: 128 MB	Max Memory Used: 32 MB

参考サイト
Using python's eval() vs. ast.literal_eval()? - Stack Overflow
marcy-terui/lamvery: User-friendly deployment and management tool for AWS Lambda function

Lamveryのzsh補完関数を書いた

最近個人的な用途でAWS Lambda(Python)を使うことが増えてきました。最初の頃はPythonスクリプト書き、zipで固めて動作確認の様に一つ一つ手動でやっていましたが、さすがに辛くなってきて今はLamveryを使っています。

marcy-terui/lamvery: User-friendly deployment and management tool for AWS Lambda function

Lamveryについては作者様のこのQiita記事が詳しいです
AWS Lambda向けデプロイ・管理ツール「Lamvery」について - Qiita

Lamveryはpipで入ること、設定ファイルがjsonじゃなくてyamlなことなど嬉しいことが多いので、結構使うようになってきたのですが、zsh補完が無く、探してもなさそうなので他の方々の自作補完関数を参考にしながら作成してみました。サブコマンドは動的に作成する(sed等で抽出する)方法を採用している方が多いのですが、今回はべた書きです。

使い方の一例です

Gistコードをcloneして適当なところに置く

$ cd path/to/zsh-completions
$ git clone https://gist.github.com/d2e93f986802f5a359b4dc6f25eff1a3.git src

fpathを通す

$ vi ~/.zshrc
fpath=(path/to/zsh-completions/src(N-/) $fpath)

sourceする(もしくはターミナルを一度終了してもう一度起動)

$ source ~/.zshrc


現在cron ジョブ等で動いていてAWS Lamdaに移行すべきスクリプトがまだ幾つか残っているのですが、補完もされるようになったので頑張って移したいです(腰が重い)

参考サイト
ghq コマンドの zsh 補完ファイルを修正したので、その過程を解説する - Qiita
zshの補完を自作してFabricのタスクを補完する - Qiita
シェルコマンドでシングルクォートに囲まれたシングルクォートのエスケープ | Firegoby
zshでHomebrewを使用する場合に設定しておいたほうが良いこと - よんちゅBlog←fpathとか


Pythonista for iOS のスクリプトを通知センターに登録する

以前、Pythonista for iOS で Nowplaying する という記事を書いたのですが、iOS10にアップデートしたところ、Musicアプリの共有メニューからPythonistaのスクリプトを呼び出せなくなりました(出来るのかもしれないけれど現状やり方がわからず)。仕方がないので Launcher を使って通知センターにスクリプトを登録しました。


iOS10のMusicアプリでは共有メニューにRun Pythonista Scriptが出てこない

IMG_4185

Launcherへの登録は画像の通りで難しくなく、新規追加から進めていく

IMG_4182

URLの項目には以下のような感じで登録。名前とアイコンは適当に

pythonista3://<スクリプト名>?action=run
IMG_4183

[Python]Shizuoka.py #5 に参加しました

約一年半ぶりにShizuoka.pyが開催され参加及び発表をしてきました。色々なタイミングが合わず中々開催出来ずにいましたが、今回はその一年半がまるで充電期間だったかのように内容が濃い勉強会になりました。

発表スケジュールを見て頂ければ分かるのですが、Pythonらしいですね、データ解析、構成管理ツールとテスト、スタティックジェネレータ、AWS、クローラ、機械学習と守備範囲広いです。私はPythonのこの守備範囲の広さが好きで、自分が普段関わらない分野でPythonが使われている、すごく刺激を受けるのです。

因みに今回の私の発表はVagarant+DigitalOcean+AnsibleでPython開発環境を構築するというものでした。諸事情によりローカルディスク容量がかなり減ってしまい、このブログの作成環境をDigitalOceanへ外出ししたいことからVagrant、Ansibleの勉強が始まりました。

発表して判明したのですが、Vagrantの使用率って高いですね、是非DigitalOceanも使ってみてください。あとAnsibleのハマりどころに関しては、Qiitaなどにも掲載されているのですがやはり断片的なまとめが多いので、頑張って体系だってまとめてみました。あとついでなので普段使っているプロジェクト、Bitbucketの非公開リポジトリからGitHubの公開リポジトリへ引っ越ししました。そのままでは動きませんが、playbookは参考になるかもしれません。

今回の発表内容一覧です

  • Python、neo4j、Cytoscape.jsでデータ可視化入門 @oec014
  • Vagarant+DigitalOcean+AnsibleでPython開発環境を構築する @aoshiman
  • python-pelicanでブログを作る話 @hrs_sano645
  • 不適切だが違法ではないクローラー @fmkz___
  • Testinfra を使ってみた @ftnk
  • AWSで最近アツい話(AWS lambda) @sakibara
  • 静岡支部長がAWSの闇を語る @ando_ando_ando
  • joblibでキャッシング @fmkz___
  • 「みんなのPython勉強会」参加報告的なLT @bonohu
  • 日経平均予想上下予想botを作った話 @dokechin

よく4時間半で発表し終えたと思います(笑)

今回はじめて参加された方にも最後にお話しでき、楽しかったとおっしゃっててとても嬉しかったです。是非次回はなにか発表してみてください^^

最後に毎度のことながら会場確保など動いていただいている@fmkz___さんありがとうございました。


PAGE TOP