AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

AWS SDK for PHP 2 / 3 ドキュメント作成環境

AWS SDK for PHP 2 / 3のドキュメントって、どんなもので作られてるのかなぁと見てみた。

API

UsersGuide

メモ

ちょうど本日 Sphinx 使ってたので、下書きからだしてアップしました。
が、 2年前のエントリー の下調べだったもよう。。。

次回は、もちっと有益そうなものをアップできるようにしようっと。

mysqlclient / MySQL-python コンパイルエラー対処

Redhat w/SCL + pip で、Django/pythonMySQLドライバ mysqlclient / MySQL-python がインストール出来なかった対処メモ。

SCLの問題というか、Redhatrpmパッケージの考え方の問題なのかな?

# MySQL の mysqlclient と python と名前が被って若干混乱

状況と解決

pip でインストールをすると gcc が走ってコンパイルを行うのですが、どちらのドライバも同じ所で失敗してしまってました。

    gcc -pthread -shared build/temp.linux-x86_64-2.7/_mysql.o -L/opt/rh/mysql55/root/usr/lib64/mysql -L/opt/rh/python27/root/usr
/lib64 -lmysqlclient -lpthread -lz -lm -lrt -lssl -lcrypto -ldl -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so
    /usr/bin/ld: cannot find -lmysqlclient

mysqlclient でググルと、MySQL-develと一緒に提供があるとの情報と、libmysqlclient.so によるとある。

続きを読む

flake8 2.5.0 のエラー対処 on Ubuntu

Ubuntu に pip で flake8 を入れたら、上手く動かなかった。次の対処で上手く動作したのでメモ。

対処1

設定ファイル書くか -j0 オプション付けて並列処理をなくしたら動作。

vi ~/.config/flake8

[flake8]
jobs = 1
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="14.04.3 LTS, Trusty Tahr"

$ python -V
Python 2.7.6

$ flake8 --version
2.5.0 (pep8: 1.5.7, pyflakes: 1.0.0, mccabe: 0.3.1) CPython 2.7.6 on Linux

対処2

あとから、apt-get でインストールしたらよかったと気づいた。。。

こっちのバージョンだと jobs オプションがないようなので、さっきのファイルは削除。

sudo apt-get install python-flake8

$ flake8 --version
2.1.0 (pep8: 1.4.6, mccabe: 0.3.1, pyflakes: 0.8.1) CPython 2.7.6 on Linux

Ubuntu 側でパッケージが用意されてる見極めって、どのラインなんですかね?CentOSと両方使ってると、ついつい pip からはいってしまう。

続きを読む

Djangoアプリ全体で使う変数をコンテキストプロセッサで提供

組み込み Template とかをみてると {{ MEDIA }} とかが出てきますが、これを自前で作る方法。同じアプリを複数サイトで立ち上げる必要が出てきて、区別の為、アプリごとにユニークな名前を表示したい。ただ、それだけの用途に使いました。

Django 1.7 の admin のように基底クラスの中で変数を定義して継承、もしくはCookieに値をセット、なども気づいたのですが、今回は修正が少なくて済む context processor を用意する方法を選択)


環境:

  • python 2.7.6
  • Django 1.6.11 (1.8から?は仕様が変更になってるようなので、後日確認)

Template と Context

Template 上で扱いたいオブジェクトや値は、Viewからcontextに入れて渡すというのが通常の流れ。

view.py

class IndexView(TemplateView):
    template_name = 'index.html'
...
    context['application_name'] = 'HogeHoge'

app/templates/index.html

<h1>{{ application_name }}</h1>

しかし、全Viewに対してアプリ名を渡すとなると、各Viewのcontextにアプリ名を渡していく修正が発生するので手間がかかる。

Context Processor で Context に値を追加

そこで、新しく必要な値を渡す コンテキスト プロセッサを作り、context を生成する度に、特定の変数を渡せるようにします( {{ MEDIA }} のような)。

続きを読む

dateutil で 曖昧な日付をパースする

pythondateutil ライブラリ。標準の datetime.strptime で日付を構文解析するよりも手軽にパースすることができます。2.x/3.x 両対応。

今回、このようなフォーマットの日付をパースしたのですが、表記が曖昧なので、結果が揺れてしまいました。

In [1]: import dateutil.parser

In [11]: dateutil.parser.parse('30/09/2015')
Out[11]: datetime.datetime(2015, 9, 30, 0, 0)

In [12]: dateutil.parser.parse('28/09/2015')
Out[12]: datetime.datetime(2015, 9, 28, 0, 0)

In [13]: dateutil.parser.parse('11/10/2015')
Out[13]: datetime.datetime(2015, 11, 10, 0, 0)

そこで dayfirst=True をつけて明示化して解決。

In [14]: dateutil.parser.parse('11/10/2015', dayfirst=True)
Out[14]: datetime.datetime(2015, 10, 11, 0, 0)

ちなみに daifirst, yearfirst ともにデフォルトは False らしいです。

ちょっとした課題は、賢人が過去に考えて解決策だしてくれてるんだと実感した次第です。