4/18日記

ふごー。サンプル見て、はじめて2to3つかってみた。
するするーっとw これは楽しいー。

(venv)linco@my-ubuntu:~$ 2to3 -w cop.py 
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored cop.py
--- cop.py	(original)
+++ cop.py	(refactored)
@@ -2,9 +2,9 @@
 # -*- coding: utf-8 -*-
 
 def div(a):
-	print u"Result :", a/2
+	print("Result :", a/2)
 
-num = raw_input("input any number :")
+num = input("input any number :")
 div(int(num))
 
 
RefactoringTool: Files that were modified:
RefactoringTool: cop.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

def div(a):
        print("Result :", a/2)

num = input("input any number :")
div(int(num))
  • -w オプションつけたら上書き、つけなかったら変更点を画面に出力

HerokuにPyramid アプリケーションをあげるとき悩んだので記録します。

<参考資料>

公式ドキュメント見て、先月やったPyramidチュートリアルのものをHerokuにあげようとしましたが、構成がちがうのでそのままだと、うまくいかなくて、なんだか時間がかかってしまいました。 それとnotfound_viewカスタマイズする場合の設定について。

step10とは以下のチュートリアルのソースです。
http://docs.pylonsproject.org/projects/pyramid_tutorials/en/latest/humans/creatingux/step10/index.html


scaffold使用しないでスクラッチで作った構成の場合です

準備

mkdir water
cd water
virtualenv --no-site-packages venv
source venv/bin/activate
pip install pyramid waitress
mkdir MyProject
cd MyProject

MyProjectの構成は以下

MyProject
∟ .gitignoreProcfilerequirements.txt
runapp.py
∟ step10
 ∟ __init__.py
 ∟ static
  ∟ favicon.ico
  ∟ global_layout.css
  ∟ global_layout.js
  ∟ notfound.jpg
 ∟ templates
  ∟ about.pt
  ∟ company.pt
  ∟ global_layout.pt
  ∟ index.pt
  ∟ macros.pt
  ∟ notfound.pt
  ∟ people.pt
 ∟ dummy_data.py
 ∟ layouts.py
 ∟ views.py

404エラー用のリダイレクトページ作成 notfound.pt

<div>
    <div>
        404 Not Found Custom Page
        <img src="/static/notfound.jpg"> 
    </div>
</div>

パッケージ配下に、__init__.pyの作成

from pyramid.config import Configurator
from pyramid.view import notfound_view_config
from pyramid.response import Response

@notfound_view_config(renderer='templates/notfound.pt')
def notfound(request):
    return {}

def main(global_config, **settings):
    
    config = Configurator(settings=settings)
    config.add_static_view(name='static', path='static')
    config.add_route('home', '/')
    config.scan()
    app = config.make_wsgi_app()
    return app
config.add_route('home', '/')に対応したviewはviews.pyに設定してあります。
ex.)
    @view_config(route_name='home',renderer="templates/index.pt")
    def index_view(self):
        return {"page_title": "Home"}

@notfound_view_confingデコレータを使えば簡単にカスタマイズページ設定できる

requirements.txt 作成

pip freeze > requirements.txt
※参考に
Chameleon==2.8.2
Mako==0.7.0
MarkupSafe==0.15
PasteDeploy==1.5.0
pyramid==1.3a9
pyramid-tm==0.4
repoze.lru==0.5
venusian==1.0a3
waitress==0.8.1
pyramid_fanstatic==0.3
zope.deprecation==3.5.1
zope.interface==3.8.0

実行ファイル runapp.py作成 

#!/usr/bin/env python
import os
from waitress import serve
import step10

host = '0.0.0.0'
port = int(os.environ.get('PORT', '5000'))

if __name__ == "__main__":
    app = step10.main({})
    serve(app, host=host, port=port)

ここでのポート5000はローカルで確認するときのもの。
runapp.pyのモジュール名は任意だけどProcfileとあわせてください。
一行目の記述がないと、デプロイに失敗します。

実行権限付与

chmod +x ./runapp.py

Procfile作成

echo "web: ./runapp.py" > Procfile

ローカルで実行

python ./runapp.py

ローカルで動作確認

http://localhost:5000/

.gitignore作成

Herokuへデプロイ 

git init .
git add .
git commit -m "initial commit"

heroku create pyramid-study --stack cedar 
git push heroku master

動作確認

heroku open

うまく行かないとき

  1. ログ見る heroku logs -t
  2. プロセス確認 heroku ps
    正常なとき
    Process  State      Command      
    -------  ---------  -----------  
    web.1    up for 3m  ./runapp.py  
    
    デプロイ失敗
    Process  State            Command      
    -------  ---------------  ----------- 
    web.1    crashed for 11s  ./runapp.py 
    
  3. リモートシェルに入って手がかり探す
    heroku run bash


pcreate -s starter MyProject など、
scaffold使用してプロジェクト作成したときは 公式の通りやればだいじょうぶです。
ちょっと変えたいと思ったときに、手こずるー。

それから、実は、2ヶ月くらいかけてCCライセンスのコンテンツで電子書籍作っていたのですが、手順が悪かったようで、お蔵入りしそうです。先にライセンスのことをしっかり念書とっておくべきでした。私が失敗が多いのは、考え方や組み立て方の問題かなと思い始めました。
たぶん今のままじゃ、何やってもうまくいかないのかなと。
コンテンツ作りはじめたとき、写真の使用を快諾してくださった方に申し訳ない気持ちです。
とてもうれしかったから余計。
正直、今何作りたいのか、わからなくなってきていますが、自分の実力とは別にこんなのあればなーと思っているものもあります。足りない部分はいっぱいあるのでこれからも、いろいろためしてみます。今後もよろしくお願いします。

愛って過去形はないのにな

今日は、Wifiと携帯忘れたから、Twitterしなかった。
帰ってからTLみたら、目が廻りそうだったから、こっちに書こう。

朝通勤のとき、おっきなディスプレイにあるアーティストの新曲紹介
「愛してた」って出た。

変な感じしたよ。
私は、愛に過去形はないと思う。
それ、愛じゃなかったんだよ。恋か、なんかじゃないかな。
恋は終わりがあるから。

歌に、つっかかるなよ、ってね。

エキスパートPythonプログラミング読書会 第二期 04

2012/03/13  at バリストライドグループ

三章入りました♪

<参考資料>

アナウンス

清水川さんから、開始前にアナウンス
3月は、Python イベントたくさんあります☆
  • 3/17 Python Developers Festa
  • 3/24 Python mini Hack-a-thon
  • 3/25 Sphinx+翻訳 Hack-a-thon
  • 3/27 ビープラウドさんからPython本が発売

そして、夏頃には、PyConJp!スタッフ募集中ですのとのこと。⇒ こちら

3/27発売の本はBPスタイルの開発の手法ノウハウが詰まった内容とか。
今までにないPython本ですね!とっても期待!!
Pyfesは申し込んでいましたが、今回不参加となりました。こちらも楽しそうでしたね。

アイスブレイク

はじめてお話した方もちらほら。
顔だけ見知っていて、Twitterアカウントと一致してない方、まだいるんですw


第三章 構文ベストプラクティス -クラスの世界-

  • 組み込み型を継承してサブクラス化する(たいてい組み込み型で事足りる)
  • ABC(抽象基底クラス)を利用する
    http://www.python.jp/doc/nightly/library/abc.html

Pythonの継承

  • 多重継承ができる
  • argには *つかったほうがいい。(親クラスと引数の数が違うときのための対策)
  • オーバーライド(サブクラスに定義したメソッドは、完全に上書きされる)
※同時に、オーバーロードの話もでました。Pythonでは、オーバーロードはできません。

Old-style-ClassとNew-style-Class

Old-style-Class
  • 2.2以前
  • Python3では、Old-style-Classは禁止
New-style-Class
  • 2.2以降
  • Objectを継承したクラス
  • 組み込み型を継承したクラス
  • 高機能

■object継承

Papaがいなかったので、Papaでw
>>> class Papa(object):
...     def occupation(self):
...         print "pg"
...     def hobby(self):
...         print "fishing"
... 
>>> class Son(Papa):
...     def occupation(self):
...         print "student"
...     def hobby(self):
...         super(Son, self).hobby() #新しい書き方、自分自身のインスタンスを渡す
...         print "play games"
... 
>>> 
>>> bob = Son()
>>> bob.hobby()
fishing
play games
>>>

Help on class Son in module __main__:

class Son(Papa)
 |  Method resolution order:
 |      Son
 |      Papa
 |      __builtin__.object
 |  
 |  Methods defined here:
 |  
 |  hobby(self)
 |  
 |  occupation(self)
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from Papa:
 |  
 |  __dict__
 |      dictionary for instance variables (if defined)
 |  
 |  __weakref__
 |      list of weak references to the object (if defined)
(END) 

■組み込み型継承

listとか、dictとか、継承して、いろいろ使えそうです。
>>> class MyList(list):
...     pass
... 
>>> 
>>> dir(MyList)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> 
>>> shoppinglist = MyList()
>>> shoppinglist.append("scan snap")
>>> shoppinglist.append("kindle")
>>> shoppinglist.append("rice")
>>> shoppinglist
['scan snap', 'kindle', 'rice']
>>> 
>>> shoppinglist.remove("scan snap")
>>> 
>>> MyList.__mro__
(<class '__main__.MyList'>, <type 'list'>, <type 'object'>)
>>> 

■ABC

サンプル⇒http://docs.python.org/library/collections.html#collections.deque
>>> import collections
>>> 
>>> class ListBasedSet(collections.Set):
...     def __init__(self, iterable):
...         self.elements = lst = []
...         for value in iterable:
...             if value not in lst:
...                 lst.append(value)
...     def __iter__(self):
...         return iter(self.elements)
...     def __contains__(self, value):
...         return value in self.elements
...     def __len__(self):
...         return len(self.elements)
... 
>>> s1 = ListBasedSet('abcdef')
>>> s2 = ListBasedSet('defghi')
>>> overlap = s1 & s2
>>> list(overlap)
['d', 'e', 'f']
>>> 
参考: help(ListBasedSet) 

メソッド解決順序(MRO Method Resolution Order)

Python2.3からC3線形化アルゴリズムに基づくMROが追加された。
実行時に、順序のリストをもとに、クラス属性の探索が行われる。
順番をちゃんと考えないと、どれがよばれてるかわかんないよね。
それをちゃんと整列させて、呼び出す。

superの落とし穴

今の書き方のほうが、めんどくさいのは⇒理由があります!

サブクラス化する前に、__mro__属性を調べよう!(104p参照)

>>> print ("MRO:" ,[x.__name__ for x in ClassName.__mro__])
とか、
>>> ClassName.__mro__
__mro__属性がなければ、Old-Style-Classってこと。superの利用は避ける

<メモ>

多重継承で、Old-style-Classと、New-style-Classが混在しているというのは、よくない
継承の使い過ぎは別のとこで破綻するのでやめたほうがいい
javaみたいに、super()に selfの他に、objectをわたすことも可能だけど...あまり使わないっぽい。

Python3使えば、問題なくなるので、Python3使いましょう!

けど、まだPython3対応してないのがある。
こちらで、チェック「PYTHON 3 WALL OF SHAME」⇒ http://python3wos.appspot.com/

Pythonのプロパティ

protected,private とか、python では、ルールでやっている
 外からさわらないでね、とか、そういうやつ。
ネームマングリング

Python Online Tutor

http://people.csail.mit.edu/pgbovine/python/
Pythonの動き、見れるよ。
実はずっと前、清水川さんがツイートしてたのチェックしてたw にゃはー。
でもそんとき、ちょっと使っただけで、愛用してなかった。うぐ。

LT

前に帰ってしまったのですが、どんなLTだったかはこちら。 
@michiyataさん 

@takanoryさん

@aodag さん
 wsgiについてのホワイトボードLT 見たかったー!!

@shomah4a さん
PyCon JP スタッフ募集
 


<エキPy二期 4回目の所感 >
New-Style-Class, Old-Style-Classって聞き慣れなくて、なんだろなんて思ってました。
うぐぐ、みんPyにもでてるじゃないかー。(みんPyは、やり終えたと言ってる手前...)
多重継承は、ややこしいことになりそうだし、やりたくない。
ABCより、組み込み型継承が易しい。
次回は、107,108P〜かなー。ディスクリプタ、プロパティ、メタクラス。
少しだけ、入ったけど、「ネームマングリング」って言葉がなんだか、かわいいな。
読書会の内容を、最近、後追いになっちゃってます....。
帰ってから、あのときの意味は、こうだったのかーと。
それから、他の、参加者の方のブログ見たいですー。
「classつかうのやめようよ!?」って@aodagさんが言われてたのはどういう意味なんだろう。Python1.xのときからって、すごいなー。
まだそこまで理解できない...。
あ、__getattr__と、__getattribute__ の違いの話もでてました。getattrはこれから調べます><

Python好きだよー。なんでかなw


エキPyチョコに対抗してオマケ

手芸ボランティアのこと

今日はそれぞれ、いろんな想いがあった一日。

わたしはこのごろ、自分のことでいっぱいで、誰かを思うということがあまりなかったようです。
自分のこと考えてしっかりすることはよいけれど、それはそれで、苦しいです。

そんな中、ラジオをつけていたら、被災地の方々に、おにぎりを作るボランティアをなさった方がでていてお話を聞いていたら、「あー、何も特別なことじゃなくても、やれることでいいんだな。 」って。 おにぎりって心遣いがうれしい。

私は10年ほど前から編み物ボランティアをやっています。
といっても、そんなに数多くできないです。
縫い物だと、季節関係なく、出来るけど、団体を探せなくて、自分で興すとかもできなくて、編み物ボランティアのシーズンが終わると、ただただ、何もしない毎日でした。

募金するとか、手伝いに行くとか、協力のカタチはいろいろあるけど、 自分がそんなに大変じゃなくて、やれることは、手芸です。
それで、ちゃんと探してみました。

横浜支援隊「ぽかぽか」というところを見つけました。
http://yokohamapokapoka.web.fc2.com/index.html

子供たちが学校へ行くときに使う布製品や、大人向けもあります。
あまり布で、作れるものがたくさんあります。
私はこどもの頃、大学生のボランティアのお姉さんが編んでくれた帽子をかぶっていたことがあります。姉とお揃いの帽子です。
とても気に入っていました。
私が作る、何かを誰かが、うれしいと思ってくれると私もうれしい。
このごろの強すぎる自分を正して、もう少し周りを思える人になりたいと思います。
年始に、こうなろうと思った自分とかけはなれすぎてる....反省。

今日は要望リストの中から、ティッシュケースをふたつ縫いました。(ポケット付き♪)週末の1時間つかうくらいで出来ます。

Share photos on twitter with Twitpic

手芸ボランティアに興味持ってもらえるといいなと思ってブログ書いてみました。

ブログ休業中

なにやらともだちと素地をつくりはじめた。

mod_wsgi3.3ではまったとこ

Python2.7.1 
mod_wsgi 3.3 
Mac OS X ProductVersion: 10.7.2 BuildVersion: 11C74
  • 文字コードエラー

    error.log
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 62: ordinal not in range(128)
    
    解決方法 ⇒ /Library/Python/2.7/site-packages/sitecustomize.pyの設置
    import sys
    sys.setdefaultencoding("utf-8")
    
  • Python2.7とmod_wsgi3.3の組み合わせ

    error.log
    mod_wsgi (pid=16761): Exception occurred processing WSGI script '  .....
    
    解決方法 ⇒ portsや、brewでなく、mod_wsgiをソースからコンパイルする
    ./configure --with-apxs=/usr/sbin/apxs --with-python=/usr/bin/python2.7 --disable-framework make
    
    sudo make install
    
    参考: http://starboarder2001.blogspot.com/2011/06/modwsgi-python27-apache2-on-osx-106.html

[WSGI ウェブプログラミング]115ページの5.14 のエラー処理のとこのディクショナリの使い方。(誤植 KeyError)
template.test_data = {} 
× ⇒ template.test_data['test_data_1', 'テストデータ1']
○ ⇒ template.test_data['test_data_1'] = 'テストデータ1'


bom
 .vimrc に set nobomb 
bomついてるか確認する 
⇒ vim -b filename 
 ^M とる (Windows CR+LF改行コード)
⇒ tr -d '\r' < filename > newfilename

ただの日記2012/02/08

  • Apacheのエラー消えた。
  • Cheetah使い始めた。

今やってること、金曜にはいったん終わりそう。
本格がズレ込んだから、少しの間、早く帰れるよ。
毎日Pythonさわれるのがいいね!

テンプレートエンジンもいろいろあるんだな。
まだ比較できてないし、特徴がつかめてない。
本にのってたのやってみてるよ。

これ、ひととおり終わっても、去年買った本と、ブックマークしてたのあるから当分材料に困らないねw

時々、こんな時間かかってる自分が恥ずかしいけど、
それでも、覚えたいから、続けるよ。

世の中で何がはやりとか、そんなのより、好きなのやるのがいいよ。
たぶん、好きじゃないと、続けられない。

Twitterでそんなたくさん、フォローしてないのに、今日TLで3人の方、誕生日だったみたい...。おめでとうございます。
お祝い事は、いいね。
周りでいいことあると、私もうれしい。




ただの日記2012/02/05

<PyDev>
  • 使ってみてる
    Eclipseプラグインじゃなくて、Aptana Studio3 で。
    Aptanaは使いやすいし、そんな重くは感じない。
    宣言モジュールに飛べるし、参照しやすい。
    コードアシストのせいで、覚えられないとまずいので何度か書いたあとに使ってみている。

  • 本見ながら、エディタで書く。エラーが出る。
    処理のイメージを持ちながら、また書いてみる、エラーが少なくなる。
    何度も書いてみる。エラーが出なくなる。
    休憩する。
    また書いてみる。
    PyDevで書いてみる。importモジュールについて調べてみる。

<vim>
vim-pep8いれた

<wsgi>
  • mod_wsgiやってみてるけど、client denied by server ... が出ている。
    ⇒ パーミッションが間違ってた。

    また平日の夜か、週末やろうー。
    WindowsかUbuntuで、まずやってみてもいいかもね。

    wsgiの本、賛否両論かもしんないけど、今の自分ここから。


これやったら、Djangoか、Pyramidやろう。
たぶん、前、チュートリアルやったときより、わかると思う。
明日は月曜。また、一週間スタート♪
おやすみー。

ただの日記2012/01/30

今日いい一日だった。
ほんとにいい日だった。

別に何もなかったんだけど。

日曜日に書いたコード、覚えてるかな、って書いてみたら、覚えてて、
すらすら書けた。何回でも書けた。
短いコードだけど。書いたら、覚えるんだな。
Pythonのコード、すらすら書けるようになるはず。続けてれば、私でも。

特別おいしいもの食べたわけでも、誰かにほめられたわけでも失敗したわけでもない。
あ、どっちかっていうと、ちょっとは失敗あったかも。

帰ってからの、一時間が、とても楽しかった。

あっという間の、一月終了。エンジンかかるの遅かったー。
あさって、席替えだなー。
って、学生でもないのに、なんか、ソワソワ。

About

名前:lincolinnyan

Recent Entries
Categories
    Tags
    Archives
    Search
    Twitter
    Others
    a