SyntaxHighlighter

2012年8月14日火曜日

近況

放置している間にダウンロード数増えてました。インストール数は300超え、有効端末数は85。 いつの間にか5つ星評価も4つになっており、うれしいことにコメントも1件もらえました。英語です。

Excellent app. This is just what I was looking for. It works great and looks great.

嬉しいですねー。 最近職場が異動になって慣れない仕事で余裕が無く、アプリもブログも放置になっていましたが、少しずつ落ち着いてきたのでまた無理しない程度に動き出せればなーと考えてます。

2012年5月19日土曜日

技術って何だったっけ?

久々に Android 以外の話。

部署異動で、運用の仕事からプリセールスのSEに変わりました。主な仕事は打ち合わせと調整と提案書作りと見積もり作り。 以前は毎日のようにサーバにログインしてコマンドを打ったりしていたわけですが、今では一切ありません。 『技術力=いかにたくさんの製品知識があるか』です。 その製品の仕組みとか操作方法とかまでは知る必要は無く、ホームページに載っていることレベルの知識。 あとは値段。提案が終われば、その後は事務作業メインで設計や構築は外注を使います。 商用製品についてあまり知識の無い私は底辺の人間。

正直なところ、提案書作りはたまにならいいけど毎日そればっかりっていうのはつまらないし、見積もり作りもつまらないし、無駄に多くて長い打ち合わせもつまらないし、連日終電まで働いて、何が楽しいのか、何をモチベーションに頑張ればいいのかわからず辛い。 商用製品の知識が増えることで技術力が高まったと私自身が感じられれば、成長を実感できるということなのでやりがいはあると思うのですが、私はどうもそうは思えないみたいです。 プリ向いてないですね。ポストも向いているかどうかはわからないですがプリよりは確実に仕事が楽しかった気はします。 それとも労働環境の差でそう思うだけなんだろうか。疲れてて頭がまわらない。趣味でやってるプログラミングは楽しいです。 でももしこれが仕事になってしまったら、楽しいと思い続けられるのかな? だいいちプログラマの単価はオフショアの影響も大きく年々下がっているので今更上流SEではなくプログラマに転職っていうのは考えにくい選択肢ですね。 天才レベルなら別ですが。凡人なので。家庭もあるので給料どんなに安くてもいいとはやっぱり言えません。年齢的にも後戻りが出来なくなりつつあります。

ここに書いてある『手配師』まさにこれ。http://ceo.livedoor.biz/archives/24821118.html

多言語対応

Android アプリを Google Play で公開すると、デベロッパーコンソールというものでアプリがどれぐらいダウンロードされたかとか統計情報が見られるんですが、そこの『ツール』カテゴリ全体の統計を見る限り、日本のシェアは 12.5% です。 残りの 87.5% は外国です。ちなみにシェア1位はアメリカ(31%)、2位は韓国(13.1%)、3位が日本です。 私の公開しているアプリも、30% は日本からのダウンロードですがそれ以外は外国からです。 日本でしか使えないようなアプリだったら日本語の UI だけでいいと思いますが、ロケーション関係なく使えるアプリを作るなら英語対応は必須でしょう!

というわけでアプリの多言語対応の仕方ですが、全てのテキストを res/values/strings.xml で定義していれば対応は簡単です。 values フォルダをコピーして、values-ja フォルダを作ってください。 日本語のテキストはこちらに記載して、元の values フォルダの中の strings.xml は日本語で記載していた部分は全て英語に変えましょう。 たったこれだけです!英語の UI を使用するか日本語の UI を使用するかは端末の言語設定によって勝手に切り替わります。

2012年5月14日月曜日

EditText で Link

久々にはまったことメモ。
テキストにリンクを貼る方法は知っている限りだと以下の4つなんですが

  • Html.fromHtml で <A> タグを使う
  • ClickableSpan を setSpan する
  • URLSpan を setSpan する
  • setAutoLinkMask を使う

いずれも、EditText で使うと、文字の編集はできなくなってしまいます。 1.6 のエミュで試してみた限りでは、上3つはかろうじて入力できるものの文の先頭に文字が挿入されるだけでカーソル移動がカーソルキーでもタップでも一切できない(リンクのほうにイベントを奪われる)ので現実的には編集不可能。 AutoLink の場合は入力した時点で例外でコケました。
ググってみたんですが、そもそもリンクを貼る機能は TextView での使用を前提とした機能で EditText 使うなってことみたいでした。
でもまぁ、編集さえしなければ EditText でもリンク自体は機能するので、わざわざ TextView に移し変えるのもエコじゃないし(入ってるテキストが長い上に色んな span たくさんついてるので、移し変えるとまた getSpan でえらいリソース食うに違いない!)、リンク機能が有効な場合は閲覧モードで開き、コンテキストメニューで編集モードに切り替えられる(編集モードの間はリンクはタップしても何もおきない)、という仕様にしてみました。バリバリ編集しつつリンクはリンクでタップしたら飛べるぜ!って実装方法知っている方いましたら教えてください・・・。

ちなみに、オプションメニューに関しては、onCreateOptionsMenu が呼ばれるのは最初の1回だけで、動的に変更したい場合には onPrepareOptionsMenu を使う必要がありましたが、コンテキストメニューに関しては毎回 onCreateContextMenu が呼ばれるみたいです。動的に変えたい場合もこのメソッドに入れといてOKです。onPrepareContextMenu というメソッドは存在しないぽい。

2012年5月13日日曜日

次はどうする?とお勧めサイト群

作りたいアプリを考えるのが次にやることです。興味がある分野を選んで、構想を描きましょう。 目標は大きいほうがいいので、シンプル以外取り柄のない無駄アプリにする必要はないと思います。 それだったら参考書を買って載ってるサンプルアプリでも作ればいいです。 Google Play を見て、競合についても調べてください。 考えていたものと同じ機能を持った、十分に優秀すぎるアプリが既に他者によって公開されているのであれば、頑張って作って公開しても無駄です(金儲け的な意味ではなく、無料であっても、誰にもダウンロードされなければ虚しいですよね)。 もちろん、最終的にそのアプリを超える機能を実装する!という目標なら全然アリだと思います。

作りたいアプリが決まったら、ググリながらの製作開始です。

Google Play (旧 Android マーケット)に公開する際には手続きが色々と必要ですが、アプリが出来てからで充分です。

基本的にはググってもらえばいいのですが、私が最初のアプリ製作時に非常にお世話になったサイトをいくつかご紹介します。

Androidプログラマへの道 ~ Moonlight 明日香 ~
ブログではなく Wiki で、情報が探しやすいです。何でググればいいのかもわからない初期の頃に非常に役立ちます。とにかく一度ざっとメニューを眺めてください。サンプルコードもシンプルで、重要な箇所だけ色づけしてあるので見やすい。ググる前に一度ここを訪れると良いと思います。
Tech Booster
ググってれば必ず出会うサイトです。ブログ形式なので、必要な情報を検索して調べる感じですが、情報量多いです。
Y.A.M の 雑記帳
ここもググって出会うことが多々あると思います。本も何冊か書かれている方のブログです。 レイアウトに関する情報、Google の API の情報の日本語訳(まとめ)などが助かります。
Stack Overflow
英語の、プログラミングに関するQ&Aサイトです。英語だからって毛嫌いしないで、ググって出てきたら読んでみてください。 日本語の情報が無くて、ここにだけヒントがあった、ということはよくあります。

2012年5月11日金曜日

Hello, Android World! 解説その2

前回の続きです。最後にソースを見てみましょう。HelloActivity.java を開いてください。

package jp.gr.java_conf.akr.hello;

import android.app.Activity;
import android.os.Bundle;

public class HelloActivity extends Activity {
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 }
}

Android では Activity というクラスで画面を作ります。基本的に 1画面=1Activity です。コンストラクタはありません。 onCreate というメソッドは画面が起動したタイミングで必ず実行されるメソッドです。 初期化等はここで行うことが多いです。onCreate の他にも、状態遷移に合わせて呼び出されるメソッドが決まっています。 「Android 状態遷移」でググってください。
setContentView で、その Activity で使用するレイアウトファイルを指定します。 res フォルダ内の内容は、ソースコードからはこのように R.type.name という書き方で呼び出せます。 layout の場合、R.layout. の後に res/layout の中に作成したレイアウトファイルの、拡張子 .xml を除いた部分を記載します。 今回のソースには出てきませんが、前回説明した res/values/strings.xml の中の文字は R.string.name といった形で記載します。

このソースコードでは他に何もしていません。res/layout/main.xml を画面に表示するだけのプログラムです。 main.xml では TextView が設置されており、その初期テキストとして res/values/strings.xml の中の文字列が呼び出されて、画面に Hello world が表示されたわけです。

これで最初のプログラムの説明は終わりです。

2012年5月10日木曜日

Hello, Android World! 解説その1

前回 Hello world を表示させましたが、これはデフォルトで新規作成されたプロジェクトがそのようなコードになっているからです。まずプロジェクトのディレクトリ構成から見ていきます。(取り急ぎ必要なところだけ)

helloproject.png
src
Java のソースコードを格納するディレクトリです。パッケージ名の下に HelloActivity.java というファイルがあると思います。
gen
Eclipse が勝手に生成するファイルが入るので気にしなくていいです。
assets
プログラムが利用する任意のリソースファイルを配置できます。デフォルトでは何も入っていないはずです。
bin
コンパイルされた実行ファイルが配置されます。
res
プログラムが利用するリソースファイルを配置します。drawable, layout, values というフォルダがあるはずです。ターゲットを高めのバージョンにした場合は drawable には末尾に -?dpi といった文字列がついた複数のフォルダができているかもしれません。それぞれ、画像、画面のレイアウト、値のリソースファイルを格納します。名称にはルールがあって、なんでもいいというわけにはいきません。
AndroidManifest.xml
アプリケーションの設定が書かれている xml ファイルです。
project.properties
Eclipse上のプロジェクトのプロパティが保存されています。直接編集はしません。

画面のレイアウトは res/layout の中に保存します。デフォルトの main.xml をダブルクリックして開いてみてください。右側のアウトラインという小窓に LinearLayout と TextView が階層構造で表示されています。これらが画面の中にある部品です。LinearLayout は複数の部品を並べる場合の並べ方を指定するレイアウトの一種で、それ自体は目に見えるものではありません。TextView はユーザには編集させないテキスト表示エリアです。編集可能なテキスト領域は EditText を使います。パレットからドラッグ&ドロップで画面をデザインすることができます。何か適当にボタンでも配置してみてください。配置したら、真ん中の小窓を Graphical Layout タブから main.xml タブに切り替えてください。xml が表示されます。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical" >

  <TextView
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:text="@string/hello" />

  <Button
   android:id="@+id/button1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="Button" />

</LinearLayout>

layout_width と layout_height という属性は、それぞれ部品の幅と高さを指定するものです。fill_parent または match_parent で親要素の領域一杯まで広がろうとします。意味は同じです。使い分けについて気になる人は「fill_parent match_parent 違い」でググってください。wrap_content にすると表示するものの量に合わせて必要最小限のサイズになろうとします。 単位付きの数値で指定することもできます。ちなみに Android の単位は独特ですので単位指定しようと思ったらまずはググってください。
text という属性で初期表示テキストを指定します。ここで、TextView の text 属性の値に注目してください。@string/hello となっています。これは、res/strings.xml の中の hello という名前の要素を参照することを意味します。res/strings.xml を開いてみてください。

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="hello">Hello World, HelloActivity!</string>
<string name="app_name">Hello</string>

</resources>

name 属性が hello の要素は、Hello World, HelloActivity! となっています。これが @string/hello で参照されて TextView に表示されたわけです。@string/hello を @string/app_name に変えれば Hello と表示されるようになります。基本的に画面表示するテキストは全て、レイアウトの xml ファイルやソースコード中には直接書かず、strings.xml に記載してそれを参照させてください。理由はまた別の記事で説明します。

最後はソースです。これは次回説明します。

2012年5月8日火曜日

Hello, Android World!

前回の記事で開発環境は整いました。今回はプログラミング定番の Hello world してみましょう。

Eclipse を起動してください。

ファイル→新規→その他→Android→Androidプロジェクトを選択して次へを押してください。 プロジェクトというのはアプリケーションの単位です。プロジェクト名=アプリ名と思っておけばいいです。今回は Hello にしましょう。ワークスペース内に新規プロジェクトを作成、でデフォルトロケーション使用でOKです。
次へを押すとビルドターゲットの選択画面になります。ここで選択したターゲットによって、使える API が違ってきます。できるだけ幅広いユーザに使ってもらえるようにするには低いバージョンを選択します。最新機能を使いたければ高いバージョンを選択します。ここでは Android 1.5 を選択しましょう。ちなみにターゲットは途中で変更することも可能です。
次へを押すとアプリケーション情報の入力画面になります。Application Name はそのままで良いでしょう。Package Name には、通常、ドメイン名を逆にしたもの+任意の名称を入力します。独自ドメインをもっているならそれを使います。例えば hogehoge.com という独自ドメインを取得しているとしたら、 com.hogehoge.android.hello といった形です。独自ドメインが無ければ、今回のようにどこにも公開する予定が無いアプリなら何でもいいですが、公開予定があるならフリーのサービスを利用しましょう。Package BOF なら無料ですぐにユニークなパッケージ名を確保できます。ただし登録時に入力した名前とメールアドレスは誰でも参照できる状態になってしまいますので注意してください。ただ、アプリを公開するならどのみちメールアドレスは公開することになるのでそれと合わせておけば良いです。
アクティビティーの作成にはチェックを入れたままで。Minimum SDK もデフォルトのままでOKです。ここで設定した SDK のバージョンによって、アプリをインストールできる端末が決まります。先程のビルドターゲットと合わせる必要は必ずしもありません。ビルドターゲットのほうは、低いバージョンにするとそれより後のバージョンで実装された機能は使用できなくなりますが、こちらはそのような制限がかかりませんので注意してください。・・・ややこしいですね。また別の機会にもう少し詳しく説明します。ここではデフォルトのままにしておいてください。これも後から変更することも可能です。
完了を押すとプロジェクトが作成されます。

helloproject.png

パッケージ・エクスプローラー上でプロジェクト名の上で右クリックして、実行→Androidアプリケーションをクリックしてください。勝手にエミュレータが起動されて実行されます。

eclipse04.png

上の画像のように表示されれば成功です。もしエミュレータがいつまでたっても起動しない場合は、一度エミュレータを落として、Eclipse ごと再起動してください。 起動したらエミュレータを手動で起動します。 Hello プロジェクトを右クリックして、実行→実行の構成をクリックし、ターゲットタブに切り替えて Deployment Target Selection Mode をマニュアルに変更して適用し閉じます。 エミュレータが起動したら、再度実行してみてください。下の画面のようなウィンドウが表示されるはずです。

eclipse05.png

赤枠で囲んだ部分に起動したエミュレータが表示されているはずです。それを選択してOKを押してください。(エミュレータが起動しているのに赤枠部分に何も表示されていない場合はエミュレータが Eclipse に認識されていません。もう一度エミュレータも Eclipse も閉じて、起動しなおしてみてください。)

ソースの解説はまた次回。

2012年5月6日日曜日

Android開発始め方

初めてアプリを公開してからちょうど1ヶ月たちました。 Javaといえば10年ぐらい前に入門書に載ってたサンプルアプレットを1つだけそのまま打ち込んで動かしてみたことがある、だけのレベルから本も買わずにここまでよくきたな、と(誰も褒めてくれないので)自分で自分を褒めてあげたい。

で、これからAndroidアプリの開発やってみようかな、という人向けに多少アドバイスみたいなもんをアウトプットしていこうと思います。

まず。プログラミングというものを一切やったことがない人は正直厳しいと思いますのでJavaの入門書買って一通り勉強しましょう。 Androidの本は(立ち読みした限りだと)Javaについてはあんまり丁寧に扱ってないので不向きだと思います。

プログラミング(シェルスクリプトでもOK)は経験あるけどJavaは無い、という人。 オブジェクト指向について多少なりとも理解しているならそのまま突っ走れます。 Javaの入門書をざっと流し読みすると更に良いと思います。 お金かけたくないならWebでもいいかと。基本的に、走りながら、わからないところはググる、という形で進んでいくことになります。 英語のサイトを全文翻訳にかけずに読める程度の英語力がないと現状ではWebだけを頼りにするのは難しいです。 オブジェクト指向っておいしいの?という人はやはりJavaの入門書から。 英語全く読めませんという人はAndroid開発本購入したほうがいいです。

Java経験ばっちりの人に私からアドバイスできることはありません・・・。むしろしてほしいです。

Java入門をここでやるつもりはないので、ターゲットとなる層は2番目の突っ走れる方々です。

まず、開発環境を用意します。作業用PCはWindows XP~7 を前提としています。 (ちなみに、ここで説明している方法でインストールする場合には関係ないですが、Java や Eclipse を個別インストールする場合、OS が 64bit 版でも、インストールするソフトは全部 32bit 版を選んだほうがいろいろとめんどくさい思いをしなくて済むと思いますので、ハマるのが好き、という方以外は 32bit 版を選びましょう。)

  1. Eclipseインストール
    開発環境の構築でめんどくさい思いをしたくなければ、日本語化もされていてJREも含め全部いりの Pleiades を強く推奨します。現在の最新は Eclipse 3.7 Indigo ベースの Pleiades です(図1)。そのボタンをクリックして、Java の Full All in One をダウンロードし(図2)、解凍してC直下に配置します(自己解凍 exe ファイルの場合デフォルトでC直下が指定されていたと思います)。C:\pleiades\eclipse にある eclipse.exe をダブルクリックしてとりあえず起動できるか確認しておきましょう。今後毎回ここから起動することになるのでデスクトップにショートカットでも作っておくといいです。起動したらワークスペースの選択を迫られます。データファイルを保存する場所です。パスの途中にスペースや日本語が入らなければどこでもいいです。デフォルトでもいいですし、Cドライブにあまり余裕が無ければ違うドライブにしても構いません。起動が確認できたら閉じてください。
    図1 eclipse01.png
    図2 eclipse02.png
  2. Android SDKインストール
    最新のSDKをここからダウンロードしてください。推奨されているインストーラー付きのほうにして、ダウンロードが完了したらインストールしてください。場所はこれもC直下にフォルダを作ってそこにインストールしたほうがいいと思います。インストールの途中で JRE (または JDK ) が見つからないと言われてしまった場合は、いったん閉じて、環境変数の JAVA_HOME に Pleiades 同梱の Java のパスを設定します。環境変数は、(マイ)コンピュータを右クリックしてプロパティ→詳細設定→環境変数ボタンで設定できます。変数に JAVA_HOME、値に C:\pleiades\java\6 を入力してください。再度インストーラーを実行すればいけるはずです。
  3. ADTプラグインのインストール
    Eclipseを起動し、ヘルプ→新規ソフトウェアのインストールを実行します。追加ボタンを押して、名前は適当に、ロケーションに https://dl-ssl.google.com/android/eclipse/ を入力してOKを押してください。
    図3 adt01.png
    表示されたもの全てにチェックを入れて次へをクリックし、そのまま画面の指示に従って全てインストールしてください。 上手くいかない場合は、上記のURLを https ではなく http で試してみて、それでも駄目ならアンチウイルスソフトやWindowsファイアウォールを一時的に無効にして試してみてください(ただし自己責任で)。 インストールが完了すると Eclipse の再起動を求められますので再起動してください。
  4. Eclipse設定
    起動したら、ウィンドウ→設定を実行して、左側のメニューから Android という項目を選択してください。右側に表示された設定の、SDK ロケーションという項目に、2でインストールした Android SDK のパスが入力されているか確認してください。入っていなければ参照ボタンを押してインストールパスを設定してください。変更したら適用ボタンを押し、OKボタンを押して閉じます。
  5. プラットフォームのインストール
    ここまで上手くいっていれば、Eclipse のツールバーの下のアイコンが並んでいるエリアに下図のアイコンが出現しているはずです。
    図4 eclipse03.png
    左側のアイコンをクリックしてください。 めんどくさければ、全てで良いです。容量とダウンロード時間を節約したければ、Tools 全部と、各バージョンの SDK Platform と Google APIs と Extras 全部にチェックを入れてインストールします。途中でエラーが出ても、とりあえず SDK Platform がインストールできていればOKです。とっても時間がかかりますので覚悟しておいてください。
  6. エミュレータ作成
    先程の2つのアイコンのうち右側のアイコンをクリックしてください。エミュレータの作成、削除、起動などの管理はここから行います。 新規をクリックしてとりあえず1つ作成してみましょう。名前は何でも良いです。ターゲットはエミュレートする Android のバージョンです。最終的には作成するアプリで動作保障するバージョンの分は全て作成することになると思いますがここではとりあえず何か1つ適当に選んでください。SDカードはとりあえず最小の 9MB でいいです。これも大きいファイルを保存するようなアプリを作るなら適宜大きくしてください。スナップショットは、有効にすると2回目以降の起動が早くなります。ただし終了時にイメージファイルを保存するので、終了は少し遅くなり、ディスクの容量も食います。スキンやハードウェアはとりあえずデフォルトでいいです。 作成できたらそれを選択して、開始ボタンを押してください。チェックはデフォルトのままでOKです。起動ボタンを押して起動させましょう。マシンスペックにもよりますが、完全に起動して操作できるようになるにはかなり時間がかかります。気長に待ってください。 起動できたら環境整備は完了です!

2012年5月5日土曜日

1.4リリース

しました。認証に対応したのと、有料版にのみUser-Agentの変更機能実装しました。

2012年4月26日木曜日

2012年4月22日日曜日

オプションメニューについての覚書

onCreateOptionsMenu は初めてメニューボタンが押されたときに1回だけ呼ばれる。その後は onPrepareOptionsMenu だけが呼ばれる(初めてのときにも onCreateOptionsMenu の後に呼ばれる)。

インドからもダウンロードありました。

2012年4月21日土曜日

1.2 リリース

1.2 リリースしました。検索機能と、色のカスタマイズ機能がメインで、あとは1.1.1でできるようになったHTTPヘッダ表示を、さらにコピったり共有したりできるようにしたのと、ICS で勝手にスペルチェックされてたのを封じたぐらい。

結局、パフォーマンス改善は課題のままです。

以下、なんとかしなきゃと思っていることメモ。

  • 色分け表示のパフォーマンス改善
  • 検索結果の色分け表示のパフォーマンス改善
    フォーカスされているものがハイライトされるのは当然として、今フォーカスがないところもマッチしてるところは色変えてたんです。最初は。でも、正規表現とかで複雑なキーワードにして、はてぶレベルのソースを検索すると、めっちゃ時間がかかることに気がつき、その機能は外しました。
  • ホームページを整える
    多分使い方がわからないってことは無いと思うし、メールアドレスも Google Play に思いっきり載せてあるので必要があるかどうかは微妙なんですけど、信用のために多少は整えたほうがいいかな、と。
  • カラーピッカーが環境によっては小さすぎるのをなんとかする
    yanzm 様製のものを少しだけ手を入れて使っているのですが、大きさを変えようとして変えられないでいます。
  • Java について勉強

2012年4月20日金曜日

挫折中

色分けが早くなんねぇ・・・。これでも初期リリースに比べればだいぶ早くなってるんだが、まだまだ異常に遅い。 はてぶ(230kb以上)なんて開いた日には永久に応答が返ってこなくなってしまう。 かの有名な Jota Text Editor ではてぶの保存したソースを開いてみると一瞬で色分け表示される。 オープンソースなんでソース見て参考にさせてもらおうかと思ったんだけどソースファイル多すぎて追いきれない・・・。 ハイライト処理自体のファイルは読んだんだけど、速さの秘密はそこじゃないみたいで・・・(自力でやってる処理とほぼ同じだった・・・)。 へたれな自分が憎い。ブログを読んでみると、画面表示されてる領域しかパースしてないって書いてあって、なるほどーと思ったんだけど、でも一気に下までスクロールさせても待ち時間なしで全部ちゃんと色づけされてるんだよね。 俺の場合、最初のパースを一画面分だけにすれば確かにチョッパヤになると思うんだけど、下まで一気にスクロールさせたらそこで固まるに決まってる・・・。手詰まり(ToT)。 Jota に限らず、普通にPCのブラウザでソース表示させても、どのブラウザも一瞬で色つき表示するよね・・・。 あれは JavaScript の Highlighter かなぁ。

2012年4月18日水曜日

新機能実装中

相変わらずダウンロード数はじんわりと。1日1件ぐらいずつ増えたり減ったり。ブラジルとハンガリーからのダウンロードありました。

検索機能と色のカスタマイズ機能を実装中。あとエミュで 4.0 の動作確認してみたり。4.0(ICS) で EditText 内の文字列に下線が引かれてしまうのを防ぐには、InputType に textNoSuggestions を追加する。

2012年4月13日金曜日

1.1.1リリース

色分け高速化とHTTPレスポンスヘッダを表示する機能を追加してバージョン1.1.1をリリースしました。

Ark Web Source Viewer

一部のページが表示できなかった問題も解決。リダイレクトされていてそれを追えないのかと推測していたんですが、リダイレクトは自動的に追ってくれるみたいです。 問題は色分けしきい値のチェックのためにContent-Lengthを取得していたんだけど、よくよく調べたらそれがない場合も多々あるみたいで、そのチェック機能を外したら表示できるようになりました。

色分けは色分け自体のアルゴリズムが悪いのかと思ってさんざんいじくったものの解決せず、Debugツールで調べたりしたら遅いのは Html.fromhtml というライブラリから引っ張ってきたメソッドでした。 これを Spannable で自分で実装したらちょー早くなった。もうしきい値チェックいらないかも・・・。Spannable でもはまったのでメモしとくと、setSpan の第一引数のオブジェクトは毎回 new でインスタンス作らないと同じオブジェクト使いまわそうとしたら最後の position しか反映されません・・・。

ダウンロード数がちょっぴり増えてるのに有効端末数が増えてないってのはつまりインストールしてすぐにアンインストールされちゃってるってことかぁ・・・。ちょっとしょんぼり。

2012年4月11日水曜日

グローバル!

ダウンロードしてくれた方が4名増加してたんですが、その内訳が、日本1、アメリカ1、イタリア1、カンボジア1という構成!頑張って英語で説明書いた甲斐がありました・・・。感無量です。

2012年4月9日月曜日

有料版公開

有料版公開しました。はまったことメモはまた後日。値段設定は迷った末200円にしてみました。1本だけでも売れたらうれしいなぁ。

https://play.google.com/store/apps/details?id=jp.gr.java_conf.akr.android.wsvpro

サポート用に(?)Facebook のページも作りました。(2015/10/01追記:現在Facebookはメンテしていません。)

2012年4月8日日曜日

ハマり中

有料版にGoogleのLVLを使ってライセンス確認の仕組みを実装中なんですがどつぼにハマって抜け出せません。今日一日これで終わった・・・。

昨日の夜公開した無料版のほうはダウンロード数2wそのうち1は自分w一般向けのソフトじゃないんで仕方ないですね。競合も結構あるし。同僚や友達にも使いそうな人いないんで紹介してません・・・。有料版に四苦八苦してる間に小さいバグを見つけたので早速アップデートしてみました。ちなみに、古いブログとかでは、アップロード後すぐに反映されるようなことが書いてありますが、今現在はアップロードから反映までにはタイムラグがあります。どれぐらいかははっきりわからないですが少なくとも半日後ぐらいまでには反映されてますね。

2012年4月7日土曜日

初アプリ登録完了!

Ark Web Source Viewer

これまでにできたこと
  • TOP画面とMAIN画面のUI
  • TOP画面からMAIN画面へ入力値を持って遷移
  • ブラウザの共有からMAIN画面を呼び出し
  • TOP画面もしくはブラウザから受け取ったURLにアクセスして文字コード判定&変換しつつソースを表示
  • 画面の縦横切り替え対応
  • 色分け表示、設定によるON/OFF
  • MENU実装 ※メインページのみ
  • メール送信 ※添付は挫折
  • ファイル保存
  • 他アプリへの共有
  • 読み込み中のプログレスバー表示
  • リンククリック時の暗黙インテント受け取り
  • 設定画面
  • リロード実装
  • 文字コードを指定してリロード
  • コンテキストメニューでCopy Allの実装 ※auto-link有効時のみ
  • MAIN画面の慣性スクロール実装
  • progressDialogが止まる問題の解決
  • サイズによって色分け表示のON/OFFを切り替える
今日できたこと
  • 日本語版UI実装
  • ファイルの保存先はユーザが選べないように変更
  • 無料版へのAdMob導入
  • Google Play (旧Android Market) へ無料版を登録
残課題
  • オリジナルアイコン作成
  • 有料版登録

ついに ver1.0 完成です。アイコンは結局デフォのまま。

メモ。エミュの画面回転は Ctrl+F11。スクリーンショットは DDMS の左上の小窓でカメラアイコン。独自ドメインを持っていない人はパッケージ名はここで取得。ボランティアで運営されていてすぐに取得できて無料。ただし名前とメールアドレスが表示されるのでGoogle Play で公開されるものと合わせておいたほうがいいかも。Google Play へのアプリ登録時にはスクリーンショット2枚と 512×512 の PNG 画像必須。登録されたアプリの詳細画面へは、https://play.google.com/store/apps/details?id=パッケージ名 でアクセスできる。

はまったことメモその1。最終動作確認をしていて気付いたのだが、これまでSDカードだと思っていた /mnt/sdcard は SDカードではなかった。ここは内蔵領域らしい。でも世の中に転がっているSDカードに保存するサンプルコードを実装するとここに保存される。そして、エミュだと /data/data/appname/files に保存される内蔵領域への保存が、Xperia だとどこなのかわからない。ファイル保存でエラーは出てないのだが検索しても見つからず。めんどくさいので保存先は自動で判別・指定することにした。

はまったことメモその2。広告の View を突っ込むとレイアウトぶっ壊れた。今回広告は画面下部に表示させたかったので、オリジナル


ScrollView
LinearLayout
EditText

だったのを色々と変えてみたのだが、EditText がつぶれてしまったり横画面で幅が半分になったりと挙動不審すぎることに。結局、


LinearLayout
ScrollView  ※ layout_height="wrap_content" と layout_weight="1" が大事
EditText  ※ layout_height="wrap_content" が大事
AdView

に落ち着いた。

はまったことメモその3。Google Play で金を払ったあと、JavaScript の『予期せぬエラー』でにっちもさっちもいかなくなったらブラウザを Chrome か Firefox に変えれば進めると思います。つーか Google 系のオンラインアプリは基本そのどちらかのブラウザ使わないと問題でまくり。

2012年4月6日金曜日

Android開発そろそろ完成間近

1日空いたのは新しいノートパソコンを買っていろいろと初期設定していたから・・・。新品のB5サイズノートPC、3万円で買えちゃう時代になったんですね・・・。スマホの半額以下。一番左下のキーがファンクションキーという恐ろしい子ですが他はなかなか気に入ってます。

デスクトップにへばりついてるのが苦痛だったので色んな体制でいじくれる軽めのノートが欲しかったのです。ちなみに、DELLの商品検討段階でのチャットシステムを初めて利用してみたのですが、あれいいですね。注文してから届くまでに2,3週間かかりさえしなければ買ってたと思います。

で、開発の進捗について。

これまでにできたこと
  • TOP画面とMAIN画面のUI
  • TOP画面からMAIN画面へ入力値を持って遷移
  • ブラウザの共有からMAIN画面を呼び出し
  • TOP画面もしくはブラウザから受け取ったURLにアクセスして文字コード判定&変換しつつソースを表示
  • 画面の縦横切り替え対応
  • 色分け表示、設定によるON/OFF
  • MENU実装 ※メインページのみ
  • メール送信 ※添付は挫折
  • ファイル保存
  • 他アプリへの共有
  • 読み込み中のプログレスバー表示
  • リンククリック時の暗黙インテント受け取り
  • 設定画面
  • リロード実装
  • 文字コードを指定してリロード
  • コンテキストメニューでCopy Allの実装 ※auto-link有効時のみ
今日できたこと
  • MAIN画面の慣性スクロール実装
  • progressDialogが止まる問題の解決
  • サイズによって色分け表示のON/OFFを切り替える
  • 広告について調べる ※継続中
  • SDカードのマウント有無を確認してSAVE画面に反映
  • 細かいバグフィックス
残課題
  • 日本語版UI実装
  • オリジナルアイコン作成

だいたい完成した。もう機能的には増やさずにバグ修正とUI(日本語版は必要なんだろうか)まわり調整して、広告組み込んで終わりかな。アイコンはデフォのままかも・・・。

はまったことメモその1。慣性スクロールについてはググってもよくわからずだったので大きい本屋行ってAndroid開発系の本全部手にとって目次見たんだけどそれらしきものはなく、困り果てていたのだが・・・。ScrollView という View に入れてしまえばいいだけのことだった・・・。基礎から順番に勉強した人なら誰でも知ってるレベルだからどこにも書いてなかったのかな・・・。今までは LinerLayout の中に EditText を入れただけの UI だったんだけど、これだとスクロールはするが慣性が働かない。ScrollView→LinerLayout→EditText の順に入れ子にすればそれだけで慣性スクロールが働くようになった。

はまったことメモその2。ぐるぐる回るスピナータイプの progressDialog を使っていたんだけど、数秒すると回転が止まってしまうという現象が発生。止まっている時間が長いと結局応答なしで強制終了されるダイアログが出てしまって progressDialog 出してる意味がない状態だった。これもググり方が悪かったのかなかなか情報がなかったんだけど、ヒントになるようなQAの掲示板をやっと発見してソース見直して解決。Androidの非同期処理にはやり方が三種類ある。Thread を使う方法と、AsyncTask ってのを使う方法と、Service を使う方法。最初 Thread を使っていたんだけど、AsyncTask 使えば?っていう書き込みを見てそれに変えてみたりしたけど駄目だった。原因は handler で EditText.setText() してたんだけど、そこにめっちゃ重い処理を書いてたこと。重い処理はあくまで run() の中に書いておいて、handler では軽い処理だけにしないといけなかった。

はまったことメモその3。progressDialog の途中で、Content-Length が指定値より大きかったらアラートダイアログを出して、カラーリングをするかしないか聞いて、その返答次第で処理を分岐させたかったんだけど、返答を待たずに処理が進んでしまう。絶対に出るアラートなら、その返答ボタンのコールバック関数内で処理させてしまえば済む話なんだけど、カラーリングがONかつサイズオーバーのときしかダイアログは出さず、それを満たさないときにはとっとと処理して欲しいので、コールバック関数の中に処理を書いてしまうわけにはいかなかった。フラグ用の変数を作り、アラート条件を満たさなかったときと、返答があったときにはそのフラグ変数に値を入れる。フラグ変数が null の間は sleep(1000) し続けるループを処理の前に置いて解決。

2012年4月4日水曜日

Android開発続き

これまでにできたこと
  • TOP画面とMAIN画面のUI
  • TOP画面からMAIN画面へ入力値を持って遷移
  • ブラウザの共有からMAIN画面を呼び出し
  • TOP画面もしくはブラウザから受け取ったURLにアクセスして文字コード判定&変換しつつソースを表示
  • 画面の縦横切り替え対応
  • 色分け表示、設定によるON/OFF
  • MENU実装 ※メインページのみ
  • メール送信 ※添付は挫折
  • ファイル保存
  • 他アプリへの共有
  • 読み込み中のプログレスバー表示
  • リンククリック時の暗黙インテント受け取り
今日できたこと
  • 設定画面
  • リロード実装
  • 文字コードを指定してリロード
  • コンテキストメニューでCopy Allの実装 ※auto-link有効時のみ
残課題
  • MAIN画面の慣性スクロール実装
  • 広告について調べる
  • 日本語版UI実装
  • オリジナルアイコン作成

ファイルも開ける機能は没に。普通に優秀なテキストエディタで開いたほうがいいと思うし。色分け表示の色のカスタマイズ機能も付けようかと思ったんだけどニーズがあるか疑問なのでとりあえずv1.0では実装しない。UAや他の任意のヘッダを変更して送信できる機能も同様に見送ることにする。

すごくハマったことメモ。普通 EditText では長押しすると『語句を選択』『全て選択』『貼り付け』『入力方法』のコンテキストメニューが出るんだけど、メイン画面の EditText ではなぜか『入力方法』しか出てこなくて困った。ググっても全く情報が見つからず、自分でいろいろと試しまくった結果、AutoLink が有効だとそうなることが判明。当初はデフォルトで AutoLink 有効にしていたがデフォルトは無効に変更。AutoLink を有効にした場合だけコンテキストメニューに Copy All を追加することで暫定対策とした。

2012年4月3日火曜日

Android開発続き

これまでにできたこと
  • TOP画面とMAIN画面のUI
  • TOP画面からMAIN画面へ入力値を持って遷移
  • ブラウザの共有からMAIN画面を呼び出し
  • TOP画面もしくはブラウザから受け取ったURLにアクセスして文字コード判定&変換しつつソースを表示
  • 画面の縦横切り替え対応
今日できたこと
  • 色分け表示、設定によるON/OFF
  • MENU実装 ※メインページのみ
  • メール送信 ※添付は挫折
  • ファイル保存
  • 他アプリへの共有
  • 設定画面 ※途中
  • 読み込み中のプログレスバー表示
  • リンククリック時の暗黙インテント受け取り
残課題
  • MAIN画面の慣性スクロール実装
  • 広告について調べる
  • ファイルも開けるようにする
  • リロード実装

2012年4月2日月曜日

Android開発始めました

今更ながらついにスマホ購入し、Androidアプリの開発始めました。

とりあえず色分け表示可能で日本語も化けないHTMLソースViewer作ってみようと思います。

今日できたこと
  • TOP画面とMAIN画面のUI
  • TOP画面からMAIN画面へ入力値を持って遷移
  • ブラウザの共有からMAIN画面を呼び出し
  • TOP画面もしくはブラウザから受け取ったURLにアクセスして文字コード判定&変換しつつソースを表示
  • 画面の縦横切り替え対応
残課題
  • MAIN画面の慣性スクロール実装
  • 色分け表示
  • MENU実装
  • メール送信
  • ファイル保存
  • 他アプリへの共有
  • 設定画面
  • 広告について調べる

2012年1月14日土曜日

IO::Socket で HTTP クライアント

WEBフォームからデータ登録する処理を自動化したいとき。 1件ずつしか登録できないシステムに大量に登録したい場合、1件1件入力するのがめんどくさいですよね。 勿論システム側をいじることができるならそのほうが良いのですが、利用者としての権限しかなければクライアントを作成することになります。
perl で HTTP クライアントといえば LWP モジュールを使うのが一般的ですがあえて IO::Socket での実装サンプル。 ASCII テキストのコマンドでやりとりするタイプのプロトコルならなんでもこれだけでいけちゃうのが便利ですねぇ。

以下のサンプルは

  • プロトコルはHTTP(×HTTPS)
  • 対象はIDと名前と電話番号を登録するだけの単純なアプリ
    ※name値はクエリから推測してください・・・。
  • 登録が成功した場合表示されるページにはsuccessという文字列が含まれている
  • 一括登録したいデータはカンマ区切りのテキストファイルとして用意(引数として渡す)
という前提です。

#!/usr/bin/perl

use strict;
use IO::Socket::INET;

# setting
my $host = '192.168.1.10';
my $port = 80;
my $baseuri = '/test.cgi';
my $pwd = 'hogehoge';
my $method = 'POST';

# get filename
my $filename = shift;
while (!-f $filename) {
 print "File not found. Enter correct filename: ";
 $filename = ;
 chomp $filename;
}

# open
my $sock = IO::Socket::INET->new(PeerAddr => "$host:$port", Proto => 'tcp') or die "connection failed.\n";
select($sock); $| = 1; select(STDOUT);
open FH,$filename or die;
my @data = ;
close FH;
for (my $i = 0; $data[$i]; $i++) {
 next if $data[$i] =~ /^\s*$/;
 chomp $data[$i];
 my ($id,$name,$phone) = split(/,/,$data[$i]);

 # フォーマットチェックめんどくさいから略

 # encode
 $name =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
 $name =~ tr/ /+/;

 # create query
 my $query = "flag=regist&id=$id&name=$name&number=$phone&password=$pwd";

 # regist
 print $sock "$method $baseuri";
 if ($method eq 'GET') { print $sock "?$query"; }
 print $sock " HTTP/1.1\n";
 print $sock "Host: $host\n";
 if ($i != $#data) {
  print $sock "Connection: Keep-Alive\n";
 } else {
  print $sock "Connection: Close\n";
 }
 if ($method eq 'POST') {
  print $sock "Content-Type: application/x-www-form-urlencoded\n";
  print $sock "Content-Length: " . length($query) . "\n";
  print $sock "\n$query\n\n";
 } else {
  print $sock "\n";
 }

 # check result
 my $success = 0;
 while (<$sock>) {
  if (index($_,'success') != -1) {
   $success = 1;
   last;
  }
 }
 print ($success?"登録成功\n":"登録失敗\n");
}
$sock->close();

exit;

実際作成するときには、フォームのソースを見る+登録の流れのパケットキャプチャをしてどのような値が送信されているか調査して実現可否を判断することになります。ログインが必要なものでもログイン後のセッション管理が単純なものであれば実装は難しくないです(Cookie関連のヘッダをちゃんと処理すれば良い)。CAPTCHA(画像に表示されている歪んだ字を入力させるやつ)は無理。

2012年1月11日水曜日

CentOSとlibiconv

CentOS(少なくとも5.4)には libiconv が入っているパッケージがない・・・!衝撃。

$ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
$ tar zxvf libiconv-1.14.tar.gz
$ cd libiconv-1.14
$ ./configure
$ make
$ su -
# make install

2012年1月9日月曜日

IO::Socket でサーバ実装

perl でサーバ作ることはないと思いますが。ただのエコーサーバの習作メモ。

#!/usr/local/bin/perl

use strict;
use IO::Socket;

my $port = 5000;

# MAIN
my $listenSock = IO::Socket::INET->new(
 LocalPort => $port,
 Listen => SOMAXCONN,
 Proto => 'tcp',
 Reuse => 1
) or die "bind $port failed.\n";

print "listen start.\n";

while (1) {
 my $newSock = $listenSock->accept;
 if (my $pid = fork){
  #親プロセス
  $newSock->close;
 } else {
  #子プロセス
  $listenSock->close;
  #出力バッファを無効化
  select($newSock);
  $| = 1;
  select(STDOUT);
  #メイン。exitかquit打たれるまでechoするだけ。
  my $buf;
  while (uc($buf) ne 'EXIT' and uc($buf) ne 'QUIT'){
   $buf = <$newSock>;
   $buf =~ tr/\r\n//d;
   print $newSock "$buf\n";
  }
  print $newSock "Bye.\n";
  $newSock->close();
  exit;
 }
}