CentOS6にFML8でメーリングリスト

いろいろコラボレーションツールとかありますが、根強い人気のメーリングリスト。
みんなが使い慣れたインターフェースで、スマホにも届くし、
新しいことを覚えなくていいので、使いたいご要望をよくいただきます。

しかしMLは使いたくてもMLの管理はみんなやりたがらない。
コマンドメール送ってねといってもやらない。
今回の目的は、メンバー全員に届く&返信も全員にできる、ぐらいですからね。

そんなわけで久々にCentOS6にFML8を導入しました。他はpostfixとapacheです。

■ポイント
・perlのモジュール揃える
・CGI動かすのに苦労、suexec配下なのとmod_perlじゃダメ

■インストール
本家の説明の通り。
この時点でアレが足りないとか言われたらyumでインストールする。

■バーチャルドメイン
makefml newdomain example.net するのを忘れない
virtual_alias_mapsの指定を忘れない

■管理用webインターフェース(CGI)を使う
SuEXECでfmlユーザーが動かないといけないのでそのようにする。
/home/fml/public_html/cgi-bin/以下略~となるので
http://example.com/~fml/cgi-bin/以下略~と動かす。
表向きのドメインにUserDirが見えるのもなんだかなーということでfmlだけ使えるようにする
続きを読む

WordPress上でAPCのエラー→メモリ調整

そんな爆発的な数のアクセスを裁くわけでもなしー、と、さくらのVPSを使ってデフォルト適当に動かしていたところ、一部WordpressサイトでAPCのメモリ不足だとエラーが出まくる。
「Unable To Allocate Memory For Pool」
こりゃ調整しないといけない。

apc.phpを眺めつつ、たぶんプラグイン入れまくりで何かあるよなーと思うもWPはWPで対処するとして別件に。
サーバー設定としては単純にAPCのメモリ割当量を増やせば解決!というわけにもいかないので、そもそものメモリ割当量が多すぎなんじゃないのかということで調整。
CentOS6、メインメモリ2GB。

/etc/php.d/apc.ini
apc.shm_size = 128M
apc.mmap_file_mask=/dev/zero

php および APC の設定を行う | レンタルサーバー・自宅サーバー設定・構築のヒント
メモリ2GBなので128MBに。1GBで64M、512MBで32Mが適量のよう。

それでもまだエラー出る。しかしこれ以上は増やせない!
ということで1プロセスあたりのメモリを減らすためにapacheのモジュールを外す。

ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編) – さくらインターネット創業日記
参考になります。

とりあえずまだPreforkで動かしているので
/etc/httpd/conf/httpd.conf
<IfModule prefork.c>
StartServers 10
MinSpareServers 5
MaxSpareServers 15
ServerLimit 256
MaxClients 128
MaxRequestsPerChild 2000
</IfModule>

と設定して様子見。
KeepAliveはOff。

今のところ穏やか。

WordPress>category-iconsプラグインのエラー回避

なんかエラーが出てるwordpressサイトがあり、cateogory-iconsプラグインの中で問題が起きている模様。

[Tue Jul 08 20:44:38 2014] [error] [client XXX.XXX.XXX.XXX] PHP Warning:  Missing argument 2 for wpdb::prepare(), called in /path/to/wordpress/wp-content/plugins/category-icons/category_icons.php on line 1047 and defined in /path/to/wordpress/wp-includes/wp-db.php on line 1147, referer: http://www.osc-japan.com/wp-admin/plugins.php

WP3.5あたりで必須になったパラメータがついていない。
というかcategory-iconsプラグインがその後バージョンアップしていないっぽい。
なのでcategory_icons.phpに手を入れます。

1047行目
$wpdb->query($wpdb->prepare("CREATE TABLE IF NOT EXISTS `$wpdb->ig_caticons` (`cat_id` INT NOT NULL ,`priority` INT NOT NULL ,`icon` TEXT NOT NULL ,`small_icon` TEXT NOT NULL , PRIMARY KEY ( `cat_id` ))",0));
1338行目
$datas = $wpdb->get_results($wpdb->prepare("SELECT cat_id, priority, icon, small_icon FROM $wpdb->ig_caticons",0));

prepareの第2引数に0を入れてやる。

これでエラーなく動きました。

参考
WordPress › Support » WordPress 3.5 Admin Error

Contact Form 7の文面をfilterでいじる

WordPressを使ってお問合せフォームといえばContact Form 7というぐらいに定番になっているかと思いますが,単純なお問合せフォームでも色々と条件分岐したり,置換してみたりしたいことが出てきます。
条件分岐や置換の部分をPHPで書けば良いのですが,さてそのフィルタをどこに入れようかと,ソースを追いかけると,ちゃんと用意されておりました。

contact-form-7/includes/class.php 内の compose_mail 内で

$components = compact(
  'subject', 'sender', 'body', 'recipient', 'additional_headers', 'attachments' );
$components = apply_filters_ref_array( 'wpcf7_mail_components',
  array( $components, &$this ) );
extract( $components );

というのがありましたので,テーマ内のfunctions.phpにこんな感じで追加

add_filter('wpcf7_mail_components', 'my_mail_filter',10,2);
function my_mail_filter( $components, $cf7) {
  $lines=explode("\n",$components['body']);
  $newbody='';
  foreach($lines as $l){
    //行毎に分解して処理する感じのコード
    //例えば半角カナを全角に変換とか
    $newbody.=mb_convert_kana($l,'aKV')."\n";
  }
  $components['body']=$newbody;
  return $components;
}

あとは自分の関数内で書き放題ということで。