【Javascript】GoogleChartsのCandlestickChartで遊んでみた。


GraphApiの中でも異彩を放つCandlestickChartがどの程度カスタマイズできるのか試してみた。

まずは公式リファレンスをざっと読んでみる。

https://developers.google.com/chart/interactive/docs/gallery/candlestickchart

さらっと目を通しただけでもかなりの数のプロパティが確認できる。これはワクテカがとまらない。

ということで網羅的にいろんなオプションをいじってグラフ生成スクリプトを組んでみた。

まずは必要なライブラリをヘッダー内で読みこむ。
※グラフ描画領域の幅を取得するのにjQueryを使用しているので、ここではjQueryも読み込む。

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="//www.google.com/jsapi">
<script type="text/javascript" src="//www.google.com/jsapi"></script><script type="text/javascript">
	google.load('visualization', '1', {packages: ['corechart']});
</script>

そして要のスクリプト部分は以下のようにしてみた。

<script type="text/javascript">
function drawVisualization() {
	var width = $('#chart_div').width()-70;
	var data = google.visualization.arrayToDataTable([["09-01",150,150,150,150],["09-02",150,150,150,150],["09-03",150,150,150,150],["09-04",150,150,150,150],["09-05",150,150,150,150],["09-06",150,150,150,150],["09-07",150,150,150,150],["09-08",150,150,150,150],["09-09",150,150,150,150],["09-10",150,150,150,150],["09-11",150,150,150,150],["09-12",150,150,150,150],["09-13",150,150,150,150],["09-14",150,150,150,150],["09-15",150,150,150,150],["09-16",150,150,150,150],["09-17",150,150,150,150],["09-18",150,150,150,150],["09-19",150,150,150,150],["09-20",150,150,150,150],["09-21",150,150,150,150],["09-22",150,150,150,150],["09-23",150,150,150,150],["09-24",150,150,150,150],["09-25",150,150,150,150],["09-26",150,150,150,150],["09-27",150,150,150,150],["09-28",150,150,150,150],["09-29",150,150,150,150],["09-30",150,150,150,150]], true);
	var options = {
		legend:'none',
		colors:['#7fff00'],
		fontName:'meiryo',
		animation:{
			duration:'600',
			easing:'out'
		},
		backgroundColor:{
			fill:'#000',
			stroke:'#7fff00',
			strokeWidth:'5'
		},
		candlestick:{
			hollowIsRising:true,
			fallingColor:{
				fill:'#FFF',
				stroke:'#7fff00',
				strokeWidth:'1'
			},
			risingColor:{
				fill:'#000',
				stroke:'#7fff00',
				strokeWidth:'1'
			}
		},
		chartArea:{
			left:'50',
			top:'20',
			width:width,
			height:'90%'
		},
		vAxis:{
			baseline:'0',
			baselineColor:'#FFF',
			gridlines:{
				color:'#444',
				count:'10'
			},
			minorGridlines:{
				color:'#222',
				count:'3'
			},
			textStyle:{
				color:'#FFF',
				fontSize:'12'
			},
			title:'Price of a stock',
			titleTextStyle:{
				color:'#FFF',
				fontSize:'12',
				bold:false,
				italic:false
			}     
		},
		hAxis:{
			textStyle:{
				color:'#FFF',
				fontSize:'12'
			},
			maxAlternation:'1',
			slantedText:false
		},
		tooltip:{
			textStyle:{
				color:'#333',
				fontSize:'12',
				bold:false
			}
		}
	};
	var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div'));
	var button = document.getElementById('b1');
	var drawChart = function(){
		button.disabled = true;
		google.visualization.events.addListener(chart, 'ready', function(){
			button.disabled = false;
		});
		chart.draw(data, options);
	};
	button.onclick = function(){
		var prevClose = null;
		var newOpen = null;
		var newClose = null;
		var newHigh = null;
		var newLow = null;
		for(i = 0; i < data.getNumberOfRows(); i++){
			newOpen = (prevClose) ? prevClose : Math.floor(Math.random()*300);
			newClose = Math.floor(Math.random()*300);
			newHigh = newOpen + Math.floor(Math.random()*100);
			newlow = Math.floor(Math.random()*newClose);
			prevClose = newClose;
			data.setValue(i, 1, newlow);
			data.setValue(i, 2, newOpen);
			data.setValue(i, 3, newClose);
			data.setValue(i, 4, newHigh);
		}
		drawChart();
	}
	drawChart();
}
google.setOnLoadCallback(drawVisualization);
</script>

マークアップは以下の通りグラフ描画領域とトリガーのみ。

<div id="chart_div" style="width: 100%; height: 500px;"></div>
<button id="b1" style="margin-top:20px">Randomize</button>

そして上記のスクリプトを実行すると以下のようになる。

これは激熱。グラフAPIくっそ面白い!笑

 

【jQuery】左右でスライド開閉するメニューを実装する。

jQueryプラグインの「Sidr」を使用。

http://www.berriart.com/sidr/

まずは上記URLからプラグインをダウンロード。

展開して出てきたCSS及びJSをヘッダー内で読み込む。

■CSS
※「Dark」、「light」のいずれかを読み込めばよい

<!-- ダークカラーベース -->
<link rel="stylesheet" type="text/css" href="jquery.sidr.dark.css" />
<!-- ライトカラーベース -->
<link rel="stylesheet" type="text/css" href="jquery.sidr.light.css" />

■Javascript
※ヘッダー内かボディタグ終了直前で読み込む

<script type="text/javascript" src="jquery.sidr.min.js"></script>

■マークアップ

<div id="sidr">
  <h3>メニューヘッダー</h3>
  <ul>
    <li><a href="javascript:void(0)">メニュー</a></li>
    <li class="active"><a href="javascript:void(0)">メニュー</a></li>
    <li><a href="javascript:void(0)">メニュー</a></li>
    <li><a href="javascript:void(0)">メニュー</a></li>
    <li><a href="javascript:void(0)">メニュー</a></li>
    <li><a href="javascript:void(0)">メニュー</a></li>
  </ul>
</div>

あとはメニューを開閉するためのトリガーを任意の要素に結び付けてあげればOK。

以下トリガーの設定例。

<button type="button" id="sidr-trigger">Menu</button>

例えば上記のようなIDを持つボタンをトリガーに設定したい場合は下記のような感じ。

<script>
$(function(){
	$('#sidr-trigger').sidr();
})
</script>

これでボタンに対してトリガーが割り当てられる。めっちゃ簡単。
加えてsidr()関数にオプションを渡すことでメニューの開閉速度などを好みに設定することが可能。

$('#sidr-trigger').sidr({
	// 開閉スピード
	speed:500,
	// メニューの位置(left or right)
	side:'right'
	// jQueryのセレクターを指定可能
	source:'#selector'
});

sourceに関数を渡すとコールバックとして実行してくれたりもする。
その他のパラメーターは公式サイトを参照されたし。

 

【PHP】ファイルのmimeTypeを取得する。

今まではmime_content_type()を使用してたけど、非推奨らしいので推奨メソッドで取得する方法のめも。

function getMimeType($filePath) {
	// ファイルインフォリソースを作成
	$finfo = finfo_open(FILEINFO_MIME_TYPE);
	// mimeTypeを取得
	$mimeType = finfo_file($finfo, $filePath);
	// リソースをクローズ
	finfo_close($finfo);
	// 値を返却する
	return $mimeType;
}

finfo_open()なんて初めて聞いた件。笑

 

【PHP】自分用CSV読み込みメソッド。

基本的にRFC4180準拠のCSVファイル用。文字コードはSJISを想定、区切り文字はカンマ、文字列は必ず「”」で囲うことを前提とする。
※文字列がマルチバイト、かつ「”」で括られていないカラムは場合文字化けするので注意。

function importCsv($filePath) {
	// 返却用の入れ物を用意
	$data = array();
	// ファイルポインタを読み取り専用でオープン
	$fp = fopen($filePath, 'r');
	// ロケールをja_JPにセット(これをしないとマルチバイトを読み込んだ際に文字化けするので注意)
	setlocale(LC_ALL, 'ja_JP');
	// ファイルの先頭から終端まで読み込む
	while(!feof($fp)){
		$line = fgetcsv($fp);
		if($line) {
			// 読み込むと同時に文字コードをSJISから現在の設定値へ変換する
			foreach($line as $k => $v) $line[$k] = mb_convert_encoding($v, mb_internal_encoding(), 'SJIS');
			$data[] = $line;
		}
	}
	// 値を返却する
	return $data;
}

 

【PHP】自分用CSV出力メソッド。

メモ

function exportCsv($fileName, $data, $header = null) {
	// headerがあれば先頭行に追加
	if(!is_null($header)) array_unshift($data, $header);
	// tmpファイルストリームをオープン
	$fp = tmpfile();
	// データの書き込み
	foreach($data as $v) fputcsv($fp, $v, ',', '"');
	// ファイルポインタを先頭へ移動
	rewind($fp);
	// ストリームを文字列に読み込む
	$csv = stream_get_contents($fp);
	// 文字コードをSJISにコンバート(excelで開いた際の文字化け対策)
	$csv = mb_convert_encoding($csv, 'SJIS', mb_internal_encoding());
	// ファイルポインタを閉じる
	fclose($fp);
	// 指定したファイル名の拡張子やパスを取り除く
	$fileName = basename($fileName);
	// ダウンロード用のヘッダーを出力
	header('Content-Disposition:attachment; filename="'.$fileName.'.csv"');
	header('Content-Type:application/octet-stream');
	header('Content-Length:'.strlen($csv));
	echo $csv;
	die();
}

$fileName:保存したいファイル名を指定
$data:CSVファイルに書き込みたいデータを連想配列で指定
$header:先頭行に配置するデータを配列で指定(1行分)

以下渡すデータの例。

// ヘッダー(先頭行)
$header = array(
	'name_1',
	'name_2',
	'name_3',
	'name_4',
	'name_5',
);
// データ部分(基本foreachで回す)
$data[] = array(
	'col_data_1',
	'col_data_2',
	'col_data_3',
	'col_data_4',
	'col_data_5'
);
$data[] = array(
	'col_data_1',
	'col_data_2',
	'col_data_3',
	'col_data_4',
	'col_data_5'
);

 

【Eclipse】ファイル検索後、一致箇所を一括で置換する方法。

「Ctrl + H」でファイルを検索した後に、文字列をまとめて置換したかったので調べてみたら意外と簡単。

1, ファイルサーチで探したい文字列を検索

2, 右側に出てくる検索結果窓(Searchタブ)内で右クリック

3, コンテキストメニューの「Replace All…」を選択

ec

4, 「Replace:」の欄に置換対象文字列がセットされているので確認した後、「With:」の欄に置換文字列を入力し「OK」を押す

ec2

5, 全ファイルまとめて一括で置換される

以上で完了。超便利。

 

【jQuery】動的にスクリプトを読み込む方法。

スクリプト実行中にライブラリを動的読み込みしたい時とか。

$.getScript('//example.com/ex.js', function(){
	// 任意のコード
})

$.getScript()を用いることで、外部JSを動的に読み込むことが出来る。第二引数にてコールバックを指定すれば、スクリプトファイルの読み込み完了後に実行してくれるので非常に便利。

 

【PHP】header()関数自分用まとめ。

よく使うレスポンスメモ。

// 301 Moved Permanently
header('Location: http://example.com/', true, 301);

// 302 Found
header('Location: http://example.com/', true, 302);
header('Location: http://example.com/');

// 303 See Other
header('Location: http://example.com/', true, 303);

// 307 Temporary Redirect
header('Location: http://example.com/', true, 307);

// 400 Bad Request
header('HTTP', true, 400);

// 403 Forbidden
header('HTTP', true, 403);

// 404 Not Found
header('HTTP', true, 404);

// 500 Internal Server Error
header('HTTP', true, 500);

// 501 Method Not Implemented
header('HTTP', true, 501);

// 502 Bad Gateway
header('HTTP', true, 502);

// 503 Service Temporarily Unavailable
header('HTTP', true, 503);

// 504 Gateway Time-out
header('HTTP', true, 504);

// 505 HTTP Version Not Supported
header('HTTP', true, 505);

といいつつ後半めったに使わない件。笑