2010年8月31日火曜日

自作Viewのカスタム属性

MyViewという名前で自作Viewを作り、カスタム属性helloを作る方法のメモ。

まず res/values/attrs.xml を作って属性を定義する。

res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="MyView">
    <attr name="hello" format="string"/>
  </declare-styleable>
</resources>

これで、R.styleable.MyViewとR.styleable.MyView_helloというフィールドが自動生成される。

次に、MyViewのコンストラクタでカスタム属性を読むコードを書く。

MyView.java
public MyView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);

  TypedArray a = context.obtainStyledAttributes(
    attrs, R.styleable.MyView, defStyle, 0);
  this.hello = a.getString(R.MyView_hello);
  a.recycle();
}

MyViewを使う時は、属性のために名前空間を宣言する。

layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:takumak="http://schemas.android.com/apk/res/[Rクラスのパッケージ名]"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <com.blogspot.takumakei.lib.MyView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    takumak:hello="hello world"/>
</LinearLayout>

参考にした情報

2010年8月30日月曜日

Galaxy Sは魅力的な端末だった

たまたま実機に触れるチャンスがあった。
反応が速くて素敵。
有機ELディスプレイも綺麗だし。
すごい魅力的。

2010年8月18日水曜日

SIMとICCIDとIMSIとIMEI

ICCIDとはIC Card IDのこと。SIMカード固有の番号。
SIMカードとはSubscriber Identity Module Cardのこと。
加入者識別番号モジュールカード。

android.telephony.TelephonyManager#getSimSerialNumberでICCIDを取得可能。

IMSIとはInternational Mobile Subscriber Identityのこと。

国際移動体加入者識別番号。
キャリアがSIMに割り当てた識別番号。
携帯電話の通信ではIMSIが電話番号の役割を担う。
IMSIは再利用される可能性がある。
IMSIは滅多に送信されることがないらしい。

IMEIはInternational Mobile Equipment Identifierのこと。
国際移動体装置識別番号。
端末に割り当てられた番号。
*#06#と入力すると携帯電話の画面に表示できる。


TelephonyManagerのインスタンスは、
READ_PHONE_STATEパーミッションが必要。

2010年8月17日火曜日

みたことあるAndroid端末のUser Agentたち

HT-03A
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

X06HT Desire
Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; HTC Desire Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

SO-01B XPERIA
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

IS01
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; IS01 Build/S7070) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

2010年7月18日日曜日

JavaでXPathを使ってみた

Sample.java
import java.io.FileInputStream;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample {
    public static void main(String[] args) throws Exception {
        Document document =
            DocumentBuilderFactory
            .newInstance()
            .newDocumentBuilder()
            .parse(new FileInputStream("books.xml"));
        XPathExpression xpath =
            XPathFactory
            .newInstance()
            .newXPath()
            .compile("//book[@year='2000']/title/text()");
        Node node = (Node)xpath.evaluate(document, XPathConstants.NODE);
        if (null != node)
            System.out.println(node.getNodeValue());
        else
            System.out.println("not found");
    }
}
books.xml
<?xml version="1.0" encoding="utf-8"?>
<inventory>
    <book year="2000">
        <title>Snow Crash</title>
        <author>Neal Stephenson</author>
        <publisher>Spectra</publisher>
        <isbn>0553380958</isbn>
        <price>14.95</price>
    </book>
    <book year="2005">
        <title>Burning Tower</title>
        <author>Larry Niven</author>
        <author>Jerry Pournelle</author>
        <publisher>Pocket</publisher>
        <isbn>0743416910</isbn>
        <price>5.99</price>
    </book>
</inventory>

そもそも、AndroidでXMLしたくて調べたのだけれど、
XPathはAPI Level 8 (Android 2.2) でプラットフォームに取り込まれた。
最近ターゲットにしているAPI Level 4 (Android 1.6) では標準ではなかった。

参考: Java XPath API

2010年6月27日日曜日

JavaScript on Java で Swing してみた

コードを書きまくって指が痛くなり、
もっとサボらなくちゃいけないと思い、
Javaの代わりにスクリプト言語で書くという選択肢にたどり着く。

「Javaの代わりにスクリプト」 == 「Groovy」 かなぁ?

「Javaの代わりにスクリプト」 == 「JRuby」 かなぁ?

そうこうしているうちに、Scripting for Java Platform。こんな機能、知りませんでした。


JS.java
import java.io.FileReader;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class JS {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager m = new ScriptEngineManager();
        ScriptEngine e = m.getEngineByName("js");
        FileReader source = new FileReader("swing.js");
        try {
            e.eval(source);
        } finally {
            source.close();
        }
    }
}

swing.js
importPackage(java.awt);
importPackage(java.awt.event);
importPackage(javax.swing);

var frame = new JFrame("Sample");
frame.setLayout(new FlowLayout());

var button = new JButton("OK");

button.addActionListener(new ActionListener({
  actionPerformed: function(event) {
    JOptionPane.showMessageDialog(frame, "JavaScript on Java で Swing");
  }
}));

frame.add(button);

frame.setSize(100, 100);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setVisible(true);


参考
言語の中の言語 - Scripting
スクリプティング機能

ところで、スクリプト言語に換えたところで指の痛みは軽減できないことに気がついた。
「スクリプト使う→打鍵数が減る→プログラムが早くできあがる」だけだった
別ののサボり方を探そう。

2010年6月9日水曜日

Nettyと戯れてみた

Netty

まずはMaven 2.2.1 をインストール。apache-maven-2.2.1\binをPATHに追加。

Mavenでプロジェクトを作成。
C:\Users\Kei>mvn archetype:generate -DgroupId=com.blogspot.takumakei.studynetty -DartifactId=StudyNetty -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

pom.xmlにnettyを追加。
(nettyのDownloadページからコピペしたらバージョン番号がX.Y.Z.Qになっててエラー吐いた。)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.blogspot.takumakei.studynetty</groupId>
  <artifactId>StudyNetty</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>StudyNetty</name>
  <url>http://maven.apache.org</url>

  <repositories>
    <repository>
      <id>repository.jboss.org</id>
      <url>http://repository.jboss.org/nexus/content/groups/public/</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
  </repositories>

  <dependencies>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.jboss.netty</groupId>
      <artifactId>netty</artifactId>
      <version>3.1.5.GA</version>
      <scope>compile</scope>
    </dependency>

  </dependencies>
</project>

Eclipseのプロジェクトファイルを生成。
C:\Users\Kei\StudyNetty>mvn eclipse:eclipse -DdownloadSource=true -DdownloadJavadocs=true

Eclipseにインポート。


EclipseのWindow > PreferencesでClasspath Variablesに
[Name] M2_REPO
[Path] C:\Users\Kei\.m2\repository
を追加。

mvnで追加できるのを後から知った。
C:\Users\Kei>mvn -Declipse.workspace="C:\Users\Kei\EclipseWorks" eclipse:add-maven-repo

Writing a Discard ServerのDiscardServerHandlerとDiscardServerを追加。


さっそくサーバを起動してつながってみる。
C:\Users\Kei>irb -rsocket
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
require 'rubygems' -> true
require 'irb/completion' -> true
require 'pp' -> true
irb(main):001:0> c = TCPSocket.open('localhost', 12345)
=> #<TCPSocket:0x3bf1bf4>
irb(main):002:0> c.write 'hello world'
=> 11
irb(main):005:0> c.close
=> nil
irb(main):006:0>
C:\Users\Kei>

動いてる。


あとは、ドキュメント読みつつ実装するのみ。

そういえば…
Maven2.0.11かMaven2.2.1のどっちを使うべきか迷ったので両方インストールしてみた。
情報が少ないかもしれないけど、これまでMavenに依存してなかったから新しい方(2.2.1)を選んだ。

環境はWindows 7 Pro x64にJDK1.6.0_20