2012年6月29日金曜日

うーんappleにハマってるかも

いやー、なんか Time capsule 買ってしまいました。2TのNASと無線LAN を兼任してくれます。 今まではというと、NEC製の無線LANルータと、バッファローの外付けの電源アダプタが必要なUSBディスクと、ノートパソコンから取り出したHDDをUSBディスク化したものを組み合わせていました。  NEC製の無線LANとバッファローの外付けUSBディスクを組み合わせたら、Time capsule と同じぐらいの値段になります。NEC製の無線LAN、SSIDを変更できるので気に入ってました。あんまし何も考えずに Time capsule 買ってきて設置してみたんですけど、Air mac ユーティリィティを使うだけで、WPS2-Personal な設定で、SSID も以前使っていたSSIDの名前で登録できて、おまけにGuest用のSSIDまで設定できて、拍子抜けするぐらい簡単に移行できました。他の機器の無線LAN設定を、もう一度やり直す覚悟だったのに、何も変更する必要がありませんでした。あれ?もう終わり???そんな感じです。  ますます、もうWindowsいらねぇんじゃね?と、思って、いっその事の VMWare Fusion 4 買いました。ちなみに、2012/7/1 まで、4500円のセール中です。正直、普段仮想環境使う機会があって、使ってますけど、VMWare は使った事がありませんでした。使ってみると、これが良く出来ていて、感動できます。mac と windows でファイルシステムの分離度を選択できたり、USB を繋げば、どのマシンにUSBをマウントするか聞いてくれるし、ネットワークの設定もお手軽だし、ディスクサイズの変更も融通効くし...。画面は、こんな感じです。  さすがに MBP の SSD 容量256Gでは厳しいので、外付けHDDにポコポコ入れて、TPOに合わせて使おうと考えてます。うまい事ノートブックから取り出した256G の HDD が2本(BTO品が壊れた時のHDDとmacbookを512Gに自分でアップグレードした時のHDD)あるんで、そいつを活用しようかと・・・。で、バッファローの外付けHDDに電子書籍のバックアップを入れてるんですが、いちいち設置が面倒なんで(だしっぱなしだと嫁さんに怒られる)、256GのHDDを流用してたんです。それを、うまく回そうと思ったら、Time capsule が良いんじゃね?という結論に達した訳です。  後は、macbook 13inchi 2010 mid モデルは、SSD 256G に変更しようと画策中でして、トータルで考えると、秋葉館の光学ドライブスペース用HDD/SDD マウンタがお買い得かなぁ?と... SSD は、amazon でゲットする予定です。交換したら、またレポートしたいと思います。 追伸:2012/6/30 FOSS4G HOKKAIDO で発表します。 2012/7/1 追記:なんだか、mac が「接続したことのあるネットワークが見つかりません」というエラーをはくようになった。SSID を変更したら治ったけど、どこかに SSIDの設定の残骸が残っていて、それが悪さをしているのか、キーチェインをクリーンにして、元のSSIDに戻してもエラーになる状況が発生してしまう。しかたないので、SSIDを変更したまま利用する事になりました。

2012年6月27日水曜日

Mac QuicktimePlayer 履歴削除 備忘録

一応、最近開いたファイルの履歴を削除する事が可能な訳ですが、Dock の方のメニューにも、ぐちゃぐちゃと履歴が表示されて、うざい。こちらは、独立しているので ターミナルを開いて
defaults write com.apple.QuickTimePlayerX NSRecentDocumentsLimit 0
defaults delete com.apple.QuickTimePlayerX.LSSharedFileList RecentDocuments
defaults write com.apple.QuickTimePlayerX.LSSharedFileList RecentDocuments -dict-add MaxAmount 0
とする事で、履歴を無効にする事ができる。 参考:Clear recent items in Lion

2012年6月24日日曜日

macbook pro retina を買いました

散々悩んだ挙げ句、macbook pro retina モデルの一番安いやつを買いました。  「パソコンを買い替えたいと思った動機は、ディスプレイサイズが小さくて作業がし辛い」だったので、そこを軸に検討しました。  会社での作業はBTOで1440x900の解像度のノートパソコンです。windowsに比べてmacやlinuxでのテキスト・フォントの表示は、ちょっと見辛いものがあると思います。家のパソコンは、macbook 2010 モデルで、1280x800の解像度。option + command + D でドックを隠しても、なんかコードが見難くて、コーディングするには致命的です。若干老眼が入ってきているので、やっぱ辛いです。こんな状況なので、解像度は1440x900を最低ラインにしないと...というのが結論でした。  家で作業するだけなら、iMacで十分なんです。でも、立場上、やっぱパソコンは持ち歩きたい。それに、家でデスクトップ型パソコンを置くスペースにも問題があります。作業する場所をちょこちょこ変えないといけなさそうで、それを考えると萎えます。iMacを買って、macbook 2010年モデルにSSDを装着して、メモリを4Gに変えて、高速化と省電力化をはかり、嫁さんには、普段 iMacを使ってもらう構成も考えられました。これだと、15万円前後で出費が済みそうです。ただ、後々 macbook air が欲しいとか言い出しそうです。もうひとつ、そろそろモデルチェンジしそうな部分も気になります。  mac mini と安価なLCDを組み合わせる手も考えられました。iMac の構成よりも4万円弱ほど安く済みそうです。これも、macbook air が欲しいとか言い出しそうなのと、パソコンの場所を変える作業が更に煩雑になりそうで、ストレスが溜まりそうです。  macbook air 13インチ・SSD256Gのモデル・メモリ8Gを選択する。13万7千円。これだと、解像度が1440x900で、考えていたスペックも満たすし、持ち運びの機動力も高い。CPUのスペックはバッテリー稼働時間とのトレードオフだと考えて我慢する。GPUプログラミングに不満は残るが、Amazon Cloudもある事だし、まぁ、これで行こうと腹に決めてました。会社のノートパソコンと比べて2インチ分の差が、どう影響するのか?と、windowsに比べると、どうもテキストが見辛いかも?というのが心残りでした。  macbook pro retina 良いですよね?店頭で、ちょっと見ただけでは、やっぱピンと来ないです。最低限のモデルでも18万4800円です。このレベルだと、メモリも16G欲しくなります。後で増設が効かないので、尚更、そう感じます。そしたら、奥さん20万2400円ですよ(>_<)。  macbook air を選択して、もし、ディスプレイ・サイズに不満が出た時は、どうすれば???というのを考えた時、安価なLCDを買い足せば良いんじゃない?とも考えました。でも冷静に考えてみましょう。13万7千円に2万円を足したら、15万7千円です。macbook pro retina と 3万円も差が無いんですよ??? Dual Core i5 と Quad Core i7 と GPU の差と retina ディスプレイの差が、たったの3万円 orz  嫁さんに、「画面が小さいとか言ってるのに macbook air 買って、もう一台パソコンが欲しいとか言い出されるのは堪えられない」と言われまして、結局、欲しいのを買えという結論になりました。札幌ヨドバシカメラに行ったら、何故か、今すぐ現物を用意できますよ?と言われたのもあって、ゲットしました。USキーボードにしようかと考えてた事も忘れてて、買ってきました。キーボードはJISで良かったと思います。いろんな環境に対応しないといけない事が多くて、この手の執着は無くなりました。  メモリは8Gで良しとしました。エディタとコンパイルがメインなんで、そんなに使いませんし、仮想サーバを建てるとしても、SSD256Gは手狭で、バランスが悪いです。仮想1台に2Gから4Gのメモリを割り当てれば、いいところじゃないかな?と考えました。そう考えれば、コストパフォーマンスを考えても納得がいきます。老眼だし、しょうがないwww  そんなこんなで、mac の移行アシスタントを動かしつつの MBP retina 購入の報告です。 2012/7/2 追記:機会学習バリバリ使う方から、8Gだとメモリが少ないという感想を聞いてます。何もしなくても4Gぐらい消費してるとか... 自分のところだと、1.2Gも消費していないので(メモリの固定化は2Gほど)、人によって使い方が随分と変わるんだなぁと思いました。

2012年6月17日日曜日

mac を見に行ってきた

実は、家で作業するのに macbook では、画面が小さすぎるなぁというのと、嫁さんが専有していて使えない時があるので、もう一台欲しいと思っていたのだ。MBPレイテナ凄い魅力的なんですが、さすがに手が出ないorz。  実物見ない事には、なんとも…と思って、mac を物色しに行ってきました。  実物を見た感じ、ますます混乱してきました。仕事柄、いずれCUDAとはガッツリと対峙しなければならないと思っているので、そこを考えるとAIRは、無ぇよなのです。もちろん、凄い魅力的で欲しいのですが、あくまでセカンド機と言った位置づけ。この際だから、コストパフォマンスと作業効率に特化すれば、iMacで良いんじゃね?という考えも台頭してきました。問題は、書斎も無ぇし、机も無ぇよ、どうすんの?と言った点。家の中の遊牧民には、iMac は辛いです。  ここで、新たなプランを思いつきましt。現行 macbook を持ち運んでも良いんじゃね?ディスクをSSDに交換して、光学ドライブを外出しすれば、そこそこ行けそうだし…。というプランです。  先日、シャープが高精細ディスプレイを発表したように、新型 iPad (3) をはじめ、MBPが引き金となって、18ヶ月もすれば、ディスプレイ事情が一変しそうな気もしてます。MBPとMBAを見比べましたが、MBP綺麗です。一番は、フォントの滲み。ただ、新型 iPad に慣れていると、そんなに無茶苦茶な感動は、ありませんでした。こう考えると、凄い惹かれるけど、無理してまで、今、MBPが必要か?という感じになってしまいます。SSDの寿命も考えると、モノコックな作りの製品寿命も気になります。  なんでDOS/V機じゃあかんの?と思ってる人もいると思うので、一応補足しとくと、デザイン力の差が圧倒的なんです。バッテリ充電用のコードからして、作りが違いすぎます。安けりゃ良いやの巷のノートパソコン付属のACアダプタは、充電していようが充電していまいが、電気の垂れ流し。おかげで、すぐにノートパソコンのバッテリーがダメになってしまいます。タッチパッドの装着にしたって、付いてればええというレベルだと、キーボード入力中の誤作動がひどいです。縦解像度だって、最低 800 は欲しいでしょ。  こうやって、振り出しに戻っている人が、あちこちに居そうですね。しばらく妄想思考ループを楽しみたいと思います。7割型、(iMac | MBA) と (macbook を SSD改造)という路線で固まりつつありますが…

2012年6月13日水曜日

boost::ptr_vector を使ったら、死ねたでござる(ToT)


#include <boost/ptr_container/ptr_vector.hpp>
#include <algorithm>
#include <iostream>


struct sineru {
  int i_;
  sineru(int i) : i_(i) { std::cout << "sineru::sineru(" << (void*)this << ")" << std::endl; }
  ~sineru() { std::cout << "sineru::~sineru(" << (void*)this << ")" << std::endl; }

  bool operator < (const sineru& rhs) const { return i_ < rhs.i_; }

};


int main() {
  boost::ptr_vector<sineru> v;

  for( int i = 5; i > 0; --i ) v.push_back( new sineru(i) );
  std::sort( v.begin(), v.end() );
 
  std::cout << "====== sorted ======" << std::endl;
 
  return 0;

}
実行結果
sineru::sineru(003B20C8)
sineru::sineru(003B2148)
sineru::sineru(003B2138)
sineru::sineru(003B2158)
sineru::sineru(003B2168)
sineru::~sineru(0018FE48)
sineru::~sineru(0018FE48)
sineru::~sineru(0018FE48)
sineru::~sineru(0018FE48)
====== sorted ======
sineru::~sineru(003B20C8)
sineru::~sineru(003B2148)
sineru::~sineru(003B2138)
sineru::~sineru(003B2158)
sineru::~sineru(003B2168)
 おいどんが、悪かったでごわす。move が導入されるまで、もう2度と ptr_container は、使いたくないでごわす。

boost range unique 備忘録

#include <iostream>
#include <vector>
#include <boost/range/algorithm.hpp>
#include <boost/range/algorithm_ext.hpp>

void s( int n ) { std::cout << n << ","; }

int main() {
  std::vector<int> v;
  for( int i = 0; i < 20; ++i ) {
    v.push_back( (21-i) / 2 );
  }

  boost::for_each( v, s );
  std::cout << std::endl;
  boost::erase(v, boost::unique<boost::return_found_end>(boost::sort(v)));

  // boost::return_next_end は、document 間違い?
  // と思ったら、++i と消去する寸前にイテレータをインクリメントしてました… orz
  // http://www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/algorithms/introduction.html
  /*
  boost::sort(v);
  boost::erase(v, boost::unique<boost::return_next_end>(v));
  */
  boost::for_each( v, s );

  return 0;
}
出力
10,10,9,9,8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1
1,2,3,4,5,6,7,8,9,10,
// コメントアウトを実行すると
1,2,3,4,5,6,7,8,9,10,6
追記:ドキュメントを良く見たら、間違いではなかったので訂正しました。

2012年6月8日金曜日

今更 c++ で hello world

上っ面だけでは判断できませんが、以下のコードは UTF-8 で書かれています。
#include <iostream>

int main() {
  std::cout << "こんにちわ世界" << std::endl;
 return 0;
}

 mac 環境にて、 gcc-4.2.1 と clang++ 3.1 の両方でコンパイルして実行してみました。
$ clang++ hello.cpp
$ ./a.out
  こんにちわ世界
そらまー、そうですよねー。調子こいて、もうひとつ
#include <iostream>

int main(){
  std::cout << "こんにちわ世界" << std::endl;
  std::cout << "おはよー" << std::endl;
  std::cout << "Good Morning-." << std::endl;
  std::cout << "早上好ー" << std::endl;
  std::cout << "早晨ー" << std::endl;
  std::cout << "Bonjour!" << std::endl;
  std::cout << "Buenos dias-." << std::endl;
  std::cout << "안녕하십니까?" << std::endl;
  std::cout << "Доброе утро." << std::endl;
  std::cout << "Bom dia-." << std::endl;
  std::cout << "Buon giorno-." << std::endl;
  std::cout << "Guten Morgen." << std::endl;
  return 0;
}
 ほれ
$ clang++ hello.cpp
$ ./a.out
  こんにちわ世界
  おはよー
  Good Morning-.
  早上好ー
  早晨ー
  Bonjour!
  Buenos dias-.
  안녕하십니까?
  Доброе утро.
  Bom dia-.
  Buon giorno-.
  Guten Morgen.
 そらまー、そうですよねー。妙な感動がありますな…。  ツッコミ入りそうなんで、書いとくと windows でも コードページ 65001 を指定すると、基本、同じ事になります。 試してないです。
c:¥>chcp 65001

boost::range 配列添字を処理するテスト

レンジでチーンと気分よくコード書いてたら、実は、後で、どの位置から取ってきたかを記録しときたい事に気がつきました。なんとなく危険な香りがするので、テストコードを書いて見ることに…なるほど…
#include <boost/range/algorithm/for_each.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <iostream>
#include <vector>

struct hoge {
  hoge( int i ) : i_(i) {} 
  int i_;
};

void func( const hoge& h, int pos ) {
  std::cout << pos << ",";
}

void func2( const hoge& h, int& pos ) {
  std::cout << pos++ << ",";
}

int main() {

  std::vector<hoge> v;
  for( int i = 0; i < 10; ++i ) v.push_back( i );

  int n = 0;
  boost::for_each( v, boost::bind( func, _1, n++ ) );

  std::cout << std::endl;

  n = 0;
  boost::for_each( v, boost::bind( func2, _1, boost::ref(n) ) );


  return 0;

}

結果 vc8
0,0,0,0,0,0,0,0,0,0
0,1,2,3,4,5,6,7,8,9
 フィルターをかましたら、添字の位置もズレてしまうんで、zip して渡す方がスマートなのかも…暇があったら試してみるかな?

2012年6月7日木曜日

boost::geometry と gdal/ogr

普通にやるには、GDAL/OGR にて、geos を有効にしてコンパイルすれば何の問題もないです。 単に boost::geometry を使ってみたかっただけという…  concepts ベースで書いてみようかなとも思ったんですが、OGRPolygon あたりの実装を concept で書くのは、自分には無理ゲーっぽいと思ったので相互変換のコードでお茶を濁しました。お陰で、だいぶ geometry の concept についても、わかってきたのですが・・・。このポストが、役に立つ人っているのかいな?という疑問が無いわけでもない…。
#include <ogrsf_frmts.h>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/assign.hpp>

BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian);

namespace bg = boost::geometry;

typedef bg::model::d2::point_xy<double>    bg_point;
typedef bg::model::ring<bg_point>          bg_ring;
typedef bg::model::polygon<bg_point>       bg_polygon;
typedef bg::model::linestring<bg_point>    bg_linestring;

void point2ogrpoint(OGRPoint& lhs, const bg_point& rhs);
void line2ogrline(OGRLineString& lhs, const bg_linestring& rhs);
void poly2ogrpoly(OGRPolygon& lhs, const bg_polygon& rhs);
bg_point ogrpoint2point( const OGRPoint& rhs );
bg_linestring ogrline2line( const OGRLineString& rhs );
bg_polygon ogrpoly2poly( const OGRPolygon& rhs );



using namespace boost::assign;

void point2ogrpoint(OGRPoint& lhs, const bg_point& rhs) {
  lhs.setX( bg::get<0>(rhs) );
  lhs.setY( bg::get<1>(rhs) );
} 

void line2ogrline(OGRLineString& lhs, const bg_linestring& rhs) {
  lhs.setNumPoints( rhs.size() );
  for( int i = 0; i < rhs.size(); ++i ) {
    lhs.setPoint( i, bg::get<0>(rhs[i]), bg::get<1>(rhs[i]), 0.0 );
  }
}

void ring2ogrring(OGRLinearRing& lhs, const bg_ring& rhs) {
  lhs.setNumPoints( rhs.size() );
  for( int i = 0; i < rhs.size(); ++i ) {
    lhs.setPoint( i, bg::get<0>(rhs[i]), bg::get<1>(rhs[i]), 0.0 );
  }
}

void poly2ogrpoly(OGRPolygon& lhs, const bg_polygon& rhs) {
  { // external ring
    OGRLinearRing externalRing;
    ring2ogrring( externalRing, rhs.outer() );
    lhs.addRing( &externalRing );
  }
  // internal rings
  for( int i = 0; i < rhs.inners().size(); ++i ) {
    OGRLinearRing internalRing;
    ring2ogrring( internalRing, rhs.inners()[i] );
    lhs.addRing( &internalRing );
  }
}

bg_point ogrpoint2point( const OGRPoint& rhs ) {
  return bg_point( rhs.getX(), rhs.getY() );
}

bg_linestring ogrline2line( const OGRLineString& rhs ) {
  bg_linestring result;
  for( int i = 0; i < rhs.getNumPoints(); ++i ) {
    result += bg_point( rhs.getX(i), rhs.getY(i) );
  }
  return result;
}

bg_ring ogrring2ring( const OGRLinearRing& rhs ) {
  bg_ring result;
  for( int i = 0; i < rhs.getNumPoints(); ++i ) {
    result += bg_point( rhs.getX(i), rhs.getY(i) );
  }
  return result;
}

bg_polygon ogrpoly2poly( const OGRPolygon& rhs ) {
  bg_polygon result;
  result.outer() = ogrring2ring( *(rhs.getExteriorRing()) );
  int n = rhs.getNumInteriorRings();
  for( int i = 0; i < n; ++i ) {
    result.inners().push_back( ogrring2ring(*(rhs.getInteriorRing( i ))) );
  }
  return result;
}

2012年6月6日水曜日

std::floor の挙動

やっぱり、しょうもない事でもコードを書いて確認したくなるのであった。 本日は、std::floor が負の値をちゃんと負方向に切り捨ててるか?
#include <iostream>
#include <cmath>

int main() {
  std::cout << static_cast<int>(  0.5 / 10 ) << std::endl;
  std::cout << static_cast<int>( -0.5 / 10 ) << std::endl;
  std::cout << static_cast<int>( std::floor( 0.5 / 10.0 ) ) << std::endl;
  std::cout << static_cast<int>( std::floor( -0.5 / 10.0 ) ) << std::endl;
  std::cout << static_cast<int>( std::floor( 0.5 / 10 ) ) << std::endl;
  std::cout << static_cast<int>( std::floor( -0.5 / 10 ) ) << std::endl;
  return 0;
}

/*  // 実行結果は、VC8
  0
  0
  0
  -1
  0
  -1  // 微妙かも?
*/

2012年6月3日日曜日

luabind のコンパイルでエラー: トークン "(" の前に二項演算子がありません

昨日は祟られてたのだ・・・。久しぶりにubuntu環境でコンパイルしようと思ったら、Google Chrome がハングしまくりで、キーボードもマウスも反応しなくなり、強制電源オフの刑を食らいまくった。
$ ps aux | grep chrome
で表示される chrome のプロセス数の多さには閉口するのな。運良くプロセス番号を見つける事ができたら
$ kill -9 XXXXXXX
で、chrome 死にさらせーーーーーーーーーて爽快に叫んでるところなんですが、「このページは応答していません」のメッセージと共にシステムを道連れにして何もできなくなるのな。サーバじゃないし、家には一台しかパソくん無いから、ssh で入ってとか無しです。これの繰り返し・・・。 (#・∀・)ムカッ!!ときて、ubuntu からは、chrome 削除しました。いやー、快適です。  それで本題に入ります。boost のコンパイルが、また嵌りまくった。
$ ./b2 stage --without-mpi --without-python --build-type=complete --layout=versioned
でやると、コンパイルをしてくれるんだけど、
$ ./b2 stage --without-mpi --without-python --build-type=complete --layout=versioned install
でやると、HAS_LONG_DOUBLE_SUPPORT の所で、ずーっと黙りこくったまま応答を返さない。 (#・∀・)ムカッ!!ときて、もうええねん、ライブラリ手動でコピーして、シンボリックリンクも自分でやればええんやろ? とプンプンしながら、luabind をコンパイルしようとしたら
$ cd /usr/local/src/luabind*
$ export BOOST_ROOT=/usr/local/src/boost_1_49_0
$ export BOOST_BUILD_PATH=/usr/local/src/boost_1_49_0/tools/build/v2
$ ../boost_1_49_0/b2 --build-type=complete --layout=versioned
って、やったら、「エラー: トークン "(" の前に二項演算子がありません」の嵐… どうも、gcc-4.6 とか、あかんのかな? 最終的には、 BOOST_PP_ITERATION_FLAGS(): error: missing binary operator before token "(” という情報に辿りつきました。疲れた・・・