2013年5月3日金曜日

ART-Linuxの実験 インストール(その1)

ART-Linuxとは産総研で研究されている、Linuxのリアルタイム版です。(昔、RT-Linuxというのがあったけど、公開の仕方に問題がありかなり揉めたよね~ 知ってる人はかなり年季の入った人だと思うけどw)
そんで以前から考えてたんですが、ここ数年マルチコアなCPUが増えました。基本Linuxは複数のCPUがあってもそれらは平等に扱いますが、「リアルタイム制御用のコアを設定できたら便利じゃないか?」と思ってたら、ART-Linuxがそれをつい最近(2013年3月)に発表してくれました。これはぜひとも試してみようと思い、記録をメモしておきます。

1.ART-LinuxのインストールするLinuxの準備
ART-LinuxはUbuntu-10.04(Lucid)のKernelを改造したもののようです。まずLucidをDLしてきて、それをマルチコアなマシンにインストールします。(手元で実験に使えそうなのがCore2Duoのマシンしかなかったので、これで。)32bit版をインストールしてください。


2.ART-Linuxのインストール(BSP)
1項でインストールしたUbuntuのkernelを産総研のART-LinuxのHPからDLしてきます。


linux-image-2.6.32-art-generic_20130227_i386.deb
linux-headers-2.6.32-art-generic_20130227_i386.deb
linux-source-2.6.32-art_20130227_all.deb


PAE(メモリ拡張用)とかありますが、今回はベーシックなものを。(ちなみにART-Linuxには32bitしかありません。とりあえずリアルタイムで動かす制御用アプリで64bitが必要な類のものは思いつかないのでいいと思いますが。)
これらをインストールします。


sudo dpkg -i linux-image-2.6.32-art_20130227_i386.deb linux-headers-2.6.32-art_20130227_i386.deb linux-source-2.6.32-art_20130227_all.deb


これでART-Linux(BSP用)のkernelがインストールされ、それ起動用にgrubの設定も追加してくれます。(つまり、元々のUbuntuも起動できます)

注:BSPというのはLinuxの通常業務を行うプロセスのことで、最低1コアは割り当てる必要があります。インストール直後はBSPに何コア割り当てるとかのkernel起動パラメータを設定してありませんので、この場合は2コアで動いてしまいますが、後々AP(リアルタイム用コア)を動かすまではそれで構いません。


3.サンプルプログラムの実行
さてインストールが成功したか確認してみます。BSPでもとりあえずこれまでのART-Linuxの機能はあるようです。(基本は厳密なタイマ管理ができるか、ということになると思いますが。BSPがアプリで占有できないので、ちょうどアプリが動きたいときにシステム作業が発生してしまうと止めようがないでしょうが、システムコールに影響されない厳密なタイマがあるだけでリアルタイムのアプリを書くのは楽になります)


#include <stdio.h>
#include <linux/art_task.h>
#include <time.h>
#include <sys/time.h>

double gettimeofday_sec()
{
  struct timeval tv;
  gettimeofday(&tv, NULL);
  return (tv.tv_sec + (double)tv.tv_usec*1e-6);
}

void process(void)
{
  register int i;

  double start_t1;
  double now_t1;

  start_t1 = gettimeofday_sec();

  art_enter( ART_PRIO_MAX, ART_TASK_PERIODIC, 1000000 );
  /* Real Time Task Start */
  for (i=0; i<100; i++) {
    art_wait();
    
    now_t1 = gettimeofday_sec();

    printf("[%d] %10.30f\n", i, (now_t1 - start_t1));
  }
  putchar('\n');

  art_exit();
  /* Real Time Task exit */
}

int main(void)
{
  process();

  return 0;
}

以下のようにビルドします。

$ gcc -Wall -O sample1.c /usr/lib/art_syscalls.o

オリジナルのサンプルに少し追加しました。art_wait()で1秒間を正確にwaitしてますが、そこからほんの少しですがコードが動きます。その処理時間が累積するのかどうか、それを見るために実時間を表示しました。
大体、100回loopすると以下のような感じになります。

[99] 99.9835

あれ?なんか少しだけ早く回ってる?ちょっと予想とずれてしまいましたが、art_wait()の精度の問題なのか、gettimeofday()の問題なのか、長時間(1時間くらい)のサンプルを書いてみるか、外部に信号を出して計測してみないとわかりません。

追記:
その後、さらに設定をいろいろと変えて実験してみました。結論から言うと、

①上記の結果はインストール途中の結果であり、BSPは2コアの設定になっていた。またAP用のメモリ設定(今後、書きます)もしていなかった。ただし、gnomeのdesktopは動いていた。

②BSP=1にして実験すると、[99] 100.052等安定して処理が遅れるようになっていった。現在のLinuxのタスクスイッチが1ms、しかもデフォルトのART-Linuxの割り込み最短時間が1msなのを合わせて考えると、それが一番なっとくのいく結果と思われる。

③さらにART-Linuxの割り込み最短時間=500usにしてみたが、さらに安定して毎回1ms程度遅れるようになった。(予測しやすくなった)

サンプルが1秒ごとに1行出力するよ、という意味ではないような気がします。もっともこちらもART-Linuxのタイマ管理をよく勉強せずにサンプルを使ってしまいましたが、正確なタイマがあってもこうなるでしょう。本当に1秒周期で1行出力したいなら、タイマで0.99秒ほどまち、それからは1秒たったかloopでチェックするようにしないとだめでしょう。逆に最初の結果(早く動いてしまう)ほうが、リアルタイムのプログラムを作るうえでは、動作予測がしづらく使いづらいです。デフォルトのままだと、gnomeの割り込み処理や、Core2DuoやNvidia(グラフィックボードがこれ使ってます)のドライバ周りの割り込み等、リアルタイムを乱す要因がたくさんあり、変な結果になったと思います。(ゲーム程度の60Hz程度の周期でリアルタイム性が確保できればいいというならこれでもいいですが、本気で1ms周期の制御したいならCLIベースで動作させないといけないでしょう。)

2013年4月30日火曜日

Android開発環境:ADTの更新にまた苦しみました(>_<)

4月くらいからEclipseで「ADTが21.1になりました」と言ってくるんですが、どうしてもEclipse本体は21.0のままで、21.1を認識してくれません。
毎度のことですが、もう諦めました。GoogleからADT-bundleの最新版DLしてきて入れなおします。(Eclipse自体は特にインストーラも必要なく、フォルダごと変えるだけなので楽です。)しかしこの不安定な更新状況、なんとかならんかね。全然、状態が変わりません。いくら簡単にまるごと入れ替えできるといっても。。。 
どうも調べてみると、ADTのSDK-toolsはこういうときEclipseから起動するんじゃなくて単体でSDK-Managerを起動して更新し、その後Eclipseを起動し、SDKの更新を認識させるといいようです。
しかしGoogleもAndroidアプリの開発者増やしたいなら、もう少しtoolの使い勝手を改善してほしい!

2013年3月31日日曜日

DLNA Playerについて

自宅ではバッファローのNASを使ってますが、こいつがDLNAサーバーの機能を持っています。(Fullスペックかは怪しいが)それで、PC部屋(2階)ではそれで見てたんですが、1階居間のTVをRegzaに買い替え、それ用のDVDプレーヤー代わりにPS3買いました。こいつがDLNAプレーヤーの機能を持っており、NASを見ることができるのに気づきました。「もしや!?」と思って試してみると、1階のTVでNASの中身を見ることができるじゃありませんか!こいつはいいやと思ったんですが、どうもファイルによってコマ落ちがひどいことがあることに気づきました。最初はLANの問題(2階と1階はACライン上にEthernet信号通す変換器使ってます。そのため10Mbps台しか望めません。)かと思ったんですが、同じファイルを1階のPCで見てみると、普通に見れます。
ちなみに、問題のファイルのコーデックは"avi"で古いデータです。ほとんどのファイルは"mp4"なんですが、どうもPS3の"avi"に対するエンコーディング能力がダメダメなようです。(おそらくSPE全然使わない、CPUだけのプログラムなんだろな)ちなみに1階でNexus7にDLNAプレーヤー機能のアプリを入れてみると、普通に見れました。
PS3ってCPUは面白い(Regzaも同じCPU使ってますね)んですが、もうソニーもあんまり力入れてくれないだろうな~。まあ"avi"ではもうファイル作らないから、ほとんど問題はないんですが。

2013年3月16日土曜日

Raspberry Pi Webサーバー設定(WordPress)

Raspberry Piで少し遊んでみて、さて次にどうするかと考えました。やはり計算とかするには遅いし、でも消費電力は非常に少ないのでWebサーバーにしてみるか。(普通のPCで、24時間電源入れっぱなしは、やはり怖い)


1.まずシステムを最新に
$ sudo apt-get update
$ sudo apt-get upgrade

2.次に以下を順番に

$ sudo apt-get install apache2
$ sudo apt-get install php5
$ sudo apt-get install mysql-server
(mysqlのrootパスワード設定を聞かれます)
PHP関連追加インストール
$ sudo apt-get install php5-mysql php5-curl
$ sudo apt-get install php5-gd
PHPの中間コードキャッシュモジュール 処理が速くなるらしい
$ sudo apt-get install php-apc

3.Apache起動
apache2のパッケージをインストールした時点で起動はしている。
デフォルトは、/var/www/index.htmlを表示している。
設定ファイルがhttpd.conf→apache2.confに名前が変わったらしい。
/etc/apache2/以下にある。

4.Apache設定
httpdをどのユーザーアカウントで動かすかだけは設定する。色々設定箇所が変わるようだが(たとえば今回は設定ファイル名がapache2.confだけど、たいていはhttpd.confだし)、まずアカウントを作成する。

$ sudo useradd apache

ID番号等、すべてデフォルトにおまかせなので、グループも自動的に同じ名称で作成してくれます。これをApacheの動作アカウントとします。
apache2.confでは以下の箇所でhttpd(今回のパッケージではapache2という名前で動いてた)を設定します。

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

envvarsというファイル中で設定する環境変数を使ってるとのことなので、そこで環境変数を先ほど作成したapacheに変更します。これで後はapache2を再起動してやればOK。

$ sudo /etc/init.d/apache2 restart

5.MySQL データベースの準備
WordPressが使っているデータベース、ユーザーを準備してやらないといけません。

$ mysql -u root -p
Enter password: ←ここでmysqlをインストールした時、設定したパスワードを入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 42
Server version: 5.5.28-1 (Debian)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database wpdb;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on wpdb.* to 'wpadmin'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql>

データベース名:wpdb
データベースユーザー名:wpadmin
パスワード:password
ホスト名:localhost

でデータベースの準備をしました。(パスワードがちょっとという気はしますが、説明用ですから。)


6.WordPressの初期設定
wordpressをDLして、/var/www以下に解凍します。(apacheのデフォルトページ)一応、ファイルのオーナーは先ほど作成しておいたapacheにしておきます。(同じ名前にしてしまってわかりづらいな)
wordpressのTopをブラウザで開くと設定ファイル(wp-config.php)がないから作成するか?と聞かれます。


作成するを押すと、データベース設定画面になります。




さきほど準備したデータベースをここで入力します。




無事設定に問題がなければデータベースの生成にかかります。




次にブログのタイトルや管理アカウントの設定画面になります。



これでブログの設定ができました。こんな感じで表示されるようになります。



テーマとか設定してませんから、真っ白けですね。管理用にはログインしてダッシュボードから行います。



これで準備はできました。さて実際に公開するかはもう少し考えます。(セキュリティの問題とか考えとかないといけないし、別途ブログ立ち上げてどうすんだ?という重大な問題があります。目的を整理しないと。)

2013年3月9日土曜日

CentOS sudoの設定

CentOS6を使ってみてたら、コンソールでsudoコマンドで特権コマンド使おうとしたら怒られました。(もちろんパスワード入力は成功しています)


hogehoge is not in the sudoers file. This incident will be reported.

なんかsudoやるにも設定が必要なようです。/etcにsudoersというそれらしきファイルがありましたが、viで開いてみても一杯書いてあって意味が分かりません。
こんなときはググって調べます。すぐに見つかりました。

# visudo

いったんrootになって、専用のviコマンド使います。これで/etc/sudoersがviで開かれます。最下段に以下を追加。

%hogehoge ALL=(ALL) ALL

ちょっと乱暴ですが、hogehogeにsudoですべての特権コマンドを実行できるようにしました。編集と保存はviと同じです。これでsudoが使えるようになりました。

PS
その他やってたら、CentOS6って日本語入力がまだデフォルトでできない。(デスクトップ等、日本語が出てたので気づかなかった。)日本語入力しようとしてもどうしても動かない。しかたないのでまず、groupinstallで"Japanese Support"をインストールして、LANGをja_JP.UTF-8に変更。
あと日本語入力メソッドだけど、本来はscim-anthyを使うらしいんだが、まだCentOS6用にはできてないので、プロトタイプ版?ibus-anthyをインストール。しかもこれだけではだめで、ibus-setupして設定したり、/usr/bin/ibus-daemonが自動起動するようにと色々設定しないとだめでした。

2013年3月2日土曜日

Androidプログラム開発-GUIの文字サイズ

AndroidはPCと比較すると画面が狭い!それで表示する量を絞るんですが、やはりあと少しではみ出すことがあります。
そんなとき、全体的に文字サイズを小さくすれば何とか入るのにと思うけど、開発環境のGUI作成editorには文字サイズに関する設定が見当たりません。(項目が多すぎて、見つけきれてないのかもしれませんが・・・)
こういう時、よくやるのがネットで調べて直接キーワードをactivity_main.xmlに対し編集してしまいます。
テキストサイズの設定は以下のキーワードでした。

android:textSize="15sp"

そのまんまですね。ただデフォルトだとこのキーワードが生成されないんですよ。"sp"は数値の単位がpixel単位じゃないよという意味です。(詳しいことは忘れましたが、pixel単位でデザインしてしまうと異なる端末では画面解像度が違うので、端末ごとにレイアウトが崩れてしまいます。それを防ぐため、仮想的なスクリーンを設定して、そこでサイズを設定する単位だったはずです)実験してみたところ、デフォルトで"20sp"くらいだったので、少し小さくして画面内に入るようにしました。

もうちょっと勉強しておきました。サイズの指定にはpx(pixels), dp(density-independent pixels), sp(Scale-independent pixels)等があり、最初のpxが文字通りのドット単位です。spはフォントサイズの指定用で、実際の表示サイズは使用しているフォントにも依存します。dpは画面の物理的な密度に基づいた抽象的な単位でテキスト以外のサイズ指定やレイアウト指定はこちらのようです。
このほか、mm, inと物理的なサイズ指定もあるのにびっくり。

Java 数値フォーマット

これまで特に気にしてませんでしたが、Androidアプリを作ってみると画面が狭いせいで余計、計算結果の出力桁数で困ります。(制限したい)
少し調べてみました。 "String" + "format" + "書式"とかでググればすぐでてきたんで、詳細は書きませんが、例を一つ。

String.format( "%.2f", work); // workという浮動小数点の変数を、小数点以下2桁で文字列に変換

なんとなくCのformatに似てますね。String以外にもformatという書式変換用のメソッドを持っているものはあります。直接数値変換したい場合なんかはそちらを。