Amazon

2011年11月30日水曜日

Google App Engineの新料金体系まとめ

Google App EngineがPreviewステージを卒業して正式サービスを開始したのを受けて新料金体系を発表したのは5月。適用は9/1とのことだったが、利用者からの猛反発を受けて以下に変更

幾つか新料金体系の変更を加えた
・新料金の適用を9/1から11/1へ延期
・無料Front Instance Hours 24 -> 28
・12/1のPython 2.7サポートまではFront Instance Hoursを課金を半額にする

さて、ここで自分がハマっていたことのメモ。
無料枠は依然残るものの、課金設定をしていると無料枠に収まっていても毎月$9(毎週$2.1)請求される。ただし、この毎週$2.1は最低利用料という扱いのため、例えばこの一週間で$1.3分を使用したとしても請求されるのは$2.1。つまり本請求は$2.1を超えたものから行われていく。

何も考えずにスケール対策のために課金設定にしていたので見事に毎週請求が来てました(ToT) 

課金設定を解除するにはBilling Setting -> Disable Billingにすること。
また、知らないうちに設定していたようだけど、9/1-10/31の間に課金設定にしてあれば、そのアプリケーションに対して$50分がもらえた様子。確かに自分のアプリケーションのいくつかも、Billing Historyの中でBalanseが($50)になっていた。ちなみに、請求されるとステータスはCharge Cancelとなるようです。

にしてもこの値上げは痛いなぁ。。。

さて、値上げ対策としてアプリケーションのチューニングが必要になるようだけど、
簡単な方法は
・Application SettingsでMax Idle Instancesを1、Min Pending Latencyを15Sにすること
・Datastoreへの問い合わせを極力減らして、Memcacheを使用

くらいのようです。

参考:Google App Engineの新料金体系対策

2011年11月27日日曜日

Aptana(Pydev)環境をWindowsからMacへ移動

MacBook Air(MacOS X Lion)を購入したので、
WindowsからMacへAptanaの環境を移行する方法をメモしておきます。

  1. Mac用のAptana Studioをダウンロード&インストール  
  2. Python 用 Google App Engine SDK 1.6のダウンロード&インストール
  3. WindowsからAptana Studio workspaceからプロジェクトフォルダをコピー
  4. Macの/Document/Aptana Studio 3 Workspaceの下に2.をコピー
  5. 各プロジェクト内の.pydevprojectファイルを編集
    * もしFinderで表示されていない場合はターミナルで以下のコマンドを打つと隠しファイルも表示されるようになる。
    % defaults write com.apple.finder AppleShowAllFiles TRUE
    逆に隠しファイルを隠す場合は
    % defaults write com.apple.finder AppleShowAllFiles FALSE

    .pydevprojectのファイルを編集

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <?eclipse-pydev version="1.0"?>

    <pydev_project>
    <pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
    <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
    <pydev_variables_property name="org.python.pydev.PROJECT_VARIABLE_SUBSTITUTION">
    <key>GOOGLE_APP_ENGINE</key>
    <value>C:\Program Files\Google\google_appengine</value>
    </pydev_variables_property>
    <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
    <path>/harnivorous/src</path>
    </pydev_pathproperty>
    <pydev_pathproperty name="org.python.pydev.PROJECT_EXTERNAL_SOURCE_PATH">
    <path>${GOOGLE_APP_ENGINE}</path>
    <path>${GOOGLE_APP_ENGINE}/lib/django</path>
    <path>${GOOGLE_APP_ENGINE}/lib/webob</path>
    <path>${GOOGLE_APP_ENGINE}/lib/yaml/lib</path>
    <path>C:\Python27\Lib\site-packages\nose-1.1.2-py2.7.egg</path>
    </pydev_pathproperty>
    </pydev_project>



    a) C:\Program Files\Google\google_appengine ->

    /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine
    b) ${GOOGLE_APP_ENGINE}/lib/django -> ${GOOGLE_APP_ENGINE}/lib/django_1_2
    c) <path>C:\Python27\Lib\site-packages\nose-1.1.2-py2.7.egg</path> -> 削除
    d) <path>${GOOGLE_APP_ENGINE}/lib/simplejson</path> を追加
     
     
  6. Aptanaを起動してFile -> Import -> Existing Folder as New ProjectとしてProject TypeはデフォルトのWebのチェックをはずす
  7. GAEへのデプロイ(アップロード)起動オプションの作成。Run -> Run ConfigurationsでPyDev Google App RunをダブルクリックしてProjectは起動オプションを作りたいプロジェクト名を入れる。Browseを押しても出てこない場合は直接名前を入力。以下を設定したらApplyで保存
    -Main Tab-
    Project: THE_PROJECT_NAME
    Main Module: ${GOOGLE_APP_ENGINE}/appcfg.py
    -Arguments Tab-
    Program arguments: --email=GAE_ID --no_cookies update "${workspace_loc:THE_PROJECT_NAME/src}"
    Working directory: Defaultで${project_loc:_selected project name}

  8. GAEへのデプロイではなく、ローカルホストでの実行の場合は、上記の起動ウィザードのうち以下を変更。
    Main Module: ${GOOGLE_APP_ENGINE}/dev_appserver.py
    Program arguments: "{workspace_loc:THE_PROJECT_NAME/src}"

2011年11月26日土曜日

PythonでJavaScriptのencodeURIと同じことをやるには?

JavaScriptで言うところのencodeURIと同じことをPythonでやるにはurllib.quote()メソッドを使う。

第一引数に変換したい文字列を、第二引数に変換したい文字コードを設定すること。
# -*- coding: utf-8; -*-

import urllib

print urllib.quote('いろはにほへと')
print urllib.quote(u'いろはにほへと'.encode('euc-jp'))
print urllib.quote(u'いろはにほへと'.encode('shift_jis'))
print urllib.quote(u'いろはにほへと'.encode('iso-2022-jp'))
print urllib.quote(u'いろはにほへと')
print urllib.unquote('%E3%81%84%E3%82%8D%E3%81%AF%E3%81%AB%E3%81%BB%E3%81%B8%E3%81%A8')


但し上記の方法だと、GETリクエストのURIは作りにくいので、urllib.urlencode()というメソッドがある。これはクエリにしたいものをリスト形式で記述して、urlencode()の引数に与えてあげる。(辞書形式の場合は順番は保持されない)


# -*- coding: utf-8; -*-

import urllib

urlprefix = 'http://www.google.co.jp/search?'
keyword = u'Python URIエンコード'
lang = 'ja'
encoding = 'utf-8'
query = [
    ('q', keyword.encode(encoding)),
    ('hl', lang),
    ('lr', 'lang_' + lang),
    ('ie', encoding),
    ('oe', encoding),
]

print urlprefix + urllib.urlencode(query)
 
 
参考元はこちら 
 

2011年11月21日月曜日

HTMLとJavaScriptでWebアプリケーションを作る際に注意すること

○ window.confirm()のタイトルは変更不可
window.alert, window.confirmなどでポップアップのダイアログを表示する際、ブラウザによって表示のされ方が異なる。IEやChromeの場合、タイトルバーが表示されてタイトルが表示されるがSafariの場合、タイトルの内容が本文に表示されてしまう。Firefoxはタイトルなし。
しかも、このダイアログのタイトルは変更不可能。
もし自由なダイアログを作成したいならjQuery Alertがオススメ

- IE








- Firefox









- Chrome






- Safari










○ document.getElementById().innerHTMLの落とし穴
DOM操作などでdocument.getElementById()を多用するかと思うけど、このタグに囲まれている値を取る時に注意が必要。.innerHTMLメソッドで要素内のデータを取得すると、HTML形式で値が取得されてしまうため、例えば、以下のようなtextareaのHTML要素に対してタグで囲まれた文字列"ここは<textarea>タグの領域です。" を取得しようとして、document.getElementById("textarea1").innerHTMLとすると、"ここは&lt;textarea&gt;タグの領域です。"となる。もしHTMLの特殊文字をそのまま取得したいならば、document.getElementById("textarea1")..textContentとする。


     <textarea id="textarea1">ここは<textarea>タグの領域です。</textarea>
○ formタグ内のinputタグの挙動について
<input onclick="javascript:hoge()">に対して、
<form action="ACTION_URL" method="GET">
で囲まれている場合、このinputタグがtype="submit"が指定されていなくてもACTION_URLに対してGETリクエストを送ってしまうようだ。

コードの再利用している場合は注意が必要。ちゃんと意味のあるタグだけつけるように。

Amazon3