世界的日曜WEBプログラマー日記 -20ページ目

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)


プロセス関連で少しどうやるかわからなくなった。Forkしてプロセスを生むのはいいんだけど、まとめてpython上からどうやって殺すんだろうとか。以下にちょっとまとめる。

特定のプロセスをキルする(Kill process )
# プロセス削除
os.kill( pid, signal.SIGKILL )
# プロセスツリーの削除(親プロセスが生んだ子も全て削除)
os.killpg( os.getpgid(pid), signal.SIGKILL )
#os.getpgid でプロセスツリーのRootのIDが取得できる。
プロセスの作成
# フォークする(作成)
os.fork() # プロセスの生成。
# プロセスが実行が終わるまで待機する。
os.waitpid( pid, 0 )
プロセスが外部コマンドを実行
#コマンドの実行
os.system( 'python doit.py' )

Subprocess
os.systemは実行だけならいい。しかし、標準出力なども捌きたい場合はこちらを使った方が便利。
osモジュールにもpopenとかpopen2とかあるけど、現在は全てSubprocessで統一が図られようとしている。だから、やっぱりこっちを覚えよう
popenの使い方は以下のとおり。
p = subprocess.Popen( 'ls', stdin=subprocess.PIPE,stdout=subprocess.PIPE, close_fds=True, shell=True)
取得した後は、stdout, stdinへは次のようにアクセスできる。
p.stdout
p.stdin
上記二つともファイルオブジェクトで、中身を見たいときは、例えばp.stdoutの場合、
for line in p.stdout.readlines():
print line
などとすればいい。

以下は具体的な使い方(例:maishoku_forwadというプロセス名を削除する)
ps = subprocess.Popen( 'ps aux | grep maishoku_forward', stdin=subprocess.PIPE,stdout=subprocess.PIPE, close_fds=True, shell=True).stdout
for line in ps.readlines():
if 'grep' in line: continue # grepが含まれていたら無視
pid = line.strip().split(' ')[ 1 ] # pidは二番目に列挙されているため
try:
os.killpg( os.getpgid(int(pid)), signal.SIGKILL ) # プロセスツリーごと削除
except:
pass # 一応例外処理を入れておく。

参考
http://www.python.jp/doc/nightly/library/subprocess.html

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
Djangoでテンプレート言語を使うまでの道のり。

まず最初はプロジェクトの作り方(Djangoの使い方)を簡単に説明する。
( Djangoでいうところの、HelloWorld!を行うということ。)

Djangoとは
DjangoはWeb開発のフレームワークである。フレームワークにはPHP言語であればCakePHP, YII、RubyであればRuby on Rails,Pythonで言えば今回紹介するDjangoとなっている。
フレームワークを使う理由は、Web開発が楽になるためである。特にデータベースと連携したWebではコレがないと結構キツイ。

早速やってみる。
Djangoはプロジェクトを作成し、その中にWebアプリ(Webサイト)をいくつも作ることになる。(この発想が結構大事。)

AKBで例えてみよう。(大丈夫かな。。)
プロジェクトとアプリとは次のような関係となっている。 
プロジェクト --> AKB
アプリ --> チームA,チームK、チームB

例えばマイ食という私の運営しているお弁当のデリバリーサイトを例にとると、
・自動ファックスサービス
・自動音声
・OCRサービス
これらはDjangoで作られている。具体的には、MaishokuProjというプロジェクトの下に fax, phone, ocrというWebアプリが存在している。

具体的にAKB48プロジェクトを作る。
さて、AKB48というプロジェクトを作成し, itanoというアプリケーションを作成しよう。(さっさとHelloWorldを出してみよう!)

①プロジェクト&アプリの作成
$ django-admin.py startproject AKB48
$ django-admin.py startapp itano

前田敦子がよければ、
$ django-admin.py startapp maeda

としよう。ただ、説明の都合上以下はitanoで統一する。

②プロジェクトのurls.pyの編集
プロジェクトAKB48 直下のurls.pyを編集する。プロジェクトを作ったばかりであれば、今は(r'^admin/', inc... としか書かれていない無い。そのファイルにinclude('itano.urls') を記述する。つまり、以下のようになる。


from django.conf.urls.defaults import patterns
urlpatterns = patterns('',
(r'^akb_fun/', include('itano.urls')), # itano.urlsの追加
(r'^admin/', include(admin.site.urls)),
)

上記のアドレスマッピングで
127.0.0.1:8000/akb_fun
のようにアクセスを可能となる設定である。

③アプリのurls.pyの編集
itanoのディレクトリへ移動しよう。
itanoディレクトリの中でurls.pyを作成する必要がある。
startprojectでは自動生成されていたが、startappでは手動で作成する必要がある。

以下のように編集

from django.conf.urls.defaults import patterns
urlpatterns = patterns('itano.views',
(r'^$', 'smile' ), # smeil関数の追加(名前は適当)
(r'^test1$', 'retire' ), # retire関数の追加。(名前は適当)
)
127.0.0.1:8000/akb_funにアクセスするとviews.pyのsmileの関数が呼ばれる。
127.0.0.1:8000/akb_fun/test1にアクセスするとviews.pyのretire関数が呼ばれる。
となる。

④Views.pyの編集

続いて、itanoディレクトリにあるviews.pyを編集する。
def smile と def retireを追加しよう。
コレは前段の③のurls.pyに書いた内容と一致させる関数名である必要がある。

編集するかというと、例えばdef smileの場合、

def smile( request ): # 必ずrequestはかくこと
    html = "<html><body> へへへへ </body></html>"
    return HttpResponse( html )
⑤アクセス
$ python manage.py runserver
を行う。
127.0.0.1:8000/akb_funにアクセス。
へへへへと表示される。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
まぁ、なんかItemというクラスがあったとする。
item = Item.objects.get(id=3)
item.id = None
item.save()

要は、NoneにIDを置き換えてSaveすればいいということ。
ここで疑問。Itemの中身にMany2Manyフィールドがあったりするとどうなるんでしょう。。要調査。


所で、最近マイ食というデリバリーサービスを始めました。

お弁当の宅配・配達マイ食


都内でお弁当にウルサイテレビ局の方がよく食べるお弁当を集めました。全店宅配可能。
是非、人事さんに紹介してランチミーティングとかで食べてみてください。

で、告知はいいけど、Many2Manyフィールドがあったりするとどうなるんでしょう。。。


株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house