2010年10月16日土曜日

更新再開します。

しばらくPython勉強してなかったが、自宅のPCも整備できたので、勉強再開します。

2009年12月11日金曜日

SmartBrainリリース

SmartBrainをリリースしました。SmartBrainはPHPで実装されていますが、次期バージョンではPythonに以降するかもしれません。

2009年10月30日金曜日

Google App Engine (GAE)

私が、Pythonの勉強を始めた理由は、GoogleAppEngineを使いたかったからだ。

最近では、Javaのサポートも加わっているが、Googleが初期段階からPythonに対応しているということには、それなりの理由があると考え、Pythonの勉強を始めた。

GoogleAppEngineを実際に使えるようになるまでに、1点はまったので、その点を含めて利用開始までの手順を解説する。

1. アカウントを取得する


http://code.google.com/intl/ja/appengine/にサインインする。G-mailのアカウントでよい。

「AppEngineのアカウントにログインする」をクリック。

もう一度ログイン認証画面がでる。

すると、

Welcome to Google App Engine

Before getting started, you want to learn more about developing and deploying applications.
Learn more about Google App Engine by reading the Getting Started Guide, the FAQ, or the Developer's Guide.

[Create Application]

と表示される。

[Create Application]ボタンをクリックすると、

Verify Your Account by SMS

To create applications with Google App Engine, you need a verification code. Select the country and carrier for your mobile phone and enter your mobile phone number. The verification code will be sent to it via SMS. Note you will only need to verify your account once.

と表示される。

ここの、Country and Carrier: (国とキャリアの選択)で、日本を選んでハマりました。

iPhoneしか持っておらず、メールアドレスの設定もしてなかったので、日本を選ぶとこの先に勧めません。

日本の携帯電話のE-mailアドレスを持っていない場合は、Otherを選び、下に表示されるフィールドに携帯電話の番号を入れましょう。

こうすれば、SMSでパスワードが送信されてきます。

受け取ったパスワードで認証を通せば、アプリケーションを作れるようになります。


2. ツールをインストールする

GoogleAppEngine_1.2.7.msi

インストールし、Google App Engine Launcherを起動。

新しいアプリケーションを作成。
File ⇒ Create New Application

これだけで、ひな形が一式生成されます。

yamlファイル(デプロイに関する記述)
application: study-python
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
script: main.py

以下のアドレスから、私が試しに作成・デプロイしたアプリケーションを確認できます。

http://study-python.appspot.com/

シンプルな数当てゲームです。
O'REILLY著 の Using Google App Engineに出ているサンプルを日本語化し、毎回数字が変わるように改良しています。

2009年10月28日水曜日

HTTPRequest

HTTPRequestを送信してみた。

Googleのトップページを取得

>>> import urllib2
>>> url = "http://www.google.co.jp"
>>> result = urllib2.urlopen(url)
>>> lines = result.readlines()
>>> lines[0]
'<html><head><meta http-equiv="content-type" content="text/html; charset=Shift_JIS"><title>Google</title><script>window.google={kEI:"tirjSpiUK4egwgPJttycDQ",kEXPI:"17259,21766,22107,22217",kCSIE:"17259,21766,22107,22217",kCSI:{e:"17259,21766,22107,22217",ei:"tirjSpiUK4egwgPJttycDQ"},kHL:"ja"};\n'
>>> lines[1]
'\n'
>>> lines[2]
'window.google.sn="webhp";window.google.timers={load:{t:{start:(new Date).getTim
e()}}};try{}catch(b){}window.google.jsrt_kill=1;\n'


このブログからURLを抽出してみた。

data = urllib.urlopen('http://python25.blogspot.com').read()
for url in re.findall(r"https?://[-_.!~*()a-zA-Z0-9/?:@&=+$,%#]+", data):
  print url

>>> for url in re.findall(r"https?://[-_.!~*'()a-zA-Z0-9/?:@&=+$,%#]+", data):
...   print url
...
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd
http://www.w3.org/1999/xhtml
http://www.google.com/2005/gml/b
http://www.google.com/2005/gml/data
http://www.google.com/2005/gml/expr
http://www.blogger.com/favicon.ico
http://python25.blogspot.com/
http://python25.blogspot.com/feeds/posts/default
http://python25.blogspot.com/feeds/posts/default?alt=rss
http://www.blogger.com/feeds/6658540373074530849/posts/default
http://www.blogger.com/rsd.g?blogID=6658540373074530849
http://www.blogger.com/profile/17765477399828427893
http://www.blogger.com/openid-server.g
http://www.blogger.com/static/v1/widgets/1550194411-widget_css_bundle.css
http://www.blogger.com/static/v1/v-css/3727950723-blog_controls.css
http://www.blogger.com/dyn-css/authorization.css?targetBlogID=6658540373074530849&zx=885dfb85-549b-4231-a3a3-178f9be1dbeb
http://www1.blogblog.com/dots/bg_dots.gif
http://www.blogblog.com/dots/bg_3dots.gif
http://www1.blogblog.com/dots/bg_dots2.gif
http://www1.blogblog.com/dots/bg_dots2.gif
http://www1.blogblog.com/dots/bg_post_title_left.gif
http://www.blogblog.com/dots/icon_comment_left.gif
http://www.blogblog.com/dots/icon_comment_left.gif
http://www.blogblog.com/dots/icon_comment_left.gif
http://www1.blogblog.com/dots/bullet.gif
http://www.blogger.com/navbar.g?targetBlogID=6658540373074530849&amp
http://python25.blogspot.com/2009/10/blog-post_23.html
http://python25.blogspot.com/2009/10/blog-post_23.html
http://python25.blogspot.com/2009/10/blog-post_23.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=8238006605508980249
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/blog-post_22.html
http://python25.blogspot.com/2009/10/blog-post_22.html
http://python25.blogspot.com/2009/10/blog-post_22.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=5311009012827742139
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/blog-post_21.html
http://python25.blogspot.com/2009/10/blog-post_21.html
http://python25.blogspot.com/2009/10/blog-post_21.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=9007033006594304086
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/2.html
http://python25.blogspot.com/2009/10/2.html
http://python25.blogspot.com/2009/10/2.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=2181106016910876218
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/mapfilter.html
http://python25.blogspot.com/2009/10/mapfilter.html
http://python25.blogspot.com/2009/10/mapfilter.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=2507538441610339075
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/importreload.html
http://www.python.org/dev/peps/pep-0263/
http://python25.blogspot.com/2009/10/importreload.html
http://python25.blogspot.com/2009/10/importreload.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=8577865623867738151
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/2009/10/blog-post_15.html
http://python25.blogspot.com/2009/10/blog-post_15.html
http://python25.blogspot.com/2009/10/blog-post_15.html#comments
http://www.blogger.com/post-edit.g?blogID=6658540373074530849&postID=1242385033646658704
http://www.blogger.com/img/icon18_edit_allbkg.gif
http://python25.blogspot.com/search?updated-max=2009-10-15T06%3A00%3A00%2B09%3A00&max-results=7
http://python25.blogspot.com/feeds/posts/default
http://dame.livedoor.biz
http://www.blogger.com/rearrange?blogID=6658540373074530849&widgetType=LinkList&widgetId=LinkList1&action=editWidget
http://img1.blogblog.com/img/icon18_wrench_allbkg.png
http://python25.blogspot.com/search?updated-min=2009-01-01T00%3A00%3A00%2B09%3A00&updated-max=2010-01-01T00%3A00%3A00%2B09%3A00&max-results=17
http://python25.blogspot.com/2009_10_01_archive.html
http://python25.blogspot.com/2009/10/blog-post_23.html
http://python25.blogspot.com/2009/10/blog-post_22.html
http://python25.blogspot.com/2009/10/blog-post_21.html
http://python25.blogspot.com/2009/10/2.html
http://python25.blogspot.com/2009/10/mapfilter.html
http://python25.blogspot.com/2009/10/importreload.html
http://python25.blogspot.com/2009/10/blog-post_15.html
http://python25.blogspot.com/2009/10/blog-post_14.html
http://python25.blogspot.com/2009/10/blog-post_13.html
http://python25.blogspot.com/2009/10/blog-post_12.html
http://python25.blogspot.com/2009/10/1.html
http://python25.blogspot.com/2009/10/blog-post_08.html
http://python25.blogspot.com/2009/10/blog-post_07.html
http://python25.blogspot.com/2009/10/blog-post_06.html
http://python25.blogspot.com/2009/10/blog-post.html
http://python25.blogspot.com/2009/10/python-1010-10000000000l-101032python.html
http://python25.blogspot.com/2009/10/python.html
http://www.blogger.com/rearrange?blogID=6658540373074530849&widgetType=BlogArchive&widgetId=BlogArchive1&action=editWidget
http://img1.blogblog.com/img/icon18_wrench_allbkg.png
http://www.blogger.com/profile/17765477399828427893
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsqz1XWFjtQG3T6GIQs3uAZBszmJGcBVnTONKZhCFDk0hR3Co-GGw8EmBLk_28VrzcDcIaSDoGqU1IskC4H3wuNSxqfo1yGaiNq__yarzrMnd9dmztzyhA8xV1gueaWaUlyubGcI7bH5s/s220/yoichiro_pic1.jpg
http://www.blogger.com/profile/17765477399828427893
http://www.blogger.com/rearrange?blogID=6658540373074530849&widgetType=Profile&widgetId=Profile1&action=editWidget
http://img1.blogblog.com/img/icon18_wrench_allbkg.png
https://ssl.
http://www.
http://www.blogger.com/static/v1/widgets/4222249892-widgets.js
http://www.blogger.com/rearrange?blogID=6658540373074530849
http://python25.blogspot.com/,6658540373074530849)
http://www.blogger.com/display?blogID=6658540373074530849
http://python25.blogspot.com/
http://python25.blogspot.com/
http://python25.blogspot.com/feeds/posts/default
http://python25.blogspot.com/feeds/posts/default?alt
http://www.blogger.com/feeds/6658540373074530849/posts/default
http://www.blogger.com/rsd.g?blogID
http://www.blogger.com/profile/17765477399828427893
http://www.blogger.com/openid-server.g
http://img1.blogblog.com/img/icon18_wrench_allbkg.png
http://www.blogger.com/favicon.ico

100%正確な結果が得られたわけではないが、90%以上の精度でURLを抽出できた。

2009年10月26日月曜日

py2exeでEXE化してみた

PythonのスクリプトをEXEファイルに変換してみた。

・py2exeから、py2exe-0.6.9.win32-py2.5.exeをダウンロードし、インストール。

・setup.pyを作成

from distutils.core import setup
import py2exe

py2exe_options = {
"compressed": 1,
"optimize": 2,
"bundle_files": 1}

setup(
options = {"py2exe": py2exe_options},
console = [
{"script" : "example.py"}],
zipfile = None)

・コマンドラインから setup.py py2exe

以上の操作で、distフォルダ内にexample.exeが生成されました。


まだ、Pythonを勉強しはじめたばかりで、わからないことだらけですが、あっという間にexeファイルを作成できました。コンソール上で動く簡単なアプリケーションですが、ちゃんと動作しました。単一ファイル書き出しにしたところ2.6MBほどと、大きめのファイルサイズになってしまいましたが、簡単に起動できるのは便利ですね。

参考
Pythonで単体で動くバイナリを作ろう!

2009年10月23日金曜日

アイコンクリックによる起動

すぐに閉じてしまう

Pythonのスクリプトが記述されたファイル(.pyファイル)をダブルクリックすると、Pythonのプログラムを実行できます。しかし、この方法でプログラムを実行すると多くの場合、一瞬で処理が終わりウィンドウが閉じてしまいます。実行結果をファイルなどに保存している場合はそれでもよいですが、実行結果を確認したい場合も多いはずです。

このようなとき、
raw_input()
と書くことでウィンドウが閉じることを防げます。

raw_input関数は、標準入力から1行を読み取る関数ですが、その際にプログラムの実行が止まります。そのため、プログラムの末尾にraw_input()と書いておけば、ウィンドウが自動的に閉じないようになります。

ウィンドウを開かないようにする

拡張子をpywにすると、Windows上で実行した場合も、ウィンドウを開かないようになります。

2009年10月22日木曜日

ディクショナリ型

ディクショナリ型
連想配列みたいなもの。JavaでいうとHashMap型。PHPでいうとarrayでインデックスに文字列を使った状態。

{}で要素が入っていないディクショナリ型のオブジェクトを作成。要素はあとから自由に追加できる。
>>> data = {}
>>> data["a"] = "abc"
>>> data
{'a': 'abc'}

オブジェクトを作らずにいきなり追加はできない。(PHPだとこれでもOK)
>>> data2["a"] = "abc"
Traceback (most recent call last):
File "", line 1, in
NameError: name 'data2' is not defined


最初から要素を入れておくことも可能
>>> data = {"a": "abc", "b": "bcd"}
>>> data
{'a': 'abc', 'b': 'bcd'}

中の要素へのアクセスは以下のようにする。
>>> data['a']
'abc'
>>> data['b']
'bcd'

ディクショナリの入れ子構造も可能
>>> data = {"a":{"b":"c"}}
>>> data["a"]["b"]
'c'

ディクショナリ内にリストを入れることも可能
>>> data = {"a":[1,2,3]}
>>> data["a"][1]
2
>>> data["a"][2]
3

ディクショナリ内に自らを入れることも可能(非推奨)
>>> data = {"a":"b"}
>>> data["b"] = data
>>> data
{'a': 'b', 'b': {...}}

再起構造になっているため特殊な表示形式になっている。こういうデータ構造を作る場合は、無限ループや無限再帰呼び出しが発生しないように十分注意する必要がある。