OmniAICreator/Qiita-1.07M huggingface dataset:
matplotlibの階層構造を知ると幸せになれる(かもしれない)

# 内容
・matplotlibのfigure(図)、axes(軸)、lines(線)の階層構造を知ると幸せになれる
・gcaとgcfも知っておくと便利
・言葉の使い方が正確かは怪しい、実際の実装がどうなっているかも分かりません。誰か教えて下さい。
# 階層構造
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/35426/2ac8d117-de85-13c7-9baa-d5bc1e7fc111.png)

matplotlibは上図のような階層構造を持っている。figureの中にaxesがあり、axesの中にlinesがある。またxやyの値は、linesが持っている。
# gca, gcf
直前に操作したfigureは、現在の図 (current figure)となり、直前に操作したaxesは、現在の軸(current axes)となる。現在のfigureはgcf(get current figureの略?)で取得でき、現在のaxesはgca(get current axesの略?)で取得できる。

```py
gca = plt.gca() 
gcf = plt.gcf()
```
軸を指定せずにplt.xlabel('x')等の軸の操作をすると、現在の軸が操作される。また現在の軸は、plt.axes()で指定できる。

```py
ax = plt.subplot(111)
plt.axes(ax)
```
axesはインスタンスで指定するが、figureは通し番号で指定するようだ。


```py
fig = plt.figure()
plt.figure(fig.number)
```
以下幸せになれるかもしれない実例を挙げる。
# データ
```py
import numpy as np 
import matplotlib.pyplot as plt 

x  = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
```

# 開いているfigureを通し番号をつけて全て保存
```py3
fignums = plt.get_fignums()

for i, fignum in enumerate(fignums):
    plt.figure(fignum)
    plt.savefig(str(i)+'.pdf')
```

# figureからaxesを取ってきて、軸毎に処理をする
```py3
plt.figure()

plt.subplot(1,2,1)
plt.plot(x, y1)

plt.subplot(1,2,2)
plt.plot(x, y2)

axes = plt.gcf().get_axes()

for axis in axes:
    plt.axes(axis)

    # 以下軸ごとの処理
    plt.grid()
    .
    .
    .
```
# linesのyの値をすべて取得
```py3
plt.figure()
plt.plot(x,y1)
plt.plot(x,y2)

Y = []

lines  = plt.gca().get_lines()
for line in lines:
    y = line.get_ydata()
    Y.append(y) # Y[y1, y2]
```
# linesから値をとる
```py3
line, = plt.plot(x, y1)
line.get_data()  # (x,y1)
line.get_xdata() # x
line.get_ydata() # y
```
# linesに値を指定する
```py3
line, = plt.plot(x, y1)
line.set_data(x, y2)
line.set_xdata(x)
line.set_ydata(y)
```
# Animationでlinesの値だけを変える
```py3
import matplotlib.animation as animation
fig = plt.figure()
line, = plt.plot(x[0], y1[0], 'o')

plt.xlim([x[0], x[-1]])
plt.ylim([-1, 1])

def update(i):
    line.set_data(x[:i], y1[:i])

ani = animation.FuncAnimation(fig, update)
plt.show()
```
![anime.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/d883bada-40f3-7e05-3a6b-d8aa1f6893a1.gif)
# Animationでlinesの値だけを変える(2)
```py3
import matplotlib.animation as animation
fig = plt.figure()

Y = [y1, y2]
for y in Y:
    plt.plot(x[0], y[0],'o')

lines = plt.gca().get_lines()

plt.xlim([x[0], x[-1]])
plt.ylim([-1, 1])

def update(i):
    for j, line in enumerate(lines):
        line.set_data(x[:i], Y[j][:i])

ani = animation.FuncAnimation(fig, update)
plt.show()
```
![anime2.gif](https://qiita-image-store.s3.amazonaws.com/0/35426/a3e2c354-54a4-9adc-9714-7f24cbafc372.gif)

# (おまけ)全てのfigureの全てのaxesの全てのlinesのyの値を取得する
```py3
Y = []
fignums = plt.get_fignums()
for fignum in fignums:
    axes = plt.figure(fignum).get_axes()
    for axis in axes:
        lines = axis.get_lines()
        for line in lines:
             y = line.get_ydata()
             Y.append(y)
```
CakePHPの過去、現在、そして未来

これは [CakePHP Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cakephp) の第1日目の記事です。

CakePHP に関する Advent Calendar の初日ということで、CakePHP の過去・現在・未来というのを書いてみたいと思います。

# 過去

日本ではPHPでフレームワークを使うということがまだ一般的でなかった2005年から CakePHP はじわじわとユーザを増やし始め、強力なコミュニティーと大量の書籍が出たことにより、日本のPHPプログラマーの間では Symfony とともにデファクトスタンダードになりました。

Symfony が世界的に流行したことに比べ、CakePHP は日本で爆発的に流行し、活発にイベントが行われ、マニュアルの翻訳も精力的に行われ、加速度的に流行していきました。

特に CakePHP1 系は PHP4/PHP5 の両方で使えたので、PHP5への移行が遅れていた日本の事情にマッチしたというのがあったのかもしれませんが、やはりあの当時あれだけ流行したのは、強力にコミュニティを引っ張っていった方々の功績が大きいと思います。

そして、PHP5専用になった CakePHP 2.0 が2011年10月にリリースされました。CakePHP 1.0 から 2.0 へのバージョンアップは PHP5 専用になった以外は基本的に同じ思想で作られたもので、同時期にバージョンアップした Symfony が 1.0 から 2.0 へのバージョンアップで互換性を捨てて大きくジャンプアップしたのとは対象的でした。

そこからしばらく CakePHP 2.x は順調にユーザを増やしていったのですが、その数年後問題が発生しました。

- CakePHP 3.0 の計画はかなり早い段階で発表されていたが、なかなか出なかった
- そして、ようやく出てきた CakePHP 3.0 は CakePHP 2.x との互換性を捨てて、特に ORM 部分が大幅に改良されたために今までのユーザがバージョンアップについてこれなかった

CakePHP 3.0 が出る前後で、CakePHP を使っていたユーザは選択を迫られました。

- CakePHP 3.0 へ頑張ってバージョンアップする(かなり少数だったと思います)
- CakePHP 2.x を使い続ける(かなりの人達がここになった)
- 別のフレームワークへ移行する

ちょうど Laravel 4 が認知され始めた時期だったため、この時期に Laravel に移った方も多かったのではないかと思います。

# 現在

現在、CakePHPは以下のような状況にあります。

- CakePHP 2系
    - 2系最後のメジャーバージョンでもあり、LTS(Long Term Support)が宣言されている 2.10.x がリリースされています
    - 最新は 2.10.5
    - 2.10.x は 4.0 がリリースされてから、1年間バグフィックスが行われ、18ヶ月間セキュリティフィックスがおこなわれます
- CakePHP 3系
    - 最新は 3.5.6
    - 3系最後のメジャーバージョンになるのは 3.6.x であり、このバージョンが LTS される
    - 3.6.x は 4.0 がリリースされてから、18ヶ月バグフィックスがおこなれ、3年間セキュリティフィックスがおこなわれます
    - 3.6.0 までは積極的に新機能を盛り込んでいく
    - 将来廃止予定の機能に関しては非推奨マークをつけ、将来に備えることができるようにする

日本でのコミュニティの規模は、全盛期に比べると残念ながらかなり縮小しましたが、それでもマニュアルはほぼ完全に日本語化されていますし、そもそも本家サイトで言語切り替えするだけで日本語で読めるというPHPフレームワークは CakePHP だけなので、この点だけでもすごいと思います。

また、CakePHP の公式 slack には #japanese チャンネルがあり、そこでは情報交換が結構行われています。興味があるかた方は是非 join してみてください。

[CakePHP公式の日本語話者向けSlackチャンネル開設のご案内](https://qiita.com/chinpei215/items/3c116171c5308365c314)

# 未来

そして、来年 2018 年には CakePHP4 のリリースが予定されています。

CakePHP4 は、CakePHP 2.x から 3.x への大幅な仕様変更により、コミュニティがついてこれなかったことからの反省を活かし、以下のようなバージョンアップポリシーになっています。

- 3.6 までで非推奨となった機能が完全に廃止されるが、それ以外の機能に関しては互換性を保ったまま 4.0 として動作するようになる
- ただし、PHP 7.1 以上専用になり、PHP 5.6 では動作しなくなる

上記のようなものとなるため、PHP 7.1 で CakePHP 3.6.x を(非推奨の機能を完全に取り除いて)動作させていれば、CakePHP4 への移行準備ができているという形となります。

# まとめ

今回、過去/現在/未来 という切り口でまとめたのは、今年の春に行われた CakeFest というイベントにて、コアコミッターである Mark Story が以下のようなプレゼンを行ったのにちなんだものです。

- スライド
    - [SlideShare - The Road Ahead - 3.4 and the Path to 4.0.0](https://www.slideshare.net/markstory/cakephp-the-road-ahead)

- プレゼンの動画
    - [Movie - 3.4 and the Path to 4.0.0 - Mark Story](https://www.pscp.tv/w/1lDxLjXVyakGm)

プレゼンの動画は結構聞き取りやすい英語なので、興味がある方は是非見ることをおすすめします。

CakePHP はもともと PHP4/PHP5 の両方で動くという形から始まったフレームワークで、その当時の印象は、ちょっと前の書き方で書くことができる保守的なフレームワークというものだったんですが、今現在はそんなことはありません。

CakePHP3 は既に PHP 5.6 以上でしか動作しませんし、PSR 対応も積極的に行い、最新の環境および書き方を要求するフレームワークになっています。

さらに既に書いたように CakePHP4 では PHP 7.1 以上専用となり、引数及び返却値の型宣言等も積極的に利用するようなフレームワークになっていくと思います。

# 最後に
これから 12/25 までの期間、CakePHP に関するいろんなことを書いていただいて、これからも CakePHP を盛り上げていくのに少しでも助力できたらなと思っています。

まだまだ、枠はあいてますよ？ こんなだらだらとした長文を書く必要はありません。ちょっとしたことでもいいので、アドベントカレンダーに参加してみませんか？

明日の担当は、[@tenkoma](https://twitter.com/tenkoma) さんです。
プログラムを書く前にやっとくべきこと

# まえがき

おはようございます！

HAL名古屋ゲーム製作学科2016年卒の0Delta(ぜろでるた)です。
「HALAdventCalender2016」が面白かったので勝手に2017を作った張本人で、現在はインフラエンジニアとして某A社で働いています。

# そのプログラム、迷子になっていませんか？

僕が学生の時、
「バブルソートのプログラム、組んだ気がするけど…　どこだったっけ。まぁ探すの面倒だしまた書き直そう。」
こんな感じで、やった覚えはあるんだけど見つからなくて結局書き直すといったシーンがいくつかありました。
これでは非効率ですし、課題作成も遅くなります。
原因や解決策を考えた結果「俺は**整理整頓ができていない**」という結論に至ったのでその対策を共有したいなと。

というわけで本題です。

# 迷子にならないためにやっておくこと

## 用途を明確にする

まず**そのプログラムが「何をするのか」を明確に**しましょう。
大雑把に考えてはいけません。可能であればクラス/関数単位からはじめましょう。

例えば「ファイルを読む」では何のことかサッパリです。
「.ini形式の設定ファイルを読み込む」と言えば、それだけである程度予想がつきます。
これを更に細かく砕きましょう。おそらく次のようなフローになるはずです。

1. 指定したファイルを読んで文字列を取り出す。
1. 文字列から値を取り出す
1. 取り出した値を内部に格納する

ここまで砕いたら、これを関数にすれば実現できそうです。

### 引数、返り値を明確にする

てっとり早くいえば、**「関数宣言だけ先に書け」**ということです。
例としては

```cpp
# -- .cpp file --
# include <map>
std::map load_ini(char* filename){
}
```
とか

```py3
# -- .py file --
def get_vars(string):
  settings = {} # dict
  return settings
```
とかです。

### Readmeを**最初に**書く

順序が逆になってしまいましたが、READMEは最初に書くべきです。
READMEには、「何をするプログラムなのか」と「使い方」を書きましょう。

……おや、**もうほぼ完成ではありませんか！**
**さっき考えた「用途」と「引数、返り値」を記載するだけで完成です。**

ちなみに「引数、返り値」に関しては、外枠だけでも構いません。
実際に使う時は内部処理を気にする必要はありません。
「何をどういった形式で投げれば、こう帰ってくる」とだけ認識していれば十分です。
> 実際、僕らはそういったモノを使いまくっていますからね。
> 例えば`printf()`
>「文字列を投げれば画面に出てくる」という知識しかないのに十分使い倒せているはず。

## 最初から整理して置く

さて、また順序が逆になってしまいました。
今度は「置き場所」についてです。

### 一覧性の高いディレクトリ構造を作る
「ディレクトリ」という単語が出てまいりましたが、要するに「フォルダ」です。
せっかく作ったREADMEファイルも、**デスクトップにいてはほぼ意味を成しません**。*(個人の見解です)*
せっかく良い武器を作っても、使いやすい場所になかったら使われません。
**一つフォルダを作成して、そのフォルダへのショートカットをデスクトップに置きましょう。**
そしてその中で授業別、年度別等、区切りの良いフォルダを作ると更に良いでしょう。

### 実例

* 学生時代のフォルダ構造、先頭に日付を書いて整列した時に見やすくしてます。

```
C:\zdelta\Documents\Data
  └ AT11
    ├ CL11
    │ ├ 170410_課題1
    │ │ └ <プロジェクトファイル>
    │ ├ 170412_課題2
    │ │ └ <プロジェクトファイル>
    │ ├ 170409_練習1
    │ │ └ <プロジェクトファイル>
    │ ├ 170410_練習2
    │ │ └ <プロジェクトファイル>
    │ ├ 170411_練習3
  :
  :
```

* 現在仕事で使ってるフォルダ構造。複数の言語や環境を利用しているので言語別で分けてます。

```
C:\zdelta\Documents\Program
  └ Programs
    ├ C
    │ └ AttendanceLogger
    ├ python
    │ ├ bot-skype
    │ └ bot-slack
    └ shell
      ├ dism.bat
      └ wim_to_esd.bat
```

# まとめ

つらつらと書きましたが、要するにこうです。

* 設計書を作る
* 作ったら整理して取っておく
* 次の設計書で使えそうなら積極的に使おう

特に現役生へ、1,2年で習ったコードは基本的なコードが多いです。
今のうちにソースコードを整理してライブラリを作ると後々楽ですよ(楽とは言っていない)。
ドメイン移管とネームサーバーの変更は違うという話

色々調べてく中で、これ意外とちゃんと理解していなかったなと思ったのでメモ。

「ドメイン移管」と「ネームサーバーの変更」はびっくりするぐらい全然違う。

# まとめ

本当にざっくりいうと。。。

ドメイン移管もネームサーバーの変更も名前解決する時の経路を帰ることになりますが、
ドメイン管理会社を変えたい時にドメイン移管を行います。すでにAWSを使ってて、インフラ費用の精算をまとめたい時のユースケースかなと思います。
ネームサーバーの変更は、必要に迫られない限り発生はしないと思いますが、今回はAWSのELBを使いたいという要件があったため、たどり着くことになりました。

# 詳しく

|なまえ|説明|例|
|:--|:--|:--|
|ドメイン移管|ドメインを登録・管理している業者を別のドメイン管理業者（レジストラ）に移すこと|お名前.comで登録・管理しているドメインをAWSに**ドメイン移管**する|
|ネームサーバーの変更|ドメインが参照しているサーバーを切り替えること。すでに登録されているネームサーバー情報設定の変更。|お名前.comデフォルトのネームサーバーからAWSの**ネームサーバーに変更**する|

# 調べてる時に

ん？
ネームサーバーの変更っていつ使えばいいんだろう？
と最初に思いました。

今回ELBの導入を進めようとしている中で、ELBはRoute53の利用が必須ということがわかりました。

Route53ではHosted Zone（ホストゾーン）というドメイン名のグループを作ると、
自動的にNSレコードが作成されます。そこにAレコードを追加して名前解決をするわけです。
ただ、ドメインの管理をしているのがお名前.comの場合、このNSレコードを参照するよう、
お名前.com側での設定変更が必要となります。

※その時に事前にAレコードやMXレコードもAWSのRoute53側で設定コピーしておかないと痛い目見るので気をつけてください。

今時のスタートアップでWebサービスを作ろうとしたら、最初っからRoute53を使ってる人が多いと思いますが、
うちは特殊な事情があり、お名前.comでドメイン管理->Route53のネームサーバーというクロス方式で運用します。

# おまけ

AWSのRoute53は英語だけなので、最初はなかなかとっつきにくい印象でしたが、
マニュアルをちゃんと見ていると、AWSのコンソールを使い慣れてれば全然スムーズに設定ができました。
さすがAWSという感じ。

そのうちまたドメインの移管をやる時、移管の方法はまとめてみようかなと思います。
Drupalのターミナルで時間節約


Advent Calendar 2017向けに写真を上げていたら画像が上がらない。
####Qiita初投稿時、![Payload Too Large]()のエラーがよく出る
https://qiita.com/genshun9/items/9e54325bf2dd3de2f99f

という事なので、小ネタ投稿です。
ターミナルでDrupalのオレオレaliasを登録して、時間節約が出来たらいいなと。

Drupal関係のaliasは「dd」でやっています。
Docker関係は「d」。
$ vi ~.bash_profile

```
alias ddst='drush st'
alias ddca='drush cc all'
alias ddcc='drush cc'
alias ddsam='cd sites/all/modules'
alias ddsd='cd sites/default'
alias ddsdf='cd sites/default/files'
alias ddbm='cd sites/default/files/private/backup_migrate/manual'
alias ddbs='cd sites/default/files/private/backup_migrate/scheduled'
alias d-c='docker-compose'
alias d='docker'
alias di='docker images'
alias dp='docker ps'
```

保存したら反映。
$ source ~.bash_profile
return ( x ); の由来

**注意：** 2017年現在（というより規格化された1989年以降では）、return文の戻り値を**括弧でくくる必要はありません**。素直に `return x;` と書きましょう。

---
return文で戻り値を括弧`()`でくくる古風なコーデイングスタイルは、**太古の** C言語仕様に由来すると考えられます。

```c
int foo()
{
  int x;
  /* 処理いろいろ... */
  return ( x );
}
```

C言語が"ANSI C"として規格化(1989年)されるより前の、書籍"K&R C 1st Ed."が刊行(1978年)されるより前の、[UNIX v6](https://ja.wikipedia.org/wiki/Version_6_Unix)時代に[Dennis Ritchie](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%8B%E3%82%B9%E3%83%BB%E3%83%AA%E3%83%83%E3%83%81%E3%83%BC)氏により書かれた"[C Reference Manual](https://www.bell-labs.com/usr/dmr/www/cman.pdf)"当時(1975年)の構文仕様では、`return ( 式 ) ;` のようにreturn文の戻り値を括弧でくくることが **必須でした**。

"C Reference Manual" §9.10 を引用します：

> **9.10 Return statement**
> A function returns to its caller by means of the `return` statement, which has one of the forms
>
> ```c
> return ;
> return ( expression ) ;
> ```
>
> In the first case no value is returned. In the second case, the value of the expression is returned to the caller of the function. If required, the expression is converted, as if by assignment, to the type of the function in which it appears. Flowing off the end of a function is equivalent to a return with no returned value.

おまけ：https://twitter.com/yohhoy/status/935850962614235137
pandasでテキストから正規表現でいろんな日付を抽出

テキスト内には、様々な形式で時間情報が含まれていますね。
今回は`English`の形式に絞って、正規表現を使って抽出する方法をご紹介します。

例えば、以下のような形式が考えられます。これら全部引っ張ります。

* 04/20/2009; 04/20/09; 4/20/09; 4/3/09
* Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;
* 20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009
* Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009
* Feb 2009; Sep 2009; Oct 2010
* 6/2008; 12/2009
* 2009; 2010

今回は`pandas`を利用します。
日付の形式によっては04月や4月などがありますが、最後に標準化します。

#### 準備：pandasのインポート

```python
import pandas as pd
```

pandasの操作には`strアクセサ`を、pandasでの正規表現抽出には`extractall()`メソッドを利用します。

### 04/20/2009; 04/20/09; 4/20/09; 4/3/09

```python
text = ['04/20/2009', '04/20/09', '4/20/09', '4/3/09']
df = pd.DataFrame(text, columns=['text'])
a1_1 = df.text.str.extractall(r'(?P<month>\d{1,2})[/-](?P<day>\d{1,2})[/-](?P<year>\d{2})\b')
a1_2 = df.text.str.extractall(r'(?P<month>\d{1,2})[/-](?P<day>\d{1,2})[/-](?P<year>\d{4})\b')

a1 = pd.concat([a1_1, a1_2])
a1


       month  day	year
match			
1	0	04	20	09
2	0	4	20	09
3	0	4	3	09
0	0	04	20	2009
```

### Mar-20-2009; Mar 20, 2009; March 20, 2009; Mar. 20, 2009; Mar 20 2009;

```python
text = ['Mar-20-2009', 'Mar 20, 2009', 'March 20, 2009', 'Mar. 20, 2009', 'Mar 20 2009']
df = pd.DataFrame(text, columns=['text'])
a2 = df.text.str.extractall(r'(?:(?P<month>Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)[.\s-]*(?P<day>\d{1,2})[,\s\-]*(?P<year>\d{4})')
a2

		month	day	year
match			
0	0	Mar	20	2009
1	0	Mar	20	2009
2	0	Mar	20	2009
3	0	Mar	20	2009
4	0	Mar	20	2009
```
### 20 Mar 2009; 20 March 2009; 20 Mar. 2009; 20 March, 2009; Feb 2009; Sep 2009; Oct 2010

```python
text = ['20 Mar 2009', '20 March 2009', '20 Mar. 2009', '20 March, 2009', 'Feb 2009', 'Sep 2009', 'Oct 2010']
df = pd.DataFrame(text, columns=['text'])
a3 = df.text.str.extractall(r'(?:(?P<day>\d{1,2})\s){0,1}(?P<month>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)[,\.\s-]*(?P<year>\d{4})')
a3

		day	month	year
match			
0	0	20	Mar	2009
1	0	20	March	2009
2	0	20	Mar	2009
3	0	20	March	2009
4	0	NaN	Feb	2009
5	0	NaN	Sep	2009
6	0	NaN	Oct	2010
```

### Mar 20th, 2009; Mar 21st, 2009; Mar 22nd, 2009

```python
text = ['Mar 20th, 2009', 'Mar 21st, 2009', 'Mar 22nd, 2009']
df = pd.DataFrame(text, columns=['text'])

a4 = df.text.str.extractall(r'(?P<month>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)\s{1}(?P<day>\d{1,2}(?:nd|th|st){1})(?:,\s){1}(?P<year>\d{4})')
a4


month	day	year
match			
0	0	Mar	20th	2009
1	0	Mar	21st	2009
2	0	Mar	22nd	2009
```

さいごは、いい感じにマージする。
アポスティーユの正体

最近何かと話題のnemのウリの機能「アポスティーユ」について、すこし掘り下げてみます。

# nemにアポスティーユという機能は無い

これだけnemのアポスティーユはすげぇすげぇ言ってますが、実のところアポスティーユなんて機能は実装されていないんです。
ではどうゆうことなのか、を解説していきます。

# パブリックとプライベート

アポスティーユにはパブリックアポスティーユとプライベートアポスティーユがあります。
ここでは、nemネットワークにアクセスできれば誰でも確認できるパブリックアポスティーユについて述べます。

# アポスティーユの正体

ではなんとなくOpenApostilleを開いたら目についた、ジャパンカップ予想のアポスティーユを例にしてみます。

[ジャパンカップ予想.docx - OpenApostille](https://www.openapostille.net/detail/797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319)

[NEM Blockchain Explorer v3](http://chain.nem.ninja/#/transfer/797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319)

[NIS API(HugeAlice)への問い合わせ](http://88.99.192.82:7890/transaction/get?hash=797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319)

NIS API(HugeAlice)への問い合わせを開いたトランザクションの`message.payload`を確認してください。

```
fe4e545903560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808
```

このメッセージは固定長で５つのセクションに分けます。

```
fe 4e5459 0 3 560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808
```

最初の`fe`はメッセージが16進数文字列であることを示す固定値です。

次の`4e5459`はアポスティーユであることを示す固定値です。

`0`はパブリックアポスティーユであることを示します。プライベートの場合は`9`となります。

`3`はハッシュアルゴリズムを示します。それぞれの割り当ては以下の通りです。

|アルゴリズム|値|
|:-----|------:|
|md5   |1|
|sha1  |2|
|sha256|3|
|sha3-256|8|
|sha3-512|9|

後に続く文字列はファイルのハッシュ値です。
この場合、ハッシュアルゴリズムは`3`なので`sha256`によるファイルのハッシュとなります。

ということで、元ファイルはsha256でハッシュ値を取ると、`560fc41a...a808`になるはずです。
試してみましょう。元ファイルはオープンアポスティーユからダウンロードできます。

```
$ sha256sum "ジャパンカップ予想 -- Apostille TX 797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319 -- Date 2017-11-25.docx"
560fc41a6f8c9495ee7e7e18322973c50e9e2f4fbb91fa892343412586d9a808  ジャパンカップ予想 -- Apostille TX 797ae3b488f7808bf3b7ad46c7f487f2b02645175f09256ca532eb74b274d319 -- Date 2017-11-25.docx
```

一致しました。

NanoWalletでは、ファイル名のトランザクションハッシュからハッシュ値が記録されたメッセージを取得し、
先のようにメッセージから取り出したハッシュ値と算出したファイルのハッシュ値を突き合わせて完全性を証明しています。
また存在証明はそのトランザクションのタイムスタンプを利用します。

この二つが合わさることで「ある時点」で「このファイル」が存在していたことを証明できるのがnemのアポスティーユです。

なので、トランザクションハッシュが分かっていれば、ファイル名がこの形式でなくても問題ありません。
(もっともNanoWalletのD&Dすればすぐ確認できるのでわざわざ変更するメリットはなさそうですが)

もし自前でアポスティーユの実装や検証を行う場合は参考にしてみてください。

# まとめ

というわけで、アポスティーユは単なるトランザクションの応用に過ぎませんでした。
NanoWalletに実装されている投票機能も同様に専用の機能があるわけではなく、通常のトランザクションを応用しています。

わざわざ専用の機能を実装することなく、このようなことが実現できてしまう応用性がすごいと思います(小並感)
新しい Deep Learning Base AMIでkerasとtensorflowを設定する

# 新しい Deep Learning Base AMI
使ってみた。簡単だった。

https://aws.amazon.com/jp/blogs/news/new-aws-deep-learning-amis-for-machine-learning-practitioners/
新しい Deep Learning Base AMI
Base AMI にはディープラーニング用の基盤となる構成要素がプリインストールされています。これには Amazon Elastic Compute Cloud (EC2) インスタンスで Machine Learning を加速化しスケールするため、NVIDIA CUDA ライブラリ、GPU ドライバ、システムライブラリが含まれています。Base AMI は白紙の状態でカスタマイズしたディープラーニングセットアップをデプロイできるようなものとお考えください。

たとえば、開発者がオープンソースのディープラーニングフレームワークの機能提供に協力したり、新しいディープラーニングエンジンを構築した場合、Base AMI は新しいフレームワーク機能をテストするための独自のカスタム設定とコードレポジトリをインストールするための基盤を提供します。Base AMI には CUDA 9 環境がデフォルトでインストールされていますが、ステップバイステップのユーザーガイドに掲載しているシンプルな 1 行コマンドを使用して CUDA 8 環境に切り替えることもできます。

Base AMI は次の GPU ドライバとライブラリを提供します。

* CUDA 8 および 9
* CuBLAS 8 と 9
* CuDNN 6 と 7
* glibc 2.18
* OpenCV 3.2.0
* NVIDIA driver 384.81
* NCCL 2.0.5
* Python 2 と 3

# 環境
* 新しい Deep Learning Base AMI ubuntu
* g2.8xlarge

# CUDA8を使う
```
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/extras/CUPTI/lib64:/lib/nccl/cuda-8:
```
# tensorflowとkerasのインストール
```
sudo pip3 install tensorflow-gpu
sudo pip3 install keras
```
# おまけ　ta-libのインストール
http://mrjbq7.github.io/ta-lib/install.html

```
wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar zxvf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr
make
sudo make install

sudo pip3 install TA-lib
```
bigquery, embulk, digdagでETL処理をやって

EMBULKとDIGDAGの話がしたくて仕方がないんですけど、うちの会社でDIGDAGとかEMBULK知ってる人が全くいなくてここに残します。
サーバー　→　Bigquery　→　Mysql　→　SQL Server　の流れでデーターを毎日ロードするシステムを作ってます。
SQLServerの後もバッチプロシージャで集計したり色々大変な作業が待ってるんですけど、それはDBAがやってくれるとして…　その前のETLだけを自分がやってます。
Bigqueryは普通こんなETLの流れの最後の部分に位置するんですけど、うちの会社のいろんな事情で…BigqueryからRDBMSへのフローを作らなくちゃならなくなったんです。
Bigqueryからのダウンロードはembulkでやってますけど、思ったより大変でした。
最初はembulk-input-bigqueryとembulk-output-mssqlとか使ったら簡単！…と思ってやってみたんですけど、現実はそう甘くなく。ちょっと時間がかかりました。
inputの話.
embulk-input-bigquery プラグインはテーブルデーターが多かったら（大体６G以上）弱40000件くらいしか持ってこれなくて、それ修正して使うとしたら重くなってメモリーも大食い。このプラグインはデーターロードにBigquery Streaming API使ってるからこれは仕方ないと思いました。それでそれをforkして何とかファイル経由のロード機能を作れないかって思ってルビーコードを読んでみましたけど、ちょっと難しい。何か参考になるものがないかと思ってEMBULKのドキュメントみたらそもそもembulkのrubyプラグインはembulk-input-fileを継承できないみたいです。参考するソースコードがない。それでembulk new java-file-input を実行して、新しくembulk-input-bigquery_extract_files というプラグインを作ってとりあえず回しました。
でも今思えばこんなプラグイン作るよりDIGDAGでやったほうが早かったんじゃないかと…ちょっと後悔。
outputの話。
~~embulk-output-sqlserver　のプラグインはinsert_method: normalではすごく遅い！~~
~~insert_method: nativeは早かったんですけど、うちのマシーンではプロセスの最後にsqlncli11.dllのbcp_doneでクラッシュが起こりました。~~
~~Windows７でも出来ないし、サーバーのCENTOS６でやってみても何故かエラーで動かない。Windowsサーバーはまだ試してないけど、いますぐ会社からサーバーをもらえるかどうかわからない。~~
~~それでembulk-output-sqlserver のソースをダウンロードして、色々といじってbcp_doneの部分を消したら何とか動きましたけど、そごく不安。~~
~~仕方なく今はembulk-output-mysqlを使ってMysql経由でSQLServerに流してます。~~
~~BCP_DONEで発生したエラーを再現して報告したいんですけど、今は時間がないので後で…~~
~~とりあえす動くから‥ちょっと引っかかるけど…まぁembulkはここまで！~~
(12/8) 追伸。
*この問題を報告したら直してくれました！*
https://github.com/embulk/embulk-output-jdbc/issues/210
*embulk-output-sqlserverは今は問題なく使ってます。*
*ありがとうございます！！*


でもまだた。まだ終わってない！（スネーク！）
あとの問題はBigquery　→　Mysql　この区間で、すべて日付テーブルでまるまる持ってきたら苦労しないんですけど、クエリでやらなくちゃいけなくなって…
毎回クエリをダイナミックに作ってEMBULKのINPUTに繋げないといけない。
パラメーターをMysqlとBigqueryから持ってきてクエリを作らなくちゃならないから、liquidではちょっと足りない。
しかもテーブルも一つじゃなくて沢山。
それでPythonとかShell Scriptを使ってEmbulkの設定ファイル作って繋げたらどうか！って考えてみたけど、なんか雑な気がする！複雑になる！
そこでワークフローを使ったら、ETLはもちろん、そのあとの集計もちょっと楽になるんじゃないかって考えてました。
DIGDAG、AIRFLOW、LUIGIとか検討してみました。
DIGDAGのYAML設定は一番気に入ったんですけど、UIがAIRFLOWに比べたらちょっと地味。検索してみたらGCPをタスクコマンドもAIRFLOWに比べて少ないみたいだし。LUIGIは…なんかDIGDAGとAIRFLOWの中間のあたりの感じ。AIRFLOWもDIGDAGも失敗したらやってみるとしました。
それで最初はAIRFLOWでやってみたんですけど、これやってみるとなんだか微妙。DAGを作るPYTHONコードもなんだか雑な感じで、動的にDAGを作るとしたら何かStartDate関連でエラー発生するし。しかもUIで管理したDAGスケヂュールはなんか予想通りにならないし、個別にCLIでDAGを実行するのもやや混乱。DIGDAGはUI以外は全て気に入ったのに！それでDIGDAGに転換。GCPタスクはPYTHONでなんとかしてみると思った。
で、やってみるとすごく楽！
動的にクエリ作って、EMBULKに繋げて、MySQLに無事インサート完了！簡単！
この単純なものがAIRFLOWではなんて大変だったのか…
まぁ、ここまではなんとか出来たし、あとはプログラムを拡張するだけ。
でもいままで簡単だと思ってそのまま出来た歴史がない！（涙
まぁ…それでも成功したら後で全て記録に残すとします。
では。
コミュニティのユーザーが開発したサービス

すでにたくさんのnemアプリケーションが開発され、Webで公開されています。
より多くの情報はフォーラムの [技術・開発資料系 \- mijin discussion forums](http://mijin.io/forums/forum/%E6%97%A5%E6%9C%AC%E8%AA%9E/nem/2362-%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E8%B3%87%E6%96%99%E7%B3%BB) をみていただくとよいですが、特に有名なものを３つピックアップしました。


# tipnem

[NEM Mainnet tipbot\(@tipnem\)さん \| Twitter](https://twitter.com/tipnem)
[【仮想通貨NEM】 twitter簡単に投げ銭が出来るtipnemの使い方［基本編］ \- 暗号通貨に関する事など](https://cryptocurrency.muragon.com/entry/18.html)

もはや説明不要かとは思いますが、初めての方にこんなことができると知ってもらうために。

Twitterユーザ間でチップ(投げ銭)としてxemをやり取りできるシステムです。
このようなチップシステムは他の通貨でも行われています。

tipnemは基軸通貨であるxemだけではなく、モザイク(一般的にトークンと呼ばれるもの。nemではモザイクといいます)も送ることができます。

nemを持っているユーザ同士、日々の感謝の気持ちや価値のある話に対して、はたまた無意味に投げつけてみたりということが行われていますｗ

モザイクは誰でもnemネットワークに誰でも簡単につくることができます。
モザイクについては [NEMのネームスペースとモザイクって何なのか？ \- クリプトストリーム](https://www.cryptostream.jp/nem-namespace-mosaic-3551/) など、わかりやすく解説してくれているサイトがあるのでこちらに譲ります。

なお、裏側の仕組みとしては、直接nemチェーン上ではやりとりするわけではなく、サービス上で所有権のやりとりが行われている感じです。
tipnemの入出金の機能により、預入・出金をすることでウォレット間で資金を移動させます。


# xembook

こちらもとはおもいますが、初めての方への紹介です。

[XEMBook](http://xembook.net/)
前回の記事でnemネットワークへはHTTPが叩ければ情報を簡単に取得できると述べました。
XEMBookは、JavaScriptというWebサイトでは一般的な技術だけで構築された、ウォレットにログインすることなく、アカウントの残高を見るためのツールです。

また、パブリックなブロックチェーンの性質上、アドレスが分かれば情報を取り出すことができます。
送金などはできませんが、そもそも公開されている情報なので、セキュリティに気を使う必要もありません。

スマートフォンや別のパソコンなどから残高を確認したいが、わざわざ秘密鍵でウォレットをセットアップするとなると、鍵を持ち出すことのリスクがあります。
そんなとき、xembookを使えば、バレたとしても問題のない、公開情報であるアドレスだけを使って残高を確認することができます。

それだけでなく、xemを扱う主要な取引所、Zaif, coincheck, Poloniex, BITTREXのJPY換算値を表示していたり、入出金履歴、ハーベストの履歴など、頻繁に確認するような情報が一つにまとまっている、とっても便利なサイトです。

ほかにも秘密鍵を使わなくても参照できる情報ツールや、先のtipnemとの連携、後のOpenApostilleとの連携など、とにかくいろいろな機能が集約されているので、xemを購入して自分のウォレットにいれたら、まずはそのアドレスでxembookにアクセスしてみてください。


# OpenApostille

[OpenApostille](https://www.openapostille.net/)
[NEM\(ネム\)の公証に使えるApostille\(アポスティーユ\)で未来は変わる！？｜CoinChoice](https://coinchoice.net/apostille_how_to/)

nemにはアポスティーユという、ファイルの存在証明をする応用機能があります。
非常に有用な機能で、将来性抜群なのですが、これまでイマイチ実際に活用するような話題は上がりませんでした。
このOpenApostilleはそれを破ってくれました。

これまでNanoWallet(公式のウォレット)でファイルの完全性と存在性を記録し、同様にNanoWalletを用いてベリファイ(検証)をするという使い方でした。
どちらかと言えば、能動的にファイルを検証したいケースで使います。

一方OpenApostilleはどんなファイルがアポスティーユされたかをブラウザで確認できるサービスです。
これは、どんなファイルがアポスティーユされているのかを実際にアポスティーユされたファイルとともに閲覧することができます。
言ってみれば、意匠・商標調査サービスのようなものです。

Webブラウザで登録されたファイルの完全性と存在性を確認できるので、例えばイラストやポエムの権利を主張する場合、URLを開くだけで十分な検証ができるでしょう。
(実際は厳密にファイルハッシュを比較するでしょうが、抑止効果にはなるでしょう)

残念なことに、アポスティーユ自体が優れた仕組みでも、現行の法律では証明に使うことができませんが、
認められた場合、これほど簡単に権利を主張するのに優れたツールは無いと思います。
(既存の法で定められた方法のほうが勝ってしまうそうです。まぁ当たり前といえばそうです)


# まとめ

公開されているツールはこの程度ではありません。
上記はWebサービスよりですが、秘密鍵のリマインダツールやマルチシグを便利に使うツールなど、
実用性を高めるツールもたくさんあります。

話題に上がり次第 [技術・開発資料系 \- mijin discussion forums](http://mijin.io/forums/forum/%E6%97%A5%E6%9C%AC%E8%AA%9E/nem/2362-%E6%8A%80%E8%A1%93%E3%83%BB%E9%96%8B%E7%99%BA%E8%B3%87%E6%96%99%E7%B3%BB) にまとめているので、こちらも一読ください。

しかしなんといってもこの記事で紹介したツールはすべて国産、日本人エンジニアによるものです。
だからすごい！とか、そうゆうことを言うつもりはないのですが、誇らしいことです。

日本はITインフラも整っていますし、スマホだって一人１台以上もつような今日です。
ビットコインもいいですが、是非nemも使って暗号通貨の実用を日本から盛り上げていければいいなと思います。
(そしてそれを今まさに見届けられるかもしれない私達はとても貴重な体験をしているのではないでしょうか)
AppleScriptとPHPで現在iTunesで再生中の楽曲のアルバム画像を検索、取得する

まずAppleScriptで再生中の曲の曲名とアーティスト名を取得する。

```applescript:get_search_word
tell application "iTunes"
	set trackName to name of current track
	set trackArtist to artist of current track
	return trackName & " " & trackArtist & " アルバム画像"
end tell
```

上のAppleScriptで取得した情報をGoogle Custom Search APIを使って検索する。
APIから帰ってきたJSONに画像のURLが含まれているのでそれを保存&openコマンドで開く

```php
<?php
//API情報
$api_key = "<Google Custom Search APIのAPIKey>";
$custom_search_engine = "<Googleカスタム検索エンジンID>";
//ページ数
$start = 1;
//何枚目の画像を使用するか(デフォルトは1枚目)
$img_num = 0;
//AppleScriptでiTunesで再生中の曲名とアーティスト名を取得
//AppleScriptへのpathは適宜変更
$word = exec("osascript ./get_search_word.scpt");
$search_word = urlencode($word);

//ローディングメッセージ表示
$word_array = explode(" ",$word);
echo $word_array[0]."のアルバム画像を取得中...(keyword: 「".$word."」)";
$start_time = microtime(true);

//APIのURL
$api_url = "https://www.googleapis.com/customsearch/v1?key=".$api_key."&cx=".$custom_search_engine."&q=".$search_word."&searchType=image&start=".$start;
$re_json = @file_get_contents($api_url);
$dec_json = json_decode($re_json,true);
//usageLimitsで403帰ってきてNULLだったら終了
if (!$re_json) {
  echo "\nAPIリクエストエラー";
  exit;
}
//($img_num)枚目の画像のURL
$img_url = $dec_json["items"][$img_num]["link"];
//SSL無効に(一部サイトでエラー出た)
$options['ssl']['verify_peer']=false;
$options['ssl']['verify_peer_name']=false;
$data = file_get_contents($dec_json["items"][$img_num]["link"], false, stream_context_create($options));
//ファイルpath定義
$name = "img";
$img_file_name = "./tmp/".$name.".jpg";
//保存
if (file_put_contents($img_file_name,$data)) {
  //画像をopenコマンドで開く
  exec("open ".$img_file_name);
}
//終了メッセージを表示
$end_time = microtime(true);
$elapsed_time = round($end_time - $start_time, 3);
echo "\n取得完了(".$elapsed_time."s)";
```
【Xcodeビルド高速化】Shell Scriptを駆使して初心者でもカンタン！

# 対象
こんなことを思ってる人

- Automator で作成した app のディレクトリをShell Scriptに渡したい
- とりあえず簡単に Xcode でのビルドを高速化したい

Xcode でのビルド速度を高速化する方法は、 iOS アプリ開発者なら多くの方が知っていることでしょう。コマンドラインで1行のコマンドをたたくだけです。
ですが、今回は超初心者でも**置くだけで**高速化できるアプリを紹介するとともに、仕組みをご紹介します。
*※どんなことよりも遊び心を優先しています。ご了承ください。*

# とりあえず速くしたい
環境：macOS
[TuningXcode](https://github.com/AkkeyLab/TuningXcode)

`TuningXcode.app` をプロジェクトのルートディレクトリ（ xcodeproj ファイルがあるところ）に置いてください。このアプリからプロジェクトが開けるようになります。ちなみに、起動と同時に高速化を行っているので、その他に必要な操作等はございません。

# 仕組み
1. Apple Script で .app が置かれたディレクトリの絶対パスを取得する
2. 絶対パスを Bash に渡す
3. ビルド時間表示を有効にする
4. ビルド高速化を有効にする
5. プロジェクトファイルを開く

# Apple Script で絶対パス取得
Automator で .app として書き出しを行った場合、 Apple Script なしでは .app が置かれたディレクトリの絶対パスを取得することができないようです。正直、ここが一番難しかったように感じます。

```sh
tell application "Finder"
	set thePath to (POSIX path of (path to me))
end tell
set AppleScript's text item delimiters to "TuningXcode.app"
text item 1 of thePath
```

`$1` に絶対パスが渡されるので `cd $1` として Shell Script を書けば、 .app が置かれたディレクトリで Shell を走らせることが可能になります。

# 高速化からプロジェクトを開くまで
CocoaPods を利用している場合にも対応させるために Shell Script の記述量が多めになっていますが、もっとカッコよく少ない行数で書けると思います。参考程度にご覧ください。

```sh
# .app が置かれたディレクトリに移動
cd $1

# ビルド時間表示を有効化
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
# CPUのコア数を取得
cores=$(system_profiler SPHardwareDataType | grep 'Total Number of Cores:' | sed -e 's/.*Cores: \([0-9]*\).*/\1/')
# 並列ビルドを有効化
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks `expr $cores \* 2`

# 開くプロジェクトファイル名を取得
fullFileName=$(ls | grep .xcodeproj)
fileName="${fullFileName%.*}"
extension='.xcworkspace'
newFileName=$fileName$extension
if [ -e $newFileName ]; then
  fullFileName=$newFileName
fi

# プロジェクトファイルを開く
open -a Xcode.app $fullFileName
```

並列ビルドに関してですが、HTT （ハイパースレッディング・テクノロジー）を考慮してCUPコア数の2倍に設定しています。
手動でCUPコア数を調べる必要もないので、この Shell Script を sh ファイルに保存して実行してもいいと思います（いや、それで十分だと思います）。

# Automator に組み込む
![Screen Shot 2017-11-30 at 23.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/128344/0ae85d7f-344a-25ba-3c5a-fbbbd580bbef.png)
あとは Automator に上記コードを入力して .app として出力するだけです。 .app 内のアイコンファイルを変更すれば好きなロゴにも変更できますし、色々おもしろいことができます。

# どれくらい早くなるの？
![chocotips#1.017.jpeg](https://qiita-image-store.s3.amazonaws.com/0/128344/3ca4d1cf-b848-a1b5-5136-cce865f3026f.jpeg)
パソコンのスペックやプロジェクトの大きさなどにもよりますが、軽量のアプリでは上記のような結果になりました。

こういったことをきっかけに、 Shell Script に触れるのも楽しいですね！
WebAudioで簡単なドラムシンセを作る


この記事は WebAudio/WebMIDI API Advent Calendar 2017 Advent Calendar 2017 の1日目です。

こんにちは。gyaboと申します。

WebAudioについて書きます。
プライベートでWebAudioを前年度から素振りしていたら
**なんと実プロダクトでWebAudioを使うことになりそうです。**
ヤッター！



## WebAudio/WebMIDIについて

WebAudio/WebMIDIについては、トップにある通り、以下のページが詳しいです。
とても分かりやすいチュートリアルがありますので、ぜひ見るといいと思います。

Web Audio API : https://www.w3.org/TR/webaudio/
Web MIDI API : https://www.w3.org/TR/webmidi/

また前年度のアドベントカレンダーもとても参考になります。
https://qiita.com/advent-calendar/2016/webaudio

## 作るもの
簡単なWebAudioをリアルタイムに波形レンダリングするシーケンサを作ります。
音はアナログシンセドラムチックなものです。
もちろん単に音を鳴らすだけならいろいろな手段がありそうですが、
WebAudioを使う動機としては音がリアルタイムにレスポンシビリティに再生、波形生成できるところです。
なお、いまだにScriptProcessorが根強く生き残ってるので使います。



## 作ったもの


**ジャーン！** ドラムシーケンサができました！
※オレンジ色なのは作者の趣味です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/53be674f-0d60-2621-1c11-218aa2880df5.png)


以下から遊べます。
http://gyabo.sakura.ne.jp/webaudio/scdrum.html

`Space : 再生
波形をクリック : ADSRがランダムに変わります
リロード : 全チャンネルのADSRがランダムに変わります`

良い音で満足です。
音がイマイチ、へんてこだ！って場合はリロードお勧めです。


## コードについて
自分で波形ゴリゴリ作って入れています。8chです。
が、カットオフフィルタは組み込みのを使ってます。

あとは、レガシーなところがあるのは私が慣れていないからです。すみません。
※ついぞこの間モバイルでうまく動作しないとか闇をつついてしまったので変なコードになっています。



## 参考にしたシンセ
ReasonというDAWにSubTractorというシンセがついています。それを参考にしました。

[Reason]
https://www.propellerheads.se/ja/reason


## おまけ
もともとはちょっと前に作ってた最初はザ・アナログってのを目指してたもので、それは以下で遊べます。

http://gyabo.sakura.ne.jp/webaudio/scsndseq.html


![image.png](https://qiita-image-store.s3.amazonaws.com/0/34428/f03f4a26-d663-6043-b410-aa4ce30af0f4.png)


これも良い音が鳴るようにget関数の中身を作ってみました。
皆さんもWebAudioで遊んでみてください。

**レッツ WebAudio!**
Vue.js のグローバルイベントバスでの親子間以外の通信と vue-router

# vue-router と[親子間以外の通信](https://jp.vuejs.org/v2/guide/components.html#親子間以外の通信)のグローバルイベントバスの組み合わせでは画面遷移しても紐づけたイベントの解除は行われない

解除が行われない、というより .$off をしないと蓄積するようです

## お試しページ

[codesandbox.io](codesandbox.iohttps://codesandbox.io/)の Vue.js 用基本テンプレートを使用した[こちら](https://codesandbox.io/s/489lnn6pj0)

* vue-router を使用
* 2 画面の単純な構成でリンクの遷移先はそれぞれ相手同士
  * /hello
  * /good-bye
* components 配下
  * Hello.vue
  * GoodBye.vue
  * li_a.vue  
    Hello, GoodBye それぞれでリンク表示に使用している
* a タグのリンクは li_a.vue での記載で  
  event.preventDefault() により通常の遷移をさせず  
  グローバルイベントバスを経由させ親要素にそれぞれ処理をさせている
  (this.$emit にて通知が可能となるがイベントバスを経由させている)
* `.$on` によるイベントの紐づけを .mounted() にて実施  
  li_a.vue から .$emit するイベント名は Hello, GoodBye ともに "click_link" として同じにしている

## 増えていくイベント

上記内容の実装にて

* hello -> good-bye では単純に遷移し
* good-bye -> hello では GoodBye での定義内容により  
  ダイアログが表示され hello へと戻る

これを繰り返すと

* hello -> good-bye でのクリックでもダイアログが表示されるようになり
* good-bye を開くたびにダイアログが表示される回数が増えていく

console.log にて出力している内容でも
EventBus._events.click_link の要素数が遷移に伴い増えているのが確認できる

## 原因・・・？

vue-router を使用した際にオブジェクトを再利用できるよう
特定のオブジェクトの破棄は行っていないらしい

* 「特定の」を示す範囲はちょっと調べられてはおりません・・・
* 根拠自体も何かの英語の記事か GitHub の issue で見たような・・・ぐらいです

グローバルイベントバスのオブジェクトは破棄されず残るオブジェクトのようで
EventBus._events に格納されたイベントの紐づけは明示的に .$off をしないと解除されない模様

## 考えられる対応

### イベント紐づけの前に更地に

残ってしまうのであれば定義前に解除をしてしまえばよいのでは・・・
ということで `.$on` の実行前に .$off にて紐づけを初期化

```js:$offで初期化してから
  // 紐付きをクリアしてから
  EventBus.$off('click_link');
  // 改めてイベントをセット
  EventBus.$on('click_link', this.click_link);
```

### おかたずけ

Vue インスタンスのライフサイクルに従い
コンポーネントの生成、破棄のタイミングにて紐づけ、解除をそれぞれ実施

```js:mounted,beforeDestroyでのそれぞれ設定
  mounted() {
    // 最初にセット
    EventBus.$on('click_link', this.click_link);
  },
  beforeDestroy() {
    // コンポーネントについては beforeDestroy が実行されるので
    // 最後にクリア
    EventBus.$off('click_link');
  }
```

### Vuex を使用

[Vuex とは何か](https://vuex.vuejs.org/ja/intro.html)
・・・今のところは本格的に使用していないため感覚はつかめておりません

親子間以外でのグローバルイベントバスを使用したイベント通知などは
Vue.js としては本筋から離れるやりとりであるそうで
根深くなる前に整理しておいたほうがよさそうです
Ansibleでtelnetする

# Ansibleでtelnetする
通常、Ansibleでは被管理ホストに対して、sshでアクセスし制御しますが  
**「どうしてもsshではなくtelnetで入って任意のコマンドを実行したい」**  
ということがあると思います。

本記事ではAnsible2.4から入ったtelnetモジュール利用し、ciscoの装置に対してtelnetでログインしコマンドを実行、ログに残します。

## 実行環境
| Item | Value |
|:---:|:---:|
| ansible version | 2.4.1.0 |
| 被管理ホスト | telnet可能なcisco機器 |


## ファイル構成
```
.
├── cisco.yml
├── hosts
└── roles
    └── cisco
        ├── tasks
        │   └── main.yml
        └── vars
            └── main.yml
```

## 各ファイルの内容
- hostsとplaybook  
まずはhostとplaybook本体のcisco.yml。  
sshでは繋げない前提なのでgather_factsをFalseにしています。

``` hosts
[R1]
192.168.56.2
```
```yaml:cisco.yml
---
- hosts: R1
  gather_facts: False
  roles:
    - cisco
```

- roles/cisco/tasks/main.ymlとroles/cisco/vars/main.yml  
基本的にtelnetモジュールでべた書きです。  
コマンドの出力に#や>が入りそうな場合はpromptsに{{ inventory_hostname }}等を入れるといいでしょう。  
telnetの出力をcommand_resultとして保存、local_actionで管理ホスト(ansibleコマンド実行ホスト)側にログを出力しています。  
**command_result.output[3]**としているのはshow runが4番目に実行されているからです。この部分を変更してあげれば別のコマンドや続けてのログ出力が可能です。

```yaml:roles/cisco/tasks/main.yml
---
- name: show run
  telnet:
    user: cisco
    password: cisco
    login_prompt: "Username: "
    prompts:
      - "[>|#]|Password: "
    command:
      - terminal length 0
      - enable
      - cisco
      - show run
  changed_when: False
  register: command_result

- name: debug
  debug:
    var: command_result.output

- name: log export
  local_action:
    module: copy
    owner: nohara
    group: nohara
    mode: 0644
    dest: "{{ log_dir }}/show_run.log"
    content: "{{ command_result.output[3] }}"
  changed_when: False
```

```yaml:roles/cisco/vars/main.yml
---
log_dir: "/home/nohara"
```
---  
- 出力されるログ  
一行目にコマンドが入ってしまっていますが、まぁいいでしょう。。

```
show run
Building configuration...

Current configuration : 895 bytes
!
version 12.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname R1
---snip---
```

## 失敗談
- show runの出力にpromptと判定される文字列(上記だと#とか)が入っており出力がおかしい
- gather_facts: Falseとしていなくて、gather_factsで止まる


    **困ったときはパケットキャプチャ!!!**

## 参考URL
[Ansible telnet](https://docs.ansible.com/ansible/2.4/telnet_module.html)
[Win鯖]nasにしかアクセスできないユーザを作成する

##構成

- 作業用PC兼 NAS鯖(Win10 **Home**←ココ重要) 1台
- アクセス用クライアント(スマフォなど)1台

##要件

NASとスマフォを自動同期したい。そのためにはストレージにアクセスするための資格情報をクライアントに保存しておく必要がある。しかし作業用PCには、万が一スマフォに保存した資格情報が漏れたとしても、作業用PC兼NAS鯖にはローカルログオン(ログイン画面からパスワードを入力してデスクトップにログインすること)させたくない。

ので、ネットワークストレージにアクセスする専用のユーザを作成したい。

##方法

兎にも角にもストレージにアクセスする専用のユーザを作成する。

次。

###ローカルセキュリティポリシーが使える場合;
【セキュリティの設定】→【ローカルポリシー】→【ユーザ権利の割り当て】→【ローカルログオンを拒否する】
参考: [特定のユーザーをログオン不可とするには？](https://okwave.jp/qa/q1920660.html)

###使えない場合(今回)
Win10 Homeのため、ポリシーエディタのたぐいは使えない。そのため、代わりのコンソールツールを使う。
ntrightsをNAS鯖にダウンロード&amp;インストール。
[Windows Server 2003 Resource Kit Tools](https://www.microsoft.com/en-us/download/details.aspx?id=17657)
参考: [Windows 7 ホームプレミアムでタスクスケジューラーでバッチファイルを動作させる方法](http://mezasefi.com/d/ja/blogs/nobu/2010-06-13-102.html)
シェルを管理者権限で立ち上げてローカルログオンを拒否したいユーザ*username*に対して、以下のコマンドを実行
`ntrights -u username +r SeDenyInteractiveLogonRight`
successfulと表示されれば完了。

ログオンできるように戻すには
`ntrights -u username -r SeDenyInteractiveLogonRight`

注意点。ユーザー名を誤るとPCにログインできなくなる可能性があるためユーザ名には十分注意して実行すること。
2017年のmrubyについて

今年7月に1.3.0がリリースされた[^1]mruby。去年の今ごろと比べてどうなったでしょうか。まずは1.3.0の内容から見ていきましょう。

## mruby v1.3.0
前回のリリースは2015年なので、約2年ぶりのリリースということになります。

### The safe navigation operator
mrubyでも「ぼっち演算子」がサポートされたということですね。

### `Array#dig`, `Hash#dig`
ArrayとHashに`dig`が実装されました。これはJSONとかを扱うときに便利なものですね。

### `Object#freeze`
Ruby 2.4では`frozen_string_literal`が話題になりましたが、mrubyには1.3.0で`freeze`が使えるようになりました。mrubyでも文字列をfreezeすると速くなったりするのでしょうか？

### `Kernel#caller`
`Kernel#caller`が使えるようになりました。そもそも`Kernel#caller`が何者なのかというと……

https://docs.ruby-lang.org/ja/2.4.0/class/Kernel.html#M_CALLER

デバッグの時に便利そうなメソッドであることがわかります。

## RubyKaigi 2017
今年のRubyKaigiでは、mrubyに関係するTalkが2本ありました。確かLTにも1本あったような……

### mruby gateway for huge amount of realtime data processing
[mruby gateway for huge amount of realtime data processing - RubyKaigi 2017](http://rubykaigi.org/2017/presentations/narittan.html)
これはTresureDataで、h2oのmruby handlerを使用して大量のリクエストを捌くのにどうやったか、という内容の発表だと記憶しています。

### Write once, run on every boards: portable mruby
[Write once, run on every boards: portable mruby - RubyKaigi 2017](http://rubykaigi.org/2017/presentations/yuri_at_earth.html)

毎度おなじみ、TOPPERS Projectの方によるトイレの発表でした。mrubyを用いて、同じ動作をするプログラムを複数のボード(Arduinoのような)で動かすという内容の発表だと記憶しています。

## プロダクト
### ロリポップ！マネージドクラウド
[ロリポップ！マネージドクラウド|オープンβ提供中！](https://mc.lolipop.jp/)

mruby製のコンテナエンジンであるhaconiwa[^2]を全面採用したマネージドクラウドサービスがオープンβリリースされました。

## まとめ
mrubyも着々と進化を続けており、今年は正式リリースとはいかないまでもmrubyを採用したサービスを利用できるようになりました。これからのmruby界隈がどうなるか、とても楽しみです。

[^1]: https://mruby.org/releases/2017/07/04/mruby-1.3.0-released.html
[^2]: https://github.com/haconiwa/haconiwa
JavaScriptで消費税を計算する

数学アドベントカレンダーと言いつつ、ふつうのノウハウっぽいタイトルの記事ですが、中身的には「浮動小数点演算とどう付き合うか」という題材の具体例として消費税を持ってきています。

# JavaScript以外の言語の方へ

Rubyの[BigDecimal](https://docs.ruby-lang.org/ja/latest/class/BigDecimal.html)、Javaの[BigDecimal](https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html)など、10進法のまま計算できる数値ライブラリが標準で存在する場合は、迷わずそれを使いましょう。

ただ、フロントエンドで使うようなJavaScriptの場合、そのためにライブラリを入れるのは大げさだったりもします。ということで、「JavaScriptの`number`型で計算する」場合について考えていくこととします。

# 何も考えずに計算すると…？

例えば、「消費税8%、小数点以下切り上げ」という条件で考えてみましょう。ごくかんたんに、`Math.ceil(untaxed * 1.08)`とやってしまうと、例えば225円の場合に、本来なら225*1.08=243となるはずが、244まで切り上がってしまいます。

これは、JavaScriptの`number`が**浮動小数点数**であり、1の位より下も2進法となっているため、「1.08」を正確に表せないことが原因です。実際にコンソールで`225*1.08`を打ち込むと、`243.00000000000003`という値が返ってきます。

なお、[この前に書いたような方法で](https://qiita.com/jkr_2255/items/0321b411243daf549ffc)、この「1.08」のつもりで入力した値の厳密な値を調べてみると、「1.0800000000000000710542735760100185871124267578125」と、1.08より僅かに大きくなっていました。ということで、切り捨ての場合はわずかに大きくなってもまとめて切り捨てられるだけなので、（端数だけで0.01オーダーになるくらい巨大な数を扱う場合以外は）問題ありません。

また、四捨五入の場合も、1.08を整数倍しても端数が0.5きっかりになることがないので、たまたま問題にはなりません。

とはいえ、これらの「問題ない」というのは値を厳密に検証してわかることなので、消費税率が変わればまた前提も変わります。たとえば、消費税率10%になれば、整数以下の端数が0.5になる事例は容易に発生します（もっとも、「1.1」が1.1より僅かに大きいので、0.5で切り上げる四捨五入の場合は影響せずに済みます）。

## 正確に計算するために

いちばん確実なのは、`untaxed * 108 / 100`のように計算することです。$2^{53}$（≒83兆）以下の整数では誤差が出ませんので、掛け算までは正確に行われます。割り算も、結果が正確に浮動小数点数になるなら、正確な値を返します。

もともと`1.08`と浮動小数点数で与えられている場合、対策としては「本来数字のあるはずがない桁であらかじめ四捨五入してから戻す」という方法が考えられます。整数 × 1.08であれば、正しい結果は小数点以下2位までしかないはずなので、100倍した後に小数点以下に残っているものは誤差ということになります。ということで、ここでいったん四捨五入してから100で割り戻せば、（浮動小数点数として表せる範囲内では）正確、ということになります。

このように、金額のような離散的な値について浮動小数点数の計算を正しく行おうとすれば、それぞれの値がどういう範囲を持つべきものなのか、厳密な吟味が必要となります。そして、僅かな誤差でも、整数に対してプラスであれば切り上げに、マイナスであれば切り捨てに、0.5に対してマイナスの誤差が出る場合は四捨五入に影響してきます。
IFTTTの音声アシスタント対応状況


[スマートスピーカーIFTTT 大喜利 アドベントカレンダー](https://qiita.com/advent-calendar/2017/ssifttt)1日目です。



初日に向けてすごいポエムを書こうとしたのですが出てこず、ウォームアップ代わりに、IFTTTの音声アシスタント対応状況について調べたのを書きます。


# IFTTT対応パートナー一覧と、音声アシスタントへの対応状況


現在、IFTTT 対応パートナーは360以上あるそうです。
https://ifttt.com/search/services

その中で「Voice Assistants」のパートナーは4。

<img width="50%" border="3" src="https://qiita-image-store.s3.amazonaws.com/0/173392/020507a8-ebfc-fbff-8bfb-c566f61e4ff5.png">
パートナー数はたった4ですが、中身は激アツです。主にAlexa対応のアプレットのせいで。
↓


|名前|説明|アプレット数|日本語対応状況|
|:-----|:-----|:-----|:---|
|[Amazon Alexa](https://ifttt.com/amazon_alexa) |Amazon Echoが搭載しているAIアシスタント|230個以上|×|
|[Google Assistant](https://ifttt.com/google_assistant)|Google Homeが搭載しているAIアシスタント|49個|◯|
|[Invoxia Triby](https://ifttt.com/invoxia_triby)|Amazon AlexaとApple HomeKitに対応したスマートスピーカー|18個|×|
|[jibo](https://ifttt.com/jibo)| パーソナルロボット。|12個|×|

Amazon Alexa対応アプレットがダントツに多いです。
内訳をみてるとなんか似たようなものが多いですがそこはスルーします。



なお日本語対応してるかどうかは、実際に「IF」でこれらのサービスを選んだ時に「Language」の選択肢で「Japanese」が選べるかどうか？をみております。
Amazon Alexa自体は最近になって（11/8)日本語対応しましたが、11/30時点でIFTTTでの日本語対応はまだの状態です。

Invoxia Triby
https://robotstart.info/2017/10/18/invoxia-triby-smart-portable-speaker.html
jibo
https://www.jibo.com/
この二つはぜんぜんシリませんでした。手に入らないと思うけど、jiboはイベントスペースとかにあったら面白そう。


# IFTTTの "IF"と"Then" への音声アシスタント対応状況



## Amazon Alexa 

"IF"にのみ対応しています。

使えるトリガーは16種類あります。
多くがショッピングリストに関するものですね。
その中で、「Say a specific phrase」というのが汎用的につかえそうです。
![スクリーンショット 2017-11-30 3.17.55.png](https://qiita-image-store.s3.amazonaws.com/0/173392/b7f6da7b-e23f-fafd-3303-b9bfa19b8657.png)


## Google Assistant

"IF"にのみ対応しています。


使えるトリガーは4種類あります。
アマゾンと違ってショップリストなどに固定化されておらず、また、話しかけた言葉の中から数字やフレーズを抜き出すことができます。
![スクリーンショット 2017-11-30 3.11.44.png](https://qiita-image-store.s3.amazonaws.com/0/173392/1d5c2fa3-dd7c-a5e9-387e-c0ceb030f3f3.png)












## 気になった点（あとで調べる）

- Amazon Alexa対応のIFTTTのアプレットを使い始めるさい、スマホのAlexa appでIFTTT?のAlexa Skillを「有効」にする必要がない。パソコンのブラウザ上で、Amazon LoginをすればOK。
- Google Assistantも同じく、GoogleアカウントのSSOだけでOK。
- 一体どういう仕組みなのか。。

あとで調べてみようっと。



以上です！
元Cybozu萩原さんからSREについて僕が学んだこと（基礎編）

こんにちは。[@katsuhisa__](https://twitter.com/katsuhisa__) です。

本記事は、「[SRE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/sre) 」の12/2(土)分です。

また、本日「[Cybozu Tech Conference 2017](https://cybozu.connpass.com/event/70374/)」にて私がLT する内容を記事として書き起こしたものです。LT 資料は[こちら](https://speakerdeck.com/katsuhisa91/yuan-cybozu-qiu-yuan-sankara-sre-nituitepu-gaxue-ndakoto)においてありますので、もしよければ併せてご参照ください。

## （前置き）萩原さんとは
元 Cybozu インフラチーム副部長
現 levii CTO 兼、弊社[スタディスト](http://studist.jp)技術顧問

弊社スタディストの技術顧問に就任していただいた際のプレスリリースは[こちら](http://studist.jp/news/pressrelease/komon_171102/)。

## 萩原さんからSRE について学んだこと
* 自動化しなくてもToil は減らせる
* モニタリングとアラートを正しく活用
* SLI を策定し、サービス状態を正しく把握せよ

順を追って見ていきます

## 自動化しなくてもToil は減らせる
萩原さんが弊社スタディストの技術顧問に就任してから、現状のインフラ関連の運用業務の棚卸しを行いました。
その過程で、定常的に行っているインフラ業務（Toil ）のうち、いくつかはかんたんな施策を行うことにより、実施頻度を減らせそうだ、ということが分かりました。

Toil を減らす、というと真っ先に自動化を思い浮かべるかと思いますが、コードの実装にもそれなりに時間がかかりますよね。（もちろん実装コストの低いものに関しては、すぐ自動化するように心がけています。）
当時、私はすべてを自動化で対応しないといけないと思い込んでいたこともあり、「いまは別の優先度高い開発案件もあるし、Toil 削減のための自動化はもうちょっと後回しにしよう」と思っていました。

しかし、実際に萩原さんのアドバイスに従い、定常作業の頻度を減らす施策を行ったところ、私の業務負荷は大幅に削減されました。至極当たり前のことに見えますが、**がんばって自動化しなくても、単にToil を減らせば運用は楽になる**のですね。

[Google のSRE 本](http://amzn.to/2AH8sPp)でも、「Toil を減らせ」ということが書かれていますが、よく読んでみると、「業務の50%以上をToil に費やすな」ということが書かれていますよね。
つまり彼らの業務にもToil は残っており、それを優先順位をつけながら自動化を進めているのだと思います。（実際に中の人に話を伺ってみたいものです。）

近年、2回以上実施するタスクは、なんでもかんでも自動化することが常に正義という風潮があり、私もそう思い込んでいたのですが、この件は私にとってまさにコロンブスの卵のような話でした。

もちろん優秀なSRE がたくさんいて、毎日SRE 本来の活動に集中できる素晴らしい環境であれば、それは素晴らしいことであり、自動化を否定する気は1ミリもありません。
ただ、リソースの限られたスタートアップでの生存戦略の1つとして、この発想の仕方自体が非常に応用の効く素晴らしいものだと思います。
もし参考になったよーという方がいれば、みなさんの会社でも似たような取り組みを是非行ってみて下さい。きっと効果が出るはずです。

## モニタリングとアラートを正しく活用
弊社では、以前、適切な監視システムが整備されておらず、障害時の影響や原因の切り分けがかなり高コストになっていました。
また、アラートも適切に設定されているとはいい難い状況で、アラートを起点にして調査を行ったが、単なる一時的なサーバー負荷上昇のみで、顧客影響はまったくなかった、なんてこともよくありました。

そこで、萩原さんと相談した結果、

* 不要なアラートの抹殺
* 新規監視システムの導入

の2つの施策に取り組みました。

これらも、先ほどのToil 削減の施策に引き続き、施策完了後の効果は絶大でした。
不要なアラートがこないことで、私の精神的な負荷が現象し、そして無駄な調査を実施する必要もなくなりました。

さらに新規監視システムの導入を行ったことで、これまで見えなかった傾向もつかみやすくなり、性能改善関連の施策が非常に回しやすい状態になりました。

## SLI を策定し、サービス状態を正しく把握せよ
最後にSLI の話です。

「なんかいま遅い気がするけど大丈夫？」となった際に、状況がうまく把握できず、「うーん、これは他のお客さんの環境では大丈夫なのか？」と困ってしまったことはありませんか？
例えば、社内のネットワーク環境側に問題があったとすると、システム側の状況をいくら調査しても、知りたい答えにはたどり着けません。

これまで弊社では、SLA は設定していたものの、ふだんのインフラ運用時に気にかける指標や、問題を具体的に定義するための判断指標がありませんでした。そのため、上述したような状況の場合、とりあえずいろんな監視システムで取得している指標を個別に確認し、その結果ようやく「調査しましたが、おそらく大丈夫です」といった判断をしていました。

そこで、萩原さんと改めてSLI について議論し、また、SLI を判断するために監視システム（前述した監視システムと同一）を活用するようにしました。
その結果、サービスの状態を正しく把握することができるようになりました。そのおかげで、前述したような、実は社内ネットワークが遅いだけなのにシステムの調査をがんばる、みたいな誰も幸せにならない無駄な仕事から開放されました。

## まとめ
SRE という仕事に就く人たちは、今はどこの会社でもめちゃくちゃ人手が足りていないように思います。（私の肌感覚ですが・・・）
ですので、いまご自身の持ち場でがんばっている皆さんには、できるだけSRE 本来の仕事に取り組むべく、無駄な運用業務は減らすことが重要であると感じます。そのために、本記事がお役に立てば幸いです。

というわけで、他の「[SRE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/sre) 」の記事もたいへん楽しみにしています。お読みいただきありがとうございました。

[@katsuhisa__](https://twitter.com/katsuhisa__)
繰り返しの性能評価作業をＪｅｎｋｉｎｓにご依頼して結果(Python+Jupyter）をRedmineチケット発行までしていただく

性能検証をやると何度もやり直したりするわけで、、、都度、ログから分析評価作業をExcelで作って配布することになるのですが。。。
これが毎回となるとチョーめんどくさいことになってくるわけです。

ということでちょっとスキマ時間ができたので手元にあるツールを使って、半自動で指標算出＋グラフ作成＋公開するような仕組みを作りました。




#特に目新しい物はなく使ったのは以下の通り
![構成図.png](https://qiita-image-store.s3.amazonaws.com/0/213343/acee7cc8-9950-8d38-c1c3-833f60470f53.png)

* egrep
* scp
* Python+Jupyter
* Redmine

自動実行はおなじみの方にお願いしました。

* Jenkins 
![jenkins.png](https://qiita-image-store.s3.amazonaws.com/0/213343/0e5f7f3a-d4b2-d104-ddba-f3148265adfe.png)

#追伸：
実際に使いはじめると様々考慮が必要なことがわかりました。

* egrep結果が０件考慮・・・RCは0で返らず途中で止まる
* 0件レコードをdfへ読み込む場合、parseを指定している場合の考慮・・・エラーになります。
* 空ファイルはチケット添付ができない・・・エラーとなります。

といった対策も必要ですのでお気をつけください。

---
申し訳ないのですが会社でコードを書いたのでここでは開示できません。
ご了承ください。

#データ抽出
apacheログとWACsログから業務トランザクション総量、Service毎のトランザクション明細を抽出します。この段階でカウント対象外の明細も落とします（egrep）。

#サーバは各所にあるのでそれぞれ作業をするのがちょー面倒くさい。
SCPを使ってひとつのサーバに集めます。

集まってきたデータに対してJupyterであれこれ楽しみます。
指標算出とグラフ作成までやってしまいます。
![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/213343/0f296b30-7d1f-64db-dc5d-f258877b9c43.png)


#指標とグラフをどう見せようか、、となるのですが
開発現場ですのでRedmineとPythonを連携させます（RESTで・・・便利！）
![redmine.png](https://qiita-image-store.s3.amazonaws.com/0/213343/4c03a9ed-f00d-e09d-7b08-90ef5987ab20.png)


#ここまでの作業をJenkinsに登録、自動実行します。
何度でも、文句をたれずやってくれます。さすが。

#結果を公表する
利用者は発行されたチケットをブラウザでみるだけ！
なんだ〜この便利さは。。。。

#本日より使いはじめましたが実によいです。
あっという間に分析結果を還元できますのでプロジェクト参加者からも好評でした。
テスト作業に集中できると。

ただegpre結果０件考慮などいろいろありまして、、、、コードはまだちまちまと改修してます。
現場では思わぬことも起きるものです。。。と。
Skyway IoT SDKからArduinoに指令を送る

これまで私はWebブラウザからRaspberry Piに接続されたハードウェアを操作する用事がある場合はPusherというWebSocketのSaaSを使ってました。

Pusherはライブラリも豊富で便利なのですが、せっかくのWebSocketなのに太平洋の向こうまでパケットが飛んで行くのにどうも納得行かず、Skyway IoT SDKへの置き換えをしてみることにしました。

# Skyway IoT SDKのインストール＆動作確認

とりあえず、こちらのページを元にインストール。
https://qiita.com/komasshu/items/5042c1e18eb4589b977a


# Raspberry PiからArduinoをコントロール

PCからarduinoにシリアルで文字列「１」を受け取ると１秒だけ光るスケッチを書き込みます。

```c
byte c = 0;

void setup(){
  Serial.begin(9600);
  pinMode(13,OUTPUT);
}

void loop(){
  while (Serial.available()){
    c = (int)Serial.read();
    switch(c){
      case 49://1
        digitalWrite(13,HIGH);
        delay(1000);
        digitalWrite(13,LOW);
        break;
    }
  }
}
```

次にRaspberry PiにNode.jsのシリアルポート接続ライブラリをインストールします。

https://www.npmjs.com/package/serialport

公式に記載の通り、`sudo npm install serialport --unsafe-perm --build-from-source`とオプションを付けないと、ちゃんと動かないので注意。

ArduinoをRaspberry Piに挿し替え、こんな感じのサンプルスクリプトで動作確認してください。

```serial_test.js
const SerialPort = require('serialport')
const fs = require('fs')
var sp = null
var files = fs.readdirSync('/dev/')
files.forEach(function(file){
  if( file.match(/ttyAC/) ){
    sp = new SerialPort('/dev/'+file, {
      baudRate: 115200
    })
    console.log(file)
  }
})
sp.write('1')
```

# skyway-siru-device/metrics.jsを書き換え

上記の動作確認ではmetrics.jsでRaspberry Pi側のカメラ画像やCPU使用率などを送信してますので、ここにシリアル通信を受信するところを書き足しましょう。

https://github.com/nttcom/skyway-siru-device/blob/master/examples/metrics.js

まず、metrics.jsの先頭部分に、さっきのserial_test.jsを書き足します。そして、metrics.jsのdevice.get()がGETを受信したときの動作ということで、ここにシリアルポートへアクセスする文を書き足してみましょう。

```js:metrics.js
device.on('connect', () => {
  device.get('/echo/:mesg', (req, res) => res.send(req.params.mesg))
  startSendMetrics()
  setTerminate()
})
```

こんな感じに書き換えます

```js:metrics.js
device.on('connect', () => {
  device.get('/echo/:mesg', (req, res) => {
    res.send(req.params.mesg))
    sp.write(req.params.mesg)) // 追記：シリアル通信
  }
  startSendMetrics()
  setTerminate()
})
```


# sample-client.htmlを書き換え

次にブラウザ側です。

https://github.com/nttcom/skyway-iot-sdk/blob/master/sample/sample-client.html

ボタンを押した際の処理を

```js:sample-client.html
  btn.addEventListener('click', ev => {
    client.fetch(uuid+'/echo/helloWorld', {method: 'get'})
      .then(res => res.text())
      .then(text => console.log(`echo message: ${text}`))
  })
```
こんな感じ（helloWorldを「１」に）書き換えます。

```js:sample-client.html
  btn.addEventListener('click', ev => {
    client.fetch(uuid+'/echo/1', {method: 'get'})
      .then(res => res.text())
      .then(text => console.log(`echo message: ${text}`))
  })
```

これで、ブラウザ上でボタンを押すとRaspberry Piに「１」という文字列が飛び、Raspberry　　PiからArduinoに「１」が飛びます。

Arduinoがシリアルを受け取ったら爆発するようにすれば、おしおきだべぇ〜を再現できますね。めでたしめでたし。