yumでバージョン指定してインストールする

同僚に,yumで管理しているパッケージに追加でソフトウェアをインストールしたいのだけど
バージョンを上げないでやる方法はないかという質問を受けた.
インストールしたいパッケージ名の末尾にバージョン付けるだけなんですが,あんまり知られていないのでしょうか.

PostgreSQLにパッケージ追加する

yumでインストールされているPostgreSQL8.4.5のパッケージ群達.

# rpm -qa | grep -i postgres | sort
postgresql-libs-8.1.22-1.el5_5.1
postgresql84-8.4.5-1.el5_5.1
postgresql84-libs-8.4.5-1.el5_5.1
postgresql84-server-8.4.5-1.el5_5.1


ここに,postgresql84-pythonをいれようとするとレポジトリにある最新バージョンが候補としてあがる.

# yum install postgresql84-python
...
==================================================================================================================================
 Package                               Arch                   Version                             Repository                 Size
==================================================================================================================================
Installing:
 postgresql84-python                   i386                   8.4.7-1.el5_6.1                     updates                    57 k

Transaction Summary
==================================================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)


今回は8.4.5を入れたいので,パッケージ名の末尾にバージョンを付加してあげると希望に沿った形でインストール出来る.

# yum install postgresql84-python-8.4.5
...
==================================================================================================================================
 Package                                Arch                    Version                             Repository               Size
==================================================================================================================================
Installing:
 postgresql84-python                    i386                    8.4.5-1.el5_5.1                     base                     57 k

Transaction Summary
==================================================================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)


もちろん,レポジトリに存在していないバージョンは指定しても無理です.

# # yum install postgresql84-python-8.9.9
...
No package postgresql84-python-8.9.9 available.
Nothing to do


こんな感じ.

NetBeansのキーマップを変更する

NetBeansデフォルトのキーマップが気に入らない.[Ctl]+[H]が置換とか個人的には衝撃だった.


普段はLinuxのターミナルを触っていることが多いので,IDEを使った開発においても
改行と一文字削除については[Ctl]+[J]と[Ctl]+[H]を使いたいというのが希望.
秀丸も同じキーバインドだったので,エディタはそういう感じなんだと勝手に認識していた)


NetBeansには「キーマップ」を変更できる機能がついているので,そういった悩みは簡単に解消できる.
vimのキーマップに限りなく近い感じで使えるプラグインもあるんですけど,今回は二つのキーだけを上書き出来れば満足だった)

設定方法

1. [ツール] -> [オプション]を開く.
2. [キーマップ]タブを選択して,[ショートカットを検索]に設定したいキーマップの設定先を入力する
例)[Ctl]+[J]に改行を割り当てたかったら,[ENTER]を入力する
3. 該当の[ショートカット]右端にあるボタンをクリックして[代替を追加]を選択する.

f:id:mathtti:20110531220706p:image

4. (代替のショートカット)行が挿入されるので,そこに新しく埋め込みたいキーを入力して了解.
※代替ショートカットに割り振るキーに既存で役割がある場合は,既存役割を削除した方が良さそう.

f:id:mathtti:20110531220707p:image


たったこれだけで,自分なりのキーマップ設定が出来ます.簡単.

IDEでPHPを開発したい方に,NetBeansオススメです.

Zend_Db_SelectでネストされたSQLを使えるようにする

Zend_Db_SelectでネストされたSQLを使いたい.
つまり,こういうSQLを発行したい.

SELECT * FROM hoge WHERE A = 'xxx' AND (B = 'yyy' OR B = 'zzz');

少し調査をしていたら,そのようなメソッドは提供されていないので,
自分で作らなければいけないという情報を発見した.

なお、以下の様な「()」を利用した条件の設定は出来ません。
SELECT * FROM test WHERE name='hoge' AND (id='1' OR id='2')
現在のZend_Dbでは、このようなメソッドは提供されていないので、
「Zend/Db/Select.php」の「where」、「orWhere」メソッドを拡張、または機能を追加します。


引用元:Zend Frameworkについて(DB編3):なまはげ カンタービレ


自分の手元にある最新バージョン(Select.php 23775 2011-03-01 17:25:24Z)でもやはり提供されていなかった.
いつもなら諦めるけど,今回はどうしても使いたかったのでメソッドを作成することにした.

使い方

<?php
$select->orWhereNest(array(array('B = ?', 'yyy'), array('B = ?', 'zzz'));
?>

生成されるSQL

SELECT * FROM hoge WHERE A = 'xxx' AND (B = 'yyy' OR B = 'zzz');

関数

<?php
// Zend/Db/Select.phpに追記
public function orWhereNest($conditions)
{
    if (!is_array($conditions)) return false;
    $_where = null;
    foreach ($conditions as $condition_key => $condition) {
        $_first_flag = true;
        if ($this->_parts[self::WHERE]) {
            foreach ($condition as $c) {
                if (is_null($c[1])) ? $c[1] = null : '';
                if ($_first_flag) {
                    $_where .= $this->_where(' ( ' . $c[0], $c[1], null, true);
                } else {
                    $_where .= $this->_where($c[0], $c[1], null, false);
                }
                $_first_flag = false;
            }
        }
        else {
            $_where .= ' ( ';
            foreach ($condition as $c) {
                if (!$_first) $_where .= ' OR ';
                if (is_null($c[1])) ? $c[1] = null : '';
                $_where     .= $this->_where($c[0], $c[1], null, false);
                $_first_flag = false;
            }
        }
        $_where .= ' ) ';
    }
    $this->_parts[self::WHERE][] = $_where;

    return $this;
}
?>

対応していること,いないこと

対応してる
  • ネストされたSQLが生成できる.
  • プリペアドステートメントに対応している.
対応していない
  • ネストされた中での[AND|OR]の判別してない.必ずORになる.
  • 前に条件がある場合は必ず、AND (〜)という形式になる.

※今回はそこまで必要なかったので作成していないですが,上の関数をいじれば簡単に出来るかと思います.
使いたい方がいらっしゃったら,ご自由にお使いください(責任は取れませんが…).


という感じで,無事に使えるようになりました.

PDOのプレースホルダからIN演算子を使いたい(けど,使えない)

PDOのプレースホルダから,IN演算子を使いたくて試してみたけど,どうにも使えない.

Zend_Db_Selectから以下のようなコードを書くと,

<?php
$select = Zend_DBオブジェクト->select();
// ごにょごにょ
$select->where('condition IN(?)', array('hoge', 'fuga'));
?>

こんな感じのSQLが生成される.

SELECT ごにょごにょ WHERE condition IN ('hoge', 'fuga');

PDOのプレースホルダで投げようとするとエラーになってしまう.

<?php
// Array to string conversionっていうエラーが返ってくる
$pdo->query('SELECT ごにょごにょ WHERE condition IN(?)', array(array('hoge', 'fuga'))->fetchAll();
// エラーにはならないけど,もちろんちゃんと動かない.
$pdo->query('SELECT ごにょごにょ WHERE condition IN(?)', array("'hoge', 'fuga'")->fetchAll();
?>

何か根本的な勘違いをしているのだろうか...
Zend_DB_Selectのように,コード側で動的にSQL作る関数を用意しておくしかないのだろうか...

と言いつつ,いつもはループでOR演算子を繋げてます.


参考URL:
PDOを使用し複数キーワードでOR条件のDB検索