2015年12月30日水曜日

Android Library の生産性の悪さ

年末に小ネタを Android 開発、生産性が悪いですね〜。自分は Java を生産性の低い言語だと考えてるのもあって、イライラもマックスですね。 Androidライブラリにリソースを組み込めないのも、生産性を下げる大きな要因だと思いませんか? DRY の原則を適応できない。 小ネタで、ログイン・ダイアログをライブラリ用として書いてみました。 Activity からは、下のような感じで呼出ます。
  showLoginDialog(this, new OnLoginListener() {
    @override
    public void onLogin(String name, String pass, int which) {
       if( DialogInterface.BUTTON_POSITIVE == which ) {
          if( validPassword(name, pass ) {
          } else {
          }
       } else {
          finish();
       }
    }
  });
import を略してすみませんが、以下の感じです。
  public interface OnLoginListener {
    public void onLogin(String name, String pass, final int which);
  }

  public static AlertDialog.Builder createLoginDialog(final Context context, final OnLoginListener l ) {
    final LinearLayout ll = new LinearLayout(context);
    final EditText userEditView = new EditText(context);
    final EditText passEditView = new EditText(context);
    final TextView tv1 = new TextView(context);
    final TextView tv2 = new TextView(context);
    final DialogInterface.OnClickListener ocl = new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialogInterface, int which) {
        l.onLogin(userEditView.getText().toString(), passEditView.getText().toString(), which);
      }
    };
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT);
    ll.setLayoutParams(params);
    ll.setOrientation(LinearLayout.VERTICAL);
    tv1.setText("USER:");
    userEditView.setInputType(android.text.InputType.TYPE_CLASS_TEXT);
    tv2.setText("PASSWORD:");
    passEditView.setInputType(android.text.InputType.TYPE_CLASS_TEXT);
    ll.addView(tv1);
    ll.addView(userEditView);
    ll.addView(tv2);
    ll.addView(passEditView);
    return new AlertDialog.Builder(context)
            .setIcon(android.R.drawable.ic_dialog_info)
            .setTitle("login")
            .setView(ll)
            .setPositiveButton(android.R.string.ok, ocl)
            .setNegativeButton(android.R.string.cancel, ocl);
  }

  public static void showLoginDialog(final Context context, final OnLoginListener l) {
    createLoginDialog(context,l).show();
  }
  
  

2015年12月15日火曜日

Windows版 PostGIS x64版の shp2pgsql が動かない

PostgreSQL は、x86 版のサーバを使用するよりも x64 版のサーバを使った方が良いんじゃないかなー?と思って、x64版をインストールしたんですわ。

そしたら、shp2pgsql が 0xc000007b とかエラー吐いて動かないとか言われました。
ググってみたら、この問題は、もう、かれこれ3年以上前から放置されています。
しかも回答者の認識も「 libiconv-2 は windows では使われてないから無くても大丈夫あるよ」てな感じで、脱力感が半端ない。
その他、あちこちで、この問題に関して質問されているけども、ほぼ放置プレー。

はいはい、またかよっ。

って、事で libiconv-2.dll の x64 版を、どこかから入手しなくては!
検索したら、dll のダウンロードサイトが軒並み引っかかりますが、この手のサイトから dll をダウンロードする勇気は、私にはありません。マルウェア配布の巣窟なんじゃないか?と思うのが普通の感覚でしょう。

はい、QGIS Lyon x64 版をインストールして

C:\Program Files\QGIS Lyon\apps\grass\grass-6.4.3\bin\libiconv-2.dll



C:\Program Files\PostgreSQL\9.4\bin

にコピーしましょう。


Postgis のメンテナーさんは、grass のメンテナーさんにコンタクトを取って、PostGISのインストーラに libiconv-2.dll をちゃんとバンドルした方が良いです。

2015年12月13日日曜日

MVNOを検討していてわかった事

自分の携帯は、ガラケーです。スマートフォンにすると通信料が高くつくので敬遠していました。 しかし、
  • ガラケーの端末が、強く閉じると電源OFFになってしまい、今にも壊れそう
  • 今時スマートフォンにしないとコミュニケーションにも支障をきたす
  • MVNOというサービスが出てきて通信費が手頃になってきた
というように、移行する条件が揃ってきたので、これを期にフリーSIMの使える端末について調べてみました。

 自分のライフスタイルに合ったスマートフォンというと、京セラのTORQUE G01, G02 あたりになります。ところが、こいつのフリーSIMの入手が厄介です。

 この機種は au から販売されていますが、フリーSIM化するためには、総務省の指針により購入後6ヶ月経過しないとダメです。auと契約しないで端末を購入できれば良いのですが、契約しないで端末を買う事はできません。

 中古の携帯が流通していて、その中で購入後6ヶ月以上経ってフリーSIM化されているものを買えば良い事になりますが、これがまたリスクが高い。フリーSIM化されていても、様々な要因で後から通信ロックを食らってしまう状況がある事がわかってきました。通信ロックを食らう状況は、以下のようなもの
  • 元の持ち主が手放した携帯がオレオレサギに利用され、その持ち主の携帯がブラックリスト扱いにされてしまう。
  • 元の持ち主が料金滞納をしてしまったため、巻き添えで通信制限を食らってしまう。
  • 元の持ち主が紛失したと嘘をついて携帯を売約したため、実はリモートロックがかかって外せない状態のまま
見ればわかるように、中古販売店からフリーSIM化された状態で買っても、いつ巻き添えを食って携帯が使えなくなってしまうか、予測できません。確率は低いにせよ、常に使えなくなる可能性があるわけです。
 こうやって考えて行くと、
  • 最初からフリーSIM化された機種を買う
  • 元の持ち主が判明していて、信頼できる携帯
の2択で行くのがリスクが無くて良いです。
スマートフォン、高いけど、リスクを考えたらフリーSIMの端末を選択するのが良さそうですね!
 Zenfone 2 なんか、コスパが良いなぁと思ってたんですが、日本の家電製品として販売するために取っておかないといけない「技適」マークを取得していないという理由で、MINEO の au プランで使えないんだとか…(使えるけど、使うと違反になる)

いやー、悶々としますね。