Skip to content

Instantly share code, notes, and snippets.

@junkor-1011
Last active July 10, 2022 14:05
Show Gist options
  • Save junkor-1011/a08d3b4582b82c7b784ec0c58bd8c876 to your computer and use it in GitHub Desktop.
Save junkor-1011/a08d3b4582b82c7b784ec0c58bd8c876 to your computer and use it in GitHub Desktop.
LT用資料(mermaid.js紹介)
<!DOCTYPE html>
<html>
<head>
<title>Title</title>
<meta charset="utf-8">
<style>
@page {
size: 1210px 681px;
margin: 0;
}
@media print {
.remark-slide-scaler {
width: 100% !important;
height: 100% !important;
transform: scale(1) !important;
top: 0 !important;
left: 0 !important;
}
}
body { font-family: sans-serif; }
h1, h2, h3 {
font-weight: normal;
}
.remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
</style>
</head>
<body>
<textarea id="source">
class: center, middle
# Title
---
# Agenda
1. Introduction
2. Deep-dive
3. ...
---
# Introduction
</textarea>
<script src="https://remarkjs.com/downloads/remark-latest.min.js">
</script>
<script>
var slideshow = remark.create({
sourceUrl: 'slides.md',
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>mermaid.md</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<style>
/* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif);
font-size: var(--vscode-markdown-font-size, 14px);
padding: 0 26px;
line-height: var(--vscode-markdown-line-height, 22px);
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-light.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-dark.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
.vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before {
border-left: none;
}
img {
max-width: 100%;
max-height: 100%;
}
a {
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left-width: 5px;
border-left-style: solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 1em;
line-height: 1.357em;
}
body.wordWrap pre {
white-space: pre-wrap;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
pre code {
color: var(--vscode-editor-foreground);
tab-size: 4;
}
/** Theming */
.vscode-light pre {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo";
padding: 0 12px;
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
code {
font-size: 14px;
line-height: 19px;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script>
</head>
<body>
<script>
mermaid.initialize({
startOnLoad: true,
theme: document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast')
? 'dark'
: 'default'
});
</script>
<h1 id="mermaidjs-%E3%83%86%E3%82%B9%E3%83%88">mermaid.js テスト</h1>
<h2 id="%E3%83%95%E3%83%AD%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88">フローチャート</h2>
<pre><code class="language-mermaid"><div class="mermaid">flowchart
A --> B --> D & C --> E
</div></code></pre>
<pre><code class="language-mermaid"><div class="mermaid">flowchart LR
subgraph T [SubGraph]
direction TB
X([Writer]) ==> Y[(DB)]
end
A[Start] --> B[タスク1] --> C{処理分岐1}
C ==> |Yes| D(タスク2)
C -- No --> E{異常復帰処理}
E -.-> |loop| E
E --> |復帰| D
D --> T
T --> F((end))
</div></code></pre>
<h2 id="%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E5%9B%B3">シーケンス図</h2>
<pre><code class="language-mermaid"><div class="mermaid">sequenceDiagram
actor user as ユーザー
participant gw as GateWay
participant app as Application Server
participant db as DataBase
participant sub as Subscriber
Note over user: 要ログイン
user ->>+ gw: post
alt not logged in
gw ->> user: response(403)
else authenticated
gw ->>+ app: data
app ->>+ db: insert record
db ->>- app: res
app ->> sub: publish notification
app ->>- gw: res
gw ->>- user: response(200)
end
</div></code></pre>
<h2 id="git-graph">Git graph</h2>
<p>例えばgitのブランチの運用方法の説明や教育用の資料などに使えそう</p>
<pre><code class="language-mermaid"><div class="mermaid">gitGraph
commit id: "first" tag: "first"
commit
commit
branch develop
commit
commit
checkout main
merge develop
commit id: "id"
commit type: REVERSE id: "reverse commit"
commit id: " "
commit type: HIGHLIGHT id: "highlight"
commit
commit tag:"TAG"
</div></code></pre>
<ul>
<li>起点はデフォルトは<code>main</code>になる様子(<code>master</code>に変えるとかはオプション指定が必要)</li>
<li><code>commit</code>としていて明示的に指定していない部分のidはランダムで変わる</li>
</ul>
<pre><code class="language-mermaid"><div class="mermaid">%%{init: { 'theme': 'base', 'gitGraph': { 'rotateCommitLabel': true } } }%%
gitGraph
commit
commit
branch feature/A
commit
commit
checkout main
branch feature/B
commit
checkout main
merge feature/B
checkout feature/A
commit
commit
merge main
checkout main
merge feature/A
</div></code></pre>
<pre><code class="language-mermaid"><div class="mermaid">%%{init: { 'theme': 'forest' }}%%
gitGraph
commit
commit
branch develop order: 0
commit
branch feature/A order: 3
commit
commit
checkout develop
merge feature/A
commit
branch release/1.0.0 order: 1
commit
commit
checkout main
merge release/1.0.0 tag:"v1.0.0"
checkout develop
merge release/1.0.0
checkout develop
branch feature/B order: 3
commit
commit
checkout main
branch hotfix/A order: 6
commit
commit
checkout develop
branch release/1.0.1 order: 1
merge hotfix/A
checkout main
merge release/1.0.1 tag: "v1.0.1"
checkout develop
merge hotfix/A
checkout feature/B
merge hotfix/A
commit
</div></code></pre>
</body>
</html>

mermaid.js テスト

フローチャート

flowchart
  A --> B --> D & C --> E
Loading
flowchart LR
  subgraph T [SubGraph]
    direction TB
    X([Writer]) ==> Y[(DB)]
    end
  A[Start] --> B[タスク1] --> C{処理分岐1}
  C ==> |Yes| D(タスク2)
  C -- No --> E{異常復帰処理}
  E -.-> |loop| E
  E --> |復帰| D
  D --> T
  T --> F((end))
Loading

シーケンス図

sequenceDiagram
  actor user as ユーザー
  participant gw as GateWay
  participant app as Application Server
  participant db as DataBase
  participant sub as Subscriber

  Note over user: 要ログイン

  user ->>+ gw: post
  alt not logged in
    gw ->> user: response(403)
  else authenticated
    gw ->>+ app: data
    app ->>+ db: insert record
    db ->>- app: res
    app ->> sub: publish notification
    app ->>- gw: res
    gw ->>- user: response(200)
  end
Loading

Git graph

例えばgitのブランチの運用方法の説明や教育用の資料などに使えそう

gitGraph
  commit id: "first" tag: "first"
  commit
  commit
  branch develop
  commit
  commit
  checkout main
  merge develop
  commit id: "id"
  commit type: REVERSE id: "reverse commit"
  commit id: " "
  commit type: HIGHLIGHT id: "highlight"
  commit
  commit tag:"TAG"
Loading
  • 起点はデフォルトはmainになる様子(masterに変えるとかはオプション指定が必要)
  • commitとしていて明示的に指定していない部分のidはランダムで変わる
%%{init: { 'theme': 'base', 'gitGraph': { 'rotateCommitLabel': true } } }%%
gitGraph
  commit
  commit
  branch feature/A
  commit
  commit
  checkout main
  branch feature/B
  commit
  checkout main
  merge feature/B
  checkout feature/A
  commit
  commit
  merge main
  checkout main
  merge feature/A
Loading
%%{init: { 'theme': 'forest' }}%%
gitGraph
  commit
  commit
  branch develop order: 0
  commit
  branch feature/A order: 3
  commit
  commit
  checkout develop
  merge feature/A
  commit
  branch release/1.0.0 order: 1
  commit
  commit
  checkout main
  merge release/1.0.0 tag:"v1.0.0"
  checkout develop
  merge release/1.0.0
  checkout develop
  branch feature/B order: 3
  commit
  commit
  checkout main
  branch hotfix/A order: 6
  commit
  commit
  checkout develop
  branch release/1.0.1 order: 1
  merge hotfix/A
  checkout main
  merge release/1.0.1 tag: "v1.0.1"
  checkout develop
  merge hotfix/A
  checkout feature/B
  merge hotfix/A
  commit
Loading

class: center, middle

mermaid.jsの紹介


mermaid.js概要

  • (公式ドキュメント)
  • プレーンテキスト形式での図表の作成
    • gitで差分管理できる
      • GitHubGitLabだと ネイティブサポート←Markdownで書いておけば自動で図に変換される
      • BitBucket だとプラグイン導入などが必要かもしれない(最新版は未確認)
    • 細かいレイアウトに気を遣わなくて良い
      • 逆に、細かくレイアウトを調整したくなると微妙かも
  • 似たようなコンセプト・機能のツールにPlantUMLがあるが、 JavaやGraphVizを入れなくても良いので導入などがかなり楽そう
    • ただし、後述のように完全な代替にはならなさそう

書ける図の主な種類

詳細は公式 diagram-typesを参照のこと

例えば:

  • フローチャート
  • シーケンス図
  • クラス図
  • ステート図
  • ER図(experimental)

など(他にも色々)

UML周りを中心にPlantUMLの方が対応している図の種類は豊富だが、Git graphや円グラフなどPlantUMLに無い機能もある


使用にあたってのセットアップ

  • 記述するのはVsCodeが一番楽そう
  • 例えばmarkdown-preview-enhanced などのプラグインを有効化しておくと、Markdownのプレビューでmermaid.jsのレンダリングがなされる

使用例


参考


class: center, middle

End

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment