時速 20 キロメートルの世界
今日も用事があって、三ノ宮へ。
またカブちゃんに乗って行ってきました。
午前中に用事は無事終了。良い感触です♪
で、帰り道。
三ノ宮から西へ走り、六甲口の交差点から六甲山方面へ。
六甲ケーブル下駅に向かって走ります。
カブちゃんったら、平地だとまあまあの速度なんですが、
上り坂はちょっと……いや。だいぶ苦手です。(;^ω^)
ケーブルの駅までも結構な上り坂で、
3速では登りきらない所もあったりで、
結局2速、時速30キロ弱で登って行きます。
びびびびーん。びーん♪
さて、今日も天気は素晴らしいです♪
ケーブルの駅を過ぎた新六甲大橋下の交差点でちょっと考えて、
今日はトンネルじゃなくって、六甲山越えを決意!
土日祝は2輪は走れなくなってしまう、表六甲の下半分も登ります。
坂も急になって相変わらずの2速走行。
時速は20キロ前後。
自転車ぐらいのスピードかな?
ゆっくりゆっくりと登って行きます。
でもそれが何だかすごく気持ちがイイ…♪
そこには、普段は見えない景色が広がっていました。
たぶん、40キロも出てたら見ることが出来ない、細かな道路の様子。
道端の草花。そして遠く見える神戸の町と海…。
あんまりにゆっくりなので、色々なものがとても鮮明に見えてキレイです。
時速20キロに、こんな世界があるなんて、知らなかった…
鉢巻展望台。
ちょっと休憩♪
風が穏やかに渡っていきます。
バリオスであんなにゆっくり走ってたら、きっと変に思われるだろうけど、
カブちゃんなら、自然だね♪
ゆっくりにはゆっくりなりの素敵な世界がありました。
バイクって楽しい♪
カブちゃんと一緒♪
今日は用事がありまして、加古川と三ノ宮へ行って来ました。
今回の移動手段は我が家で最近人気急上昇中の、リトルカブ、
通称「カブちゃん」です。
11時頃、ネットで天気予報を見て出発。
天気予報は晴れマーク一つだったのに、なんだか雲が多いです。
日差しが降りたり隠れたり。
太陽が雲に隠れると、少し肌寒く感じます。
秋だな〜。
いつもの r38 を西へ。
三木から、r20 → r18 で JR 加古川駅まで。
日差しが降りる気持ちの良い時に何枚か写真を撮りました。
カブちゃんだと、バリオスよりもずっとのんびりと走れます。
カブちゃんのエンジンは絶好調です♪
でも、下り坂でちょっとまわし過ぎたら、
ちょっぴりしんどそうなカブちゃんでした。(;^ω^)
約1時間半で加古川駅到着。
予定の時間までしばし待機して、定刻から用事を済ましました。
わずか7分。あっと言う間の終了でした。
それから三ノ宮へ移動。
加古川から三ノ宮までは、2号線をまーーっすぐです。
途中雨も降り出して、今朝の予報を思い出して、
「なんやねん!」とヘルメットの中で毒づきます。
幸い、そんなに強く降らなかったのと、
防寒用に持って来ていたウィンドブレーカーがあったおかげで、
特に濡れることは無く済みました♪
明石海峡大橋。
いつもカッチョイイです♪
そんなこんなで、三ノ宮までは2時間ぐらいでした。
さてさて。
三ノ宮で用事を済ませて帰る頃にはもう真っ暗です。
久々に歩く、都会の夜。
これはこれでステキです♪
三ノ宮から家までは、約1時間強掛かりました。
寒かったーーー。((´д`)) ブルブル…
でも、カブちゃんと走ったことも、そして用事の方も、楽しかった♪
本日の走行距離は約 100km。
我が家のカブちゃんは、一日でこんなに走ったの、初めてだと思う。
あと、こんなに遠くまで行ったのも初めてだね。
カブちゃんが我が家に来て3年以上経ちます。
最近まであんまり乗ってあげられなかったけど、
カブちゃんはおっとりとして良いヤツです♪
これからはたくさん走ろうね。カブちゃん。
(*・ω・*)
GAE の Model の バリデーションの動作を変えてみた
GAE のデータストアでは、値をプロパティにセットした時点で、
validate されてしまう為、次のような問題があります(少なくとも僕にとっては)。
これらの回避の為に、バリデーション周りを以下のようにして変えてみました。
from google.appengine.ext import db #db.Propertyを変更して、規定のバリデーションをスキップする setattr(db.Property, '__set__', lambda self, model_instance, value: setattr(model_instance, self._attr_name(), value)) #バリデーション機能を追加したベースモデル class BaseModel(db.Model): errors = None def __init__(self, *args, **kwds): super(BaseModel, self).__init__(*args, **kwds) self.errors = Errors() def validate(self): for prop in self.properties().values(): value = getattr(self, prop._attr_name(), None) try: value = prop.validate(value) setattr(self, prop._attr_name(), value) except db.BadValueError, e: self.errors.append(prop, e.message) return not bool(self.errors) is_valid = property(lambda self: self.validate()) #バリデーションエラーを保存するコンテナ class Error(object): def __init__(self, prop, msg=None): self.prop = prop self.msg = msg def __str__(self): return self.tostr() def tostr(self, format=u"[%s] %s"): if isinstance(self.prop, db.Property) and format: return format % (self.prop.verbose_name or self.prop.name, self.msg) else: return self.msg #エラーの集合を扱うコンテナ class Errors(list): def __init__(self): self.map = dict() def append(self, prop, msg=None, error=True): if error: if isinstance(prop, db.Property): super(Errors, self).append(Error(prop, msg)) self.map[prop.name] = len(self) - 1 elif isinstance(prop, (str, unicode)): super(Errors, self).append(Error(prop, msg)) self.map[prop] = len(self) - 1 else: super(Errors, self).append(Error(None, prop)) def clear(self): del self[:] def get(self, name, default=None): return self[name] if name in self else default def tostr(self, sep=u"\n", **ops): msgs=list() for error in self: msgs.append(error.tostr(**ops)) return sep.join(msgs) def __str__(self): return self.tostr() def __contains__(self, name): return name in self.map def __getitem__(self, index): if isinstance(index, (str, unicode)): if index not in self.map: raise IndexError(u"'%s' property has not error." % index) index = self.map[index] return super(Errors, self).__getitem__(index)
以下、簡単な解説です。
- setattr(db.Property, '__set__',……
- 今回のキモ。db.Property クラスの __set__ デスクリプタ メソッドを上書きし、属性代入時のバリデーションをバイパスしています。GAE v1.2.6 において、Property の定義済み実装クラス群では、ReferenceProperty 以外は __set__ のオーバーライドがありません。ReferenceProperty は __set__ がオーバーライドされていますが、目的に対しては特に影響無いものでしたので、属性保存時のバリデーションの無効化は、とりあえずこれで OK!
- BaseModel クラス
- GAE の db.Model をサブクラスを作成し validate メソッドを追加しています。validate メソッドは、Model インスタンスの全ての属性をバリデーションし、検出されたエラーを、errors に保存します。アプリケーションの Model は、この BaseModel を継承して作成し、保存の前には必ず、validate()(または is_valid)を呼んでください。
- Errors/Error クラス
- エラー情報を処理するコンテナ。
以下のように利用します。
class Client(BaseModel): name = db.StringProperty(u"お名前", required=True) email = db.EmailProperty(u"E mail", required=True) phone = db.PhoneNumberProperty(u"お電話") client = Client(name=u"ぷりっけ。") #email がなくてもインスタンスを生成可 if client.is_valid: #is_valid または validate() で全属性をバリデーション client.put() #OKならデータストアへ保存 else: error_message = client.errors.tostr() #エラーをまとめて取得できる #また、エラーは以下のように検査、取得、追加できます。 'name' in client.errors #属性のエラーの有無を確認 client.errors['name'] #属性の Error が在れば返す。無ければ IndexError client.errors['name'].tostr() #属性のエラーメッセージを取得 client.errors.tostr() #全てのエラーメッセージを取得 client.errors.append('body','[内容] が未記入です。') #エラーを追加 client.errors.append('body','[内容] が未記入です。', not body) #特定の場合のみ
…とまあ、こんな感じです。
注意点として、Rails のように、put() などで自動的に validate はされません。必ず、is_valid の参照、または validate() の呼び出しが必要です。実装するのは簡単ですが、これぐらいで不便は無いと思うし、GAE 側の Model の今後の変更にもやや強いかと思っています。
…次はバリデーション エラーメッセージの日本語化やね…。
以上っす。
★来ていただいて(人'▽`)ありがとう☆
土俵は違うけど、この情報が役に立った人は、クリックしてね!
もしよければ応援のクリックお願いしまーす♪
夕焼け空
今日は夕焼けの空がとてもキレイでした。
夕陽は少し眩し過ぎて、夕焼けぐらいがちょうど良いです♪
僕が夕焼け空の写真を撮っていると、
向こうから近所のちびっこヒロ君がキックボードに乗ってやって来ました。
よーく見ると、上の写真にも写ってるよん♪
「なにしてるん?」と、ヒロ君。
「うん。写真撮ってるねん。夕焼け、キレイやろ」と僕が言うと、
「ホンマに奇麗やな〜」と、ヒロ君も夕焼け空を見つめます。
ヒロ君のほっぺも夕焼けに染まって真っ赤っ赤です。
こんなに小さくても分かるんやな〜と、
僕はひとしきり感心♪
秋もだいぶ深まってきました。
スタンプ帳ゲット!
今日もお天気が良くてルンルンのオイラです。
先週、道の駅スタンプラリーのスタンプ帳がゲット出来なかったので、
そのリベンジに出掛けました。
Sololy さんから、「道の駅 フレッシュ朝来」で売ってたよっては
教えてもらったのですが、朝来はチト遠い…。(- -;
そこでもう少し近所の道の駅を回ってみることにしました。
で、まずは「道の駅 いながわ」を目指します。
しばらく前に探検して見つけた、三田の裏道を抜けて県道68へ。
武庫川沿いを走ると、沢山の鳥たちが川の中で羽を休めていました。
青空に川がキレイです。
30分ほど走って、「道の駅 いながわ」に到着です。
ハッキリ言って近いです♪
その間の道の景色や空気もステキなところばかり。
僕らはとっても良い場所に住んでるんだな〜と改めて実感♪
道の駅 いながわ はすごく混み合っていました。
どうやら地元の食材の直売で賑やかみたいです。
スタンプ帳のことは後回しで、その賑やかに飛び込んでみたら、
おばちゃん達で営業しているお弁当屋さんを発見♪
なんか手作り風で美味しそうだったので、即効ゲットしてしまいました。
こりさちゃんは、道の駅の敷地内のパン屋さんでパンを購入♪
それから晩御飯のオカズにシイタケと黒豆枝豆もゲットしました。
二人とも好きなものを購入できてご満悦です♪
お昼ごはんの確保が出来たところで、ようやくスタンプ帳探索です。
従業員らしいおじさんに聞いてみたら、スタンプは一番端っこの建物とのこと。
行って見たら、実にあっけなく、簡単に、スタンプ帳を発見!!!
先週、「淡河」「みき」と連続して売り切れだったのは何だったのか?!
とにかくすぐにゲットして、記念すべき1個目のスタンプもポコンッと押しました。
それからお昼ごはん。
道の駅の建物の裏にまわって、猪名川沿いの適当なベンチに座って食べます。
暑くもなく、寒くもなく。の〜んびりしていてとってもイイ気分です♪
↓は僕が食べたお弁当。どう? 美味しそうでしょ? ゚+。ゥフフ(o-艸-o)ゥフフ。+゚
お昼ごはん終了後、もう一個ぐらいスタンプをゲットしておこうと、
今度は「道の駅 くりの郷」に向けて出発です。
猪名川から少し南下。日生中央、一庫ダムを抜けて、R173を北へ。
20分ぐらいかな? すぐに到着しました。
こちらの道の駅も大変な賑わいです。(^ ^;
もしかして道の駅って、流行ったりしてるのかな?!
僕らはスタンプをポコンッとやって、早々に退散しました。
さて、おうちに帰ります。
でもまだ時間も早かったし、少し遠回りして帰ることにしました。
R173 から r602 と走ります。
r602 沿いには大きな変電所があります。
ダムとならんで、大規模な変電所も、僕は好きです。
ブーンブーンと、いつも低く何かが呻ってます。
それを聞くと何だかゾクゾクしちゃいませんか?
…と言いつつも、タンデムだったのでこの日はスルー。写真も無し(^^;
r602 から r12 に乗り換えて北上。
そして r37 に入って、ようやく帰る方向です。
r37 を南下していると、「つくしの里」の前を通りかかります。
そういえばここは、これまでいつも気になってはいたけれど、
スルーし続けてきた施設です。
今日は「もちまつり」と赤く大きな字で書いてあります。
で、おもちに目が無い、食いしんぼうのこりさちゃんも居ることです。
今日は寄ってみることにしました。
駐車場にバリちゃんを停めて、お店の中に入ってみました。
手前がおもち販売で、奥がレストランになっています。
が、どこにもお祭りらしい雰囲気はありません…。
どうしたんやろ…と思いつつ、レジ付近の張り紙を見ると、
もちまつりは24・25日開催とのこと…。
なんや、来週やん。(- -;
あんなにデカデカと横断幕を掲げられてたんで、
すっかり開催中だと思ってしまってました。
でも後でよーくみると、横断幕の端っこにも日付、書いてあったんやけどね。(^^;
と、アホな自分たちに不平を言ってても始まりません。
気を取り直して、せっかくだからということで、お持ちを買い食いしてみます。
1個 100 円。2つで 200 円。
バリオスの傍らで、のんびりとした畑の風景を見ながら、おやつの時間。
おもちの中のアンコがとっても美味しかったです♪
そんなこんなで、お腹いっぱいになって帰って来ました。
家に戻ったのは2時ぐらいだったかな。
走行距離は 97 km でちょうど良い感じでした♪
楽しかった〜。
§
この日の晩ご飯は、
昼間買ったキノコと枝豆、サンマに、オイラ特製の八宝菜でした。
サンマは丸々と太ってて見るからに美味しそうだったのですが、やはり激ウマ♪
枝豆は今年は出来が悪いと思ってたら、食べてみたら美味しかったです。
キノコも上手かったな。八宝菜も最高だったな。
あー、全部美味しかったっす!♪
★来ていただいて(人'▽`)ありがとう☆
のんびり走るのが一番楽しかったりします♪
もしよければ応援のクリックお願いしまーす♪
加古川までかつめしを食べに行くっツー
今日は3連休最終日。
連休中はずっと晴れておりましたが、今日も晴れ。
それもバッチグーの晴れ。
こりさちゃんと相談して、「加古川までかつめしを食べに行くツー」を
決行することになりました。
標的はこちらのお店「ロッキー」さんです。
9時半過ぎに出発。
まずは「道の駅 淡河」を目指して、r38 を西へ。
いつ走ってもこの道は気持ちイイです。
淡河へは20分少々で到着♪
淡河では、こりさちゃんが突然興味を持ち出した、
「道の駅のスタンプラリー」に参加するため、
スタンプ帳をゲットしに寄ったのですが、
売り切れらしくて手に入れることは出来ませんでした。残念…。
後で「道の駅 みき」に寄ることにします。
淡河をあとにして、r38 → r20 → r18 → r383 と走って加古川へ。
加古川の河岸を走る r18 も景色が良くて好きです♪
そんなこんなでロッキーさん、到着♪
ネットで店構えも確認済みだったので、簡単に発見。
早速店内に入って、かつめしを注文!
しばらくの間、大人しく待っていると、かつめし登場。
魅惑のかつめしとは、↓これだぁー!
食べてみると、うわさどおりの美味しさです。
そんなに凝り過ぎて無い感じがイイ♪
三ノ宮の「森のなかまたち」より僕好みでした。
アッ!という間に完食!
ゲップ( ´З`)-3
二人とも大満足でお店を出ました。
こりさちゃんはお店の前のディスプレイも気に入ったらしく、
「また食べに来る」と鼻息を荒げて言っておりました。
気に入ってくれて良かったよ。ホント♪
次は、「道の駅 みき」へ。
r148 〜 r65 〜 r514 (たぶん) 〜 r513 〜 R175 と走って、すぐ到着。
道中、とてものどか〜な田園風景の間を走ります。とてもイイ気分♪
加古川に住むのもええなぁ〜とか、思っちゃいました。(*・ω・*)
ラリーのスタンプ帳を買いに、突入!
ところがここでも、スタンプ帳は売り切れでした…。
インフォメーションカウンタのおじさんに聞いてみたら、
今後の入荷も無い、とのこと。
スタンプラリーのポスターを見ると、ラリーの期限は来年3月までみたい。
あと半年ぐらいで終わりみたいなので、そりゃもう無いな〜と二人で納得。
気付くのが遅すぎたようです。
気を取り直して、ソフトクリームをゲットして、青空の下で食べました。
それにしても今日は天気がイイ!!
天気が良いというだけで、バイクで走る理由になります!
食べかけのソフトクリームを高々と差し上げて、パチリ。
青空の下では、食べかけのソフトでさえも、美しい!! かな?
帰り道。
久々に「呑吐ダム」に寄ってみました♪
バイクの数はそんなには多くなかったです。
たぶんみんな走りに行ってるんだろうな〜♪
展望台にいた人たちはみんなノンビリとしていました。
ゆったりとした気持ちの良い時間が流れます♪
僕らは1本の缶コーヒーを二人でチビリチビリやって、
からっぽになってから家路に着きました。
走行距離は 104km。
程よい距離で、楽しめました♪
格闘。
Pythonと格闘中。
デコレータでクラスメソッドを修飾したいけど、デコレータ中で渡された関数(メソッド)の属するクラスを取得したい。
でも出来ない…。
無理っぽいので…、デコレータではクラスの属性にデータを追加するまでにして、インスタンスの初期化時にそれを見てやりたい処理をするように作った。でもでも、やりたい処理が分割しているのが、ナンカイヤ…。出来れば「クラス定義」として完結させたい。誰か何か知ってたら、教えて♪
★やりたい処理は、デコレータ関数内でクラスを受け取り、そのクラスの継承元クラスを全て取得(inspect.getmro)。全ての継承元クラスの情報(定義)を参照して、現在のクラスを再定義する、といった処理。
もう一つ、Python の?余談。
前から、複数の個別のリクエストに渡って、前のリクエストの結果が影響してるみたいな時があって、「Python の挙動ってなんかおかしいよね〜」とかって思ってたら、それは実は GAE の仕業でした。(*・ω・*)
http://code.google.com/intl/ja/appengine/docs/python/runtime.html#App_Caching
モジュールやスクリプトの読み込みをキャッシュするなんて、そんな、ビックリです。一長一短あるよね。短が出ないように、工夫しないといけなかったり。そのキャッシュに依存してしまいそうになったり。…というか、キャッシュがあるのにここで自前でキャッシュせんでも…とかいう、へんてこなジレンマに陥る自分にヤレヤレです。