Web屋さんのアレ

Python大好きなWeb屋のおじさんがぺろぺろ何かを書いてくよ。

【Django】DynamicにFormsetを生成するJavaScriptのライブラリを作ったよ【Mootools】


DjangoのFormsetを動的に増やしたり削除したり並び替えたりしたかったんです。。

調べたとろこjQueryにしかそういうライブラリがなかったので、Mootools好きな私と致しましては居ても立ってもいられず、こうしてライブラリを作成した次第でありますです。

って事で、内容に関する説明は面倒なのでしませんw
みんな頑張っていじくって使い方模索してね!
気が向いたらドキュメント書きますー。

[Django Dynamic Formset with Mootools]
https://bitbucket.org/odoku/django-dynamic-formset-with-mootools/

あ、一応動くと思うけど例に漏れずあんまりテストしてないのでお気をつけを。。

[ScreenShots]


【JavaScript】時間と秒の相互変換【Mootools】

Mootools大好きっ子(jQuery大嫌いっ子)の僕だよ!

JSってなんか時間まわりの使い勝手がイマイチな気がするのです。
PHPが使いやすいってだけなのかもしれませんけども。。

という訳でお題の通り「時間と秒の相互変換」を行う関数を書きました。
普通に関数書くのじゃつまらないので、StringクラスとNumberクラスに盛り込んでみましたとさ。

Number.implement({
secToTime: function(hour) {
if (arguments.length == 0) hour = true;

var sec = this.toFloat();

if (hour) {
var hours = ("0" + Math.floor(sec / 3600).toString()).slice(-2);
var minutes = ("0" + Math.floor(sec % 3600 / 60).toString()).slice(-2);
var seconds = ("0" + Math.floor(sec % 60).toString()).slice(-2);
return hours + ':' + minutes + ':' + seconds;
} else {
var minutes = ("0" + Math.floor(sec / 60).toString()).slice(-2);
var seconds = ("0" + Math.floor(sec % 60).toString()).slice(-2);
return minutes + ':' + seconds;
}
}
})

String.implement({
timeToSec: function() {
var regexp = /^(?:(?:(\d+):)?(\d+):)?(\d+)$/;
var timeString = this.toString();
var matches = timeString.match(regexp);
if (matches == null) return false;

var sec = 0;
if (matches[1]) sec += matches[1].toInt() * 3600;
if (matches[2]) sec += matches[2].toInt() * 60;
sec += matches[3].toInt();

return sec;
},
secToTime: function(hour) {
if (arguments.length == 0) hour = true;
var sec = this.toInt();
return sec.secToTime(hour);
}
})

var sec1 = '60'.timeToSec();
var sec2 = '30:00'.timeToSec();
var sec3 = '01:00:00'.timeToSec();

console.log(sec1); // 60
console.log(sec2); // 1800
console.log(sec3); // 3600

var time1 = sec1.secToTime();
var time2 = sec2.secToTime();
var time3 = sec3.secToTime();

console.log(time1); // 00:01:00
console.log(time2); // 00:30:00
console.log(time3); // 01:00:00

time1 = sec1.secToTime(false);
time2 = sec2.secToTime(false);
time3 = sec3.secToTime(false);

console.log(time1); // 01:00
console.log(time2); // 30:00
console.log(time3); // 60:00

あんまりテストしてないけど、多分大丈夫◎

【Python】プロパティに対して動的にアクセスする方法

 

まだまだPythonはぺーぺー極まり無いのでメモメモ。。

お代の通り、インスタンス変数等に文字列を使って動的に値を取得する方法で御座います。
getattrっていう関数を使うらしいよ。

getattr (object, name[, default])

指定された object の属性を返します。name は文字列で なくてはなりません。文字列がオブジェクトの属性名の一つであった 場合、戻り値はその属性の値になります。例えば、 getattr(x, 'foobar') は x.foobar と等価です。 指定された属性が存在しない場合、default が与えられている 場合にはしれが返されます。そうでない場合には AttributeError が送出されます。

サンプルソース

class Hoge:
    piyo = 10

instance = Hoge()
print getattr(instance, 'piyo')

 

ちなみに、逆に値をセットする場合はsetattrってのを使うそうです。

setattr (object, name, value)

getattr() と対をなす関数です。引数はそれぞれオブジェクト、 文字列、そして任意の値です。文字列はすでに存在する属性の名前でも、 新たな属性の名前でもかまいません。この関数は指定した値を指定した属性に 関連付けますが、指定したオブジェクトにおいて可能な場合に限ります。 例えば、setattr(x, 'foobar', 123) は x.foobar = 123 と等価です。

サンプルソース

class Hoge:
    piyo = 10

instance = Hoge()
setattr(instance, 'piyo', 200000)

print instance.piyo

【Python】datetimeでタイムゾーンをUTCに変換する方法

なんか毎回調べてる気がするので覚え書きとして残しておく。。

タイムゾーンの変換を行うときにはpython-dateutilを使うと便利だとの事。
ダウンロードとリファレンスは以下の所です。

python-dateutil - Labi

あ、pipとかeasy_installでも入るみたい

sudo pip install python-dateutil

サンプルソースを載せておきますねー。

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

import datetime
import dateutil.tz

# 日本時間 2011年08月10日 16時00分00秒 を指定
date = datetime.datetime(2011, 8, 10, 16, 0, 0, 0, dateutil.tz.gettz('Asia/Tokyo'))
print date

# UTC表記に変換
date = date.astimezone(dateutil.tz.tzutc())
print date

これでばっちり。

Jenkins + Selenium + Django でテスト自動化のための環境構築

Jenkins + Seleniumを使ってリポジトリにコードをプッシュした際に、テストもやっちまいましょうよーってお誘いが来たので手順メモとして書いておく。

環境

  • ubuntu10.04
  • python2.6
  • django1.3

必要なモノ

サーバー

  • selenium-server-standalone.jar
  • jenkins.jar

アプリケーション

Pythonライブラリ

手順

1, Ubuntu Serverにて、FireFoxを仮想フレームバッファで動かす

GUI環境のある場所でやる人はやらなくても良い部分。
Xvfbという仮想フレームバッファを使ってCUIでもFirefoxを動かせるようにしようぜってものだと思う。

インストール

sudo apt-get install xvfb
sudo apt-get install firefox

環境変数の指定

export DISPLAY=:1.0

起動

Xvfb :1 -screen 0 1024x768x24 > /dev/null &

2, Selenium Serverを動かす

ダウンロード

http://seleniumhq.org/download/

起動

java -jar selenium-server-standalone.jar > /tmp/selenium.log 2>&1 &

3, djangoに必要なライブラリを入れる

seleniumを使ったテストの書き方は多分説明してるサイトが沢山あるので割愛。。

インストール

sudo pip install selenium
sudo pip install unittest-xml-reporting

settings.py の編集

# 追加
TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner'
TEST_OUTPUT_VERBOSE = True
TEST_OUTPUT_DESCRIPTIONS = True
TEST_OUTPUT_DIR = 'xmlrunner'

4, Jenkins を動かす

ダウンロード

http://jenkins-ci.org/

起動

java -jar jenkins.jar

プラグインの導入

TOP > Jenkinsの管理 > プラグインの管理 > 利用可能 > Jenkins Mercurial pluginにチェック > インストール

設定

新規ジョブ作成
フリースタイルプロジェクトのビルド

ソースコード管理システム > Mercurial
リポジトリブラウザ > Bitbucket

ビルドトリガ > 定期的に実行(1時間毎に実行する様に設定)

* */1 * * *

ビルド手順の追加 > シェルの実行

python manage.py test

ビルド後の処理 > JUnitテスト結果の集計にチェック

xmlrunner/*.xml

これで多分動くはず。。
思い出しながら書いたので間違ってる箇所もあるかも知れないので、飽くまで参考程度に。。
あとはBitbucketにpushしたらビルドが走る様にすれば完璧ですなー。