Posts tagged png
CakePHP1.2 に SimpleTest をインストール
2CakePHP1.2 では SimpleTest を使用したユニットテストが行えます。
テスト実行用スクリプトは app/webroot/test.php です。ブラウザからこのスクリプトへアクセスします。
(続きを読む…)
WordPress テーマを作成する(2)
1前回は style.css と index.php だけを作成して最低限のブログを表示させました。なぜこれだけのファイルで表示ができるかというと選択しているテーマに必要なファイルがない場合は wp-content/thmems/default 内のファイルを使用するためです。
今回はヘッダファイルとフッタファイルを作成します。
ヘッダファイル
テーマディレクトリに header.php を作成し下記のような内容にしました。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>> <head profile="http://gmpg.org/xfn/11"> <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" /> <title><?php bloginfo('name'); ?> <?php wp_title(); ?></title> <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats --> <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" /> <link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" /> <link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" /> <?php wp_head(); ?> </head> <body> <div id="page"> <div id="header"> <h1><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1> <div class="description"><?php bloginfo('description'); ?></div> </div>
ゼロから書くのは大変なので default/header.php をコピーして必要最低限のみ残してみました。
フッタファイルの作成
ヘッダ同様に footer.php ファイルを作成し、下記のようにしました。
<div id="footer"> <?php bloginfo('name'); ?> Powered by <a href="http://wordpress.org/">WordPress</a><br /> <a href="<?php bloginfo('rss2_url'); ?>">Entries (RSS)</a> and <a href="<?php bloginfo('comments_rss2_url'); ?>">Comments (RSS)</a>. </div> </div> <?php wp_footer(); ?> </body> </html>
ヘッダとフッタのみのブログができました
CakePHP1.2 バリデーションのルール
2CakePHP1.2 のバリデーションのメモです。
詳しくは cake/libs/validation.php を見ると分かりやすいです。
半角英数字のみ
alphaNumeric
var $validate = array('field' => array('rule' => array('alphaNumeric')));
文字列の長さ
between
var $validate = array('field' => array('rule' => array('between', 6, 8)));
半角で6文字以上8文字以内
文字列が空
blank
var $validate = array('field' => array('rule' => array('blank')));
クレジットカード番号
cc
var $validate = array('field' => array('rule' => array('cc')));
比較
comparison
var $validate = array('field' => array('rule' => array('comparison', '>', 10)));
‘==’, ‘!=’, ‘< =’, など使用できる
正規表現
custom
var $validate = array('field' => array('rule' => array('custom', '/^[0-9]{3}\-[0-9]{4}$/')));
例として NNN-NNNN 形式の郵便番号のバリデーション
日付
date
var $validate = array('field' => array('rule' => array('date', 'ymd')));
‘dmy’, ‘mdy’, ‘ymd’, ‘dMy’, ‘Mdy’, ‘My’, ‘my’ が使用可
小数点の桁数チェック
decimal
var $validate = array('field' => array('rule' => array('decimal', 2)));
var $validate = array('field' => array('rule' => array('decimal', null, '/^[0-9]{2}\.[0-9]{2}$/')));
正規表現を指定してチェックすることも可。
メールアドレス
var $validate = array('field' => array('rule' => array('email')));
=== での比較
equalTo
var $validate = array('field' => array('rule' => array('equalTo', 'hoge')));
型も含めて等しいかチェック
拡張子
extension
var $validate = array('field' => array('rule' => array('extension', array('gif', 'jpg')));
ファイルの拡張子をチェック。許可したい拡張子を配列で指定。デフォルトは array(‘gif’, ‘jpeg’, ‘png’, ‘jpg’)
IPアドレス
ip
var $validate = array('field' => array('rule' => array('ip')));
最小文字数
minLength
var $validate = array('field' => array('rule' => array('minLength', 6)));
最大文字数
maxLength
var $validate = array('field' => array('rule' => array('maxLength', 12)));
数字
numeric
var $validate = array('field' => array('rule' => array('numeric')));
数字の範囲チェック
range
var $validate = array('field' => array('rule' => array('range', 0, 100)));
注意点は指定した数字は含まれない
上の例では 1?99 までが true
var $validate = array('field' => array('rule' => array('range')));
とすると有限数かどうかのチェック
URL
url
var $validate = array('field' => array('rule' => array('url')));
OpenPNE 画像の保存、表示方法
2OpenPNE で写真のアップロード機能を作成していて調べたことをまとめておきます。
画像を保存するテーブル c_image
OpenPNE では画像をDB に保存しています。保存するテーブル名は c_image です。
このテーブルにはプロフィール写真や日記の写真、スキンの画像などが保存されるようです。
CREATE TABLE c_image ( c_image_id int(11) NOT NULL auto_increment, filename text NOT NULL, bin longblob NOT NULL, r_datetime datetime NOT NULL default '0000-00-00 00:00:00', `type` text, PRIMARY KEY (c_image_id), KEY filename (filename(100)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- filename
- 画像のファイル名、任意につけていいみたいですが、プロフィール写真だと
m_2_1188204858.jpg
という感じです。
最初の 「m 」はたぶんプロフィール写真を表す文字、
次の「2」はプロフィール写真のNo(2番目にアップした写真)
次の10桁の数字は多分 time() 関数で取得したアップロードした時間 - bin
- base64_encode した画像ファイルのバイナリデータ
- type
- 画像のタイプ( jpg | gif | png )
- r_datetime
- 登録日時
表示方法
c_image テーブルに格納した画像を表示するHTML
<img src="/img.php?filename=m_2_1188204858.jpg&w=180&h=180&m=pc">
Smarty のタグで書くと
<img src="({t_img_url filename=$pet.image1 w=180 h=180})">
filename に c_image.filename を指定して、
w, h に幅と高さの最大値を指定する。
幅と高さは最大値を超えると自動的にリサイズする。
その他
c_image に画像を保存しておくと管理画面からアップロードされた写真をすべて管理することができるので、SNS を運営する上で便利だと思います。
PHP で大きいJPEGやPNGファイルをPHPで扱うときのメモリエラー回避方法
0GD でメモリエラー
に書かれているように GD で JPEG や PNG の大きな画像を扱うときに
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 11648 bytes) in ...
というようなエラーが出てしまいます。
上のエラーがは私が EOS5D で撮影した 2912×4368とかなり大きな画像です。
大きさで制限するのも一つの方法ですが、どうしても大きな画像を取り込みリサイズしなければいけないときなどのために以下の方法もあります。
PHP: imagecreatefromjpeg – Manual
PHP に割り当てられているメモリの範囲で必要なメモリを計算して
ini_set('memory_limit', 'xxM')
と設定しれくれます。
function setMemoryForImage( $filename ){ $imageInfo = getimagesize($filename); $MB = 1048576; // number of bytes in 1M $K64 = 65536; // number of bytes in 64K $TWEAKFACTOR = 1.5; // Or whatever works for you $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + $K64 ) * $TWEAKFACTOR ); //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also //Default memory limit is 8MB so well stick with that. //To find out what yours is, view your php.ini file. $memoryLimit = 8 * $MB; if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > $memoryLimit) { $newLimit = $memoryLimitMB + ceil( ( memory_get_usage() + $memoryNeeded - $memoryLimit ) / $MB ); ini_set( 'memory_limit', $newLimit . 'M' ); return true; }else return false; } }