2011/04/29

Tumblr に移そうと思います

なんとなく Blogger 使いつづけるのだるいなーとか思ってたので、Tumblr に移ろうと思います。
ついでにドメイン取ったので使ってみてます。

disqus 埋め込めるテーマ、微妙に機能しないやつとかあってなかなか決められない。白ベースでフォントサイズ小さすぎないやつが欲しいんだけど。自分で書いた方が早いか…。
あと、なんかウィジェットとかそういうの設定するのもだるい。シンプルなのはいいけどちょっと寂しい。めんどくさいねーいろいろ。

2011/01/21

Snow Leopard に phpsh をインストール

Facebook 謹製の PHP のインタラクティヴシェルである phpsh を思い出したようにインストールしてみたのでメモ。

なんとなくインストール面倒だったような気がしてたけどそんなことなかった。

  • OS: Mac OS X 10.6
  • Python: 2.7 (homebrew)
  • PHP: 5.3.3 (デフォルトのやつ)

Emacs に戻るべきかなーなんて考えながら clone してふつーにインストール。

% git clone https://github.com/facebook/phpsh.git
% cd phpsh
% python setup.py build
% python setup.py install

これで phpsh が使えるようになるけど、pcntl があれば shell 内でのコマンドがそれぞれ fork されるから recommend ってことみたいなので pcntl を入れる。 Snow Leopard にはデフォルトで入ってなかった。

homebrew の formula 拾ってきて PHP ごと入れようかと思ったけど、やっぱり面倒なので pcntl の拡張だけ入れる。

% wget http://jp.php.net/distributions/php-5.3.3.tar.gz
% tar zxvf php-5.3.3.tar.gz
% cd php-5.3.3/ext/pcntl
% phpize
% ./configure
% make
% make test
% sudo make install
% sudo vim /etc/php.ini

これでインストールは終わり。起動してみる。

% phpsh
Starting php
type 'h' or 'help' to see instructions & features
php> 1 + 3

php> 

あれ、って思ったけど "=" を付ければいいみたい。 これ書きながら思ったけど、なんで僕は 1 + 3 って入力したんでしょうか。。

php> = 1 + 3
4
php> = "hoge"
"hoge"
php> = array_filter(array(0, 1, null, '', 'hoge'))
array(  1 => 1,
  4 => "hoge",
)

echo とか var_dump なんかはそのまま使える(当然だけど)。

入れとくと便利ですねー。 なんで今頃入れてるんでしょうねー。

2011/01/07

Python から Imlib2 を使う

クロールした画像のサムネイル(正方形に crop)を作る必要があったから、せっかくなので Imlib2 を試してみることにした。

前に調べごとしてた時に Benchmark of Python Image Processing(resize) をブックマークしてベンチマークのグラフ見てたから、クオリティ求められてるわけじゃないし他の使う気にはちょっとなれなかった。

Imlib2 自体は Homebrew にあるのでありがたく使わせてもらう。

$ brew install imlib2

Python のモジュールは kaa-imlib2 なんだけど、easy_install とか pip のコマンド叩くとパッケージ無いとか言われるし、PyPI の egg は中に setup.py が入ってないからエラーになるし、これは何なのかよくわからない。

sourceforge とか PyPi のアーカイブは無視してリポジトリからチェックアウトする。なんとなく不安。

$ svn co svn://svn.freevo.org/kaa/trunk/base kaa-base
$ svn co svn://svn.freevo.org/kaa/trunk/imlib2 kaa-imlib2

それぞれ python setup.py install すれば問題なくインストールされるはず。逆に拍子抜けしたけど。

以下使ってみて気づいたこととか。

  • JPEG の quality 指定できないっぽい?ドキュメントしか見てないけど
  • ドキュメントにある scale_preserve_aspect が無い

検索してみると mopemope さん?が kaa-imlib2 あんまりいいもんじゃないって書いてたのが あったような気がするけど、どの辺りがそうなのか無知なのでよくわからない。名前がアレかなーとは思うけど。あと base とか依存がちょっとうざい。

勉強して自分で wrapper 書いてみたいって思ったけど、当面は無理かな。。

おまけ: CentOS 4.7 にインストール

subversion すら入っていないので svn co した kaa.base と kaa.imlib2 を sftp でアップロードする。

Imlib2 は sourceforge.net から最新のリリースを持ってきてインストール

$ ./configure --without-x
$ make
# make install

/usr/local 以下にインストールする。別にいいかと思って prefix は設定しなかった。

/usr/local/lib が LD_LIBRARY_PATH に含まれていないので /etc/ld.so.conf.d に imlib2.conf を作成し、適当に /usr/local/lib と書いて ldconfig を実行。

kaa.base と kaa.imlib2 はそれぞれ python setup.py install を実行する。 glib2 が古いから kaa.db が使えない?とかメッセージ出たけど関係ないから気にしない。

インタプリタ起動して import 出来るのを確認し、スクリプトも実行できることを確認して作業終了。何かしらトラブル出ると思ってたからまたまた拍子抜けしてしまった。

kaa-imlib2 普通に使う分には問題無いんだろうけど、もうちょっと楽できる wrapper あればいいなーって思った。そもそも画像処理なんてそんなに経験してないから何がどうとはまだ言えないけどね。

2010/11/26

pfff の formula 書いてみたけどうまくいかなかったの巻

これ良さげだなーと思ってインストールしようと思ったんだけど、どうせだしただインストールするんじゃなくて Homebrew の formula 書いてみようと思って試してみた。

既存の formula を参考に適当に書いた。たしかに書きやすいし楽だ。

require 'formula'
class Pfff  :optional
  depends_on 'libsvg-cairo' => :optional

  def install
    system "./configure", "--prefix=/usr/local/Cellar/pfff/0.13"
    system "make depend"
    system "make"
   
    bin.install "pfff"
    bin.install "sgrep"
    bin.install "spatch"
    bin.install "scheck"
    bin.install "stags"
    bin.install "codemap"
    bin.install "pfff_db_light"
  end
end

これでいいだろう、って思って

$ brew install pfff --HEAD

ってやるとエラーが出て make の段階で止まる。 ちなみに、普通に git clone して configure、make depend、make のコマンド叩いて実行するとエラー出ないでコンパイル完了する…。なんで?環境変数?

pcre も /opt/local/include/pcre.h 見てファイル無いよとか configure でエラー吐くしなんか微妙な感じなんだけど、scheck とか結構重宝しそう。今のところ使ってない変数の報告くらいしか見てないけど。

誰か TextMate の bundle 作ってくれるのを待ちたいと思います。

2010/11/18

pip で PyPI のパッケージ更新状況を確認する

いつの間にか yolk がお亡くなりになってて微妙に不便だったから、コピペででっちあげた。

パッケージの名前渡したらヴァージョンチェックしてくれるメソッド用意されてると思ったんだけど、無いくさいからいちいち検索してるのがちょっとアレ。

pip outdated

でもまぁ、いいと思います!

import pkg_resources
import xmlrpclib
import pip
import pip.download
from pip.log import logger
from pip.basecommand import Command
from pip.util import get_installed_distributions
from pip.commands.search import transform_hits, compare_versions, highest_version

class OutdatedCommand(Command):
    name = 'outdated'
    usage = '%prog'
    summary = 'check updated packages'
    
    def __init__(self):
        super(OutdatedCommand, self).__init__()
    
    def run(self, options, args):
        index_url = 'http://pypi.python.org/pypi'
        
        for dist in get_installed_distributions(local_only=True):
            pypi_hits = self.search(dist.key, index_url)
            hits = transform_hits(pypi_hits)
            print_results(hits)
    
    def search(self, query, index_url):
        pypi = xmlrpclib.ServerProxy(index_url, pip.download.xmlrpclib_transport)
        hits = pypi.search({'name': query})
        return hits


def print_results(hits):
    installed_packages = [p.project_name for p in pkg_resources.working_set]
    for hit in hits:
        name = hit['name']
        
        try:
            if name in installed_packages:
                dist = pkg_resources.get_distribution(name)
                try:
                    latest = highest_version(hit['versions'])
                    if dist.version < latest:
                        logger.notify('%s: %s => %s' % (name, dist.version, latest))
                finally:
                    pass
        except UnicodeEncodeError:
            pass


OutdatedCommand()

2010/11/17

SQLAlchemy で collate が utf8_bin なカラムだとユニコード文字列で取得出来ない

某システムで検索の仕様変えることになって(厳密にはいろいろ違うけど)、大文字小文字の区別付けるために検索対象のカラムの collate を utf8_general_ci から utf8_bin に変更した。

ALTER TABLE `hoge` MODIFY `col` VARCHAR(255) NOT NULL DEFAULT '' CHARACTER SET utf8 COLLATE utf8_bin

検索は PHP で書いてて、テストも問題無かったからデプロイしたんだけど、このテーブルを Python で書いたクローラも参照してたから、ちょっと問題が出た。

from sqlalchemy import *
from sqlalchemy.sql import select

engine = create_engine('mysql://localhost/sandbox', echo=False, encoding='utf-8', convert_unicode=True)
conn = engine.connect()
metadata = MetaData(bind=engine)
tbl1 = Table('table1', metadata, autoload=True)

for row in conn.execute(select([tbl1])):
    print row # Unicode文字列になっていない

ORM 使わないで書いてたやつなんだけど、取得した結果の文字カラムがユニコード文字列になってなくて、お馴染の UnicodeDecodeError でクローラが落ちる…。

そもそもの書き方が悪い、っていうのがあるんだけど、一旦それは置いといて(というかすぐ直した)原因は何なのかってのを調べてみる。

ローカルの環境は MySQL 5.1.51 + SQLAlchemy 0.6.1 で、上記のコードを試すと結果はユニコード文字列になってる。

あれ、ってことで本番環境確認すると MySQL 5.0.91 + SQLAlchemy 0.6.1…なんだけど、DB サーバは別にあってそっちは MySQL 5.1.51。 SQLAlchemy のバージョン上げれば解決、だと思ったんだけど、問題解決にはならず結果は同じ…。

あんまり検証してないけど、とりあえずこういうことらしい。SQLAlchemy がその辺うまいこと処理してくれるものだと思ってたんだけど、どうなんだろう…。

それにしても余裕が無い…。

2010/11/13

Maatkit の mk-kill で SELECT だけを殺す

どうもこんばんは。 MySQL さっぱりわからないクズです。

いまいちクエリ改善できなくて、ヘタに検索すると刺さっちゃったりするシステム作ってしまった訳なんですけど、大人の事情でサーバのメモリ増設とかすんなり出来なかったりしてどうしようかなって状態だったりするんですが、とりあえず刺さったクエリを自動で殺す方法探したら Maatkit に含まれる mk-kill 使うのが一番手頃みたいだし cron*1 に仕込んでおいた。

$ mk-kill -kill-query --busy-time 1m

これで実行されてから1分以上経過したクエリが自動で殺されます。よかったよかった…なんですが、ALTER TABLE とかパーティションの更新とかもこれだと対象にされちゃうので、SELECT のみに限定したい場合は

$ mk-kill -kill-query --match-info SELECT --busy-time 1m

--match-info でパターンを指定してやればいいみたい。 info ってのがぱっと見だとわかりずらいけど、show processlist の info の部分ってことみたい。

ぜんぜんわかんないことばかりで悲しいんだけど、Maatkit 便利だしいろいろ試したい。

余談だけど、パーティションって2日先まで作って更新してくのがいいよね?とりあえず問題は出てないしデメリットも思いつかないから、このままでいくけど。。

*1: --daemonize のオプション指定してみたけどちゃんと動かなかった。 pid 指定してみても駄目。何かに依存してるのかな。