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 指定してみても駄目。何かに依存してるのかな。

2010/11/07

do

  • MacBook も Homebrew に移行。とりあえず coreutils と tmux と zsh だけ入れた
  • limera1n で iPhone 4 を Jailbreak
何にも書かなくなっちゃったし、とりあえずその日にやったことだけでも記録付けるようにしたい。

2010/09/20

MySQL 5.1 と Q4M のインストール

まぁまぁまぁ。

  • CentOS 5.5
  • MySQL 5.1.50
  • Q4M 0.9.4

MySQLのインストール

$ ./configure --prefix=/usr/local/mysql --with-charset=utf8 --with-extra-charsets=all --with-plugins=all
$ make
# make install
# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod a+x /etc/rc.d/init.d/mysql
# /sbin/chkconfig mysqld on
# vim /etc/ld.so.conf.d/mysql
+/usr/local/mysql/lib/mysql
# /sbin/ldconfig
# cd /usr/local/mysql
# chown -R mysql:mysql .
# sudo -u mysql ./bin/mysql_install_db
# ./bin/mysqld_safe --user=mysql &
# ./bin/mysql_secure_installation

Q4Mのインストール

$ ./configure --prefix=/usr/local/mysql --with-mysql=/usr/local/src/mysql-5.1.50
$ make
$ make test
# make install
# mysql -u root -f mysql < support-files/install.sql

PHPのMySQL拡張を個別に再インストール

# yum remove php-mysql
$ wget php-5.x.x
$ tar zxvf php-5.x.x
$ cd php-5.x.x/ext/mysql
$ phpize
$ ./configure --with-mysql=/usr/local/mysql
$ make
# make install
# vim /etc/php.ini

2010/06/12

Windows を使ってる

糞だ糞だとギャーギャー心の中で騒ぎながら、それでも仕事だし Windows の PC を使ってる。

なんか Windows ってぜんぜん進化してないように感じる。これはタイムマシンだ!僕が中学とか高校の頃から主役のアプリケーションが変っていない。というか、使えるアプリが出てきてない。これはある意味素晴しいことなんだろうけど、なんだかなーって正直思ってしまう。

UI は何をどうやっても野暮ったいままでダサいし、フォントのレンダリングはマジで吐き気がする。酷すぎるだろ。

それでも、エディタが使えれば仕事は出来るし、なんとかなってる。最初はかなり忘れてて、何を使おうかとかけっこう悩んだけど、とりあえず落ち着いてきた。

  • NetBeans
  • xyzzy
  • EmEditor free
  • putty
  • VirtualBox
  • TortoiseGit

xyzzy とか本当に素晴しいなーって改めて思うんだけれど、設定するのが面倒すぎてなんとも…。ずっとこのままの環境で仕事をすることになるのであれば、ちょっとずつでもやっておきたいんだけれど、どうしようかなーと。

あとそれほど関係ないけど、VirtualBox 上に CentOS の環境を作ってる。yum とかちゃんと使うの実は初めてなんだけれど、まーなんとかなってる。なんともならないのが Apache の設定。VirtualHost の設定をすると Permission error で 403 forbidden になる。 SELinux は disabled なのに。何で?

いろいろ大変ですなー。

2010/05/21

pip に upgrade コマンドを追加する

Python のパッケージのイントールは最近だと pip を使うのが普通だと思いますが、この pip には何故か upgrade のサブコマンドが無いんですよねぇ。 いちいち pip install --upgrade package ってやるの面倒だし自分で用意してみた。

とはいってもやることは簡単で、lib/pythonx.x/site-packages/pip/commands にある install.py をコピーして upgrade.py にして、中をちょっといじるだけ。 モジュール化って素敵ですね。

追記

http://bit.ly/bGF0fe もしかしてPIP_CONFIG_FILEの設定(http://bit.ly/9NvkGx)で[install] upgrade=yes とすると常に--upgradeが実現できるんじゃないかな。あとでやってみようTue May 25 17:23:33 via web

laiso さんの tweet 見て試してみたらその通りだった。これが一番簡単です。

% touch .pip/pip.conf
% echo '[install]' > pip.conf
% echo 'upgrade = true' >> pip.conf

これで install コマンドで常に upgrade オプションが有効になります。 すでにインストール済みのパッケージが更新されていない場合でも再インストールが実行されちゃうのでちょっと微妙だけど、PyPI のフィードとか yolk とかで更新確認してるから問題にはならないかなーと思います。

2010/05/07

zsh で Leiningen コマンドの補完

書いた。これこそ無くてもいいけどあるとちょっとだけ楽よね?良かったら使って!

2010/05/06

TextMate のインストールとセットアップ

うっかり TextMate のアプリと設定全部消しちゃったから環境再構築中。 とりあえず手順まとめとく。

まずはサイトから dmg イメージをダウンロード。http://macromates.com/

TextMate.app 起動したら Preferences > Software Update を開き、アップデート対象を "Cutting-Edge" にして Check Now をクリックして最新版に更新。 他の設定は適当に。

続いて Plugin をインストール。

  • ProjectPlus
  • AckMate

hetima さんので日本語入力できるようにしてもいいけど、とりあえず必要になってからでいいような気がするので今回はこのまま。

Bundle のインストールは GetBundles http://github.com/adamsalter/getbundles.tmbundle を使って必要なものだけ入れる。

$ cd ~/Library/Application Supports/TextMate/Bundles
$ git clone http://github.com/adamsalter/getbundles.tmbundle.git

簡単ですね!

2010/03/26

AckMate が便利というか素敵

Ack でプロジェクトを検索できる tmbundle は前かあったんだけど、今回の AckMate はプラグイン。快適度が違いますねー。

2010/03/24

Leopard で Java6 使いたい

VM の性能良くなってるよと言われても Leopard 用の、というか 32bit CPU 向けの Java6 を Apple は用意してくれていないので Snow Leopard にアップデートするまでおあずけかなーと思ってたんだけど、ちょっと調べてみたら OpenJDK6 なら使えるっぽい。 なら入れない理由はないなと思って MacPorts で検索してみたらちゃんとあった。

% port search openjdk
openjdk6 @b16 (java)
    Sun's java 6 virtual machine release under the GNUV2 license

openjdk6_bootstrap @b16-r1 (java)
    A binary build of OpenJDK6 to be used for bootstrapping the OpenJDK6 port.

Found 2 ports.

特に variants も無いのでそのままインストールしてみる。

% sudo port -d install openjdk6

ant とか依存パッケージそれなりにあるのでちょっと時間掛かるけど、とりあえず順調にビルド進んでるなー、なんて思ったからかどうかわからないけどコケる。

<<<Finished Recursively making com build @ Wed Mar 24 22:35:04 JST 2010.
Done Processing SUBDIRS: tools javax org sun com
Error: Target org.macports.build returned: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_openjdk6/work/./" && /usr/bin/make -j2 all ALT_BOOTDIR="/opt/local/share/java/openjdk6_bootstrap" ALT_BINARY_PLUGS_PATH="/opt/local/share/java/icedtea6-plugs/jre/lib/rt-closed.jar" ANT_HOME="/opt/local/share/java/apache-ant" ALT_FREETYPE_HEADERS_PATH="/opt/local/include" ALT_FREETYPE_LIB_PATH="/opt/local/lib" ALT_CUPS_HEADERS_PATH="/usr/include" ALT_MOTIF_DIR="/opt/local" ALT_X11_PATH="/opt/local" ALT_DEVTOOLS_PATH=/usr ALT_CACERTS_FILE=/System/Library/Frameworks/JavaVM.framework/Home/lib/security/cacerts NO_DOCS=true HOTSPOT_BUILD_JOBS=1 " returned error 2
DEBUG: Backtrace: shell command " cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_java_openjdk6/work/./" && /usr/bin/make -j2 all ALT_BOOTDIR="/opt/local/share/java/openjdk6_bootstrap" ALT_BINARY_PLUGS_PATH="/opt/local/share/java/icedtea6-plugs/jre/lib/rt-closed.jar" ANT_HOME="/opt/local/share/java/apache-ant" ALT_FREETYPE_HEADERS_PATH="/opt/local/include" ALT_FREETYPE_LIB_PATH="/opt/local/lib" ALT_CUPS_HEADERS_PATH="/usr/include" ALT_MOTIF_DIR="/opt/local" ALT_X11_PATH="/opt/local" ALT_DEVTOOLS_PATH=/usr ALT_CACERTS_FILE=/System/Library/Frameworks/JavaVM.framework/Home/lib/security/cacerts NO_DOCS=true HOTSPOT_BUILD_JOBS=1 " returned error 2
    while executing
"command_exec build"
    (procedure "portbuild::build_main" line 9)
    invoked from within
"$procedure $targetname"
Warning: the following items did not execute (for openjdk6): org.macports.activate org.macports.build org.macports.destroot org.macports.archive org.macports.install
Error: Status 1 encountered during processing.
To report a bug, see <http://guide.macports.org/#project.tickets>

チケット自体は登録されてるっぽいので、ちょっと待ってれば治るかな。 Java のことぜんぜんわかんないから自分で調べてビルドする方がいいのかもしれないけど、どこから手をつけていいかわからないし Clojure 自体までぜんぜんだから、あんまり他のこと覚えてる余裕ないしとにかく待ってみます。。

2010/02/15

Tombloo から Pinbord.in に投稿する

最初に Pinbord.in に登録しようとした時はちょうど TechCrunch だったかな?紹介されてユーザが増えたおかげで登録に $3 くらい支払いが発生するようになった時でした。 ちょっと待ってれば落ち着いてフリーになるかなと思ってアカウントだけ押さえて支払いはしないでいたんだけれど、とうとう数日前に PayPal で支払ってアクティベーションしました。 $6 だし iPhone アプリ買ったと思えば別になんとも思いませんが、倍支払ったと考えるとちょっと萎える。

Pinbord はとてもよく出来てるし、なにより速い。いいサービスなんだけれど、日本の人で使ってる人そんなにいないみたいだし Tombloo + Pinboard で検索してみても無いみたいだったからコピペして自分で用意してみた。

もうぜんぜんよくわかんないんだけど、Ack で適当に検索してちょこちょこいじったら問題なく動いたからとりあえずこれでいいけど、せっかくだし toread をフォームに出すところまではやりたいな。

2010/01/24

プログラミング Clojure って本が出る

ねーさっぱりですよ。反省。来月からもうちょっと頑張る。

いよいよ Clojure の本出ますね!Web でいろいろ見ながら勉強したり(ちょっとだけ、ね)してるんだけど、やっぱり僕は本を見ながら写経しないと駄目みたいなので嬉しい。給料出たらすぐ買う予定。

no image
プログラミングClojure
posted with amazlet at 10.01.24
Stuart Halloway
オーム社
売り上げランキング: 1596