e-tipsmemo

ごった煮

diagram-js example とbpmn-js の再構築②

前回はdiagram-jsのexampleを実行したので、
次はbpmn-jsの差分を追加して起動できるかを確かめる。
動作とコードの確認をするためなので不要なファイルが残っていてもあまり気にしない。

github.com
bpmn-jsをcloneする。

lib以下をdiagram-jsのapp以下にコピーする.
f:id:katakanan:20190531235340p:plain

lib以下にあるものはすべてdiagram-jsのモジュールを
inheritして拡張されたモジュール群となる。

また、適用されるstyleに追加のものがあるので
bpmn-font/dist/css at master · bpmn-io/bpmn-font · GitHub
あたりから引っこ抜いてきたcssファイル群を
public\css以下に置いた。
f:id:katakanan:20190601000131p:plain

github.com

modelerサンプルを参考にapp.jsと、
public以下のindex.htmlを書き換える。

app.js

import $ from 'jquery';

import VModeler from './lib/Modeler';

var container = $('#js-drop-zone');

var modeler = new VModeler({
  container: '#js-canvas',
});
 
function createNewDiagram() {
  modeler.createDiagram(function(err){

    if (err) {
      container
        .removeClass('with-diagram')
        .addClass('with-error');

      container.find('.error pre').text(err.message);

      console.error(err);
    } else {
      container
        .removeClass('with-error')
        .addClass('with-diagram');
    }

  });
}

function main()
{
  createNewDiagram();
}

main();

modelerのサンプルはbpmnファイルを読み込むような動きも可能になっているが不要なので
最初からcreateNewDiagramを呼んでbpmn-modelerが実行されるようにした。

index.html

<!DOCTYPE html>
<html>
<head>
  <title>bpmn-js modeler demo</title>

  <link rel="stylesheet" href="css/diagram-js.css" />
  <link rel="stylesheet" href="css/bpmn-embedded.css" />
  <link rel="stylesheet" href="css/app.css" />
</head>
<body>
  <div class="content" id="js-drop-zone">
  <div class="canvas" id="js-canvas"></div>
  </div>
  <script src="./js/bundle-app.js"></script>

</html>

とりあえずこれで、lib以下に手を加えるとブラウザざ自動更新されるbpmn-js-modelerが動いた(気がする)。
これとは別に自分のlibを作るプロジェクトをdiagram-jsから用意して、
bpmn-jsの動作をブラウザのデバッガーやconsoleなどを追記して確認し、欲しい機能をパクリながら実装していく。

f:id:katakanan:20190601001124p:plain

ちなみにbpmnというのは
Business Process Management Initiative
の略で、。。
ja.wikipedia.org

BPMNによるビジネスプロセスモデリング入門

BPMNによるビジネスプロセスモデリング入門

diagram-js customize 0. font準備

e-tipsmemo.hatenablog.com
diagram-jsからbpmn-jsの再構築した後に、
さて自分のアプリを書く番になると、
PaletteProviderにフォントが必要になるのでその作り方をメモする。

f:id:katakanan:20190606003010p:plain

設定

ドキュメントのプロパティでサイズを変更する。( Shift + Ctrl + D )
f:id:katakanan:20190606003452p:plain

bpmn-jsのフォントのオリジナルだと2048px X 2048pxのsvgを用意しているがサイズは十分大きければどうでもよさそう。
bpmn-font/source/raw at master · bpmn-io/bpmn-font · GitHub
2048px X 2048 pxに設定した。
f:id:katakanan:20190606005626p:plain

描く

整列と配置( Shift + Ctrl + A )を利用してうまいことオブジェクトを配置する。
(基準をページにすればキャンパスにあわせあられる)

真ん中に空洞があるアイコンはオブジェクトを重ねて差分を取るという感じらしい。
Ctrl + A
Ctrl + -
で差分をとって残す。
f:id:katakanan:20190606005704p:plain

アウトライン化?

必要かわからないけど
オリジナルのWebフォントをつくろう その1 | ライオーン
ここに書いてあるのをやっておく。
Shift + Ctrl + G
Ctrl + K

表示→表示モード→アウトライン
で確認できる。
f:id:katakanan:20190606005843p:plain

保存

プレーンSVGで保存する。
f:id:katakanan:20190606005926p:plain

fontello

フォント一個に対して一個のSVGファイルを用意して
それらをすべてFontelloにD & Dする。
f:id:katakanan:20190606010228p:plain

なにかwarningが出るが、この時のプレビューで問題なさそうであれば
ダウンロードするフォントを複数選択して右上からDownloadする。
f:id:katakanan:20190606010326p:plain

フォントの確認

ダウンロードすると
利用するためのCSSとフォントファイルがある。
f:id:katakanan:20190606010854p:plain

VScodeがあればSVG Font Previewを入れるとそのまま見れる。
SVG Font Previewer - Visual Studio Marketplace

f:id:katakanan:20190606012956p:plain
あとは微調整とかデザインセンスとか

diagram-js example とbpmn-js の再構築①

diagram-jsを使うと決めたはいいが、ドキュメントはそこまで親切ではない感じなので
わかったことをメモって行く。

e-tipsmemo.hatenablog.com
最初はdiagram-jsのサンプルはgithubにある
シンプルなdiagram-jsからどう言った点を実装すればbpmn-js(のような機能実装)になるかを確認するために
diagram-jsのexampleにbpmn-jsのファイルを追加していって、bpmn-jsが再構築できることを確認する。

github.com
最初はexample以下の部分のものを抜き出して
webpack、webpack-dev-serverで変更があった場合にすぐにリロードされるような環境を整えた。
e-tipsmemo.hatenablog.com

これを踏まえて、node_modules以外のファイルの位置は以下のようにした。
f:id:katakanan:20190530113137p:plain

package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "./node_modules/.bin/webpack",
    "start": "./node_modules/.bin/webpack --watch & ./node_modules/.bin/webpack-dev-server --hot --inline --progress --colors"
  },
  "devDependencies": {
    "bpmn-moddle": "^5.1.6",
    "diagram-js": "^3.3.0",
    "diagram-js-direct-editing": "^1.4.2",
    "html-webpack-plugin": "^3.2.0",
    "ids": "^1.0.0",
    "inherits": "^2.0.3",
    "jquery": "^3.4.0",
    "raw-loader": "^2.0.0",
    "webpack": "^4.30.0",
    "webpack-cli": "^3.3.1",
    "webpack-dev-server": "^3.3.1"
  }

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: './app/app.js',
  output: {
    path: path.join(__dirname, 'public/js'),
    filename: 'bundle-app.js'
  },
  devServer:{
    contentBase:'./public',
    publicPath: '/',
    watchContentBase: true,
    openPage: 'index.html',
    open: true,
    port: 3001
  },
  module:{
    rules:[
      {
        test: /\.bpmn$/,
        use: 'raw-loader'
      }
    ]
  },
  plugins:[
    new HtmlWebpackPlugin({
      template : "./public/index.html"
    })
  ]
};

これでWSL上から
npm startするとウェブブラウザが立ち上がる。
この状態ではdiagra-jsのサンプルが実行できる(はず

f:id:katakanan:20190531222554p:plain

diagram-js 検討

とあるものが必要なきがしてので、どのように作るのがいいか検討していた。
GUIが欲しかったので
表が得意そうなライブラリが豊富なjavascriptで書くことにして、
javascriptで書くのがつらそうなコアのバックグラウンド処理は
webassemblyとか使おうかなという方針になった。

まずはライブラリを探していた。
作図系ツール・ライブラリまとめ · GitHub
10+ JavaScript libraries to draw your own diagrams (2019 edition)
自分のイメージするGUI操作感からすると、シーケンス図やフローチャート、ブロックダイアグラムといった類

最終的に操作感がよさそうなのとデモの完成度に惹かれて以下のライブラリを使うことにした。
github.com
これ自体は描写部分のシンプルなライブラリで、
描写をもっと拡張したり、オリジナルの要素を追加したいときは
ライブラリのクラス(クラスのようなもの)を継承して実装する。

例として以下のbpmn-jsがdiagram-jsを利用したツール
demo.bpmn.io

f:id:katakanan:20190522140449p:plain
この要素をクリックした右上にContextPadPaletteがあるのがとてもよい。

公式にはdiagram-jsじゃなくてbpmn-jsを使うことを推している気がするが
Walkthrough | bpmn.io

bpmn-jsには
ライセンスが独自でめんどくさい。
読む限りは、基本的に?ロゴを右下に表示しておけばいいきがするが。。
また、bpnm-jsのGUIがすこしだけ自分のイメージとは違うので
diagram-jsから拡張していくことにした。

nodejs Webpack-dev-server js html ウェブブラウザ更新

webpack dev serverの設定メモ

  • エディタでjsをいじるとブラウザで自動リロードされる
  • htmlをいじると自動リロード
  • bundleも更新される(webpack-dev-serverはbundleしたものをメモリ上に置くので実態のファイル自体は更新されない?
  • その他

ファイル構成
f:id:katakanan:20190511101222p:plain
app/app.jsがあり、topファイル
publicにindex,jsがあり、bundle-app.jsも生成される。
package.json

{
・・・・
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "./node_modules/.bin/webpack",
    "start": "./node_modules/.bin/webpack --watch & ./node_modules/.bin/webpack-dev-server --hot --inline --progress --colors"
  },
・・・・
  "devDependencies": {
・・・・
    "html-webpack-plugin": "^3.2.0",
    "webpack": "^4.30.0",
    "webpack-cli": "^3.3.1",
    "webpack-dev-server": "^3.3.1"
  }
}

webpack.config.js

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  mode: 'development',
  entry: './app/app.js',
  output: {
    path: path.join(__dirname, 'public/js'),
    filename: 'bundle-app.js'
  },
  devServer:{
    contentBase:'./public',
    publicPath: '/',
    watchContentBase: true,
    openPage: 'index.html',
    open: true,
  },
  plugins:[
    new HtmlWebpackPlugin({
      template : "./public/index.html"
    })
  ]
};

webpack-pluginとか要らないかもしれないが
いつまでも開発環境にこだわってると始まらないのでこれで

mbed ethernet UDPSocket

すこし確かめたいことがあったので
mbed(LPC1768)でEthernetを用いてUDP通信を行った。

プログラム

mbed osのバージョンによっていろいろと違うらしいので
最新のサンプルをImportする
os.mbed.com

f:id:katakanan:20190407005904p:plain

しかしすでに、exampleにあるような
UDPSocketのコンストラクタでEthernetInterfaceのインスタンスを渡すのは
deprecatedらしい。

    UDPSocket sock(&net);
    SocketAddress sockAddr;


openで渡す。

動作確認

connectでDHCPでIPを取ってくる。
f:id:katakanan:20190407005645p:plain

netcatでUDPパケットを受信できる。
f:id:katakanan:20190407002728p:plain

mbed NXP LPC1768

mbed NXP LPC1768

mbed LPC1768用イーサネット接続キット

mbed LPC1768用イーサネット接続キット

VScode STM32 WSL J-Link arm-none-eabi-gdb

VScode上で、JLinkGDBServerを起動して、
WSLのarm-none-eabi-gdbデバッグできるようにする。

WSL

make
arm-none-eabi-gcc
arm-none-eabi-gdb
は入れておく。

VScode

をインストールする。
ポータブル版でもよい。

VScode拡張機能

f:id:katakanan:20190331171209p:plain
上から
IntelliSencse
Cortex-Debug
日本語化

設定

VScodeでCubeMXのプロジェクトファイルがあるところを
RootFolderとする。
ファイル→フォルダを開くで指定すると、.vscodeフォルダができる。
この中にいろいろなVScodeの設定が保存されている。
f:id:katakanan:20190331170832p:plain

VScodeでCube MXのパスを設定する。

Ctrl + Shift + P

c/c++ : editconfigurationsとする
f:id:katakanan:20190331171537p:plain


includeフォルダを追加しておかないとintellisenseのハイライトがエラーを出して
うざいのでパスを網羅しておく。

Tasks

,vscode内に

tasks.json

をつくる。

makeに必要な操作を列挙する。

GDBServer Path

.vscodeにsetteings.jsonがあるはずで、
cortex-debugはGDBserverの場所を知らないので書いておく、

Debug settings

Ctrl + Shift + D

で左側にデバッグのカラムができるので、
f:id:katakanan:20190331172833p:plain
構成の追加をする。
環境選択ではCortex Debugを選ぶ
f:id:katakanan:20190331173017p:plain
launch.jsonが生成されるのでelfファイルや、その他を設定する。


新しいフィールド値を設定しなければならないときは、
その場所で

Ctrl + Space

を押すとどのような値を設定できるかが表示される。
f:id:katakanan:20190331173304p:plain

preLaunchTaskはgdbServerが起動する前に実行するタスクで
先ほど定義したtasks.jsonから選ぶ。

preLaunchCommandsはgdbが起動した後に実行されるべきコマンドのリストで、
ここでは例として
・ファイルを書き込む。
・mainにbreak pointを打つ
・実行
としている。

デバッグ

main.cを開いて、

F5

を押せばデバッグが開始される。
f:id:katakanan:20190331174500p:plain

デバッグコンソールのログから、
プログラムが書き込まれていて、
ブレークポイントが設定されているのがわかる。
ここからgdbにコマンドを叩ける。

Eclipseを使いたくなかったのでVScodeで頑張ってみたが、
意外と使いやすそうだった。

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング