2014年1月9日木曜日

Webサーバー (Apache) でPythonファイルを実行できるように設定する

webサイト作成中に躓いたこと。

Pythonで作成した配列をJSONにエンコードしてAjaxで受け取ろうとすると、JSONではなくPythonのソースコードがそのまま送られてきた。

原因はwebサーバー上でPythonを実行できるように設定していなかったため。

手順は以下のとおり

1.Apacheの設定ファイルを開く
sudo vim /etc/httpd/conf/httpd.conf

2.次の記述箇所を検索して編集する
  AddHandler cgi-script .cgi 
=>  AddHandler cgi-script .cgi .py

3.次の記述箇所を検索し
<Directory "/var/www/html">
その少し離れた下の方にある記述を編集

  Options Indexes FollowSymLinks 
=>  Options Indexes FollowSymLinks ExecCGI


4.Apacheを再起動
sudo service httpd restart

以上


ちなみに

手順2の編集箇所に .pl .rb など各言語の拡張子を追記すれば実行可能になる模様。

また、DirectoryIndex index.html〜 という箇所に index.py など使用したい言語のindexページを記述しておけば html の動的生成ができるようだ。

2014年1月4日土曜日

pillowにlibjpegを導入する

pillowでjpeg画像を編集しているとdecode errorのようなメッセージが出た。
どうやらpillowだけではjpeg画像を扱えないらしい。

ということでlibjpegを導入する。(sudoは省略)

1.libjpegのダウンロード

wget http://www.ijg.org/files/jpegsrc.v9.tar.gz


2.解凍

tar xzvf jpegsrc.v9.tar.gz


3.ちょいと設定をいじる
./configure --enable-shared


4.インストール
make
make install


5.pillowをアンインストール
pip uninstall -y pillow


6.pillowをインストール
pip install pillow


無事、JPEGを扱えるようになりました。


追記)pythonを実行中に
shared object file 云々
のエラーが出たら、ライブラリへのパスが設定されていない可能性があるので、
/etc/ld.so.config.d/
のディレクトリに次の記述をしたファイルを作成する。
/usr/local/lib/
ファイル名は
python2.7lib.conf
のように .conf で終わるように付ける。

2014年1月3日金曜日

Pillowのthumbnailオプション比較

JPEGが開けませんといった問題を乗り越えて使えるようになったpillowで画像のリサイズをしてみた。

リサイズに用いたthumbnailメソッドにはresampleというオプションがあり、

  • NEAREST
  • BILINEAR
  • BICUBIC
  • ANTIALIAS

の4種類から指定できる。ちなみにオプション省略時はNEARESTが適用される。


早速これら4つのオプションを比較してみる。
検証画像はこちら。



この画像を300×300にリサイズ

NEAREST
曲線部分がカックカクな上にぶつ切りになっている。
傾斜のある直線も垂直方向に修正された結果、変なストライプができてしまった。


 BILINEAR
全体的にぼかされて曲線や斜め線のカックカクが改善されている。



BICUBIC
曲線や斜め線のカックカクが改善されているのに画像がシャープなまま。
ただし水平や垂直に近い曲線はカクカクしている。


ANTIALIAS
全体的にぼかされてカックカクな部分がほとんどない。


まとめ

オプションはBICUBICかANTIALIASを指定すべきだろう。
シャープさを求めるならBICUBIC
曲線美を求めるならANTIALIAS
といったところか。


ちなみに
サイズは300×300を指定したが、実際には最大長が300になるように縦横比率を保持してリサイズされた。
いちいち最大長を求めて条件分岐云々をやらなくて済む便利なメソッドのようだ。

2014年1月2日木曜日

CentOSにPython2.7をインストールし直す

先日、Vagrant上のCentOSにPython2.7をインストールした。

これに画像処理のライブラリpillowを入れたがimportできない。

どうやらCentOSにデフォルトでインストールされているPython2.6の方にライブラリが入ってしまったらしい。


テキトーにインストールしていたためパスがカオスなことになっていたのでPython2.7をインストールし直すことにした。


以下が手順


まず、vagrantに接続


/usr/local/bin
Python公式HPからダウンロードする場合、このディレクトリにインストールされるため、ここにパスを通す必要がある

visudo
このコマンドでパスを編集するファイルを開く

Defaults    secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
/usr/local/bin:を追加



作業中に
permission denied
のようなメッセージが出たら sudo を付けて実行する



cd /usr/local/src
wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
圧縮データをダウンロード


tar xvzf Python-2.7.6.tgz
解凍


cd Python-2.7.6
解凍したディレクトリに移動


./configure --enable-shared --prefix=/usr/local --with-threads
いろいろ設定して

make
ビルドして

make install
インストール


vim /etc/ld.so.conf.d/python2.7lib.conf
Pythonライブラリのパスを記述する新規ファイルを作成


/usr/local/lib/
上記の一文を追加して保存


ldconfig
設定を読み込み直す



次はeasy_installのインストール


その前に
which python
コマンドを実行してパスが
/usr/local/bin/python
であることを確認(/usr/bin/pythonだと2.6の方にインストールされてしまう)


wget https://pypi.python.org/packages/source/d/distribute/distribute-0.6.49.tar.gz
distribute をダウンロード


tar zxvf distribute-0.6.49.tgz 
distribute を解凍


cd distribute-0.6.49
解凍先のディレクトリに移動

python setup.py install
distribute をインストール


easy_install pip
pipをインストール



無事、pipでライブラリを追加できるようになった。

2013年12月26日木曜日

CSSやJavaScriptの変更がブラウザ上で反映されない問題

Vagrantの共有フォルダにCSSなどの静的ファイルを配置していた場合、ファイルの変更がブラウザに反映されない。

これはVagrantのsendfileという機能がキャッシュを送信してしまうため発生する。

sendfileを無効化するには、Webサーバーの設定ファイルを変更しなければならない。

当方のApache設定ファイルは次の場所に格納されていた。
/etc/httpd/conf/httpd.conf

そして次の記述を追加
EnableSendfile off
上書き保存後にWebサーバーを再起動


以上

2013年12月6日金曜日

Webブラウザからローカル開発環境上のPHPにファイル書き込みを実行させる

ドットインストールでPHP入門を学習していて躓いたこと。



PHPから外部ファイルに書き込む練習で次のようなソースを作成した。

// ファイル書き込み
$testFile = "test.dat";
$contents = "Hello World! \n";
if (is_writable($testFile)) {
 // ファイルオープン
 if (!$fp = fopen($testFile, "a")) {
  echo "could not open!";
  exit;
 }
 // 書き込み
 if (fwrite($fp, $contents) === false) { // "===" 厳密な"=="
  echo "could nor write!";
  exit;
 }
 echo "success!";
 fclose($fp);

} else {
 echo "not writable!";
 exit;
}


Webブラウザからローカル開発環境にあるPHPを実行すると
not writable!


試しにコンソールからローカル開発環境にログインしてPHPを実行すると

と上手くいっている様子。


書き込み先の test.dat の中身を見てみると




書き込みできている。



Webブラウザからはダメでローカル開発環境内ではOKということは、ファイル配置先の権限設定に問題があるのかも。


ファイルやディレクトリの権限設定を見る方法を調べると、
ls -l
というコマンドを発見。


早速コマンドを打ってみる。

test.dat の権限を細かく見てみると
①[ - ]  ②[ r w - ]  ③[ r w - ]  ④[ r - - ]
という4パーツに分けられる。
①[ - ] 対象がファイル("-")かディレクトリ("d")か
②[ r w - ] オーナー権限
③[ r w - ] グループ権限
④[ r - - ]  その他ユーザー権限
今回はWebブラウザから、つまり外部からのアクセスなので④が関係していると思われる。


各権限を表す3桁の意味は次の通り。
r:readable 読み込み可能
w:writable 書き込み可能
x:executable(?) 実行可能
-:該当の権限を持たない
このことから test.dat には外部ユーザーから書き込み権限がないことが分かる。


ということで、書き込み先のファイル test.dat にwritable権限を追加してみる。

使用するコマンドは
chmod [変更後の権限状態] [変更対象のファイル名]
変更後の権限状態は②〜④の権限状態をそれぞれ2進数から8進数に直した値を設定する。
②:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
③:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
④:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
→ [変更後の権限状態]:666
権限変更が反映されたことを確認。


WebブラウザからPHPを実行してみると
success!

test.dat の中身を見てみると
書き込みが追加されている。


ということで今回はローカル開発環境の権限設定を学習した。




ついでに権限設定で疑問を抱いたこと。
writable 書き込み可能
という言葉を見ると、書き込み命令を出す側(今回はPHP)が他のファイルに対して書き込むことができるという印象を受けた。

しかし実際には、書き込み対象のファイル(今回は test.dat )に対して書き込むことができるという意味だ。

ならばむしろ「変更可能」という表現にした方が誤解がないように思える。