2020年10月22日木曜日

Eclipse Sirius Web のサンプルプロジェクトを試す

Eclipse Sirius の クラウドベーススタックである Sirius Web, それのサンプルを動かした。

基本的には sirius-web/README.adoc の手順通り。

各コンポーネントの同期がとれていないのか、手順そのままでは動かなかったので、いくつか詰まった点を追記している。

前提

  • OS: Windows 10 Pro
  • Docker: Docker version 19.03.13, build 4484c46d9d
  • 使用イメージ: debian:buster-slim

GitHub Package Registry 向けのパーソナルアクセストークンを生成する

  1. Settings -> Developer settings -> Personal access tokens -> Generate new token
  2. New personal access token で必要事項入力
    • Note : read package registry
    • repo にチェックを入れる
    • read:packages にチェックを入れる
    • Generate token キー押下
  3. 表示されたアクセストークンをメモ

ビルド用コンテナ起動

最終的に、このコンテナで生成した jar ファイルを Windows 上で動かす。(ので、ポート指定は無し)

docker run -it --rm --name sirius-web -v "$(pwd):/work" -v "$HOME/.m2:/root/.m2" --workdir="/work" debian:buster-slim

作業用コンテナ内で環境構築

ビルドに必須な環境を構築

Java11, Maven, curl, git, nodejs, yalc, rollup が必要。

apt-get update
mkdir -p /usr/share/man/man1
apt-get install -y openjdk-11-jdk-headless curl git maven

# nodejs インストール
curl -sL https://deb.nodesource.com/setup_15.x | bash -
apt-get install -y nodejs

# rollup, yalc インストール
npm install -g rollup yalc

# npm 自身のアップグレード
npm install -g npm

ソース取得・ビルド

ObeoNetwork/Flow-Designer

cd /work
git clone https://github.com/ObeoNetwork/Flow-Designer.git
cd Flow-Designer
mvn clean install

ビルド済みのものが以下 issue にぶら下がっているが、それに気付く前にビルドしてしまった。

See: https://github.com/eclipse-sirius/sirius-web/blob/d4955a228200b22d78b9c37e45101efda03b976b/backend/sirius-web-sample-application/pom.xml#L44

eclipse-sirius/sirius-emf-json

# sirius-emf-json の取得・ビルド・インストール
cd /work
git clone https://github.com/eclipse-sirius/sirius-emf-json.git
cd sirius-emf-json
mvn clean install -f releng/org.eclipse.sirius.emfjson.releng/pom.xml

eclipse-sirius/sirius-components

# sirius-components の取得
cd /work
git clone https://github.com/eclipse-sirius/sirius-components.git

# sirius-components のフロントエンドをビルド・ローカルパブリッシュ
cd /work/sirius-components/frontend
npm install
npm run build
yalc publish

# sirius-components のバックエンドをビルド・インストール
cd /work/sirius-components/backend
mvn clean install

eclipse-sirius/sirius-web

GitHub の npm registry へのログイン設定

フロントエンドで GitHub の NPM パッケージレジストリを使用しているのでその設定。

echo '//npm.pkg.github.com/:_authToken=TOKEN' > ~/.npmrc
  • TOKEN: パーソナルアクセストークン

GitHub の Maven registry へのログイン設定

バックエンドで GitHub の Maven パッケージレジストリを使用しているのでその設定。

export USERNAME=mikoto2000
export PASSWORD=TOKEN
  • TOKEN: パーソナルアクセストークン

eclipse-sirius/sirius-web のソース取得・ビルド

cd /work
git clone https://github.com/eclipse-sirius/sirius-web.git

# フロントエンド
cd /work/sirius-web/frontend

# npm registry の obeo/sirius-components を削除して、
# ローカルの eclipse-sirius/sirius-components を追加
# See: https://github.com/eclipse-sirius/sirius-web/issues/1#issuecomment-712639686
sed -i -e 's/    "@obeo\/sirius-components": "0.1.27",//' ./package.json
yalc add @eclipse-sirius/sirius-components

# それにともなって、 import している箇所も修正
sed -i -e 's/obeo\/sirius-components/eclipse-sirius\/sirius-components/' ./src/index.js
sed -i -e 's/obeo\/sirius-components/eclipse-sirius\/sirius-components/' ./src/main/Main.js
npm install
npm run build

# バックエンド
cd /work/sirius-web
mkdir -p backend/sirius-web-frontend/src/main/resources/static
cp -R frontend/build/* backend/sirius-web-frontend/src/main/resources/static
cd /work/sirius-web/backend
mvn -s /work/sirius-web/settings.xml clean package

サンプルアプリケーションの実行

ビルドの時点で必要なものは jar の中に全部入ったから、これ以降は Windows 上での作業。

# sirius web 用の PostgreSQL サーバー起動
# See: https://github.com/eclipse-sirius/sirius-web/blob/master/scripts/restart-siriusweb-postgresql.sh
docker run -p 5433:5432 --rm --name sirius-web-postgres -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=dbpwd -e POSTGRES_DB=sirius-web-db -d postgres

# Sirius Web サンプルアプリケーション起動
java -jar sirius-web/backend/sirius-web-sample-application/target/sirius-web-sample-application-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev --spring.datasource.url=jdbc:postgresql://localhost:5433/sirius-web-db --spring.datasource.username=dbuser --spring.datasource.password=dbpwd

http://localhost:8080 へアクセスすると、 Sirius Web の画面が表示される。

参考資料

2020年10月5日月曜日

Sprint Boot で Jackson を使う

試していきます。

前提

  • OS: Windows 10 Pro
  • Docker: Docker version 19.03.13, build 4484c46d9d
    • 使用イメージ: mikoto2000/openjdk:15
  • Java: openjdk 15 2020-09-15

プロジェクト作成

Spring Initializr で作成。

ここ を参照。

依存関係追加

pom.xml に Jackson の依存関係を追加。

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.3</version>
        </dependency>

処理実装

まず、 JacksonApplication.java 全体を載せる。

package dev.mikoto2000.study.jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

import lombok.Data;

@SpringBootApplication
public class JacksonApplication {

    @Autowired
    private ObjectMapper jacksonObjectMapper;

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext context = SpringApplication.run(JacksonApplication.class, args);
        JacksonApplication app = context.getBean(JacksonApplication.class);
        app.process(args);
    }

    public void process(String... args) throws JsonProcessingException {

        String userStringOrig = """
                                {
                                    "id": 0,
                                    "name": "mikoto2000"
                                }
                                """;

        // JSON 文字列からオブジェクトへの変換
        User user = jacksonObjectMapper.readValue(userStringOrig, User.class);
        System.out.println(user);

        // オブジェクトから JSON 文字列への変換
        String userString = jacksonObjectMapper.writeValueAsString(user);
        System.out.println(userString);

    }

    @Bean
    public ObjectMapper mapper() {
        return new ObjectMapper();
    }

}

@Data
class User {
    Long id;
    String name;
}

ObjectMapper の設定

JacksonApplication クラスに、以下修正を行う。

@Autowired できるように(?)、 ObjectMapper を返却する mapper メソッドを追加。

    @Bean
    public ObjectMapper mapper() {
        return new ObjectMapper();
    }

@Autowired で Jackson の ObjectMapper クラスをマッピング。

    @Autowired
    private ObjectMapper jacksonObjectMapper;

変換主処理

readValue, writeValueAsString を使って、オブジェクトと JSON 文字列の変換を行う。

    public void process(String... args) throws JsonProcessingException {

        String userStringOrig = """
                                {
                                    "id": 0,
                                    "name": "mikoto2000"
                                }
                                """;

        // JSON 文字列からオブジェクトへの変換
        User user = jacksonObjectMapper.readValue(userStringOrig, User.class);
        System.out.println(user);

        // オブジェクトから JSON 文字列への変換
        String userString = jacksonObjectMapper.writeValueAsString(user);
        System.out.println(userString);

    }

ログ出力設定

src/main/resources/application.yaml

spring:
  main:
    banner-mode: off

src/main/resources/logback.xml

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
        </encoder>
    </appender>
    <root level="ERROR">
        <appender-ref ref="CONSOLE_APPENDER"/>
    </root>
</configuration>

で、完成したものがこちら。

参考資料

Reprepro で APT リポジトリを構築する

前々回, 前回 と、deb パッケージを作ったので、これを公開する APT リポジトリを作っていく。

コンテナ起動

docker run -it --rm -v "$(pwd):/work" --workdir="/work" debian:buster-slim

APT リポジトリの構築

必須パッケージのインストール

apt-get update
apt-get install -y gnupg2 reprepro

署名用の鍵生成

鍵生成の設定ファイル作成

gpg --full-generate-key
  1. Please select what kind of key you want : `(1) RSA and RSA (default)`
  2. What keysize do you want? (3072) : 4096
  3. Please specify how long the key should be valid. : 0
  4. Is this correct? (y/N) : y
  5. Real name : mikoto2000
  6. Email address : mikoto2000@gmail.com
  7. Comment : Athrill apt repository key.
  8. Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? : O
  9. Passphrase : (空)

鍵の ID をメモしておく。

(今回は 6B5F3367A3F74C173E2E83612F6719AE3DEFC0C0 だった。)

リポジトリ設定

リポジトリ設定格納用ディレクトリの作成

mkdir -p /work/reprepro/conf

リポジトリ設定作成

/work/reprepro/conf/distributions

cat <<EOF> /work/reprepro/conf/distributions
Origin: TOPPERS/hakoniwa
Label: Athrill
Codename: bionic
Architectures: amd64
Components: main
Description: Apt repository for project Athrill
SignWith: 6B5F3367A3F74C173E2E83612F6719AE3DEFC0C0
EOF
  • Codename : ディストリビューションのコードネーム。bionic だったり buster だったり
  • SignWith : gpg コマンドで作成した公開鍵の ID

パッケージの取り込み

cd /work/reprepro
reprepro includedeb bionic /work/athrill-rh850f1x_0.A.0-1_amd64.deb

署名の設定

cd /work/reprepro
gpg --armor --output athrill.gpg.key --export 6B5F3367A3F74C173E2E83612F6719AE3DEFC0C0

動作確認

Web サーバーを立ててそこからインストールしてみる。

APT リポジトリとなる nginx 起動

新しく nginx のコンテナを立てる。

先ほど作成した reprepro ディレクトリを /usr/share/nginx/html にマウントする。

docker run -it --rm -v "$(pwd)/reprepro:/usr/share/nginx/html:ro" -p "80:80" --name nginx nginx

※ 実際は、 db/, conf/ は見えないようにするらしい

正しくインストールできるか確認

先ほど立ち上げた nginx から、正しく apt でインストールできるかを確認する。

新たに debian:buster-slim のコンテナを立ち上げて、 host.docker.internal の APT リポジトリを登録する。

インストールする debian の起動

docker run -it --rm ubuntu:18.04

必要パッケージインストール

apt-get update
apt-get install -y curl gnupg2 software-properties-common

APT リポジトリのキー登録

curl -fsSL http://host.docker.internal/athrill.gpg.key | apt-key add -

APT リポジトリ登録

add-apt-repository "deb http://host.docker.internal bionic main"
apt-get update

インストール

apt-get install -y athrill-rh850f1x

鍵の管理

このままだと、コンテナ終了時に秘密鍵も消えてしまうので、コンテナからエクスポートしてコピーすること。

鍵のエクスポート

cd /
gpg --list-secret-keys
gpg --export-secret-keys --output backup.sec.key mikoto2000@gmail.com
gpg --export --output backup.pub.key mikoto2000@gmail.com

鍵のインポート

gpg --import ./backup.sec.key
gpg --import ./backup.pub.key

参考資料

2020年10月4日日曜日

Athrill2 の deb パッケージ作成を git-buildpackage で管理する

前回、 Athrill の deb パッケージ作成手順を確立したので、今回はそれを git-buildpackage で管理するための手順を確認する。

作業用コンテナ立ち上げ

cowbuilder 実行の権限を渡すために --privileged オプションを付けてコンテナ起動。

docker run -it --rm -v "$(pwd):/work" --workdir="/work" --privileged ubuntu:18.04

deb パッケージの作成に必要な環境を構築

# deb パッケージビルドに必要な環境変数を設定
export DEBFULLNAME="mikoto2000"
export DEBMAIL=mikoto2000@gmail.com
export LONGNAME="mikoto2000"
export USER="mikoto2000"

# tzdata の configuration が走るので、 Azia/Tokyo を選択して(Geographic area: 6, Time zone: 79)
export TZ=Asia/Tokyo
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 必要なパッケージのインストール
apt-get update
apt-get install -y build-essential dh-make git-buildpackage fakeroot devscripts pbuilder cdbs git vim cowbuilder

git config --global user.name "mikoto2000"
git config --global user.email "mikoto2000@gmail.com"

deb パッケージビルドに必要なファイル群の取得・生成

# deb パッケージ用のディレクトリ作成
mkdir athrill-rh850f1x
cd athrill-rh850f1x
git init
git commit --allow-empty -m 'Initial commit.'

# オリジナルのソースコード取得
git submodule add https://github.com/toppers/athrill.git
git submodule add https://github.com/toppers/athrill-target-rh850f1x.git
git commit -m 'Added upstream sources.'

# 作業用ブランチ作成
git checkout -b add_debian_directory

# deb パッケージに必要なファイル群を生成
dh_make --createorig -s -e ${DEBMAIL} -p athrill-rh850f1x_0.A.0 -y
git add debian
git commit -m 'Added debian directory.'

# サンプルファイル類削除
rm -rf debian/*.ex
rm -rf debian/*.EX
rm -rf debian/README.*
rm -rf debian/athrill-rh850f1x-docs.docs

メタデータ編集

debian/control

Source: athrill-rh850f1x
Section: misc
Priority: optional
Maintainer: kanetugu2015 <kanetugu2015@gmail.com>
Bugs: https://github.com/toppers/athrill-target-rh850f1x
Build-Depends: cdbs, debhelper (>= 10)
Standards-Version: 4.1.2
Homepage: https://github.com/toppers/athrill-target-rh850f1x

Package: athrill-rh850f1x
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: Athrill emulator for RH850F1x.
 Athrill core version: 1.1.1

コピーライト修正

debian/copyright

TOPPERS ライセンスに修正。

Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: athrill-terget-rh850f1x
Source: https://github.com/toppers/athrill-target-rh850f1x

Files: *
Copyright: 2019 by Center for Embedded Computing Systems
                     Graduate School of Informatics, Nagoya Univ., JAPAN
           2019 by ESM, Inc.
License: TOPPERS License
 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
 再配布(以下,利用と呼ぶ)することを無償で許諾する.
 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
     表示,この利用条件および下記の無保証規定が,そのままの形でソース
     コード中に含まれていること.
 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
     できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
     ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
     証規定を掲載すること.
 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
     できない形で再配布する場合には,次のいずれかの条件を満たすこと.
   (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
       権表示,この利用条件および下記の無保証規定を掲載すること.
   (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
       告すること.
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
     からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
     本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
     く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.

 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
 びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
 る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
 により直接的または間接的に生じたいかなる損害に関しても,その責任を負
 わない.

ビルドスクリプト修正

debian/rules

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk

install/athrill-rh850f1x::
    install -pd $(DEB_DESTDIR)/usr/bin
    install -pm 755 athrill/bin/linux/athrill2 $(DEB_DESTDIR)/usr/bin/athrill2-rh850f1x
    install -pd athrill-target-rh850f1x/params/rh850f1k/* $(DEB_DESTDIR)/usr/share/doc/athrill/params/rh850f1k

build/athrill-rh850f1x::
    cd athrill-target-rh850f1x/build_linux; make

バイナリファイルのホワイトリスト作成

debian/source/include-binaries

athrill/bin/linux/athrill2

changelog を修正

debian/changelog

athrill-rh850f1x (0.A.0-1) unstable; urgency=medium

  * Initial release.

 -- mikoto2000 <mikoto2000@gmail.com>  Sun, 04 Oct 2020 10:14:22 +0900

メンテナースクリプトの作成

debian/postinst

インストール後に、 update-alternativesathrill2 コマンドを登録

update-alternatives --install /usr/bin/athrill2 athrill2 /usr/bin/athrill2-rh850f1x 10

debian/prerm

アンインストール前に、 update-alternatives で登録した athrill2 設定を削除

update-alternatives --install /usr/bin/athrill2 athrill2 /usr/bin/athrill2-rh850f1x 10

修正をコミット

git add .
git commit -m 'Update debian directory for athrill.'
dpkg-source --commit

ビルド

cowbuilder でクリーンなビルド環境を作って、その中でビルド。

# ビルド環境を作る
cowbuilder --create --basepath /var/cache/pbuilder/bionic.cow --distribution bionic

# ビルド
gbp buildpackage -us -uc --git-pristine-tar-commit --git-pbuilder --git-pbuilder-options=" --basepath /var/cache/pbuilder/bionic.cow --source-only-changes" --git-tag --git-ignore-new --git-upstream-tag=add_debian_directory
  • add_debian_directory: deb パッケージを作る際の元ネタに使うブランチを指定

ビルドが実行され、以下 3 つが生成される。

  • athrill_0.A.0-1_amd64.deb
  • タグ debian/0.A.0-1
  • ブランチ pristine-tar

マージ, push

  1. add_debian_directorymaster へマージ(GitHub なら Pull Request 出したり)
  2. リモートリポジトリがあるならタグ・ブランチを push
    • debian/0.A.0-1
    • pristine-tar

この作業で作ったリポジトリが以下。

mikoto2000/athrill-target-rh850f1x-deb: athrill-target-rh850f1x deb package.

おまけ

以上。

参考資料