sshfs が非常に便利 Mac編

以前、Windows編を書きましたが今度はMac編。
もういままで、ローカルで編集してアップとかしてたのが馬鹿らしくなりますね。。。

MacFuseのインストール

こちらから最新版をダウンロードしてインストールする。

MacFUSEは、ファイルシステムをより簡単に拡張できるようにするソフトウェアらしいです。

インストールが完了すると環境設定のMacFUSEの項目が追加されます。

sshfsのインストール

こちらからLeopard用のバイナリをダウンロードする。

解凍後、ファイル名を「sshfs」に変更し実行権限を付与してパスの通ったディレクトリに移動する。

$ mv ~/Desktop/sshfs-static-leopard sshfs
$ chmod +x sshfs
$ sudo mv sshfs /usr/bin/

リモートサーバーのディレクトリをマウントする

マウントするディレクトリを作成し、「sshfs ユーザー名@ホスト名:ディレクトリ名 マウント用ディレクトリ」の書式でマウントする。

$ mkdir ~/mount
$ mkdir ~/mount/serversman
$ sshfs user@suusuke.info:/ ~/mount/serversman

僕はMacでもSCPでファイルアップロードする場合、VMWareにインストールしてるWinSCPでアップしてるのでほんと楽になった。
※理由はいろいろありまして。。。

ちなみに、アンマウントは

$ umount ~/mount/serversman

です!

WordPress memo

WordPressはカスタマイズの仕方は沢山あるが故こうしたい、あーしたいって事が出来るようになるにはやっぱり経験が必要だなと思います。

カスタマイズした際に分かった事メモしときます。

ステータス「非公開」について

カスタマイズしてる最中に「非公開」にしてる投稿が、タイトルの前に「非公開:」とついて表示されることに気付きました。

あれ?間違って、PHPのソース変更しちゃったかなとデバックする事小一時間。

IEで確認したら「非公開」は表示されない。。。。?

何の事は無い管理画面にログインしてると「非公開」の投稿内容も表示されるようです。

本当に訳が分からなかった。。。

検索機能のカスタマイズ

特定のカテゴリーから検索

<form method="get" action="<?php bloginfo('url'); ?>/">
<input type="hidden" value="5" name="cat" />

特定のカテゴリーを除外して検索

<form method="get" action="<?php bloginfo('url'); ?>/">
<input type="hidden" value="-5" name="cat" />

これは便利ですね!

ページのカスタマイズ

特定のページだけ表示させたい項目が有る時

<?php if(関数): ?>
<!-- ここに表示させたい項目追加  -->
<?php endif; ?>

関数の所には「is_page(‘特定のページのID,title,slag’)」で対応できます。

特定のページ以外にも、特定のカテゴリーとかいろいろして出来ます。

if関数で条件を分岐し特定ページだけに記事・情報を表示

sshfs が非常に便利 Windows編

ローカル環境だけでは本番環境と同じ環境が作れないという事が有ると思いますが、そのような場合はVMWareなどを使って仮想化して開発環境を作っていると思います。

仮想化したサーバーのソースを修正する場合は、ちょっとしたものであればputty等で直接修正しても良いのですが、開発となるとそうはいきません。

そんな時は、仮想化したサーバーをマウントして直接ホストから変更できるようにします。

Macの場合は
sshでリモートサーバーをマウント、便利にsshfs
で対応してたのですが、Windowsでもssh経由でマウントが簡単に出来たのでその時のメモ。

といっても、インストールするのは2つだけ。
Dokan

  • Dokanライブラリ
  • Dokan SSHFS

の順でインストールすれば簡単にマウントできます。

ファイルのアップとかもエクスプローラーから簡単に出来ますので大変便利です。

WordPress ドメイン変更時のDBデータ修正

修正前にバックアップ取る事を忘れずに!

update wp_posts set post_content=replace(post_content,'古いURL','新しいURL')
update wp_posts set guid=replace(guid,'古いURL','新しいURL')
update wp_options set option_value=replace(option_value,'古いURL','新しいURL')

 

  • wp-posts内のpost_content -記事の中の画像URLや自サイト内のリンク等の書き換え(記事内)
  • wp-posts内のguid -画像などのメディアアップロード時のメディアURL
  • wp_options内のoption_value -サイトURLやHOMEURLやプラグインで指定したURL情報など

maillogについてのメモ

postfix

■/var/log/maillog(受信)

postfix/smtpd[5800]: connect from testpc[192.168.0.0]
プロセス番号5800のsmtpd接続を受けた

postfix/cleanup[5807]: 112233: message-id=<aaa.bbb.ccc@aiueo.com>
メールのキューIDが112233になった
cleanupプロセスがメールをキューに保管した

postfix/qmgr[5598]: 112233: from=<testuser@aiueo.com>, size=549, nrcpt=1 (quate active)
キューマネージャー(qmgr)がキューに保管されたメール(キュー:ID112233)を発見した
メールサイズ549byte
nrcpt=1は宛先数が1つ

postfix/smtpd[5800]: connect from testpc[192.168.0.0]
プロセス番号5800のsmtpd接続が終了した

postfix/local[5808]: 112233: to=<testuser@aiueo.com>,
orig_to=<test@aiueo.com>, relay=local, delay=2, status=sent (delivered to maildir)
local配送プロセスが、キュー:ID112233のメールを配送した
宛先はtestuser@aiueo.com
relay=localはローカルに配送された
delay=2は配送の遅延が2秒であった
status=sent (delivered to maildir)はmaildirに正常に配送された

■/var/log/maillog(送信)

postfix/picup[4800]: 998877: uid=0 from=<root>
pickupプロセスが送信メール(キュー:ID998877)を検出した
uid=0は送信者のユーザIDが0を指す
from=<root>は送信者のメールアドレスを指す

postfix/cleanup[4807]: 998877: message-id=<aaa.bbb.ccc@aiueo.com>
cleanupプロセスがメールをキューに保管した

postfix/qmgr[4598]: 998877: from=<root@aiueo.com>, size=549, nrcpt=1 (quate active)
キューマネージャー(qmgr)がキューに保管されたメール(キュー:ID998877)を発見した
メールサイズ549byte
nrcpt=1は宛先数が1つ

postfix/smtp[4800]: connect from testpc[192.168.0.0]
プロセス番号5800のsmtpd接続が終了した

postfix/qmgr[4808]: 998877: to=<testuser@aiueo.com>,
orig_to=<test@aiueo.com>, relay=lllmmnn@aiueo.com[192.168.99.99], delay=2, status=sent (250 ok: queued as xxxyyyzzz)
smtp配送プロセス(smtp)が、キュー:ID998877のメールを配送した
宛先はtestuser@aiueo.com
relay=lllmmnn@aiueo.com[192.168.99.99]はメールが192.168.99.99に配送された
delay=2は配送の遅延が2秒であった
status=sentは相手正常に配送された

postfix/qmgr[4803]: 998877: removed
キューマネージャー(qmgr)がメールをキューから削除した

■/var/log/maillog(SMTP-AUTH)

postfix/smtpd[7653]: warning: testpc[192.168.33.33]: SASL CRAM-MD5 authentication failed
192.168.33.33のtestpcがCRAM-MD5方式で認証を行い、失敗した

postfix/smtpd[5873]: 998877: client=testpc[192.168.33.33],
sasl_method=CRAM-MD5, sasl_userneam=testuser@aiueo.com
192.168.33.33のtestpcがCRAM-MD5方式で認証を行い、ユーザ名はtestuserであった

■/var/log/maillog(クライアント毎のリソースや制限に抵触)

postfix/smtpd[8743]: warning: Connection rate limit exceeded: 21
 from tesptc[192.168.33.33] for service smtp
接続数の制限に抵触した

postfix/smtpd[8743]: warning: Recipient address rate limit exceeded: 21
 from tesptc[192.168.33.33] for service smtp
宛先数の制限に抵触した

postfix/smtpd[8743]: warning: Message delivery request rate limit exceeded: 21
 from tesptc[192.168.33.33] for service smtp
メッセージ数の制限に抵触した

sendmail

■/var/log/maillog(受信)

sendmail[9345]: 998877: from=<testuser@aiueo.com>, size=345, class=0, nrcpts=1,
msgid=<aaa.bbb.ccc@aiueo.com>, proto=ESMTP, demon=MTA, relay=www.aiueo.com[192.168.22.22]
998877はメールのキューID
from=<testuser@aiueo.com>は発信者
メールサイズは345byte
classは?
nrcpts=1は宛先数が1つ
msgidはaaa.bbb.ccc@aiueo.com
proto=ESMTPは使用したプロトコル
relay=www.aiueo.com[192.168.22.22]は使用したリレーホスト

■/var/log/maillog(送信)

sendmail[9345]: 998877: to=<testuser@aiueo.com>, ctladdr=<wiwi@wiwi.com> (500/500),
delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=122345, relay=aiueo.com. [192.168.11.11],
dsn=4.0.0, start=Deferred: Connection refused aiueo.com.
998877はメールのキューID
to=<testuser@aiueo.com>は発信者
ctladdr=<wiwi@wiwi.com> (500/500)は?
delay=00:00:00, xdelay=00:00:00は遅延時間
mailer=esmtpは使用したメーラー
pri=122345は?
relay=aiueo.com. [192.168.11.11]は使用したリレーホスト
proto=ESMTPは使用したプロトコル
start=Deferred: Connection refused aiueo.com.は送信状況(star=sentはメール送信)

■/var/log/maillog(中継拒否)

sendmail:[5434]: 998877: ruleset=check_rcpt, arg1=<anyone@anywhere.any>,
relay=[192.168.1.2], reject=550 5.7.1 <anyone@anywhere.any>...
Relaying denied. IP name lookup failed [192.168.1.2]

■/var/log/maillog(SMTP-AUTH)

sendmail[3422]: AUTH=server, relay=[192.168.0.2], authid=user01,
mach=PLAIN, bits=0
AUTH=serverは認証モード
relay=[192.168.0.2]は相手の名称、アドレス
authid=user01は認証ユーザ名
mach=PLAINはSMTP-AUTHの認証方法

参考

https://sites.google.com/a/ryokufudo.com/home/home/maillog

PHP軽量フレームワークLimonade 1

setup

Limonade
githubからソースダウンロードして、ドキュメントルートに配置。
いつものように、バーチャルホストを設定してexamplesを試してみる。

hostsファイル設定

127.0.0.1       test.limonade.com

vhost

#test.limonade.com
<VirtualHost *:80>
	DocumentRoot "/home/limonade/public_html"
	ServerName test.limonade.com
	<Directory "/home/limonade/public_html">
		AllowOverride All
		order deny,allow
		allow from All
	</Directory>
</VirtualHost> 

ダウンロードしたファイルを”/home/limonade/public_html”にコピー。

ブラウザから確認

http://test.limonade.com/examples

WEBアプリケーション開発

とりあえず分かった事。
MVCのフレームワークでモデルは別途抽象化するライブラリ使う。

Controllerにあたる部分では

  • /lib/limonade.phpをrequire
  • configureで設定
  • beforeでdispatchする前の事前処理記述
  • dispatchでurlと関数のマッピング
  • dispatch('/', 'hello_world');
    function hello_world () {
        return "Hello world!";
    }
    

有る程度サンプル見れば分かるけど、実際にサイト作成するとなるとsinatra系のフレームワークは初めてなので少し大変そう。
あと、日本語のドキュメント少ないので自分サイトをまず作ってなれるようにしたい。

CakePHPでktai libraryを使う

構成

いつもの通りバーチャルホストでテスト。

hosts

127.0.0.1       test.sample.com

vhost

#test.sample.com
<VirtualHost *:80>
    DocumentRoot "/home/sample/public_html"
    ServerName test.sample.com
    <Directory "/home/sample/public_html">
        AllowOverride All
        order deny,allow
        allow from All
    </Directory>
</VirtualHost>

ディレクトリ

http://sample.com/ ← ユーザー
http://sample.com/admin ← 管理画面
http://sample.com/mobile ← モバイル
と分けたい。

/home/sample/
		cake_core ← [vendors、cake、plugins]
		public_html ← [appのwebrootをコピー]
		cake_app ← [appをコピーしてuser,admin,mobileにリネーム]

index.phpの変更

public_html/index.php

/**
 * These defines should only be edited if you have cake installed in
 * a directory layout other than the way it is distributed.
 * When using custom settings be sure to use the DS and do not add a trailing DS.
 */
    if (PHP_OS == "WIN32" || PHP_OS == "WINNT") {
        define('C', 'C:');
    } else {
        define('C', '');
    }
/**
 * The full path to the directory which holds "app", WITHOUT a trailing DS.
 *
 */
	if (!defined('ROOT')) {
		//define('ROOT', dirname(dirname(dirname(__FILE__))));
		define('ROOT', C.DS.'home'.DS.'sample'.DS.'cake_app');
	}
/**
 * The actual directory name for the "app".
 *
 */
	if (!defined('APP_DIR')) {
		//define('APP_DIR', basename(dirname(dirname(__FILE__))));
		define ('APP_DIR', 'user');
	}
/**
 * The absolute path to the "cake" directory, WITHOUT a trailing DS.
 *
 */
	if (!defined('CAKE_CORE_INCLUDE_PATH')) {
		//define('CAKE_CORE_INCLUDE_PATH', ROOT);
		define('CAKE_CORE_INCLUDE_PATH', C.DS.'home'.DS.'sample'.DS.'cake_core');
	}

public_html/mobile/index.phpは[APP_DIR]を’mobile’に変更

Ktai Libraryをコピー

githubからパッケージをダウンロードしてappディレクトリをmobileにコピー。
Ktai Library本体をmobile/vendorsにコピー。

routes.php

Router::connectNamed(array(), array('argSeparator' => '~'));

ktai_app_controller.php

ktai_app_controller.phpをapp_controller.phpにリネームする。

$ktaiプロパティの追加

今回は各コントローラーに追加。
ソースファイルは全て、UTF-8で作成しcharset=Shift-JISとして出力とした。

    var $ktai = array(
        'input_encoding'            => 'UTF-8',
        'output_encoding'           => 'SJIS-win',
        'use_binary_emoji'          => true,
        'output_auto_convert_emoji' => true,
        'output_auto_encoding'      => true,
        //'output_convert_kana'       => 'knrs',
        'output_convert_kana'       => 's',
        //'use_xml'                   => true,
    );

shift-jisでデータがサブミットされるので、

    function beforeFilter () {
        parent::beforeFilter();
        mb_convert_variables("UTF-8", "SJIS-Win", $this->data);
    }

とした。

また、フォームの「accept-charset」はApp.encodingの値が設定されるので

<?php echo $this->Form->create('Regist', array('encoding' => 'shift-jis'));?>

とする。

最後に

app_error.phpでエラー処理しているのですが、Ktaiコンポーネントのshutdownメソッドが呼ばれずshift-jisで出力できないので、エラーページだけshift-jisで対応しました。

Snow Leopard に PHP5.3 の環境に PHP4.4.9 をインストール

普段は迷わずPHP5.3使うのですが、今やってるサイトがPHP4なのでインストールしたときのログを残しておきます。

前提

  • PHPはシステムにもともと入ってるPHP5.3(portsでインストールしたものでない)
  • ApacheはportsでインストールしたApache2.2
  • どのようにするか

    PHP4はソースからインストールする。makeしてできるApahceのモジュールのMIMEタイプを『application/x-h-httpd-php4』で作成する。バーチャルホストの設定でPHP4で動くようにする。

    make準備

    [suusuke@macbook ~]$ curl -o php-4.x.tar.gz -L http://jp2.php.net/get/php-4.4.9.tar.gz/from/this/mirror
    [suusuke@macbook ~]$ tar zxvf php-4.x.tar.gz
    [suusuke@macbook ~]$ cd php-4.4.49
    

    sapi/apache2handler/sapi_apache2.cを変更する。

    #define PHP_MAGIC_TYPE "application/x-httpd-php"
    

    #define PHP_MAGIC_TYPE "application/x-httpd-php4"
    

    configure

    とりあえず最低限、必要そうなものをオプションに追加しました。
    また、Snow Leopardでconfigureする時はlresolvを有効にする必要があるようなので、『EXTRA_LIBS=-lresolv』で指定する。

    [suusuke@macbook ~]$ EXTRA_LIBS=-lresolv \ 
     ./configure --prefix=/usr/local/lib/php-4.4.9 \
     --with-apxs2=/usr/sbin/apxs \
     --enable-mbstring \
     --with-pgsql=/opt/local/lib/postgresql83 \
     --with-pdo-pgsql=/opt/local/lib/postgresql83 \
     --with-mysql \
     --with-pdo \
     --with-gd \
     --with-png-dir=/opt/local \
     --with-jpeg-dir=/opt/local \
     --with-zlib-dir=/opt/local
    

    ないものは基本portでインストール。
    今回インストールしたのは

    [suusuke@macbook ~]$ sudo port install libpng
    [suusuke@macbook ~]$ sudo port install jpeg
    

    の二つ。

    MySQL、PostgreSQLのインストールについてはSnow Leopard に PostgreSQL インストールSnow Leopard に MySQL 再インストールを参照。

    make

    [suusuke@macbook ~]$ make
    [suusuke@macbook ~]$ sudo make install
    

    設定

    [suusuke@macbook ~]$ sudo cp php.ini-recommended /usr/local/lib/php-4.4.9/lib/php.ini
    

    PHP.iniのinclude_pathにPEARのパスを追加。。。したいところだったんだけど、PEARがインストールされない。。。
    とりあえず、PEARは未だにPEAR::DB使ってるんみたいなんで、手動で入れることに。

    aliasの設定

    ~/.bashrc

    alias php4=/usr/local/lib/php-4.4.9/bin/php
    

    反映

    [suusuke@macbook ~]$ source ~/.bashrc
    

    確認

    [suusuke@macbook ~]$ php4 -v
    PHP 4.4.9 (cli) (built: Mar 26 2011 10:08:22)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
    

    バーチャルホストの設定

    # test.php5.info
    <VirtualHost *:80>
        DocumentRoot "/Library/WebServer/Documents/php5/public_html"
        ServerName test.php5.info
        <Directory "/Library/WebServer/Documents/php5/public_html">
            AllowOverride All
            order deny,allow
            allow from All
        </Directory>
    </VirtualHost>
    
    # test.php4.info
    <VirtualHost *:80>
        DocumentRoot "/Library/WebServer/Documents/php4/public_html"
        ServerName test.php4.info
        <Directory "/Library/WebServer/Documents/php4/public_html">
            AllowOverride All
            order deny,allow
            AddType application/x-httpd-php4 .php
            allow from All
        </Directory>
    </VirtualHost>
    

    phpinfo();で確認してみる。

    削除したいときは

    /usr/local/lib/php-4.4.9
    php-x.x.x/
          bin/ 	PHPコマンドなど
          etc/ 	pear設定ファイル
          include/ 	ヘッダファイルなど
          lib/php 	PEARライブラリディレクトリ
          man/ 	マニュアル
    
    /opt/local/apache2/modules/libphp4.so
    

    を削除するだけ。

    参考にさせてもらったサイト

    http://www.atmarkit.co.jp/fcoding/articles/macxphp/02/macxphp02a.html

    Snow Leopard に PostgreSQL インストール

    個人的にはMySQLの方が好きなんですが、開発環境としてPostgreSQLが必要になったのでその時のインストールメモ。

    ※euc-jpでcreatedbできなくて、3回インストール、アンインストールを繰り返しました・・・

    インストール

    今回は、PostgresSQL8.3をインストールする必要が有ったので、portで検索してからインストール。

    [suusuke@macbook ~]$ sudo port search postgresql
    [suusuke@macbook ~]$ sudo port install postgresql83
    [suusuke@macbook ~]$ sudo port install postgresql83-server
    

    ちなみに、postgresql83とpostgresql83-serverの違いは

    postgresql83 postgresql83-server
    psqlやpg_dumpなどのPostgreSQLのクライアントユーティリティ initdbやpg_ctlなどのPostgreSQLのサーバユーティリティ。
    DBMSサーバとして必要な機能はこれに含まれています。

    という感じです。

    自動起動・解除

    [suusuke@macbook ~]$ sudo port load postgresql83-server
    [suusuke@macbook ~]$ sudo launchctl list | grep macports ← 確認
    

    解除する場合は

    [suusuke@macbook ~]$ sudo port unload postgresql83-server
    

    領域確保と初期化

    portsでインストールするとログに書いてあるのでそのまま実行。

    [suusuke@macbook ~]$ sudo mkdir -p /opt/local/var/db/postgresql83/defaultdb
    [suusuke@macbook ~]$ sudo chown postgres:postgres /opt/local/var/db/postgresql83/defaultdb/
    

    euc-jpの場合は

    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/initdb -E EUC-JP --no-locale -D /opt/local/var/db/postgresql83/defaultdb'
    

    特に設定しない場合はデフォルト(ロケールの設定、通常はUTF-8)。

    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/initdb -D /opt/local/var/db/postgresql83/defaultdb'
    

    スタート・ストップ

    [suusuke@macbook ~]$ sudo su - postgres /opt/local/lib/postgresql83/bin/postgres -D /opt/local/var/db/postgresql83/defaultdb
    [suusuke@macbook ~]$ sudo su postgres -c '/opt/local/lib/postgresql83/bin/pg_ctl -D /opt/local/var/db/postgresql83/defaultdb stop'
    

    インストールログに起動方法はもう一つあるが

    [suusuke@macbook ~]$ sudo su postgres -c 'pg_ctl -D /opt/local/var/db/postgresql83/defaultdb -l logfile start'
    Password:
    server starting
    sh: logfile: Permission denied
    

    logfileがPermission deniedになってしまう、これはlogfileを絶対パスにしてやればOK

    [suusuke@macbook ~]$ sudo su postgres -c 'pg_ctl -D /opt/local/var/db/postgresql83/defaultdb -l /opt/local/var/db/postgresql84/logfile start'
    server starting
    

    補足

    インストールして追加されたpostgresユーザー情報の確認

    [suusuke@macbook ~]$ dscl . -read /Users/postgres
    AppleMetaNodeLocation: /Local/Default
    GeneratedUID: 8D95D02C-E3FB-4F3B-956B-96320B8FE6CD
    NFSHomeDirectory: /opt/local/var/db/postgresql83
    Password: *
    PrimaryGroupID: 500
    RealName:
     PostgreSQL-83 Server
    RecordName: postgres
    RecordType: dsRecTypeStandard:Users
    UniqueID: 500
    UserShell: /bin/sh
    
    [suusuke@macbook ~]$ dscl . -read /Groups/postgres
    AppleMetaNodeLocation: /Local/Default
    GeneratedUID: 8427C813-9996-42F4-9D92-83E57CDA93DA
    Password: *
    PrimaryGroupID: 500
    RealName: postgres
    RecordName: postgres
    RecordType: dsRecTypeStandard:Groups
    

    ルート権限でsu(switch user)したい場合はと sudo su xxxxx やれば良い事を初めて知った。。。
    macでしか使う事は無いと思うけど。