一般ユーザで pear をローカルインストール

個人的に root になれない状況があまり無いのであまりこういった状況は無いのですが。。。

サーバに pear はインストールされているけど root になれない場合に使いたいモジュールをインストールする方法です。

/home/hoge/pear に pear::pager をインストールする場合の例です。

インストール前の状態

$ pear list
Installed packages, channel pear.php.net:
=========================================
Package        Version State
Archive_Tar    1.3.1   stable
Console_Getopt 1.2     stable
PEAR           1.4.9   stable
XML_RPC        1.5.0   stable

pear::pager の install

$ mkdir /home/hoge/pear
$ cd /home/hoge/pear
$ pear config-create /home/hoge .pearrc
Configuration (channel pear.php.net):
=====================================
Auto-discover new Channels     auto_discover    <not set>
Default Channel                default_channel  pear.php.net
HTTP Proxy Server Address      http_proxy       <not set>
PEAR server [DEPRECATED]       master_server    <not set>
Default Channel Mirror         preferred_mirror <not set>
Remote Configuration File      remote_config    <not set>
PEAR executables directory     bin_dir          /home/hoge/pear
PEAR documentation directory   doc_dir          /home/hoge/pear/docs
PHP extension directory        ext_dir          /home/hoge/pear/ext
PEAR directory                 php_dir          /home/hoge/pear/php
PEAR Installer cache directory cache_dir        /home/hoge/pear/cache
PEAR data directory            data_dir         /home/hoge/pear/data
PHP CLI/CGI binary             php_bin          <not set>
PEAR test directory            test_dir         /home/hoge/pear/tests
Cache TimeToLive               cache_ttl        <not set>
Preferred Package State        preferred_state  <not set>
Unix file mask                 umask            <not set>
Debug Log Level                verbose          <not set>
PEAR password (for             password         <not set>
maintainers)
Signature Handling Program     sig_bin          <not set>
Signature Key Directory        sig_keydir       <not set>
Signature Key Id               sig_keyid        <not set>
Package Signature Type         sig_type         <not set>
PEAR username (for             username         <not set>
maintainers)
User Configuration File        Filename         /home/hoge/pear/.pearrc
System Configuration File      Filename         #no#system#config#
Successfully created default configuration file "/home/hoge/pear/.pearrc"

設定の確認

$ pear -c .pearrc config-show

作成した pear 環境のインストール状況を確認。

$ pear -c .pearrc list
(no packages installed from channel pear.php.net)

pear::pager のインストール

$ pear -c .pearrc install pager
downloading Pager-2.4.9.tgz ...
Starting to download Pager-2.4.9.tgz (36,055 bytes)
..........done: 36,055 bytes
install ok: channel://pear.php.net/Pager-2.4.9

インストールできたか確認

$ pear -c .pearrc list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Pager   2.4.9   stable

インストールした pear::pager を使う方法

php の include_path に /home/hoge/pear/php を追加する。
ini_set('include_path', '/home/hoge/pear/php'.PATH_SEPARATOR.ini_get('include_path'));

そして、インストール先を apache が参照できるよう chmod などする。

$ chmod -R g+rx /home/hoge
$ chgrp -R apache /home/hoge

Hyper Estraier で WordPress をクロール

Hyper Estraier で WordPress をクロールしようとしたところ
redirected: 301 されてしまいインデックスされない 🙁

$ estwaver crawl -revcont casket
2014-05-15T03:40:17Z    INFO    DB-EVENT: status: name=casket/_index dnum=0 wnum=0 fsiz=9259055 crnum=0 csiz=0 dknum=0
2014-05-15T03:40:17Z    INFO    crawling started (revcont)
2014-05-15T03:40:17Z    INFO    fetching: 0: https://www.yonageya.com/
2014-05-15T03:40:17Z    INFO    seeding: 1.000: https://www.yonageya.com/
2014-05-15T03:40:17Z    INFO    [1]: fetching: 0: https://www.yonageya.com/
2014-05-15T03:40:18Z    INFO    [2]: fetching: 1: https://www.yonageya.com/blog/
2014-05-15T03:40:18Z    INFO    [2]: redirected: 301: https://www.yonageya.com/blog/
2014-05-15T03:40:18Z    INFO    waiting for threads: 0
2014-05-15T03:40:18Z    INFO    crawling finished
2014-05-15T03:40:18Z    INFO    DB-EVENT: flushing index words: name=casket/_index dnum=1 wnum=1 fsiz=9262217 crnum=670 csiz=45533 dknum=0
2014-05-15T03:40:18Z    INFO    DB-EVENT: flushing auxiliary keywords: name=casket/_index dnum=1 wnum=639 fsiz=9262217 crnum=31 csiz=2182 dknum=0
2014-05-15T03:40:18Z    INFO    DB-EVENT: closing: name=casket/_index dnum=1 wnum=639 fsiz=9274906 crnum=0 csiz=0 dknum=0
2014-05-15T03:40:18Z    INFO    finished successfully

301 部分だけ抜き出すと

[2]: redirected: 301: https://www.yonageya.com/blog/

ネットで調べたところ同じ状況の方がいらっしゃいました。

ヒントにさせていただき、調べてみたところ wp-includes/canonical.php に辿り着きました。

        /**
         * Filter the canonical redirect URL.
         *
         * Returning false to this filter will cancel the redirect.
         *
         * @since 2.3.0
         *
         * @param string $redirect_url  The redirect URL.
         * @param string $requested_url The requested URL.
         */
        $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url );

        if ( !$redirect_url || $redirect_url == $requested_url ) // yes, again -- in case the filter aborted the request
                return false;

        if ( $do_redirect ) {
                // protect against chained redirects
                if ( !redirect_canonical($redirect_url, false) ) {
                        wp_redirect($redirect_url, 301);
                        exit();
                } else {
                        // Debug
                        // die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) );
                        return false;
                }
        } else {
                return $redirect_url;
        }

$redirect_url と $requested_url を比較して同じだったらリダイレクトしないようですが、
実際に $redirect_url と $requested_url を調べてみたところ、

$redirect_url: https://www.yonageya.com/blog/
$requested_url: https://www.yonageya.com:80/blog/

とウチのブログの場合、$requested_url にポート番号がくっついていました ❗

ポート番号をくっつけているのは、同じ wp-includes/canonical.php の以下です。

        if ( !$requested_url ) {
                // build the URL in the address bar
                $requested_url  = is_ssl() ? 'https://' : 'http://';
                $requested_url .= $_SERVER['HTTP_HOST'];
                $requested_url .= $_SERVER['REQUEST_URI'];
        }

ウチのブログの場合 $_SERVER[‘HTTP_HOST’] にポート番号がくっついていました。

そして、同じ状況の方と同じように $requested_url .= ‘www.yonageya.com’ とすると解決する事も確認しました。

それで、どうやって解決するか対応方法に悩みましたが、functions.php に以下を追加して対応しました。

function my_redirect_canonical($redirect_url, $requested_url) {
        if (preg_match('/^HyperEstraier/', $_SERVER['HTTP_USER_AGENT'])) {
                return false;
        }
}
add_filter('redirect_canonical', 'my_redirect_canonical');

強引ですが :mrgreen:

住所から都道府県を取得するには?

php で住所から都道府県コードを取得する実装を考えてみました。

色んな方法があるかと思いますが自分の場合は以下になりました 🙂

//住所
$addr = "東京都港区ほげほげ1-2-3";
 
//先頭3文字を切り出す
$cut = mb_substr($addr, 0, 3, 'UTF-8');
 
//都道府県先頭3文字の配列を作成
$prefs = array(
        1 => '北海道',
        2 => '青森県',
        ...省略...
        14 => '神奈川', //県は削除
        15 => '新潟県',
        ...省略...
        30 => '和歌山', //県は削除
        ...省略...
        46 => '鹿児島', //県は削除
        47 => '沖縄県'
);
 
//検索
$prefjis = array_search($cut, $prefs);
 
echo $prefjis;

最初 [都道府県] で preg_match() していたのですが、
“広島県府中市” が出てきて “広島県府” となってしまい
この方法に行きつきました 🙂

メモメモ 🙂

SQL Server の日付

SQL Server の日付フィールドを php で select して
MySQL へ insert する処理を行ったら
日付が 00-00-00 00:00:00 になってしまった ❗

どうも select するときにフォーマットを指定する必要があったようです。

SELECT CONVERT(VARCHAR, DATE, 120) FROM hogetable;

めんどいですねー :mrgreen:

WordPress IE9 対応

IE9 で WordPress の記事が投稿できないというお問い合わせをいただきました。

テストしてみたところ最新の 3.0.5 でもビジュアルエディタから投稿が出来ませんでした:cry:

ただ、IE9 を “互換表示” にすると投稿できる事がわかりました:mrgreen:

とは言えお客様に「互換表示にして投稿してください。」と言って対応していただく訳にもいかず、

なんとかサーバ側で対応できないか調べたところ、以下の meta タグで対応できる事がわかりました。

これをダッシュボードにログインした時のヘッダに出したいので、

wp-admin/admin-header.php

に以下を追加して対応しました。

<?php if (preg_match('/MSIEs9.0/', $_SERVER['HTTP_USER_AGENT'])) { ?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?php } ?>

filter をフックしてできるのかもしれませんが。。。:cool:

OpenPNE3.4.8

ざっくりとセットアップの内容をメモします。

3.4.8 というバージョンをダウンロードしました。

ファイル名はopenpne-OpenPNE3-OpenPNE-3.4.8-0-gb9d705e.zip

  1. zip ファイルを解凍して DOCUMENT_ROOT 以外の任意の場所に保存します。
  2. /usr/local/apache2/OpenPNE3 に解凍しました。

  3. OpenPNE.yml 作成
  4. $ cd /usr/local/apache2/OpenPNE3
    $ cp config/OpenPNE.yml.sample config/OpenPNE.yml
    $ vi config/OpenPNE.yml

    base_url と mail_envelope_from を環境に合わせたモノに変更しました。

  5. ProjectConfiguration.class.php 作成
  6. 特に変更せずデフォルトのままです。

    $ cp config/ProjectConfiguration.class.php.sample config/ProjectConfiguration.class.php
  7. DB 作成
  8. openpne3db という名前で作成しました。

    mysql> CREATE DATABASE open3db DEFAULT CHARACTER SET utf8;

    そして、openpne ユーザがパスワード openpne で接続できるようにユーザを作成しました。

    mysql> GRANT ALL ON *.openpne3db TO 'openpne'@'localhost' IDENTIFIED BY 'openpne';
  9. インストール
  10. 対話的形式でデータベースへの接続情報を設定をした後、色々と表示されますが、
    意味が分かりませんでした。

    $ ./symfony openpne:install
  11. web ディレクトリを公開ディレクトリから参照できるようにシンボリックリンクを作成
  12. 公開ディレクトリを /usr/local/apache2/htdocs として説明します。
    /sns というサブディレクトリに公開します。
    サーバ名を www.example.com とすると、URL は http://www.example.com/sns/ になります。

    $ cd /usr/local/apache2/htdocs
    $ ln -s ../OpenPNE3/web sns
  13. .htaccess 変更
  14. RewriteBase 変更

    $ vi web/.htaccess

    RewriteBase を /sns/ に変更しました。

  15. ブラウザからアクセス
  16. http://www.example.com/sns/

    ページは表示されますが、CSS が適用されていない状態です 😥
    apache の error_log を見たら DOCUMENT_ROOT 直下の opSkinBasicPlugin を
    参照している事が分かったので、DOCUMENT_ROOT に opSkinBasicPlugin/web へ
    のシンボリックリンクを作成しました。

    # cd /usr/local/apache2/htdocs
    # ln -s ../OpenPNE3/plugins/opSkinBasicPlugin/web opSkinBasicPlugin

    簡単に参照先を変更できるかと思ったのですが、調べても分からなかったのでシンボリックリンクで対応してしまいました。

  17. 再度ブラウザでアクセス
  18. CSS が適用されたデザインされたページになりました 🙂

    プリセットされているユーザでログインします。

    メールアドレス: sns@example.com
    パスワード: password

    すると今度は以下のエラー 😥

    現在、サーバが混み合っているか、メンテナンス中です。
    ご迷惑をおかけいたしますが、しばらく時間を空けて再度アクセスしてください。
     
    Currently, our service is too busy or is under maintenance.
    We're sorry and please retry accessing later.

    またまた apache の error_log を見ると以下が記録されていました。

    SQLSTATE[HY000]: General
     error: 2014 Cannot execute queries while other unbuffered queries are active.
    Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ev
    er going to run against mysql, you may enable query buffering by setting the PDO
    ::MYSQL_ATTR_USE_BUFFERED_QUERY attribute., referer: http://www.example.com/sns/
    pc_backend.php/

    エラーメッセージのとおり、PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を true
    にする必要があるようです。

    色々と調べたところ以下のファイルを変更したところ解決しました。
    (これで正しいのかわかりませんが 😎 )

    lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Connection/Mysql.php

    以下のように PDO::MYSQL_ATTR_USE_BUFFERED_QUERY を追加。

    public function connect()
         {
             $connected = parent::connect();
             $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
             $this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
     
             return $connected;
         }

    これでとりあえず動くようになりました 🙂

    ※この対応方法は DB が MySQL の場合にのみ有効です

WordPress に GoogleAnalytics コードを挿入するプラグイン

前回に続き
また勉強と実務を兼ねて WordPress に GoogleAnalytics 用のコードを
挿入するプラグインを作ってみました 🙂

CMS として WordPress を使ってサイトを作成しているので、開発中はテスト用の
コード、リリース後は本番用のコードと切り替える必要があります。

また、リリース後も開発環境はテスト用コードを使い続けるので切り替えを
簡単にできるようにしたかったのです 🙂

管理画面で PC 用のウェブプロパティID、ktai_style 用のウェブプロパティID を
セットして、ktai_style のテンプレートで ks_wp_head(), ks_wp_footer() を
有効化すればOK

すでに同じようなプラグインはありますが自分で作ってみました 😎
このサイトでテスト中です… :mrgreen:

WordPress MU のライブラリを CLI から使う時の注意

このブログではないのですが、ktai_entry の inject.php を使って受信したメールから記事を投稿できるようにしました :mrgreen:
その時に気がついた事です。

inject.php から WordPress MU のファイルを沢山読み込むのですが、
その中に wpmu-settings.php ファイルがあります。

wpmu-setings.php の中に以下の記述があり、WordPress MU は CLI から利用する事を想定していないようです。

if( defined( "WP_INSTALLING" ) == false && constant( 'VHOST' ) == 'yes' && !is_
object( $current_blog ) ) {
// NOBLOGREDIRECT が define されていたら NOBLOGREDIRECT へリダイレクト
// NOBLOGREDIRECT が define されていないならサインアップへリダイレクト
die();
}

つまり CLI からアクセスすると wpmu-settings.php を読み込んだ時点で die() してしまいます。

CLI のときには上記処理へ行かないようにして回避しました。

if( defined( "WP_INSTALLING" ) == false && constant( 'VHOST' ) == 'yes' && !is_
object( $current_blog ) && isset($_SERVER['REQUEST_METHOD']) ) {
// NOBLOGREDIRECT が define されていたら NOBLOGREDIRECT へリダイレクト
// NOBLOGREDIRECT が define されていないならサインアップへリダイレクト
die();
}

使っている WordPress MU のバージョンは 2.7.0 です。

他にもいくつか気がついて手を加えた箇所があるので暇を見て書いく予定です 🙂

error_log で配列のデータを出力するには

php で開発をしている時に error_log() でデバッグしますが、配列のデータ
を表示する事ができなくて困っていました。
自分で関数を作って配列を展開して表示したりしていたのですが、php 標準の
機能でできるんですね 😆
知りませんでした 😆

error_log(print_r($_POST, TRUE), 3, '/tmp/logfile');

少し便利になりました :mrgreen:

カサヒラボさんに出てました 💡

カテゴリー: php

image/pjpeg

ググると沢山でてきますが、私もはまりました ❗

jpg ファイルを IE でアップロードするとファイルタイプが image/pjpeg になってしまいます ❗
そのおかげで validate でエラーになってしまいます 😥

FireFox からアップすると image/jpeg です。

validate のホワイトリストに image/pjpeg を追加してエラーは解消しました 😛