<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>子だぬきの技術習得ノート</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/" />
    <link rel="self" type="application/atom+xml" href="http://www.okushin.co.jp/kodanuki_note/atom.xml" />
    <id>tag:www.okushin.co.jp,2008-05-22:/kodanuki_note//5</id>
    <updated>2010-07-09T01:38:19Z</updated>
    <subtitle>WEBシステム開発等で気付いたことなどをまとめていきます。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>PDFで文字を埋め込まない時は半角￥がバックスラッシュに変わる</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/07/pdf.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.92</id>

    <published>2010-07-09T01:17:14Z</published>
    <updated>2010-07-09T01:38:19Z</updated>

    <summary>この前TCPDFというPHPからPDFを出力するライブラリではまったのでメモ。 ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[この前TCPDFというPHPからPDFを出力するライブラリではまったのでメモ。<br />
<a href="http://www.monzen.org/Refdoc/tcpdf/">TCPDFとはこちら</a><br />
こちらのサイトを参考にしてファイルのサイズの関係でフォントを埋め込まないようにして
PDFを出力していたんですが、「半角(￥)がバックスラッシュ(\)」になって出力されてしまいました。<br />
何で・・・？]]>
        <![CDATA[フォントを埋め込んだ時はちゃんと半角￥マークで出力されるのでおかしいなーと思っていたらPDF自体の仕様ようです。<br />
<a href="http://kb2.adobe.com/jp/cps/225/225164.html">半角円マークが含まれていると PDF にフォントが埋め込まれてしまう</a><br />
ここにあるように<br />
--------------------------------------------------------<br />
<p>半角円マーク（?）は PDF ファイル上で文字コード「0x003e」によってコード化されます。これを Acrobat 製品で表示すると、この文字コードは U+005C の Unicode 文字に変換されます。もし PDF ファイルにフォントが埋め込まれていない場合、U+005C のコードに該当する Unicode 文字がそのまま表示され、結果として半角バックスラッシュで表示されてしまいます。</p>

<p>これを防ぐため、Acrobat Distiller は半角円マーク（?）はこの文字コードが含まれる場合、強制的にフォントを埋め込みます。</p>

<p>この現象は半角円マークに日本語 TrueType フォント（MS 明朝など）を使用した際に発生します。欧文フォントを使用した場合には発生しません。</p>
--------------------------------------------------------<br />

らしいです。<br />
う?ん。TCPDFのフォントサブセット（使っている文字だけ埋め込む）は使い物にならないし（処理が重過ぎる）、半角￥マークを画像にするか？（めんどくさい・・・）、結局、全角￥マークでお客さんに我慢してもらいました。（1ファイル3MBは重いって言われたので・・・）]]>
    </content>
</entry>

<entry>
    <title>URLに日本語を渡す時のメモ (encodeURI)</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/07/url.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.91</id>

    <published>2010-07-08T23:50:24Z</published>
    <updated>2010-07-09T01:15:54Z</updated>

    <summary>AjaxでURLにGET情報をつけて渡す時に日本語をエンコードし忘れていたのでメ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[AjaxでURLにGET情報をつけて渡す時に日本語をエンコードし忘れていたのでメモ。<br />

<pre class="javascript" name="code">
<script type="text/javascript"> 
// 日本語をエンコードしてURLに文字列連結
name = encodeURI('ここにGETに渡す日本語');
url = 'http://www.example.com/search?name=' + name;

// 後はエンコードされたURLを使って任意の処理を書く
new Ajax.Updater(
  'id_name',
  url ,
  {asynchronous:true, evalScripts:true, parameters:Form.Element.serialize('form_name'), requestHeaders:['X-Update', 'id_name']}
);
</script> 
</pre>

エンコードし忘れてGETを送っていてFirefoxでは自動的にエンコードしてくれていたので気付かなかったのですが、IEではサーバー側で文字化けしていました。]]>
        
    </content>
</entry>

<entry>
    <title>Gmail 添付忘れチェッカーなくなってますね。。。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/07/gmail.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.90</id>

    <published>2010-07-06T01:24:35Z</published>
    <updated>2010-07-08T23:49:03Z</updated>

    <summary>お客さんに6月29日にしたメールの添付忘れに今日（7月6日）に気付きました。一週...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[お客さんに6月29日にしたメールの添付忘れに今日（7月6日）に気付きました。<br />一週間も放置してしまって、ちょっと凹んでますが・・・<br /><br />ん？あれ？Gmailで本文内に「添付」って書き込んで添付わすれたら<br />アラートがでたはずなのに！！<br /><br />と、思って試してみたら、アラートがでなーい。<br />なんの設定したのかもあやふやだったので、ググってみると<br /><br />あーそだそだ！<br />設定→Labsの設定だ、設定がなぜか外れてしまったのか・・・<br /><br />と、Labs内を探すも添付忘れチェッカーがない。。。<br /><br />そりゃ<br />「Gmail Labs は実験的な機能をテストする場であり、<br />ここにある機能は随時<b>変更</b>、<b>中断</b>、<b>提供中止</b>されることがあります。
」<br />って書いてるけど。。。。<br /><br />ヒューマンエラー防止や予防の機能がいきなりなくなるとは、ちょっと困りました。。<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>PHPExcelをCakePHPで使ってみる（テンプレートの読み込み）</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/06/phpexcelcakephp-1.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.89</id>

    <published>2010-06-15T01:35:13Z</published>
    <updated>2010-06-15T02:22:08Z</updated>

    <summary>　弊社で帳票をPDFで出力する際には、大抵書式となるテンプレートファイルを先に読...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[　弊社で帳票をPDFで出力する際には、大抵書式となるテンプレートファイルを先に読み込んで、必要な箇所にデータを出力して最終的に出来上がりのPDFファイルを生成という手順を踏みます。<br />
　ですので、Excelファイルを作る際にもテンプレートの読み込みが必要だろうということで、これもサンプルを作りましたのでここに載せておきます。<br />
<br />
　データを出力する部分とファイルに書き出す部分は同じですので、テンプレートファイルを読み込む部分を解説します。<br />
　Excel2007形式とExcel95形式、両方まとめて載せておきます。<br />
<br />
　まず、Excel95形式のテンプレート読み込みです。<br />
<pre class="php" name="code">

	$filename = "fruits.xls";
	$uploadDir = realpath( TMP );
	$uploadDir .= DS . 'excels' . DS;
	$load_path = $uploadDir . $filename;

	$objReader = new PHPExcel_Reader_Excel5();
	$objPHPExcel = $objReader->load( $load_path );

</pre>
　次は、Excel2007形式のテンプレート読み込みです。<br />
<pre class="php" name="code">

	$filename = "fruits.xlsx";
	$uploadDir = realpath( TMP );
	$uploadDir .= DS . 'excels' . DS;
	$load_path = $uploadDir . $filename;

	$objPHPExcel = PHPExcel_IOFactory::load( $load_path );

</pre>
　$load_path　にはテンプレートファイルのフルパスを与えてください。<br />
<br />
　ここで帰ってきた $objPHPExcel で、データ書き込みやファイル生成を行ってください。<br />
<br />

]]>
        
    </content>
</entry>

<entry>
    <title>PHPExcelをCakePHPで使ってみる(Excel2007形式)</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/06/phpexcelcakephpexcel2007.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.88</id>

    <published>2010-06-15T01:19:10Z</published>
    <updated>2010-06-15T01:34:59Z</updated>

    <summary> 　PHPExcelをCakePHPで使ってみるの記事ではExcel95形式（拡...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[
　<a href="../../../kodanuki_note/2010/06/phpexcelcakephp.html">PHPExcelをCakePHPで使ってみる</a>の記事ではExcel95形式（拡張子が.xls）のExcelファイルの出力について書きましたが、Excel2007形式（拡張子が.xlsx）の場合はどうなるのかが今回のお話です。
<br />

　Excel2007形式のファイルを出力する為のポイントはふたつです。<br />
　ひとつ目は、出力ファイル名の拡張子を必ず「.xlsx」にしておくことです。<br />
　ふたつ目は、出力する部分のコードを少し変えることです。<br />
　具体的には、次のコードになります。<br />
<br />
<pre class="php" name="code">
$objWriter = PHPExcel_IOFactory::createWriter( $objPHPExcel, 'Excel2007' );
</pre>
<br />

]]>
        
    </content>
</entry>

<entry>
    <title>PHPExcelをCakePHPで使ってみる</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/06/phpexcelcakephp.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.87</id>

    <published>2010-06-14T08:11:53Z</published>
    <updated>2010-06-15T01:18:39Z</updated>

    <summary>　システムを作っていると、お客様からよく「このデータをExcelで使いたい」とい...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[　システムを作っていると、お客様からよく「このデータをExcelで使いたい」ということをお聞きします。<br />
　大抵の場合CSV形式のファイルを出力して、それをExcelで読み込んで好きに加工して戴くのですが、やはりExcelの形式ではないので使い辛いと言われることがあります。<br />
　そこで、Excelファイルを出力するようにしようということになり、PHPExcelというライブラリをCakePHPに組み込んで使うことにしました。<br />
<br />
]]>
        <![CDATA[　出力するExcelのバージョンはExcel95（拡張子 .xls）とし、PHPExcelはVendorライクに使います。<br />
　なるべくMVCモデルになるように、コントローラで必要なデータを取得して、ビューでファイル出力を行います。<br />
　まず、PHPExcelライブラリ一式をVendor用のフォルダに配置します。<br />
<br />
&nbsp; \cakephp\app\vendors/phpexcel\PHPExcel.php<br />
&nbsp; \cakephp\app\vendors\phpexcel\PHPExcel\ （その他のファイル全部）<br />
<br />
&nbsp;コントローラで、PDF 出力ボタンを押したアクションを記述し、そこで必要なデータを取得・保存し、それ以外にシート名とファイル名を決めてビューに渡せるようにします。<br />
<br />
<br />
<pre class="php" name="code">
class ExcelsController extends AppController {

	var $name = 'Excels';
	var $uses = array( 'Fruit' );
	var $layout = 'default';

	function fruits_view() {

		$this->layout = false;			// レイアウトは使わない

		// 送信データ
		$data = $this->Fruit->getFruitAll();
		$this->set( "data", $data );

		// シート名
		$this->set( "sheet_name", "Fruits" );

		// 保存ファイル名
		$filename = "fruits.xls";
		$this->set( "filename", $filename );
	}

</pre>

　コントローラのアクションと同じ名前のビューを作ります。<br />
　コントローラ名が excels_controller.php で、アクション名が fruits_view なので、ビューファイルは<br />
 \cakephp\app\views\excels\fruits_view.php<br />
　です。<br />
<br />
PHPExcelのライブラリを読み込みます。<br />
<br />
<pre class="php" name="code">
// Excel出力用ライブラリ
App::import( 'Vendor', 'PHPExcel', array('file'=>'phpexcel' . DS . 'PHPExcel.php') );
App::import( 'Vendor', 'PHPExcel_IOFactory', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'IOFactory.php') );
App::import( 'Vendor', 'PHPExcel_Cell_AdvancedValueBinder', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Cell' . DS . 'AdvancedValueBinder.php') );

// Excel95用ライブラリ
App::import( 'Vendor', 'PHPExcel_Writer_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Writer' . DS . 'Excel5.php') );
App::import( 'Vendor', 'PHPExcel_Reader_Excel5', array('file'=>'phpexcel' . DS . 'PHPExcel' . DS . 'Reader' . DS . 'Excel5.php') );
</pre>
<br />
　Excelのオブジェクトを生成し、最初のシートをアクティブにしてデータを出力します。<br />
サンプルとしていろいろなメソッドを使ったコードを載せておきますので、詳しくはPHPExcelのマニュアルをご参照ください。<br />
　但し、全部英語です。<br />
<br />
<pre class="php" name="code">
	// Excelファイルの生成 ------------------------------------------

	// Create new PHPExcel object
	$objPHPExcel = new PHPExcel();

	// Set active sheet index to the first sheet, so Excel opens this as the first sheet
	$objPHPExcel->setActiveSheetIndex( 0 );
	$sheet = $objPHPExcel->getActiveSheet();

	// Rename sheet
	// シート名をつける
	$sheet->setTitle( $sheet_name );

		// デフォルトのフォント
	$sheet->getDefaultStyle()->getFont()->setName('ＭＳ Ｐゴシック');

	// デフォルトのフォントサイズ
	$sheet->getDefaultStyle()->getFont()->setSize(11);

	// デフォルトの列幅指定
	$sheet->getDefaultColumnDimension()->setWidth(12);

	// デフォルトの行の高さ指定
	$sheet->getDefaultRowDimension()->setRowHeight(18);

	// 列の幅指定
	$sheet->getColumnDimension( 'A' )->setWidth(12);
	$sheet->getColumnDimension( 'B' )->setWidth(30);
	$sheet->getColumnDimension( 'C' )->setWidth(12);

	// 列名
	$row_cnt = 1;
//	$sheet->setCellValueByColumnAndRow( 0, $row_cnt, "ID" );
	$cell_pos = 'A' . $row_cnt;
	// セルの値を入力
	$sheet->setCellValue( $cell_pos, "ID" );
	// 周りを罫線で囲む
	$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
	// 文字色を指定（赤）
	$sheet->getStyle( $cell_pos )->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);
	// ボールド指定
	$sheet->getStyle( $cell_pos )->getFont()->setBold(true);
	// フォントサイズの指定
	$sheet->getStyle( $cell_pos )->getFont()->setSize(15);
	// 背景色の指定（塗りつぶし）
	$sheet->getStyle( $cell_pos )->getFill()->setFillType( PHPExcel_Style_Fill::FILL_SOLID)->getStartColor()->setARGB('FF0000FF');
	// 縦方向の位置指定（中央）
	$sheet->getStyle( $cell_pos )->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
	// 横方向の位置指定（中央）
	$sheet->getStyle( $cell_pos )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);

//	$sheet->setCellValueByColumnAndRow( 1, $row_cnt, "名前" );
	$cell_pos = 'B' . $row_cnt;
	$sheet->setCellValue( $cell_pos, "名前" );
	$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
	$sheet->getStyle( $cell_pos )->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_BLUE);
	$sheet->getStyle( $cell_pos )->getFont()->setBold(true);
	$sheet->getStyle( $cell_pos )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT);

	$cell_pos = 'C' . $row_cnt;
	$sheet->setCellValue( $cell_pos, "数量" );
	$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
	$sheet->getStyle( $cell_pos )->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_GREEN);
	$sheet->getStyle( $cell_pos )->getFont()->setBold(true);
	$sheet->getStyle( $cell_pos )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT);

	// PHPの日時出力
	$cell_pos = 'E' . $row_cnt;
	$time = time();					// 現在日時(Unix Timestamp)
	$sheet->setCellValue( $cell_pos, PHPExcel_Shared_Date::PHPToExcel( $time ) );
	$sheet->getStyle( $cell_pos )->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

	// DBから取ってきたような日付の文字列（年月日のみ）
	$cell_pos = 'E2';
	PHPExcel_Cell::setValueBinder( new PHPExcel_Cell_AdvancedValueBinder() );
	$sheet->setCellValue( $cell_pos, '2010/5/10' );
	$sheet->getStyle( $cell_pos )->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH);

	// 行の高さを指定
	$sheet->getRowDimension( $row_cnt )->setRowHeight( 50 );

	// データ
	$row_cnt = 2;
	foreach( $data as $id => $name ){

		// 行の高さ指定
		$sheet->getRowDimension( $row_cnt )->setRowHeight( 20 );

		// ID
		$cell_pos = 'A' . $row_cnt;
		$sheet->setCellValue( $cell_pos, $id );
		$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
		$sheet->getStyle( $cell_pos )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
/*
		// セルを（ x, y )で指定した場合の例は下記
		$sheet->setCellValueByColumnAndRow( 0, $row_cnt, $id );
		$sheet->getStyleByColumnAndRow( 0, $row_cnt )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
		$sheet->getStyleByColumnAndRow( 0, $row_cnt )->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
*/

		// 名前
		$cell_pos = 'B' . $row_cnt;
		$sheet->setCellValue( $cell_pos, $name );
		$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);

		// 数量
		$cell_pos = 'C' . $row_cnt;
		$sheet->setCellValue( $cell_pos, 1000 );
		$sheet->getStyle( $cell_pos )->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
		// 数字のフォーマット指定
		if( $row_cnt % 2 == 0 ){
			// カンマ区切り
			$sheet->getStyle( $cell_pos )->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
		} else {
			// 小数点以下の桁数指定
			$sheet->getStyle( $cell_pos )->getNumberFormat()->setFormatCode( "#,##0.00" );
		}
		$row_cnt++;
	}

	// 全体を太い線で囲む
	$start_cell = "A1";
	$end_cell = "C" . ($row_cnt-1);
	$cell_range = "{$start_cell}:{$end_cell}";			// セルの範囲指定
	$sheet->getStyle( $cell_range )->getBorders()->getOutline()->setBorderStyle(PHPExcel_Style_Border::BORDER_MEDIUM);
</pre>
<br />
　ファイルを一時フォルダに出力し、内容をクライアントに送信します。<br />
<br />
<pre class="php" name="code">
	// Excelファイルの保存 ------------------------------------------

	// 保存ファイルフルパス
	$uploadDir = realpath( TMP );
	$uploadDir .= DS . 'excels' . DS;
	$path = $uploadDir . $filename;

	$objWriter = new PHPExcel_Writer_Excel5( $objPHPExcel );
	$objWriter->save( $path );

	// Excelファイルをクライアントに出力 ----------------------------

	Configure::write('debug', 0); 		// debugコードを非表示
	header("Content-disposition: attachment; filename={$filename}");
	header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; name={$filename}");

	$result = file_get_contents( $path );	// ダウンロードするデータの取得
	print( $result ); 						// 出力
</pre>
<br />
　これで、「Excel出力」ボタンを押して、ブラウザの別タブ（または別ウィンドウ）で生成したExcelファイルが開くようになります。<br />

]]>
    </content>
</entry>

<entry>
    <title>サイト集客：GIGAZINE セミナー</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/04/gigazine.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.85</id>

    <published>2010-04-22T02:13:29Z</published>
    <updated>2010-04-22T07:11:48Z</updated>

    <summary>同僚の誘いがあり興味がある内容なので、GIGAZINE10 周年記念講演「なぜあ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="Windows" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="その他" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="勉強会" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[同僚の誘いがあり興味がある内容なので、<br /><a href="http://gigazine.net/index.php?/news/comments/20100305_gigazine_10th_anniversary_lecture/">GIGAZINE10
周年記念講演「なぜあなたのサイトに人が来ないのか？」</a><br />に行ってきました。<br /><br />存在は知ってましたが、特にお気に入りに入っ
てるというわけではなかったので、<br />どんな切り口で「webでの集客をしているのか」、またどんな話をするのかちょっと楽しみでした。<br /><br />ま
ず最初にメモはするな！と<br />メモにとらずに頭に残るものこそ自分にとって大事な情報である！<br />みたいなことを、マクドナルドの社長？の引用文
と共に紹介してました。<br /><br />内容は大きく５つ<br />1、更新しまくれ<br />内容はいたって当たり前のことでした。<br />アクセス数、実
例共に更新することによって、どう変化があったか紹介されていました。<br />「更新できないサイト内容であるなら、そこから見直すべき」<br /><br />2、
デザインを考える<br />ユーザビリティを考え、何をどこに配置することがベストなのかを常に考える。<br />レイアウト変更でアクセス30倍とか、ヒー
トマップのF字理論<br />リピーターはF字にならないのでまた考える。<br /><br />３、色づかい<br />文字中心の内容であり、モニター越しに見る
ユーザーのことを考え<br />見やすい色づかいがどこまで出来ているか。<br />bing（microsoftの検索エンジン）が文字色を変えただけで収
支がUPしたことを紹介<br /><br />４、最重要！！サーバ強化<br />有名サイトやニュースサイトから紹介され、一時的にアクセスが増えた時を逃さな
い。<br />その時をいつか期待しつつ、オーバースペック気味でもサーバは強化しておけとのこと。<br /><br />サーバ強化による表示スピードもとても
大事であることをgoogle,amazonを実例に紹介。<br /><br />５、仕事≠遊び<br />24時間集客のことを考え、遊んでいる暇はない！<br />人
の倍しないと、人と同じ結果しかでない。<br />それができるかどうかが分かれ目である。<br />みたいな話でした。<br /><br />内容はこんな感じ
だったはずです。<br />アクセス解析を見せてくださったり、実例を元に話してたのですんなり納得できる内容でした。<br /><br /> <br /><br /><br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>システムの脆弱性検知ツールを調査してみる</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/04/post-7.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.83</id>

    <published>2010-04-07T05:52:11Z</published>
    <updated>2010-04-07T08:10:04Z</updated>

    <summary> セキュリティの調査で3つ脆弱性検知ツールを入れてみたのですが、結果的には次のよ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[ セキュリティの調査で3つ脆弱性検知ツールを入れてみたのですが、結果的には次のようになりました。<br />
<br />
-skipfish<br />
Linuxでしか動作しなく導入に手間が掛かる。<br />
導入後、実行してみるが時間が掛かりすぎる。CakePHPを抱え込んで検知したら半日経っても終らない。<br />
素のPHPで小さいシステムを検査してみるが脆弱性が発見できない。<br />
<br />
<br />
-IPAが出しているiLogScanner<br />
導入作業自体が無くIPAが用意しているサイトにサーバーのアクセスログファイルをUPして調査する。<br />
サーバーのログを上げる作業なので、このプロジェクトの脆弱性を見たいという時は、ログファイルの吐き出し方を切り替えるという作業が必要になってくる。<br />
脆弱性を発見したと検知されるのに、何処のファイルかという情報が無く脆弱性の特定が出来ない。<br />
<br />
<br />
-Paros<br />
windowsにインストールできて、そのパソコンからブラウザのプロキシを強引に変えて見たいシステムのURLを叩いて操作したログを後で検査するという仕組みです。<br />
素のPHPで書いた小さいシステムを検査すると、何処のファイルに脆弱性があるときちんと出してくれます。<br />
但しCakePHPなどのフレームワークを検査してみると、MVCが分かれているせいでXSSやSQLインジェクションを上手く検地してくれない。<br />
<br />
ということでParosがまだ一番使えるかなという感じなのですが、当初の目的のCakePHPを使ってるサイトの脆弱性を検査するという部分が出来ないので、引き続きツールを探して行きたいと思います。<br />
何か良い脆弱性検地ツールは無いんですかね・・・ ]]>
        
    </content>
</entry>

<entry>
    <title>CakePHPのsessionがcore.phpの設定より早く消える！</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/02/cakephpsessioncorephp.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.82</id>

    <published>2010-02-26T06:50:40Z</published>
    <updated>2010-02-26T07:16:27Z</updated>

    <summary>CakePHPのsessionってsessionデータに作成時間を保存しておき、...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[CakePHPのsessionってsessionデータに作成時間を保存しておき、読み出す時にcore.phpで設定した時間が経過していないかチェックしているんですね。<br />
サーバー設定の方はさわりに行ってないみたいです。<br />
core.phpの
<pre class="php" name="code">
Configure::write('Session.timeout', '120');
Configure::write('Security.level', 'medium');
</pre>
で3時間以上あってもサーバーの
<ul>
<li>session.cookie_lifetime</li>
<li>session.gc_maxlifetime</li>
</ul>
の方が短ければガーベジコレクションでsessionファイルが消えるので予想より早くログアウトしたりします。<br />

なので
bootstrap.phpに
<pre class="php" name="code">
ini_set("session.cookie_lifetime", 100 * Configure::read('Session.timeout'));
ini_set("session.gc_maxlifetime", 100 * Configure::read('Session.timeout'));
</pre>
coreの値使ってサーバー設定をcore触るだけで設定できるようにしました。<br />
(100掛けてるのはmediumの係数の100です。session.php見ましたが定数にはなっていない感じでした。)<br />
バージョンは1.2.6です。 

]]>
        
    </content>
</entry>

<entry>
    <title>CakePHPのtextareaの最初の改行コードがなくなる！</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/02/cakephptextarea.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.80</id>

    <published>2010-02-26T06:01:01Z</published>
    <updated>2010-02-26T07:15:47Z</updated>

    <summary>-------------- \n\nテキストエリア内容 -----------...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[--------------<br />
\n<br />\n<br />テキストエリア内容<br />
--------------<br />
のデータがあった場合<br />
<pre class="php" name="code">
$form->input('Model.field', array('type' => 'textarea'));
</pre>
で表示した場合、最初の改行コードがない状態でフォームに表示されます。<br />
(下記のように2つある改行が1つになっています)<br />
<textarea name="textarea" cols="20" rows="5">

テキストエリア内容
</textarea>]]>
        <![CDATA[実際、バグではなくてブラウザの仕様で最初の改行は表示しない為です。
<pre class="html" name="code">
<textarea name="textarea" cols="80" rows="5"> 
    テキストエリア内容
</textarea>
</pre>
こんな風に改行とインデントつけながらhtml書いていた場合、初めの改行を読み込んで表示されると1段下がった状態で内容が表示されると困りますので・・・<br />
CakePHPの場合 (cake/libs/view/helpers/html.php)
<pre class="php" name="code">
'<textarea name="%s" %s>%s</textarea>'
</pre>
のように改行を入れてから内容を表示していないので、内容を展開する前に改行を挿入してから展開する必要があります。<br />
そこで、 (cake/libs/view/helpers/form.php)
<pre class="php" name="code">
		return $this->output(sprintf(
			$this->Html->tags['textarea'],
			$options['name'],
			$this->_parseAttributes($options, array('type', 'name'), null, ' '),
			PHP_EOL. $value
		));
</pre>
の$valueの前に改行コード「PHP_EOL」を足しました。<br />
バージョンは1.2.6です。 ]]>
    </content>
</entry>

<entry>
    <title>CakePHPのqueryのキャッシュでハマる</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/02/cakephpquery.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.79</id>

    <published>2010-02-26T05:20:15Z</published>
    <updated>2010-02-26T05:58:25Z</updated>

    <summary>モデルのquery関数を使ってループをまわしながら最大noをとってくる処理でハマ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[モデルのquery関数を使ってループをまわしながら最大noをとってくる処理でハマりました・・・<br />
query関数って$sql同じだった場合勝手にキャッシュを使って前回と同じ値を返すんですね。<br />
通常はこれを回避する為に
<pre class="php" name="code">
$this-&gt;query($sql, false);
</pre>
とすることで毎回最新データを取ってきてくれます。<br />
デフォルトでキャッシュが邪魔だったので、app_model.phpで
<pre class="php" name="code">
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);
}
</pre>
query関数をオーバーライドしました。<br />
バージョンは1.2.6です。]]>
        
    </content>
</entry>

<entry>
    <title>OpenPEARでPDF_Support_Libraryを公開</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/02/openpearpdf-support-library.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.76</id>

    <published>2010-02-10T04:52:44Z</published>
    <updated>2010-02-10T07:51:08Z</updated>

    <summary>OpenPEARでPDFの位置合わせを楽に出来るようにしたPDF_Support...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[OpenPEARでPDFの位置合わせを楽に出来るようにしたPDF_Support_Libraryを 公開しました。<br />
<br />
OpenPEARでのPDF_Support_LibraryのURL<br />
<a href="http://openpear.org/package/PDF_Support_Library">http://openpear.org/package/PDF_Support_Library</a><br />
<br />]]>
        <![CDATA[概要<br />
tcpdf+FPDIの組み合わせでPDFを作っていたのですが、PDF表示の位置合わせが物凄く面倒くさかったので、位置合わせが楽になるようにライブラリを作りました。<br />
座標を指定する箇所をCSVで指定するように切り出して、CSVの部分でどういう種類（文字列、線、四角形、画像）の出力か、フォントサイズ、色等を指定するようにしました。<br />
位置を合わせやすくするためにグリッドを追加しておき座標を指定しやすくしてます。<br />
文字出力のデバッグ用に枠線や背景に色をつけれるようにしています。<br />
<br />
使い方<br />
/trunk/index.phpにサンプルを置いています。<br />
ここでライブラリクラスの読み込み、背景のPDFファイルと位置合わせのCSVファイルの読み込みを行って、入れたい部品を名前と内容を指定して記述しておきます。<br />
文字列の場合は<br />
setWidgetString()関数を使用します<br />
線、四角形、画像の場合は<br />
setWidgetVisible()関数を使用します<br />
<br />
/trunk/parts/example.csvに位置の情報などを指定します。<br />
部品ごとの指定値は次の通りです。<br />
<table width="100%"  border="1" cellspacing="0" cellpadding="0">
  <tr>
    <td>種類</td>
    <td>テキスト</td>
    <td>線</td>
    <td>四角形</td>
    <td>画像</td>
  </tr>
  <tr>
    <td>第1項目</td>
    <td>名前</td>
    <td>名前</td>
    <td>名前</td>
    <td>名前</td>
  </tr>
  <tr>
    <td>第2項目</td>
    <td>部品タイプ<br>(text)</td>
    <td>部品タイプ<br>(line)</td>
    <td>部品タイプ<br>(rect)</td>
    <td>部品タイプ<br>(image)</td>
  </tr>
  <tr>
    <td>第3項目</td>
    <td>コメント</td>
    <td>コメント</td>
    <td>コメント</td>
    <td>コメント</td>
  </tr>
  <tr>
    <td>第4項目</td>
    <td>左上X位置</td>
    <td>左上X位置</td>
    <td>左上X位置</td>
    <td>左上X位置</td>
  </tr>
  <tr>
    <td>第5項目</td>
    <td>左上Y位置</td>
    <td>左上Y位置</td>
    <td>左上Y位置</td>
    <td>左上Y位置</td>
  </tr>
  <tr>
    <td>第6項目</td>
    <td>右下X位置</td>
    <td>右下X位置</td>
    <td>右下X位置</td>
    <td>右下X位置</td>
  </tr>
  <tr>
    <td>第7項目</td>
    <td>右下Y位置</td>
    <td>右下Y位置</td>
    <td>右下Y位置</td>
    <td>右下Y位置</td>
  </tr>
  <tr>
    <td>第8項目</td>
    <td>文字色<br>（#ffffffという形で指定）</td>
    <td>線色<br>（#ffffffという形で指定）</td>
    <td>四角形の色<br>（#ffffffという形で指定）</td>
    <td>ファイルパス</td>
  </tr>
  <tr>
    <td>第9項目</td>
    <td>フォントのサイズ</td>
    <td>線の太さ</td>
    <td>塗りつぶすかどうか<br>0=塗りつぶさない<br>1=塗りつぶす</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第10項目</td>
    <td>行数</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第11項目</td>
    <td>水平位置(L,C,R)</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第12項目</td>
    <td>垂直位置(C,B,T)</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第13項目</td>
    <td>ボールド<br>0=無し,1=有り</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第14項目</td>
    <td>イタリック<br>0=無し,1=有り</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>第15項目</td>
    <td>アンダーライン<br>0=無し,1=有り</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
]]>
    </content>
</entry>

<entry>
    <title>PHPで画像加工</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/01/php-1.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.74</id>

    <published>2010-01-28T02:58:03Z</published>
    <updated>2010-01-28T03:06:56Z</updated>

    <summary>今回UPした画像のリサイズと画像に文字を乗っけるという仕様の仕事があり、PHPで...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[今回UPした画像のリサイズと画像に文字を乗っけるという仕様の仕事があり、PHPで画像加工に挑戦しました。<br />
<br />
調べてみるとPHPを入れるときに大体標準で付いてくるGDライブラリで画像加工が出来るとのこと。<br />
今回は画像を小さくリサイズするのと、写真に文字を埋め込むという事をしました。<br />
 ]]>
        <![CDATA[ソースは次のようになりました。<br />
<br />


<pre class="php" name="code">

$upload_path = "アップロードしたいディレクトリ";

//まず元画像となる写真を上げます。
if (!move_uploaded_file($_FILES["Filedata"]["tmp_name"], $upload_path . "picture.jpeg")) {
    header("HTTP/1.0 500 Internal Server Error");
    die;
}

//元画像の写真のサイズを取得します。
list($width,$height)=getimagesize($upload_path . "picture.jpeg");
//元画像のJPEGファイルを読み込んでおきます。
$src=@imagecreatefromjpeg($upload_path . "picture.jpeg");

//縦横比で写真の大きさを決めます
if ($width>$height){
    $new_width = 600;
    $rate = $new_width / $width; //圧縮比
    $new_height = $rate * $height;
}else{
    $new_height = 400;
    $rate = $new_height / $height; //圧縮比
    $new_width = $rate * $width;
}
//縦横比で新たなキャンパスサイズを決定して空の画像を作ります。
$dst=imagecreatetruecolor($new_width, $new_height);
//新しい画像に元の画像をコピーします。
imagecopyresampled($dst,$src,0,0,0,0,$new_width,$new_height,$width,$height);

//出す文字のフォントが置いているパスを指定します。今回はIPAゴシックを使用
$fontPath = "ipagp.otf";
//フォントの色を指定します
$fontColor = ImageColorAllocate($dst, 0, 0, 0);
//フォントと色と出す文字（今回はテストという文字）を写真に埋め込みます。
ImageTTFText($dst, 20, 0, 10, 30, $fontColor, $fontPath, 'テスト');

//ファイルに保存します。第3引数の数字はクオリティーなので好みの数値を0?100で入れる。
imagejpeg($dst, $upload_path . "picture_m.jpeg", 80);
//メモリから画像を開放しておく。
imagedestroy($dst);
</pre>

こんな感じで画像の加工が出来ました。<br />
今回使用したIPAフォントは次の所から落としてきて、パスで指定したところに置いておきます。<br />
http://ossipedia.ipa.go.jp/ipafont/]]>
    </content>
</entry>

<entry>
    <title>QRコード生成ライブラリを使ってみました</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/01/qr.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.73</id>

    <published>2010-01-28T01:21:18Z</published>
    <updated>2010-01-28T01:29:24Z</updated>

    <summary>携帯サイトも併設したシステムを組むことになりPCサイトからQRコードを 読み込ん...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[携帯サイトも併設したシステムを組むことになりPCサイトからQRコードを<br />
読み込んで携帯サイトに飛んでもらうということで、QRコードを作成することになりました。<br /><br /> ]]>
        <![CDATA[QRコード生成は簡単で以下のURLからライブラリを落としてきます。<br />
http://www.swetake.com/qr/qr_cgi.html<br />
<br />
落としてきたライブラリへのパスをイメージタグに行きたい携帯のURLをGET情報で付けて渡すだけです。<br />
<br />

<pre class="php" name="code">

<?php $src_enc = urlencode("http://xxxx.xxx.xx"); ?>
<img src="<?php echo "/qr/php/qr_img.php?d=$src_enc&t=J&s=3" ?>">

</pre>
気をつける点はGETでURLを渡す際はurlencodeした値を渡してあげること。<br />
これで画面にQRコードが表示されました。<br /><br />]]>
    </content>
</entry>

<entry>
    <title>複数ファイルを一気にUPする</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2010/01/up.html" />
    <id>tag:www.okushin.co.jp,2010:/kodanuki_note//5.72</id>

    <published>2010-01-27T07:29:37Z</published>
    <updated>2010-01-27T08:09:28Z</updated>

    <summary>今回複数の写真を一気にUPしたい案件があったのでネットを探していたら、便利そうな...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[今回複数の写真を一気にUPしたい案件があったのでネットを探していたら、便利そうなライブラリを発見！！<br />
<br />
その名もSWFUploadライブラリというもので、ファイルを選択する際にドラッグで複数選ぶか、ShiftかCtrlを押しながら複数選ぶ。<br />選び終わったら開くボタンを押す、そしたら選ばれたファイルが進行状況が分かりながらアップロードされていくというライブラリです。<br />
<br /> ]]>
        <![CDATA[とりあえず次のURLからライブラリの入手をします。<br>
http://www.swfupload.org/<br>
<br>
ダウンロードしてきてとりあえずサンプルのデモを見てみて使えることを確認。<br>
そのソースで要るところを抜粋していって最小で動くライブラリを整理しました。<br>
<br>
構造的に下のような感じになります。<br>
<br>
<span class="mt-enclosure mt-enclosure-image"><img alt="path.gif" src="http://www.okushin.co.jp/kodanuki_note/path.gif" width="300" height="418" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;"/></span>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
/simpledemo/index.phpの内部で次のようなjavascriptの記述をしています。
<pre class="php" name="code">
		var swfu;

		window.onload = function() {
			var settings = {
				flash_url : "../swfupload/swfupload.swf",
				upload_url: "upload.php",
				post_params: {"PHPSESSID" : "<?php echo session_id(); ?>"},
				file_size_limit : "4096",
				file_types : "*.jpg; *.jpeg;",
				file_types_description : "画像ファイル",
				file_upload_limit : 20,
				file_queue_limit : 0,
				custom_settings : {
					progressTarget : "fsUploadProgress",
					cancelButtonId : "btnCancel"
				},
				debug: false,

				// Button settings
				button_image_url: "images/button.png",
				button_width: "120",
				button_height: "30",
				button_placeholder_id: "spanButtonPlaceHolder",
				button_text: '<span class="theFont">ファイル選択</span>',
				button_text_style: ".theFont { font-size: 16; }",
				button_text_left_padding: 12,
				button_text_top_padding: 3,
				
				// The event handler functions are defined in handlers.js
				file_queued_handler : fileQueued,
				file_queue_error_handler : fileQueueError,
				file_dialog_complete_handler : fileDialogComplete,
				upload_start_handler : uploadStart,
				upload_progress_handler : uploadProgress,
				upload_error_handler : uploadError,
				upload_success_handler : uploadSuccess,
				upload_complete_handler : uploadComplete,
				queue_complete_handler : queueComplete	// Queue plugin event
			};

			swfu = new SWFUpload(settings);
	     };
</pre>

のようなソースになっています。<br>
javascriptで各ステータスを指定しているので、自分のサイトにあった形で書き換えていきます。<br>
分かる範囲で簡単に説明を書くと、<br>
flash_url : "../swfupload/swfupload.swf"<br>
付属されているフラッシュへのパスを指定<br>
<br>
upload_url: "upload.php"<br>
アップロード処理が動くファイルへのパスを指定<br>
<br>
file_size_limit : "4096"<br>
アップできるファイルの上限サイズ　今回だったら4MBまでって感じです。<br>
<br>
file_types : "*.jpg; *.jpeg;"<br>
アップできるファイルの種類　今回だったら拡張子の.jpgと.jpegファイルだけUPされます。<br>
<br>
file_types_description : "画像ファイル"<br>
ダイアログが開いたときにアップできるファイルはどれですよという説明文　今回だったら画像ファイルという文字が出ます。<br>
<br>
file_upload_limit : 20<br>
一回でアップロードできるファイルの上限サイズ　今回だったら最大20個までUPされます。<br>
<br>
button_image_url: "images/button.png"<br>
ファイルの選択ボタンの画像へのパス　ファイル選択ボタンが変えたかったらここの画像を変更する。<br>
<br>
button_text: '<span class="theFont">ファイル選択</span>'<br>
ファイルの選択ボタンの文字表示　こじゃれた見た目にするならここのメッセージを無くして画像で綺麗に作ったらいいです。<br>
<br>
とりあえずこのぐらいの変更で使ってみます。<br>
<br>
次に実際に画像をUPするファイル/simpledemo/upload.phpの内容が、<br>

<pre class="php" name="code">
<?php
    $upload_path = "uploads/";
    
    // Handle the upload
    if (!move_uploaded_file($_FILES["Filedata"]["tmp_name"],
        $upload_path . $_FILES["Filedata"]["name"])) {
        header("HTTP/1.0 500 Internal Server Error");
    }
?>
</pre>
という感じで、ここでは/simpledemo/uploadsフォルダに画像を上げていきます。<br>
<br>
これでSWFUploadは使えるようになったのですが、<br>
状態を表す時やエラーになった時のメッセージが英語の状態なので日本語に変えます。<br>
/simpledemo/js/handlers.jsファイルの内容を次のように変えました。<br>

<pre class="php" name="code">
function fileQueued(file) {
	try {
		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setStatus("アップロード待ち");
		progress.toggleCancel(true, this);

	} catch (ex) {
		this.debug(ex);
	}

}

function fileQueueError(file, errorCode, message) {
	try {
		if (errorCode === SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED) {
			alert("1回でアップロード出切るファイル数を超えています。");
			return;
		}

		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setError();
		progress.toggleCancel(false);

		switch (errorCode) {
		case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
			progress.setStatus("UP出切るファイルの上限サイズを超えています。");
			this.debug("Error Code: File too big, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
			break;
		case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
			progress.setStatus("0バイトのファイルはUP出来ません。");
			this.debug("Error Code: Zero byte file, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
			break;
		case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
			progress.setStatus("UP出きるファイルの種類ではありません。");
			this.debug("Error Code: Invalid File Type, File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
			break;
		default:
			if (file !== null) {
				progress.setStatus("ファイルが見つけれませんでした。");
			}
			this.debug("Error Code: " + errorCode + ", File name: " + file.name + ", File size: " + file.size + ", Message: " + message);
			break;
		}
	} catch (ex) {
        this.debug(ex);
    }
}

function uploadStart(file) {
	try {
		/* I don't want to do any file validation or anything,  I'll just update the UI and
		return true to indicate that the upload should start.
		It's important to update the UI here because in Linux no uploadProgress events are called. The best
		we can do is say we are uploading.
		 */
		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setStatus("アップロード中");
		progress.toggleCancel(true, this);
	}
	catch (ex) {}
	
	return true;
}

function uploadProgress(file, bytesLoaded, bytesTotal) {
	try {
		var percent = Math.ceil((bytesLoaded / bytesTotal) * 100);

		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setProgress(percent);
		progress.setStatus("アップロード中");
	} catch (ex) {
		this.debug(ex);
	}
}

function uploadSuccess(file, serverData) {
	try {
		var progress = new FileProgress(file, this.customSettings.progressTarget);
		progress.setComplete();
		progress.setStatus("完了");
		progress.toggleCancel(false);

	} catch (ex) {
		this.debug(ex);
	}
}
function queueComplete(numFilesUploaded) {
	var status = document.getElementById("divStatus");
	status.innerHTML = numFilesUploaded + " 個のファイルをUPしました。";
}
</pre>

こんな感じで複数ファイルを一気にUP出来るようになりました。]]>
    </content>
</entry>

</feed>
