2012年3月29日木曜日

android ADT が更新されたら could not find class (NoClassDefFoundError) 備忘録

eclipse ADT がアップデータされたから、アップデートしたら、eclipse が起動しねぇ。またか?と思ったけど、
eclipse -clean
したら、ちゃんと起動するようになった。

 次にプログラムを実行しようとすると、java.lang.NoClassDefFoundError の例外が飛ぶ。なんじゃコレ(-_-)。イラッとしながら解決策もわからず、右往左往してたら、相棒が解決策を教えてくれた。

  • プロジェクトのプロパティを表示する
  • Java のビルド・パスを選択する
  • 順序およびエクスポートのタブを選択する
  • チェックボックスで必要な jar ファイル等にチェックを入れる
  • プロジェクトをクリーン・ビルドする
 以上。また、無駄な時間を費やしてしまった。

2012年3月28日水曜日

boost::polygon get_trapezoids (台形分割)

お手軽なテッセレーションがほすぃ…。  思ってたよりも、手こずった…。ドキュメントが少ない。 boost::geometry と融合していっても良いのではないか?
#include <boost/polygon/polygon.hpp>
#include <vector>
#include <iostream>

namespace gtl = boost::polygon;
typedef gtl::point_data<double> point;
typedef gtl::polygon_set_data<double> polygon_set;
typedef gtl::polygon_with_holes_data<double> polygon;

#include <boost/range/algorithm.hpp>

  //  .               .   100
  //
  //       .      .       75
  //
  //  .    .              50
  //
  //       .      .       25
  //
  //  .                .  0
  // 0    25     75   100

void dispp( point p ) {
  std::cout << "(" << p.x() << "," << p.y() << ")";
}

void disp( polygon ply ) {
  std::cout << std::endl << "====== TRAPEZOIDS ======" << std::endl;
  boost::for_each(
    *(reinterpret_cast<std::vector<point>*>(&ply)),  // うぜぇ(反則技)
    dispp 
  );
}

int main() {
  std::vector<point> pts;

  pts.push_back( point(   0,   0 ) );
  pts.push_back( point(   0,  50 ) );
  pts.push_back( point(  25,  50 ) );
  pts.push_back( point(  25,  25 ) );
  pts.push_back( point(  75,  25 ) );
  pts.push_back( point(  75,  75 ) );
  pts.push_back( point(  25,  75 ) );
  pts.push_back( point(  25,  50 ) );
  pts.push_back( point(   0,  50 ) );
  pts.push_back( point(   0, 100 ) );
  pts.push_back( point( 100, 100 ) );
  pts.push_back( point( 100,   0 ) );

  polygon ply;
  gtl::set_points( ply, pts.begin(), pts.end() );

  using namespace gtl::operators;
  std::vector<polygon> ots;
  polygon_set plys;
  plys.insert( ply );
  plys.get_trapezoids( ots ); 

  boost::for_each( ots, disp );


  return 0;
}

2012年3月27日火曜日

boost::ptr_vector 習作


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


class Foo {
public:
 int a_;
  Foo(int i) : a_(i) { std::cout << "Foo()" << std::endl; }
  ~Foo() { std::cout << "~Foo()" << std::endl; }
};

void show( const Foo& f ) {
  std::cout << f.a_ << ",";
}

int main() {
  {

    boost::ptr_vector<Foo> v;


    for( int i = 0; i < 10; ++i ) {
      v.push_back( new Foo(i) );
    }

    std::for_each(v.begin(), v.end(), show ); 
    std::cout << std::endl << "scope exit..." << std::endl;
  }
  std::cout << std::endl << "out of scope..." << std::endl;
  return 0;
}
実行結果

Foo()
Foo()
Foo()
Foo()
Foo()
Foo()
Foo()
Foo()
Foo()
Foo()
0,1,2,3,4,5,6,7,8,9,
scope exit...
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()
~Foo()

out of scope...
細かいメタ関数を用意しなくて済むので、便利だ。

2012年3月24日土曜日

震災から1年、瓦礫を受け入れよう

ちょい忙しくて、出遅れた感は否めませんが、震災から1年経ちました。専門家も専門家で無い人も、いきなり放射性物質と向き合わなければならない状況に置かれてから、ほぼ1年です。1年経ってみて、思ったよりも放射性物質の汚染は、たいして影響が無く、コントロールできているレベルなんじゃないかな?という印象です。  がれきに関してですが、河野太郎先生のブログに状況が書かれています。バグフィルターでセシウムは除去できるし、アスベストの問題もクリアしているようですし、問題ないと思われます。で、安全・危険のレベルもよくわからない事故当時と違って、一年経ったので、そろそろ震災の片づけをしましょうよ。という提案を、ブログという底辺から支持したいと思いました。  さっさと片付けて、復興にとりかかりましょう。

2012年3月5日月曜日

libcurl-7.24.0 構築 備忘録

windows VC8 x64 環境で構築しました。zlib, openssl は構築済みです。
  • curl-7.24.0 をダウンロードして解凍します。次に vc6curl.dsw を開きます。
  • vcのバージョンが違うのでコンバートされると思います。
  • プロジェクトを選択し、「構成マネージャ」を開きます。
  • 「アクティブ・ソリューション構成」には「DLL Release」を選択し、
  • 「アクティブ・ソリューション・プラットフォーム」からは、「新規作成」を選択して「x64」プラットフォームを作成します。
  • 「オプション」の「VC++ディレクトリ」から、「x64」に対して zlib と openssl のincludeとlib のパスを追加します。
  • 「プロジェクトの設定」の「C++」の「プリプロセッサ」で、WITH_ZLIB,WITH_OPENSSL,USE_ZLIB,USE_OPENSSL,USE_SSLEAYを追記します。
  • 「プロジェクトの設定」の「リンカ」の「入力」に、libeay32.lib ssleay32.lib zdll.lib を追記します。
  • コンパイルします
尚、油断していると、プラットフォームが「win32」に変わっていて、あれ、リンクができない~となってしまうので、気をつけましょう。原因がわからずに、はまりました。 出力先は、 curl-7.24.0/lib/DLL-Release 下に libcurl.dll libcurl_imp.lib curl-7.24.0/src/DLL-Release 下に curl.exe となります。  関連 zlib-1.2.6 備忘録, openssl-1.0.0g 備忘録

2012年3月4日日曜日

android 開発におけるメモリーリーク 備忘録

いやー、android 開発、難しいですねー。嵌りました。罠に…。 どんな罠か?って言うと、 Androidのソースコードレビュー(メモリリーク)に書いてあるような罠に、はまりました。気が付いたのは、BitmapFactory.decodeResource という関数をコールしている所で、OutOfMemoryException が発生するのが、きっかけでした。色々と探っていくと、自分で確保した Bitmap は、自前で recycle をしないといけないらしい事も、わかってきました。てっきり、GC の対象だと思っていたんですが…。コードまで追ってないので、本当のところは、わかりません。  さて、android のAPIには、Context を引数にとるものが多数存在します。この Context に渡すのは、どの context なのか?気になりますよね? getApplicationContext() で全部処理できれば万歳なんでしょうけど、終了確認のダイアログを出すときに、getApplicationContext()を引数として渡すと、お亡くなりになりました。いやー難しいですねー。  ふと思ったのは、Activity が Context を継承している設計は、失敗だったんじゃないでしょうか?という事です。
 interface ISecurityContext {
  Context getContext();
 }

 class Activity ... implements ISecurityContext {
   private Context mContext_;

   public Context getContext() { return mContext_; }
   ...
 }

こんな風に設計されていれば、循環参照でActivityがメモリリークする事も無かったのではないでしょうか? あと、自前でコードから生成した View には onDetachedFromWindow とかのイベント発生しないようで、クリーンナップのコードも自前でコールしないといけないんでしょうか?  Java の GC は、とっても安全ですね。android 難しいです(>_<)。

2012年3月3日土曜日

openssl-1.0.0g 備忘録

VC9 x64 環境で試してみました。コンパイルするのに perl が必要なので ActivePerl x64版 をダウンロードしてインストールします。面倒なんで perl はパスに追加しておくようにします。 openssl-1.0.0g をダウンロードして解凍します。後は、INSTALL.X64に書いてあるとおりに進めます。
C:\>cd \libs\openssl-1.0.0g
C:\libs\openssl-1.0.0g>perl Configure VC-WIN64A
C:\libs\openssl-1.0.0g>ms\do_win64a
C:\libs\openssl-1.0.0g>nmake -f ms\ntdll.mak
特にはまりどころも無く構築できます。せっかくなんでテストしましょう。
C:\libs\openssl-1.0.0g>cd out32dll
C:\libs\openssl-1.0.0g\out32dll>..\ms\test
と、すんなりいけました。 このままでは、利用できないので、インストールします
C:\libs\openssl-1.0.0g>nmake -f ms\ntdll.mak install
これで、c:\usr\local\ssl というディレクトリにインストールされます。

zlib-1.2.6 備忘録

今回は、VC9 の x64 環境で構築してみた。 まず、zlib-1.2.6 をダウンロードし、解凍する。 Visual Studio 20XX x64 WIN64 コマンドプロンプトを開いて
C:\>cd \Libs\zlib-1.2.6
C:\libs\zlib-1.2.6>nmake -f win32\makefile.vc
たったコレだけの呪文でOKです。 念のために、テストもしてみましょうか?
C:\libs\zlib-1.2.6>nmake -f win32\makefile.vc test
ハマリどころも無く、簡単ですね?

2012年3月1日木曜日

android TableLayout のデザイン時における肝 備忘録

かなりイラッときたので、忘れないように、ここに記しておく。
  • TableLayout には、android:shrinkColumns="0" を指定せよ
  • レイアウトを整えるのは、 android:layout_span="n" を活用せよ
以上、これだけです。
 だいたいデザイン時には、うざいので XML を直接編集してます。感覚的には HTML の Table をレイアウトするのに慣れている人が多いと思います。android:shrinkColumns="0" を指定しなかったら、もうカオスです。例え1行しか無くても、android:layout_width は、丸無視されます。TableLayout 様が御乱心されて、手に負えません。これを指定しなくても良いのは、列数が2までです。

2012/10/11 追記: よくある入力フォームで、1列目に「項目名」、2列目以後にテキスト入力項目等を配置しており、その中の EditText に入力される文字列が長すぎると、EditText が間延びしていき、結果的に「項目名」の列を駆逐して、レイアウトがガタガタになりました。 このような場合には android:shrinkColumns を消して、android:stretchColumns="1,2,3" というように2列目以後の長さを調整するように設定するで、対応しました。