2011年12月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?

本日の運動(朝)

CalTrain併用ピスト通勤


  • 7mile
  • 30分
風が強い。雲一つない空。

サンフランシスコ方面を望遠撮影

2011年11月30日水曜日

自己否定

イノベーションのジレンマとか呼ばれる話はよく聞くけど、今日はそれを克服した(しつつある)組織の話を聞けた。結局は自己否定であり、それを成功させるには外部の血を積極的に取りれるしかない、ということか。

で、人口が減りつつある日本が外部の血を取り入れざるを得なくなった時が「最高の買い時」なのかな、と思った。もちろん、その先にある日本は我々が馴染んでいる文化とは異なる姿になるかもしれないが。だとしてもジリ貧で滅ぶよりは良いのではないかと。

2011年11月29日火曜日

SPY Gap Up

昨日は窓開けて始まってたのね。さて今回は何日もつか。

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?

iTether最期の日

iPhone/iPadでUSB TetheringできるというiTetherがApp Storeから抹殺された模様→ソース

WiFi接続がないけど3G回線ならつながるという環境でTetheringできるというのは本当に助かる。例えそれがUSB経由であっても、だ。それだけ需要があったからこそiTetherは人気があったのに、Apple側の一方的判断で市場から抹殺されるというのは納得行かない。

ソフトウェアを開発し、配布する権利は開発者側にあるはずだ。自由が保証されるからみんなが自由に考え、実行に移す。その失敗と成功の繰り返しで技術が進歩する。配布部分を独裁的に制御しようとするAppleは、長期的には自社基盤上でのソフトウェア開発技術を弱体化させるということに気づくべきだ。

2011年11月28日月曜日

Kindle Fireは隠し多国語対応

ということで、なんとかrootとらずにSimejiを入れられる方法がないか考えているわけですが。今日はTwitterにて@TrinityNYCさんが「みんなでAmazonのカスタマサポートに電話して日本語対応しろと騒ぐのだ(意訳)」と煽っていたので自分も電話してみた。

  • 多国語対応の要望はとても多い
  • それに応える準備はしている
  • ただしいつ対応できるかは明言できない
という内容であった。で、ごそごそと調べたら実はKindle Fireは既に多国語言語入力に対応していることが判明。以下、その検証。ちなみにrootとる必要なし。
1. Launcherを入れ替える。自分はGo Launcher Exにした。Side Loadingで。

2. Any Cutをインストールして起動

3. New Shortcutを選択

4. Activityを選択

5. Input languagesを選択し、保存。→デスクトップにショートカットができる。で、そいつを起動すると...

→実は様々な入力言語が選べるようになっている。このメニューがなぜ直接呼び出せないのかは不明だが、Kindle Fireが多言語対応していることは確実。

問題はこの中に日本語が入っていないこと。日本語はキーボードだけでなくInput Methodも入れ替える必要があるからか?

なお、このAny Cutを使ってLanguage & keyboard settingsを直接呼び出せないか試してみた。Launcherはショートカット類を/data/data/com.android.launcher/databases/launcher.dbのfavoritesに格納する。で、Any CutのAction欄に action=android.intent.action.VIEW;component=com.android.settings/.LanguageSettings と入れてやればいいのではないかと思ったのだが...

だめでした。データベースにはセミコロンなどがエスケープされて #Intent;action=android.intent.action.VIEW%3Bcomponent%3Dcom.android.settings%2F.LanguageSettings;end と格納されてしまう。

まあ、多国語対応されていることがわかったのが今日の収穫ということで。

参考にした記事: Kindle Fire: Keyboard Layouts – SOLVED!

2011年11月27日日曜日

virtualenvwrapperとGoogle App Engine SDK

最近サボっていたので気づかなかったがいつの間にかGoogle App EngineがPython2.7に対応しているではないか。Djangoも1.2になったようだし、ちょっと気合をいれて使ってみることにした。でもこいつのためにだけPython2.7いれるのもしゃくにさわるのでvirtualenvで「きれいに」設置しよう、と。

1. SDKの設置
$HOME/google_app_engine下に展開

2. virtualenvwrapperで環境作成
$ source virtualenvwrapper.sh
$ mkvirtualenv --python=python2.7 --no-site-packages GAE1_6_0

3. SDKのPathを登録 .virtualenvs/GAE1_6_0/lib/python2.7/site-packages/gae.pthにSDKの位置を登録。自分の場合は
../../../../../google_appengine

4. SDKにThird Party Lib場所を登録
.virtualenvs/GAE1_6_0/lib/python2.7/site.pyのmainを以下のように
$ source virtualenvwrapper.sh
if __name__ == '__main__':
    _script()
    from dev_appserver import fix_sys_path
    fix_sys_path()


参考にした記事: appengine & virtualenv

追記: __future__モジュールが見つからないと言われたらこの#29にあるパッチを当てると良いかも

本日の運動

久しぶりに太平洋岸まで走る。


  • 73mile
  • 5時間15分



San Gregorio State Beach