ブログ移転しました。

2013年7月6日土曜日 19:36 By Unknown

はてなブログに移動してしまいました。
新しいURLはこっちだよ。

http://odoku.hatenablog.com/

【nginx】"Address already in use"って言われて動かない【ubuntu】

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;
コレで動くはず。

【python】isk-daemonのインストール【画像検索】

2013年2月24日日曜日 16:15 By Unknown , In

公式を見ると「easy-installでインスコ出来るお」って書いてあったんだけど何故か出来なかった。。
仕方ないのでgithubに上がってるソースからインスコしてみたけどコレも動かず。
イラッとしたのでpypiからソースを直接ダウンロードして入れてみたら動いたよ。

でもsite-packagesの直下にcoreとかuiとかいうディレクトリが出来るんだけど、ちょっと無作法じゃないですかねコレ。
気持ち悪い。

【python】dateをdatetimeに変換する方法【Tips】

2012年7月30日月曜日 11:29 By Unknown , In

検索してもパッと出てこないので書いておきます。 あんまり使う機会ないかもだけど。。

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

変換ってか結合って感じだけども。。

【MySQL】libhsclient_la-config.o: No such file or directory【HandlerSocket】

2012年4月25日水曜日 16:29 By Unknown , In ,

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

はたしてこんな無理やりな対処方法でいいのかどうか。。

【MySQL】SpiderをSandboxで動かす【Sandbox】

2012年4月24日火曜日 18:15 By Unknown , In ,

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

なんかディレクトリをバージョン名にしなきゃいけないとか決まりごとがある様です。

【KVS】ubuntuにKyoto Tycoonをインストールする【memcached】

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

Kyoto Cabinetのインストール

tar xvfz kyotocabinet-1.2.74.tar.gz
cd kyotocabinet-1.2.74
./configure
make
sudo make install

Kyoto Tycoonのインストール

tar xvfz kyototycoon-0.9.55.tar.gz
cd kyototycoon-0.9.55.tar.gz
./configure
make
sudo make install

/usr/local/libをシステムに認識させる

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'

【easy_install】モジュールのインストールでよくコケるアナタへ【pip】

2012年3月5日月曜日 11:03 By Unknown , In

前に書いたエントリーと重複する内容なんですけれども。

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'

【Facebook】Facebookアプリが持つアクセストークンを取得【アプリ】

2012年1月24日火曜日 16:29 By Unknown , In

FacebookはOAuth2.0に対応しているのでユーザーとアプリが紐づいたアクセストークンというものを発行してくれるのですが、どうやらアプリ自体が持つアクセストークンってのも在るようです。
以下のURLにアクセスすると取得出来るみたいです。
[APP_ID]と[APP_SECRET]は各自適宣変更して下さいね。

https://graph.facebook.com/oauth/access_token?client_id=[APP_ID]&client_secret=[APP_SECRET]&grant_type=client_credentials

Request Dialogを使ってアプリへの招待を送った際に発行される、リクエストオブジェクトを取得する時なんかに使用出来ます。

【Facebook】Facebookアプリでlocalhostを指定する為のアレ【アプリ】

12:01 By Unknown , In

Facebookアプリを作る機会があったので色々と調べていたのですが、OAuth認証のコールバックにはlocalhostを指定出来ないみたいでちょっと困った。
ので、hostsを書き換えて無理やりやりましょうって事でやってみたら上手く行きました。

hostsの設定は以下のとおり。 コレを/etc/hostsのどっかに書いておいて下さい。

127.0.0.1    local.examples.com

で、Facebookアプリの設定。
【アプリのドメイン】の所に上記で設定したドメインを追加。
下の方にある【ウェブサイト】のところも忘れずに。

後は設定したドメインにアクセスすれば問題なく動きますよ。

ついでにキャンバスページも同様に出来るので設定してみると幸せになれるかも。

余談ですが、Djangoのテストサーバーがlocalhost:8000で動いてるんですけども、Nginx使ってリバースプロキシってやると幸せになりました。
便利な世の中ですね。

【Python】Modelクラスでclean_[field_name]メソッドを使う【Django】

2012年1月12日木曜日 18:44 By Unknown , In ,

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)

これで動く。
多分動く。。

【python】str(u"unicode文字列")をUTF-8にする方法【エンコーディング】

2011年12月21日水曜日 16:55 By Unknown , In

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")

これでおk

【python】Snow leopardにcythonをpipでインストール【mac osx】

2011年11月21日月曜日 15:31 By Unknown , In

やろうと思ったらコケました。。

以下のようやったらイケましたよ。
easy_installの場合も多分一緒。

% sudo su -
% env ARCHFLAGS="-arch i386 -arch x86_64" pip install cython

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

2011年11月14日月曜日 18:57 By Unknown , In , ,


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

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

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

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

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

[ScreenShots]



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

2011年11月10日木曜日 12:05 By Unknown , In ,

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】プロパティに対して動的にアクセスする方法

2011年8月11日木曜日 17:38 By Unknown , In


まだまだ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に変換する方法

2011年8月10日水曜日 18:01 By Unknown , In

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

タイムゾーンの変換を行うときには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 でテスト自動化のための環境構築

11:05 By Unknown , In , ,


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

環境

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


必要なモノ

サーバー

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

アプリケーション

  • Xvfb(仮想フレームバッファ)
  • Firefox

Pythonライブラリ

  • selenium
  • unittest-xml-reporting


手順

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したらビルドが走る様にすれば完璧ですなー。