心魅 - cocoromi -

半角スペース時々全角

pythonの正規表現でマッチしたグループを参照する

python正規表現でマッチした部分の文字列を取得するにはmatchメソッドの戻り値のgroupメソッドを使います。

正規表現オブジェクトの生成とマッチング

reパッケージのcompile関数に正規表現を食わせると正規表現オブジェクトを生成できます。
この正規表現オブジェクトのmatchメソッドに検査したい文字列を突っ込むと結果が返ってきます。
マッチしない場合はNoneが返ってきます。

import re
matcher = re.compile( ".*function (.+) {" )
result = matcher.match( targetString )

マッチ部分の取得

上記の結果のオブジェクトのgroupメソッドを使うと、マッチ部分を取得することが出来ます。

import re
matcher = re.compile( "((.+)\t(.+))" )
result = matcher.match( "foo\tbar" )
print result.group(1) #foo
print result.group(2) #bar

groupsメソッドを使うとリストで取得することもできます。

まとめ

compileして
matchして
groupで取得

pythonのmakoでファイルからテンプレートを読む

pythonのテンプレートエンジンmakoでテンプレートをファイルから読み込むにはコンストラクタでキーワード引数を使います。

Djangoだとファイルから読むのが面倒だったからmakoに乗り換え。

ファイルからテンプレート読み込み

キーワードfilenameにテンプレートが記述されているファイルのパスを指定して、Templateオブジェクトを生成します。

from mako.template import Template
result = Template( filename=path ).render( { "foo" : "bar"} )

pythonでファイルのコピー・移動

pythonでファイル操作(not中身)をするときにはosパッケージかshutilパッケージを使います。

コピー

コピーはshutilパッケージで出来ます。


ex) ディレクトリをコピーする

import shutil
shutil.copytree( "dir1" , "dir2" )

shutilパッケージでは主にコピーと再帰的にディレクトリを処理するAPIを提供してくれます。

  • copyfile
  • copytree
  • rmtree

移動

移動はosパッケージに用意されています。

ex) ディレクトリ操作

import os
os.mkdir( "dir" )
os.rename( "dir" , "folder" )
os.remove( "folder" )

osパッケージではこれ以外にも細かいAPIまで用意されています

  • symlink
  • chown

まとめ

コピーはshutil
移動はos


で、なんで別れてるの?

付録

shutil.copy( src , dist )

@param src コピー元のファイルパス。ディレクトリはダメ。
@param dist コピー先のパス
srcからdistへコピー。distの挙動はcpコマンドと同じ。

shutil.copytree( src , dist )

@param src コピー元のディレクトリパス。ファイルはだめ。
@param dist コピー先のパス
だいたいcp -rと思えばOK

shutil.rmtree( target )

@param target 削除するディレクトリパス。ファイルはだめ。
rm -rfと思えばOK。

os.rename( src , dist )

@param src 移動・リネームするファイルパス
@param dist 処理先のパス
mvコマンド

gmWrapperのソースをgithubで公開しました

グリモンuserscriptをChromeに移植するときに使う、GM APIのラッパっぽいものとプロジェクトテンプレートを書いた - 心魅 〜 cocoromi 〜
上記のエントリーでアップしたChrome用のGreaseMonkeyラッパーのソースをgithubにupしました。

http://github.com/umezo/umezone/tree/master/chrome/gmWrapper/

経緯

そもそも今までzipで公開していたのには以下の理由がありました。

  • Chrome拡張の開発をWindowsでしか出来ないと思っていた
  • 誰も使わないと思っていた

ところが、この2点が両方ともつい先日、やぶられたのです。
そこで、自分の拡張開発環境をlinuxに移すと同時に公開することにしました。

既知のバグ

XHRでXMLドキュメントを取得すると、落ちます
なんか他にあったら教えてください。

opensocial-jqueryでリクエストをsigned requestにする方法

URLの後ろにsignedって付ける。
簡単。涙がでる。
参考文献:AjaxOAuth -
opensocial-jquery -

jQuery.ajax のリクエストに署名できます。jQuery.get や jQuery.post などのショートカットでもリクエストに署名できます。 -
OpenSocial jQuery is jQuery based concise JavaScript Library for rapid OpenSocial Apps development. - Google Project Hosting


送られてきたsignedリクエストが妥当であれば、少なくともいくつかのパラメータが改ざんされてないことが保証される。
と、俺は信じている。


これにより他人のユーザIDを指定して、データを盗んだり出来なくなる。

実際に使ったところ

※ここに出てくるJavascriptはかなり微妙です。まねしないように。(勝手にcmdとかいう属性作っちゃったりしてるところが。

クリックしたらデータ取ってきて、表示
コードを見て判るとおり、JSは至って普通のjQuery.getなんですが、
URLの末尾に空白を入れてsignedと付けると、ライブラリ側で空気を読んでくれます。


html

<a cmd="load_history" href="http://hogehoge/mogemoge/ signed" target="#history">load histry</a>
<div id="history"></div>


javascript

 43         load_history : function ( event ){
 44             event.preventDefault();
 45             var t = $( event.target );
 46             $.get( t.attr( "href" ) , function ( data ){
 47                 data = eval( "(" + data + ")" ) ;
 48
 49                 $( $(t).attr("target") + " tr.account" ).render( { account : data } );
 50             } , "json" );
 51         }

まとめ

opensocial-jqueryでsignedリクエストをしたいときはsignedをURLに付け足す。
男はだまって + " signed"

Djangoでリクエストを受け付けるようになるまでの手順概要

Django便利なんだけど、最初にやることが多すぎて覚えられないから、手順をメモる。


本家チュートリアルはこちらはじめての Django アプリ作成、その 1 — Django v1.0 documentation

  1. django-admin.py startprojectでプロジェクトを開始する
  2. settings.pyにDBの設定を書く
  3. manage.py startappでアプリケーションを開始する
  4. (optional)アプリディレクトリの下のmodels.pyにモデルを定義する
  5. (optional)モデルを定義したらmanage.py syncdb
  6. urls.pyにアクセス用のURLとその時に呼ばれる関数のマップを定義する
  7. views.pyに上で定義した関数を実装する
  8. (optional)manage.py runserver $(hostname):PORT で開発用サーバを起動する

pythonでソースファイルの絶対パスを取得する

注:python 2.6で動作確認しました。


pythonの事は良くわからない。だからどんなことでもメモしていく。


参考文献:6.2 os.path --
共通のパス名操作


アプリケーションを作っていると、とあるファイルからの相対パスで指定したくなることと言うのが良くある。
だから、良くアプリの設定にアプリケーションルートを設定したりするところがある。


でも、俺はそういうめんどくさいことはしたくない!!!!


良いじゃないか、設定ファイルがあるところそこがルートなんだよ!がたがた文句言うんじゃねぇ!


っというわけで、自動的にあるファイルの絶対パスを取得したりしたいんですよ?

pathモジュール

pythonにはos.pathという糞便利なモジュールがあってこいつと__file__という特殊な変数を使うとそのファイルが置いてあるディレクトリの絶対パスが取得できます。

きっと設定ファイルはconfとかいうディレクトリに入ってるからルートはその親だよね。

from os import path
APP_ROOT = path.dirname( path.abspath( __file__ ) ) + "../"

実際に使ったところ

djangoのMEDIA_ROOTって、サンプルとかチュートリアルとか読むと、絶対パスで書いてあるんだけど、それがすごく気持ち悪い。
良いジャンプロジェクトのなかのディレクトリで良いジャン?!


そんなわけでこんなコードになる。

 36 # Absolute path to the directory that holds media.
 37 # Example: "/home/media/media.lawrence.com/"
 38 from os import path
 39 MEDIA_ROOT = path.dirname( path.abspath( __file__ ) ) + "media"

pathモジュールの他のメソッド

関数なの?メソッドなの?


調べたついでにpathモジュールの便利そうなメソッドをメモする


他のが知りたかったら6.2 os.path --
共通のパス名操作
をみる。

abspath( SOME_PATH )

@return 文字列
引数に突っ込んだパスを絶対パスに変換してくれる。

dirname( SOME_PATH )

@return 文字列
引数に突っ込んだパスをディレクトリまでのパスに変換してくれる。
abspathとのコンボでよく使いそう。
絶対覚えたい。

exists( SOME_PATH )

@return 真偽値
SOME_PATHで表されるパスが存在するかどうか確かめる。

basename( SOME_PATH )

@return 文字列
SOME_PATHからファイル名の部分を抜き出してくる。
なにこれすごい。


Pythonのライブラリリファレンスってなんで戻り値の型が書いてないの?


まとめ

ファイルのパスに関する操作をしたかったらos.path。
男は黙って、from os import path。たぶん。


なんかすごいまずい間違があったら誰か突っ込んで。