2013年9月3日火曜日

また、Proguardにはまる

android アプリの作成で、Multipartでファイルアップロードなどを実現する必要があり、外部ライブラリとして.apacheのhttpclient,httpmime最新版を組み入れたプロジェクトを作成しました。
いざ本番と、パッケージ構築しますと「Proguard returned with erro code1. See console」でエラーとなります。
コンソールで確認すると、やはりapache系で沢山の警告が吐かれていました。したがってprguard-project.txtに-dontwarn org.apache.http.**の一文を追加、無事コンパイルは通すことができ、やれやれとそのAPKを実行すると、インターネット通信系で異常終了します。
結局、 prguard-project.txtには
-dontwarn org.apache.http.**
-keep class org.apache.http.** { *; }
の2行を追加し、無事正常動作するAPKをProguardを適応した状態で得ることができました。
やれやれ

2012年10月21日日曜日

PCからUSB経由でNexus7 ストレージ内を見ると

制作アプリをNexus7にセットアップし、動作の検証を行ないました。
なんの支障も無く完了と思ったところ、アプリでストレージに書き出したファイルがPC側で見えないことに気付きました。
Nexus7にセットアップされている「アストロファイルマネージャー」ではちゃんと表示されているし、当然自作アプリからの読み書きも正常に動作しています。
しかたがないので、ファイル書き込みの各Activityで
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
        intentFilter.addDataScheme("file");    
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
                  Uri.parse("file://" + Environment.getExternalStorageDirectory()+"******")));

を呼び出しインディクスの再生成を行なって対応し、マーケットにリリースしました。

他のアプリはどうなっているかと思い、「OfficeSuite Pro」でMy Documentsフォルダに文書ファイルを保存し、PCから見てみるとやはり表示されません。
これって仕様なのか、あるいは今回入手したNexus7の不具合なのか、はたまた...
このようなことでお困りの方はいらっしゃらないのかなー   

2011年11月22日火曜日

Android HTMLのページ内リンク

ご存知の通り、AndroidのインターネットブラウザはHTML5対応です。
これでスッキリした、HTML5さえ習得すればIETesterのお世話になることもない。

で、「工事メイト for Smart」のヘルプはインターネットを介してブラウザで表示することにした。
現場では、インターネット回線が拾えない状況もありえることも懸念されたが、現場でヘルプを読む機会は少ないと判断した。
ホームページ上にヘルプを置いておくと、アプリの機能改善などを行っても即座にそれをヘルプに反映でき、使い方によっては利用者に対しメッセージ伝達の手段としても活用できるメリットがあると考えました。

Android のHTMLページはどうしても細長くなる。どんどんスクロールして読み続けるパターンを採らざるを得ない。
で、使いたくなる機能がページ内リンク(href="#アンカー名")です。
ところが、Androidのブラウザはページ内リンクを無視する、まるで「前そこは見たでしょう、見たところに又戻ってもしょうがないですよ」といっているみたいです。

で、解決策はJavaScriptです。
世の中はjQuery一色ですが、prototype.jsも捨てたものじゃない。
ジャンプ表示したいエレメントにidを設定し、マウスのクリックイベントに

Elemen.scrollTo(ele)
と設定するだけ、エフェクトなしですとこれだけでページ内リンク機能の問題は解決します。

2011年11月20日日曜日

Androidアプリ「工事メイト for Smart」をリリース

2011.11.14 アンドロイドマーケットに「工事メイト Pro」と「工事メイト Light」を登録しました。

思えば最初に私が測量ソフトを市場に最初に出したのは、今から22年前 やはり携帯端末ソフト「ザ・現場Ex」というシャープ電子手帳PAシリーズで動作するアプリでした。
続けて「ザ・現場DT」というトータルステーションと接続して利用するデータコレクタタイプをリリースもしたのですが、それ以降の携帯端末用アプリの作成はひかえてきました。

ザウルス・Parm・WindowsMobile etc... 短期間に生まれては消えていくAP環境やハードウエアに少し違和感を感じていたのがその主な理由でした。

昨年末、すこし気付くのが遅かったかも知れませんが、この違和感を解消する存在スマートフォンアプリに気付きました。

まず選択肢としてAppleとAndroidの2つがありましたが、工事現場で利用される端末としてタフさを要求されると考え、複数のハードメーカーから多様なニーズに対応するハードが供給される可能性のあるAndroid環境での開発としました。

開発自体は、計算モジュール自体はWidnowsで動作する「工事メイト」のC++ソースをJAVAにインプリしながらチューニングを施し、ユーザインタフェイスをAndroid用に新規構築するといった手法をとりました。

フリックやピンチイン・アウトなどのインタフェイスは、まさに憔悴の機能であったため非常に楽しく開発を進めることができました。

つづきは後日

2011年11月17日木曜日

Conversion to Dalvik format failed with error 1

昨日まで問題なく apk を出力していたandroidプロジェクトが突如 「Conversion to Dalvik format failed with error 1」のエラーを吐いてストップ。
SDK のアップデイトも怠ってないはず。
原因は、なぜか proguard が古いバージョンに戻っていたためでした。
で、Android SDK Tools の proguardフォルダの binフォルダと libフォルダを、本家からダウンロードした最新版と差し替えて、解決。

2010年3月15日月曜日

続 Zend_Mailの文字化け対策

Zend_Mailの文字化け対策の続きです。
漢字で登録した送信者名の文字化けを防止するには、
Mail.phpの protected function _formatAddress($email, $name)関数内の
$encodedName = $this->_encodeHeader($name); を
$encodedName = mb_encode_mimeheader($name, 'ISO-2022-JP'); へと
変更することで対応できます。
また、長いサブジェクトの後ろ文字化けを防止するには
protected function _encodeHeader($value)関数内の
Zend_Mime::LINEENDを、'' へとに変更することで対応できます。

2010年3月7日日曜日

Prototypeベースのドラッグ移動・リサイズ可能ポップアップウィンドウ

やはり、自分で作成し細かな拡張や変更のできるポップアップウィンドウがほしくなり、ポップアップウィンドウクラスを作成いたしました。
Mit-Styleライセンスとしていますので、よろしければご利用ください
ほかにも、予約状況とリンクした、日時指定ができるカレンダークラスやポップアップ検索ウィンドウクラスなど色々作成しているのですが、Ajaxでバックグラウンドのサーバサイトスクリプトと絡み合っているため一般化しづらく、公開にはいたっていません。
暇があれば、一般化したクラスとして公開したいと考えています。

2009年12月24日木曜日

IE6,7でwindows.jsのエラーを防止する

prototypeベースでサブウィンドウを表示するwindows.jsは高機能で実装も簡単ですが、prototypeのバージョンが1.6になったころから、IE6及びIE7でエラーを吐くようになりました。
原因は、windows.jsの_checkIEOverlapping関数にありこの関数の
if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0)...){
}
の部分をコメントアウトすることで、エラーを吐くことを防止することができます。
もはや古典となったprototype.jsですが、使い慣れた環境はなかなか捨てきれないものです。

Zend_Mailの文字化け対策

Zend_Mailは非常に便利ですが、全角の送信者名や受信者名が文字化けします。
原因は、 送信者名や受信者名をUTF-8からISO-2002-JPに変換した後、それをsetFrom及びaddTo関数の引数として渡すことにより生じています。
setFrom,addTo関数では、その内部で_filterName関数によりサニタイジングしていますが、その内容は
protected function _filterName($name)
{
$rule = array("\r" => '',
                  "\n" => '',
                   "\t" => '',
                   '"'    => "'",
                   '<' => '[',
                   '>' => ']',
        );
       return trim(strtr($name, $rule));
}

ですので、ISO-2002-JPでは、バケバケ文字の出来上がりとなります。
とりあえず、送受信者名のサニタイジングは事前に自前で処理し、 _filterNameはコメントアウトして文字化け対策は完了です。

2009年8月23日日曜日

Prototype.jsとZend_Jsonで簡単にAjax

比較的多くのデータ数を非同期通信でやりとりするときに、よく使っているスタイルを紹介します。
まずJavaScriptで
function toPHP(){
    var options = {
//<form のidはxyzだったとします。
            method:'post',
            onSuccess:getResult,
            parameters:$("xyz").serialize()
//これで、form内の全項目を一括で渡すことができます
    };
    new Ajax.Request('../lib/ajax/sample.php', options);
}

sample.phpでは
//結果はjson形式で返します
header('Content-Type: application/json; charset=UTF-8');
//jsでserialize時に自動的にurlencodeされているため
foreach($_POST as $key => $val){
    $_POST[urldecode($key)] = urldecode($val);
}
[ここでサーバ側の処理をします]
$res['abc']  = '123';
$res['def']  = '456';
     ・
     ・
//Js側に返したいデータを連想配列に登録していきます
echo Zend_Json::encode($res);
//連想配列をJson形式に変換して返します

返された値をJs側で処理するには
function getResult(httpObj){
    var Itm =  httpObj.responseJSON;
    $("abc").value = Itm.abc; 
//というアクセスもできますし配列に変換した後に処理することもできる

以上 簡単・安全にAjax通信する方法の紹介でした。

allow_url_fopenがoffのサーバで imagecreatefromstring

google Chart からレスポンスされる画像をサーバに保存し、結果をPDF出力ページ内に挿入しようとしました。
で、このアプリを利用していただくユーザ様のレンタルサーバの設定状況を確認してみると、allow_url_fopenがoffとなっていて、レスポンスをそのままimageCreateFromPngで画像リソース化することができないことがわかりました。
そこで、Zend Framework の HttpClientクラスを使用することにより、この問題を簡単にクリアすることができましたので、ここに「おぼえがき」を書きました。

インクルードは
require_once 'Zend/Uri.php';
require_once 'Zend/Http/Client.php';
の2つ

まず、
Zend_Uri::setConfig(array('allow_unwise' => true));
として、googleChartに渡すパラメータに含まれる |  なども指定可と変更
つづいて
$client = new Zend_Http_Client("http://chart.apis.google.com/chart?.........");
$respose = @$client->request();
if($this->respose->isError()){
return false;
}
$img = @imagecreatefromstring($this->respose->getRawBody());

とすることで、allow_url_fopen offの環境でも無事に画像リソースを外部サーバから受け取ることができます。