AjaxでURLにGET情報をつけて渡す時に日本語をエンコードし忘れていたのでメモ。
エンコードし忘れてGETを送っていてFirefoxでは自動的にエンコードしてくれていたので気付かなかったのですが、IEではサーバー側で文字化けしていました。
WEBシステム開発等で気付いたことなどをまとめていきます。
AjaxでURLにGET情報をつけて渡す時に日本語をエンコードし忘れていたのでメモ。
エンコードし忘れてGETを送っていてFirefoxでは自動的にエンコードしてくれていたので気付かなかったのですが、IEではサーバー側で文字化けしていました。
お客さんに6月29日にしたメールの添付忘れに今日(7月6日)に気付きました。
一週間も放置してしまって、ちょっと凹んでますが・・・
ん?あれ?Gmailで本文内に「添付」って書き込んで添付わすれたら
アラートがでたはずなのに!!
と、思って試してみたら、アラートがでなーい。
なんの設定したのかもあやふやだったので、ググってみると
あーそだそだ!
設定→Labsの設定だ、設定がなぜか外れてしまったのか・・・
と、Labs内を探すも添付忘れチェッカーがない。。。
そりゃ
「Gmail Labs は実験的な機能をテストする場であり、
ここにある機能は随時変更、中断、提供中止されることがあります。
」
って書いてるけど。。。。
ヒューマンエラー防止や予防の機能がいきなりなくなるとは、ちょっと困りました。。
弊社で帳票をPDFで出力する際には、大抵書式となるテンプレートファイルを先に読み込んで、必要な箇所にデータを出力して最終的に出来上がりのPDFファイルを生成という手順を踏みます。
ですので、Excelファイルを作る際にもテンプレートの読み込みが必要だろうということで、これもサンプルを作りましたのでここに載せておきます。
データを出力する部分とファイルに書き出す部分は同じですので、テンプレートファイルを読み込む部分を解説します。
Excel2007形式とExcel95形式、両方まとめて載せておきます。
まず、Excel95形式のテンプレート読み込みです。
$filename = "fruits.xls"; $uploadDir = realpath( TMP ); $uploadDir .= DS . 'excels' . DS; $load_path = $uploadDir . $filename; $objReader = new PHPExcel_Reader_Excel5(); $objPHPExcel = $objReader->load( $load_path );
次は、Excel2007形式のテンプレート読み込みです。
$filename = "fruits.xlsx"; $uploadDir = realpath( TMP ); $uploadDir .= DS . 'excels' . DS; $load_path = $uploadDir . $filename; $objPHPExcel = PHPExcel_IOFactory::load( $load_path );
$load_path にはテンプレートファイルのフルパスを与えてください。
ここで帰ってきた $objPHPExcel で、データ書き込みやファイル生成を行ってください。
PHPExcelをCakePHPで使ってみるの記事ではExcel95形式(拡張子が.xls)のExcelファイルの出力について書きましたが、Excel2007形式(拡張子が.xlsx)の場合はどうなるのかが今回のお話です。
Excel2007形式のファイルを出力する為のポイントはふたつです。
ひとつ目は、出力ファイル名の拡張子を必ず「.xlsx」にしておくことです。
ふたつ目は、出力する部分のコードを少し変えることです。
具体的には、次のコードになります。
$objWriter = PHPExcel_IOFactory::createWriter( $objPHPExcel, 'Excel2007' );
システムを作っていると、お客様からよく「このデータをExcelで使いたい」ということをお聞きします。
大抵の場合CSV形式のファイルを出力して、それをExcelで読み込んで好きに加工して戴くのですが、やはりExcelの形式ではないので使い辛いと言われることがあります。
そこで、Excelファイルを出力するようにしようということになり、PHPExcelというライブラリをCakePHPに組み込んで使うことにしました。
同僚の誘いがあり興味がある内容なので、
GIGAZINE10
周年記念講演「なぜあなたのサイトに人が来ないのか?」
に行ってきました。
存在は知ってましたが、特にお気に入りに入っ
てるというわけではなかったので、
どんな切り口で「webでの集客をしているのか」、またどんな話をするのかちょっと楽しみでした。
ま
ず最初にメモはするな!と
メモにとらずに頭に残るものこそ自分にとって大事な情報である!
みたいなことを、マクドナルドの社長?の引用文
と共に紹介してました。
内容は大きく5つ
1、更新しまくれ
内容はいたって当たり前のことでした。
アクセス数、実
例共に更新することによって、どう変化があったか紹介されていました。
「更新できないサイト内容であるなら、そこから見直すべき」
2、
デザインを考える
ユーザビリティを考え、何をどこに配置することがベストなのかを常に考える。
レイアウト変更でアクセス30倍とか、ヒー
トマップのF字理論
リピーターはF字にならないのでまた考える。
3、色づかい
文字中心の内容であり、モニター越しに見る
ユーザーのことを考え
見やすい色づかいがどこまで出来ているか。
bing(microsoftの検索エンジン)が文字色を変えただけで収
支がUPしたことを紹介
4、最重要!!サーバ強化
有名サイトやニュースサイトから紹介され、一時的にアクセスが増えた時を逃さな
い。
その時をいつか期待しつつ、オーバースペック気味でもサーバは強化しておけとのこと。
サーバ強化による表示スピードもとても
大事であることをgoogle,amazonを実例に紹介。
5、仕事≠遊び
24時間集客のことを考え、遊んでいる暇はない!
人
の倍しないと、人と同じ結果しかでない。
それができるかどうかが分かれ目である。
みたいな話でした。
内容はこんな感じ
だったはずです。
アクセス解析を見せてくださったり、実例を元に話してたのですんなり納得できる内容でした。
セキュリティの調査で3つ脆弱性検知ツールを入れてみたのですが、結果的には次のようになりました。
-skipfish
Linuxでしか動作しなく導入に手間が掛かる。
導入後、実行してみるが時間が掛かりすぎる。CakePHPを抱え込んで検知したら半日経っても終らない。
素のPHPで小さいシステムを検査してみるが脆弱性が発見できない。
-IPAが出しているiLogScanner
導入作業自体が無くIPAが用意しているサイトにサーバーのアクセスログファイルをUPして調査する。
サーバーのログを上げる作業なので、このプロジェクトの脆弱性を見たいという時は、ログファイルの吐き出し方を切り替えるという作業が必要になってくる。
脆弱性を発見したと検知されるのに、何処のファイルかという情報が無く脆弱性の特定が出来ない。
-Paros
windowsにインストールできて、そのパソコンからブラウザのプロキシを強引に変えて見たいシステムのURLを叩いて操作したログを後で検査するという仕組みです。
素のPHPで書いた小さいシステムを検査すると、何処のファイルに脆弱性があるときちんと出してくれます。
但しCakePHPなどのフレームワークを検査してみると、MVCが分かれているせいでXSSやSQLインジェクションを上手く検地してくれない。
ということでParosがまだ一番使えるかなという感じなのですが、当初の目的のCakePHPを使ってるサイトの脆弱性を検査するという部分が出来ないので、引き続きツールを探して行きたいと思います。
何か良い脆弱性検地ツールは無いんですかね・・・
CakePHPのsessionってsessionデータに作成時間を保存しておき、読み出す時にcore.phpで設定した時間が経過していないかチェックしているんですね。
サーバー設定の方はさわりに行ってないみたいです。
core.phpの
Configure::write('Session.timeout', '120'); Configure::write('Security.level', 'medium');
で3時間以上あってもサーバーの
の方が短ければガーベジコレクションでsessionファイルが消えるので予想より早くログアウトしたりします。
なので
bootstrap.phpに
ini_set("session.cookie_lifetime", 100 * Configure::read('Session.timeout')); ini_set("session.gc_maxlifetime", 100 * Configure::read('Session.timeout'));
coreの値使ってサーバー設定をcore触るだけで設定できるようにしました。
(100掛けてるのはmediumの係数の100です。session.php見ましたが定数にはなっていない感じでした。)
バージョンは1.2.6です。
————–
\n
\n
テキストエリア内容
————–
のデータがあった場合
$form->input('Model.field', array('type' => 'textarea'));
で表示した場合、最初の改行コードがない状態でフォームに表示されます。
(下記のように2つある改行が1つになっています)
モデルのquery関数を使ってループをまわしながら最大noをとってくる処理でハマりました・・・
query関数って$sql同じだった場合勝手にキャッシュを使って前回と同じ値を返すんですね。
通常はこれを回避する為に
$this->query($sql, false);
とすることで毎回最新データを取ってきてくれます。
デフォルトでキャッシュが邪魔だったので、app_model.phpで
function query() { $params = func_get_args(); if (empty($params[1])) { $params[1] = false; } else { if (is_array($params[1]) && empty($params[2])) { $params[2] = false; } } $db =& ConnectionManager::getDataSource($this->useDbConfig); return call_user_func_array(array(&$db, 'query'), $params); }
query関数をオーバーライドしました。
バージョンは1.2.6です。