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 "(” という情報に辿りつきました。疲れた・・・
登録:
投稿 (Atom)