Hatena::Groupfukuoka-py

uchikoshi22.py

|

2011-10-14

hashlibモジュールことはじめ

17:49

文字列ハッシュ化をする必要性がでてきたので、サラッと調べてみました。


●セキュアハッシュとは...



Pythonハッシュ値を生成する

(例)ここでは「zuzuPost」という文字列ハッシュ値を生成します。

ドキュメントに沿って基本通りに

# Python 2.6を使っています。
# 文字列追加の為あえて、zuzuとPost部に分けてます。
>>> import hashlib
>>> hs = hashlib.sha224()
>>> hs.update("zuzu")
>>> hs.update("Post")
>>> hs.digest()
'\x97\n\x1f4\t\rG9\xcd\x9ev\r\xde#\xd2\xd9\\\x8b\x13\x9c\xd5\x1b&M\xb32\xad@'

②ちょっと短くしてみます。

>>> hashlib.sha224("zuzuPost").digest()
'\x97\n\x1f4\t\rG9\xcd\x9ev\r\xde#\xd2\xd9\\\x8b\x13\x9c\xd5\x1b&M\xb32\xad@'

SiingiSiingi2012/02/21 04:30A few years ago I'd have to pay seomone for this information.

lmpctcowvtlmpctcowvt2012/02/22 01:22M4vtnt , [url=http://chkfiackadod.com/]chkfiackadod[/url], [link=http://soutwzuuaaag.com/]soutwzuuaaag[/link], http://ayeohipdnmxl.com/

idtyshdzlidtyshdzl2012/02/29 02:55nTxvv8 <a href="http://goxnvflflfjl.com/">goxnvflflfjl</a>

2011-09-26

EmacsをPython用IDEとしてセットアップ

07:23

1. python-mode.elをインストール

ダウンロード先はこちら↓

https://launchpad.net/python-mode

$ wget http://launchpad.net/python-mode/trunk/6.0.2/+download/python-mode.el-6.0.2.tar.gz

$ tar zxvf python-mode.el-6.0.2.tar.gz

$ cd python-mode.el-6.0.2

$ cp python-mode.el $HOME/.emacs.d/

.emacsファイルに下記を追記

(add-to-list `load-path "~/.emacs.d/")
(require 'python-mode)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))


2. ipythonをインストール

$ sudo apt-get install ipython

$ wget http://ipython.scipy.org/dist/ipython.el

$ cp ipython.el $HOME/.emacs.d


3. ipython-mode.elをインストール

$ wget http://ipython.scipy.org/dist/ipython.el

$ cp ipython.el $HOME/.emacs.d/

.emacsファイルに下記を追記

(setq python-python-command "/usr/bin/ipython")
(require `ipython)

※注意

C-c !だと普通にPython Shellが起動するので、M-x python-shellを実行しないとemacs内でipythonは実行されません。

4. pylookupをインストール

$ apt-get install python2.6-doc


5. autopairをインストール

autopair.elをダウンロード

$ wget http://autopair.googlecode.com/svn/trunk/autopair.el

$ cp autopair.el > $HOME/.emacs.d/

.emacsファイルに下記を追記

(autoload 'autopair-global-mode "autopair" nil t)
(autopair-global-mode)

(add-hook 'python-mode-hook
          #'(lambda ()
              (push '(?' . ?')
                    (getf autopair-extra-pairs :code))
              (setq autopair-handle-action-fns
                    (list #'autopair-default-handle-action
                          #'autopair-python-triple-quote-action))))

6. pep8とpylintをインストール

$ sudo apt-get install pylint pep8

$ wget http://gist.github.com/raw/302847/3331473995b55cc578e7d63dd82474749367c29c/python-pep8.el

$ cp python-pep8.e. $HOME/.emacs.d/

$ wget http://gist.github.com/raw/302848/60961ad1134e7bec5d836857fb67109245548dad/python-pylint.el

$ cp python-pylint.el /home/zuzu/.emacs.d/

.emacsファイルに下記を追記

(require 'python-pep8)
(require 'python-pylint)
(add-hook 'before-save-hook 'delete-trailing-whitespace)

7. ipdbをインストール

$ sudo easy_install ipdb


8. Yasnippetインストール

$ wget http://yasnippet.googlecode.com/files/yasnippet-bundle-0.6.1c.el.tgz

$ tar zxvf yasnippet-bundle-0.6.1c.el.tgz

$ cp yasnippet-bundle.el $HOME/.emacs.d/

$ mkdir $HOME/.emacs.d/my-snippets

.emacsファイルに下記を追記

(require 'yasnippet-bundle)
(yas/initialize)
(yas/load-directory "~/.emacs.d/my-snippets/")

参考URL

Configuring Emacs as a Python IDE

JamKnorpJamKnorp2017/05/15 23:34Clavamox No Prescription Best Place To Buy Tretinoin 0.05 Stendra 50mg Erectile Dysfunction Exeter Orlistat By Mail Viagra Packstation <a href=http://byuvaigranonile.com>viagra</a> Direct Free Shipping Pyridium Buy Drugs Cash On Delivery Purchase Arava Levitra Prix Orodispersible

2011-09-14

複数行のCSVの書き込み

16:30

Pythonで複数行のCSVの書き込みをおさらいしておきます。


その前に、一行だけCSVに書きこむ方法も念の為メモ。

#!/usr/bin/env python

import csv

csvfile = "/tmp/spam.csv"
csvdata = ["spam", "eggs"]

writer = csv.writer(file(csvfile, 'w'))
writer.writerow(csvdata)

上のコードを実行すると、/tmp/spam.csvファイルの中身はこうなります。

spam,eggs




なので、複数行書きこむときはこうします。


#!/usr/bin/env python

import csv

csvdata = [ ["New Zealand", "Wellington"], ["Japan", "Tokyo"]  ]
csvfile = "/tmp/spam.csv"

writer = csv.writer(file(csvfile, 'w'))
for row in csvdata:
    writer.writerow(row)

これで、/tmp/spam.csvファイルの中身はこうなります。

New Zealand,Wellington

Japan,Tokyo

ChampChamp2011/10/07 17:14Thanks guys, I just about lost it lokonig for this.

oelbynoedzwoelbynoedzw2011/10/08 21:27hXfNNH <a href="http://ykuqwbsmlbgp.com/">ykuqwbsmlbgp</a>

mpyhsydnimpyhsydni2011/10/09 02:04BOxAHq , [url=http://cuxrgcrqrxwz.com/]cuxrgcrqrxwz[/url], [link=http://rrjngcygtuhx.com/]rrjngcygtuhx[/link], http://oggecvybrijj.com/

ywherzsvywherzsv2011/10/11 02:09nQAGrX <a href="http://tcwztfbupntp.com/">tcwztfbupntp</a>

hvtufpeobhvtufpeob2011/10/13 00:55ArlcC3 , [url=http://onftovqegusk.com/]onftovqegusk[/url], [link=http://tdlmexfcfuny.com/]tdlmexfcfuny[/link], http://dlaozvomfmhs.com/

2011-09-11

妥当な日付かどうかチェックする

17:00


GAEでdatastoreにputする前に日付が正しい値かどうかチェックしたくて、妥当な日付かどうかチェックする関数を調べてみました。


from datetime import date

def validate_date(y, m, d):
  try:
    date(int(y), int(m), int(d))
    return True
  excpet ValueEror:
    return False

次の方法ではうまくいきません。


from datetime import date

def validate_date(y, m, d):
  if date(int(y), int(m), int(d)):
    return True
  else:
    return False

日付が正しくなければdate関数はValueErrorを返します。

ValueErrorはBooleanではないので、誤った日付のときにFalseを返せず、if文で判定する前にエラーが発生するので最初のソースのように例外処理を行う必要があります。

リスト内包表記のおさらい

16:42

次のリスト内包表記を説明するためにPython初心者の読める冗長なコードにしてみました。


?単純な内包表記

>>> spam = [1,2,3,4,5]
>>> eggs = [x*2 for x in spam]
>>> spam
[1, 2, 3, 4, 5]
>>> eggs
[2, 4, 6, 8, 10]
>>>
# 上の内包表記と等価のlambda式
>>> eggs = map(lambda x: x*2, spam)
>>> eggs
[2, 4, 6, 8, 10]

?解説用の冗長なコード

>>> spam = [1,2,3,4,5]
>>> eggs = []
>>> count = 0
>>> while len(spam) > count:
...     x = spam[count]
...     eggs.append(x*2)
...     count += 1
...
>>> eggs
[2, 4, 6, 8, 10]

リスト内包表記やlambda式(+map関数)を使えるようになると便利なんですが、慣れるまで頭が右往左往していたので、久しぶりに整理してみました。

lambdaの最初の一歩

16:41

lambdaのイメージがすぐわからなくなってしまうので、一旦整理。

lambda式はdefステートメントと同様、関数関数オブジェクト)の作成に使用する手段の一つです。

(初めてのPythonの369ページ)

構文: lambda 引数: 式


ということで、

与えられた引数の2倍の値を戻す関数をlambda式とdefステートメントでつくります


?defステートメント

def double(spam):
  return spam * 2

?lambda式

lambda x: x * 2

defステートメントを使って呼び出すときは、関数名に引数を与えれることで戻り値を得ます。

>>> def double(spam):
...   return spam * 2
...
>>> double(2)
4
>>> double(10)
20


lambda式は関数名がないので、呼び出すときは一旦変数に代入してから呼び出すことでdefステートメントと同じような使い方ができます。


>>> lambda x: x * 2
<function <lambda> at 0xb77db56c>
>>> double = lambda x: x*2
>>> double(2)
4
>>> double(8)
16
>>>

自分ではlambda式のイメージが湧いたんですがどうでしょうか?

多次元リストのソート

13:51

多次元リストを手軽にソートする方法を練習してみました。


①まず、ソートする対象になるリストを作ります。

>>> list = [ [2, "d", "1100"], [7, "z", "10"], [0, "t"] ]
>>> list
[[2, 'd', '1100'], [7, 'z', '10'], [0, 't']]

②内側のリストの1個目の要素をもとにソートするだけであれば次のように簡単にソートできます。

>>> list.sort()
>>> list
[[0, 't'], [2, 'd', '1100'], [7, 'z', '10']]

③これが2番目以降の要素をもとにソートしようとするとほんのちょっとだけ面倒になります。

>>> list.sort(lambda x, y: cmp(x[1], y[1]))
>>> list
[[2, 'd', '1100'], [0, 't'], [7, 'z', '10']]

④注意点として、ソート対象にする内側のリストの中に、1つでもソート対象となる要素のない短いリストがあれば次のようにエラーになります。

>>> list.sort(lambda x, y: cmp(x[2], y[2]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
IndexError: list index out of range

⑤最後に、cmp関数を使った場合、文字列としてソートしてしまします。


数値としてソートする場合は、cmpの中のオブジェクトをint関数で囲んであげる必要があります。


※2行目と5行目を見比べてください。


>>> list = [[2,"d", "1100"],[7,"z","10"],[0,"t","120"]]
>>> list.sort(lambda x, y: cmp(x[2], y[2]))
>>> list
[[7, 'z', '10'], [2, 'd', '1100'], [0, 't', '120']]
>>> list.sort(lambda x, y: cmp(int(x[2]), int(y[2])))
>>> list
[[7, 'z', '10'], [0, 't', '120'], [2, 'd', '1100']]

Ubuntuのpyexiv2で画像Exif情報を読み取り

13:45

Ubuntu10.04で画像のExif情報を操作したい場合、いくつか方法がありますが、今回はpyexiv2を試してみました。


Ubuntu10.04環境では、パッケージが用意されているので、コマンド一発でインストールができます。

$ sudo apt-get install python-pyexiv2

インストールは簡単ですが、ここから注意が必要です。


pyexiv2のチュートリアル通りにやろうとすると、ImageMetadataメソッドを使うとき、ImageMetadataをインポートするときにエラーが出ます。




>>> metadata = pyexiv2.ImageMetadata('test.jpg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ImageMetadata'
>>>
>>> from pyexiv2 import ImageMetadata
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name ImageMetadata

そこで、pyexiv2のhelp (help(pyexiv2)で見れます)の中を見てみると、ImageMetadataの記述がどこにもないんですが、ImageMetadataを使わないでExifタグの一覧を表示する方法が書かれています。


Ubuntu上でうまくいかなかったチュートリアルの方法(WindowsXP上ではエラーはでませんでした)と、うまくいったhelpに書かれている手順の両方をメモしておきます。



// チュートリアルの手順 (ubuntuでは失敗しました)

>>> import pyexiv2
>>> metadata = pyexiv2.ImageMetadata('test.jpg')
>>> metadata.read()

// helpの手順 (ubuntuでも実行できました)
>>> import pyexiv2
>>> image = pyexiv2.Image('test/smiley.jpg')
>>> image.readMetadata()
>>> print image.exifKeys()


これでようやくスタートラインに立てました。


現在、画像のExif情報を扱う簡単な(アプリと呼ぶほど大きくもない)スクリプトを書いています。

Pythonのopen()関数の注意点

11:24

Pythonでファイルを作成しようと思って検索すると以下のようなosモジュールを使ったコードをよく見かけることになると思います。


import os
f = os.open('spam.txt', 'w')
f.write('')
f.close()

ところが、実際にこのコードを実行しようとすると、2行目の段階で次のエラーメッセージに直面します。

Traceback (most recent call last):

File "<stdin>", line 1, in <module>



このエラーが出ないようにしてPythonでファイルを作成するために2つの方法を紹介します。


  1. 組み込み関数のopen()を使う
  2. osモジュールの正しい使い方を覚える


1. 組み込み関数のopen()を使う

Pythonには組み込み関数のopen()があります。osモジュールの方がより詳細なファイルアクセスができますが、組み込み関数のopen()の方が簡単かつ、実行結果も早い(みたい)です。


組み込み関数open()を使ってファイルの新規作成をするには

# spam.txtとうファイルを作って、eggsという文字列を書き込みます。
>>> f = open('spam.txt', 'w')
>>> f.write('eggs')
>>> f.close()

もっと詳しいことを知りたいときは↓

http://docs.python.org/library/functions.html#open




2. osモジュールの正しい使い方を覚える

ここでは簡単にコードだけ紹介します。

詳細は↓のドキュメントをご確認ください。



>>> import os
>>> f = os.open('eggs.txt', os.O_CREAT)
>>> f = os.open('eggs.txt', os.O_RDWR)
>>> os.write(f, 'spam')
4
>>> os.close(f)

5行目に表示される数字の4ですが、これはos.write()で実際にファイルに書き込まれたデータのバイト数を返して表示しています。


osモジュールを使う注意点として、


import osをfrom os import *と書いてしまうと、組み込み関数のopen()よりもosモジュールのopen()が優先されて組み込み関数のopen()が使えなくなるので、組み込み関数のopen()を使う時はfrom os import *とは書かないようにしましょう。

HinesHines2011/10/06 20:32Kudos to you! I hadn't thoguht of that!

weoivpweoivp2011/10/07 02:38qTOAir <a href="http://nwsrnizbsrnp.com/">nwsrnizbsrnp</a>

paiyypwvpaiyypwv2011/10/07 21:09JTrjhm , [url=http://gaqcbloiwcic.com/]gaqcbloiwcic[/url], [link=http://szrplnghtifb.com/]szrplnghtifb[/link], http://pumzstfmdbjx.com/

sumtnxsumtnx2011/10/11 00:00Pg0z8x <a href="http://haocmyvcmyab.com/">haocmyvcmyab</a>

xccloupfatxccloupfat2011/10/12 22:14WUVaf9 , [url=http://vsdcxztdnfnw.com/]vsdcxztdnfnw[/url], [link=http://qgmnnximnmek.com/]qgmnnximnmek[/link], http://rztzkpwelkvo.com/

IoryIory2012/08/21 14:43Yup, that sohuld defo do the trick!

qhczvtwokpqqhczvtwokpq2012/08/22 12:47FLbvjo <a href="http://hlhmoevhtelv.com/">hlhmoevhtelv</a>

ndwyeskdkhndwyeskdkh2012/08/25 01:55P7Tams , [url=http://qwkxjwjmizib.com/]qwkxjwjmizib[/url], [link=http://bapdceiwwbaw.com/]bapdceiwwbaw[/link], http://sraioevuykwc.com/

2011-03-13

GAEアプリをKayで2か国語対応する練習

08:41

練習のために/gaeディレクトリにzzlab-toysという名前のプロジェクトを作り、そのプロジェクトにbillingualというアプリケーションを事前につくっています。


やっていることは<http://kay-docs-jp.shehas.net/tutorial.html:title=Kayチュートリアル>と同じです。


1。settings.pyのUSE_I18Nを有効にする。

AfterBefore
USE_I18N = TrueUSE_I18N = False


2. models.pyでlazy_gettextをインポートします。

lazy_gettextをインポートして、_ で利用できるようにしておきます。

from kay.i18n import lazy_gettext as _ 

3. 2か国語対応にしたいmodelの項目にverbose_nameを追加する。

ここでは、Categoryクラスのnameフィールドを2か国語対応することを事前に表していることを意味します。

AfterBefore
class Category(db.Model):

name = db.StringProperty(required=True, verbose_name=_(u'Name'))

class Category(db.Model):

name = db.StringProperty(required=True)

4. テンプレートファイル内の文字列を2か国語対応するためにtransタグを追加します。


AfterBefore
<p>{% trans %}Billingual{% endtrans %} - TEST</p> <p>BillingualTEST</p>



5. 2か国語対応させるために3と4でマーク(指定)した文字列を抽出します

$ python2.5 manage.py extract_messages -a

▼コマンドの実行結果

Running on Kay-1.0.0

Extracting from /gae/zzlab-toys/billingual

billingual/__init__.py

billingual/models.py

billingual/urls.py

billingual/views.py

billingual/templates/index.html

All done.


6. 日本語用のpoファイルを作成します

$ python manage.py add_translations -a -l ja

▼コマンドの実行結果

Running on Kay-1.0.0

/usr/local/src/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py:64: DeprecationWarning: the sha module is deprecated; use the hashlib module instead

import sha

/usr/local/src/google_appengine/google/appengine/tools/dev_appserver_login.py:33: DeprecationWarning: the md5 module is deprecated; use hashlib instead

import md5

Creating billingual/i18n/ja/LC_MESSAGES/messages.po.

Cant open file. Skipped billingual/i18n/jsmessages.pot.

Created catalog for ja

Cant open file. Skipped /home/ziruchi/0_code/gae/zzlab-toys/i18n/messages.pot.

Cant open file. Skipped /home/ziruchi/0_code/gae/zzlab-toys/i18n/jsmessages.pot.

Created catalog for ja


※ POファイルとは...

po ファイルとは国際化のメッセージ・ファイルで日本語用には ja.po という名称に割り当てられています。

参照: http://www.yk.rim.or.jp/~hi_saito/awk/japanize.html


7. poファイルに翻訳を追加します。

poファイルの場所 -> zzlab-toys/billingual/i18n/ja/LC_MESSAGES/messages.po

※ zzlab-toysは今回の練習用に作ったアプリケーション名です。

AfterBefore

#: billingual/models.py:9

msgid "Name"

msgstr "名前"


#: billingual/templates/index.html:8

msgid "Billingual"

msgstr "2か国語"

#: billingual/models.py:9

msgid "Name"

msgstr ""


#: billingual/templates/index.html:8

msgid "Billingual"

msgstr ""


8. 7で編集したpoファイルを有効にするために、poファイルをコンパイルします。

$ python2.5 manage.py compile_translations -a

▼コマンドの実行結果

Running on Kay-1.0.0

Compiling billingual/i18n

Compiling billingual/i18n/ja/LC_MESSAGES/messages.po

All done.

i18n folder missing

i18n folder missingとエラーとも見えるメッセージが出ますが、気にする必要はないようです。



9. コンパイル終了後に、アプリケーションにアクセスすると日本語がメイン言語になっているブラウザでは3と4でマークした箇所が7で編集したとおりの日本語表記になっています。



★余談。。。

私の環境(Ubuntu)ではGoogle Chromeブラウザ(通常のメインブラウザ)の言語は英語のみとして、上記の2か国語テスト用としてUbuntuのパッケージのChromium Web Browserの言語を日本語表記テスト用に使い分けています。

MrsbgMrsbg2012/08/19 09:35Very true! Makes a chngae to see someone spell it out like that. :)

cnyzvvitcnyzvvit2012/08/19 20:21HqO9xw <a href="http://cgvhoimczurw.com/">cgvhoimczurw</a>

dukbdwacidukbdwaci2012/08/21 19:37NYSg6I <a href="http://usdpssmoqqnz.com/">usdpssmoqqnz</a>

|