一方で、ソフトウェア開発の勉強会は、転職とは関係なく面白かったので、Python Code Reading や BP Study には、ときどき参加するようにしていました。あ、いや、ちょっとは期待があったかも。すみません、すみません。その後、ビープラウドで募集があったときに拾ってもらい、めでたくプログラマになれたわけです。
from google.appengine.ext import ndb
class Foo(ndb.Model):
pass
class Bar(ndb.Model):
foo = ndb.KeyProperty(kind=Foo)
f = Foo()
f.put()
b = Bar(foo=f.key)
b.put()
k = b.key
# k から f を取得する。
b = Bar.get_by_id(k.id()) # ここでフェッチ
f = b.foo.get() # ここでもフェッチ
キーに親子関係があると
from google.appengine.ext import ndb
class Foo(ndb.Model):
pass
class Bar(ndb.Model):
pass
f = Foo()
f.put()
b = Bar(parent=f.key)
b.put()
k = b.key
# k から f を取得する
f = b.key.parent().get() # フェッチはここだけ
書籍「継続的デリバリー」は、新旧どちらスキーマでも動くようにアプリケーションを変更したあと、データベースのスキーマを変更する、という方針を提案しています。
Google App Engine のデータストアであれば、新旧どちらのプロパティの型であってもいけるようなモデルに変更する、ということになります。
class User(db.Model):
name = db.StringProperty()
date_birthday = db.DateProperty(name='birthday')
str_birthday = db.StringProperty(name='str_birthday')
def get_birthday(self):
if self.date_birthday:
return self.date_birthday.strftime('%Y-%m-%d')
else:
return self.str_birthday
def set_birthday(self, val):
if isinstance(val, date):
self.str_birthday = '%Y-%m-%d' % (val.year, val.month, val.day)
elif isinstance(val, str):
self.str_birthday = val
else:
raise TypeError
self.date_birthday = None
birthday = property(get_birthday, set_birthday)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ここで僅かなサンプルから、ものすごい一般化をしますが、日本では発注者がクソである、という仮説があります。ありますって、勝手にいまでっちあげたんですけど。大規模検査/管理システムを構築するメーカの人曰く「ドイツの会社は数百ページにわたる要件定義書を渡してくる。同じようなシステムに対して日本の会社は3ページくらいで済ませてくる」と。日本の発注者、というような集合に共通の特性があるわけあらへんやろう、という感じではありますが。けれど、私の観測範囲では SI の委託側と受託側の互いの期待がずれているために、不幸が起こっているように見えるのです。そして、発注側がけっこうクソなんじゃないのか、って感じがするのです。
計算するにあたって、体の複雑な形状や、体の丸みをここではないと考える。悪かったわね、丸くて。概算を出したいのだから、細かいことはいいのである。私の体がコレジャナイロボみたいな形をしていると仮定する。上から見たときの面積 を B、 正面から見たときの面積を C とすると、泳いでいるときの進行方向からの投影面積 A は以下のようになる。
A = B cosθ + C sinθ
自分の体をなんとなく画像で撮影して、概算をだすと、B = 5200 cm^2、 C = 2500 cm^2 程度だった。式に当てはめてみると、
... I convince myself to spend ten minutes on my project. Just ten minutes. Enough time to accomplish one small task. Then, after that ten minutes is up, I can go back to zombies, guilt-free, if I so choose.
とりあえず10分やることで、なにがしかの進捗がある。記事に書かれているとおり、たいてい 10 分でやめないので、プロジェクトはもっと進む。普段仕事に集中するために、3-2-1 という OS X 用のアプリを使って、いくつかタイマを用意している。ポモドーロ用に25分と5分、とりあえず片付けるための2分、そして、とりあえず取りかかるための10分。
10分のタイマだけは設定の「Bring to front」のチェックを外している。こうしておくと、10分たったときに、まだ集中して作業をしていれば、そのまま続けられる。