Pyramid

PythonフレームワークPyramidをとりあえず動かすまで。

環境はwindows7

virtualenvのインストール

モジュールのバージョン違いとかに悩まされないように、Pythonの仮想環境を管理してくれるvirtualenvを入れとくと便利。

pip install virtualenv

インストールしてあるモジュールを全部はずした環境を用意

virtualenv --no-site-packages DIR_NAME

仮想環境を実行するにはDIR_NAME/Script以下にあるactivateを実行するんだけど、毎回マンドを打つのがめんどくさいのと色々忘れそうだからbatを用意

call パス\Scripts\activate.bat
cd ワークスペース\pyramid
cmd start

ちなみにactivateで仮想環境を実行した後はdeactivateコマンドで仮想環境を終了できる。

virtualenvは↓を参考にしました。
今日のPython: VIRTUALENV について

Pyramidをインストール

Pyramidのサイトを見るとeasy_installを使えとのことだったのでeasy_installでインストール。
ちゃんとvirtualenvで構築した仮想環境で以下を実行。

easy_install pyramid

Pyramidのプロジェクト作成

pcreateっていうコマンドを使います。

pcreate -s starter PROJECT_NAME

このコマンドをうつと便利機能のついたページを用意してくれるので、初心者はたぶん実行しといたほうがいいと思います。
で、sqlalchemyを使うので

pcreate -s alchemy PROJECT_NAME

Pyramidプロジェクト開発用ビルド

作成されたプロジェクトにはsetup.pyが用意されてるのでそれを使います。

python setup.py develop

テスト実行

自動生成されたプロジェクトにテストコードも含まれてるので、一応それの実行方法ト

python setup.py test -q

アプリケーションの実行

pserveコマンドを使います

pserve development.ini

ブラウザでhttp://localhost:6543にアクセスしてページが出ればOK。


Pyramidは日本語のドキュメントあるので、すごくとっつきやすいです。
Pyramid Web アプリケーション開発フレームワーク — The Pyramid Web Application Development Framework v1.4.3 (翻訳)

Pythonとイテレータ

class Counter:
  def __init__(self, max):
    self.max = max
  def __iter__(self):
    self.n = 0
    return self
  def next(self):
    if self.n > self.max - 1:
      raise StopIteration
    self.n += 1
    return self.n - 1

if __name__ == '__main__':
    for i in Counter(5):
        print(i)

イテレータはfor文に使える。
イテレータは__iter__メソッドと、nextメソッド(python3だと__next__?)を持つこと。StopIteration例外でストップさせる。

Pythonのユニットテストとモック

Javaの人から見るとびっくりするPython

class Language:
  def getName(self):
    return 'Java'

class Person:
  def __init__(self):
    self.language = Language()

  def getLanguage(self):
    self.language.getName()

Language.getNameはJavaという文字列を返すだけ、Person.getLanguageはLanguage.getNameに委譲をかけてるだけ。

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    self.assertEqual('Java', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

実行すれば、当然のごとくOK。

じゃ、テストコードをちょっと変えてみると・・・

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    def getName(self):
      return 'Python'
    #Language.getNameの実装を上のgetNameに置き換えてる
    Language.getName = getName

    self.assertEqual('Python', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

とこんなことができて、モックライブラリとかいるの?見たいな状況に・・・

TitaniumでSMSを送る

まだ、Androidでしか確認できてないんですが・・・

Titanium、SMSでググルと結構出てきますが大体ここら辺で終わり・・・

Ti.Platform.openURL('sms:09000000000');

これだとSMS送信画面が開くだけ。肝心の本文が入らない・・・
で、GitHubのTitaniumのコードを見てみると・・・
titanium_mobile/PlatformModule.java at master · appcelerator/titanium_mobile · GitHub

@Kroll.method
public boolean openURL(String url) {
    ...
    Uri uri = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
    try {
        getActivity().startActivity(intent);
        ....
    }
    .....
}

引数のurlをパースしてIntent発行してるだけ。URLでもパラメータ渡せるから、後はキーが何かが問題だな・・・、なんかいけそうだと思って調べていると・・・

ここのページに、http://d.hatena.ne.jp/thorikawa/20100930/p1

ContentValues values = new ContentValues();
values.put("address", "090xxxxxxxx");
values.put("date", System.currentTimeMillis());
values.put("read", false);
values.put("subject", "test subject");
values.put("body", "test body");
getContentResolver().insert(Uri.parse("content://sms/inbox"), values);

こんなの見つけました。あ、なるほどね、本文はbodyってキーワードか、と思って

Ti.Platform.openURL('sms:09000000000?body=TEST');

ってやったら、みごと本文が入ってました。

Androidのgmailクライアントで絵文字を表示する

今まで、ガラケーから送られてきた絵文字は、メールの最後に添付ファイルとしてついてきていたんですが、Androidにデフォルトでついてるgmailクライアントで見れないのかなぁと。

gmailクライアントの画面で

メニュー-その他-設定-全般設定-[画像を表示]を解除

を設定して、絵文字のあるメールを見ると、横に「絵文字を表示する」みたいなボタンが出るのでそれをクリックすると見れるようになる。

[画像を表示]を解除のしたの説明が、「すべての送信者を初期設定に戻す」っていう説明が何を言っているのかわからないのがつらい・・