ユニケージ開発手法

シェルスクリプトとテキストファイルでアジャイル開発を行う「ユニケージ開発手法」のセミナーに行ってきたので感想をまとめます。

基本思想

  • モデル化しない
  • データ中心主義
  • 完全分散型
モデル化しない

システムは業務の中にあり、システムは変化するものであるからモデル化は行わない。
社員がその場で開発し、手戻り、やり直しを何度も行う。

データ中心主義
  • コンピュータシステムは、データの入出力を行っているに過ぎない。
  • プログラムは業務に合わせて作り、不要になれば捨てる。
  • データは一切捨てない。
完全分散型
  • データもプログラムもハードウェアも、業務で、組織で分ける。
レイヤーによるデータ管理
  • LEVEL1 イベントデータ
  • LEVEL2 確定データ
  • LEVEL3 5W1Hデータ
  • LEVEL4 アプリケーションデータ
  • LEVEL5 出力データ

感想

ETLツールとデータウェアハウスの関係によく似ているなと思いました。プログラムはフィルタと言い切る所はETLツールに。事前計算されたファイルを用途別に用意する所はデータウェアハウスに似ています。

T字型ER手法(TM)に通じる所もあります。TMのADD-ONLYは、データ中心主義に。TMのINDEX-ONLY、ターボファイルは、LEVEL4データに似ています。

お作法(規約)を重視する所、2度開発を行う所はアジャイル開発に通じます。

疑問点

聞きそびれたので機会を作って以下を確認してみたいです。

  • バッチ処理であればこのやり方で問題ないと思うが、オンライントランザクション処理はどのようにしているのか?ロックの粒度は?
  • 商品コードなどのIDの名寄せが必要になるのではないか?

反省

技術者は技術トレンドを追いかけすぎていると思いました。難解な事をありがたがる傾向もあるし。あと、中間レイヤーの存在に疑問を持たなすぎかも。

チェックサム計算

チェックサム計算がなにげに面倒くさかったです。
きっと組み込みな人々は、もっとよい方法を知っているのであろう・・・。

環境

チェックサム計算

この例では、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をシリアル・イーサネットコンバーターとして構成する手順をまとめます。

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              

Socket Debugger & TeraTerm

Socket Debuggerを起動して送信先にArmadilloを設定します。

TeraTermを起動して、シリアルポートの設定をArmadilloとあわせます。

Socket Debuggerからデータ送信

TeraTermに表示された。

TeraTermに文字を入力

Socket Debuggerに表示されて、テスト完了。

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

任意のポート