2010年12月17日金曜日

Android開発における端末別の画面表示対応

androidの開発で苦労するのが端末別の対応です。
現在のアプリの対応端末の基本はXperia、Desire、Galaxyでしょう。
しかし、これにIS03が加わると大変です。

なぜなら、Xperia、Desire、Galaxyの画面SkinはWVGAなのですが、IS03はHVGAなのです。
IS03はHVGAなので、現状の主力端末の表示方法とは相容れない「ガラパゴススマフォ」なのです。

個人アプリならScrollView、RelativerLayout、dpi、spの組み合わせで、画面layoutを無視してなんとでも対応できます。
しかし、仕事となるとスクロールを使えない場合があります。ScrollViewが使えず、画面レイアウトを重視されるともう大変です。個人的にはIS03は無視でいい。と思うのですが、日本の仕事場はそこまで割り切った切捨てができない場合が多いので、にっちもさっちもいかなくなる。そして、一画面にデータを収めるのに四苦八苦しないといけないわけです。

これはandroid端末の最大の欠点です。
将来、androidがiphoneに負けるとしたらこれが理由になるでしょう。
つまり、「バラバラな端末仕様のせいで、良質のアプリが全ての端末に提供できない」ということです。
 海外では切捨てをあまり気にしなさそうなので、androidは間違いなく一番手で普及するでしょうが、日本で切捨ては無理でしょう。
というわけで、とりあえずの私が緊急に行った対応方法をメモに残しときます。

今回のケースはxperiaの解像度に合わせて作成した画面WVGA854(480 x 854)を他の主力端末に合わせるケースです。
WVGA800でも表示は特に問題はなかったのですが、ついでに対応しました。

xperia以外の対応端末は

WVGA800
(480 x 800)の
Desire(HTC)
Galaxy S



HVGAの
(640 x 960)
HVGA
IS03
です。


私の場合、layoutフォルダに画面レイアウトxmlをひとまとめにしていたので、これを分割しました。
resの配下に「layout-854x480「「layout-800x480」フォルダを作成します。

つまりは、
res - layout

から

res - layout-854x480
- layout-800x480
- layout

といったフォルダ構成に変更します。

フォルダ構成変更後、既存のlayoutフォルダの中身を

layout-854x480,layout-800x480
に格納します。

これでxperiaのレイアウトは
layout-854x480フォルダ内のxmlが適用されます。
Desire(HTC)とGalaxy Sのレイアウトは
layout-800x480フォルダ内のxmlが適用されます。

そして、IS03はlayoutフォルダ内のxmlが適用されます。
あとは、それぞれの端末に合わせた調整をすればOKです。


参考
http://developer.android.com/guide/practices/screens_support.html Related Posts Plugin for WordPress, Blogger...

2010年12月14日火曜日

androidでWEB接続 その1

最近は、androidを使ったWEB周りのコーディングを行っていました。
WEB周りは今後も色々とコーディングする機会が多そうなので、詳細なメモを残しときます。


・例1
WebViewクラスを利用して、yahooやgoogleなどのサイトに接続する


layoutのxmlにWebViewタグを記述する

<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

activityクラスで呼び出す

private final static String YAHOO_URL = "http://www.yahoo.co.jp/";
private WebView webview;

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

this.webview = (WebView) findViewById(R.id.webview);
this.webview.loadUrl(YAHOO_URL);
}


manifest.xmlにインターネット接続の許可を記述

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

あとはapkファイルを作成して、アプリを立ち上げればyahooに繋がります。
…とはいえ、このまま使うことはあまりないでしょう。
「構築したサイトにBasic認証で接続」とかが一般的でしょう。
というわけで、WebViewを利用して、Basic認証を行ってみます。

・例2
WebViewクラスを利用して、Basic認証で接続する

Basic認証を行う場合は、activityクラスを以下のように変更します。

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";


private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}
});
this.webview.loadUrl(TEST_URL);

}


TEST_URLをhttp://username:password@www.test.com/
と変更しても接続できないので注意してください。

又、Realmまできっちりと設定してください。でないと、動作しません。
あとは、HOSTとURLの指定を間違えないようにしてください。

これでapkファイルを作成して、アプリを立ち上げればbasic認証が行われ、TEST_URLに繋がります。
ただ、basic認証は接続に結構時間がかかるので、プログレスバーを利用したほうがいいでしょう。

なので、
WebViewクラスを利用して、Basic認証で接続
接続開始時にプログレスバーを表示
接続終了時にプログレスバーを非表示にして、toastメッセージを出力

とします。
以下がそのコードです

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";

private ProgressDialog mProgressDialog;

private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//ダイアログを作成して表示
mProgressDialog = new ProgressDialog(view.getContext());
mProgressDialog.setTitle("ネットワーク接続");
mProgressDialog.setMessage("接続中です");
mProgressDialog.show();
}

@Override
public void onPageFinished(WebView wv, String url){

if (mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
mProgressDialog = null;
Toast.makeText(wv.getContext(), "ネットワーク接続に成功しました", Toast.LENGTH_SHORT).show();
}
}
});
this.webview.loadUrl(TEST_URL);

}


onPageStartedがネットワーク接続開始時に呼び出され、onPageFinishedが接続終了時に呼ばれます。

最後にクッキーも扱えるように処理を追加します。

private final static String TEST_URL = "http://www.test.com/";

public static final String USERNAME = "hoge";

public static final String PASSWORD = "hogehoge";

public static final String HOST = "www.test.com";

public static final String REALM = "Access Directory";

private ProgressDialog mProgressDialog;

private WebView webview;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);

this.webview = (WebView) findViewById(R.id.webview);

this.webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

this.webview.getSettings().setJavaScriptEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
this.webview.setHttpAuthUsernamePassword(HOST, REALM, USERNAME, PASSWORD);
this.webview.setWebViewClient(new WebViewClient(){

String loginCookie = "";
@Override
public void onLoadResource(WebView wv,
String url){
CookieManager cMgr = CookieManager.getInstance();
loginCookie = cMgr.getCookie(url);
}

@Override
public void onReceivedHttpAuthRequest (WebView view,
HttpAuthHandler handler, String host, String realm){
String[] up = view.getHttpAuthUsernamePassword(host, realm);
if( up != null && up.length == 2 ) {
handler.proceed(up[0], up[1]);
} else{
Log.d("LOG_TAG","Could not find user/pass for domain :"+
host+" with realm = "+realm);
}
}


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//ダイアログを作成して表示
mProgressDialog = new ProgressDialog(view.getContext());
mProgressDialog.setTitle("ネットワーク接続");
mProgressDialog.setMessage("接続中です");
mProgressDialog.show();
}

@Override
public void onPageFinished(WebView wv, String url){

CookieManager cMgr = CookieManager.getInstance();
cMgr.setCookie(url, loginCookie);

if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
mProgressDialog = null;
Toast.makeText(wv.getContext(), "ネットワーク接続に成功しました", Toast.LENGTH_SHORT).show();
}
}
});
this.webview.loadUrl(TEST_URL);

}

以上です。
次はURLConnectionクラスを使ったネットワークのつなぎ方を記述する予定です。

それでわ。


参考サイト
http://developer.android.com/reference/android/webkit/WebView.html#setHttpAuthUsernamePassword%28java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29 Related Posts Plugin for WordPress, Blogger...

2010年12月10日金曜日

androidのsqliteを日本語で使う

androidのsqliteの日本語処理ではまりました。
はまったのは以下のケース

・sqliteのsqlファイルを用意。sqlファイルの文字エンコーディングはUTF-8
・テーブルのtext型に文字列を格納。改行文字を\nとして格納
・android側でDBからデータを取得。文字をTextViewに設定すると\nがそのままviewに出力されていまう。
・\nを置換する。しかし、\nが置換されない。

というケースで半日はまった。
これでもjavaプログラマーなのかと自己嫌悪。

原因
・置換改行文字をUTF-8に変換していなかった。

最初は

String hoge = getDB();
hoge.setText(hoge.replaceAll("\\\\n", "\n"));

とやっていた。

だが、これはNG。すっかり忘れていたが、javaの文字列内部コードはISO-8859-1なのである。androidとて例外ではない。
脳がフレームワーク脳になっている。

ここは、パターンマッチに使う改行文字をUTF-8のコードに変換してやる必要がある。
以下、解決方法

byte[] bytes = "\\\\n".getBytes("ISO-8859-1");
String new_line = new String(bytes, "UTF-8");

これでUTF-8の改行パターンマッチが取得できる。
あとは普通にreplaceAllを使う

hoge.setText(hoge.replaceAll(new_line, "\n"));

これで思い通りの結果が出力される。


ps
スマートフォンアプリの開発では英語力があったほうが良い。
これはiphoneもandroidでも共通だ。
ドキュメントや講義のyoutubeが英語が中心だからだ。
仕方なしに空き時間には英語の勉強もちょこちょこやっているのだが、英語ができるようになればなるほど日本語が好きになるのが不思議だ。
英語が世界共通語だから英語メインになっていくのは仕方ないが、英語に触れれば触れるほど、
日本人ということを強く意識するようになるは皮肉なものである。 Related Posts Plugin for WordPress, Blogger...

androidのlogcatで日本語を使う

世阿弥も愛した素敵な日本語。しかし、androidは日本語をあまり愛していないようだ。なので、ときどき文字コードで困ったことが起こる。
以下、解決方法をメモ。

Logで日本語を出力

eclipseでlogcatを見ると、日本語が文字化けする。なんという非国民。愛国者になるには、コマンドプロンプトを利用する

windowsXPの場合の手順

・コマンドプロンプトを立ち上げる

・タイトルバーを右クリック

・プロパティ

・フォントタブを選択肢、MSゴシックにする

・UTF-8に変更するため、プロンプトに以下のコマンドを打ち込む
chcp 65001

・logを出力(サンプルはDebugレベル)
adb logcat -d

で日本語でlogが出力されるようになります。 Related Posts Plugin for WordPress, Blogger...

2010年11月29日月曜日

androidのListViewの動き その1

androidアプリ作成時には必ずお世話になるListViewの特徴と動きのメモです。
このListViewをうまく使えるかどうかで、androidアプリの完成度は大きく変わります。
はまりそうな箇所を中心に記述しておきます。自分のメモ代わりでもあります。

ListViewのlist側のxmlに設定したButtonが反応しない

リストにButtonを設定する場合、Buttonタグに

android:focusable="false"

を設定する。そうしないと、onListItemClickが使えなくなる。
これは結構はまりがち。嫌な仕様ですが、気をつけましょう。

スライド時にタッチすると項目が黒くなる

ListViewタグに

android:scrollingCache="false"

を設定する。

参考サイト
http://typea.info/tips/wiki.cgi?page=Android+Tips#p27

list側の背景を利用したくない。親の背景をそのまま透使いたい(透過処理)。

ListViewタグに

android:cacheColorHint="#00000000"


を設定する。

参考サイト
http://d.hatena.ne.jp/isher/20091009/1255029532

getViewメソッドの挙動

画面をスクロールさせて、列が表示されるたびにgetViewメソッドは呼ばれる。

境界線の色と高さを変更する

ListViewタグに


android:divider="#808080"

高さ
android:dividerHeight="2sp"

のように設定する

とりあえずその1はここまで。 Related Posts Plugin for WordPress, Blogger...

2010年11月17日水曜日

android端末をwindowsにUSB接続する

android端末をwindowsにUSB接続する

android端末をwindows7より前のwindowsXP、Vista等で認識させるには、ドライバが必要になることがあります。
また、adbコマンドを利用する場合、最新の端末は認識されないことがあるので自分で設定が必要となります。

xperiaは特に必要ありません。

HTC Desire

softbankのHTC Desireは以下のサイトからソフトウェアをダウンロードしてください。
http://www.htc.com/jp/SupportViewNews.aspx?dl_id=932&news_id=623

ダウンロード後、
HTCSync.exe
をクリックしてinstallします。
これで端末にアクセスできます。

コマンドプロンプトでadbコマンドを使用できるようにする

端末のアプリケーションのUSBデバッグをチェック、スリープモード非設定をチェックします。
C:\android-sdk-windows\usb_driverのandroid_winusb.infをテキストエディタで開きます。

; HTC Desire
%SingleAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87
%CompositeAdbInterface% = USB_Install, USB\VID_0BB4&PID_0C87&MI_01

上記の記述を
[Google.NTx86]と[Google.NTamd64]の部分にコピペして貼り付けます。

コマンドを開き

adb devices

で確認してみましょう。端末番号が表示されるはずです。
表示されない場合は、コントロールパネルからUSBディバイスを認識させるか、再起動してみてください。たぶん上手くいきます。

ギャラクシーS

サムソンのギャラクシーSの場合は、以下のサイトからソフトウェアをダウンロードしてください。
http://software.gamblis.com/mobile/samsung-i9000-galaxy-s-driver-software-download/

ダウンロード後、
Kies_1.5.1.10074_2_6.exe
をクリックしてinstallします
携帯電話だけをチェックしてインストールします。
これで端末にアクセスできます。

コマンドプロンプトでadbコマンドを使用できるようにする

端末のアプリケーションのUSBデバッグをチェック、スリープモード非設定をチェックします。
C:\android-sdk-windows\usb_driverのandroid_winusb.infをテキストエディタで開きます。

; Samsung galaxy
%CompositeAdbInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_00
%SingleBootLoaderInterface% = USB_Install, USB\VID_04E8&PID_6640&MI_04

上記の記述を
[Google.NTx86]と
[Google.NTamd64]の部分にコピペして貼り付けます。

コマンドを開き

adb devices

で確認してみましょう。端末番号が表示されるはずです。
表示されない場合は、コントロールパネルからUSBディバイスを認識させるか、再起動してみてください。たぶん上手くいきます。

追記
adbコマンドだけで事足りる場合は、ソフトウェアのインストールは必要ありません。
android_winusb.infに上記の内容を貼り付ければOKです。

以上。最新androidOSが楽しみな管理人でした~。 Related Posts Plugin for WordPress, Blogger...

android,iphoneアプリ開発では、バージョン管理システムは分散型を使う

android,iphone開発ではバージョン管理システムは分散型を使う

スマートフォン開発では、ソースコードの管理は分散型を使ったほうが良いです。
なぜなら、スマートフォンアプリは頻繁なversion upが要求されるからです。
開発では、次期versionとバグフィックスの平行開発が普通なので、分散型でないと色々と面倒なことが発生する可能性が高いです。
企業ではいまだにsubversionを使用しているところが多いですが、あまりおすすめできません。もし、cvsを使ってるなら、androidやiphoneの開発を行うまえに、バージョン管理の本を読みましょうw。

ちなみに私はandroid開発ではgitを使っています。
iphone開発ではMercurialです。

別にバージョン管理ソフトを使い分ける必要はないと思います。私はバージョン管理ソフトの勉強を兼ねて分けて使用しています。
個人的にはgitがBESTだと思います。世の中もそういう流れですしね。




私はgitは上記の本にお世話になっています。バージョン管理ソフトが苦手なアホの私でも使えるようになりました。
ただ、windows7だとgitは日本語が使えないかもしれません。
windows7を使っている人は気をつけてください。
でわ Related Posts Plugin for WordPress, Blogger...

2010年11月14日日曜日

androidアプリのフォルダ構成

androidアプリのフォルダ構成

開発を行うとき、ソースを格納するフォルダを作成します。
この時、androidでは、javaソースフォルダは一つにまとめたほうが良いと思います。
例えば、これまでのWEBの開発では、form, action,utilなど機能ごとに色々まとめるのが一般的でした。
でも、androidの開発ではやめたほうがいいです。
もちろん規模にもよりますが、普通のアプリでは無駄です。逆にフォルダ階層が異なることによる制約のほうが邪魔です。

Hogeというアプリがあるのなら

jp.co.hoge

というフォルダを作成し、そこに全てのjavaファイルを作りましょう。
ativityクラスをおくために

jp.co.hoge.activity

とかはよほど規模の大きいプロジェクト以外はやめたほうが良いです。
Activityクラスは「画面名」 + Activityとするべきです。

TOP画面なら
TopActivtyとするのが良いと思う。

ただし、TOP画面を直接「android.intent.category.LAUNCHER」で立ち上げるべきではありません。
これは意外とやらかしてしまっているアプリが多いです。

起動画面はSplash.java
を作成し、そこで初回起動時、update時、アプリ立ち上げ時の処理を通すようにします。

つまりは、

Splash.java(startActivity)



TopActivity.java とか HomeActivity.java とか MainActivity.java

として、TopActivity.javaで画面表示するのが良いです。

そして、
Splash.javaは

Manifestファイルのactivityの設定に

android:noHistory="true"

を記述しましょう。

Splash.javaはstackに積んではいけません。deviceの戻るで表示されてしまうからです。 Related Posts Plugin for WordPress, Blogger...

2010年11月9日火曜日

androidアプリバージョンアップ

オリジナルandroidアプリのダイレコをversion1.2.0にupdateしました。
今回は、入力補助の機能を追加しました。これで随分と入力が楽になると思います。
是非、ご利用ください。

今後、version1.2.x系は、インターフェースをもっと使いやすいよう、短いスパンでversionUpしていきたいと思います。

操作説明のHPの更新はもうちょっと待ってください…。更新の連続でちょっと(かなり?)疲れ気味です。

でわ。 Related Posts Plugin for WordPress, Blogger...

2010年11月4日木曜日

第二作目のAndroidアプリを公開

本日、第二作目のAndroidアプリを公開しました。
非常にシンプルなアプリですが、色々なネタが満載のアプリです。



今回もフリーアプリなので、暇つぶしに是非どうぞ。

新作アプリ説明ページへ

Adroid marketへ

「hit」という文字列検索で表示されると思います。

疲れたので、今日は短文です。
それでわん。 Related Posts Plugin for WordPress, Blogger...

2010年11月3日水曜日

「すべては戦略からはじまる」の感想

 なぜ、この本がプログラマーズバイブルのラベル設定になっているかというと、戦略的な思考をプログラマにも多少はもって欲しいからです。
 優秀なプログラマなら分かっていると思いますが、技術とお金を稼ぐ能力は別です。優秀なプログラマと優秀でないプログラマの生産性は100倍にも及ぶことがあります。
 しかし、どんなに優秀なプログラマでも、お金を稼ぐ能力は他から学ばないといけません。
 プログラマという職業の地位を向上させ、職業プログラマが幸せになるためには、多くのプログラマがマネタイズする力を身につけ、社会の中で地位を掴み取っていかなければいけないのです。


 
 この本は会社経営の戦略本です。事業がうまくいっていない架空のゲーム会社を題材に、会社を立て直すための戦略を小説形式で説明していきます。いわゆるMBA式の経営戦略本なのですが、ストーリーのある小説なので読み易いです。ゲームソフトウェア事業がテーマなので、プログラマにはお薦めです。
 また、途中途中で問題演習が入るので、読んだだけで満足して終了ということにはならない点が優れています。最低限必要な知識を強制的にアウトプットさせる仕組みになっています。
 ストーリーは完全に最近はやりの「萌え」路線。「もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら」のようなイラストだったらもっと売れると思います。前者の例に漏れず内容とストーリーは薄いですが、内容は悪くないです。事業計画の入門本としては、十分な内容だと思います。
 しかし、主人公が篠原涼子風の美人キャリアウーマンというのは失敗です。中途半端すぎます。どうせなら、MBA戦略の天才女子中学生、しかもめがねっ娘とかにしないといけません。これは編集さんの責任です。この世界のマーケットをまったく分かっていませんね。
 また、この本を読んだ後には、自分の会社の経営戦略をシュミレーションしてみるといいと思います。自分が今後習得するべき技術や、進む方向性の助けにもなると思います。

 私はコンサルタントみたいな連中はあまり好きではありません。しかし、バリバリの技術者こそ、こういった本を読むべきだと思います。技術者はもっと自分の技術を有効に使い、イノベーションを巻き起こし、社会を変えていくべきなのです。
 プログラマにはそれができるのです。
  Related Posts Plugin for WordPress, Blogger...

MediaWikiをVirtualHostに設定したらページが表示されなくなった

MediaWikiをVirtualHostに設定したらページが表示されなくなったので、その解決方法のメモ

環境
Ubuntu 9.10
Mysql 5.1.37
php 5.2


実施する(した)こと

* Apache2のVirtualHostに、MediaWikiの情報を設定する

* LAN内でアクセスできるようにwindowsとmacのhostsファイルにドメインを指定

* ブラウザでアクセス。しかし、wikiが表示されない。他に設定してあるRedmine(Passenger動作)やTestLinkは正常に動作する


原因

error_logを見ると、File Not Foundエラーが表示されていた。
urlの指定がhttp://ドメイン/wiki/wiki。本来はhttp://ドメイン/wiki/でなくてはいけない。

はまったこと

VirtualHostのファイル設定に間違いはなかったのに、ここが間違いだと仮定してtry&errorを行ってしまった。

解決方法

MediaWikiのフォルダ直下にあるLocalSettings.phpの

$wgScriptPath = "/wiki";

の部分を

$wgScriptPath = "";

に変更する。

それだけで復活しました。

直し方は
こちら
を参考にしました。

久しぶりにサーバー周りをいじったので時間がかかってしまいました。
ちょこちょこいじる時間をとらないと駄目だと実感した管理人でした。
でわ。 Related Posts Plugin for WordPress, Blogger...

2010年11月2日火曜日

faceBookのファンページでFBMLを使ってみる その1

最近やたらと世間でfaceBookがプッシュされています。
ローソン、TBS、著名な個人では勝間和代さんもファンページをはじめましたね。

私は別に有名人ではないので、ファンページを作る必要性は感じません。
でも最近はandroidアプリの作成もしていますし、今後はiphoneアプリやWEBサービス、facebookのアプリも作成したいと思っているので、とりあえずこの勢いでファンページも作ってみようかと思っています。

しかし、このファンページの作り方。やたらとっつきにくいのです。本当に日本でfaceBookははやるのかと疑うくらい使いにくい。
職業エンジニアの私がそう思うのだから、普通のユーザーではなおさらでしょう。

そんなわけで作成メモを残しながら、ファンページを作成していこうと思います。
ただし、ここではファンページの作成とFBMLの導入はすでに完了済みであるとします。

でわでわ、一番簡単そうなFBMLというアプリケーションを使ってファンページをいじることにしましょう。

FBMLの使い方は
http://developers.facebook.com/docs/reference/fbml/
を参考にします。、英語は苦手なんですがこれくらいならなんとかなるでしょう。

まずは、訪問してくれた友人を出迎えるメッセージを作成してみましょうか。

作成するメッセージは、

WELCOM TO MY PAGE!! おお、我が心の友よ。

というメッセージにでもしましょうか。

画像下のファンページ編集を選択し、左メニューのアプリケーションを選択します。
FBMLがインストールされていれば、右側にFBMLが表示されているはずなのでそれを選択します。

次に、FBMLの中にHTMLを記述します。




上記のように記述したら、「変更を保存」ボタンを押下します。

さて、変更後のページを確認してみましょうか。




おお、見事にHTMLタグが効いてますね。
しかし、これではfaceBookっぽくないですね。せっかくなんだからもっとfaceBookっぽくしたいですね。なので、facebookで用意されているAPIを利用してみます。

色々見てみると、fb:headerというtagを発見。
http://developers.facebook.com/docs/reference/fbml/header

この部分はヘッダーなので、上記のタグが良さそうですね。では、さっそく使ってみましょう。。

属性のdecorationはヘッダーの下に下線を加えるみたいですね。これも追加しましょうか。
以下のように記述します。






記述を終えたら、「変更を保存」ボタンを押下します。
そして、変更後のページを見てみましょうか。



おおおお、faceBookっぽくなりましたねえ。このダサさがなんともfacebookっぽいw。

ってなわけで疲れたので今回はここまで。次回はもっと色々といじる予定です。
このペースだと果たしていつ完成するのでしょうかw。
とりあえず、お疲れ様でした~~。 Related Posts Plugin for WordPress, Blogger...

2010年10月29日金曜日

faceBook・ビジネス・マーケティング

faceBookを使ってファンページを作成してます。
ついでに、faceBookの特徴も調査中です。以下、調査結果とまとめです。


・ファンページとはなにか

「企業サイト」のようなもの

・普通のHP, Blogと何が違うのか

ファンページは、facebookの中に出店できる支店サイトのようなもの。
商品やサービスの注文を受付けできること以外にも、商品やサービスについて興味を示すお客と掲示板で直接やり取りできたり、イベント情報を発信できたり、普通のホームページ以上に便利な機能が満載。

・効果

ユーザー数は、世界で5億人を超える。単純計算で全世界の1/12のユーザ数が存在するので、影響力は大きい。
しかし、現時点では日本のユーザー数は少ない。浸透するかどうかも微妙。ただし、英語、スペイン語が出来るのであればやったほうがよい。というより、やらない理由がない。

・操作性

現状のUIは日本人には合わないと思う。確かに色々なことが可能だし、WEBの扱いに慣れている人やエンジニアには魅力である。
しかし、一般ユーザーが使ってもなにをやっていいかわからず、登録して放置となる可能性が高い。また、使っていても掲示板にツイッターのつぶやきを垂れ流しているだけの人も多いようだ。日本で広がるには、もっと操作が簡単になるか、手厚いサービスが必要だと思う。

・その他のソフトウェアとの連携

かなり良い。Twitter, Youtube, Ustreamとの相性も良い。楽しいゲームもある。それなりのWEB知識で、かなりの効果を生み出すマーケティングも可能。今後、色々なマーケティング手法とイノベーションが生まれると思う。特に、金をばらまかない政治的な活動ができるようになれば、世界は大きく変わるだろう。…これは無理か。

・将来性

高い。ビジネスという観点だけからみるなら、googleを超える。英語、スペイン圏でビジネスをやるなら必須のツールになるはず。

・日本

実名での公開がネック。若い世代は抵抗ないだろうが、2ch全盛期頃にWEBを使い始めた世代は拒否反応が強いだろう。ITの世界でも世代間格差がどんどん生まれてくるはず。今後、格差社会を広げる原因を担うアプリともいえる。今の格差はお金に関する話が多いが、10年後にはIT格差が社会問題になると思う。

追伸

公開できる状態になったら、ファンページを公開します。
そのときはよろしくお願いします。 Related Posts Plugin for WordPress, Blogger...

2010年10月26日火曜日

「夜と霧」の感想

この本を読後、すぐに眠りについた。

そして、夢をみた。

その世界は戦争中だった。

私は戦火の中で彼女を探していた。しかし、発見した彼女は敵兵士に乱暴されている最中だった。

私は駆け出した。しかし、走っても走っても彼女には近づけない。なぜ距離が近づかないのかと私は焦った。

彼女と目が合った。その目はうつろで人形のようだった。私は叫び声をあげた。

そこで目が覚めた。時計を見るとまだ4:00前だった。隣には無造作に置かれた「夜と霧」の本があった。私の全身からは、冷や汗が出ていた。



若者の「希望は戦争」という記事を書いた赤木智弘さんの論文が一時期話題になったことがある。

若者といっても赤木氏は私より年上だ。彼より社会を長く生きていない私が彼に物を言うのには抵抗があるが、あえて言いたい。

「この本を読め」

と。

 私も氷河期世代の人間だから、色々と苦労はしてきた。定職に就いていない時期は「この先どうするの?死ぬの?」ようなことも普通に言われたりした。しかし、戦争を望んだことは一度も無い。私が楽天的な性格ということもあるだろうが、私と赤木氏の思考の違いの答えはこの本にあると思った。

 この本はアウシュヴィッツという悲劇の歴史を知るための本ではない。この本で知ることができるのは、人間の精神のあり方だ。

本の中に

わたしたちが生きることからなにを期待するかではなく、生きることが私達から何を期待しているかが問題なのだ

という言葉があった。

その通りだと強く思った。

 私には夢がある。多くの夢が。それを果たしたいと強く思っている。生きることが私に期待しているのはこれらの夢を成就することに違いないとこの言葉を咀嚼しながら考えた。我ながら単純な思考だとも思う。

未来を見据えている人の精神は強い。驚くほどに。この本はそれを教えてくれる。

「希望が戦争」などと言ってしまうのは、現在にも未来にも希望が見い出せないからだろう。この本に記述されている被収容者達と同じように。

今の日本の若者の胸に去来しているのは、アウシュヴィッツの非収容者達と同じ精神状態なのだろうか。

しかし、ただ時代の流れに沿って生きているだけで日本人だけが極上の生活を得られる時代はバブルの崩壊と共に終了したのだ。

未来は与えれられるものから、掴み取るものへと変わっている。

現在(2010/10)、日本は中国の尖閣問題で世論が揺れている。ネット上では中国に対する過激な意見が飛び交っている。

もし、戦争が始まり日本が勝利すれば、中国人に対しナチスのような行動に出るのではないかと危惧するほどにだ。それは、中国側にも同様なことが言えるだろう。

今の状態で、両国が友好を結ぶことはできない。また、必要もない。しばらく距離を置いて頭を冷やしたほうが両国のためになる。

大切なのは日本人や中国人といった人種ではない。

個人の精神だ。

中国人にも良い人間はたくさんいる。私は開発現場で多くの中国人に出会ったし、彼らはみな真面目でとても親切であった。ベトナムや台湾の人達も同様だ。

逆に、日本人でも性根の腐った人間はたくさんいた。

この本でも記述されているが、結局行動とは個人の精神の実体化した結果なのである。

国同士の仲が悪かろうと良かろうと、個人個人の人間性は別物だ。

著書のフランクルはこう述べている。

この世にはふたつの人間の種族がいる。まともな人間とまともでない人間と。

受難の民は攻撃的になる。とりかえしがつかなくなる前に、わたしたちも自分に問いかけなければならない。

自分はまともな人間なのか、と。

その時、この本は必ず大きな助けとなるだろう。 Related Posts Plugin for WordPress, Blogger...

2010年10月23日土曜日

Eclipseのsubversion操作ではまったこと

Eclipseのsubversion操作ではまったので、その解決方法のメモ


実施する(した)こと


  • subversionのリポジトリからプロジェクトを取得

  • 取得したプロジェクトを、プロジェクト名称を変更して完全な別プロジェクトとして作成

  • 作業完了後、別プロジェクトとしてコミットを行う



はまったこと

プロジェクトフォルダ右クリック → チーム → プロジェクトの共有

で同一リポジトリに別プロジェクトとしてコミットしようとした。
しかし、リポジトリから作成したプロジェクトなので、他のプロジェクトに関連づいてしまっている。

なので、別プロジェクトとして管理するには

プロジェクトフォルダ右クリック → チーム → 切断

という作業が必要となる。これがeclipseでのやり方がわからなくてはまりました。
(言い訳をさせていただくと、私は普段はコマンドで叩いているのです。自宅はgitですし…。)

上記切断作業後、

プロジェクトフォルダ右クリック → チーム → プロジェクトの共有

が可能になるので、あとは普段の作業と一緒でOKになりました。
既存のリポジトリを選択し、コミットしたいファイルを選択して、コメントを記述してcommitを行う。無事リリースも終了。
eclipseは最高ですが、時々最悪ですね。
でも、作業トータルで考えると明らかにプラスなので手放せませんよね。 Related Posts Plugin for WordPress, Blogger...

基礎を制するものは世界を制す - 書評 - 『プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識』

  • 公開日:2010年10月23日
  • 最終更新日:2015年08月02日

はじめに


現在は技術の進歩が、とてつもなく早い世の中です。最新のプロダクトが、一年で開発停止になるのもめずらしくありません。
だからこそ我々エンジニアは、基礎をきっちりと身につけておかないといけません。幹となる知識をしっかりと理解しておくことで、最新の技術の良し悪しを理解し、キャッチアップの速度をあげることができます。

本書の特徴


本書は時代の流行り廃れに左右されない基本を身につけられる本です。
家の建設でいうと基礎の部分です。基礎の部分がダメだと、どんなに素晴らしい外装や内装を施しても、ちょっとしたことで全てが崩壊してしまいます。大きな家であればあるほど、基礎が重要となります。

技術も同じことが言えます。知識を積み重ねれば積み重ねるほど、基礎の部分もしっかりと強くしていかないといけません。基礎が貧弱だと、新しい技術を身につけるのも時間がかかりますし、理解も表面にとどまってしまいます。

何事も基礎の反復が重要。どの道の一流の人達もよくいっていることです。でも、凡人は飽きてしまします。でも、それでいいと思います。思い出した時、何度も何度も読み返すことが重要です。そうして知識の幹はどんどんと太くなっていきます。

だから、私も完全に理解するまで繰り返し反復したいと思います。そして、その知識は、いつかきっと自らの底力となって役に立ってくれるはずです。

2015/08/02追記

5年ぶりに本書を読み返しました。そして、確信しました。本書は、

間違いなくプログラマーズバイブルである

ということです。

日々に忙殺されると学習時間がなかなか取れません。一度読んだ本を再び開くことは、めったにないのが現実です。
ただ、この本は何度も読み返す価値があります。ふと時間ができた時、読み返すことで、以前よりも自分のエンジニアとしての力が向上していることを確認できます。

もしあなたがエンジニアの世界で生きていくつもりなら、本書は本棚、もしくはkindleの中に保管しておきましょう。

Related Posts Plugin for WordPress, Blogger...

Androidでsqlite

sqliteを使う場合はパフォーマンスを意識する習慣を身につけましょう。

androidアプリを作成すると、sqliteを使用するケースは非常に多いと思います。しかし、アプリでsqlを使用する場合は、ただ単に期待通りの結果を取得するのではなく、体感速度も意識しましょう。携帯端末アプリでの、長時間検索は不快なことこの上ないです。

そして、sqlのパフォーマンスを改善する時に役に立つのが、explainコマンドです。
explainを使うと、sqlの実行計画を閲覧することができます。

コマンドライン上で

explain select * from hoge;

とsql文を実行します。
ただし、このままだと非常に見難いので、

.explain ON

最初にコマンドを叩きましょう。

その後、

explain select * from hoge;

と実行すると、体裁が整っていて非常に見やすいはずです。

ちなみにexplainの見方は以下のサイトに記述されています。
http://www.hwaci.com/sw/sqlite/opcode.html
最初はとっつきにくいですが、頑張って理解してください。同時に、技術をユーザーの視点から見ることができるようにもなるはずですから。

追伸1
もうすぐオリジナルandroidアプリの第2作目を公開できそうです。シンプルなアプリなので暇つぶしにでもどうぞ。

追伸2
色々androidに関する知識が蓄積してきたので、このへんで色々とoutputしていきたいと思います。私がよく利用しているサイト・書籍・アプリ等々。 Related Posts Plugin for WordPress, Blogger...

2010年10月20日水曜日

「幼年期の終わり」の感想

個人的にSF小説はあまり好きではありませんが、この作品は別格でした。
本当の名作は時代やジャンルをも超越するのだということを教えてくれた本です。
SFなんてくだらない。そう思い込んでいた私の考えを粉砕してくれました。



 ここでは、この物語をSFという視点ではなく、文学という視点から物語を思索してみようと思います。

 この物語は、
「人間が争いを放棄し、生きていくのに必要 な物質を全て満たしとき、人類はどういった方向へと向かうのか。」
という問いを投げかけてきます。
 この本が書かれたのは1950年代で、現在は2010年です。当時と比べて、人類の生産性は大きくあがりました。世界の先進国では、貧乏な人間ほど肥満になるという現象が浮上するほどにです。
 しかし、貧困国では、いまだに大勢の餓死者が出ています。日本では、コンビニ、ファミレス、スーパー等の店舗で大量の食事が廃棄されているというのに…。これはひどく矛盾した社会です。しかし、この問題もそう遠くない未来に解決されるでしょう。そして、人類は飢えを克服すれば、さらなる生活の向上を目指すようになります。世界の一部の先進国ではすでにそうなっているように。
 人類の努力で、素晴らしい多くの技術が発展しました。しかしその結果として、世界中の先進国では、職のない失業者が大量にあふれています。皮肉なことに、人を幸せにするはずの技術が、人から仕事を奪ってしまったのです。

過去は

仕事量 < 需要

だったのが、

現代は

仕事量 > 需要

となってしまったのです。

 この現象は新興国の急速な発展でさらに高まるでしょう。今後、食料は今より少ない人口で大量生産が可能となり、「働かざるもの食うべからず」という言葉は、過去ものとなり、働かなくても食える社会が到来するはずです。このような社会で人はどう生きていけばいいのでしょうか。

 この物語の中では、人は学ぶことに重きをおいて生きていました。大学院で高度な専門項目を学ぶ、専門項目以外にも好きなことを突き詰めていく。確かに理想です。私もそういう世界がいつかきてほしいと強く願っています。
 しかし、そんな世界が果たしてうまく機能するのでしょうか。人は、自分の生活を過去とは比較しません。
他人と比較するのです。
 物質が全て満たされた世界では、人は生れながらの顔や身長でお互いを比較するようになるのでしょうか。でも、顔や身長も自由に変更できる時代もくるでしょう。そのとき人はなにをもって幸福感や満足感を得るのでしょうか・・・。

そんなことを色々と考えさせてくれる本でした。未読のかたは、ぜひ一読をお勧めします。
その辺のビジネス書・専門書・歴史本を読むよりも、多くの示唆を与えてくれる素晴らしい本です。 Related Posts Plugin for WordPress, Blogger...

2010年10月12日火曜日

悪霊1巻の感想

光文社古典新訳文庫より、亀山郁夫氏の新訳が発売されました。
ドストエフスキーの代表作の一つ「悪霊」です。




私は、亀山訳の「カラマーゾフの兄弟」と「罪と罰」を読んでドストエフスキーにはまったので、ためらいもなく即購入した。

亀山氏は、この悪霊をドストエフスキーの地獄編と評している。しかし、この1巻では、そのような雰囲気は感じられない。淡々と、1861年のロシアの農奴解放令(*1)によって揺れる世界が描かれている。一方で、罪と罰のような読み易さはなく、第1章の説明描写はカラマーゾフの兄弟を連想した。

この物語の主人公はニコライ・スタヴローギン(以下ニコライ)であるが、ニコライの本格的な登場は1巻の後半になる。1巻の前半~中盤までの話は、ステパン・ウェルホヴェンスキー(以下ステパン)と友人のワルワーラ・スタヴローギン(以下ワルワーラ)が中心となっている。彼らの20年にも及ぶ友情と恋愛を綯い混ぜたような奇妙な関係が、この先物語に大きな影響を及ぼすことが伝わってくる。

2章のハリー王子縁談では、ワルワーラの息子ニコライの狂った複数のエピソードが紹介される。一方で、ステパンはワルワーラからダーリヤ(以下ダーシャ)との結婚話を突きつけられる。

ここで怪訝に思うのが、ワルワーラが、なぜダーシャとステパンを結婚させようとしたかである。ダーシャはワルワーラの養女である。ステパンとワルワーラはかつて恋愛関係に近い仲にもなっている。なのに、養女ダーシャとの結婚を強制的に勧めた。この時のワルワーラの心情はいかなものだったのだろうか。

3章は、一気に色々な人物が登場する。一度に、彼らの関係を理解することは難しいが、栞にある主要登場人物を照らし合せながら読み進めた。

4章では、マリヤ・レビャートキナ(以下マリヤ)が登場する。教会堂での礼拝式にいたワルワーラの前にマリヤが現れ、ワルワーラは、ワルワーラ婦人の屋敷へと彼女を連れて行く。

5 章は、この1巻で最も話が盛り上がる。マリヤの兄であるレビャートキン大佐が登場し、マリヤが施しを受けた金をワルワーラに突き返す。一方で、妹のマリヤは領地を貰い受けたと主張する。この辺のワルワーラとレビャートキンの立場は、農奴解放令という大きな時代の変遷を受けとめようとしながらも、受け取りきれていない状況を描いているのだろうか。

また、ラストではステパンの息子であるピョートルが登場する。ステパンはあくまで息子としてピョートルに接するが、ピョートルはステパンに親愛の情をもっていないのは明らかだ。この悲しい現実に打ちのめされるステパンは不憫であった。



それにしても、なんという凄い小説なのだろうというのが1巻全体を通しての感想だ。

ドストエフスキーの小説からは、強烈な作者からのメッセージと思想が伝わってくる。それは「罪と罰」「カラマーゾフの兄弟」もそうだった。

亀山氏の悪霊は全3巻で刊行される予定のようだ。次の2巻を楽しみに待ちたいと思う。


(*1)ロシアの農奴解放令

1861年にアレクサンドル2世によって発令。クリミア戦争に敗北したアレクサンドル2世が、ロシアの後進性を痛感して取り組んだ。
 ツアーリズム(ロシア帝国の絶対君主制体制)の危機を感じた皇帝が、「下からの革命による改革よりは上からの改革の方が良い」と廃止を決めた。
 しかし、この農奴解放は、旧地主の大反対によって、農民にとってかなり不利だったため、農民の生活はすぐにはよくならなかった。 Related Posts Plugin for WordPress, Blogger...

2010年9月28日火曜日

androidアプリとiphoneアプリを開発して思ったこと 最終回

~スマートフォンの今後と期待~

これまでアプリ開発者としての視点から色々とスマートフォンアプリの現状についてだらだらと語ってきました。なので、最後は消費者としての視点からスマートフォンについて色々と意見を述べていきたいと思います。

まず思うのは、スマートフォンは電話として使いにくいです。これはandroidもiphoneも同じです。私には、ガラケ―のほうが全然使いやすい。世界標準だかなんだか知りませんが、正直腹がたつことも多いです。
 個人的には、ガラケーで電話 + スマートフォンでメール・アプリ・ネットがベストだなと思っています。今現在なら、一番安いdocomo端末 + iphone4(itouch4)の組み合わせが最高だと思います。ただ、費用が別々なのがアホラシイし、二台持ち運ばなければいけないのがネックですね。

あと、スマートフォンはソーシャルメディアとの連携が非常に重要です。
今のスマートフォン利用の最大の目的は、ビジネスなんですよ、結局。アプリなんて基本おまけです。スマートフォンはソーシャルメディアと連携することで、最高のビジネスツールになるわけです。
 特にこれからの時代は、ネット上で自己ブランドを形成し、個のブランド力が重要になることが予想されます。なので、スマートフォンでソーシャルメディアを違和感なく扱えるようにしていただきたい。

 ただ私個人としては、スマートフォンの価値は、人と人との繋がりを強化することにあると思います。電話をはじめとして、SMS、メール、ブログ、twitter, facebook等もそうですね。ネットを通じて、スマートフォンとソーシャルメディアでいつでも世界中の情報を取得し、情報を発信できる。それが重要なんじゃないでしょうか。
 それによってこれまでなら見過ごされてきたような小さな事柄が解決できるかもしれません。又、メディアが取り上げない見えない世界の貧困を救えるかもしれない。命を救えるかもしれない。色々な事柄が解決できるかもしれません。

 でも世の中では、このスマートフォンというツールを、新しいビジネスの舞台としてしかとらえてない人が多いです。正直、がっかりさせられます。
iphoneやandroid端末は、ビジネス以外でも多くの可能性があります。
なので、個人的には、人の生活に役立つようなフリーアプリを色々と作っていきたいと思っています。

まだまだスマートフォンの時代ははじまったばかりです。
どんな未来が待ち受けているのでしょうか、楽しみですね。

以上です Related Posts Plugin for WordPress, Blogger...

2010年9月21日火曜日

androidアプリとiphoneアプリを開発して思ったこと その5

~スマートフォンアプリで利益を稼ぐ方法を考える。市場を知る ~の巻

さて、その1からその4まで読んでくれた方は、スマートフォンアプリでお金を稼ぐことの難しさが認識できたと思います。

有料アプリの価格の30%を受け取るgoogleやappleとは、我々開発者は立場が違います。なので、上記2社とは違う利益の出し方を、我々開発者は考えていかないといけません。
「これからはiphone, ipad, androidの時代。超大チャンス」なんて誰でも言えます。もっと現実的な目線で考えてみましょう。

標準的に考えられるのは
1、有料アプリ販売
2、無料アプリ広告展開
3、アプリの開発請負

といった所でしょう。
しかし、現在の市場で、1と2で生活費を稼ぐのは困難です。3が一番現実的でしょう。
案件の単価を調査してみたところ、iphoneで月50~程度は稼げそうです。実績があればもう少し稼げるでしょう。
 もちろん一発当たれば、莫大な金額が稼げますが、安定した収入という視点で考えた場合はこれが一番現実的だと思います。

androidアプリは、現状3しかないです。
ただ、android marketがずっと現状のままとも考えにくいです。このままでは開発者はどんどん離れてしまうので、googleもなんらかの対策を練ってくるはずです。その時を期待して、開発のテクニックの技術を磨いたり、アプリを開発しておくのもありでしょう。未来を見据えた投資です。
 ただし、googleはappleとはビジネスモデルが全く異なるので、androidの普及に失敗してもgoogleにはほとんど影響がないことも知っておきましょう。失敗だと判断した時点でandroidOSを切り捨ててしまうことも考えられます。

ざっと考えられる収益モデルは上記のような感じです。
 ただ、私がスマートフォンアプリで利益を稼げるだろうなあと思う一番の方法は、最近話題のマーケティング3.0の視点ではないかなと思っています。

さて、今回はこれで終了です。
次回がとりあえず今回のテーマの最後になります。

でわ。 Related Posts Plugin for WordPress, Blogger...

2010年9月18日土曜日

オリジナルandroidアプリ【ダイレコ】のCMを作成してみました

コマーシャライザーというサイトを使って、オリジナルandroidアプリのCMを作成してみました。
以下が、そのCMです。



驚くことに、上記のCMはフリーで作成することができます。
なんとも凄い時代になったものだと感心すると同時に、半ば呆れてしました。
テレビなど既存のメディアが消えるのも、そう遠い未来のことではなさそうです。個人がブランドを築き、市場の中で企業とガチンコで勝負する時代がもうすぐそこまできてるようです。
 ただ一つ懸念なのは、IT業界に従事している人間以外が、この飛躍的な技術の進歩についていけるのかということです。
 これらの技術を使いこなせる知識があるのとないのでは、全く違う世界を生きることになってしまうでしょう。経済格差よりも激しい、技術格差の時代が来るのかもしれませんね。 Related Posts Plugin for WordPress, Blogger...

2010年9月16日木曜日

androidアプリとiphoneアプリを開発して思ったこと その4

~技術者視点で見るスマートフォンアプリ開発 ~の巻

さてさて、今回はiphoneアプリの開発とandoidアプリの開発を技術者目線から見ていきたいと思います。

いきなり結論から入りますが、開発しやすいのはiphoneアプリだと思います。
ただ、開発者・エンジニアとして魅力を感じるのはandroidです。androidはまだまだ発展途上であり、無限の可能性とパワーを感じます。

iphoneは本当にiphoneアプリためだけの技術を習得するという感じです。
マイナーなobjective-C + Cocoaという開発環境なので、余計にそういう印象を強めます。
また、一番のメジャー言語javaで開発できるandroidと違い、objective-Cは汎用性がない印象です。
javaなら他分野の開発スキルの向上にもつながりますからなおさらそういう思いが強くなりますね。

私もこれまではobjective-Cを使ったことがなく、iphone開発が初めての経験でした。
しかし、最初こそ癖があって少し戸惑いましたが、objective-Cは良い言語だと思います。
私は仕事ではjavaで開発を行っているプログラマなのですが、個人的には凄く気に入りました。
ちなみに私の好きな言語は、
Ruby > scala > objective-C => java > その他言語 >>>>>> php
といったとこでしょうか。

今後、iphoneの開発はobjective-C + Cocoa以外では不可能になるようです。
これに対し、多くの開発者がこのアップルの方針を批判しています。
しかし、私にはこのアップルの決断が間違っているとは思えません。
アップルの経営方針は、不特定多数のみんなに使ってもらう製品の開発というより、アップルを支持してくれるユーザを満足させることにあるように思えます。

となると、メーカーが想定できないミスを混入させないために、環境を限定してしまうのは、ひとつの手段として有効です。ユーザーもそんなアップルを支持しているのですから、開発者が口を出す問題ではありません。
 言語が使えないなら、覚えれば良いのです。きちんと基礎を身につけて経験を積んだプログラマーなら、すぐに使いこなせるようになる言語です。

一方のandroidはJavaで開発できるので、敷居が低く、開発しやすいです。何が疑問があっても、ググレば多くの解決手段が発見できます。今後scalaでも開発できるようになれば、工数もぐっと減るだろうし、なによりどんどん進化していくので楽しいです。
 ただ、間口は広いですが、開発の難易度は高いです。javaでありながら、メモリの使用には注意を払う必要がありますし、バックグラウンドでの処理はかなり複雑です。また、一般的に良いとされるjavaのコーディング方法が、良い方法でないのもマイナスです。javaだからこう書くのがいい。という既存の方法でコードを書くとかなりパフォーマンスの悪いアプリになります。

つまり、どちらのアプリを開発するにしろ開発者は結局勉強しなければいけないのです。
となると、やはりiphoneのxcodeを使った特殊環境での開発に問題があるとは思えません。
確かにobjective-Cには技術としての将来性や汎用性はありませんが、安定したアプリを使いたいユーザーと、提供したいappleの立場を考えると、appleのやり方は正しいです。

ジョブスは傲慢だし、腹黒だし、性格最悪だけど、この慧眼ぶりだけは本物ですね。
実際、iphoneアプリで生活費を稼ぐのは難しいですが、コーヒー代くらいなら稼いでる人は多いでしょう。
androidアプリでは明治時代で米も買えませんが・・・。どちらにしろ、生活するのは無理という点では同じですけどね。


さて、次回はスマートフォンアプリでお金をかせぐ方法を考えてみましょう。

でわ Related Posts Plugin for WordPress, Blogger...

2010年9月7日火曜日

AndroidのopenGLが理解できないので愚痴

openGLで立方体の作成ができません。
GLU.gluLookAt()を呼び出すと、画面に何も表示されない。
どうやるんだ…。わからん、わからん…。iphoneで試してみるか…。 Related Posts Plugin for WordPress, Blogger...

2010年9月4日土曜日

androidアプリとiphoneアプリを開発して思ったこと その3

~フリーのandoroidに潜む危険 タダメシには気をつけろ ~の巻

さて、今回はスマートフォンアプリというよりは、andoroidを中心とした話をしましょう。

すでにご存知の方も多いでしょうが、海外ではandroidがiphoneの市場を超えました。
2,3年後には、androidの市場はiphoneの2~3倍くらいまで膨れ上がるでしょう。
これはかなりの確率で間違いないと思います。だからこそ、色々な会社が今後はandoidに注力しようという戦略をとり始めたのだと思います。

だが、しかし!!
その考えは企業戦略として、間違ってます。
と、個人的に思います。

androidの市場がなぜここまで加速して広がっているか。
それはandroidOSが「フリー」で「google」だからに他なりません。
なかでも、iphoneのように銭ゲバ性悪王・ジョブス様が搾取していないのが最大のandroidの魅力なのです。
 アプリにもこのgoogleのスタイルは表れていて、アップルのような審査もありません。
閉鎖的なアップルと違い、androidはオープンです。
つまり企業の考えとして、

androidはフリーOSでグーグル



androidは売れる(実際広がっている)



andoirdアプリは儲かる

という風が吹けば桶屋が儲かる的な発想なのでしょう。

だが、しかし!!
この考えも企業戦略として、間違ってます。
しかも、アプリで金儲けという視点から考えているなら、とんでもない大誤りです。

androidを使うほとんどのユーザは、googleのサービスを中心に利用しているし、期待しているでしょう。
実際、私はそうです。Gmail, picasa等。androidの価値はgoogleであることです。
そしてそのサービスは基本「フリー」です。googleはそういうスタンスの会社です。今までもそうでしたし、これからもそうでしょう。ユーザにとって、googleのサービスは「フリー」であることは当たりまえになっています。ほとんどのユーザーもそういう固定概念をすでに抱いているでしょう。
 だから、androidのアプリを使うときも、「フリー」であるアプリを無意識に探します。
これは実際数値にも表れていて、「フリー」でないとアプリは使われない傾向にあります。androidアプリはiphoneアプリと比較すると、異常にフリーアプリの割合が高いのです。

androidアプリ市場は、iphoneアプリの市場とは全く違います。
Appleという会社を信用し、それに対価を払っているiphoneユーザが溢れる市場と、ソフトウェアサービスはフリーが基本と考えるgoogleユーザの市場は全然違うのです。

しかし現実には、androidはappleの3倍以上の市場が見込めから、きっとチャンスも3倍以上。
そう考えているコンサルタント、マネージャー、経営者は多いのではないでしょうか。

でも、ありえません。
有名なドラッガーのマネジメント本「基本と原則」には、
マーケティングは「何を売りたいか」ではなく、「顧客は何をかいたいか」を問う。
とあります。
これにandroidのマーケティングを当てはまると、
androidのマーケットで望まれているのは、
「フリー」で「googleのような良質サービス」
ということが当てはまります。

となると、androidでは、アプリはフリーであることが重要となります。
そうなると、どこの企業も、広告という形態でお金を稼ごうという安易な発想になるでしょう。
とすると、現在androidアプリで利用できるのは、admobという広告サービスです。
では、admobはどれくらいの利益を生みだす可能性があるのでしょうか。

実は、私が趣味で作成したandroidアプリ「ダイレコ」はadmobの広告を利用しています。
このアプリは、2010/07/05にリリースし、最近versionUpも行いました。
まだ完成度も低く(ごめんなさい。完成度あがるまで、もうちょっと待っててね。)人気がないのが現状ですが、現在2010/09/04でダウンロード数が400程になります。

では、このアプリを公開して2ヶ月。どの位の広告収入があったか、特別にここで発表しちゃいます。

驚く無かれ、その金額。なんと、

$0.19

です。
円高の現在1ドル=83円のレートで計算を行うと、

15円

の収入になります。

モニターの前で爆笑した貴方。もしくはすでに起業とか、会社の一大事業としてぶちあげて青くなった貴方。本番はこれからですよ。もっと衝撃の事実を教えましょう。
私は、redmineという管理ソフトで工数をきっちり記録しています。
なので、特別に時給換算もして差し上げましょう。
今のバージョンまでに費やした時間は総数350時間です。

つまり!

15/350 = 0.0428…。

なんと、

時給にして4銭

です。

ちなみに、明治10年の白米1kgが約5銭らしいのです…。
なんという最強最悪のブラック労働。派遣とか・アルバイトとかそういう次元じゃあありません。


缶拾いのほうが稼げる


これが現状のandroidアプリってやつなのです。
私は趣味の一環としてやってるから自虐的に笑って話せますが、これが企業として考えると全く笑えないでしょう。
 でも最近、Bi○lobeという会社がandroidアプリで100億円稼ぎたいと豪語しましたね。

投資家のみなさん。このサイトを読んでから、投資するか冷静に決めましょうね。

まだまだ書きたい事は沢山ありますが、今回はここまでです。

次回はandroidとiphoneを開発者の視点で見てみようかと思います。

でわ。 Related Posts Plugin for WordPress, Blogger...

2010年8月29日日曜日

androidアプリとiphoneアプリを開発して思ったこと その2

~スマートフォンアプリはお金にならない。とりあえず冷静になって現実を見ろ ~の巻

iphoneアプリやandroidアプリは基本儲かりません。
最近、iphoneアプリでお金を稼ぐ灘の高校生が話題になりましたね
でも、メディアが取り上げるのは極一部の人です。しかもこれは陽の部分。
実際、iphone長者とかになれるのは、プロ野球選手とか、作家とかになるくらいの確率なのが現実だと思います。

さらに、androidアプリの場合はもっとひどいです。
iphone長者になった人はいても、android長者になった人は聞いたことがありません。


最近の記事で、androidの「Advanced Task Manager」を作成したアプリの開発者は、年間10万ドル以上を稼ぐ見通しだということですが、iphoneアプリに比べるとだいぶ規模が落ちますね。
 しかも、このアプリは、androidの市場シェアがiphoneの市場を越えた海外市場での話です。
日本国内でのシンデレラストーリーはまだ存在してません。

それもそのはず、androidMarketの現状は以下のような状況なのです。

  • 50の壁。有料アプリの76%は販売本数50本未満にとどまる。
  • 99の法則。有料アプリの値付けの最頻値は0.99ドルと安価。次が1.99ドル。値付けへの下方圧力は強い。
  • 30の事実。実体験では、有料アプリのキャンセル(返品)率は34%と高い。
  • 有料アプリの比率は43%。
  • 英語圏が圧倒的に優勢。コメントの分布を見ると、英語によるコメントが81.3%、日本語によるコメントは1.1%。アクティブユーザーは英語圏に集中している。
  • ドル建てが優勢。有料アプリの値付けは、ドル建て、円建てなどを選べるが、ドル建てが70.86%、ユーロが13.89%、UKポンドが9.20%、円が6.05%.
  • 日本が強いのはコミック。コミックのカテゴリでは円建てアプリが54%と過半数を越えている

参考データ:http://hoshi.air-nifty.com/diary/2010/08/android76500992.html

とんでもなく、厳しい数値ですね。スーパーブラックマーケットです。
現状では、とてもビジネスとしてなりたっているとはいえません。
今androidアプリの開発を行うのは、未来への投資であり、ボランティアだと割り切るくらいの覚悟が必要です。

 このようなぺんぺん草も生えてないような状況にも関わらず、これからはandroidの時代だ!と言い切る識者の多いこと多いこと。根拠はなんなのでしょうか?

Googleというブランドを脊椎反射に信仰してるだけなのではないでしょうか。


私に言わせれば、androidはまだ時期尚早のプラットフォームです。
確かに、androidは一技術者・開発者として見ると、iphoneの10倍くらい魅力があります。
でも、ユーザー視点でみると、買う理由がないと思います。
androidはOSが3.x位になってようやくiphoneとまともに戦えるようになるのではないでしょうか。

ちょっと長くなってしまったのでこの続きは次回にします。
せっかくなので、次回はandroidアプリを中心にお話をしていきたいと思います。

Related Posts Plugin for WordPress, Blogger...

2010年8月24日火曜日

Scalaの勉強9

今日はclassとobjectの扱い方を学ぶ
・対応したクラスとオブジェクトを、コンパニオンクラス・コンパニオンオブジェクトと呼ぶ。
コンパニオンクラスをもたないオブジェクトは、スタンドアロンオブジェクトと呼ぶ。

スタンドアロンオブジェクトでmain関数がよべない…。
scalaプログラムを実行するには、
スタンドアロンシングルトンオブジェクトの名前を指定するとかなんとか。よくわかんね~。
だが、objectを作成して実行すると成功。
動いても概念がわからないので、なんか納得いかない。

・applicationトレイトなるものがmainの代わりになるようだ。
ただし、
コマンド引数がとれない
マルチスレッドプログラムで使えない
というデメリットがあるそうだ。

・型はjavaとほぼ一緒だが、シンボルリテラルなるものがある。よくわからんので放置。
これはある程度理解してから、本を買って理解したほうがよい。



記録
勉強時間
1:00minites
ネットのみの情報だと、これ以上の理解は厳しいかな。やっぱ本が必要だ。 Related Posts Plugin for WordPress, Blogger...

2010年8月23日月曜日

Scalaの勉強8

今日は2Dレイアウトライブラリーの勉強

・ファクトリーメソッド
インスタンスの生成をサブクラスに委ねる。
前に勉強したのに完全に忘れてます…。

・宣言だけで定義のない抽象メソッドは、abstract修飾子はつけなくてもよい。

・空括弧省略メソッドは、フィールドで定義してもよい。また、空括弧省略でフィールドや
メソッドを区別しない使えるようにすることを、「統一形式アクセスの原則」という。

違いは、
一般的に、フィールドで実装すると初回に計算結果を保持するので、値の呼び出しが早い分メモリを確保してしまう。
メソッドであれば、毎回計算するので呼び出しに若干時間がかかる分メモリを節約できる。

・クラスのメソッドの実行方法をまだ勉強してなかった・・・。今まで全部objectでやっていた。
だが、違いがわからないと厳しくなってきたので、メモ。
http://d.hatena.ne.jp/plasticscafe/20100610/1276142337

・javaと違って静的メンバー(staticな変数やメソッド)がもてない。代わりにシングルトンオブジェクトをもっている。scalaは完全なオブジェクト指向だから…らしい。



記録
勉強時間
1:00minites
学習に利用しているサイト
http://d.hatena.ne.jp/plasticscafe/20100609/1276056014
よくわからないことが多すぎる。初心者本を購入して、それで基礎を固めるべきかな。
体系立ててやらないときつい Related Posts Plugin for WordPress, Blogger...

androidアプリとiphoneアプリを開発して思ったこと その1

~スマートフォンアプリで起業を勧める愚かな評論家様達~の巻

オリジナルのandroidアプリを公開してから約一ヶ月半。最初のupdateも終了し、
次なるandroidアプリとiphoneアプリの開発にとりかかっています。

会社の仕事のほうでも半年以上androidアプリとiphone(ipad)アプリ開発には色々と関わっているので、色々なことがわかってきました。というわけで、現時点でのスマートフォンアプリの現状について何回かにわけてちょっと語ってみたいと思います。

まず思うのは、最近のiphoneの人気の凄さです。私はxperiaを利用しているのですが、周囲の人はほとんどiphoneを使っています。これから買う予定だという人も多いです。まあ、これは当然です。xperiaユーザの私が言うのもなんですが、はっきりいって現在のandroid端末とiphoneでは勝負になりません。開発していて端末を触ってると、断然iphoneのほうが完成度が高いことがわかります。私がxperiaを使ってるのは、電波の問題だけで、プラットフォームの完成度としては、現時点(2010/08/19)では、androidは話になりません。このことはまたあとで詳しく掘り下げます。

そして、最近ではipadも発売され、現在apple様は超バブリーです。猫も杓子もiphoneとipadを大絶賛。
macユーザーでありながらxperiaを使っている私は、疎外感を感じてしまいます。

そしてこのブームにのっかっているのが、偉く賢い評論家様や、企業コンサルタント様達です。アップルのビジネスモデルを大絶賛し、iphone,ipadアプリで起業をする大チャンスだと声高に叫んでいます。
そして、さらにその中にandroidアプリも加えて、
「今が起業の大チャンスだ。世界にうってでよ、若き日本人達よ!」と
煽っています。

そんな熱い状況を見て私は思うのです。
「実際に現場で物を作らない(作れない・作った事のない)人間は、言うことだけは立派だな」
と。
まあ、それが評論家やコンサルタントのお仕事なわけですけどね。

半年以上にわたるiphoneアプリやandroidアプリの開発でわかったことがあります。それは、
「現在のスマートフォンアプリ開発では、appleとgoogle以外が金を稼ぐのは難しい」
ということです。

それなのに、評論家やコンサルタント様達は、無責任に起業や金を得る千載一遇のチャンスだといい続けてます。
これは銀行預金は金利が低いから、株や投資信託で運用したほうが良いとサブプライム前に言い放っていた腐れ金融マン達と同レベルの戯言です。

というわけで、次回はなぜスマートフォンアプリの開発が金にならないかについて書こうと思います。 Related Posts Plugin for WordPress, Blogger...

2010年8月22日日曜日

androidアプリリリース

androidアプリのversion1.1.0をリリースしました。
変更点が多くて時間がかかりましたが、前より使いやすいアプリになったと思います。
今後も、もっと使いやすいように改良を重ねていくつもりです。
なんか追加機能が欲しいとか、こうして欲しいとか意見がある方は、ブログでもマーケットのコメント欄にでも書き込んでいただけるとフィードバックできてありがたいです。

でわ Related Posts Plugin for WordPress, Blogger...

2010年8月19日木曜日

iphoneアプリ開発メモ1

ブログにiphoneプログラミングに関することを書くのは今回が初めてです。

androidアプリのversion1.1.0の開発とテストが終了しました。
問題がなければ、週末にandroid marketにupdateできそうです。

androidアプリは今後もupdateしていく予定ですが、次の新作アプリの開発はandroidだけでなくiphoneにも対応したいので、はじめてのiphone3プログラミングをちょこちょこ読んでは実装しています。

しかし、objective-Cの経験がないので、あいまいな理解な箇所が多いので、詳細objective-C2.0も読み進めながら理解を深めていこうと思います。
以下は、そのメモです。
基本java使いなので、javaと比較しながらのメモ書きです。

3章 「基本的なインタラクションを処理する」のまとめ

@propertyについて
詳細objective-C2.0p286 - P296
宣言プロパティ。
@interface(インターフェース部)で使用する。
javaでいうsetter, getterである。
ただし、@propertyは宣言を行うだけなので、
プロパティがインスタンス変数で実現されているか
どうかは関係ない。
オプションの指定で挙動が変化する。
オプションがない場合は、読み書き可能

はじめてのiphoneプログラミングでは、いきなり
@property(nonatomic, retain) IBOutlet UIWindow *window
とでてきた。
本の中では、この部分が激しく無視されていたが、詳細objective-C2.0
のp293 - p296に詳しく記述されていた。

retainはオブジェクトを保持して設定するオプション。
このオプションはプロパティがオブジェクトで、カウンタ管理方式を利用している場合に指定できる。
iphoneでは、ガーベジコレクションが使えず、リファレンスカウンタ
(参照カウンタ)方式でメモリ管理を行っている(理由はここでは
説明しない)。
なので、iphoneではp295の図12-3setterとgetter構成されることになる。

又、デフォルトでは、assignオプションが指定される。なので、iphone
での実装の場合は、属性としてretainを指定してやらなければばらない
のである。

nonatomicオプションは、同時に実行されるかもしれないメソッド定義をつくるという指示である。このnonatomicオプションを指定しないと、アクセサの定義には@synchronizedというコンパイラ指示子が含まれる。

@synthesizeについて
コンパイラ指示子
インターフェース部で宣言した属性に応じてアクセサが構成される。
@implementation 〜 @endまでのどこかに記述する。
また、通常のメソッドと異なり、インターフェース部に@property
の宣言がなければ、@synthesizeを記述することができない。

実際のインスタンス変数名と異なる名前をプロパティとして外部に提供
することも可能。

メソッドについて
ざっくりとした説明ではあるが、
- (戻り値の型)メソッド名:引数の型
が基本の形。
メソッド宣言で型を指定しないと、id型であるとみなされる。

メッセージ式について
詳細objective-C2.0p18-p19
オブジェクトはどのクラスに属するものでも、idという特別な型で表現される。
id obj;
のように。
これはメッセージ式と呼ばれる。
メッセージに引数がある場合は、コロン「:」をつける。

[sender titleForState:UIContorolStateNormal];

ってな感じ。
二つ以上の引数がある場合は、コロン「:」をつけた別のキーワード
を追加する。あるいは、キーワードなしでコロン「:」だけを追加する。

インスタンス生成と初期化
詳細objective-C2.0p20-p21
[クラス名 alloc]
[NSString alloc]
のように記述する。

ただし、このように生成されたインスタンスは、メモリ上に必要な領域が
確保されただけである。なので、通常はこの直後に初期化が必要。

[[クラス名 alloc ] init ];
[NSString alloc] initWithFormat];
のように記述する。

cocoaでは、イニシャライザはinitか、initから始まるメソッド名を
もつものが多い。

デリゲートについて
委譲処理のこと。javaでもadapterパターンなどでよく利用しますね。
UIApplicationの代理として、UIApplicationDelegateを使う。
もっと進んだときに理解を進めるべきかな。


以上。
3章 「基本的なインタラクションを処理する」のまとめの終了。
良い本ですが、本当のプログラム初心者が理解できるかは結構疑問な本だと思います。 Related Posts Plugin for WordPress, Blogger...

2010年8月18日水曜日

Scalaの勉強7

・パターンガードの勉強
記述順が大事

・シールドクラスがある
パターン漏れが防げる

・Option型なるものがある
実際の値を持っているSome()

値が無いことを表すNone
がある

活用方法としては、渡される値がnullになる可能性がありそうな場合はOption型をつかうとよろしい。




記録
勉強時間
1:30minites
学習に利用しているサイト
http://d.hatena.ne.jp/plasticscafe/20100818/1282103955
タプルのところから。まだまだ文法を理解していない。
しかし、railsで自分のサイトを構築する予定だったけど、scalaとliftを使ってGEAを利用して勉強するのもいいかなと思い始めてきた。
どうしようかなあ。設計があるていど終わるまでに決めないと。 Related Posts Plugin for WordPress, Blogger...

2010年8月17日火曜日

Scalaの勉強6

・タプルという概念が存在する
複数の値をカンマ区切りで並べて括弧で囲むと、タプルになる。
_1, _2というようなフィールド名でアクセスできる。
・束縛変数?なるものがある。
つーか、詳細な資料が見つからん。



記録
勉強時間
1:30minites
学習に利用しているサイト
http://d.hatena.ne.jp/plasticscafe/20100817/1282017571
次回はパターンガードの勉強から
ネットだけの勉強では理解が浅く、物足りなくなってきた。
コップ本が欲しいけど、railsの本を買うので今はやめとこう…。もっと知識がついてからだな。 Related Posts Plugin for WordPress, Blogger...

2010年8月16日月曜日

Scalaの勉強5

Listの勉強
・変数にNilを入れてforeachで回しても、javaのようなnullpoiterにはならない。
・値の追加ができない…。is not menber of …とでる。nilを宣言してから追加ができないのか??
時間がないので次回。


記録
勉強時間
40minites
学習に利用しているサイト
http://d.hatena.ne.jp/unageanu/20080518 Related Posts Plugin for WordPress, Blogger...

Androidアプリケーション Junitテストの作り方 ~その2~

開発を行うと、かならず作ることになるのがutilクラスではないでしょうか。
機能テストのやり方は紹介しましたが、普通の単体テストの紹介はまだだったので紹介します。

1、まずは機能テストの時と同じように、テストパッケージを作成します。

2、testクラスを作成します。

テストクラス

public class SampleUitlsTest extends AndroidTestCase {

public void testGet() {
String result = SampleUtils.get();
assertEquals("aaaa", result);
}
}



テストされるクラス

public class SampleUtils {

public static String get() {
return "aaaa";
}

}


このとき注意するのは、AndroidTestCaseを継承していることです。
Utilityはstaticメソッドのテストになると思います。
なので、Activityのライフサイクルをテストする必要がないので、AndroidTestCaseを使用します。

3、あとはAndroid Unit Testを実行すればテストを行えます。 Related Posts Plugin for WordPress, Blogger...

2010年8月13日金曜日

Scalaの勉強4

今日もケースクラスの勉強
・パターンマッチは変数を使ってもできる。
・コンストラクターを使っても可能
これは素晴らしい。
・マッチするパターンがないとMatchErrorの例外をなげる。
・ワイルドカードはマッチ対象全体でなく、パターン内の要素でも使える
これも良い機能。
・Anyを使ったパターンマッチも可能。

全ての型のルートはAny



記録
勉強時間
1hour30minites
学習に利用しているサイト
http://d.hatena.ne.jp/plasticscafe/20100810/1281412749
つぎは先に進む前に、Listの勉強をしよう。
今日でscalaの勉強をはじめて4日目。時間にして計6時間です。
まだまだわからないことだらけです。
はやくフレームワークをいじりたい。playってやつがよさそうです。
まあでも、基礎は大切なので、じっくりやっていきます。 Related Posts Plugin for WordPress, Blogger...

2010年8月12日木曜日

Scalaの勉強3

・scalaは全てがオブジェクトである。

・かっこがない「引数無しメソッド」を定義することが可能

・オーバーライドはjavaと異なり、override修飾子が必須である。

・ケースクラスというものが存在する
クラスインスタンスをつくるのにnewが不要(ファクトリーメソッド)
getterが自動でさせる。オブジェクト変数で値が取得できる
パラメーターをval化(フィールド化)する
パターンマッチをサポートする
パターンマッチはセレクターをmatchキーワードの前におく。


・REPL(対話型実行環境)の実行方法
コマンドプロンプトで
scala
とコマンドを叩く




記録
勉強時間
1hour30minites
学習に利用しているサイト
http://d.hatena.ne.jp/plasticscafe/20100809/1281326371
ネット上のサンプルでは、よく理解できないサンプルが多い。
何の役に立つのかが明白でないのだ。
とりあえず、scalaを触って三日が経過して感じたことは、
rubyとjavaと比較しながら勉強したほうがよくscalaを理解できると思った。
フレームワークを使ったアプリやandroidを作成するには、まだまだかなりの勉強が必要だ。
次は変数を使ったパターンマッチから勉強。 Related Posts Plugin for WordPress, Blogger...

2010年8月11日水曜日

Scalaの勉強2

本日のまとめ

・classはデフォルトのコンストラクターをひとつもつことが推奨されている

・traitという仕組みがある。
Mix-inのための仕組みである。
Mix-inとは、メソッドが実装されたインターフェースみたいなものである。

・import文
好きな位置でスコープを限定してimportできる。

・変数
valは後で変更不可能(javaでいうfinal)
varは後で変更可能

・scalaにはREPLが提供されている。
REPLは対話型の実行環境

・引数なしのメソッドもつくれる


記録
勉強時間
1hour30minites
学習に利用しているサイト
http://codezine.jp/article/detail/5329?p=4
http://homepage.mac.com/takashi_miyamoto/scala/ScalaTutorial.pdf
はじめての概念が多く、結構手こずった。だが、面白い。
次回はtutorialのクラスから再開する Related Posts Plugin for WordPress, Blogger...

2010年8月10日火曜日

Scalaの勉強1

Scalaの勉強

ダイレコの改修が落ち着き次第、iphoneの勉強の傍らに、FaceBookでも何かアプリを作成しようと思っています。
んで、開発言語ですが、scalaを使おうと考えています。
理由は言語思想が素晴らしいのと、androidの開発にも利用でき、今後のメイン言語として活躍してくれそうだからです。
というわけで、まずは基礎から勉強していこうと思います。以下は、防備録を兼ねたメモです。

・scalaのバージョンをチェック

scala -version

・scalaのコンパイル

scalac ファイル名

・返り値

void == Unit(正確ではないが、ざっくりとした意味)

・クロージャー

関数のこと?

・callbackパラメーター

渡される関数がパラメーターを取らず (「()」で示されます)、
返すもの (「=>」で示されます) がない (関数型の値「Unit」で示されます) 場合のみ

・ラムダ式

名前を持たない関数またはサブルーチン。



記録
勉強時間
1hour20minites
学習に利用しているサイト
http://www.ibm.com/developerworks/jp/java/library/j-scala01228.html
リスト 5まで完了。 Related Posts Plugin for WordPress, Blogger...

2010年7月26日月曜日

実用androidメモ その1

androidのアプリケーションの作成を始めて半年が経ち、色々とわかってきたことがあるのでそのメモを残していこうと思います。以下は、HPに纏める前の、ブログメモです。

*バックボタンの長押しでアプリケーションを終了させる。
(If back button is long pressed, application is finised.)
AndroidOS version 1.6


// If backButton is long pushed , variable set true. otherwise false.
private boolean isBackButtonLongPressed = false;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

if (KeyEvent.KEYCODE_BACK == keyCode && 3 < event.getRepeatCount()) {
Log.d(LOG_TAG, "onKeyDown() : back button is long pressed.");
isBackButtonLongPressed = true;
}

return true;
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {

if (!isBackButtonLongPressed) {
isBackButtonLongPressed = false;
} else {
applicationFinish();
}

return true;
}

/**
* Application is finished.
* All process will be killed.
*/
private void applicationFinish() {
Log.d(LOG_TAG, "applicationFinish() : aplication is finished. All processes killed");
System.exit(RESULT_OK);
}


API:http://developer.android.com/reference/android/view/KeyEvent.html
上記(戻るボタン長押し)の他に、HomeButton押下時もプロセスを切る処理は入れるべきでしょう。 Related Posts Plugin for WordPress, Blogger...

2010年7月15日木曜日

ダイレコのバージョンアップ機能の実装中1

現在、ダイレコのバージョンアップ機能を実装しています。
更新処理の追加、tabで食事一覧・入力登録画面の切替、画像ファイルをフォルダ選択して閲覧できるようなど、結構大幅な改修作業になっています。
 今日からは、機能テストも開始しました。今月終盤、もしくは来月頭のバージョンアップを予定していますので、そのときはよろしくおねがいします。
 しかし、androidの単体テスト・機能テストは非常に便利なのですが、ネット上に全くといっていいほど情報がありません。みなさん、実施していないのでしょうか?
 まだ動作させることに手一杯で、レガシーコードのままで動作させているということでしょうか。まあ、分かる気はしますが、テストコードを書くと、androidのコーディング技術と知識も身につくのでお薦めです。 Related Posts Plugin for WordPress, Blogger...

2010年7月5日月曜日

アプリ公開

本日、android Marketでアプリケーションを公開しました。
「ダイレコ」というアプリです。
まだversion1.0.0なので、機能もHPも貧弱なのですが、良いアプリケーションに
育てていきたいと思っていますので、興味がある方は是非ダウンロードしてみてください。
説明HPは急いで作っていきたいと思っています。少々お待ちください。 Related Posts Plugin for WordPress, Blogger...

2010年7月3日土曜日

gitの基礎を勉強する

gitの使い方がよくわからないので、基礎から勉強することにしました。
使用している本は入門gitです。




勉強すると、gitの素晴らしさが良くわかります。もうsubversionには戻れないです。
最初から基礎をきちんと学ぶべきでした。やっぱり基本ってなによりも大事です。
gitを上手く使いこなして、よいアプリを育てていきたいと思います。 Related Posts Plugin for WordPress, Blogger...

2010年7月1日木曜日

Mac miniを無線LANで接続

今更ながら、mac miniを無線LANで接続しました。
あっさりと繋がりましたが、一応記録。
LANはバッファローのWHR-HP-G300を利用。
CDを入れ、appを起動し、LANのKEYを入力してWPA2であっという間に接続終了。
macすごいっす…。超簡単…。 Related Posts Plugin for WordPress, Blogger...

2010年6月30日水曜日

android marketとアプリ開発中止

現在android Marketに作成したアプリケーションを登録するには、クレジットカードによる認証が絶対に必要となります。
 しかし、私が現在もっているクレジットカードではgoogle checkoutは利用できません。さらに、今の私ではこれ以上クレジットカードは作ることができないようです。
 …というわけで、androidアプリの開発は、開発終了したアプリ、今開発しているアプリケーションでとりあえず終了しようと思っています。Macユーザーであるので、iphoneの開発に移行したいと思います。
 android Marketがもっとオープンになったら再びandroidアプリ開発者に戻りたいと思います。
ということで、さらばandroid。xperiaもiphoneアプリ開発終了後、解約したいと思います。 Related Posts Plugin for WordPress, Blogger...

2010年6月27日日曜日

Android marketに登録ができない

開発したandroid用のアプリをAndroidMarketに登録しようと思ったのですが、大きな問題が発生しました。
 なぜかわかりませんが、私のクレジットカードは、google checkoutでは認識できないことが判明(りそなカードです)。
 何度やっても全然駄目。ググッてみると、google checkout自体に色々と問題があるようです。仕方ないので、楽天カードに申し込むことにしました。楽天カードだとうまくいっている事例が多いようなので。
 そんなわけで、アプリはandroid marketに登録するまでは、他のサイトで公開することにしようかと思います。
 全く、googleの詰めの甘さにはいつも困らされます…。でも、便利だから頼らずにはいられませんし、困ったものです。 Related Posts Plugin for WordPress, Blogger...

2010年6月21日月曜日

gitの導入が全く出来ない

windowsXP上で作成したソースをgitで管理し、linuxのリモートリポジトリに保存しようと思うが全くうまくいきません。
既に作業時間は8時間を経過。未だ解決策は見えません…。
そもそもとして、sshの接続がうまくいっていないので、フォルダが見つからない。ときどき見つかるのだが、エラーをはいて終了してしまう…。
一体なにが原因なのだろうか。
どうしようもないので、今日は入門gitを購入した。
こういうときは基本に立ち返るに限る。のんびりやっていこうと思う。 Related Posts Plugin for WordPress, Blogger...

2010年6月19日土曜日

andoridアプリケーションソフトの開発終了

2月の中旬頃から作成していたandoridアプリケーションソフトの開発がほぼほぼ終了しました。あとはアイコンやら登録やらの残務を終了させ、来週、もしくは再来週までにはandroidMarketでアプリを公開できそうです。

フリーソフトなので、みなさん是非使ってみてください。

 ちなみに私はandroid端末としてXperiaを使っているのですが、突然アプリケーションが起動したり、おかしな挙動を繰り返したりと振り回されています。買ってひと月ほどですが、ちょっとむかつきはじめてます。特に独自UIの挙動がおかしすぎます。誰だ、実装したのは。

 別に独自の実装が悪いとはいいませんが、どーして日本はこうガラパゴス的な作りにするのでしょうか。おとなしくgoogleから発売されている携帯にしておくべきだったかもしれません。

 androidOS自体はすばらしい可能性を秘めたOSなのですけど、これではiphoneを超えるのは難しいでしょう。世界ではフリーのandroidが勝つでしょうが、日本ではこのままならiphoneでしょうね。

 まあ、とにかく次はiphoneのアプリ開発へと移りたいと思います。もちろん、androidの開発も続けます。最終的にどっちがシェアを取るか楽しみですね。

 個人的には現状では開発者としてならandroid, ユーザーとしてならiphoneがいいと思っています。んじゃ。 Related Posts Plugin for WordPress, Blogger...

2010年5月29日土曜日

redmineをLinux(Ubuntu)に導入する

windowsXPで数ヶ月Redmineを使ってプロジェクトを管理していましたが、
思っていた以上に使い勝手の良い素晴らしいアプリケーションだったので、Linuxに移行して本格的に使うことにしました。



以下は、忘れないための導入メモです。



導入環境

  • Ubuntu 9.10

  • Mysql 5.1.37

  • ruby 1.8.7



    参考にしたHP
  • http://redmine.jp/guide/RedmineInstall/



まずは現在のRuby on Railsを確認。



gem env

gemのバージョンは1.3.5。
Redmineの導入に必要なのは、RubyGems 1.3.1以上なのでOK。



rails -v

コマンドでrailsのバージョンを確認。しかし、コマンドが動かない…。
/var/lib/gems/1.8/bin
にrailsを発見。パスが通っていないようである。



PATH=$PATH:/var/lib/gems/1.8/bin
export PATH
rails -v
Rails2.3.5

railsのバージョンが無事確認できた。問題ないようだ。



次にMySQL


後でwindowsXPで使用しているデータを移行したいので、他のDBは選択対象外。



/etc/init.d/mysdql start
mysql -u root -p

mysqlが無事起動。versionは5.1.37


続いてRedmineのインストール



cd /var/www
mkdir rails
cd rails
wget http://rubyforge.org/frs/download.php/70486/redmine-0.9.4.tar.gz
tar zxvf redmine-0.9.4.tar.gz
mv redmine-0.9.4 redmine

これで、/var/www/rails/redmine/以下にファイルが展開されたのを確認。


再びmysqlを起動



create databse redmine character set utf8;
create user 'redmine'@'localhost' identified by 'redmine';
grant all privileges on redmin.* to 'redmine'@'localhost';

ここはwindowsと同じ。これでredmineのデータベースが完成。



さっくりと書いてあるが、ここまでで約2時間。現在夜の2:30。
明日も仕事があるので、今日はこれで終了。平日の仕事終了後に夜だけで導入するのは厳しいですね・・。



さて、再開。redmineのDBを作成する。



cd /var/www/rails/redmine/config
cp database.yml.example database.yml
vi database.yml
production:
adapter: mysql
database: redmine
host: localhost
username: root
password: rootpass

redmineのDB設定が終了。ここもwindowsと同じ。


続いて、セッションストアの作成



cd /var/www/rails/redmine
rake config/initializers/session_store.rb

成功すると、config/initializersフォルダの中に、session_store.rbが作成されている。


そして次にデータベース上にテーブルを作成する。公式HPには「$RAILS_ROOTで実行」とあるが、$RAILS_ROOTは
アプリケーションのルートディレクトリのことである。つまりここでは、/var/www/rails/redmineとなる。



rake db:migrate RAILS_ENV="production"

コマンドを叩くと、mysqlのドライバーがないと注意される。調べると、Rials2.2以降は個別にインストールする必要があるようだ。面倒だな。



sudo apt-get install libmysqlclient-dev
sudo gem install mysql

windowsXPの時のように、No Difinitionが大量に出るが無視。windowsはそれで動いたし~。



cd /var/www/rails/redmine
rake db:migrate RAILS_ENV="production"

成功。続けてデフォルトのデータのLOAD。windowsXPで使用している既存データを移行する予定だが、とりあえずは作成しておく。



rake redmine:load_default_data RAILS_ENV="production"

成功。最後にパーミッションの設定。lsで見ると755になっているので華麗にスルー。


mysqlとWEBrickを起動



/etc/init.d/mysql start
ruby script/server webrick -e production

起動。http://localhost:3000にアクセス。すると、

Mysql::Error: #42S02Table ‘bitnami_redmine.settings’ doesn’t exist: SHOW FIELDS FROM `settings`

なるエラーが発生。なんじゃこら、windowsXPじゃこんなことなかったのになあ。で、調査。どうやらMysqlにRedmineの
スキーマがないのが原因のようである。miggrateの処理に失敗していたみたい。



cd /var/www/rails/redmine
rake db:migrate RAILS_ENV="production"

色々とメッセージが流れる。今度は間違いなく成功だろう。再びhttp://localhost:3000にアクセス。成功!!
あー長かった。全部で作業終了までにだいたい3時間くらいはかかったかな。もっとLinuxに慣れないといけませんなあ。


これでひとまずはOKだが、まだデータ移行が残っている。その作業内容の公開はまた今度で。


では。 Related Posts Plugin for WordPress, Blogger...

日本人総経済評論時代がきていることについて その4

今回は、今後の日本が進むべき道を考察してみたいと思います。
今、日本で一般的に語られている日本の将来像は、イノベーション、もしくは公共事業の増加で財政を立て直し、国力をあげていこうという考えが一般的なようです。そしてきたるべき高齢者社会に備え、介護や福祉分野に移民を受け入れ、さらには消費税をあげていくべきだという考えがあるようです。

しかし、上記のような考えは、私は全く賛同できませんし、理解できません。
まず、高齢者社会についてですが、これはそもそも60歳以降は働かないで年金生活を送るという考え方そのものがおかしいと思います。
 体を使った肉体労働から、頭を使った知的社会に移り変わっているのに、この考えは完全に時代錯誤です。
 頭を使った労働なら、普通に70歳までは働けます。体のケアと頭のケアを怠らなければ75歳まで現役で働くことができるでしょう。もちろん女性・男性の区別も不要です。
 ただし、知的社会では、経験で劣る若者が高齢者より不利になるという問題点があります。
なので、今与えている高年齢者の数々のインセンティブを、若者に移すべきです。今は、若者が高齢者を支えるという考えが一般的でしたが、これからの時代は力を蓄えた高齢者が若者を支える社会に移行すべきです。
 知的労働がメインの社会に完全に移行すると、経験の浅い若者は、豊富な知識と経験を蓄えた高齢者より不利になります。(現在日本にあふれている老害は別)
 なので、社会に投げ出されても自立できるような力を得られるまでは、基本的に会社と社会が両輪となって若者を育てていくべきです。学校を卒業したばかりの18歳や22歳で一人前という考えは、20世紀の古い考えで、これからの高度知識社会では、社会に適応するために3年間ほどの期間を若者に与えて保護するべきでしょう。それほどに、現在の仕事・世の中は複雑化・多様化しています。

 また、介護分野へ若者の就職を促すのも賛成できません。高齢者が増えてきたから、若者は高齢者を支えるべきだという考えは間違っています。若者は若者の生きたいように生きるべきで、社会が若者にが高齢者を支えるように強制するのは愚の骨頂です。規制は国力を落とします。
 若さは武器です。新しい文化を生み出し、社会に根付かせるのは若者です。高齢者が足手まといとなり、若者の芽を摘むべきではありません。基本、高齢者は高齢者同士で支えあうべきです。それが無理なら、イノベーションを起こし、高齢化社会を支えられるような社会の仕組みを作り出すべきです。
 情報化社会がさらに発達すれば、個人の行動情報をリアルタイムで収集・分析し、常時健康を監視することも可能になるはずです。医療と情報技術をさらに高度に発達させて新・高齢化社会を成り立たせる社会を目指すべきであり、若者に依存するのは大反対です。
 そして、公共事業の増加です。これは介護分野の充実以上に反対です。
競争の働かない分野はなるべく排除すべきです。人権の保障・最低限の生活を支えるセーフティネット以外に官が介入してはいけません。貧困や社会不安を軽減するのが政府や官の役目で、市場の競争を阻害すべきではありません。

 つまり、今後の日本が進むべき道は、より強いイノベーションを起こすため、さらに市場の自由化を強め、競争を促すことです。
 福祉を充実させるために税金を高額にし、国民に配分しても、全員が今よりさらに不幸になるだけです。それよりは、能力の高い人間・企業に富と力を集中させ、高齢化社会に対応できる技術を生み出だしてもらったほうが、結果として全員が幸せになれるはずです。

次回はこれまでの総集として、10年後の日本を予想してみようと思います。 Related Posts Plugin for WordPress, Blogger...

2010年5月23日日曜日

日本人総経済評論時代がきていることについて その3

今回は、今後の世界で経済が発展して景気が回復しても、庶民は景気回復の実感を得られない世界がきているということについての考えを述べたいと思います。

なぜ、今後の世界では、ほとんどの庶民は景気回復の実感を得られないか。
それは、人材の二極化、つまり個の時代が本格的に到来するからです。

個の時代では、これまでの常識が通用しなくなると思います。
もうすでにその兆候は表れています。
これまでは、企業が消費者に向けて製品を作成し、一方的にメッセージを発して消費者が利用するという形態が成り立っていました。
しかし、これからは企業と消費者が直で話し合い、製品を作りあげていくことになるでしょう。そして、そのツールとして、今はソーシャルメディアが使用されています。
今後、個の時代を迎える有効なツールとしては、

Blog
Twitter
UStream
Skype
Youtube
FaceBook
クラウドサーバー

等が現在ではあげられると思います。
他にも様々なコミュニケーションツールが作成されていき、
今後はより個の力が強まっていくはずです。
そして、多くのスモールビジネスがたちあがり、一部の個人・少数グループが一企業に匹敵する富を得ることが可能になります。
 逆に、これまでに企業が独占していた仕事は個人に奪われます。
当然、個の時代に参加できない人達は、仕事の減った企業の中でさらに仕事を奪い合うことになります。収入などあがるはずがありません。むしろ大多数の人の給料は下がり続けます。

そして、たちが悪いことに、景気の指標を示すGDPはあがるでしょう。
世界に影響を与えるような個人・少数グループが数多く現れ、GDPを押し上げることが想像できるからです。なので、政府は景気は着実に良くなっていると発表します。
しかし、大多数の人は実感することができません。むしろ、下がっていると感じることになるでしょう。「実感なき景気回復」というやつです。
そして、今より多くの人が複雑な経済論を語り、政策を提言していくことになるでしょう。
これは、世界がある程度フラット化するまで繰り返される可能性が高いです。
私の予想ではあと20年後、つまり2030年くらいになって、ようやく現実を認識しはじめるようになると思います。

上記が、私が庶民が景気回復の実感を得られない世界がきていると思う理由です。
次回は、今後の日本が進むべき道を考察してみたいと思います。 Related Posts Plugin for WordPress, Blogger...

2010年5月16日日曜日

日本人総経済評論時代がきていることについて その2

前回の日本人総経済評論時代がきていることについてその1では、現在の不況対策として、国債を刷って公共事業を行うべきという意見と、法人税を下げて国際競争力をつけて企業の儲けをあげ、税収を増やすべきだという意見には賛同できないと記述しました。

なので、今回は賛同できる意見について述べたいと思います。

まず、一番合理的だと思ったのは、ベーシックインカムの導入です。
べーシックインカムとは、簡単にいうと総国民基礎年金制度です。
一定の金額(7~8万程度)を全ての国民に支給し、最低限の生活を保障するのが目的です。
たとえば、ベーシックインカムが月7万円で、子一人の3人家族なら21万円が月の最低世帯収入になります。さらに父親・母親が月10万ずつ稼げば、41万円になります。
当然インフレも発生するでしょうが、最低限の生活を維持するのは問題ないでしょう。

なにより、ベーシックインカムの導入に賛成する一番の理由は、現代に労働の必要性を感じないからです。「働かざるもの食うべからず」というのは旧時代の発想だと思います。現代はテクノロジーの発展で食料を大量生産できるようになり、各国で農業の量を規制している状態です。農業人口は飽和なのです。今後は、さらに少ない人手で、大量の食料が生産できるようになるでしょう。他の国では水が問題となりますが、日本では問題ありません。そのうち、他の国でも改善されるでしょう。

近い未来、人間が生きていく上で必要な食料の維持に、これまでのような労働は不必要となります。つまり、生きていきためには働かないといけないという既存の概念が崩れて、なんのために生きて、何をして働いていくのかという新しい概念に変わっていくのです。

これは幸福であるともいえますが、不幸であるともいえます。とはいえ、ここで幸福論について語っても仕方ありません。ただ、ベーシックインカムというのは、これからの時代に適した考えだということが言いたかっただけです。

長くなったので、これでベーシックインカム導入賛成論はこれで終了したいと思います。
次回は、今後の世界では経済が発展して景気が回復しても、庶民は景気回復の実感を得られない世界に移行しているという考えを述べたいと思います。

でわ、また次回。 Related Posts Plugin for WordPress, Blogger...

2010年5月12日水曜日

日本人総経済評論時代がきていることについて その1

最近、様々なお気に入りのブログを回っていて少し気になっていることがあります。
それは、やたらと経済について語る人の数が増えてきているということです。
これは長く続いている不況が原因でしょう。マルクスやハイエク等の経済学が取り上げられ、様々な政策提言が素人によってされています。
しかし、個人的には、経済や政策の視点から世の中を見るのは間違っていると思います。
でも、ネタとしては面白いので、この流れに私ものっかってみようと思います。
人気ブログのコメント欄を読むと、色々な意見や策が提示されていますが、自分が読んだところ、おおまかな意見は大きく二つに分類されています。

ひとつは、「今の不況は供給が需要を上回っているのが原因なので、国債を刷って政府が仕事を作るべきだ。借金は問題ない。」
という意見です。

もう一つは、「足りない税収をあげるために、企業がもっと金を稼げるようにするべきだ。法人税を下げろ、消費税をあげろ。」
という意見です。

イメージとしては、前者は今の民主党政権、後者は過去に行われた小泉政権での政策のことでしょう。
正直、自分はどちらの意見もピンときません。特に前者の意見は問題外であるとしか思えません。
この意見を主張する人達は、BS(バランスシート)不況だとか、日本国債は海外の債権保有率が低いから国債をいくら刷っても大丈夫と言っています。
はっきりいって、「何をいってるんだお前は」と言いたいです。
供給が需要を上回っているのなら、需要に供給を合わせればいいでしょう。そして、需要が増えたら、供給も増やせばいい。(BS)バランスシートとか、経済学なんて視点から物事を判断するから正常な判断が下せなくなるのです。供給=需要が一番分かりやすい。
単純に考えれば、「お金がないなら刷ればいいじゃない」なんて、幼稚園児のままごとでも発言しないと思います。
需要がないから失業者が増えるという意見が多いのですが、そもそもこれからの時代、勤労する必要がある人は限られてくる時代に移行するはずです。その意見はまた後で述べます。

後者の意見は、金が足りないから稼ごうという発想です。これは前者よりは良いです。個人的な嗜好として、前向きな意見は嫌いではありません。
しかし、日本が法人税を下げて不況からの脱出に成功したとしても、他の国も同様にまねするだけでしょう。そして、最終的にはどの国も同じような税率になります。結局は人材の勝負となり、今の日本では勝てないでしょう。

こう発言すると、ではお前はどんな意見なら納得できるのかと思う方もいるでしょう。
長くなったので、その意見は次の更新でお話します。 Related Posts Plugin for WordPress, Blogger...

2010年5月10日月曜日

Androidアプリケーションのユーザーインターフェース(UI)の整え方~その1~

ユーザーインターフェース(UI)の作成で色々と苦労したので、作成方法のメモを残します。



例えば、以下のようなTextViewオブジェクトをxmlに記述したとします。




<TextView android:id="@+id/page_title_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
android:layout_marginBottom="10px"
android:text="@string/page_title_top" />

上記は、指定した位置にTextViewオブジェクトを配置するxmlです。

表示される文字は、valuesフォルダ配下のstring.xmlのpage_title_topタグ内に記述された文字になります。

さらに、textSizeやtextColorなどを指定していくことになります。

しかし、textSizeやtextColorなどは配置位置とは異なり、共通で使いまわすことが多いと思います。

しかも、変更が起きることもあるでしょう。そのたびに、全てのtextSizeやtextColorを変更していたのでは面倒です。


こういった場合に対応するには、style.xmlを使うと便利です。


style.xmlには、以下のように記述します。



<style name="page_title">
<item name="android:textSize">12sp</item>
<item name="android:textColor">#000000</item>
<item name="android:background">#FFFFFF</item>
<item name="android:typeface">monospace</item>
<item name="android:textStyle">normal</item>
</style>

上記で指定しているname属性は、あらゆるViewのオブジェクトで指定するべきです。


属性typefaceとtextStyleの指定はしない人が多いと思いますが、指定するべきです。


typefaceはテキストの書体を指定します。

日本語の場合はmonospaceを指定しましょう。日本語は等間隔のmonospaceが読みやすいとされているからです。

英語の場合はsansもしくは、serifにしましょう。英語は等間隔のmonospaceは読みにくいとされています。


textStyleは、テキストのスタイル(通常、太字、斜体)を指定します。
デフォルトはnormalです。他にbold(太字)、italic(斜体)も使用できるので、見やすい
ユーザーインターフェースをつくるためにも利用したほうが良いでしょう。


上記のstyle.xmlはTextViewの記述されたxmlに追加することで、適用できます。



<TextView android:id="@+id/page_title_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
android:layout_marginBottom="10px"
android:text="@string/page_title_top"
style="@style/page_title" />

上記のように指定することで、style.xmlに指定した属性が反映されます。
他のオブジェクトで流用も可能な上、変更しても一発ですべて直せます。


というわけで、とりあえず基本的なxmlの使い方の説明でした。
他にも色々と公開していきたいと思います。でわ。

Related Posts Plugin for WordPress, Blogger...

2010年5月8日土曜日

Androidアプリケーション Junitテストの作り方 ~その1~ 

オリジナルのAndroidアプリケーションの作成がほぼ終了し、テストの段階に入りました。
せっかくなので、Junitを使ってテストを書こうと思ったのですが、全然情報がありません。
他のみんなはJunitを使ったテストを作成しないで、リリースしているのでしょうか???
ちなみに、私が仕事で携わった(っている)Androidアプリケーションプロジェクトでは、Junitテストは通していませんw
まあ、そんなわけで、ブログ上に情報を逐次UPしていきたいと思います。
こういった知識はみなさんで共有しましょう。
iPhoneに勝つために!W
では、まず第一回目です。

    手順
  1. Eclipseを使ってTest用のアプリケーションを作成します


  2. ファイル → 新規 → Android Test Projectを選択します


  3. Test Project Name欄に作成したいテストアプリケーション名を入力します。アプリケーション名+Testが良いと思います

  4. (例)アプリケーション名 : Sample

    テストアプリケーション名 : SampaleTest



  5. Test Target項目のラジオボタンで
    An exsiting Android projectを選択します

  6. 参照ボタンを押下して、アプリケーションを選択します

  7. 自動認識されて、ビルド・ターゲット欄とプロパティ欄が埋まります。



  8. 完了ボタンを押下します

  9. テストアプリケーションプロジェクトが作成されます。



  10. プロジェクトを開くと、パッケージフォルダが作成されています


  11. まずはここに、全てのテストクラスを実行するAllTests.javaクラスを作成します



  12. import android.test.suitebuilder.TestSuiteBuilder;
    import junit.framework.Test;
    import junit.framework.TestSuite;

    public class AllTests extends TestSuite {

    public static Test suite() {
    return new TestSuiteBuilder(AllTests.class)
    .includeAllPackagesUnderHere()
    .build();
    }
    }



  13. 次に作成したいクラスのテストクラスを作成します

  14. 以下のサンプルでは、アプリケーションのTopページActivityのTop.javaの
    テストクラスを作成しています




    import java.text.SimpleDateFormat;
    import java.util.Calendar;

    import jp.co.dietrecorder.R;
    import jp.co.dietrecorder.Top;
    import android.content.Context;
    import android.test.ActivityInstrumentationTestCase2;
    import android.test.suitebuilder.annotation.MediumTest;
    import android.widget.TextView;


    public class TopTest extends ActivityInstrumentationTestCase2 {

    public TopTest() {
    super("jp.co.Sample", Top.class);
    }

    @Override
    protected void setUp() throws Exception {
    super.setUp();
    }

    /**
    * アプリケーション初期立ち上げの時のデータ確認
    */
    @MediumTest
    public void testAppicationInit() {
    assertTrue(true);
    }

    }




      この時、上記で注意しないとならないのは以下の通りです。
    • コンストラクタの引数は第一引数が「アプリケーションのフォルダ名」

      第二引数が「テスト対象クラス名」

      であること

    • テストメソッドはtest~で開始すること(アノテーションはなくても動きます)

    • publicメソッドであること

    • assertのメソッドを利用していること

    • になります。


  15. 以上がきちんと設定されていると、JUnitの緑色のバーが現れるはずです。




追記

テストクラスで継承しているActivityInstrumentationTestCase2クラスは
機能テストを行うクラスです。
単体テストはAndroidTestCaseで行えるようです。
ActivityInstrumentationTestCase2を継承すると、Activityをlaunchしてテストを
行いますが、AndroidTestCaseだとlaunchせずにテストが行えます。



私は、今回のアプリケーションではActivityInstrumentationTestCase2を利用してJunitテストを行う予定なので、
AndroidTestCaseを使ってテストをすることを考えている人は申し訳ありません。



では、次からは本格的なテストクラスを作成していきましょう



追記2
そのうちレンタルサーバーを借りてきれいにまとめます。自分でも確認したいのでw Related Posts Plugin for WordPress, Blogger...

2010年2月21日日曜日

LPIC 102受験

今日はLPIC 102の試験を受けてきました。
800満点中620点で合格でした。
目標の700点には到達しませんでしたが、まあこんなもんでしょう。
今回はAndroidやSpringAOPの勉強をしながらだったので、時間配分を考えると上出来だったと思います。
今後はLPICレベル2も受験予定ですが、プロジェクトマネージャーの試験終了後に勉強を開始しようと思っています。とりあえず仕事上、今はどうしてもAndroidの勉強が中心にならざるを得ないのです。
プロマネはこれから勉強を開始しますが、記念受験になってしまいそうな気もします。
 しかし、疲れました。今日はゆっくりと休みます。
 でわ。 Related Posts Plugin for WordPress, Blogger...

2010年2月19日金曜日

Redmineを導入

RedmineをwindowsXPに導入する

プロジェクト管理ソフトのRedmineの導入メモ(windowsXP)

導入理由
・仕事でAndroidやSpring等を使うことになり、技術の習得が必要になった。そのため、自宅で作成したソースや知識を管理する必要が出てきた。どうせなら、設計・開発・バグ・情報も管理したい(残したい)
・tacというソフトも良いみたいだが、rubyは昔からちょこちょこと使っていて、エラーの発見・修復がやりやすいだろうと思ったから。でも、railsは知らんW

導入するマシン情報
・windowsXP
・ruby1.8.6
・gem0.92
・mysql5.0.18-nt(ずっと使ってないのでrootのパスワード忘れたW)


ということで、Redmineで使うmysqlはすでにインストール済みだが、rootのパスワードを完全に忘れているので、再設定をする

MySqlのrootパスワードを忘れた場合の対応~windowsXP編~


コマンドラインを開く

mysql\binのフォルダに移動

mysqld-nt --skip-grant-tablesと入力する

エラーもなく何も入力できなくなると、成功。この状態でサーバーが動作している

上記を閉じないままで、MySQL Command Line Clientを開く

パスワード無し、つまりエンターキーのみでログインする

rootユーザーにパスワードの設定を行う。update文でuserテーブルを直接編集する

update mysql.user SET password=password('root') WHERE user='root';
('root')には新たなパスワードを入力して設定する

無事に終了。念の為に変更を確認しておく

select * from mysql.user;

変更が確認できたら、MySQL Command Line Clientを終了する

最初に動かしたフォアグランドで実行中のサービスを閉じる
新たにコマンドプロンプトを開き、shutodownします

コマンドラインを開く

mysql\binのフォルダに移動

mysqladmin shutdownと入力する

最初のコマンドプロンプトをフォーカスすると、mysqlサーバーが終了してコマンド入力が可能な状態に戻っている

サービスからmysqlサーバーを立ち上げる

MySQL Command Line Clientを立ち上げて、設定しなおしたパスワードでログインできることを確認する

以上でMYSQLのrootの再設定が終了です。



MySqlにRedmineのデータベースを設定する

redmineデータベースを作成する。

create database redmine character set utf8

新しいMysqlアカウントを作成する

create user 'redmine'@'localhost' identified by 'redmine'

管理者権限をもつユーザを登録する

grant all privileges on redmine.* to 'redmine'@'localhost';


Redmineのダウンロードと環境の設定

http://rubyforge.org/frs/?group_id=1850に遷移

redmine-0.9.2.zipをダウンロードする。

rubyのバーションを確認する。ruby -v

1.8.6

railsのバーションを確認する。gem -v

0.92

redmineのrubyのversionは1.8.6, 1.8.7なのでOK
Railsのversionは2.2.2なのでNG

まずはgemをバージョンアップする。
gem update --system

rubygems-update requires builder >=0のエラー発生
gem install builder
を実行するも失敗。Could not find builder (>0)…
しばらくはまる。原因不明状態。why?????
gem envでpathを確認
redmineの公式ページで、
注意:

* RubyGems 1.3.1が必要です。

の記述を発見。
なるほど。
gemが古いのが原因みたいだ。
ということで、コマンドでの取得は無理と判断し
http://rubyforge.org/frs/?group_id=126からrubygems-update-1.3.5.gemをダウンロード
rubygems-update-1.3.5.gemをCドライブ直下に移動し、コマンドプロンプトを呼び出してCドライブ直下に移動

gem install rubygems-update-1.3.5.gemを実行

これも失敗。調べるが情報が見つからない。あかん、心が折れそうだ
調査後、ちょっと良い情報を入手
C:\ruby\lib\ruby\gems\1.8source_cacheを削除してみる。

再びgem install rubygems-update-1.3.5.gemを実行。しかし、うまくいかない
ならば、ソースを使ったほうが良いのかもしれない
http://rubyforge.org/frs/?group_id=126からrubygems-1.3.5.zipをダウンロード
解凍して、setup.rbをダブルクリック。

見事に成功。gem -v 1.3.5

ここまででだいたい3時間くらい。今日はここまで。続きは明日

gem update rails

成功

C直下にredmineフォルダを作成。

ダウンロードしたredmine-0.9.2.zipを解凍し、フォルダ名をredmineに変更して配置

redmine\conf\database.yml.exampleをコピーし、database.ymlとする

セッション暗号化用鍵を生成する

コマンドプロンプトでC:\redmineに移動し
rake config/initializers/session_store.rb
を実行する。
成功すると、C:\redmine\config\initializersフォルダにsession_store.rbが作成されている

データベースを初期化する。
rake db:migrate RAILS_ENV=production

失敗。try again:gem install mysqlと指示されたので、gem install mysqlを実行
なんかNo difinitionが多いが、エラーは吐いてないようなので、無視することにする

コマンドプロンプトからredmine直下に移動し、rake db:migrate RAILS_ENV=productionを実行

成功。続けて、rake redmine:load_default_data RAILS_ENV=productionを実行

jaを指定して終了。これも上手くいったようだ
メールの設定はしないのでこれでRedmineのインストールと設定は終了。まじで疲れた


Redmineの起動

ruby script/server -e productionを実行

なつかしのWEBrickの起動を確認

ブラウザを起動し、http://localhost:3000/を入力。無事成功!!

画面 Redmine


これでとりあえずはredmineが使えるようになったはず。結構時間かかったので、使いやすいといいなあと思っています。
subversionも連携させたいが、それは余裕のある時にやります。
また何かあったときは、メモしてUPします。でわ。

by エディ(2010/02/18 - 2010/02/19 作業時間約5時間) Related Posts Plugin for WordPress, Blogger...

2010年2月15日月曜日

Andoridの勉強 LinearLayoutタグとRelativeLayoutタグの違いを理解する

「コードからわかるAndroidプログラミングのしくみ 開発で困ったときの解決アプローチ」



の3章では、RestaurantFinderというサンプルアプリケーションを作成しながら、ユーザーインタフェースを理解していく内容になってします。
しかし、多くの人がここで挫折してしまうのではないでしょうか。
なぜなら、2章までの知識では理解できないことが多過ぎるからです。
この業界で仕事をしてから、ひたすらJavaを使って開発をしている私でも悩むことが多かったので、はじめてAndroidの開発をする人は相当悩むのではないでしょうか(私がアホなだけかもしれませんが…)。

ここでは、素直にテキストを読み進めていった人がはまりそうな現象について説明していきます。

1章からテキストの内容を理解していき、サンプルのReviewCriteriaクラスを実装すると、以下の画面(以下UI)が表示されると思います。

画面 1



上で示した画面のjavaソースとmain.xmlファイルの内容を以下に示します。

ReviewCriteriaクラス

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;

public class ReviewCriteria extends Activity {

private static final String CLASSTAG = ReviewCriteria.class.getSimpleName();
private static final int MENU_GET_REVIEWS = Menu.FIRST;
private Spinner cuisine;
private Button grabReviews;
private EditText location;

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

this.location = (EditText) findViewById(R.id.location);
this.cuisine = (Spinner) findViewById(R.id.cuisine);
this.grabReviews = (Button) findViewById(R.id.get_reviews_button);

ArrayAdapter cuisines = new ArrayAdapter(this, R.layout.spinner_view,
getResources().getStringArray(R.array.cuisines));

cuisines.setDropDownViewResource(R.layout.spinner_view);
this.cuisine.setAdapter(cuisines);


}

@Override
/**
* 下部に表示されるメニューを呼び出す
*/
public boolean onCreateOptionsMenu(Menu menu) {

Log.v(Constants.LOGTAG, " " + ReviewCriteria.CLASSTAG + " onCreateOptionsMenu");

super.onCreateOptionsMenu(menu);

// メニューアイテムを追加
menu.add(0, ReviewCriteria.MENU_GET_REVIEWS, 0, "test").setIcon(
android.R.drawable.ic_menu_edit);

return true;
}

@Override
/**
* メニューが選択された際の処理
*/
public boolean onMenuItemSelected(int featureId, MenuItem item) {

switch (item.getItemId()) {
case MENU_GET_REVIEWS:
handleGetRevuews();
return true;
}
return super.onMenuItemSelected(featureId, item);
}

private void handleGetRevuews() {
System.out.println("called!!");
}
}


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="@string/hello"
/>
<EditText
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Spinner
android:id="@+id/cuisine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/get_reviews_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Get Reviews"
/>
</LinearLayout>

上記で示したmain.xmlの内容を見て下さい。
<LinearLayout>タグが使用されています。
つまり、上の画面 1は、LinearLayoutクラスを利用して作成されているということです。

LinearLayoutクラスはViewGroupクラスのサブクラスで、子要素を、水平、あるいは垂直に一直線に並べます。
画面 1のmain.xmlではandroid:orientation="vertical"が指定されています。
android:orientationは、配置する向きを指定する属性です。
ここでは、verticalが設定されています。
verticalは垂直方向に並べます。
画面 1を見ると、EditText、Spinner、Buttonオブジェクト(全てViewのサブクラス)が垂直方向に並べられているのが確認できると思います。
horizontalを設定すると、各オブジェクトが水平方向に並ぶようになります。

しかし、今回のUIの作成では、LinearLayoutクラスでなく、

RelativeLayoutクラス

を使ってUIを作成します。
(もちろん、LinearLayoutクラスでも同じUIを作成できますが、ここではRelativeLayoutクラスを使ったUIの作成方法を理解することが重要です)

RelativeLayoutクラスを使用すると、子要素の位置を、上部、下部、左側といった相対的な位置で指定します。

では、main.xmlをRelativeLayoutに変更してみます。
変更後のmain.xmlファイルは以下のようになります。
main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"←属性の追加
android:padding="10px"←属性の追加
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<EditText
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Spinner
android:id="@+id/cuisine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/get_reviews_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Get Reviews"
/>
</RelativeLayout>

上記のmain.xmlでは、

android:layout_width="fill_parent"
android:layout_height="fill_parent"

は変更しないでそのまま利用しています。

android:orientation="vertical"

は削除しました。

android:gravity="center_horizontal"
android:padding="10px"

は新規に追加した属性です。

それでは、RelativeLayoutタグ内で指定したこれらの属性はどういう意味をもつのでしょうか。
以下に説明を示します。

XML属性
属性 属性の意味 属性変数 属性変数の意味
android:layout_width レイアウトの横幅の長さを指定する属性 fill_parent 縦、又は横に画面いっぱいまでの大きさで描きます
android:layout_height レイアウトの横幅の高さを指定する属性 fill_parent 縦、又は横に画面いっぱいまでの大きさで描きます
android:gravity オブジェクトの配置方法を指定する属性 center_horizontal 左右中央に配置し、サイズ変更を行わないようにしています
android:padding 上下左右のパディングをピクセル単位で設定する属性 10px 10pxに設定しています


では、main.xml変更後のUIを確認してみましょう。

画面 2



「なんじゃこりゃ~~~???????!!!!!!!」
と思わず私は叫びましたね。

正直に言いましょう。最初は原因がわからず、はまりました(アホですな…)。

そこで、グーグル先生に頼って、色々と調べた結果、これは、main.xmlのLinearLayoutタグをRelativeLayoutタグに変更したのが原因です。
って当たり前のことですね。

RelativeLayoutタグを使用する場合は、子要素の位置を、上部、下部、左側といった相対的な位置をきっちりと指定しなければいけません。
変更前は、LinearLayoutタグでandroid:orientation="vertical"属性を指定していたので、位置を指定しなくても、
EditText、Spinner、Buttonオブジェクトが自動的に上から順に並べられていました。
しかし、今回の変更でLinearLayoutタグをRelativeLayoutタグに変更したことで、全てのオブジェクトが同じ位置に配置されてしまったわけです。
つまりは、画面 2で表示されているButtonオブジェクトの下にSpinnerとEditTextが設定されてしまっているのです。
逆にいうと、EditTextオブジェクトの上にSpinnerオブジェクトが配置され、Spinnerオブジェクトの上にButtonオブジェクトが配置されて表示されている状態なのです。

各オブジェクトは、位置をしっかりと指定しないといけません。
まずは、EditTextを表示できるように変更してみましょう。
main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:padding="10px"
>

<TextView android:id="@+id/location_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:layout_marginBottom="15px"
style="@style/label" android:text="@string/location_entry_label" />
←新規でテキストを追加

<EditText
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/location_label"属性の追加
android:layout_marginLeft="10px"
android:layout_marginBottom="5px"
style="@style/edit_text"
/>
</RelativeLayout>


上記のmain.xmlでは、EditTextの上に、TextViewを配置しました。
追加したTextViewは、文字列などの表示を行う為のコンポーネントタイプのビューです。
ここでは、EditTextの入力内容を説明する文字列「Location(City, ST):」を記述しています。

では、新たに追加・修正したこれらの属性はどういう意味をもつのでしょうか。
今回新たに登場した属性の説明を以下に示します。

XML属性
属性 属性の意味 属性変数 属性変数の意味
android:layout_height レイアウトの横幅の高さを指定する属性 wrap_content 内容に応じて可変の長さになります
android:layout_marginLeft 左方向の余白を指定する属性 10px 10pxに設定しています
android:layout_marginBottom 下方向の余白を指定する属性 15px 15pxに設定しています
android:layout_below 対象のウィジェットを指定したウィジェットの下に配置する属性 @id/location_label TextView@id/location_labelの下に配置しています


では、今回のmain.xml変更後のUIを確認してみましょう。

画面 3



oh!yaeh!いい感じですね。

TextView「Location(City, ST):」の下に、EditTextが表示されていますね。
このように、RelativeLayoutクラスでは、他のViewオブジェクトの位置を規準として画面を組み立てていきます。
規準位置を変更すれば、それに伴って他のViewオブジェクトも自動的に位置が変更できるのが利点です。

では、上記のようにSpinnerオブジェクトとButtonオブジェクトも配置していきましょう。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"
android:padding="10px"
>

<TextView android:id="@+id/location_label"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:layout_marginBottom="15px"
style="@style/label" android:text="@string/location_entry_label" />

<EditText
android:id="@+id/location"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/location_label"
android:layout_marginLeft="10px"
android:layout_marginBottom="5px"
style="@style/edit_text"
/>

<TextView android:id="@+id/cuisine_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/location"
android:layout_marginLeft="10px"
android:layout_marginBottom="5px"
style="@style/label" android:text="@string/cuisine_label" />

<Spinner android:id="@+id/cuisine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/cuisine_label"
android:layout_marginLeft="10px"
android:layout_marginBottom="20px" />

<Button android:id="@+id/get_reviews_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10px"
android:layout_marginBottom="5px"
android:layout_below="@id/cuisine"
android:text="@string/get_reviews_button_label" />

</RelativeLayout>

main.xmlは上記のように変更しました。今回の変更では、新しい属性は使用してません。
わからない箇所がある場合は、ここまでの内容が理解できていない可能性が高いで、もう一度最初から読みなおしましょう。

では、今回のmain.xml変更後のUIを確認してみましょう。

画面 4



Excellent!完璧ですね。
これで、意図した通りのUIが作成できました。

LinearLayoutタグとRelativeLayoutタグの違いは理解できたでしょうか。
理解できたなら、また新しいことを勉強していきましょう。私も勉強を続けたいと思います。
でわ。 Related Posts Plugin for WordPress, Blogger...