ホーム > アーカイブ > 2010-09

2010-09

初めてのPython(5) importとfromとreloadでモジュールを使いこなす

初めてのPython“も佳境ですね。
あと2部読み進めればおしまいです。
初めてのPython“を全て読むことが出来れば、Pythonistaとしての第一歩を踏み出せたことになります(自分の中で)。

初めてのPython V部

初めてのPython“のV部は、”モジュール“に関してまとられています。
Pythonにおけるモジュールのインポートの仕方や、再読み込みその扱いまで。

と、”その前にモジュールって何?“という方のためにWikipediaから引用しておきます。


プログラミングにおいて、一連の機能をひとまとまりになる複数の機能:モジュールに分割し、それぞれ別に開発する場合がある。こうすることで、全体として完成を早めることが出来る上、モジュール単位でテストしたりすることが可能になり、モジュールの入れ替えで機能を高めたり補修したりすることができるようになる。

モジュール – Wikipediaより

そして、モジュールとクラスの違いは、以下の通り。


ジュールとクラスの違いは以下の通りである。
クラスにはインスタンスとしてオブジェクトを生成する機能がある。
クラスは他のクラスの動作やデータを継承することができる。
ポリモーフィズムにより、クラスのインスタンス間の関係は実行時に変化するが、モジュール間の関係は静的である。
モジュールとクラスの類似点は以下の通りである。
どちらも実装の詳細を外部から隠蔽する。
どちらも階層(モジュール階層とクラス階層)を形成することができる。

モジュール – Wikipediaより

普段、PHPを使っているのでこの”モジュール“という概念が頭にありませんでした。
PHPではインポート(require)すると、C言語のインポート(include)と同じで、”ファイル自体がそこに読み込まれる“という動作をしますからね。
インポートだけでは、名前空間が別に分かれたりしないわけです。

こういう構造もあってか、PHPではモジュールをすっ飛ばしてクラスを使います。
そのため、私自身、”モジュール“は初体験でした。

このあたりの話になってくると、色々と絡み合ってくるので、読むのに苦労しました。
最後の応用の部分は理解出来たか、自身がありませんが、基本は押さえたので、これをまとめていきます。

モジュール

Pythonにおける”モジュール”とは、

ファイル

です。

これが一番分かりやすいでしょう。”モジュール” = “ファイル“なのです。

以前の記事を覚えているでしょうか?

この記事からスコープの画像を引用します。

このファイルにあたる部分が、Pythonでは”モジュール“と呼ばれます。

この図から分かる通り、Pythonではファイル間でスコープを共有しません
そのため、ファイルごとに機能を独立してコードを記述することが出来るのです。
機能を独立して記述できる…だから、Pythonではファイルが”モジュール“なのです。

Pythonではこの”モジュール”も”オブジェクト“として扱います。
モジュールを読み込むためにはimportステートメントを使います。

オブジェクトである証拠をソースコードで示しましょう。
ファイル構造は次の図の通りとします。

python_module_import.png

これらのファイルの中身は次のソースコードとします。

spammer.py

import spam

print spam.x

spam.py

x = 20

egg.py

import spam

spam.x = 10

import spamer

egg.pyを実行した結果として出力されるのは”20“ではなく、”10“です。
モジュールがオブジェクトとして扱われるために、このような動作となります。

今までの”可変性/不変性“や”リファレンス“の考え方を理解していれば、この動作はしっくり来ます。
importステートメントは“モジュールオブジェクト”へのリファレンスを作り出す操作なのです。

また、説明していませんが、モジュール内の変数へはドット(.)を使って自由にアクセス出来ます。
モジュール内にある変数を呼び出すときは、

[モジュール名].[変数名]

関数を呼び出すときは、

[モジュール名].[関数名](引数)

という形を取ります。
クラスと同じような使い方なので、オブジェクト指向プログラミングをした人にとっては理解しやすいかと。

モジュール = ファイル
分かりやすいし、書きやすいと思いませんか?

import

先ほど説明した通り、importステートメントは、”モジュールオブジェクトへのリファレンス“を作り出します。

1度目のimportステートメントは“モジュールオブジェクト”を生成し、そのリファレンスを設定します。
2度目以降のimportステートメントは生成済みの”モジュールオブジェクト”へのリファレンスを設定します。

spam.py

x = 30

egg.py

import spam

spam.x = 10

# spamモジュールをsecond_spamという名前でインポートする
import spam as second_spam

print second_spam.x

egg.pyを実行した結果は”10“です。
モジュール内の変数が上書きされてしまっていることが分かります。
importステートメントで設定した変数はあくまで、”モジュールオブジェクトへのリファレンス“にしか過ぎません。

python_multiple_import.png

importの基本はこれだけです(多分)。

from

fromはimportの拡張です。

spam.py

x = 10

egg.py

from spam import x
print x

これだけです。

え、わからない?

モジュールの中の”変数”や”関数”を指定して、読み込んでいるんです

importステートメントはモジュールをまるごと”オブジェクト”として読み込む方法でした。
fromステートメントは、そのオブジェクト内にあるオブジェクトへのリファレンスを、インポート元のスコープに設定します。

python_from_import.png

このため、先ほどのimportと同じようなコードを書いても、同じ結果にはなりません(変数が上書きされてしまうからね)。

spam.py

x = 30

egg.py

from spam import x

x = 10

# eggモジュールのxオブジェクトをyという名前でコピーする
from spam import x as y

print y
# 30が表示される

しかし、可変性のオブジェクトだと話は別です。
こんなことが出来ます。

spam.py

x = []

egg.py

from spam import x

x.append(1)

# eggモジュールのxオブジェクトをyという名前でコピーする
from spam import x as y

print y
# [1]が表示される

どうでしょう。
なぜこうなるか、わかりますか?
説明するのが難しいですね…これまた、”オブジェクト“と”リファレンス“の関係です。
理解出来ない“という方は前の記事を読んでみてください。

reload

個人的に面白い使い方が出来そうと思ったのが”reload“です。
名前の通り、モジュールを再読み込みします。

先ほど、importは”1度目の呼び出し時だけオブジェクトを生成する“と説明しました。
これは、”1度目の呼び出し時だけソースコードをコンパイルしてオブジェクト化する“ことを示します。
つまり、ソースコードはimportを使う限り、1度だけしか読み込まれないんです

これを2度、3度と読み込むのが”reload“です。

例えばこんなコードを書いてみます。

spam.py

print 'spam'

egg.py

import time
import spam

while 1:
  reload(spam)
  time.sleep(5)

egg.pyを実行すると、5秒おきにspam.pyを読み込みます。
放っておくと、永遠と”spam”と言い続けるでしょう。

これをターミナルで実行した上で(プログラムを強制終了させずに)、spam.pyを書き換えます

spam.py

print 'spam and egg'

あら不思議、”spam and egg”を連呼するようになりました(うるさいのは変わりないですけどね)。

この”reload“、使い道を間違えなければ強力な武器になりそうです。
プログラムを止めずに、モジュールを差し替えることが出来るんですから

モジュールについて簡単にまとめてみました。
実はまだたくさん書いていないことがあります。
例えば、モジュール内の変数の隠蔽モジュールの自己診断パッケージのインポートなどです。

初めてのPython“のV部は”簡単なのに、難しい“です。
このあたりは理解よりも、慣れが大きいんでしょうね。

あぁ、Pythonでプログラムが書きたくなってきた!

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

初めてのPython(4) 関数でさえオブジェクトであるPython

やっと、”初めてのPython“のIV部を読み終わりました。
初めてのPython“の読書はすごく順調に進んでいます。
そう、すごく順調に…。

そこには触れないようにして、今日のPythonのまとめに行きましょう。

初めてのPython IV部

初めてのPython“のIV部は、”関数“についてまとめてあります。

え、関数なんて余裕だよ。“という人も、読み飛ばさずに読んでください。
Pythonにおける関数も他の言語とちょっと変わっています

PHPの関数宣言functionにあたる宣言がPythonではdefです。
この宣言を使って、Pythonではこんなことが出来ちゃいます。

def create_memory(x, y):
	def memory():
		return x, y
	return memory

mem = create_memory(2, 3)
print mem()
# (2, 3)が表示される

関数をネストして、値をネストした関数内に保持させています。

これが出来るのも全て”関数がオブジェクト“だからです。

IV部ではこの”関数がオブジェクト“であることのメリットや、その使い方を説明しています。

関数オブジェクト

先ほども述べた通り、Pythonでは関数でさえオブジェクトとして扱います。
それはこのコードを見れば簡単に分かるでしょう。

def add(x, y):
	return x + y

print add(1, 2)
# 3が表示される

my_add = add
print my_add(1, 2)
# 3が表示される

print my_add
# <function add at 0x7f0be1e095f0>が表示される。0x7f0be1e095f0は実行時によって違う。

関数を作っておき、それ自体(関数)を変数に代入する“ということがPythonでは簡単に出来てしまいます。

Pythonは本当に何から何までオブジェクトです。

柔軟性の高い引数

Pythonで関数を指定する場合は、次のように引数を渡します。

  • 通常
    • 一般的な引数の順番で指定する方法。
  • キーワード
    • 引数の名前と共に値を指定する方法。順序関係なし。
  • デフォルト
    • 一般的な方法。デフォルト値を引数に設定出来る。ただし、Pythonならではの癖がある。
  • 可変
    • 可変引数も指定可能。指定された引数をタプルまたはディクショナリで受け取ることが出来る。

Pythonでは柔軟性が高く、かつコードが少なくなるように設計されています。
キーワード引数や可変引数は色々と活用出来そうです。

通常“はイメージにお任せします。
恐らく私とあなたが抱いているイメージは同じでしょう。

キーワード“はこのような指定が出来ます。

def spam(x = 1, y = 1, z = 1):
	return x, y, z

print spam(y = 2)
# (1, 2, 1)が表示される。
print spam(y = 2, x = 10)
# (10, 2, 1)が表示される。

デフォルト“は先ほどのキーワードの例でも使いましたが、引数に”デフォルト値“を設定する方法です。

def spam(x = 10):
	return x

print spam()
# 10が表示される。
print spam(20)
# 20が表示される。

何度もしつこいですが、Pythonでは全てがオブジェクトです。
それによって起きる癖のあるコードを紹介します。

def spam(y, x = []):
	x.append(y)
	return x

print spam(y = 1)
# [1]が表示される。
print spam(y = 2)
# [1, 2]が表示される。
print spam(y = 3)
# [1, 2, 3]が表示される。

Pythonではデフォルト値でさえ、オブジェクトとして扱ってしまうのです。
“x”に指定しているデフォルト値は”空のリスト“です。
リストは可変性のオブジェクト
可変性のオブジェクトは、変更を加えてしまうと、それを参照している変数全てに影響があります。

Pythonは関数オブジェクト作成時にデフォルト値のオブジェクトも作成します
このデフォルト値にオブジェクトを持つ関数オブジェクトを何度も呼び出すことで、例のように内容がどんどん追加されることになります。

可変“は次のように可変長の引数を渡すことが出来ます。

def spam(*x):
	return x

print spam(1)
# (1, )が表示される
print spam(1, 2)
# (1, 2)が表示される
print spam(1, 2, 3)
# (1, 2, 3)が表示される

可変で渡ってきた引数は、タプルとして引数に代入されます。

キーワード引数を”可変“にすることも出来ます。

def spam(**x):
	return x

print spam(z = 1)
# {'z':1}が表示される
print spam(z = 1, y = 2)
# {'z':1, 'y':2}が表示される
print spam(z = 1, y = 2, x = 3)
# {'y':2, 'x':3, 'z':1}が表示される

これらの引数指定は便利だと思いませんか?
なんだか、色々なことが出来そう…と想像してしまいます。

スコープを表すLEGBルール

関数を使う上で”スコープ“を理解することは重要です。
スコープって何?“と言う方はいないと思いますが、Wikipediaから引用しておきます。


プログラミングでのスコープとは、ある変数や関数が特定の名前で参照される範囲のこと。ある範囲の外に置いた変数等は、通常、その名前だけでは参照できない。このときこれらの変数はスコープ外である、「見えない」といわれる。

スコープ – Wikipediaより

簡単に言ってしまうと、”名前の影響範囲“ですね。

PythonではLEGBルールと名付け、その範囲が次のように決まっています。

  • L: Local scope
    • その関数内のみで有効なスコープ。
  • E: Enclosing function’s scope
    • その関数の外側内側の関数でのみ有効なスコープ。
  • G: Global scope
    • ファイル全体で有効なスコープ。
  • B: Built-in scope
    • プログラム全てで有効なスコープ。

図で示すと、このような形です。

python_scope.png

[2010/09/30 追記] 上記の図は間違っています。正しくはこちら。

python_scope.png

Local“は簡単に分かると思うので説明しません。
Pythonが他と少し違うのは”Enclosing function’s scope“と”Global scope“です。

Enclosing function’s scope“は一番始めに示したコードです。

def create_memory(x, y):
	def memory():
		return x, y
	return memory

mem = create_memory(2, 3)
print mem()
# (2, 3)が表示される

これはcreate_memory関数にネストされたmemory関数が、create_memoryの変数である”x”を利用しています。
ネストされた関数がネストしている関数の変数を使うのが、”Enclosing function’s scope“です。

Global scope“は名前の通り、グローバルなスコープなのですが、Pythonではこのグローバルの範囲が違います。
Pythonのグローバルはあくまで、”ファイル単位“です。
ファイルの内部でしか、その変数は有効になりません。
ファイルの外からその変数を使いたい場合は、importなりなんなりをしないといけない。

x = 10

def spam():
	global x
	return x

print spam()
# 10が表示される

x = 20

print spam()
# 20が表示される

“x”はソースコード内でのみ、有効です。
この他にこんなソースコードを書いても”x”は使えません。

# 先ほどのソースコードをspam.pyとする
import spam

print x
# エラーが表示される

スコープはこんなところでしょうか。
スコープ“と”関数は、やはり”Pythonは全てがオブジェクトである“ということを理解していれば、大概のコードは理解出来そうです。

ステートを保持するジェネレータ

個人的に面白いと思ったのが、”ジェネレータ“です。
これもソースコードを見た方が早いでしょう。

def spam():
	for x in 1, 2, 3, 4:
		yield x

x = spam()
print x.next()
# 1が表示される
print x.next()
# 2が表示される
print x.next()
# 3が表示される
print x.next()
# 4が表示される

print x.next()
# エラーが表示される

これは、関数の”return“の代わりに”yield“を指定することで”その時点での値を返し、関数内の処理を一時停止する“イメージです。
yield“の代わりに”return“を使ってしまうと、この関数は全て”1“を返してしまいます(一般的な関数の動作ですね)。

しかし、”yield“を使うと、”どこまで処理が進んだか“をPythonが保存しておいてくれるのです。
それを次に進ませるために”next”メソッドを呼んでいます。

処理が全て終了すると”これ以上、返す値がないよ“ということで、エラーが表示されます。

これもうまく使いこなせば色んなコードが書けそうです。

初めてのPythonにはまだまだ、たくさんのことが書いてあるのですが、とりあえず基本だけまとめてみました。
しかし、徐々に難しくなってきましたね。
以前にまとめたことをしっかり理解していないと、このあたりの動作を理解するのに苦労しそうです。

どの章でもそうですが、

Pythonはあらゆるものをオブジェクトとして扱う

これを常に念頭において読み進めるのが良さそうです。

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

WordPressでカラム広告をページによって変える方法

wordpress_google_adsense.png

今日はまたPythonの勉強はお休みです。
軽くWordPressの記事を書いていきます。

先日、1-byte.jpに広告を入れたのですが気づいたでしょうか?
記事のページ上部と下部右カラムです。

広告を入れるのは簡単に出来ます。
AdSenseのウィザードに沿って進めれば、コードが作られ、それをWordpressに貼付けるだけです。

1-byte.jpで困ったのは右カラムの広告です。
各ページをよく見て頂けるとわかるのですが、記事ページは1カラムその他のページは2カラムで構成しています。
じゃ、トップページなどの右カラムは記事ページでどこにいったの?
それは、記事ページの一番下に表示されています。

top_page_right_column.png
記事ページ以外の右カラム

article_page_right_column.png
記事ページの右(下)カラム

ここで気になるのはです。
それぞれのカラムの幅が違うのです

AdSenseは広告を作るときに、を決めます。
幅が固定なので、どちからに揃えると、どちらかの見栄えが悪くなります

今日はこれをページによって切り替える方法を紹介します。

WordPressのウェジットを使う

カラムに広告を載せる上で簡単なのは、”ウェジット“を使うことです。
Wordpressには管理者が自由に文字列とHTMLを埋め込めるウェジットが用意されています。

wordpress_text_widget.png
ウェジット

そう、”文字列とHTML“を埋め込めるウェジットです。
文字列とHTML“…何か足りません?

…”PHP“が足りないんです。
PHP“を埋め込むと、このウェジットに無視されてしまいます。

wordpress_wedgit_test.png
“PHP”コードを埋め込んでも

wordpress_wedgit_test_top.png
何も表示されない

しかし、広告をページごとに切り替える必要がない人は、このウェジットで満足出来ます。
ここにAdSenseのコードを貼付けて終わりです。

しかし、動的にウェジット内の表示を変えたいときはPHPのコードを書く必要があります。

ウェジットでPHPを使う

はい、お手軽なプラグインを使います。
インストールするプラグインはこれです。

これをインストールすると、”文字列とHTMLとPHP“が使えるウェジットが追加されます。

wordpress_php_code_widget.png
ウェジットが追加された

あとは、ここにページ判定のコードAdSenseを埋め込んでやれば完成。

<div align="center">
<?php if(is_single()): ?>

<script type="text/javascript"><!--
google_ad_client = "pub-4878024466716878";
/* 1-byte.jp 記事ページ ボトム */
google_ad_slot = "0410411106";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

<?php else: ?>

<script type="text/javascript"><!--
google_ad_client = "pub-4878024466716878";
/* 1-byte.jp 右カラム中段 */
google_ad_slot = "7586626745";
google_ad_width = 200;
google_ad_height = 200;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

<?php endif; ?>
</div>

ページ判定の関数はこちらを見てくださいね。
これだけ知っていれば、ページごとにカラムの内容を切り替えれます。

あ、最後に、私と同様のことをやる場合はAdSenseの広告は2つ作っておいてください。
記事ページ以外に表示する幅の広告と、記事ページに表示する幅の広告です。
今回は、それをウェジット内で”PHP“で切り替えているだけです。

久々に軽い記事を書いてみました。
すごくニッチですが、参考になれば幸いです。

初めてのPython(3) ここが違うぞ、Pythonさん

皆さんはPythonの勉強は順調に進んでいますか?
私はやっと”初めてのPython“のIII部に入れました。

タスクでは”初めてのPython”読了を1週間としていましたが、正直キツいですね。
読むだけなら良いのですが、ブログにまとめながらなのでなおさら。

しっかり読みたいしっかり理解したいのであれば”2週間“ほど掛かるかもしれません(仕事しながらなら)。

ただ、しっかり読んでも細かい部分は確実に忘れてしまうので、ポイントだけ押さえた読み方をお勧めします。
私も今、”Pythonとは何か?“に焦点を置いて、読み進めています。

初めてのPython III部

初めてのPython“のIII部には何が書かれているか?
Pythonの特徴とも言える基本構文について、がっつりと書かれています。

Pythonの特徴である”スペース“や”タブ“が意味を持つこと、少し変わった”while“と”for“。
そしてそれをどう使うか、例題を踏まえて。

さらに、”どの書き方が最もPython的で最も最適か“まで書かれているので、冒頭に述べた”Pythonとは何か?”の答えが見つけやすい。
これまでI部、II部を読みましたが、一番、”なるほど!“と腹落ちしたのがこのIII部です。

I部で全体像を理解し、II部で内部構造を理解し、III部でPythonの特徴を理解する。

初めてのPython“はこんな章立てになっています。

読み終わったら”初めてのPython 読書ガイド“を記事にしたいですね。

この記事では特徴的なPythonの構文に焦点を当て、取り上げて行きます。

Pythonとは何だ

まずはおさらいです。

以前の記事で、Pythonについて私はこう書きました(“初めてのPython“をまとめただけですが)。


Perlは芸術家のための言語、そしてPythonはエンジニアための言語。

初めてのPython(1) 基礎知識まとめ“より

Pythonはエンジニアのための言語です。
そのため、ミニマリスト主義、つまり誰が書いても同じ書き方になるように言語が作られています。

始めはぼやっとしか、この概念が理解出来ませんでした。
なるほど、誰が書いても同じように…大事だね。“程度です。
III部を読み、これがどういう意味を持つのか、少しずつ明確になってきました。

これは、

同じ種類の構文を使ったときに、様々な書き方を生まれないようにPythonが制約を作ること

だったんです。

Pythonの特徴である”インデント“もそうです。

Pythonはなぜ、”インデント“でブロックを分けるのでしょうか?
この答えも、さきほどの答えの中に含まれています。

例えば、PHPのif文はこのように書きます。

if($a == 1) {
	print 'a is one.';
	$a = 2;
}

恐らく皆さん、こういった書き方をすると思うのですが、これはこんな書き方も出来ます。

if($a == 1) {
print 'a is one.';
$a = 2;
}

こんな書き方だって出来ちゃいます。

if($a == 1) { print 'a is one.'; $a = 2; }

Pythonでは、“インデント”がブロックであり、“改行”がその文の終わりを示します。
この基本ルールに則ってやれば、先ほどのプログラムはPythonではこうなります。

if a == 1 :
	print 'a is one.'
	a = 2

“インデント”がブロックであり、”改行”がその文の終わり

これが決められてしまっているので、この書き方しか出来ないんです(もちろん例外的な書き方もありますが)。

普通、他の言語だと、こういったことはコーディング規約で決めます。
しかし、Pythonは言語自身がコーディング規約を決めています。

このように言語側でコーディング規約があれば、新しい開発メンバーが入ってきた場合も、その開発チーム”独自ルール“に悩まされなくて良さそうです。

気に入りましたよ、Pythonさん。

条件分岐

Pythonで条件分岐は、他の言語と同じく”if“を使います。

しかし、ちょっとだけ違うのが”else if“です。
Pythonでは”else if“を”elif“と書きます。

タイピングが少なくする工夫でしょう。

elif“…良いですね。

繰り返し

Pythonで繰り返しは、これも他の言語と同じ”while“と”for“を使います。

しかし、”do until“あるいは”do while“はありません
do until“がない理由も、書き方の統一のためでしょう。
全て”while”でことが足りますからね。

先ほど、他の言語と同じ”while“と”for“と言いましたが、厳密には違います。

“for”の構文がfor($i = 0; $i < 10; $i ++)ではないのです
どちらかと言うと、foreachに似ています。

Pythonではタプルやリスト、文字列などのシーケンスを使って”for“を書きます。

for x in [1, 2, 3]
	print x

じゃ、for($i = 0; $i < 10; $i ++)を書きたいときはどうするか?
range関数を使って書きます。

for x in range(0, 10):
	print x

ミニマリスト主義を徹底してますね...。

その他に面白いのは"while"と"for"に"else"が使えることでしょうか。
次のコードを両方実行してみてください。

for x in range(0, 10):
	if x == 5:
		break
else:
	print 'break is not executed.'
for x in range(0, 10):
	print x
else:
	print 'break is not executed.'

"break"文が実行されなかった場合に"else"ブロックが実行されます。
何に使うかというと、"フラグを使う必要があるとき"です。

繰り返しで何かを検索するときなど、"if"文の中にフラグと"break"文を入れますね。
これが繰り返しのelse文を使うことですっきりと書けます。

先ほどのソースをフラグを使って書いた例です。

flag = False
for x in range(0, 10):
	if x == 5:
		flag = True
		break

if flag != True:
	print 'break is not executed.'

"for"や"while"に"else"、なかなか面白い発想ですよね!

リスト内包表記

一番特徴的なのはこれです。

print [x * 2 for x in (1, 2, 3)]
# [2, 4, 6]が表示される。

リストの中に"for"を入れることで、繰り返し分のリストを作ってしまいます。
なかなか説明しにくいですが、構文的にはこうです。

[リストに入れたい値 forの構文]

なので、こんな書き方も出来ます(意味があるのかは別、教科書にはそんなソースコードがたくさん出てくるし)。

print [1 for x in (1, 2, 3)]
# [1, 1, 1]が表示される。

さらに"if"文も組み合わせて使えるようです。

print [x * 2 for x in (1, 2, 3) if x == 1 or x == 2]
# [2, 4]が表示される。

シンプルで見やすいし、理解出来れば打ちやすい。

Pythonを書くときは内包表記もがっつり使っていきましょう。
速度的にも優れているようです。
その辺りは"初めてのPython"を読んでください。
嫌というほど説明されていますから。

とりあえず、こんなところですね。
まだまだたくさん紹介したい構文があるのですが。

"初めてのPython"を参考に、"Pythonで他の言語と比べて、ここが変わっている"という点を取り上げてみました。
どうです?Pythonを使いたくなりましたか?

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

初めてのPython(2) ビルトインオブジェクトのまとめ

どんどん、Pythonを勉強して行きますよ。
今日は初めてのPython II章をまとめます。

前回の記事はこちらです。

初めてのPython II部

初めてのPythonのII部には”ビルトインオブジェクト“がまとめられています。


まず知っておかねばならないのは、Pythonではデータがオブジェクトとして扱われるということです。オブジェクトは、大きく、Python言語にあらかじめ用意されているビルトインオブジェクトと、PythonやCのツールを使ってプログラマ自らが作成するオブジェクトに分かれます。

初めてのPython“(p69)より

プログラム内でモジュールなどを何も定義することなく、利用出来るオブジェクトがビルトインオブジェクトです。
主要なビルトインオブジェクトとして、”初めてのPython“では以下のものが紹介されています。

  • 数字
  • 文字列
  • リスト
  • ディクショナリ
  • タプル

まだ、”初めてのPython“を最後まで読んでいませんが、Pythonを理解する上でこのII部が最も重要だと感じました。

始めに上記のオブジェクトの概要が、次にそのオブジェクトの詳細な説明と使用例が、最後に紹介したオブジェクトの中でも重要な部分がまとめられています。
つまり、同じオブジェクトがII部の中で3度も説明されています。
それだけ、ビルトインオブジェクトの理解が重要ということでしょう。

また、このII部を読み進めるうちに、”PHP脳を変えなければいけないな“とも感じました。
PHPPython、あまりに勝手が違いすぎる。
構文が違うだけじゃなく、このPythonの”ビルトインオブジェクト“が大きな違いを生んでいます。

II部の中では特に低水準言語であるC/C++とPythonの比較が出てきます。


ガーベージコレクションが行われるメリットは、プログラマが逐一そのためのコードを書かなくても、メモリ領域が解放されるということです。そのため、CやC++といった低水準のプログラムに比べ、プログラムの機能に直接関係のないコードをかなり減らすことが出来ます。

初めてのPython“(p123)より

こういった比較が出来るということは、Pythonがよく考えられた言語であり、様々な使い方が出来る証拠ではないでしょうか。
エンジニアがしっかりとした骨組みを考え、曖昧さを残さないように組み立てる。
それがPythonである気がします。

本文中にコード例やメソッドがいくつも出てきます。
それらを全て紹介は出来ないので、それぞれのオブジェクトの基本的な考え方をまとめてみます。

オブジェクトの基本

まず、Pythonの変数を理解します。

python_vars.png

Pythonにおいて変数はオブジェクトへのリファレンスでしかありません。
C言語で言うところのポインタのようなものですね。

これを頭に入れた上で、オブジェクトの種類を理解します。

Pythonのビルトインオブジェクトはカテゴライズされています。
そのカテゴリごとに操作が似通ってきます
これを理解すれば、かなり頭の中が整理されます。

python_object_categorize.png

まず、可変性と不変性です。

  • 可変性
    • 内容を変更出来るオブジェクト
  • 不変性
    • 内容を変更出来ないオブジェクト

簡単ですが、これだけです。
対象が”オブジェクト“であることに注意です。
先ほどの変数の説明で出てきた”リファレンス“ではありません。

例えば、”リスト“と”タプル“は同じシーケンスというカテゴリに属するのですが、可変性と不変性の点で異なっています。

# リストの例
a = [1, 2, 3]
a[0] = 10
print a
# [10, 2, 3]が表示される。[1, 2, 3]というリストの中身を変更出来る。

# タプルの例
b = (1, 2, 3)
b[0] = 10
# エラーが表示される。(1, 2, 3)というタプルの中身は変更出来ない。

# 変数の置き換え
b = a
print b
# [10, 2, 3]が表示される。エラーは表示されない。リファレンスを変えただけで、オブジェクトを変更した訳ではないため。

次に、オブジェクトのカテゴライズです。

  • 数字
    • そのまま数字です。整数や浮動小数点もこれです。
  • シーケンス
    • 簡単に言ってしまえば、配列です。連想配列ではなく、ただの配列。順序を持っています。文字列もこのシーケンスに分類されます。
  • 写像
    • こちらは連想配列です。キーに文字列などを指定出来ます。順序を持っておらず、これが保証されません。

数字は良いと思うので、問題は”シーケンス“と”写像“ですね。
どちらも配列のようなものなのですが、順序を持っているか持っていないかの違いがあります。

PHPだと連想配列でも順序を持っている(foreachで順番に参照出来る)のですが、Pythonだとそうもいかないようです。
さらに、PHPだと配列連想配列の区分は気にしなくて良いのですが、これがPythonだと明確に分けられています

# リスト(シーケンス)の例
a = [1, 2, 3]
a[10] = 10
# エラーが表示される。順序があるため、いきなり10番目の配列に代入は出来ない。代入したい場合は0...10の配列を作った後に、この操作を行う。

# ディクショナリ(写像)の例
b = {"a":1, "b":2, "c":3}
b[10] = 10
print b
# {'a':1, 'b':2, 'c':3, 10:10}が表示される。順序がないため、好きなキーに値を代入出来る。また、順序も保証されない("10:10"が先頭にいってしまうかも...)。

オブジェクトの基本はこんなところだと思います。

同じカテゴリの属するオブジェクトは基本的に同じ操作が出来る“ということも頭に入れておいてください。

あとはそれぞれの構文を覚えればOK!

数字

100

これが数字のオブジェクトです。

この他に、以下も全て数字のオブジェクトです。

  • 10.00010
  • 11111111111111111111111111111111111L
  • 0x9ff
  • 3+4j

Pythonでは以下の数字が使えます。

  • 短整数
    • 1234, -24, 0
  • 長整数
    • 1111111111111111111111111111L
  • 8進数, 16進数
    • 0177, 0x9ff, 0XAA
  • 複素数
    • 3+4j, 3.0+4.0j, 3J

中の処理を説明しだすと、長いので(そしてさほど理解出来ていないので)省略します。
数字に関しては、一般的なスクリプト言語と同じように使えそうです。

数字は不変性のオブジェクトなので、変更出来ません(というか数字を書き換えるような操作って出来ないよね、きっと)。

文字列

‘Spam’

これが文字列のオブジェクトです。
書き方は他のスクリプトと一緒でも、Pythonはひと味違います。

print 'Spam'[1:3]
# "pa"が表示される。

こんなことが出来ちゃいます。

Pythonにおいて文字列はシーケンスに属します。
シーケンスは順序を持った配列なので、スライシング(特定の部分だけ取り出す)インデキシング(一つだけ取り出す)が可能です。

今回、行ったのはスライシングです。
2〜3文字目の文字を取り出して、表示してみました。

文字列のオブジェクトをUnicodeで扱うことも、文字列のオブジェクトの先頭にuをつけることで指定できます。
その上でスライシングも期待通り動作します

print u'こんにちは'[1:4]
# "んにち"が表示される。

mb_hogehoge()要らず“ですね。

文字列は不変性のオブジェクトです。
以下のような変更は出来ないので注意。

a = 'test'
a[0] = 'b'
# エラーが表示される。

文字列は便利なメソッドを色々持っています。
例えば文字列を置き換えるメソッド。

a = 'This is test.'
print a.replace('test', 'cat')
# This is cat.が表示される。
print a
# This is test.が表示される。'This is test.'のオブジェクトが書き変わった訳ではない。

これも’This is test.’の文字列オブジェクトが書き変わった訳ではないので注意が必要です。
‘This is test.’を書き換え、‘This is cat.’という新しい文字列オブジェクトをPythonは生成したのです

文字列はこれらが基本だと思います。

文字列のオブジェクトは”シーケンス“カテゴリで”不変性“であること。
これを覚えておくとばっちりです。

リスト

[1, 2, 3]

これがリストです。

リストは”配列“と考えて良いと思います。
リストの値にアクセスするには以下のコードを使います。

print [1, 2, 3][2]
# 3が表示される。
a = [1, 2, 3]
a[0] = 10
print a
# [10, 2, 3]が表示される。

もちろん、入れ子にも出来ます。

print [1, 2, [3, 4, 5]][2]
# [3, 4, 5]が表示される。
a = [1, 2, [3, 4, 5]]
a[2][0] = 10
print a
# [10, 2, [10, 4, 5]]が表示される。

リストは”シーケンス“カテゴリに属します。
文字列と同じく、スライシングやインデキシングの操作が出来ます。

print [1, 2, [3, 4, 5]][1:3]
# [2, [3, 4, 5]]が表示される。

リストは”可変性“です。
オブジェクトに対して変更を加えることが出来ます。
appendやpop、removeといったメソッドを持っており、オブジェクトに対してこれらの操作を実施します。

a = [1, 2, 3]

a.append(4)
print a
# [1, 2, 3, 4]が表示される。

a.remove(1)
print a
# [2, 3, 4]が表示される。

a.pop()
print a
# [2, 3]が表示される。

print a.append(5)
# [2, 3, 5]ではなく、Noneが表示される。元々存在するオブジェクトに対する操作のため、返り値は、他の言語のNULLに相当するNoneが返る。

リストのオブジェクトは”シーケンス“カテゴリで”可変性“です。
文字列のオブジェクトと比較してみてください。
それで、さらに理解が深まるかと。

ディクショナリ

{‘cat’:'neko’, ‘dog’:'inu’, ‘spam’:'unknown’}

これがディクショナリです。

ディクショナリは”写像“というカテゴリに属するため、リストや文字列とは操作が異なります
例えば、リストや文字列で行ったスライシングの操作をディクショナリで行うとエラーが表示されます。

{'cat':'neko', 'dog':'inu', 'spam':'unknown'}[1:3]
# エラーが表示される。

{'cat':'neko', 'dog':'inu', 'spam':'unknown'}['cat':'dog']
# エラーが表示される。

逆にリストでは出来なかった操作が出来ます。
文字列キーの使用と、存在しないキーへの代入です。

print {'cat':'neko', 'dog':'inu', 'spam':'unknown'}['cat']
# nekoが表示される。

a = {'cat':'neko', 'dog':'inu', 'spam':'unknown'}
a['new'] = 'atarashii'
print a
# {'new': 'atarashii', 'spam': 'unknown', 'dog': 'inu', 'cat': 'neko'}が表示される。

リストと同じく、ディクショナリも”可変性“のオブジェクトなので、オブジェクトに対して代入が出来ています。

さらに”不変性“のオブジェクトであればどんなものでも、ディクショナリのキーに設定出来ます。
例えば、タプルをキーに設定出来ます。

print {(1, 2, 3):'tuple', 'dog':'inu', 'spam':'unknown'}[(1, 2, 3)]
# tupleが表示される。

かなり複雑な構成もディクショナリとタプルの組み合わせで実現出来そうですね。

ディクショナリのメソッドとして、PHPのarray_keys()にあたるkeys()や、array_values()にあたるvalues()があります。
また、PHPではキーチェックはisset()で行うのですが、Pythonではディクショナリに対してhasKey()メソッドが使うことで実現出来ます。

ディクショナリだけ、リストや文字列とちょっと違う”可変性”のオブジェクトだと覚えておくと良いかもしれません。

タプル

(1, 2, 3)

これがタプルです。

タプルは”シーケンス“カテゴリに属する”不変性“のオブジェクトです。
ここまでしっかり理解出来た方であれば、何が出来るか想像出来ると思います。

ソースコードの例だけ書いておくので、後は省略させてください。

a = (1, 2, 3)
a[0] = 10
# エラーが表示される。

print (1, 2, 3)[0]
# 1が表示される。

print (1, 2, 3)[1:3]
# (2, 3)が表示される。

ビルトインオブジェクトはこんなところですね。
初めてのPythonにはもっとたくさんのことが書いてあるのですが、基礎中の基礎をまとめてみました。

Pythonのチュートリアルが終わったらもう一度、II部を読まないとダメかな。

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

日常生活をRPGにするEpicWinを2週間続けて使ってみた。

epic_win.png

TechCrunch他、様々なブログで紹介されていたEpicWin2週間続けて使ってみました。
今日はその感想を。

EpicWinとは

詳細な説明は以下のブログ記事YouTubeの動画に譲ります。

EpicWin(日本語字幕)

EpicWinを簡単に言ってしまうと、

タスクを消化することでキャラクターが成長するゲーム、またはタスク管理ソフト

です。

生活に取り入れる

私はタスク管理ソフトとしてOmniFocusを好んで使っています。
MacBookでもiPhoneでも。

OmniFocusはとても使い勝手がよく、今や私の必須アプリケーションと化しているので、手放すつもりはありません。
これがないと仕事が一切進みません。

このワントップにもう一つタスク管理ソフトを入れることになるので、工夫が必要でした。
どのようにして、EpicWinを日常に取り込んだというと、

EpicWinをタスク管理ではなく目標管理ソフトとして使う

ことで、うまく自分の生活に入れ込みました。

後述しますが、EpicWinはこの”目標管理“にとてもしっくりと来るアプリケーションです。

tfmagician成長の日記

まずは、キャラクターを作ります。

the_birth.PNG

キャラクターを作ったら、もうゲームスタートです。
始めにアプリケーションの練習用のタスクがあったので、これを順番にこなしました。

first_tasks.PNG

タスクを消化するときの音や効果が、ゲームらしく、いい雰囲気を出しています。

毎朝、目標を追加します。
初日に入れた目標はこれです。

article_of_epicwin.PNG

目標には経験値その種類を設定します。
この辺は自分のイメージに合わせて適当に設定。
私は締め切りに追われていない目標は高い経験値を設定し、自分を駆り立てるようにしました。
(締め切り前にやれば良いのですが、なかなか進みませんよね。経験値をあげることで、自分のモチベーションにします。)

attributes_of_task.PNG

それで夜になったら、目標を達成したか、確認。
達成していなかったら、経験値を下げておきます
これは自分への罰ですね。

check_tasks.PNG

これを繰り返し、2〜3日すると、アイテムをゲット!
どうやらタトゥーのようですね。

epicwin_tatoo.png

ツイッターにつぶやいておきました。

アイテムのつぶやき

タスクを消化すると、地図をキャラクターが進んで行きます。

map.PNG

これをさらに繰り返し、アイテムをさらに2つゲットしました。

epicwin_milk.PNG

epicwin_warm_fire.png

2週間後、自分のキャラクターはどうなったかと言うと…

epicwin_tfmagician.png

レベルアップならずorz
タスク管理ではなく、目標管理として使ったため、成長が遅かったのかもしれません。

どうなの、EpicWin

個人的にはこのゲーム、とても面白い試みだと思っています。

今のWebの流れを見ると、次に来るのは”Web + Real“なのは確実でしょう。
そもそも、位置ゲームが流行りだした時点で、この流れに飲み込まれています。

それじゃ、”Web + Realはこの位置ゲームだけなの?“というと、Webはそんな可能性の低い代物じゃないと思います。
つまり、“Web + Real”の一つの可能性がこのEpicWinじゃないかなと。

自分のやること(ToDo)を、iPhoneを使い、管理する。
管理した結果は自分の分身であるキャラクターに経験値として反映され、成長する。
そしてそのキャラクターは…。

どうでしょう?
EpicWinも十分、WebとRealが繋がっていると思いませんか?

こういったコンセプトに引かれ、次の可能性を知るために、私は2週間、EpicWinを使ってみたのです。

EpicWinの課題

使ってみて気になった点を下記にまとめます。

  • ゲームレベルが難しい
    • 先ほどの成長過程の通り、2週間でレベルは上がりませんでした。消化したタスクが少なかったからだと思いますが、この辺のゲームレベルが気になりますね。
  • 使う人を選ぶ
    • 対象は”RPGが好きで、自分のキャラクターを育てることに喜びを感じる人”でしょうか。これに喜びを感じられなければ、恐らく続けられません。
  • 共有機能が少ない
    • 現状で出来ることは、取得したアイテムとレベルアップをTwitterにつぶやくことだけです。これに加えて、友達に自分のキャラクターを見せることが出来れば最高ですね。
  • タスク管理機能が貧弱である
    • カテゴライズやタグ付けは出来ません。設定出来るのはタスクの内容と期限のみ。使い方が限定されますね。

これらの点は気になりますが、逆に“ゲーム”としての仕立ては素晴らしいものがあります。

タスク管理“と”ゲーム“を組み合わせたときに、どちらにフォーカスを置くのか、難しいところだと思います。
タスク管理ソフトとしての機能を充実させれば、ゲーム感がなくなり、ゲーム要素を強くすれば、タスク管理が出来なくなる。

このバランス感覚が大事ですが、EpicWinはゲーム寄りに作られています。

キャラクターが3Dであること、タスクを消化するときに出るアクション、地図を進む感覚、アイテムリスト…などなど。
これらは全て、ゲーム要素であると共に、タスクの消化を楽しくしてくれます。

タスクを消化するのが楽しく感じる“ということはEpicWinの方針は間違っていないのでしょう。

後は先ほど上げた4点をうまくバランスしてやれば、もっと素晴らしいソフトになると思います。

また、私が使ったように”タスク管理“ではなく”目標管理“にフォーカスしてやれば、タスク管理機能が貧弱であることも気にならなくなります。
“キャラクターが成長する”ゲームであるため、目標管理にはうってつけです。
自分のやりたいことの他に、”キャラクターを成長させる“というプラスαの目標が出来るんですから。

私のEpicWin評はこんなところです。
結構面白いゲームですよ。

MMORPGにハマったことがある人には特にお勧めです。

epicwin_icon.jpg EpicWin

  • 価格: 350円
  • 作成: supermono limited
  • カテゴリ: 仕事効率
  • 更新: 2010/09/19

初めてのPython(1) 基礎知識のまとめ

learning_python.jpg

なんだか、前回の記事はお喜び頂けたようで何よりです。

あれは本当に自分のために書いたので、あんなに皆が読んでくれるとは思っていませんでした。
皆、Pythonの勉強が進まなくて困っているんですね(苦笑)

言い出しっぺが書きっぱなしというのもあれなので、しばらくブログをPythonの勉強記事を上げて行きます。

今日は“初めてのPython”のI部のまとめです。
初めてのPythonなんて読む時間がないよ!“という方は、記事を読んでエッセンスだけ抜き取っちゃってください。

初めてのPython I部

初めてのPythonのI部には、Pythonの基礎知識がまとめられています。
Pythonがどんな言語なのかどういったものが作れるか開発環境は何を使うか、そしてPythonのバッググラウンドまで。

Linuxだけでなく、Windowsでの開発環境の構築の仕方まで載っていました。
ただ、自分はLinuxユーザなのでWindowsはスルー。

初めてのPython“に載っていたことに、自分で調べたことをプラスαして以下にまとめていきます。

Pythonのコンセプト

Python Fits Your Brain.
(2001年のPythonカンファレンスのテーマです)

これがPythonのコンセプトの一つのようです。
つまり、あなたの脳にぴったりなプログラミング言語を。

Pythonは構文がシンプルで明瞭です。
それは、誰が読んでも、理解しやすくメンテナンスしやすいということです。

初めてのPython“にはPerlとPythonを比較した上で、こういった表現がありました。

Pythonプログラマは、あくまで「アーチスト」ではなく、優れた「エンジニア」であるべきでしょう。

初めてのPython“(p16)より

初めてのPython“を読んで、気に入った表現の一つです。

Perlは芸術家のための言語、そしてPythonはエンジニアための言語

初めてのPython“にあるのですが、Perlは優れた言語学者によって開発されました。
それゆえ、Perlはプログラマーによっていく通りもの表現が書けるようになっています。

それに対し、Pythonは優れた数学者によって開発されました。
それゆえ、Pythonはプログラマーによって出来るだけ解が一つになるようになっています。

芸術家は人により様々な表現があって良い。
しかし、エンジニアは強固な物を作り上げるために、そうはいかない。
出来るだけ、皆にわかりやすい形にする義務がある。

ということでしょう。

良い設計思想だと思います。
私が”Pythonを勉強したい”と思う一つの理由でもあります。

しかし、これを読むと”Pythonが素晴らしい”と思うと同時に、Perlも勉強したくなるんですけどね(笑)

Pythonで作れるもの

何でも作れます。

これが”初めてのPython“から得た私の印象です。

Webアプリケーションから、シェル、GUIのアプリケーションそして大規模な科学まで。
Pythonがオブジェクト指向として設計されていること、そして他言語とフレンドリーな形で実装されていることが、大きいのだと思います。

初めてのPython“には、Pythonにはこんなことも出来るとありました。

フローズンバイナリとは、前章で触れたとおり、PythonプログラムのバイトコードとPythonインタプリタを1つの実行形式ファイルにまとめたものです。他の実行形式ファイルと同様、アイコンをクリックする、コマンドラインで名前を入力する、といった方法で起動出来ます。

初めてのPython“(p59)より

Pythonがオブジェクト指向言語であることは、コードの作成、再利用に役立つだけでなく、C++、Javaなどの他のオブジェクト指向言語のプログラムと組み合わせて使うスクリプトの作成に役立ちます。たとえば、適切なグルーコードを使えば、Pythonで、C++やJava、C#のクラスを継承(特殊化)するプログラムを作ることも可能です。

初めてのPython“(p12)より

2つ目は特に試してみたいですね。
私はC++も勉強し、習得したいと思っています。
Pythonを習得する過程で、C++も習得出来れば素晴らしいですね。

もちろん、スクリプト言語の十八番、(動的に生成した文字列をコードとして扱う) eval()も使えます。

動作速度とコード量

うまく書けば、コード量はC++やJavaの1/3〜1/5程度になるようです。

そして、以下の仕組みを取り入れることで、他のスクリプト言語より高速に動作するようです。

python_execute.png

一度、Pythonコードを実行すると、.pycの拡張子のバイトコードが作られます。
このバイトコードはソースコードと機械語の中間コードで、元のソースコードを高速化します。
実行時はこのバイトコードをランタイムに渡し、実行します。

二回目以降の実行はこのバイトコードへの変換がなくなるため、起動が高速化します。

また、こんなツールもあるようで。

このような高速化の仕組みもPythonの魅力の一つではないでしょうか?

開発する上で気をつけること

読んでいて気がついた”開発する上で気をつけること“をまとめます。

  • ターミナル上で対話型でプログラムを実行するときは、Pythonコードの特徴である”タブ”が不要
  • 同様にターミナル上で対話型でプログラムを実行するときは、printも不要
  • シェルを作るときに拡張子.pyをなくても実行出来るが、モジュールには.pyが必要

全てターミナル上でPythonを実行するときの注意ですね。

開発環境

私はエディタはvi、ターミナル上でほとんどのことを済ませるので、IDEは不要です。
しかし、”初めてのPython“には以下のようなPython開発用のIDEが紹介されていました。

  • IDLE
    • 初めてのPython“で細かく紹介されています。Eclipseのように高機能ではありませんが、必要な機能は十分に備えているようです。初心者にもお勧め、とあります。
  • EclipseとPyDev
    • 言わずと知れたEclipse、そのPython拡張がPyDevです。
  • Komodo
    • 有償のIDEですね。GUIのデザインも出来るようです。
  • PythonWin
    • Windows用のPythonのIDEですね。機能的にはIDLEと同じと書かれています。

私は使うことはないと思いますが、まとめだけ。

ユーモア

コメディ番組 “空飛ぶモンティ・パイソン”

このパイソンからPythonは来ています。
イギリスのコメディグループ”モンティ・パイソン“が出演する番組です。

空飛ぶモンティ・パイソン (Monty Python’s Flying Circus) は、1969年から1974年までイギリスのテレビ局 BBC が製作・放送したコメディ番組である。文字通り、イギリスのコメディグループモンティ・パイソンが出演していた。
同時代事件や哲学に敏感に反応するとともに、同性愛や民族・宗教上の差異を扱ったきわどいネタも多く、そのナンセンスさと毒の強さは以後コメディにとどまらず多くの欧米文化に影響を与えた。特に本国イギリスではコメディ番組の時代毎の傾向を(それ以前にもそれ以降にも様々なコメディ番組を輩出したにも拘らず)「Pre-Python(パイソン放送以前-1969年以前)」「On-Python(パイソン放送当時-1969年〜1974年)」「Post-Python(パイソン放送以後ー1975年以降)」とカテゴライズするところからも如何にこの番組が英国コメディ番組史に多大な影響と衝撃を与えたかが読み取れる。また、BBCが公共放送であるにもかかわらず、エリザベス女王の映像をコントに使うこともあった。

空飛ぶモンティ・パイソン – Wikipediaより

サンプルコードに一般的な”foo”や”bar”の代わりに、”spam“や”eggs“が使われるようです。
それはこの”空飛ぶモンティ・パイソン”のネタから来ているとのこと。

Pythonには関係ありませんが、”スパム・メール“のスパムもこの”空飛ぶモンティ・パイソン“から来ているそうですよ!

こういうユーモアはツールを使うのを楽しくしてくれますよね。
自分も何か、サービスやツールにユーモラスなネーミングをしたいなぁ。

ざっとですが、”初めてのPython“のI部をまとめてみました。
自分の必要なところだけを抜き出してあります。

本は人によって必要となるところが違うので、これを読むだけで満足しないでください
初めてのPython“はすごく内容の濃い本なので、是非、一緒に読んでいきましょう。

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

PHP + Apache2でMultiViewsを設定する方法

apache_server.jpg

先日、お知らせメールApache2とPHPの組み合わせに、MultiViewsを設定しました。
そうすると、Yahoo! Site Explorerの認証時に”406 Not Acceptable“のエラーが返されてしまいました。

どうやら、PHPファイルのMIMEタイプの設定が悪かったようです。
今回はメモ書き程度に、この設定方法をまとめます。

MultiViewsとは

そもそも、MultiViewsとは何でしょうか。

リソースをネゴシエーションするためには、 サーバは variant それぞれについての情報を知っておく必要があります。 これは以下の二つの方法のどちらかで行われます。
タイプマップ (すなわち *.var ファイル) を使う方法。 これは variant を明示的に挙げているファイルを指定します。
‘Multiviews’ を使って、サーバが暗黙の内にファイル名にパターン照合を 行なってその結果から選択する方法。

コンテントネゴシエーション – Apache HTTPサーバより

これにある通り、”複数あるファイルの選択肢から、クライアント側のHTTPヘッダ情報を元に送り返すファイルをApache2に選ばせる“機能です。
mod_negotiationというApacheモジュールに含まれています。

クライアント、よく使うのはFirefoxやSafariのWebブラウザですね。
このWebブラウザはサーバに対してHTTPヘッダを送信しています。

sending_http_header.png

サーバはこのHTTPヘッダを読み、その上で適切なファイルを選び、クライアントに送り返します。

receiving_http_header.png

これを使って何が出来るか、というと.php拡張子がついたPHPファイルに拡張子なしのURLでアクセス出来ます。

Apache2での設定

まず、MultiViewsを設定します。
Optionsディレクティブに+MultiViewsを指定するだけです。

<Directory /var/www/>
  Options -Indexes FollowSymLinks +MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
</Directory>

Options All“だとMultiViewsがオンにならないため、注意が必要です。

次にPHP側の設定です。
設定方法はPHPのドキュメントに書いてあります。

デフォルトでは、PHPファイルのMIMEタイプは以下のように”application/x-httpd-php“に設定されています(設定ファイルはdebian系ならmods-available/php5.confに、RedHat系ならconf.d/php5.confにあります)。

<IfModule mod_php5.c>
  AddType application/x-httpd-php .php .phtml .php3
  AddType application/x-httpd-php-source .phps
</IfModule>

これを以下のように変更します。

<IfModule mod_php5.c>
  AddHandler php5-script php
  AddType text/html php
</IfModule>

これだけです。
これだけでPHPファイルに対して、MultiViewsが有効になります。
もちろん、”406 Not Acceptable“も発生しません。

ただし、この方法はApache 1.xだとうまく動かないようです。
詳しくは公式サイトを。

406 Not Acceptable

なぜ、デフォルトの設定だとYahoo! Site Explorerクローラを通さないのでしょうか
それは”クライアントが送ってきたHTTPヘッダを元に送り返すファイルを決定する“というMultiViewsの性質のせいだと思います。

デフォルト設定におけるPHPのMIMEタイプは”application/x-httpd-php“です。
このMIMEタイプだとクライアントがAcceptフィールドとして”text/html“だけを送ってきた場合に、サーバが適切なファイルとしてPHPファイルを選択出来ません
その結果が”406 Not Acceptable“です。

not_acceptable.png

これをPHPファイルが”html/text“だと指定してやることで、クライアントがAppectフィールドとして”text/html“を送ってきた場合に、サーバがPHPファイルを選択出来るようになります

html.png

簡単な説明ですが、理解出来たでしょうか?
そもそも、この説明が間違っている可能性もあるのですが…。

ちょっとサーバ周りで問題が出たので調べてまとめてみました。
間違いがある場合はご指摘ください。

Pythonの勉強をまったく始められないあなたと私に送る8つのタスク

python_task.jpg

Google App EngineでのPythonの勉強と開発は進んでいますか?

これを書いた本人はというと…まったく進んでいません
Learn Python The Hard Wayを少し読んだ程度です。
言い訳なんていくらでも出来ますね。
えーっと、仕事が忙しいから、仕事が忙しいから、そして仕事が忙しいから。

しっかり、仕事以外の勉強の時間を取ってやらないと、あっと言う間に置いてかれます。
そして、”新しいことを学ぶ”というのは日々のモチベーションに繋がりますから。

前置きはここまでにして、今日はタイトル通り、

Pythonの勉強をまったく始められないあなたと私に送る8つのタスク

を紹介します。

もし、タイトルに期待して、”これさえやればPythonマスターになれる!”と思ってきた方にはごめんなさい。
99%は”Pythonの勉強をまったく始められない私に送る“8つのタスクです。

この内容の残り1%だけ”あなたに”送ります。

あと対象フレームワークはPylonsです。
Djangoとか、CherryPyとか、使いたい人は読み替えて、かつ自分でチュートリアルを探してください。

1. 初めてのPythonを読了する。(期限: 1週間)

初めてのPython 第3版 初めてのPython

  • 著者: Mark Lutz (著), 夏目 大 (翻訳)
  • 出版社: オライリージャパン
  • 発売日: 2009/02/26

私は一度読んだのですが、再度読み直します。
この本はPythonの構文だけでなく、その構造まで踏まえて書いてあります。
これを完全に理解出来れば、”Pythonを理解した“と胸を張って言えそうです。

404 Blog Not Foundの弾さんもレビューを書いています。

2. Learn Python The Hard Wayのチュートリアルを消化する。(期限: 2週間)

これもざっと目を通しました。
Python初心者ではなく、”プログラム初心者“向けに書かれています。

もし、あなたが他の言語をやったことがあるなら、内容自体は簡単に理解出来るでしょう。

私もPHPに関しては学生時代から触れており、プログラムの概念は理解しています。
また、CakePHPに触れてから、どのように書けば保守性の高いプログラムが書けるかも、ある程度理解出来ました(こちらはまだまだですが)。

それでもこのチュートリアルを選んだのは、Pythonコードの手癖をつけるためです。
42のエクササイズからなるこのチュートリアルをこなせば、基本構文が手癖になる…はずです。

3. Google Python スタイルガイドを読む。(期限: 2日)

構文が理解出来たら、見やすいコードを心がけるようにしましょう。
そのためにgoogleが公開してるPythonのスタイルガイドを一通り読んでおきます。

4. Pylonsのチュートリアルを消化する。(期限: 2週間)

ここからフレームワークの勉強に入ります。
公式サイトが公開しているチュートリアルを消化します。

CakePHPを勉強したときもチュートリアルは、大変役に立ったのでこのタスクを消化します。

5. Pylonsでブログシステムを作る。(期限: 1週間)

チュートリアルではなく、自分で簡易システムを作ります。
定番はブログシステムでしょう。
設計からコーディングまで、自分で考え、自分で作ります。
サーバはLinuxで。

6. Slim3本を読了する。(期限: 1週間)

オープンソース徹底活用 Slim3 on Google App Engine for Java オープンソース徹底活用 Slim3 on Google App Engine for Java

  • 著者: ひが やすを (著, 監修), 小川 信一 (著)
  • 出版社: 秀和システム
  • 発売日: 2010/07/30

Pythonのフレームワークが使えるようになったら、次はGoogle App Engineに挑戦です。
その前に、Google App EngineのDatastoreについて理解しておきましょう。

この本はJavaのフレームワークSlim3の解説本ですが、実はDatastoreについてかなり書かれています。
ページの半分はDatastoreの解説です。

Webアプリケーションを組む以上、データベースの理解は必須です。
この本でしっかり勉強しましょう。

7. Google App Engine上でブログシステムを作る。(期限: 2週間)

Pylonsで作ったブログシステムをGoogle App Engine上に移植します。
といってもほとんど書き換えることになると思います。

使えるのはきっと、ビューぐらいかな。
あとはDatastoreのAPIで書き直しです。

8. Google App Engine上でTwitter関連のツールを作る。(期限: 4週間)

この段階で、TwitterをネタにしてGoogle App EngineとWeb APIとの連携を勉強します。
ま、そんなに難しくないと思っています。

Twitterがネタなのは作りたいツールがあるから。

9. Stamp Monstersを作る。(期限: 無期限)

やはり最後は、自分の作りたいアプリケーションを実現すること。
最近、アイディアとして暖めている”Stamp Monsters(仮)“を作ります。

内容は、秘密です。
あなたの好きな物を作りましょう。

私は順序立てて勉強するのが好きです。

中には始めから自分の作りたいものを作る人もいるでしょう。
そして、それもまた一つの勉強の仕方であり、モチベーションを保つのに最適な方法であることも知っています。

しかし、私は挫折するのです。
作ってる途中に、たくさんの調べ物が出てきて、見つかったコードを打ち込むにもキータッチが遅く、頑張ってコードを打ち込んだ結果が原因不明のエラー。

Learn Python The Hard Wayにプログラミングはギターのように、とありました。
まさにその通りだと思います。
ギターのカッコいいフレーズを手癖にしましょう。
その手癖を使って、カッコいい曲をアドリブで弾きましょう。

こういう点を踏まえて今回の”Pythonの勉強をまったく始められないあなたと私に送る8つのタスク“を構成してみました。
99%は自分のためのタスクですが、1%でもあなたのためになれば幸いです。

CakePHP 1.3.4 リリース

cakephp_1_3_4_released.png

ちょっと記事を書くのが遅いですね(汗)
こういう記事は早く書かないと価値がない。

CakePHP 1.3.4がリリースされました。
CakePHP 1.3のマイナーバージョンアップで、いくつかのバグフィックスが含まれているようです。

簡単にThe Bakeryの記事を翻訳しておきます。

CakePHP 1.3.4 リリース

CakePHP開発チームはCakePHP 1.3.4をリリース出来たことをアナウンス出来て嬉しく思います。
このリリースにはコミュニティから上がったいくつものレポート、そしてチームの1ヶ月間の努力が含まれています。
CakePHP 1.3.3のリリースから77コミット[1]、そして54のチケットが消化されました。
あなたのアプリケーションに対して少し影響が出ます。

  • プラグインに対して生成されたスキーマファイルが、AppSchemaの代わりのクラスネームを保持する$PluginSchemaを持つようになりました。
  • Routeのパラメータに”-”を含んだ場合も正常に動くようになりました。
  • SessionComponent::destroy()がデータを削除しないことがある問題を修正しました。
  • Scaffoldがテーマに対して正常に動くようになりました。
  • String::insert()が他のキーのサブパターンから始まるキーに対して正常に動くようになりました。
  • DboMysqlがカラムとテーブルパラメータを正常に取得出来るようになりました。
  • setlocale()とfloatの10進の区切りとして’,'を使うローケルに対して起こるSQLエラーの問題が修正されました。
  • EmailComponentがネームエイリアスを含むアドレスをさらに正しく扱えるようになりました。

この最新版[2]をダウンロードし、変更歴を読んでアップデートを確認してください。

CakePHP 2.0のブランチは開発が進められており、いくつかのトピックブランチがマージされています。
どんな機能が2.0に含まれるか気になるなら、lighthouseのwiki[3]を見てください。
まだ完璧に仕上げる時間はありませんが、ここでだいたいのことはわかるでしょう。
1.3の一時wikiページはしばらく更新がないので、数週間以内に削除されるでしょう。
もし、あなたがこのページをリンクまたはブックマークしているなら、クックブックに切り替えてください。

コミットを通じて貢献してくれた全ての方に大いに感謝します。そして同じぐらい、チケットを投げてくれた方、ドキュメントを更新してくれた方、その他のところでフレームワークに貢献してくれた人に感謝します。

最新版のパッケージは[2]を。
変更歴は[1]を。
[1] http://cakephp.lighthouseapp.com/projects/42648/changelog-1-3-4
[2] http://github.com/cakephp/cakephp/downloads
[3] http://cakephp.lighthouseapp.com/projects/42648

さほど大きな変更はありませんね。
気になるのはSessionComponent::destroy()の修正ぐらいですか。

CakePHP 2.0の開発も順調に進んでいるよう。
コアデベロッパの方には本当に足を向けて寝られませんね。

ホーム > アーカイブ > 2010-09

スポンサードリンク
書いている人
つぶやき
RSS 気になるニュース
過去の記事

ページの上部に戻る