DataStoreが手軽でいい

インフラを気にしないで良いという事が、これほど楽ちんなのかという感じ。

いちいち、接続先を指定しなくても良くて、インスタンスを生成してPutすればそれがInsertになるし、GQLでインスタンスのリストを取得して変更してPutすればUpdateになるし、Delete()すれば削除になる。

超簡単。

エンティティの定義も

from google.appengine.ext import db
class nabeatsuUserMaster(db.Model):
#ナベアツを利用するユーザのマスタ
author = db.UserProperty()
count = db.IntegerProperty()
date = db.DateTimeProperty(auto_now_add=True)
saidWhen3 = db.StringProperty()
saidWhen5 = db.StringProperty()

ってdb.Modelを継承したクラスを作成するだけで良い。

また、GQLってのがSQLに似ているんだけど、エンティティのプロパティの一部だけ持ってくるという事はできなくて、常に

  #パラメタライズドクエリみたいな感じで:authorを定義しておいて、author=userで割り当てを行う。
  #これもいろんなやり方があって、必ずしも名前が必要というわけではない。
datalist = nabeatsuUserMaster.gql("where author = :author",author=user)
または、
datalist = db.GqlQuery("select * from nabeatsuUserMaster where author = :author",author=user)

と言った風にちゃんと全項目指定でnabeatsuUserMaster型として持ってくる必要がある。

個人的には、前者が好み。

DataStoreの詳細については、http://code.google.com/appengine/docs/datastore/を読むといいです。

比較的サンプルが多いし説明が平易なので、英語が分からなくても、なんとなくイケル感じ。

Share

ユーザ管理どころかログオンページを自前で実装する必要が無いのは楽

from google.appengine.api import users

ってインポートしておいてやれば、

user = users.get_current_user()
if user:
print 'ログイン済み'
else:
print 'ログインしてない。'

と判断できるし、ログインしていないときはハンドラの中の実装しようとしているgetとかpostメソッド内で

self.redirect(users.create_login_url(self.request.uri))

とやってやれば、勝手にログインページが作られるので楽だ。

self.response.out.write("<a href="%s">ログアウト</a>" %
(users.create_logout_url(self.request.uri)))

としておけば、ログアウトするためのリンクもできるし。

その部分に気を使う必要が無い。

DataStoreにも、ちゃんとユーザ情報を登録するためのUserProperty型が用意されているので、データ管理も楽。

持ってこれるユーザ情報もnicknameとemailアドレスだけというのも個人的には嬉しい。

Share

Visual Studio 2005 extensions for Windows SharePoint Services 3.0, version 1.1リリース

1ヶ月前の話ですが・・・

長らくお待たせいたしました、いよいよ日本語版のVSeWSSがご利用いただけるようになりました。

Visual Studio 2005 extensions for Windows SharePoint Services 3.0, version 1.1

http://www.microsoft.com/downloads/details.aspx?FamilyID=3E1DCCCD-1CCA-433A-BB4D-97B96BF7AB63&displaylang=ja

すでにバージョン1.0あるいはバージョン1.1のCTPをご利用いただいている方は、アンインストールしてからバージョン1.1をインストールしてください。

また、バージョン1.1からはVSとVSeWSSの言語を揃えないと正しく動作しません。日本語版のVSeWSSをご利用いただく場合は、日本語版のVSがインストールされている環境へインストールしてください。

SharePoint Developer's Blog : VSeWSS Version 1.1 日本語版 リリースのご案内

Share
カテゴリー: WSS

それをリストラと呼ぶのですよ

山下氏に続けて、代表取締役常務執行役員 榎本隆氏は「出向政策はリストラではなく構造改革」と説明。「転籍対象の98%の社員が理解をしてくれたことに感謝している」と述べた。

livedoor ニュース – NTTデータ社長 1番ほっとしたのは社員の転籍問題

構造改革の事をリストラと言うんですよ代表取締役。

その発言「豆腐チゲはチゲではなく鍋」みたいなもんですよ。

会社の首脳なのだから、そのあたりはキチッとしておいたほうが・・・。

Share

白黒つけるぜ

世の中、潜在ゼブラーマンな人が案外多いと思う。

白黒つけたい気持ちはあるが、白黒つけられない現実があるから、波風たてないように生きているような人。

そのギャップがストレスになっていくのかな。

そういえば、映画「ゼブラーマン」は渋谷駅のビックカメラがあるビルの映画館で見たのだが、映画が終わった後、外に出たら音楽デモみたいなのを大規模にやっていたため、少しの時間、現実に戻れなかった覚えがある。

Share

リファレンス見ないでやっていたら3分くらいクラスのメソッドが動かなくて悩んだ

リファレンス見ないで昨日のスクリプトをクラスで実装してみた。

"ナベアツ問題"
class nabeatsuQuestion:
def createReader(self):
"ナベアツ問題を読み上げる人を作る"
def reader():
"読み上げる人"
def isFool(value):
"3の倍数と3の付くときあほである"
if value % 3 == 0:
return True
if str(value).find('3') >= 0:
return True
def isDog(value):
"5の倍数で犬である"
return value % 5 == 0
outputValue = ''
if isFool(reader.value):
outputValue += 'fool!'
if isDog(reader.value):
outputValue += 'bow-wow!'
if outputValue == '':
outputValue += str(reader.value)
print outputValue
reader.value += 1
return reader
reader.value = 1
return reader
instance = nabeatsuQuestion()
runner = instance.createReader()
for i in xrange(1,40,1):
runner()

そうしたら、instance. createReader()のところで引数がどうのこうのって言われたので、小3分くらい悩んだ。

どうも、引数にselfを用意しておかないといけないようで。

"ナベアツ問題"
class nabeatsuQuestion:
def createReader(self):
"ナベアツ問題を読み上げる人を作る"
def reader():
"読み上げる人"
def isFool(value):
"3の倍数と3の付くときあほである"
if value % 3 == 0:
return True
if str(value).find('3') >= 0:
return True
def isDog(value):
"5の倍数で犬である"
return value % 5 == 0
outputValue = ''
if isFool(reader.value):
outputValue += 'fool!'
if isDog(reader.value):
outputValue += 'bow-wow!'
if outputValue == '':
outputValue += str(reader.value)
print outputValue
reader.value += 1
return reader
reader.value = 1
return reader
instance = nabeatsuQuestion()
runner = instance.createReader()
for i in xrange(1,40,1):
runner()

としたら動いた。

リファレンスはちゃんと読もうという教訓。

#はてな記法って便利

Share

外側のコードブロックの変数が見れなくなる理由がやっとわかった

と言われてしまった。

どうも、このままだと外側のコードブロックにある変数を見てくれないらしい。

だから、どうやってやるんだろうといろいろと調べていたら、どうも、下記コードのように配列とすると、外側のコードブロックにある変数にアクセスできるっぽい。

Pythonでのクロージャについて(追記あり) – NAL-6295の舌先三寸

で悩んでいた問題は

ある名前がブロック内で束縛されている場合、名前はそのブロックに おけるローカル変数 (local variable) です。 ある名前がモジュールレベルで束縛されている場合、名前は グローバル変数 (global variable) です。 (モジュールコードブロックの変数は、ローカル変数でもあるし、 グローバル変数でもあります。) ある変数がコードブロック内で使われているが、そのブロックでは定義 されていない場合、変数は 自由変数 (free variable)です。

4.1 名前づけと束縛 (naming and binding)

という事で、同じ名前の変数を使うと、そのブロックで新しく作られ、そのブロック全体で有効になるんですね。

Share