タグ別アーカイブ: ports

WordPressでちょっとした項目をキャッシュしておく関数

WordPressでちょっとした項目をキャッシュしたい!というそんな要望からキャッシュ関数を作りました。

/**
* To cache data on wp_options.
* $callback function is call and store its data as serialized object.
* An optionname used in this function is  _periodic_cache_.$callback as defaul\
t.
*
* @return mixed */
function cache_($cache, $periodic = '1 hour', $param = array(),
$optionname = ''){
$optionname = $optionname
? $optionname
: '_periodic_cache_'.$callback;
$obj = get_option($optionname);
// revert $periodic to present time
if ($obj->modified < (time()*2 - strtotime($periodic)) ) {
$obj = new StdClass();
$obj->data = call_user_func_array($callback, $param);
$obj->modified = time();
update_option($optionname, $obj);
} else {
}
return $obj->data;
}

function c_($callback, $periodic='',$param = array(), $optionname=''){
return periodic_cache($callback, $periodic, $param, $optionname);
}

}

使い方は至って簡単。この関数の戻り値をキャッシュしたいな~、という時にこのキャッシュ関数を経由して呼び出せばOK。

例えばget_recent_posts()なんていう、最近の投稿一覧を取得する関数を作って、その値をキャッシュしたいのであれば

$posts = cach_('get_recent_posts', '20 hour', $param);

とすればおk。内部ではget_recent_posts()を$paramを引数として呼び出す。前回の呼び出しから20時間以内であればキャッシュを使用する。

これで簡単なものはキャッシュから読み出せるね。

削除の関数とかは作ってないよ。必要になったら作るかな~。

FreeBSDにteamspeak3のサーバを導入する

1. はじめに

FreeBSDにteamspeak3のサーバを導入してみました。

普段はサービスはportsから入れてるんだけど、portsの更新が遅れてるみたいなのでちょっと変則的にインストールしてみました。

portsの更新とかって何か個人でサポートできることがあればいいんだけど、どうしたらいいのかわかんないのでしょんぼり。いつかはportsのメンテナとかになってみたいな!

続きを読む FreeBSDにteamspeak3のサーバを導入する

FreeBSDでwsgiを使ったtracがどうもおかしい

FreeBSDでwsgiを使ったtracがどうもおかしい。なんだか重い。もともとfcgiを利用してたんだけれどfcgi版のtrac(というかpythonかな)って重い、なのでwsgiにて動かすことにした。

過去にyubirdたんがdebianで、また別件でcentosにてwsgi版のtracを動かしたけどとっても快調だった。

どうやらapache+pythonでの最近のハヤリはwsgiらしい。ということでテキトウにインストールした。

さて、confの変更もすんで動かしてみたんだけれどどうにも重い。topすればpythonの名前でapacheから独立してプロセスが走り続けてたりする。なんかおかしいな、って。ログを見ると気になる記述が。

[Wed Apr 11 13:37:47 2012] [info] mod_wsgi (pid=1189): Attach interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Cleanup interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Terminating Python.
[Wed Apr 11 13:37:52 2012] [error] Exception KeyError: KeyError(34382823872,) in <module 'threading' from '/usr/local/lib/python2.6/threading.pyc'> ignored

最後の行にあるException KeyError: KeyErrorのあたり。なんかスレッド周りの処理でエラーが出てるらしい。

でググってみるとそれらしき記述を発見。

InstallationOnFreeBSD -  modwsgi - Python WSGI adapter module for Apache. - Google Project Hosting

http://code.google.com/p/modwsgi/wiki/InstallationOnFreeBSD

上記のgoogle codeによるとあれしろコレしろ、ってあるけど、結局最後にはwsgi3.3使ったら直ったよってことが。

調べてみるとwsgiのバージョンは2.8を使ってた。

shell> pkg_info -Ix wsgi
ap22-mod_wsgi-2.8_2 Python WSGI adapter module for Apache
shell> psearch wsgi

www/mod_wsgi              Python WSGI adapter module for Apache
www/mod_wsgi3             Python WSGI adapter module for Apache


どうやらバージョンデュアルツリー(っていう名前を今作った!)らしくて2系がstableで3系は実験的なのかな、両方存在してた。2系をアンインスコして3系を入れる。

shell> pkg_deinstall -f www/mod_wsgi
** No matching package found.
shell> portinstall –c www/mod_wsgi3

以上でちゃんといけたっぽい。めでたしめでたす。

でも早くなったかどうかは微妙、残念。

PearのLanguageDetectが入ってなかったのでインストール at FreeBSD

FreeBSDで過去に作成したファイルにおいて、LanguageDetectがインストールされていないホストで実行したためエラーで怒られた。

shell> php hoge.php
PHP Warning:  require_once(Text/LanguageDetect.php): failed to open stream: No such file or directory in /home/hoge/tmp/hoge.php on line 8

Warning: require_once(Text/LanguageDetect.php): failed to open stream: No such file or directory in /home/hoge/tmp/hoge.php on line 8

いつもだとさっくりportsでインストールするんだけれど、このLanguageDetectはalpha版のためかportsには登録されてない。手動でpearからインストールする。

shell> sudo pear search Language
Retrieving data...0%
MATCHED PACKAGES, CHANNEL PEAR.PHP.NET:
=======================================
PACKAGE             STABLE/(LATEST) LOCAL
Text_LanguageDetect 0.2.3 (alpha)         Language detection class

shell> sudo pear install Text_LanguageDetect
Failed to download pear/Text_LanguageDetect within preferred state "stable", latest release is version 0.2.3, stability "alpha", use "channel://pear.php.net/Text_LanguageDetect-0.2.3" to install
install failed
shell> sudo pear install channel://pear.php.net/Text_LanguageDetect-0.2.3
downloading Text_LanguageDetect-0.2.3.tgz ...
Starting to download Text_LanguageDetect-0.2.3.tgz (120,947 bytes)
..........................done: 120,947 bytes
install ok: channel://pear.php.net/Text_LanguageDetect-0.2.3

と言うわけで、最終的にはインストールするために “pear install channel://pear.php.net/Text_LanguageDetect-0.2.3” を指定すればおkだった。

FreeBSDでportsnapとportversionの設定を他のホストに移したかった

1. FreeBSDでportsnapとportversionの設定を他のホストに移したかった

現在、メインで利用しているホストでportsnapとportversionをcrontabで回している。

この設定を他のホストに移動させてあげたかったのでワンライナーで書いた。そのメモ。

shell> grep port  /etc/crontab
34      3       *       *       *       root    /usr/sbin/portsnap cron && /usr/sbin/portsnap update
10      3       *       *       *       hogetan /usr/local/sbin/portversion -vL= > /home/hogetan/var/portversion.`hostname`

shell> grep port /etc/crontab |  ssh targethost "sudo sh -c 'cat >> /etc/crontab'"

FreeBSDでportsからパッケージをインストールする時にコマンドラインから引数を与える

FreeBSDでportsからパッケージをインストールする時にコマンドラインから引数を与える方法。

openldapのパッケージをインストール中に、依存するパッケージが既にインストールされていたことで衝突を起こしてエラーになってしまった。

エラーメッセージは以下のとおり。

shell> portinstall -c /usr/ports/net/openldap24-server
(中略)
--->  Installing the new version via the port
===>  Installing for openldap-sasl-client-2.4.26
===>   openldap-sasl-client-2.4.26 depends on shared library: sasl2.2 - found
===>   Generating temporary packing list
===>  Checking if net/openldap24-sasl-client already installed
===>   openldap-sasl-client-2.4.26 is already installed
      You may wish to ``make deinstall'' and install this port again
      by ``make reinstall'' to upgrade it properly.
      If you really wish to overwrite the old port of net/openldap24-sasl-client
      without deleting it first, set the variable "FORCE_PKG_REGISTER"
      in your environment or the "make install" command line.
*** Error code 1

Stop in /usr/ports/net/openldap24-sasl-client.
*** Error code 1

Stop in /usr/ports/net/openldap24-sasl-client.
*** Error code 1

Stop in /usr/ports/net/openldap24-sasl-client.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall20111012-61
602-1i6gyio-0 env make reinstall
** Fix the installation problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
        ! net/openldap24-sasl-client    (install error)

openldap-sasl-clientがすでにインストールされてるよ、ってことらしい。
アドバイスによればmake deinstallしてやればうまくいくよ、ってことが書いてある。
また同時にFORCE_PKG_REGISTERを設定すれば強制的にインストールしてくれるらしい。
この値はmake時に渡される環境変数で、シェルに環境変数をセットしてもいい。またpkgtools.confに記述して対象となるパッケージのmake時のオプションとして追加してもいい。

今回はこの一回だけをこの”FORCE_PKG_REGISTER”を与えてインストールしたかったので、portinstallにオプションを与えるやり方を行った。

shell> portinstall -c -m "FORCE_PKG_REGISTER=yes" net/openldap24-server

このやりかただと、おそらく依存でインストールされるすべてのパッケージに”FORCE_PKG_REGISTER”が追加されるのでちょっとだけ注意が必要かも。
また、値の与え方について、こういった変数の場合は定義するだけでよかったりするんだけれど、今回はこの変数に対してyesを設定する必要があった。

FreeBSD 8.2でPHPのアップデートが出来ない

FreeBSD 8.2でPHPのアップデートが出来ない。

この問題は結構前から起こってて、なにげに苦しんでたりした。

PHP自身のバグというか、拡張モジュールが読み込まれない問題に遭遇してて、PHPの入れ直しをしたいなぁと思っていたのだけど、この問題のせいで入れ直しが出来なかった。

問題というのは、portsを利用してphp周りのパッケージをコンパイルするときに、途中でエラーが発生してコンパイルができない。もうちょっと詳しく言うとautoconfの2.68がnot foundって言われて止まってしまうのだ。

この問題に対していくつかの対策を行おうとした。だけれどダメだった。autoconfの入れ直しは行った。複数のバージョンを入れてシンボリックリンクで入れ替えてみたりした。autoconf-wrapperとシンボリックリンクを入れ替えてみた。でもダメだった。

でも今回ちょっとだけググったらうまくいった様子。それについてのメモメモ。

まずは問題点。portupgradeでコンパイルしようとすると./configure?の段階でエラーが出てしまう。

shell> sudo portupgrade -r php5

===>  PHPizing for php5-mcrypt-5.3.6
 Configuring for:
 PHP Api Version:         20090626
 Zend Module Api No:      20090626
 Zend Extension Api No:   220090626
 autoconf: required version 2.68 not found
 *** Error code 1

Stop in /usr/ports/security/php5-mcrypt.

(後略)

phpに関連するヤツはことごとくダメ。マジでダメ。

2.68 not foundって言われる割にはautoconfの2.68がちゃんと入ってる。

%pkg_info -Ix autoconf
 autoconf-2.68 Automatically configure source code on many Un*x platforms
 autoconf-wrapper-20071109 Wrapper script for GNU autoconf

ここでaucotonf 2.68 not foundあたりのキーワードでググってみるとまさにFreeBSDでPHPをコンパイルするときにエラーがでている人を発見。で、その人はこんな事を書いてる。

IMPORTANT: if you have either devel/autoconf-wrapper or
devel/automake-wrapper installed on your system (and you most likely do)
PLEASE update these ports to their new versions before updating anything
else — Bad Things[tm] are likely to happen otherwise.

"autoconf: required version 2.68 not found" error when trying to make php5 from FreeBSD's ports - Knowledge Base #54

さっくり翻訳すると、autoconf-wrapperかautomake-wrapperをインストールしている場合には、それらをアップデートしましょう、との事。早速確認してみる。

shell> sudo portversion -vL= | grep autoconf
 autoconf-wrapper-20071109   <  needs updating (port has 20101119)

確かに古い。ってことでアップデートをする。

shell> sudo portupgrade autoconf-wrapper-20071109

これでPHPのコンパイルがちゃんとできるようになった。めでたしめでたし。

lzmaという形式を解凍したいon FreeBSD7

lzmaというファイルの解凍をさせたかった。よくわかんないからgtarを入れた

追記:
ちなみに、xzはどうやらlzmaという圧縮形式の後継らしく、
だからインストールパッケージも、
lzmautilsという名前が付いています。

lzmautils-develをインストールすると、
このlzma形式の圧縮、解凍もできます。

上と同様に、

lzmadec ***.tar.lzma > ***.tar
tar xvf ***.tar

などとするとよいでしょう。

http://sanmaya100p.blog111.fc2.com/blog-entry-348.html

FreeBSDのportsを探すときに便利なコマンド

FreeBSDのportsを探すときに便利なコマンド

普段は/usr/ports行って

%make search name=”hogehoge” | grep -A1 Ports | grep hogehoge

してたけど、探す専用のパッケージがあるらしい。

そういった遍歴の結果、portsmgmt/psearchに辿り着いて今のことろ満足している。

書式は以下の通り。

psearch [options] PATTERN

PATTERNには正規表現が使える。

自分とこだとあっちこっちにシステムが分散してるから、汎用サーバにこれ入れて

% ssh hoge.l2tp.org psearch hogehoge

ってやれば見つかると思う。nfsでマウントしてるからportsディレクトリの構成も全く一緒だし。nfsじゃなかったとしてもportsnapでわざわざ違う構成にする予定もないけどね!