2011年6月20日月曜日

HANSTER というサイトで評価が 3.5 くらいになってました

久しぶりにアプリ公開している HANDSTER というサイトを覗いてみたら、
Rating がされていて、3.5 くらいの評価になってました。


星1じゃないだけで感激です。(ノД`)・゜・。ウワーン

Android Market では、今も星1つが神々しく輝いておりますが、
あまりにも星1つ慣れしていた為か、喜びもひとしおです。

星3以上付けて頂いた2人くらいのために、
そろそろ、なにかアップデートしなくては・・・
と思うのですが、イマイチ、ネタがないんですよねぇ。。

どうせなから、コメントも書いて欲しかったな (まさかの贅沢慣れしてスイマセン)

2011年6月4日土曜日

福岡市が開催している創業セミナーに行ってきました

最近は、ほとんど android に触れることがなく、
なぜか簿記3級の試験勉強をしていたりするんですが、、

本日、福岡市が開催している創業準備セミナーなるものに行ってきました。

福岡市の起業・創業応援サイト
http://sougyou.city.fukuoka.lg.jp/

起業も何も、まだ具体的なことは何一つないんですが、
タダということで、何らかのモチベーションアップになるだろうと思って申し込んだ次第です。

講師の話を約3時間、粛々と聞くだけでしたが、
タメになるお話が聞けたかなぁ~と思っております。

福岡市では、起業支援のために、
格安で事業所スペースを提供、無料での起業相談、低金利での創業支援融資制度などを
実施しているそうです。

行政で「ありがたい」と思ったのは、これまで図書館くらいだったんですが、
セミナーを含めて、いろいろと起業支援を行っていることは「ありがたい」です。

まあ、自分は利用することはないだろうなぁ・・・と思いますが。


セミナー参加者は幅広い年代で構成されていました。

がんばっている(と勝手に思っている)人達を見て、
少し自分もやる気をアップさせられた気がします。

とりあえず、6月12日(日)の簿記3級くらい、サクッと受かるために、
勉強しとこ。。

2011年4月26日火曜日

第一弾アプリを公開して1ヶ月が経ちました

初めてのアプリ「あるくっち」を公開してから、1ヶ月が経過しました。

android market のデベロッパー コンソールで、ダウンロードの推移を見てみると、
こんな感じでございます。



 現在のインストール数は 66 です。

う~ん、根拠は全くありませんが、まあ、こんなもんでしょう。

66 人も使って頂いている方がいると思うと、ありがたいです (-人-)アリガタヤ

インストールするだけで、未使用のほったらかしかもしれませんが、
デベロッパー コンソールからでは、そこまでは分かりません。

アンインストールされないだけでも (-人-)アリガタヤ


ちなみに、スケベ心を出して、AdMob で広告表示させているのですが、
この1ヶ月での広告クリック数は1回です。
(設定画面で、広告を非表示にすることは可能にしています)

この1回で収益が 0.1 ドルくらい増えました。

こちらも、こんなもんでしょう(と自分に言い聞かせる)


ぼちぼち、第2弾のアプリ開発に着手せねば。。

2011年4月15日金曜日

Handster というサイトでアプリが公開されました

Handster というサイトのお姉さん?からアプリ公開しないかい?と英文メールをもらい、
即座にOKと返してから、1週間くらいが経過した頃。

あなたのアカウントを作って、アプリを公開したよ、といった主旨の英文メールが飛んできました。

で、実際の公開されているページがコチラ。
http://android.handster.com/catalog.php?search=arukucchi

アカウント作成してもらって、アプリ公開まで実施してもらって、楽チンだったんですが、
正直、ダウンロードされんだろな・・・

嫁からもツマランと酷評される程度なんで (。゚´д`)゚ ワーン

しかし、android アプリのマーケットを提供している会社では、
新作で公開されるアプリを一通り目を通しては、手当たり次第、自分のトコロでも
公開しないかい?と声かけてるんでしょうねぇ。

2011年4月6日水曜日

Handster とかいうサイトからアプリ公開のお誘いが来ました

あるくっちを公開してから、2週間くらいが経過した頃、
Handster というサイトからアプリを公開しませんかメールが来ました。
Handster - リンク

別に費用は発生しないとのことだったので、
公開します!と返信してみましたが、どういう感じになるんでしょうねぇ。。

ちなみに、、

現在、Android Market のデベロッパーコンソール上では、有効なインストール数は 38 です。

スケベ心出して、AdMobで広告表示をさせているのですが、(設定で非表示に変更可)
今のところ、広告をクリックされた回数は 0 回です (T△T)o

まあ、こんなもんですかね。

過度な期待はせずに、次のアプリ開発に着手しようと思います。

2011年4月2日土曜日

第一弾アプリを公開しました

ついに、、アプリ公開まで漕ぎ着けました。

その名前は あるくっち です。ハズカシイ。。( 。- - 。) ポッ
Android Market - あるくっち

アプリの説明用サイトも作っちゃいました。
rtaki0329's apps - あるくっち

公開して1週間くらい経ちますが、ダウンロード数が 40 くらいです。

ちゃんと動いてるんでしょうか。。正直ちょっと不安です。。

しかも最初の2日間は、Google map の key を公開用に変更していなかったので、
地図が表示されない状態になっていました (; ̄ー ̄川 アセアセ

1人でも多くの人に使ってもらえたら嬉しいんだけど、どうなることやら。。

2011年3月10日木曜日

缶コーヒー WONDA の販促キャンペーンで偽サイト?

android は、ちっとも関係ありませんが、

今日、自販機で買った缶コーヒー WONDA にシールが貼っていて、
AKB48のオリジナルグッズが貰えるキャンペーンとのことでした。

キャンペーンのタイトルは、WONDA×AKB48 ワンダフルルーレット だそうで。

で、URL が書いてあったんですが、、

http://wonda-akb48.com と入力するところ間違えて http://wanda-akb48.com と入力したところ、
WONDA を装った、でも相当チープな作りの怪しげなサイトが表示されました。

怖くて、どのリンクも押さずにブラウザを閉じたんですが、
釣られる人が、たくさん出てきそうな気がします。

ということで、、

WONDA×AKB48 ワンダフルルーレットのお問い合わせメールアドレスに、
注意を喚起したほうがいいんじゃないの?的なメールを送ってみました。

軽くスルーされそうな気がしますが、こんなサイトがすぐに作られるなんて、
さすが AKB48 ってとこでしょうか。

2011年3月8日火曜日

Inkscape - アイコン作成に使うツール - だそうです

android 向けのアイコン作成ですが、
これまで(といって1回しかないですが) GIMP と Google SketchUp を使用していました。

Google SketchUp で作成した 3D のモデルを 30 度回転させて、PNG で出力させて、GIMP に取り込み、編集するという誰もやっていないような方法です!

しかし、どうも一般的には Inkscape というフリーソフトを使われているようです (/-\*)ハズカシイ
Inkscape
http://inkscape.org/index.php?lang=ja

なんでも、、

Photoshop に対応するフリーソフトが GIMP で、
Illustrator に対応するフリーソフトが Inkscape だそうです。

もう早く教えてよ~ という感じですが、

次にアイコンを作るときは利用してみます。

2011年3月7日月曜日

libandrotranslation のサンプル・アプリ作ってみた

最近、libandrotranslation というライブラリを知りました。
libandrotranslation
http://code.google.com/p/libandrotranslation/

このライブラリを android アプリに組み込むと、
アプリ使用者に strings.xml の翻訳を実施してもらい、翻訳結果をメールにて送信してもらえるようになります。
(最後に、サンプル・アプリの動作画面を貼り付けたので、それを見てもらうと分かりやすいかもです)

早速、サンプル・アプリを作ってみることにしました。

まず、libandrotranslation のライブラリをダウンロードします。

libandrotranslation のサイトより、ファイル名は LibAndroTranslation-1.0.0.zip をダウンロードします。(2011/3/7時点)
libandrotranslation - Downloads
http://code.google.com/p/libandrotranslation/downloads/list

libandrotranslation のサイトには、使用方法についての記述があるので、
それを参考にしました。
libandrotranslation - Description
http://code.google.com/p/libandrotranslation/wiki/Description

libandrotranslation を使用するには、zip ファイルを解凍し、それが android プロジェクトになっているので、eclipse に読み込ませる必要があります。

サイトに、その手順は記載されていますが、一応、手順を以下に記述します。
  1. LibAndroTranslation-1.0.0.zip を解凍します。
    解凍したフォルダは android プロジェクトのファイルになっています。

  2. Eclipse から 1. で解凍したプロジェクトを読み込みます。
    Exclipse を起動し、"Filie" --> "New" から新規に Android Project を作成します。

    このとき、Contents で "Create project from existing source" を選択し、
    1. で解凍したフォルダを指定します。

    Project name はサイトと同じく、LibAndroTrans にしました。
    後はデフォルトのままで構いません。




libandrotranslation ライブラリを使用する準備ができたので、
早速、サンプルアプリを作成してみます。

Exclipse を起動し、"Filie" --> "New" から新規に Android Project を作成します。
アクティビティ名を LibAndroTransTestActitivy にしていますが、その辺は適当に解釈して下さい。

各ファイルで、修正した箇所を青字で記述します。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jp.test.libandrotest"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".LibAndroTransTestActitivy"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- LibAndroTranslation -->
        <activity android:name="shoozhoo.libandrotranslation.TranslationListActivity" />
        <activity android:name="shoozhoo.libandrotranslation.TranslationEditActivity" />

    </application>
    <uses-sdk android:minSdkVersion="6" />

    <!-- LibAndroTranslation -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="LibAndroTrnaslatin のテスト"
    />
<Button
    android:id="@+id/libandrotrans_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="テスト開始"
    />

</LinearLayout>

LibAndroTransTestActitivy.java
package jp.test.libandrotest;

import java.util.ArrayList;

import shoozhoo.libandrotranslation.TranslationListActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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

        Button button = (Button) findViewById(R.id.libandrotrans_button);

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(LibAndroTransTestActitivy.this, TranslationListActivity.class);
                // 翻訳データの送信先メールアドレス
                intent.putExtra(TranslationListActivity.INTENT_EXTRA_MAIL_TO, "YOUR_MAIL_ADDRESS");

                // 翻訳データのメールの題名に入るアプリ名
                intent.putExtra(TranslationListActivity.INTENT_EXTRA_MAIL_APPNAME, "YOUR_APP_NAME");
                ArrayList<String> ignores = new ArrayList<String>();
                ignores.add("app_name");
                ignores.add("no_i18n.+");
                // 翻訳画面に表示させたくないリソース名のパターン(正規表現)
                intent.putExtra(TranslationListActivity.INTENT_EXTRA_IGNORE_PATTERNS, ignores);

                // 翻訳データの保存先を変更したい場合に指定する
                // デフォルト Environment.getExternalStorageDirectory()+"/MyTranslation"
                // intent.putExtra(TranslationListActivity.INTENT_EXTRA_DIR,
                //              Environment.getExternalStorageDirectory()+"/LibAndroTranslationSample");

                LibAndroTransTestActitivy.this.startActivity(intent);

            }
        });
    }
}
※ メールアドレスについては、送信したいアドレスへの修正が必要です。
※ コメントにも書かれていますが、デフォルトでは、strings.xml のデータを格納したファイルが、/mnt/sdcard/MyTranslation/ ディレクトリ(エミュレータで確認)に作成されます。

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, LibAndroTransTestActitivy!</string>
    <string name="app_name">LibAndroTransTest</string>
    <string name="message1">Good morning</string>
    <string name="message2">Good evening</string>
</resources>


実行画面を以下に貼り付けます。

起動直後の画面です。


起動直後の画面で、"テスト開始"をクリックすると、翻訳のお願い画面が表示されます。
以下の画面では日本語になっていますが、端末の設定に合わせた言語で表示されるようです。
(端末の言語が英語のときは、英語の文章でした)


上記画面で "OK" を押すと、strings.xml が読み込まれ、リスト表示されます。


"Good morning" をクリックすると、翻訳を入力する画面に切り替わります。


メニューボタンを押し、"開発者に送信"を押すことで、XML ファイルをメールの添付ファイルとして、送信することことができます。HTC Aria で実行してみると、メール以外に、操作の選択として、Facebook とか Bluetooth とかも出てきたんですが、これは想定内か? 



以下のファイルが実施にメールに添付されたファイルです。

string_jp.test.libandrotest
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<resources>
  <string name="message1">"おはよう"</string>
  <string name="message2">"こんばんは"</string>
</resources>>

設定画面などに埋め込めば、より自然に翻訳ご協力お願い機能を追加できそうです。

2011年2月15日火曜日

HTC Aria 入手しました。

HTC Aria を入手しました。

入手してから、既に1ヵ月経ちます。

ヤフオクで買った HT-03A だと、SIM カードがないので、外に持ち歩いて、
テストすることもできないので、ええ~い、と近所のヤマダ電機にあるイー・モバイル取り扱い店に
突撃し、店員さんと料金の最終確認して、即座に契約!

料金プランは「スマートプラン」の「シンプルにねん」というやつで、
通話料金等の加算がなければ月々の支払いは 4,580 円です。

端末代金は約3万でした。

当初は、あまり屋外で使うことはないかなぁ、と思って、
「スマートプランライト」にするつもりでしたが、店員さんが、

「スマートプランライトは日割りにできませんし、最初の月は、物珍しさもあって、よくデータ通信する方が多いです。初めはスマートプランにしても、途中からスマートプランライトに変更できますので、とりあえず、スマートプランにしては、どうでしょうか?」

と言う意見に従って、スマートプランで始めることにしました。

ちなみに、プランの変更は、翌々月から反映される、とも言っていましたが、
普通、翌月からじゃないんですかね。。昔使っていた au は、そうだったと思うんだけど。

入手してから1ヵ月、すでに屋外に持ち出して使う機会が少ないので、
そのうち、使おうが使うまいが定額なスマートプランから、
スマートプランライト (シンプルにねんだと 580円~4,980円) に変更しようと思います。

変更すれば、毎月の支払いが最低 580 円ですよ!

テスト機で維持するには、なかなか、お安くなっているじゃあ~りませんか!
(なんか、この表現って、若くないな・・・)

メインで使っている iPhone 3GS と HTC Aria を並べて、
Google マップを表示し、ぐりぐり動かして見比べたところ、iPhone 3GS のほうが動きが滑らかでした。

この 2 台を比べるなら、iPhone 3GS のほうが動き滑らかかなぁ・・・という印象です。今のところ。

しか~し、テザリングはすばらしいです!

ネット環境がない場所 (嫁さんの実家とか) でも、
HTC Aria とノートPCを USB 接続して、アプリのインストール/動作確認しながら、
Wi-Fi Hotspot でネットに接続して、android developers の API リファレンスを閲覧できますヽ( ・∀・)ノ ワーイ

ちなみに、USB テザリングだと、別のドライバが読み込まれるのか、
android device として認識されなくなりました。
adb devices と打っても何も出ないので、USB テザリングとは併用できないようです。

これで、android 開発用の実機が 2 台になりました。
かなりの装備増強です!?

  • HTC Aria
    android 2.2。SIM あり。イーモバイル契約。
  • HT-03A
    android 1.6。SIMなし。ヤフオク入手。
    カスタムROMを入れていましたが、元に戻しました。

あとはアプリを作るだけですね (; ̄ー ̄川 アセアセ


以下は、HTC Aria 及び料金プランのサイトです。
興味を持った!という奇特な方がいらっしゃいましたら、参照して下さい。

イーモバイル HTC Aria
http://emobile.jp/products/ht/s31ht/

イーモバイル スマートプラン

http://emobile.jp/charge/smartplan.html

イーモバイル スマートプランライト
http://emobile.jp/charge/smartplanlight.html

2011年2月9日水曜日

きんこん土佐日記

あまりにも更新していない、、というのもあって、
android とは、ちっとも関係ありませんが、最近、友達に教えてもらった4コマ漫画を
ご紹介致します。

きんこん土佐日記 Web版 (毎週日曜日更新)
http://www.kochinews.co.jp/kinkon/kinkon.htm

高知新聞の夕刊にて連載中だそうですが、
上記の Web 版もあります。

高知を舞台に、じいちゃん、ばあちゃん、5歳の孫(男の子)を中心に、
話が展開されることが多いですが、登場人物(のたぶん全員)が、土佐弁をバリバリ使っています。

生まれも育ちも高知な自分でも、ときどきセリフが分かりません。。(汗

が、やはり、懐かしい響きがして、なんとなくテンションあがります。

主人公がお年寄りということもあって、年配ならではの、とぼけた(ボケた?)エピソードが、
ほのぼのとした笑いを誘います。

50年?連れ添って、じいちゃんが、ばあちゃんに初めて言葉で愛を伝えるなど、
お茶目な一面も見られます。
(残念ながら4月1日だったので、真面目に受け止めてもらえませんでしたが)

お年取りを主人公にしたあたりが、とっても良かったんじゃないかと思います。

単行本は1~6巻まで発売されています。

上記サイトの高知新聞社で購入できます。
Amazon でも取り扱っています。

まったりした漫画が読みたいな~、とか、土佐弁の漫画が読みたいな~といった方は、
ぜひ読んでみてください~~

NHKあたりでアニメにしてもらえないかな~

2011年1月19日水曜日

Androidアプリのバグ報告システム(アプリケーションのアップロード試してみる編)

以下のスタートガイドを参考に、
前回までに作成した開発環境をいじってみることで、なんとなく、
Google App Engine と Python が分かってきた気がします。

スタート ガイド: Python
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/

スタートガイドでは締めくくりとして、"アプリケーションのアップロード" を実施しています。

これは、ガイド内で作成した helloworld アプリを
Google App Engine サイトにアップロードする手順になっています。

以下に、実際にやってみた際の記録をメモしておきます。

helloworld アプリは C:\Python_Test\helloworld に配置しています。

  1. Google App Engine のサイトにアクセスし、ログイン。

    http://appengine.google.com/

  2. "Create Application" ボタンを押す。


  3. 携帯電話のメールアドレス情報を入力。

    ここでは Softbank の IPhone 用のアドレスを入力しました。
    Vodafone となっているところが泣けます。
    Username の値はメールアドレスの @ の左側部分を入力します。


  4. 入力した携帯電話のメールアドレスに届けられたメールに記載されている Google App Engine Code の数字を確認して入力。


  5. アプリケーション情報を入力。

    Application Identifier と Application Title を入力します。
    将来的には、バグ管理システムにしたいので、Application Title は Bug Tracking System としました。


  6. アプリケーション作成に成功すると最後に以下の画面が表示されます。


  7. アプリケーションのアップロード。

    C:\Python_Test\helloworld\app.yaml にある application: の値を 5. で入力した Application Identifier の文字列に変更します。

    コマンド・プロンプトを起動し、以下を実行します。

    青字が入力。
    > cd C:\Python_Test
    > set HTTPS_PROXY=xxx.yyy.zzz.com:8080
    > appcfg.py update helloworld
    Application: application-id名 ; version: 1.
    Server: appengine.google.com.
    Scanning files on local disk.
    Initiating update.
    2011-01-19 12:59:28,328 WARNING appengine_rpc.py:405 ssl module not found.
    Without the ssl module, the identity of the remote host cannot be verified, and
    connections may NOT be secure. To fix this, please install the ssl module from
    http://pypi.python.org/pypi/ssl .
    To learn more, see http://code.google.com/appengine/kb/general.html#rpcssl .
    Email: Google アカウントのメールアドレス

    Password for Google アカウントのメールアドレス: パスワード
    Cloning 1 static file.
    Cloning 9 application files.
    Uploading 1 files and blobs.
    Uploaded 1 files and blobs
    Precompilation starting.
    Precompilation completed.
    Deploying new version.
    Checking if new version is ready to serve.
    Will check again in 1 seconds.
    Checking if new version is ready to serve.
    Will check again in 2 seconds.
    Checking if new version is ready to serve.
    Will check again in 4 seconds.
    Checking if new version is ready to serve.
    Closing update: new version is ready to start serving.

  8. アクセス確認

    http://<application identifier>.appspot.com/ をブラウザでアクセスし、表示されることを確認します。


そろそろ、目的である android バグ報告システムの構築に取り組めそうな予感です。

2011年1月17日月曜日

Androidアプリのバグ報告システム(Hello, World! 作成編)

バグ報告システムの構築は、まだまだ先になりそうです。。

前回、開発環境として、Python 2.5.4 と Google App Engine 1.4.1 を導入したので、
以下のサイトを参考し、サンプル・アプリとして、Hello, World! を動かしてみます。
Hello, World!
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/helloworld.html

  1. C:\Python_Test\helloworld フォルダを作成。

  2. C:\Python_Test\helloworld\helloworld.py ファイルを作成し、以下の内容を記述。
    print 'Content-Type: text/plain'
    print ''
    print 'Hello, world!'

  3. C:\Python_Test\helloworld\app.yaml ファイルを作成し、以下の内容を記述。
    application: helloworld
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /.*
      script: helloworld.py
    

  4. Web サーバーを起動。
    > cd C:\Program Files\Google\google_appengine
    > dev_appserver.py C:\Python_Test\helloworld

  5. ブラウザで http://localhost:8080/ にアクセス。
    Hello, world! と表示されることを確認。

サイト通りにやれば簡単にできました。

Androidアプリのバグ報告システム(開発環境を構築編)

前回に引き続き、Google App Engine も Python は経験ありませんが、
バグ報告システムの構築に向けて、第一歩、開発環境を構築をしようと思います。

以下のサイトを見ながら作業を進めていきます。
開発環境
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/devenvironment.html
 
開発環境の構築といっても、以下の2つを実施するだけです。
  1. Python 導入
  2. App Engine SDK 導入

それでは、早速、"1. Python 導入" を行います。

Google のサイト上では、Python 2.5 をダウンロードしろ、とあるんですが、
Python のサイトを見ると、最新版として、Python 2.7.1 と 3.1.3 があります。(2011年1月17日時点)

但し、ここで、2.7.1 を導入したところ、"2. App Engine SDK 導入" 開始時点で、
" Please make sure Python 2.5 is installed." とエラーが表示され、導入ができません。



なので、2.5 の最新版である 2.5.4 (ファイル名は python-2.5.4.msi) を以下からダウンロードし、導入することにします。
Python 2.5.4
http://www.python.org/download/releases/2.5.4/
本当は 2.5.5 が 2.5 系の最新ですが、2.5.5 はソースしかないため、バイナリが提供されている 2.5.4 を使うことにしています。


Python 2.5.4 のインストールは、デフォルトのまま次に進んでいくだけですが、
念のため、画面コピー付きで手順を貼っておきます。

(1)  python-2.5.4.msi を実行。Next を押す。


(2)  導入先は C:\Python27\ (デフォルト値) のままにする。

(3)  全部 (デフォルト) を導入する。

(4)  インストールが開始される。30 秒くらい待つ。

(5)  インストール完了。


次に、 App Engine SDK をインストールします。

以下のサイトより、Google App Engine SDK for Python をダウンロードします。
ダウンロード
http://code.google.com/intl/ja/appengine/downloads.html

2011年1月17日時点の最新 GoogleAppEngine-1.4.1.msi をダウンロードしました。


(1)  GoogleAppEngine-1.4.1.msi を実行。Python 2.5 found. と表示される。

(2) 同意するにチェックを入れて、次へ。

(3) デフォルトのまま次へ。

(4) 次へ。

(5) インストールが開始される。30 秒くらい待つ。

(6) インストール完了。


以上で、開発環境の導入は完了です。

次回は、Hello, World! を動かしてみます。

Androidアプリのバグ報告システム(構築したい動機芽生え編)

愛用させて頂いているアプリ Simeji の作成者さんのサイトで、
Android アプリのバグ報告システムに関する情報が公開されています。

Androidアプリのバグ報告システムを考える
http://www.adamrocker.com/blog/288/bug-report-system-for-android.html

ふむふむ。
アプリ公開に向けて、このバグ報告システムの構築は非常に魅力です!

ぜひ、このシステムを導入したい!

と思ったのですが、
そもそも Google App Engine って名前しか知らない。。
Python も、ストリート・ファイターⅡに出てくるバイソンに名前が似ている、ということくらいしか知らない。。

ということで、以下のサイトを読んだりして、Google App Engine ってそもそも何?なところから調べてみることにしました。
Google App Engine について
http://code.google.com/intl/ja/appengine/docs/whatisgoogleappengine.html

要点としては、以下のような感じでしょうか。
  • 要は Web アプリケーションだ。
  • 実行場所は Google のインフラ上だ。
  • 開発言語は Java か Python (パイソン) だ。
  • Google App Engine は従量課金制だ。但し、ストレージ/CPUなどリソース使用の制限付きで無料で使うことができる。
  • BigTableという非リレーショナルなデータベースが用意されている。
  • 開発時は、SDK に含まれる開発用Webサーバーでテストを行う。

なんとなく、Google App Engine なるものが分かった気がしてきたので、
次は、開発環境構築を行ってみようと思います。

2011年1月12日水曜日

Google マップの ItemizedOverlay でアイコンが表示されない現象について

android developers の以下のサイトですが、

Hello View, Google Map View
http://developer.android.com/resources/tutorials/views/hello-mapview.html


ItemizedOverlay の派生クラスである HelloItemizedOverlay に、
コンストラクタが2つ定義されています。

boundCenterBottom()を使用するコンストラクタ
 public HelloItemizedOverlay(Drawable defaultMarker) {
     super(boundCenterBottom(defaultMarker));
 }
boundCenterBottom()を使用しないコンストラクタ
 public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
     super(defaultMarker);
     mContext = context;
 }

このうち、boundCenterBottom()を使用しないコンストラクタを使用すると、
アイコン(ドロイド君)が表示されません (つω・。)うぅぅ…

HelloItemizedOverlay.java
package jp.kochi.GoogleMapOverlayTest;

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> {

  private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
  private Context mContext;

  public HelloItemizedOverlay(Drawable defaultMarker) {
    super(boundCenterBottom(defaultMarker));
  }

  public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
    super(defaultMarker);
    mContext = context;
  }
  @Override
  protected OverlayItem createItem(int i) {
    return mOverlays.get(i);
  }

  @Override
  public int size() {
    return mOverlays.size();
  }

  public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
  }

  @Override
  protected boolean onTap(int index) {
    OverlayItem item = mOverlays.get(index);
    AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
    dialog.setTitle(item.getTitle());
    dialog.setMessage(item.getSnippet());
    dialog.show();
    return true;
  }

}


GoogleMapOverlayTestActivity.java
package jp.kochi.GoogleMapOverlayTest;

import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import android.graphics.drawable.Drawable;
import android.os.Bundle;

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

    MapView mapView = (MapView) findViewById(R.id.mapview);

    // ビルドイン-ズームコントローラー使用
    mapView.setBuiltInZoomControls(true);

    // 航空写真モードに変更
    mapView.setSatellite(true);

    // Droidアイコン表示
    List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
    
    // こっちは表示される。
    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable);

    // こっちだと表示されない。
    // HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, GoogleMapOverlayTestActivity.this);
    GeoPoint point = new GeoPoint(19240000,-99120000);
    OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

    itemizedoverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedoverlay);

  }

 @Override
 protected boolean isRouteDisplayed() {
  // TODO Auto-generated method stub
  return false;
 }
}


、なんでか~?と調べたところ、

そもそも Drawable に対し、setBounds() の実行が必要で、
直接、Drawable に対し、setBounds() を実行するか、または、
boundCenter() または boundCenterBottom() を実行する必要があるようです。

Drawable より抜粋
The setBounds(Rect) method must be called to tell the Drawable where it is drawn and how large it should be. All Drawables should respect the requested size, often simply by scaling their imagery. A client can find the preferred size for some Drawables with the getIntrinsicHeight() and getIntrinsicWidth() methods.

対応としては、素直に、boundCenter() または boundCenterBottom() を使えばよいと思うのですが、
setBounds() を使用する方法でも構いません。

GoogleMapOverlayTestActivity.java の抜粋 (setBounds()の修正案)
// setBounds追加すると表示される。
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, GoogleMapOverlayTestActivity.this);

2011年1月7日金曜日

Intent で Parcelable を実装した自作オブジェクトの受け渡しをしてみた

Activity から別の Activity を起動する際に、
自作クラスのオブジェクトの受け渡しについてサンプル・アプリを作ってみました。

Intent のメソッド一覧を見ていると、
putExtra(String name, <何か>) で、Intent にいろんな値をセットできるようになっています。

それを呼び出された側の Activity では、get<何たら>Extra(String name) で
値を取得できるようになっています。

この中に、putExtra(String name, Parcelable value) と getParcelableExtra(String name) があります。

Parcelable を自作クラスに適用すれば Activity 間で、オブジェクトの受け渡しができるだろう、
ということで、作ってみたサンプル・アプリが以下になります。

アクティビティ間でオブジェクトの受け渡しを行うということで、
メインとサブの2つのアクティビティを用意しました。

メイン・アクティビティ (IntentParcelableTestActivity) にはボタンを1個配置しています。

このボタンを押すと、サブ・アクティビティ (SubActivity) を起動するようになっており、
このとき、Pacelable インタフェースを実装した自作クラス (ParcelableTest) のオブジェクトを渡すようにしました。

    メイン・アクティビティ画面


サブ・アクティビティでは、受け取った ParcelableTest オブジェクトより、文字列 (String) と画像 (Bitmap) を取得し、表示します。

    サブ・アクティビティ画面


以下はソースです。

まずは、メイン・アクティビティのレイアウト・ファイルです。
ボタン1個しかありません。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
<Button
  android:id="@+id/parceble_button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Parcelableの受け渡しテスト"
  />
</LinearLayout>


次は、アクティビティ間で受け渡しをするオブジェクト用クラスです。
ポイントは以下の2つです。
  1. Parcelable.Creator インターフェースを実装したオブジェクトを CREATOR という名前で作成する。

  2. writeToParcel(Parcel dest, int flags) と ParcelableTest(Parcel in) で読み書きするオブジェクトの順番は合わせる。

1. は android の API Reference にそうしろと書いてあります。
Parcelable
http://developer.android.com/reference/android/os/Parcelable.html

2. ですが、順番が合っていないと以下の Exception が発生しました。
(一部文字化けたままを引用)
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: Parcelable縺ョ繝・せ繝・
    at android.os.Parcel.readParcelable(Parcel.java:1822)

ParcelableTest.java
package jp.taki.parceble;

import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;

public class ParcelableTest implements Parcelable {
  public String mTitle;
  public Bitmap mBitmap;
  public static final String PARCELABLE_TEST = "ParcelableTest";

  public ParcelableTest(String title, Bitmap bitmap) {
    this.mTitle = title;
    this.mBitmap = bitmap;
  }

  @Override
  public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(mTitle);
    dest.writeParcelable(mBitmap, flags);
  }

  public static final Parcelable.Creator<ParcelableTest> CREATOR = new Parcelable.Creator<ParcelableTest>() {
    public ParcelableTest createFromParcel(Parcel in) {
      return new ParcelableTest(in);
    }

    public ParcelableTest[] newArray(int size) {
      return new ParcelableTest[size];
    }
  };

  private ParcelableTest(Parcel in) {
    mTitle = in.readString();
    mBitmap = in.readParcelable(Bitmap.class.getClassLoader());
  }

}


次はメイン・アクティビティです。

画像ファイルはデフォルトで用意される icon.png (ドロイド君の画像) を利用しています。

ボタンを押すと、上記 ParcelableTest オブジェクトを作成し、Intent にセットして、
SubActivity を起動しています。

IntentParcelableTestActivity.java
package jp.taki.parceble;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

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

    Resources r = getResources();
    final Bitmap b = BitmapFactory.decodeResource(r, R.drawable.icon);

    Button btn = (Button) findViewById(R.id.parceble_button);
    btn.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {

        ParcelableTest p = new ParcelableTest("Parcelableのテスト", b);
        Intent i = new Intent();
        i.putExtra(ParcelableTest.PARCELABLE_TEST, p);
        i.setClass(IntentParcelableTestActivity.this, SubActivity.class);
        startActivity(i);
      }
    });
  }
}


サブ・アクティビティのレイアウト・ファイルです。
文字列をセットする TextView (id=title) と画像をセットする ImageView (id=image) を配置しています。

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

<TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Parcelableデータを以下に表示"
  />

<TextView
  android:id="@+id/title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  />

<ImageView
  android:id="@+id/image"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  />

</LinearLayout>


サブ・アクティビティです。

Intent より ParcelableTest オブジェクトを取り出し、
画面上の TextView と ImageView にセットしています。

SubActivity.java
package jp.taki.parceble;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

public class SubActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.sub);

    Intent i = getIntent();
    ParcelableTest p = i.getParcelableExtra(ParcelableTest.PARCELABLE_TEST);

    TextView title = (TextView) findViewById(R.id.title);
    title.setText(p.mTitle);

    ImageView image = (ImageView) findViewById(R.id.image);
    image.setImageBitmap(p.mBitmap);

  }
}


最後に、マニフェスト・ファイルに、SubActivity を登録して完成です。

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.taki.parceble"
    android:versionCode="1"
    android:versionName="1.0">
  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".IntentParcelableTestActivity"
          android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name=".SubActivity"
          android:label="@string/app_name" />
  </application>
  <uses-sdk android:minSdkVersion="4" />

</manifest>

まあ、今回のように、String 1個と Bitmap 1個を受け渡すだけなら、それぞれ、
putExtra(String name, String value) と putExtra(String name, Parcelable value) を呼び出せば、
もっと簡単だと思うんですけど。。(; ̄ー ̄A アセアセ・・・