読者です 読者をやめる 読者になる 読者になる

Web屋さんのアレ

Python大好きなWeb屋のおじさんがぺろぺろ何かを書いてくよ。

【Python】Pillow(PIL)がpipでインストール出来ない【Mavericks】

ちょっとアレっとなったのでメモ。

MacをMavericksにアップデートしたらpipでPillowが入らなくなった。

In file included from _imagingtk.c:19:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/tk.h:78:11: fatal error: 'X11/Xlib.h' file not found

#       include <X11/Xlib.h>

ので、調べたらシンボリックリンク貼ると解決するよって書いてあったよ。 http://stackoverflow.com/questions/19532125/cant-install-pil-after-mac-os-x-10-9

ln -s  /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Tk.framework/Versions/8.5/Headers/X11 /usr/local/include/X11

OSアップデートこわい。

Web開発にPythonを使う理由

僕の周りだけかもしれないですが、国内のWeb受託開発案件はPHPで作るのが暗黙のルール」ってな勢いでPHP案件ばっかりなのですが、Python大好きな僕としては、何としてでもPythonを使って仕事をしたい!
なので頑張って布教活動をしているのですが、中々良い手応えが得られないのが現状です。。

という訳で、改めてPythonを使うメリットとか、安心してクライアントにPythonを進められる理由なんかをまとめてみました。

技術者がPythonを使うメリット

「今までPHPでやってきて何の問題もなかったし、これからPython始める意味なんてあんの?」

ぶっちゃけ、そんなにないですw
結果的に出来上がる物に関しては大差ないですからね。
ただし、開発効率やメンテナンス性は飛躍的に上がると僕は思います。

ライブラリがとても豊富

PHPも沢山ライブラリありますけど、Pythonだっていっぱいあるんですよ。
標準ライブラリがとても充実しております。
さらにeasy_installとかpipを使えば追加モジュールだって簡単に導入出来ます。
PHPPECLがありますが、品揃えだけで言えばPythonの方が圧倒的に多いです。

言語仕様と理念が素晴らしい

Pythonは何と言ってもシンプルです。
PEP20というPythonの設計理念的な物があるのですが、読んでみると「書きやすい・読みやすい・判りやすい」という部分に注力して設計されている事が理解出来ると思います。

http://www.lifewithpython.com/2013/01/pep-20-the-zen-of-python.html

PEP20で定義されている事柄というのは(全てではないけれど)プログラムを組む上でどの言語を使用したとしても注意するべき事ばかりです。
これは僕個人の印象ですが、Pythonという言語を使うと、あまり意識をせずともPEP20の理念の方向へ実装の形が進んでいく様な気がします。

開発効率&メンテナンス性が高い

シンプルで判りやすいという事は、効率に直結します。
極端に言うとPythonは何かしらの言語を習得している人ならば、読み解く事はそれ程難しくはありません。
さらに、Pythonは誰が書いてもある程度似通った実装になる傾向があります。
それはつまり、誰が見ても判りやすいプログラムになるという事だと思います。

また、ソースコードの量が目に見えて減ります。
体感ではPHPの2/3ぐらいに感じました。 下手すると半分ぐらいになったりもします。
やっぱりコード量が少ないというのは開発の効率もよいですし、メンテナンス性も高いです。

複数人での開発や引き継ぎ案件等を考えると、メンテナンス性が高いというのはとても大きなアドバンテージになると思います。
勿論、ボケーッと書いてたら汚くなるので、ちゃんと綺麗に書く努力をしないとダメですけどね。
Pythonはそういう努力が報われ易いという事です。

強力なフレームワークがある

PHPにもCodeIgniterやSymfonyの様な素敵なフレームワークが多々ありますが、一長一短というか、ぶっちゃけどのフレームワーク使ってもストレスが溜まってしまいます(僕は)。。

PythonにはDjangoという素晴らしいフルスタックのフレームワークが存在します。
フルスタックは重たくて嫌だというのであればFlaskやPyramidもあります。
Tornadoというフレームワークを使うとnode.jsの様なWebSocketサーバーも簡単に作れます。
Pythonフレームワークにはしっかりと個性があり、完成度も素晴らしいです。
ストレスの無いフレームワークを使えるというだけでも、Web開発でPythonを選ぶメリットがあると僕は思います。

クライアントにPythonを選んで貰うために

色々あーだこーだ言いましたけども、結局クライアントにPythonでやっていいよ」って言って貰えないとどうしようもないので、説得する材料を集めてみました。
結局はPythonなんて良く分からん物より皆使ってるPHPがいい」という事なんですけど、そこら辺を紐解いて行きたいなあ、と。

そんなマイナー言語使える人少ないんじゃないの?

国内外で圧倒的なシェアを持つPHPに比べれば、Pythonの技術者は少ないです。
PHPだと担当の技術者が何らかの理由でダメになった場合でも、交代要員を簡単に見つけられるという強みがあるのは確かです。
しかし、まともにPHP書ける人はPythonなんかすぐに書けるようになるんです。
技術者を探すのは、実はそれほど難しい事じゃないんです。

ちなみにご存知だと思いますが、Pythonは国内ではマイナーってだけで、海外では物凄いメジャーな言語です。
最近のLinuxには必ずインストールされてますし、Googleの公用言語の1つだったりしますし。
後述しますが、普段使ってるサービスもPythonで作られてるものは多いです。

何それ、ちゃんと動くの?

依頼する側としては、動作実績があるとか、ちゃんと動きますよっていう保証が欲しいんです。
PHPはその点、物凄い量のWebサービスがPHPで実装されているので、安心できるのでしょうね。
でも本当の事言うと、まともに動いてないシステムってPHPで作られたもの多いっすよ。。

Pythonで作られてる主なサービスをリストアップしてみました。

  • Pinterest (Django + Tornade)
  • Instagram (Django)
  • DropBox (Pylons)
  • dotCloud

他にソーシャルゲーム業界だと株式会社gumiという会社がDjangoを使ってゲームを開発しています。
ソーシャルゲームは毎秒数百リクエストを処理する必要があるので、Webサービスとしては高負荷な部類になりますが、何ら問題なく動いています。

自社でメンテナンスするからPHPでお願い

PHPの技術者を抱えてるクライアントさんからの案件は、開発終了後にクライアントさんの方で運用保守をやることが殆どなので、やっぱり慣れた言語で書かれた物の方がメンテナンス性が高いのは当然ですよね。
でも、上でも申しましたけども、「まともにPHP書ける人はPythonも書けます」
そして、メンテナンスや開発の効率を重視するならば、是非ともPythonを採用して頂きたい!
そりゃ確かに、初めてのPython案件は学習のコストも掛かるので効率が悪いかもしれませんが、未来への投資だと思って頑張ると必ず見返りが得られます。
でも、こればっかりはその会社の方針なので、外注の我々がとやかく言う所ではないのですけどね。。

まとめ

そろそろ面倒くさくなってきたのでまとめます。。

何が言いたいのかって言うとだな

「そんな怪しいもんじゃないし便利だから安心してよってか良いから1回使わせろよ!そしたら判るよ!」

って事です。。

Pythonに限った話じゃないですけど、RubyなりScalaなりHaskellなり便利な物が沢山あるんだから、ビクビクしてないで適材適所に便利な物を使って、もっと楽して生きていこうよって事を言いたい訳ですよ。

【Python】VirtualEnvにOpenERPをインストールしてみた【OpenERP】

ERPにちょいと興味を持ったのでインストールしてみたよ。
バージョンは最新(2013/07/06現在 Ver7.0)の物を使用。

あ、勿論ですけども、PostgreSQLはちゃんと用意してね。

専用のVirtuelenv環境を作るよ

virtualenvwrapperを使いましょうね楽だから。

% mkvirtualenv openerp

必要なモジュールをインストールしよう

公式のインストール手順だとapt-get使って入れてるけども、全部pip使ってやる。
requirementをまとめたので、これ使えばきっと大丈夫。

% vim pip_requirement.txt

http://xmlsoft.org/sources/python/libxml2-python-2.6.21.tar.gz
http://download.gna.org/pychart/PyChart-1.39.tar.gz
Babel==0.9.6
Jinja2==2.7
Mako==0.8.1
MarkupSafe==0.18
PIL==1.1.7
PyWebDAV==0.9.8
PyXML==0.8.4
PyYAML==3.10
Werkzeug==0.9.1
ZSI==2.0-rc3
docutils==0.10
feedparser==5.1.3
gdata==2.0.18
lxml==3.2.1
mock==1.0.1
psutil==0.7.1
psycopg2==2.5.1
pydot==1.0.28
pyparsing==1.5.7
python-dateutil==1.5
python-ldap==2.4.13
python-openid==2.2.5
pytz==2013b
reportlab==2.7
simplejson==3.3.0
six==1.3.0
unittest2==0.5.1
vatnumber==1.1
vobject==0.8.1c
wsgiref==0.1.2
xlwt==0.7.5

% pip install -r pip_requirement.txt

pipでpython-libxslt1とPyChartを普通にインストールしようとすると何故か「そんなパッケージないよ」的な感じで怒られるので、ソースのURLを指定してインストールしております。

OpenERPをインストール

公式からソースをダウンロードして来て下さいな。

(注)以下のやり方だと上手くインストール出来ません!

pip install openerp-7.0-latest.tar.gz

なので、OpenERPだけはpipを使わずにインストールして下さい。

python setup.py install

OpenERPの設定

ユーザーのホームディレクトリに.openerp_serverrcという名前でファイルを作ります。
設定出来る内容は公式のドキュメント(リンクはVer6だけど多分平気)を読んでね。

僕の設定を参考に載せておきます。

% vim ~/.openerp_serverrc

[options]
verbose = False
xmlrpc = True
update = {}
port = 8069
init = {}
interface = 127.0.0.1
reportgz = False
database = openerp
db_host = 127.0.0.1
db_port = 5432
db_user = DBのユーザー名
db_password = DBのパスワード
db_name = openerp
addons_path = ~/.virtualenvs/openerp/lib/python2.7/site-packages/openerp-7.0_20130705_231024-py2.7.egg/openerp/addons

最後のaddons_pathはインストールした環境によって変わると思うので適宜対応して下さい。
OpenERPをインストールした場所にaddonsってディレクトリが有るはず。

動作確認

サーバーを起動してブラウザで確認。
デフォルトはhttp://localhost:8069で起動します。

% openerp-server

以下の様な画面が表示されればインストール成功です。
ログインはadmin/adminで入れる様になってるはず。

f:id:odoku:20130706192204p:plain

【nginx】"Address already in use"って言われて動かない【ubuntu】

Ubuntu12.04にNginxを入れる時にいっつも忘れるのでメモ。
80番ポートが使われてるよって怒られる場合は/etc/nginx/sites-available/defaultを以下の様に変更。

listen [::]:80 default_server;

listen [::]:80 ipv6only=on default_server;

コレで動くはず。

【python】isk-daemonのインストール【画像検索】

公式を見ると「easy-installでインスコ出来るお」って書いてあったんだけど何故か出来なかった。。
仕方ないのでgithubに上がってるソースからインスコしてみたけどコレも動かず。
イラッとしたのでpypiからソースを直接ダウンロードして入れてみたら動いたよ。

でもsite-packagesの直下にcoreとかuiとかいうディレクトリが出来るんだけど、ちょっと無作法じゃないですかねコレ。
気持ち悪い。

【python】dateをdatetimeに変換する方法【Tips】

検索してもパッと出てこないので書いておきます。 あんまり使う機会ないかもだけど。。

from datetime import date, time, datetime

# 今日の日付
today = date.today()

# dateをdatetimeに変換
# time()は"00:00:00"の事
today = datetime.combine(today, time())

リファレンスにちゃんと書いてありますね。
変換ってか結合って感じだけども。。

【MySQL】libhsclient_la-config.o: No such file or directory【HandlerSocket】

ubuntu10.04にMySQL HandlerSocket Pluginをインストールしようと思ったら下記の様なエラーが出た。

"libhsclient_la-config.o: No such file or directory"

調べてもさっぱり情報ないしどうしようーって思ってたら、make時にlibhsclientのディレクトリで生成されてるオブジェクトファイルの名前が何故か違ってたので、リネームしてmakeしなおしてやったらインストール出来ました。

sudo apt-get install libtool
sudo apt-get install autoconf
sudo apt-get install g++

cd ~/HandlerSocket-Plugin-for-MySQL

./autogen.sh
./configure --with-mysql-source=/home/odoku/opt/src/mysql5.5.14 --with-mysql-bindir=/home/odoku/opt/mysql/5.5.14/bin --with-mysql-plugindir=/home/odoku/opt/mysql/5.5.14/lib/plugin
make

# ここでエラーが出るんです。。

cd libhsclient
mv config.o libhsclient_la-config.o
mv escape.o libhsclient_la-escape.o
mv fatal.o libhsclient_la-fatal.o
mv hstcpcli.o libhsclient_la-hstcpcli.o
mv socket.o libhsclient_la-socket.o
mv string_util.o libhsclient_la-string_util.o

cd ..
sudo make install

はたしてこんな無理やりな対処方法でいいのかどうか。。