ユニケージ開発手法
シェルスクリプトとテキストファイルでアジャイル開発を行う「ユニケージ開発手法」のセミナーに行ってきたので感想をまとめます。
基本思想
- モデル化しない
- データ中心主義
- 完全分散型
モデル化しない
システムは業務の中にあり、システムは変化するものであるからモデル化は行わない。
社員がその場で開発し、手戻り、やり直しを何度も行う。
データ中心主義
- コンピュータシステムは、データの入出力を行っているに過ぎない。
- プログラムは業務に合わせて作り、不要になれば捨てる。
- データは一切捨てない。
完全分散型
- データもプログラムもハードウェアも、業務で、組織で分ける。
レイヤーによるデータ管理
- LEVEL1 イベントデータ
- LEVEL2 確定データ
- LEVEL3 5W1Hデータ
- LEVEL4 アプリケーションデータ
- LEVEL5 出力データ
感想
ETLツールとデータウェアハウスの関係によく似ているなと思いました。プログラムはフィルタと言い切る所はETLツールに。事前計算されたファイルを用途別に用意する所はデータウェアハウスに似ています。
T字型ER手法(TM)に通じる所もあります。TMのADD-ONLYは、データ中心主義に。TMのINDEX-ONLY、ターボファイルは、LEVEL4データに似ています。
お作法(規約)を重視する所、2度開発を行う所はアジャイル開発に通じます。
疑問点
聞きそびれたので機会を作って以下を確認してみたいです。
反省
技術者は技術トレンドを追いかけすぎていると思いました。難解な事をありがたがる傾向もあるし。あと、中間レイヤーの存在に疑問を持たなすぎかも。
チェックサム計算
チェックサム計算がなにげに面倒くさかったです。
きっと組み込みな人々は、もっとよい方法を知っているのであろう・・・。
環境
チェックサム計算
この例では、1バイト単位の16進数配列をチェックサム計算し、その配列にチェックサムを追加しています。
array = ["05", "0A", "0F"] => ["05", "0A", "0F"] sum = "%02X" % array.inject(0){|s,c| s += c.hex} => "1E" array << sum[-2..-1] => ["05", "0A", "0F", "1E"] # 最後の二文字を取り出す
ポイント
- チェックサム計算したいデータを1バイト単位で配列に格納
- injectでたたみ込み計算
- sprintfで16進数に変換
16進数変換とバイナリ変換
組み込み機器とのシリアル通信を行うプログラム作ってます。
送受信するメッセージがバイナリで非常に苦労したので、内容をまとめます。
環境
参考にしたページ
16進数変換とバイナリ変換
1バイト単位で配列に格納するとやりやすかったです。
array = [] => [] msg = [] => [] array << 5 => [5] array << 10 => [5, 10] array << 15 => [5, 10, 15] array.map! { |s| "%02X" % s } => ["05", "0A", "0F"] # sprintfで16進数文字列に変換 msg << array.join => ["050A0F"] # すべての要素を結合した配列を作成 bin = msg.pack("H*") => "\005\n\017" # Array#packでバイナリ変換
バイナリを16進数に変換
上記例で作成したバイナリを元に戻します。
bin.unpack("H*") => ["050a0f"] # String#unpackでASCII文字列の配列に変換
ポイント
- 変換したいデータは配列に格納
- packでバイナリ化
- unpackで元に戻す
- sprintfで数値を16進数、2進数に変換する
文字列を指定文字数で分割する
調べるといろいろな分割方法が見つかるが、これだけは見つからなかったので記録。
環境
方法
String#unpack を使います。
2文字ずつ分割する場合
s = "abcdefghijklmn" => "abcdefghijklmn" s.length => 14 s.unpack("a2"*(s.length/2)) => ["ab", "cd", "ef", "gh", "ij", "kl", "mn"]
3文字ずつ分割する場合
s2 = "abcdefghijklmno" => "abcdefghijklmno" s.length => 15 s2.unpack("a3"*(s2.length/3)) => ["abc", "def", "ghi", "jkl", "mno"]
ポイント
- 最終文字が抜け落ちる可能性があるため、分割数の奇偶に気をつける必要があります
Armadilloをシリアル・イーサネット・コンバーターに構成する
Armadilloをシリアル・イーサネット・コンバーターとして構成する手順をまとめます。
環境
参考にしたページ
- 作ってみよう,MyガジェットPart3 | 組み込みLinuxのArmadilloサイト
- atmark-dist-20100603\user\seri2ethにあるソースコード
- Armadillo-420ベーシックモデル開発セットスタートアップガイド
- Armadillo-400シリーズソフトウェアマニュアル
ATDE3
まずはソースをwgetして展開します。
wget http://armadillo.atmark-techno.com/files/downloads/armadillo-420/source/dist/atmark-dist-20100603.tar.gz wget http://armadillo.atmark-techno.com/files/downloads/armadillo-420/source/kernel/linux-2.6.26-at10.tar.gz tar -zvxf atmark-dist-20100603.tar.gz tar -zvxf linux-2.6.26-at10.tar.gz
次いで、シンボリックリンクを作成。
ln -s atmark-dist-20100603 atmark-dist cd atmark-dist ln -s ../linux-2.6.26-at10 ./linux-2.6.x
make configはマニュアル通り。
make config
menuconfigでseri2ethを選択します。
make menuconfig
最後にmake。かなり時間がかかります。
make
ttymxc1をコメントアウトしてシリアルインターフェースを解放します。
vi romfs/etc/inittab ::sysinit:/etc/init.d/rc #::respawn:/sbin/getty -L 115200 ttymxc1 vt102 ::shutdown:/etc/init.d/reboot ::ctrlaltdel:/sbin/reboot
イメージファイルに修正を反映させます。
make image
開発中はtftpbootが便利なので、完成したイメージファイルをtftpサーバーのディレクトリにコピー。
sudo cp images/*.gz /var/lib/tftpboot/
Armadillo(シリアル接続)
Armadilloを保守モードで起動して、tftpbootに設定変更
hermit> setbootdevice tftp [ArmadilloのIPアドレス] [ATDEのIPアドレス] --kernel=linux.bin.gz --userland=romfs.img.gz hermit> l bootdevice: tftp [ArmadilloのIPアドレス] [ATDEのIPアドレス] --kernel=linux.bin.gz --userland=romfs.img.gz
そして、起動。
hermit> b
Armadillo(telnet接続)
まずは、seri2ethの設定ファイルを作成します。
su - vi /etc/config/serial.conf SOCKPROTO 0 BAUDRATE 19200 DATALEN 3 PARITY 2 STOPBIT 0 FLOWCTRL 0 PORTNO 21347
seri2ethが自動起動するよう、スタートアップスクリプトを作成し実行権限を与えます。
vi /etc/config/rc.local #!/bin/sh seri2eth -d /dev/ttymxc1 chmod 755 /etc/config/rc.local
このまま再起動すると今作成した設定ファイルが消えてしまうので、忘れずにコンフィグ領域に保存します。
flatfsd -s
さて、再起動
reboot
再度起動後、telnetで接続し、プロセスを確認。
ps ax|grep seri 1278 root 488 S seri2eth -d /dev/ttymxc1 1322 guest 692 S grep seri
serial.confの定数値
seri2ethのコンフィグファイル"serial.conf"の定数を列挙。
DATALEN
DATALEN5 = 0 DATALEN6 = 1 DATALEN7 = 2 DATALEN8 = 3
PARITY
NO_PARITY = 0 ODD_PARITY = 1 EVEN_PARITY = 2
STOPBIT
ONE_BIT = 0 TWO_BIT = 1
SOCKPROTO
TCPSERVER = 0 TCPCLIENT = 1 UDP = 2
BAUDRATE
任意の速度
FLOWCTRL
NO_FLOW = 0 HARDWARE = 1
PORTNO
任意のポート