Archive for the ‘PHP’ Category

phpenv で入れた PHP に pdo_pgsql をインストール

実際は前の記事の前にやったんですけど、動かしたいソフトが使っていたのはpdo_pgsqlじゃなかったのでありました。

ということで、環境は前の記事と同じでPostgres.appを使用しててPostgreSQLのバージョンは9.3.5.0。対象のPHPのバージョンは5.5.14です。anyenvもからんでいるのでphpenv単独の場合とは少しディレクトリ構成が違う点にご注意ください。

以下の記事を参考に作業しました。

.phpenvで入れた場合のpeclモジュールの追加方法

まずはpeclのサイトからpdo_pgsqlを取ってきて解凍。

$ cd tmp
$ wget http://pecl.php.net/get/PDO_PGSQL-1.0.2.tgz
$ tar zxvf PDO_PGSQL-1.0.2.tgz
$ cd PDO_PGSQL-1.0.2

ぺちぱいず(読み方不明)だ!

$ phpize

こんふぃぎゅあしてめいくしましょう。

$ ./configure --with-pdo-pgsql=/Applications/Postgres.app/Contents/Versions/9.3/bin
$ make

インストール内容を確認してから

$ make test

インストール。

$ make install

有効化するためにpdo_pgsqのためのiniファイルを作成。

$ vim /Users/murave/.anyenv/envs/phpenv/versions/5.5.14/etc/conf.d/pdo_pgsql.ini

内容。

extension=pdo_pgsql.so

php.iniに直接追加してもいいけどphp.iniがリセットされて泣いたりするかもしれないから分けておくといいと思う(経験者)。

確認。

$ php -i | grep pdo_pgsql
Facebooktwitterlinkedintumblrmail

phpenv + php-build で php_pgsql を有効化したPHPをインストール

開発環境のMacでPHPからPostgreSQLにアクセスできなくてアレレ〜となったので入れなおしました。その際のメモをまとめておきます。

Postgres.appを使用しており、PostgreSQLのバージョンは9.3.5.0です。

インストールしたPHPのバージョンは5.5.14。

anyenvもからんでいるのでphpenv単独の場合とは少しディレクトリ構成が違う点にご注意ください。

php_pgsqlを有効にするためにconfigure_optionを追加します。

$ vim /Users/murave/.anyenv/envs/phpenv/share/php-build/definitions/5.5.14

編集します。

configure_option "--with-pgsql" "/Applications/Postgres.app/Contents/Versions/9.3/bin"
install_package "http://php.net/distributions/php-5.5.14.tar.bz2"
install_pyrus
install_xdebug "2.2.5"
enable_builtin_opcache

configure_option “–with-pgsql” の行を追加しました。ここはPostgreSQLの導入状況にあわせる必要があります。

インストールします。

$ phpenv install 5.5.14

インストールしたPHPに切り替えて確認。

$ phpenv global 5.5.14
$ phpenv rehash
$ php -i | grep pgsql
Facebooktwitterlinkedintumblrmail

baserCMS2系から3系への道(アップデートメモ)

 オレはようやくのぼりはじめたばかりだからな
       このはてしなく遠いbaserCMS坂をよ… 未完

という気持ちになるくらいイロイロとありましたが(2日かかってしまいました)、無事2.1.1から3.0.2へ移行できました。注意点のメモを残します。

まずは、移行作業の参考にさせていただいたサイト。

本家本元、
 baserCMS開発ブログ『baserCMS 2.1系 から baserCMS3に移行する』

うっかりナスビさんでもお馴染み我流さんの、
 我流天性 がらくた屋『baserCM2.1.2から 3.0.0へ移行を試してみたよ』

作業手順については上記、2つサイトを参考にすれば問題ないと思います。
移行作業で使用するプラグインは、現在、baserマーケットからダウンロード出来ます。
DBマイグレーター(作業時バージョン1.0.3)
アドオンマイグレーター(作業時バージョン1.0.1)

では、はじめに大事なことを。
普通に運用しているサイトであれば重要なのは1点。

 「まず、3.0.0に移行するのだ! 後のアップデートは3.0.0で動いてからだ!」

baserCMSユーザーズフォーラムの「2→3 の移行途中で /maintenance/index に強制リダイレクト」というトピックに書きましたが、DBマイグレーターの移行対象は(現状)、3.0.0のみだと思われます。

よって、一旦3.0.0で対応作業を行ってから以降のバージョンへのアップデートを行う、という手順で比較的容易に移行できると思います(移行用プラグイン優秀!)。

私が作業していた時には http://basercms.net/download/past から3系の旧バージョンがダウンロード出来なくなっていたのですが、素早く対応していただき、現在はダウンロード出来るようになっています。

私の最初の一日は3.0.2へのデータ復元後のメンテナンス画面への強制リダイレクトやデータベースアクセスエラーの原因を調べるのに費やされました。この情報で、みなさんの一日が守られればと思います。

以降はサイトの状況によってまったく異なってくると思いますので参考程度に。
弊社の場合はいろいろとカスタマイズしていたので様々な問題がでました。デバッグモードで動かし、表示されるNoticeを一つ一つ潰していきました。

・プラグインが無効化されずにサイト全体が死亡
 DBマイグレーターで変換したデータを3.0.0に復元した後、なぜかプラグインが無効化されておらず、プラグイン周りでエラーが発生してサイトが死亡しました。データベース直編集でプラグインを無効化してエラーを回避しました。

・テーマヘルパーでエラー
 テーマヘルパーはアドオンマイグレーターの変換では動作しませんでした。まずはテーマヘルパーを使用しているところをコメントアウトしてサイトが動作する状況にした後、デフォルトのヘルパーを参考に手作業で対応作業を行いました。

・カスタマイズしていたサイトマップでエラー
 前の記事をご参照下さい。

・パンくず周りの変更に対応
 古いテーマだとパンくず周りで「Not Found: …/elements/navi.php」といったNoticeが出てパンくずが正常に動作しません。3系に添付されているテーマの elements/crumbs.php をコピー、カスタマイズして対応するのが良いと思います。

・$bcBaser->paramsの値を直接参照していたところでエラー
 反則に近いかもしれないのですが$bcBaser->params(2系の場合)中の値を直接参照して判定を行っていた箇所が結構ありまして、エラーとなりました。$this->BcBaser->params(3系の場合)の内容を調べて、同様の動作をするように書き換えました。3系のほうが情報が増えていて便利でした。

・3.0.0セットアップ時テーマのメールフォームと移行元メールフォームのフィールドが混在
 これはプラグインが無効化されなかったときに直接データベースをいじって対応したのが原因かもしれないのですが(データ復元時にエラーが出ていたのかもしれない)、既存テーマのcontactメールフォームと移行元のcontactメールフォームのフィールド情報などが混在状態になってしまい難儀しました。既存テーマの情報をデータベースから直接削除するなどして対応しました。

以上、アップデートメモでした。

Facebooktwitterlinkedintumblrmail

baserCMS3系でのサイトマップカスタマイズ

bserCMS3系へのメジャーバージョンアップからはや半年以上、やっと弊社サイトを2.1.1から3.0.2へバージョンアップしました。

バリバリにカスタマイズしているので腰が引けていたのです。

旬を外していたり、イレギュラーなカスタマイズをやっていたりでバージョンアップにはかなり苦労したのですが、その話は次にとっておきまして、まずは以前書いた『baserCMSのサイトマップをカスタマイズ』のフォローを。

上記記事のコードですが、アドオンマイグレーター(http://barket.jp/products/detail.php?product_id=11)でテーマを変換しただけでは(やはり)動きませんでした。

少し修正が必要でしたので修正後の弊社のサイトマップのコードを置いておきます。参考にどうぞ。

BcBaser->sitemap() で呼び出す
 */
//ここから設定
//表示しないurl
$disables = array(
'/index_test',
);

//$inserts = array(before_url=>array(title, url),,,)
//before_urlの次に挿入url,titleで作成したアイテムを挿入
//ブログ、メールフォームなどpage以外を途中に挿入することが出来る。
$inserts = array(
'/sitemap' => array('新着情報', '/news'),
'/news' => array('お問い合わせ', '/contact'),
'/it-model/faq' => array('ダウンサイジングについてのお問い合わせ', '/contact_itmodel'),
'/roundcube/faq' => array('Roundcubeについてのお問い合わせ', '/contact_roundcube'),
'/kolab/faq' => array('Kolabについてのお問い合わせ', '/contact_kolab'),
);
//設定ここまで

//関数
$bcBaser = $this->BcBaser;
$outputPageItem = function ($recursive, $title, $url) use (&$bcBaser) {
?>
  • link($title, $url) ?>
  • link($title, $url); else: echo $category_title; endif; echo PHP_EOL; }; $outputCategoryItemTail = function () { ?>
    • BcBaser->element('sitemap', array( 'pageList' => $pageCategories['children'], 'category_title' => $category_title, 'category_url' => $category_url, 'recursive' => $recursive+1 )); endif; if($outputed_category_li): $outputCategoryItemTail(); endif; endforeach; endif; ?>

    ポイントは「$bcBaser = $this->BcBaser;」して$bcBaserを無形関数に渡して使用するところです。

    Facebooktwitterlinkedintumblrmail

    『ぺちぱな。∞(えいと)』で Vagrant、HHVM、Hackして来た

    muraveです。ご無沙汰しております。

    もんきー(さる) 2014年5月17日(土)、

    ぺちぱな。∞(えいと)〜Hackするのに悪いヤツはいない。HackとCrackを間違えるのに碌なヤツはいない〜

    に参加いたしました。

    Vagrant環境から構築して、HHVM(HipHopVM)用にPackegeしたBoxファイルを配布、PHPとFacebookがOSSとしてリリースした新言語Hackの比較までやってしまおうという意欲的な勉強会でした。

    環境構築でのひっかかり(原因は使用ポートの衝突、CPUの仮想化支援がONになっていなかった等)はありましたが全員完走でした!

    この勉強会の資料がすばらしくて(もちろん資料だけではないですけど)、懇親会でも@hideAki76氏を褒めちぎっていたのですが、この資料が公開されましたよ!ということをみなさまにも強くお伝えしたい。

    自習するにはHHVM用Boxの問題がありますが、HHVM用環境構築のプロビジョニングについても書いてあるのでどうになるんじゃないでしょうか。すばらしい。

    HHVM、はやくdebian系じゃなくても気軽に動かせるようになるといいな。

    Facebooktwitterlinkedintumblrmail

    Roundcubeプラグイン設定ファイルの利用方法

    Roundcubeプラグイン設定ファイルの利用方法を紹介します。

    以下のように設定ファイルを用意します。

    ソースは以下のようになります。

    sample.php

    rc = rcmail::get_instance();
    
    //設定ファイルをロード
    $this->load_config('config/config.inc.php');
    }
    
    function init() {
    $name = $this->rc->config->get('sample.user', '');
    error_log('name:'.$name);
    }
    
    }
    

    config.inc.php

    
    

    割と簡単に使えるようです。

    rc->config->get('sample.user', '');
    ?>
    

    ここのconfigの実態はrcube_configオブジェクトになります。
    getメソッドの第二引数は値が取得出来なかった場合のデフォルト値になります。

    注意点としては

    
    

    コンストラクタの中で親クラスであるrcube_pluginのコンストラクタを
    必ず呼び出す必要があります。

    rcube_pluginクラスのコンストラクタは以下のようになっています。

    ID = get_class($this);
        $this->api = $api;
        $this->home = $api->dir . $this->ID;
        $this->urlbase = $api->url . $this->ID . '/';
      }
    ?>
    

    homeディレクトリなどの値を設定しています。

    そして、rcube_pluginクラスのload_configメソッドは以下のようになっています。

    home.'/'.$fname;
        $rcmail = rcmail::get_instance();
        if (is_file($fpath) && !$rcmail->config->load_from_file($fpath)) {
          raise_error(array('code' => 527, 'type' => 'php',
            'file' => __FILE__, 'line' => __LINE__,
            'message' => "Failed to load config from $fpath"), true, false);
          return false;
        }
    
        return true;
      }
    ?>
    

    ここで設定ファイルの場所を取得するためにhome変数を使用しているため
    rcube_pluginクラスのコンストラクタを呼び出していないと設定ファイルを取得出来なくなります。

    Facebooktwitterlinkedintumblrmail

    Roundcubeプラグインからメール送信

    Roundcubeプラグインからメール送信出来たら、色々な可能性が広がるので調べてみました。

    ソースは以下のようになります。

    rc = rcmail::get_instance();
    
    //ローカライズ対応
    $this->add_texts('localization/');
            
    //タスクとしてsampleを設定
    $this->register_task('sample');
            
    //タスクバーにボタンを追加
    $this->add_button(array(
    'command'    => 'sample',
    'label'      => 'sample.sample',
    ), 'taskbar');
    
    //sampleタスクの場合のみ、アクションのコールバックを登録
    if($this->rc->task == 'sample'){
    $this->register_action('index', array($this, 'index'));
    $this->register_action('send_mail', array($this, 'send_mail'));
    }
    }
    
    public function index(){
    $this->rc->output->send('sample.index');
    }
    
    public function send_mail(){
    global $CONFIG;
    $message_charset = $this->rc->output->get_charset();//rcube_html_pageオブジェクトの持っている、charsetを取得します。
    $flowed = $this->rc->config->get('send_format_flowed', true);
    
    $from = 'foo@roundcube.com';
    $to = 'bar@roundcube.com';
    
    $headers = array(
    'Date' => rcmail_user_date(),
    'From' => $from,
    'To' => $to,
    'Message-ID' => rcmail_gen_message_id(),
    'User-Agent' => $CONFIG['useragent'],
    'Subject' => 'テストメール',
    'X-Sender' => $to,
    );
    $mail_mime = new Mail_mime("\r\n");
    $mail_mime->headers($headers);
    
    //$mail_mime->setTXTBody('こんにちは');
    $mail_mime->setHTMLBody('こんにちは');
    
    //ASCII文字か判定
    if (preg_match('/[^\x00-\x7F]/', $mail_mime->getTXTBody())){
    $transfer_encoding = $this->rc->config->get('force_7bit') ? 'quoted-printable' : '8bit';
    }else{
    $transfer_encoding = '7bit';
    }
    
    //文字コードなどヘッダフィールドの設定
    $mail_mime->setParam('text_encoding', $transfer_encoding);
    $mail_mime->setParam('html_encoding', 'quoted-printable');
    $mail_mime->setParam('head_encoding', 'quoted-printable');
    $mail_mime->setParam('head_charset', $message_charset);
    $mail_mime->setParam('html_charset', $message_charset);
    $mail_mime->setParam('text_charset', $message_charset . ($flowed ? ";\r\n format=flowed" : ''));
    
    //ヘッダ情報の配列をテキスト形式に変換します。
    $smtp_headers = $mail_mime->txtHeaders($headers, true);
    
    if (!is_object($this->rc->smtp)){
    //rcmailオブジェクトにrcube_smtpクラスのオブジェクトがない場合、生成します。
    $this->rc->smtp_init(true);
    }
    
    //メールを送信します。
    $sent = $this->rc->smtp->send_mail($from, $to, $smtp_headers, $mail_mime->getMessageBody());
    
    //必要な場合以下の情報で後処理をする。
    //$smtp_response = $this->rc->smtp->get_response();
    //$smtp_error = $this->rc->smtp->get_error();
    
    //元の画面を再表示
    $this->index();
    }
    
    }
    

    /roundcuberoot/program/steps/mail/sendmail.incを参考に作成しています。
    この内容でほとんどのメールは送信可能かと思います。
    添付ファイルをつけたメール送信や画像を含んだメールなどはさらに処理が必要になります。

    Facebooktwitterlinkedintumblrmail

    Roundcubeプラグインの作り方② ~画面のあるプラグイン編~

    今回は、Roundcubeプラグインとして、画面のあるプラグインの作り方を紹介します。

    まず、初めにフォルダ構成は以下のようになります。

    ソースの内容は以下のようになります。
    sample.php

    rc = rcmail::get_instance();
            
            //ローカライズ対応
            $this->add_texts('localization/');
            
            //タスクとしてsampleを設定
            $this->register_task('sample');
            
            //タスクバーにボタンを追加
            $this->add_button(array(
                'command'    => 'sample',
                'label'      => 'sample.sample',
            ), 'taskbar');
            
            //sampleタスクの場合のみ、アクションのコールバックを登録
            if($this->rc->task == 'sample'){
                $this->register_action('index', array($this, 'index'));
                $this->register_action('test', array($this, 'test'));
            }
            
        }
        
        public function index(){
            $this->rc->output->send('sample.index');
        }
        
        public function test(){
            $this->rc->output->send('sample.test');
        }
        
    }
    

    index.html

    
    
    
    <roundcube:object name="pagetitle" />
    
    
    
    
        
        
        
    初期画面

    test.html

    
    
    
    <roundcube:object name="pagetitle" />
    
    
    
    
        
        
        
    テスト画面

    ja_JP.inc

    
    

    この状態でこのように動きます。
    初期画面

    テスト画面

    ここからはソースの説明になります。

    ①全てのリクエストは、プラグインクラスが受け付けます。
      プラグインクラスとは、rcube_pluginを継承したクラスになります。
      今回の場合、sampleクラスになります。

    ②タスクとアクション
      Roundcubeにはタスクとアクションの概念があります。
      1つのプラグインの中に1つのタスクがあり、複数のアクションがあるイメージになります。
      今回の場合は、sampleタスクの中にindexアクションとtestアクションがある状態になります。

      例えば、「http://roundcube.com/?_task=sample&_action=test」のようにアクセスすると
      タスクはsampleで、アクションはtestという指定で動作します。
      「http://roundcube.com/?_task=sample」このようなURLの場合
      アクションは何もついていませんので、indexというアクションが自動的に付加されます。

    ③rcmailオブジェクト

    $this->rc = rcmail::get_instance();
    

      Roundcubeの様々な情報を持っているオブジェクトになります。
      ここにタスクとアクションの情報も入っていますので、メンバ変数に保持します。

    ④コールバックの登録
      あるアクションが指定されたときに、どのメソッドがコールされるかを登録します。

        $this->register_action('index', array($this, 'index'));
    
    この場合はindexというアクションが指定されたら、
    $thisの中にあるindexメソッドをコールするという登録方法になります。
    

    ⑤テンプレート表示

        $this->rc->output->send('sample.index');
    
    上記のように記述することで、sampleタスク内にあるindex.htmlを表示するようにします。
    
    Facebooktwitterlinkedintumblrmail

    EclipseからPhpStormに乗り換えました

    しばらくPhpStormを仮運用していたのですが、ライセンスを購入してもらい、Eclipseから乗り換えました。

    乗り換えた理由

    Eclipseに比べてだいぶ軽い

    これが一番の理由です。非常にお世話になったIDEで、Eclipseと戯れた時間は多かったです。ただし重い。何年経っても重い。チューニングしようが重いものは重い。この点、PhpStormは大変軽快です。ステップ実行しようが、ファイルの検索、置換、ジャンプ等の全ての操作が軽快です。こういうところを放置しておくと、生産性にじわじわ効いてくるので、今ここで乗り換えないと、だいぶ損する気がしました。

    Eclipse(PDT)でできていたことは全部出来る

    WEBアプリケーションの実行は当然、Coverage、XDebug、PHPUnitのなど、Eclipse(PDT)で出来ていたことは全て出来ます。

    私の心境の変化

    そもそもEclipseを使い続けていた理由は、言語によって開発環境を変えなくてもプラグインがあるから、Eclipseならほぼ対応できるという点でした。しかし最近はそれぞれに特化しているモノのほうが良いという考えに変わってきています。WEBアプリケーションよりもスマホネイティブアプリのほうが良い、マルチプラットフォームで動作するアプリよりも、ネイティブで書かれたMacアプリのほうが良い、と。だったらIDEもある言語に特化したものが良い。となったわけです。ちなみに矛盾しますがPhpStormはマルチプラットフォームで動きます。

    インストール後

    ここからはやった設定などの覚えがきです。

    設定

    • Appearance > UI Options > Look and feelをDarculaに
    • Editor > Colors & Fonts > Schema nameをSolarized Darkに
      • https://github.com/braver/PhpStorm-Solarized
      • https://github.com/cweagans/PhpStorm-solarized
    • FontはやっぱりMonacoで
    • PHPのパス設定
    • XDebugするためのサーバ設定
    • KeymapをMac OS Xに(Command + Cとかでコピーできるよう)

    よく使うであろうショートカット等

    キー 内容
    Ctrl + →← エディタータブの切り替え
    Ctrl + ↑↓ 前 or 次のメソッドにジャンプ
    Commnad + Shift + N ファイルを名前であいまい検索して開く
    Command + D 現在行の複製
    Command + Y 現在行の削除
    Command + Shift + ↑↓ 選択行のコードを移動
    Command + B キャレット位置にあるメソッドなどの定義にジャンプ
    Command + Option + →← ジャンプした履歴を辿る
    Command + Option + T 選択範囲をif,forなどで囲む
    Command + Option + Shift + T 選択範囲をリファクタリング(名前変更、メソッド抽出など)
    Command + J テンプレート(スニペット)呼び出し

    あとがき

    これで開発スピードが上がるので、もっと他のことに時間を割けそうです。

    ちなみにPhpStormのライセンスは、PhpStorm良いなーとTwitterで呟いていたら、その翌朝には代表がライセンス買ってくれました。そんな会社ランカードコムをよろしくお願い致します。(とか宣伝ぽく)

     

    Facebooktwitterlinkedintumblrmail

    baserCMSを2.0.1から2.0.3に更新

    弊社サイトで使用しているbaserCMSのバージョンを2.0.1から2.0.3に更新しました。

    あっさりサックリ上手く行ったのでホッとしたのですが、動作確認するとブログでの一覧表示でおかしな所が。「≫ 続きを読む」をクリックするまで隠れているはずの詳細が一覧で見えてしまっていました。

    あれ〜?と思いつつbaserCMS公式にいくと関係しそうな解決済チケットがありました。

    BlogHelper::getPostContent の挙動がおかしい

    リビジョン a845999e から更新ファイルを取ってきてファイルを差し替えました。

    さぁ〜、どうだ! あれ〜? なおらないな。

    しばし悩む。 フォーラムを見に行ったりしつつ。

    ああ、そうか。ブログのviewカスタマイズしてるからかも。 そうでした。

    lancardというテーマ名の場合ですが、以下の2ファイルをリポジトリのindex.phpの変更内容に合わせて修正したらなおりました。
    app/webroot/themed/lancard/blog/default/index.php
    app/webroot/themed/lancard/blog/default/archives.php

    修正内容はリポジトリの差分を見てもらうのが手っ取り早いですね。

    index.phpの差分

    $blog->postContent($post, false, true) と第2引数がfalseに変わってます。

    Facebooktwitterlinkedintumblrmail