openjdk7 のコンパイルは時間がかかる2014年01月30日 16時01分25秒

NetBeans の更新で、openjkd7 が必要になった。ports なので、依存関係は自動的にインストールされる。

Java は以前からコンパイルに時間のかかる大物だったが、これ程までになっているとは。特に目を引いたのは、ad_x86_32_gen.cpp。この C++ ファイルを一つコンパイルするのに四十分かかった。生成されたコードで 140 キロバイトもある。


# ls -lh ./work/openjdk/build/bsd-i586/hotspot/outputdir/
bsd_i486_compiler2/generated/adfiles/ad_x86_32_gen.cpp
-rw-r--r--  1 uyota uyota   141k Jan 30 01:07 ./work/open
jdk/build/bsd-i586/hotspot/outputdir/bsd_i486_compiler2/g
enerated/adfiles/ad_x86_32_gen.cpp

中を覗いてみると、とても規則的なコードが大量に並んでいる。

あまりにも時間がかかるので、諦めようかどうか迷うが、止めても今回費した時間が無駄になるだけなので、引き金を引けない。しかも、make の谷間で、並列処理の区切りに当たったらしく、一プロセスのみで、他の CPU が暇を持て余していた。

私の CPU 自体はそんなに速いものでもないが、時間がかかるので一度始めたら諦めないように。


CPU: AMD E-450 APU with Radeon(tm) HD Graphics (1646.50-MHz 686-class CPU)

Android で日付や時間の表示2014年01月13日 12時09分44秒

Java や Android には日付の書式を指定する方法はいくつかあるが、Java 内包の java.text.SimpleDateFormat が一番便利だ。特に、分、秒あたりのみを扱うのにはうってつけだと思う。

現在の時間を表示する例。


SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm:ss");
String date = sdf.format( new Date() );

android.text.format.Time もあるが、こちらは日付を含めたり、タイムゾーンも含めて表示する場合に便利そう。

Android Eclipse のキャッシュは良く壊れる2013年12月28日 11時59分38秒

Android のアプリ開発は Windows 上で行っている。わざわざそれだけの為に、Linux を入れる気には無かった。FreeBSD で動かすのは四苦八苦しそうだから、本末転倒になりそうなので止めた。そんなわけで、Eclipse を使ってあれこれと試している。

Eclipse では、「Project」メニューを開くと「Build Automatically」が有効になっている。つまり、書きながら順次コンパイルして警告を発してくれる。やはり、関数名の自動補完は心強い。UI 系のクラスの関数は覚え切れないので助けになる。Eclipse にはあれこれ便利は機能は多い。

しかし、どうも「Refactor」はあまり期待しない方が良いみたいだ。ファイル名の変更。つまり、Java でのクラス名の変更。変数名や関数名の変更など。これらをライブラリに行っても、他のプロジェクトまでは面倒を見ない。そのため、運が良いときには、ぼろぼろと大量のコンパイルエラーとなって出てくる。運が悪いと、ランタイムエラーになって、何が原因だか分かりづらいメッセージが出てくる。

一番の解決法は、全てを 「Clean...」してしまう。全てを強制的に再コンパイルすることで、コンパイルエラーとして捜し出す。

ライブラリを変更しても、利用側も随時迅速に作りなおされるわけではないようで、後になって発見したコンパイルエラーがけっこうある。

Android では同名の id や layout は避けるべき2013年12月15日 11時55分18秒

Android では 「layout」や「menu」、「values」等の「res」で作られるリソースには R クラスが自動生成されて、各々に id が与えられる。この R.java を覗いて見ると、同じ番号から順に生成されている。

現在の Eclipse での Android プロジェクトを見てみると、ライブラリを利用すると、依存しているライブラリのこれらのリソースを元に、プロジェクト内に R.java が生成されるようだ。これらの R.java を見ると同じ番号が割り当てられている。コード内で直にこれらの番号を使うことは無いのでこれ自体は問題はない。

しかし、どうもこれらの名前はそうもいかないようだ。ライブラリとプロジェクトにて同名のレイアウトがあった。ライブラリ単体で使うときは問題ないのだが、プロジェクトがオーバーライドして使うライブラリでも問題が出る。findViewById で見付けられないのだ。よく見る setContentView を呼ばずに、動作しないケースとは異なる。名前空間から指定して呼んでいるので、クラスの入れ違いは考えにくいが、指定している名前のコンポーネントが見付けられないのだ。

一番簡単で明解な回避方法は、同じ名前を使用しないこと。プロジェクトのレイアウトを改名したら、ライブラリは正しく動き始めた。随分、後向きな解決ではある。何はともあれ、同じ名前を付けていると混乱の元になるので悪い解決方法でも無い。

Android Project をライブラリ化する2013年12月14日 13時29分31秒

Android のプロジェクトの project.properties

android.library=true

を追加するとプロジェクトがライブラリと化す。

しかし、ライブラリ化すると、apk が作れなくなって実行できなくなるようだ。ライブラリ兼アプリは出来ないみたいだ。変更直後は以前に作られた apk が残っていて、動いているに錯覚する。

FreeBSD で OpenJDK の日本語を設定2013年11月19日 15時39分50秒

FreeBSD の Java は openjdk になっていた。現在のシステムは、8.4-RELEASE。インストールしたそのままでは日本語が使えない。いわゆる豆腐になる。

まずは、FreeBSD 上の Java で日本語が文字化けで行った fallback を試してみた。しかし、□のまま。そこで、fontconfig を用いた設定を試みる。以前の手順の fontconfig を試したが、相変わらずうまくいかない。もう少し調べると、どうもファイル名が違うのと、フォントのパスが違うのが原因のようだ。

まずは、fontconfig.properties には、アーキテクチャの名前が入るみたいだ。FreeBSD では openjdk6 が /usr/local に入る。その中の jre/lib 内で fontconfig.FreeBSD.properties を設定する。


$ cp /usr/local/openjdk6/jre/lib/fontconfig.properties.src /usr/local/openjdk6/jre/lib/fontconfig.FreeBSD.properties
$ diff -u fontconfig.properties.src fontconfig.FreeBSD.properties
--- fontconfig.properties.src   2013-11-16 23:19:06.000000000 -0500
+++ fontconfig.FreeBSD.properties       2013-11-19 01:34:04.000000000 -0500
@@ -180,8 +180,8 @@
 filename.DejaVu_Serif_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-Oblique.ttf
 filename.DejaVu_Serif_Bold_Oblique=/usr/local/lib/X11/fonts/dejavu/DejaVuSerif-BoldOblique.ttf
 
-filename.Sazanami_Gothic=/usr/local/lib/X11/fonts/TTF/sazanami-gothic.ttf
-filename.Sazanami_Mincho=/usr/local/lib/X11/fonts/TTF/sazanami-mincho.ttf
+filename.Sazanami_Gothic=/usr/local/lib/X11/fonts/OTF/ipag.otf
+filename.Sazanami_Mincho=/usr/local/lib/X11/fonts/OTF/ipam.otf
 filename.AR_PL_UMing=/usr/local/lib/X11/fonts/TrueType/uming.ttc
 filename.AR_PL_UKai=/usr/local/lib/X11/fonts/TrueType/ukai.ttc
 filename.UnDotum=/usr/local/lib/X11/fonts/unfonts-core/UnDotum.ttf

そして、Sazanami と設定されているフォントだが、現在の FreeBSD では入れられないようだ。これを japanese/font-ipa に設定する。

これで、NetBeans は日本語で起動した。NetBeans で utf8 の XML を読み込んで、表示してみたがコンソールにも日本語が正しく表示されている。

前々回前回

FreeBSD の Java は openjdk2013年11月18日 13時15分33秒

久しぶりに NetBean で Java を使おうと思ったら、NetBean がインストールされていなかった。長いこと使っていなかったので消してしまっていたらしい。そして、Java もどの実装が現役なのだか。古いものだが四つ入っている。

% ls -d /usr/local/*jdk*
/usr/local/diablo-jdk1.5.0      /usr/local/jdk1.5.0
/usr/local/diablo-jdk1.6.0      /usr/local/jdk1.6.0

さて、make install で引っ張られてくるのは openjdk だった。FreeBSD Java Project: How To Install によると、OpenJDK が現在の公式の Java サポートみたいだ。

OpenJDK は以前の Java の様に自分でダウンロードをしておかなくても良いみたいだ。文句を言われてから取りに行こうと思って、おもむろに make install を叩いたが、そのまま無事に終了してしまった。

もう一つ。8.4 RELEASE 時の ports を使っているが、「Enable Legacy Debugging Support」を使って i386 上ではコンパイルエラーが発生した。これを無効にしてコンパイルを再度始めたところ、今度は問題なく終了できた。メモリが 4GB あると tmpfs を使って、OpenJDK をメモリ上だけでコンパイルとインストールできる。IO が省けて速くなる。

NetBeans 7.3 がデフォルトで、 NetBeans 6.1 の ports もあった。どちらともインストールするだけで動いた。ワークスペースの情報が引き継がれないみたいで、7.3 ではプロジェクトが空っぽだった。

前回次回

Java Locale2013年10月06日 12時40分16秒

Java の Locale の javadoc を見ただけでは、どんな表示が返ってくるのか掴めない。取り敢えず出力してみた。

$ cat Locales.java
import java.util.Locale;
class Locales
{
    public static void main( String[] args )
    {
        Locale[] locales = Locale.getAvailableLocales();
        for( int i = 0; i < locales.length; ++i )
        {
            System.out.println( i );
            System.out.println( locales[ i ].toString() );
            System.out.println( locales[ i ].getDisplayName() );
            System.out.println( locales[ i ].getVariant() );

            System.out.println( locales[ i ].getLanguage() );
            System.out.println( locales[ i ].getDisplayLanguage() );
            System.out.println( locales[ i ].getISO3Language() );

            System.out.println( locales[ i ].getCountry() );
            System.out.println( locales[ i ].getDisplayCountry() );
            System.out.println( locales[ i ].getISO3Country() );
        }
    }
}

FreeBSD 8.4 RELEASE に入っている java 1.6 だと以下の様に始まる。

$ javac Locales.java
$ java Locales
0
ja_JP
Japanese (Japan)

ja
Japanese
jpn
JP
Japan
JPN
1
es_PE
Spanish (Peru)

es
Spanish
spa
PE
Peru
PER
2
en
English

en
English
eng



3
ja_JP_JP
Japanese (Japan,JP)

プラットフォームや、jdk のバージョンなどで変わるかも知れない。

Android は遅い2013年08月10日 12時20分45秒

Android のインストールも終わり、試しに動かしてみることにした。

Building Your First App の手順通りに進めていく。若干 UI が変わっている部分もあるようだ。説明と微妙に違う部分もあったが、適当でも大丈夫。取り敢えず、何時間か後に動かすことは出来た。

手間取ったのが、Android の仮想マシンの起動。arm 向けのプログラムを i386 上で動かしているらしい。そのため、起動にとても時間がかかる。他のサイトでは、写真付きで出ている。まあ、簡潔に言うと、左右に綺麗な色付きの画面が出るまで待たなければいけない。

そして、電話が表示されて自分のプログラムを実行しても、これまた電話に表示されるまでに時間がかかる。まさに、果報は寝て待てだ。

Android に興味を持った2013年08月02日 12時51分01秒

既にスマートフォンが出て、何年。アンドロイド等が騒がれていたのも随分と昔のこと。最近、すこし時間的に余裕が出来てきたせきた試してみたくなった。試用なので、色々と環境整備に手間をかける気にならない。そこで、あまり使っていない新機で試すことにした。

以前は色々な解説サイトから見ていたが、最近はいきなり本丸に進行。わざわざ遠回りしてたどり着かなくても、必要な事は目的のところに載っているので解説サイトは後回し。Android SDK | Android Developers で最初に、サポートされている環境を見る。

Operating Systems

    Windows XP (32-bit), Vista (32- or 64-bit), or Windows 7 (32- or 64-bit)
    Mac OS X 10.5.8 or later (x86 only)
    Linux (tested on Ubuntu Linux, Lucid Lynx)
        GNU C Library (glibc) 2.7 or later is required.
        On Ubuntu Linux, version 8.04 or later is required.
        64-bit distributions must be capable of running 32-bit applications.
案の定 FreeBSD は無い。若干前後するが、ここで Windows 7 を使うことに決めた。

紹介サイトは後回しと言いつつ新たに一つ追加。自分の作業記録を書いてくれる他人はいない。

ADT Bundle 等と言うものがある様子。ADT は Android Developer Tools とのこと。Eclipse + ADT プラグイン、Android SDK Tool、Android Platform-tools、最新の Android platform、と最新の Android エミュレータの image が入っているそうだ。

Computer から、Properties を点検。System type が 64-bit Operating System となっている。落としたのは、adt-bundle-windows-x86_64-20130729.zip だった。取り敢えず、C:/Users/uyota/Desktop/android に展開。647 MB もある。およそ一万ファイルあり、三十分以上かかるそうだ。

このままでは、まだ動かないとは思うが実験。adt-bundle-windows-x86_64-20130729\eclipse\eclipse.exe を実行する。

A Java Runtime Environment (JRE) or Java Development Kit (JDK)
must be available in order to run Eclipse.  No Java virtual machine
was found after searching the following locations:
C:\Users\uyota\Desktop\android\adt-bundle-windows-x86_64-20130729\eclipse\jre\bin\javaw.exe
javaw.exe in your current PATH
とエラーが表示された。

Java SE Downloads から jkd-7u25-windows-x64.exe を落としてくる、Java もバージョン 7 まで上がっている。バージョン 6 を落とすのは登録が必要になっている。

そして、遂に Android SDK が起動。さて、この呼び方は正しいものなのだろうか。