Mountain Lion で Image::Magick と PHP のトラブル

前回 やっと MovableType の起動までこぎ着けたのですが、まだまだ動作がおかしいです。

MovableType 起動!しかし……

MovableType が起動したのですが、今度は Image::Magick が見つからないとか申しよります。いいよ、もう。わかったって。入れ直せばいいんでしょ。

$ brew doctor
# brew の状態もおかしかったので逐次修正。
$ brew -v install imagemagick
$ cpanm -v Image::Magick
(中略)
Magick.xs:60:10: fatal error: 'magick/MagickCore.h' file not found
#include <magick/MagickCore.h>
^
1 error generated.
make: *** [Magick.o] Error 1

以前もここで引っかかった気がするぞ。Makefile.PL を修正します。

Continue reading

【Vim】errormarker.vim + Project::Libs で構文チェック

errormarker.vim を使うとコンパイル(Perl なら構文チェック)時のエラーを目立たせてくれるので便利だ。設定方法は以下のリンクを参照。

ErrorMarker.vimでプロジェクトのlibディレクトリを自動的に@INCに追加する – Cside::Tech
http://d.hatena.ne.jp/Cside/20111226/p1
errormarker.vim を使って flymake っぽくするやつを試してみた – ◆F99a.q8oVEの日記
http://d.hatena.ne.jp/f99aq/20080814/1218783740

で、設定してみたのだがうまくいかない…… help compiler などで調べてみると、b:current_compiler という変数が鍵だった。最終的な設定はこんな感じ。

let b:current_compiler='perl'
setl mp=$HOME/.vim/vimparse.pl\ -c\ %\ $*
if !exists('g:perl_flyquickfixmake')
    let g:perl_flyquickfixmake = 1
    au BufWritePost *.pm,*.pl,*.t silent make
endif

1 行目がないとせっかくの errormarker.vim が働かないのでした。なんでだろう?

【Perl】Dyn.com の IP アドレス更新をスクリプトで行う

ホストに割り当てられたグローバル IP アドレスの変更を検知し、Dyn.com に変更を適用するスクリプトを書いた。

公式に似た機能のスクリプト ddclient がすでにあるのだがそれを車輪の再発明。MooseX::Daemonize を使ってデーモンにしてみた。

delphinus35/dynupdate – GitHub
https://github.com/delphinus35/dynupdate

使用例

# 単純な例
$ dynupdate -u testuser -p testpass -n test.remora.cx restart
# 更新間隔と IP アドレス取得 URL を指定
$ dynupdate -u testuser -p testpass -n test.remora.cx -i 3600 -e http://detect.example.com/ restart

MooseX::Daemonize を使ったデーモンの作り方はいつかまとめよう。

【Perl】DBIx::Simple で副問い合わせや JOIN を使う

DBIx::Simple + SQL::Abstract を使うと簡単な SQL だと記述が簡潔にすむのだが、副問い合わせや JOIN を使い出すと途端に複雑になる。こういう場合は素直に素の SQL を書いた方がいいのだが、無理矢理にでも書くときはどうなるかやってみる。

WHERE 句にリテラル SQL を書く

文字列ではなく、文字列リファレンスを使う。例えば誕生日の「日」より「月」の方が数値として大きい(五月四日とか一〇月三日とか)人のリストを得たいとする。

SELECT id, name
FROM directory
WHERE MONTH(birthday) > DAY(birthday)

これを DBIx::Simple で表すとこうなる。

my $ds = DBIx::Simple->new($dbh);
my $rs = $sa->select('directory',
    ['id', 'name'],
    { 'MONTH(birthday)' => { '>' => \'DAY(birthday)' } },
    # { 'MONTH(birthday)' => \'> DAY(birthday)' },
);

Continue reading

【Perl】DBIx::Simple ノススメ

  1. はじめに
  2. DBIx::Simple + SQL::Abstract
  3. 単行取得メソッド
  4. 全行取得メソッド
  5. オブジェクトを返すメソッド

はじめに

Perl において DB に接続し、SQL を扱うモジュールはもちろん DBI モジュールな訳だが、これを格段に使いやすくしてくれる DBIx::Simple モジュールというのがある。

use DBIx::Simple; – 今日のCPANモジュール(跡地)
http://e8y.net/mag/009-dbix-simple/

このサイトのまとめが非常に分かり易い。例を挙げるとこんな感じ。

Continue reading

【Perl, Javascript】数値に位取りのコンマを挿入する

ものすごく車輪の再発明な気もするが、備忘録としておいておく。

Perl クックブックのレシピ 2.16 によると、表題のことを行う関数は次のように表せる。

sub commify {
    my $text = reverse $_[0];
    $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
    return scalar reverse $text;
}

これを Javascript で表すと次のようになる。

String.prototype.reverse=function(){return this.split('').reverse().join('')};
Number.prototype.commify=function(){return this.toString().reverse().replace(/(\d\d\d)(?=\d)(?!\d*\.)/g,'$1,').reverse()};
// 使用例
alert( (123456789).commify() );     // 「123,456,789」
alert( (-123456789).commify() );    // 「-123,456,789」
alert( (1234.56789).commify() );    // 「1,234.56789」

Continue reading