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回目あたりは道具に制限もあることから
機能面に目がいきますね。

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

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