Python: February 2009 Archives

Pythonの文字列は、Java等と同様にImmutableであり、頻繁に文字列を操作する場合においては、気をつけないと思わぬパフォーマンスの低下を招きます。

代表的なケースとしては、文字列に新たな文字列をどんどん連結していくケース。

  s = s + "新たな文字列1"
  s = s + "新たな文字列2"
  s = s + "新たな文字列3"
  . . .
  . . .
 
とせずに、配列を使って、
  L = []
  L.append("新たな文字列1")
  L.append("新たな文字列2")
  L.append("新たな文字列3")
  . . .
  . . .
  s = ''.join(L)

とするのが定石イディオムとされています(最初の例では、毎回新たな文字列が生成されるオーバーヘッドがあるとされる。参考:「Pythonクックブック」)。

これは本当に正しいのでしょうか。また、mutable文字列っぽいアプローチにはどのような方法があり、どれが一番良いのでしょうか。実際に性能を確かめてみないと納得できないので、上記の単純連結ケースについて軽く調べてみました。

vim上でpythonコードをデバッグする

| | Comments (0) | TrackBacks (0)
社内ではemacs派に押され気味のvim派ですが・・・

vimだってできるもんっ!ということで

先日の記事 emacs上でpythonコードをデバッグする に対抗してvim版をご紹介します。

HDEラボの桜井です。
今日はどうでもいいネタで。

Apache付属のhtpasswdコマンドが使うcryptを適当に実装してみた。
import random, crypt
import sys

# とりあえず64文字のsaltの種を用意
saltSet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
           'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
           '0','1','2','3','4','5','6','7','8','9','.','/']

# Randomクラスのインスタンスを生成
r = random.Random()

# saltを作成
salt = str(saltSet[r.randint(0, 63)]) + str(saltSet[r.randint(0, 63)])

# 引数があればcrypt
if len(sys.argv) > 1:
  print crypt.crypt(sys.argv[1], salt)

これで引数にパスワード文字列を指定して実行すると、cryptされた文字列が出てきます。
HDEラボの桜井です。
今日2/9はなんと夏目漱石の誕生日(1867年)なんですねぇ。

今回は、Twistedを使ったWebサーバにBasic認証機能を追加してみます。

まずは、必要なパッケージをimportします。
from twisted.application import internet, service
from twisted.web import error, server, twcgi, static, resource
from twisted.cred import checkers, credentials
import crypt
import copy

次に、server.Siteクラスを継承したBasic認証を可能にするクラスを作成します。
class BasicAuthSite(server.Site):

  # パスワードファイルをセットします
  def setPasswordFile(self, file):
    self.passwordFile = file

  # server.Site.getResourceFor をオーバーライドします
  # superの使い方がよくわからなかったのでこんなコードになってます、すいません
  def getResourceFor(self, request):
    # ユーザ名とパスワードが違ったら、認証ダイアログをあげる
    if self.authorize(request.getUser(), request.getPassword()) == False:
      request.setResponseCode(401, "Authorization Required")
      request.setHeader('WWW-Authenticate', 'Basic realm="Authorization Required"')
    request.site = self
    request.sitepath = copy.copy(request.prepath)
    return resource.getChildForRequest(self.resource, request)

  # 認証を行うメソッド
  def authorize(self, user, password):
    # データベースファイル(Apacheのhtpasswdコマンドで作成)を開く
    file = checkers.FilePasswordDB(self.passwordFile)
    # 認証
    try:
      # ファイルよりユーザを取得
      data = file.getUser(user)
      # ユーザ名とパスワードをチェックするクラスのインスタンスを生成
      check = credentials.UsernameHashedPassword(data[0], data[1])
      # 入力されたパスワードが正しいかどうかチェックしてboolean型で返す
      return check.checkPassword(crypt.crypt(password, data[1]))
    # 該当するユーザがいない場合はFalse
    except KeyError:
      return False

HDEラボの桜井です。
今日は節分ですが、私は恵方巻にはあまり縁がないので歳の数だけ豆を食べました。

さて、今日はweb.pyというpythonの簡単なWebフレームワークに付属する
テンプレート機能の使い方を簡単に説明したいと思います。

まず、下記からweb.pyをゲットしましょう。(downloadより取得してください)
http://webpy.org/

それから、web.pyを導入します。
# tar zxvf web.py-0.31.tar.gz
# cd webpy
# python setup.py install

これで下準備ができました。

About this Archive

This page is a archive of entries in the Python category from February 2009.

Python: January 2009 is the previous archive.

Python: March 2009 is the next archive.

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