2011年12月16日金曜日

BayPIGgiesに参加してきた

BayPIGgies=Bay Area Python Interest Groupの略。このあたりのPythonプログラミング愛好家が集う会。Mountain ViewのSymantecで昨日開催された会合に参加してきた。講師はMarilyn Davisさん。参加者は20名ほど。老弱男女ごっちゃまぜ。自分より年配と思われる方々で3割くらいを占めていた。

題目は「Pythonism」。Pythonらしさ、ということ。それは何かというと結局は「読みやすさ」に尽きるのだという。

自分は新しい言語を習う場合は

  • 変数やクラス定義
  • フロー制御
程度の文法だけ見たら、あとは提供されるフレームワークに必要な記述方法やテスト方法を学んでいくやり方なので「これがPythonでの書き方だ」というのをあまり意識したことがなかった。なので、昨日のMarilyn Davisさんの講義はなかなか参考になった。以下、自分の無知さをさらけ出しておく。

無知その(1) __init__でいちいち変数代入を書いていた。
以前の俺
class MyClass(object):
    def __init__(self, arg1 = None, arg2 = None):
        self.arg1 = arg1
        self.arg2 = arg2

if __name__ == '__main__':
    mc = MyClass(arg1 = 10, arg2 = 20)
    print mc.__dict__

今日からの俺
class MyClass(object):
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

if __name__ == '__main__':
    mc = MyClass(arg1 = 10, arg2 = 20)
    print mc.__dict__


無知その(2) Loopのelse文を知らなかった。

#!/usr/bin/python

for num in range(1,200):  #to iterate between 10 to 20
   for i in range(2,num): #to iterate on the factors of the number
      if num%i == 0:      #to determine the first factor
         j=num/i #to calculate the second factor
         print '%d equals %d * %d' % (num,i,j)
         break #to move to the next number, the #first FOR
   else:        # else part of the loop
      print num, 'is a prime number'


無知その(3) Decoratorの便利さを知らなかった
import signal
import time

class TimeoutError(Exception):
    def __init__(self, value = "Timed Out"):
        self.value = value
    def __str__(self):
        return repr(self.value)

def timeout(seconds_before_timeout):
    def decorate(f):
        def handler(signum, frame):
            raise TimeoutError()
        def new_f(*args, **kwargs):
            old = signal.signal(signal.SIGALRM, handler)
            signal.alarm(seconds_before_timeout)
            try:
                result = f(*args, **kwargs)
            finally:
                signal.signal(signal.SIGALRM, old)
            signal.alarm(0)
            return result
        new_f.func_name = f.func_name
        return new_f
    return decorate

@timeout(5)
def mytest():
    print "Start"
    for i in range(1,10):
        time.sleep(1)
        print "%d seconds have passed" % i


if __name__ == '__main__':
    try:
        mytest()
    except TimeoutError:
        print "Timout!"


無知その(4) context handler(with)を知らなかった
What’s New in Python 2.6より
from decimal import Decimal, Context, localcontext

# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()

with localcontext(Context(prec=16)):
    # All code in this block uses a precision of 16 digits.
    # The original context is restored on exiting the block.
    print v.sqrt()



これくらいかな。あと、テストをどう書くかというのは結構議論が盛り上がった。

2011年12月15日木曜日

Wendy

ひょっこりと帰ってきてくれないかな...

100-0019

2011年12月14日水曜日

本日の運動

朝はCalTrain併用ピスト通勤。
帰りは自走。

  • 30mile
  • 2時間10分

2011年12月13日火曜日

現代自動車の開き直り

Hyndaiのデザインは「なんかどこかで見たことあるぞ」ってのばっかりなんだけど、今回はさらに一歩進んでいる。車種はElantra。おまわりさんこいつです。


なんか気のせいかToyota Priusっぽいけど、まあ気のせいということにしておこう。そのElantraのコマーシャルだがこんな感じ。
Fog and Smogという白ラッパー達が出演している。で、この曲といい場面といいどこかで見たことあるぞ、と検索したら見つかりましたよ。
同じFog and Smogがプリウスに乗って、スーパーマーケットの駐車場を流すという展開。曲も同じ。もうここまで行くとパクリを開き直っているとしか思えない。



あ、でもElantraはハイブリッドじゃないのか(棒

2011年12月12日月曜日

R.I.P. Wendy (1998.3.1〜2011.12.12)

先週末から急に病状が悪化したWendy。今日の検査では土曜よりさらに白血球が増えていることが判明。一旦自宅に連れ帰ったが何も食べようとしないし、押し入れの中に隠れようとするし。猫は死期を悟ると隠れるというけど、まさにその状態に。悩んだけど、安楽死させることを決意。去年Chesterもお世話になった近所のAdobe Animal Hospitalに連れていった。

19時30分、安らかに息を引き取る。


美人さんだったが、食い意地の塊でもあった。享年13歳。天国で好きなものを好きなだけ食べてください。




Sea Weed!!

2011年12月11日日曜日

Wendyその後

リンパ腫に罹ったWendyはその後状況がよくなり、通院の頻度を一週間に一度から半月に一度に減らされた。それが先月末。食欲旺盛でLokiと走りまわる日々が戻ってきたのだが...

先週水曜あたりから食欲が減退してきて、昨日は大好きな缶詰や鮭干物もあまり食べなくなった。しんどそうなので昨夜夜半、近所の24時間動物病院に連れていった。で、血液検査したところ白血球が桁違いに増えているとのこと。癌細胞が骨髄の中で暴れている可能性あり。

癌専門の獣医さんの予約は火曜日だけど、一日早めてもらって明日観てもらおう。

2011年12月10日土曜日

本日の運動

Old La Honda登って海側まで走るつもりだったがなんか脚が重いので峠で引き返す。→帰ってきたら鼻水とくしゃみ止まらず。風邪っぽい。


  • 43mile
  • 3時間10分

月食

子供の頃から天体観測は好きだった。で、今朝は4時半から外で月を見るという無謀なことをした→風邪ひいた模様。

明け方開始ということで月はすでに沈む寸前。なので上から欠けてきた。皆既食状態のまま月は山の向こうに消えてしまいましたとさ。




昨日の運動

車を修理に出したのでちまちまと歩いた...

  • 5mile
  • 1時間15分




2011年12月8日木曜日

いつの間にかKindle FireのFirmware更新

6.2_user_3003020というバージョンに入れ替わっていた。いつの間に...

期待されたLanguage and Keyboards切り替えはなし。 rootもはずされちゃう、という報告あり。自分はSimeji入れたあとroot外していたので特に影響なし。

歯医者にみる景気の腰の弱さ

今日は半年に一度の歯科検診。特に異常はなし。

ただ歯医者さんは色々大変なようで。理由は簡単。歯医者に通う患者が減っている。その理由は経済的なもので

  • 雇用を失って、必然的に歯科医保険も解除された
  • 雇用は維持されているが、雇用元が歯科医保険を削ったために歯医者に通いにくくなった
  • 職は見つけたが正規雇用ではないので歯科医保険がない or あまりカバーされない
等々らしい。そして歯は虫歯が極端に悪化したとか、親知らずがヤバくて待ったなしとか、そういう事態でなければ「我慢する」ことができる。なので歯医者というのは真っ先に節約対象となる出費なんだそうな。ちなみにこの資料によれば、米国民が一年に使う歯科治療費は1000億ドルにはちょっと届かない程度。これは2005年の話で、自分が通う歯医者さんはいつも忙しかった頃。

昨今、ベイエリアの高速道路は交通量も増え、朝夕の渋滞が激しくなっているが、景気回復にはまだまだ至ってないようで。

2011年12月7日水曜日

Occupy San Francisco強制排除。だが...

サンフランシスコのJustin Herman Plazaに陣取っていたOccupy San Francisco。市当局からの採算の通告にも関わらず自主的解散がなかったため、今朝警察が介入。強制排除となった。ぱちぱちぱち。ちなみに70名が逮捕された。→ソース

だがこの程度で引っ込むOccupyな方々ではない。

  • 市内の他の場所をOccupy
  • ゼネスト
  • Foreclosureされた住居を乗っ取る
など次の一手を考えているようである。本当に迷惑な連中だ。

2011年12月6日火曜日

本日の運動

朝はCalTrain併用。帰りは自走。ピスト。



  • 30mile
  • 2時間10分

朝も寒いけど、日がくれた後の帰り道がしんどかった。
午後4時40分で日没

2011年12月4日日曜日

本日の運動

ピスト号でCanada Road往復。寒いのぉ。

  • 50mile
  • 3時間10分

2011年12月3日土曜日

本日の運動

Rancho San Antonioをゆっくり走る。日陰は路面が凍結していた。

PG&E峠を登り終えた直後に撮影。ヘロヘロで道路にへたり込んでた。


サンフランシスコ湾とMt. Diablo


  • 11mile
  • 2時間30分

GAE1.6+Python2.7+DjangoでSessionを使う

Googleが公開しているDjangoの使い方は随分と古いが、Sessionをsettingsから外すように書かれている。これだとrequest.sessionが使えないのでappengine_djangoなどのツールを使ってSessionMiddlewareを差し込むわけだが、ただそれだけのためにごちゃごちゃと3rd partyのライブラリを入れるのは悔しいので、最低限度の方法を試してみた。

appengine_djangoには、Session保存のバックエンドとしてmemcacheを使うモジュールが公開されているのでこれを使うことにした。このスレッドの#2からリンクされているcache_backend.pyをプロジェクトの適当な場所(自分はlib配下)に保存し、settings.pyに以下を追加。


MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
)

# http://code.google.com/p/google-app-engine-django/issues/detail?id=57                                       
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHE_BACKEND = 'lib.cache_backend://'

これでめでたくDjangoのviewでrequest.sessionを使えるようになる。

2011年12月2日金曜日

GAE 1.6+Django 1.2

Google App Engine 1.6.0から公式にPython 2.7+Django 1.2がサポートされたということなんだけど、ぐぐってみても従前からのappengine-djangoを使う方法ばかりでてきてよくわからん。

ということで色々試してみた。以下、わかったこと:

1. Djangoをzipする必要なし
ただしdjango-admin.pyとかmanage.pyとかで楽チンすることはできなくなる。まあ、そんなに面倒な事もないでしょ。GAEのコンソールも使えるし。

2. ローカルにDjangoをインストールする必要もなし
google_appengineディレクトリ配下に必要なDjangoのライブラリは入っている。

3. Virtualenvの元でも動く
先日書いたとおり

で、django-admin.py使わないということはディレクトリ配置やsettings.pyとかurls.pyとかを自前で打ち込むということなわけで、大した話ではない。まずディレクトリ配置はこんな感じ。
.
├── app.yaml
├── main.py
├── project
│   ├── __init__.py
│   ├── poll
│   │   ├── __init__.py
│   │   ├── views.py
│   ├── settings.py
│   ├── templates
│   │   └── __init__.py
│   ├── urls.py

app.yaml
librariesというエントリでDjango 1.2を使うことを宣言。
application: helloworld
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.app

libraries:
- name: django
  version: "1.2"

main.py
settings.pyの所在を定義。

import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()

project/settings.py
必要なライブラリとアプリケーション所在場所、urls.pyの場所を定義。テンプレートを使う場合はその所在場所を定義。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
)

INSTALLED_APPS = (
    'project.poll'
)

ROOT_URLCONF = 'project.urls'

import os
ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
    ROOT_PATH + '/templates',
)


project/urls.py
URL定義は通常のDjangoアプリと同じ。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^$', 'project.poll.views.index'),
    )

project/poll/views.py
テスト用簡単なview

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^$', 'project.poll.views.index'),
    )
(GAE)masayang@ubuntu-vm:~/Documents/GAE/dempa$ cat project/poll/views.py
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello")


S2Eで内部記憶領域(mmcblk0)を開放

購入した当時(2010年10月)は余裕のスペックだったAndroid G2だが、一年以上経過して色々とアプリケーションを詰め込んだ結果内部記憶領域(/dev/mmcblk0p*)がじわじわと足らなくなってきた。そりゃ初代G1に比べれば余裕はあったが、動作がもったりしてきた感じは否めなかったのでS2Eを使ってアプリケーションをsd-ext(/dev/mmcblk1p2)に移動させることにした。

当初は簡単だろうと思ったのだが(だってS2Eはsimple2extの略だから)いろいろとハマってしまったのでここにコツを記録しておく。

1. まずアプリケーションは本体に戻しておく
Google方式でSD側に動かしたアプリケーションは本体記憶に戻しておくこと。Settings→Applications→Manage Applications→SD Cardから操作。これにより本体記憶は一層キツくなるがAndroid自体の動作はかなり軽くなる。

2. CM使ってる場合はSDへのアプリ設置を抑止
Settings→CyanogenMod settings→Application→Allow application movingを抑止。同Install locationをInternalに。

3. 死にたくなければROMをバックアップ
ROMManagerから

4. 後悔したくなければSD Cardをバックアップ
母艦につないでtarで。

5. SD Cardのパーティション
ここが一番ハマるところ。sd-extをext4でフォーマットしろ、みたいなことをS2E作者も言ってるが、/etc/init.d/05partitionsdを見ればわかる通りCM7.1はext3でsd-extをマウントする。で、Recoveryの種類によってはsd-extをext4でフォーマットしたりext2でフォーマットしたりする。ClockworkModの5系はext4なのでアウト。

確実なのは母艦からadbで接続して、partedコマンドでパーティションを切ること。ここを見れ。

当然、S2Eのext4オプションも外すこと。

6. 一度目の再起動は妙に時間がかかる
S2EはOS起動前に/data/appの中身を/sd-ext/appの下に移動して/data/appからリンクを張る。この動作は再起動後ベンダーのロゴが出た状態で数分間続く。固まった、と思って電池抜くと悲惨なことになるので注意。

7. やり過ぎは無意味
S2Eは/data/app以外に/data/dataやらCacheやらもsd-extに移動できるようになっているが、これをやると性能が落ちる。/data/appだけなら性能劣化はほとんど実感できない。(Google方式でアプリケーションをSDに持って行くと重くなるのも同様の理由と思われる。)

結果、本体側1.2GBのうち、アプリケーションが占めていた500MBほどをsd-extに移動することができた。まだしばらくはG2でやっていけそうだ。Quadrantの改善は見られないが、アプリケーション切り替え時のサクサク感が戻った。あと、電池消耗も減ってる。


2011年12月1日木曜日

本日の運動(夕)

帰りは自走。Redwood Cityを過ぎた辺りから一気に冷え込んだ。

  • 24mile
  • 1時間30分

SPY Gap Up

昨日もGap上げでしたか。

InstanceDateClosed <= Gap Open(up to 5 days)
109/08/19981 day later
210/06/1998same day
309/03/19992 days later
406/02/2000same day
512/08/2000same day
612/11/20002 days later
704/05/20011 day later
809/24/2001No
907/17/2002same day
1007/29/20024 days later
1110/15/20021 day later
1210/17/2002same day
1304/07/2003same day
1408/17/2007same day
1512/12/2007same day
1603/11/20083 days later
1709/08/2008same day
1809/19/2008same day
1910/07/2008same day
2010/09/2008same day
2110/13/20082 days later
2210/28/2008No(11日後に戻ってる)
2310/30/20084 days later
2411/04/20081 day later
2511/21/2008No
2611/24/2008No
2711/25/2008Same Day
2812/08/20081 day later
2912/16/2008Same Day
3001/28/20091 day later
3103/10/2009No
3203/23/20095 days later
3304/02/20093 days later
3404/09/20092 days later
3505/10/20101 day later
3608/22/2011Same Day
3710/27/20113 days later
3711/28/2011?
3811/30/2011?