@blog.justoneplanet.info

JavaScript、PHP、MySQLを使ったり

Windows XPでPHPとimageMagickを使用する

■ImageMagick

以下のサイトからWindows版をダウンロードしてインストールする。

http://www.imagemagick.org/script/binary-releases.php?ImageMagick=pjjjn3udinf3ldej2osq7k8nj1#windows

Program Files配下などのスペースを含むパスにインストールせず、cドライブ直下が望ましいらしい。

環境変数

設定>コントロールパネル>システム>詳細設定>環境変数>システム環境変数

変数名はMAGICK_HOMEとし値はインストールしたパスを入力する。

■Microsoft Visual C++ 2005 SP1

以下のサイトからインストール

http://www.microsoft.com/downloads/details.aspx?familyid=200B2FD9-AE1A-4A14-984D-389C36F85647&displaylang=ja

■php_imagick

以下のサイトからインストールする。

http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/

リンクが切れている場合はここ

上手くいかない場合は以下のサイトのdllを使用した方が良いかもしれない。

http://valokuva.org/?page_id=50

extension_dir = "C:\xampp\php\ext"

php.iniが上述のような場合は「C:\xampp\php\ext」にファイルを配置する。

php.ini

以下の設定を追加(パスは環境に合わせて変更してください)

extension=php_imagick.dll

Windowsを再起動すると使用可能になる。

contentEditableをJavaScriptで変更する際に気をつける事

■結論

以下のように書けばブラウザに関係なく変更が可能である。

document.getElementById('editor').contentEditable = true;//firefox, chrome, opera, safari, IE...OK

jQueryだと以下のようになる。

$('div#editor').attr('contentEditable', true);//firefox, chrome, opera, safari, IE...OK

■失敗例

以下のように書くとIEでは動作しなくなる。

$('div#editor').attr('contenteditable', true);//firefox, chrome, opera, safari...OK

PHPとGDでテキスト量に合わせたサイズの画像を生成する

GDは意外にもやってくれる!

■ソースコード

以下のように、imagettfbbox関数によってテキストボックスのサイズが取得可能である。

<?php
$text     = 'Open the door!';// string
$fontSize = 30;
$font     = '/usr/share/fonts/bitstream-vera/ACaslonPro-Bold.otf';// path

$box    = imagettfbbox($fontSize, 0, $font, $text);
$img    = imagecreatetruecolor($box[2] - $box[6] + 10, $box[3] - $box[7] + 10);
$color  = imagecolorallocatealpha($img, 210, 0, 0, 255);
$backgroundColor = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagealphablending($img, true);
imagesavealpha($img, true);

imagefill($img, 0, 0, $backgroundColor);
imagettftext($img, 30, 0, 0, $box[3] - $box[7], $color, $font, $text);

header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
?>

■画像

こんな感じのができる!

font

PHPとImageMagickでテキスト量に合わせたサイズの画像を生成する

■ソースコード

以下のように記述する。

<?php
$text            = "にこにこぷん";//utf-8
$color           = 'black';
$backgroundColor = 'transparent';

$im    = new Imagick();
$idraw = new ImagickDraw();
$idraw->setFont('/usr/share/fonts/bitstream-vera/A-OTF-ShinMGoPro-DeBold.otf');// font
$idraw->setFontSize(30);// font size
$idraw->setGravity(Imagick::GRAVITY_CENTER);// gravity
$idraw->setFillColor($color);// 文字色塗り
$idraw->setStrokeColor($color);// 文字色輪郭
$idraw->annotation(0, 0, $text);
$metrics = $im->queryFontMetrics($idraw, $text);//get the size of string

$im->newImage($metrics['textWidth'], $metrics['textHeight'], $backgroundColor);
$im->drawImage($idraw);
$im->setImageFormat('png');
header('Content-Type: image/png');
echo $im;
$im->destroy();
$idraw->destroy();
?>

14行目でサイズを取得し、16行目でイメージのサイズとして使用する。

■画像

こんな感じのができる!

numpyをインストールする

■環境

Cent OS 5.5

前準備

以下のコマンドを実行し、python-develをインストールしておく。

yum install python-devel

■コマンド

以下のコマンドでnumpyがインストールされる。

wget http://sourceforge.net/projects/numpy/files/NumPy/1.5.0b1/numpy-1.5.0b1.tar.gz/downloadwget
tar xvzf numpy-1.5.0b1.tar.gz
python setup.py build
python setup.py install

Pythonのリストを触ってみる

list = ['hoge', 'huga', 'baka']
list[0]
#hoge

スライスもできる★

list[0:2]
#['hoge', 'huga']

リストの長さは以下のようにして取得できる。

len(list)
#3

for文を使って以下のように処理できる。

for i in list:
    print i, len(i)
#hoge 4
#huga 4
#baka 4

先頭に連番を振るJavaScript

勿体ないから・・・

function perform(){
    var txt = document.getElementById('input').value;
    var ary = txt.split('\n');
    for(var i = 0; i < ary.length; i++){
        ary[i] = (i + 1) + ',' + ary[i];
    }
    txt = ary.join('\n');
    document.getElementById('input').value = txt;
}

Pythonの文字列

Pythonでは以下のように文字列を切り出す事ができる。

str = "prepost"
str[:3]#'pre'
str[3:]#'post'
str[:-4]#'pre'
str[-4:]#'post'
str[2:4]#'ep'

C 言語の文字列と違い、Python の文字列は変更できない。JavaScriptと同じだ。

■文字列の結合

文字列は以下のように+演算子で結合する事ができる。

'str' + 'ing'
#'string'

文字列リテラルの場合は以下のように演算子を書かなくても連結できる。

'str' 'ing'
#'string'

しかし以下のようにするとエラーになる。

'str'.strip() 'ing'

Zend_Validateをつかってみる

■使用方法

以下のようにしてバリデートする。

$validator = Zend_Validate_EmailAddress();
if($validator->isValid($str)){
    //success
}
else{//falure
    $this->view->error = $validator->getMessages();//array
}

エラーメッセージの変更

以下のようにするとエラーメッセージを変更することができる。

$validator = new Zend_Validate_StringLength(8);
$validator->setMessage(
    'コラァ=3',
    Zend_Validate_StringLength::TOO_SHORT
);
if($validator->isValid($str)){
    //success
}
else{
    $this->view->error = $validator->getMessages();//array
}

以下のように数パターンエラーメッセージを指定することも考えられる。

$validator = new Zend_Validate_StringLength(array(
    'min' => 2,
    'max' => 10
));
$validator->setMessage(
    Zend_Validate_StringLength::TOO_SHORT => 'コラァ=3',
    Zend_Validate_StringLength::TOO_LONG => 'ゴルァ=3'
);
if($validator->isValid($str)){
    //success
}
else{
    $this->view->error = $validator->getMessages();//array
}

■静的に扱う

以下のようにZend_Validateクラスの静的メソッドを用いてバリデートすることもできる。

if(Zend_Validate::is($str, 'EmailAddress')){
    //success
}
if(Zend_Validate::is($str, 'StringLength', array('min' => 10, 'max' => 20))){
    //success
}

■多言語対応

デフォルトのメッセージはベタ&英語なのでパンチの利いたセリフが必要だ。

$validator = new Zend_Validate_EmailAddress();
$validator->setTranslator(new Zend_Translate(
    'array',
    array(
        Zend_Validate_Hostname::UNKNOWN_TLD => 'そんなトップレベルドメインしらねーぜぃ'
    ),
    'en'
));
if($validator->isValid()){
    //success
}
else{
    //failure
}

以下のようにして一度に適用できる。

Zend_Validate::setDefaultTranslator(new Zend_Translate(
    'array',
    array(
        Zend_Validate_Hostname::UNKNOWN_TLD => 'そんなトップレベルドメインしらねーぜぃ'
    ),
    'en'
));

バリデートのクラスはすごくいっぱい。

http://framework.zend.com/manual/ja/zend.validate.set.html

■バリデータチェーン

以下のようにして1つのインスタンスに複数のルールを付加できる。

$validator = new Zend_Validate();
$validator->addValidator(new Zend_Validate_Alnum());
$validator->addValidator(new Zend_Validate_StringLength(array(
    'min' => 10,
    'max' => 20
)));

■自作バリデータ

めんどくさいけど作ってみる。以下のようにZend_Validate_Abstractを継承して自作バリデータを作ることができる。

class MyValidate_Array extends Zend_Validate_Abstract
{
    const ARRAY = 'array';
    protected $_messageTemplates = array(
        self::ARRAY = "'%value'は配列を入れてね!"
    );
    public function isValid($value)
    {
        if(!is_array($value)){
            $this->_error(self::ARRAY);
            return false;
        }
        else{
            return true;
        }
    }
}