台風が来たせいか暑いです。AMIの作り方がわからなくて検索すると、EBSスナップショットとAMI作成 が出て来てすべて解決しました。概略図があると理解が進むと思い作りました。 EC2でSnapshotから作ったAMIのインスタンスが正常起動しない場合のひとつの対処法も 併せてご覧になるといいです。
docoptでCLIを作成してpypiへuploadした
2013年10月01日python
こんにちわ。今日から10月が始まります。nginxでbasic認証ためのパスワードを生成するときに、通常Apacheに 付属しているhtpasswdを使うことになる。けど、私の環境ではApacheはいれてない。opensslで生成することも可能 なんだけど、docoptというCLIを簡単に作成できるライブラリ があるので、それを使って実装します。pythonにはhtpasswdという ライブラリがすでにあるのでwrapするだけの実装です。もう一つ、車輪の再発明ですがpypiにもuploadします。 そういえば、CLIというと、paverも気になりますね。
docoptでCLIを作成
docoptはmoduleにコメントを書いておけばそれをparseして、結果をdictで返します。それで
どんな引数があるかわかる。下記のコードは動作しているもので、htpasswd-cli hoge
とコンソールから入力すると、
<password>に、引数としてhogeが入ります。今回の要件はpasswordをhashして、htpasswdに渡すだけ
なので簡単でした。argparseを使ったことがないからわからないけど、もう少し複雑になるんでしょ。
パッケージングに何をつかうの?
pypiへuploadするために必要なことは、パッケージングすることです。パッケージングするには、 何を使えばいいのか。Distutils, setuptools, distributeがありますが、2013年10月時点では、 setuptoolsです。経緯についてはdistribute と setuptools がマージされた をご覧ください。公式のPython モジュールの配布を 見るとdistutilsを使ってますが、setuptoolsです。documentは英語しかないので、 Building and Distributing Packages with Setuptools を読みました。あまり読めなかったけど。
何をかけばいいの?
何をかけばいいのかわからなかったので、 httpieと setup スクリプトを書くを参考にしました。 大まかに二つあり、何をインストールするかとメタデータです。何をインストールするかとは、 パッケージをインストールするかスクリプトをインストールするかなどです。依存関係も含まれます。 メタデータは、パッケージ名やバージョンや著者などがあります。詳しくは Additional meta-data をご覧ください。
メタデータで困ったのは、licenseとclassifiersでした。licenseに関してこの際に調べようと思い、 ライセンスの選択を恐れる必要はありません を参考にして、MIT LICENSEにしました。classifiersはhttpieと list_classifiersを参考にして、 以下の項目を記しました。
- Development Status
- Programming Language
- Environment
- Intended Audience
- License
- Topic
それで、要件はscriptです。scriptsで書けますが、 entry_points で書くことにしました。moduleを指定したあとに:で区切って関数を指定します。メタデータと 合わせて書いています。
localで試す
pypiにあげる前に、localでうまく動作するか試したいですね。調べるとありました。pipでローカルの ファイルをinstall, uninstallできます。
# install pip install -e . # uninstall pip uninstall htpasswd-cli
大丈夫であれば、pypiにuploadして完成です。
問題だったとこ
moduleの命名規則とパッケージの配布物ではまりました。htpasswd-cliと名付けているんですが、このままつけると
python setup.py sdist
でエラーが起きるんですよね。
moduleの名前規則
を見ると当然のことで、-は使えませんでした。そういえば、-とかいままで一切使わなかった。scriptの名前として
はこのまま利用できます。次へすすんで、setup.pyのlong_descriptionのところをみると、markdownを読み出して
います。python setup.py sdist
でパッケージしても、markdownをパッケージしてくれません。そのため、
エラーになります。 パッケージに直接関係のない配布物を含めるには、MANIFEST.inを利用します。
最後に
これにて、toenobu.nameのblogは終わります。読んでいただいた方がいたら、幸いです。
こんにちわ。能年玲奈より川口春菜派のとおのぶです。能年さんを画像検索すると剛力さんが現れてちょっとびっくりしました。 blogで利用してる画像はAmazon S3にあるんですが、どこからでも見ることができる状態でした。セキュリティ としてイヤだなと思っていたので、S3へRESTで認証することにしました。認証はNginxで行います。 やろうとしていることはnginxでS3へリバースプロキシ と同じで、S3の認証が異なるぐらいです。
REST認証
RESTで認証する3rd party modleのAWS proxy moduleあるので それを使います。3rd party moduleなのでgithubから落として組み込まないといけないのがめんどうなのと、設定例で ちょっとはまってしまいました。
インストールオプションでAWS proxy moduleを組み込みます。ansibleを使った例はこちらです。
./configure --add-module={{ src }}/ngx_aws_auth
次に設定です。これでちょっとはまりました。githubの例では以下のとおりでしたが、動作せず認証エラーがおきます。
# This is an example that does not use the server root for the proxy root location /myfiles { proxy_pass http://your_s3_bucket.s3.amazonaws.com/; aws_access_key your_aws_access_key; aws_secret_key the_secret_associated_with_the_above_access_key; s3_bucket your_s3_bucket; chop_prefix /myfiles; # Take out this part of the URL before signing it, since '/myfiles' will not be part of the URI sent to Amazon proxy_set_header Authorization $s3_auth_token; proxy_set_header x-amz-date $aws_date;
動作させるには、locationのディレクトリに、/
を加えるだけです。これだけです。
ansibleを使った例はこちらです。
ちなみに、chop_prefixに/
がいらないのは、
ngx_http_aws_auth.c
をみればわかります。
# This is an example that does not use the server root for the proxy root location /myfiles/ { # you need "/". proxy_pass http://your_s3_bucket.s3.amazonaws.com/; #you need "/" aws_access_key your_aws_access_key; aws_secret_key the_secret_associated_with_the_above_access_key; s3_bucket your_s3_bucket; chop_prefix /myfiles; # you don't need "/". proxy_set_header Authorization $s3_auth_token; proxy_set_header x-amz-date $aws_date;
以上で、s3に認証することができました。簡単でしたね。
NginxでdebugとPythonで認証
簡単に書きましたが設定ではまって認証エラーがずっとでてました。何を試してもエラーだったので、 pythonで認証させて、NginxでdebugしてSignitureと同じかどうかを試しました。記録として残します。
pythonの認証はS3のドキュメントにも のっていて、それに時刻の計算とS3に認証するところまで記しています。requestsに依存しています。
Nginxのdebugはインストールオプションの設定と設定ファイルでログレベルを修正する必要があります。 ansibleを使った例はこちら とこちらです。
./configure ----with-debug
error_log logs/error.log debug;
これでエラーログが出るようになりました。例えば、 このようなものがあるとエラーログが出力されます。 これでpythonで認証したsignitureとnginxで認証したsignitureを比較することができました。
こんにちわ。やや肌寒くなってきました。とおのぶです。なんとなくNginxでHttpImageFilterModuleを 使いたいなと思ってました。だけど、Nginxをソースからビルドしなくちゃいけないし、GDライブラリを インストールしなくちゃいけなくて面倒くさそうだったので億劫になってました。そんなところに 現れたのが、構成管理ツールのansibleです。python製で楽そうだったので、試してみました。
ansibleがまったくわかれなければ
わかりやすい説明を読みましょう。最初に Deploying with Vagrant and Ansible by yeukhon のスライドを見て、Ansible Tutorialをやるのが適当 だと思います。ansibleだけ使いたいのでvagrantやserverspecのところはやる必要はありません。(やった方が いいですが)
補足資料
環境
mac book airのansibleからCentOS 6.2へ操作します。
要件
- yumでGDライブラリをインストールすること
- 各バージョンごとにインストールできること(インストール先が異なる)
- わかりやすくオプションを設定できること(マルチラインで書けること)
- テンプレートからnginx.confをコピーできること
- テンプレートから自動起動スクリプトをコピーできること
- 自動起動スクリプトをサービスへ設定できること
playbookの内容
varsとtaskを要件ごとに説明します。gistに全ファイルを あげているので、こちらをざっくりみてください。
varsについて
ご覧のとおりです。srcは、ダウンロード先ですね。
vars: version: "nginx-1.5.x" src: 'DOWNLOAD_PATH' install_path: 'INSTALL_PATH'
yumでGDライブラリをインストールすること
with_itemsがリストっぽく書けるので、それをyumモジュールと組み合わせます。
- name: "be sure gd package for image_filter_module of nginx" yum: name={{ item }} state=installed with_items: - gd - gd-devel
各バージョンごとにインストールできること(インストール先が異なる), わかりやすくオプションを設定できること(マルチラインで書けること)
get_urlモジュールを使ってソースをバージョンごとにダウンロードします。ファイルがあれば、 スキップします。
- name: "get source" get_url: url=http://nginx.org/download/{{ version }}.tar.gz dest={{ src }}
ダウンロード先へcdして、tar コマンドで解凍します。ファイルがあればスキップします。
- name: "expand source" command: tar xvfz {{ version }}.tar.gz chdir={{ src }} creates={{ src }}/{{ version }}
install_pathとversionの変数を利用して、インストール先をバージョンごとで変更します。 >を使うことで、 マルチラインで書くことができます。必要になったモジュールを足せばいい状態にしておきます。マルチラインで 書く方法は、他にもある。
- name: "configure source" command: > ./configure --prefix={{ install_path }}/{{ version }} --with-http_image_filter_module --with-http_ssl_module chdir={{ src }}/{{ version }}
make
- name: "make" command: make chdir={{ src }}/{{ version }}
make install
- name: "make install" command: make install chdir={{ src }}/{{ version }
テンプレートからnginx.confをコピーできること
templateモジュールを使ってnginx.confをコピーします。
- name: "copy nginx.conf" template: src=template/nginx.conf.j2 dest={{ install_path }}/{{ version }}/conf/nginx.conf
テンプレートから自動起動スクリプトをコピーできること
templateモジュールを使ってコピーします。アクセス権も変更します。
- name: "copy nginx for init.d" template: src=template/nginx_init.j2 dest=/etc/init.d/{{ version }} mode=0755
自動起動スクリプトをサービスへ設定できること
chkconfigで登録します。
- name: "resister service " command: chkconfig --add {{ version }}
感想
エラー内容をみたい
エラー内容が通常見れません。-vvvをつけることで、詳細を見ることができます。sudoで 入力待ちになってたにもかかわらず、気付けませんでした。hangしている状態に見えていました。
suは使わない
sudoは使えますが、suは使わない。そういう思想っぽいです。
パスワード付きで処理したい
パスワード付きで実行することは少ないと思いますが、最初のrootでパスワード発行されたときに 必要です。sshpassが必要なので別途インストールする必要があります。
pythonの面接時の質問事項
2013年08月21日python
こんにちわ。こんにちわ。連日の猛暑をいかがお過ごしでしょうか。ニートのとおのぶです。 answer.pythonpath.jpというpythonの質問サイトがあったんですが、 いつのまにかなくなっていました。pythonに紛れてphpの質問もいくつかあったことが原因なのでしょうか。 プアグラマーな僕にとって面白かったので悲しんでたところ、新しく面白いサイトが出てきました。 pythonhackers.comです。flask制っぽい。そのコンテンツの一つが redditのpythonカテゴリーから引用していて、その中で pythonの面接時の質問事項 がおもしろそうだなと思ったので、日本語でも書いてみようと思います。なお、答えはありません。
誤っているところは、そっと教えていただけると助かります。
Pythonの面接時の質問事項
はじめてPythonの面接を受けようと思って、可能な限り下記のように質問をまとめてみた。参考の元となるのは、 redditからで、この他に何かあったら教えてほしい。
初級/中級
- Pythonのデコレータって何?どうやって使うの?
- Pythonのバージョンが違ったりライブラリのバージョンが異なるたくさんのプロジェクトをどうやって管理する?
- PEP8って何?プログラムを書くときにPEP8に従って書く?
- 引数ってどうやってわたってるの? 参照の値渡しとは?
- リスト内包表記・辞書内包表記って知ってる?一つ例を教えてくれないか?
- リストの3番目のアイテムを取り出す方法を3つ教えてください。
- リストとタプルの違いを知ってる?一つ例を教えてくれないか?
- rangeとxrangeの違いを知っていますか?
- 2系と3系の違いをいくつか教えてください。
- with statementの利用の仕方について
- インポート文を並びかえることなくインポート文の循環参照をさけますか?
- import all の何が誤っていますか?
- GIL(global interpreter lock)の重要性とは?
- <foo>のような特殊メソッドは何?どんな風に動くの?
- ファーストクラスオブジェクトとして関数を使いますか?
- "class Foo"と"class Foo(object)"の違いって何?
ちょっと難しい
- 8GBのファイルをどうやってreadしますか?
- Pythonの好きではないところはどこですか?
- string.atoi や int()といった元々ある関数を使わずに、ascii文字を正数に変換できますか。
主観的
- tabとspaceどちらを使ってますか。どっちがいいと思いますか。
感想
GILとかはじめて聞きました。循環参照の問題は意図を汲み取れてないと思うんだけど、循環参照 になるような関数を外に出して依存性をなくすとかでいいんやろうか。なんとなくわかっている つもりでも言葉に出して説明するのは難しいということを再認識しました。わかってないだけか。笑 redditでは、 追加質問や回答を見られるので、そちらもご覧になってください。
Next Page »