<?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>2011-12-29T04:57:35Z</updated>
    <subtitle>WEBシステム開発等で気付いたことなどをまとめていきます。</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>グーグルマップを使ってみた</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/12/post-10.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.187</id>

    <published>2011-12-29T03:58:23Z</published>
    <updated>2011-12-29T04:57:35Z</updated>

    <summary>今回、管理側で指定した地図の場所を公開側で表示させる仕様のお仕事が来たのでグーグ...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[今回、管理側で指定した地図の場所を公開側で表示させる仕様のお仕事が来たのでグーグルマップを取り入れました。<br>
]]>
        <![CDATA[<div>
まずグーグルマップAPIにグーグルマップを使用するURLのドメインを登録してプロダクトキーを取得します。<br>
プロダクトキーを取得するのにグーグルアカウントが必要なのでアカウントを作ってログインしておきます。<br>
このURLでプロダクトキーを取得<br>
URL：http://code.google.com/intl/ja/apis/maps/signup.html<br>

記述は次のような感じです。<br>
</div>
<pre class="php" name="code">

	<script src="取得したプロダクトキー" type="text/javascript"></script>
	<script type="text/javascript">
	//<![CDATA[

	var mapname = 'map';
	var lat = document.getElementById('UserLatitude').value;
	var lng = document.getElementById('UserLongitude').value;

	var set_map = function () {

	  if (GBrowserIsCompatible()) {

	    // マップ表示
	    var point = new GLatLng(lat, lng);
	    var map   = new GMap2(document.getElementById(mapname));
	    map.setCenter(point, 17);
	  
	    // ドラッグ可能なマーカー
	    var mk = new GMarker(point, {draggable:true});
	  
	    // ドロップ時に緯度経度取得
	    GEvent.addListener(mk,"dragend", function() {
	      var p = mk.getLatLng();
	      document.getElementById('UserLatitude').value = p.lat();
	      document.getElementById('UserLongitude').value = p.lng();
	    } );
	  
	    // マップにマーカーを表示
	    map.addOverlay(mk);
	    document.getElementById('UserLatitude').value = mk.getLatLng().lat();
	    document.getElementById('UserLongitude').value = mk.getLatLng().lng();
	  
	    // コントロール（小）
	    map.addControl(new GSmallMapControl);
	  }
	}

	// ONLOADイベントで呼び出し
	window.onload   = set_map;
	window.onunload = GUnload();
	//]]&gt;
	</script>
</pre>
<div>上記の内容を記述しておきタブの中に</div>
<pre class="php" name="code">
<input type="hidden" name="data[User][latitude]"  id="UserLatitude" />
<input type="hidden" name="data[User][longitude]"  id="UserLongitude" />
<div id="map" style="width:500px;height:300px"></div>
</pre>
<div>と記述します。これでグーグルマップが表示されていてポインタをドラッグして移動さすことができ保存する時にhiddenでX座標、Y座標を取得できるのでその内容をDBに保存するという感じで公開側で指定した座標の地図が表示出来るようになります。</div>
]]>
    </content>
</entry>

<entry>
    <title>CakePHPでinputの名前で5層に対応する</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/11/cakephpinput5.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.176</id>

    <published>2011-11-08T06:15:10Z</published>
    <updated>2011-11-08T06:39:55Z</updated>

    <summary><![CDATA[CakePHPで配列で指定したinputに$this-&gt;dataが連動して...]]></summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="CakePHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <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[CakePHPで配列で指定したinputに$this-&gt;dataが連動してくれる<br />helperのありがたい機能を使っていたのですが、<br />&lt;?php echo $form-&gt;input("Part.1.element.1.radio", array('type'=&gt;'text')); ?&gt;<br />という感じの5層構造になるとデータの引継ぎをしてくれません。<br />helperの対応しているのは4層までみたいです。<br /><br />困ったということで調べてみるのですが、これという記事が見つからないので<br />自分でカスタマイズして5層でもデータがやり取りできるようにしました。<br /><br /> ]]>
        <![CDATA[まず/cake/lib/view/view.phpにviewに関する記述が書いているので<br />
これを改造するのですが、cake本体は変えては駄目なので<br />
コピーしてきて/app/views/の下にview.phpを配置します。<br />
配置したファイルを改造するのですが、改造したファイルは<span class="mt-enclosure mt-enclosure-file"><a href="http://www.okushin.co.jp/kodanuki_note/2011/11/08/view.txt">こちら</a></span><br /><br />次にhelperの改造ですが、helperの変更は/app/app_helper.php内で行います。<br />
/cake/libs/view/helper.phpの中から階層に関連する関数だけコピーして<br />
取り出して改造を加えてapp_helper.phpに入れます。<br />
app_helper.phpの記述は<span class="mt-enclosure mt-enclosure-file"><a href="http://www.okushin.co.jp/kodanuki_note/2011/11/08/app_helper.txt">こちら</a></span><br /><br />
app_helper.phpは何もせずに読み込まれるのですが、<br />
view.phpはそのままでは呼ばれないので/app/config/bootstrap.phpで<br />
App::import('Core', 'View', array('file' =&gt; '../app/views/view.php')); <br />
と記述してあげます。<br />
<br />
以上で5層の配列の名前のやり取りが出来るようになりました。<div><br /></div><div><br /></div><div><br /></div><div><br /></div>]]>
    </content>
</entry>

<entry>
    <title>pChartで棒グラフを描きました。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/10/pchart-1.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.163</id>

    <published>2011-10-03T02:47:16Z</published>
    <updated>2011-10-03T08:22:22Z</updated>

    <summary>レーダーチャートに引き続き、棒グラフも描きました。インストールはレーダーチャート...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[レーダーチャートに引き続き、棒グラフも描きました。<div>インストールはレーダーチャートと同様です。</div><div><br /></div><span class="mt-enclosure mt-enclosure-image"><img alt="bar_1_23_20111003114604.png" src="http://www.okushin.co.jp/kodanuki_note/bar_1_23_20111003114604.png" width="350" height="230" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span>]]>
        <![CDATA[cakephp\app\controllers\pcharts_controller.php
<pre class="javascript" name="code">
require_once(APP. 'vendors/pChart/pChart/pData.class');
require_once(APP. 'vendors/pChart/pChart/pChart.class');
//*******************************************************************************
// モジュール名 : 棒グラフの表示
//*******************************************************************************
class PchartsController extends AppController {
	var $name = 'Pcharts';
    var $uses = array('Profile');

	/**
	 * 棒グラフのサンプルを作成する
	 * @note
	 */
    function bar(){
		$id = 1; // グラフ番号
		$p_id = 23; // 出席番号
		$gtitle = "成績表"; // グラフ名 
		$title_a = array("国語","数学","科学","物理","歴史","英語");	// 項目
		$num_a = array(98,84,100,63,27,57);	// 各項目の値
		// グラフの表示
		$this->__pChartBar($id, $p_id, $gtitle, $title_a, $num_a);	
    }
	/**
	 * 棒グラフの表示関数
	 * @note
	 * @param    int	$id			種別
	 * @param	 int	$p_id		プロフィールID
	 * @param	 str	$gtitle		グラフタイトル
	 * @param    arr    $title_a    グラフ項目タイトル
	 * @param    arr    $num_a    	項目毎の値（上記の項目タイトル順）
	 */
	function	__pChartBar($id,$p_id,$gtitle,$title_a,$num_a){
		// Dataset definition
		$DataSet = new pData;
		// 項目毎の値を設定
		$DataSet->AddPoint($num_a,"range1");
		// グラフ項目タイトル設定
		$DataSet->AddPoint($title_a, "Serie0");
		// 全てのデータシリーズを追加する
		$DataSet->AddAllSeries();
		// データセットを削除する
		$DataSet->RemoveSerie("Serie0");
		// 横軸に使用するデータセット名を設定する
		$DataSet->SetAbsciseLabelSerie("Serie0");
		// データセットに名称を設定する
		$DataSet->SetSerieName( "点", "range1");
						
		// Initialise the graph
		// グラフの全体サイズを設定する。
		$Test = new pChart(350,230);
		//デフォルトの色を変更する。
		$Test->setColorPalette(0,79,129,189); 
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		// グラフエリア
		$Test->setGraphArea(50,50,320,200);
		// 縦は10分割固定
		$Test->setFixedScale(0, 100, 10);  
		
		// 角の丸い塗りつぶされた四角形を描画する
		$Test->drawFilledRoundedRectangle(7,7,343,223,5,240,240,240);
		// 角が丸い線グラフを描画する
		$Test->drawRoundedRectangle(5,5,345,225,5,230,230,230);
		// グラフ領域の背景色を描画する
		$Test->drawGraphArea(255,255,255,TRUE);
		
		/* Draw the scale */
		// 目盛りを描画する
		$Test->drawScale($DataSet->GetData(),$DataSet->GetDataDescription(),SCALE_NORMAL,0,0,0,TRUE,0,2,TRUE);
		// グリッドを描画する
		$Test->drawGrid(4,TRUE,230,230,230,50);
		
		// Draw the 0 line
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		// しきい値を描画する
		$Test->drawTreshold(0,143,55,72,TRUE,TRUE);
				
		
		// Draw the bar graph
		// 積み上げ棒グラフを描画する
		$Test->drawBarGraph($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE,80);
		// 値を表示する
		$Test->writeValues($DataSet->GetData(),$DataSet->GetDataDescription(),"range1");
		
		
		// Finish the graph
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		// グラフの凡例を描画する
		$Test->drawLegend(300,150,$DataSet->GetDataDescription(),255,255,255);
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		// グラフタイトルを表示する。
		$Test->drawTitle(50,22,$gtitle,50,50,50,150);
		// グラフファイル名生成
		$name = TMP."graph/"."bar_".$id."_".$p_id."_".dateFormat(date("Y/m/d H:i:s"),"YmdHis").".png";
		// グラフをファイルに出力する
		$Test->Render($name);
		// ブラウザー上に表示
		header("Content-type:image/png");
		echo file_get_contents( $name );
		return $name;
	}

</pre>]]>
    </content>
</entry>

<entry>
    <title>pChartでレーダーチャートを描きました。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/10/pchart.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.162</id>

    <published>2011-10-03T01:28:55Z</published>
    <updated>2011-10-03T08:19:55Z</updated>

    <summary>グラフを必要とするお仕事があり、JPgraphとpChartを候補にあげました。...</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[グラフを必要とするお仕事があり、JPgraphとpChartを候補にあげました。しかし、JPgraphは、有償なので対象からはずれ、pChartで作成することになりました。<div>○インストール方法<div>cakephpで実現しています。<br/>通常はviewsを作成して表示するのですが、<br/>このサンプルでは、controllerで表示するように記述しています。<br/>cakephp\app\vendors\pChartにダウンロードしてきたpChart.1.27d.rarの展開したものをコピーします。</div><div>あとは、フォントを利用するので、ipaexg.ttfをcakephp\app\vendors/pChart/Fonts/ipaexg.ttfへ配置します。準備は以上です。</div><div>○利用して苦労した点</div><div>デフォルトのグラフの色が変えれなかったのですが、</div><div><div><span class="Apple-tab-span" style="white-space: pre; ">		</span>// デフォルトの色を変更する。</div><div><span class="Apple-tab-span" style="white-space: pre; ">		</span>$Test-&gt;setColorPalette(0,79,129,189);</div></div><div>の記述で変更することができました。</div><div><br /></div><div></div>TMP."graph/"のフォルダを作成して書き込み権限をあたえてください。<div><br /></div></div>
<span class="mt-enclosure mt-enclosure-image"><img alt="radare_1_23_20111003112429.png" src="http://www.okushin.co.jp/kodanuki_note/radare_1_23_20111003112429.png" width="460" height="460" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span>]]>
        <![CDATA[cakephp\app\controllers\pcharts_controller.php
<pre class="javascript" name="code">
require_once(APP. 'vendors/pChart/pChart/pData.class');
require_once(APP. 'vendors/pChart/pChart/pChart.class');
//*******************************************************************************
// モジュール名 : レーダーチャートの表示
//*******************************************************************************
class PchartsController extends AppController {
	var $name = 'Pcharts';
    var $uses = array('Profile');

	/**
	 * レーダーチャートのサンプルを作成する
	 * @note
	 */
    function radar(){
		$id = 1; // グラフ番号
		$p_id = 23; // 出席番号
		$gtitle = "成績表"; // グラフ名 
		$title_a = array("国語","数学","科学","物理","歴史","英語");	// 項目
		$num_a = array(98,84,100,63,27,57);	// 各項目の値
		// グラフの表示
		$this->__pChartRader($id, $p_id, $gtitle, $title_a, $num_a);	
    }
	/**
	 * レーダーチャートの表示関数
	 * @note
	 * @param    int	$id			種別
	 * @param	 int	$p_id		プロフィールID
	 * @param	 str	$gtitle		グラフタイトル
	 * @param    arr    $title_a    グラフ項目タイトル
	 * @param    arr    $num_a    	項目毎の値（上記の項目タイトル順）
	 */
	function	__pChartRader($id,$p_id,$gtitle,$title_a,$num_a){
		// データセット初期化
		$DataSet = new pData;
		
		// 点数をタイトルに付ける
		foreach ($title_a as $key => $val) {
			$title_a[$key] = $val . ":" . $num_a[$key];
		}
		// グラフ項目タイトル設定
		$DataSet->AddPoint( $title_a  ,"Label");
		// 項目毎の値を設定
		$DataSet->AddPoint( $num_a , "Serie1");
		// 新しいデータセットを加える
		$DataSet->AddSerie("Serie1");
		// 横軸に使用するデータセット名を設定する
		$DataSet->SetAbsciseLabelSerie("Label");
		// データセットに名称を設定する
		$DataSet->SetSerieName( "点","Serie1");
		
		// グラフの全体サイズを設定する。
		$Test = new pChart(460,460);
		// デフォルトの色を変更する。
		$Test->setColorPalette(0,79,129,189);
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		
		//枠の塗り
		// 角の丸い塗りつぶされた四角形を描画する
		$Test->drawFilledRoundedRectangle(7,7,453,453,5,129,179,239);
		// 角が丸い線グラフを描画する
		$Test->drawRoundedRectangle(5,5,455,455,5,79,129,189);
		// グラフのエリアを指定
		$Test->setGraphArea(50,50,410,410);
		// 角の丸い塗りつぶされた四角形を描画する
		$Test->drawFilledRoundedRectangle(30,30,430,430,5,255,255,255);
		// 角が丸い線グラフを描画する
		$Test->drawRoundedRectangle(30,30,430,430,5,129,189,249);
		
		//ラインとドットライン
		// レーダーグラフの軸を描画する
		$Test->drawRadarAxis($DataSet->GetData(),$DataSet->GetDataDescription(),TRUE,20,0,0,0,200,200,200,10);
		// 塗りつぶされたレーダーグラフを描画する
		$Test->drawFilledRadar($DataSet->GetData(),$DataSet->GetDataDescription(),50,20,100);
				
		//左上のタイトル文字
		$Test->drawLegend(15,15,$DataSet->GetDataDescription(),255,255,255);
		//日本語用のフォント。
		$Test->setFontProperties(APP. "vendors/pChart/Fonts/ipaexg.ttf",10);
		
		// グラフタイトル表示
		$Test->drawTitle(0,22,$gtitle,50,50,50,400);
		// グラフファイル名生成
		$name = TMP."graph/"."radare_".$id."_".$p_id."_".dateFormat(date("Y/m/d H:i:s"),"YmdHis").".png";
		
		// グラフファイル作成
		$Test->Render($name);

		// ブラウザー上に表示
		header("Content-type:image/png");
		echo file_get_contents( $name );
		return $name;
	}
</pre>]]>
    </content>
</entry>

<entry>
    <title>wdCalenderが本番サーバーで動かない</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/09/wdcalender.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.160</id>

    <published>2011-09-20T05:29:40Z</published>
    <updated>2011-09-21T04:39:46Z</updated>

    <summary>wdCalenderをローカル環境で動かしていて、実際本番環境にUPした時に動か...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="Ajax(JavaScript)" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <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[wdCalenderをローカル環境で動かしていて、実際本番環境にUPした時に動かなくなってテンパッタのでメモとしてブログに残しておきます。<br /><br />症状としてはテスト環境では動くのに本番環境では動かないというもの。<br />jqueryに頼っているので実際動かないと、どう調査をしたらいいか分からずとりあえず、FireBugで追っかけていきます。<br />するとどうもテストでは値が入っている所に、本番では入っていないということが分かりました。しかもJSON形式のデータが・・・<br /><br />JSON形式のデータ？？？んっ！！以前phpのjson_encodeはphpのバージョンに依存するなというのに、はまった事があるなということで調べるとビンゴでJSONが使えるPHPのバージョンは5.2以上ということ。<br />本番サーバーではphpのバージョンが5.1.6だったので早速5.1.6でもJSONが使えるように「http://www.softel.co.jp/blogs/tech/archives/973」を参考にサーバーの設定を変更！！<br />これで動くかなと思っていたのですが動かない・・・という事でもう一度デバッグ作業をしていきます。<br />今度はphpの記述部分をfwrite関数を使っていって1行ずつファイルにデバッグ文を出力して追って行きます。するとある関数で処理が止まってしまっている事が分かりました。<br />それはdate_parse関数なのですが調べてみると、この関数が使えるのはphp5.2以上との事でして、JSONと一緒やんという顛末でした。date_parse関数のところを独自の記述に置き換えると見事動いてくれました。<br /><br />基本としてwdCalenderはphp5.2以上で使うもの。それ以前で使うときは動くように自分で調整をして上げる必要ありという事でした。<br /><br /> ]]>
        
    </content>
</entry>

<entry>
    <title>CakePHPで複数prefixを使ったときのページネートの挙動を直す</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/09/cakephpprefix.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.155</id>

    <published>2011-09-01T05:04:46Z</published>
    <updated>2011-09-01T05:36:42Z</updated>

    <summary>前回はapp/core.phpの Configure::write(&apos;Routi...</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[前回はapp/core.phpの
<pre class="php" name="code">
Configure::write('Routing.admin', 'admin');
</pre>
<div>をコメントアウトすることでページネートのリンクを押した時にリンクエラーになるのを防ぎました。</div><div><br /></div><div>じゃあ、「公開」「公開（携帯）」「管理」のように３つサイトを分ける時にはどうするの？ということで調べてみました。</div>]]>
        <![CDATA[まず、app/core.phpの
<pre class="php" name="code">
//&nbsp;Configure::write('Routing.admin', 'admin');
</pre>
<div>はコメントアウトのままで、</div><div>app/routes.phpに下記を追加します。</div>
<pre class="php" name="code">
// 公開（携帯）
Router::connect(
    '/m/:controller/:action/*',
    array(
        'prefix' => 'm',
        'm' => true
    )
);

// 管理
Router::connect(
    '/admin/:controller/:action/*',
    array(
        'prefix' => 'admin',
        'admin' => true
    )
);
</pre>
<div>これで、</div><div>domain.jp/controller/action&nbsp;→公開側</div><div>domain.jp/m/controller/action&nbsp;→公開側(携帯)</div><div>domain.jp/admin/controller/action&nbsp;→管理側</div><div>になります。</div><div><br /></div><div>それから、各viewの作る時にページネートの部分をヘルパーで書きますが、</div>
<pre class="php" name="code">
if(!empty($prefix)) {
	$paginator->options(array('url' => array($prefix => true)));
}
echo $paginator->counter(array('format' => "%start%件?%end%件 (全 %count%件)"));
echo ' ';
echo $paginator->first('最初',array('after'=>' ' ));
echo $paginator->prev('前へ');
echo $paginator->numbers(array('before' => ' ','after'=>' ', 'modulus' => 9));
echo $paginator->next('次へ');
echo $paginator->last('最後',array('before'=>' ' ) );
</pre>
<div>というように$paginator-&gt;optionsでurlにprefix名を与えてあげてください。</div><div>$prefixはcontrollerで$this-&gt;prefixをviewにセットした内容が入っています。</div><div>公開側（携帯）は「m」、管理側は「admin」が入っています。</div>]]>
    </content>
</entry>

<entry>
    <title>CakePHPでprefixを使っている時のpaginatorの挙動を直す</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/07/cakephpprefixpaginator.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.148</id>

    <published>2011-07-21T10:21:02Z</published>
    <updated>2011-07-21T10:31:44Z</updated>

    <summary>CakePHPでprefixを切り替えた所の開発をしていたのですが、pagina...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[CakePHPでprefixを切り替えた所の開発をしていたのですが、paginatorでページ切り替えなどを行おうとすると、飛び先のURLからprefixの部分が抜け落ちておりリンクエラーになってしまいました。<br />これは困ったと調べてみるとcore.phpで以下の記述をすれ良いだけのこと。<br />Configure::write('Routing.admin', '使っているprefix値');<br />なんだかみたことがある記述だなと思っていたら、prefixをadminにして動かしたいときはcore.phpで<br />Configure::write('Routing.admin', 'admin');<br />のコメントを外す決まりごとがあったなという事を思い出しました。しかしadmin以外のprefixを使っていたのでそこらへんの仕組みがノーマークだったため、そこそこはまりました・・・<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>MySQLに大量のデータをインポートする</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/07/mysql.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.147</id>

    <published>2011-07-21T10:06:31Z</published>
    <updated>2011-07-21T10:20:31Z</updated>

    <summary>今回レンタルサーバーの区画のMySQLに大量データを流し込まなくなったのですが、...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="MySQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <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[今回レンタルサーバーの区画のMySQLに大量データを流し込まなくなったのですが、レンタルサーバーが用意してくれているphpMyAdminでは容量が大きくてインポートが出来ませんでした。<br />自社で管理しているサーバーであればコマンド一発で難なく出来るのですが、レンタルサーバーなものでコマンドも使えない、php.iniの値も変えれないということでどうした物かという状況になりました。<br />困ってググッてみたらBigDumpという便利そうなものを発見！！<br />詳しくは<a href="http://d.hatena.ne.jp/istwar/20101019/1287505139">http://d.hatena.ne.jp/istwar/20101019/1287505139</a>を見てもらった方が早いので説明は書かないですけど、とにかくPHPファイル1つでインポートが出来ちゃうのでどんなサーバー相手でもへっちゃらというのは素晴らしい！！<br />すごい重宝するので皆さんも是非使ってみてください。<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>TCPDFでセキュリティー設定をしたPDFを作る</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/06/tcpdfpdf.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.142</id>

    <published>2011-06-23T12:31:29Z</published>
    <updated>2011-06-24T02:55:21Z</updated>

    <summary>この前、閲覧、印刷のみできる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[この前、閲覧、印刷のみできるPDFて作れる？<div>という需要があったので色々と調査してみた。（しかもPHP４で）</div><div><br /></div><div>最初はTCPDF無理やと思って、FPDFとかで試していたのですが、</div><div>実はPDF4バージョンもあることがわかった。</div><div><br /></div><div><a href="http://sourceforge.net/projects/tcpdf/files/">TCPDFダウンロードはここ</a></div><div><br /></div><div>今回は、</div><div>PDFで「印刷禁止」「文字等コピー禁止」「編集禁止」「パスワード」「有効期限」「ローカルPCで開くの禁止」を</div><div>テストしてみました。</div>]]>
        <![CDATA[<b>印刷禁止、文字等コピー禁止、編集禁止、パスワード</b>
<pre class="php" name="code">// PDFオブジェクト作成
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// 第１引数
// print：印刷禁止
// copy：文字等コピー禁止
// modify：編集禁止
// 第２引数　閲覧パスワード
// 第３引数　セキュリティ変更パスワード（引数なしはランダムパスワード）
$pdf-&gt;SetProtection(array('print', 'copy', 'modify'), 'password', 'password2');
// フォント設定
$pdf-&gt;SetFont('arialunicid0', '', 16);
// 新規ページ作成
$pdf-&gt;AddPage();
// 文字表示
$pdf-&gt;Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0);
// PDF出力
$pdf-&gt;Output('pdf_name.pdf', 'I');
</pre>

<div><b>有効期限</b></div>
<pre class="php" name="code">// PDFオブジェクト作成
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// フォント設定
$pdf-&gt;SetFont('arialunicid0', '', 16);
// 新規ページ作成
$pdf-&gt;AddPage();
// 文字表示
$pdf-&gt;Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0);
// javascript設定
$script = "theDay = new Date(2011, 6 - 1, 15, 0, 0, 0);\n";
$script .= "now = new Date();\n";
$script .= "if (theDay &lt; now)\n";
$script .= "{\n";
$script .= "this.closeDoc(true);\n";
$script .= "}\n";
$pdf-&gt;IncludeJS($script);
// PDF出力
$pdf-&gt;Output('pdf_name.pdf', 'I');
</pre>
<div><b>ローカルPCで開くの禁止</b></div>
<pre class="php" name="code">// PDFオブジェクト作成
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// フォント設定
$pdf-&gt;SetFont('arialunicid0', '', 16);
// 新規ページ作成
$pdf-&gt;AddPage();
// 文字表示
$pdf-&gt;Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0);
// javascript設定
$script  = "cdata = \"http://xxxxxxxx/sample/tcpdf/tcpdf_test.php\";\n";
$script .= "var urldata = this.path;\n";
$script .= "var f = this.getField(\"ooi\");\n";
$script .= "if (urldata != cdata) { \n";
$script .= "this.closeDoc(true);\n";
$script .= "} \n";
$pdf-&gt;IncludeJS($script);
// PDF出力
$pdf-&gt;Output('pdf_name.pdf', 'I');
</pre>
<div>「印刷禁止」「文字等コピー禁止」「編集禁止」「パスワード」はテストした数種類のPDFビューアーできちんと動くのですが、</div>
<div>「有効期限」「ローカルPCで開くの禁止」はjavascriptで動いてるのでjavascriptが効かないビューアーやavascriptを動かない設定にしてしまえばPDFは見れてしまいます。</div><div><br /></div><div>じゃあ、サイト内のブラウザでだけPDFを閲覧、印刷したい時はどうすれば出来るのかと、えていたのですが、ブラウザからPDFをダウンロードさせないのはかなり難しかったので、ーカルに落としたら見えなくすればいいと思いました。</div><div><br /></div><div>まず、「編集禁止」「文字等コピー禁止」「ローカルPCで開くの禁止」を設定します、の時にPDFの1番上にPDF全体を覆うPDFのフォームを設置して、たの文字を見えなくします。</div><div>それで、サイト内の指定したURLの時だけ、jacascriptでPDFの1番上のPDF全体を覆うPDFのフォームを表示にします。</div><div><br /></div><div>こうすることで、ローカルに落とした時はPDFを開いても真っ白、フォームのエレメント削除も編集不可なので、削除できない！</div><div>よし！閲覧の制限は完璧と思ったのですが、刷するとフォーム無視されて、下の文章だけ印刷されてしまいました。</div><div><br /></div><div>この後色々模索したんですが、いい解決方法見つからず、</div><div>とりあえず、「印刷禁止」にしてしまえばブラウザ内閲覧専用PDFは作れます。</div><div><br /></div><div>まあ、一応実用性は多少あるんじゃないかと。</div><div><br /></div><div>以下、ブラウザ内閲覧専用PDFコードです。</div>
<pre class="php" name="code">// PDFオブジェクト作成
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// セキュリティ設定
$pdf-&gt;SetProtection(array('print', 'copy', 'modify'), '', 'password2');
// フォント設定
$pdf-&gt;SetFont('arialunicid0', '', 16);
// 新規ページ作成
$pdf-&gt;AddPage();
// 文字表示
$pdf-&gt;Write(0, "表示したい文字", '', 0, 'L', true, 0, false, false, 0);
// 最前面のマスク
$pdf-&gt;TextField('mask', 210, 297, array(), array(), 0, 0);
// javascript設定
$script  = "cdata = \"http://xxxxxxxx/sample/tcpdf/tcpdf_test.php\";\n";
$script .= "var urldata = this.path;\n";
$script .= "var f = this.getField(\"mask\");\n";
$script .= "if (urldata != cdata) { \n";
$script .= "f.display = display.visible; \n";
$script .= "this.closeDoc(true);\n";
$script .= "} else { \n";
$script .= "f.display = display.hidden; \n";
$script .= "}\n"; 
$pdf-&gt;IncludeJS($script);
// PDF出力
$pdf-&gt;Output('pdf_name.pdf', 'I');
</pre>]]>
    </content>
</entry>

<entry>
    <title>androidアプリをEclipseで作成しました。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/06/androideclipse.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.141</id>

    <published>2011-06-22T05:30:46Z</published>
    <updated>2011-06-22T06:53:48Z</updated>

    <summary>◎Android開発準備1.JDK（Java Development Kit）の...</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[<div>◎Android開発準備</div><div>1.JDK（Java Development Kit）のセットアップ</div><div>&nbsp; jdk-6u25-windows-i586.exeをインストールしました。</div><div>2.Android SDK（Software Development Kit）のセットアップ</div><div>&nbsp; android-sdk_r10-windows.zipをインストールしました。</div><div>3.Eclipse のセットアップ</div><div>&nbsp; eclipse-java-helios-SR2-win32.zipをインストールし、</div><div>&nbsp; 日本語化で、pleiades_1.3.2.zipをインストールしました。</div><div>◎補足</div><div>Android SDKで、インストール後エミュレータを動作させようとすると、</div><div>adb.exe が見つからないとエラーになってしまいます。</div><div>そこで、platform-tools にあるadb.exeとAdbWinApi.dllを tools フォルダに</div><div>コピーするとエミュレータが正常に動作します。</div><div><br /></div><div>◎サンプルアプリの作成</div><div>Buttonを押したら、TextViewに会社が表示され、editTextに奥進システムが表示し、</div><div>Button名を表示に変更するアプリを作成してみましょう。</div><div>１．「ファイル」メニュー＞新規＞プロジェクトを選択する。</div><div>２．新規プロジェクトのダイアログが表示する。</div><div>　　AndroidのAndroidプロジェクトを選択し、「次へ」をクリックする。</div><div>３．プロジェクト名：hellooku</div><div>&nbsp; &nbsp; 【内容】</div><div>　　「ワークスペース内に新規プロジェクトを作成」を選択する。</div><div>　　「デフォルト・ロケーションを使用」をチェックする。</div><div>　　「ビルドターゲット」Android2.2をチェックする。</div><div>　　アプリケーション名：Hellooku</div><div>　　パッケージ名：jp.co.okushin.android.hellooku</div><div>　　Create Activity：HellookuActivity</div><div>　　Min SDK Version：8</div><div>　　に設定して「完了」をクリックする。</div><div><div>４．レイアウトの作成</div><div>　　hellooku/res/layout/main.xmlを編集します。</div><div>　　上記ファイルをクリックすると、Graphical Layoutタブが出てきますので、</div><div>　　そこで画面レイアウトを作成します。TextViewを配置して、Plain Text(editText)を配置して、</div><div>　　Buttonを配置します。ここで、main.xmlを保存しますが、</div><div>　　これだけでは、配置した部品にIDが振られていない状態となり、</div><div>　　実行しようとしても実行時にエラーとなります。</div><div>　　そこで、main.xmlを修正した場合は、プロジェクト-&gt;プロジェクトのビルドを実行してください。</div><div>　　この操作により、　hellooku/gen/jp.co.okushin.android.hellooku/R.javaのIDが自動で生成されます。</div></div><div><br /></div>]]>
        <![CDATA[hellooku/res/layout/main.xml
<pre class="javascript" name="code">
＜?xml version="1.0" encoding="utf-8"?>
＜LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
＜TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
＜TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content">＜/TextView>
＜EditText android:layout_height="wrap_content" android:layout_width="match_parent" android:id="@+id/editText1">
    ＜requestFocus>＜/requestFocus>
＜/EditText>
＜Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content">＜/Button>
＜/LinearLayout>
</pre>
５．ソースプログラムの編集
hellooku/src/jp.co.okushin.android.hellooku/HellookuActivity.java
<pre class="javascript" name="code">package jp.co.okushin.android.hellooku;

import jp.co.okushin.android.hellooku.R;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class HellookuActivity extends Activity {
	TextView textView1;
	EditText editText1;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        textView1 = (TextView)this.findViewById(R.id.textView1);
        editText1 = (EditText)this.findViewById(R.id.editText1);
        
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
        	@Override
        	public void onClick(View v) {
        		Button button = (Button) v;
                button.setText("表示");
                textView1.setText("会社");
        		editText1.setText("奥進システム");
        	}
        });
    }
}
</pre>]]>
    </content>
</entry>

<entry>
    <title>AndroidアプリをApp Inventorで作成してみました。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/06/androidapp-inventor.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.138</id>

    <published>2011-06-09T04:41:52Z</published>
    <updated>2011-06-09T04:43:54Z</updated>

    <summary>【環境】OS Windows 7 professional【準備】（１）JDKの...</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[<div>【環境】</div><div>OS Windows 7 professional</div><div>【準備】</div><div>（１）JDKのインストール</div><div>1.ORACLEの公式ページからjdk-6u25-windows-i586.exeをダウンロードする。</div><div>2.jdk-6u25-windows-i586.exeを実行してJDKをインストールします。</div><div>3.Windows7の環境変数PathにC:\Program Files\Java\jdk1.6.0_25\binを追記します。</div><div>4.Windows7の環境変数JAVA_HOMEを新たに作成し、C:\Program Files\Java\jdk1.6.0_25を作成します。</div><div>（２）App Inventorのインストール</div><div>1.Windows Setup - App Inventor for Android よりappinventor_setup_installer_v_1_2.exeをダウンロードします。</div><div>2.appinventor_setup_installer_v_1_2.exeを実行してApp Inventorをインストールします。</div><div>3.インストールが完了しましたら、http://appinventor.googlelabs.com/へアクセスします。</div><div>　表示されない場合は、更新を押してください。※Gmailのアカウントが必要です。</div><div>4.DesignerとBlocks Editorにてプログラムを作成します。（雑誌や、チュートリアルのサンプル参考）</div><div>5.プログラムの作成が完了したら、New emulatorでAndroidエミュレータを起動</div><div>6.Connect to Deviceで立ち上がっているAndroidエミュレータを選択すると、プログラムがエミュレータにインストールされます。</div><div>7.動作確認して完了となりました。</div><div>（３）実機へインストール</div><div>1.HTC Desire SoftBank X06HTへアプリケーションをインストールしました。</div><div>2.HTC Desire SoftBank X06HTの設定として、設定-&gt;アプリケーション-&gt;不明な提供元をチェックします。</div><div>　また、設定-&gt;アプリケーション-&gt;開発-&gt;USBデバッグをチェックします。</div><div>3.HTC Desire SoftBank X06HTの公式サイトより、HTC Sync.exeをダウンロードし、インストールします。</div><div>4.App InventorのDesignerの右にあるpackage for Phoneをクリックし、Download to this Computerを選択します。</div><div>　xxxxxx.apkファイルが作成されます。</div><div>5.HTC syncで、[アプリケーションインストーラ]-&gt;[次へ]で、[参照]からインストールするapkファイルを選択します。</div><div>6.これで実機で動作すれば完成になります。</div><div>【感想】</div><div>App Inventorは取っ付き易いツールです。お試しなアプリケーション作成には、丁度よいツールだと思います。</div><div>しかし、もっと検証が必要だとおもいますが、業務アプリを作成するのには向いていない感じがします。</div><div><br /></div> ]]>
        
    </content>
</entry>

<entry>
    <title>DB暗号化を調べてみた</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/06/db.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.136</id>

    <published>2011-06-02T05:12:40Z</published>
    <updated>2011-06-23T12:30:57Z</updated>

    <summary>DBに保存する時に個人情報をそのまま保存するのは、万が一DBの情報が流出した時に...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="MySQL" scheme="http://www.sixapart.com/ns/types#category" />
    
        <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[DBに保存する時に個人情報をそのまま保存するのは、万が一DBの情報が流出した時にまずいので、色々と調べてみました。<div><br /></div><div>まず、パスワードはphpのmd5でハッシュ化して保存すれば、復号できないのでOK、パスワードを忘れた場合は、新しいパスワードをランダム生成。</div><div><br /></div><div>次に、暗号・復号するデータ。</div><div>氏名やメールアドレスなど、</div><div>php側で暗号・復号する方法と、DB側で暗号・復号する方法があります。（ハードディスク自体暗号の方法もありますが）</div><div>で、問題は、LIKE検索とINDEXでした。</div><div>基本、暗号化して保存すると上記2点が出来なくなることが問題です。</div><div><br /></div><div>その点も踏まえてどんな方法があるか調査してみました。</div><div><br /></div><div>とりあえず今回は</div><div>php mysqlの環境で出来ればということで・・・</div>]]>
        <![CDATA[<font class="Apple-style-span" style="font-size: 1em; "><b>php側で暗号化・復号</b></font><div>・mcrypt拡張モジュールを使った暗号化</div><div>・openssl拡張モジュールを使った暗号化</div><div><br /></div><div>linuxにパッケージをインストールする必要がある。レンタルサーバーで使用できない場合があるので今回は調査しませんでした。</div><div><br /></div><div>・PEAR::Crypt_Blowfishを使った暗号化</div><div><br /></div><div>これはレンタルサーバーでも設置できるので、調査しました。</div><div>8バイトごとに暗号化していくみたいで足りない場合は￥０が後ろに足されます。なので、復号時はrtrimで後ろの￥０を取る必要あり。</div><div>完全一致検索では、検索でき、INDEXも効きますが、LIKE検索は無理でした。（8バイトごとに暗号化してるので当然ですね・・・）</div><div>メールアドレス等の完全一致検索しかしないフィールドであれば有効です。</div><div><br /></div><div>
下記サンプルコード
<pre class="php" name="code">// Crypt_Blowfish 暗号化キーと初期化ベクトル(8byte文字列)
define('CBF_KEY' , 'abc' ); 
define('CBF_IV' , '12345678' );

// 暗号化---------------------------
// CBCにて暗号化（キーと初期化ベクトルを引数に与える）
$blowfish = Crypt_Blowfish::factory( 'cbc', CBF_KEY, CBF_IV );
$address = $blowfish-&gt;encrypt( $address );
// このままだとバイナリデータなのでbase64で文字列化
$address = base64_encode( $address );

// 復号---------------------------
// 復号したいパスワード
$address = base64_decode( $address); // ←バイナリへ戻す
// CBCにて復号化（キーと初期化ベクトルを引数に与える）
$blowfish = Crypt_Blowfish::factory( 'cbc', CBF_KEY, CBF_IV );
$address = rtrim($blowfish-&gt;decrypt( $address ),"\0");

// 検索は暗号化して検索してください。
</pre>

</div><div><br /></div><div><br /></div><div><b>DB側で暗号化・復号</b></div><div>MySQLのAES_ENCRYPT・AES_DECRYPT</div><div><br /></div><div>MySQL標準でついている暗号化関数です。</div><div>AES_ENCRYPT・AES_DECRYPTだけでは、バイナリになってしまうのでHEXという関数で16進数化して保存します。</div><div>LIKE検索が出来ますが、DB内部で復号して検索してるみたいで、INDEXは効きませんでした。</div><div>氏名や住所等のフィールドで有効だと思います。</div><div><br /></div><div>下記サンプルコード
<pre class="php" name="code">// 「ans_key」は任意の暗号キー
// 登録する時
INSERT INTO users (address) values (HEX(AES_ENCRYPT('大阪市','ans_key')));

// 検索する時
SELECT 
  *,AES_DECRYPT(UNHEX(address),'ans_key') as ad FROM users 
WHERE
  AES_DECRYPT(UNHEX(address),'ans_key') LIKE '大阪%';

</pre>

</div><div><br /></div><div><br /></div><div>今回、色々調査してみましたが、LIKE検索、INDEX両方とも使えるのは見つけられませんでした。何かいい方法ないかな?（PEAR::Crypt_Blowfishで文字列1文字ずつやればLIKE検索できるだろうけど、文字数が多くなりすぎるし・・・）</div>]]>
    </content>
</entry>

<entry>
    <title>スマートフォンに関係する開発をはじめて試してみました。</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/06/post-9.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.135</id>

    <published>2011-06-01T23:48:07Z</published>
    <updated>2011-06-09T04:41:28Z</updated>

    <summary>【スマートフォンの標準ブラウザーの動作検証】どのような開発の方法があるか調査しま...</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[<div>【スマートフォンの標準ブラウザーの動作検証】</div><div>どのような開発の方法があるか調査しました。</div><div><br /></div><div>以下のような方法で実際に表示させてみました。</div><div>（１）jQuery Mobileとsencha Touchです。</div><div>jQuery Mobileは、jQueryのプラグインです。オープンソースで提供されています。</div><div>sencha Touchは、JavaScriptフレームワークです。</div><div>（２）検証</div><div>jQuery Mobileは、サンプルのHTMLを作成して公開し、android端末とiphone4端末で動作を確認しました。</div><div>sencha Touchは、サンプルのJavaScriptが用意されていたためそのまま公開して、android端末とiphone4端末で動作を確認しました。</div><div>共に、標準のブラウザーでは、問題なく動作しました。しかし、Androidのfirefoxでは、うまく動きませんでした。</div><div>主に確認したかったのは、チェックボックス、ラジオボタン、セレクトボックスがどのように動作するかでした。</div><div>スマートフォンらしい？動作をしていました。</div><div>（３）感想</div><div>もうすこし、詳しく検証する必要はあると思うのですが、ブラウザーの表示内容がスマートフォンらしく表示できるので、利用を検討したいと考えています。</div><div>ただ、標準のブラウザーしか、この２つは、動作しないので、Androidなどで、firefoxなどを利用されている場合は、</div><div>パソコン用のページを見るなりして頂かないといけない点が残念なところでした。</div><div><br /></div><div>【スマートフォンエミュレーターのインストール】</div><div>残念ながらiphoneのエミュレーターは、見つかっていません。</div><div>androidは、SDKの中にエミュレーターが含まれているので、それを動作して上記の検証も行いました。</div><div>●androidエミュレーターのインストールと起動方法</div><div>１．まず、http://developer.android.com/sdk/index.html</div><div>より、android-sdk_r11-windows.zip を入手します。</div><div>２．android-sdk_r11-windows.zipを解凍します。</div><div>３．解凍した、android-sdk_r11-windows\android-sdk-windowsへ移動します。</div><div>４．SDK Manager.exeを実行します。</div><div>５．立ち上がったAndroid SDK and AVD Managerの左の一覧からAvailable packagesを選択し、</div><div>右上部のAndroid Repositoryにチェックを入れInstall Selectedボタンを押下します。</div><div>数十分インストールが動作します。</div><div>６．Android SDK and AVD Managerの左の一覧からInstalled packagesを選択して、Update All...ボタンを押下し、</div><div>ダイアログが表示されたPackagesをInstallします。</div><div>７．Android SDK and AVD Managerの左の一覧からVirtual devicesを選択して、New...ボタンを押下し、</div><div>Create new Android Virtual Device（AVD)が表示します。そのNameとTargetを決定して、Create AVDを押下します。</div><div>８． Android Virtual Devices Managerダイアログで確認し、OKを押下します。</div><div>９．Android SDK and AVD Managerの左の一覧からAVD Nameが指定したものを選択して、Start...を押下します。</div><div>１０．Launch Optionsダイアログが表示されますので、Launchを押下します。するとエミュレーターが表示します。</div><div>（１）検証</div><div>このエミュレータについているブラウザーでも、上記jQuery Mobileとsencha Touchは問題なく動作しました。（ローカル検証用に利用可能です。）</div><div>（２）感想</div><div>エミュレータは縦に表示されるので、横にした時の動作などは、確認できませんでした。（まだ、調査が足りないかもしれませんが。。。）</div><div>デバックするには、十分使えるエミュレータだと思います。今度は、Androidアプリを試してみたいです。</div><div><br /></div> ]]>
        
    </content>
</entry>

<entry>
    <title>Subversion（サブバージョン）でEUC-JPのソースを管理する</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/05/subversioneucjp.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.134</id>

    <published>2011-05-31T02:45:12Z</published>
    <updated>2011-05-31T03:14:04Z</updated>

    <summary>Subversionを使用してバージョン管理しているのですが、EUC-JPのソー...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.okushin.co.jp/kodanuki_note/">
        <![CDATA[Subversionを使用してバージョン管理しているのですが、EUC-JPのソースを管理しようとした時、ソースの差分を見たら文字化けしてしまいます。<br />これはSubversionの標準ビューアのTortoiseMergeがEUC-JPに対応していないという事らしいです。<br />ではどうすればいいかなとググッてみたらWinMergeというビューアを入れてSubversionに登録してあげると良いらしい・・・<br />WinMergerは<a href="http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html">http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html</a>から自分の環境に合ったバージョンを落としてきます。<br />落としたZIPファイルを解答すると中にexeファイルが居るのでこれを使ってあげるだけです。<br />Subversionに紐付けるのは「TortoiseSVN→設定→外部プログラム→差分ビューア」でプログラムの指定が出来るところで外部を指定してパスに先ほど落としてきたWinMergeのexeファイルまでのパスを指定するだけでEUC-JPのファイルでもきちんとバージョン管理が出来るようになりました。<br /><br />個人的にはTortoiseMergeよりWinMergeの方が見やすくてGOODですね！！<br /> ]]>
        
    </content>
</entry>

<entry>
    <title>ブラウザ・IEの画像キャッシュをなんとかする</title>
    <link rel="alternate" type="text/html" href="http://www.okushin.co.jp/kodanuki_note/2011/05/ie.html" />
    <id>tag:www.okushin.co.jp,2011:/kodanuki_note//5.130</id>

    <published>2011-05-18T23:34:57Z</published>
    <updated>2011-05-19T01:19:30Z</updated>

    <summary>画像をアップするシステムを作ってる時にかなり邪魔なブラウザの画像のキャッシュ。画...</summary>
    <author>
        <name>編集者</name>
        <uri>http://www.okushin.co.jp</uri>
    </author>
    
        <category term="HTML" scheme="http://www.sixapart.com/ns/types#category" />
    
        <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[画像をアップするシステムを作ってる時にかなり邪魔なブラウザの画像のキャッシュ。<div>画像をアップしなおしたのにブラウザで確認すると前の画像が！！</div><div>そんな時の解決方法をまとめてみました。</div><div><br /></div><div>テストしたのは</div><div>IE6,8</div><div>Firefox4</div><div>Chrome11</div><div><br /></div><div>テストファイルはphpです。</div>]]>
        <![CDATA[<div>更新ボタンは押さずにURLをたたいてページを再表示させます。</div>
<div><br /></div>
1.特にmetaタグ等を書かずに画像変える
<div>　IE6,8：変化なし</div><div>　firefox4：新しい画像表示される</div>
<div>　chrome11：新しい画像表示される</div><div><br /></div>
<div>2.下記のmetaタグ追加して画像かえる</div>
<pre class="php" name="code">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="Expires" content="0">
</pre>
<div><div>　IE6,8：変化なし</div><div>　firefox4：新しい画像表示される</div><div>　chrome11：新しい画像表示される</div></div><div><br /></div>
<div><div>3.下記のheader追加して画像かえる</div>
<pre class="php" name="code">
header("Content-Type: text/html; charset=UTF-8");
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
header("Last-Modified: ". gmdate("D, d M Y H:i:s"). " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
</pre>
<div><div>　IE6,8：変化なし</div><div>　firefox4：新しい画像表示される</div><div>　chrome11：新しい画像表示される</div></div></div><div><br /></div>
<div><div>4.下記の.htaccess追加して画像かえる</div>
<pre class="php" name="code">
<Files ~ "\.(jpg|gif|png)$">
Header set Pragma no-cache
Header set Cache-Control no-cache
</Files>
</pre>
<div><div>　IE6,8：変化なし</div><div>　firefox4：新しい画像表示される</div><div>　chrome11：新しい画像表示される</div></div></div><div><br /></div>
<div>5.画像に引数をつけ画像をかえる</div>
<pre class="php" name="code">
<img src="img/photo.jpg?20110519100000" alt="" width="100" height="100" />
</pre>
<div><div><div><div>　IE6,8：新しい画像表示される</div><div>　firefox4：新しい画像表示される</div><div>　chrome11：新しい画像表示される</div></div></div></div><div><br /></div>
<div>5番だと?の後ろを乱数や現在時間にして毎回画像のパスを変えるようにしてやればブラウザは新しい画像ファイルだと認識するのでページを読み込むたび最新の画像が表示されます。</div><div>しかし、すべての画像にこの引数をつけてしまうと全画像が毎回リクエストされるので読み込みが遅くなります。</div><div><br /></div><div>適度にキャッシュを使って、新しい画像を表示させるには、画像アップ処理の時、DBに毎回ユニークなファイル名を振る必要があるのかなと思います。</div><div>photo.jpgではなくphoto20110519100000.jpgやphoto.jpg?20110519100000などのファイル名をDBに保存</div><div>（上記は現在時間を後ろにつけてます）</div><div><br /></div>]]>
    </content>
</entry>

</feed>

