自動車業界では、MATLAB/Simulinkをベースとしたモデルベース開発が有望視されています。言うと、適用方法によってはそれなりに工数削減や品質向上が出来ると言う事が実証されてきたからです。一方ではモデルベース開発によって逆に工数が増加してしまうケースもあり、まだまだ課題が山積みです。これは、ユーザー様にとっては課題が山積みと言えますが、私にとっては仕事のネタが山積みとも言えます。このブログでは、そういったモデルベース開発に関わっていく中で思った事について書いていきます。更新日は月曜日+気が向いた日です。構成管理システムSimulinkモデルのバージョン管理(6)からの続きです。uniteによるマージ作業をご紹介します。それなりに使えそうだな、と思っていただけるのではないでしょうか。uniteをマージツールとして起動できるようにするため、Mercurial.iniに次の項目を追加します。mediniunite_mergeこれで準備は完了です。いう項目を定義しました。uniteへの引数が違うために正常動作しなくなります。(中央サーバー、および開発PCを使用する)マージを開始する開発者Aと開発者Bが、それぞれ独立してモデルを修正する。バラバラに編集しているうちは幸せなのですが、いつかはモデルを出荷しないといけません。出荷前のマージ作業・・・モデルのマージを手でするのは悪夢のような作業です。子供のころ、新聞の日曜版に載っていた「7つの間違いを探せ」ゲームをよくやっていました。2つの絵がならんでいて、微妙なところに違いがあるやつです。ボウシの色が違ったり、窓から誰かがのぞいていたり・・・子供だからという事もありますが、7つ見つけるのに結構苦労したものです。Simulinkモデルの場合、微妙に違うだけでなくそれが階層構造になっているわけで、これをマージしようだなんて気が遠くなる作業です。ここはぜひ、ツールの力を借りましょう。そんな時は、バージョン管理システムでもって、3点マージを行います。開発者Bの立場に立ってやってみましょう。開発者Aがさきに作業を終え、Kilnに変更をPushしました。次にわれわれ(開発者B)が変更をKilnにPushしようとすると、失敗します。開発者Aの変更内容と衝突があるためです。Synchronizeにて、Pullを実施します。Pullを実施するすると、枝分かれしたバージョンの情報が開発者Bのマシンに取り込まれます。Browserで見てみると、こんな感じになります。枝分かれしたバージョンこの枝分かれしたバージョンを、再び1つにマージしましょう。ここで3点マージです。withすると、次のように表示されます。3点比較画面テキストの場合と違い、画面には2つしかモデルが表示されません。開発者Aのモデル、われわれ(開発者B)のモデルの2つのみが表示されます。ベースとなったモデルは、プロパティのみ表示されるのですがモデルとして表示されることはありません。マージは、どちらかを選択する作業になるテキストファイルのマージの場合、「現在のファイル」「過去のファイル」を見比べた上で、マージされたファイルを手書きします。uniteの場合はそうではありません。現在のモデルでは、Constantブロックのパラメータは1ですよ過去のモデルでは、Constantブロックのパラメータは2ですよで、どうするの?1にするの?2にするの?選んで!さぁ!という感じになります。右をすべて取り込む=過去のモデルを採用ツリーの右クリックメニューにて、現在のファイルの値を採用するか、過去のファイルの値を採用するかを選択できます。過去のモデルの値を採用し、「済み」になったこのように、現在のモデル、過去のモデル、どちらを選ぶのか?をひたすら選択していく事により、マージを実施します。現在のモデルには無く、過去のモデルにはあるブロック現在のモデルにはあるが、過去のモデルには無いブロックについても、ブロックを増やすか?ブロックを削るか?現状維持するか?から選択する形で、マージを行います。ところは、これでOKだと思います。ひと工夫必要な点だいたいは、過去のモデル、現在のモデル、どちらかを選ぶだけでOKだと思います。単純に選ぶだけでは済まないケースも出てきます。uniteは、そういったモードを直接サポートしていません。これでは不便です・・・そんなときは、ちょっとした裏技を使いましょう。この裏技を使う前に、選択によるマージはすべて済ませておいてください。左側に表示されているモデルのブロックを、なんでもいいのでちょっとズラそうとします。適当なブロックを、ずらそうとするすると、次のようなダイアログが出るので、「ロックを解除」をクリックします。ロックを解除いったんこうしてしまうと、プロパティを直接編集できるようになります。編集して、これでOKと思ったら、結果を保存する必要があります。uniteのメニューではなく、埋め込まれたSimulinkのメニューを使います。保存を行うこれで、直接編集する事もできます。uniteからは認識されませんので、注意が必要です。1つ注意点があります。この裏技は、ちょこちょこっと直接編集したい場合には有効ですが、大規模な修正には向きません。uniteで、現在のモデルと、過去のモデルの差分表示をするSimulinkを起動して、現在のモデルを編集するといった作業を行ったほうがよいでしょう。uniteは、差分表示はとても秀逸です。通常のテキスト用Diffとほぼ同じ使用感です。マージ作業は、「現在のバージョン」「過去のバージョン」のいずれかを採用するか?の2択になります。この方式は、「どの部分がマージ済みか?」を確認しやすいのが利点ですが、2択では済まない場合には対応できません。そのため、差分表示させつつ、直接Simulinkを起動してマージ作業を行った方が良い場合もあるかと思います。uniteによって、テキストの場合と遜色のない環境が構築できる事が分かりました。「つなぎ」に苦労する場合も環境が出来あがってしまえば、とても快適なのですが、それまでが大変です。uniteとのつなぎの部分です。上の方にある「Kiln設定」ですが、この方法を見つけるのに2~3時間かかりました。Diffとマージで設定が干渉してしまう、という所が一番の悩みどころで、上記の回避方法を見つけるまでに右往左往してしまいました。AccuRevとのつなぎの設定例が載っています。これらを既にお使いの方は苦労する事はないと思います。今回Mercurial対応もやりましたので、MercurialもOKです。それ以外のバージョン管理システムをお使いの方は、ひょっとすると苦労する事になるかも分かりません。今後、もっともっと設定例が増えていけば、より使いやすくなるのではないかと思います。終了です以上でバージョン管理システムのシリーズは終了です。uniteについてはザックリとしたご紹介しかできませんでした。細かい点がいっぱいあるのですが、残念ながら評価期間が過ぎてしまいました。ほかの企画もいっぱいあってスケジュールが押してますので、とりあえず今回はこれで終了とします。機会があれば、もっとつっこんだレビューをしてみようかと思います。コメントを投稿して頂くには、JavascriptとCookieを有効にしていただく必要がございます。