Recently in Python Category

HDEラボの桜井です。
だいぶ涼しくなりました。

そういえば、9/10にFacebookがPython用Webサーバーフレームワーク「Tornado」をリリースしました。
FriendFeedの基盤となっていて、スケーラブルでノンブロッキングなWebサーバーだとか。

早速ですが、インストールして試してみました。
まず、ここからソースをダウンロードします。
ちなみに、Python2.5、2.6でしか動かないようです。CentOS5.3のPython2.4では文法エラーでビルドに失敗してました。
下記のように導入します。
# tar tornado-0.1.tar.gz
# cd tornado-0.1
# python setup.py install

さっそく、チュートリアルらしきものにしたがってプログラミング。
8888/TCPで待ち受けて、「HELO」と返すだけです。
面倒なのでPythonシェルで。
$ python
Python 2.6.1 (r261:67515, Mar 26 2009, 15:57:10)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tornado.httpserver
>>> import tornado.ioloop
>>> import tornado.web
>>>
>>> class MainHandler(tornado.web.RequestHandler):
...   def get(self):
...     self.write("HELO\n")
...
>>> application = tornado.web.Application([(r"/", MainHandler),])
>>>
>>> http_server = tornado.httpserver.HTTPServer(application)
>>> http_server.listen(8888)
>>> tornado.ioloop.IOLoop.instance().start()

別のターミナルを立ち上げてアクセス。
$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.0 200 OK
Content-Length: 4
Etag: "50d7c437b1b17589574e811d5085ed34a4b22340"
Content-Type: text/html; charset=UTF-8
Server: TornadoServer/0.1

HELO
Connection closed by foreign host.


感想としては...
  • Googleのwebappやweb.pyに似ている(と書いてあるし、その通り)
  • applicationを定義してる辺りはTwistedみたい
  • RESTやるならいいんじゃない?
ってところでしょうか?

もうちょっと細かいところを見てみないとわかりませんが、ちょっと楽しみなやつです。
ちなみに、ApacheLicenseです!!
HDEラボの桜井です。
さらに小ネタっていうかメモ。

先日はPython2.4でしたが、Python2.5ではsqlite3モジュールがbuilt-inになっているので、書き直してみました。

import sqlite3
# -*- coding: utf-8 -*-

con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE TEST(num integer)")
con.execute("INSERT INTO TEST(num) VALUES(200)")
for row in con.execute("SELECT * FROM TEST"):
   print row[0]
con.close()
まあ、こんな感じです。
HDEラボの桜井です。
台風が近づいています。

今日もPythonネタで。
環境は、CentOS 5.3(Python 2.4)です。

サンプルを書いてみます。
import sqlite
# -*- coding: utf-8 -*-

# RAM上にDBを作成
con = sqlite.connect(":memory:")

# 必要なテーブルを作成
cur = con.cursor()
cur.execute("create table TEST(num integer)")

# 値の書き込み
cur.execute("insert into TEST(num) values(300)")

# 値の参照
cur.execute("select * from TEST")
for row in cur:
  print row[0]

# DBの削除
cur.close()
con.close()

比較的手軽にできるので、ちょっとしたテンポラリデータベースが必要な場合には重宝するのではないでしょうか?
HDEラボの桜井です。
梅雨の時期ですねぇ。

ちょっと目を離してたら6/27にPython3.1がリリースされていました。
http://python.org/download/releases/3.1/

主な変更点は、
* ordered dictionary型の追加
* int型の最適化
* ユニットテストにテストのスキップと新しいアサーションのメソッドが追加
* IOモジュールの高速化
* TkinterがTileをサポート(Javaのルックアンドフィールみたいなもの?)
* importlibパッケージの追加
* ネストされたwithステートメントの新しい文法

使ってみようかな?

こんにちは、しのはらです。

先日、オープンソースのサーバー仮想化管理ソフト「Karesansui」がリリースされました。

実はKaresansuiの裏では、HDEがリリースしたもうひとつのオープンソースソフトウェア 「Pysilhouette」が陰ながら動いてます。

今回は、オープンソースのバックグラウンドジョブマネージャー「Pysilhouette」をご紹介いたします。


HDEラボの桜井です。
昨日のプログラムに、ちょっとだけ機能を追加してみましょう。

追加する機能は、プロキシサーバよりさらに先にあるプロキシサーバ(上位プロキシ)を
経由してインターネットにつなげるものです。

 
# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys
import urlparse
 
# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# 上位プロキシ設定
proxyHost = "192.168.0.1"
proxyPort = 8080

# プロキシリクエストのクラス
class MyProxyRequest(proxy.ProxyRequest):

  # processメソッドを継承
  def process(self):
    parsed = urlparse.urlparse(self.uri)
    protocol = parsed[0]
    host = parsed[1]
    print self.method

    port = self.ports[protocol]
    if ':' in host:
      host, port = host.split(':')
      port = int(port)
    rest = urlparse.urlunparse(('', '') + parsed[2:])
    if not rest:
      rest = rest + '/'
    class_ = self.protocols[protocol]
    headers = self.getAllHeaders().copy()
    if 'host' not in headers:
      headers['host'] = host
    self.content.seek(0, 0)
    s = self.content.read()

    # 上位プロキシの設定がある場合はこちら
    if proxyHost != "" and proxyPort != 0:
      clientFactory = class_(self.method, self.uri, self.clientproto, headers, s, self)
      self.reactor.connectTCP(proxyHost, proxyPort, clientFactory)
    # プロキシが必要ない場合はこちら
    else:
      clientFactory = class_(self.method, rest, self.clientproto, headers, s, self)
      self.reactor.connectTCP(host, port, clientFactory)

# プロキシクラスを継承
class MyProxy(proxy.Proxy):
  requestFactory = MyProxyRequest

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = MyProxy
 
# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run


本当はhttpsのプロキシもやりたいんだけどなぁ...。
HDEラボの桜井です。
いろいろと調査の多い昨今の仕事状況ですが、久しぶりにTwistedでも。

試験用にどうしてもHTTPプロキシサーバが必要だったので、なぜかTwistedで自作。
とりあえず機能は単純。
・HTTPプロキシしかできない(CONNECTメソッドはまだできない)
・上位プロキシに転送できない
・ログは標準出力に出す

# -*- coding: utf-8 -*-
from twisted.web import http, proxy
from twisted.internet import reactor, ssl
from twisted.python import log
import sys

# とりあえずログを標準出力へ
log.startLogging(sys.stdout)

# HTTPプロキシサーバのクラス
class MyProxyFactory(http.HTTPFactory):
  protocol = proxy.Proxy

# 実行
reactor.listenTCP(8080, MyProxyFactory())
reactor.run

WEBブラウザのプロキシ設定をして、アクセスすればログが見れます。
CONNECTメソッド対応、上位プロキシ対応ができたらまた公開します。

PyPI に登録する方法

| | Comments (0) | TrackBacks (0)
PyPIとは、Python Package Indexの略で、python版CPANのようなものです。 ここに自作のpythonパッケージを登録することで、easy_installで簡単に パッケージのインストールを行うことができます。

1. PyPIにユーザー登録

下記の2通りあります。いずれかの方法でPyPIにユーザー登録します。

  • PyPIのWebから登録する方法

ここから登録

  • コマンドラインから登録する方法 - PyPIに登録したいプロジェクト(setup.pyを含んだもの)がある場合
    • メニューから2を選択
      [rpmbuild@centos5x86 pysilhouette]$ python setup.py register
      running register
      We need to know who you are, so please choose either:
       1. use your existing login,
       2. register as a new user,
       3. have the server generate a new password for you (and email it to you), or
       4. quit
      Your selection [default 1]:  2
      Username: imtaizo
      Password: 
       Confirm: 
         EMail: taizo.ito@hde.co.jp
      

2. PyPIにコードを登録

[rpmbuild@centos5x86 pysilhouette]$ python setup.py register
running register
We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]:  1
Username: imtaizo
Password: 
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in /home/rpmbuild/.pypirc)
Save your login (y/N)?y

3. PyPIのホームページで確認

pypi-pysilhouette.png

4. easy_install によるインストール

[root@rhel5x86-64basic2 ~]# easy_install pysilhouette
Searching for pysilhouette
Reading http://cheeseshop.python.org/pypi/pysilhouette/
Reading http://sourceforge.jp/projects/pysilhouette/
Reading http://cheeseshop.python.org/pypi/pysilhouette/0.6.1
Best match: pysilhouette 0.6.1-beta
Downloading http://keihanna.dl.sourceforge.jp/pysilhouette/39732/pysilhouette-0.6.1-beta.tar.gz
Processing pysilhouette-0.6.1-beta.tar.gz
Running pysilhouette-0.6.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-0ZzV-c/pysilhouette-0.6.1/egg-dist-tmp-mDp7xU
zip_safe flag not set; analyzing archive contents...
Adding pysilhouette 0.6.1 to easy-install.pth file

Installed /usr/lib/python2.4/site-packages/pysilhouette-0.6.1-py2.4.egg
Processing dependencies for pysilhouette

さて早速シェルを組みたいところですが、いろいろとコマンドを組み合わせて作るので各コマンドの説明を先にしたいと思います。

HDEラボの桜井です。
今日は東京暖かいです。仕事してる場合ではありませんw

前回のエントリーにツッコミいただいたので、その方法を試したところ解決しました。
pythonのprint関数の仕様がよくわからなかったので。

念のため、解決方法。ダウンロード時に対処します。
    import sys

    print "Content-Type: application/zip;\r\nContent-Disposition: attachment; filename=test.zip\r\n\r\n",
    f = open("/tmp/test.zip")
    sys.stdout.write(f.read())
    f.close()

ふーん、なるほど。

About this Archive

This page is a archive of recent entries in the Python category.

Postfix is the previous category.

Ruby is the next category.

Find recent content on the main index or look in the archives to find all content.