2013年7月28日日曜日

Tesseractを使ってみよう(tess-twoビルド編)

良いOCR(光学文字認識)を探していて, いろんなところでTesseractの記述を見つけたのでテストアプリをビルドしてようとしてみた.
でもなぜか言われたとおりにやってるのにビルドできない…

あ"ぁ"ーん"!?

ってなったので頑張った結果をまとめてみる.

環境

  • OS:Windows
  • Terminal:Cygwin
  • sdk tool:SDK Tools, Revision 22.0.4
  • ndk:android-ndk-r7c-windows
  • ant:Apache Ant(TM) version 1.8.2
です.

準備

これらをダウンロード,設置,パスを通すなどもろもろを行いませう.
あと,ここからtess-twoをソースを持ってくる.
(今回はgitでcloneした.その時利用したリビジョンはe2480fcd44055edb4c01ac6f219ed59102ea529e)

では本題のビルド

流れはほぼ他のサイトで紹介されているものと同じ.
細部が違う感じ.
$ cd <持ってきたソースへのバス>/tess-two
$ ndk-build #時間結構かかるから気長に待つべし
$ android update project --path . --target 1 #--target 1がないとエラーになる
$ ant release
これでBUILD SUCCESSFULって言ってくれたらこっちのもんだぜb

2012年5月13日日曜日

Eclipseプラグイン更新時エラーへの対処法

Eclipse側のプラグインの更新時には,Eclipseの再起動が要求される.
このとき,エラーウィンドウが表示され,Eclipseが立ち上がらなくなることがある.
こういうときは,cmdから
eclipse -clean
とすることで解決することができることが多い.

2011年11月5日土曜日

外部レイアウトをプログラムから呼ぶ

には,

[Layoutクラス] obj =
([Layoutクラス])this.context.getLayoutInflater()
.inflate(R.layout.レイアウト名, null);

でOK.

外部レイアウトInclude時のエラーについて

Eclipse Indigoを用いてLayoutのIncludeを行おうとすると,
なぜかエラーで上手く表示できない.
そんなときは,http://download.eclipse.org/releases/indigo
から「グラフィカル編集フレームワークGEF SDK」をインストールすると直る.

2011年8月15日月曜日

Androidアプリ開発日記(2011/08/14)

今日はAndroidだけでなくJavaに関する話題.
JavaがStringをどう扱っているかということを考える必要がある.
Base64エンコードを行うとき,2バイト文字を入れると文字コードによってコンバート結果が異なる.

Javaではファイルを読み込むときに文字コードを指定することができる.
しかしそれはファイルを読み込む時点でそのファイルの文字コードを指定しているだけで,指定した文字コードで文字列を保持するわけではないようだ.
では読み込まれた文字列の文字コードはどうなっているのか.

結論だけ見ると,どうやらJavaが起動しているOSが使用している文字コードになるみたい.
その証拠にwindowsでエンコードするとShift-JISでエンコードされたものとなり,AndroidでエンコードするとUTF-8でエンコードされたものとなる.(Android OSの文字コードがutf-8であることより)

つまり,OSによって採用している文字コードは異なるので,何も考えずStringをBase64エンコードするとそれぞれ異なる結果が得られてしまう.それの吸収は次のようにすることである.(両者ともutf-8で統一するとする)

まずはwondowsでのやりかた
String str = ・・・
String encrypted = new BASE64Encoder().encodeBuffer(str.getBytes("utf-8"));

次にandroidでのやりかた
String str = ・・・
String encrypted = new String(Base64.encode(str.getBytes("utf-8")));
ようは変換したい文字列をエンコードするときに指定したい文字コードでbyte列を作ることによって同一の結果を得ることができるようになる.
デコードも同じようにすることで同じデコード結果を得ることができるよー.

ラベル: ,

2011年8月8日月曜日

androidアプリ開発日記(2011/08/07)

今回は通信(SFTP)について.
ファイルをやり取りしようとしたら,まぁSFTPかなという感じを覚える.
ではAndroidアプリでSFTPはできるのだろうか?A.もちろんできる.

元はJDK用に開発されているJSchというライブラリを使用することで解決可能.
筆者が採用している認証方式は公開鍵暗号方式なので,
まずは鍵を生成する.
以下のような感じで.
File keyfile = new File("id_rsa");

final int type = KeyPair.RSA;
final String pass = "";
try {
 KeyPair keyPair = KeyPair.genKeyPair(jsch, type);
 keyPair.setPassphrase(pass);
 keyPair.writePrivateKey(keyfile.getAbsolutePath());
 keyPair.writePublicKey(keyfile.getAbsolutePath() + ".pub",
   <コメント>);
 keyPair.dispose();
} catch (JSchException e) {
} catch (FileNotFoundException e) {
} catch (IOException e) {
}

はい.じゃあ繋げてみよう.手順としてはこう.
  1. JSchインスタンスの生成.
  2. 鍵の登録
  3. セッションの取得
  4. ChannelSftpインスタンスの生成
  5. セッションの取得
  6. やりたい処理
  7. 後処理
サンプルコードはこんな感じかな.
/********* 1 *********/
JSch jsch = new JSch();
/*********************/
/********* 2 *********/
try {
 jsch.addIdentity("data/data/" + this.getPackageName()
   + "/files/id_rsa");
} catch (JSchException e) {
 return;
}
/*********************/
/********* 3 *********/
Session session = null;
try {
 session = jsch.getSession("takefumi", "netherworld.dip.jp", 22);
} catch (JSchException e) {
 return;
}
/*********************/
session.setUserInfo(new UserInfo() {
 @Override
 public void showMessage(String arg0) {
 }
 @Override
 public boolean promptYesNo(String arg0) {
  return true;
 }
 @Override
 public boolean promptPassword(String arg0) {
  return true;
 }
 @Override
 public boolean promptPassphrase(String arg0) {
  return true;
 }
 @Override
 public String getPassword() {
  return null;
 }
 @Override
 public String getPassphrase() {
  return "";
 }
});
/********* 4 *********/
try {
 session.connect();
} catch (JSchException e) {
 return;
}
/*********************/
/********* 5 *********/
ChannelSftp sftp = null;
try {
 sftp = (ChannelSftp) session.openChannel("sftp");
 sftp.connect();
} catch (JSchException e) {
 session.disconnect();
 return;
}
/*********************/
/********* 6 *********/
やりたい処理
/*********************/
/********* 7 *********/
sftp.disconnect();
session.disconnect();
/*********************/

最後に問題となるのが鍵の置き場所.見える場所に置いておけば置換が楽になるけど,
他のアプリからもアクセス可能になってしまうため少々危険.
かといってassetsやアプリ用の領域に置こうとすると,ファイルを置くための処理をアプリに実装せねばならないし,assetsの場合は取得できるのがInputStreamのみという素敵設計.
「じゃあ鍵を暗号化しちゃえばいいんでね?」という案も通らない.
JSchが鍵のファイルへのパスを要するからである.
うーん.androidではID+PASSで通信設計したほうが安全なのかな?

ラベル: ,

2011年8月6日土曜日

Androidアプリ開発日記(2011/08/05)

これまでは開発に困った部分や疑問点を書いてきましたが,これはタダの日記.

PMの暗号化方式を変更して,PM4Aの読み込み機能の実装がほぼ終了.
PMによって暗号化したpasswordファイルをPM4A側で複合化できることも確認.
まだまだ使い勝手は悪いけどプロトタイプとしては耐えられると期待するところまでは来たはず.

逆にココまで来たからやらなくてはならなくなったことも多々あるけど・・・.
・PMパッケージのReadMe作成.
・PMパッケージのリリース

・PM4AとPM間の機能の差の吸収.
・レイアウトの検討
・可能な限りの各デバイスでのチューニング(主に縦横比,ディスプレイサイズなどに対する)
・同期における通信方の検討




にゃー(;´∀`)>
終わりが見えねぇや.
それが面白いと思ってしまう私はきっと兵隊予備軍・・・