いや~
何だかんだ言って、まだまだレガシーな人間だったんだと思い知らされた。
知らないうちに、
英会話レッスンをWEB上で受けられる環境がかなり充実してたんだね。
最近、仕事上で外人さんと接する機会や、
英語の書籍を読みたい事が多くなって来たので、
英会話の勉強を始めようと思っていたんだけど、
仕事が忙しいし、週末は家族に使わないと行けないので、
中々、スクールに定期的に通うのは難しいな~と思っていました。
そこで、何の気なしに英会話でググッて見たら、
WEB英会話ってのがごろごろ出てきてびっくり。
ECCやイーオンもやってるみたいだけど、
WEB専業もたくさんあって、みんな安い!
そんな中でクリフがとりあえず試してみたのは、
某口コミサイトで1位評価だった、「Englishtown」。
14日間無料体験てのがあったからとりあえず試してみたんだけど、
メチャクチャ面白かった!
正直、顔が見えない(VoiceChatだけなんです。)ので、
聞き取り難易度は高いんだけど、
安さと、24時間受講可能って言う柔軟さがGOODです。
色々他の所もあるけど、
とりあえず、しばらくここで頑張って見ようと思います。
興味ある人はココへどうぞ^^
http://www.englishtown.com/online/home.aspx
CliphWeatherバージョンアップの件、
やろうと思っていた機能は8割方実装できた。
後、一つ機能を追加したら、
タスク系の見直しをやって、実機テストしてリリースかな。
とか言って先週あたりもこんな事言いながら、
中々リリースにたどり着けてないんだよね。。。
仕事忙しいのと、
他の趣味が多忙になってしまったので、
正直開発スピードが落ちているのは否めない。
まあ、あまり焦って中途半端なクオリティーでリリースするのも良くないし、
じっくりやって行こう。
ホントは、Twitterボットの開発もやりたいんだけどな~
体力が持たん。。。
ちなみに、今週末から沖縄旅行に行ってきます♪
(いきなり開発出来ないじゃん^^;)
ちょっと乗って来たぞ^^
ようやく、
ウィジェット毎にエリア、背景色を選択する機能が
一通り実装できた。
後は細かい所を整えながら、
テストして行けばこの機能は完成かな^^
もっとてこずるかと思ったけど思ったより順調。
まあ、ちょっとパフォーマンスを考えずに実装している所があるから、
これからの見直しをしっかりやらないと実機では上手くないかも。
今週末にはリリースと行きたい所だけど、
焦らず慎重に行きましょうかね。
いきなり話題が変わるけど、
ドイツ強いね~。
イングランドが不甲斐無いと言う説もあるけど、
ドイツの完成度が1段階上に見えた。
今回はアルゼンチンかドイツって感じじゃないかな~
日本戦明日だよね?・・・あ、もう今日か^^;
パラグアイの試合見れて無いけど、ちゃんと守れれば良い試合するかも知れないよね。
何気にどの試合見てても、日本ほどフリーキックきれいに蹴っているとこないし。
本田の調子しだいじゃないかな。
最近、android開発のエントリーばかりでしたが、
今日は久しぶりにWEBマーケティングのお話です。
今日はメンバーズ社主催のソーシャルメディア活用についてのセミナーに行ってきました。
講演したのは、
techwaveチーフブロガーの湯川 鶴章氏@tsuruakiと、
ループス・コミュニケーションズ代表取締役の斎藤 徹氏@toru_saito、
ウィメンズパークを運営するベネッセの安田氏の3名。
特に、前の2人はソーシャルメディア分野での第一人者であり、
非常に有意義なセミナーでした。
クリフも会社のビジネスにおいて、
ソーシャルメディアをどう活用して行くべきか、
検討を始めた所だったので、今日の情報はとっても役に立ちます。
湯川さんの話で印象的だったのは、
米国でのFacebookの動きについての説明で、
今後はクローズドなコミュニティー上でのプロモーションではなく、
オープンな環境でfacebookによるソーシャルコミュニケーションが展開されて行くと言う話でした。
先月頃記事になっていましたが、
米国facebookにおいて、「Like」ボタンを他のサイトに設置する事が出来るようになり、
Facebook以外での友人の行動が共有できるようになったそうです。
これで何が起こるかと言うと、リアルな世界での口コミと同じように、
WEB上でも本当の友人が評価したもの、勧めたものを知る事が出来るようになり、
より自分にマッチした口コミ情報を参考にして行動する事が簡単に出来るようになるという事です。
これは、いわゆるMixiやGREEと言ったクローズドのSNSサイト内でのプロモーションと比べて、
はるかに波及力が大きく、簡単、低コストで取り組める新しいソーシャルメディアの形だと思います。
更に重要なのは、
facebookがこのスキームを無償で開放していると言う事です。
この「Like」ボタンをサイトに付けるのは無料なんです。
一番印象的だったのはこのLikeボタンですが、他にも色々な機能がありますが、全て無料です。
どう言うビジネスモデルなのか十分理解できていませんが、
湯川氏が言うには、facebookは営利目的ではなく新しい社会インフラを構築し、
それによって世の中を変える事を目的としているとの事。
だとするならば、googleと同じようにあって当たり前のインフラとなる日が
そう遠くない日には訪れるのかもしれません。
我々はソーシャルメディアと言われると、
どうしてもMixiやGREEの様なSNSを想像してしまいがちですが、
ソーシャルメディアの定義は未だあいまいで、その範疇に入りうるサービス、技術は
非常に広範囲に及びます。
その中には上記の様な新しいオープンなソーシャルメディアも含まれますし、
逆にウィメンズパークの様なテーマ特化型クローズドコミュニティーも含まれます。
これらの全てをその特徴によってマッピングし、
自社のビジネス目的と照らし合わせ、何をどのサービスを使って、
どのように展開するのか慎重に検討を進める必要があると思いました。
斎藤氏の話によれば、
米国では、
「2009年はソーシャルメディアを学ぶ年だった。2010年はソーシャルメディアを活用する年だ」
と言われているそうで、
およそ1年遅れで追随している日本は、
2010年に学び、2011年に本格活用と言った流れになるだろうとの事。
まさに、クリフの会社も同じ様に考えているわけですが、
これは片手間に出来る仕事じゃあ無いですね。
本腰を入れて、集中して取り組まないと痛い目を見る事になりそうです。
果たしてそこまで注力させてもらえるかどうか、、、
上と相談しないと行けないな~
疲れた~
ここんとこ、WCやら体調不良やらで集中して取り組めなかったけど、
ようやく次フェーズの大手術に着手しました。
新機能の目玉は、
複数ウィジェット管理機能の抜本見直し。
・SQLiteにウィジェット管理TBLを作成
・ウィジェット毎に地域、背景、ウィジェットサイズ等を設定出来るようにする。
・無駄な更新処理を起動しないようにする。
あたりを実現したい。
悩ましいのはウィジェットサイズの定義。
XMLで初期設定しないと行けないから、
appwidgetProviderクラスはウィジェットサイズバリエーションの数だけ必要になりそうで、
素直に行くとUPDATE_WIDGETインテントをうけて、
全てのAppwidgetProviderが反応しちゃうんだよね。。。
だから、実際に配置されているwidgetIDをチェックして、
一つもなければ更新処理をスキップする作りをしないと行けない。
うーん。。。難しくなってきた。
でもこれが出来ると、また一段と便利になるはず。
ちょっと時間かかるかもだけど、
じっくりやりたいと思います。
さて、今日は少しCliphWeatherをいじりました。
まだ終わっていないけど、
本を読んでいたらパフォーマンス面であまりよろしくない実装をしている事に気づいたので、
これを最適化しようと思っています。
具体的には、
無駄にオブジェクトを作るとGCを走らせる原因となり、
パフォーマンスに影響が出るとの事なので、
なるべくローカル変数で処理を完結させる様に書き換えています。
それから、
複数サイズウィジェット対応の際に、
ちょっと手抜きをして、同じインテントフィルタを設定していたので、
4×1しか配置していなくても両方の更新処理が走ると言う行けてない状態でした。
これも処理を分離して最適化しようと思います。
そう言えば、
ウェザー・サービス社さんから連絡があって、
天気予報情報を無料利用続けさせてくれるそうです!
これはデカイ。
複数ソース対応はちょっと無駄になったポイですが、
安定して情報を提供できる環境が整った様です。
これで心置き無く前に進めます!
でも、まずは既存機能の整備をしっかりやってしまわないとね。
あ、home++対応もか、、、あれ良く分からないんだよな~
でもやるっきゃないか。
さあ、HelloWorldアプリ作成も大詰めです。
今回はAndroid Manifestの編集とデバッグをやって完成となります!
Android Manifestの編集
と言う事でAndroid Manifestの編集ですが、そもそも、Android Manifestとは何か?一言で言えばこのアプリの設定ファイルです。主な設定項目としては、
- アプリの名称
- バージョン
- Activity、Service等の定義
- Intent Filterの定義
- パーミッションの定義
等があり、この設定を間違うとアプリが正常に機能しません。
AndroidManifestもプロジェクトを作成した際に、デフォルトの内容で生成されています。内容は以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hogehoge.android.helloworld"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HelloWorld"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity></application>
<uses-sdk android:minSdkVersion="4" /></manifest>
一つずつ説明して行きます。
先頭の2行は例によっておまじないですので気にしないで下さい。
package="com.hogehoge.android.helloworld"
android:versionCode="1"
android:versionName="1.0"
package=はこのアプリのパッケージ名です。他のアプリなどから参照される際の名前になります。
versionCodeは連番のバージョン番号で、versionNameはユーザーに見せる為の1.0等のバージョン名です。
※アプリをバージョンアップした際等にはこのversionCodeが以前のものより大きくないとAndroidMarketにUPできません。
<application android:icon="@drawable/icon" android:label="@string/app_name">
applicationタグではアイコン画像やラベルを設定します。
<activity android:name=".HelloWorld"
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タグは提供するactivity(画面)毎に一つ必要です。今回は1画面だけなのでactivityタグも1つです。activityタグの中にintent-filterと言うタグがありますが、これを設定する事でアプリ起動時にこのactivityが最初に表示されるようになります。逆に言えば、このタグが設定されていないと、最初に開くべきactivityが分からず、アプリを起動する事ができません。
ついでなので、intent(インテント)について少しだけ触れます。
intentとは、activityやserviceがAndroidOSを介して通信を行う手段の事です。androidのアプリではこのintentを頻繁に使います。例えば、複数画面で展開するアプリを作る場合、順々に次の画面(Activity)を起動するintentを発行して行く様な作りになります。また、「情報を共有する」と言ったいくつかのアプリで対応出来る様な仕事をどれか別のアプリにやらせたい、と言ったゆるい処理もintentを活用する事で可能です。これによって、ユーザーにメールするのか、Tweetするのかと言った手段を選択する自由を提供する事ができるのです。
ちょっと余談が過ぎました。
さて、AndroidManifestに戻りますが、実の所、今回のアプリでは何もいじる必要は無いんです。
大事な所なので一応説明させて頂きましたが、今回はこのまま閉じちゃって下さい。
では、いよいよデバッグに移ります。
Eclipseのツールバーにカブトムシみたいなマークがありますのでこれをクリックします。すると、デバッグ方法を聞かれますので、当然androidアプリケーションを選択します。
すると、自動的にエミュレータが起動され、デバッグアプリが起動されます。エミュレータの起動には少し時間がかかるので気長に待ちましょう。
起動したら、ボタンを押してみましょう。「HelloWorld!!」と表示されましたか?
表示されたあなた。ようこそandroidの世界へ!!
ダメだった方は今までのステップを見直してみて下さい。どうしてもダメならコメント頂ければお手伝いします。
今回のアプリは本当にシンプルなもので正直バグが出る事すら殆どないと思います。次回以降はCliphWeatherで使っている技術を中心に色々なクラスを紹介して行きたいと思いますので、引き続きよろしくお願いします。
昨日久しぶりにゴルフ行ってきました。
大宮カントリークラブってとこで、
近場で良いんだけど、手引きカートだったからめちゃくちゃ疲れた。。。
手引きって初めてだったんだけど、
カートがならんでる風景はスーパーマーケットか!って突っ込みたくなりました ^ ^;
コースはとーっても平坦で難易度の低い気の楽なコース。
調子もそこそこでスコア109でした。
久しぶりの110切りでよろこんでたら、
一緒に行った課長は87とかわけのわからないスコアだしてました。
やっぱやさしいコースってことだよね。
もっと練習しなきゃ。
前回までで、レイアウトXMLを作りました。
今回はいよいよ、javaファイルのコーディングに入ります。
HelloWorld.javaの編集
パッケージ・エクスプローラから「HelloWorld」→「src」→「com.hogehoge.android.helloworld」→「HelloWorld.java」と選択してHelloWorld.javaを開きます。
デフォルトでは以下の様になっていると思います。
package com.hogehoge.android.helloworld;
import android.app.Activity;
import android.os.Bundle;public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
まず、この内容を説明します。
package com.hogehoge.android.helloworld;
import android.app.Activity;
import android.os.Bundle;
冒頭のこの部分は、このクラスが所属するパッケージの定義と、このファイル内で利用するライブラリのインポート定義です。この辺の記述はjavaと何ら変わりません。また、殆どのjavaライブラリがAndroidでも利用できます。
次に、
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
この部分がアプリの本体となるクラスです。このクラスはActivityクラスを継承したHelloWorldと言う名前のクラスだと定義されています。また、アプリが起動された時に呼ばれるonCreate()メソッドをオーバーライドしたメソッドが追加されています。
デフォルトのonCreate()メソッドでは画面表示に使うレイアウトXMLを指定する処理のみを行います。
setContentView(R.layout.main);
の部分がそれです。
引数に渡しているR.layout.mainと言うのは「res」フォルダの中の「layout」フォルダにある「main」と言うレイアウトXMLを表すIDです。ちなみに、layoutを始め、IDを振ったview、画像ファイル等へアクセスする場合は必ず、このR.××.△△を使います。
さて、今回はこれを以下の様に編集して、ボタンをクリックしたらEditTextビューにHelloWorld!!と表示されるようにします。
package com.hogehoge.android.helloworld;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
EditText text = (EditText)findViewById(R.id.EditText01);
text.setText(“Hello World!!”);
}
});
}
}
追加したのはこの部分です。
Button btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
EditText text = (EditText)findViewById(R.id.EditText01);
text.setText(“Hello World!!”);
}
});
まず、
Button btn = (Button)findViewById(R.id.Button01);
ここに出てくるfindViewById(int)と言うメソッドは、IDを指定して該当viewの参照を取得すると言うものです。上記の例ではR.id.Button01と言うIDを指定してviewを取得。取得出来るのは親ClassであるViewなので、ボタンとして扱えるよう、(Button)でボタンとしてキャストした上でButton型変数btnに格納しています。
※お気づきだと思いますが、このButton01と言うIDはレイアウトXML作成の際にボタンに設定したandroid:idの値です。
で、このbtn変数を使って何をやるかと言うと、クリックされた時のイベント処理を定義しています。
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
EditText text = (EditText)findViewById(R.id.EditText01);
text.setText(“Hello World!!”);
}
});
この部分です。
Androidではボタン等のViewへのアクションや、ハードキーの押下等各種イベントをそれぞれに対応したListenerを用意して捕捉します。ここでは、btnが参照を保有しているボタンに対して、新しく作ったOnClickLister()をセットしています。
そして、その新しいOnClickLister()のonClick()メソッドをオーバーライドして独自の処理を記述しています。
独自処理の部分がこれです。
EditText text = (EditText)findViewById(R.id.EditText01);
text.setText(“Hello World!!”);
ボタンと同じように、IDでEditTextの参照を取得し、それに対してsetText()メソッドで「Hello World!!」と言うテキスト設定しています。
このメソッドが実行されると画面のEditTextビューにHelloWorld!!が表示されるわけです。
そうそう。忘れる所でした。
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
実は上記のインポート定義も追加されています。これは今回処理中で使ったViewやボタン、EditTextのクラスをインポートしたからです。
でもこれは、Eclipseがほとんど助けてくれるのであまり意識する必要はありません。
インポートされていないクラスを使おうとすると、該当部分に赤下線がでて警告されます。
その部分にマウスオーバーすると、改善策が列挙されるので、この中から○○をインポートと言うのを選べば良いんです。
これで処理の記述は終了です。
機能がとてもシンプルなので大分コードも短いですが、意外と色んな要素が入っているので長文になってしまいました。
次はandroidマニフェストの記述と、デバッグについて説明します。
前回までで、新しいプロジェクトを作る事ができました。
ここからは実際のコーディングに入って行きます。
完成形の確認
まず、完成形を確認しましょう。
インストールすると、アプリランチャーにアイコンが表示されます。
今回は特にアイコン画像を指定していないのでデフォルトのアイコンがでます。
アイコンをクリックすると↓の様な画面が表示されます。
「Click!!」ボタンを押すと、下のEditTextビューに「Hello World!!」が表示されます。
これだけのアプリです。
ちょっと、つまらないかも知れませんが、これで結構覚えるポイントがありますので、
一つずつ見て行きましょう。
レイアウトXMLの編集
まず、画面レイアウトの設計から始めます。Androidアプリの画面レイアウトはベタベタにコーディングしても書けるのですが、基本的にはXMLで定義します。
レイアウトを指定するXMLはプロジェクトを作成した際に、デフォルトのものが用意されています。「res」→「layout」フォルダにある「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/Button01"
android:text="Click!!"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/EditText01"
android:text=""
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
編集できたら、編集エリア左下にある「レイアウト」タブをクリックして、現在のレイアウトをプレビューしましょう。下の様になっているはずです。
できたら保存します。
これでアプリのレイアウトが作れました。
軽くXMLの中身を説明しますね。
まず、言葉の定義ですが、Androidではボタンやテキスト等の各パーツをViewと言い、それを整列させる為の枠組みをViewGroupと言います。
(ViewGroupクラスはViewクラスを継承しています。)
今回の例では、「LinearLayout」と言うViewGroupに「Button」と「EditText」と言う二つのビューを配置しています。
「LinearLayout」は縦方向、もしくは横方向にViewを並べるViewGroupで、今回は縦方向に並べています。
では、「LinearLayout」のあたりを見てみましょう。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
ここまでの部分はおまじないだと思って下さい。必ずこの様に書きます。使うViewGroupがLinearLayoutでなくても、必ず最初に記述するViewGroupやViewの定義に「xmlns:android="http://schemas.android.com/apk/res/android"」の記述が必要ですので注意して下さい。
android:orientation="vertical"
この「android:orientation」プロパティーで縦に並べるか、横に並べるか指定します。縦なら「vertical」、横なら「horizontal」と指定します。ちなみに、Eclipseで編集している場合は、「android:」まで入力すると指定できるプロパティーの候補が列記されます。また、「android:orientation=」まで入力すると、指定できる値の候補も表示されるので細かい設定値を覚えていなくても何とかなります。
android:layout_width="fill_parent"
android:layout_height="fill_parent"
最後に「layout_width」と「layout_height」ですが、これは横幅と縦幅を指定するプロパティーです。具体的な値で指定する事も出来ますが、候補として「fill_parent」と「wrap_contet」が表示されるので何れかを選ぶのが簡単です。「fill_parent」は親Viewと同じ幅で、「wrap_content」はそのView内に表示される子viewやテキスト等の幅に合わせます。
ボタンやテキストも幅の指定などはLinearLayoutと同じですが、違う点が2つあります。一つは「android:id」プロパティーです。
<Button
android:id="@+id/Button01"
例としてボタンの方を扱いますが、上記の例ではこのボタンviewに「Button01」と言うIDを振っています。こうやってViewにIDを振っておく事でプログラムの中からこのIDをキーとしてviewを操作できるようになります。
それから、「android:text」ですが、これは文字通りViewに表示するテキストを設定するプロパティーです。
android:text="Click!!"
レイアウトXMLの作り方が何となく分かってもらえましたでしょうか?
次は、ボタンをクリックしたら、EditTextに「Hello World!!」と表示する機能のコーディングに進みます。
つづく。