OmniAICreator/Qiita-1.07M huggingface dataset:
Counterparty は Bitcoin のブロックチェーンにどう埋め込まれているのか

[1日目の投稿](https://qiita.com/cryptcoin-junkey/items/c296b776bc0b47b3344f)で、下記のように書きました。

> ブロックチェーンに関する細かいことを省いて説明すると、Counterparty はキューイングされたメッセージにより状態遷移する処理系です。

では、Counterparty は、Bitcoin のブロックチェーンのどこに独自のメッセージを埋め込むのでしょうか? という点について概説しておきます。

実際にアプリを書く際には API が全てを隠蔽してくれます。しかし万一 API サーバ側にバグが疑われるときなどには、中身の知識も役には立ちます。

注: Monaparty / Monacoin も、行っていることは全く同じです。

## [おさらい] Bitcoin の送金

まず前提として必要な、Bitcoin の送金について、軽く復習しておきます。

### ブロックチェーンの構造

Bitcoin のブロックチェーンは、複数のトランザクションの束(ブロック)のリストとして表現されます。
Bitcoin アドレスに紐づく残高は、これら構成要素のいずれにも、一切記録されていません。

トランザクションに記録されるのは、どのアドレス(inputs)からどのアドレス(outputs)へいくら送金したかという情報です[^unstrict]。

[^unstrict]: この表現は不正確なのですが、正確を期すと「Mastering Bitcoin」と同内容の長文が必要になるので端折ります。

ブロックには、含まれるトランザクションや直前のブロックの書き換えを困難にするための情報が含まれます。

### 送金時に起こること

送金時には、下記のような作業が裏で行われています。

0. ブロックチェーンに含まれる大量のトランザクションのうち、outputs に自分所有のアドレスが含まれかつ他の送金で使われたものがないものを、かき集めます。これらが送金のために発行するトランザクションの inputs となります。
0. 送金先 (outputs) を指定します。
0. トランザクションに署名をし、bitcoin ネットワークにブロードキャストします。

この後、マイナーがトランザクションに不正がないことを確認し、正当なトランザクションなら直近最新のブロックに続くブロックにまとめます。

### Script 言語

ここで「不正がないこと」をどう確認するか。
Bitcoin では、のトランザクションに、その inputs の使用が正当であるかどうかをチェックするための簡易言語 "Script" [^script]
を outputs に含めることで解決しています。

[^script]: 一般名詞の固有名詞化でとても紛らわしいのですが…

ここは Bitcoin を構成する技術のうち巧妙なところの一つです。お時間があれば是非追いかけて頂きたいところなのですが[^eth]、深く知らなくても Counterparty を理解するためには十分です。
ここでは、__簡易言語を格納する領域がある__ ということを確認するに留めましょう。

[^eth]: 余談になりますが、Script 言語をさらに強力にすると、結果の改ざんが困難な自律分散計算環境ができるはずです。実際 Ethereum は、そのような動機で作られたブロックチェーンといえます。

## OP_RETURN

おさらいは、ここまでです。本題に近づいていきます。

この Script の命令列を格納する領域に、任意の情報が含められたとしたら。
送金システムとしての Bitcoin 以外の用途に Bitcoin ブロックチェーンを活用できます。

誰でも思いつきそうなことで、実際にそう考える技術者が出てきました。
そこで、Script 言語に OP_RETURN という命令が追加されました。
また、Script 言語のための領域も拡張されました。

この命令がどういう働きをするのかは、Qiita 利用者なら名前で想像がつくと思いますが…
Script 言語の処理系は、OP_RETURN 命令を実行するとと、後に書かれている情報を無視して終了します。

### OP_RETURN と Counterparty メッセージ

これを利用して Script 以外の新しい処理系を作ることができます。

新しい処理系を仮に Counterparty と呼びましょう。

Counterparty にに何かをさせたいとき、その指示内容を、トランザクションの Script 領域に、OP_RETURN と(事前に決めた)シグネチャをヘッダとして、独自のデータ構造を埋めていきます[^sigwhy]。

[^sigwhy]: 原理上の話をするならば、シグネチャは無くても構いません。しかし実運用上は、他の処理系が埋め込んだメッセージと区別するために、シグネチャを入れることになります。

Counterparty の処理系は、トランザクションの古いものから順に Script 領域を読み取り、解釈していきます。

一方、Bitcoin 側は、OP_RETURN を読んだ瞬間に続く情報の解釈を止めます。Bitcoin の Script 側に迷惑をかけることはありません。

実際の Counterparty も、上記のような仕組みで動いています。

Bitcoin のブロックエクスプローラで見ると、Counterparty メッセージが含まれる output は「解釈できないデータ」として表示されます。本来なら送金額の検証のための Script 命令列があるべきところでいきなり OP_RETURN が登場するので、文字通り、解釈できないわけです。


## まとまっていないまとめ

以上、Counterparty のメッセージが、 Bitcoin のブロックチェーンに、どう埋まっているのかについて、駆け足でしたが説明しました。

(図表があったほうが解りやすいとは思うのですが…そのうち追加します。)
控えめな Ring

Emacs が何か警告したり操作をキャンセルしたときに通常 Beep 音が鳴ります。これがうるさいので [止める方法](https://qiita.com/ongaeshi/items/696407fc6c42072add54) がありますが、これだけだとなんとも寂しいし警告されたときにそれとわからないと嫌かなということで以下のように設定してみました。

```init.el
(setq ring-bell-function (lambda () (princ "[RING] "))) ; 控えめな ring
```

`C-g` を押すと通常なら Beep 音が鳴りますが、このコードを評価したあとでは echo area に

```
[RING] Quit
```

と表示されるようになります。もちろん音は鳴りません。
EclipseでPlay Framework 2.6 (Java) の環境構築

Play Framework 2.6 (Java) の新規プロジェクトを生成して、Eclipseにインポートするまでの手順まとめです。v2.5.xまで使っていたactivatorコマンドはEOLを迎えたので、v2.6.x以降はsbt[^1]を直接使います。

### 事前条件
- Java 1.8
- sbt v0.13.13以降
- Eclipse インストールされていること

sbtはMacの場合Homebrewで、Windowsの場合[ここから](http://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Windows.html)でインストールしてください。既にsbtが入っている場合、aboutオプションでバージョン確認が可能です。

```bash
$ sbt about
=> [info] This is sbt 1.0.4
```

### プロジェクト作成
```sbt new [テンプレート名]``` で新規プロジェクトを作成します。プロジェクト名やScalaのバージョンなどを聞かれますが、何も入れずにEnterを押せば[]内のデフォルト値が採用されます。

```bash
$ sbt new playframework/play-java-seed.g8
[info] Set current project to play (in build file:〜〜〜)

This template generates a Play Java project

name [play-java-seed]:
organization [com.example]:
scala_version [2.12.3]:
play_version [2.6.7]:
sbt_version [1.0.2]:
```

```sbt run```でアプリが起動し、http://localhost:9000 から稼働確認ができます（初回実行の場合、ライブラリを落とすので時間がかかる）。

### Eclipse用の設定追加
project/plugins.sbtにプラグイン設定を追加。

```plugins.sbt
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.2")
```

次に、build.sbtにEclipse用の設定を追加。

```build.sbt
EclipseKeys.preTasks := Seq(compile in Compile, compile in Test)
EclipseKeys.projectFlavor := EclipseProjectFlavor.Java
EclipseKeys.createSrc := EclipseCreateSrc.ValueSet(EclipseCreateSrc.ManagedClasses, EclipseCreateSrc.ManagedResources)
```

### Eclipseにインポート
Eclipse用の.classpathと.projectファイルを生成。

```bash
$ sbt eclipse
```

これでEclipseにインポート (File > Import > Existing Projects into Workspace) できるようになります。ただ、こうしてインポートした状態だと、view (*.scala.html) から生成されたクラスをEclipseが参照しないのでControllerでコンパイルエラーが出ます。これを解消するため、追加でビルドパスを設定します。

1. Eclipse上でプロジェクトを右クリック > Build Path > Configure Build Path...
2. LibraryタブからAdd Class Folderを選択
3. 開いたダイアログでtarget/scala-2.12/classesにチェックを入れてOK

![スクリーンショット 2017-12-02 13.47.20.png](https://qiita-image-store.s3.amazonaws.com/0/58270/fede0c92-0b02-9250-e666-989177b7152e.png "スクリーンショット 2017-12-02 13.47.20.png")

[^1]: Scala向けのビルドツール。activatorは内部的にsbtを利用していた
WordPress WP_REST_APIで投稿データを取得するでサムネイル画像とアドバンスカスタムフイールド画像を出力する

Wordpress WP_REST_APIを使って、
●サムネイル画像
●アドバンスカスタムフイールド画像
この2つの取得を行います。

##準備
wordpressのヴァージョンは4.9.1です。
デフォルトでWP_REST_APIが設定されているバージョンのお話をします。

####①カスタム投稿タイプを「member」として作成する（作成方法は割愛します）
カスタム投稿タイプの設定で
register_post_typeに、

```ruby:functions.php
'show_in_rest' => true,
```
の記述を忘れずに。

####②カスタムフィールド値の取得には専用のプラグインが必要です。インストール後に有効化する。
[ACF to REST API](https://ja.wordpress.org/plugins/acf-to-rest-api/)


####③APIのURLの確認
カスタム投稿タイプの全件データ所得は下記の記述です。

```ruby:URL
http://example.net/wp-json/wp/v2/member/
```

ですが、今回は画像データもほしいためにカスタム投稿タイプ「/member/」の後ろに「**?_embed**」を記述します。
下記に記述例を書きます。

```ruby:URL
http://example.net/wp-json/wp/v2/member/?_embed
```

※これがわからずに長時間ハマりました。


##出力
上記で準備はOKです。
あとは出力します。

```ruby:html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>WP REST APIテストページ</title>
  </head>
  <body>
    <h2>メンバー 全件</h2>
    <ul id="mylist">
    </ul>
   <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
    <script type="text/javascript">
      $(function() {
          $.getJSON( "http://example.net/wp/wp-json/wp/v2/member/?_embed", function(results) {
              $.each(results, function(i, item) {
                 $('ul#mylist').append('<li>'
                     +'【記事タイトル】' + item.title.rendered
                     +'<br>'
                     +'【記事サムネイル_フル画像URL】' + item['_embedded']['wp:featuredmedia'][0]['media_details']['sizes']['full']['source_url']
                     +'<br>'
                     +'【記事サムネイル_リサイズ画像URL】' + item['_embedded']['wp:featuredmedia'][0]['media_details']['sizes']['w700']['source_url']
                     +'<br>'
                     +'【acf フル画像URL】'　+ item.acf.メッセージ画像.url
                     +'<br>'
                     +'【acf リサイズ画像URL】'　+ item.acf.メッセージ画像.sizes.top_slider
                     +'</li>'
                     +'<hr>');
              });
          });
      });
    </script>
   </body>
</html>
```
GIMPで書籍の表紙を作る

これは[技術系同人誌 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/tech-fanbook)の3日目の記事です。

＜追記＞
通常、表紙を印刷に依頼する場合、塗りたしの部分が必要であるとの指摘をいただきました。

https://www.wave-inc.co.jp/data/basic/nuri.html

塗りたし、背幅を含めたテンプレートを配布してくださっている印刷所が多くあります。このようなテンプレートを利用するのが、この方法より正しい方法になります。

http://www.print-on.jp/doujin/comic/price/hyoshi-template/hyoshi_template_mokuji.htm

＜追記ここまで＞

本の表紙を作ろうと思うと、Adobe製品が必要と思われます。
1冊の本を作るために、Creative Cloudに契約するのは割高に感じます。

他の代替手段としては、

* 表紙作成作業をAdobe製品を持っている方に発注する
* Creative Cloudに1ヶ月だけなど月額契約する https://www.adobe.com/jp/creativecloud/plans.html
* KinkosでAdobe製品の入った店頭PCレンタルする http://www.kinkos.co.jp/office/selfpc.html
* GIMP等のフリーツールで作成したPDFで入稿する

私は技術書典3にて、GIMPで作成し、PDFで入稿できましたので、その過程を紹介します。

## 1. RGBカラーのPDFの入稿が可能かどうか印刷所に確認する

印刷では、モニターのRGBカラーではなく、CYMKカラーを使用します。GIMPではこのCYMKカラーでの作成はできません。このためAdobeでCYMKカラーで作成した原稿のみを受け入れている印刷所さんもあります。よって、必ず確認が必要です。

RGBカラーの原稿であっても、色味を変わりますが対応してもらえる印刷所さんもあるようです。実際にGIMPで作成した原稿を持って事前に大丈夫か問い合わせるのも良い手段だと思います。

私は、GIMPで作成したファイルを専用ツール（Office print）で出力したPDFを受け入れてくれるプリントパック社を利用しました。

http://www.printpac.co.jp/contents/office/

Office Print自体はGNUライセンスを利用しているため、プリントパック社を利用しない場合も利用できます。ただしWindows専用です。

## 2. 本のサイズを決める

同人誌ではB5が一般的のようです。私はA5で作成していました。

## 3. 紙の種類とページ数から背幅を計算する

表紙には、背の部分も含まれます。紙の種類とページ数からこの背幅が決まります。印刷所によっては、この背幅の計算式を提供しているところがあるようです。プリントパック社では、以下のページで背幅を計算できます。

http://www.printpac.co.jp/contents/lineup/musen.html

## 4. 表紙のサイズを計算する

表紙の横と縦をミリメートルで計算します。

* 横: 本の横サイズx2 + 背幅 + 塗りたし部分(3mm x2)
* 縦: 本の縦サイズ + 塗りたし部分(3mm x2)
* ただし、プリントパック社の場合、塗りたし部分がなくても入稿できました。

### 参考

* B5: 182 x 257 (mm)
* A5: 148 x 210 (mm)

## 5. GIMPのキャンパスにサイズを適用する

"ファイル"→"新しい画像を作成"にした場合、"詳細設定"にて、解像度を指定することができます（キャンパスサイズの変更では不可）。解像度が指定されていることで、PDF出力時も適切なサイズで出力されます。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/c41de6c5-b5fa-565c-eb3f-005d68d32bf6.jpeg)

カラーの場合には、解像度は 300 ppi 程度が良いそうなので、それを設定します。

## 6. PDF出力する

Office Printを使って作成する例を示します。

印刷において、"Office Print"を選択します。ここで、プリンタの"詳細設定"を選択します。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/b345bd0e-af9d-e0da-0dc6-ec08bc8b98a6.jpeg)

印刷設定にて"詳細設定"をさらに選択します。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/77f037c9-5752-6c11-7348-ce1391046590.jpeg)

用紙サイズで、"Postscriptカスタムページサイズ"を選択します。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/ed5d0554-3034-173c-14d9-b88d2a45eaac.jpeg)

表紙の用紙サイズを入力します。

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/0f10c136-108b-4808-078c-89b8d846242b.jpeg)

印刷品質で"300dpi"を選択します。

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/3413/abe5c2bd-f0d2-29ca-f34f-fefd6fb7f1f9.jpeg)

この設定でPDFを作成することで適切なサイズのPDFが作成でき、入稿に利用することができます。

## 終わりに

正直、Adobe Creative Cloudは年間契約しかできないと思っていたので、一ヶ月だけ契約できるならAdobe Creative Cloudを使って良いと思います。

また、表紙サイズの誤りによる再入稿などが考えられるため、くれぐれも締切に余裕を持って入稿するようにしましょう。
Markdown日本語対応星取表 —— 強調箇所は分かち書き必須か

## 強調の前後にスペースが無い場合、解釈が異なる

Markdownは英語のように単語を分かち書きする言語を前提としている部分があります。
改行の扱い（スペースになる）がその典型ですが、強調マークアップに関しても分かち書きが前提になっていることがあるようなので、状況を確認しました。

問題になるのは、日本語のような分かち書きしない言語での、

	それが*重要*です

のようなマークアップです。
「`*重要*`」の前後にスペースがありませんが、強調と解釈されることを期待しています。
Markdownを受け付けるツールやサイトは多いですが、こういったケースの扱いは大きく分けると以下3通りのようです。

* 期待通り:  
  `<p>それが<em>重要</em>です</p>` となる
* 概ね期待通り:  
  ただし、`それが*重要!!*です` のように強調される文字列の端が単語を分割する記号だった場合には、強調マークアップと判断されず、`<p>それが*重要!!*です</p>` となってしまう
* 期待と異なる:  
  強調マークアップと判断されず、`<p>それが*重要*です</p>` となってしまう


## 表

上のようなケースで強調マークアップに使われる記号 `*` と `_`、それらの連続である `**`、`__`、`***`、`___` に関して、どのように解釈されるかまとめたのが下の表です。

|                |  `*`   |   `_`   | `**` |  `__`  | `***`  | `___`  |
|:---------------|:------:|:-------:|:----:|:------:|:------:|:------:|
| Markdown       |   ok   |   ok    |  ok  |   ok   |   ok   |   ok   |
| Cmark          |  (ok)  | **NG**  | (ok) | **NG** | **NG** | **NG** |
| Commonmark.js  |  (ok)  | **NG**  | (ok) | **NG** | **NG** | **NG** |
| Marked         |   ok   |   ok    |  ok  |   ok   |   ok   |   ok   |
| Markdown-it    |  (ok)  | **NG**  | (ok) | **NG** | **NG** | **NG** |
| Blackfriday    | **NG** | **NG**  |  ok  |   ok   |   ok   |   ok   |
| Pandoc         |   ok   | **NG**  |  ok  | **NG** |   ok   | **NG** |
| Stack Overflow |  (ok)  | **NG**  | (ok) | **NG** | **NG** | **NG** |
| Qiita          |   ok   |   ok    |  ok  |   ok   |   ok   |   ok   |
| Hatena Blog    |   ok   |   ok    |  ok  |   ok   |   ok   |   ok   |

ok: 期待通り
(ok): 概ね期待通り
NG: 期待と異なる

ちょっと厄介な印象ですが、本家MarkdownやMarkedは全ての表記がOKで、日本語で使いやすそうです。
QiitaやHatena Blogはさすがに日本語ユーザー向けにしっかり対応してますね。

どこで使っても出来るだけ崩れないマークアップを目指す場合、

* `_` より `*` を使った方が期待通り強調として解釈されやすい
* 最も期待通りに解釈されやすいのは `**重要**` のように `**` を使う強調

あたりを考慮するといいかも知れません。
もちろん、日本語でも前後にスペースを入れてしまう、という手もあります。


## 使用したMarkdownパーサー

オプションの指定は行わず、デフォルトで試しています。

* [Markdown 1.0.1](https://daringfireball.net/projects/markdown/)
* [Cmark 0.28.3](https://github.com/commonmark/cmark)
* [Commonmark.js 0.28.1](https://github.com/commonmark/commonmark.js)
* [Marked 0.3.7](https://github.com/chjj/marked)
* [Markdown-it 8.4.0](https://github.com/markdown-it/markdown-it)
* [Blackfriday 2.0](https://github.com/russross/blackfriday)
* [Pandoc 2.0.3](https://pandoc.org/)

（Stack Overflow、Qiita、Hatena Blogに関しては、投稿フォームのプレビューで本日2017年12月2日に試しました）


## この記事のライセンス
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
この記事は[CC BY 4.0（クリエイティブ・コモンズ 表示 4.0 国際 ライセンス）](http://creativecommons.org/licenses/by/4.0/deed.ja)の元で公開します。
C#でOpenCvSharp3のGrabCutを試す

## はじめに

C#でOpenCvSharp3というライブラリを使ってGrabCutを試しました。
ネットにC#でOpenCVを扱った記事も少ないため、備忘録として残します。
OpenCVについては素人以下なので色々間違っているかも知れません。

## 環境

* Windows 8.1
* Visual Studio 2015

## プロジェクト作成

1. Visual Studioを起動
1. C#コンソールアプリケーションを新規作成
1. プロジェクト名は取りあえず`TestGrabCut`としました
1. NuGetでOpenCvSharp3-AnyCPUを追加

## コード

Program.csを開き、冒頭にusing OpenCvSharpを追加します。
プロジェクトルートにGrabCutをしたい画像を追加し、プロパティの出力ディレクトリにコピーを`常にコピーする`に設定。
今回は[こちら](https://www.pakutaso.com/20171017275iphone8-plus-1.html)の画像を利用させていただきました。

後は以下の通りです。

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace TestGrabCut
{
    class Program
    {
        static void Main(string[] args)
        {
            // 前景らしい領域を表す定数
            const int GC_PR_FGD = 3;

            // 対象画像オブジェクト
            Mat image = new Mat("iphone8IMGL7576_TP_V4.jpg", ImreadModes.Color);

            // 前景を含む領域
            Rect rectangle = new Rect(300, 20, 650, 500);

            // 前景を抽出
            var result = new Mat(image.Size(), MatType.CV_8U);
            var bgdModel = new Mat();
            var fgdModel = new Mat();
            var source = new Mat(image.Size(), MatType.CV_8U, new Scalar(GC_PR_FGD));
            // GrabCutするイテレーションに5回を指定
            Cv2.GrabCut(image, result, rectangle, bgdModel, fgdModel, 5, GrabCutModes.InitWithRect);
            Cv2.Compare(result, source, result, CmpTypes.EQ);
            // 抽出した前景を貼り付ける画像、ソースと同サイズの真っ白な画像を指定
            Mat foreground = new Mat(image.Size(), MatType.CV_8UC3, new Scalar(255, 255, 255));
            image.CopyTo(foreground, result);

            // 表示
            Cv2.ImShow("タイトル", foreground);
            Cv2.WaitKey();
        }
    }
}
```

## 結果

少しノイズのようにゴミが残っていますが、中々の結果になりました。

before
<img src="https://qiita-image-store.s3.amazonaws.com/0/141966/5d801b3e-f616-b8a2-8c3f-2e87ff579e67.jpeg" width=50%>

after
<img src="https://qiita-image-store.s3.amazonaws.com/0/141966/8d4baca0-5c76-0095-3296-36214e7e456c.jpeg" width=50%>

## 注意

今回はある程度切り抜きやすい画像を選別しました。
上記のプログラムでは、前景と背景の色が近いと上手く行きません。
追加で手動でのマスク処理が必要になるようです。

テストしてみると、以下のような注意点がありました。

* 切り抜きたい物体が複数だと上手くいかない
* 前景と背景との色の差が明確でないといけない
* 切り抜きたい物の位置は手動で入力になる


位置を固定し、ある程度背景と色の差を明確にすれば自動化できそうです。

## 参考リンク

以下の記事を参考にさせていただきました。

[GrabCutを使った対話的前景領域抽出 &#8212; OpenCV-Python Tutorials 1 documentation](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_grabcut/py_grabcut.html)

[OpenCVSharpによるGrabCut &bull; C言語交流フォーラム　～ mixC++ ～](http://dixq.net/forum/blog.php?b=6728)

## 謝辞

記事を書くにあたって以下を利用させていただきました。
ありがとうございます。

shimat様のOpenCvSharpを使わせていただきました。
<https://github.com/shimat/opencvshar>

ぱくたそ様のこちらの画像を利用させていただきました。
[美しい光沢のブラック（iPhone 8 Plus）](https://www.pakutaso.com/20171017275iphone8-plus-1.html)
xemやモザイクの転送手数料について

# 転送手数料

今日は主に転送の手数料についてまとめました。
それ以外の手数料については、こちらが新しい情報でまとまっていて良いと思います。
[仮想通貨のネム（NEM）/ XEMとは？ 概要と最新情報](https://www.cryptostream.jp/nem_xem/#i)

## TL;DR

https://docs.google.com/spreadsheets/d/1bquZ7ECzYFXG-VRFX1CFydq72iU47HCEbHJYun0DicA/edit?usp=sharing

スプレッドシートに落とし込みました。コピーしてご利用ください。
(いくらかNanoWalletと突き合わせたので多分あってると思いますが、間違ってたらご指摘いただけると幸いです)

[https://bob\.nem\.ninja/docs/\#transaction\-fees](https://bob.nem.ninja/docs/#transaction-fees)

こちらのドキュメントにも計算式は載っていますが、執筆時点で手数料改定前の情報から更新されていないため、現状に即してはいない状態となっています。

### メッセージ手数料

上記の基本手数料に加えて、メッセージの分が上乗せされます。


## 転送手数料(xem)

20,000xem以下は0.05xemで固定、250,000以上は1.25xemで固定です。
その間は10,000xemごとに0.05xemという感じです。

## 転送手数料(モザイク)

可分性、供給量によって手数料は可変します。
メッセージについては前述同様、加算されます。

### Small Business Mosaic(SBM)

特定の条件を満たしているモザイクをスモールビジネスモザイクと呼ばれます。
条件は以下の通り。

* 初期供給量は「10,000以下」
* 可分性は「0」

SBMの条件を満たしたモザイクはSBM用の手数料が適用されます。
同じモザイク手数料ロジックで計算した場合よりも安くて済むようになっています。

## まとめ

これらで算出される手数料は、あくまで最低手数料ですのでそれ以上の手数料でトランザクションを発行することもできます。

通常、わざわざ多めに手数料を払うことにメリットはありませんが、未検証ですが優先的にブロックに取り込まれる…とか？(補足お願いします🙏)
最大値を複数取り出す方法

numpyで配列生成などはよくやりますね。
その配列の最大値のインデックスを知りたい、なんてこともよくありますよね。~~ないなんて言わせません~~

# argmax関数

numpyには最大値のインデックスを求めてくれるargmax関数がありますが、これには少し問題があって**最大値が複数あると最も小さいインデックス**のみを返してくれます。
このことについては[公式サイトのマニュアル](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.argmax.html)にも末尾に記載されています。

```py3:test.py
import numpy as np
b = np.arange(6)    # [0, 1, 2, 3, 4, 5]
b[1] = 5            # [0, 5, 2, 3, 4, 5]
np.argmax(b)        # 1
```

# for文&max関数

対策としてはfor文でやる方法もありますが、スマートじゃありませんし時間がかかりますよね。

```py3:findMax.py
a = np.array([0, 5, 2, 3, 5])
maxValue = np.max(a)
maxIndex = []
for i in range(len(a)):
    if maxVaule == a[i]:
        maxIndex.append(i)
print(maxIndex)    # [1, 4]
```

# enumerate関数&内包表記

そこで**enumerate関数**と**内包表記**を用いてカッコよく最大値を複数取り出します。
下記にそれぞれの参考サイトを記載します。

[Python zipとenumerateの使い方](https://qiita.com/Sylba2050/items/bdf5cf66abb398017459)
[pythonの内包表記を少し詳しく](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7)

では早速書いてみましょう。

```py3:findMax2.py
a = np.array([0, 5, 2, 3, 5])
maxIndex = [i for i, x in enumerate(a) if x == max(a)]
print(maxIndex)    # [1, 4]
```

これだけです。とても簡潔でいいですよね。

これは余談ですが内包表記を使ってリストのstr型をリストのint型に１行で変換することもできちゃいます。paizaなどのプログラムスキルチェックしてくれるサイトの問題等で使えますね。

```py3:strToInt.py
strList = ["0", "1", "2", "3"]
intList = [int(i) for i in strList]
print(intList)    # [0, 1, 2, 3]
```
a-blog cmsのカスタムフィールドの値を使って表示結果をコントロールする

## a-blog cmsのカスタムフィールドの値を使って表示結果をコントロールする方法の覚書

###　【何をしたいのか】
Entryの一覧をサイトのトップにランダムで表示したいけど、一部のエントリーは表示させてくない場合など　

###　【手順】
1.Entryにカスタムフィールドを作成する。（チェックボックス、ラジオボタンなど）
2.EntryBody等のモジュール設定画面にある引数設定を設定する
3.フィールドの入力エリアに「カスタムフィールド名/演算子/値」
　※演算子は、IFブロックのオプションを参考に設定
　https://developer.a-blogcms.jp/document/template/if.html
     
<img width="794" alt="スクリーンショット 2017-12-02 13.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/219380/22292367-764c-5632-1f7a-d667ece03b0e.png">


例：displayフィールドにonが入っている記事を表示したい場合
　　・カスタムフィールド名：display
　　・値：on
　　・記載方法： display/eq/on　

例：displayフィールドが空の記事を表示したい場合
　　・カスタムフィールド名：display
　　・記載方法： display/em/　※エンドの/を忘れずに！
C++ 関数ポインタとはなんぞや？コールバック関数の作り方

たまに聴く謎の言葉「関数ポインタ」について調べてみました。

![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/76843/3aa0ca5c-135e-7434-76bd-e00380746902.jpeg)



#関数ポインタ

関数を開始するアドレス(エントリポイント)を入れるための変数
次のように定義。


下記の例だと (*ptn) が関数ポインタ

```cpp:hoge.cpp

int MyFunc(int a, int b){
    return a+b;
}

int main(){
   //戻り値の型 関数ポインタ Myfuncの引数の型  
   int (*ptn)(int,int) = MyFunc;

   // 関数ポインタを使って関数を実行も可能
   cout << ptn(10,10) << endl

}
```

#コールバック関数

関数の引数に指定することで呼び出される関数。この例ではMyFunc関数



```cpp:hoge.cpp
int MyFunc(int a, int b){
    return a+b;
}

int OutPutFunc(int (*ptn)(int,int)){
    cout << ptn(10,10);
}

int main(){
    OutPutFunc(MyFunc);
    return 0;
}
```
【MarkLogic Server】XQueryチューニングメモ～並列・分散処理のすすめ

はじめに
===
並列処理への移行はチューニングの王道とも言えます。リソースの許す限り複数の処理を同時に行うことができれば簡単に性能向上が見込めます。
スケールアウトに対応するMarkLogicにおいて、複数ノードにてクラスタを組むと分散処理を行うことができます。

MarkLogicと並列処理
===
基本的な戦略は、APサーバからJavaなどのマルチスレッドプログラミングを通じて複数スレッドの実行を行うものです。ロードするContent PumpやXQueryを実行するCoRBはこれに基づいた並列処理を提供します。スレッド数が実行パラメータとして設定されています。CoRBについてはJavaプログラミングコストがなくなるのは便利ですが、個々の処理が独立したトランザクションとして扱われるため、それぞれのエラーがErrorLog.txtに大量に出力されてしまいます。ここは敢えて自身でマルチスレッドプログラムを組むというのもありかもです。

並列処理が可能な条件は、個々の処理が独立した問題であることです。「店ごとに売上合計を計算する」といった場合、A店の売上計算結果はB店の売上計算結果に影響を与えないため、両者は独立した問題として並列処理することができます。

並列処理を行う場合は、CPU/メモリ/ディスクIOの逼迫状況を必ず見ておくことにしましょう。特にSSDではなくHDDを使っている場合はディスクIOに要注意です。

ちなみにContent PumpやCoRBを複数同時に実行させても、全体的な性能は向上しないことが多いです。これは1個のContent Pump/CoRBで既にリソースを使い切っている場合が多いようです。


MarkLogicと分散処理
===
複数のノードで構成されるクラスタを組んでいる場合、MarkLogicに対する処理を各ノードに分散することが可能です。
Content Pumpによる挿入は、クラスタを組むことによって線形とは言わないまでも処理時間が短縮されます。
一方でCoRBは単体では問い合わせを分散しません。問い合わせを受けたノードに、Eノードの役割(クエリの評価など)が集中してしまいます(ここからDノードの役割は分散されます)。これを回避するためにはロードバランサを挟むか、やはり自作のJavaで問い合わせ先を分散させるかになるかと思います。

くれぐれもロードバランサの設定で、CoRBから各ノードへの同時問い合わせ数を1個に制限してしまうことがないようにしましょう。これでは「分散処理」にはなるのですが、より効果の高い「並列分散処理」にはなりません。この場合、CoRBの実行パラメータでいくらスレッド数設定を上げても無意味です。

おわりに
===
並列・分散処理はリソースの許す限り高速化が図れる素朴な方法です。ただし、分散処理においてクラスタ構成やロードバランサの利用が前提なるなど大きな予算処置が伴いますので、テラバイト単位の大規模な開発では初めから構想に入れておくべきです。


```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
少しだけ人生が変わったという話

![IMG_1848.jpg](https://qiita-image-store.s3.amazonaws.com/0/109394/720fa7f7-d17b-3064-4d3a-c900502c28b2.jpeg)

[1年ぶりのクリスマスを大いに楽しんでいるサンタクロース](http://girlydrop.com/event/4634
)

この記事は、 [CoderDojo Advent Calender 2017](https://adventar.org/calendars/2184) の2日目の記事です。

1日目の[manzyun](https://manzyun.bitbucket.io/blog/html/2017/12/01/what_i_am_mentor.html)さんに、ほっこり話とありますので、ほっこり書かせていただきます。

お題は「あなたがDojoに来る理由はなんですか？」ですが、最初は我が子のためでした。

自分の子が小学生になったときに、選択肢の一つとして、CoderDojoがあればいいな。（もちろん強制するつもりはありません）と考えました。
そのためには、活動の火を絶やさないために、まずは自分も地元でメンターとして活動しようと考えたわけです。

*

それが、途中から、「面白い大人に会うため」という理由に変わりました。
もちろん、忍者が作った作品を見るのが楽しいというのもありますが、一番の理由がこれ。
Dojoのチャンピオンやメンターをしている人って、魅力的な人が多いんです。
Facebookのタイムラインを読んでいるだけでも楽しい。

私はずっと内勤だったので、それまで大人の知り合いというのが、自分の友人とか、同じ会社の人たちぐらいだったんですね。

フィラメントというスタートアップの会社に転職したのも、CoderDojo梅田に見学に行った時にFacebookで繋がった方が、あるイベントの募集をシェアしていて、「こんな面白い会社があるんだ」と知ったのがきっかけです。

あと、私が所属するDojoのチャンピオンが、昨年会社を退職して、フリースクールを立ち上げたんです。
そのこと自体も驚いたのですが、その時に、わざわざそれを報告してくれたんですね。
それが嬉しかったし、私もなんか自分のやりたいことを探したいなーと思ったんです。

*

![スクリーンショット 2017-12-02 13.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/109394/c48bb7ad-73a1-d2a3-a5bc-4c006f8dad65.png)


そんな面白い大人たちが集まって、12/3に関西で初めて[でかドージョー](https://coderdojo-sakai-mentors.connpass.com/event/71920/)をすることになりました。
メンター、見学どちらも歓迎です。ぜひ遊びにきてください。

*

2年近くCoderDojoに関わって思うのは、できればFacebookはやった方がいいんじゃないかということです。
もちろん、Facebookをやっていなくても、別の連絡手段を用意してくれるDojoもあるし、全くFacebookを使っていないDojoもあるかと思います。

私自身、FacebookはCoderDojoに関わるまで放置していましたし、最初は、みんなプロフィールに顔を出していることにびっくりしました(^_^;)

でもFacebookや他のSNSを通じて、チャンピオンやメンターが普段どんなことに興味があって、どんなことを考えているかを知ることで、CoderDojoのことを、もっと好きになるんじゃないかなあと思います。
あと、「この人はこんなことを考えているんだな」と知ってもらうと、その後のコミュニケーションもスムーズになると思います。

明日は安川さんの投稿ということで、楽しみです。
プログラミング、立って解くか？座って解くか？

# プログラミング、立って解くか？座って解くか？
太りました。
30代にして不摂生な食生活と運動不足が祟り、健康診断で前年より3KG増加しました。
ウェストはメタボ寸前と診断され、ズボンがきつくて座るのが辛いです。

というわけで、運動不足解消と働き方改革を兼ねて、立って仕事してみることにしました。

## やること
立って仕事する効率性を計測し、座って仕事するときと比較してみます。
計測するにあたり基準が必要になるので、本ブログ投稿前日の12月4日まで、以下を行いました。

- 立って仕事と座って仕事の効率性を比較する
- 隔日で[Paizaのプログラミングスキルチェック](https://paiza.jp/challenges)を立って解いてみて、点数を記録する
- 別の隔日でPaizaの問題を座って解いてみて、点数を記録する
- 言語はPython3を使う
- Paizaの問題はランクC～Bで適当に選ぶ
（ランクC～Bにした理由は、気持ちよく立っていられるのが大体30分で、平均して30分以内にちょうどよく解けるのがCかBであるため）
- Paizaを解くのは業務時間外であるため、仕事中に遊んでいるわけではない
- 立って仕事するだけでは運動不足解消に不安が残るため、週末にはウェイトトレーニングも行う
　（本記事ではベンチプレスとデッドリフトのマックス測定のみを記録するが、実際には他の種目もやっている）
- ときどき体重も記録する
- Paizaは平日必須、土日祝日は任意とし、ウェイトトレーニングは土日祝日に行う

Paizaのプログラミングスキルチェックは以下をご参照ください。
https://paiza.jp/challenges

私自身はPaiza（というか競技プログラミング）は始めてで、初Paizaもこの計測を始める前にちょっと解いてみた程度です。

## 痩せたいなら食事制限すれば良いじゃないか
良くありません。
食べることは人生最高の楽しみです。
食事制限なんてしたら仕事どころではありません。

## ベンチプレスとデッドリフト
立ち仕事の効率性よりもウェイトトレーニングに目覚めてしまいそうなエンジニアは以下をご参照ください。
- ベンチプレス
https://www.youtube.com/watch?v=LaC9fEBtMfM
- デッドリフト
https://www.youtube.com/watch?v=fhYAJMzHHVM

## 立ち仕事の効率性を計測する
さて、立ってプログラミングvs座ってプログラミングを2017/11/08～2017/12/01までやってみた記録が以下になります。

| date  | sit or stand  | problem rank | point | myWeight |
|:--:|:---:|:---:|:---:|:--:|
| 2017/11/08  | sit  | C  | 100 | 74KG |
| 2017/11/09  | stand  | C  | 100 | - |
| 2017/11/10  | sit  | B  | 100 | - |
| 2017/11/11  |  stand | B  | 80 | - |
| 2017/11/13  | sit  | B  | 100 |  - |
| 2017/11/14  | stand  | B  | 100 |   - |
| 2017/11/15  | sit  | B  | 70 |     - |
| 2017/11/16  | stand  | B  | 100 | 73KG    |
| 2017/11/17  | sit  | B  | 100 |     - |
| 2017/11/18  | stand  | B  | 100 | -     |  
| 2017/11/19  | sit  | B  | 100 | -     |
| 2017/11/20  | stand  | B  | 100 |  -    |
| 2017/11/21  | sit  | B  | 100 | 75KG     |
| 2017/11/22  | stand  | B  | 60 | -     |
| 2017/11/23  | sit  | B  | 100 | -     |
| 2017/11/24  | stand  | B  | 100  | 74KG   |
| 2017/11/25  | sit  | B  | 100 | 74KG    |
| 2017/11/27  | stand  | B  | 60 | -     |
| 2017/11/28  | sit  | B  | 50  | - |
| 2017/11/29  | stand  | B  | 100  |  - |
| 2017/11/30   | sit  | B  | 100 |  -   |
| 2017/12/01  | stand  | B  | 80 |  73kg  |

ついでに、ベンチプレスとデッドリフトのマックス測定記録です。

| date  | weight training  | max weight |
|:--:|:---:|:---:|
| 2017/11/11  | ベンチプレス  | 100KG |
| 2017/11/11  | デッドリフト  |  140KG |
| 2017/11/18  | ベンチプレス  | 105KG |   
| 2017/11/19  | デッドリフト  | 125KG |  
| 2017/11/26  | ベンチプレス  | 100KG |
| 2017/11/26  | デッドリフト  |  150KG  |



## 感想
立ち仕事と座り仕事のPaiza記録をまとめると以下になります。

| stand average score  | sit average score  | total average score |
|:--:|:---:|:---:|
|  89.1 | 92.7  | 90.1  |

立って仕事するよりも座って仕事するほうが約3.6点、高得点でした。

ジャンルの得意不得意でいうと、配列操作や場合分けで解く問題、または文字列処理はOKでした。普段、Pythonで機械学習やディープラーニングをメインに書いているためだと思います。
逆に普段プログラミングすることのない面積や模様のような問題は苦手です。
立つ座るよりも、ジャンルの得意不得意のほうが回答に差が出ていると思います（が、ジャンルを記録していなかったため、測定できません）。

やってみた感想は、立って仕事する場合は20分経過したくらいから疲れて集中力が落ちる気がしました。
逆に座っていると、40分くらいで一度気晴らししたくなります。
立つ、座るに拘らず、定期的に姿勢を変えるほうが良いと思います。

ウェイトトレーニングは若い頃ほどの数値は出ませんが、それでもベンチプレス105KG、デッドリフト150KGは上がりました。
体重は減りませんでした。
むしろ筋肉が肥大したため、ズボンが更にきつくなりました。

# この期間中にPaizaランクSになりました！
（この測定とは別の話なので、上のテーブルには記載していません）
Nexus7(2012)にubuntu13.04をインストール

# 概要
今更だが、Nexus7が中古で3000円で手に入ったのと、手軽に持ち運べるサブノートにしたいと思った。

# 準備
## ubuntuのパソコンを用意
※()は不必要かもしれないので動かなかったらやれば良いかも

sudo apt-add-repository spa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
java -version
javaのバージョンを表示される

(sudo apt-get lib32stdc++6)
(android studioを検索してlinux用のものをダウンロートして解答)
(./android-studio/bin/studio.sh)
(android studioのインストール画面に沿ってインストール)

sudo apt-get install android-tools-fastboot
(sudo apt-get install android-tools-adb)

## ダウンロード
　http://old-releases.ubuntu.com/releases/13.04/
　・ubuntu-13.04-preinstalled-desktop-armhf+nexus7.bootimg
　・ubuntu-13.04-preinstalled-desktop-armhf+nexus7.img.gz
# Nexus7にインストール
困ったら公式ドキュメント
https://wiki.ubuntu.com/Nexus7/Installation

Nexus:電源を切る
Nexus:音量ボタンの+と-を同時に押しながら電源オン
Nexus:ドロイド君の画面が表示される
NexusとUbuntuパソコンをつなげる
Ubuntu:sudo fastboot devices
Ubuntu:devicesが表示されてたらOK、何も出なかったら「準備」の()をインストール必要があるかも
Ubuntu:sudo fastboot oem unlock
Nexus:デバイス上でYesが表示されるので電源ボタンを押して決定
Ubuntu:sudo fastboot reboot-bootloader
Nexus:またドロイド君の画面が表示される
Ubuntu:sudo fastboot erase
Ubuntu:sudo fastboot erase boot
Ubuntu:sudo fastboot erase userdata
Ubuntu:sudo fastboot flash boot /path/to/*.bootimg*
Ubuntu:sudo fastboot flash userdata /path/to/unzipped/*.img
Ubuntu:sudo fastboot reboot
Nexus:すると「Prepare...」と数分表示されるので待つとUbuntuのセットアップが始まる

私は当初imgをgzのまま突っ込んでしまったので「mmcblk0p9にマウントできませんでした」というエラーが出たので、音量ボタンを押しながら電源ボタンを押すと再度ドロイド君画面になったので突っ込み直したら無事インストールされた。
python環境を使い分ける〜pyenvとcondaのメモ〜

# pyenv memo


## pyenv インストール
pythonを複数バージョン操るためのやつ

```shell-sessions
% mkdir ~/.pyenv
% git clone git@github.com:pyenv/pyenv.git ~/.pyenv
```


### .pyenvrcを追加



```shell-sessions:.pyenvrc
# pyenv file
# https://github.com/pyenv/pyenv#installation

# pyenvのあるpath
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
# pyenv実行
eval "$(pyenv init -)"
```



### .zshrcに.pyenvrcを実行することを追加
.zshrcに以下を追加すれば.pyenvディレクトリと.pyenvrcファイルがある場合にだけ.pyenvrcを実行してくれる

```shell-session:.zshrc
if [ -f ~/.pyenvrc ] && [ -d ~/.pyenv ]; then
    . ~/.pyenvrc
fi
```


## pythonインストール


### どのpythonがインストール可能か探す

```shell-session
% pyenv install list
```


### 好きな環境を落とす

miniconda3をインストールしました。

```shell-session
% pyenv install miniconda3-latest
```

> miniconda-latestはpython3ではなくpython2が入ったminicondaがインストールされるので注意




### pyenvのバージョンを記述

```shell-session:.pyenvrc
export PATH="/usr/bin:$PYENV_ROOT/versions/<落としてきたpython環境を記述>/bin:$PATH"
```

miniconda3を落とした場合

```shell-sessions:.pyenvrc
export PATH="/usr/bin:$PYENV_ROOT/versions/miniconda3-latest/bin:$PATH"
```




## zsh competion でcondaサブコマンドの補完

conda <kbd> tab </kbd>したときに候補が出てくるようにzsh_completionsを追加。
`pacman -S zsh-completions`, `apt-get install zsh-completions`ではインストールするcompletionsではcondaは未サポートなので、gitから人のものをパクってくる必要がある

### conda-zsh-completionsインストール
```shell-sessions
% mkdir my_zsh_completions
% git@github.com:esc/conda-zsh-completion.git ~/my_zsh_completions
```


### _condaのリンクをmy_zsh_completionsディレクトリに貼る
```shell-session
% ln -s ~/my_zsh_completions/conda-zsh-completion/_conda ..
```

### ~/.zshrcのfpathにcompletionsを追加

```shell-session:.zshrc
fpath=(${HOME}/my_zsh_completions $fpath)
```

再度ログインするなどしてzsh-completionで_condaを有効化

```shell-session
% exec $SHELL -l
```


### pyenvで落としてきたpythonをアクティベート
```shell-session
% source activate
```


### condaで環境をクローンする

デフォルトのrootという名前の環境はバックアップ用として使うつもりなので、通常使う環境としてsnowという名前の環境を作成(rootのコピーを取る)

```shell-session
% conda create --name snow --clone root
```

snowをアクティベートする

```shell-session
% source activate snow
```


### condaアプデ

```shell-session
% conda update --all
```
変数宣言const、letについてまとめてみた

ES6から変数宣言で「const」「let」が使えるようになりました。
自分のなかで、なぜ「var」ではなく「const」「let」を使った方がいいのかよく分からなかったのでまとめてみました。

## Windowオブジェクトにプロパティを追加できない

グローバルスコープでconst(let)を変数宣言したとき、Windowオブジェクトのプロパティには追加されない。

``` javascript:varを使う
var scope = 'scope';
console.log(scope); // scope

var scope = 'scope';
console.log(window.scope); // scope
```

``` javascript:constを使う
const scope = 'scope';
console.log(scope); // scope

const scope = 'scope';
console.log(window.scope); // undefined 
```

## 巻き上げを行うと「ReferenceError」になる

変数宣言する前にその変数にアクセスしようとしたとき、const(let)は「ReferenceError」になります。

``` javascript:varを使う
function fnc() {
  console.log(scope); // undefined
  var scope = 'scope';
}
fnc();
```

``` javascript:constを使う
function fnc() {
  console.log(scope); // Uncaught ReferenceError: scope is not defined
  const scope = 'scope';
}
fnc();
```

## ブロックスコープの外からはアクセスできない

「if、else、for、for...in、while、switch」など「{}」(ブロック)内にconst(let)で変数宣言したとき、外からアクセスすることができない

``` javascript:varを使う
for (let i = 0; i < 10; i += 1) {
  var scope = 'scope';
}
console.log(scope); // scope
```

``` javascript:constを使う
for (let i = 0; i < 10; i += 1) {
  const scope = 'scope';
}
console.log(scope); // Uncaught ReferenceError: scope is not defined
```

## 参考サイト

- [JavaScriptのスコープ総まとめ](https://app.codegrid.net/entry/2017-js-scope-1)
FizzBuzzで学ぶenumとDisplay, Fromトレイト

#無駄に長いFizzBuzz
Rustは型の扱いなどは厳格で、いい加減な書き方をさせてもらえない言語ですが、
一方で、プログラムを短くスマートに分かりやすく書く機能も充実しています。

今回は、FizzBuzzをenumで定義してDisplayトレイトやFromトレイトを実装することで、
`println!` する部分を極力シンプルにしてみました。

FizzBuzzを書くにしては、えらく冗長で遠回りな作りですが、
みなさんよくご存知のFizzBuzzでこれらの機能の使い方を見ていけたらいいな、と思います。


```rust
use std::fmt;

enum FizzBuzz {
    Fizz,
    Buzz,
    FizzBuzz,
    Number(u32),
}
impl fmt::Display for FizzBuzz {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            FizzBuzz::Fizz => write!(f, "Fizz"),
            FizzBuzz::Buzz => write!(f, "Buzz"),
            FizzBuzz::FizzBuzz => write!(f, "FizzBuzz"),
            FizzBuzz::Number(n) => write!(f, "{}", n),
        }
    }
}
impl From<u32> for FizzBuzz {
    fn from(n: u32) -> FizzBuzz {
        if n % 15 == 0 {
            FizzBuzz::FizzBuzz
        } else if n % 3 == 0 {
            FizzBuzz::Fizz
        } else if n % 5 == 0 {
            FizzBuzz::Buzz
        } else {
            FizzBuzz::Number(n)
        }
    }
}


fn main() {
    (1..101).map(|n| n.into()).for_each(|e: FizzBuzz| println!("{}", e));
}
```

#Rustのenum
Rustでは、enumはCなどでおなじみの単なる列挙型としてだけではなく、変数を持たせられます。

```rust
enum FizzBuzz {
    Fizz,
    Buzz,
    FizzBuzz,
    Number(u32),
}
```

今回、3で割り切れて5で割り切れないことを表す`Fizz`, 5で割り切れて3で割り切れないことを表す`Buzz`, 3で割り切れてかつ5で割り切れることを表す`FizzBuzz`、3でも5でも割り切れない`Number(u32)`の値を持てるように作ってみました。

#fmt::Display
`fmt::Display`トレイトは、`println!("{}", x)`などで表示したときのフォーマットを定義するトレイトです。
FizzBuzzのルールに従ったフォーマットを定義しました。

#From
`From<T>`を定義することで、`FizzBuzz::from(t)`ができるようになります。また、`T::into::<FizzBuzz>(t)`も使えるようになります。
ここでは、整数からFizzBuzzへの変換について定義しています。

#イテレータ部分
コメントで説明します。

```rust
// 1から100までの整数のイテレータです。型推定がいい感じに働いて、u32になっているはずです。
(1..101)
     // u32をFizzBuzz型に変換しています。後段で型を指定しているため、これだけで型推定が働く仕組みになっています。
    .map(|n| n.into())
     // inspect自体は値を加工せず、そのまま後段に渡します。デバッグなどの用途に適しています。
    .inspect(|e: &FizzBuzz| println!("{}", e))
     // イテレータの最後の値を返すためのものですが、イテレータを最後まで進めるためにダミーで入れています。
    .last();
```

#まとめ
Rustの機能をうまく使って型を定義し、トレイトを実装すると、型を使う段階で楽ができます。
みなさま、よきRustライフを！
Boostrap4でtooltipに画像を表示させる

# Tooltip with HTML

Bootstrap4からTooltipにHTMLを直接書けるようになったので、テキストだけではなく画像も表示できるのか確認しました。

## 公式ドキュメント

[Tooltips · Bootstrap](https://v4-alpha.getbootstrap.com/components/tooltips/)

![tooptips_with_HTML.png](https://qiita-image-store.s3.amazonaws.com/0/141934/93d2e62c-5ea0-4bc6-7120-3996b9a3256a.png)

```html:HTML
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="<em>Tooltip</em> <u>with</u> <b>HTML</b>">
  Tooltip with HTML
</button>
```

```js:JS
$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})
```

## Tooltipに画像を表示させる

[CodePen: Bootstrap4 tooltip with image](https://codepen.io/NaokiIshimura/pen/XzOJBL/)

![tooptips_with_Image.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5bfa56ac-6e4f-bfcc-5210-3bb1ca3ce180.png)

```html:HTML
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-html="true" title="animal<br><img src=&quot;https://placeimg.com/100/100/animals&quot;>">
  Tooltip with Image
</button>
```

```js:JS
$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})
```
チームとして行う障害訓練のススメ(Disaster in recovery training) （インシデント管理）

この記事は、[Product Manager #pdmAC Advent Calendar 2017](https://qiita.com/advent-calendar/2017/productmanager)の3日目です。
ローンチしたサービスをチームとして運用していく中で、必ず直面するであろう「障害」への向き合い方についての事例を説明します。

####■ 前提
ローンチしたサービスを保守運用していく上で、インシデント管理は非常に重要です。
インシデントばかりでサービスの稼働率が低いと自然とユーザも離れていってしまいます。
ここでは、障害を起こさないためのインシデント管理ではなく、**障害を早く復旧する方法**としての「障害管理」の方法を記載したいと思います。

####■ 障害訓練について
障害訓練とは端的に言うと
**「インシデント対応者以外の人が「障害シナリオ」をもとに意図的にシステムに障害を起こし、対応者がいかに早く障害を復旧させるかのプロセスを学習するプログラム」**です。
<img width="656" alt="スクリーンショット 2017-10-28 13.30.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/f391804f-1eff-81b8-d3a2-9aada0212526.png">


目的や学習するべき部分は下記になると考えられます。

- 原因追求のアプローチ改善
    - 障害起因に対して、障害原因の箇所の「追求」から「発見」に至るまでのアプローチ方法を改善することで、全体を通した復旧までの時間を短縮する。 
    
- 復旧までのアプローチ改善
    - 障害原因の「発見」したら、いかにその障害を早く「復旧」させるかのアプローチの仕方を改善することで全体を通した復旧までの時間を短縮する。
    
- 報連相の粒度・質・タイミングの改善
    - 報告をエスカレーションする必要がある場合は、どんな報告・連絡・相談をするべきかをある程度標準化することで全体を通した復旧までの時間を短縮する。 



#### ■ 障害訓練の実施の流れ

▼ 障害訓練の流れ
<img width="853" alt="スクリーンショット 2017-10-28 13.45.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/122901/df337b77-c65a-5581-bad4-a2c6b726e847.png">

**補足として障害訓練における目標復旧時間を定めて、その時間以内の復旧を目指すようにするとさらに緊張感が生まれると思います。**

▼ 下記に障害訓練を実施するにあたる役割を記載します。

| 役割       |       説明 |    
|:-----------------|:------------------|
|障害起因役             | 障害起因を起こす及び障害シナリオを作成する人   |    
|インシデント対応者           |障害起因に対して、障害原因を探し復旧させる。(チーム) | 
|プロセス記録役             |障害訓練の最中にインシデント対応者がどういった行動を行なっていたかを詳細に記録する人 |     



#### ■ プロセス記録役は何を記録するのか。
障害訓練は、プロセス記録役が非常に重要です。ここで記録したプロセスをもとにどこを改善すればよいかが見えてきます。
ここでは障害対応中の**「会話のプロセス」及び「アクションのプロセス」**を記録することをオススメしています。
例えば、下記のほうな形です。

|人       |       時間 | プロセス   |
|:-----------------|------------------|:------------------|
|   Aさん       | 10/28 10:00  |  〇〇より障害を検知しました。私のほうで調査に入ります。  |
|   Bさん(リーダー)        | 10/28 10:10| 承知しました。対応お願いします。|
|   監視ツール    | 10/28 10:20 |障害対象ではないアプリケーションでエラー通知|
|     Bさん       |10/28 11:00 |Aさん、状況どうでしょうか？|
|     Aさん       |10/28/11:20 |障害原因を突き止められずに試行錯誤していた結果、他アプリケーションにも影響がでてしましました。|
|     Cさん       |10/28 11:00 |Aさん、私のほうで15分前に障害原因を特定し、復旧作業に入っています。|


上記のようなプロセスを取ることで、下記の問題点が可視化されます。

#####*★Aさん、Cさんによる単独的な行動が可視化され報連相の粒度・質・タイミングの改善ポイントが見える。*
上記の場合は、まずインシデント対応者のリーダーであるBさんが状況を詳細に把握して体制を組むべきと考えます。それから人的リソースがどのくらいいるかを判断し適切にインシデント対応者をアサイン、原因追求の分担を行うような流れがよいと考えます。

#### ■ 振り返りについて
障害訓練が終わったら、関係者全員で振り返りを行うことを推奨しています。その場で行うことは下記です。

① 「会話のプロセス」及び「アクションのプロセス」の読み合わせをし、改善点を全員で出し合う。
② 復旧プロセスについての技術点議論を行う。障害起因役を中心にどうやったら早く復旧できる道筋があったかをインシデント対応者と議論します。


####■まとめ
上記に書いたとおり、この取り組みをだいたい**四半期に1度**行うと形骸化せずに上にも書きましたが下記のような成果ができるとおもいます。
- 原因追求のアプローチ改善
- 復旧までのアプローチ改善
- 報連相の粒度・質・タイミングの改善

以上です。皆さんもぜひ障害訓練を行なってみてください。
複素数の指数関数でFizzBuzz

```py3
from cmath import exp
from math import pi

fizz = 1
buzz = 1
for i in range(1, 101):
    fizz *= exp(2j*pi/3)
    buzz *= exp(2j*pi/5)
    fizz_is_1 = abs(fizz - 1) < 0.0001
    buzz_is_1 = abs(buzz - 1) < 0.0001
    if fizz_is_1 and buzz_is_1:
        print("FizzBuzz")
    elif fizz_is_1:
        print("Fizz")
    elif buzz_is_1:
        print("Buzz")
    else:
        print(i)
```

#え? なにこれ?
$\exp(j\theta)$は、半径1の円を$\theta$回転させた座標です。
また、複素数にこれを掛けることで、さらに$\theta$回転させることができます。
今回、$\exp(\frac{2j\pi}{3})$, $\exp(\frac{2j\pi}{5})$を繰り返し掛けることで、繰り返し$\frac{2\pi}{3}$, $\frac{2\pi}{5}$ラジアンずつ回転させて、周期3および5で1に戻ってくる複素数を作って、Fizz, Buzzの判定に使っています。

なお、この方法は、計算誤差が溜まっていくため、繰り返す数が100回などではなく巨大な数だと破綻すると思われますが、100回程度なら問題ありません。
周期も3や5と、小さいので、回転角が比較的大きく、なので`abs(fizz-1) < 0.0001`と、割と余裕を持って1に戻ってきているかの判定もできています。
Matplotlib > 球面上の点の表示 > 隠面処理 > extractFrontPoints()

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### 背景

[pySpherepts > Jupyter > 結果の座標を球面上に表示する実装 v0.1 > 余分な点が見える (奥側の点のようだ)](https://qiita.com/7of9/items/d7d3c810b9ffdef52585)

Matploblibにて球面上の点の表示をしていたが、上記のようにMatploblibでは隠面の点が隠されることなく描画される。

任意のelevationとazimuthに対して、隠面の点を非表示にする。

### 処理

- 点を実際に回転する
- 回転した点の座標でx > 0となるポイントだけを表示対象とする
    - 回転していない点を表示リストに加える
    
回転については以下などの資料にある回転行列を用いる。
https://en.wikipedia.org/wiki/Rotation_matrix

### code

[plotSphNodes_171127.py v0.3](https://github.com/yasokada/pySpherepts_171126/blob/master/plotSphNodes_171127.py)
にて実装した。

主な処理は下記。
thetaの正負扱いやphiの正負扱いは実際の座標系を考慮した。
回転は先にazimuth方向で回転をしないと失敗することを確認した。

```py
def extractFrontPoints(data, elevation, azimuth):
    xx, yy, zz = np.hsplit(data, 3)

    # 1. prepare the rotation matrix
    theta = np.radians(elevation)
    phi = np.radians(azimuth)
    # 1-1. rotation for theta around the y axis
    rottht = [
        [np.cos(theta), 0.0, np.sin(theta)],
        [0.0, 1.0, 0.0],
        [-np.sin(theta), 0.0, np.cos(theta)],
    ]
    # 1-2. rotation for phi around the z axis
    rotphi = [
        [np.cos(-phi), -np.sin(-phi), 0.0],
        [np.sin(-phi), np.cos(-phi), 0.0],
        [0.0, 0.0, 1.0],
    ]

    # 2. Plots in the hidden side are removed
    #   since the code will display hidden plots
    xs, ys, zs = [], [], []
    for axo, ayo, azo in zip(xx, yy, zz):
        # 2-1. rotatio in theta and phi
        #   **rotate in theta firstly will fail**
        wrk = np.matmul(rotphi, [axo, ayo, azo])
        axr, ayr, azr = np.matmul(rottht, wrk)

        # 2-2. extract only front points
        if (axr > 0):
            xs += [axo]
            ys += [ayo]
            zs += [azo]
    xx, yy, zz = xs, ys, zs

    return xx, yy, zz

```


## 結果

### elevation = 30.0, azimuth = 60.0

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1e01f550-6355-919e-22b5-feada5091955.png)

### elevation = 70.0, azimuth = 45.0

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c5bfe1fe-c5a3-acc7-5169-d693dad8aed0.png)

### 備考

描画に失敗する組合せもあるのか裏側のみ表示される場合がある。
(elevation=30.0, azimuth=135.0)

優先度は低いので、作業はここで止めておく。
Power BI 勉強会#6 資料

2017/12/2 Power BI勉強会の資料をこちらに置きます。

Power BI勉強会に初登壇しました！Power BIではあまりフィーチャーされていない地図系のヴィジュアルについてまとめていますので、ご覧ください。

# Power Point 

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/d075e234-21af-41f0-271f-9ce16a3b2613.png)](https://www.slideshare.net/omasutani/power-bi-6-power-bi)

[Power BI勉強会 #6 - Slide Share ](https://www.slideshare.net/omasutani/power-bi-6-power-bi)

# pbix ファイル

一部大きなデータを使う部分は省いております。
[pbixファイル](https://1drv.ms/u/s!Apl2RhES5hB9iIksikskjEDALcsu_Q)

# 利用したパブリックデータ

こちらに置きます。

[Power BI 用パブリックデータ集](https://1drv.ms/u/s!Apl2RhES5hB9iIkrqfhSJwdpoIO0Bg)


関連記事：

[Power BI で地理的解析（基礎編)](https://qiita.com/Masutani/items/d91361db4d59d6721d09)
[Power BI で地理的解析（応用編１）](https://qiita.com/Masutani/items/34cad3287fba9ba44ff4#_reference-47d03d67ef4ccf15e450)
[Power BI で地理的解析（応用編２）](https://qiita.com/Masutani/items/513ed61afbf0f316c936#_reference-26f624ff9a0861a9a0dd)
bashのhistoryに連続して同じコマンドを記録しない

## これは
何回も同じコマンドを打った後に上矢印キーでコマンドを遡りたいときに連続して同じコマンドがhistoryに保存されていると遡るのが面倒なので解消。

##作業
".bashrc"に追記

```
export HISTCONTROL=ignoreboth
```

##追記前

```
$ ls -a
.     ..    file1 file2
$ ls
file1 file2
$ ls
file1 file2
$ history
...
  342  ls -a
  343  ls
  344  ls
  345  history
```

##追記後

```
$ ls -a
.     ..    file1 file2
$ ls
file1 file2
$ ls
file1 file2
$ history
...
  354  ls -a
  355  ls
  356  history
```
PythonでワンライナーFizzBuzz

`python -c 'for i in range(1,101):print(["","Fizz"][i%3<1]+["","Buzz"][i%5<1]or str(i))'`

これだけ。

`False`, `True`が`0`, `1`と評価されることを利用した配列参照と、
`""` が `False` と同等の扱いを受けることを利用して文字列を返す式がミソです。
小技として、`==`は2文字も使ってもったいないので`<`を使ってます。
Xming　起動時のエラー対応 (Error: Can't open display:)

あまりにも初歩的なんでしょうが、一応、備忘録として。

環境は、
Windows10
bash on ubuntu on windows(gensim Doc2Vecで日本語処理したいため)
python3

エラー発生時の状況
---

BoUoWを起動後、次のコマンドを入力。

```
$ xeyes &
```

すると、次のようなエラー発生 (; ﾟДﾟ)

```
Error: Can't open display: localhost:0.0
```

原因
---

あまりにも単純かもしれませんが一応。
原因は、Xサーバが起動されていなかったため。(;´∀｀)

対処方法
---

対処方法というか、正しい起動方法を備忘録として。

BoUoW上で

```
export DISPLAY=localhost:0.0
```

Windpws10上のXmingアイコンをクリックで、Xmingを起動。

BoUoW上で、

```
xeyes &
```
これで、Xmingの目玉アイコンが登場。

もし、何かもっと良い方法があったら、教えてください。
リモートワークに憧れる人のための、リモートワークをやるためにやっておきたいこと

2017年の10月から私の務める会社には現在リモートワークで業務を行っています。これは私だけではなく、他のメンバーも完全にではないですが週に２〜３回リモートワークを行っていて、業務はうまく回っているように見えます。

どういった経緯を経て現在のような形でリモートワークが行われるようになっていったのかを、コミュニケーションの観点から振り返り、そしてこれからリモートワークをやってみよう、導入しようと思う人達のための足がかりになればいいなと思います。

## 個人のタスクをリモートでやる期

僕達の会社ではチームでの業務を行う場合はタスクの洗い出しをできるだけ前もってやっていたように思います。そのため、個人個人のタスクがはっきりとしていて、会社に行かなくても開発をする感じのタスクについては自分の家でも問題なくこなせています。これは現在でも変わりませんね。

事前にタスクの洗い出しをする。「誰が」「何を」「いつまでに」やるのかを決める。あたり前のことですね。

## 他人のタスクの可視化をしようとおもった期

2年前のCommunication Advent Calendar では、togglを使って他の人が何をやっているのかを可視化するツールを作り、利用した内容を記事にしました。

[他の人が何をやっているのか分かるツールを作った話 - Qiita](https://qiita.com/numa08/items/2f1679a9077ddae21167)

現在、このツールは利用していません。理由としてはタスクの開始、終了時に手動でtogglを動作させる必要があるため、忘れてしまうから。

このツールが解決しようとしたのは、「他の人が今日何をやるのかわからない」という問題でした。他の人がきょうどれくらいの忙しさなのか、何かをお願いしても大丈夫そうなのか、あるいはお願いしたことを忘れていないかどうかとか。また、昨日自分が何をやろうとしてどれくらい進んだのか分からないという問題もありました。

結局、非常にシンプルな方法で解決されました。slackに「asakai」という名前のチャンネルを作り、業務を開始するときそこに自分が今日やることを書き込みます。

<img width="434" alt="Slack_-_covelline__LLC_.png" src="https://qiita-image-store.s3.amazonaws.com/0/6756/99686215-3677-d957-f375-6dbab4a4783e.png">

夕方になると私たちはお茶会という名前でお喋りをする時間を設定しているので、そのタイミングで終わった内容についてはチェックボックスをつけています。また、朝の時点では思いついていなかったタスクや、割り込みで入ったタスクなどもこのタイミングで記録をしておきます。

[毎日お茶会をする開発環境 〜休憩による開発効率の改善〜 - Qiita](https://qiita.com/mironal/items/57bce49a297eeec5b37e)

非常に簡単な方法で自分と他人がやるタスクの内容を共有し、アーカイブできるようになりました。

## 会社の近くに住む期

2016年にオフィスの移転があったのですが、そのタイミングで私もオフィスの近くに引っ越しをしました。電車で通勤をしていたのは1ヶ月にも満たない期間だったかな。

リモートワークの利点としてよく「通勤が不要」「満員電車不要」とかが挙げられるように思いますが、オフィスの近くに住めば通勤時間も短くなり、さらに場所によっては電車も不要です。

## リモートワークができない期

2017年の年始から行っていた社外のプロジェクトの業務はいくつかの問題があって、リモートワークでタスクをこなすことが難しいなと感じていました。

そのプロジェクトで行われる打ち合わせは井戸端会議的な打ち合わせがオフィスの各地で勃発していて、その中で仕様が決まったりタスクが決まっていました。リモートでコミットする身としては、会議のタイミングでもないときに何かが決まっていて、次の会議では決まったことがさも当然のように発表されて驚き最大の法則という印象でした。

また、リモート会議における通信品質についても、話を聞き取ることができない、誰が話しているのかわからないと言った問題があったのですが、いまいち問題をプロジェクトのメンバー内で共有することができず、解決もできませんでした。

オフラインの突発的な会議を防ぐ、あるいはそこで話し合ったことをしっかりと記録して共有する仕組みが必要でした。また、メンバーは全員ヘッドセットの着用をしてリモート会議を行うと言った工夫も必要です。

結局、このプロジェクトでは力を最大に発揮できないなと思ったので夏くらいで抜けました。

## 完全にリモートワークになった期

2017年の10月からは完全にリモートワークを行い、社内のプロジェクトの業務を行っています。しかし、オフィスのメンバーとリモートで会議を行うときにはいくつかの問題がありました。

メンバーの顔が見えない問題は思っていた以上に大事な問題でした。私は人間の顔があんまり得意じゃないので、顔を見る必要性は感じていなかったのですが、複数人でリモート会議を開始するタイミングで顔の見えない人がいるとその人の存在感が感じられず、会議に参加をしているのかどうかがわからなく思いました。

また、当時オフィスのメンバーは1台のmacを利用して複数人対一人（私）の環境で会議を行っていましたが、マイクの指向性の問題で音を拾うことができず、聞き返すというシーンも多くありました。

全員ヘッドセットの着用も試みましたが、やはりマイクの指向性の問題で一人が話している声を他の人のマイクも拾ってしまい、同じ声が二回以上転送されて気持ち悪いという問題もありました。

結局、Yamahaのマイク・スピーカーを購入してある程度問題は解消されました。

[PJP-20UR 特長](https://sound-solution.yamaha.com/products/uc/pjp-20ur/index)

しかし、複数の人が同時に喋ると音声が途切れるなどといった問題もあります。オフィスのメンバー内で会話が盛り上がると、リモートの音声が伝わらなくなってしまい、会話ができなくなります。


## まとめ

こうやってまとめてみるとリモートワークができるようになるための条件としては次のようなものがあるかなと思いました。

- 個人のタスクがはっきりとしている
- 情報の共有を行うツールがあり、それをしっかりと活用している

そしてこれらは、リモートワークと関係なく大切なことですね。
AtomでUMLをライブプレビューできる環境を構築する

# イントロダクション

IoTアプリケーションの設計において、様々なアクターの間でどのようなやり取りが行われるのかを時系列で記述できる[UMLのシーケンス図](https://en.wikipedia.org/wiki/Sequence_diagram)は有効です。次の図は、スマートフォンアプリケーションとデバイス、いくつかのウェブサービスにまたがるやり取りを表したものです。典型的なIoTアプリケーションはさらに複雑で、複数の人々が開発を担当することになります。シーケンス図を用いて、どこを誰が担当し、どのようにやり取りするのかを明確にしておくことにより齟齬の発生を防げます。

<img width="1031" alt="sequence-diagram-example.png" src="https://qiita-image-store.s3.amazonaws.com/0/92577/1b37d80c-eb61-aabe-8769-e3473d5b99be.png">

また、リサーチにおける分析においてもシーケンス図は有効です。往々にして、調査の対象となる現場には様々な登場人物が関わり、その間で複雑なやり取りが発生します。膨大に積み上がった断片的なデータを基にシーケンス図を作成することにより、コミュニケーションのギャップや、不必要なやり取りに時間が費やされているポイントなどを見つけることができるでしょう。

# 課題

シーケンス図はソフトウェア開発の分野で一般的に用いられているため、様々なツールで作成できます。例えば、OmniGraffleやIllustratorなどのツールでテンプレートを用いて作成することもできます。しかしながら、描くために時間がかかる、ツールを操作できる人が限られる、変更の履歴（どの部分をどのように変更したか）をGitのようなツールで管理しにくい、といった課題があります。

# 解決法

ここでは、テキストエディタ「[Atom](https://atom.io/)」にプラグイン「[Markdown Preview Enhanced](https://atom.io/packages/markdown-preview-enhanced)」をインストールし、テキストからUML図を生成するツール「[PlantUML](http://plantuml.com/)」の記法で描く方法を紹介します。これにより、リアルタイムでプレビューを確認しながらMarkdownでシーケンス図を描けるようになります。また、テキストで記述するためGitなどで差分を確認することが容易です。くわえて、プレビューをHTMLなどの形式で出力することも可能ですので、作成後の配布も簡単です。

なお、以下の説明はmacOS High Sierra v10.13.1、ATOM v1.22.1、Markdown Preview Enhanced v0.15.1、JDK 9.0.1の組み合わせで動作確認したものです。

## Markdown Preview Enhancedのインストール

Atomのアプリケーションメニューから**Preferences...**＞**Install**と移動し、「Markdown Preview Enhanced」をパッケージ名として入力して検索すると、候補の中にMarkdown Preview Enhancedが表示されますのでInstallボタンを押してインストールします。

<img width="1012" alt="atom_install_packages.png" src="https://qiita-image-store.s3.amazonaws.com/0/92577/20bae36e-554d-18b0-bccc-a6bc16a03696.png">

## JDKのインストール

Markdown Preview Enhancedに含まれるPlantUMLを動作させるためにはJDK（Java SE Development Kit）が必要です。以下のページにアクセスして自分のプラットフォーム用のJDKをダウンロードしてインストールします。

[Java SE Downloads](http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html)

## 動作確認

インストールが終了したら、適当な名前でMarkdownファイルを作成し、PlantUMLのウェブサイトで紹介されているサンプルをコピー＆ペーストして記述します。

    ```plantuml
    @startuml
    Alice -> Bob: Authentication Request
    Bob --> Alice: Authentication Response
    
    Alice -> Bob: Another authentication Request
    Alice <-- Bob: another authentication Response
    @enduml
    ```

記述できたら、**Packages**メニューから**Markdown Preview Enhanced**＞**Toggle Preview**を選択、もしくは`control`＋`shift`+`m`でプレビューを非表示から表示に切り替えます。初回はJavaを起動するために数秒かかるかもしれませんが、一度起動するとそれ以降は表示と非表示を切り換えても瞬時に反映されるはずです。

![preview_1.png](https://qiita-image-store.s3.amazonaws.com/0/92577/59b2737b-0c45-4536-e007-85ca447f0d10.png)

この状態で、例えば以下のように変更を加えると、瞬時にプレビューにも反映されるのが確認できると思います。

    ```plantuml
    @startuml
    Alice -> Bob: Authentication Request
    Bob --> Tom: Authentication Request
    Tom --> Bob: Authentication Response
    Bob --> Alice: Authentication Response
    
    Alice -> Bob: Another authentication Request
    Alice <-- Bob: another authentication Response
    @enduml
    ```

![preview_2.png](https://qiita-image-store.s3.amazonaws.com/0/92577/4f3cc33e-d2d7-189f-1278-c71b5401c690.png)

PlantUMLの記法に関しては[ウェブサイト](http://plantuml.com/sequence-diagram)に詳しく説明がありますので、参考にしていろいろ試してみるとよいでしょう。