Memo Life

ビギナーSEのメモ書き

【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によるスマホアプリバックエンドの実装】

Yuichi Nakazawa氏、Kazuhiko Kakita氏

メモとれていない

Djangoアプリケーションパフォーマンスチューニング】

Hiroki KIYOHARA氏

Pycon2014 django performance

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プロジェクトと連携可能

リファクタリングツールあれこれ(May the force be with you】

tell k氏
メモとれていない

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)

【Python】PyCharm3.4でKivyの開発環境設定をする

こんばんわ。

最近少し気になっているKivyの開発についてメモを残します。

先日PyCharmのパーソナルライセンスを購入しました。

せっかく素晴らしいIDEが使えるようになったのだから、KivyもPyCharmでやってみたいのです。

さっそく設定リファレンスを見つけたのですが・・・
Setting Up Kivy with various popular IDE's · kivy/kivy Wiki · GitHub

どうやらリファレンスに載っているPyCharmのバージョンが古いようです。

そこで、PyCharm3.4.1での設定手順を記録として残しておきたいと思います。

1. Kivyのダウンロード
以下のページより、Kivyをダウンロードする。
Kivy: Cross-platform Python Framework for NUI Development
2014/08/15現在「Kivy-1.8.0-py2.7-win32.zip」を選択。

2. ダウンロードしたファイルを解凍し、適当なフォルダに配置
私はいつもソースを配置している場所に解凍して、配置
(C:\sourceの直下)

3.コマンドプロンプトを管理者権限で開き、[2.]のフォルダに移動。

【Tips】
「プログラムとファイルの検索」にcmdを入力し、Ctrl+Shiftを押しながらEnterキーを押すと管理者権限で開かれるので面倒くさい人はこの方法が良いかと。


4.以下のコマンドを実行し、kivy.batのシンボリックリンクを作成する

mklink python.bat kivy.bat


5.PyCharmを起動し、[File]->[Settings]を押下

6.「Project Interpreter」という項目を探し出す
f:id:nata_water:20140815202936p:plain

7.「Project Interpreter」画面の右上あたりのギアマークをクリックし「Add Local」をクリック
f:id:nata_water:20140815203034p:plain

8.[4.]で作成したシンボリックリンクpython.bat」を選択し、OKボタンを押下

9.もう一度「Project Interpreter」画面の右上あたりのギアマークをクリックし「Add Local」をクリック

10.[2.]のフォルダに配置したKivyフォルダに存在するPythonインタプリタを指定

C:\source\kivy-1.8.0-py2.7-win32というフォルダに配置のであれば
C:\source\kivy-1.8.0-py2.7-win32\Python27\python.exeを指定する

11.[File]->[New Project]より、プロジェクトを新規作成する
このとき「Project Interpreter」には[4.]で作成した「python.bat」を指定する
 f:id:nata_water:20140815203640p:plain

12.プロジェクト作成が終わったら、main.pyファイルを作成し、以下の内容を記述する

from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()

13.「Run」で実行し、以下のようなウィンドウが表示されたら設定完了
f:id:nata_water:20140815203916p:plain


PyCharm3.4.1でのKivyの設定は以上となります。


コード補完もきっちり動いています
f:id:nata_water:20140815205946p:plain

Surface Pro3購入した

購入概要

Surface Pro3が先日、ついに日本でも発売されました。

こちらの発表の動画を見てから、本体の薄さやカッコよさに惹かれて、購入を決意。

Microsoft Surface Pro 3 Launch Event (NYC, May 20 ...


Surface Pro3本体及びタイプカバー(の箱)
f:id:nata_water:20140719090540j:plain

タイプカバーのカラーは青
f:id:nata_water:20140719090826j:plain

モデルは、Core i7/256GBを選択。

個人的な感想

Surface Pro3のいまいちな点
・本体右上部あたりの放熱が激しい
・動画等、見ているとファン(?)の音が聞こえる

慣れればどうにかなるデメリット
・タイプカバーではタイピングしづらい
(キー1つ1つは大きいが、別のキーにあたってしまうことがしばしば)
・ペンを収納する部分(タイプカバー)がギチギチ(無理に押し込んでいる感じがある)

今のところ、上記以外については非常に満足している状況です。

昨日、実際に通勤時間帯にタブレットとして利用してみました。

極端な満員電車でない限り、片腕で支えて、Web閲覧(※1)・PDF閲覧可能だというのが私の感想です。
(昨日はタイプカバーがある状態で利用したため、少し重かった)

(※1.スマホテザリングを有効にし、Surface Pro3から対象のアクセスポイントに接続)

なんとなくベンチマークソフトを使ってみる

ベンチマークソフトは、ドラクエXのものを利用


f:id:nata_water:20140719091530p:plain

ベンチマーク設定
グラフィック設定:標準品質
解像度:1280x720
表示方法:ウィンドウ

結果:普通
スコア:4635

「標準的な動作が見込めます。グラフィック設定や解像度を少し下げると、快適に動作すると思われます。」

ドラクエXはプレイしたことがないのですが、Surface Pro3でも普通にプレイできるということですかね。
ただし、ベンチマーク中には本体右上部から「サーッ」という、ファン(?)の音がぼちぼち聞こえており、放熱もあったように思います。


Minecraftをプレイする

特にストレスなくプレイできます。
f:id:nata_water:20140719092731p:plain

しかし、例によってファンの音が非常に気になります。
自宅でプレイする分には良いかもしれないですが、
外出先(電車の中等、他の人がいるところ)だと、難しいかもしれません。


Surface Pro3を購入してやりたかったことを列挙

Django開発環境のセットアップ
Cygwinのインストール
Vimインストール
・PyCharmのインストール
・Kivyの導入

持ち運びに便利な端末で、どこでもプログラミングできるような理想な形になりそうで、わくわくしています。

【python勉強】03.名前空間、クラス、オブジェクトについて

Python名前空間の前提

名前空間は「名前」からオブジェクトへの対応づけのことを表す。
ほとんどの場合、Pythonの辞書として実装されている。

f:id:nata_water:20140429192229p:plain


名前空間の寿命

様々な時点で名前空間が作成され、寿命もさまざまである。
 

名前空間

イベント

アクション

組み込みの名前空間

Pythonインタプリタ起動
Pythonインタプリタ終了

名前空間作成
名前空間削除

グローバル名前空間(モジュール)

モジュール定義読み込み

グローバル名前空間作成

関数のローカル名前空間

関数呼び出し時
関数戻り、関数内例外
関数内未処理

名前空間作成
名前空間削除
(Python名前空間を忘れる、
といった表現が適切かもしれない)

インタプリタのトップレベルで実行された文は?
スクリプトファイルから読みだされたものでも、対話的に読みだされたものでも、
__main__という名前のモジュールの一部分であるとみなされるため、
「独自の名前空間」を持つことになる。

スコープ(scope)

ある名前空間が直接アクセスできるようなPythonプログラムのテキスト上の領域。
→直接アクセス可能とは、修飾無しに、hoge.nataでなく、nataのように名前を
 参照した際に、その名前空間から名前を見つけようと試みることを意味する。

スコープは、静的に「決定」されるが、動的に「使用」される。

  • 最初に探索される最も内側のスコープは、ローカルの名前を持っている
  • 外側の(enclosing)関数のスコープは近い方から順に検索され、ローカルでもグローバルでもない名前を持っている
  • 次のスコープは、現在のモジュールのグローバルな名前を持っている
  • 一番外側(最後に探索される)スコープはビルトイン名を持っている。

例:local_valueを見つけるためにはどんな動きをするのか?
f:id:nata_water:20140429192232p:plain

※global文を利用することで、特定の変数がグローバルスコープにあることを示すことが可能

クラス

クラス定義に入ると、新たな名前空間が作成され、ローカルな名前空間として使われる。
したがって、ローカルな変数に対する全ての代入は、この新たな名前空間に入る。
f:id:nata_water:20140429192236p:plain

データ属性でないインスタンス属性(メソッドオブジェクト)が参照された時は、
そのクラスが検索される(図:クラスオブジェクトMyClass)

その名称が、有効なクラス属性を表している「関数オブジェクト」ならば、

インスタンスオブジェクト と ②見つかった「関数オブジェクト」を
抽象オブジェクト(図:メソッドオブジェクトmyfunc)
すなわち、メソッドオブジェクトにパックして作成される。


参照リファレンス:
http://docs.python.jp/2/tutorial/classes.html#python

【python勉強】02.モジュールメモ

モジュールとはなんぞや

モジュールとは、python定義や文が入ったファイル。

具体的には?

あるディレクトリにmodフォルダを作り
その中に、mymod.pyというファイルを作成したとする

mod
|
| mymod.py
|
| __init__.py
|
handle
| base.py

このときmodフォルダをパッケージ、mymod.pyがモジュールとなる。
__init__.pyは、modディレクトリがパッケージとして何らかのモジュールを含んでいることを示す。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# mymod.py

def lesson():
    return "Let's enjoy the Python Programing"

if __name__ == '__main__':
    lesson()

パッケージ内のモジュールはimport文で別のモジュールから利用できる

#!/usr/bin/python
# -*- coding: utf-8 -*-
# base.py
from mod.mymod import *

lesson() #=> Let's enjoy the Python Programing

パッケージ内のすべてのモジュールをインポートする書き方は避ける

#!/usr/bin/python
# -*- coding: utf-8 -*-
# base.py (improve)

from mod.mymod import lesson
lesson() #=> Let's enjoy the...

【python勉強】01.データ構造メモ(タプル、リスト、ハッシュ)

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

mat = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
        ]

print ([[row[i] for row in mat] for i in [0, 1, 2]])

list(zip(*mat))

del(mat[0])
print mat

# リストと文字列には、インデックスやスライスなど、共通の性質がたくさんある
# 標準的なシーケンスデータ型がもうひとつ存在。
# タプル

t = 12345, 54321, 'Hello'
print t

# 入れ子にできる
u = t, (1, 2, 3, 4, 5)
print u


# 連想配列
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
print tel
print tel['guido']

print list(tel.keys())
print 'jack' in tel

print [x + "aho" for x in tel]


# dicコンストラクタ キー:値ペアを作成
d = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])

print sorted(d.values())

# 辞書内包を利用すれば、キーと値を与える任意の式からディクショナリを生成可能
print {x: x*2 for x in (2, 4, 6)}

# 簡単な文字の場合、キーワード引数 dictのコンストラクタで
# 作成した方が楽
print dict(a="b", b="c", c="d")

# いわば、連想配列のアンパック
# itemsメソッドの便利さについて
for name, number in tel.items():
    print name, number

# enumerateを利用すると位置インデックスと対応した値を取得可能
for idx, name in enumerate(tel):
    print idx, name

# zip関数は2つ以上のシーケンスに対して同時にループをかけるときに便利
questions = ['Name', 'Quest', 'Favorite Color']
answers = ['Tany', 'RPGVXAce', 'Orange']

for q, a in zip(questions, answers):
    print('What is your {0}? It is {1}.'.format(q, a))


# ソート順ループ
print ("---sorted---")
for name in sorted(tel):
    print name

# 同じシーケンス型を持つオブジェクトと比較できる
print("---tupple---")
print (1, 2, 3) < (1, 2, 4)

# リストとタプルの比較は?
print('---list_and_tupple---')
print [1, 2, 3] < (1, 2, 3)

【Djangoメモ】ビュー内でrenderしたものをテンプレートで表示する

Djangoテンプレートタグ

<!-- include あるビューの中に別のビューを取り込んで表示する -->
{% include 'appname/anyview.html' %}

<!-- render等で、ビューから渡されたテンプレート変数の内容を表示する -->
{{ VARIABLE }}
#例:itemビューでItemモデルの全てのオブジェクトを取得し、itemテンプレートにオブジェクトのidをレンダリングする
# views.py
def item(self):
    items = Item.objects.all()
    return render(request, 'appname/item.html', {"items" : items})
<!-- appname/item.html内 -->
{% for item in items %}
    {{ item.id }}
{% endfor %}

staticファイルの参照

# settings.py
# タプルでローカルのディレクトリを指定
STATICFILES_DIRS = (
 '',
)

# テンプレート用HTMLの配置場所を指定する
TEMPLATE_DIRS = ''

TEMPLATE_DIRS/static/css
上記ディレクトリにbase.cssというCSSファイルを配置したとして・・・

テンプレートタグでbase.cssを参照するには以下のように記載する

<link href="stylesheet" href="{{ STATIC_URL }}css/base.css"/>

ディレクトリ構成

ローカルのディレクトリに、django_templatesフォルダを作成。
プロジェクト名(django-admin.py startproject project_name の project_name)のフォルダを作成
(ここをルートとする)

その配下に、アプリケーション名フォルダを作成。
さらにその下に、ビュー名.htmlといった形で、ファイルを作成する

local_dir
|_
  project_name
  |
  |__
     app_name
     |
     |_
       |_
         any_view.html