12月 25
PostgreSQL ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨ãƒªã‚¹ãƒˆã‚¢æ–¹æ³•ã®ãƒ¡ãƒ¢
postgres ユーザã«ãªã‚‹
$ su - postgres
パスワードをè¨å®šã—ã¦ã„れã°èžã‹ã‚Œã‚‹ã®ã§å…¥åŠ›ã™ã‚‹ã€‚(当然ã§ã™ãŒï¼‰
データã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—
$ pg_dump DATABASE_NAME > BACKUP_FILENAME
データã®ãƒªã‚¹ãƒˆã‚¢
$ psql -e DATABASE_NAME < BACKUP_FILENAME
データベースã®ä½œæˆ
$ createdb DATABASE_NAME
データベースã®å‰Šé™¤
$ dropdb DATABASE_NAME
12月 25
普段㯠MySQL ã°ã‹ã‚Šä½¿ç”¨ã—ã¦ã„ã‚‹ã®ã§ã™ãŒã€PostgreSQL を使用ã™ã‚‹å¿…è¦ãŒã‚りã€phpPgAdmin を使ã†ã“ã¨ã«ã—ãŸã€‚
開発用ã®ã‚µãƒ¼ãƒã«ã¯ phpPgAdmin ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ãŒã€ãƒ–ラウザã§é–²è¦§ã§ãるよã†ã«ã¯ã¾ã ã—ã¦ã„ãªã‹ã£ãŸã€‚
Open Tech Press | phpPgAdmin:Web開発者å‘ã‘ã®Postgresクライアントツール ã‚’å‚考㫠/usr/share/phpPgAdmin ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ phpPgAdmin をブラウザã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã«ã—ãŸã€‚
/etc/http/conf/httpd.conf ã«ä¸‹è¨˜ã‚’追åŠ
Alias /phppgadmin /usr/share/phppgadmin/
<DirectoryMatch /usr/share/phppgadmin/>
Options +FollowSymLinks
AllowOverride None
order deny,allow
deny from all
allow from localhost
</DirectoryMatch>
ã“れã§ãƒ–ラウザã‹ã‚‰ http://example.com/phpPgAdmin/ ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ãªã£ãŸã€‚
ã—ã‹ã—ã€PostgreSQL ã®ãƒ¦ãƒ¼ã‚¶ã§ãƒã‚°ã‚¤ãƒ³ã—よã†ã¨ã™ã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã«ãªã‚‹ã€‚
ã“れ㯠シン石丸ã®é›»è„³èŠ¸äº‹ãƒ‹ãƒƒã‚: debian 3.1ã¸ã®phppgadminã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å¾Œã®è¨å®š ã‚’å‚考ã«ã—ã¦è§£æ±ºã€‚
/etc/postgresql/pg_hba.conf ã«ä¸‹è¨˜ã‚’追åŠ
host all all 127.0.0.1 255.255.255.255 trust
ã“れã§ç„¡äº‹ phpPgAdmin ã«ãƒã‚°ã‚¤ãƒ³ã§ãã¾ã—ãŸã€‚
12月 07
CakePHP ã® Security コンãƒãƒ¼ãƒãƒ³ãƒˆ ã®å‹•作を調ã¹ãŸã®ã§ã¾ã¨ã‚ã¦ãŠãã¾ã™ã€‚
ã“ã® Security コンãƒãƒ¼ãƒãƒ³ãƒˆã‚’ã†ã¾ã使用ã™ã‚Œã°ã‚¯ãƒã‚¹ã‚µã‚¤ãƒˆãƒªã‚¯ã‚¨ã‚¹ãƒˆãƒ•ォージェリ(CSRF) を防ãã“ã¨ãŒã§ãã‚‹ã§ã—ょã†ã€‚
トークンã®ä½¿ç”¨
フォームã«ãƒ¯ãƒ³ã‚¿ã‚¤ãƒ トークンを実装ã™ã‚‹æ–¹æ³•ã§ã™ã€‚
コントãƒãƒ¼ãƒ©ã® beforeFilter メソッドã§ãƒˆãƒ¼ã‚¯ãƒ³ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’指定
function beforeFilter() {
$this->Security->requireAuth('login');
}
ビューã®ãƒ•ォーム内ã«ãƒˆãƒ¼ã‚¯ãƒ³ã‚’è¨å®š
<?php echo $html->formTag(); ?>
トークン㌠hidden 属性ã§ç”Ÿæˆã•れる
トークンãŒä¸€è‡´ã—ãªã„å ´åˆ
requireAuth ã§æŒ‡å®šã—ãŸã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã« POST ã§ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚ã‚‹ã¨ã‚»ã‚·ãƒ§ãƒ³ã«ä¿å˜ã—ãŸãƒˆãƒ¼ã‚¯ãƒ³ã¨ãƒ•ォームã‹ã‚‰é€ã‚‰ã‚Œã¦ããŸãƒˆãƒ¼ã‚¯ãƒ³ãŒä¸€è‡´ã™ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ã¾ãŸãã®ã»ã‹ã«ãƒˆãƒ¼ã‚¯ãƒ³ã®æœ‰åŠ¹æœŸé–“ã‚‚ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚有効期間㯠CAKE_SECURITY ã®è¨å®šã«ã‚ˆã‚Šé•ã„ã¾ã™ã€‚
| CAKE_SECURITY |
有効期間 |
| high |
10分 |
| medium |
100分 |
| low |
300分 |
トークンãŒä¸€è‡´ã—ãªã„㨠SecurityComponent ã® blackHole メソッドãŒå®Ÿè¡Œã•れã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã§ã¯
header('HTTP/1.0 404 Not Found');
を出力ã—㦠exit ã—ã¾ã™ã€‚(画é¢ã¯ç©ºç™½ï¼‰
ä»»æ„ã®å‡¦ç†ã‚’実行ã—ãŸã„å ´åˆã¯ blackHoleCallback ã§ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’指定ã—ã¾ã™ã€‚
è¨å®šã§ãã‚‹ã®ã¯åŒã˜ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©å†…ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ã¿ã«ãªã‚Šã¾ã™ã€‚
function beforeFilter() {
$this->Security->blackHoleCallback = "securityError";
$this->Security->requireAuth('login');
}
function securityError() {
die("security error!");
}
トークンãƒã‚§ãƒƒã‚¯ã‚’ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’複数指定ã™ã‚‹ã¨ãã¯ã‚«ãƒ³ãƒžã§ã¤ãªã’ã‚‹
$this->requireAuth('login', 'delete');
特定ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‹ã‚‰ã®ãƒã‚¹ãƒˆã®ã¿è¨±å¯ã™ã‚‹
$this->Security->allowedControllers = array("users");
ã“れを指定ã™ã‚‹ã¨ãŸã¨ãˆãƒˆãƒ¼ã‚¯ãƒ³ãŒä¸€è‡´ã—ã¦ã‚‚許å¯ã®ãªã„コントãƒãƒ¼ãƒ©ã‹ã‚‰ã®ãƒã‚¹ãƒˆã®å ´åˆã¯ blackHole メソッドを実行ã—ã¾ã™ã€‚
特定ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ã®ãƒã‚¹ãƒˆã®ã¿è¨±å¯ã™ã‚‹
$this->Security->allowedActions = array("action");
ã“れを指定ã™ã‚‹ã¨ãƒˆãƒ¼ã‚¯ãƒ³ãŒä¸€è‡´ã—ã¦ã‚‚許å¯ã®ãªã„アクションã‹ã‚‰ã®ãƒã‚¹ãƒˆã®å ´åˆã¯ blackHole メソッドを実行ã—ã¾ã™ã€‚
ãƒã‚¹ãƒˆã®ã¿å—ã‘付ã‘るよã†ã«ã™ã‚‹
$this->requirePost('login');
ã“れã¯ãƒˆãƒ¼ã‚¯ãƒ³ã¨ã¯é•ã„ã€POST ã®ã¿è¨±å¯ã—㦠GET ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ä¸å¯ã«ã—ã¾ã™ã€‚
/users/login/ ã®ã‚ˆã†ãª URL ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚‚ GET ãªã®ã§ä¸å¯ã«ãªã‚Šã¾ã™ã€‚
POST ã®å‡¦ç†ã ã‘を実行ã—ãŸã„よã†ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«ä½¿ç”¨ã—ã¾ã™ã€‚
12月 04
CakePHP ã® Text ヘルパー㫠truncate ã¨ã„ã†æŒ‡å®šã•ã‚ŒãŸæ–‡å—列を任æ„ã®é•·ã•ã«çœç•¥ã™ã‚‹ãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚りã¾ã™ã€‚
ã—ã‹ã—ã€ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã¯å…¨è§’æ–‡å—を考慮ã—ã¦ã„ãªã„ãŸã‚全角文å—ã«ç”¨ã„ã‚‹ã¨æ–‡å—化ã‘ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
ãã“ã§ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’全角文å—ã«å¯¾å¿œã•ã›ã¦ã¿ã¾ã—ãŸã€‚
function truncate($text, $length, $ending = '…', $exact = true) {
if (strlen($text) < = $length) {
return $text;
} else {
mb_internal_encoding("UTF-8");
if (mb_strlen($text) > $length) {
$length -= mb_strlen($ending);
if (!$exact) {
$text = preg_replace('/\s+?(\S+)?$/', '', mb_substr($text, 0, $length+1));
}
return mb_substr($text, 0, $length).$ending;
} else {
return $text;
}
}
}
直接 Text ヘルパーを修æ£ã™ã‚‹ã¨ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚¢ãƒƒãƒ—ãªã©ã®ã¨ãã«å›°ã‚‹ã®ã§ã€
cake/libs/view/helpers/text.php ã‚’ app/views/helpers/mb_text.php ã«ã‚³ãƒ”ーã—クラスåã‚’
class MbTextHelper extends Helper{
ã¨ã—ã¦ã€truncate メソッドを上記ã®ã‚ˆã†ã«ä¿®æ£ã—ã¾ã—ãŸã€‚
使用ã™ã‚‹ã¨ãã¯ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©å†…ã§ã€
var $helpers = array("MbText");
view ã§
echo $mbText->truncate("ã‚ã„ã†ãˆãŠã‹ããã‘ã“", 5, "…", true);
ã¨ã™ã‚‹ã¨
ã‚ã„ã†ãˆâ€¦
ã¨è¡¨ç¤ºã•れã¾ã™ã€‚
12月 04
CakePHP 㮠コントãƒãƒ¼ãƒ©ã« postConditions ã¨ã„ã†ã¡ã‚‡ã£ã¨ã ã‘便利ãªãƒ¡ã‚½ãƒƒãƒ‰ãŒã‚りã¾ã—ãŸã€‚
cake/libs/controllers.php
function postConditions($data) {
if (!is_array($data) || empty($data)) {
return null;
}
$conditions = array();
foreach($data as $model => $fields) {
foreach($fields as $field => $value) {
$conditions[$model . '.' . $field] = $value;
}
}
return $conditions;
}
例ãˆã°æ¤œç´¢ã‚’ã™ã‚‹ãƒ•ォームãªã©ã§ User.name ã§æ¤œç´¢ã™ã‚‹ã‚ˆã†ãªå ´åˆ
view ã§
input('User/name');
ã¨æŒ‡å®šã™ã‚‹ã¨$this->data ã¯
Array
(
[User] => Array
(
[name] => 山田
)
)
ã“ã® $this->data ã‚’ postConditions ã«æ¸¡ã™ã¨
$data = $this->postConditions($this->data);
$data ã¯
Array
(
[User.name] => 山田
)
ã¨ãªã‚Šã€ã“ã®ã¾ã¾ find ã‚„ findAll ã«æ¸¡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚
$this->User->find($data);
å‚考:CakePHP マニュアル
7.2. コントãƒãƒ¼ãƒ©ã®é–¢æ•°
Recent Comments