2017年1月19日木曜日

VisualStudio C++共通設定 備忘録

Visual Studio 2010ぐらいになってから、include ディレクトリとか、libディレクトリをプロジェクト毎に設定しろなんて、ひどい状況になったので、それの対処法

C:/Users/[Your account]/AppData/Local/Microsoft/MSBuild/v4.0/

という場所に Microsoft.Cpp.Win32.user.props というXMLファイルがある。
そこに、include と lib の設定を書いておく。
こんな感じ
<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <UsrLib>D:\Libs\</UsrLib>
    <IncludePath>$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSDK_IncludePath);$(WindowsSdkDir)include;$(UsrLib)cstdint;$(UsrLib)opencv3.0\include;$(UsrLib)boost\include\boost-1_60;$(UsrLib)zlib\include;$(UsrLib)openssl\include</IncludePath>
    <LibraryPath>$(VCInstallDir)lib;$(VCInstallDir)atlmfc\lib;$(WindowsSDK_LibraryPath_x86);$(WindowsSdkDir)lib;$(UsrLib)opencv3.0\lib\Release;$(UsrLib)Boost\lib;$(UsrLib)zlib\lib;$(UsrLib)lib</LibraryPath>
  </PropertyGroup>

</Project>

2016年12月15日木曜日

tile splash

はじめに

ウェブ上で地図の配信を行う手法は、タイルに分割された地図画像をajaxにより書き換える方法と、ベクトルデータを全部・あるいは部分的に読み込む手法が主でした。近年、ベクトルデータをタイル分割し、ajax により書き換える方法が登場しました。それが VectorTileです。
 このVectorTileの配信を行うオープンソースのモジュールのうちのひとつがTileSplashです。TileSplash は node.js という javascript によるWebサーバのエンジン用ライブラリとして書かれています。プロジェクトは、GitHubで下記にて公開されています。

 https://github.com/faradayio/tilesplash

実行に必要なもの

TileSplash を実行させるには、以下のモジュールが必要です。 node.js npm PostgreSQL server PostGIS インストール方法については、割愛します。

TileSplash 環境の構築

コマンド・プロンプトにて、npm を利用して SplashTile をインストールします。
$ npm install tilesplash
尚、-g オプションを使用すると、グローバル環境にモジュールがインストールされますが、ここでは、コマンドを実行したディレクトリ上にモジュールがインストールされるようにします。
 PostgreSQL Server に図形テーブルを構築します。注意点として、図形の座標系は、EPSG4326 でないと動作しません。また、ST_Transform(geom,4326) と言った書き方をしてもエラーになるので注意してください。既存のgeometryフィールドが異なるSRIDで作成している場合は、以下のようにフィールドを追加すると良いでしょう。
 alter table target_table add column geom2 geometry(‘MultiPolygon’, 4326);
    update table target_table set geom2 = ST_Transform(geom,4326); 
エディタで、sptile.js を作成し編集します。
var Tilesplash = require('tilesplash');
// username に postgresql へ接続するユーザ名を指定
// localhost にpostgresql server ホスト名を指定
// dbname に postgresql のデータベース名を指定
var app = new Tilesplash('postgres://username@localhost/dbname);

// layer_name はレイヤ名で、ajax によるリクエストの一部として扱われる
// table_name は図形テーブル名
// geom は図形フィールド名
// ここではシンプリファイをかけていますが、tile パラメータの x 値により
// シンプリファイをかけるパラメータを変更する必要があると思われます
app.layer('layer_name', function(tile, render){
  render('SELECT ST_AsGeoJSON(ST_Simplify(geom,0.005)) as the_geom_geojson’
     ‘FROM target_table WHERE ST_Intersects(St_Simplify(geom,0.005), !bbox_4326!)');
});
// ポート3000にて、Webサーバを起動します
app.server.listen(3000);
このまま稼働させると、レスポンスが javascript になるため、違うサイト間でのリクエストで CORS(Cross Origin Resource Sharing)の制約にひっかかって動作しない可能性があります。具体的には「No 'Access-Control-Allow-Origin' header is present」といったエラーがブラウザにより返されます。これを解消するには、以下のモジュールを利用します。
http://www.slideshare.net/kitfactory/web-api-34814937
$npm install corser

でモジュールをインストールし、
node_mojules/tilesplash/lib/index.js
ファイルに以下の修正を施します。
  this.server.use(pgMiddleware(dbOptions));

  var corser = require("corser");      // 以下の2行を CORS 対策として挿入
  this.server.use(corser.create());

  this.cacheOptions = cacheOptions || {};
  this._cache = new Caching(cacheType || 'memory', cacheOptions);
これは、レスポンス・ヘッダに
  Access-Control-Allow-Origin: *

を付加する事になります。

クライアント実装例

ローカルホストの node サーバに対して、アクセスする例です。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GSI Tiles on OpenLayers 3</title>
<link rel="stylesheet" href="http://openlayers.org/en/v3.10.1/css/ol.css" type="text/css">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="http://openlayers.org/en/v3.10.1/build/ol.js" type="text/javascript"></script>


<style>
  body {padding: 0; margin: 0}
  html, body, #map {height: 100%; width: 100%;}
</style>
</head>
<body>
  <div id="page">
    <div id="head"></div>
    <div id="main">  
      <div id="map" style="float:right"; width:640px; margin:0; padding:0; ></div>
      <div id="left" style="float:left; width:300px; margin:0; padding:0;"></div>
    </div>
  </div>       
<script>
var map = new ol.Map({
  target: "map",
  renderer: ['canvas', 'dom'],
  layers: [
    // 地理院タイル・レイヤ
    new ol.layer.Tile({
      source: new ol.source.XYZ({
        attributions: [
          new ol.Attribution({
            html: "<a href='http://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"
          })
        ],
        url: "http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png",
        projection: "EPSG:3857"
      })
    }),
    
    // topoJson レイヤ (splashtile から引く)
    new ol.layer.Vector({
      source: new ol.source.TileVector({
        format: new ol.format.TopoJSON(),
        projection: 'EPSG:3857',
        tileGrid: new ol.tilegrid.createXYZ({
          maxZoom: 19
        }),
        url: 'http://localhost:3000/' +
          'test_layer/{z}/{x}/{y}.topojson'
        }),
       style: new ol.style.Style({
         fill: new ol.style.Fill({ color: '#9db9e8' }),
         stroke: new ol.style.Stroke({ color: '#FF0000' })
       })
    })
  ],
  controls: ol.control.defaults({
    attributionOptions: ({
      collapsible: false
    })
  }),
  view: new ol.View({
    projection: "EPSG:3857",
    center: ol.proj.transform([138.7313889, 35.3622222], "EPSG:4326", "EPSG:3857"),
    maxZoom: 18,
    zoom: 5
    })
});
</script>
</body>
</html>
実行すると、こんな感じになります。 file:/// 上から実行すると、CORSにひっかかります。chrome ではなく、safari で実行しました。 CORS対策の部分は、もうちょい真面目にやらないとダメかもしれません。

2016年8月24日水曜日

digest 作成備忘録

OpenSSL の SHA-256 を利用してダイジェスト文字列を作る備忘録です。
英数字を小文字にするのどうやるんだっけ?ってあたりから、激しくドレインしてます。
#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm> // transform
#include <string>
#include <openssl/rsa.h>
#include <openssl/sha.h>
#include <boost/algorithm/hex.hpp>
#include <boost/algorithm/string/case_conv.hpp>

namespace {
  const char heading[] = "heading";
}


void show_usage() {
  std::cout << "make_digest [string]" << std::endl;
}

std::string digest( const char* str ) {
  unsigned char hash[SHA256_DIGEST_LENGTH];
  SHA256_CTX ctx;
  SHA256_Init(&ctx);
  SHA256_Update(&ctx, str, strlen(str));
  SHA256_Final(hash, &ctx);
  std::string result( (const char*)hash, SHA256_DIGEST_LENGTH );
  return result;

}

int main(int argc, char* argv[]) {

 if( argc != 2 ) {
  show_usage();
  return 1;
 }
 std::string charange( heading );
 charange += std::string( argv[1] );
 std::string hoge = digest( charange.c_str() );
 std::string digest;
 boost::algorithm::hex( hoge, std::back_inserter( digest ) );
 boost::algorithm::to_lower( digest );
 //std::transform( digest.begin(), digest.end(), digest.begin(), ::tolower );
 std::cout << digest << std::endl;

  return 0;
}

2016年8月13日土曜日

70-200レンズ

 Sigma 70 - 200 mm F2.8 を売ろうかと考えてます。
というのも、室蘭の夜景でブレないで撮れた試しもなく。マニュアルフォーカスしても、微妙にピントがズレる事も多く。オートフォーカスは遅くて、おまけにシャッターが下りなくてシャッターチャンスは無いに等しい。Merrill で撮影しても、撮れるシーンなんて、ほぼ限られる。このレンズで撮影して、やった!って思った写真は、考えてみても、ほぼゼロ。倍率も中途半端で、イマイチ。
 あと、予定外の出費が嵩んだのもあります。

2泊3日の弾丸キャンプ

 家族で2泊3日の東北に行ってきました。午前3時起床、午前4時出発、高速飛ばして函館北斗へ。そして新幹線に乗って盛岡まで。本当は新青森の予定だったのですが、日産レンタカーが予約を受付しておいて、車ありませんでした攻撃を食らったため変更でした。直前までレンタカーを探しまくっても見つからず。探しても探しても空車無し。タイムズレンタカーの厨川駅でやっとこさ予約。
 昼に盛楼閣で飯を食って、イザ恐山へ。いやーーーーー遠いですわ。ハードスケジュールに意識が飛びそうになりながら、矢立温泉でバンガローを借りる。朝活する体力もなく朝を迎えて、恐山へ。そして、十和田市現代美術館に。車返す事を考えたら、盛岡近辺でキャンプしないと…でも、星が綺麗なキャンプ場が良いな?と思って、種山高原星座の森へ向かうも、時間切れで八幡平から妻の神キャンプ場へ。本当は白神山地も寄りたかったんですが、時間的に全然無理でした。そして運転もハード。
 あんまり星が綺麗に見えなかったけど、流星群が凄くて、火球とかに大満足。ここではタイムラプスを撮って放置したけど、バッテリー切れで撮れてるのか撮れてないのか、さっぱりわかりません。11時ぐらいに早々に寝て、翌朝少しだけ朝活。と言っても、どこで撮影したものか?全然わかりません。ここら辺、意外に開けて見える場所が少ないのだ。
 そして、帰りの新幹線もあるのでレンタカー屋さんへ。電車に乗り遅れたら大変なので、レンタカー屋さんからダッシュ!滑り込みセーフで、あたふたしながら盛岡で焼き肉を食べて、新幹線&函館北斗から車だったのだ。
 写真は無い。

2016年7月26日火曜日

MinGW sqlcipher build 忘備録

まず、Mingw のインストール

MinGW(gcc) の Windows へのインストールと使い方 を参考にインストールします。

MSYSのシェルを起動するショートカットを作成します。
参照は C:\MINGW\msys\1.0\msys.bat です。

MSYSのシェルを起動します。

ライブラリの探し方は
$ mingw-get list | openssl
とします。

mingw-libopenssl を入れてみます。
$mingw-get install msys-libopenssl

SQLCipher をダウンロードして展開します。

$ configure

.... はい、エラーになります。

OpenSSL をダウンロードしてビルドします。

$ Configure --prefix=$PWD/dist no-idea no-mdc2 no-rc5 shared mingw
$ make depend && make && make install
です。

ようやく build に入ります。主にこちらを参考にしました。

sqlcipher と openssl のソースが home 下に作成されているとします。
$ configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC -I../openssl-1.0.2h/dist/include 
        ../openssl-1.0.2h/dist/bin/libeay32.dll -L../openssl-1.0.2h/dist/lib -static-libgcc" DLFLAGS="-leay32"
make claen
make sqlite3.c
make
make dll

2016年7月21日木曜日

生産性の低いモバイル・アプリケーション開発


 近年、自分が感じているモバイル・アプリケーション開発に対する状況を書いてみよう。(自分はB2B系のシステム開発をしているので、コンシューマ向けの事業を行っている方面の方にはマッチしない考察である可能性があります)

 発売されているモバイル端末は多岐にわたる。iOS をはじめとする iPhone, iPad。Android をはじめとする Android 端末、タブレット端末、将来的には ウェアラブル端末。Windowsをはじめとする Windows Phone、Surface、得体のしれないタブレット端末類。どの端末をとってみても、これで開発しておけば安泰なんていう時代じゃなくなってます。少し前まであったAndroidタブレットは、現在生産しているのが数社に狭まり、今後、市場として成立するかどうかは全くの不透明。どの部分が明日には廃れていくか決め打ちするのもリスクが高すぎて選択できません。逆もまた然り。

 よって、全方位で製品を提供できる事が理想です。Microsoft社も、このように考えているようです。ひとつの解決策としては Xamarin があります。しかし、考えるに、Xamarin って生産性高いの?という疑問が付きまといます。HTML5も進化して、どんどんとネイティブ・アプリとブラウザ・アプリの差が縮まっているように感じています。札幌で行われたW3C会議のDeveloper Meetup に参加して思ったのは、Worker Service や Universal Payments など、野心的な開拓と提案で、この先も、どんどんと進化していく流れは続きそうだという事です。Google は Native の有用性と Browser の有用性は、それぞれにあり、どちらも必要性を認めていますが、両者の垣根は、だんだんと曖昧になってきていると考えているようです。

 ウェブは終わったと煽る記事もありますが、自分は、ウェブをベースにアプリを作成するのが幸せだと考えてます。もちろん Native コードじゃないと話にならない事もあります。アプリのパーツを考えた時、ウェブをベースとした作り方ができれば、生産性は高まります。レイアウトもコードも楽ですし、再利用できるコードも多いですし、なんならウェブ・アプリケーションとして提供するのもコストが少なくて済みます。調べてみると WebViewの出来は最悪みたいで、Android Kitkat 4.4 以上であれば ChromeViewが使えるようです。他には Crosswalk というものもあり、これなら Android と iOS、Windows Phone もプロジェクトがあるので使えそうです。

 ここから先の考え方は、現在無いように思う事項です。サーバーを端末内の node.js のようなもので代用できれば最高だと思いませんか?ポートを介して接続したりするので、モバイル端末等におけるセキュリィティの概念が必要でしょうが、VirtualHost的な考え方と認証を組み合わせれば大丈夫でしょう。サーバをローカルにするメリットは、まだあります。WebStorageで頑張らなくてもサーバサイドに機能を寄せる事ができます。フォッグ・コンピューティング的な考え方等を導入する場合でも、ローカル・サーバ・サイドの機能として隠蔽する事が可能なので幅が広がります。残念ながら Android に node.js を入れようと思ったら root化が必要そうではあります。変なサービス・アプリケーションを一生懸命開発するぐらいなら、ローカル・サーバ・サイドの機能として実装するのもアリだと思いませんか?

 こうやって、アプリケーション内を部分的にでもWebView的なもので置き換える事ができたら、グッと生産性が上がるんじゃないかな〜?どうでしょう?