Posts tagged ec
12月に読んだ本
0先月、宣言(11月に読んだ本 )したように少し小説を読みました。
2冊のみですが、どちらも文庫本で700ページ前後なので読み応えはありました。「幻夜」は「白夜行 」の続編のようで白夜行に迫る面白さで読むのが止まりませんでした。
「最悪」は奥田英郎の最初の頃の作品なので、イラブ先生シリーズやサウスバウンドなどにはかないませんが、引き込まれる作品でした。
幻夜
最悪 (講談社文庫)
あなたが年収1000万円稼げない理由。―給料氷河期を勝ち残るキャリア・デザイン (幻冬舎新書 た 3-1)
【超】WORK HACKS!
起業家2.0―次世代ベンチャー9組の物語
効率が10倍アップする新・知的生産術―自分をグーグル化する方法

勝間さんの本はどれもはずれがなくていいですね。読んでいるだけでやる気が出てきます。(それだけで実践しないと意味ないですが)巻末のお勧め本がかなりいいです。これからの読書の参考にしていきます。早速、今月は「非常識な成功法則―お金と自由をもたらす8つの習慣」をリストを参考に読んでみました。
読みならがメモしたことをいくつかリストアップしておきます。
- 情報こそが現代の通貨である
- 資本主義の本質は賢くない人から賢い人へお金が移動する仕組み
- 情報の発信者になれば情報がラクに収集できるようになる
- 自分が得意なことに集中する
- Not To Do List を作成する
- まずは見返りを求めずに情報を発信し続ける
金融商品にだまされるな!
金持ちの床屋さん
非常識な成功法則―お金と自由をもたらす8つの習慣
レバレッジ人脈術
チーズはどこへ消えた?
ザ・マインドマップ
WEB+DB PRESS Vol.42
人を出し抜く速読術―要領よく生きてるヤツは知っている (凄ビジ・シリーズ 3)
キラー・リーディング 「仕事脳」が劇的に回り出す最強の読書法 (JBシリーズ)
.htaccess で error_reporting を設定するときの注意点
5.htaccess で PHP が出力するエラー表示を制御するには E_ALL などの定数は使えないので、ビット値で指定する必要があります。
E_ALL & ~E_NOTICE を設定する場合
php.ini
error_reporting = E_ALL & ~E_NOTICE
php コード内
error_reporting(E_ALL ^ E_NOTICE);
.htaccess
php_value error_reporting 6135
error_reporting に設定する値は PHP: error_reporting – Manual を参照するといいでしょう。
| 値 | 定数 |
|---|---|
| 1 | E_ERROR |
| 2 | E_WARNING |
| 4 | E_PARSE |
| 8 | E_NOTICE |
| 16 | E_CORE_ERROR |
| 32 | E_CORE_WARNING |
| 64 | E_COMPILE_ERROR |
| 128 | E_COMPILE_WARNING |
| 256 | E_USER_ERROR |
| 512 | E_USER_WARNING |
| 1024 | E_USER_NOTICE |
| 6143 | E_ALL |
| 2048 | E_STRICT |
| 4096 | E_RECOVERABLE_ERROR |
ちなみに E_ALL & ~E_NOTICE の値が 6135 になる理由は E_ALL の値が 6143、E_NOTICE の値が 8 なので 6143-8=6135 になります。(または E_NOTICE と E_STRICT 以外の値を足した数が 6135 になります。
私は開発中は E_NOTICE も表示するようにしていますが、結構表示させない人が多いようで人のコードを修正するときなど Notice エラーが出て困ることがあります。E_NOTICE を表示するようにしておくと未定義の変数などバグの元になりやすいものを教えてくれるのでお勧めです。
また、開発終了して本番運用するときにはブラウザにエラーを出力しないように
error_reporting(0);
を設定しておくことを忘れずに!
その際も PHP のエラーはエラーログに記録されるようにしておかないのも忘れずに。
CakePHP JQuery ヘルパー
3JQuery helper for CakePHP ( PQuery port ) at NGCoders
CakePHP から JQuery を簡単に使うことができます。
正確には PQuery ヘルパーかもしれません。PQuery は JQuery を PHP から簡単に使用するライブラリで PQuery ヘルパーと同じ開発者が開発しています。
参考:PQuery – PHP and JQuery at NGCoders
インストール
JQuery helper for CakePHP ( PQuery port ) at NGCoders から JQuery ヘルパーをダウンロードし、解凍した pquery.php を /app/views/helpers にコピーします。
そのほかに jquery.js ファイルも必要になります。こちらもダウンロードして /app/webroot/js にコピーします。
コントローラ
Pquery ヘルパーと Javascritp ヘルパーを使用します
var $helpers = array('Pquery', 'Javascript');
ビュー
jquery.js の読み込み
<?php echo $javascript->link('jquery.js'); ?>
使用例
トグルボタン
<div id='msg'>Message...</div>
<?php echo $pquery->link_to_function('toggle', $pquery->toggle('#msg'));?>
フォームで送信された内容により HTML を更新
入力したテキストを /controller/action/ に GET で送信し、id=idtoupdate に受け取った HTML を表示する
<?php echo $pquery->form_remote_tag(array('url'=>'/controller/action/','update'=>'#idtoupdate'));?>
<input type='text' name='field' />
<input type='submit' />
<div id='idtoupdate'></div>
pquery.php を見ると色々なメソッドがあります。使い方はソースを見ればすぐに分かると思います。
Smarty で正規表現を if 文で使用する
2Smarty には正規表現を使用して文字列を置換する regex_replace があります。
これを上手に使用して if 文で正規表現を用いて条件分岐させます。
if (preg_match('/php/i', 'PHP is the web scripting language of choice.')) {
echo 'A match was found.';
} else {
echo 'A match was not found.';
}
PHP で上記のような処理を Smarty で書くと下記のようになります。
{assign var='string' value='PHP is the web scripting language of choice.'}
{if $string|regex_replace:'/.*php.*/i':'php' eq 'php'}
A match was found.
{else}
A match was not found.
{/if}
ポイントは regex_replace を用いて、正規表現のパターンに該当する場合は元の文字列を何かしらの文字列(上の例でいうと’php’)に置換してしまい、それを eq で置換されているか判定するということです。
これを実際に使用したのは OpenPNE のテンプレートです。
OpenPNE を使用していて、特定のカテゴリのときのみ読み込む CSS を変えたいときがありました。
OpnePNE のイベント関連の URL は http://expamle.com/?m=pc&a=page_c_event_*** という感じになります。
全部で14種類ありますので、これを普通に if 文で書いていると大変なことになりますし、追加などがあったときのことを考えるとよくありません。
そこで Smarty の if 文に正規表現を使用して下記のようにすることにより1つの条件で page_c_event_*** の URL を条件分岐させました。
Smarty テンプレート
{if $smarty.get.a|regex_replace:"/page_c_event.*_/":"event" eq "event"}
{** イベントです**}
{else}
{** イベント以外です **}
{/if}
HTTP_Request を使用してファイルをアップロードする方法
1PEAR の HTTP_Request を使用してファイルをアップロードする方法です。
<form action='POST_URL' method='post' enctype='multipart/form-data'> <input type='text' name='title'> <textarea name='body'></textarea> <input type='file' name='upload_file'> <input type='submit'> </form>
上記のような HTML でファイルをアップロードする場合と同じような処理をするには、下記のように HTTP_Request を使用します。
// POST パラメータ
$post_data = array(
'title' => $title,
'body' => $body,
);
// アップロードパラメータ
$upload_file = array(
'name' => 'file',
'path' => '/path/to/file',
);
// アップロード
$rs = http_send(POST_URL, $post_data, $upload_file);
function http_send($url, $params, $upload_file=null) {
$req = new HTTP_Request();
$req->setMethod(HTTP_REQUEST_METHOD_POST);
foreach ($params as $key => $val) {
$req->addPostData($key, $val);
}
$req->setURL($url);
if ($upload_file) {
$res = $req->addFile($upload_file["name"], $upload_file["path"]);
if (PEAR::isError($res)) {
echo $res->getMessage();
exit;
}
}
if (!PEAR::isError($req->sendRequest())) {
return $req->getResponseBody();
} else {
return false;
}
}
phpPgAdmin でログインできない
0普段は 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 にログインできました。
CakePHP Security コンポーネントのまとめ
1CakePHP の 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 の処理だけを実行したいようなアクションに使用します。
CakePHP Textヘルパーの truncate を全角文字に対応させてみた
5CakePHP の 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);
とすると
あいうえ…
と表示されます。
11月に読んだ本
2最近は仕事関係の本や自己啓発関係の本が多い。特に今年は小説を読んでないので、今月は少し小説を読もうと思っています。




















