2014年8月31日日曜日

The State Machine CompilerとUMLの関係


The State Machine CompilerとUMLの関係


当り前ですが、UMLの図の中でThe State Machine Compiler(以下SMCと表記します)で表現するFSMに最も近いのはBehavioral State Machineだと思います。

Behavioral State MachineとSMCで表現できる図要素の違いについて考えてみます。

まずは、お互いの図要素を列挙して、特に何も考えずにマッピングできるもの、できないものに分類してみます。
以下で、「素直には表現できない」と表現したものの中でも、ちょっと表記を工夫すれば簡単に実現できるものや、概念が異なるので表現するに当って制約が存在するもの、まったく表現できないものがあります。
それらについては次回以降で考えていきます。

Behavioral State Machineで素直に表現できるSMCの要素

Behavioral State Machineで素直には表現できないSMCの要素

SMCで素直に表現できるBehavioral State Machineの要素

SMCで素直には表現できないBehavioral State Machineの要素


つづく?

2014年8月29日金曜日

PIC開発環境雑感

PICについてはやねうらお氏の有名ないますぐPICをやめてAVRに移行すべき10の理由他、いろんなところでdisられています。僕もそのことは知っていたのでPICを使おうと思ったときにちょっと腰が引けていたのですが、食わず嫌いは良くないので使ってみることにしました。

PICという名前が付いているコントローラには、CPUのコアアーキテクチャとして8ビット系と16ビット系と32ビット系があります。これらの間にはバイナリ互換性はありません。ペリフェラルが似ているだけです。そもそもPIC32になるとMIPSだし。

Microchip社からはMPLAB® XC: Compiler Solutionsというコンパイラが提供されていて、それぞれのアーキテクチャ向けにxc8、xc16、xc32が提供されています。有償版はけっこうお高くて1000ドル前後しますが、無償でも最適化オプションとして-O0、-O1だけしか使えない以外は別に制限はないようです。

それらのコンパイラを統合して、エディタ、デバッガまで含めた統合開発環境として、MPLAB® X Integrated Development Environment (IDE)が提供されています。こっちは無償。他のコンパイラと組み合わせても使えるようです。

xcコンパイラはgccベース、MPLAB XはNetbeansベースで作られていて、特にへんなカスタマイズはしていなくてわりと使いやすい印象を受けました。

コンパイラ、MPLAB XともにWindows、Linux、OSX版が提供されているのもよいです。
僕はOSXで使っているのですが、特に悩むこともなく、スムーズにインストールできました。

コマンドライン環境との相性もまあまあで、MPLAB Xで一度プロジェクトを設定すると、Makefileが作成されるので、コマンドラインからコンパイルすることができます。

僕の場合の開発フローは

  • MPLAB Xでプロジェクト作成および編集(ファイルの追加/削除など)
  • emacsで編集 → emacs上でコンパイル
  • MPLAB XでPICに書き込みおよびデバッガ起動
という感じになっています。なかなか幸せ。

ステートマシンについて

The State Machine CompilerとUMLの関係

バグが少ない実装を行うための方法論はいろいろとありますが、組み込みソフトへの数理的アプローチなどにも書かれているように、形式的な記述からコードを生成するというのも一つの有効な方法だと思います。

以前から、SMCというステートマシンコンパイラを使ってみたりしていたのですが、このテの奴はどうしても独自の記法でステートマシンを記述するのがめんどうでなかなか実装に手がつかなかったりします。

ということで、Astahのステートマシン図からSMCのコードを吐きだすプラグインを作成していたのですが、実装を進めていくうちに、ネストした状態や、疑似状態を素直に取り扱えないという壁につきあたりました。

そんなバカな、と思ってFAQを見たところ、
SMC is not and will never will be a Statechart implementation. The SMC and Statechart philosophies are too different to be reconciled.
という衝撃の一文がありました。SMC使いはじめてから何年も経つというのに・・・

といいつつ、良く考えてみるとUMLの仕様ってあまり真面目に見たことがなく、 UML2.0クイックリファレンスくらいしか読んでないので、この機会に少し真面目に仕様を見てみようと思いました。

UMLの仕様

UMLについて解説しているサイトはたくさんありますが、意外と一次資料へのリンクをちゃんと紹介しているサイトは少ないですね。まあ、Googleに聞けばすぐ見つかるのですが、少しだけわかりにくいので紹介しておきます。

UMLの総本山は http://www.uml.org/ です。
最新のドキュメントは http://www.omg.org/spec/UML/2.4.1/にまとめられています。

この中で、人間が読める仕様書は

  • Infrastructure specification
    • UMLの下部構造。OMGが定義する他の仕様との関係や、上部構造で定義してある要素間の関連、図の要素の定義などについて書かれています。
  • Superstructure specification
    • 上部構造。各種の図の定義が書かれています。
の2つとなります。他にもXMI形式で書かれた機械親和性が高い仕様書もあります。

今回のように「ステートマシンとはなんぞや」という姿勢で読む場合には、Superstructureから読んでいけばよさそうです。

UMLそのものの仕様書なのにUMLをがっつり使って書かれているのはなかなかロックな感じです。例えば、振舞いステートマシンのAbstruct Syntaxはこんな感じ。



非常に明快なのですが、すでにUMLに慣れていないと読めなさそうです。

ということで、しばらく、UMLの仕様を参照しながら状態遷移機械の実装について考えていきたいと思います。

つづく


2013年10月11日金曜日

ブレッドボード

もう20年以上、「簡単な回路なら組めるソフトエンジニア」をやっとりますが、今回始めてブレッドボードを使ってみました。

確かに楽で便利。

写真の回路で、取り敢えずUSBデバイスと通信できて悦に行っている所です。

2013年9月22日日曜日

PIC開発準備中

PIC開発の準備スタート。
取り敢えず、ICEの接続確認までできた。電源とICEつないだだけだけど、ショートとかはしてなかったらしい。

実は今までブレッドボードってモノを使ったことがなく、いきなりユニバーサル基板に部品並べてハンダ付けしてた。
今回は試行錯誤が多そうなのでブレッドボード使って見たんだけど、これはこれでちゃんと接触してるのか不安だったりするね。

2013年9月14日土曜日

Eclipseに関するメモ

https://github.com/buchio/Astah2Smc-Plugin の開発時に気づいたことのメモ

eclipseでastah* Plug-in SDKのコンパイルがうまくいかない場合

Eclipseからビルドしたときに、依存関係の自動解決がうまくいってない場合がある
一旦コマンドラインでastah-buildすると以降大丈夫な場合がある

astah-launchやastah-debugをeclipseから実行したい場合

「Run」→「External Tools」→「External Tools Configurations」で、
  • Location : /bin/sh(Windowsの場合はcmd.exe)
  • Working DIrectory : ワークスペース(Browse Workspaceで選択)
  • Arguments : astah-lauch(Windowsの場合はastah-launch.bat)などの絶対Pathを指定

プラグインのありか

  • プロパティエディタ
    • 説明
      • http://propedit.sourceforge.jp/howto_eclipseplugin_install.html
    • Update Site
      • http://propedit.sourceforge.jp/eclipse/updates/
  • Markdown Editor
    • 説明
      • http://www.winterwell.com/software/markdown-editor.php
    • Update Site
      • http://winterwell.com/software/updatesite/


2013年2月7日木曜日

homebrewでgaucheをインストールする

何度も忘れてるので自分メモを兼ねて。 gaucheをインストールする際、mountain lionでは「--use-llvm」を付けないとうまくいかない。
$ brew install --use-llvm gauche

フォントサイズを変更してもウインドウサイズが変わらないようにする

何いってるのかさっぱりわからん人も多いかと思いますが、Emacsを、Cygwinのminttyみたいに、フォントサイズをキーボードで変更してもウインドウサイズが変わらないようにするための設定を行なってみました。 以下のコードを.emacsのどっかに貼り付けるか、独立したファイルにしてrequireすれば良いです。 UbuntuやCentOS,OSXではうまく動いています。 NTEmacsだとなぜか微妙にウインドウサイズが変わっていってヤな感じ。
;;; -*- syntax: emacs-lisp; coding: iso-2022-jp-unix; -*-

;; フォントサイズを変更する
;; Emacsではフレームのサイズをピクセル単位で指定できない。
;; そのため、frame-parametersに
;;   current-pixel-width-marginと
;;   current-pixel-height-margin
;; という2つの属性を追加し、目標とするサイズと実際に設定されたサイズの誤差を記録しておく
;; 次回にサイズを設定するときにこれらの属性を用いて目標サイズを修正することで、
;; フォントサイズを変更してもEmacsのframeサイズがほぼ変化しないようにする。
;; *手動でframeサイズを変更した時に、以前の誤差が適用されてしまうのは許容する*
(defun change-font-size(sizediff)
  (if window-system
      ((lambda ()
  ;; frame-parametersにcurrent-pixel-width-marginとcurrent-pixel-height-marginがなかったら0を設定する
  (if (or (not (cdr (assoc 'current-pixel-width-margin (frame-parameters (selected-frame)))))
   (not (cdr (assoc 'current-pixel-height-margin (frame-parameters (selected-frame))))))
      (modify-frame-parameters (selected-frame)
          (list '(current-pixel-width-margin . 0)
         '(current-pixel-height-margin . 0))))
  ;; minttyみたいにフォントサイズを変更してもframeのサイズが変らないようにする
  ((lambda (current-pixel-width current-pixel-height)
     ;; フォントサイズ変更
     (set-face-attribute 'default (selected-frame) :height
    ((lambda (current new) (if (<= new 0) height new))
     (face-attribute 'default :height)
     (+ sizediff (face-attribute 'default :height))))
     ;; フレームサイズ調整
     (set-frame-size (selected-frame)
       (/ current-pixel-width (frame-char-width))
       (/ current-pixel-height (frame-char-height)))
     ;; 調整誤差をcurrent-pixel-width-marginとcurrent-pixel-height-marginに記録しておく
     (modify-frame-parameters (selected-frame)
         (list (cons 'current-pixel-width-margin (- current-pixel-width (frame-pixel-width)))
        (cons 'current-pixel-height-margin (- current-pixel-height (frame-pixel-height))))))
   ;; current-pixel-width-marginとcurrent-pixel-height-marginを加味してフレームサイズを調整する
   (+ (frame-pixel-width) (cdr (assoc 'current-pixel-width-margin (frame-parameters (selected-frame)))))
   (+ (frame-pixel-height) (cdr (assoc 'current-pixel-height-margin (frame-parameters (selected-frame))))))))))

(defun increase-font-size ()
  (interactive)
  (change-font-size 10))

(defun decrease-font-size ()
  (interactive)
  (change-font-size -10))

(global-set-key [C-mouse-4] 'increase-font-size)
(global-set-key [C-wheel-up] 'increase-font-size)
(global-set-key [C-mouse-5] 'decrease-font-size)
(global-set-key [C-wheel-down] 'decrease-font-size)

(define-key global-map (kbd "C-+") 'increase-font-size)
(define-key global-map (kbd "C--") 'decrease-font-size)

2011年1月4日火曜日

VirtualBox 4.0がリリースされています

しばらく前からVirtualBoxを使っていますが、年末にVersion4.0がリリースされています。Parallels WS、VMWare Fusionのライセンスも持っていますが、それらと遜色ない出来になっていると思います。

もともとSun Microsystemsが作っていたプロプライエタリなソフトウェアだったのですが、途中からオープンソース化されて、GPLが適用されるオープンソースエディションと、PUELという評価用ライセンスが適用されるスタンダードエディションに別れてリリースされていました。Oracle(SUNがOracleに買収されちゃったので)のページからダウンロードできるバイナリはPUELが適用されるプロプライエタリ版のみとなっており、オープンソース版は機能がかなり制限される上に自分でコンパイルする必要がありました。

ですが、Version4.0では、VirtualBox本体はGPLが適用されるオープンソースのみとなり、従来PUEL版にのみ含めれていた機能もかなり盛り込まれています。PUELが適用されるのは、USB2.0対応などが含まれた機能拡張パッケージのみとなります。

正直、SUNがOracleに買収されたので、VirtualBoxがどのような扱いになるかは不安だったのですが、とりあえず良い方向に進んでいるようで一安心です。

findの使い方

findって便利なんですが、使いにくいですね。

バージョン管理ディレクトリを検索から除外する
find . \( -type d \( -name '.svn' -o -name 'CVS' -o -name '.git' \) -prune \) -o -print

サブバージョンしか使っていないなら、で良い。以下のサンプルはそれで。
find . \( -name '.svn' -prune \) -o -print

バージョン管理ディレクトリを検索から除外して、ファイルをすべて表示
find . \( -type d -name '.svn' -prune \) -o \( -type f -print \)

バージョン管理ディレクトリを検索から除外して、ディレクトリをすべて表示
find . \( -type d -name '.svn' -prune \) -o \( -type d -print \)

バージョン管理ディレクトリを検索から除外して、特定の名前のファイルを表示
find . \( -type d -name '.svn' -prune \) -o \( -name "GNUmakefile" -type f -print \)

ワイルドカードも使えます
find . \( -type d -name '.svn' -prune \) -o \( -name "*.mk" -type f -print \)
find . \( -type d -name '.svn' -prune \) -o \( -name "*.[ch]" -type f -print \)

複数パターンを指定する場合は\( \) で囲む必要があります。これは、すべてのソースとヘッダと表示する例です。
find . \( -type d -name '.svn' -prune \) -o \( \( -name "*.[ch]" -o -name "*.[ch]pp" \) -type f -print \)

検索結果それぞれに付いてコマンドを実行する
find . \( -type d -name '.svn' -prune \) -o \( \( -name "*.[ch]" -o -name "*.[ch]pp" \) -type f -print0 \) |xargs -0 -n1 svn status

現在のワーキングコピーにおいて空のディレクトリを検索する
find . \( -type d -name '.svn' -prune \) -o \( -type d -print0 \) |xargs -n1 -0 -iX sh -c 'if [ "$(ls -aC "X")" = ". .. .svn" ];then echo X;fi'

2010年11月29日月曜日

Blogger touch

このサイトをiPhoneから快適に見られるように Blogger touchを設定する。
ちなみに最初の投稿を編集する前に設定したのでこれを書いている時点ではまだ出来ているかどうかはわからないw

http://bloggertouch.sopili.net/

にアクセスして、Googleアカウントでログインして、指示に従うだけ。