2011年1月25日火曜日

Erlangで行頭に行番号をつけるプログラムをつくってみた。

なんとなくつくってみただけ。
Erlangを普段の業務とかでどれだけ使えるかのテストをかねて。

file_number.erl

-module(file_number).
-export([add_file_number/2]).

add_file_number(Readfile, Writefile) ->
  {OK, S} = file:open(Readfile, read),
  {OK, T} = file:open(Writefile, write),
  X = 1,
  read_line(S, T, X),
  file:close(T),
  file:close(S).

read_line(S, T, X) ->
  case io:get_line(S, '') of
    eof ->
      ok;
    Line ->
      io:format(T, "~w~s~s", [X, " ", Line]),
      read_line(S, T, X+1)
  end.

実行してみる

1> c(file_number).
{ok,file_number}
2> file_number:add_file_number("test.dat", "test2.dat").
ok

一応
行番号がつくこと確認。

そんだけ。

2011年1月13日木曜日

[android]Adapterって何?

Androidでは
ListViewやGallery等で
ArrayAdapterのようなXXXAdapterというものを使用しますが、
このAdapterとは、いったい何なんでしょうか?

AdapterというのはViewとデータの橋渡し役で、
Viewに必要なデータを渡してあげる役割があります。
例えば、
getCount()は、Viewに必要なitemの数、
getItem()は、対応するObjectを返す関数です。
getViewは、Listのアイテムのように、それぞれのitemに対応するView
を作って返します。

以下は、AKB48の総選挙の結果を7位までリスト表示するプログラムです。

HelloListActivity.java

package jp.android.hellolist;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class HelloListActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ListView view = (ListView)findViewById(R.id.list_view);
        HelloListAdapter adapter = new HelloListAdapter(this);
        view.setAdapter(adapter);
    }
}

HelloListAdapter.java

package jp.android.hellolist;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class HelloListAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private AKBData data;

    public HelloListAdapter(Context context) {
        inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        data = new AKBData();
    }

    @Override
    public int getCount() {
        return data.getSize();
    }

    @Override
    public Object getItem(int position) {
        return data.getItem(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list, null);
            TextView tv1 = (TextView)convertView.findViewById(R.id.TextView01);
            tv1.setText(Integer.toString(position + 1));
            TextView tv2 = (TextView)convertView.findViewById(R.id.TextView02);
            tv2.setText(data.getItem(position));
        }
        return convertView;
    }

}

AKBData.java

package jp.android.hellolist;

import java.util.ArrayList;

public class AKBData {
    private ArrayList list;

    public AKBData() {
        list = new ArrayList();
        list.add("大島優子");
        list.add("前田敦子");
        list.add("篠田麻里子");
        list.add("板野友美");
        list.add("渡辺麻友");
        list.add("高橋みなみ");
        list.add("小嶋陽菜");
    }
    
    public int getSize() {
        return list.size();
    }

    public String getItem(int index) {
        return list.get(index);
    }
}

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"
    >
<ListView  
 android:id="@+id/list_view"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    />
</LinearLayout>

list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
 android:id="@+id/LinearLayout01"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="horizontal"
 xmlns:android="http://schemas.android.com/apk/res/android">
 <TextView 
  android:text="@+id/TextView01"
  android:id="@+id/TextView01"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginRight="10dip" />
 <TextView
  android:text="@+id/TextView02"
  android:id="@+id/TextView02"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</LinearLayout>

実行結果

2011年1月10日月曜日

[android]androidのアプリをHTMLで作れるようにする

androidのアプリケーションから
ローカルに保存してあるHTMLを表示させるアプリのサンプルを作ってみました。
WebViewのaddJavascriptInterface()をつかえば、
Javascript から Androidのメソッドを呼び出すこともできます。

ローカルにおくためのHTMLは、
assetsフォルダに保存しておけば、file: でアクセスできます。
(assets/index.htmlだったら、file://android_asset/index.htmlでアクセスできる)

サンプルです。
HelloHTMLActivity.java

package jp.android.hellohtml;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Vibrator;
import android.util.Log;
import android.webkit.WebView;
import android.widget.Toast;

public class HelloHTMLActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WebView wv = new WebView(this);
        wv.getSettings().setJavaScriptEnabled(true);
        MyJSObj jsobj = new MyJSObj(this);
        wv.addJavascriptInterface(jsobj, "myobj");
        setContentView(wv);
        
        wv.loadUrl("file:///android_asset/index.html");
    }
    
    class MyJSObj {
     private Context context;
     
     public MyJSObj(Context c) {
      this.context = c;
     }
     
     public void showToast(String str) {
      Log.d("tag", str);
      Toast.makeText(context, str, Toast.LENGTH_LONG).show();
     }
     
     public void vibration() {
      Vibrator vibrator = (Vibrator)getSystemService(VIBRATOR_SERVICE);
      vibrator.vibrate(2000);
     }
    }
}
addJavascriptInterface()は第1引数はjavascriptにバインドしたいオブジェクト、
第2引数はjavascriptでアクセスするオブジェクトの名前を指定します。

今回は、MyJSObjのメソッドにアクセスできるようにします。
showToast() はただのtoastの表示、
vibration() は2秒間振動します。

Vibratorを使うときは、
android.permission.VIBRATE
の設定を忘れずに。

index.html

<html>
<head>
<title>test content</title>
<script type="text/javascript">
  function showText() {
    myobj.showToast("test");
  }
  function vibration() {
    myobj.vibration();
  }
</script>
</head>
<body>
<div>hello</div>
<input type="button" value="toast" onclick="showText();" />
<input type="button" value="vibe" onclick="vibration();" />
</body>
</html>

実行結果

実行結果はただのHTMLですが、
toastをクリックすればtoastがでて、
vibeをクリックすれば、きちんと2秒間振動することを確認しました。