A fine WordPress.com site

最新

boost::multiprecision 仮数部・指数部の取得

ドキュメントが足りてない感じで、理解するのに結構時間を要してしまったので備忘録。 長精度の整数型 cpp_int 、長精度の浮動小数点型 cpp_dec_float, 長精度の分数型 cpp_rational と大別して3タイプの型があり、精度指定ができるなど、それぞれのタイプも細かい設定ができるようになっています。そうすると、無数に型が作成可能な状態になり、爆発する型同士の組み合わせによる演算を、ひとつひとつ書いてたら大変な事になります。これを解決するために MPL を利用して型同士の種類で処理を分岐させています。 系統だって演算できるようにするための基本型が、number < BackendType, ExpressionTemplates > になり、BackendType が先の3タイプの型に相当します。 それぞれのタイプの型のメンバ関数にアクセスしたければ、number::backend() というメンバ関数をコールして、BackendType を取り出しアクセスする感じになります。 以下、サンプルです。


#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>

using namespace boost::multiprecision;


int main() {
number<cpp_int_backend<256, 256, signed_magnitude, unchecked, void> > bi = 323456789012;
number<cpp_dec_float<50> > bf( "123456789012.3456" );

std::cout << bi << std::endl;
std::cout << bf << std::endl;

bf = static_cast< number<cpp_dec_float<50> > >( bi );

std::cout << bf << std::endl;
double m;
boost::int32_t e;
bf.backend().extract_parts(m,e);
std::cout << "mantissa = " << m << ", exponent = " << e << std::endl;
std::cout << "isint ? " << bf.backend().isint() << std::endl;
return 0;
}

NEX-5R レビュー

 レビューと言っても、今まで、ちゃんとしたカメラ持ってなかったので、それから比べると「月とすっぽん」ぐらい違います。だから、比較となる対象が無いんです。カメラにはまってくると、APS-Cじゃなくてフルのカメラが欲しくなってきます。でも、このカメラ、ザックの上にポイと突っ込んで持ち歩けるし、軽いし、ものぐさな自分の性格に合っていて、手持ちでホイホイとブラケット撮影できるので気に入ってます。最初のうちは、カメラの使い方がわからなくて、シーン撮影を選択して喜んでました。でも、ちょっと慣れてくると、ここら辺は全く使っていません。というよりも、邪魔なのでメニューから消して欲しいぐらいです。こんな小細工しなくても十分に綺麗だと思ってます。おまかせオート機能も使っていません。ただし、1枚ものの撮影に、プレミアムおまかせオートを使用する事は多々あります。パノラマ撮影は、たまに使用します。状況に応じた計算をしやすいので、シャッタースピード優先と絞り優先のモードばかり使ってます。
 オートフォーカスですが、撮影してると微妙に違う部分にピントが合ってしまう事が多いので、DMFにて最終的なピント位置はマニュアル調整しています。自分は、風景写真が好きなので、オートフォーカスだけの打率で考えると、ピントが気に入らなくて捨てる写真が半分ぐらいはある感じです。フォーカスを自分で最終調整している関係上、フレキシブルスポットで、撮影する毎にモニタを押してターゲットの位置を変更してます。補助としてフォーカスされている部分を赤色に塗る機能はオンにしてます。撮影してる時は撮影だけに集中したいので、撮った写真が表示されると邪魔です。なので、撮影後の写真レビュー機能はオフにしてます。
 NEX-5Rを選んだ理由のうちのひとつは、Wifiでコントロールできるからで、色々とコントロールできるんじゃないかと楽観的に考えてました。そのために、中華PADも購入して、Root 取ってパケット・キャプチャもしました。Soap だったり、HTTP の Json だったりと、プロトコルに何を使ってるかぐらいまでは解析してみたんですが、RAWで保存してくれない作りっぽくて、ガッカリしてます。リモコンではブラケット撮影できないですし・・・。
 目下の不満は、リモコンでのブラケット撮影ができない部分でしょうか?AndroidにRAWデータを転送して表示しろなんて言いませんから、リモコンで5連とか7連のブラケット撮影モードが欲しいです〜(´;ω;`)。フォーカスは微調整を手でコントロールしているぐらいなので、強制オートフォーカスにされると使い物にならなくて困ります。
 まぁ、なんというか、すっかりHDRにはまって、± 2.0 ev のブラケット撮影を多用してます。そういう意味では、手振れ補正機能のオン・オフも簡単に変更できるようFnキーに割り当てられていると嬉しいかなぁ?

電子帝国時代

 久しぶりに、IT関連に関する雑感を書きます。  うちの会社ではGISを開発しているんですが、まぁ、いろいろと考えて、やってきても、帝国軍は全部根こそぎ持っていくんですわ。  今回、ESRI社のGISフォーラムに参加してきました。FOSS4Gとは対極にあるクローズドな会社だと思います。どこが凄いかというと、痒いところに手が届く、行き届いたサービスです。APPLEのデザイン力が素晴らしいのは周知の事実だと思いますが、ESRIのGISの機能は、柔軟かつ手数が少なく作業ができるようデザインされており、素晴らしいです。そんなESRI社の次なる動向を見て思ったのは、今まで隙間だと思っていた場所を埋め合わせるような新たな製品の投入。弱小企業が必死になって考えだしたビジネス領域を根こそぎ攫うかのような製品投入です。これだけじゃなく、ESRI社が強いのは、そのSIサポート体制と言えるかもしれません。市場開拓・育成・サポートまで一貫して行います。  Google Maps Engine 一般提供も視野に。Googleが B2B の細い分野まで侵食してくるとは思いませんでした。もうね、帝国軍レベルで隙間も注入されたら、どこにも余地ありませんわ。  今までのお客さんがいるので、簡単に辞められないですけど、もう会社たたんだ方が良いんじゃないかと思いますわ。うちの社員もSEのくせに GitHub ってなんですか?ってレベルだし、公開サイトにおいて、IE10やChrome でまともに動作しない状況について何の疑問も持たないセンスですしね。とうとうと、今 Chrome のシェアが一番でな、IEのバージョンも10の割合が増えてきてるんだよ、などと、アンテナベースの話からしなきゃならないとか、戦える気がしないですわ。  Apple が取り沙汰されるようになってから、Google も変わりましたよね?スペックや性能について、あまり語らなくなったと思いませんか?もちろん Google はオープンな企業で、特に隠し立てをしているという事は無いんですが・・・。  クリス・アンダーソンさんのFREEもどうなんでしょう?Makerでは、販売価格は製造原価の3倍で良いとか書いてるじゃないですか、労働コストの手間賃が含まれてるんですよ。なのに、ソフトウェアとコンテンツはFREEなんです。なんで、こうなってしまうのか?クラウドですよ。クラウドは便利ですが、胴元ビジネスなんです。ショバ代を徴収してテラ銭跳ねて、軌道に乗れば絶対に損しないビジネスなんです。ただし、ライバルに出し抜かれない限りは。みんな必死で進軍をやめるわけないですよね?電子帝国時代の到来です。  電子帝国時代に突入して若干空気が変わったと感じる事があります。ビジネス化するつもりのアイディアは口外せずに粛々と進めて、一挙に公開するとか、そんなんが増えてきているのかなぁと…。ま、特に根拠があるわけじゃないです。トップ・インタビューを読んでても、技術的・直接的な表現が減って、オブラートに包んだコンセプト的なものが増えてるような気がしてます。そういう意味じゃ、日本のメディアが日本の強みは、どこどこで、とか全部ノウハウに相当する部分を細かく分析して図表まで書いて披露するのは、へぇ~かもしれませんが、電子帝国時代にはマイナスなのかなぁと思う事もあります。トップの方も、技術的なノウハウに相当する暴露は控えて、テイストとか人間の感性に訴える部分に置き換えて表現した方が良いんじゃないでしょうか?  オープンソースもね。それで食ってくの辛いですよ。労働コストに対して「でも、お高いんでしょ?」の一言で片付けられてしまうような側面を持ってるんですよ。サラリーマン・タイプの人は、自分の職業で自分が働いた対価に対して経営層が、なんかお金に変えて賃金払ってくれるから、自分の労働コストに対しては厳しく文句言うくせに、他人の労働コストに対しては、平気で高いとか言うんですわ。君の給料は、どこからきてると思っているのか?もうちょっと、労働対価に関する価値観を教育していかないと、電子帝国時代は厳しい世界になるんじゃない?そんな風に感じてます。  あまり技術的な話を書くとね、帝国軍にサルベージされて持ってかれそうで嫌なんですけど。クラウドの次は、真の分散が来るんじゃないかと。そうでもしないと、胴元ビジネスの帝国主義は打破できないんじゃないかと。フォッグ・コンピューティングなる言葉があります。意味合いが若干異なりますが、自分も同じような事を考えていました。ジャンルは NoSQLに近いです。NoSQLの世界では、耐故障性能を上げるためにノード間でレプリケーションするやないですか?それって、見ず知らずのデータベース間でもスキーマが同じなら、データ交換が技術的には可能ですよね?て事はですよ?NFCとか使ってスレ違いざまにデータ交換できますよね?東北大震災の時に被災地のデータを人々がスレ違いざまにデータ交換して、自己組織化のようにデータが伝搬していく。クラウド無しでも行けると思いませんか?と、こんな事も考えてるんですが、自分とこではリソースをさく事態にならないと思うんで、面白いと思った人に託しますね。

android ndk と java から sqlite3 でアクセスするとどうなる?備忘録

 ndk からsqlite3 データベースを読みだしている状態で、android sdk の java が、データベース更新時に、時々例外を発生する事がある。どんなカラクリになっているのか気になって調べてみるとtwo connection to sqlite from java application and from ndkの情報が正確そうだ。Android SDK のJavaコードでは、1000mm sec 待っても応答が無ければ例外を送出する仕様であるらしい。言わせてもらえると、例外が発生するようなケースは、レアケースじゃね〜Ze。こんちくしょう。 自分の ndk でのレコードアクセスでは


#pragma once
#ifndef SQLITE_ACCESS_HPP
#define SQLITE_ACCESS_HPP

#include <sqlite3/sqlite3.h>
#include <functional>
#include <memory> // unique_ptr
#include <log.hpp>
#include <unistd.h>

namespace sio {

template <class Container, class ReadOpe>
bool read_rows(
sqlite3* db,
const char* sql,
Container& container,
ReadOpe ope,
const char* target_name
) {
sqlite3_stmt* stmt = nullptr;
int res = sqlite3_prepare_v2(db, sql, -1, &stmt, nullptr );
if( SQLITE_OK != res ) {
__android_log_print(ANDROID_LOG_ERROR, target_name, "Fail to read rows: %d", res );
return false;
}
std::unique_ptr<sqlite3_stmt,std::function<void(sqlite3_stmt*)> > stmt_holder( stmt, sqlite3_finalize );
while(true) {
while( res = sqlite3_step(stmt), SQLITE_BUSY == res ) { usleep(10); }
switch( res ) {
case SQLITE_ROW: ope( stmt, container ); break;
case SQLITE_DONE: return true;
default:
__android_log_print(ANDROID_LOG_ERROR, target_name, "Fail to get row: %d", res);
return false;
}
}
}

} // namespace sio

#endif // SQLITE_ACCESS_HPP

こんな感じで処理していて、他のプロセスやスレッドによって書き込みが阻害されている場合には、何mm sec スリープさせれば良いかわからないけど、とりあえず10mm sec 休ませる事にしているのだが、Android SDK は問答無用で1秒タイムアウト。 詰んだ\(^o^)/ まぁ、1秒にでもしとかないとデッドロック等のケースに対処できないから、しょうがないのかもしれない。  多分、例外が発生したら、もう一回同じ更新をJavaの方でかけに行くのが、いいのかなぁ?

HDRにはまってるのだ

 はい、HDR(High Dynamic Range)写真にはまってます。Photomatrix Pro を買いました。まぁ、色々とやってるんですが、大阪の実家の近くに「大阪芸術大学」なんてのがありまして、小学校の頃、よくここで遊んだんです。ここの建物、コンクリートむき出しの打ちっぱなしで、当時、奇天烈なデザインで印象深く、HDRやるなら是非ここをモチーフにしたいと思っていました。HDRの仕上げも、色々あると思いますが、自分は、どちらかというと頭の中の源風景を再現した自然な仕上がりが好きです。若干、カリッと仕上がっていると思いますが、コンクリートの黒ずんだ感じは、個々のパーツをよく観察すると、ほんとに、こんな風になってます。
 1枚目は、芸大正面口からの眺め
正面口から、先ほどの建物の方に向かって坂を登っていきます。

開けた所で特徴的な、この建物

その脇を当時としては変わった天窓付きの宙2階のようなスペースがあります。

こちらは、上の風景の反対側。庭園になりますが、昔はもう少し雑だったような気もします。

入り組んだ、コンクリート打ちっぱなしの建物があります。

コンサートのできる彫り込んだような庭のスペースもあるのですが、写真にパープル・フリンジが起こっていて、やむなく断念しました。まだまだ、新しい建物も面白いのですが、自分が小学生だった頃は、だいたい、ここら辺の建物までで、後は部活用のプレハブだったり、石膏を固めた彫刻模型のようなものが無造作に打ち捨てられていたりと、そんな感じでした。池があったスペースも、今では、だいぶ埋め立てられているようです。
写真の出来には満足してます。

android Intent で画像編集、備忘録

 android.net.Uri の作成の仕方によっては、「ファイルが見つかりません」と、つれなくあしらわれるので備忘録。 以下のようなやり方だと、ファイルを認識できない。


public void editImage( String path, String filename ) {
Uri imageUri = Uri.parse( path + "/" + filename );
Intent launchEditor = new Intent();
launchEditor.setAction(Intent.ACTION_EDIT);
launchEditor.setDataAndType(imageUri, "image/jpeg");
activity.startActivityForResult(launchEditor, 0);
}

 ちゃんと、File クラスを通じて生成する事


public void editImage( String path, String filename ) {
Uri imageUri = Uri.fromFile( new File( path, filename ) );
Intent launchEditor = new Intent();
launchEditor.setAction(Intent.ACTION_EDIT);
launchEditor.setDataAndType(imageUri, "image/jpeg");
activity.startActivityForResult(launchEditor, 0);
}

室蘭散策街中編

 朝起きて、ホテルから昨夜の風景をパチリ、工場は眠らない。時間もあるので街中を散策する事に…

 東室蘭の高架橋から、いたるところから工場が望めます。
 工場の方から鉄パイプが!さすが室蘭
 テツプロさんにやってきました。

 ここで、テツプロさんをあとにし、近所のスーパー、その名も「ぷらっと・てついち」に。

 さすが鉄の街!アートな鉄の看板

 いやはや、なんともオシャレですね!
外には、こんな鉄のオブジェまであります!
 お昼には少し早かったのですが、カレーラーメンを食べました。
 大王ではなく、蘭たん亭さんです。
 地味に福神漬けが良かったです。
帰りは、時間の都合で、東室蘭駅までタクシーにのり登別へと移動しました。随所に鉄を生かしたモチーフがあり、味があります。

室蘭散策ナイトクルージング編

ゴールデンウィーク前半で室蘭に行ってきました。お目当ては、焼き鳥と工場写真です。
もう完全にGoogle+で写真に毒されてきてまして、はまってます。
とは言え、家族旅行なんで、あまりじっくり写真を撮ってる暇はありません。三脚も持参して、あわよくば…と思っていたのですが、ホテルからと、苫小牧駅でしか三脚を使うチャンスはありませんでした。

工場ナイトクルージングに出かけたのですが、車が無くて難儀しました。バスに乗ったら、白鳥大橋の袂まで行くのに、ぐるぐると、あっちこっち寄り道をして、なかなか近づかない。親子3人だったらバス代と時間を考えても、室蘭駅からタクシーに乗った方が安上がりでした。船着場近くで撮った白鳥大橋が上下2枚。上はハレーションを起こしてます。構図的にも、もっと引いて撮りたい感じです。

風は強くて、かなり寒い中、ナイトクルージングに出発です。風が強くて、寒い上に結構上下しました。

見えてきました!工場です!

海上からだと、やっぱ、ハッキリ見えます。

徐々に日は暮れて

刻々と変化していきます。


この辺りから、ピンぼけ&ブレまくりの失敗写真が多くなります。

ふぉおおおお

 ほぇえええ

 ふぉおおおお

そんな感じで、通り過ぎてゆきます。
橋にも明かりが灯ってきました。
間近で見る白鳥大橋は、本当に綺麗でした。
素晴らしい!夢の世界のようです。

フレアスタックが見えますが、9割9分は、これよりもひどい状態でピンぼけかブレブレでした。残念です。

また、リベンジしたいです(>_<)

 雰囲気は伝わるでしょうか?

 奇跡的に撮れた写真その1

奇跡的に撮れた写真その2
終始こんな感じでブレてますが、さらば室蘭!白鳥大橋!
 さて、帰りですが、タクシーで室蘭駅に向かうのが正解です。東室蘭から室蘭間の方がJRの本数は多いです。崎守駅の方は魅力的ですが、家族連れには向いてませんorz JRが来ないのです。
 飯は、またまた鳥辰に行ってしまいました。

ホテルに帰って部屋から三脚使って夜景を撮りました。見えないものを撮るので、ホワイトバランスの調整に悩むところです。オートにするとこんな感じです。ナイトクルージングでは、状況がわからないので、NEX-5RYの標準ズームレンズを使用しました。この写真も同じレンズで、ISO100のシャッター速度が20〜30秒ぐらいで撮影しました。

こちらは、SEL50F18の単焦点レンズで、ホワイトバランスを蛍光灯で撮影しました。なんと、こちらのレンズだとISO100のシャッター速度12秒ぐらいで撮影しても明るすぎて白飛びします。なので、-ev 調整しました。ナイトクルージングでは、高感度がものを言いそうなので、こちらのレンズで勝負すべきだったと思いました。ただ、こちらのレンズの場合、標準ズームレンズに比べてピントを合わせるのが難しいんですね。そういう不安はあります。

boost::any で比較

データベースのデータを透過的に扱おうとすると、型が〜型が〜って、結構面倒くさい。 なるべくなら、楽をしたいです。もっとスマートな書き方無いのかな。


#include <boost/any.hpp>
#include <string>
#include <functional>
#include <iostream>
#include <exception>

template < class T, class OPE = std::binary_function<T,T,bool> >
bool in_type_ope( boost::any data, boost::any value, OPE ope ) {
try {
return ope( boost::any_cast<T>(data), boost::any_cast<T>(value) );
} catch( std::exception& e ) {
return false;
}
}

int main() {
boost::any a = 1;
boost::any b = 2;

std::cout << in_type_ope<int>( a, b, std::less<int>() ) << std::endl;
std::cout << in_type_ope<int>( b, a, std::less<int>() ) << std::endl;
a = 2;
std::cout << in_type_ope<int>( a, b, std::equal_to<int>() ) << std::endl;

return 0;
}

sqlite3でオンメモリDB

sqlite3 でスキーマ関係なく操作したい。オンメモリDBが便利。


#include <iostream>
#include <string>
#include <sqlite3.h>

int main() {
sqlite3* db = nullptr;
int resdb = sqlite3_open(":memory:", &db );
std::cout << resdb << std::endl;
sqlite3_stmt* stmt = nullptr;
sqlite3_prepare_v2( db, "select datetime('now','localtime')", -1, &stmt, 0 );
sqlite3_step( stmt );
std::cout << "type = " << sqlite3_column_type( stmt, 0 ) << std::endl;
std::cout << "value = " << sqlite3_column_text( stmt, 0 ) << std::endl;
sqlite3_finalize( stmt );
sqlite3_close( db );
return 0;
}