【PyCon2014JP】1日目の個人的振り返りメモ
【Keynote】
Kenneth Reitz氏
Python 2.7 and Python 3: A Sacred Love Story // Speaker Deck
・コミュニケーションの進化
→人間というハードは変わらないが、言語というソフトウェアはアップグレードされている。
大昔は1:1でのコミュニケーション。
印刷等のテクノロジーにより、1:多によるコミュニケーションが可能となり、
現在ではインターネットにより様々な考えの人が全く公平な立場で情報を発信する
多:多のコミュニケーションが可能となった。
(特定の企業に勤めながら、OSSプロジェクトで活動といった形で、世界中の人とのコラボレーションが可能)
・Pythonの将来を考えると不安
Python3系はいまいち広がっていない
Standard Libraryが壊れてしまっていたり。。
利用者数が少ないため、Python3.xのコアディベロッパーにフィードバックがなかったり。。
文字列問題があったり。。
Pythonの方向性(どなたかが質問)
→どのような方向で使っていくのかが明確ではない。
オフィシャルなストーリーが構成されていない
【Djangoアプリケーションパフォーマンスチューニング】
Hiroki KIYOHARA氏
・Django内部で発行されるSQL
ForeignKeyフィールドの値は、必要になった時点でその都度SQLを発行する
Model名.objects.all()で取得し、テンプレート側でForeignKeyフィールドを
使う場合、データ件数に応じてひたすら関連先のテーブルに対してクエリ発行してしまう
# models class Hoge(models.Model): foo = models.CharField(max_length=100) bar = models.CharField(max_length=100) author = models.ForeignKey(Author) class Author(models.Model): username = models.CharField(max_length=100) # views def hoge_list(request): hoge = Hoge.objects.all() return render_to_response('hoge.html', {'hoge':hoge}) #templates/ {% for h in hoge %} {{ h.foo }} {{ h.author.username }} {% comment %}ここでAuthorに対して、Hogeの数だけSQLを発行する {% endcomment %} {% endfor %}
# 以下を利用することで、関連先のオブジェクトも取得してくれるため、 # その都度SQLを発行することはなくなる。 Hoge.objects.select_related()
・RDBを知る、Djangoミドルウェアを知る
1.テーブル設計が大事:結局ボトルネックはRDB
2.インデックス
3.どんなクエリが発行されるのかを知っておく(debug-toolbarを有効活用するも良し)
・テストはFunkloadがいいかも
【Pythonの実装系総ざらい】
MASATO NAKAMURA氏
メモとれていない
【最新リリースCMSツール Plone5のモダンUIとテクノロジーの進化】
Manabu TERADA氏
ツールそれぞれに文化がある。
ツールを業務にあわせるのではなく、業務・ビジネスフローを変える勇気も必要。
→文化があわないならば使わない方がよい。
【PyCharm活用術】
Takayuki Shimizukawa氏
・機能豊富だが、突出したものはない。
・Geek的な面白味はない
・もともとvimを使っていて、PyCharmに切り替えたがこっちのが使いやすい
・JSのSyntax Checkもやってくれる(なんだこのツールは)
・メモリ消費は若干
*検索
Shiftキー2回で検索ボックスがでる
(ファイル名manage.pyなどを指定すると、PyCharmタスクを実行するボックスが出現)
*デバッグ
テンプレートのデバッグが可能(HTML内のテンプレートタグにブレークポイントを設定)
ブレーク条件も記述可
*コード整形も可能
*リモートサーバーにあるDjangoプロジェクトと連携可能
【Pythonを支える技術:ディスクリプタ編】
Nozomu Kaneko氏
Python を支える技術 ディスクリプタ編 // Speaker Deck
ディスクリプタ・・・属性アクセスをカスタマイズする機構
以下を定義したオブジェクトがディスクリプタとなる。
__get__
__set__
__delete__
・データディスクリプタ(__get__, __set__)
・非データディスクリプタ)(__get__)
・読み取り専用ディスクリプタ(__get__, __set__ ただし、__set__呼び出し時にAttributeErrorが送出)
プロパティとディスクリプタ
・プロパティ:そのクラスのインスタンスの属性アクセスをカスタマイズ
・ディスクリプタ:特定クラスとは独立して、属性アクセスをカスタマイズする
→ディスクリプタ ⊃ プロパティ か?
関数はディスクリプタ
obj.func(x) # ↓ func = type(obj).__dict__['func'] meth = func.__get__(obj, type(obj)) meth.__call__(x) # ↓ func(obj.x)