messyなkitchenなブログ

ただひたすらに散らかった台所や人生やその他を晒す。

MENU

3つの道具を描いてみた [脱W〇rd, 脱E×cel, 脱@st@h : #16]

以前読んだ本。
3種類の図を描いて、モヤモヤなどがすっきりするらしい。
手書きではなく Office系アプリ でもなくて PlantUML で描けるかどうかやってみました。

はじめに

図の種類と、それぞれどのような問題解決に適するかはつぎのとおり。 表紙と本文より抜粋。

  • ブランチ
    • 問題をわかりやすく整理する道具
    • ごちゃごちゃスッキリ!
  • クラウド
    • 「あちらを立てればこちらが立たず」の板挟みを解消する道具
    • もやもや解消!
  • アンビシャス・ターゲットツリー
    • 障害を予想して、目標を実現する道具
    • どんよりバイバイ!

ではさっそく、やってみましょう。

ブランチ

ブランチの例。食べるほうではない。

今はこれが精一杯。

  • バナナ が描けない。(バナナ の意味は、書籍を参照)
  • もし かつ ならば を図中に入れるのはむずかしい。上図ではむりやり入れてみた。

ポイント

  • 通常の rectangle は角が直角なので、角を丸くするように skinparam で設定。(3種共通)
  • 上述を特定のものだけに適用されるように、ステレオタイプ を設定。(3種共通)
  • 記述を簡潔にするため、同じ手続きが生じるものは procedure で整理。(3種共通)

クラウド

クラウドの例。IT関係のほうではない。

今はこれが精いっぱい。

  • 何か描画を追加すると、途端にレイアウトが崩壊する。
  • D:行動 - D':行動 間の矢印をギザギザにできない。

ポイント

  • B:要望C:要望 の中間に A:共通目的 を配置するように、ダミーのボックスを配置。
  • ダミーのボックスを表示しないよう、ステレオタイプ を設定してこれを非表示するように指示。
  • 上述のような小細工をしているためか、レイアウトが綱渡り状態。

アンビシャス・ターゲットツリー

アンビシャス・ターゲットツリーの例。びーあんびしゃーす。

今はこれがせいいっぱい。 でも、3つの中ではいちばんいい出来かもしれません。

  • なんか、右側に謎の空白がある
  • ボックス間、もう少し詰めて描画しないと、全体がどんどん大きくなりそう

障害 を 表示 OR 非表示 にできるようにしていますが、その影響で謎の空白部分が出ている可能性があります。
なお、障害 も表示させるとこんな感じ。

アンビシャス・ターゲットツリーの例 2

ポイント

  • 種類ごとに ステレオタイプ を設定し、それぞれの背景色を skinparam で設定。
  • 最終的な 目標0、それ以外を 1~ とし、数値で扱えるようにしている。

まとめ

PlantUMLで、本に載っていた図を(むりやり)描いてみました。

考えるときには、手書きでガンガン書き出し続けるほうが効率がよいと思います。しかし清書に手間がかかります。
清書するときには、ExcelPowerPointなどを使うほうがきれいに完成すると思います。しかし常にレイアウトを気にしなければなりません。
そのちょうど中間、書き出しの効率 と 整然とした配置 の両方を満たせる可能性があります。

書籍はこれです。


ソースコード

共通部分

▶ソースコードはこちら(クリックすると展開されます)

/'
 考える力をつける3つの道具 に登場する図を描いてみた
 '/

' どれを描画するか選択する
!$MODE = "BRANCH"
!$MODE = "CLOUDS"
!$MODE = "ATT"

' 旧デフォルト配色にする
skin rose
' Rectangle の角に丸みをつける
skinparam rectangle {
    RoundCorner<<branch>> 15
    RoundCorner<<clouds>> 15
    RoundCorner<<att_goal>> 15
    RoundCorner<<att_hurdle>> 15
    RoundCorner<<att_interimgoal>> 15
    RoundCorner<<att_action>> 15
}
' Rectangle の背景色を設定する
skinparam rectangle {
    backgroundColor<<att_goal>> PaleTurquoise
    backgroundColor<<att_hurdle>> LightPink
    backgroundColor<<att_interimgoal>> GreenYellow
    backgroundColor<<att_action>> PaleGoldenRod
}
' ステレオタイプ<<.....>>の文字を非表示にする
hide <<branch>> stereotype
hide <<clouds>> stereotype
hide <<att_goal>> stereotype
hide <<att_hurdle>> stereotype
hide <<att_interimgoal>> stereotype
hide <<att_action>> stereotype

ブランチ

▶ソースコードはこちら(クリックすると展開されます)

!if ($MODE == "BRANCH")
/'
 ブランチ
 '/
title __ブランチ__

' ボックスを描き識別名を設定する
!procedure $branchbox($n, $as)
  rectangle "$n" as $as <<branch>>
!endprocedure

!procedure $ifthen($A, $B)
  ' もし A ならば B
  $A -up-> $B
!endprocedure


' ボックスとそれぞれの識別名を設定する
$branchbox("収入が無い", A)
$branchbox("働かない", B)
$branchbox("失業給付金の\n給付期間が終了する", C)

' もし→ならば をつなげる
$ifthen(B, A)
$ifthen(C, A)

' コメント
skinparam noteBackgroundColor White
note bottom of B : もし
note bottom of C : かつ、もし
note left of A : ならば

/' ブランチ 終了 '/
!endif

クラウド

▶ソースコードはこちら(クリックすると展開されます)

!if ($MODE == "CLOUDS")
/'
 クラウド
 '/
title __クラウド__

!$cA = "//A:共通目的//\n" + "ラクして生きていきたい"
!$cB = "//B:要望//\n"     + "お金がほしい"
!$cC = "//C:要望//\n"     + "のんびりしたい"
!$cD1 = "//D:行動//\n"    + "働く"
!$cD2 = "//D':行動//\n"   + "働かない"

' ボックスを描き識別名を設定する
!procedure $cloudsbox($n, $as)
  rectangle "$n" as $as <<clouds>>
!endprocedure

hide <<dummy>>

together {
  circle dummya1 <<dummy>>
  $cloudsbox($cB, BB)
  $cloudsbox($cD1, D1)
}
together {
  $cloudsbox($cA, AA)
  circle dummy <<dummy>>
  circle dummy2 <<dummy>>
}
together {
  circle dummya2 <<dummy>>
  $cloudsbox($cC, CC)
  $cloudsbox($cD2, D2)
}


together {
  $cloudsbox($cB, BB)
  $cloudsbox($cC, CC)
}
together {
  $cloudsbox($cD1, D1)
  $cloudsbox($cD2, D2)
}


' 位置調整
dummya1 -d-> AA
AA -d-> dummya2
BB -d-> dummy
dummy -d-> CC
D1 -d-> dummy2
dummy2 -d-> D2

AA <-[#blue]right- BB
AA <-[#blue]right- CC
BB <-[#blue]right- D1
CC <-[#blue]right- D2
D1 <<-[#red]down->> D2

/' クラウド 終了 '/
!endif

アンビシャス・ターゲットツリー

▶ソースコードはこちら(クリックすると展開されます)

!if ($MODE == "ATT")
/'
 アンビシャスターゲットツリー
 '/
title __アンビシャスターゲットツリー__

' 障害 を表示するとき、コメントアウト OR true にする
!$ATT_SHOW_HURDLE = %false()

!if ($ATT_SHOW_HURDLE == %false())
' 特定のステレオタイプを持つボックスを表示しないようにする
  hide <<att_hurdle>>
!endif

'================================================================
' procedure

' 障害のボックスを描く
!procedure $atthurdle($num, $txt)
  !$n = %string($num)
  !$as = "h" + $n
  rectangle "//障害($n)//\n$txt" as $as <<att_hurdle>>
!endprocedure
' 目標(中間目標)のボックスを描く
!procedure $attgoal($num, $txt)
  !$n = %string($num)
  !if ($num == 0)
    !$as = "g" + $n
    rectangle "//目標//\n$txt" as $as <<att_goal>>
  !else
    !$as = "i" + $n
    rectangle "//中間目標($n)//\n$txt" as $as <<att_interimgoal>>
  !endif
!endprocedure
' 行動のボックスを描く
!procedure $attaction($num, $txt)
  !$n = %string($num)
  !$as = "a" + $n
  rectangle "//行動($n)//\n$txt" as $as <<att_action>>
!endprocedure
' 障害、中間目標、行動 をつなげる
!procedure $attbind($num)
  !$i = "i" + %string($num)
  !$a = "a" + %string($num)
  $a -up-> $i
  !if ($ATT_SHOW_HURDLE != %false())
    !$h = "h" + %string($num)
    $h -right-> $i
  !endif
!endprocedure

' ボックスを描く
!procedure $attbox($num, $hurdle, $goal, $action)
  !if ($num == 0)
    $attgoal($num, $goal)
  !else
    $atthurdle($num, $hurdle)
    $attgoal($num, $goal)
    $attaction($num, $action)
    $attbind($num)
  !endif
!endprocedure

' 目標 or 中間目標 と次の行動をつなげる
!procedure $attnext($num_prev, $num_next)
  !$p = "i" + %string($num_prev)
  !if ($num_next == 0)
    !$n = "g" + %string($num_next)
  !else
    !$n = "a" + %string($num_next)
  !endif
  $p -up-> $n
!endprocedure

'================================================================
' これ以降に記入する

' 目標 (番号は 0 固定)
$attgoal(0, "再就職する")

' 障害、中間目標、行動 を設定する
$atthurdle(1, "働きたい会社が無いかもしれない")
$attgoal(1, "働きたい会社を見つける")
$attaction(1, "就職支援サービスやハロワに行く")
' それぞれをつなげる
$attbind(1)

' 1つの procedureで設定する場合
$attbox(2, "入社できない", "面接に合格し内定を取る", "面接を受ける")
' 途中で改行したい場合は、行末に "\"
$attbox(3, "家族の合意が得られない", \
           "家族の合意を得る", \
           "条件を丁寧に説明する")

' 目標 または 中間目標 と次の行動をつなげる
$attnext(1, 2)
$attnext(2, 0)
$attnext(3, 0)

/' アンビシャスターゲットツリー 終了 '/
!endif