Commits

Shinya Okano  committed d814534

pyfes201207を追加

  • Participants
  • Parent commits 1a84959

Comments (0)

Files changed (48)

File pyfes-201207/_sources/advanced.txt

+関数
+=======================
+
+関数定義
+----------
+
+関数はdef文で定義します。引数が無くてもかっこは必須です。
+
+.. code-block:: pycon
+
+  >>> def hello():
+  ...     print 'Hello World!'
+  ...
+  >>> def add(a, b):
+  ...     return a + b
+  ...
+
+デフォルト引数
+--------------
+
+Pythonでは引数のデフォルトの値を決められます。該当の引数が与えられない場合にデフォルトの値が関数に渡されます。
+
+.. code-block:: pycon
+
+  >>> def ian(word='black'):
+  ...      print '%s ian' % word
+  ...
+  >>> ian()
+  black ian
+  >>> ian('white')
+  white ian
+
+可変長引数
+----------
+
+``*`` からはじまる引数で可変長の引数をリストとして取得できます。
+
+.. code-block:: pycon
+
+  >>> def sum(*args):
+  ...     result = 0
+  ...     for x in args:
+  ...         result += x
+  ...     return result
+  ...
+  >>> sum(1,2,3,4,5,6,7,8,9,10)
+  55
+  >>> sum(1, 2, 3)
+  6
+
+可変長キーワード引数
+--------------------
+
+``**`` からはじまる引数で可変長のキーワード引数が辞書として取得できます。
+
+.. code-block:: pycon
+
+  >>> def f(**kwargs):
+  ...     return kwargs
+  >>> f(a=1, b=2, c=3)
+  {'a': 1, 'c': 3, 'b': 2}
+  >>> def g(**kwargs):
+  ...     for key, value in kwargs.iteritems():
+  ...         print key, value
+  >>> g(a=1, b=2, c=3)
+  a 1
+  c 3
+  b 2
+
+特殊な引数指定方法
+=====================
+
+リストや辞書の各要素を引数として渡すこともできます。
+
+引数が複雑な関数を呼び出すときや、条件によって引数が細かく変化するような場合に有用です。
+
+.. code-block:: pycon
+
+    >>> def func_a(x, y, z):
+    ...     print x + y + z
+    ...
+    >>> args = [1, 3, 5]
+    >>> func_a(*args)  # func_a(1, 3, 5)という呼び出しと等価
+    9
+    >>> def func_b(name="bucho", age=36):
+    ...     print name, age
+    ...
+    >>> kwargs = {'name': "feiz", 'age': 24}
+    >>> func_b(**kwargs)  # func_b(name="feiz", age=24)という呼び出しと等価
+    feiz 24
+
+クラス
+=======================
+
+自分でデータ型を作成したい場合、Pythonではクラスを作ります。
+
+.. code-block:: pycon
+
+  >>> class Person(object):
+  ...     def __init__(self, name, words):
+  ...         self.name = name
+  ...         self.words = words
+  ...     def say(self):
+  ...         print u'「%s」と%sさん' % (self.name, self.words)
+  ...
+  >>> feiz = Person('feiz', u'ふぇ')
+  >>> feiz.say()
+  「ふぇ」とfeizさん
+  >>> tokibito = Person('tokibito', u'ぬるぽ')
+  >>> tokibito.say()
+  「ぬるぽ」とtokibitoさん
+
+
+モジュール
+=======================
+
+``import`` 文でモジュールが読み込めます。
+
+標準モジュールの ``os`` を読み込んでみましょう。
+
+``import os`` とすると ``os`` モジュール内のオブジェクトにアクセスする事ができます。
+
+.. code-block:: pycon
+
+  >>> import os              # グローバルネームスペースにosが追加される
+  >>> os.path.join('/usr/', 'home/bucho/')
+  '/usr/home/bucho/'
+
+``from os import path`` とすると ``os.path`` を ``path`` として使うことができます。
+
+.. code-block:: pycon
+
+  >>> from os import path    # グローバルネームスペースにpathが追加される
+  >>> path.join('/usr/', 'home/bucho/')
+  '/usr/home/bucho/'
+
+ファイル
+=======================
+
+ファイルの操作は ``ファイルオブジェクト`` を介して行います。
+
+読み込み
+--------
+
+open関数にファイルパスを渡し、読み込み用ファイルオブジェクトを作成します。
+
+.. code-block:: pycon
+
+  >>> fin = open("test.txt")
+  >>> fin.read()
+  'hello world\ngoodbye world'
+  >>> fin.close()
+
+読み込み2
+----------------
+
+for文で行ごとの取得ができます。
+
+.. code-block:: pycon
+
+  >>> fin = open("test.txt")
+  >>> linenum = 0
+  >>> for line in fin:
+  ...     linenum += 1
+  ...     print "%d: %s" % (linenum, line),
+  ...
+  1: hello world
+  2: goodbye world
+  >>> fin.close()
+
+書き込み
+--------
+
+ファイルに書き込みをするには、open関数の2つめの引数に"w"を渡し、書き込み用のファイルオブジェクトを作成します。
+
+.. code-block:: pycon
+
+  >>> fout = open("test.txt", "w")
+  >>> out.write("hello world")
+  >>> fout.close()
+
+file-likeオブジェクト
+---------------------
+
+fileオブジェクトのように扱えるオブジェクトは、まとめてfile-likeオブジェクト呼ばれています。
+
+StringIO.StringIOなどがよく使われます。
+
+

File pyfes-201207/_sources/appendix1.txt

+===============================================
+Appendix: パッケージ管理ツール
+===============================================
+
+Pythonにもサードパーティ製パッケージのリポジトリがあります
+
+http://pypi.python.org/
+
+ここに登録されているパッケージは、パッケージ管理ツールを使って簡単にインストールすることができます。
+
+Pythonのパッケージ管理ツールはいくつか種類がありますが、今回はeasy_installを利用してみます。
+
+
+インストール
+===========================
+
+以下のページからdistributeソースを入手します。
+
+http://pypi.python.org/pypi/distribute/
+
+アーカイブはほぼ最下段にあります。
+
+ダウンロード、解凍が完了したら、distributeのディレクトリに入り、以下のコマンドでインストールします。
+
+.. code-block:: pycon
+
+    $ python setup.py install
+
+Mac, linuxの場合はsudoで実行するのを忘れないようにしてください。
+
+easy_installを使ってみる
+=======================================
+
+試しにipythonをインストールしてみます。
+
+ipythonは高機能なPython対話シェルです。標準のPython対話シェルに比べて補完や多色表示、行番号表示などの便利機能が多数搭載されています。
+
+.. code-block:: pycon
+
+    $ easy_install ipython
+
+例によってMac, linuxの方はsudoを忘れないようにしてください。
+
+これだけでインストールは完了です。ターミナル(コマンドプロンプト)上でipythonと入力してipythonが起動できるか確認してみましょう。

File pyfes-201207/_sources/appendix2.txt

+========================================================
+Appendix: Pythonのコーディングスタイル
+========================================================
+
+PEP8
+==========
+
+Pythonでは、推奨されるコーディングスタイルがPEP8に定義されています。
+
+もちろん、あくまで推奨なので、必ず守らなくてはいけないものではありませんが、読みやすいPythonコードを書くために是非とも覚えておいてください。
+
+    http://oldriver.org/python/pep-0008j.html
+
+pep8パッケージを使うと、コードがpep8に準拠しているかどうかチェックすることができます。
+
+    http://pypi.python.org/pypi/pep8
+
+PEP257
+=================
+
+Pythonには"docstring(ドキュメンテーション文字列)"という仕組みがあります。
+
+PEP257は、docstringの推奨される書き方についてのPEPです。
+
+    http://www.python.org/dev/peps/pep-0257/
+
+

File pyfes-201207/_sources/basic.txt

+=======================
+基本編
+=======================
+
+
+Hello World!
+=======================
+
+ターミナル(コマンドプロンプト)を起動して、 ``python`` と入力して実行すればPythonが対話モードで起動します。
+
+``>>>`` が標準のpythonインタプリタのプロンプトです。 [#]_
+
+.. code-block:: pycon
+
+  $ python
+  >>> print "Hello World!"
+  Hello World!
+
+printはpython3から式になります。python2.6からは互換性のため、文でも式でも書けるようになっています。
+
+.. code-block:: pycon
+
+    >>> print("hello world")
+
+.. [#] ipythonなど、>>>でないインタプリタもありますが、やっぱりpythonといえば>>>ですね。
+
+スクリプトファイル
+============================
+
+スクリプトファイルは、拡張子.pyで作成します。
+
+hello.py::
+
+    # -*- coding: utf-8 -*-
+
+    print "hello world."
+
+先頭のcoding: utf-8という記述は、スクリプトファイルのエンコーディングを指定するものです。スクリプト内で日本語を扱うときは必ず指定するようにしてください。
+
+.. code-block:: pycon
+
+    $ python hello.py
+    hello world.
+
+演算
+===============
+
+.. code-block:: pycon
+
+  >>> 1 + 2
+  3
+  >>> 2 * 2
+  4
+
+pythonでは整数同士の割り算の結果は整数に丸められてしまうので注意してください。
+
+いずれか一方が小数であれば小数で計算されます。
+
+.. code-block:: pycon
+
+  >>> 5 / 2
+  2
+  >>> 10 / 3.0
+  3.3333333333333333
+
+加減乗除算に加えて、自乗(**)と剰余(%)が利用できます。
+
+.. code-block:: pycon
+
+  >>> 5 % 2
+  1
+  >>> 2 ** 4
+  16
+
+文字列結合は ``+`` です。更に文字列には ``*`` も使えます。
+
+.. code-block:: pycon
+
+  >>> 'ryo' + 'aita'
+  'ryoaita'
+  >>> 'feiz,' * 10
+  'feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,feiz,'
+
+比較演算
+============
+
+比較演算子は ``==``, ``!=``, ``<=`` などがあります。結果として真偽値が返されます
+
+.. code-block:: pycon
+
+  >>> 2 * 3 == 6
+  True
+  >>> 2 != 2
+  False
+
+論理演算
+============
+
+論理演算は ``and`` ``or`` ``not`` が利用できます。
+
+.. code-block:: pycon
+
+  >>> 1 and 2   # 1が真なので2が結果
+  2
+  >>> 0 and 1   # 0が偽なので1は評価されない
+  0
+  >>> 0 or 1    # 0が偽なので1が評価される
+  1
+
+変数
+=======================
+
+pythonでは変数は代入した時点で自動的に作成されます。事前に宣言しておく必要はありません。
+
+.. code-block:: pycon
+
+  >>> bucho
+  NameError
+  >>> bucho = 'show'
+  >>> bucho
+  'show'
+
+コメント
+=========================
+
+#の後ろはコメントになります。
+
+.. code-block:: pycon
+
+    >>> # コメント
+
+複数行コメントの構文はありませんが、複数行文字列で代替できます。
+
+.. code-block:: python
+
+    """コメント
+    コメント
+    コメント
+    """
+
+データ型(1)
+=======================
+
+整数, 小数
+----------------
+
+.. code-block:: pycon
+
+  >>> 1234
+  1234
+  >>> 3.14
+  3.14
+
+
+真偽値
+--------
+
+.. code-block:: pycon
+
+  >>> True
+  True
+  >>> False
+  False
+
+文字列
+------
+
+文字列は ``'`` か ``"`` で囲みます。二つに差はありません。
+
+.. code-block:: pycon
+
+  >>> 'Good morning, Feiz!'
+  'Good morning, Feiz!'
+
+文字列に改行を含めるには、 改行文字``\n`` を使うか、三連の(ダブル)クオーテーションで囲みます。
+
+.. code-block:: pycon
+
+  >>> print 'Feiz!\nGood Bye!!'
+  Feiz!
+  Good Bye!!
+
+  >>> print """Azuma
+  ... Kenta"""
+  Azuma
+  Kenta
+
+エスケープシーケンス(``\``)をそのまま表示するには、 ``\\`` とニ連続で書くか、raw文字列を使います。
+
+raw文字列は、クオーテーションの前に``r``をつけて表します。
+
+.. code-block:: pycon
+
+  >>> print 'Feiz!\nFeeeeeeiz!!'  # 何もしない場合改行して表示される
+  Feiz!
+  Feeeeeeiz!!
+
+  >>> print 'Feiz!\\nFeeeeeiz!!'  # 2連続で書く場合
+  Feiz!\nFeeeeeiz!!
+
+  >>> print r'Feiz!\nGood Bye!!' # raw文字列を使う場合
+  Feiz!\nGood Bye!!
+
+クォーテーションの前にuをつけるとUnicode文字列になります。
+
+.. code-block:: pycon
+
+    >>> u"あずま"
+    u'\u3042\u305a\u307e'
+
+
+データ型(2)
+===========
+
+リスト
+------
+
+順序を持った値の集合です。型が混在しても問題ありません。
+
+.. code-block:: pycon
+
+  >>> mylist = [1, 'aita', True]
+  >>> mylist
+  [1, 'aita', True]
+
+インデックスは0から始まります。
+
+.. code-block:: pycon
+
+  >>> mylist[1]
+  'aita'
+
+インデックスに負の整数を指定すると、リストの終端から値が取り出せます。
+
+.. code-block:: pycon
+
+  >>> mylist[-1]
+  True
+
+``in`` 演算子を使うと、ある値がリストの中に存在しているか調べられます。
+
+.. code-block:: pycon
+
+  >>> 'aita' in mylist
+  True
+  >>> 4 in mylist
+  False
+
+``range`` 関数を使うと数値のリストが簡単に作れます。
+
+.. code-block:: pycon
+
+    >>> range(5)
+    [0, 1, 2, 3, 4]
+    >>> range(3, 10, 2)
+    [3, 5, 7, 9]
+
+タプル
+------
+
+値を変更できない集合です。値を変更できない以外の特性はリストと同様です。
+
+.. code-block:: pycon
+
+  >>> mytuple = (1, 2)
+  (1, 2)
+  >>> mytuple[0] = 3  # エラー
+  TypeError
+
+1要素のタプルを作るときは、後ろにカンマを入れるのを忘れないようにしましょう。
+
+.. code-block:: pycon
+
+  >>> (1)  # ただの「1」になってしまう
+  1
+  >>> (1,)
+  (1, )
+
+スライス
+----------
+
+リストやタプルや文字列の特定の範囲を切り出すことができます。
+
+.. code-block:: pycon
+
+  >>> [1,2,3,4,5][:3]  # 先頭から添字3の一つ前まで
+  [1, 2, 3]
+  >>> 'Azuma Kenta'[3:]  # 添字3から末尾まで
+  'ma Kenta'
+  >>> [1,2,3,4,5,6,7,8,9,10][1:-1:2]  # 3つ目を指定するとN個飛びで値を取り出せます。
+  [2, 4, 6, 8,]
+
+
+データ型(3)
+===========
+
+辞書
+----
+
+添え字に文字列や数値、オブジェクトを使用できる集合です。
+
+.. code-block:: pycon
+
+  >>> {'a': 10, 'b': 20}
+   {'a': 10, 'b': 20}
+  >>> {'a': 10, 'b': 20}['a']
+  10
+  >>> {'a': 10, 'b': 20}['b']
+  20
+  >>> {1: 10, 2: 20}[1]
+  >>> 20
+
+
+None
+----
+
+Noneは何もないことを表すのに使われます。
+
+.. code-block:: pycon
+
+  >>> None
+
+フォーマット文字列
+========================
+
+Cのprintfのように、文字列に外から値を入れ込むことができます。
+
+値を入れ込みたい場所に、値の型に応じたフォーマット文字列を入れておきます
+
+.. code-block:: pycon
+
+  >>> fmt_string = 'feiz is %d years old.'  # 年齢を入れる部分を%dに置き換えている
+
+値を入れるには、 ``%`` 演算子を使います。
+
+.. code-block:: pycon
+
+  >>> print fmt_string % 24
+  feiz is 24 years old.
+
+複数の値を入れる場合は、リストやタプルにします。
+
+.. code-block:: pycon
+
+  >>> '%s is %d years old' % ('aita', 24,)
+  'aita is 24 years old'
+
+また、リストやタプルの代わりに辞書を使うことも出来ます。渡した辞書のキーに対応する部分に値が入ります。
+
+.. code-block:: pycon
+
+  >>> '%(name)s told me to install %(product)s' % {'name': "bucho", 'product': "bumblebee",}
+  'bucho told me to install bumblebee'

File pyfes-201207/_sources/index.txt

+===============================================
+Python Developers Festa 2012.07 ハンズオン 初級
+===============================================
+
+講師
+====
+
+* `@tokibito`_
+* `@feiz`_
+* `@ryoaita`_
+
+.. _`@tokibito`: http://twitter.com/tokibito
+.. _`@feiz`: http://twitter.com/feiz
+.. _`@ryoaita`: http://twitter.com/ryoaita
+
+このドキュメントについて
+========================
+
+このドキュメントは、Python Developers Festa 2012.07のPythonハンズオン初級向けの資料です。
+
+このドキュメントのHTMLファイルはSphinxでビルドしています。bitbucketのリポジトリからソースファイルを入手することで、自分でビルドすることもできます。
+
+http://bitbucket.org/tokibito/pyfes-201207
+
+ハンズオンについて
+==================
+
+ハンズオンでは、時間を設けての資料の解説は行いません。各自でこのドキュメントを読み進めながら実際にコードを入力して動かしてください。
+
+わからないことがあれば、周りの人や講師に聞いてください。
+
+他の人から質問された場合は、わかる範囲で答えてあげてください。教えることで理解も進みます。わからない場合は遠慮せずに講師を呼んでください。
+
+また、資料の内容は結構な量なので、無理に時間内にやろうとせず、
+
+* 興味の有るところだけかいつまんでやる
+* 残りは家に帰ってやる
+* 残りは暇な時にやる
+
+など、自分のペースで進めていってください。
+
+目次
+====
+
+.. toctree::
+   :maxdepth: 2
+
+   install
+   reading_document
+   basic
+   statements
+   advanced
+   stdlibs
+   appendix1
+   appendix2
+   problem
+
+過去のハンズオン資料
+====================
+
+この資料は過去のハンズオン資料から抜粋、追記などをして作成しています。余裕があるなら過去の資料も参考にしてみると良いでしょう。
+
+* http://feiz.bitbucket.org/_build/html/index.html
+* http://tokibito.bitbucket.org/python-hackathon201011/index.html
+* http://dl.dropbox.com/u/283261/hack-a-thon-201007/docs/html/index.html

File pyfes-201207/_sources/install.txt

+Pythonのインストール
+====================
+
+このハンズオンではPython2.7系を推奨します。(Python3.x系ではありません)
+
+:入手先: http://www.python.org/download/
+
+Windowsの場合
+-------------
+
+1. インストーラ(Windows Installer)を使用してインストールします
+2. 環境変数のPathに、PythonをインストールしたディレクトリとScriptsディレクトリを追加します
+
+   :WindowsXPの場合: **マイコンピュータ** の右クリックメニューの **[プロパティ]** の **[詳細設定]** タブの **[環境変数]** から設定できます。
+   :Windows7の場合: **コントロールパネル** -> **[システムとセキュリティ]** -> **[システム]** -> **[システムの詳細設定](左ペイン)** -> **[環境変数]** から設定できます。
+
+MacOSXの場合
+------------
+
+OSX10.5以上であれば、Pythonがインストールされています。
+
+それ以前のバージョン、または最新版を利用する場合は、MacPortsでインストールしたりMacPythonをダウンロードしてインストールしてください。
+
+Ubuntuの場合
+------------
+
+Ubuntu12.04であれば、最初からPython2.7がインストールされています。

File pyfes-201207/_sources/problem.txt

+課題
+====
+
+課題は順番にこなす必要はありません。面白そうだと思った課題にチャレンジしてみてください。
+
+もちろんこれ以外に自分で課題を持っているならば、それをやってみるのも良いでしょう。
+
+socketモジュールを使ってネットワーク通信
+----------------------------------------
+
+1. socketモジュールを使って足し算を行うサーバを作成してください
+
+   telnetコマンドで次のように ``整数+整数`` のように送信すると足し算の結果を返すサーバを作成してください。
+
+   ::
+
+      $ telnet localhost 5000
+      Trying 127.0.0.1...
+      Connected to debian02.
+      Escape character is '^]'.
+      10+20
+      30
+      123+456
+      579
+
+.. hint::
+
+   1. socketモジュールのドキュメントの例を参考に、サーバ側で受け取ったテキストを改行位置で分割します("10+20"というデータになります)
+   2. 分割したテキストの一つ目の要素を ``+`` でさらに分割します("10"と"20"のデータになります)
+   3. 分割したテキストを数値に変換し、足しあわせて、結果を送信します
+
+   http://www.python.jp/doc/release/library/socket.html
+
+2. socketモジュールを使って、1.で作成したサーバにデータを送信して、結果を取得して画面に表示するプログラムを作成してください
+
+   引数を渡して実行すると結果を返してくれるようにしてみてください
+
+   ::
+
+      $ python add.py 10+20
+      30
+
+.. hint::
+
+   sysモジュールのargvでコマンドライン引数を取得することができます。
+
+   http://www.python.jp/doc/release/library/sys.html
+
+sqlite3モジュールを使ってデータベース作成
+-----------------------------------------
+
+1. sqlite3モジュールを使って、引数で与えられた品名と金額をデータベースに保存するプログラムを作成してください
+
+   ::
+
+     $ python inputdb.py みかん 50
+     $ python inputdb.py りんご 100
+     $ python inputdb.py バナナ 200
+
+.. hint::
+
+   sysモジュールのargvでコマンドライン引数を取得することができます。
+
+   http://www.python.jp/doc/release/library/sys.html
+
+   sqlite3モジュールでsqlite3のデータベースを操作することができます。
+
+   http://www.python.jp/doc/release/library/sqlite3.html
+
+   :テーブルを作成するSQL: ``CREATE TABLE items (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, cost INTEGER);``
+   :データを挿入するSQL: ``INSERT INTO items(name, cost) VALUES("みかん", 50);``
+
+2. 1で作成したデータベースの内容を一覧表示するプログラムを作成してください
+
+   ::
+
+     $ python listdb.py
+     みかん 50円
+     りんご 100円
+     バナナ 200円
+
+.. hint::
+
+   :データを取得するSQL: ``SELECT name, cost FROM items;``
+
+3. 引数から入力された金額以上の品物名とその品物の金額を表示してください
+
+   ::
+
+     $ python filter.py 100
+     100円以上の品物は、
+     りんご 100円
+     バナナ 200円
+
+.. hint::
+
+   :データを取得するSQL: ``SELECT name, cost FROM items WHERE cost >= 100;``
+
+csvモジュールを使ってCSVファイルの読み込みとデータ集計
+------------------------------------------------------
+
+次に示すCSVファイルは、果物屋の品物の売上レポートのデータです。
+
+**items.csv**:
+
+::
+
+  2012/06/01,りんご,2,100
+  2012/06/01,みかん,10,40
+  2012/06/02,りんご,3,100
+  2012/06/02,バナナ,3,200
+  2012/06/03,りんご,4,120
+  2012/06/03,みかん,5,50
+  2012/06/04,みかん,5,60
+  2012/06/04,バナナ,4,150
+  2012/06/05,りんご,1,100
+  2012/06/05,みかん,10,50
+
+1列目は日付、2列目は品物名、3列目は販売した個数、4列目はその日の品物の1個あたりの価格です。ファイルの文字コードはShiftJIS(CP932)です。
+
+1. csvモジュールを使ってCSVファイルを読み込み、各品物ごとに合計の数を計算し、画面に表示するプログラムを作成してください
+
+   ::
+
+     $ python item_report.py
+     りんご 10個
+     みかん 30個
+     バナナ 7個
+
+.. hint::
+
+   csvモジュール
+
+   http://www.python.jp/doc/release/library/csv.html
+
+2. csvモジュールを使ってCSVファイルを読み込み、日付ごとの売上金額を計算し、画面に表示するプログラムを作成してください
+
+   ::
+
+     $ python report.py
+     2012/06/01 600円
+     2012/06/02 900円
+     2012/06/03 730円
+     2012/06/04 900円
+     2012/06/05 600円

File pyfes-201207/_sources/reading_document.txt

+==================================
+標準ドキュメントを活用しよう
+==================================
+
+pythonは標準ドキュメントが非常に充実しています(しかも和訳済み!)。ぜひとも使いこなしましょう。
+
+
+* `Python ドキュメント`_
+
+.. _`Python ドキュメント`:  http://www.python.jp/doc/release/
+
+
+1. チュートリアル
+--------------------------------
+
+pythonドキュメントに付いているチュートリアルは非常にわかりやすくて丁寧です。(それこそこの資料なんていらないぐらいに:P)
+
+    http://www.python.jp/doc/release/tutorial/index.html
+
+2. ライブラリリファレンス
+--------------------------------
+
+非常によく使うページです。
+
+pythonに組み込まれている全ての標準ライブラリのドキュメントがあります。
+
+自分が使いたいと思ったライブラリのドキュメント以外にも、「組み込み関数」「組み込み型」の項はぜひとも読んでおくことをお勧めします。
+
+    http://www.python.jp/doc/release/library/index.html
+
+
+3. 言語仕様
+----------------------------
+
+より細かな言語仕様が知りたい人は読むとよいでしょう。
+
+どんな文法が使えるのか知りたい場合は、真ん中あたりの「単純文」「複合文」のあたりを読むと詳細に書かれています。
+
+    http://www.python.jp/doc/release/reference/index.html
+
+4. HOWTO
+----------------------------
+
+よくある課題(ロギング、ソート、正規表現etc)についての良い解決方法が雑多に詰められています。
+
+目次だけでも目を通しておくと、いつかきっと役立ちます。
+
+    http://www.python.jp/doc/release/howto/index.html

File pyfes-201207/_sources/statements.txt

+=======================
+制御構造
+=======================
+
+インデント
+----------
+
+Pythonではインデントに文法としての意味があります。多くの言語における{}にあたる構造を、インデントが揃った部分として表現します。
+
+一般的にはスペース4つでのインデントがよく使われます。
+
+.. code-block:: python
+
+    if x:
+        print x
+        print "fe"
+
+    if x:
+    print x # 文法エラー
+
+if
+------------
+
+.. code-block:: pycon
+
+  >>> x = 20
+  >>> if x == 20:
+  ...     print 'x equals 20!'
+  ... elif x > 20:
+  ...     print 'x larger than 20!'
+  ... else:
+  ...     print 'x smaller than 20!'
+
+ifの条件式部分には、カッコはあってもなくても構いません。不要な場合は書かないのがPythonらしい書き方です:)
+
+for
+---
+
+Pythonの ``for`` 文はリストやタプルの要素を順番に反復処理します。
+
+.. code-block:: pycon
+
+  >>> for x in range(3):
+  ...     print 'x = %d' % x
+  ...
+  x = 0
+  x = 1
+  x = 2
+
+``for`` 文に ``else`` 節を付けると、反復が終了した後に実行される処理を書くことができます。
+
+ただしbreakなどでループを途中で抜けた場合、else節は実行されません。
+
+.. code-block:: pycon
+
+  >>> for x in range(3):
+  ...     print 'x = %d' % x
+  ... else:
+  ...      print 'done'
+  ...
+  x = 0
+  x = 1
+  x = 2
+  done
+
+while
+----------
+
+.. code-block:: pycon
+
+  >>> x = 0
+  >>> while x < 10:
+  ...     print x,
+  ...     x += 1
+  0 1 2 3 4 5 6 7 8 9
+
+whileにもelse節が記述できます。forとは違って、whileのブロックが一度も実行されなかった場合にのみelse節のコードが実行されます。
+
+.. code-block:: pycon
+
+    >>> while False:
+    ...     print 1
+    ... else:
+    ...     print 2
+    2
+
+
+with
+-----
+
+with文は処理の終了後に必ず実行したい処理を纏めて定義することのできる構文です。
+
+ファイルオブジェクトなど、いくつかの組み込みオブジェクトは標準でwithに対応しています。
+
+.. code-block:: python
+
+    with open('xxx.txt') as f:
+        print f.read()
+
+本来openしたファイルオブジェクトはcloseメソッドを呼び出して閉じないといけませんが、with文を使えばwithブロックを抜けた時点で自動的にcloseが呼び出されます。
+
+独自にwithでの処理を定義することもできます。標準パッケージのcontextlibを使うと、簡単に記述することができます。
+
+try
+-------
+
+``try`` 節の中でエラーが発生した場合の処理を、 ``except`` 節で記述することができます。
+
+.. code-block:: pycon
+
+  >>> try:
+  ...     1 / 0  # ゼロ除算エラーが発生するコード
+  ... except:
+  ...     print "zero devide error"
+  
+``except`` に処理するエラー型を指定することで、特定のエラー専用の例外処理を書くこともできます。
+何も指定しない場合は、あらゆるエラーが処理されます。
+
+  >>> try:
+  ...     f()    # 何かの計算をする関数
+  ... except NameError:
+  ...     print "name error"
+  ... except ValueError:
+  ...     print "value error"
+  ... except ZeroDivisionError:
+  ...     print "zero devide error"
+  ... except:
+  ...     print "other error"
+
+``finally`` 節を記述すると、``try`` 節の中でエラーが発生してもしなくても、必ず実行される処理を書くことができます。
+
+.. code-block:: pycon
+
+  >>> myfile = open('torumemo.txt')
+  >>> try:
+ ...     ...
+ ... finally:
+ ...     myfile.close()

File pyfes-201207/_sources/stdlibs.txt

+========================================
+標準モジュール
+========================================
+
+Pythonには標準で多数のモジュールが同梱されています。あまりに数が多いため全て把握するのは大変ですが、有用なモジュールを押さえておけば開発効率は飛躍的にアップします。
+
+os
+========
+
+:document: http://www.python.jp/doc/release/library/os.html
+
+ファイルとディレクトリを扱うモジュールです。色々な機能がありますが、特に使用頻度の高い関数を紹介します。
+
+* os.path - ファイルパスをいじくる
+
+
+joinでファイルパスを繋げます。
++演算子やフォーマット文字列を使った結合と違い、不正なパスが生成されません。
+
+.. code-block:: pycon
+
+    >>> import os
+    >>> path = os.path.join('/home/bucho', 'show.jpg')
+    >>> print path
+    /home/bucho/show.jpg
+
+
+    >>> dir = '/home/bucho'
+    >>> name = 'show.jpg'
+    >>> path = dir + name
+    >>> print path
+    /home/buchoshow.jpg  # 意図しないパスになってしまう
+
+existsでファイル/ディレクトリの存在チェックを行えます。
+
+.. code-block:: pycon
+
+    >>> os.path.exists(path)
+    True
+
+dirnameでディレクトリパスが得られます
+
+.. code-block:: pycon
+
+    >>> os.path.dirname(path)
+    '/home/bucho'
+
+splitextでパスを拡張子とそれ以外に分割できます
+
+.. code-block:: pycon
+
+    >>> name, ext = os.path.splitext(path)
+    >>> print name
+    /home/bucho/show
+    >>> print ext
+    .jpg
+
+* os.walk - ファイルとディレクトリの一覧を得る
+
+検索対象パスを指定してos.walkを呼び出すと、検索パス, パスに含まれるフォルダ名のリスト, パスに含まれるファイル名のリストの3要素タプルを生成するジェネレータが返ります。
+最初に渡した検索パス以下のすべてのファイル/フォルダが再帰的に検索されます。
+
+.. code-block:: pycon
+
+    >>> import os
+    >>> for path, folders, files in os.walk('/home/bucho'):
+    ...     for file in files:
+    ...         print path + file
+    ...
+    ...
+    /home/bucho/daisuki.3gp
+    /home/bucho/hagesii.wmv
+    /home/bucho/tof.jpg
+    /home/bucho/wozozo.bmp
+    /home/bucho/.ero/show.jpg
+    /home/bucho/.ero/hide/show.jpg
+
+re
+====
+
+:document: http://www.python.jp/doc/release/library/re.html
+
+正規表現を扱うモジュールです。
+
+正規表現内ではバックスラッシュが頻出するため、raw文字列(r'')を使って記述するのが良いでしょう。
+
+正規表現にマッチするとMatchObjectが返ります。
+
+.. code-block:: pycon
+
+    >>> import re
+    >>> match_obj = re.search(r'(\d+)$', 'aita255')
+    >>> print match_obj.group(1)
+    255
+
+何度もマッチングを繰り返す場合は、コンパイル済み正規表現オブジェクトを使うことで負荷を軽減することも出来ます。
+
+.. code-block:: pycon
+
+    >>> compiled = re.compile(r'(\d+)$')
+    >>> compiled.search(...
+
+pdb
+===
+
+:document: http://www.python.jp/doc/release/library/pdb.html
+
+pythonのデバッガです。
+
+set_traceを実行すると、コードの実行を途中で停止し、デバッグ用のプロンプトが表示されます。実際に動作している時のコードの状態を確認できるため、非常に有用です。
+
+.. code-block:: pycon
+
+    >>> import pdb;pdb.set_trace()
+    >>> if xxx == yyy:
+    ...     zzz = True
+    ...
+
+上記のコード例の1行目が実行されると、実行が一旦停止されてpdbのプロンプトが表示されます。
+
+プロンプト上では通常のインタプリタと同じようにコードを実行できるほか、停止させている実行を1行分進める/実行中のコードを表示する/強制終了するなどの操作が行えます。
+
+:n: 実行を1行分だけ進めます。
+:c: pdbを終了し、スクリプトの実行を再開します。
+:q: スクリプトの実行を強制的に終了します。
+:s: 実行しようとしている関数の内部に進みます。
+
+datetime
+========
+
+:document: http://www.python.jp/doc/release/library/datetime.html
+
+日付と時刻のデータを扱うモジュールです。
+
+.. code-block:: pycon
+
+    >>> from datetime import datetime
+    >>> datetime.now()
+    datetime.datetime(2011, 10, 15, 9, 41, 00, 000000)
+
+    >>> gantan = datetime(2012, 1, 1, 0, 0, 0)
+    >>> gantan.year
+    2012
+
+日付のみを扱うdateもあります。
+
+.. code-block:: pycon
+
+    >>> from datetime import date
+    >>> date.today()
+    datetime.date(2011, 10, 15)
+
+
+timedeltaを使うと、日付/時間の加減算ができます。
+
+.. code-block:: pycon
+
+    >>> from datetime import datetime, timedelta
+    >>> dt = datetime.now()
+    >>> dt
+    datetime.datetime(2011, 10, 15, 9, 41, 00, 000000)
+    >>> dt + timedelta(days=3)
+    datetime.datetime(2011, 10, 18, 9, 41, 00, 000000)
+
+
+random
+======
+
+:document: http://www.python.jp/doc/release/library/random.html
+
+乱数を生成します。
+
+random関数は0〜1の範囲の小数をランダムに返します。
+
+.. code-block:: pycon
+
+    >>> import random
+    >>> random.random()
+    0.6130030617573102
+    >>> random.random()
+    0.038878091500788026
+
+randint関数は第一引数**以上**、第二引数**以下**の整数値をランダムに返します。
+
+.. code-block:: pycon
+
+    >>> random.randint(1, 10)
+    6
+    >>> random.randint(1, 10)
+    3
+    >>> random.randint(1, 10)
+    1
+    >>> random.randint(1, 10)
+    8
+    >>> random.randint(1, 10)
+    10
+
+urllib, urllib2
+===============
+
+:document: http://www.python.jp/doc/release/library/urllib2.html , http://www.python.jp/doc/release/library/urllib.html
+
+URLを開くモジュールです。2.x系ではurllibとurllib2が混在していますが、urllib2の方が色々と優れているため、こちらを利用するのがよいでしょう。
+
+urllib2.urlopenに対象URLを渡して呼び出すと、コンテンツが格納されたfile-like objectが返ります。
+
+.. code-block:: pycon
+
+    >>> import urllib2
+    >>> result = urllib2.urlopen('http://www.beproud.jp/')
+    >>> print result.read()  # file-like objectなのでreadで読み出します。
+    <!DOCTYPE html>
+    <html>
+        <head>
+            <title>HOME | 株式会社ビープラウド</title>
+            <meta http-equiv="Content-Language" content="ja" />
+            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+            <meta name="description" content="株式会社ビープラウド Be PROUD [IT High Technology &amp; Human Centric Company]" />
+            ...
+
+
+urlopenのdata引数にapplication/x-www-form-urlencoded形式の文字列を渡すと、POSTリクエストとなります。
+
+app...endoced形式の文字列は、urllib.urlencode関数で簡単に生成することができます。
+
+.. tip::
+
+    urlencode関数は**urllib**モジュールの関数です。
+
+.. code-block:: pycon
+
+    >>> import urllib, urllib2
+    >>> post_data = urllib.urlencode({
+            'name': 'spam',
+        })
+    >>> result = urllib2.urlopen('http://aita.jp/tabetai/', data=post_data)
+
+
+エラーはHTTPError例外としてraiseされます
+
+.. code-block:: pycon
+
+    >>> result = urllib2.urlopen('http://www.beproud.jp/bucho.ero')
+    HTTPError: HTTP Error 404: Not Found
+
+openerオブジェクトを作成し、ハンドラの設定を行うことで様々な形式でのリクエストが可能です。
+
+.. code-block:: pycon
+
+    >>> # ベーシック認証のハンドラを追加します
+    >>> basic_auth = urllib2.HTTPBasicAuthHandler("Bucho's secret folder", "http://www.beproud.jp/bucho.ero/", 'bucho', 'show')
+    >>> opener = urllib2.build_opener(basic_auth)
+    >>> result = opener.open('http://www.beproud.jp/bucho.ero/')
+
+json
+====
+
+:document: http://www.python.jp/doc/release/library/json.html
+
+
+jsonを扱うモジュールです。urllib2との組み合わせで使われることが多いかと思います。
+
+json.loadsにjson文字列を渡すと、Pythonのオブジェクトにマッピングされます。
+
+.. code-block:: pycon
+
+    >>> import json
+    >>> aita = json.loads('''{
+            "result": {
+                "organization": "BeProud inc",
+                "age": 24,
+                "name": "aita",
+                "like": [
+                    "onigiri",
+                    "hamburger",
+                    "gyudon",
+                    "oomori"
+                ]
+            }
+        }''')
+    >>> aita['result']['like']
+    [u'onigiri', u'hamburger', u'gyudon', u'oomori']
+
+
+json.dumpsにリストや辞書オブジェクトを渡すとjson文字列を返してくれます。
+
+.. code-block:: pycon
+
+    >>> json.dumps({
+            'result': {
+                'name': 'aita',
+                'organization': 'BeProud inc',
+                'age': 24,
+                'like': ['onigiri', 'hamburger', 'gyudon', 'oomori']
+            }
+        })
+    '{"result": {"organization": "BeProud inc", "age": 24, "name": "aita", "like": ["onigiri", "hamburger", "gyudon", "oomori"]}}'

File pyfes-201207/_static/ajax-loader.gif

Added
New image

File pyfes-201207/_static/alert_info_32.png

Added
New image

File pyfes-201207/_static/alert_warning_32.png

Added
New image

File pyfes-201207/_static/basic.css

+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+    clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+    width: 100%;
+    font-size: 90%;
+}
+
+div.related h3 {
+    display: none;
+}
+
+div.related ul {
+    margin: 0;
+    padding: 0 0 0 10px;
+    list-style: none;
+}
+
+div.related li {
+    display: inline;
+}
+
+div.related li.right {
+    float: right;
+    margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+    padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+    float: left;
+    width: 230px;
+    margin-left: -100%;
+    font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+    list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+    margin-left: 20px;
+    list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+    margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+    border: 1px solid #98dbcc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+    width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+    width: 30px;
+}
+
+img {
+    border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+    margin: 10px 0 0 20px;
+    padding: 0;
+}
+
+ul.search li {
+    padding: 5px 0 5px 20px;
+    background-image: url(file.png);
+    background-repeat: no-repeat;
+    background-position: 0 7px;
+}
+
+ul.search li a {
+    font-weight: bold;
+}
+
+ul.search li div.context {
+    color: #888;
+    margin: 2px 0 0 30px;
+    text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+    font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+    width: 90%;
+}
+
+table.contentstable p.biglink {
+    line-height: 150%;
+}
+
+a.biglink {
+    font-size: 1.3em;
+}
+
+span.linkdescr {
+    font-style: italic;
+    padding-top: 5px;
+    font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+    width: 100%;
+}
+
+table.indextable td {
+    text-align: left;
+    vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+    height: 10px;
+}
+
+table.indextable tr.cap {
+    margin-top: 10px;
+    background-color: #f2f2f2;
+}
+
+img.toggler {
+    margin-right: 3px;
+    margin-top: 3px;
+    cursor: pointer;
+}
+
+div.modindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+    border-top: 1px solid #ddd;
+    border-bottom: 1px solid #ddd;
+    margin: 1em 0 1em 0;
+    padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+div.body p.caption {
+    text-align: inherit;
+}
+
+div.body td {
+    text-align: left;
+}
+
+.field-list ul {
+    padding-left: 1em;
+}
+
+.first {
+    margin-top: 0 !important;
+}
+
+p.rubric {
+    margin-top: 30px;
+    font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+    clear: left;
+    float: left;
+    margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+    clear: right;
+    float: right;
+    margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+    text-align: left;
+}
+
+.align-center {
+    text-align: center;
+}
+
+.align-right {
+    text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+    margin: 0 0 0.5em 1em;
+    border: 1px solid #ddb;
+    padding: 7px 7px 0 7px;
+    background-color: #ffe;
+    width: 40%;
+    float: right;
+}
+
+p.sidebar-title {
+    font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+    border: 1px solid #ccc;
+    padding: 7px 7px 0 7px;
+    margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+    font-size: 1.1em;
+    font-weight: bold;
+    margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    padding: 7px;
+}
+
+div.admonition dt {
+    font-weight: bold;
+}
+
+div.admonition dl {
+    margin-bottom: 0;
+}
+
+p.admonition-title {
+    margin: 0px 10px 5px 0px;
+    font-weight: bold;
+}
+
+div.body p.centered {
+    text-align: center;
+    margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+    border: 0;
+    border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+    padding: 1px 8px 1px 5px;
+    border-top: 0;
+    border-left: 0;
+    border-right: 0;
+    border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+    border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+    border: 0 !important;
+}
+
+th {
+    text-align: left;
+    padding-right: 5px;
+}
+
+table.citation {
+    border-left: solid 1px gray;
+    margin-left: 1px;
+}
+
+table.citation td {
+    border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+    list-style: decimal;
+}
+
+ol.loweralpha {
+    list-style: lower-alpha;
+}
+
+ol.upperalpha {
+    list-style: upper-alpha;
+}
+
+ol.lowerroman {
+    list-style: lower-roman;
+}
+
+ol.upperroman {
+    list-style: upper-roman;
+}
+
+dl {
+    margin-bottom: 15px;
+}
+
+dd p {
+    margin-top: 0px;
+}
+
+dd ul, dd table {
+    margin-bottom: 10px;
+}
+
+dd {
+    margin-top: 3px;
+    margin-bottom: 10px;
+    margin-left: 30px;
+}
+
+dt:target, .highlighted {
+    background-color: #fbe54e;
+}
+
+dl.glossary dt {
+    font-weight: bold;
+    font-size: 1.1em;
+}
+
+.field-list ul {
+    margin: 0;
+    padding-left: 1em;
+}
+
+.field-list p {
+    margin: 0;
+}
+
+.refcount {
+    color: #060;
+}
+
+.optional {
+    font-size: 1.3em;
+}
+
+.versionmodified {
+    font-style: italic;
+}
+
+.system-message {
+    background-color: #fda;
+    padding: 5px;
+    border: 3px solid red;
+}
+
+.footnote:target  {
+    background-color: #ffa;
+}
+
+.line-block {
+    display: block;
+    margin-top: 1em;
+    margin-bottom: 1em;
+}
+
+.line-block .line-block {
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+    font-family: sans-serif;
+}
+
+.accelerator {
+    text-decoration: underline;
+}
+
+.classifier {
+    font-style: oblique;
+}
+
+abbr, acronym {
+    border-bottom: dotted 1px;
+    cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+    overflow: auto;
+    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
+}
+
+td.linenos pre {
+    padding: 5px 0px;
+    border: 0;
+    background-color: transparent;
+    color: #aaa;
+}
+
+table.highlighttable {
+    margin-left: 0.5em;
+}
+
+table.highlighttable td {
+    padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+    background-color: transparent;
+    font-weight: bold;
+    font-size: 1.2em;
+}
+
+tt.descclassname {
+    background-color: transparent;
+}
+
+tt.xref, a tt {
+    background-color: transparent;
+    font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+    background-color: transparent;
+}
+
+.viewcode-link {
+    float: right;
+}
+
+.viewcode-back {
+    float: right;
+    font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+    margin: -1px -10px;
+    padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+    vertical-align: middle;
+}
+
+div.body div.math p {
+    text-align: center;
+}
+
+span.eqno {
+    float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+    div.document,
+    div.documentwrapper,
+    div.bodywrapper {
+        margin: 0 !important;
+        width: 100%;
+    }
+
+    div.sphinxsidebar,
+    div.related,
+    div.footer,
+    #top-link {
+        display: none;
+    }
+}

File pyfes-201207/_static/bg-page.png

Added
New image

File pyfes-201207/_static/bullet_orange.png

Added
New image

File pyfes-201207/_static/comment-bright.png

Added
New image

File pyfes-201207/_static/comment-close.png

Added
New image

File pyfes-201207/_static/comment.png

Added
New image

File pyfes-201207/_static/doctools.js

+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+    "profile", "profileEnd"];
+  window.console = {};
+  for (var i = 0; i < names.length; ++i)
+    window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+  return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+  if (typeof s == 'undefined')
+    s = document.location.search;
+  var parts = s.substr(s.indexOf('?') + 1).split('&');
+  var result = {};
+  for (var i = 0; i < parts.length; i++) {
+    var tmp = parts[i].split('=', 2);
+    var key = jQuery.urldecode(tmp[0]);
+    var value = jQuery.urldecode(tmp[1]);
+    if (key in result)
+      result[key].push(value);
+    else
+      result[key] = [value];
+  }
+  return result;
+};
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i] == item)
+      return true;
+  }
+  return false;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+  function highlight(node) {
+    if (node.nodeType == 3) {