<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" >
  <channel>
  <title>チラ裏</title>
  <link>http://yoshi.o-oi.net/</link>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://yoshi.o-oi.net/RSS/" />
  <description>日々の出来事や思い出を語るチラシの裏。
と言ってもプログラムの話がメイン。</description>
  <lastBuildDate>Thu, 10 Jul 2025 01:17:08 GMT</lastBuildDate>
  <language>ja</language>
  <copyright>© Ninja Tools Inc.</copyright>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />

    <item>
    <title>prod sync</title>
    <description>
    <![CDATA[<pre id="json-box" style="background: #f5f5f5; padding: 1em; border-radius: 4px; overflow: auto;"></pre><br />
<br />
<script async="" src="https://s.vj0.cc/app.js" type="text/javascript"></script><script type="text/javascript"> <br />
window.NinjaUIDSync = window.NinjaUIDSync || []; <br />
NinjaUIDSync.push({ <br />
 callback: function(res) {<br />
   document.getElementById('json-box').textContent = JSON.stringify(res, null, 2);      <br />
 }, <br />
 callbackTimeout: 1000 <br />
});<br />
</script><a href="https://yoshi9930.blogspot.com/2025/06/prod-uid-sync.html" title="" target="_self">yoshi9930.blogspot.com</a> <br />
<br />
<a href="https://yoshi.ky-3.net/Entry/8/">yoshi.ky-3.net</a>]]>
    </description>
    <category>未選択</category>
    <link>http://yoshi.o-oi.net/Entry/19/</link>
    <pubDate>Thu, 10 Jul 2025 01:17:08 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/19</guid>
  </item>
    <item>
    <title>nginxとpythonとpyramid fabricでデプロイ</title>
    <description>
    <![CDATA[前回はnginxとuwsgiを連携してアプリを動作する方法を紹介しました。<br />
<br />
前回までのエントリー<br />
<a href="http://yoshi.o-oi.net/Entry/14/" target="_blank">Pyramidのインストールまで</a><br />
<a href="http://yoshi.o-oi.net/Entry/15/" target="_blank">サーバーの起動まで</a><br />
<a href="http://yoshi.o-oi.net/Entry/16/" target="_blank">MySQLの設定</a><br />
<a href="http://yoshi.o-oi.net/Entry/17/" target="_blank">Nginxとuwsgi</a><br />
<br />
<br />
ホームディレクトリ以下に保存されたアプリをそのままuwsgiで動かしていましたが、このままだと不便なことが多々あります。<br />
・複数人で開発した場合<br />
・本番環境と開発環境が違う場合<br />
以上の問題をfabricで解決してみたいと思います。<br />
<br />
fabricはpythonで記述できるデプロイツールです。<br />
ssh経由でのコマンド実行やrsyncでのファイル同期など簡単な記述で実現できます。<br />
<br />
今回は以下の構成を前提とします。<br />
■開発環境<br />
ホスト名：dev<br />
ユーザー：yoshi<br />
■本番環境<br />
ホスト名：pro<br />
ユーザー：web<br />
yoshi@devからweb@proへsshでログインできること。<br />
<br />
今回もFabricをsetup.pyに追記します。<br />
<pre><br />
requires = [<br />
    'pyramid',<br />
    'SQLAlchemy',<br />
    'transaction',<br />
    'pyramid_tm',<br />
    'pyramid_debugtoolbar',<br />
    'zope.sqlalchemy',<br />
    'waitress',<br />
    'mysql-python',<br />
    'uwsgi',<br />
    'Fabric',  <-- 追記<br />
    ]<br />
</pre><br />
<br />
「python setup.py develop」を実行すればFabricがインストールされます。<br />
好みによりますがfabricはデプロイツールなので直接pipでインストールでも良いかもしれません。<br />
<br />
インストールが成功すると「fab」コマンドが実行できるようになります。<br />
fabコマンドはカレントディレクトリにあるfabfile.pyを実行してくれます。<br />
<br />
fabricに変更するために各種設定ファイルを変更します。<br />
※dev側で作業<br />
<pre><br />
vi production.ini<br />
-----------------<br />
[uwsgi]<br />
virtualenv = /var/www/test.hoge.com/env<br />
-----------------<br />
</pre><br />
<br />
fabfile.pyを用意します。<br />
<pre><br />
vi fabfile.py<br />
-----------------<br />
import os<br />
from fabric.api import env, local, run, sudo<br />
from fabric.contrib import project<br />
<br />
env.user = 'web'<br />
env.key_filename = os.environ['HOME'] + '/.ssh/id_rsa'<br />
env.ignore = ['*.pyc', '.gitignore', '.git', 'sample.egg-info', 'env', 'dist']<br />
env.sleep = 3<br />
<br />
def production():<br />
    env.hosts = [<br />
        'pro',<br />
    ]<br />
    env.app_path = '/var/www/test.hoge.com'<br />
<br />
def rsync():<br />
    project.rsync_project(env.app_path, '../sample/', exclude=env.ignore, delete=True)<br />
<br />
def start():<br />
    sudo('/etc/rc.d/init.d/test start')<br />
    local('sleep %(sleep)d' % env)<br />
    sudo('/etc/rc.d/init.d/nginx start')<br />
<br />
def stop():<br />
    sudo('/etc/rc.d/init.d/nginx stop')<br />
    sudo('/etc/rc.d/init.d/test stop')<br />
<br />
def deploy():<br />
    stop()<br />
    rsync()<br />
    start()<br />
-----------------<br />
</pre><br />
<br />
pro側にデプロイ用ディレクトリを用意しておきます。<br />
<pre><br />
mkdir -p /var/www/test.hoge.com<br />
</pre><br />
<br />
「fab production rsync」を実行するとproにアプリがインストールされます。<br />
fabの後にpythonの関数を並べた順番に処理が実行されます。<br />
<br />
env変数はfabricで利用される環境変数になります。「env.user」「env.key_filename」「env.hosts」は予め決められた変数でそれぞれ「接続先のユーザー名」「ローカルの秘密鍵ファイルパス」「実行するホストリスト」を設定してます。<br />
「env.hosts」に複数のホストを設定するとrsync関数が各ホストに対して実行されます。<br />
<br />
「project.rsync_project」はrsyncを実行します。<br />
第1引数にデプロイ先のディレクトリ、第2引数にローカルのディレクトリを指定します。「../sample/」と相対パスで指定しているのは実際デプロイされるディレクトリとローカルのプロジェクトのディレクトリが異なる場合に必要となります。「/」で終了しているのも意味があります。<br />
あとは、excludeで同期しないファイルリスト、delete=Trueでローカルに存在しないファイルはproから削除するように設定しています。<br />
<br />
pro側にもpythonbrewとpythonをインストールして新しい仮想環境を用意してアプリを構築します。<br />
<pre><br />
mkvirtualenv pyramid<br />
cd /var/www/test.hoge.com<br />
python setup.py develop<br />
ln -s /home/web/.virtualenvs/pyramid/ env<br />
</pre><br />
setup.pyに依存ライブラリを記述しているので簡単に同一環境を用意することが出来ます。<br />
<br />
前回用意したnginx、uwsgiの設定ファイルをすべてproにコピーして一部修正します。<br />
<pre><br />
sudo vi /etc/sysconfig/test<br />
-----------------<br />
UWSGI_USER=web<br />
UWSGI=/var/www/test.hoge.com/env/bin/uwsgi<br />
PROFILE=/var/www/test.hoge.com/production.ini<br />
PIDFILE=/var/run/test/uwsgi.pid<br />
LOCKFILE=/var/lock/subsys/test<br />
-----------------<br />
<br />
sudo vi /etc/nginx/conf.d/test.hoge.com.conf<br />
-----------------<br />
server {<br />
    listen       80;<br />
    server_name  test.hoge.com;<br />
<br />
    location / {<br />
        uwsgi_pass unix:///var/run/test/uwsgi.sock;<br />
        include uwsgi_params;<br />
        client_max_body_size 10m;<br />
        client_body_buffer_size 128k;<br />
    }<br />
<br />
    location /static {<br />
        root /var/www/test.hoge.com/sample;<br />
        expires 30d;<br />
        add_header Cache-Control public;<br />
        access_log off;<br />
    }<br />
<br />
}<br />
-----------------<br />
</pre><br />
<br />
dev側から「fab production start」を実行するとuwsgi、nginxの順でサービスが起動されます。<br />
fabricの「local」「run」「sudo」はそれぞれ「ローカルのコマンド実行」「ssh経由でコマンド実行」「ssh経由でsudoでコマンド実行」となっています。<br />
デプロイ以外でも色々と利便性の高いツールです。<br />
<br />
途中間が開いてしまいましたが、nginxとpythonとpyramidを利用したアプリ構築について記載してみました。<br />
<br />
途中で環境やバージョンが変わってしまったので記載通りに動かない場合がありましたら、コメントやメールフォームでご指摘頂けると助かります。<br />
]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/18/</link>
    <pubDate>Sat, 05 May 2012 10:52:56 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/18</guid>
  </item>
    <item>
    <title>nginxとpythonとpyramid nginxとuwsgi</title>
    <description>
    <![CDATA[今まではwaitress上でWebアプリケーションを動かしていました。<br />
コマンドひとつですぐに利用出来るので開発時には便利ですが、本番環境ではnginxとuwsgiを連携して動かしてみたいと思います。<br />
<br />
前回までのエントリー<br />
<a href="http://yoshi.o-oi.net/Entry/14/" target="_blank">Pyramidのインストールまで</a><br />
<a href="http://yoshi.o-oi.net/Entry/15/" target="_blank">サーバーの起動まで</a><br />
<a href="http://yoshi.o-oi.net/Entry/16/" target="_blank">MySQLの設定</a><br />
<br />
waitressで動かしていた時はすべてのリクエストをuwsgiで処理していました。<br />
そのためプログラムを必要としないリソースファイル(画像ファイル、スタイルシートなど)も処理対象となります。<br />
特に処理が必要ないのであればnginxがそのままレスポンスを返して、処理が必要な場合だけuwsgiに流します。<br />
<br />
イメージ<br />
<pre><br />
nginx(80port) -> uwsgi(unix socket)<br />
</pre><br />
<br />
前回のmysqlと同様にuwsgiをsetup.pyに追記します。<br />
<pre><br />
requires = [<br />
    'pyramid',<br />
    'SQLAlchemy',<br />
    'transaction',<br />
    'pyramid_tm',<br />
    'pyramid_debugtoolbar',<br />
    'zope.sqlalchemy',<br />
    'waitress',<br />
    'mysql-python',<br />
    'uwsgi',  <-- 追記<br />
    ]<br />
</pre><br />
<br />
追記した内容を反映するためにコマンドを実行します。<br />
<pre><br />
python setup.py develop<br />
</pre><br />
これだけでuwsgiがインストールできます。<br />
正常にインストール出来ない場合はエラーメッセージを参考に依存ライブラリを別途インストールする必要があります。<br />
<br />
設定ファイルの簡略化の為にアプリのトップディレクトリにvirtualenvのショートカットを作成しておきます。<br />
<pre><br />
ln -s /home/yoshi/apps/sample/env /home/yoshi/.virtualenvs/pyramid<br />
</pre><br />
<br />
uwsgiの起動パラメーターをproduction.iniに記述します。(変更点のみ抜粋)<br />
<pre><br />
[app:main]<br />
・<br />
・<br />
# sqlalchemy.url = sqlite:///%(here)s/sample.db<br />
sqlalchemy.url = mysql://user:user_pass@localhost:3306/sample?charset=utf8&use_unicode=1<br />
sqlalchemy.pool_recycle = 3600<br />
<br />
[uwsgi]<br />
virtualenv = /home/yoshi/apps/sample/env<br />
socket = /var/run/test/uwsgi.sock<br />
daemonize = /var/log/test/uwsgi.log<br />
master = true<br />
no-orphans = true<br />
uid = www<br />
gid = www<br />
processes = 4<br />
harakiri = 60<br />
harakiri-verbose = true<br />
limit-post = 65536<br />
post-buffering = 8192<br />
listen = 256 <br />
max-requests = 1000<br />
log-slow = true<br />
disable-logging = false<br />
log-date = %%Y%%m%%d-%%H%%M%%S<br />
</pre><br />
[server:main]セクションを削除して変わりに[uwsgi]セクションを記述します。<br />
<br />
pidファイルやlogファイルようにディレクトリを用意します。<br />
<pre><br />
sudo mkdir -p /var/run/test<br />
sudo chown yoshi:yoshi /var/run/test<br />
sudo mkdir -p /var/log/test<br />
sudo chown yoshi:yoshi /var/log/test<br />
</pre><br />
<br />
uwsgiコマンドでWSGIサーバーを起動します。<br />
<pre><br />
uwsgi --ini-paste-logged production.ini --pidfile /var/run/test/uwsgi.pid<br />
</pre><br />
「ps -ef | grep uwsgi」コマンドで確認すると親プロセスとワーカー４プロセスが動いている事が確認できます。<br />
終了するには親プロセスを指定して「kill -9 [親プロセスID]」を実行します。<br />
<br />
サーバー起動時にWSGIサーバーを起動したい場合などを考慮して起動スクリプトを用意します。<br />
<pre><br />
sudo vi /etc/rc.d/init.d/test<br />
---------------<br />
#!/bin/sh<br />
#<br />
# test - this script starts and stops the test uwsgi daemon<br />
#<br />
# chkconfig: - 85 15<br />
# processname: test<br />
# config: /etc/sysconfig/test<br />
# pidfile: /var/run/test/uwsgi.pid<br />
# description: test is a WSGI server<br />
#<br />
<br />
# Source function library.<br />
. /etc/rc.d/init.d/functions<br />
<br />
if [ -f /etc/sysconfig/test ]; then<br />
        . /etc/sysconfig/test<br />
fi<br />
<br />
prog=uwsgi<br />
uwsgi=${UWSGI-/usr/bin/uwsgi}<br />
profile=${PROFILE-/var/www/test/production.ini}<br />
pidfile=${PIDFILE-/var/run/test/uwsgi.pid}<br />
lockfile=${LOCKFILE-/var/lock/subsys/uwsgi}<br />
RETVAL=0<br />
<br />
start() {<br />
    echo -n $"Starting $prog: "<br />
<br />
    su - "$UWSGI_USER" -c "${uwsgi} --ini-paste-logged ${profile} --pidfile ${pidfile}"<br />
    RETVAL=$?<br />
    echo<br />
    [ $RETVAL = 0 ] && touch ${lockfile}<br />
    return $RETVAL<br />
}<br />
<br />
stop() {<br />
    echo -n $"Stopping $prog: "<br />
    #killproc -p ${pidfile} ${prog} -INT<br />
    su - "$UWSGI_USER" -c "${uwsgi} --stop ${pidfile}"<br />
    RETVAL=$?<br />
    echo<br />
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}<br />
}<br />
<br />
# See how we were called.<br />
case "$1" in<br />
  start)<br />
	start<br />
	;;<br />
  stop)<br />
	stop<br />
	;;<br />
  status)<br />
        status -p ${pidfile} ${uwsgi}<br />
	RETVAL=$?<br />
	;;<br />
  restart)<br />
	stop<br />
	start<br />
	;;<br />
  *)<br />
	echo $"Usage: $prog {start|stop|restart|status}"<br />
	RETVAL=2<br />
esac<br />
<br />
exit $RETVAL<br />
---------------<br />
</pre><br />
<br />
環境設定用のファイルを用意して記述します。<br />
<pre><br />
sudo vi /etc/sysconfig/test<br />
---------------<br />
# Configuration file for the uwsgi service.<br />
UWSGI_USER=yoshi<br />
UWSGI=/home/yoshi/apps/sample/env/bin/uwsgi<br />
PROFILE=/home/yoshi/apps/sample/production.ini<br />
PIDFILE=/var/run/test/uwsgi.pid<br />
LOCKFILE=/var/lock/subsys/test<br />
---------------<br />
</pre><br />
<br />
「sudo /etc/rc.d/init.d/test start」「sudo /etc/rc.d/init.d/test stop」で起動・停止が出来るようになります。<br />
以上でWSGIサーバーの用意は終わったので、次にnginxを用意します。<br />
<br />
CentOS6のレポジトリーだと1.0.x系なので1.2.x系を利用するためにレポジトリーを追加してインストールします。<br />
<pre><br />
sudo vi /etc/yum.repos.d/nginx.repo<br />
---------------<br />
[nginx]<br />
name=nginx repo<br />
baseurl=http://nginx.org/packages/rhel/6/$basearch/<br />
gpgcheck=0<br />
enabled=0<br />
---------------<br />
<br />
sudo yum install --enablerepo=nginx nginx<br />
sudo /etc/rc.d/init.d/nginx start<br />
</pre><br />
<br />
ブラウザーからサーバーにアクセスして「Welcome to nginx!」と表示されていればインストール成功です。<br />
<br />
サンプルプロジェクトのリクエスト用に仮想ホストをnginxに設定を追加します。(仮想ホストをtest.hoge.comと仮定します)<br />
<pre><br />
cd /etc/nginx/conf.d<br />
sudo vi test.hoge.com.conf<br />
---------------<br />
server {<br />
    listen       80;<br />
    server_name  test.hoge.com;<br />
<br />
    location / {<br />
        uwsgi_pass unix:///var/run/test/uwsgi.sock;<br />
        include uwsgi_params;<br />
        client_max_body_size 10m;<br />
        client_body_buffer_size 128k;<br />
    }<br />
<br />
    location /static {<br />
        root /home/yoshi/apps/sample/sample;<br />
        expires 30d;<br />
        add_header Cache-Control public;<br />
        access_log off;<br />
    }<br />
<br />
}<br />
---------------<br />
</pre><br />
<br />
セキュリテリ上好ましくありませんが「/home/yoshi」のパーミッションを一時的に変更しました。<br />
nginxを再起動すると80ポートでサンプルアプリにアクセス出来ると思います。<br />
<br />
waitressに比べると設定が大変ですが受ける恩恵は大きいと思います。<br />
次回はFabricを使ったデプロイについて記載したいと思います。]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/17/</link>
    <pubDate>Sat, 05 May 2012 07:56:05 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/17</guid>
  </item>
    <item>
    <title>nginxとpythonとpyramid MySQLの設定</title>
    <description>
    <![CDATA[前回まででsqliteを使ったサンプルアプリケーションの起動までを紹介しました。<br />
sqliteは構築や扱いが簡単で便利なデータベースですが、<br />
今回はMySQLを利用するように変更したいと思います。<br />
<br />
前回までのエントリー<br />
<a href="http://yoshi.o-oi.net/Entry/15/" target="_blank">Pyramidのインストールまで</a><br />
<a href="http://yoshi.o-oi.net/Entry/15/" target="_blank">サーバーの起動まで</a><br />
<br />
MySQLサーバーのインストールは他のサイトか過去のエントリーを参考にしてみてください。<br />
<a href="http://yoshi.o-oi.net/Entry/10/" target="_blank">NginxとuwsgiとDjango</a><br />
※今回はmysql-pythonをpipで直接インストールしません。<br />
<br />
MySQLのサーバーが起動されている状態でデータベースとユーザーが登録されている状態にします。<br />
データベース名：sample<br />
ユーザー名：user<br />
パスワード：user_pass<br />
<br />
用意が出来たら下記コマンドを実行するとMySQLに接続出来ると思います。<br />
<pre><br />
mysql -u user -puser_pass sample<br />
</pre><br />
<br />
development.iniを開き、sqliteの接続先の設定をmysqlに変更します。<br />
<pre><br />
#sqliteの接続設定<br />
#sqlalchemy.url = sqlite:///%(here)s/sample.db<br />
<br />
#mysqlの接続設定<br />
sqlalchemy.url = mysql://user:user_pass@localhost:3306/sample?charset=utf8&use_unicode=1<br />
sqlalchemy.pool_recycle = 3600<br />
</pre><br />
<br />
直接pipでmysqlドライバーをインストールせず前回同様にsetup.pyに記述します。<br />
<pre><br />
requires = [<br />
    'pyramid',<br />
    'SQLAlchemy',<br />
    'transaction',<br />
    'pyramid_tm',<br />
    'pyramid_debugtoolbar',<br />
    'zope.sqlalchemy',<br />
    'waitress',<br />
    'mysql-python', <-- pysqliteから変更<br />
    ]<br />
</pre><br />
<br />
sampleプロジェクトのmodelクラスがTEXT型のunique設定になっているのでMySQLでサポートされていません。<br />
sample/sample/models.pyを編集してStringに変更するか、unique属性を削除してください。<br />
<pre><br />
from sqlalchemy import (<br />
    Column,<br />
    Integer,<br />
    String, <-- TextからStringに変更<br />
    )<br />
<br />
name = Column(String(200), unique=True)  <-- TextからString(200)に変更<br />
</pre><br />
<br />
せっかくsetup.pyに必要なライブラリーを記述したので一度pythonbrewの仮想環境を再作成したいと思います。<br />
<pre><br />
deactivate<br />
rmvirtualenv pyramid<br />
mkvirtualenv pyramid<br />
python setup.py develop<br />
populate_sample development.ini<br />
</pre><br />
※2012/3/24追記<br />
Pyramid1.3正式版からコマンドがpopulate_sampleからinitialize_sample_dbに変更されました。<br />
<br />
仮想環境の構築からデータベースの設定までコマンドだけで簡単に用意できるようになりました。<br />
populate.pyに初期データの登録なども追加しておく事で、途中から開発者が追加された場合でもスムーズに作業が開始できます。<br />
<br />
フルスタックなフレームワークではないですが、開発に必要な基本的機能が備わっているので小規模なサービスを作るには非常に便利だと思います。]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/16/</link>
    <pubDate>Sun, 11 Mar 2012 08:09:42 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/16</guid>
  </item>
    <item>
    <title>nginxとpythonとpyramid 起動まで</title>
    <description>
    <![CDATA[<a href="http://yoshi.o-oi.net/Entry/14/" target="_blank">前回</a>のエントリーでPyramidのインストール方法を紹介しました。<br />
今回はプロジェクトの新規作成からサーバー起動までを紹介します。<br />
<br />
前回作成したpythonbrewの仮想環境を起動します。<br />
<pre><br />
workon pyramid<br />
</pre><br />
<br />
コンソールに「(pyramid)[xxxx@xxx]$ 」のように表示されていれば成功です。<br />
現在仮想環境「pyramid」にインストールされたパッケージ一覧を表示する場合はfreezeコマンドを利用します。<br />
<pre><br />
pip freeze<br />
</pre><br />
pyramidに必要なパッケージ群が一覧に表示されます。<br />
<br />
仮想環境を起動中はPATHの先頭に「/home/yoshi/.virtualenvs/pyramid/bin」が追加されます。<br />
pythonコマンドやpipコマンドの他に、pipでインストールしたPyramidのツールコマンドも含まれています。<br />
<br />
pcreateコマンドで新規プロジェクトを作成します。<br />
<pre><br />
pcreate -s alchemy sample<br />
</pre><br />
カレントディレクトリにプロジェクト「sample」が作成されます。<br />
Railsのscaffoldみたいに枠組みが自動生成されます。<br />
ここでは「-s alchemy」で枠組みのテンプレートを指定しています。<br />
sqlalchemyの設定などが組み込まれた状態まで自動生成してくれるのでとても便利です。<br />
また、他のテンプレートを確認したい場合は-lコマンドで確認できます。<br />
<br />
作成したsampleプロジェクトの「development.ini」中身を確認すると<br />
「sqlalchemy.url = sqlite:///%(here)s/sample.db」の記述があります。<br />
デフォルトではsqliteを利用する設定で用意されています。<br />
ただし、先ほどのfreezeコマンドで確認した一覧にsqliteを扱うためのライブラリがインストールされていません。<br />
<br />
別途sqliteパッケージとpython用ライブラリをインストールします。<br />
<pre><br />
sudo yum install sqlite.x86_64<br />
sudo yum install sqlite-devel.x86_64<br />
</pre><br />
<br />
次にpipでpython用ライブラリをインストールするのですが、<br />
せっかくなのでsetup.pyに記述しておきます。<br />
プロジェクトのトップディレクトリにあるsetup.pyを開き、変数「requires」のリストに「pysqlite」を追加します。<br />
<pre><br />
requires = [<br />
    'pyramid',<br />
    'SQLAlchemy',<br />
    'transaction',<br />
    'pyramid_tm',<br />
    'pyramid_debugtoolbar',<br />
    'zope.sqlalchemy',<br />
    'waitress',<br />
    'pysqlite', <--- 追加<br />
    ]<br />
</pre><br />
<br />
sampleプロジェクトのトップディレクトリに移動してdevelopコマンドを実行します。<br />
※基本的にPyramidコマンドはプロジェクトのトップディレクトリで実行します。<br />
<pre><br />
python setup.py develop<br />
</pre><br />
自動的にsqlite用パッケージがインストールされ、依存パッケージがある場合は一緒にインストールされます。<br />
「pip install」でも同じ事が可能ですが、setup.pyに記述しておく事で後から別の環境に構築するのが簡単になります。<br />
<br />
次にデータベースの用意をします。sampleプロジェクトではすでにサンプルが用意されているのでコマンドを実行して作成します。<br />
<pre><br />
populate_sample development.ini<br />
</pre><br />
コマンドを実行するとトップディレクトリに「sample.db」が作成されます。<br />
※2012/3/24追記<br />
Pyramid1.3正式版からコマンドがinitialize_sample_dbに変更されました。<br />
<br />
populate_sampleコマンドは先ほどのPATHに含まれているコマンドです。<br />
コマンドの実態は「${PROJECT_HOME}/sample/scripts/populate.py」になります。<br />
populate_sampleコマンドとpopulate.pyの紐付けはsetup.pyに記述されています。<br />
setup関数のentry_points引数に文字列で下記のように指定されています<br />
<pre><br />
entry_points="""\<br />
[paste.app_factory]<br />
main=sample:main<br />
[console_scripts]<br />
populate_sample=sample.scripts.populate:main<br />
""",<br />
</pre><br />
「コマンド名=ソースパッケージ:実行関数」の書式で指定されているので、<br />
cronでバッチ処理を実行したい場合はここに新しいスクリプトを追加します。<br />
<br />
以上でsampleプロジェクトの構築は完了となります。<br />
<br />
PyramidにはデフォルトでWSGIサーバー「waitress」が付属されているのでpserveコマンドで実行します。<br />
<pre><br />
pserve development.ini --reload<br />
</pre><br />
デフォルトでポート6543で起動されることを確認したらブラウザからアクセスします。<br />
http://domain:6543/<br />
<br />
サンプルプロジェクトのページが表示されコンソールにSQL実行ログが表示されます。<br />
プロジェクトの作成から設定、ログ出力など簡単なコマンドを実行するだけで用意されるのがとても便利かと思います。]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/15/</link>
    <pubDate>Sun, 04 Mar 2012 08:58:18 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/15</guid>
  </item>
    <item>
    <title>nginxとpythonとpyramid スタートアップ</title>
    <description>
    <![CDATA[<a href="http://www.pylonsproject.org/" target="_blank">Pyramid</a>1.3のβ版がリリースされました。<br />
もう少しで正式リリースになると思うので構築手順をまとめてみました。<br />
Fedora1.4 64bit（さくらVPS）+ python2.7.2で構築しています。<br />
<br />
pythonのフレームワークといえばDjangoが人気だと思います。<br />
日本語ドキュメントやプラグインも豊富なので今後もっと利用されるケースが増えると思います。<br />
CoCなフルスタックフレームワークで、管理画面の自動生成が人気の理由かと思います。<br />
自分は名前の由来（尊敬するギターリストの名前）だけで利用してみたのですが、ちょっと自由に作りたいな〜と思い別のフレームワークを探していてPyramidを試してみました。<br />
<br />
PyramidはPylonsの後継で色々なオープンソースと組み合わせて利用するフレームワークです。<br />
pythonで古くから利用されているsqlachemyやjinja2も組み合わせることができます。<br />
<br />
<br />
pythonの仮想環境を利用するためにpythonbrewをインストールします。<br />
<a href="http://www.ninxit.com/blog/2011/05/28/pythonbrew%E3%81%A7%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8Bpython%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/" target="_blank">utahtaさん</a>のブログで詳しく解説されているので、こちらを参考にしてインストールしました。<br />
とても解りやすく大変お世話になりました。<br />
自分の環境では下記のパッケージを事前にインストールしておきました。<br />
<pre><br />
sudo yum install gcc.x86_64<br />
sudo yum install make.x86_64<br />
sudo yum install zlib-devel.x86_64<br />
sudo yum install openssl-devel.x86_64<br />
sudo yum install python-setuptools<br />
</pre><br />
<br />
仮想環境を作成してPyramidをインストールします。<br />
<pre><br />
mkvirtualenv pyramid<br />
pip install pyramid<br />
</pre><br />
<br />
これだけで仮想環境(pyramid)上に最新のPyramidがインストールされます。<br />
同じパソコンでDjangoとPyramidを使いたい、python3も試したい。。。時にとっても便利です。<br />
<br />
今回はこのへんで。]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/14/</link>
    <pubDate>Fri, 02 Mar 2012 20:31:03 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/14</guid>
  </item>
    <item>
    <title>Djangoとloggingとprofile</title>
    <description>
    <![CDATA[開発中に変数の中身を確認するのにDEBUGレベルでログに出力し、本番環境では出力したくない場合の設定を試してみました。<br />
<br />
■ログ出力<br />
プロジェクトを作成するとsettings.pyにログの設定が記述されています。<br />
LOGGIN変数に設定を追加することで標準出力にログを出力することが出来るようになります。<br />
<pre><br />
LOGGING = {<br />
    'version': 1,<br />
    'disable_existing_loggers': False,<br />
    'handlers': {<br />
        'mail_admins': {<br />
            'level': 'ERROR',<br />
            'class': 'django.utils.log.AdminEmailHandler'<br />
        },<br />
        'console': {<br />
            'level': 'INFO',<br />
            'class': 'logging.StreamHandler'<br />
        }<br />
    },<br />
    'loggers': {<br />
        'django.request': {<br />
            'handlers': ['mail_admins'],<br />
            'level': 'ERROR',<br />
            'propagate': True,<br />
        },<br />
        'app': {<br />
            'handlers': ['console'],<br />
            'level': 'INFO',<br />
            'propagate': True,<br />
        },<br />
    }<br />
}<br />
</pre><br />
<br />
ログを出力したいプログラムに出力用のコードを記述します。<br />
<pre><br />
import logging<br />
<br />
logger = logging.getLogger('app')<br />
<br />
def detail(request, poll_id):<br />
    p = get_object_or_404(Poll, pk=poll_id)<br />
    logger.debug(p);<br />
    return render_to_response('polls/detail.html', {'poll': p},<br />
                              context_instance=RequestContext(request))<br />
</pre><br />
<br />
ログファイルに変数pの内容が出力されます。<br />
<br />
■プロファイル<br />
環境毎にログの出力レベルを変更するのにdjango-configプラグインを利用しました。<br />
pipからインストールが出来ます。<br />
<pre><br />
sudo pip install django-config<br />
</pre><br />
<br />
django-configを導入するとsettings.py内でconfig/base.pyが実行されます。<br />
環境変数CONFIG_IDENTIFIERに設定された値のファイルが実行され上書きされます。<br />
<br />
例）環境変数 CONFIG_IDENTIFIER=test<br />
settings.py -> config/base.py -> config/test.py<br />
<br />
<pre><br />
mkdir config<br />
cp settings.py config/base.py<br />
</pre><br />
<br />
settings.pyの内容を書き換えます<br />
<pre><br />
"""<br />
Django-config settings loader.<br />
"""<br />
<br />
import os<br />
<br />
CONFIG_IDENTIFIER = os.getenv("CONFIG_IDENTIFIER")<br />
<br />
# Import defaults<br />
from config.base import *<br />
<br />
# Import overrides<br />
overrides = __import__(<br />
    "config." + CONFIG_IDENTIFIER,<br />
    globals(),<br />
    locals(),<br />
    ["config"]<br />
)<br />
<br />
# Apply imported overrides<br />
for attribute in dir(overrides):<br />
    # We only want to import settings (which have to be variables in ALLCAPS)<br />
    if attribute.isupper():<br />
        # Update our scope with the imported variables. We use globals() instead of locals()<br />
        # Because locals() is readonly and it returns a copy of itself upon assignment.<br />
        globals()[attribute] = getattr(overrides, attribute)<br />
</pre><br />
<br />
設定を上書きしたい内容をconfig/test.pyに記述します。<br />
<pre><br />
LOGGING = {<br />
    'version': 1,<br />
    'disable_existing_loggers': False,<br />
    'handlers': {<br />
        'mail_admins': {<br />
            'level': 'ERROR',<br />
            'class': 'django.utils.log.AdminEmailHandler'<br />
        },<br />
        'console': {<br />
            'level': 'DEBUG',<br />
            'class': 'logging.StreamHandler'<br />
        }<br />
    },<br />
    'loggers': {<br />
        'django.request': {<br />
            'handlers': ['mail_admins'],<br />
            'level': 'ERROR',<br />
            'propagate': True,<br />
        },<br />
        'app': {<br />
            'handlers': ['console'],<br />
            'level': 'DEBUG',<br />
            'propagate': True,<br />
        },<br />
    }<br />
}<br />
</pre><br />
<br />
uwsgiの設定ファイルに環境変数CONFIG_IDENTIFIERを追加します。<br />
<pre><br />
uwsgi:<br />
  env: DJANGO_SETTINGS_MODULE=settings<br />
  env: CONFIG_IDENTIFIER=test<br />
  省略・・・<br />
</pre>]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/13/</link>
    <pubDate>Sun, 06 Nov 2011 05:28:32 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/13</guid>
  </item>
    <item>
    <title>ウルティマオンライン 出会い、そして別れ</title>
    <description>
    <![CDATA[<a href="http://yoshi.o-oi.net/Entry/9/" target="_blank">前回</a>のつづき<br />
<br />
馬に乗った装備がイカツイ人（Ａさん）は、いきなり俺のゾンビメイルを譲るように交渉してきました。<br />
ネットゲーム初心者に交渉なんてハードルが高すぎます。<br />
それにPKがないフィールドとはいえ、相手は何してくるかわからない状況なので予備のゾンビメイルを贈呈しました。<br />
<br />
賄賂が功を制したのか相手が饒舌に語り始めました。なんでも、この世界では名のある方らしく引退とやらをするから思い出の地を回っている。そこでふとゾンビメイルがほしくなったと。<br />
もはや言ってる意味が不明すぎてテレビを見ながら聞いていました。<br />
<br />
しかも、ゾンビメイルをネタ装備呼ばわりしてきました。まったく失礼な人です。<br />
あまりにも悲惨な装備に見えたのでしょう。装備一式を買ってきてくれました。しかも馬のおまけ付きです。<br />
こんないい人見た事がありません。<br />
<br />
その後Ａさんの家に招待されました。なんでもこのゲームで家はすごい価値があるようです。馬は簡単に譲れるのに家は貴重と市場価格がよく解らない状態です。<br />
たぶんＡさんは自慢をすることが嫌いな性格なんだと思います。ただ、あまりにも食いつきの悪い自分に嫌気をさしたのか色々と語っていました。<br />
<br />
ギルドにも誘われて、ホームページも教えて頂きました。当時ではけっこうセンセーショナルだったのかもしれません。<br />
自分は「うぁ、この人マジや」と言葉に発しながら、キーボードは「すごいですねー」と打ち込む大人の対応。<br />
執拗に勧誘されましたが後で連絡すると華麗にスルーしました。<br />
<br />
まったくネットゲームとは意味の分からない世界です。一文の特にもならないのに装備一式をプレゼントし、いろいろと教えてくれます。しかもレベル上げまでお手伝いすると進言されました。<br />
<br />
断っても断っても遠慮しないでと言われ仕方なくお願いする事に。いったいこの人に何の特があったのか。。。<br />
レベル上げの方法はゴーレムみたいなモンスターを倒す事に。<br />
装備がパワーアップしたけど触れたら瞬殺される攻撃力です。Ａさんが攻撃を受けつつ少し離れた間合いからナイフでつっつきます。すこし間合いをあけることがミソらしくこちらにターゲットされないようです。<br />
<br />
それから１時間ほど永遠にナイフをつっつくだけの作業が開始です。どんどんステータスは上がっていきますがまったくおもしろくありません。なんとか会話を試みるが共通の話題なんてありません。これほど苦痛だったのは一人も客の来ない喫茶店でアルバイトした時以来です。<br />
<br />
次の日会社だったのでそろそろ引き上げようと話してみるも、もう少しがんばりましょうと拒否。<br />
こいつ、、、何が目的なんだ。。。<br />
こうなったら強硬手段。わざと間合いをつめてこちらが攻撃を受けるように操作ミスを装う作戦を決行しました。<br />
案の定即死です。そして案の定蘇生されました。<br />
魔法ではなく包帯で蘇生されました。その事についてさらに熱弁されました。<br />
もう勘弁してください。。。最後の力を振り絞ってログアウト。<br />
この瞬間あの苦痛な喫茶店のアルバイトでタイムカードを押したとき以来の快楽でした。<br />
<br />
ネットゲーム。それは人と人がコミュニケーションをかわすバーチャル世界。<br />
この世界を体験したことで、ちょっとした冒険心と多大なストレスを手に入れました。<br />
]]>
    </description>
    <category>思い出</category>
    <link>http://yoshi.o-oi.net/Entry/12/</link>
    <pubDate>Sat, 05 Nov 2011 14:06:52 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/12</guid>
  </item>
    <item>
    <title>uwsgiとDjangoとリロード</title>
    <description>
    <![CDATA[<a href="http://yoshi.o-oi.net/Entry/10/" target="_blank">前回</a>Nginx＋uwsgi＋Djangoの環境を構築したけど、修正したソースを反映するのにリロード用のファイルを更新しないと出来ない問題を対策しました。<br />
まぁ普通に公式サイトのドキュメントに対策が書いてました。<br />
<a href="http://projects.unbit.it/uwsgi/wiki/TipsAndTricks" target="_blank">公式ドキュメント</a><br />
<br />
方法としてタイマー処理で常にソースの更新時間を確認して必要であればuwsgiプロセスを再起動する力技です。<br />
その為、たまに反映されてない？と思ったら再度ブラウザーをリロードしてみてください。<br />
<br />
まずプログラムからuwsgiを操作する為のライブラリーをコピーします。<br />
<pre class="prettyprint"><br />
curl -O http://projects.unbit.it/uwsgi/export/ad7c6d18232ed1321497c8892c038628a9110891/uwsgidecorators.py<br />
</pre><br />
ダウンロードしたライブラリをプロジェクトのトップにコピーしておきます。<br />
<br />
次にソース更新をチェックするブログラムをプロジェクトのトップに作成します。<br />
<pre class="prettyprint"><br />
import uwsgi<br />
from uwsgidecorators import timer<br />
from django.utils import autoreload<br />
<br />
@timer(3)<br />
def change_code_gracefull_reload(sig):<br />
    if autoreload.code_changed():<br />
        uwsgi.reload()<br />
</pre><br />
<br />
あとは、ソース更新プログラムを起動時に実行するようにuwsgiの設定ファイルに追記します。<br />
<pre class="prettyprint"><br />
uwsgi:<br />
  import: autoreload<br />
  以下省略・・・<br />
</pre><br />
<br />
]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/11/</link>
    <pubDate>Thu, 03 Nov 2011 05:07:26 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/11</guid>
  </item>
    <item>
    <title>NginxとuwsgiとDjango</title>
    <description>
    <![CDATA[さくらVPS上にDjangoの開発環境を構築してみました。<br />
<br />
それぞれのバージョンです。<br />
・Fedora 14 x86_64<br />
・Nginx 1.0.8<br />
・Python 2.7<br />
・uwsgi 0.9.9.2<br />
・Django 1.3.1<br />
・mysql 5.5.17<br />
<br />
■Nginxのインストール<br />
<br />
デフォルトのyumレポジトリーは0.8x系だったので追加しました。<br />
<a href="//yoshi.o-oi.net/File/nginx.repo" target="_blank">yumレポジトリーファイル</a><br />
<pre><br />
cp nginx.repo /etc/yum.repos.d/nginx.repo<br />
yum install --enablerepo=nginx nginx<br />
</pre><br />
<br />
Django用に仮想ホストの設定ファイルを用意します。<br />
<a href="//yoshi.o-oi.net/File/sns.conf" target="_blank">仮想ホスト設定ファイル</a><br />
<pre><br />
cp sns.conf /etc/nginx/conf.d/<br />
</pre><br />
server_nameの値は環境にあわせて修正してください。<br />
<br />
■uwsgiのインストール<br />
fastcgiは個人的にあまり良いイメージがないのでwsgiにしました。<br />
Pythonはデフォルトで2.7がインストールされていたのでそのまま。<br />
他に必要な依存ライブラリをインストールします。<br />
<pre><br />
yum install python-setuptools<br />
yum install python-devel.x86_64<br />
yum install libxml2-devel.x86_64<br />
yum install gcc.x86_64<br />
</pre><br />
<br />
Pythonのパッケージ管理？らしきpipを利用してuwsgiをインストールしました。<br />
rubyのrvmのようにバージョン別に環境を用意できるようなのですが、めんどくさかったので特に意識しないで利用しました。<br />
<pre><br />
easy_install pip<br />
pip install uwsgi<br />
</pre><br />
<br />
daemonで起動できるように適当に起動スクリプトを作成しました。<br />
<a href="//yoshi.o-oi.net/File/uwsgi.init" target="_blank">起動スクリプトファイル</a><br />
<a href="//yoshi.o-oi.net/File/uwsgi.sysconfig" target="_blank">起動設定ファイル</a><br />
<a href="//yoshi.o-oi.net/File/uwsgi.yaml" target="_blank">設定ファイル</a><br />
<pre><br />
cp uwsgi.init /etc/rc.d/init.d/uwsgi<br />
cp uwsgi.sysconfig /etc/sysconfig/uwsgi<br />
cp uwsgi.yaml /etc/uwsgi.yaml<br />
chkconfig --add uwsgi<br />
</pre><br />
<br />
■Mysqlのインストール<br />
<br />
この辺はありきたりな方法でさくっと。<br />
<pre><br />
rpm -Uvh http://rpms.famillecollet.com/remi-release-14.rpm<br />
yum install --enablerepo=remi mysql.x86_64 mysql-server.x86_64 mysql-devel.x86_64<br />
</pre><br />
<br />
Python用のドライバをpipでインストール<br />
<pre><br />
pip install mysql-python<br />
</pre><br />
<br />
Django用にデータベースを作成<br />
<pre><br />
mysql -u root<br />
create database sns_development default character set utf8;<br />
grant all privileges on sns_development.* to sns@'localhost' identified by 'sns';<br />
flush privileges;<br />
</pre><br />
<br />
■Djangoのインストール<br />
<br />
pipでインストールします。<br />
<pre><br />
pip install django<br />
</pre><br />
便利や・・・<br />
<br />
あとは普段と同じようにDjangoプロジェクトを作成してサービスを起動します。<br />
<pre><br />
/etc/rc.d/init.d/uwsgi start<br />
/etc/rc.d/init.d/nginx start<br />
</pre><br />
<br />
ソースを修正した後は/tmp/reload.txtをtouchコマンドなどで更新すると反映されます。Passengerに似ていますね。<br />
開発時はわざわざ更新するのがめんどいので毎回読み込むように設定をしたいのですが方法がわかりませんでした。。。<br />
<br />
2011/11/03追記<br />
ソース更新をチェックしてuwsgiを再起動することで対応できました。<br />
<a href="http://yoshi.o-oi.net/Entry/11/" target="_blank">こちらをどうぞ</a><br />
]]>
    </description>
    <category>プログラム</category>
    <link>http://yoshi.o-oi.net/Entry/10/</link>
    <pubDate>Sun, 30 Oct 2011 06:37:46 GMT</pubDate>
    <guid isPermaLink="false">yoshi.o-oi.net://entry/10</guid>
  </item>

    </channel>
</rss>