ブログ移転しました。
はてなブログに移動してしまいました。
新しいURLはこっちだよ。
http://odoku.hatenablog.com/
PythonやらObjective-Cまわりのお話を書いていくよ!たまに関係ない事も書くよ!
2013年3月23日土曜日 15:12 By Unknown
Ubuntu12.04にNginxを入れる時にいっつも忘れるのでメモ。
80番ポートが使われてるよって怒られる場合は/etc/nginx/sites-available/defaultを以下の様に変更。
↓
listen [::]:80 default_server;
コレで動くはず。
listen [::]:80 ipv6only=on default_server;
2013年2月24日日曜日 16:15 By Unknown , In python
公式を見ると「easy-installでインスコ出来るお」って書いてあったんだけど何故か出来なかった。。
仕方ないのでgithubに上がってるソースからインスコしてみたけどコレも動かず。
イラッとしたのでpypiからソースを直接ダウンロードして入れてみたら動いたよ。
でもsite-packagesの直下にcoreとかuiとかいうディレクトリが出来るんだけど、ちょっと無作法じゃないですかねコレ。
気持ち悪い。
2012年7月30日月曜日 11:29 By Unknown , In python
検索してもパッと出てこないので書いておきます。 あんまり使う機会ないかもだけど。。
from datetime import date, time, datetime # 今日の日付 today = date.today() # dateをdatetimeに変換 # time()は"00:00:00"の事 today = datetime.combine(today, time())リファレンスにちゃんと書いてありますね。 http://www.python.jp/doc/nightly/library/datetime.html
2012年4月25日水曜日 16:29 By Unknown , In HandlerSocket , mysql
ubuntu10.04にMySQL HandlerSocket Pluginをインストールしようと思ったら下記の様なエラーが出た。
"libhsclient_la-config.o: No such file or directory"
調べてもさっぱり情報ないしどうしようーって思ってたら、make時にlibhsclientのディレクトリで生成されてるオブジェクトファイルの名前が何故か違ってたので、リネームしてmakeしなおしてやったらインストール出来ました。
sudo apt-get install libtool sudo apt-get install autoconf sudo apt-get install g++ cd ~/HandlerSocket-Plugin-for-MySQL ./autogen.sh ./configure --with-mysql-source=/home/odoku/opt/src/mysql5.5.14 --with-mysql-bindir=/home/odoku/opt/mysql/5.5.14/bin --with-mysql-plugindir=/home/odoku/opt/mysql/5.5.14/lib/plugin make # ここでエラーが出るんです。。 cd libhsclient mv config.o libhsclient_la-config.o mv escape.o libhsclient_la-escape.o mv fatal.o libhsclient_la-fatal.o mv hstcpcli.o libhsclient_la-hstcpcli.o mv socket.o libhsclient_la-socket.o mv string_util.o libhsclient_la-string_util.o cd .. sudo make install
はたしてこんな無理やりな対処方法でいいのかどうか。。
2012年4月24日火曜日 18:15 By Unknown , In mysql , spider
SpiderってかMysql Sandboxの話ですけども。。
サンプル通りにやっても動かなかったのでメモ。
インストール方法は調べれば沢山出てくるので割愛。
つっても1行書くだけだけども。。
ここらへんを参考に。
http://d.hatena.ne.jp/ZIGOROu/20090607/1244367464
で、make_sandboxすると
"You must enter a full path to the tarball. Relative paths are not supported."
とか
"Not a tarball"
とか訳の判らん事(わかるけどw)を仰るので困った。
ので、解凍してからやってやると上手くいきました。
以下、手順
Spiderはコチラからダウンロードしてね。
https://launchpad.net/spiderformysql
export SANDBOX_BINARY=$HOME/opt/mysql export SANDBOX_HOME=$HOME/opt/sandboxes mkdir ~/opt/mysql cd ~/opt/mysql wget http://spiderformysql.com/downloads/spider-2.26/mysql-5.5.14-spider-2.26-vp-0.15-hs-1.0-linux-i686-glibc23.tgz tar zxvf mysql-5.5.14-spider-2.26-vp-0.15-hs-1.0-linux-i686-glibc23.tgz mv mysql-5.5.14-spider-2.26-vp-0.15-hs-1.0-linux-i686-glibc23.tgz 5.5.14 make_sandbox $SANDBOX_BINARY/5.5.14
なんかディレクトリをバージョン名にしなきゃいけないとか決まりごとがある様です。
2012年4月16日月曜日 18:59 By Unknown
sudo apt-get install build-essential
sudo apt-get install zlib1g
# 最新版はコチラで確認してね http://fallabs.com/
wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.74.tar.gz wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.55.tar.gz
tar xvfz kyotocabinet-1.2.74.tar.gz cd kyotocabinet-1.2.74 ./configure make sudo make install
tar xvfz kyototycoon-0.9.55.tar.gz cd kyototycoon-0.9.55.tar.gz ./configure make sudo make install
sudo vi /etc/ld.so.conf.d/lib.conf
/usr/local/lib <--追加
変更した設定を反映します
sudo ldconfig
ktserver
memcachedプロトコルを有効(2010ポートで起動)にする場合は以下のオプションをつけてサーバーを起動
ktserver -plsv /usr/local/libexec/ktplugservmemc.so -plex 'port=2010'
2012年3月5日月曜日 11:03 By Unknown , In python
前に書いたエントリーと重複する内容なんですけれども。
mac os10.6でpip installをすると、よく
"error: command 'gcc-4.2' failed with exit status 1"
こんなエラーで落ちる事があるんですけれども、これを回避する方法は以下の様にすれば良いようです。
sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install パッケージ名
で、毎回こんなの打ってるの面倒なので、.bashrcにでも書いといて下さい。
pipを置き換える場合はこんな感じ。
alias pip='sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip'
確かRubyでも似たような事で詰まった気がしたので、ARCHFLAGSだけ書いといたほうがいいかもね。
export ARCHFLAGS='-arch i386 -arch x86_64 -arch ppc'
2012年1月24日火曜日 16:29 By Unknown , In Facebook
FacebookはOAuth2.0に対応しているのでユーザーとアプリが紐づいたアクセストークンというものを発行してくれるのですが、どうやらアプリ自体が持つアクセストークンってのも在るようです。
以下のURLにアクセスすると取得出来るみたいです。
[APP_ID]と[APP_SECRET]は各自適宣変更して下さいね。
Request Dialogを使ってアプリへの招待を送った際に発行される、リクエストオブジェクトを取得する時なんかに使用出来ます。
12:01 By Unknown , In Facebook
Facebookアプリを作る機会があったので色々と調べていたのですが、OAuth認証のコールバックにはlocalhostを指定出来ないみたいでちょっと困った。
ので、hostsを書き換えて無理やりやりましょうって事でやってみたら上手く行きました。
hostsの設定は以下のとおり。 コレを/etc/hostsのどっかに書いておいて下さい。
127.0.0.1 local.examples.com
で、Facebookアプリの設定。
【アプリのドメイン】の所に上記で設定したドメインを追加。
下の方にある【ウェブサイト】のところも忘れずに。
後は設定したドメインにアクセスすれば問題なく動きますよ。
ついでにキャンバスページも同様に出来るので設定してみると幸せになれるかも。
余談ですが、Djangoのテストサーバーがlocalhost:8000で動いてるんですけども、Nginx使ってリバースプロキシってやると幸せになりました。
便利な世の中ですね。
2012年1月12日木曜日 18:44 By Unknown , In Django , python
Djangoのforms.Formクラスにあるアレです。
Modelにも実装してくれればいいのに。。
Modelにもカスタムバリデーション用のcleanメソッドがありますけども、あすこでValidationErrorを投げるとどんな設定してもNON_FIELD_ERRORSのエラーになってしまいます。
こりゃー使いづらいぜーという事なのでFormクラスと似たような事が出来るようにMixinを使って実装をしてみました。
と言ってもDjangoのソースパクって数行追加するだけですけども。
#-*-coding=utf8-*-
from django.core.exceptions import ValidationError
class CleanFieldModelMixin(object):
"""clean_[field_name]メソッドが使えるようになります。"""
def clean_fields(self, exclude=None):
if exclude is None: exclude = []
errors = {}
for f in self._meta.fields:
if f.name in exclude: continue
raw_value = getattr(self, f.attname)
if f.blank and raw_value in validators.EMPTY_VALUES: continue
try:
setattr(self, f.attname, f.clean(raw_value, self))
if hasattr(self, 'clean_%s' % f.name):
value = getattr(self, 'clean_%s' % f.name)()
setattr(self, f.attname, value)
except ValidationError, e:
errors[f.name] = e.messages
if errors:
raise ValidationError(errors)
んで、実際の使い方はこんな感じ
#-*-coding=utf8-*-
from django.db import models
from django.core.exceptions import ValidationError
from utils.models import CleanFieldModelMixin # 適当にして下さいな。
# MixinクラスはModelクラスより先に書いてくださいね!
class User(CleanFieldModelMixin, models.Model):
name = models.CharField('name', max_length=60)
def clean_name(self):
count = User.objects.filter(name=self.name).count()
if count > 0:
raise ValidationError('%s is already exists.' % self.name)
これで動く。
多分動く。。
2011年12月21日水曜日 16:55 By Unknown , In python
unicode文字列をstr()で変換する場合、デフォルトだとasciiで変換しようとするので困る。
これをUTF-8に変更するには、Pythonのデフォルトエンコーディングを指定してやれば良いみたい。
以下の内容を、"site-packages"配下に"sitecustomize.py"という名前で保存。
Mac OS 10.7だと"/Library/Python/2.6/site-packages/sitecustomize.py"な感じ。
import sys
sys.setdefaultencoding("utf-8")
2011年11月21日月曜日 15:31 By Unknown , In python
やろうと思ったらコケました。。
以下のようやったらイケましたよ。
easy_installの場合も多分一緒。
% sudo su - % env ARCHFLAGS="-arch i386 -arch x86_64" pip install cython
2011年11月14日月曜日 18:57 By Unknown , In Django , JavaScript , Mootools
DjangoのFormsetを動的に増やしたり削除したり並び替えたりしたかったんです。。
調べたとろこjQueryにしかそういうライブラリがなかったので、Mootools好きな私と致しましては居ても立ってもいられず、こうしてライブラリを作成した次第でありますです。
って事で、内容に関する説明は面倒なのでしませんw
みんな頑張っていじくって使い方模索してね!
気が向いたらドキュメント書きますー。
[Django Dynamic Formset with Mootools]
https://bitbucket.org/odoku/django-dynamic-formset-with-mootools/
あ、一応動くと思うけど例に漏れずあんまりテストしてないのでお気をつけを。。
[ScreenShots]
2011年11月10日木曜日 12:05 By Unknown , In 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
2011年8月11日木曜日 17:38 By Unknown , In 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
2011年8月10日水曜日 18:01 By Unknown , In python
なんか毎回調べてる気がするので覚え書きとして残しておく。。
タイムゾーンの変換を行うときにはpython-dateutilを使うと便利だとの事。
ダウンロードとリファレンスは以下の所です。
あ、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
これでばっちり。
11:05 By Unknown , In Jenkins , python , Selenium
Jenkins + Seleniumを使ってリポジトリにコードをプッシュした際に、テストもやっちまいましょうよーってお誘いが来たので手順メモとして書いておく。
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 &
http://seleniumhq.org/download/
java -jar selenium-server-standalone.jar > /tmp/selenium.log 2>&1 &
seleniumを使ったテストの書き方は多分説明してるサイトが沢山あるので割愛。。
sudo pip install selenium sudo pip install unittest-xml-reporting
# 追加 TEST_RUNNER = 'xmlrunner.extra.djangotestrunner.XMLTestRunner' TEST_OUTPUT_VERBOSE = True TEST_OUTPUT_DESCRIPTIONS = True TEST_OUTPUT_DIR = 'xmlrunner'
java -jar jenkins.jar
TOP > Jenkinsの管理 > プラグインの管理 > 利用可能 > Jenkins Mercurial pluginにチェック > インストール
新規ジョブ作成
フリースタイルプロジェクトのビルド
ソースコード管理システム > Mercurial
リポジトリブラウザ > Bitbucket
ビルドトリガ > 定期的に実行(1時間毎に実行する様に設定)
* */1 * * *
ビルド手順の追加 > シェルの実行
python manage.py test
ビルド後の処理 > JUnitテスト結果の集計にチェック
xmlrunner/*.xml
これで多分動くはず。。
思い出しながら書いたので間違ってる箇所もあるかも知れないので、飽くまで参考程度に。。
あとはBitbucketにpushしたらビルドが走る様にすれば完璧ですなー。
Copyright (c) 2010 besttheme.net All rights reserved. Blogger Design by Best ThemeAnd Best Theme HelpWordpress Design by Free CSS Templates.