2011年5月2日月曜日

Objective-Cを学ぶ

以前Objective-Cについて書きましたが、
改めてObjective-Cの書き方をざっとまとめてみます。
下記がわかれば、だいたいソースコードを読めるのではないかと・・・自身ないけど。

.hファイル
@interface クラス名 : 親クラス名 {
    int member1;
    (メンバ変数)
}
- (返り値)メソッド1;
- (返り値)メソッド2:(引数型)引数
- (返り値)メソッド3_1:(引数型)引数1 メソッド3_2:(引数型)引数2
@end
.mファイル

@implements クラス名
- (返り値)メソッド1
{
  メソッド1の処理
}

- (返り値)メソッド2:(引数型)引数
{
  メソッド2の処理
}

- (返り値)メソッド3_1:(引数型)引数1 メソッド3_2:(引数型)引数2
{
  メソッド3の処理
}
@end

メソッドの呼び出しは、
[オブジェクト名 メソッド名:引数];
です。

他には、
ヘッダーの読み込み(includeではなくimport)
#import <UIKit/UIKit.h>
他の場所で定義されたクラスの名前
@class クラス名
があります。

また、アクセッサとして、.hに
@property (nonatomic, retain) UIWindow *window;
.mに
@synthesize window;
と書けば、getter/setterメソッドを自動生成してくれます。


@property (nonatomic, retain) UIWindow *window;
の nonatomic は atomicじゃないので、非同期処理は対応しない、 retainは代入したときに参照カウントを1増やして解放されないようにする、っていう意味っぽいです。

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秒間振動することを確認しました。

2010年11月28日日曜日

Shibuya.lisp テクニカルトーク#6 に行ってきました。

11/28に
Shibuya.lisp テクニカルトーク#6
に行ってきました。

今回のTechnical Talksは非常にアカデミックなにおいがすごいして、
内容も難しい部分が多かったですが、
大変興味深い内容でした。

記号処理言語と記述言語 〜 TAO/ELISのアプリケーションから職業大でのIT教育に至る経験談
大野先生の講演。
大学時代の話から、NTT時代の研究、現在の職業大学の教育についてのお話をされていました。
LISPでどういうアプリを作ってきたか(エキスパートシステムや決定木の話)、
TAO/ELISがどういう場面で、どんな風に使われていたのかという話は、ものすごく勉強になりました。
最後の職業カードのシステムを設計はUML/実装はLISP/出力はXMLで行う研究の話も興味深く聞かせていただきました。
懇親会で名刺交換させていただいたときには、自分が通っている会社を存じていてびっくりしました。

CLOS/MOP入門とOWL Full処理系開発事例紹介
CLOS/MOPとOWLの話ですが、
CLOS/MOPの話で時間が取られて、セマンティックWebの部分はあまり聞くことができませんでした。(全部聞きたかった><)
MOP(Meta Object Protocol)はメタクラスがどうのこうのと頭がこんがらがってきてしまって、なかなか理解できませんでした。
小出先生に懇親会で難しくて理解できなかったと正直にいってみましたが、あれは慣れだとのこと。あとでビデオを3回ぐらい見て、自分でコードを動かしてご覧といわれました。早速やってみます!

Lisp今昔物語
LISPが昔どういう風に扱われたか、そして今後プログラミングはどういう風になっていくかという話でした。
安村先生が日立時代のHILISPを作ったときのどのように高速化したか、といった話や、LISPのメリットについてお話しされていました。
後半はこれからのプログラミングについてのお話で、
人間はみんなプログラミングできる能力があるので、一般のひとにもそれができるようにということで、Programming 2.0という概念を提唱されていました。
先生はインターフェースの研究を行っていて、そこから、Programming 2.0といった、緩いプログラミングでもいいんじゃないかという発送につながっていったようです。

LTも面白い話盛りだくさんでした。

Shibuya.lispのスタッフの皆様には、このような機会を設けていただいたことに深く感謝申し上げます。
次回も参加したいなぁ。

2010年11月23日火曜日

Firefox Developers Conference 2010に行ってきました。

11月20日に
Firefox Developers Conference 2010 に行ってきました。
私が聞いた講演は下記。

  • 基調講演
  • John Resig feat. Shibuya.js
  • Firefox 4 & Mobile
  • Firefox Panorama
  • Web の地上化 ~ 生活に溶け込ませるブラウザの発想と戦略 ~
  • トークセッション: HTML5 時代の技術で Web プラットフォームはどう変わるのか
  • 大ライトニングトーク
どれも、充実したないようで、大変満足。
下記に、基調講演のメモと、
@dynamitterさんが紹介してたトークセッションのデモサイトのリンクを張っておきます。
その他の内容はもし時間があけばまとめてみようと思います。

基調講演
Jay Sullivanさんの基調講演。
これからはOpen Web Platformになる。
Firefoxは今後
  • mobile
  • cloud
  • apps
  • social
の4つの柱を考えていく。とのこと。


  1. mobile
  2. スマートフォンの普及により、 mobileでしかWebブラウザを使わない人は今後確実に増えていくでしょう。 プラットフォームはAndroid,iPhone,Symbianといった多様化してるし、アプリケーション開発者も大変な状況。 ただ、HTML5の80%はモバイルでも実現できるし、HTML5に環境に依存しないプラットフォームが実現できる。 これは大きなチャンス。 Mozillaとしては、今後大きく進化していくだろうAndroidへ投資していく。
  3. cloud
  4. FireFox Syncの話がメイン。 クラウドはどんどんコストが下がっており、今後クラウドWebにインパクトを与えていく。 MozillaはFireFox Syncを中心にクラウドに取り組んでいくというようなことを言っていた。 クラウドでは、個人情報がダダ漏れになる心配があるが、FireFox Syncは暗号化されている。
  5. apps
  6. ネイティブアプリケーションでできることは、Webアプリケーションでもできるが、 まだapp storeのような収益かの仕組みができていない。 Open Web Apps といった試みを紹介。
  7. social
  8. ブラウザはLaunch Pointとなるので、 世の中のユーザサービスとどのように統合していくのか、どのようにしてコミュニティと一緒に成長していけばいいか考えなければならない。 ソーシャルをどうやって生かすか、どうやって共有するかが今後の課題
Mozillaの今後どういう方向で進化していくかがよくわかりました。

@dynamitterさんが紹介してたHTML5関連デモのまとめ



FireFoxのイベントはかなり勉強になります。
また機会があれば行こう
と思います。

2010年11月21日日曜日

第12回「HTML5とか勉強会」に参加してきました。

11/18に、第12回「HTML5とか勉強会」に参加してきました。
いつも気が付いたら満員だったのですが、念願の初参加です!
今回は素晴らしいスピーカーの皆さまでした!感激でした!
(あと、英語だったので、あんまり理解できないところも多々。。。orz)

Paul Irish: The State of HTML5 : Inaugural Address
http://wde2010-pi.appspot.com/#slide1

HTML5関連技術について、一通りのデモを見せてくれました。
Audio data APIとWebGLを組み合わせたもののデモは秀逸でした。
WebGLで書いたビリヤードゲームで、玉のぶつかった音とかをAudio Data APIで表現したり。
もう、HTML5でゲームやらアプリやらを作れる時代が来ていることを実感。
SVG Filterなんかも紹介。
ライブラリとして、
HTML5の対応状況を調べてくれる modernizer.js  http://www.modernizr.com/
無駄なスクリプトのロードを防いだりしてくれるスクリプトローダーの
yeonope.js http://yepnopejs.com/
を紹介していました。

Bruce Lawson: WAI-ARIA
http://www.slideshare.net/brucelawson/bruce-lawsonhtml5ariajapan

WAI-ARIAというアクセシビリティの仕様のお話。
WAI-ARIAを描けば、例えば、ディスプレイがないデバイスでも音声などで補助してくれる、
そういうことを実現するための仕様です。
WAI-ARIAはHTML5と組み合わせることが可能で、
roleという属性を使って、"navigation"とか"banner"とかその要素の
役割を書くことができるようです。
HTML5には<nav>とか、<header>とかセマンティクスが用意されていますが、
対応したデバイスを考えてWAI-ARIAも組み合わせて書くべし。
あとは、要素にwebSRTを指定して、動画に字幕をつけるデモもしてました。

Jonathan Stark: jQuery Mobile + PhoneGap
http://www.slideshare.net/jonathanstark/building-mobile-apps-with-html-css-and-javascript-4807782

モバイルのWebを書くにはどうするかという話。
モバイルのwebを書くためのライブラリとして
  • iUI
  • jQTouch
  • Sencha Touch
  • jQuery Mobile
を紹介。
jQTouchのライブコーディングは非常におもしろかった。
WebアプリとNativeアプリを組み合わせるための
PhnoeGapの紹介もしてくれました。

Michael Fellinger: Canvas implementation using CoffeeScript

Coffee Scriptという
Ruby/Pythonライクで、
書いたコードをJavaScriptに変換してくれるスクリプト言語を紹介してくれました。
存在は知っていましたが、いじったことはなかったので、
あとでいじってみようと思いました。
詳細は下記で。Web上で動かすこともできます。
http://coffeescript.org

懇親会でのライトニングトークも面白かったです。



このようなすばらしい勉強会を企画してくれた主催者の皆様に感謝!
また行きたいな!