Pages

2013年11月22日金曜日

2013年10月8日火曜日

ZendFramework2 レイアウトを利用しない場合

Layout を利用したくない場合は下記のような感じでやるようです。

<?php
// TestController.php
public function listAction()
{
    $viewModel = new ViewModel();
    $viewModel->setTerminal(true);
    $viewModel->data = 'test value';
    return $viewModel;
}
?>
<?php
// list.phtml
<?php echo $data; ?>

$this->layout()->clearOptions();
$this->layout()->clearVariables();
$this->layout()->clearChildren();
$this->layout()->>setTerminal(true);

とかも試してみましたがダメでした。

2013年9月27日金曜日

ZendFramework2 Layoutファイルにコントローラーから値をアサインする時

layout じゃなくて中身(コンテンツ?)のテンプレートファイル(.phtml)だと、アクションの最後で

return new ViewModel(array(
    'form'      => $form,
    'param1' => $param1,
));

でOKなんですが、これ layout の.phtmlファイルでもアサインされてると思ってたらされてないようです。。

という事でコントローラーからアサインする時には 中身 と レイアウト で別にアサインする必要があるようです。

具体的な方法はこんな感じです。

$this->layout()->param1 = $param1;
$this->layout()->param2 = $param2;

$this->layout()->setVariable('param1', $param1);
$this->layout()->setVariable('param2', $param2);

$this->layout()->setVariables(array(
    'param1' => $param1,
    'param2' => $param2,
));

※アクション内に記述する内容です。

2013年9月26日木曜日

ZendFramework2 toRouteの使い方

/mod/con/act というURLにリダイレクトしたいと思った時の toRoute の1つ目のパラメータ $route の指定方法がちょっと不明だったので、メモ。

最初こんな風に書いてみた。。

return $this->redirect()->toRoute('/mod/con/act');
return $this->redirect()->toRoute('mod/con/act');

ん~ どちらもダメ。。

正解は

return $this->redirect()->toRoute('mod\con', array('action'=>'act'));

'mod\con' これは module.config.php で下記のように定義している。

'mod\con' => array(
    'type'    => 'segment',
    'options' => array(
        'route'    => '/mod/con[/:action]',
        'constraints' => array(
            'action' => '[a-zA-Z][a-zA-Z0-9]*',
        ),
        'defaults' => array(
            'controller' => 'Mod\Controller\Con',
        ),
    ),
),

ZendFramework2 DateTimeSelectを使ってみた3

ん~ なんか色々ハマったけど、何とか動くものができた。

まず標準の DateTimeSelect のままではエラーが出るので、 オリジナルのDateTimeSelectを追加。
と言ってもDateTimeSelectを継承して

  • getHoursOptions
  • getMinutesOptions
  • getSecondsOptions
をオーバーライドしたものです。

\module\Application\config\module.config.php

\module\Application\config\module.config.php

'view_helpers' => array(
    'invokables' => array(
        'formDateTimeSelect2' => 'Application\View\Helper\FormDateTimeSelect2',
    ),
),
を追加する。 次に Application\View\Helper\FormDateTimeSelect2.php を追加する。 中身はこんな感じ。

\module\Application\src\Application\View\Helper\FormDateTimeSelect2.php

namespace Application\View\Helper;

use DateTime;
use IntlDateFormatter;
use Zend\Form\View\Helper\FormDateTimeSelect;

class FormDateTimeSelect2 extends FormDateTimeSelect
{
    protected function getHoursOptions($pattern)
    {
        $keyFormatter   = new IntlDateFormatter($this->getLocale(), null, null, null, null, 'HH');
        $valueFormatter = new IntlDateFormatter($this->getLocale(), null, null, null, null, $pattern);
        $date           = new DateTime('1970-01-01 00:00:00');

        $result = array();
        for ($hour = 1; $hour <= 24; $hour++) {
            $key   = $keyFormatter->format($date->getTimestamp());
            $value = $valueFormatter->format($date->getTimestamp());
            $result[$key] = $value;

            $date->modify('+1 hour');
        }
        return $result;
    }
    protected function getMinutesOptions($pattern)
    {
        $keyFormatter   = new IntlDateFormatter($this->getLocale(), null, null, null, null, 'mm');
        $valueFormatter = new IntlDateFormatter($this->getLocale(), null, null, null, null, $pattern);
        $date           = new DateTime('1970-01-01 00:00:00');

        $result = array();
        for ($min = 1; $min <= 60; $min++) {
            $key   = $keyFormatter->format($date->getTimestamp());
            $value = $valueFormatter->format($date->getTimestamp());
            $result[$key] = $value;

            $date->modify('+1 minute');
        }

        return $result;
    }
    protected function getSecondsOptions($pattern)
    {
        $keyFormatter   = new IntlDateFormatter($this->getLocale(), null, null, null, null, 'ss');
        $valueFormatter = new IntlDateFormatter($this->getLocale(), null, null, null, null, $pattern);
        $date           = new DateTime('1970-01-01 00:00:00');

        $result = array();
        for ($sec = 1; $sec <= 60; $sec++) {
            $key   = $keyFormatter->format($date->getTimestamp());
            $value = $valueFormatter->format($date->getTimestamp());
            $result[$key] = $value;

            $date->modify('+1 second');
        }

        return $result;
    }
}
phtmlファイルでは下記のように記述

formDateTimeSelect2($form->get('date_from'), IntlDateFormatter::SHORT, IntlDateFormatter::LONG, 'ja'); ?>
これで動くはずです。

余談ですが、サンプルのAlbumモジュールのように実装してもvalidatorのところが上手く動作しません。
\Zend\Form\Element\DateTimeSelect.php::getInputSpecification
を見ると解るんですが、下記のようにフィルターでコールバックを追加してStringに変換しなければなりません。
そして、ValidatorでDateでチェックするようです。


protected function getValidator()
{
    if (null === $this->validator) {
        $this->validator = new DateValidator(array('format' => 'Y-m-d H:i:s'));
    }

    return $this->validator;
}

public function getInputSpecification()
{
    return array(
        'name' => $this->getName(),
        'required' => false,
        'filters' => array(
            array(
                'name'    => 'Callback',
                'options' => array(
                    'callback' => function($date) {
                        // Convert the date to a specific format
                        if (is_array($date)) {
                            if (!isset($date['second'])) {
                                $date['second'] = '00';
                            }
                            $date = sprintf('%s-%s-%s %s:%s:%s',
                                $date['year'], $date['month'], $date['day'],
                                $date['hour'], $date['minute'], $date['second']
                            );
                        }

                        return $date;
                    }
                )
            )
        ),
        'validators' => array(
            $this->getValidator(),
        )
    );
}
これをデフォルトとしてFormオブジェクト作成時にセットしたいんですが、ちょっとやり方が解りませんでした。。

そこで、アクション内で

\module\Album\src\Album\Controller\IndexController.php

if ($request->isPost()) {
    $album= new Album();
    $form->setInputFilter($album->getInputFilter($form->getInputFilter()));
    $form->setData($request->getPost());
...

\module\Album\src\Album\Model\Album.php

public function getInputFilter(InputFilterInterface $defaultInputFilter = NULL)
{
    if (!$this->inputFilter) {
        if (is_null($defaultInputFilter)) {
            $inputFilter = new InputFilter();
        } else {
            $inputFilter = $defaultInputFilter;
        }
    }
    $factory     = new InputFactory();
という感じにしました。

ZendFramework2 DateTimeSelectを使ってみた2

DateTimeSelect が使えない問題が解決しました。

問題はレンダリング時にありました。

ファイルは
\Zend\Form\View\Helper\FormDateTimeSelect.php

こいつの最後の方にある
  • getHoursOptions
  • getMinutesOptions
  • getSecondsOptions
これです。

$date           = new DateTime('1970-01-01 00:00:00');
$key   = $keyFormatter->format($date);

途中略してますが、こんな感じで IntlDateFormatter::format のパラメータに DateTime オブジェクトを指定しているんです。

この format メソッドに DateTime オブジェクトを指定できるのは
変更履歴を見ると解るんですが、5.3.4から対応している。

そして、利用しているサーバーの intl のバージョンを確認。

# yum list install php-intl

すると結果は

php-intl.x86_64  5.3.3-23.el6_4  @updates

ってな感じで5.3.3でした。。
なので、エラーが出て時、分、秒が出てない状況だっというわけです。。

RHEL7 では5.4か5.5が標準パッケージで入りそうなので、それを利用できれば解決しそうですが、実際に利用されるまでにはあと1年以上はかかる気がするので、 intl 5.3.3 で動く方法を探すしかないですね。。

2013年9月24日火曜日

ZendFramework2 DateTimeSelectを使ってみた1

DateSelectを使ってみたんやけど、DateTimeSelectの存在を知ったのでついでに使ってみた。
でも。。

時、分のセレクトエレメントは出力されるけど、optionが空でセットされてない。。
なぜ。。?

 しかもTimeはあるけどTimeSelectは無いんですね。。

2013年9月20日金曜日

ZendFramework2 新しく追加された日付エレメント DateSelect を使ってみた

ZF2で追加された日付エレメント

オプションは以下のように指定。 月の日本語化は /module/Application/language 内の ja_JP.po に追記してmoファイルを作成、上書き。
$this->add(array(
    'name' => 'birthday',
    'type' => 'DateSelect',
    'options' => array(
        'create_empty_option' => false,
        'max_year' => date(Y) + 1,
        'min_year' => '2013',
        'year_attributes' => array(
            'class' => 'span2',
            'value' => date('Y'),
        ),
        'month_attributes' => array(
            'class' => 'span1',
            'value' => date('m'),
        ),
        'day_attributes' => array(
            'class' => 'span1',
            'value' => date('d'),
        ),
        'month_values' => array('1' => '11'),
        'format' => 'Y-m-d',
    ),
));
しかし。。 無い。。 これ出力すると 月、日、年 という国際仕様(?)となる。。 指定する方法が見当たらない。。 仕方ないので、 View側でやってみると
formElement($form->get('birthday')); ?>
formElement($form->get('birthday')->getYearElement()); ?>
formElement($form->get('birthday')->getMonthElement()); ?>
formElement($form->get('birthday')->getDayElement()); ?>
だと出るけど
formElement($form->get('birthday')->getYearElement()); ?>
formElement($form->get('birthday')->getMonthElement()); ?>
formElement($form->get('birthday')->getDayElement()); ?>
だと中身が空っぽ。。 使い方間違ったのか対応していないのか。。 今日はここまで。 誰か知ってたら教えてください。。

2013年9月19日木曜日

ZendFramework2 LIKE句の指定が可能になった

以前は対応していなかったLIKE検索がついに対応してくれてる~~。
tableGateway = $tableGateway;
    }

    public function select()
    {
        $select = $this->tableGateway->getSql()->select();
        $select->where->like('col1', '%foo%');
    }
...
でも。。 LIKE用のエスケープが無い。。。。 2時間探しても見つけられない。。。 そんな事は無いだろう。。。 でも無い。。。 そこは自作って事なのか。。

2013年9月12日木曜日

ZendFramework2 Form の isValid でエラーメッセージは無いが false となる現象でハマる。。

まずは下記のような感じで書いてました。 $authは認証機能のmodelです。
$form = new LoginForm();
$form->setInputFilter($auth->getInputFilter());

if ($form->isValid()) {
  var_dump('OK');
} else {
  var_dump($form->getMessages());
}
症状は $form->isValid() の返り値はずっと false を返して、 $form->getMessages() は空っぽという何故。。 という状態でした。 で、LoginForm ファイルばっかり気にしてたんですが、原因は $auth->getInputFilter() でした。。 途中で消したElementがあったんですが、それが $auth->getInputFilter() の方では残っていましたので、これが原因でしたとさ。。

ZendFramework2 Validateのエラー文言を日本語化

今回はモジュール別ではなく全体で一先ずは日本語化したかったので、Application の onBootstrap で setDefaultTranslator を指定しました。

/module/Application/Module.php

下記は追記分だけを記載しています。上書きという意味では無いです。。 onBootstrap にデフォルト何が記載されていたのかを忘れたので。。

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        $sm = $e->getApplication()->getServiceManager();
        \Zend\Validator\AbstractValidator::setDefaultTranslator($sm->get('translator'));
    }
}

/module/Application/config/module.config.php

下記は追記分だけを記載しています。上書きという意味では無いです。。 onBootstrap にデフォルト何が記載されていたのかを忘れたので。。

return array(
    'translator' => array(
        'locale' => 'ja_JP',
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
    ),
);
上記を下記のように追記
return array(
    'translator' => array(
        'locale' => 'ja_JP',
        'translation_file_patterns' => array(
            array(
                'type'     => 'gettext',
                'base_dir' => __DIR__ . '/../language',
                'pattern'  => '%s.mo',
            ),
        ),
        'translation_files' => array(
            array(
                'type'     => 'phpArray',
                'filename' => 'resources/languages/ja/Zend_Validate.php',
                'locale'   => 'ja_JP',
            ),
        ),
    ),
);

もしかして

'resources/languages/ja/Zend_Validate.php' が無い人は恐らくcomposer を利用してセットアップしていないせいかなと思いますので。 無ければ /vendor/zendframework/zendframework/resources を直接参照するかパスが通るようにコピーしたらOKです。


2013年8月28日水曜日

ZendFramework2 モジュール毎の共通処理を追加

以前からモジュール毎のレイアウト指定については
http://developer.unlax.com/2012/11/modulelayout.html
などで、ちょこちょこ調べてたんですが、
今回もモジュール単位の共通処理を追加したくてちょっと調べました。

具体的にやりたかった事は

  • 基本レイアウト指定
  • 404エラー時のレイアウト指定

とりあえずはこんなところでした。

まずどのタイミングで指定するかなんですが、これは MvcEvent クラスの定数を確認。

すると、下記の7つがありました。

  1. MvcEvent::EVENT_BOOTSTRAP
  2. MvcEvent::EVENT_DISPATCH
  3. MvcEvent::EVENT_DISPATCH_ERROR
  4. MvcEvent::EVENT_FINISH
  5. MvcEvent::EVENT_RENDER
  6. MvcEvent::EVENT_RENDER_ERROR
  7. MvcEvent::EVENT_ROUTE
次に順番を確認すると

通常の時

  1. route
  2. dispatch
  3. render
  4. finish

エラー(404)の時

  1. dispatch.error
  2. render
  3. finish
EVENT_RENDER_ERROR はビュー側の処理でエラーの時に通るのかな。。って今回は必要無いの調べてないです。
EVENT_BOOTSTRAP は今回 Module.onBoot() 内で確認したので、取れませんでした。

で、結局どうしたかと言うと1分の画面で違うレイアウトを指定はやっぱり

$this->layout('layout/layout2');
※詳しくは下記などを参考に
http://web-terminal.blogspot.jp/2013/03/layoutpluginzendframework2zf2.html

のよう指定できるようにはしておきたいので、
「基本レイアウト指定」については MvcEvent::EVENT_ROUTE でやりました。
MvcEvent::EVENT_DISPATCH でやってるサンプルも見ましたが、それだと上記の指定時にちょっと処理入れないとダメなので。。

で、「404エラー時のレイアウト指定」については MvcEvent::EVENT_DISPATCH_ERROR でステータスコードをチェックしてやりました。

サンプル

Module.php

<?php
namespace Application;

use Zend\Mvc\MvcEvent;

class Module
{
    public function onBootstrap(MvcEvent $e)
    {
        $eventManager        = $e->getApplication()->getEventManager();
        $moduleRouteListener = new ModuleRouteListener();
        $moduleRouteListener->attach($eventManager);
        $eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'setLayout'));
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'setErrorLayout'));
    }

    public function setLayout($e)
    {
        $matches    = $e->getRouteMatch();
        $controller = $matches->getParam('controller');
        if (0 !== strpos($controller, __NAMESPACE__ .'\\')) {
            return;
        }
        $e->getViewModel()->setTemplate(strtolower(__NAMESPACE__) . '/layout/layout');
    }

    public function setErrorLayout($e)
    {
        $response = $e->getResponse();
        if ($response->getStatusCode() == 404) {
            $e->getViewModel()->setTemplate(strtolower(__NAMESPACE__) . '/error/404');
            return;
        }
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
}

Application/config/module.config.php

上記修正により 'layout/layout' では通らなくなったので、'application/layout/layout' に変更。

    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),
↓↓↓↓↓↓↓
    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'application/layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index'   => __DIR__ . '/../view/application/index/index.phtml',
            'application/error/404'     => __DIR__ . '/../view/error/404.phtml',
            'application/error/index'   => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),

Mod2/config/module.config.php

mod2/layout/layout ファイル名はモジュール毎に用意デフォルトを用意するという事で、 mod2 の module.config.php を編集しました。

    'view_manager' => array(
        'template_map' => array(
            'mod2/layout/layout'       => __DIR__ . '/../view/layout/layout.phtml',
            'mod2/error/404'           => __DIR__ . '/../view/error/404.phtml',
        ),
        'template_path_stack' => array(
            'admin' => __DIR__ . '/../view',
        ),
    ),

2013-08-24 追記

上記の方法ダメでした。。
ちょっと各モジュール毎のModule.phpの動きを勘違いしていました。。

という事で config には上記の用に 'mod2/layout/layout' を追記しておきsetTemplateはコントローラー毎に onDispatch を上書きする事にしました。
モジュール毎に共通化するなら継承用のクラスを用意してそこに onDispatch を記述するかですかね。。

ついでに謎になったのが、アクションが無いってエラーとその他の404系は違う扱いなんですね。。

というかアクセスした Module.php だけ読み込んでくれたらいいのにな。。
以下サンプル。 return parent::onDispatch($e); 内でアクション内の処理が実行されるので、それより前に書いておけばアクション内で指定するもので上書きされるので、 一部だけレイアウト指定した時に意識する必要は無いです。

IndexController.php

    public function onDispatch(MvcEvent $e)
    {
        $e->getViewModel()->setTemplate('mod2/layout/layout');
        return parent::onDispatch($e);
    }

2013年7月24日水曜日

Word Press に公開期限機能を追加

まずは「Simple expires」を追加してみたが、期限設定する事がデフォルトになっていたので、別のを探してみたで、「Post Expirator」を入れてみた。
どうやらこちらの方が知名度は高い様子。

でも9時間の時差が発生してしまうなどの問題があるという記載も見たけど、これはPHPのタイムゾーンが設定されてない事が原因なようで、

http://mekemoke.jp/2012/09/63.html

を見るとfunction.phpに追記して解決する様子。
※今回の環境では対応の必要は無しでした。

「Post Expirator」の方が高機能でもちろんデフォルトは期限無しなので、良い感じでした。
日本語ではなかったですが、これも

http://mekemoke.jp/2012/09/63.html

で辞書ファイルが提供されていたので、一先ずはこれで十分。

2013年6月10日月曜日

タグ入力補助ツール

Google+の公開範囲指定部分のUIを求められる事が多くなってきている気がしますが、
その中でちょっと良さそうなものを発見したので、メモメモ

・Selectize.js
http://brianreavis.github.io/selectize.js/

・Tag-it!
http://aehlke.github.io/tag-it/

使うならSelectize.jpで問題あればTag-it!に切り替えるかな。。
他のは今のところ良さそうなのが、今のところ見つけておらず。。

2013年4月7日日曜日

2013年3月13日水曜日

Zend Framework2 の ZFTool を利用してみる

http://framework.zend.com/manual/2.1/en/modules/zendtool.introduction.html

を参考に今回はComposerを入れるのも嫌だったので、Manual installation コースでお試しです。

vendor 以下に ZFTool というディレクトリで設置。
vendor/ZFTool ってとこですね。

$ php zf.php
と実行するも preg_match のエラーがやたらと出る。。

どうやら
http://d.hatena.ne.jp/kou_i/20111120/1321778316
を見ると PCRE のバージョンが7.0より古いからだと。。
確認すると 6.6 だった。。

仕方ないPCREをアップデートするか。。
ってyumからはちょっとレポ追加する事になりそうだったので、ソースからする事に。

http://d.hatena.ne.jp/IT7C/20101003/1286086401
を参考に入れる。
入らない。。

http://d.hatena.ne.jp/rx7/20081031/p1
を見るとどうやら gcc-c++ が必要だと。。
確認するとたしかに入ってない。。

それはyumから追加

これでpcreを
# ./configure
# make
でエラーが出ない事を確認して、yumで古いPCREを削除して。。。。。。。。
ダメだ関連パッケージがやばすぎる。。

って事でやめました。。
おとなしくCentOS6環境を用意する事に。。

Zend Framework2 チュートリアルのセットアップ

公式のサンプルソースは全て
https://github.com/zendframework
で入手可能。

ひとまずそこから ZendSkeletonApplication を取得
https://github.com/zendframework/ZendSkeletonApplication
※ZIPボタンからダウンロード

これを解凍して設置したい場所にアップロードする。
※別にサーバー上で解凍してももちろんOK。。
※ドキュメントルートは public に設定するので、ドキュメントルートの1階層上になる感じで。

次にサーバーにtera termやらで接続して、アップしたディレクトリ内の composer.phar があるディレクトリに移動する。

で、
$ php composer.phar self-update
$ php composer.phar install
と実行する。

すると vendor 内にフレームワークが取り込まれる。
これで基本設置は完了で、ここからチュートリアルのソースを設置する。
試しにアクセスしてみると、Welcomeなんちゃらってページが表示される。たしかそんなんだった。。

チュートリアルは zf2-tutorial という名前である。
https://github.com/zendframework/zf2-tutorial
からソースを取得して、解凍してアップする。

この時に自分はフレームワークは新しい方が良かったので、
composerなど不要と思われるものはアップしませんでした。
試しにアップして

$ php composer.phar self-update
$ php composer.phar install
してみると解るんだが、ダウングレードされました。

で、このままの状態でアクセスすると下記のようなエラーがでる。。

An exception was raised while creating "Album\Model\AlbumTable"; no instance returned

原因はDBに接続できてないから。
/config/autoload/local.php.dist
の中身を修正してファイル名を
/config/autoload/local.php
に変更する。

これでページにアクセスすると下記のようなチュートリアルページが表示されて終了~。

自分で勉強しながらって人は過去の記事にも書いた気がするけど、
http://framework.zend.com/manual/2.1/en/user-guide/modules.html
を追って行けばできます。






2013年3月12日火曜日

MongoDb を入れてみた


CentOS 5.8 に MongoDb 2.2.3 を入れてみた。

$ su -
# cd /usr/local/src
# wget http://downloads.mongodb.org/linux/mongodb-linux-i686-2.2.3.tgz
# tar zxvf mongodb-linux-i686-2.2.3.tgz
# mv mongodb-linux-i686-2.2.3.tgz ../

# ln -s /usr/local/mongodb-linux-i686-2.2.3 /usr/local/mongodb
# ln -s /usr/local/mongodb/bin/bsondump /usr/local/bin/bsondump
# ln -s /usr/local/mongodb/bin/mongo /usr/local/bin/mongo
# ln -s /usr/local/mongodb/bin/mongod /usr/local/bin/mongod
# ln -s /usr/local/mongodb/bin/mongodump /usr/local/bin/mongodump
# ln -s /usr/local/mongodb/bin/mongoexport /usr/local/bin/mongoexport
# ln -s /usr/local/mongodb/bin/mongofiles /usr/local/bin/mongofiles
# ln -s /usr/local/mongodb/bin/mongoimport /usr/local/bin/mongoimport
# ln -s /usr/local/mongodb/bin/mongorestore /usr/local/bin/mongorestore
# ln -s /usr/local/mongodb/bin/mongos /usr/local/bin/mongos
# ln -s /usr/local/mongodb/bin/mongosniff /usr/local/bin/mongosniff
# ln -s /usr/local/mongodb/bin/mongostat /usr/local/bin/mongostat

# useradd mongod
# mkdir -p /var/lib/mongo
# mkdir -p /var/log/mongo
# chown mongod.mongod /var/lib/mongo
# chown mongod.mongod /var/log/mongo

自動起動のためにソース版からちょこっとファイルを拝借。。

# cd /usr/local/src
# wget http://downloads.mongodb.org/src/mongodb-src-r2.2.3.tar.gz
# tar zxvf mongodb-src-r2.2.3.tar.gz
# cd mongodb-src-r2.2.3/rpm
# cp init.d-mongod /etc/rc.d/init.d/mongod
# vi /etc/rc.d/init.d/mongod
-----
mongod=${MONGOD-/usr/bin/mongod}
-----
↓ 修正

-----
mongod=${MONGOD-/usr/local/bin/mongod}
-----


# chmod +x /etc/rc.d/init.d/mongod
# cp mongod.conf /etc/mongod.conf

# service mongod start
# chkconfig mongod on

Redisを入れてみた

今回入れたサーバーは CentOS 5.8 32bit です。


$ su -
# cd /usr/local/src
# wget http://download.redis.io/redis-stable.tar.gz
# tar zxvf redis-stable.tar.gz
# cd redis-stable
# make

CC sentinel.o
LINK redis-server
zmalloc.o: In function `zmalloc_used_memory':
/usr/local/src/redis-stable/src/zmalloc.c:223: undefined reference to `__sync_add_and_fetch_4'
collect2: ld returned 1 exit status
make[1]: *** [redis-server] Error 1
make[1]: Leaving directory `/usr/local/src/redis-stable/src'
make: *** [all] Error 2
こんなエラーで中断
一先ず
# make clean

http://stackoverflow.com/questions/13472631/redis-installation-error-on-centos-5-8
を参考に

# cd src
# vi Makefile

-----
$(MAKE) CFLAGS="-m32" LDFLAGS="-m32"
-----

-----
$(MAKE) CFLAGS="-m32 -march=i686" LDFLAGS="-m32"
-----
に修正

続いて
# vi .make-settings

-----
OPT=-O2
-----

-----
OPT=-O2 -march=i686
-----
に修正

# cd ..
# make 32bit
# make test

tcl8.5が必要ってエラー出るのでテストはやめて

# make install

動作確認
redis-server
これでサーバを起動

起動させたまま、別のターミナルで
$ redis-cli
$ redis> ping
PONG
$ redis> set foo bar
OK
$ redis> get foo
"bar"
$ redis> quit

自動起動の設定
# cd /usr/local/src/redis-stable/utils
# ./install_server.sh

全部デフォルトで

Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
s#^port [0-9]{4}$#port 6379#;s#^logfile .+$#logfile /var/log/redis_6379.log#;s#^dir .+$#dir /var/lib/redis/6379#;s#^pidfile .+$#pidfile /var/run/redis_6379.pid#;s#^daemonize no$#daemonize yes#;
which: no chkconfig in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/goontic/bin)
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
which: no chkconfig in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/goontic/bin)
./install_server.sh: line 178: update-rc.d: command not found
 exists, process is already running or crashed
Installation successful!

# vi /etc/init.d/redis_6379

何故か上の方の改行がおかしかったので、修正して

2行目に下記を追加
-----
# chkconfig:    345     80      20
# description: anything
-----

-----

#/bin/sh
# chkconfig:    345     80      20
# description: anything

#Configurations injected by install_server below....

EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_6379.pid
CONF="/etc/redis/6379.conf"

REDISPORT="6379"

###############

-----

# service redis_6379 start

# chkconfig redis_6379 on

Followers