文字列比較

気になったので比較して結果を確認した。

# -*- encode: utf-8 -*-

if u'0' < u'1':
	print '0 < 1'
if u'1' < u'2':
	print '1 < 2'
if u'2' < u'3':
	print '2 < 3'
if u'3' < u'4':
	print '3 < 4'
if u'4' < u'5':
	print '4 < 5'
if u'5' < u'6':
	print '5 < 6'
if u'6' < u'7':
	print '6 < 7'
if u'7' < u'8':
	print '7 < 8'
if u'8' < u'9':
	print '8 < 9'
if u'9' < u'a':
	print '9 < a'

if u'1' < u'01':
	print '1 < 01'
else:
	print '1 > 01'

if u'01' < u'001':
	print '01 < 001'
else:
	print '01 > 001'

同じ値を複数の変数に代入する

もしかして邪道なのかな。

st1 = 'a'
st2 = 'b'
st3 = st4 = st1

print st1      # => 'a'
print id(st1)  # => 26430944
print st2      # => 'b'
print id(st2)  # => 26431008
print st3      # => 'a'
print id(st3)  # => 26430944
print st4      # => 'a'
print id(st4)  # => 26430944


st5 = st2 = st1

print st1      # => 'a'
print id(st1)  # => 26430944
print st2      # => 'b'
print id(st2)  # => 26431008
print st3      # => 'a'
print id(st3)  # => 26430944
print st4      # => 'a'
print id(st4)  # => 26430944
print st5      # => 'a'
print id(st5)  # => 26430944

便利だなーと思った

指定したdatetime値でのfilter


ユーザー一覧の表示などする時には fetch() を使っていた。
しかしこれでは1000件の壁にぶち当たる。
そこで datetime 値での filter を使用した。

  • こんなモデルがあったとする
from google.appengine.ext import db

class Member(db.Model):
    insert_datetime = db.DateTimeProperty(auto_add = True)
    name = db.StringProperty()
    age = db.IntegerProperty()
  • 検索はこんな感じ
# 検索 パターン1
def search_query_patterm(delimiter_id=None):
    """
    Member から指定した件数の情報を取得する。
        insert_datetime を昇順ソートし
        delimiter_id で指定した Member までを除外する。
    """
    from google.appengine.ext import db
    from member.models import Member
    import datetime

    if delimiter_id is None:
        delimiter_dt = str(datetime.datetime.now())
    else:
        m = Member.get(delimiter_id)
        delimiter_dt = str(m.insert_datetime)

    m = Member.all()\
        .filter('insert_datetime > ', delimiter_dt)\
        .order('insert_datetime')
        .fetch(10, 0)
    return m

# 検索 パターン2
def search_gql_patterm(delimiter_id=None):
    """
    Member から指定した件数の情報を取得する。
        insert_datetime を昇順ソートし
        delimiter_id で指定した Member までを除外する。
    """
    from google.appengine.ext import db
    from member.models import Member
    import datetime

    if delimiter_id is None:
        delimiter_dt = str(datetime.datetime.now())
    else:
        m = Member.get(delimiter_id)
        delimiter_dt = str(m.insert_datetime)

    gql = "SELECT * FROM member_member"
    gql += " WHERE insert_datetime > DATETIME('%s')"
    gql += " ORDER BY insert_datetime ASC"
    m = db.GqlQuery(gql % datetime_dt)
    return m

microsecond があれば、そこまで比較してくれる。ドキュメントを見ると一番細かいのは「DATETIME(year, month, day, hour, minute, second)」または「DATETIME('YYYY-MM-DD HH:MM:SS')」と記載されていて microsecond まで対応してるとは書いてない。
試したら期待通りに動いてくれたとはいえ、いずれ無視されるようになるかもしれないなーと思った。

管理したくないファイルを拡張子で指定

「*.pyc」ファイルは管理しなくていいだろ、ということで。

  1. リポジトリに「.gitignore」ファイルを作成
  2. 「.gitignore」ファイルへ以下のように記載
    */**/*.pyc
  3. コミット
 > cd C:\sample
 > echo '' > .gitignore
## .gitignore ファイル編集
## Git 起動
$ cd /c/sample/
$ git add .
$ git commit -m 'created .gitignore'

git add した時に出る改行コードのwarning対応

ファイル内の改行コードが「LF」の際に出たワーニングに対応したメモ

$ git add .
warning: LF will be replaced by CRLF in appl/views.py

なにやら Git が改行コードを CRLF へ変更しようとするらしい。
で、以下を実行

$ git config --global core.autoCRLF false

これで、改行コードを CRLF へ変更しなくなるらしい。
Git本体にあるファイルを見てみる。「C:\msysgit\msysgit\etc\.gitconfig」

[core]
    symlinks = false
    autocrlf = true

あれれ?ここじゃないのか。そうかここじゃないのか。というわけで「--global」で設定したものはホームへ保存されるらしい。Linux でいうチルダ(~)。

というわけでホームにあるファイルを見てみる。「C:\Documents and Settings\Kmizukix\.gitconfig」

[user]
    name = kmizukix
    email = kmizukix@hogehage
[core]
    autoCRLF = false

確かに保存されている。以前設定した名前も保存されている。