Pythonでバッチ書いてcronで実行させると死ぬ

Filed in Python Leave a comment

今回の解決方法はこちら。
export PYTHONIOENCODING=UTF-8
bash_profileかなんかに書いとく
おわり。
以下おまけ。

UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 38-41: ordinal not in range(128)

こんなこといわれる。Python書いてるとどっかで必ずぶつかって唸るやつ。
内部エンコードが云々とかはやっとこ理解してきて、中ではunicode、外に出すとき初めてencodeして、とかいうあたりは馴染んできた。
今日悩んでいたのは、自分で叩くと問題なく実行できる、文字列の出力を伴うプログラム。
実行状況をコンソールで見たかったので、あちこちにprintがどかどか入っているもの。
なんとなくうまくいくようなので、じゃあcrontab(これがまあ前時代的とかはあるんだけどrundeckだろうと根っこは同じだ)にセットすると、これがうまくいかない。
文字列を出力するところでいつものやつがでていて死んでる。
どういうこっちゃ。あたしゃ毎日0:30にリモートログインして手で叩かないといけないのか。

結局どうも、シェルに諸々やらせるときには、エンコーディングについていい具合によろしくしてくれないので、わからんのでasciiでいいやと判断され、死ぬということがわかりました。
症状見ればそこまでは分かるんだけど、export LANG=ja_JP.UTF-8云々を書いてもうまくいかないし、なんなのと泣いていたところ、そういえばPYTHONIOENCODINGってあったよね何なのかよく知らんけどという着地をした次第。
新しくこさえたEC2に移行作業してるんですが、そういうまっさらのとこだと、設定の漏れがポコポコ出てくるんですね。
ansibleに追記して保存、一件落着。

参考りんく

Python 3の各種エンコーディングについて – Qiita http://qiita.com/methane/items/6e294ef5a1fad4afa843

Python2で文字列を処理する際の心掛け – Qiita http://qiita.com/FGtatsuro/items/cf178bc44ce7b068d233

仮想環境構築:Vagrant + Docker

Filed in Nginx | Python | 仮想環境 | 要件とか Leave a comment

Kindle版の本を買って、日々vagrantとdockerについての理解を深めようと努力する日々です。
実のところインフラなんて興味なかった。結線だルーティングだミドルウェアがどうしたこうした。
「ぼかぁもっとクリエイティブな(略」
と思ってたんだけど、クリエイティブな何かをつくろうとするときの用意がめんどくさすぎる。手前の準備が煩雑すぎて、プログラム書くとこまで到達できない。
Vagrantはそもそも職場での開発環境の用意がめんどくさいことに加え、手順が口伝というのを打破するにあたり提案されていたツールで、名前しか知らなかった。
VMでマシン作るときの自動化がこいつで出きると。たしかにVirtualBoxで一個マシン作るのも面倒だった。
で、Dockerをその上に云々
vms
こういうのをやりたい。ずいぶん余計なのも色々あるんですが、Webサーバ幾つかのログをfluentdがかき集め、それをkibanaとかでビビっと束ねた表示とかをしちゃいたい。
この記事、下書きのままずいぶん放置してたんですが、そろそろやんないと。

参考書籍:Vagrant

参考書籍:Docker

SQLAlchemyとSQLiteで日付を取り扱う

Filed in Python | SQLAlchemy Leave a comment

あたくしの脳にぼんやりと刻まれている情報によれば、SQLiteは文字列と数値しか扱えないはず。
日付どうする。いやセンセ、日付ぐらいは扱ってくれてもいいのでは。
さておき、SQLAlchemyを通した場合に、なにか賢い仕組みがあるはず。

SQLAlchemyのマニュアルの当該ページには、

Date and Time Types

SQLite does not have built-in DATE, TIME, or DATETIME types, and pysqlite does not provide out of the box functionality for translating values between Python datetime objects and a SQLite-supported format. SQLAlchemy’s own DateTime and related types provide date formatting and parsing functionality when SQlite is used. The implementation classes are DATETIME, DATE and TIME. These types represent dates and times as ISO formatted strings, which also nicely support ordering. There’s no reliance on typical “libc” internals for these functions so historical dates are fully supported.

超訳:
SQLiteは日付型持ってない。SQLAlchemyが独自にこさえてる日付とかの型は、日付フォーマット+SQLiteで使った場合に動作するようになってる。その対象になってるのはDATETIME、DATEおよびTIMEだ。
これらを使う場合に限っては順番とかもちゃんと正しく動くし、ISOフォーマットされた文字列として日付と時刻を表現する。
で、こいつらはlibc内の関数に依存していないので、歴史的な日付が完全にサポートされている。

うわー自信ない。特に最後の一行。逆に読んでたらどうしよう。だって「libc非依存なのでヒストリカルデートが完全にサポートされてる」って、前後つながってる感がない。
だいたい、libcってなんだ。cのライブラリか。

ちょろっと見るとORACLE様の変なページが見つかり、「表 2–10 libc の日付と時間の処理関数」というところで以下の3つの関数の記述がある。

  • getdate() ユーザー形式の日付と時間を変換する
  • strftime() 日付と時間を文字列表現に変換する。
  • strptime() 日付と時間の変換

ははあ。こいつら完全にあたし見たことあるわ、phpで。phpのあの関数ってこいつらをラップしてたんだろか。
見てみる。
こんなページがあった。
PLEAC-PHP(http://pleac.sourceforge.net/pleac_php/datesandtimes.html)

これによると、phpはいろんな方法で日付のサポートをしていて、

  • UNIX/Cライブラリベース
    (localtime, gmtime, strftime, strptime, mktime, time, getdate, gettimeofday)
  • PHPのネイティブ関数(date,strtotime)
  • DateTimeクラスベース

日付の扱い方にこういう種類があるんだよ、とある。
phpのstrftimeとかははラッパーだったんだー、いやそういう感じのことなんだろうなとは思っていたがちゃんと理解した。
Library [libc]-based routinesってことは、Cのライブラリってのがlibcってことでいいんだな。なので、SQLAlchemy+SQLiteにおきましては、こいつらには関係ない作りになってます。ってことですね。
いやー勉強になりました。

, ,

pip install umysqldbからのerror: command ‘gcc’ failed with exit status 1

Filed in MySQL | Pyramid | Python Leave a comment

あとで自分が検索できるようにと、エラーメッセージそのものをタイトルにしちゃっています。
重宝します。

経緯はともかく解決方法

aptitude install python-dev

うわあ。
身も蓋もなかったなあ。
gccがどうだのって言われて怯んでたんですけどね。

んで

pip install MySQL-Python

おわり。

よくは知りませんが、PythonのモジュールMySQLdbとかいうのはは死に体なのか、uMySQLdbってモジュールがPyPiでは人気あるようです。スコアが高いのね。
あたしは呼べればなんでもいいですが、カッコつけてコンパイルとかしといて、結局aptさんに入れてもらって解決とか意味がわからない。
あー
コンパイルオプションなんか忘れたのかもしれないなあ。

そしてfuelphpやるかとおもいきやpyramidでセットアップ

Filed in Jinja | Nginx | Pyramid | Python | SQLAlchemy Leave a comment

phpめんどくさいよ。仕事で使って、なんで要件好きに決められる自分のプロジェクトでも自らphp選択するんだよ。いみがわからない。
ということで、前の記事でphpをアレしてたのは一旦放っておき、愛するPyramidの環境をつくろうと思う。
Nginx+Python+Mysql、Pyramid+Jinja2。個人的にはmaaDBはなんでもいいですけどこの構成が好きです。
まともにアプリ書き終えるとこまで行ったことないですけどね。

pcreateでざざっと作ったあとで思い出す。
昔の記事で、このへんの構成を好みで動かしたやつがあった気がする。プロジェクトテンプレートを作っておけばよかった。手作業はまたディレクトリ指定間違えたりする凡ミスの温床なのよ。

from ほにゃらら import うんたらかんたら

Filed in Python Leave a comment

メモ書きエントリ。
呼び出し方で毎度書いて試すくせがあるので、パッとみてわかるサンプルを書いておきたい。

foo.py
    /models/__init__.py
            model.py

こんな構成
各スクリプトの中身(shebangとかは割愛)

models/__init__.py

class Wee(object):
    pass

def fnc_wee():
    pass

models/model.py

class Oyoyo(object):
    pass

def fnc_oyo():
    pass

で、__init__.pyの中の子を呼ぶときと、model.pyの中の子を呼ぶ時の記述まとめ。

其ノ一

import models
from models import model

こんな呼び方で、

print(models.Wee)
print(model.Oyoyo)

print(models.fnc_wee)
print(model.fnc_oyo)

こんなふう。

其ノ二

from models import Wee,fnc_wee
from models.model import Oyoyo,fnc_oyo

こちらはこうで、

print(Wee)
print(Oyoyo)

print(fnc_wee)
print(fnc_oyo)

こう。

「レンダリングされるビューは辞書を返すことができる」

Filed in Pyramid | Python Leave a comment

Pyramid。
レンダリングされるビューは辞書を返すことができる
うんそれがどーしたんすか、くらいの感覚だったんですが、HTMLやその部品を返す代わりに辞書を返すことで、テストが楽になるんだよと。
あー。
いまさら納得。

 @view_config(renderer='myapp:templates/mytemplate.pt')
 def myview(request):
     return {'a':1}

デコレータだっけ。なんでこんな面倒くさい感じのことやるんだろうと思ってたんですが、コレやらないと面倒くさいからだったわけですね。
賢くなった。

あらためてPyramid

Filed in Pylons | Pyramid | Python Leave a comment

なんかPyConも間近なんですが今年は行かない予定。モチベーションが。

そんなアレなのも何なので、重い腰を上げて久々にPyramidやらをさわろうと一念発起。
もうなんにもおぼえてないくぽー

さしあたり昔に書き散らしたいろんなアプリ(たいていはPylons)の残骸をかき集めて、それっぽい骨組みの構築開始。
scaffoldでjinja2+alchemyとかのなんかいいのがあればいいんだが無いっぽいので、両scaffoldで生成したプロジェクトの中身を見ながら合成。手でちくちく。scaffold自分で書けるようにならないとこの馬鹿馬鹿しい作業が一生ついてまわるのな。
で、そろそろ目鼻ついてきたかなというところで困ったのがルーティング。
なんか様子が変だ。

map.connectからconfig.add_routeへ

なんかルーティングの登録も仕組みが変わってるのね。
route とビューのサンプル — The Pyramid Cookbook v0.1 (翻訳)

「3.可変のコントローラとアクション。」のあたり。

Pyramid ではルーティング変数によってビュークラスを選択することは できません。

まてw
なにさらっと重要なこと書いてんだ。どうすんのそれ。

# Pylons
map.connect(“/{controller}/{action}”)
map.connect(“/{controller/{action}/{id}”)

こういうのできないって。
えー?

一個ずつ

config.add_route(“help”, “/help/{action}”)

こう書けってことかなあ。正気とは思えんなあ。なんの不都合があってそうしたんだろう。

と思いきや

“pyramid_routehelper” は、 Pylons の map.resource のように動作する config.add_resource メソッドを提供します。

もう。
なんなの。

tracdをserviceだかdaemonだかでアレする

Filed in Linux | Nginx | Python Leave a comment

trac動くようになったのはいいんだけど、サービスとして起動したい。
あたしがサーバから出るとtracも死んでるとか意味不明すぎる。

http://trac.edgewall.org/ticket/4352
ここ読んだ。

なんか起動しないぞって時は、

/var/run/tracd
/var/lock/subsys/tracd

このへん?になんかロックファイルみたいなもんが出来てるかもねとのこと。
はー。なるほどー。

Tracのセットアップをする

Filed in Nginx | Python Leave a comment

あたくしの周辺ではredmineの利用事例が圧倒的多数を占めている感がありますが、宗教的な理由により自分のサーバにまで積極的に赤い石ころを入れる気にはなりません。

さしあたり経緯や理由はどうでもいいので、備忘としてtracを入れてちゃんと動くアレを残しておきます。
#あくまで自分用です
#CentOSにいれたもんでTrac-Lightningは選択できない
#Kanonなるものを見つけたけど、まあなんかダメだった

参考にしたページ

TracInstall – Sandbox Trac-0.11.7.ja1
TRAC-ADMINのオプションに関するリファレンス・ドキュメント
プロジェクトの始まりはTracから – @masuidrive blog

環境

  • CentOS(さくらのVPS)
  • Nginx
  • Python2.7

環境あんま関係ない手順ですが一応。

アーカイブ入手

pip install trac

おわり。Trac-1.0.1が入りました。
久々にGenshiとかも入っちゃって懐かしい限り。もうテンプレート読んでも分かんない気がする。
プラグインはなんとなく、主要なのが入ってる気配。

trac-admin /path/to/myproject initenv

でプロジェクト作って、

tracd -p 8000 . –basic-auth=fooproject,/path/to/passwddir/.htpasswd,/path/to/fooproject \
/path/to/fooproject

パラメータのあれはよくわかってない。

nginx.conf

nginxは設定が楽でよい。

server {
    listen       80;
    server_name fooproject.example.com;
    location / {
        proxy_pass  http://localhost:8000;
        root   /path/to/fooproject/htdocs;
        index  index.html index.htm;
        auth_basic "member only";
        auth_basic_user_file /path/to/passwddir/.htpasswd;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
    location ~ /\.ht {
        deny  all;
    }
}

trac.ini

ほとんど理解はしてないが、

src = site/img/fuaulogo.png

これが、

http://trac.example.com/fooproject/chrome/site/img/fuaulogo.png

といった具合になるということはわかった。
siteとcommonとがある云々。
この状態で実ファイルは、htdocs/img下に置いてある。
この仕掛けを理解するだけでけっこうかかった(‘・ω・`)

Todo

Gitとの連携どうやんだろうなあ。

TOP