Hatena::ブログ(Diary)

肉とご飯と甘いもの @ sotarok

2012/02/06

pecl install hoge でインストールしたとき、インストール先が extension_dir じゃないディレクトリになってしまう場合

Debain での話。

  • 手元で色々 PHP いじってて環境が微妙なことになってしまったとき
  • まぁ、こういうことになる人ってあんまいないと思うけど
$ sudo pecl install hoge

インストールすると、

...
checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib
checking for PHP extension directory... /usr/lib/php/20100525-debug
checking for PHP installed headers prefix... /usr/include/php
...

おや?

で、当然 /etc/php5/conf.d/http.ini とかに

extension=http.so

とか書いても、

$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/http.so' - /usr/lib/php5/20090626/http.so: cannot open shared object file: No such file or directory in Unknown on line 0
...

とかいわれる。

extension のインストールされたディレクトリと、phpの設定がもってる extension dir が違うようだ。

$ php -i | grep extension_dir
extension_dir => /usr/lib/php5/20090626 => /usr/lib/php5/20090626

となるから当然で。

あれ、じゃあなんで pecl install するときにここに入らないのだ、と思い一応 pecl config-show で確認。

$ pecl config-show
...
PHP extension directory        ext_dir          /usr/lib/php5/20090626
...

ちゃんとなっている。

ビルドのときには /usr/bin/php-config が使われるのでそれも確認

$ which php-config
/usr/bin/php-config
$ php-config
...
  --libs              [-lcrypt   -lz -lcrypt -lonig -lcrypto -lssl -lcrypto -ldb-4.8 -lqdbm -lbz2 -lz -lcrypto -lssl -lcrypto -lrt -lm -ldl -lnsl  -lxml2 -lgssapi_krb5 -
lkrb5 -lk5crypto -lcom_err -lxml2 -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lcrypt ]
  --extension-dir     [/usr/lib/php5/20090626-debug]
  --include-dir       [/usr/include/php5]
...

あれ。

php-config は誰によってインストールされるか、

$ dpkg -S php-config
php5-dev: /usr/share/man/man1/php-config5.1.gz
php5-dev: /usr/bin/php-config5

php5-dev。だけど /usr/bin/php-config5 ってことは多分 /usr/bin/php-config は symlink にしてるんだな、と確認してみると、

$ ls -la /usr/bin/php-config
-rwxr-xr-x 1 root root 4570 2012-02-03 08:36 /usr/bin/php-config

あれ。実体だ。

つまり原因は、

  • 何かしらのタイミングで php-config が実体になっちゃった
  • php5-dev をインストールしなおしても、update alternatives が働かない
  • 何かしらのタイミングで実体になっちゃったものがずっとつかわれちゃってる
  • pecl install のときにおかしくなる

ということなので、 /usr/bin/php-config を削除して php5-dev のインストールしなおし

$ sudo rm /usr/bin/php-config
$ sudo apt-get remove php5-dev
$ sudo apt-get install php5-dev

...

php5-dev (5.3.10-1~dotdeb.1) を設定しています ...
update-alternatives: /usr/bin/php-config (php-config) を提供するために 自動モード で /usr/bin/php-config5 を使います。
update-alternatives: /usr/bin/phpize (phpize) を提供するために 自動モード で /usr/bin/phpize5 を使います。m

で、再度確認

$ ls -la /usr/bin/php-config
lrwxrwxrwx 1 root root 28 2012-02-06 11:47 /usr/bin/php-config -> /etc/alternatives/php-confi

$ php-config
...
  --libs              [-lcrypt   -lz -lcrypt -lonig -lcrypto -lssl -lcrypto -ldb-4.8 -lqdbm -lbz2 -lz -lcrypto -lssl -lcrypto -lrt -lm -ldl -lnsl  -lxml2 -lgssapi_krb5 -
lkrb5 -lk5crypto -lcom_err -lxml2 -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lcrypt ]
  --extension-dir     [/usr/lib/php5/20090626]
  --include-dir       [/usr/include/php5
...

OK。

で、 pecl install してめでたし。


追記

最初の php-config のときに

  --version           [5.4.0beta1-dev]
  --vernum            [50400]

が出てたので自分で作ってた php5.4 の .deb をインストールしたときだなー間違いなく。

ますますこの問題おこるひとほとんどいないきがするよ。。

起こるとしたら、debian標準のaptから dotdeb に切り替えたとか、何かしら環境を変えた時とか。

2012/01/22

KnpPaginatorBundle で Twitter Bootstrap でうまいこといくやつを出す

小ネタ。

Symfony2 つかってるとページング処理どうしようかってのに KnpLabs が公開してる KnpPaginatorBundle を使うことが多い。KnpPaginatorBundle は 2.0 系から Zend_Paginator に依存しなくなって使いやすくなりましたね。 *1

そして、最近特に管理画面系をサクっと仕上げるのに欠かせないのが Twitter Bootstrap なわけだけど、つまり、KnpPaginatorBundle が吐き出すページング用の HTML を、Twitter Bootstrap の、navigation でうまくいくやつを出力したいと思うわけです。

これね:

f:id:sotarok:20120122235419p:image


テンプレートファイルを用意して parameters.ini に設定

Twitter Bootstrap 用に変更している点は、現在のページを active ってクラスにしている点とかその他なんだっけもろもろです。

これを自分で作ってるアプリの適当な Bundle の Resouces/views な場所に入れます。(今回は、 Pagination:pagination.html.twig にいれた。)

で、KnpPaginatorBundle が使うテンプレートを指定するのが parameters.ini で:

[parameters]
...
    knp_paginator.template.pagination=MyAppBundle:Pagination:pagination.html.twig

的なかんじ。

追記: なぜ parameters.ini なのか質問されたので追記。こういう設定は普通 config.yml 的なところで knp_paginator: template: pagination ... なんじゃ?とも思ったんですけど、ソース読んだら parameters から取ってたので、parameters.ini に書きました。勘違いしてたりして...!

追記の追記。 parameters.ini → config.yml に設定変わってた。

この内容つくったとき、最新のソースでソース読んでつくったんだけど、今度ブログ書こー、とおもって1ヶ月くらい経過してたせいで、その後テンプレート指定の方法が変わってたw

32c5c3c 時点では、parameters.ini でOKです。最新のソースでは 06dc809d で設定方法がかわってるので、 config.yml に書けば良いっぽいですね。

と、いうことで多分 config.yml に以下のように記述すればいいとおもいます。

knp_paginator: template: pagination: MyAppBundle:Pagination:pagination.html.twig

※ブログ書く前に最新版で確認しましょうという話。


でなんかする

なんちゃら Controller:

<?php
// in some action

        $qb = $this->get('doctrine')->getEntityManager()->createQuery('...');
        $paginator = $this->get('knp_paginator');
        $posts = $paginator->paginate(
            $qb,
            $this->getRequest()->query->get($pageQueryName, 1), # page number
            $itemCount # items per page
        );

        return $this->render('MyAppBundle:Internal:Hoge/fuga.html.twig', array(
            'posts' => $posts
        )); 

なんちゃら .html.twig

{{ posts.render()|raw }}

  • それだけなのでとくにオチとかもないです
  • KnpPaginatorBundle 使うと 各 column での sort とかも簡単に実装できるので楽ですね

*1:というか KnpLabs は謎の日本語サイトがあったりして面白いですね。日本でもがんばるつもりなんですかね?

2012/01/19

node.js で Redmine の REST API を扱う node-redmine つくりました

RedmineAPI をごにょごにょしたいことが多いんだけど、毎回 PHP ってのも芸が無いので年始の休みのときに遊びはじめてみた node.js / JavaScriptモジュールにしてみた。


何でもある npm になかったので、node.js の練習がてら作ってみました感じです。この記事ではバージョン0.2.0 です。

まだ作ってみたばっかで全然使ってないから API とかは変わるかもしれません。すいません。


インストール

npm だと、

$ npm install redmine

です。それ以外の方法はよく知りません。

使い方

example においてあるけど、

var Redmine = require('redmine');

var redmine = new Redmine({
  host: 'vivid-winter-3808.heroku.com',
  apiKey: 'xxxxxxxxxxxxxxxxx',
});

redmine.getIssues({project_id: 1}, function(err, data) {
  if (err) {
    // error
    console.log("Error: " + err.message);
    return;
  }

  console.log(data);

  // { offset: 0,
  //   total_count: 3,
  //   issues:
  //    [ { updated_on: '2012/01/13 03:18:30 +0900',
  //        priority: [Object],
  //        status: [Object],
  //        tracker: [Object],
  //        project: [Object],
  //        description: 'Test issue description',
  //        subject: 'This is test issue on 1326392307929',
  //        done_ratio: 0,
  //        created_on: '2012/01/13 03:18:30 +0900',
  //        start_date: '2012/01/13',
  //        author: [Object],
  //        id: 3 },
  // ...
});

的な感じ。

久々に Redmine の REST API 調べてたら Issues 以外にも API 増えてたから必要に応じて対応しようかな。

とりあえず Issues しか対応してないです。


APIとか

Redmine.getIssues(criteria, callback)
Redmine.postIssue(issue, callback)
Redmine.updateIssue(id, issue, callback)
Redmine.deleteIssue(id, callback)

いやこれやすいか微妙だからすぐかえるかも。なんたって 0.2.0 だから...。

なんとなく、

Redmine.issue.get(criteria, callback)
...
Redmine.issue.delete(id, callback)

とかのほうが使いやすいのでは(というか他のAPIに対応するため)、という気がしている。

まぁ適当にアップデートします。


その他

  • RedmineAPI テスト用に初めて heroku 使ってみたけど、すごいですね。やっぱりよくできてますね。
    • テスト用サイトはこちらですが、添付ファイルの永続化とかしてないし本番用に使う気はないのけど、とりあえずうごいている
  • node.js のパッケージもはじめて作ったけど簡単ですね。
    • npm publish で公開できるのはすごい。PHP でもこういう感じに簡単にしたいなあ。
  • test は見よう見まねで書き始めたけどちゃんと書きます書きます
  • node.js 楽しいです

参考にしたものたち: