そんなに用途は無いと思うんですが、PHPのpirntf構文やsprintf構文のフォーマットから変換指定子(%sや%d等)を抜き出す正規表現を書いてみました。

/(?:^|[^%])%(?:[0-9]+\$)?(?:[\+\-]?(?:0|\'[^%])?[\d]*?(?:\.\d+)?)?[bcdeEufFgGosxX]/u

preg_match_allなどで利用すれば、変換指定子が何個使用されているかなどを調べることができると思います。

用途

プログラム中でprintf構文に必要とされる引数の数を調べなくてはならなくなり、下記のような関数を作って利用しています。

function _argAmount($pattern)
{
	preg_match_all(
		'/(?:^|[^%])%(?:([0-9]+)\$)?(?:[\+\-]?(?:0|\'[^%])?[\d]*?(?:\.\d+)?)?[bcdeEufFgGosxX]/',
		$pattern,
		$matches
	);

	$count = 0;

	if (!empty($matches[1])) {
		$filtered = array_filter($matches[1]);
		$max = max($filtered);
		$empty = count($matches[1]) - count($filtered);
		$count = ($max > $empty) ? $max : $empty;
	}

	return $count;
}

各種WEBアプリのバージョン管理にWindows版のGitを利用しています。

しかしながら、このGitをインストールしてからというものの、コマンドプロンプトのフォントがMSゴシックからLucida consoleに変わってしまって、微妙に使いづらい。コマンドプロンプトのフォント設定を直しても、フォルダの右クリックして「Git bash here」を実行しても元に戻っている始末。

というわけで、レジストリをいじってフォント設定を変更しました。
当該のレジストリ、

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont

を開いて、内部にある

0   REG_SZ  Lucida Console

の値を削除。

これでめでたくコマンドプロンプトがMSゴシックで表示されるようになりました。

Git

http://code.google.com/p/msysgit/

MovableTypeでエントリーの概要文のみを表示する方法

MovableTypeでエントリーの概要文を表示する際は、<$mt:EntryExcerpt$>を利用します。

ただ、このタグは概要文が存在しない場合は本文の最初200文字を表示してしまいます。
この場合、日本語のドキュメントには表記してありませんが、下記のオプションを利用することで概要文が存在する場合のみ表示し、存在しない場合は本文の引用を行わないようになります。

<$mt:EntryExcerpt no_genarate="1"$>

MovableTypeは日本語ドキュメントが充実していないので、こういった便利な機能が探さなければ出てこない不便さをなんとかして欲しいですね。

CSSで複雑な表組みなどをデザインしている際、幅や高さをピクセル単位で細かく指定したいことがありますよね?

ただ、HTMLのstyle要素は記述が汚くなるから使いたくない、でもCSSでわざわざclassを作っているとCSSがごちゃごちゃしてしまう・・・。

そんな場合に、HTMLのclass要素を使って、簡単に幅と高さを指定できるJavaScriptを書いてみました。

ダウンロード

wh.js
※jQueryを利用しますので、別途jQuery 1.3.2以上のバージョンをダウンロードしてください。

ソース

(function($) {
    $(function() {
        $('[class*=w_], [class*=h_]').each(function() {
            var classes = $(this).attr('class').split(' ');

            for (var i in classes) {
                if (match = classes[i].match(/^([wh])_(\d+)(px|p)$/)) {
                    var key = '';
                    var value = '';

                    switch (match[1]) {
                        case 'w':
                            key = 'width';
                            break;
                        case 'h':
                            key = 'height';
                            break;
                    }

                    switch (match[3]) {
                        case 'p':
                            value = match[2] + '%';
                            break;
                        case 'px':
                            value = match[2] + 'px';
                            break;
                    }

                    $(this).removeClass(match[0]).css(key, value);
                }
            }
        })
    });
})(jQuery);

設置

jqueryを利用しますので、本ライブラリを読み込ませる前にjqueryの1.3.2以上を読み込ませてください。



利用方法

class指定に下記のような記述をしてください。

この場合、widthが100ピクセル、heightが200ピクセルの指定がされます。
また、パーセントでの記述も対応しています。

この場合、widthが100%、heightが33%の指定になります。
他のclassとの共存も問題ありませんので、比較的自由なデザインが可能になるかと思います。

CakePHPのMediaプラグインは非常に多機能なプラグインで、バージョン管理という非常に便利な機能が備わっており、本画像に手を加えずにいくつものサムネイル画像を生成する事ができます。

ただ、その便利な機能であるバージョン管理機能が少々複雑で、馴れないと使いづらい印象を受けてしまいます。

たとえば画像をアップロードする際、モデルごとに違ったサイズのサムネイルを生成したい、などという場合などが特に悩むポイントかと思います。

基本的にMediaプラグインは、あらかじめアップロードするファイルごとに生成するファイルを「バージョン」として定義しているため、Mediaプラグインを通してアップロードしたファイルは、全て定義した数のバージョンファイルが生成されてしまいます。

そこで、下記のように工夫することで、モデルごとに生成するバージョンファイル取捨選択するアイデアです。

Attachmentモデルをコピーして改良

App::import('Lib', 'Media.Media');

class Attachment extends AppModel
{
    public $name = 'Attachment';
    public $useTable = 'attachments';
    public $useVersions = array();

    public $actsAs = array(
        'Media.Transfer' => array(
            'trustClient' => false,
            'transferDirectory' => MEDIA_TRANSFER,
            'createDirectory' => true,
            'alternativeFile' => 100
        ),
        'Media.Generator' => array(
            'baseDirectory' => MEDIA,
            'filterDirectory' => MEDIA_FILTER,
            'createDirectory' => true,
        ),
        'Media.Polymorphic',
        'Media.Coupler' => array(
            'baseDirectory' => MEDIA
        ),
        'Media.Meta' => array(
            'level' => 2
        )
    );

    public $validate = array(
        'file' => array(
            'resource'   => array('rule' => 'checkResource'),
            'access'     => array('rule' => 'checkAccess'),
            'location'   => array('rule' => array('checkLocation', array(
                MEDIA_TRANSFER, '/tmp/'
            ))),
            'permission' => array('rule' => array('checkPermission', '*')),
            'size'       => array('rule' => array('checkSize', '5M')),
            'pixels'     => array('rule' => array('checkPixels', '1600x1600')),
            'extension'  => array('rule' => array('checkExtension', false, array(
                'jpg', 'jpeg', 'png', 'tif', 'tiff', 'gif', 'pdf', 'tmp'
            ))),
            'mimeType'   => array('rule' => array('checkMimeType', false, array(
                'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf'
        )))),
        'alternative' => array(
            'rule'       => 'checkRepresent',
            'on'         => 'create',
            'required'   => false,
            'allowEmpty' => true,
        )
    );

    public function makeVersion($file, $process)
    {
        if (!is_array($this->useVersions) && !empty($this->useVersions)) {
            $this->useVersions = array($this->useVersions);
        }

        if ($this->useVersions === false || !empty($this->useVersions) && !in_array($process['version'], $this->useVersions)) {
            return true;
        }

        return $this->Behaviors->Generator->makeVersion($this, $file, $process);
    }
}

モデルごとに生成するバージョンファイルを切り替える

先ほどのモデルを継承したモデルを生成し、メンバー変数 $useVersions に利用したいバージョンファイル名を配列で列挙します。

App::import('Model', 'Attachment');

class UserImage extends Attachment
{
    public $name = 'UserImage';
    public $useVersions = array('main', 'sub');

    public $validate = array(
        'file' => array(
            'resource'   => array('rule' => 'checkResource'),
            'access'     => array('rule' => 'checkAccess'),
            'location'   => array('rule' => array('checkLocation', array(
                MEDIA_TRANSFER, '/tmp/', 'C:\xampp\tmp',
            ))),
            'permission' => array('rule' => array('checkPermission', '*')),
            'size'       => array('rule' => array('checkSize', '1M')),
            'extension'  => array('rule' => array('checkExtension', false, array(
                'jpg', 'jpeg', 'png', 'gif', 'tmp',
            ))),
            'mimeType'   => array('rule' => array('checkMimeType', false, array(
                'image/jpeg', 'image/png', 'image/gif',
            ))),
        ),
    );
}

$useVersions が空の場合は全てのバージョンファイルが生成されます。
これにより、モデルごとに生成するバージョンファイルを切り替えることが可能になります。