ChartDirector

こんにちは。こんばんは。おはようございます。
Q-39です。お世話になっております。

最近ChartDirectorをはじめました。
なかなかネットに情報がないので、
コメント付きサンプルソースを
備忘録的な感じで残しておきます。



#include "chartdir.h"

void Test(void)
{
  // データの定義
  double Data[] = { 9.5, 8.7, 5.9, 3.7, 1.1, -0.2, -1.6, 1.8, 3.0, 5.6 };

  // 作成するビットマップのサイズを決める
  XYChart *graph = new XYChart(500, 300);

  // ビットマップとプロットエリア(グラフ)の位置関係を決める
  // (プロットエリアのサイズは400×200)
  graph->setPlotArea(50, 50, 400, 200);

  // Y軸のスケール(-5~15で5刻み)
  graph->yAxis()->setLinearScale(-5, 15, 5, 0);

  // X軸のスケール(1~12で2刻み)
  graph->xAxis()->setLinearScale(0, 12, 2, 0);

  // グラフ作成レイヤの作成
  LineLayer *layer = graph->addLineLayer();

  // X軸のデータ範囲を決める(データが10個なので1~10とした)
  layer->setXData(1, 10);

  // グラフのデータを設定(色は赤(RGB))
  layer->addDataSet(10, Data, 0xff0000);

  // ファイルに出力(拡張子で自動判別してくれる)
  graph->makeChart("c:\\temp\\test.png");

  return;
}


こんなグラフが出来上がりです。
グラフの出来上がり

入社のごあいさつ

皆様はじめまして、今年6月に入社しました kmrmshk ともうします。

これまでは主にウェブサイトのコンテンツ制作にかかわることが多く、今は懐かしいフルフラッシュサイトであったり、JavaScriptとCSSを駆使してステートフルなウェブサイト、ウェブアプリの開発に携わらせていただきました。
また、ネイティブアプリ開発にも興味があり、Objective-CやAIRによるiOS/Androidのアプリ開発も行って参りました。

最近は自宅サーバーにてインフラまわりの環境構築や、Node.js、Jenkinsなどを活用した自動化をいろいろ試すのが趣味となっています。さらには、dockerやvagrantによる仮想化技術を活用して効率の良い環境構築方法を探るのも楽しみの一つです。

好きなCMSはMODX、好きなLinuxディストリビューションはDebianです!
最近SublimeText3をメインエディタに鞍替えしました。Sublimergeは神ツールです!
なにとぞよろしくお願い致します!

さて、早速なのですが普段の生活で配列やオブジェクトを操作するとき、処理が地味に面倒なときがあるかと思います。
例えば連想配列に対して、要素だけを取り出してから配列として扱いたい!など・・・

// こんな連想配列を・・・
hash = {
  1: {hoge: "hello"}, 
  2: {hoge: "world"},
  3: {hoge: "!"}
};

// 必要な要素だけ抽出して配列として宣言したり・・・
var props = [];
for(var item in hash){
  var obj = {};
  obj[item] = hash[item];
  props.push(obj);
}
/*
// propsの中身
props = [
  {hoge: "hello"},
  {hoge: "world"},
  {hoge: "!"}
];
*/

// 配列要素を取り出して文字列として操作したいとき
var props = [];
for(var item in hash){
  props.push(hash[item]['hoge']);
}
console.log(props.join(" "));
// [output] hello world !

と、いうことがお料理を作っている最中や、洗濯物を干すときについつい出てくるかと思います。
でも、毎回 for…in でまわすのはちょっと・・・、とか、「hoge」というキー文字列で指定して値取り出すのはイケてないなんて思ってらっしゃることでしょう。

そんな時に、手軽に扱えるユーティリティライブラリ「Lodash.js」というのがあります。
もともとは JavaScript のライブラリとして「Underscore.js」という、これまた便利なオブジェクト操作のユーティリティライブラリがあるのですが、その派生ライブラリとして登場しました。
このライブラリを利用すると、次のように可読性があり、メンテナンス性の高いコードが書けるようになります。

hash = {
  1: {hoge: "hello"}, 
  2: {hoge: "world"},
  3: {hoge: "!"}
};
// 必要な要素だけ抽出して配列として宣言します(lodash版)
var props = _.map(hash, function(item){return item;});
/*
// propsの中身
[
  {hoge: "hello"},
  {hoge: "world"},
  {hoge: "!"}
]
*/

// 配列要素を取り出して文字列として操作したいとき(lodash版)
console.log(_.map(hash, function(item,key){
   return _.chain(item).groupBy().keys().first().value();
}).join(" "));
// [output] hello world !

実装で地味に時間のかかりがちなコレクション処理が、lodash(underscore)によってかなりシンプルで扱いやすいものになるはずです!

この便利なライブラリは、有志によってJavaScript以外の言語でも提供されています。
・PHP 「underscore.php
・Objective-C 「underscore.m
・Python 「underscore.py

RubyやSwiftでは最初からコレクションメソッドが充実しているので、導入しなくても標準で扱えます(さすがRuby・・・)
また、C++では標準テンプレライブラリとして搭載されています。

長文失礼しました。
普段の生活で何らかのご参考になりましたら幸いです。

Vimを全ての開発で利用する

最近、Unityを使ったゲーム案件を担当しているのですが、
クライアントでのC#開発だったり、サーバサイドのPHP, Ruby開発だったりと、
色々な言語を使って同時に開発することが多くなってきています。

◆開発環境の選定問題
Windows開発では、Visual Studio、
Android開発ではAndroid Studio, IntelliJ IDEA, Eclipse、
iOS開発では、xcode、
Unity開発ではMono Develop、
PHP開発ではPHP Stormなどなど、
各種便利なIDEが存在しているのですが、
IDEを行き来した場合の「操作性のズレ」ということに悩まされることが多くなると多います。

そこで、私は以前から「Vim」を開発環境の軸にすることに決めて、Vimのみを使って開発するという一点突破を行っています。

◆統一開発環境Vimにする利点
統一開発環境をVimにする利点として、以下の点が上げられると思います。
・Vimの操作のみ覚えればよい
・クライアントコード↔サーバサイドコードの移動がシームレスに行える
・開発環境を継続的に改善していくことによって、「エンジニアの資産」にできる
・Pluginが多く公開されており、また必要な物は自分で作成することができる

◆私のvim環境
私がどのようにVim環境を改善してきたかは、dotfilesとしてGitHubに軌跡を残してきました。
PHP開発を案件があれば、PHP環境の最適化を行い、
Unity案件があれば、C#の開発環境を最適化してきています。
技術者界隈では、Vimにかぎらずdotfilesのように環境設定を公開することによって、
効率のよい開発環境を共有していくということが最近の主流になっているようです。

以下が私のdotfilesとなっており、シェルスクリプトを実行することによって
新しいマシンや開発サーバを導入したとしても、簡単に最新の開発環境を再現できるようにしています。

https://github.com/akinama/dotfiles

◆おすすめのPlugins
Pluginが入っていない、デフォルトのVimでも問題無く開発できるのですが、
Pluginを入れることによって圧倒的に開発効率を向上できます。
その中から、特に便利だと思われるものを紹介します。
また、Plugin管理にはNeoBundleという仕組みを利用しています。

https://github.com/Shougo/neobundle.vim

・Unite : https://github.com/Shougo/unite.vim
主流のVimの統合インターフェース。
Unite Pluginとして、各種Pluginを導入ことによって、
統合開発環境として利用できるようになります。

・neocomplete : https://github.com/Shougo/neocomplete.vim
コード補完機能。
インテリセンスを利用するためにも利用しています。

・unite-gtags : https://github.com/hewes/unite-gtags
GNU GlobalのタグをUniteから参照する。
GNU Global+Exubarent Ctagsでタグ付けをして開発していますが、
クラス・メソッド・変数をdef/refでジャンプしたりするために利用しています。

・Git-Grutter : https://github.com/airblade/vim-gitgutter
Git管理下のファイルをVim上で変更内容を確認する。
Git管理下のファイルを追加・削除・更新がビジュアル的に常に確認できるようになります。
一瞬でそのファイルのどの部分が現在へ変更されているかを確認するのに便利です。

上記は、よく使うPluginですが、

https://github.com/akinama/dotfiles/blob/master/.vimrc

から、現在利用しているPluginを参照できるので、よければ参考にして下さい。

mPDFで作成したPDFのファイル名がおかしい

PHPで簡単にPDFが作成できる「mPDF」では、作成したPDFをAcrobat readerまたはFirefox等のビューアでブラウザ上に表示させることもできるが、ダウンロードダイアログを表示してPDFファイルをダウンロードさせることもできる。
もちろんPDFファイルのファイル名は指定できるが、場合によってはおかしくなる。

基本的な使い方と問題

mPDFを使用するには、mPDFを任意のディレクトリに設置し、呼び出し元でincludeして下記の様に処理する。

include('./MPDF57/mpdf.php'); // パスは環境に応じて変える

$mpdf = new mPDF('ja', 'A4'); // 出力ファイル設定
$mpdf->writeHTML($data);      // pdf内容をhtmlで突っ込む

// 'sample.pdf'というファイル名でダウンロードさせる
$mpdf->Output('sample.pdf', 'D');

このとき、$mpdf->Output();で指定するファイル名が一時ファイルのパスとなる為、同一ディレクトリのpermissionによって上手くいかないことがある(特に何らかのフレームワークを使用している場合)。
その為フルパス指定で任意のディレクトリに書き出すと安全だが・・・

$mpdf->Output('/var/www/html/pdf/sample.pdf', 'D');

などとした場合、ダウンロードされるpdfのファイル名は、
_var_www_html_pdf_sample.pdf
の様にパスを含んだものになってしまう。

原因

mpdf.phpの7480行付近(※バージョンによる)に、ファイル名の設定(レスポンスヘッダ)がある。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

この$nameは$mpdf->Output();の第一引数をそのまま使用している為、ファイル名にパスが含まれてしまう。
ファイル名に関するオプションなどは無さそうなので、この部分の処理を変更するしかない。

パスを含まないように修正する

ヘッダのfilenameに期待するファイル名を記述すればいいので、次のようにした。

			if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
				// don't use length if server using compression
				header('Content-Length: '.strlen($this->buffer));
			}
			/* --- ここから --- */
			$wk_name = explode('/', $name);
			if (count($wk_name) > 1) {
				$name = $wk_name[count($wk_name) - 1];
			}
			/* --- ここまで --- */
			header('Content-disposition: attachment; filename="'.$name.'"');
 			echo $this->buffer;
			break;

入力されたパスを’/’でexplodeし、末尾の文字列をファイル名としている。
これでどの階層にあってもフルパス指定でダウンロードできる。

幾何の問題

こんにちは
最近ビールより日本酒の消費量の方が多いbeerです。
複素数型を使った幾何の問題の解き方を最近知りました。

線分の長さを求める(C++で書いてみる)

点a⇒点bの長さを求めるには、
complex<double> a(1.0,2.0);
complex<double> b(3.0,4.0);
double length = abs(b-a);

なんとすっきりしたコードでしょう。
実際にはこれだけではなく、内積や外積を求めることで線分の交差判定や平行判定等もできます。ですが、まだ人に説明できるほど理解できているわけではないので、いずれ機会のある時にとっておきます。