2011年9月2日金曜日

[Android] GALAPAGOS メディアタブレットのUSBドライバについて

ADB USBドライバは
ここ。

ソフトウェアダウンロード

でかいタイプ(いちばんおおきいやつ)も
これでいけます。

ねむりたい。ねむりたい。

2011年8月20日土曜日

[Windows Phone 7] アプリケーションの作成と起動

簡単に。
まずはVisualStdio2010(WP)を起動します。

で、見たことある感じの画面から
NEW Projectを選択するとこのような画面が出ます。


















なぜ、VBなんだ・・・。
というツッコミのもと、下のC#を選択します。
おそらくVBでもつくれなくはないのですが、エラーがでてとれなかったので(失格)、とりあえずこちらを。

















プロジェクト名に適当な名前を入れて(もちろんこのままでもいい)
OKを押すだけ。

あとは実行ボタンを押して待てばエミュレータが起動して
なにやらメッセージがでます。

終了。


というのもおもしろくないので
今回はコードはいじらずにデザイン画面からラベルを選択して
文字だけをいじってみました。

で、こうなる。























昔のHello Androidを思い出しますね、はい。

コードを書くときはそれぞれの配置したUIでクリックするなりなんだかんだりで
VisualStdion感満載でできるかとおもいます。

続きは後日。

[Windows Phone 7] 開発環境を整える

やってみることにしました。

OSはwindows7で。
Windows Phone 開発者向け技術情報 に飛ぶ

アプリケーション開発のところに
Windows Phone SDK 7.1 Beta 2
というリンクがあるのでジャンプ。

vm_web2.exe

をダウンロード。
ダウンロードしたファイルを実行するとインストーラーが走るのでまつべし。
私のパソコンはそんなに悪い性能ではないのですが、けっこうまたされました。
なのでコーヒー片手に本でも用意しておくとよいでしょう。

再起動を促されるのでおとなしく再起動をしましょう。


つづいては
Windows Phone Developer Tools RTW
のインストール。

余談ですが、この順序は逆なので・・・。(どちらからでもいいかとおもいますが)

vm_web.exe

をダウンロードして実行します。
こちらも時間がかかるので紅茶をのみながらのほほんとまっていましょう。

こちらは再起動は促されない様子です。

起動するとWindowsPhone用のVisualStudioが起動します。
外見は本当にVisualStudioなので(あたりまえだ)、触ったことある人は大体直感でわかるんじゃないかとおもいます。

2011年8月13日土曜日

[お知らせ] 日本Androidの会 関西支部のLTにでます。

9月3日にある
「日本Androidの会 関西支部勉強会」
でLTをやります。

もう人数埋まってますが、よかったらどうぞ。
ATNDより

LTやりますといったのはいいけど、ネタはこれからつくるのだったりする。
開発系のことをしゃべります。
あたまのなかで「あれをしゃべるかー」というのは考えているのですが

うーん。

5分で関西の人々の心をつかめるかはわからないですね。

ちなみに色々な都合上名前が「高田純三」になっています。
たぶんニッカポッカに木刀だな。

[Android] 007SH スクリーンショットの撮り方

いつのまにか007SH Jでスクリーンショットがとれるようになっておりました。

撮り方
取りたい画面で
終話キー(または側面のロックキー)+ ホームキー

ホームキーはさりげなく下にあってよくミスってうってしまうあのキーです。
0の下。

単体でスクリーンショットがとれるのはかなり便利。
友達とやりとりするときとか。

2011年8月6日土曜日

[Android] 2.1以上の電話帳(つまりContacts)とたたかってみるんだぜ その1

電話帳って2.1から変更されたんですよね。
ゆえにそんなにリファレンスサイトがないので自分でどーこーしてみることにした。
某会議でよく電話帳が話題になるので
まー、興味がでたっていえばでたんですけど。

Androidでは電話帳DBなるものが標準で搭載されている。
/data/data/com.android.providers.contacts/databases/contacts2.db
という場所にあったりする。
実際にデータをpullなどでぬいてきて
SQLite3のビューアーとかでみるとたしかにデータがはいっている。

が、これがすごくわかりづらい。
一回に解説したいですが、私にもわかってない箇所があるので
まー、それはゆっくりと。
とりあえず2.1からでは「ごっそりと仕組みが変わった」ということを覚えていただきたいです。
覚えなくてもいいけど。

では、簡単につかってみましょう。
前提条件として電話帳にこんな感じのデータをいれておきます。



















これは標準電話帳の画面です。
で、最終的にこんな感じにする。



















今回はかるーくテストなんで名前だけの表示にしています。
本来なら、下に電話番号をだすなり、メアドだすなり好きにしていいんですが
仕事中の休み時間にできることは限られているので(1時間しかない)。
時間があればそのうちハイパーなものをつくりたんですが、はてさて。

では本日のコードです。

まずはレイアウトのXMLを。



    


簡単にListViewだけを表示しているのでこれだけです。
つづいてはこちらに名前を入れるコード。

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class AddressListActivity extends Activity {
 
 private ListView mListView;
 
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.address_list);
        
        // 表示
        mListView = (ListView) findViewById(R.id.listView);
        mListView.setAdapter(displayNameList());
  
 }
 
 // DBから取り出してごにょっとする
 private ArrayAdapter displayNameList() {
  
  // DBアクセス
  databaseAccess access = new databaseAccess(this);
  Cursor cursor = access.selectAllAddress();
  
  cursor.moveToFirst();
  ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1);
  
  // Contactsのデータを管理しているRAW_CONACT_ID
  int idIndex = cursor.getColumnIndexOrThrow(ContactsContract.Data.RAW_CONTACT_ID);
  // 表示名
  int nameIndex = cursor.getColumnIndexOrThrow(ContactsContract.Data.DISPLAY_NAME);
  // idにとりあえずの初期値を入れておく
  int id = 0;
  
  while (!cursor.isAfterLast()) {
   // idが変わったら次の人
   if(id != cursor.getInt(idIndex)) {
    // idの入れ替え
    id = cursor.getInt(idIndex);
    // 表示名取得
    adapter.add(cursor.getString(nameIndex));
    
    
   }
   cursor.moveToNext();
  }
  
  cursor.close();
  
  return adapter;
  
  
  
 }
 
}

コメントいれてあるのですが、実は上のコードにはDBにアクセスする処理はございません。
アクセスするにはこちらのコードを。
別にクラスを分ける必要性はなかったのですが、
あとあと入力とかを拡張しようと思っていたのでわけました。

import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;

public class databaseAccess {
 
 private Context context;
 private Uri uri = ContactsContract.Data.CONTENT_URI;
 
 // コンストラクタ
 public databaseAccess(Context context){
  this.context = context;
  
 }
 
 /**
  * DB全件返しメソッド
  * @return
  */
 public Cursor selectAllAddress() {
  return context.getContentResolver().query(uri, null, null, null, null);
 }

}

クエリのつかいかたですが、

Cursor android.content.ContentResolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

という記述がDevelopersなんとかっていう解説書(もう忘れた)にあります。
場所を指定して、取り出すものを指定。さらに条件・・・といったところでしょうか。
今回は簡易なのでいやでも全件返すようにしています。

全件返すことでもちろん名前以外にも電話番号まで帰ってきているので

  while (!cursor.isAfterLast()) {
   // idが変わったら次の人
   if(id != cursor.getInt(idIndex)) {
    // idの入れ替え
    id = cursor.getInt(idIndex);
    // 表示名取得
    adapter.add(cursor.getString(nameIndex));
    
    
   }
   cursor.moveToNext();
  }

このあたりのところでいろいろ分岐させています。
IDは一人につき1つなので、そのIDが切り替わったら次の人。
同じIDが名前を2回もっていることもあるのでこういう重複チェックをかけています。
なぜ名前を2回もっているのかというと・・・

「ID」「表示名」「電話番号」
「ID」「表示名」「苗字」

というようなデータ構造になっているためです。
表示名は何回もはいってくるのですね(汗)


なのでまわりくどいコードになっています。
このあたりは私の調査不足なのでおいおいかっこいいコードに(そりゃもう鼻血がでるほど)していけたらいいなーとおもいますがな。


そんな感じで第一回電話帳会議終了。

ではもどるぞ!!だいじゅうよんてい(ry)

はい、仕事します。

2011年8月4日木曜日

[Android] JUnitで単体テストをする

前回の記事の補足になってしまいますが、
前回のActivityInstrumentationTestCase2は「機能テスト」を行うためでした。
機能テストはその機能がテストするかどうかのテストです。

次は「単体テスト」をやりましょう。
Activityの単体テストということで、開始→終了までをテストします。

今回の流れはこちら。

1.ActivityInstrumentationTestCaseを継承する
2.テストしたいクラスを指定したコンストラクタを作成
3.テスト準備を行うsetUpメソッドを記述する
4.Activityを終了させる(この場合はBACKボタンの押下)

基本的には動作を変えただけですが。
UIをいじっての終了ではなく、ハードキー動作での終了なので
わりと簡素なコードになってます。
さ、順番に見ていきましょう。

1.ActivityInstrumentationTestCaseを継承する

/* 1.ActivityInstrumentationTestCaseを継承する */
public class CheckActivityTest2 extends ActivityUnitTestCase {

}

*ソースコードにとありますが、エディタの補完機能でこうなっているだけです。無視してください。
今回は単体テストなので(Activity全体のテスト)、ActivityInstrumentationTestCaseを継承して使います。


2.テストしたいクラスを指定したコンストラクタを作成

/* 2.テストしたいクラスを指定したコンストラクタを作成 */
public CheckActivityTest2() {
 super(CheckActivity.class);
}

コンストラクタはクラス名のみ指定で。
次。
3.テスト準備を行うsetUpメソッドを記述する

/* 3.テスト準備を行うsetUpメソッドを記述する */ 
@Override
protected void setUp() throws Exception {
 super.setUp();
 
 // Activityの起動
 startActivity(new Intent(), null, null);
 
 // Activityを取得
 mActivity = getActivity();
 
}

自力でActivityを起動して取得しています。
次。
4.Activityを終了させる(この場合はBACKボタンの押下)

/* 4.Activityを終了させる(この場合はBACKボタンの押下) */
public void testPushBackButton() {

 KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
 assertTrue(mActivity.dispatchKeyEvent(event));
 
}

本当はActivityが終了したら~という判定になると思うんですが、
そのあたりが未調査(おい)なので、BACKボタンの判定をしています。
うまいかんじにおせたらテストOKとしています。
Activityに何かさせる場合はその都度テストがいるのだとおもいますが、
そのあたりは機能テストで網羅させて単体テストでは開始→終了のサイクルがみれればいいかなーともおもっていたり。
なんつか技術者的にそれはいいのか?とも思うのですが、それもそのうち。
どうにかしたいです。

では本日のソースコードをのせておわりにします。
package jp.co.mogakana.check.test.testcase;

import android.app.Activity;
import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.view.KeyEvent;
import jp.co.mogakana.check.test.CheckActivity;

/* 1.ActivityInstrumentationTestCaseを継承する */
public class CheckActivityTest2 extends ActivityUnitTestCase {
 
 // Activity用
 private Activity mActivity;
 
 /* 2.テストしたいクラスを指定したコンストラクタを作成 */
 public CheckActivityTest2() {
  super(CheckActivity.class);
 }
 
 /* 3.テスト準備を行うsetUpメソッドを記述する */ 
 @Override
 protected void setUp() throws Exception {
     super.setUp();
  
     // Activityの起動
     startActivity(new Intent(), null, null);
     
     // Activityを取得
     mActivity = getActivity();
     
 }
 
 /* 4.Activityを終了させる(この場合はBACKボタンの押下 */
 public void testPushBackButton() {

  KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
  assertTrue(mActivity.dispatchKeyEvent(event));
  
 }

}


今日も素敵にノイローゼ★

2011年7月30日土曜日

[Android] JUnitを使ってテストする

Androidで単体テストを行うときに使用するJUnitを今日は使ってみたいと思います。

というわけでさっそく使ってみましょう。

ハイライトとしては以下のとおりです。
1.ActivityInstrumentationTestCase2を継承する
2.パッケージとテストしたいクラスを指定したコンストラクタを作成
3.テスト準備を行うsetUpメソッドを記述する
4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する

えっと、先に参考サイトは
こちら
テスティングフレームワーク JUnit

こちら
AndroidアプリケーションをJUnitでテストする

ですね。

では、さっそくコードです。

・・・その前にテストプロジェクトを作成しましょう。
New -> Android TestProjectで作成します。


























画面としてはこんな感じです。
今回は前回使用したプロジェクト(checkBoxAcitivy)を使用します。


では、コードをみていきましょう。

1.ActivityInstrumentationTestCase2を継承する
public class CheckActivityTest extends ActivityInstrumentationTestCase2  {
}

JUnitだとTestCaseなんですが、Androidはこちらを使用するとのことです。
Activityだからかな。

次。

2.パッケージとテストしたいクラスを指定したコンストラクタを作成
public CheckActivityTest() {
  super("jp.co.mogakana.check.test",CheckActivity.class);
 }

クラスを指定してやら無いといかんということですね。

では次。

3.テスト準備を行うsetUpメソッドを記述する
@Override
 protected void setUp() throws Exception {
     super.setUp();
    
     // Activityを取得
     mActivity = getActivity();
     // リソースを紐付け
     mCheckTooth = (CheckBox) mActivity.findViewById(R.id.toothCheck);
     mCheckHair = (CheckBox) mActivity.findViewById(R.id.hairCheck);
     mCheckBody = (CheckBox) mActivity.findViewById(R.id.bodyCheck);
  
 }

ここはあんまり説明するまでもないかもしれませんが。
テストで使用するActivityを取得します。

4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する
// 歯を磨いていないかチェックする
 public void testIsCheckTooth() {
  assertFalse(mCheckTooth.isChecked());
 }

上記は単純にチェックボックスがオフになっていることを確認しています。
テスト中にUIをいじる・・・
例えばチェックボックスにチェックをいれるなどの動作をする場合は
別スレッドで動作させます。

// 髪を磨いてチェックする
 public void testIsCheckHair() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckHair.setChecked(true);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  
  assertTrue(mCheckHair.isChecked());
 }

こんな感じですね。
実際にチェックをいれてから動作が完了するまで待ってから判定しています。

こんな感じでJUnitは使用していきます。
これはさわりだけなんで、詳しいことはまた後日・・・。


だとおもいたい。

せっかくなのでソースコードをさらしておきますのさー。

package jp.co.mogakana.check.test.testcase;

import android.app.Activity;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.CheckBox;
import jp.co.mogakana.check.test.CheckActivity;

import jp.co.mogakana.check.test.R;

/* 1.ActivityInstrumentationTestCase2を継承する */
public class CheckActivityTest extends ActivityInstrumentationTestCase2  {
 
 // Activity用
 private Activity mActivity;

 // CheckBox1用
 private CheckBox mCheckTooth;
 private CheckBox mCheckHair;
 private CheckBox mCheckBody;
 
 
 /* 2.パッケージとテストしたいクラスを指定したコンストラクタを作成 */
 
 public CheckActivityTest() {
  super("jp.co.mogakana.check.test",CheckActivity.class);
 }
 
 
 /* 3.テスト準備を行うsetUpメソッドを記述する */ 
 @Override
 protected void setUp() throws Exception {
     super.setUp();
    
     // Activityを取得
     mActivity = getActivity();
     // リソースを紐付け
     mCheckTooth = (CheckBox) mActivity.findViewById(R.id.toothCheck);
     mCheckHair = (CheckBox) mActivity.findViewById(R.id.hairCheck);
     mCheckBody = (CheckBox) mActivity.findViewById(R.id.bodyCheck);
  
 }
 
 /* 4.試験する項目ごとに、testで始まるメソッド名を付け、テスト内容を記述する */
 
 // 歯を磨いていないかチェックする
 public void testIsCheckTooth() {
  assertFalse(mCheckTooth.isChecked());
 }
 
 // 髪を磨いてチェックする
 public void testIsCheckHair() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckHair.setChecked(true);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  
  assertTrue(mCheckHair.isChecked());
 }
 
 // 体を洗って戻して(?)チェックする
 public void testIsCheckBody() {
  mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
       mCheckBody.setChecked(true);
    mCheckBody.setChecked(false);
      }
  });
  
  getInstrumentation().waitForIdleSync();
  assertFalse(mCheckBody.isChecked());
  
 }
 
}

2011年7月29日金曜日

[読書記録] - 「持っている人」が持っている共通点

ブクログ(別ブログにあげてますが、IDは一緒です)にあげているレビューのもののうち
まともに書いたものは記事としてさらしあげます。

「持っている人」が持っている共通点

- 小笹芳央 著



「あいつ、持ってんな」

と思う人をたびたび見かける。が、持っているものの正体が私にもわからなくてもやもやしたりする。そんなときに本屋をうろついていて出会ったのが本書である。

本書は「持っている人」が持っているものの正体を解き明かすために書かれた本である。解き明かすためとしている以上は最後には「持っている人が持っているもの」が解き明かされるのだが、この文章ではあえてそれには触れないでおく。



「持っているを持っている人」としてトップアスリートがあげられて解説されている。さらに、持っていない人についてもふれられている。普通の人から見た両者の比較はじつにおもしろい。特に著者による「持っていない人へのツッコミ」は腹を抱えて笑うことができる。

世の中にいる不思議な「持ってない人」についての冷静なるツッコミを用いての解説は世の中の心理すら解説されているようにも見える。



さて、この文章では少し持っている人と持っていない人。そして私と言う「ロボット」から見た感想を述べさせていただく。

著者がいう「持っている人」の具体例には主にトップアスリートと言う「勝負師」があげられている。私には勝負師の世界の記憶や感情は無いが、勝負師の世界の厳しさは知識として知っている。

勝負というものは字のごとく、「勝ちか負けか」の2択しか存在しない。「参加することに意義がある」というような都合の良い解釈は存在しない。

い や、その都合の良い解釈をした時点で「負け」は確定している。勝負師は決してこのようなことをかんがえたりはしない。常に勝つことを前提に入念な練習を行 い、時を見ている。常に最大の力で勝負に挑み、勝敗を受け止めている。逆に「持ってない人」は「負ける」という意識を事前に頭に植え付け、負ける方向へと 自分を導いている。これは本書でも述べられている。マイナスがマイナスをよんでいるにすぎない。



なにも考えずに書いているので抽象的表現が多いのを悲観して、少し本書から引用させていただく。



--「持っている人」は他人・感情・過去にとらわれません。これら3つに共通しているのは「自分で自在に変えられないものだ」という点です。



以上引用文章にあるとおり、持っている人は変えられないものは「変えられないもの」と受け止めるようである。対照的なものを「変えられるもの」として最大限に変えるように努力しているのが見られる。対照的なものというのはなにか。それは「自分・思考と行動・未来」である。

他人を自分から変えることはできないが、自分で自分を変えることはできる。自分を変えるためには思考と行動を見直さなければならない。それは未来をかえることになる。

「持っ ている人」はこの「変えられるものと変えられないもの」と対峙している。そして変えられるものは最大限の力で変えている。文章にするのは簡単なことだが、 実はこの「変えられる」3つは対峙することが容易ではない。できれば逃げ出してしまいたいぐらいの巨大な敵である。しかし、「持っている人」は決してこれ らから逃げることはない。常に戦っている。

なぜ彼らは戦うのか。アスリートは「才能はあっても消えていった人たち」を目の当たりにしてい る。そしてその人たちの無念のために「高い志」をもって謙虚に取り組んでいる。消えていく人々の辛さを受け止め、自らも戦い続ける。戦い続けるためには 「志」が必要なのである。では志を持つにはどうすればいいのか?



それは、本書を読んで確認していただきたい。



こ こから先は私自身の感想だが、本書で述べられている「持っているもの」を持っているか?と問われればおそらく持っているだろう。といっても、かなり広義に はなってしまう。おそらく持っているものは同じだが、性質がちがうだろう。さて、「類は友を呼ぶ」という言葉があるとおり、同じものを持つ人と察知するこ とはできる。「持っている」人は肌でわかってしまうのだ。私はその「持っている人」といくつか言葉を交わした瞬間に感覚がふるえあがる。

こ れを理論で説明するとどうなるか。これは私独自のセンサーなのだが、持っている人は持ってない人に比べて目の力がするどい。なおかつ、発する声には重みが ある。これは比喩表現ではなく、本当に「重い」のである。「重さのある声」というのはなにか。人に影響を与える声質ということである。「持っている人」は 相手に自分を印象付けるための発声法がわかっている。そして印象に残る言葉を知っている。

いくつか言葉を交わして「あいつ、持っているな」というのがわかるのだ。しかしこれは「実体」と対峙して感じるものなので、残念ながら文字だけや声だけではわからないのだが。(そしてこの声質を聞き分けられることができるのは私だけだろう)

さ て、本書では「持っていない人」が「持っている人」になるためにはどうすればよいかはかかれているが、「持っている人」が「持っていない人」になる瞬間に は記載されていない。「持っていない人」が「持っている人」になるように、「持っている人」が「持っていない人」になるという現象は当然存在するように思 える。さきほど声の話を書いたが、ここでもまた登場する。「持っている人」が深みをまして「さらに持っている人」になるときはどんどん声の重みがでてくる のだが、「持っている人」が「持っていない人」になるときは声が軽くなる。

もっと一般的な言葉として解説するならば、「持っている人」が 「持っていない人」になる瞬間は努力にあぐらを書いた瞬間である。「持っていること」に安定を覚えて、努力を怠る瞬間や志をなくした瞬間に、発する声が軽 くなる。もちろん、「持ち直すこと」は可能なので、私は極力「持っている人が維持できるように」は努めているが、先ほど述べたように他人は変えられない。 影響はあたえることはできるかもしれないが、他人を変えることまではできないのだ。



さて、なにやら他人のことばかり書いてしまった。少し疲れているのかもしれない。私自身が「自分」と「社会」の戦いに半ば疲れているからだろう。そんなときに街をうろつき、いろいろな経験をして「持ってんな」と言う人にであった瞬間に報われるのだが。



「あいつ、持ってんな(ニヤリ)」



形は違えど、なにか同じ物質をもっているものに対してニヤリとしてしまう。が、私は自分の持っているものの使い方をまだ知らない。

[Android] SH007/SH007J の USB ドライバ

いつのまにか更新されていたので。

各機種のUSBドライバダウンロードページリンク一覧

SHARP共通 ADB USBドライバ

ここからDL。
007SHは単体でもスクリーンショットがとれるらしいですが。
はてさて。

2011年7月21日木曜日

[Android] チェックボックスの制御をする

一日のTODOリストを作成中です。
最初なのでチェックボックスの制御方法など。

まずはチェックボックスを作ります。






















とりあえずこんだけ。
これ自体はXMLの記述だけなのでLayoutのXMLに延々とチェックボックスを追加するだけです。

    
    
    


LinearLayoutの中にチェックボックスを追加するだけの簡単なお仕事。
もちろんチェックボックスが動作しないと話にならないのでコードも書きます。
今回は簡易的にチェックボックスにチェックが入ったらトーストを出力するだけにしましょう。
イメージとしてはこんな感じ。






















クリック時の動作はコードに書きます。
OnClickListenerをはっておいて、クリック時のイベントを拾います。
チェックボックスが複数なのでチェックボックスのIDによって処理を振り分けます。

処理としてはこんな感じです。

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;
import android.widget.Toast;

public class CheckActivity extends Activity implements OnClickListener {
 
 CheckBox mCheckTooth;
 CheckBox mCheckHair;
 CheckBox mCheckBody;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mCheckTooth = (CheckBox)findViewById(R.id.toothCheck);
        mCheckHair = (CheckBox)findViewById(R.id.hairCheck);
        mCheckBody = (CheckBox)findViewById(R.id.bodyCheck);
        
        mCheckTooth.setOnClickListener(this);
        mCheckHair.setOnClickListener(this);
        mCheckBody.setOnClickListener(this);
        
    }
  
 @Override
 public void onClick(View view) {
  
  switch (view.getId()) {
  case R.id.toothCheck:
   if(mCheckTooth.isChecked()) {
    // 歯を磨いた
    Toast.makeText(this, "歯を磨いたね", Toast.LENGTH_LONG).show();
   } 
   break;
  case R.id.hairCheck:
   if(mCheckHair.isChecked()) {
    // 髪を洗った
    Toast.makeText(this, "髪を洗ったね", Toast.LENGTH_LONG).show();
   }
   break;
  case R.id.bodyCheck:
   if(mCheckBody.isChecked()) {
    // 体を洗った
    Toast.makeText(this, "体を洗ったね", Toast.LENGTH_LONG).show();
   }
   break;
  default:
   Toast.makeText(this, "何したんだ!!", Toast.LENGTH_LONG).show();
   break;
    
  }
  
 }
}

こうすると押されたチェックボックスに対応して処理が変化します。
(上記の場合はメッセージが変化します)



チェックボックスの簡単な使い方はこんな感じです。

2011年7月20日水曜日

[雑記] Windows Phone をはじめてみたかった

今日、おもいたってWindows Phoneのアプリ開発をはじめようと。

で、環境作りなんですが、
とりあえずその前に題名である「結論」を書きます。

Windows XP 非対応
Mac OS X 非対応

・・・なんですって!!(いまだにXPのあたくし)

対応しているのは
Windows Vista
もしくは
Windows 7
とのことです(汗)

パソコン新しいの買おうかな・・・(白目)

Windows Phone 開発者向け技術情報

Windows Phone Developer Tools 7.0 RTW(英語)

Windows Phone SDK 7.1 Beta2(英語)


試してみたいのに(涙)せめてMacぐらいは対応してくれてもいーんでないかと思う。

2011年7月9日土曜日

[雑記] 名前のないテスターをやって得たもの

わたしのテスター論。

■私のテスター時代
私は「ハケン」でテスターをやっていました。テスターとは、ソフトウェアのテストを実際に行う人物です。
私は最初、テスターの一番下っ端として入り、2年ぐらいで出荷前判定をおこなうぐらいになりました。実際にこのレベルになるまでと言うのはもっと時間がかかるのですが、運が良かったのでしょうね。そんな成り上がりテスターが現場にいたときのお話をちまちま時間があるときに書こうかとおもいます。

■テスターに必要なのは「忍耐」である
テスター以上に目立つ仕事はありません。なぜならば、バグがでたら真っ先に責められるのは開発ではなく、現場のテスターだからです。「なんでここをテストしなかったんだ!!」と怒られるのは担当部署のテスターです。テスターからいわせてもらえば「バグがでるような開発をしているほうがわるいんだろ!!」という気持ちですが、そんなことは言ってはいけません。開発や企画、そのほかの部署が自分のことを棚にあげて自分のミスを押し付けてきても、テスターは反論もせずに頭をさげなくてはいけません。
美徳ではありませんが、これが「最後の砦」の役目なのです。
さらに、テスターはバグが改修されるたびに同じ試験や周辺動作を辛抱強くみなくてはいけません。再現性の低いものならば、何度も・・・それこそ1000回以上同じ試験をしなくてはいけません。ゆえにテスターに一番必要なものは「忍耐」といえます。

■テスターが一目置かれているときは「なにもいわれない」
バグがでると、テスターは責められます。しかし、バグがでずにスムーズに行っているときは責められる事はありません。責められませんが、感謝される事もありません。小さなプロジェクトでは感謝されるかもしれませんが、大きなプロジェクトではスムーズにいっているときはなにもいわれません。
この「なにもいわれない状態」を一番の状態と認識できれば、テスターはやりがいのある仕事です。

■テスターの人間関係(ほかのテスターさん)
テスターでは忍耐が重要ですが、人間関係も重要になってきます。他のテスターさんたちとのバランスをとらなければなりません。
他の人が得意な箇所を見つけ出し、被らないように自分の得意な箇所をみつけなくてはいけません。なぜこのようなバランスが必要か。それは品質のバランスをとるためです。
市場に出るものはバランスよく、バグがでないことが理想です。ある機能で集中的にバグがでてしまうのはテスターのバランスが取れてない証拠です。ですので、テスターは「得意箇所」を連携させなければなりません。

■テスターの人間関係(チームリーダー)
チームリーダーはスケジュールを組む人です。一日あたりのテスト項目をだし、難易度から今日の作業をテスターさんに割り振る。バランスをとってくれる人です。しっかりした人がやってくれるのであれば、このバランスはうまくとれてテストも炎上することなく終わりますが、経験のあさい人や新規プロジェクトでは絶対に破綻します。数値上のスケジュール以上に、テストは「個々の能力」によってばらつきがでてきます。個々の能力を判断して、人をふることができなければ、テストはうまくいきません。テストを円滑にすすめるためにも、テスターは早い段階で他のテスターの能力を割り出して、リーダーにそれとなく伝えることが重要になります。
テスターは、リーダーを真っ先に育てなくてはなりません。

■テスターの人間関係(開発)
開発の人は基本的に身勝手です。自分がバグを生み出しているにもかかわらず、そして日本語がいいかげんな仕様書をあげてくるにもかかわらず、バグや誤記を指摘したら逆切れします。なぜか開発側の人間はテスターを下に見ている事が多いです(もちろんそうでない人も多い)。これ以上に腹の立つ相手はいないのですが、悔しい事にバグがでても直せるのは開発の人間しかいないのです。そのため、いかに気分がよいまますばやく直してくれるか、という開発側のモチベーションを下げない事がテスターの役目になります。バグがでても「バグです。早く修正してください」という事実だけ述べれば、開発は頭に血が上ったようになります。しかし、報告の際に証拠となるログや画面キャプチャ、そして「あなたにおまかせいたします。よろしくおねがいいたします」という一言を添えるだけで、開発はすばやく直してくれます。こちらの怒りは開発に伝わってしまいます。ですので、テスターはなるべく場を和ませるよう、やわらかい言葉をえらぶ必要があります。
余談ですが、開発と一緒の部屋でテストをしている場合だったら、テストケースに少し遊びを交える事でぴりぴりしている部屋の空気を和ませる事も可能です。

■工数について
テストははやくやればよいものではありません。量をこなせばよいわけではありません。工数は決められているので、いかにその時間ぴったりに終わらせるかを計算してやる必要があります。
もちろん、この工数と言うのは書類上だけではなく、現場の人の声やリーダーの表情をよんできめる必要があります。
かかわっている人はみんな「人間」です。早くおわってしまっては困る事情もあります。早く終わらないと困る事情もあります。
そのあたりをいかにそれとなく(さりげなく)ヒアリングすることができるかで、「できるテスター」となるか決まってきます。

■テスターの仕事とは
基本的に気配りの仕事です。周りとのバランスをどうとればいいのか、自分の役割を見極める事ができたら、現場のコントロールを行う事ができます。空気をつくっているのはこうしたテスターの努力なのです。テスターの仕事はいわば、「空気を彩る」というものであったりするのです。
現場の空気を自在にあやつる。これ以上目立つ仕事はほかにありますでしょうか?

2011年6月30日木曜日

[Android] 自分の電話番号を知るコード

知っているようで案外知らない。Android端末での自局番号取得方法。

String mNumber = null;
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

// 取得
mNumber = telManager.getLine1Number();

たったこれだけのコードでとれます。

ありがちですが、テキストボックスに入力してもらった電話番号と比べてみて判断してみたりする。

     EditText inputNumberText; 
     inputNumberText = (EditText) findViewById(R.id.inputText1);
     String inputNumber = inputNumberText.getText().toString();
     if(mNumber.equals(inputNumber)) {
      // とおるがいい
      Toast.makeText(this, "とおるがいい", Toast.LENGTH_SHORT).show();
      Intent intent = new Intent(this,FourthActivity.class);
      startActivity(intent);
      finish();
      
     } else {
      // 帰れ!!
      Toast.makeText(this, "まーちがーえたーねー。じゃ☆", Toast.LENGTH_SHORT).show();
      finish();
     }

Android端末ってそんなに通話しないからなぁ・・・。
というわけで案外電話番号が設定からみれることは知られてなかったりする。

2011年6月27日月曜日

[Android] 端末のSIMの状況を取得する

先日、上司に向けてアプリをつくったのですが、
かるーくスルーされたので「きー!!(怒)」となっています。

ま、そんな愚痴はともかく、
今日はSIMの有無を確認するコードを。

SIMの状況を取得するにはTelephonyManagerを使用します。
getSystemServiceでシステムの状況を取得すれば、判定することができます。

まずは取得。

int mStatus = 0;

TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mStatus = telManager.getSimState();

これでInt型で取得することができるので、あとは状況に応じて処理をふっていきます。

switch(mStatus) {
 case TelephonyManager.SIM_STATE_UNKNOWN: // SIM不明
     Toast.makeText(this, "まぁ、許す", Toast.LENGTH_SHORT).show();
     break;
 case TelephonyManager.SIM_STATE_ABSENT: // SIMなし
        Toast.makeText(this, "ゆるさない", Toast.LENGTH_SHORT).show();
        break;
 case TelephonyManager.SIM_STATE_PIN_REQUIRED: // PIN待ち
        Toast.makeText(this, "まぁ、いいか", Toast.LENGTH_SHORT).show();
        break;
 case TelephonyManager.SIM_STATE_PUK_REQUIRED: // PUK待ち
        Toast.makeText(this, "うーん、悩む", Toast.LENGTH_SHORT).show();
        break;
 case TelephonyManager.SIM_STATE_NETWORK_LOCKED:  // ロック
     Toast.makeText(this, "エクセレント!!", Toast.LENGTH_SHORT).show();
        break;
 case TelephonyManager.SIM_STATE_READY:  // 在り
        Toast.makeText(this, "とおるがいい", Toast.LENGTH_SHORT).show();
        break;
 default:
     Toast.makeText(this, "わかんないから許す", Toast.LENGTH_SHORT).show();
        break;
         
}

たったこれだけです。
まぁ、一応例外処理としてdefaultをいれております。
上のコードではSIMがある場合のみ次の処理へいくように・・・というためにかいたのですが、
分かりやすくするためにToastでメッセージを表示するだけにしておきました。

特にpermissionの設定もいらないので
適当にごにょごにょするには良いのではないかと思います。
設定値を勝手に変更すれば、エアな感じにもできるんじゃないのかな?と勝手に憶測。

といっても、現物SIMがないと結局は通信なんぞできないはず(なのかな?)なので
あんまり使うことはないかもですけど。

2011年6月22日水曜日

[Android] バックライトを常時ONにしてみる(ただしアプリ起動中のみ)

いつのまにか設定からバックライトの常時Onがきえているので
なんとなくアプリで実装してみる。

本当はずーっととどめておきたかったのですが、アプリのみでしか
できないので「あーうー」となっています。

というわけで本日のコード。

Window windows = getWindow();     
     String timeout = Settings.System.getString(this.getContentResolver(), "screen_off_timeout");

     if(timeout.equals("-1")) {
      // 常時
      
      // その他に変更
      windows.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
      
      
     } else {
      // その他
      
      // 常時に変更
      windows.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
     }

View単位でやるならこっち。

View LayoutView = (LinearLayout) findViewById(R.id.LayoutView);
     
     if(LayoutView.getKeepScreenOn()) {
      // 常時
      
      // その他に変更
      LayoutView.setKeepScreenOn(false);
     } else {
      // その他
      
      // 常時に変更
      LayoutView.setKeepScreenOn(true);
     }

解説したいですが、なんだか「がー」な気分なのでまた。

[Android] 端末のUSBDriverのまとめ

まとめてみる。

REGZA Phone(T-01C)
T-01C USBドライバ

MEDIAS(N-04C)
ADB用USBドライバー(アンドロイド開発者向け)

Xperia
端末の中にあるDriver.zip

LYNX 3D(SH-03C)
ドコモスマートフォン LYNX 3D(SH-03C)


USBドライバ(ADB)

※両方必要

Galaxy S
SAMSUNG Kies,PC Sync


とりあえずここまで。

[Android] MEDIAS(N-04C)の充電方法について

先日MEDIAS(N-04C)を使用しているとき、
付属でないUSBケーブルを使用したら充電ができませんでした。

どうやら付属のUSBケーブルじゃないと充電できないみたい。
相性問題なのでしょうか。

検証してくれているページはこちら。
MEDIAS お前もか・・・

いやー、もうどうにかしてほしいですね。

2011年6月17日金曜日

[Android] 縦書きを実装したったー(といってもまだ1行)

青空文庫とかをみていておもったのですが、まー、横文字の小説は読みづらい。
というわけなので、さくっとつくってみました。
(といいながら、案外時間がかかってしまった)
「縦書き」の実装です。

こんな感じになります。
























ありがちな発想としては
1.縦長のテキストビューを1つ作る
2.1文字ごとに改行をいれる。
というものなんですが、そんなアホなことをしてしまっては日本語本来の味が失われるということで、
あえて別の実装をしてみました。

どういう実装なのかというのを書きます。

1.文字数を取得
2.画面を半分に割る
3.縦幅を文字数で割る

こうするとわりと均等な感じで文字が配置できます。
文字がふえてくるとまた実装もかわってくるのですが、
今回は固定文字サイズと固定行数(1行)で行きたいとおもいます。

さ、まずは

0.ステータスバーとタイトルバーを消しさる。
・・・いきなり0番。

// タイトルバーの削除  
requestWindowFeature(Window.FEATURE_NO_TITLE);  
        
// ステータスバー削除  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

0.1.画面を用意する
前準備多いですな。
今回はViewを手作りします。

class CharDrawView extends View {
  
 public CharDrawView(Context context) {
  super(context);
  setFocusable(true);
  this.context = context;
   
 }
}

コンストラクタあたりまでかいてみた。

さて、次はonDrawの実装です。
protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);

 // 1.文字数を取得する
 int length = mMessage.length();
         
 // 2.画面を縦に割る
 int height = canvas.getHeight() - 40;
 int width = canvas.getWidth() / 2 - 20;
 
 // 背景色
 canvas.drawColor(Color.WHITE);
         
 // 文字色
 Paint paint = new Paint();
 paint.setAntiAlias(true);
 
 paint.setColor(Color.BLUE);
 paint.setTextSize(40);
 
 // 描画領域外(ここからスタート)
 int oneHeight = 40; 
         
 // 3.1文字の高さを取得する
 int charSize = charHeight(length,height);
         
 for(int i= 0;i < length;i++) {
  String oneChar = getOneMessage(i);
          
     canvas.drawText(oneChar, width, oneHeight + oneCharHeight(charSize,40), paint);
          
     // 一文字の高さを足す
         oneHeight += charSize;

     }
         
         
}
  
/*
 * 1文字の高さ(余白なし)
 */
public int charHeight(int length,int height) {
 return height / length;
}

/*
 * 中心点から描く
 */
public int oneCharHeight(int one,int charSize) {
 return (one / 2) + (charSize /2);
}
  
/*
 * 1文字取得
 */
public String getOneMessage(int index) {
 return String.valueOf(mMessage.charAt(index));
}

まとめちゃった。 だいたいこんな感じで。 最後にViewをはめこんで終了です。
View drawView = new CharDrawView(this);
setContentView(drawView);

えっと、なんでこういう実装にしたかというと、
本来日本語(漢字のほうがただしいかな?)って縦書き文化なんですよ。
升目に分けて整列して書くものなので、
Viewを四画にわって配置していくのが適切じゃないかな、と。

もちろん、文字数が増えたり、行数が増えたらまたかわってくるのですが、
それはまたの機会にでも。

2011年6月5日日曜日

[Scala] UIっぽいものをつくってみたんだぜ。

ScalaはJavaのものが使えるので
GUIプログラミングにはSwingかしら?とおもって
使ったことも無いSwingにチャレンジしてみた。
って、会社にScalaの本をわすれた・・・。
ので、今日はとってもJavaチックになるはず。

Swingについては基本的にはこのページを元に。
Swingを使ってみよう

で、今回は
チェックボックス3つとボタン1つ。
まー、フォームをつくるのが理想なんですが、
とりあえずUIを。

構造としては、
1.まずはフレームを作る。

    val frame = new JFrame()
    frame setSize new Dimension (640, 480)
    frame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

もうなんかJavaっぽい。

2.つづいて、フレームからパネルを取得する

   val contentpane =  frame getContentPane();

3.パネルをつくる

   val panel = new JPanel()

4.部品をつくってパネルに追加していく
    val hogeCheck1 = new JCheckBox("ほげ1",true)
    val hogeCheck2 = new JCheckBox("ほげ2",false)
    val hogeCheck3 = new JCheckBox("ほげ3",false)
    panel add(hogeCheck1)
    panel add(hogeCheck2)
    panel add(hogeCheck3)
    
    val button = new JButton("実行")
    button setPreferredSize(new Dimension(200, 100))
    panel add(button)

5.つくったパネルをフレームにいれて表示
    contentpane add(panel, BorderLayout.CENTER);
 
    frame setVisible true

これで実行すると
チェックボックスが3つとボタンが1つ表示されます。

書き方がとってもJavaっぽいんだけど、まー、いいか。

2011年6月2日木曜日

[Scala]ScalaでPostgreSQLを操作する - ファイル出力編

さきほどのPersonデータを取得したのですが、
やはりテキストなりなんなりに落とさなくてはならなくなったので
とりあえずCSVに吐き出す処理をくっつけました。

ぶっちゃけ(キムタク)、さきほどのプログラムの
Console.scalaに以下を入れるだけですが。

// ファイル処理
val file = new File("hogehoge.txt")
val bw = new BufferedWriter(new FileWriter(file))
using(new PrintWriter(bw)) { pw =>
 for(i <- 0 to list.length -1){
  val str = list(i).name + "," + list(i).mailAdderss
  pw.println(str)
 }
}

はい、えーっと、Control.scalaを使いまわしています。
ちなみに私はEclipseなんで、何も指定していないとプロジェクトの直下にhogehoge.txtができます。
(マイコンから見るとできてる)
便宜上似非CSVにしてみました。

[Scala]ScalaでPostgreSQLを操作する - ごにょごにょ編

さて、環境もできたのでごにょごにょしましょう。
今回はJDBCを使用してPostgreSQLを操作します。
通信とかDB周りってぜーんぜん詳しくないので(笑)
ツッコミどころがおおくてごめんね☆

さて、まずは自作関数を。
Scalaプログラミング入門という本を使って書いてみます。

DBをいじる際に重要になるのはやっぱりOPEN/CLOSEなので
そのあたりを軽くしてみるのでこんなものを。

Control.scala
object Control {
  def using[A <: {def close(): Unit}, B](param: A)(f: A => B): B =
    try {
      f(param)
    } finally {
      param.close()
    }

    import scala.collection.mutable.ListBuffer
    def bmap[T](test: => Boolean)(block: => T): List[T] = {
      val ret = new ListBuffer[T]
      while(test) ret += block
      ret.toList
    }
}

教科書のまるぱくり。いえいえ、写経ですから。
上のコードではusingという関数をつくってますね。
これは読んだらとじてくれます。finallyわすれをしないためですね。

つづいての関数はSQLで取得したアイテムをListに落としてくれるためのものです。

自作関数はできたので、使用例を。


Person.scala
case class Person(name:String,mailaddress:String)

object Person {
  import Control._
  import java.sql._
  
  def selecter(conn : Connection) : List[Person] = 
    using(conn.createStatement) {st =>
      using(st.executeQuery("select name, mailaddress from PersonDB")) { rs =>
        bmap(rs.next) {
          new connectionDB(rs.getString("name"), rs.getString("mailaddress"))
        }
      }
    } 
}

すごーくすっきりなものになりました。
ここでは実際のSQL文を書いております。
そして取得したフィールドをListにして返却してますね。


さらにこれを使用します。
教科書はここから書いてなかったのでここからは素人的な書き方になります。

Console.scala
object Console {
  import connectionDB._
  import java.sql.DriverManager
  
  def main(args: Array[String]): Unit = {
    Class.forName("org.postgresql.Driver")
    val db = DriverManager.getConnection(
   "jdbc:postgresql://{ホスト名}/{データベース名}",
   "{アカウント}",
   "{パスワード}")
 val list = selecter(db)
 db.close
    
 list.foreach(i => println(i))
 
  }

}

取得したリストをコンソールに表示するだけの簡単なお仕事。
なんですが。ものすごーく初心者のような書き方になっています。
もっと腕をあげたいですね。

実行すると
Person(hoge,hogehoge@hoge.com)
というような出力をされますよ。

[Scala]ScalaでPostgreSQLを操作する - 導入編

まずはPostgreSQLの環境を作ります。
http://www.postgresql.jp/PostgreSQL

windows7はここからダウンロードしてインストーラーを実行
パスワードを聞かれたら自分がすきなものをいれましょう。これはローカルDBのパスワードになります。
postgresを推奨。
あとでわからなくなるので。

それから、今回はScalaでJDBCドライバを使用するので
http://jdbc.postgresql.org/download.html
ここから最新Verをとってくる

Current Versionでかまいません。

jarをおとしたら適当な箇所に保存しておきます。

続いてEclipseを起動して
Scalaのプロジェクトを作成。

プロジェクトを右クリックして「properties」を開きます。
「Java Build Path」を選択して「Libraries」を選択します。

「Add External JARs...」から先ほど保存したjarを選択します。

これで準備完了。
あとはだらだらコードを書きましょう。

2011年6月1日水曜日

[Android]Widgetをエレガントにする

さて、昨日はWidget(ウィジェット)を配置してみました。
これですね。






















小さい!!(笑)
格好悪いので本来の形にもどしてみましょう。






















本来の形になりました。
ちなみにこれは
画像ファイルの大元をいじっているわけではなくて、dipをいじっているだけですが。
dipってなんぞ?
density-independent pixels の略です。直訳すると「密度に依存しないピクセル」なんだそうです。
このあたりの詳しいことは @yanzm さんという人が綺麗にまとめてくださっているのでどうぞ。

Y.A.M の 雑記帳
Android Dimension 単位

さて、dipの意味はわかりましたでしょうか?
続けます。

Androidの場合は1マスは縦横で74dipx74dipとなりますが、
実際に描画できる範囲は-2dipをひいたものになります。
すなわち、72dipx72dipということになりますね。

前回ではそれを踏まえたうえで xmlフォルダ内のappwidget.xmlの一部(縦横サイズ指定箇所)を

android:minHeight="72dip"
    android:minWidth="72dip"

としていました。
これだと1マス分しか指定していないので先ほどの不幸が訪れるわけです。
では、3マスにするにはどうすればいいのか?

先ほどの74dipという数字を使って算出します。
公式はこちら。

(74 * 描画マス分)- 2

今回は3マスなので

(74dip * 3マス) - 2dip = 220dip

となります。
縦は1マスなのでそのままを使用します。
というわけで

android:minHeight="72dip"
    android:minWidth="220dip"

とします。
これで実行すると























こんなようにいい感じになります。
さらにウィジェットにはサイズを指定することでもっとエレガントになる方法があるのですが、
やっぱり長くなるので気が向いたときに書きますな。

2011年5月31日火曜日

[Android] Widgetだけを作ってみる

どうでもいいですが、会社から「ちゃんと勉強しているのかい?」ときかれました。
レポート書く暇もなんかめんどくさいので
このblogをさらすことにしましたよ。ふふ。

そんな前書きはともかく今日は「Widget」について。
Widget は 「ウィジェット」と読みます。下噛む。

ウィジェットを作ってみようと思います。
最初なのでなにも起こらないウィジェットを作ります。

1.ウィジェットのレイアウトXMLを作る。
ウィジェットのデザインを考えてまずは見た目から入ります。
「drawable」 直下に適当な画像を置き、
「layout」直下に適当なレイアウトwigetLayoutのXMLファイルを作ります。

見本。
appwidget.xml



    
    


長いですが、ただdrawableの中にあるbuttonsっていう画像を表示させているだけです。

で、次にいきます。

2.widgetのXMLを定義する
WidgetProviderを使うのでXMLを定義します。
何を書くのかというと「こんなデザインで○分ごとに更新されます」というようなことです。

見本。
appwidget.xml(めんどくさいのでファイル名は一緒)





これは1で作ったレイアウトXMLを使用しています。
注目はここ。

android:updatePeriodMillis="0"

これは更新感覚です。Millisっていうことなので秒数を表しています。
今回は更新もしないウィジェットなので0で。

3.AppWidgetProvider を実装する
続いてはjavaです。コードに入っていきます。
今回はなにもしないウィジェットなのでこんな感じで。

見本。
appwidget.java(めんどくさいのでファイル名は一緒)

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class appwidget extends AppWidgetProvider {
 
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
  super.onUpdate(context, appWidgetManager, appWidgetIds);
 }
 
 @Override
 public void onEnabled(Context context) {
  super.onEnabled(context);
 }
 

 
 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
  super.onDeleted(context, appWidgetIds);
 }
 
 @Override
 public void onDisabled(Context context) {
  super.onDisabled(context);
 }
 
 @Override
 public void onReceive(Context context, Intent intent) {
  super.onReceive(context, intent);
 }

}

単純にAppWidgetProviderを継承して親メソッドを呼んでいるだけです。
本当に、なにもしません。

4.最後にAndroidmManifest.xmlに追記する
最後はAndroidManifest.xmlに追記します。ウィジェットなのでAcitityではないので注意。
画面に張り付いてじーっとまっているという感じなので
処理を受け取るReceiverを使います。

見本。
AndroidManifest.xml


    

    
        
            
                
            
            
            
        

    


作成のポイントとして。
まずはmeta-dateでwidgetを使うよ、と定義します。

        


そして次にIntent-filterで先ほどmeta-detaで定義した名前を使用して受け取る準備をします。


                            


今回は単純なものなので更新時を受け取ります。
が、更新しないウィジェットなので意味はないですが、入れておかないと使えないので・・・。

で、実行してウィジェットを貼るとこんな画面になります。























小さい!!(笑)
これは単純に解像度(図のファイルは横3縦1なのに、レイアウトファイルでは横1縦1にしている)の問題なのですが・・・
長くなるのでまた今度。

2011年5月23日月曜日

[Android] アプリの背景色を設定した後のToastの背景色がおかしくなるのをなんとかする。

Androidのアプリを作成した際に
背景色などを固定したとする。

style.xml


    


androidManifest.xml(一部)


        
            
                
                
            
        
        
    


これで背景色と文字色がアプリケーション単位で固定できるのですが、
うっかりToastまでこんなことになります。






















Toastの透過の問題なのかどうだかしりませんが、
コードはこんな感じのいたって普通。
Toast.makeText(this, "ほめてくれてありがとう", Toast.LENGTH_LONG).show();

この1行だけであの大惨事・・・。
リファレンスにも特にToastに関することはなにもかかれていない。
それでもなんとか、Toastに「setView()」なるものを発見したので
諦めて1つViewを作成することにしました。

といっても、XMLには詳しくないので
コードでゴリゴリと。

こんなメソッドを作成。

public View makeToast(String message) {
  TextView text = new TextView(this);
  text.setBackgroundColor(Color.WHITE);
  text.setText(message);
  text.setPadding(5, 5, 5, 5);
  
  return text;
 }

これだとstring.xmlが使えなくてしょうもないので書き変えてみる。
public View makeToast(int messageId){
  TextView text = new TextView(this);
  text.setBackgroundColor(Color.WHITE);
  text.setText(messageId);
  text.setPadding(5, 5, 5, 5);
  
  return text;
 }

で、実際にToastを使用するところでこうする。
Toast toast = new Toast(this);
   toast.setView(makeToast("ほめてくれてありがとう"));
   toast.show();

string.xmlに定義している文字列を使うときはこうする。
Toast toast = new Toast(this);
   toast.setView(makeToast(R.string.talk_atama1));
   toast.show();
(ID名のセンスがない。すまん)

要するにViewを継承しているTextViewを自前で作成して
ToastのViewとしてセットして表示しているだけです。
実際にはこんな感じのポップアップになります。




















純粋なToastみたいな角丸なものにするには
もうちょっとこったものにしたりとかする必要があるのですが、
応急処置としてこちらをつくってみました。
いくらなんでも背景色にとけこんだToastがでてくるとがっかりだよね、ということで。

2011年5月19日木曜日

[Java]RSSを読み込んで表示するプログラムをさっくり作る

すごーく前のエントリで「bot」をつくってます☆
とかいたとおもいますが、かなり進んでいません。
というのも、DBを扱わないといけなくて、そこで躓いているんですが。
まー、それもよくないなと思って、とりあえずできることからはじめてみます。
Yahoo!天気情報でRSSが提供されているのでそこから天気情報を取り込むプログラムをつくることにしました。
Yahoo!天気情報提供RSSについてはこちら

ではさっそくJavaでさくさくと。
東京都の天気を読み込むものをつくってみました。

まずは面倒なのでRSSのアドレスを定義します。

private static final String RSS_URL= "http://rss.weather.yahoo.co.jp/rss/days/13.xml";

続いてDocumentにRSSの情報をパースします。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  
   DocumentBuilder builder = factory.newDocumentBuilder();
   
   Document document = builder.parse(RSS_URL);

読み込んだXMLに対して要素を抜き出していく感じですね。
いきなり飛び越しで読み込めないので
順番を追って読み出します。
個人的には"title"と"description"が必要なのでそちらだけを読み込みます。

// ドキュメントのルートを取得
   Element root = document.getDocumentElement();
   
   // ルート直下の"channel"に含まれるノードリストを取得
   NodeList channel = root.getElementsByTagName("channel");
   
   // "channel"直下の"title"に含まれるノードリストを取得
   NodeList title = ((Element)channel.item(0)).getElementsByTagName("title");
   
   // とりあえず出力する
   System.out.println("タイトル:" + title.item(0).getFirstChild().getNodeValue());
   
   // 各"item"とその中の"title"とを取得する。     
   NodeList item_list = root.getElementsByTagName("item");
   
   // item分ループする
   for(int i = 0; i < item_list.getLength(); i++) {
    
    Element element = (Element)item_list.item(i);

    // title を取得する
                NodeList item_title = element.getElementsByTagName("title");
                // description を取得する
                NodeList item_description = element.getElementsByTagName("description");

                // 出力する
                System.out.println(item_title.item(0).getFirstChild().getNodeValue());
                System.out.println(item_description.item(0).getFirstChild().getNodeValue());
                
   }
もちろん、try-catchで囲まないといけないので実際のソースはこうなります。
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


public class RSS_Test {

 private static final String RSS_URL= "http://rss.weather.yahoo.co.jp/rss/days/13.xml";
 
 public static void main(String[] args) {
  
  try {
   
   DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  
   DocumentBuilder builder = factory.newDocumentBuilder();
   
   Document document = builder.parse(RSS_URL);
   
   // ドキュメントのルートを取得
   Element root = document.getDocumentElement();
   
   // ルート直下の"channel"に含まれるノードリストを取得
   NodeList channel = root.getElementsByTagName("channel");
   
   // "channel"直下の"title"に含まれるノードリストを取得
   NodeList title = ((Element)channel.item(0)).getElementsByTagName("title");
   
   // とりあえず出力する
   System.out.println("タイトル:" + title.item(0).getFirstChild().getNodeValue());
   
   // 各"item"とその中の"title"と"description"を取得する。     
   NodeList item_list = root.getElementsByTagName("item");
   
   // item分ループする
   for(int i = 0; i < item_list.getLength(); i++) {
    
    Element element = (Element)item_list.item(i);

    // title を取得する
                NodeList item_title = element.getElementsByTagName("title");
                // description を取得する
                NodeList item_description = element.getElementsByTagName("description");

                // 出力する
                System.out.println(item_title.item(0).getFirstChild().getNodeValue());
                System.out.println(item_description.item(0).getFirstChild().getNodeValue());
                
   }
   
   
  } catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
 }

}
で、取得したデータはこんな感じになります。
タイトル:Yahoo!天気情報 - 東京都の天気
【 19日(木) 東京(東京) 】 晴時々曇 - 24℃/16℃ - Yahoo!天気情報
晴時々曇 - 24℃/16℃
【 19日(木) 伊豆諸島北部(大島) 】 晴れ - 23℃/15℃ - Yahoo!天気情報
晴れ - 23℃/15℃
【 19日(木) 伊豆諸島南部(八丈島) 】 晴時々曇 - 23℃/16℃ - Yahoo!天気情報
晴時々曇 - 23℃/16℃
【 19日(木) 小笠原諸島(父島) 】 曇後雨 - 24℃/22℃ - Yahoo!天気情報
曇後雨 - 24℃/22℃
[PR] 「東日本大震災」に関する情報
「東日本大震災」に関する情報

[PR]ってなんだろ・・・(汗)
とりあえず、こんな感じで。

2011年5月18日水曜日

[Android]ボイスレコーダを作成する

今日はボイスレコーダ(簡易)を作成してみようと思います。
音声データを録音するにはMediaRecorderを使用します。

このMediaRecorderは順番どおりに使用しないと使えないという厄介な代物。
順番を簡単に書くとこんな感じです。
1.インスタンスを作成
2.入力ソースの設定
3.記録フォーマットを設定
4.音声コーデックを設定
5.出力パスを設定する
6.録音準備
7.録音開始
8.録音の停止
9.レコーダの状態をリセット
10.レコーダリソースを解放

案外手順が多いですね(汗)
というわけで順番に見ていきましょう。

と、まず今回は
マイクからの入力とSDカードの出力を行うのでパーミッションを指定します。
AndroidManifest.xmlに以下を追記します。

    
    

それでは解説いってみます。

0.まずは変数として定義します。
onDestroyでも使用するのでメンバ変数(クラス内で定義)として定義します。

    private MediaRecorder mRecorder;

1.インスタンスを作成
        // MediaRecorderのインスタンスを作成
        mRecorder = new MediaRecorder();

2.入力ソースの設定
通常はマイクからなのでマイクを指定します。
このあたりは使用する端末によりけりですが、だいたいはマイクです。
        // マイクからの入力とする
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

3.記録フォーマットを設定
対応しているフォーマットは端末スペックによりますが、
だいたいは3GPPですね。
        // 記録フォーマットを3GPPに設定
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

4.音声コーデックを設定
コーデックもいろいろある(はず)ですが、
ここではAMR-NBを使用。
        // 音声コーデックをAMR-NBに設定
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

5.出力パスを設定する
作成したファイルをどこに出力するかを設定します。
今回はSDカード直下に設定。(ファイル名を変えないと上書きされます)
        // 出力ファイルパスを設定
        mRecorder.setOutputFile("/sdcard/audio_sample.3gp");

6.録音準備
いよいよレコーダーの準備です。
エラーがでてはいけないので、try-catchで囲みます。
        try {
         // レコーダーを準備
         mRecorder.prepare();
         
        } catch(IllegalStateException e) {
         e.printStackTrace();
         
        } catch(IOException e) {
         e.printStackTrace();
        }

7.録音開始
実際に録音するときはこのメソッドを呼ぶだけ。
 // 録音開始
 mRecorder.start();

8.録音の停止
9.レコーダの状態をリセット
停止するときはエラーが起きてはいけないのでやはりtry-catchで囲みます。
停止したら再利用できるようにレコーダの状態をリセットします。
 try {
  // 録音停止
  mRecorder.stop();
  // 再使用に備えてレコーダーの状態をリセット
  mRecorder.reset();
    
 } catch(IllegalStateException e) {
  e.printStackTrace();
 }

10.レコーダリソースを解放
アプリケーションを終了するとき(Activityの終了時)にリソースを解放します。
これを忘れないように注意。
 @Override
 protected void onDestroy() {
  super.onDestroy();
  // 使わなくなった時点でレコーダーリソースを解放
  mRecorder.release();
 }

以上で一通りができます。
以下のコードは私が実際にかいたものです。
ボタンを押したら録音を開始します。同じくボタンを押したら終了します。
同じボタンを使用しているのフラグで制御していますよ、と。
import java.io.IOException;

import android.app.Activity;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class VoiceAcitivity extends Activity {

 private MediaRecorder mRecorder;
 private boolean mRecordingFlag = false;
 
 
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // MediaRecorderのインスタンスを作成
        mRecorder = new MediaRecorder();
        
        // マイクからの入力とする
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        
        // 記録フォーマットを3GPPに設定
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        
        // 音声コーデックをAMR-NBに設定
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        
        // 出力ファイルパスを設定
        mRecorder.setOutputFile("/sdcard/audio_sample.3gp");
        
        try {
         // レコーダーを準備
         mRecorder.prepare();
         
        } catch(IllegalStateException e) {
         e.printStackTrace();
         
        } catch(IOException e) {
         e.printStackTrace();
        }
    }
 
 public void onClickRecordingButton(View view) {
  
  Button recordButton;
  recordButton = (Button) findViewById(R.id.recodingButton);
  
  // 録音状態判定
  if(!mRecordingFlag) {
   // 録音開始
   mRecorder.start();
   // ボタンテキスト変更
   recordButton.setText("■");
   // フラグを変更
   mRecordingFlag = true;
  } else {
   try {
    // 録音停止
    mRecorder.stop();
    // 再使用に備えてレコーダーの状態をリセット
    mRecorder.reset();
    // ボタンテキスト変更
    recordButton.setText("●");
    // フラグを変更
    mRecordingFlag = false;
    
   } catch(IllegalStateException e) {
    e.printStackTrace();
   }
  }
  
  
 }
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
  // 使わなくなった時点でレコーダーリソースを解放
  mRecorder.release();
 }
 
}

2011年5月17日火曜日

[Android]テキストデータをSDカードに保存する

今回のアプリではあまり使わない機能ですが、一応実装します。
SDカードにテキストボックス内のテキストを「.txt」形式にて保存する方法です。

まずはファイルパスの設定を行います。


// SDのパス設定
     String filePath = Environment.getExternalStorageDirectory().getPath() + "/" + SD_FOLDER + "/" + SD_FILE ;
     // 時刻取得
     Calendar calendar = Calendar.getInstance();
     // yyyyMMddhhmmssファイル名.txtになるようにする
     filePath = filePath + calendar.get(Calendar.YEAR) + (calendar.get(Calendar.MONTH) + 1) + calendar.get(Calendar.DAY_OF_MONTH) + "_"  
         + calendar.get(Calendar.HOUR_OF_DAY) +  calendar.get(Calendar.MINUTE) +  calendar.get(Calendar.SECOND) + FILE_TYPE;

     // ファイル生成
     File file = new File(filePath);
     // ディレクトリ生成
        file.getParentFile().mkdir(); 

そうそう、SDカードを使用するにはパーミッションが必要です。
以下のコードをAndroidmanifest.xmlに追記してください。


そしていよいよ書き込み。

FileOutputStream outputstream;
        try {
         outputstream = new FileOutputStream(file, true);
            OutputStreamWriter streamWriter = new OutputStreamWriter(outputstream, "UTF-8");
            BufferedWriter bufferedWriter = new BufferedWriter(streamWriter);
            String writeText = ((EditText) findViewById(R.id.inputText)).getText().toString();
            // 書き込み
            bufferedWriter.write(writeText);
            bufferedWriter.flush();
            bufferedWriter.close();
            Toast.makeText(this, filePath.toString() + " に保存しました。", Toast.LENGTH_LONG).show();
         
        } catch (Exception e) {
         // 書き込み失敗などの例外
         Toast.makeText(this, "書き込み失敗", Toast.LENGTH_LONG).show();
         
        }

画面にすると地味ですが、こんな感じになります。

[Android]ほかのアプリに文字列情報を渡す

今回は「共有」ボタンをつけてみました。
なんか完成まであと少しといったところでしょうか。

Intentを用意して
ActionにACTION_SENDを設定します。
すると、ACTION_SENDを受け取れるアプリ一覧が表示されます。

コードにするとこのような感じです
    // インテントの設定
     Intent send = new Intent();
     // ACTION_SENDをセットする
     send.setAction(Intent.ACTION_SEND);
     send.setType("text/plain");
     // テキストの設置
     send.putExtra(Intent.EXTRA_TEXT, mInputText.getText().toString());
     try {
      // アクティビティ起動
      startActivity(send);
     }catch(android.content.ActivityNotFoundException e){
      // 渡すアプリが存在しないときの処理
      Toast.makeText(this, R.string.share_error, Toast.LENGTH_SHORT).show();
     }


画面だとこんなものがでます。




















ACTION_SENDをうけとれる設定がされているアプリならどれにでも渡すことができます。
エミュレータだと自作で作るか、
SMSが対応しています。
エミュレータの標準のままだとSMSアプリが起動します。





















テキストが渡されます。
これでちょっと便利になった感じですね。

[Android]クリップボードに文字列をコピーしてみた。

テキストボックスに文字入力を行い
特定の文字列を付加して返却するアプリをつくっているのですが、
やっぱりコピー機能は必須だと思ったので、実装してみました。

コピーにはクリップボードマネージャーを使います。
クリップボードにテキストをコピーするということですね。

コードとしてはこんな感じです。
// クリップボードマネージャーを宣言
     ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); 
     
     // クリップボードへ値をコピー
     clipboard.setText(mInputText.getText().toString());
     
     // メッセージ
     Toast.makeText(this, "夜のクリップボードにコピーしました", Toast.LENGTH_SHORT).show();

実際の画面だとこんな感じ

まずは文字を入力





















続いてコピーボタンを押して文字列をクリップボードにコピー






















端末内に保持されているので別のアプリでも使用できます。
画像ではSMSアプリで使用しています。





















貼り付けるとこんな感じです。




これでいい感じにコピーできますよ。

2011年5月16日月曜日

[Android]アラートダイアログの使い方

今日はアラートダイアログ(AlertDialog)について書きます。
アラートダイアログというのはこんな感じのポップアップです。
よく処理前の確認とかに使われるポップアップですね。





















~をします
〔OK〕

とかそういう感じに。

使い方は AlertDialog.Builder を生成します。

// アラートダイアログビルダーを生成
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

AlertDialog.BuilderはAlertDialogの構成を決めるものです。
ここでメッセージやボタンを配置します。

メッセージ
// アラートダイアログのメッセージを設定します
alertDialogBuilder.setMessage("夜の言葉に変換します。");

ボタン
// アラートダイアログのOKがクリックされた時に呼び出される処理を登録
        alertDialogBuilder.setNeutralButton("OK",
          new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                     // 処理
                     Toast.makeText(getApplication(), "OKが押されたよ", Toast.LENGTH_LONG).show();
                    }
                });

ボタンには「Positive」「Neutral」「Negative」の三種類がありますが、
直訳すると「肯定」「中立」「否定」となります。
なにがどうちがうのかは不明ですが、たいして動きも変わらない気がするので
個人的には「OK」のときには「Positive」でNGのときには「Negative」を使ってます。

ダイアログの構成を整えたら、実際にダイアログを生成して表示します。
// アラートダイアログを生成
AlertDialog alertDialog = alertDialogBuilder.create();
        
// アラートダイアログを表示します
alertDialog.show();

案外「.show()」は忘れてしまうので注意しましょう。(Toastと同じですね・・・)

ちなみに一番上の見本のダイアログはこんな感じのコードです。
// アラートダイアログビルダーを生成
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
     
     // アラートダイアログのタイトルを設定します
        alertDialogBuilder.setTitle("夜のアプリ");
        // アラートダイアログのメッセージを設定します
        alertDialogBuilder.setMessage("夜の言葉に変換します。");

        // アラートダイアログのOKがクリックされた時に呼び出される処理を登録
        alertDialogBuilder.setNeutralButton("OK",
          new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                     // 処理
                     Toast.makeText(getApplication(), "OKが押されたよ", Toast.LENGTH_LONG).show();
                    }
                });
        
        // アラートダイアログのNGがクリックされたときに呼び出される処理を登録
        alertDialogBuilder.setNegativeButton("NG",
             new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {
                        // 処理
                        // キャンセルなのでなにもしない
                       }
                   });
           

        // アラートダイアログがキャンセル可能かを登録
        alertDialogBuilder.setCancelable(true);
        
        // アラートダイアログを生成
        AlertDialog alertDialog = alertDialogBuilder.create();
        
        // アラートダイアログを表示します
        alertDialog.show();

タイトルとキャンセルボタンを追加してます。
確認ダイアログっぽいですね。

[Android]背景にグラデーションをかける。

いろいろ勉強していると、カテゴリがごたごたになるので
ラベルのほかにもプレフィックスをつけることにしました。

今日は背景にグラデーションをかける方法を勉強したので記録します。

1.まずはdrawnableのフォルダをつくる
2.drawnableにbackground.xmlを作成する

以下のコードを記述

  


このままコピーアンドペーストすると
オレンジ→黄色のグラデーションがかかります。
(3丁目の夕日みたいなかんじですね)

このコードの意味なのですが、
まずは長方形を描きます。
その長方形に対して
オレンジから黄色へ
グラデーションをかけています。

angle="270"というのは
長方形に対してグラデーションをかける方向をさしています。

90にすると
下から上へとグラデーションがかかります。




















90だとこんな感じ。


180にすると
右から左へとグラデーションがかかります。




















180だとこんな感じ。

270にすると
上から下へグラデーションがかかります。
(なので、意味合いとしては270にするとわかりやすいですね)




















270だとこんな感じ。


360にすると
左から右へとグラデーションがかかります。




















360だとこんな感じ。


3.つくった背景をLayoutに適用させます。
Layoutのファイルを開き、
xmlのLayoutの属性に以下を追記します。


今回はLinearLayout単体にかけてますが、manifestファイルにて全体にかけることも可能です。

参考URL
Androidアプリの公開前に必要な諸作業
~速習! Androidアプリケーション開発(7)~

2011年5月5日木曜日

読書記録 - スティーブ・ジョブズ 超仕事力


スティーブ・ジョブズ 超仕事力
竹内一正 著

スティーブ・ジョブズと聞くとプレゼンテーションの本が思い浮かぶが、
本書はプレゼンテーションの本ではない。
ジョブズがこれまでアップル社でおこなってきた
経営術をまとめた本である。

まずはどの観点から商品を生み出すかというところから始まる。
本書の冒頭ではジョブズが自分主義だと書かれている。
自分がほしいと思う商品をジョブズはつくりだしている。
その欲求に彼は妥協せずに細かいところにまでこだわって作り出す。

そしてつくりだされた商品を最大のプレゼンテーションをもってして世に出す。
ジョブズは最初からプレゼンテーションが上手なわけではなく、
まるで演劇のように入念な準備や稽古をつんで舞台にあがった。
もちろん、その挑戦には偉大なる指導者を迎えて。

ジョブズが成功した理由として、本書からよみとれるのは
彼は「一流から学ぶ天才」だったことだ。
広告戦略にしても、事業経営にしても、彼は一流の人間を自分の味方にひきいれた。
そして一流の良いところを生かし、自らはそれを学習していた。

平気で「盗める」人こそ最高の独創人間

と本書ではかかれているが、まさにそのとおりである。
自分の専門外のことは、専門の人間から教わるべきである。
そして教わるべきは一流の人間から。
常に自分の周りに一流の人間ととどめておくことが成功の秘訣ではないだろうか。

そして次に重要なこととして失敗からすぐに立ち直ることの重要性だ。
ジョブズは一般的には成功者といわれているが、
実は事業の失敗はかなり多い。
しかし、彼の精神力は決してよわくなかった。
失敗からはすぐに立ち上がり、次の手段を考え出している。
さらに、同じ失敗は絶対に繰り返さない。

最後は「仕事を義務と思うか、楽しみと思うか」ということにも触れている。
ジョブズはいかに有能な人間をひきつけるかと同時に
ひきつけた有能な人間から生み出される有能な人間に期待をしている。
仕事は「楽」にはできない。しかし、「楽しみ」にはできる。
この言葉こそが、有能な人間を生み出す秘訣となるのではないだろうか。

自分の信念を貫くために
一流の人間から技術を学び
一流の人間をひきつけ、
一流を育てる。

彼の周りには一流の人間しか存在しない。
一流をおくこと。本物しかみないことが、彼の仕事力の真髄ではないのだろうか、と筆者は考えるのである。

2011年5月4日水曜日

渋谷scala 勉強会第32回 at 渋谷某社

そんなわけで今日は渋谷scala勉強会にいってきました。
その形跡が今日の記事なんですけど、
午後からなにしていたかというと、
某Webページから天気予報をとってくるものをつくろうかとおもったのですが、
天気予報が提供されていなかったので
災害情報にある電気予報をとってこようとおもいました。

まぁ、いってしまえばXMLのパーサなんですけど、
Javaでもくんだことがないので、
とりあえずJavaでXMLパーサをつくろうと思ったのですが、
案外難しかったので
半分つくったところで(リクエストは通ってdoumentに変換するところまで)
時間切れ。

うーむ、実力不足を実感します。

帰宅してちゃんとつくってから
Scalaでも組んでみて比べてみようかと思います。

そんなわけで渋谷Scalaに参加された皆様おつかれさまでした~。
また参加したいですね。
Scalaも時間があればどんどん触っていこうと思います。

って、こうやって手を伸ばす範囲が広くなるから、
時間がおいつかないのだけども(汗

渋谷Scala 第32回のATND

渋谷Scalaのページ


興味のある方はどうぞ。

ScalaでHello Worldを実行する(Eclipse編)

というわけでいろいろすっとばして
EclipseでHello Worldを出力することにしました。
良い子はちゃんとテキストエディタなりなんなりで1からやったほうがよいかとおもいます。
修行は腹筋背筋からスタートなのです。
私はめんどくさがりなので準備運動なしで100mを全力疾走しますが。

前置きはさておいて、
EclipseでScalaを書くには

File -> New -> Other -> Scala Wizards -> Scala Project

の順でプロジェクトを作ります。
プロジェクト名は適当なのですが、ここでは適当すぎる名前として
mogatest1
と入力します。
あとはデフォルトのまま「finish」を選択すると
プロジェクトが生成されます。

プロジェクトの中身を見ると
空のsrcフォルダ(通常ソースファイルが入っているフォルダ)ができるので
右クリックで

New -> Scala Application

と選択して適当に名前をつけて
.scalaファイルを作成します。

こんな感じのコードが自動生成されます。

object Hello2 {
  def main(args : Array[String]) : Unit = {}
}

Javaアプリケーションということなので
mainの中にいろいろ処理を書いていけばいいのかな?ということで
このように書き換えてみました。

object Hello2 {
  def main(args : Array[String]) : Unit = {
   
   // 追加
   println("Hello World");   
  }
}

ここまでできたらコンパイルして
Java アプリケーションとして実行。

するとコンソールに

Hello World

が表示されます。

これでEclipseだと完了かな?

ObjectやClassについてはまたこんど。

ScalaでHello Worldを実行する(インタープリター編)

開発環境は完璧になったので
さっそくHello Worldをかいてみよう!!とおもったのですが、
借りた本の中には
「まずはインタープリターで」と記述があったので
教科書に則ってインタープリターでやってみることにする。

まぁ、初心者ですから。

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

$ scala

と入力すると

Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_18)
.
Type in expressions to have them evaluated.
Type :help for more information.

と表示されて

scala>

と、入力待ち状態になる。
ここで

scala> 1 + 2

と入力してみると

res0: Int = 3

のような結果が返却される。
Int型で式の結果が返されるという、簡易電卓かとおもわせるようなことができる。

このインタープリターの状態でHello Worldを出力させるには
JavaのSystem.out.printlnと同等の処理を書けばよい。
つまり、こんな感じ。

scala >  println("Hello World!")

上記はJavaのsystem.out.printlnと同じ役目を果たすので
結果はこうなる。

Hello World!

ひとまずはインタープリターの基礎はこんな感じで。
変数名とかをつけたりもできて
基礎をひととおりやるのはインタープリターでもできるのだが、
面倒なので次のステップにいってみようかとおもう(そして後々これを後悔しそうだな・・・)。
良い子は本のとおりにやったほうがいいでしょう(天気予報風に)

っつか、そもそもScalaってなんぞ?

ちょっとしたきっかけでScalaの勉強会にのりこみ、
参加者様から本を強奪してぱちぱちと開発環境をととのえてブログにかいたりしているのですが、
読んでいる人から見ればそもそもScalaってなんぞ?ってなりますよね、はい。

まぁ、それは私も思っているので、
とりあえず公式のページをみてみました。

The Scala Programming Language

って、英語かよ!!(怒)
嘆いてもしょうがないのでもうちょっと調べてみる。

(30分経過)


調べてみた結果、こんな感じでした。
なお、以下の記述は@mogakanaが独自で調査したもので
若干まちがっているかもしれないのと
口調が乱暴なので注意されたし。つまり鵜呑みにしないでくださいってことですよ。


Scala (スカラ、スカーラー、スケイラなどと発音するが、スカラっていう発音が一般的っぽい?)


オブジェクト指向言語と関数型言語の特徴をぶんどったプログラミング言語。

Javaプラットフォーム上で動作する。というわけでJavaのインストールは必須なのですよ、と。
(過去はもうちょっとたくさんのプラットフォームに対応してたけど
諸般の事情で中断)


小規模なスクリプトから大規模システムまでカバーする・・・らしい。本当か?


Javaとの互換性がある。(まぁ、Javaプラットフォームだし)
実行速度はJavaと同等なのだが、コード量はScalaのほうが少ない。
高水準である。(複雑なコードをかかなくてもいいということ)
静的な型つけである(Rubyとかは動的らしい。このへんがRubyとは違うところ)

とりあえずオブジェクト指向がわかっていれば
書くことはできるが、
エレガントにかくためには関数型言語の感覚を理解しないといけない。

おそらくですが、
両方を勉強しているプログラマにとっては
このコードを組むのがたのしくてたまらないってことですね・・・。
(まぁ、両方完璧に理解してるっていうプログラマってあんまりいないですからね)

勉強にはもってこいでもあり、
大規模なシステムにも使えるので業務にももってこいということでしょうか。


第1回 なぜScalaなのか?  (It pro)

とりあえずここを参照して自分なりに噛み砕いてかいてみました。
実際のコードと比較して載せるとそれはそれでわかりやすく解説できると思うんだけど、
まぁ、まだコード組んだこと無いので

それはまたの機会に。

ScalaのIDEのプラグインについて(主にEclipseです)

開発環境がととのったはずなので
次はエディタなどを整えます。
IDEにプラグインをいれるのですな。
先に公式のページを参照。

私は英語ができないのでなんともかんともですが、
以下のものにサポートしているとのこと。

・Eclipse
・IntelliJ IDEA
・NetBeans

個人的には仕事はJavaなのでEclipseしか使ったことが無いので
迷うことなくEclipseを選択。

Eclipse用プラグインを配布しているページ(ここ)に飛ぶと
真ん中に「Copy update site URL to clipboard」というボタンがあるのでクリックする。
(2011.5.4 現在ではscalaが2.8.1でEclipseが3.5もしくは3.6のものに対応とのこと)

一瞬何の反応もないのでびっくりしますが、
あわてずEclipseを起動して
Help -> New Install software... をクリック。
Add をおして
上の欄は適当な名前(scalaとか)をいれて
下の欄でペースト(ctrl + v)するとURLが入力されます。

http://download.scala-ide.org/update-current

追加してしばらく待つとダウンロード画面に進めます。
3つほど追加するものがでてくるのですが、
全部にチェックを入れてダウンロード&インストール開始。

あとは時の流れに身を任せれば完成です。



他の開発環境については以下の勇者様たちのブログを参照されたし。

Scala 開発環境を準備する - kaishitaeiichiの日記

IntelliJ IDEAでsbtを使う - Ken's evitation

Scalaの開発環境を整える

なぜかいきなりScalaをやることになりました。
というのも、何故かハッカソンにきてしまったので(笑
では、まず開発環境を整えることからはじめましょう。

Windowsの場合

1.まずはJavaをインストールする
JDKをダウンロードします。
Oracleさんのここから左端の「Java」を選択します。
あとはWindows -> I agree のところにチェックをいれて Continue をクリック

jdk-6u24-windows-i586.exe

をダウンロードして実行します。

2.Scalaをダウンロードする
Scala の公式ページへ。
右のメニューにある「Download Scala」をクリック
Windowsの「scala-2.8.1.final.zip」をダウンロードします。
(現時点での最新バージョン ・・・ですが、2.9.0のRC3が公開されたとか?)
ダウンロードしたら適当な場所に展開します。(私はCドライブ直下にしました)

3.パスを通す
展開した中にbinフォルダが存在するので
環境変数のPATHに追加します。
(私の場合はC:\scala-2.8.1.final/bin になるのかな・・・)

パスを通したら
コマンドプロンプトをたちあげて
scala
と打ちます。
するとこんな文言がでます。

Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_18)
.
Type in expressions to have them evaluated.
Type :help for more information.

こんな感じになれば開発環境が整いました。


・・・はず。(つづく)

2011年5月1日日曜日

Saturday Night “IDEA” Fever! at 高円寺ガジェットカフェ

レポートがおそくなりましたが、
先週のヨネミン工作の後に行われたアイデアスケッチのワークショップについてです。

アイデアスケッチは
名前の通りですが、企画などを行う際のアイデアをだすための手法です。

まずはテーマにたいしてざっくりとアイデアをだします。
アイデアは絵をベースに。

今回は制限時間15分で。
私がだしたアイデアはこんな感じ。


万国時計ですね。
国のボタンがあって、押すと対応した国の言語で時間をだしてくれるというものです。
第一回目のアイデアは特に制限はなくおもいついたままをかくというものでした。
(ちなみに私は4枚かいた)

書いたものを発表して、
全員のアイデアを壁に貼り、
それらをみながらまたアイデアを考えます。

2回目のスケッチでは道具に制限をかけてアイデアをだします。
「サインペン」
「黒のマジック(太)」
「赤のマジック(太)」
「灰色のコピック」
まずはサインペンで形をかいて、
太い黒マジックで縁取る。
そして昨日となる部分を赤マジックで塗り、
コピックで質感を出す。

で、かいてみるとこんな感じです。



他の人のアイデアを発展させてかいてみました。
色がかわるパック○ンが麻酔針をだすのですが、
これだけですごく伝わりやすくなるのですよね。
(例のごとく4枚書いた私)

実際の企画会議ではこのように書いていくらしいです。
そして、商品のリサーチを行い
アイデアやリサーチを行ったものにたいして
「タグ」をつけていく。

そうして実用性などをみていき、実際の商品として
プロトタイプを作成していくとのことです。

絵がからむとやっぱり画力がないとだめかな?とおもったのですが、
2回目あたりは道具に制限もあることから
機能面に目がいきますね。

こうやって伝えるのも楽しいし、
わかりやすいなと感心。

今度は一日かけてやるものもやってみたいとおっしゃっていたので
そのときはまたおじゃましたいです。

2011年4月23日土曜日

楽しい電子楽器「ヨネミン」をつくろう♪ at 高円寺ガジェットカフェ

 

本日はガジェットカフェのイベント 「楽しい電子楽器ヨネミンをつくろう」に参加してきました。
はんだづけなどを行うイベントなので女子率が低いかな?とおもって
オシャレもせずいったのですが、会場内は半数が女性!!

少し驚きの世界でした。

ちなみにヨネミンとは米本電音研究所様が販売しておられる電子楽器です。


会場内はこのような感じでした。

すでにこんな状態からスタート。
かすかにうつっている白い紙は私の名札。


レンタルのはんだごて。こちらの商品、かなりお高いそうです・・・。
ふつうのはんだごては下がスポンジになっているそうですよ。
こちらはつけかえるボタンによって温度が変化するそうです。
すごい。



ガジェットカフェの教室はこんな感じ。
中学生時代の技術の教室or家庭科の教室はこんな感じだったなぁ・・・とトオイメ。
ちなみに、隣の人に「技術の授業が~」とはなしたら
「え?!」って顔されました。
その人は技術の授業をしなかったらしいです。地域差かな?



私の「目線おねがいしまーす!!」に答えてくれた、なおかつ勉強会中も
騒がしい私にいろいろアドバイスをくださった講師の米本先生。



本日の材料はこれです。皿がメインになってますが、後ろにちゃんとトランジスタとかありますよ。


正面に座っていらっしゃったお姉さまの素敵な指輪。ツマミをでこったものだそうです。
さ、さすが・・・。


トランジスタ。ちいさい・・・。これにはんだづけをおこないます。
ここがこわれてしまうとおとがでないそうなので慎重にやりました。
コツとしては3秒とめてぱっとはなすことだそうです。なるほど。


わりと完成して、もう音も完璧にでる私のヨネミン。
ぎゅいーんって音がします。スイッチがついているので
右手でスイッチをおしながら左手でボリュームを操作すると
本当に電子楽器に!!
不器用なのにここまでできてしまいました。しかも、わりとあっさり。
ここまでできるようになったときには、すでに被覆を剥くプロになってました。



改造してみました。
ツマミをつけてみたり、部品を追加したり。
ツマミ、大きすぎたかなぁ・・・。


米本先生のハイパーヨネミン。(勝手に命名)
ドレミがちゃんとでます。理論的にはあってる。


そして米本先生の本。回路図などはこちらにのっているそうです。
部品などは秋葉原にうっているそうですよ。


最終的にはスピーカーにつなげてオシロスコープをながめたりしながら演奏もできたので
とても楽しいイベントになりました!!
はんだづけはむずかしいイメージがありましたが、
なれると本当にすばやくできます。

またやりたいなーと思いながら高円寺の夕方はすぎてゆくのです。

みなさまありがとうございました!!