OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでPID制御をやってみる

#はじめに
最近、独学で制御工学を勉強し始めました。
<b>理解を深める為にはプログラミングで実装してみるのが一番早い</b>、というのが私の理念です。
なので、今回は最近勉強したPID制御をPythonを使って実現してみます。
なお、この記事ではPID制御や制御工学の原理・理論の説明はしません。
Pythonでの実装にのみフォーカスを当ててます。

matplotlibとnumpyを使います。
OSは、Ubuntu16.04とMacOS High Sierra10.13で動作確認済みです。
Python2.7, Python3.6の両方で動きます。
一応、[GitHub](https://github.com/KoutaOhishi/pid_control_python)にもコードを上げておきます。


#変数の説明
M  : 与える操作量
M1 : 一つ前に与えた操作量
goal : 目的値
e  : 偏差(目的値と現在値の差)
e1 : 前回の偏差
e2 : 前々回の偏差
Kp : 比例制御（P制御)の比例定数
Ki : 積分制御（I制御)の比例定数
Kd : 微分制御（D制御)の比例定数

#操作量（M）の求め方
操作量（M）の求め方ですが、本来ならば、微積の計算をして操作量（M）を求めます。
しかし、それには莫大な計算が必要になる上、そもそもコンピュータで扱えるのは基本的に離散的な値です。
そこで、サンプリング方式
<b>M = M1 + Kp * (e-e1) + Ki * e + Kd * {(e-e1) - (e1-e2)}</b>
で操作量（M）を求めます。

#プログラムコード
それでは、いよいよプログラムを書いていきます。

まずは、必要なモジュールをimportします。

```py
import numpy as np
from matplotlib import pyplot as plt
from numpy.random import *
```

次に、メインの部分を書いていきます。

```py
M = 0.00 
M1 =  0.00 
goal = 50.00  
e = 0.00 
e1 = 0.00 
e2 = 0.00 
Kp = 0.1 
Ki = 0.1 
Kd = 0.1 

t = 100
```
M, M1, e, e1, e2は最初は0.00に設定しておきます。
goalは目的の値でとりあえず今回は50.00にしておきましょう。
Kp,Ki,Kdはパラメータとなります。最初は様子をみて全て0.10にしておきましょう。
謎の変数tが出てきましたが、これは時間（t）です。for文のループ回数を設定する為に使います。

次に、グラフで表示するための準備をします。

```py
x_list = []
y_list = []

x_list.append(0)
y_list.append(0.00)
```
x_listには時間（t）が入ります。
y_listには与えた操作量（M）が入ります。
時間（t）が0の時には、操作量も0.00なので、for文で回す前に事前にリストに格納しておきます。

そして、いよいよPID制御に入ります。
と言っても、先ほどのサンプリング方式の式に代入するだけです。

```py
for i in range(1,t):
        M1 = M
        e2 = e1
        e1 = e
        e = goal - y_list[i-1] #偏差（e） = 目的値（goal） - 前回の操作量

        M = M1 + Kp * (e-e1) + Ki * e + Kd * ((e-e1) - (e1-e2))

        x_list.append(i)
        y_list.append(M)
```
偏差（e）の求め方は、制御対象によって変わるので注意してください。
とりあえず今は、（目的値）と（前回与えた操作量）の差を偏差（e）としています。

最後に、グラフで表示してみましょう。

```py
plt.hlines([goal], 0, t, "red", linestyles='dashed') #ゴールを赤色の点線で表示
plt.plot(x_list, y_list, color="b") #青色でグラフを表示
plt.ylim(0, goal*2) #グラフの高さを調整
plt.show()
```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246881/3c22d8ac-8b8f-b667-45da-28a40fca0d14.png)


最初の段差が少々気になりますが、綺麗な曲線で目的値まで届いていると思います。

#パラメータを変えてみよう
試しに、Kp, Ki, Kdをそれぞれ0.01と0.50に変えてみました。

## Kp = Ki = Kd = 0.01
![Figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246881/62e6ec2a-ebb3-f868-57ee-96b24152ff6d.png)
パラメータが0.01だと、目的値50.00まで届かないです。

## Kp = Ki = Kd = 0.5
![Figure_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246881/96396dbc-02b3-d387-bdda-babf703c33d5.png)

パラメータが0.50だと値が収束せずにハンチングが発生してしまいました。

#ノイズ入りバージョン
ランダムでノイズを入れてみましょう。
コードは[GitHub](https://github.com/KoutaOhishi/pid_control_python)に上げておきます。


#最後に
簡単ではありますが、PythonでPID制御をやってみました。
今回はKp,Ki,Kdのパラメータを全て同じ値に設定しましたが、実際は各パラメータを細かく調整する必要があります。

2018/07/03 [altさん](https://qiita.com/alt)、編集リクエストありがとうございます。

参考にしたサイトを載せておきます。
[モータのPID制御法](http://www.picfun.com/motor05.html)
[【分かりすぎる】PID制御の基礎](https://www.youtube.com/watch?v=xdTuNJj-fRg)（YouTube動画）

ソースコードは[GitHub](https://github.com/KoutaOhishi/pid_control_python)載せておくので参考にしてください。
Clojure環境を導入（mac）

# macにClojure環境を導入

## Homebrewが導入されていて、Java 8 もインストールされているとする
Java8がインストールされていない場合は
Java8のインストールはOracleのページからダウンロードしたファイルをインストールすればよい。homebrewを利用しようとしたらはまった。
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
このうち
jdk-8u211-macosx-x64.dmg
をダウンロードしてインストール。

## Clojureのインストール
ターミナルで以下を実行。

```
$ brew install leiningen
```

次に、

```
$ lein repl
```
を実行すると

```
Retrieving org/clojure/tools.nrepl/0.2.12/tools.nrepl-0.2.12.pom from central
Retrieving org/clojure/tools.nrepl/0.2.12/tools.nrepl-0.2.12.jar from central
Retrieving clojure-complete/clojure-complete/0.2.4/clojure-complete-0.2.4.jar from clojars
nREPL server started on port 61594 on host 127.0.0.1 - nrepl://127.0.0.1:61594
REPL-y 0.3.7, nREPL 0.2.12
Clojure 1.8.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0_73-b02
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> 
```
となり、Clojureのセッションが始まる。
初回は10数秒かかった。
終了方法は、Control+D または (exit) または (quit)　。

###Java 10をインストールした場合
OracleのホームページからJava 10をインストールした場合、うまく起動しなかった。復旧方法を検討中。

# Clojureのバージョンアップ

```
$ brew upgrade clojure
```
Watson WorkspaceでJiraの課題を作る方法

#Watson Workspace
Watson Workspaceをご存知でしょうか?
IBM社が提供するグループチャットサービスです。ざっくりとWatsonベースのSlackのようなもので、ファイル共有にはIBM Connectionsと連携します。
昔からのIBM Notes/Dominoユーザー視点では、有料になりますがIBM社のエンタープライズレベルのサポートを受けることができるので心強いでしょう。Watson Workspaceは、無料のIBM Cloud ライト・アカウントを登録していればログイン時のメールアドレスとパスワード(即ちIBM ID)で、Watson Workspaceを無料のPreview Editionから始めることができます。
URL：https://workspace.ibm.com にアクセスし、「Get started」をクリック。お使いのIBM IDでログインします。

#やりたいこと
- プロジェクト管理ツール/業務タスク管理ツールに、Jiraを使っているとします。
- Watson Workspaceに、Jiraのプロジェクトキーと課題の要約をメッセージとして送信すると、プロジェクトキーをもとに課題を作成し、課題のURLをレスポンスとしてWatson Workspaceに返す。
- 課題タイプは、タスクに固定。
- 課題の説明は、デフォルトで「Watson Workspaceから作成」に固定。
- Watson Workspaceのスペースにてメッセージ送信。数秒待つと、Jiraから作成された課題のURLが返ってくる。
![wws-jira-create-issue_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/5eba5567-fc01-6554-b1f3-8a6a5d92a066.png)


#仕様
- IBM Cloud ライト・アカウントに登録。無料でWatson Workspaceなどの各種Watsonサービスが使える。
- 外部から接続可能なサーバー上に、Node-REDを導入。
- 外部から接続可能なサーバー上に、Jira(Jira Software)を導入。手順例：[IBM Cloud IaaSの場合](https://qiita.com/kolinz/items/039e8b7b47a358ff0c86)
- Node-REDは、ユーザー名とパスワードによる基本の認証を適用
- Node-REDのパレットの管理から、[node-red-contrib-wwsNodes](https://www.npmjs.com/package/node-red-contrib-wwsNodes)ノードを追加

#今回の材料
「[Slack経由でJiraの課題を作成する方法](https://qiita.com/kolinz/items/ed44794ca482cd4aeb4f)」と「[Watson Workspace用チャットボットを作る方法](https://qiita.com/kolinz/items/939a107540ac5985be42)」の2つの記事で作るNode-REDのフローをミックスします。ちょうど下図のようになります。Slack Bot InとSlack Bot outノードを不要になります。

![wws-jira-create-issue_flow.png](https://qiita-image-store.s3.amazonaws.com/0/41414/78241f2f-60ae-92e4-0436-5e0e8a59a529.png)

#参考資料
Watson Workspace：https://www.ibm.com/jp-ja/marketplace/watson-workspace
Node-RED：https://nodered.jp/
Windows10 + Vagrant + Virtual Box + docker + node.js で npm install すると text file is busy となるエラーに対処したメモ


## 結論

ファイル共有でnode_modulesがうまく作られないのが原因。
node_modulesディレクトリはコンテナ内のみに隔離することで対応。

## 動作環境

* windows10
* vagrant2.1.1
* virtualbox5.2.12
* ubuntu-18.04
* Docker version 18.05.0-ce, build f150324
* docker-compose version 1.21.2, build a133471

## エラーメッセージ
```
root@06ceade09ca6:/app# npm install
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
npm WARN rollback Rolling back ansi-regex@2.1.1 failed (this is probably harmless): ETXTBSY: text file is busy, unlink '/app/node_modules/ansi-regex/package.json.3358036472'
npm WARN rollback Rolling back acorn-dynamic-import@3.0.0 failed (this is probably harmless): ETXTBSY: text file is busy, unlink '/app/node_modules/acorn-dynamic-import/package.json.1207675771'
'/app/node_modules/budo/node_modules/minimist/package.json.1923057578'
npm WARN app@1.0.0 No repository field.

npm ERR! path /app/node_modules/array-find-index/package.json.2479725784
npm ERR! code ETXTBSY
npm ERR! errno -26
npm ERR! syscall rename
npm ERR! ETXTBSY: text file is busy, rename '/app/node_modules/array-find-index/package.json.2479725784' -> '/app/node_modules/array-find-index/package.json'

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-07-02T13_59_51_752Z-debug.log
```


## 対応方法

以下のように、コンテナのボリュームを指定してやることで、node_modulesをコンテナ内のみにおいておき、ホスト側のディレクトリを使わないようにできる。

```yaml:docker-compose.yml
version: '3'
services:
  test:
    build: ./test
    volumes:
      - ../src:/app
      - /app/node_modules # コンテナ内のnode_moduleをvolumesに登録
  ```
## 参考

[Docker と node_modules と Volume Trick][*3]
[DockerでのNodeアプリ構築で学んだこと][*4]

[*3]:https://shotat.hateblo.jp/entry/2016/12/01/221631
[*4]:https://postd.cc/lessons-building-node-app-docker/
gRPC, grpc-gatewayで作るダミーAPIサーバー

というのをふと思いついたのでメモ程度に残しておく。あとからサンプルコードとともにちゃんと公開する

![IMG_0725.JPG](https://qiita-image-store.s3.amazonaws.com/0/28262/4fdf56f8-9f1d-1910-21f2-7faa9a2c03a2.jpeg)

## それぞれの課題
- フロントエンドエンジニア/デザイナーの課題
  - APIサーバーを叩く必要があって必要なJSONがほしい
  - サーバーサイドの実装が待ちになると生産性が低い
  - APIの仕様が変わる場合早く知らせてほしい
- Swagger ドキュメントの課題
  - 実装とドキュメントの乖離が起きがち
    - Swaggerには書かれてるけどまだ実装が終わっていない
    - 実装は終わってるがSwaggerが更新漏れしていた
- サーバーサイドエンジニアの課題
  - APIの仕様が変わると実装のvalidationなどの変更が面倒
  - サーバーサイド実装作ってみて、フロントエンドに渡したあとで仕様変更が発覚した

### 課題
- ドキュメントと実装の乖離は少なくしたい
- フロントエンドとサーバーサイド分けて実装したい


## gRPC + grpc-gateway
- https://grpc.io
- https://github.com/grpc-ecosystem/grpc-gateway
- ProtocolBufferでAPIの仕様を先に決めて、そこからコードを書くのでドキュメントと実装の乖離が起き得ない
- gRPCはサーバー/クライアントのスタブ、インターフェースを吐き出す
- ダミーのAPIサーバーを作って好きな言語で適当なJSONを返すサーバーを最速で提供すればフロントエンドエンジニア助かるのでは
- gRPCサーバーの本実装、テストは非同期でサーバーサイドエンジニアが行う

## 代替策
* [たった30秒でREST APIのモックが作れる JSON Serverでフロントエンド開発が捗る](https://www.webprofessional.jp/mock-rest-apis-using-json-server/)
* json-serverでダミーAPIサーバーを実装
* Swaggerでドキュメント管理
* 実装とドキュメントの乖離は起きるしメンテがめんどくさそうではある、が低コストで導入するにはこちらのほうが早い


## フロントエンドの実装をサーバーサイドから分離する
- [デザイナーさんとの共同作業の悩みをLaravel Mixで解決する](https://qiita.com/saboyutaka/items/f5793a1c3dc25b4a9305)
  - フロントエンドとデザインはHTML(ejs), CSS, JSのことしか考えないで実装する
- Ajaxが必要な部分をダミーサーバーで実装すれば更にサーバーサイドとの結合度が下がる

## gRPC最高では！？
ABC102 D

#D - Ecual Cut
##問題
整数列A が与えられる．これを4つに区切り，それらを好きな位置でB,C,D,E に分割する．
それぞれについて要素の和をP,Q,R,S とする．P,Q,R,S の最大値と最小値の差の絶対値としてあり得る最も小さい値を求めてください．
問題のリンク　https://abc102.contest.atcoder.jp/tasks/arc100_b
##解法
まず累積和を求めておく．
3箇所に区切りを入れるが，まず真ん中の区切りを１つ固定する．
分けた後の整数列をそれぞれ L,R とする．L,R についてさらに区切りを入れる．L,R について区切りを入れる条件は区切りを入れた後の数列の要素の和ができるだけ近いことである．この条件で3つに区切りを入れることができる．
真ん中の区切りが右にずれるに従って L の総和は単調増加，R の総和は単調減少となる．よって L に関して区切りを入れる場合，区切りを左にずらすと絶対値の差が増加してしまうため, それが左にずれることはない．これは Rに関して区切りを入れる場合も同様である．


##コード

```sample.cpp

#include <iostream>
#include <algorithm>
#include <math.h>

typedef long long ll;
using namespace std;

int main()
{
  int n, i;
  ll a[200001]={0};
  ll p[200001]={0};
  cin >> n;

  for(i=1; i<=n; i++){
    cin >> a[i];
    p[i] = a[i] + p[i-1];
  }

  ll ans = 1e16;
  ll diff[4];

  ll l=1, r=3;

  for(i=2; i<=n; i++){
    while(l<i && abs(p[l]-(p[i]-p[l])) >= abs(p[l+1]-(p[i]-p[l+1]))) l++;
    while(r<n && abs((p[r]-p[i])-(p[n]-p[r])) >= abs((p[r+1]-p[i])-(p[n]-p[r+1]))) r++;
    
    diff[0]=p[l];
    diff[1]=p[i]-p[l];
    diff[2]=p[r]-p[i];
    diff[3]=p[n]-p[r];

    sort(diff, diff+4);
    ans = min(ans, diff[3]-diff[0]);
  }

  cout << ans << endl;
  return 0;
}
```
ベレの方法

# ベレの方法とは
 [Verlet Integration](https://en.wikipedia.org/wiki/Verlet_integration)。物理っぽい動きを簡単にシミュレーションするもの（だと思う）。

わかりやすい野中さんの解説（動画あり）
http://www.fumiononaka.com/Sample/Creators_MeetUp/Creators_MeetUp_150516.html

kyndさんのおしゃれなデモ
https://kynd.github.io/p5sketches/verlet.html

まず、野中さんの解説動画をみて、kyndをみればかなり理解できる。


# ２つの処理

### Verlet Point
* 速度のプロパティは持たず、1フレーム前の位置だけ保持する。そして、その差分を速度とする。
* 壁などのぶつかったら、めり込んだ分だけpositionを戻す。

[野中サンプル](http://jsdo.it/FumioNonaka/vVTg)
[Kyndサンプル](https://codepen.io/kynd/pen/BRMmGO)

### Verlet Strick
VerletPoint 2点を線でつなぐ。2点の距離を最初に定めておく。毎フレのposition更新のあと、2点のベレポイントが、定めた距離以上にならないように、制限する。

[野中サンプル](http://jsdo.it/FumioNonaka/1uOz)

# テクニック 

## 四角を作るとき
4点を4つの線でつないだだけだと、つぶれちゃうので斜め2本も使う。
[野中サンプル](http://jsdo.it/FumioNonaka/eV9N)

## 重力を与える
毎フレーム position.y -= 0.1 とかしときゃいい。
[kyndサンプル](https://codepen.io/kynd/pen/pPGdqX)

# 自分で作ったもの

* demoその1 http://kitasenjudesign.com/sketch/17/
* demoその2 https://kitasenjudesign.com/sketch/25/
* Unityソース https://github.com/kitasenjudesign/UnityVerletIntegration
某RPGっぽいUIをCSSとHTMLだけでつくってみたよ

# 背景
CSSだけで色々出来ることが分かってきたので、少し作ってみたよ。
**＊PC版Chromeでしか確認してないよ！**

![名称未設定.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/89227/9d12c8f3-08a8-3127-f2f3-d085ff2742b0.gif)


## 実装
### CheckBoxで状態変化
CheckBoxがチェックされたときだけ状態を変化させる感じ。
下記のような実装で対象となる要素の状態を変えられる

```html
<input id="s1" type="radio" name="sel">
<label class="sel" for="s1" id="sl1">こうげき</label>
```

```css
.nesttarget{
/* ~~省略~~ */
  display:none;/* 通常時は表示を消しておく */
}
#s1:checked ~ .nesttarget{
  display:block;/* CheckBoxがcheckedに変化した場合に表示 */
}
```
### 点滅する矢印
`before`要素で頭に記号を付けて実装
これをアニメーションで点滅させる

```css
/* "▶"→"　"を繰り返すようなアニメーション効果 */
@keyframes select-anime {
    0% {content: "▶";}
    100% {content: "　";}
}
#s1:checked ~ #sl1:before {
  animation: select-anime 500ms linear infinite;
}
```


## デモ

<p data-height="265" data-theme-id="dark" data-slug-hash="QxYEPK" data-default-tab="result" data-user="hashito" data-embed-version="2" data-pen-title="Create a RPG-like UI with CSS and HTML only" class="codepen">See the Pen <a href="https://codepen.io/hashito/pen/QxYEPK/">Create a RPG-like UI with CSS and HTML only</a> by hashito (<a href="https://codepen.io/hashito">@hashito</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 最後に
すごく雑な記事ですが…
自分の備忘録としてのこさせてください…
打招呼 dǎ zhāo hu（あいさつ）

# 単語

## 基本のあいさつ

|中国語      |ピンイン       |日本語|
|:-----------------|:------------------|:------------------:|
|早安。|zǎo ān|おはようございます。|
|午安。|Wǔ ān|こんにちは。|
|晩上好。|Wǎn shàng hǎo|こんばんは。|
|你好。|Nǐ hǎo|こんにちは。こんばんは。|
|晚安，再見。|wǎn ān,zài jiàn|お休みなさい|
|再見。|zài jiàn|さようなら|
|再見，改天見。|zài jiàn,gǎi tiān jiàn.|じゃあ、また。では、また。|
|下次見。|xià cì jiàn.|では、また今度。|
|待會見，改天見。|dài huì jiàn, gǎi tiān jiàn.|では、またあとで。|


## お久しぶりです

|中国語      |ピンイン       |日本語|
|:-----------------|:------------------|:------------------:|
|好久不見。|Hǎojiǔ bùjiàn|お久しぶりです。|


## 最近どうですか？

|中国語      |ピンイン       |日本語|
|:-----------------|:------------------|:------------------:|
|你好嗎？|Nǐ hǎo ma?|お元気ですか？|
|過得怎麼樣？|Guò dé zěnme yàng?|いかがですか？|
|最近怎麼樣？|Zuìjìn zěnme yàng?|いかがでしたか？|
|最近工作好嗎？|Zuìjìn gōngzuò hǎo ma?|最近仕事はどうですか？|
|最近身體好嗎？|Zuìjìn shēntǐ hǎo ma?|最近調子はどうですか？|
|最近家裡好嗎？|Zuìjìn jiālǐ hǎo ma?|最近ご家族はどうですか？|
|最近學業好嗎？|Zuìjìn xuéyè hǎo ma?|最近勉強はどうですか？|


## 返事

|中国語      |ピンイン       |日本語|
|:-----------------|:------------------|:------------------:|
|一切都順利。|Yīqiè dōu shùnlì.|順調です。|
|很好喔！|Hěn hǎo ō!|元気ですよ。|
|非常好喔！|Fēicháng hǎo ō!|とても元気です。|
|還是一樣。|Háishì yīyàng.|相変わらず。|
|就那樣囉！|Jiù nàyàng luō!|まあまあです。|


##会話1.お名前は？

`Nín guìxìng?`
您貴姓？
お名前はなんといいますか？

`Wǒ xìng zhōngdǎo, jiào huìlǐ.`
我姓中嶋,叫恵里。
私の名字は中嶋、名前は恵里です。

##会話2.お元気ですか？

`Nǐ hǎo ma?`
你好嗎？
お元気ですか？

`Shì de, wǒ hěn hǎo. Nǐ ne?`
是的，我很好。你呢？
はい、元気です。あなたは？

`Ń, wǒ yě hěn hǎo.`
嗯，我也很好。

##会話3.どうぞよろしく

`Nǐ hǎo, wǒ xìng lín.`
你好，我姓林。
こんにちは、私は林です。

`Qǐng duōduō zhǐjiào.`
請多多指教。
どうぞよろしくお願いします。

`Wǒ xìng zhōng tián.`
我姓中田。
私は中田です。

`Yě qǐng nǐ duōduō zhǐjiào.`
也請你多多指教。
こちらこそどうぞよろしくお願いします。

`Hěn gāoxìng jiàn dào nǐ.`
很高興見到你。
お会いできて嬉しいです。

##会話4.お邪魔します

`Dǎ rǎo le.`
打擾了。
お邪魔します。

`Qǐng jìn.`
請進。
どうぞ。

##会話5.さようなら

`Míng tiān jiàn.`
明天見。
また明日。

`Míng tiān jiàn.`
明天見。
また明日。

`Lù shàng xiǎoxīn.`
路上小心。
お気をつけて。

##会話6.そろそろ失礼します

`Wǒ chà bù duō gāi zǒule.`
我差不多該走了。
そろそろ失礼します。

`Zhè yàng a, xià cì huānyíng zài lái.`
這樣啊，下次歡迎再來。
そうですか、ぜひまたお越しください。

##会話7.楽しかったです

`Wǒ jīntiān guò dé hěn kuàilè.`
我今天過得很快樂。
今日はとても楽しかったです。

`Wǒ yěshì.`
我也是。
私も楽しかったです。

##会話8.今度はいつお会いできますか

`Xià cì héshí kěyǐ jiànmiàn ne?`
下次何時可以見面呢？
今度はいつお会いできますか？

`Xià xīngqí'èr rúhé?`
下星期二如何？
次の火曜日はどうですか？

`Hǎo a.`
好啊。
いいですね。

`Xià xīngqí'èr jiàn luó!`
下星期二見囉！
次の火曜日にお会いしましょう。

##会話8.お元気で

`Bǎozhòng. Xià cì jiàn!`
保重。下次見！
お元気で。またお会いしましょう！

`Ń, qídài xià cì zàijiàn.`
嗯，期待下次再見。
ええ、楽しみにしています。
NEOで自分の通貨を作ってみた

# はじめに

NEOを使うと簡単にマイコインが作れた！！ので、
自分がちょっとハマってしまったポイントと共に、通貨の作成方法をまとめます。

# NEOとは
NEOは、分散アプリケーションのスケーラブルなネットワークを構築するために設計されたブロックチェーンプラットフォームと暗号化方式です。

> NEO is a blockchain platform and cryptocurrency designed to build a scalable network of decentralized applications. 
引用：
https://en.wikipedia.org/wiki/NEO_(cryptocurrency)

# 環境作成
参考：　[Mac(マック)で行うNEO(ネオ)の プライベートネットの環境構築をわかりやすく解説](https://medium.com/@NeoKeymakersJP/mac-%E3%83%9E%E3%83%83%E3%82%AF-%E3%81%A7%E8%A1%8C%E3%81%86neo-%E3%83%8D%E3%82%AA-%E3%81%AE-%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%8D%E3%83%83%E3%83%88%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%92%E3%82%8F%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%8F%E8%A7%A3%E8%AA%AC-9ffec6c8174a)

## 事前準備
リンク先にあるように、
- Homebrew
- python3.6以上
- git
- Docker
のインストールをしましょう。

## neo-pythonのインストールと起動

```
$ docker pull cityofzion/neo-privatenet

# private netを起動
$ docker run --rm -d --name neo-privatenet -p 20333-20336:20333-20336/tcp -p 30333-30336:30333-30336/tcp cityofzion/neo-privatenet

# leveldbのパッケージをインストール
$ brew install leveldb

# neo-pythonをインストール
$ pip install neo-python

# python3.6を使って仮想環境を構築
$ python3.6 -m venv venv
$ . venv/bin/activate

# neo-pythonを起動
$ np-prompt -p -v

# 自分は上のコマンドでエラーが出たので、下記コマンドでpycryptodomeを入れ直しました
$ pip3 uninstall pycrypto
$ pip3 uninstall pycryptodome
$ pip3 install pycryptodome==3.6.1

# neo-pythonを起動
$ np-prompt -p -v
Privatenet useragent '/NEO:2.7.4/', nonce: 1173470966
[I 180702 23:49:24 LevelDBBlockchain:115] Created Blockchain DB at /Users/username/.neopython/Chains/privnet
[I 180702 23:49:24 NotificationDB:73] Created Notification DB At /Users/username/.neopython/Chains/privnet_notif
NEO cli. Type 'help' to get started

neo> exit

```

# コインを作成する
まずはリポジトリを取得します

```
$ git clone https://github.com/kentarohorie/simple-neo-token-sample
```

simple-neo-token-sample/yourcoin/token.pyの `TOKEN_NAME` と `TOKEN_SYMBOL` を好きな名前に変えましょう！！

```
TOKEN_NAME = 'yourcoin'

TOKEN_SYMBOL = 'yourcoin'
```

walletの更新

```
$ cd simple-neo-token-sample/wallets/
$ rm neo-privnet.wallet
$ wget https://s3.amazonaws.com/neo-experiments/neo-privnet.wallet
```

walletを開きます

```
$ cd ../
$ ls
README.md			wallets				yourcoin-smartcontract.py
__init__.py			yourcoin

$ np-prompt -p -v

neo> open wallet wallets/neo-privnet.wallet
#パスワードはcozです

#walletの中身を確認
neo> wallet
```

.pyファイルからavmファイルにコンパイルし、コントラクトをプライベートネットワークにデプロイします

```
neo> build ./yourcoin-smartcontract.py test 0710 05 True False name []
neo> import contract yourcoin-smartcontract.avm 0710 05 True False

#返答があるまで待つ

```

返答があったら、"script_hash"の値を控えておいてください

```
#<script_hash>の値に置き換えて実行してください
neo> testinvoke <script_hash> deploy []
neo> import token <script_hash>
```

こんな感じの返答があったら完了です！

```
[I 180703 00:30:05 EventHub:71] [test_mode][SmartContract.Execution.Success] [14657f895103adfa9d204a89606a70f6f6d0b73a] [b'yourcoin', b'yourcoin', 8]
added token {
    "name": "yourcoin",
    "symbol": "yourcoin",
    "decimals": 8,
    "script_hash": "script_hash",
    "contract_address": "contract_address"
}
```
Alexa Skill 応答文字数が多すぎてエラーになってしまった


Lambda　function上でテストを実行しても正常なのに、
なぜかAlexa Skills Kitのシュミレーターで実行するとエラーが出る時、
outputSpeechに渡しているテキストの量が多すぎる場合がある。
減らしたらOKだったので、何文字だったらOKだったか、メモ。


 （１）outputSpeechの"ssml"に渡している文字列＝3923文字：エラー
 （２）outputSpeechの"ssml"に渡している文字列＝3621文字：OK


（１）

```
{
  "version": "1.0",
  "response": {
    "shouldEndSession": false,
    "outputSpeech": {
      "type": "SSML",
      "ssml": "<speak> ミディアムコースを始めます。<break time=\"850ms\"/>スクワット6回を6セッションやりましょう。<break time=\"850ms\"/>でははじめます。<break time=\"850ms\"/>立ち上がって、足を肩幅に開き、腕をまっすぐ前に伸ばしてください。<break time=\"850ms\"/>背筋が丸まらないように気をつけながら、まっすぐお尻を下に下ろして、太ももと床が平行になるまで腰を落としましょう。<break time=\"2000ms\"/>いち。<break time=\"2000ms\"/>では立ち上がりましょう。<break time=\"2000ms\"/>ではもう一度同じように腰をおとして、に。<break time=\"4000ms\"/>3<break time=\"4000ms\"/>4<break time=\"4000ms\"/>5<break time=\"4000ms\"/>6<break time=\"4000ms\"/>立ったまま、30秒休憩しますーーー（略）ーーー</speak>"
    },
    "reprompt": {
      "outputSpeech": {
        "type": "SSML",
        "ssml": "<speak>  </speak>"
      }
    }
  },
  "sessionAttributes": {
    "course_id": "2"
  },
  "userAgent": "ask-nodejs/1.0.25 Node/v6.10.3"
}
```
（２）

```
{
	"body": {
		"version": "1.0",
		"response": {
			"outputSpeech": {
				"type": "SSML",
				"ssml": "<speak> ミディアムコースを始めます。<break time=\"850ms\"/>スクワット6回を5セッションやりましょう。<break time=\"850ms\"/>でははじめます。<break time=\"850ms\"/>立ち上がって、足を肩幅に開き、腕をまっすぐ前に伸ばしてください。<break time=\"850ms\"/>背筋が丸まらないように気をつけながら、まっすぐお尻を下に下ろして、太ももと床が平行になるまで腰を落としましょう。<break time=\"2000ms\"/>いち。<break time=\"2000ms\"/>では立ち上がりましょう。<break time=\"2000ms\"/>ではもう一度同じように腰をおとして、に。<break time=\"4000ms\"/>3<break time=\"4000ms\"/>4<break time=\"4000ms\"/>5<break time=\"4000ms\"/>6<break time=\"4000ms\"/>立ったまま、30秒休憩します。ーーー（略）ーーー</speak>"
			},
			"reprompt": {
				"outputSpeech": {
					"type": "SSML",
					"ssml": "<speak>  </speak>"
				}
			},
			"shouldEndSession": false
		},
		"sessionAttributes": {
			"course_id": "2"
		},
		"userAgent": "ask-nodejs/1.0.25 Node/v6.10.3"
	}
}
```
AtomからVSCodeに乗り換えたお話

# TL;DR
- **速い**
- **インストール時点で既に多機能**
- **日本語化等、細かいところが親切**（と私は感じた）


## 移行のきっかけ

元はというとAtomのGit連携がどうにも気に食わなかったんですよね。
v1.26（だっけ？）から追加されたコミットのUndo機能がすさまじくコレジャナイ感マシマシで。
前のamendにチェックつける方式のほうがよかったんだけどなあ……なんて思ってたんですけど、ふとそう言えばVSCodeあったなと。
ゆうてもMicrosoftなのでちょっと尻込みしてたんですけど、結論から言うと**神**でした。

## ちょっと違和感あったとこ

- Atomだと単語ハイライトさせると隣のペイン（タブグループ）のも光ったのだが、VSCodeにはないっぽい？あれ便利だったのでとても残念。
- Atomはソフトタブでもハードタブっぽく動いてくれる便利機能があったんだけど……。あれ便利ｄ（

**ぶっちゃけそれぐらいしかない。** 

## 感動したとこ

というわけで褒めちぎる。

-  デフォルトでカラーピッカーとか統合ターミナルとか矩形選択とかが入ってるのでAtomと比べると初期設定のハードルは **めちゃくちゃ低い。** にもかかわらず動作速度はAtomの比じゃない。本当に速い。
    - デフォで入ってる＝公式のパッケージなのでアプデで動作不安定になったりとかの心配がいらないのもうれしい。
        - [platformio-ide-terminal](https://atom.io/packages/platformio-ide-terminal)とかすごい便利なのに結構気になる点が多くて困ってたので公式統合ターミナルほんまありがとうって感じ
- コード補完がそれなりに優秀なのもいい。ちゃんと拡張入れて調整すればもはやIDE。
- キーバインドをAtomっぽくしてくれる拡張が公式で出てるのもいい。 **乗り換えが楽。**
- 個人的にはCtrl+pのファイル検索がすごい便利。「list js」みたいに適当に入力すればそれらしいファイルが出てくる。この機能のせいでマウスでいちいちツリービューかちかちしてファイル探しに行く時間が消えた。
    - Atomにもツリービュー使わずに [ファイル探して開く拡張](https://atom.io/packages/advanced-open-file) はあったんだけどあれはファイルパスを指定していく系だったのでめちゃくちゃ手間で結局使わなかった過去が……。
- キーバインドとかエディタの設定項目が検索できるのも地味にうれしい。「なんかインデント気に食わねえーーー」とか思ったら`Ctrl+,`で設定呼び出して「インデント」で検索して適当にいじるだけ。（こういうところもきっちり日本語化きいててほんまありがたや）
- こんだけありがたい機能がインストール時点でｳﾜｰｰｰｰｰｰっと入ってるのに**爆速で動く。**やべえ。

---

とりあえず私は[Atomキーバインド](https://marketplace.visualstudio.com/items?itemName=ms-vscode.atom-keybindings)と[PHP補完](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)と[全角スペースの可視化](https://marketplace.visualstudio.com/items?itemName=mosapride.zenkaku)と[GitBlame的な補助](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)してくれる拡張、あとおまけで[Laravel](https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel5-snippets)（と[blade](https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel-blade)）のスニペット拡張を入れた。

- 上記bladeスニペットのおまけでついてきたblade用のシンタックスハイライトが神。もう色ぐちゃぐちゃな`@if`をAtomで渋い顔しながら見る日々とはおさらば…………

## 最後に

VSCodeはいいぞ。
いやほんま。とりあえず落としてきてとりあえず使える。手軽さと多機能さの塩梅が絶妙。
Pythonフレンドリーなデータ管理ツールQuiltの紹介

## Quiltとは
[Quilt](https://quiltdata.com/)はデータセットの公開およびバージョン管理のためのツールです。下のイラストのようにPython,Pandas,Jupyter等を使って機械学習の開発・研究をするユーザのために設計されています。

<div align="center">
<img width="60%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/264359/83bceb06-8928-bc06-38dc-1fee901f7f45.png">
</div>


メリットとしては、再現性、透明性、高速アクセスなどが挙げられています。
個人的には、設計がシンプルで、後で説明するインストールや使用法が非常に簡単である点だと思っています。
https://github.com/quiltdata/quilt
> ・Reproducibility - Imagine source code without versions. Ouch. Why live with un-versioned data? Versioned data makes analysis reproducible by creating unambiguous references to potentially complex data dependencies.
> ・Collaboration and transparency - Data likes to be shared. Quilt offers a unified catalog for finding and sharing data.
> ・Auditing - the registry tracks all reads and writes so that admins know when data are accessed or changed.
> ・Less data prep - the registry abstracts away network, storage, and file format so that users can focus on what they wish to do with the data.
> ・De-duplication - Data are identified by their SHA-256 hash. Duplicate data are written to disk once, for each user. As a result, large, repeated data fragments consume less disk and network bandwidth.
> ・Faster analysis - Serialized data loads 5 to 20 times faster than files. Moreover, specialized storage formats like Apache Parquet minimize I/O bottlenecks so that tools like Presto DB

## インストール
```
$ pip install quilt
```

## 使い方

下図のように非常にシンプルなフローで管理することができます。

<div align="center">
<img width="40%" alt="image.png" src="https://raw.githubusercontent.com/quiltdata/resources/master/img/big-picture.png">
</div>

以下の説明ではホントに簡単なところだけ触れています。ただし、これだけれも十分使うことができます。
より詳細な使い方については以下の公式ドキュメントやSlackで
[公式ドキュメント](https://docs.quiltdata.com/)
[https://slack.quiltdata.com/](https://slack.quiltdata.com/)

### 1. データセットのアップロード

#### build ...
``` python
# 空のパッケージを作成
quilt.build("USR/PKG")

# データを挿入
from quilt.data.USR import PKG
df = pd.DataFrame(data=[1,2,3])
foo._set(['bar'], df)
```

#### push ...

```python
# レジストリにログイン (アカウントの作成が必要です https://quiltdata.com/)
quilt.login()

# レジストリにプッシュ
quilt.push("USR/PKG", is_public=True)
```


公開したデータセットは、管理ページをブラウジングすることにより以下のように確認することができます。
例: [uciml/iris](https://quiltdata.com/package/uciml/iris)
<div align="center">
<img width="80%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/264359/35533a95-07a0-ceda-05b9-ae8ab8370e93.png">
</div>


### 2. データセットのダウンロード

```python
import quilt
quilt.install("USR/PKG")
from quilt.data.USR import PKG
PKG.bar()
# Output:
# 0
# 0    1
# 1    2
# 2    3
```

## 終わりに

本記事では、データセット管理ツールQuiltの概要や使い方について解説しました。

非常にシンプルにデータの公開/バージョン管理できるため、公開者にも利用者にもメリットがあり、データセットの公開する際の1つの選択肢として面白いのでは無いのかと思いました。(※ あまり詳しくないのですが、データセットの公開方法のデファクト的なものってあるんですかね？)

ただし、無料プランだとすべて公開になるため、ビジネス用途やKaggle等のコンペでは情報漏洩の観点から採用しにくいですね。
有料プランだと7$/monthで1TBのプライベートで使えるみたいなので、pythonユーザでかなり気に入ったら採用してみるといいかもで。(今風でかっこいいし)

↓ 料金体系
<div align="center">
<img width="80%" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/264359/7d49b72f-7be0-9f93-e38d-e7bd3cd90cb7.png">
</div>
hostnameの変更方法とそれに伴うsudo: unable to resolve hostの対応方法

実行環境は`Ubuntu16.04`です。

```
[root]
$ cat /etc/lsb-release

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
```

## ホスト名の変更
### 一時的に変更する場合

```
[root]
$ hostname xxx
```
### 恒久的に変更する場合
```
[root]
$ hostnamectl set-hostname xxx
```

## `/etc/hosts`の更新
ホスト名を変更すると`sudo`で実行した場合に `sudo: unable to resolve host　xxx`と表示されます。
これはホスト名が解決できなかったことを示すエラーです。

ホスト名は`/etc/hosts`で管理されているので、以下のようにして新しく作成したhostnameを追記してあげます。

```
$ sudo sh -c 'echo 127.0.1.1 $(hostname) >> /etc/hosts'
```

by <a href="https://twitter.com/nishina555" target="_blank" rel="noopener">@nishina555</a>
numpy.padの使い方

numpy.pad
a = [2,3]
np.pad(a,[1,2],"constant")
np.array([0,2,3,0,0])
先頭に1個, 末尾に2個のゼロパディング

a = [[1,2],[3,4]]
np.pad(a,[(1,2),(3,4)],"constant")
array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 2, 0, 0, 0, 0],
       [0, 0, 0, 3, 4, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])
行の先頭に1行, 行の末尾に2行, 列の先頭に3列, 列の末尾に4列のゼロパディング

次元が上がるごとに第二引数の()を増やすことで対応できる
Ex) 
aのサイズが(10,50,50,3)
b = np.pad(a,[(0,10),(0,0),(0,0),(0,0)],"constant")
bのサイズは(20,50,50,3)になる
検索のキーワードを大小文字関係なくかつ検索元のワードを変更せずにマークアップする方法

ある日偉い人に`検索元のキーワードを変更しない`かつ`大小関係なく`キーワードを`マークアップ`して見せてご覧なさいとお願いされて完成したのが以下です。ご査収ください。

# 目的
`data`に検索元の文章が入っているとします。それに対して`keyword`で検索したときに大小関係なくマークアップをしたように文字列を返却するというのが今回の目的です。
# 結果
1. `(?i)`の前にある`keyword`を大小関係なく判定(iはinsentiveの略)
2. その`keyword`を`()`で囲み一つのグループとする
3. 変更する部分＋`$1`をつける（ちなみにグループが２つあった場合は`$1 $2`）

↓↓コードで書くとこんな感じです↓↓

```java
String keyword = "java";
String data = "Java java javaJava";

// (?i)で大文字小文字区別しない
// ヒットした文字を()でグループ化
data = data.replaceAll("((?i)" + Pattern.quote(keyword) + ")", "<mark>$1</mark>");

// <mark>Java</mark> <mark>java</mark> <mark>java</mark><mark>Java</mark>
System.out.println(data);
```
[Gist](https://gist.github.com/yoshiki-0428/d4485fcd5d7ba898f56b08a184e8ff9a)

# 結果に至るまで
ゴリゴリとやってたらなんかダサいと言われた。。。笑（確かにwhileってなんかなぁとは思っていた）

```java:良くない例
Pattern p = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE).matcher(data);
while(p.find()) {
  int start = p.start();
  int end   = p.end();
  ~発見した位置情報から計算してゴリゴリタグを埋めていく~
}

```

# 感想
結構綺麗に完結に実装できたのではないだろうかと思う。なんでも検索をしてその結果をマークアップして表示したい！なんて処理にはもってこいの書き方。あくまで例なので参考程度にどうぞ。

# 参考サイトとか
http://a4dosanddos.hatenablog.com/entry/2016/04/06/002657
HTML5&CSS3デザイン

#前置き
「HTML5&CSS3デザインブック」を読んだ。
大きくは、近年のWebデザインについて語られていた。
SIerとして、table ベースで作られていた社内向けWebページしかメンテしてこなかったので、
現在のWebページの作り方という意味で、本書は非常に勉強になった。
ここでは、備忘的に内容で気になったものをまとめる。

#近年のWebページデザインとしてのボックス
近年のWebページでは段組みといって、テキストや画像を複数の段に分けてデザインする。
複数の段を実現するために、ボックスを複数並べ、それぞれのボックスに画像やテキスト、
メニュー等を入れ、それらの配置をコントロールする。

#フローティングボックス
要素を \<div> タグで囲み、これらをボックスとする。
ボックスは float 属性を指定し、他のボックスから影響を受けない、フローティングボックスという状態にする。

フローティングボックスを実現するために、float の指定が他の要素と干渉しないよう clearfix（クリアフィックス）と呼ばれる設定を適用する。

```html:test.html
<!-- ボックス化 -->
<div class="boxA">
</div>
```

```css:test.css
/* clearfix */
.boxA:after {contents: "";
             display:block;
             clear : both}

/* フローティングボックス化 */
.boxA       {float: left}

```

#ボックスの並び順
width 属性等で全体のパーセンテージ比率を100%以内にすることで、
clearfix 適用範囲内のフローティングボックスの並び型を変えることができる。
また並び順を変えるためには、float 属性の value 指定を left / right で指定することで
変えることもできる。

#レスポンシブWebデザイン
表示するデバイスの横幅によって、フローティングボックスの並びを、これまでの技術をもとにコントロールすること。
css 内に メディアクエリ を記載し、表示デバイスの画面幅によって適用する css 、適用しない css を設定することが可能。

```css:test.css
/* メディアクエリ */
@media (min-width:768px) {
/* hogehoge */
}

```

#最後に
ざっくりだったが、基本的なことは大体上記な感じ。
ボックスを使用したデザインは、今後UI変更等があった場合、業務でも使えるかもしれない。
ともかく、HTMLやCSSの基本は知っていても、実際どうやってデザインすりゃいいんじゃ、という方にお勧めの一冊。
【初心者向け】web3.jsで展開済のコントラクトを呼び出す時にハマったこと

初投稿です。よろしくお願い致します。[こちらの記事](https://qiita.com/zaburo/items/35757fcc688942d7b5f4)を参考にweb3.jsを使って展開済のコントラクトを呼び出そうとしたのですが、えらいハマってしまい大変な思いをしたので、どんな点でハマってしまったのかを書いていきたいと思います。

# 前提条件
    
- gethが正常に動作している（gethのバージョンは1.8.8）。
- Remixが正常に動作している（Remixのバージョンは0.6.3）。
- gethとRemixの連携ができており、コントラクトのデプロイまでできている。
- web3.jsがインストールされている（web3.jsのバージョンは0.20.0）。
- なお、こちらはgethとRemixをレンタルサーバー（VPS）上で動かしています。OSはUbuntu16.04です。

なお、前提条件ができていない場合は、一番下の参考記事を参考にしてみて下さい。


# 展開済のコントラクトを呼び出してみる
```javascript:test.js
var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

//abi情報
var abi = [{"constant": true,"inputs": [],"name": "HelloEther","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "pure","type": "function"}];

//コントラクトのアドレス
var address = "0xb37ea71ecdcb442c3a5c9ce3ce63fdaaa6976da5";

//コントラクトの取得
var contract = web3.eth.contract(abi).at(address);

//実行
var response = contract.HelloEther.call();

console.log(response);
```
web3.jsをインストールしたフォルダに、上記のjsファイルを置いて、実行します。なお、IPアドレスと、abi情報、コントラクトのアドレスはご自身の環境のものを記して下さい。

コントラクトは、以下のファイルになります。

```Solidity:HelloWorld.sol
pragma solidity ^0.4.22;
contract helloWorld {
 function HelloEther () public pure returns (string) {
   return 'Hi Ether';
 }
}
```
上記のコントラクトをデプロイまでしてあげてから、上のjsファイルを実行して下さい。

# 自分がハマったポイント
では、自分がハマってしまったポイントをご紹介しようと思います。以下の3つになります。
## コントラクトのアドレス
まずは、test.jsの中にある、コントラクトのアドレスですね。これを自分はてっきり図の①のアドレスだと思っていましたが、そうではなく②のアドレスなのですね。

![20180703-01.png](https://qiita-image-store.s3.amazonaws.com/0/267691/3fadace2-b1f2-a0c1-3d15-488841170eea.png)


## abiはコピペしないとダメ
abi情報は目で見れるものを打ち込むのではなく、クリップボード機能を使ってコピペしたものを書いてあげないとダメです。

![20180703-02.png](https://qiita-image-store.s3.amazonaws.com/0/267691/5c0008ad-e9ab-061d-8eca-836784f58713.png)

![20180703-03.png](https://qiita-image-store.s3.amazonaws.com/0/267691/a049355e-3a8f-522c-579a-3bf736b38b02.png)




## contractの次は関数名
こんなの間違えるのは自分だけかもしれませんが、var response = contract.HelloEther.call();のcontractの次はコントラクト名ではなく、その中の関数名を書いてあげないとダメです（この場合、HelloEther)。自分はここをhelloWorldって書いてました。


# まとめ
以上駆け足で、ハマったポイントをご紹介してきました。いかがでしたでしょうか。こんなの当たり前じゃんと思われる方が大半かもしれませんが、自分のような初心者はハマっちゃうんじゃないかなと思い、書いてみました。この記事が誰かのお役に立てれば幸いです。

# 参考記事
- [『gethの機能やコントラクトをweb3.jsを利用して呼び出す』](https://qiita.com/zaburo/items/35757fcc688942d7b5f4)ーこちらの記事のおかげで学習することができ、またこの記事を書くことができました。本当にありがとうございました。


- [『スマートコントラクト開発環境RemixをUbuntu16.04にインストールしてみよう！』](https://note.mu/daidai12/n/naabf42fe76d8)ーRemixのインストールについて、とてもわかりやすく書かれています。

- [『EthereumとRemixでスマートコントラクトを作って動かしてみよう！』](https://note.mu/daidai12/n/nae73013f2701)ー上の記事の続編です。コントラクトをデプロイするまでが、とてもわかりやすく書かれています。
素人が今更Twitter APIで遊ぶ　〜その２：サーチ編〜

初めましての方は初めまして。そうでない方はこんにちは。
今回は[前回](https://qiita.com/masahiro_isono/items/a6cfdd073686100f0ef1)に引き続き、Twitter APIを用いて遊んでみる。

今回の目的は「インコの迷子情報に関するtweetをサーチする」である。

#環境
* Python3
* Jupyter Notebook

#準備
まずはじめに、tweetをサーチするためのエンドポイント指定URLを探そう。
これは前回と同様、TwitterのDeveloper用ページから探せば良い。
[Standard Search APIのAPI reference](https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets)に書いてある。

このStandard Search APIにおけるResponse Informationは以下の通り。

![スクリーンショット 2018-07-02 22.59.51.png](https://qiita-image-store.s3.amazonaws.com/0/253596/ddbff1b2-3501-627a-c4d9-99fa4e81d0c2.png)

これを見ると、responseのフォーマットは前回同様JSONであり、Requestは15分あたり180回までという制約があることがわかる。

次にパラメータについて見てみる。今回Requiredなものはqだけ。

![スクリーンショット 2018-07-02 23.05.17.png](https://qiita-image-store.s3.amazonaws.com/0/253596/13610edd-ac52-5b1d-80da-0e9bafc2209c.png)

qはサーチする際のクエリである。サーチをしようというのだからクエリがRequiredなのは当たり前だね。
また、Optionalなものは数多くあり、count(取得するtweet数)の他にgeocode(latitude,longitude,radiusを指定すれば、サーチをするtweetのlocationが決められる)やlang(言語)などがある。
今回はcountのみを使用する。

これで準備が完了したので本題に入る。

#tweetをサーチする

以下のコードを走らせれば、インコの迷子情報を含むtweetをサーチすることができる。

```python:Search_tweet.ipynb
import json,config
from requests_oauthlib import OAuth1Session


ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret

twitter = OAuth1Session(ck, cs, at, ats) #OAuth認証処理

url = 'https://api.twitter.com/1.1/search/tweets.json' #tweetサーチのエンドポイント指定

params = {'q' : 'インコ　迷子', 'count' : 1} #パラメータ指定

res = twitter.get(url, params = params)

try:
    timelines = json.loads(res.text)
    timelines = timelines['statuses'][0]
    print('Success')
    print('*************************************************')
    print(timelines['user']['name'] + ':' + timelines['text'])
    print(timelines['created_at'])
    
except:
    print(type(json.loads(res.text)))
    print('Error')
```

結果はこんな感じ

![スクリーンショット 2018-07-02 23.21.48.png](https://qiita-image-store.s3.amazonaws.com/0/253596/0354f783-a587-c77e-7c68-597076915ab9.png)

できたあ。

Responseを取得するところまでは、前回とほとんど同じなため説明を割愛する。
try-except文以降について以下で説明する。
そもそもtry-except文とは、Exceptionが発生した時に例外処理を行うことができるという構文だ。
使い方は

```python:try-except
try:
    #Exceptionが発生する可能性はあるが、実行したい処理
    
except エラー名:
    #Exceptionが発生した際に実行したい処理
```

こんな感じ。便利だねえ。

try-except文を使用した理由は、res.textのデータ型が前回と少し異なり、謎の挙動を示すからだ。
res.text自体はdictなのだが、その下のres.text['statuses']はなぜかlist。さらにその下のres.text['statuses'][0]はdict。
これだけでも腹立つが、サーチ100回に1回程度データ型に関するエラーが発生する。
このように謎の挙動されるのが面倒であり、その原因のデータ型を探りたいため(重力波Detection魂が燃える)、try-except文を用いた。
原因はいまだに特定できていないため、誰か知ってる人教えてくださいお願いします。

まあなんにせよ無事にインコの迷子情報に関するtweetをサーチすることができたのでよしとしよう。

#終わりに
今回でインコの迷子情報に関するtweetをサーチすることができたので、次回以降はこの情報を活用した何かを考えていきたいと思う。
インコ救いてえな。マジで。

余談だが、ドイツとスペインが敗退した。クロアチア3位が最も現実的かな。
>https://qiita.com/masahiro_isono/items/ad5d36483f27ff4bcb95

ありがとうございました。
【CSS】marginとpaddingの違い

すいませんがProgateのキャプ画がわかりやすいにも程があって
大変助かるのでそのまま貼ります。
権利関係でまずかったらすぐ消すので言ってください。
<img width="675" alt="スクリーンショット 2018-07-02 23.36.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/32d053b3-aaa4-5398-abd3-4513442ba752.png">
[VirtualBox][CentOS]最初にやるべきこと個人的なまとめ(Guest Additions CD/共有フォルダー)

VirtualBoxへCentOS7をインストールした後に最低限使えるようにするための個人的な備忘録

# 対象
- Linux初心者
- Linuxを触ってみたい
- 手元のPCに仮想環境を作ってみる
- 取り敢えずGUIで触りたい

# やるべきこと
1. Guest Additions のインストール
2. 共有フォルダ設定

# 準備するもの
- VirtualBox
- ホストOS：任意
- ゲストOS：CentOS7

# 1. Guest Additions のインストール
1. ゲストOS内でターミナルを起動
2. Guest Additions に必要なものをインストールするために下記コマンドを実行

    ```
    $ sudo yum update
    $ sudo yum install kernel-devel kernel-headers gcc gcc-c++
    ```

3. 再起動
4. ゲストOSのメニューバー > デバイス > Guest Additions CD イメージの挿入... を選択
5. 自動実行のポップアップが出たら「RUN/実行」を選択
6. パスワード入力
7. Press Return to close this window... が表示されたら Enter
8. 再起動

# 2. 共有フォルダ設定
1. ゲストOSのメニューバー > デバイス > 共有フォルダー > 共有フォルダー設定
2. 右端の追加ボタンをクリック
3. フォルダーのパス > その他 > 共有したホストOSのフォルダを選択
4. 自動マウント、永続化する へチェックを入れ、OK
5. ゲストOS内でターミナルを起動
6. VirtualBoxの共有フォルダーへのアクセス権を追加するために下記コマンドを実行

    ```
    $ sudo gpasswd --add {ユーザー名} vboxsf
    ```

7.再起動

# 参考
[VirtualBox上のCent OSにGuest Additionsをインストールする方法](https://qiita.com/SUZUKI_Masaya/items/ac0c9e8eb060f84f25a3)
[VirtualBoxで共有フォルダにアクセス権限がないと言われるときの対処](https://qiita.com/r9y9/items/4ae5c608f8e73804980b)
IntelliJでlombokを使ったときはまった話

#概要

普段からIDEを使ってJavaで開発している人にとってはなんてことない話ですが
はじめて開発することになりはまったので備忘録+自分のような人が出ないようにのメモ（そんなのおらんか）

#環境
- spring boot 2.0.3
- lombok 1.16.22
- IntelliJ IDEA Community Edition 2018.1 x64

#lombokとは
アノテーションをつけるだけでgetter,setterなどを自動で生成してくれる
Kotlinなんかは言語として組み込まれていた気がする。

##導入
build.gradleに以下をいれるだけ

```
compile('org.projectlombok:lombok')
```

##使用例

```
@Entity
@Data
@Table(name="counter")
public class Counter {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="title")
    private String title;

    @Column(name="count")
    private int count;
}
```

# 問題
spring bootのEntityを作成するときなどに便利だが
これだけだとアノテーションがきいていない（REST APIを作ってもEntityにうまくマッピングされていない）
コンパイルする時にはアノテーションを理解できるが展開はしてくれない模様。

```
[{},{},{},{},{}]
```

こんな返値になる。

#原因
IDEにもpluginを入れないとダメ

Settings>Plugins>Browse Repository>"lombok"

で導入
再起動を求められるので行う
Settings>Build, Execution, Deployment>Compiler>Annotation ProcessorsでEnable annotation processingにチェック

ちゃんと返ってくるようになった

```
[{"id":1,"title":"all","count":0},{"id":2,"title":"select","count":0},{"id":3,"title":"update","count":0},{"id":4,"title":"delete","count":0},{"id":5,"title":"put","count":0}]
```

はじめてspring bootを使って開発をしていますがやたらとはまる。。。
OpticalFlowによるテクスチャアニメ補間のテスト

#環境
Unity2017.3.0p4
Windows10 Home

#概要
OpenCv3のOpticalFlowでFlowMapを作成して補間するテストです

#OpenCV
OpenCvSharp3を使用しました

#テクスチャ
使用した画像です
https://blogs.unity3d.com/jp/2016/11/28/free-vfx-image-sequences-flipbooks/

#動作
左側がflowmapで右側が線形補間です。flowmapのほうは補間は綺麗ですが、全体的に揺れている。
テクスチャを均等分割したけど、中心がずれてるスプライトがあるのかも。
![GifCapture-201807022226392970.gif](https://qiita-image-store.s3.amazonaws.com/0/138534/c4abb2ae-32b6-f666-55a2-6456b55142e1.gif)

flowmapです。
![Explosion01-light-nofire_5x5_flow.png](https://qiita-image-store.s3.amazonaws.com/0/138534/c7e2559d-5b5d-ef49-82ae-12c463638aa7.png)

#コード
多いのでgithubにアップ
Tools/OpticalFlowで生成
https://github.com/fukaken5050/OpticalFlow

#ツール
市販のVFXツールでも作成できます

Slate Editor
https://www.facedownfx.com/

Houdini
https://www.sidefx.com/ja/

#参考
http://www.klemenlozar.com/frame-blending-with-motion-vectors/
Todoistでスマート日付認識機能が正常に動作しない時に見直すべき設定

# そもそもTodoistって何？
Doistが提供するタスク管理ツールのことです。
タイトル名にもあるスマート日付認識機能により毎日こなすタスク、平日こなすタスク、特定の日時のみこなすタスクなど時間帯やタスクの周期を決めることができたり、タスクを階層別に分けたりする機能がイケメンすぎて筆者がどハマりしてしまったツールです。

詳細は以下公式サイトを参照されたし。
https://ja.todoist.com

【参考リンク】
あまり知られていないTodoistの10個の便利な機能
https://blog.todoist.com/ja/?p=1202

# 筆者の環境
Macbook proの2017年モデルを使用していますが、Windowsでも共通する解決方法かと思います。

# 発生した現象
Todoistでは、タスクの中に日付を入れることで、自動的に期日を認識して反映してくれる機能があるのですが、それが急に機能しなくなった時がありました。

<img width="782" alt="スクリーンショット 2018-07-02 22.27.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/217194/c4283fed-2bf0-9da4-a34e-69379b002bd6.png">
↑画像のように毎日とタイプするとスマートに期日を登録できたのに

<img width="783" alt="スクリーンショット 2018-07-02 22.28.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/217194/9c413e88-26d5-24c0-b795-47e775e99da6.png">
↑ある日を境に突然スマート日付認識機能が効かなくなってしまった

# 解決方法

画像内右上の設定アイコンから設定を選択します。

<img width="277" alt="スクリーンショット 2018-07-02 22.29.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/217194/3a07f1f0-f638-708b-fd9c-a5118d4338d1.png">

設定画面が開いたら、一般を選択して設定内の言語設定とスマート日付認識の項目が正常になっているか確認。

<img width="782" alt="スクリーンショット 2018-07-02 22.29.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/217194/bc7acdaf-cec2-06da-4134-f7955bc80b4b.png">

なぜ言語設定も見直すのかは、入力する言語もこちらで設定した言語で認識されるため、ここが英語やポルトガル語になっていたら日本語に変えましょう。バイリンガルの方はお好みで。
✳︎ちなみに筆者は変えた覚えがないのに英語になってました。すっかり溶け込んでいて当初全く気付かなかったです。

# まとめ
Todistは非常に優秀なタスク管理ツールであるがゆえに、一度便利機能がなくなってしまった途端、離脱しそうになってしまった経験からこうして書き残しておこうと思い立ちました。
皆様のよいTodistライフの参考になりましたら幸いです。
windows maya (GUI環境）から multiprocessing でmayapy を使用する

## 前置き

maya (gui) 起動中何らかの処理を他の maya インスタンスにぶち投げたいということがある。そのような場合どのようにしたらよいだろう？ maya にはバッチモードで動作するための仕組みがいくある。ここでは mayapy を maya(gui) から起動すると陥る２つの落とし穴について述べる。

・・・guiからmayapyを使うと、たとえばこのようなことができる

 * 現在のシーンを保存して裏でそのシーンに対して何かする


## 素朴な起動方法
multiprocessing を利用するには、たとえば以下のようにする、

```python:mpの使用例
import multiprocessing

po = multiprocessing.Pool(process_count)
po.map(initialize_process, range(process_count))
res = po.map_async(my_super_heavy_process, arg_list)

# gather results
results = res.get()
po.close()
po.join()
```

ところが、maya(gui) から実行すると `gui` を起動してしまう。*そうじゃない* 計算資源だけを調達したいので `mayapy` を起動したい。それには[ドキュメント](https://docs.python.org/2/library/multiprocessing.html#multiprocessing.set_executable)にあるように `set_executable` を使用し起動インタプリンタを設定してやればよい。

multiprocessing:
https://docs.python.org/2/library/multiprocessing.html#multiprocessing.set_executable


```python:multiprocessing.set_executableを使うと
import multiprocessing

exe = sys.executable
mayapy = os.path.join(os.path.dirname(exe), "mayapy.exe")
multiprocessing.set_executable(mayapy)

po = multiprocessing.Pool(process_count)
以下略
```

これでよさそうだが、今度はプロセスをスポーンするさいに不思議なエラーが発生する。
`ImportError: 'No module named maya'`


関連
https://pikovolt.com/?p=3497

・・・リンク先だけでは不十分なので以下に補足する。


## ImportError: 'No module named maya' の回避策

先に回避策を書く、

```python:multiprocessing.process.ORIGINAL_DIRを設定する

import multiprocessing
import multiprocessing.process as process

exe = sys.executable
mayapy = os.path.join(os.path.dirname(exe), "mayapy.exe")
multiprocessing.set_executable(mayapy)

process.ORIGINAL_DIR = os.path.join(
    os.path.dirname(exe),
    "../Python/Lib/site-packages"
)

po = multiprocessing.Pool(process_count)
以下略
```

ここでいったん `multiprocessing` が何をやっているのか、何のために使っているのか振り返ってみよう。やりたいことはメインスレッドとは独立してなにかの処理を子プロセスで成したいわけだ。ではこの子プロセスとは何者であるか。それがこのエラーを解決する手がかりとなる。

`multiprocessing` では子プロセスを作成する際、親プロセス環境を（なるべく）複製し受け渡す。具体的には、sys.pathであったり、sys.argv だったりを、無垢の新プロセスに注入している。この時に同時に、multiprocess.process を実行しているスクリプト *スクリプトエディタかもしれないし何らかのファイルかもしれないのだが* の **インポート** が行われる[^1]。端折ると multiprocessing はPythonスクリプトファイルからの起動されることを前提としており、何らかのバイナリファイルから使用されることは考慮していないわけだ。これが先の `ImportError: 'No module named maya'` の正体だ。 maya.exe から呼び出したから `import basename("maya.exe")[0]` （疑似コード）みたいなことを試行する *そして失敗する* 。

以上の事態を（比較的副作用なさそうに）回避するためのコードが↓だったわけだ

```py
process.ORIGINAL_DIR = os.path.join(
    os.path.dirname(exe),
    "../Python/Lib/site-packages"
)
```

ここでは モジュール `maya` が multiprocessing から見えるようにしてやっている。"maya" を通すのが筋だろうということでこうしているが、ほかにも回避法はあるのでお好みで運用すればよい。

## PicklingError: Can't pickle...

さて ImportError が回避できた！と喜ぶのもつかの間

```py

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed`
```

に遭遇することになるだろう。*しないかもしれない* これは何か？エラーメッセージを見ればわかるが Pickle できないと怒られている。何が Pickle できないのか。それは子プロセスに渡す情報：つまり 関数および引数のことだ。この２つが pickleによるシリアライズが通らないと子プロセスに伝えられない。ゆえにエラーが発生する。解決策はいくつか考えられるが、multiprocessing で並列実行させる処理本体は、なるべく平易な構造、モジュールに配し、引数も単純な構造にしてやるとよい。


[^1]: 行われないケースもある。ソース参照 https://github.com/python/cpython/blob/2.7/Lib/multiprocessing/forking.py#L504
[初心者向け]RSSを使って、Slackで更新情報を受け取る



##対象年齢？
自分のように、新人/この業界で若手の方々
自分のように、ベンチャーのバリバリでなく、なんとなくITに来てしまった人
情報収集の方法を探している人
slack使ってみたいなって人

##背景
この業界に入り、「情報収集」という日常的な仕事？が増えたと思います。
（社会人なら当たり前と言われれば。。。ですが）

諸先輩方を見ると色々な情報を集めています。すごい（小並感）

私のように、情報を見るのがメンドウに感じる人も、わからなすぎて嫌に感じることがある人も__興味のある技術や分野__が見つかると思うので、若いうちに情報収集が普通であるという癖をつけていたほうがいい。

Let's IT！！


##本題　Slack + RSS を使って好きな情報を集める
何番煎じかわからないけど、情報集めるのにslack使おうぜって話
なお、うちの会社はセキュリティ上slack使えません。はい、残念。
###目次　以下３つ！
***
- slackって？
- RSSって？
- 更新情報をslackで受け取る

###slackって？
***
チャットできるクラウドサービス
なんか、みんな使ってる
チャットだけじゃなくて、アプリを追加することでいろんな機能が増えるよ！
（twitterやgithubとかと連携）

###RSSって？
***
ブログでも、ニュースサイトでもなんでもいいけど、更新した概要（日時とタイトルなど）を配信するためのフォーマットのこと。

このRSSの更新情報を読むにはRSSリーダーってツールとかブラウザとか使うのが一般的だけど、slackでもできるよって話。

###更新情報をslackで受け取る
***
早速、やってみる。やることは以下の3つ。

1. Slackに登録する
1. SlackにRSSのアプリを追加する
1. RSSを読むサイトを登録する

1.Slackに登録する
以下のサイト参照です。とても詳しく書いてあります。
https://tech-camp.in/note/technology/14901/

2.SlackにRSSのアプリを追加する
スラックを開き、チャンネルの「＋アプリを追加する」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/2bbf0069-ff96-217d-55e1-adb17400d816.png)

サインインする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/e9037d6f-e975-6968-58e4-455fe57e2202.png)


左のメニューから「必須アプリ」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/8e1bbfa3-8102-451b-317a-f61605358862.png)


「RSS」をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/59346c8c-3b37-3d1a-9f6b-709b493a08bc.png)

インストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/a65d8c28-8ab8-25de-1ee5-ec5ca38a35c5.png)



RSSインテグレーションの追加をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/2a09de55-3aad-8553-f0ee-dfbf22b630f5.png)



3.RSSを読むサイトを登録する
RSSフィードのURLを入力する(後述)。また、通知させるチャンネルを選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/450a027a-e398-fb85-f6de-9024e2ddf358.png)

＊このフィードURL。無知すぎて、ハマった。
ITmedia様様のサイト参考にするならば、ブラウザのRSSのアイコンをクリックして表示される画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/40823cc2-9bea-5fc6-faf5-08874eb28d34.png)

このURLをそのまま使う
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159147/dd8977ca-5920-44b9-f8d3-aae88636ec49.png)


以上。あとは、情報サイトの更新を待つンゴ。
DynamoDBに大量データをputしたときのエラーについて

#概要
業務で数千件のデータを1件ずつputし続けたら、CloudWatchにて下記エラー。

```
The level of configured provisioned throughput for one or more global secondary indexes of the table was exceeded. 
Consider increasing your provisioning level for the under-provisioned global secondary indexes with the UpdateTable API
```


ハッシュキー以外でqueryを実行したいため、このテーブルはGSI（グローバルセカンダリインデックス）を貼っている。
どうやらこのGSIのキャパシティが超過したらしい。

いまいちわからないのが、実行している処理ではqueryしておらずGSIの参照は実施していないはず。
データを追加するときに、GSIを貼りなおすからキャパシティが超過している？

[こちら](https://qiita.com/naomichi-y/items/eb42491932b46821bb6c)によると、サフィックスを付けることで解決できるらしい。

ただ今回は要件上最大データ数が、数千件なのでGSIのプロビジョニングの書き込みキャパシティを、少し上げて対応。
vue.js 読み込みできなかったimg画像に代替画像を当てはめる component

htmlのimgタグのerrorイベントを利用して、指定した画像がリンク切れなどで読み込みできなかった場合に
指定の代替画像を当てはめるcomponentです。

こんな感じでどうでしょうか。

```javascript
 Vue.component('replaceableImage', {
    props: ['o'],
    template: '<img :src="o.src" v-on:error="altSrc">',
    methods: {
        altSrc: function()
        {
            this.o.src = this.o.altsrc
        }
    }
})


var vm = new Vue({
    el: '#app',
    data: {
        imgobj: {src:"本来の画像.jpg", altsrc:"代替画像.jpg" }
    }
})
```




```html
<div id="app">
   <replaceable-image v-bind:o="imgobj"></replaceable-image>
</div>
````

代替画像の差し込みほか、エラーだった場合のclassを割り当てるなども同じ感じでできそうです。
データ分析のMATLAB にSaaS / NoSQL データをフィードする方法（例：kintone）

#はじめに
MathWorks 社のMATLAB は、高度なデータ解析、アルゴリズム開発、モデル作成などを手軽に実施できるツールとして多くの数学者、科学者、技術者に愛用されているツールです。

今回は、MATLAB と[CData ODBC Drivers](https://www.cdata.com/jp/odbc/) を一緒に使うことで、Salesforce、Dynamics365、Gmail、kintone などのSaaS データや、NoSQL データをシームレスにMATLAB から利用する方法を説明します。

![MATLAB-CDATA.png](https://qiita-image-store.s3.amazonaws.com/0/116843/d6a892a7-fb6c-33a5-84a2-b9055b3c5bba.png)

#CData ODBC Drivers のインストールとサービスへの接続設定
SaaS であるkintone のデータをODBC DSN として設定する方法は、[CData Software ハンズオン（Microsoft PowerBIからkintoneのデータを可視化）](https://qiita.com/kuwazzy/items/027dd204a9d28b245fec)の前半部分を参考にしてください。

CData ODBC Drivers では、100を超えるSaaS およびNoSQL のデータを標準ODBC データソースとして利用できます。同様の方法で他のデータソースへの設定が可能です。

#MATLAB からのODBC データソースの利用方法
##ODBC DSN の利用方法
［アプリ］⇒［Database Explorer］を選択します。
![スクリーンショット (1056).png](https://qiita-image-store.s3.amazonaws.com/0/116843/b4cae4bf-a273-7888-f6bd-6b6094f16d8c.png)

［New Query］をクリックして、データソース接続画面で、［Data Source］をドロップダウンすると、先ほど設定したODBC DSN が表示されます。これらから使うものを選択します。Username、Password は入力不要です。
![スクリーンショット (1058).png](https://qiita-image-store.s3.amazonaws.com/0/116843/81efb649-806c-89e1-e3d7-45b2a9a72a4c.png)

CData ODBC Driver により、データはスキーマの付いたテーブルデータにモデル化されており、左ペインの［データブラウザー］にRDB のように表示されます。ここから利用するデータを選択すると、自動的にSELECT クエリが生成され、プレビューが実行されます。MATLAB で生成されているSQL がODBC Driver 経由でParse されて、リアルタイムで元のデータソースのAPI を叩きに行っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116843/eefccfce-741e-4c6c-2267-71f273630ba7.png)

##フィルタリングやソートの利用
MATLAB では、SQL クエリが分からないユーザーでも、フィルタリング、ソートなどができるようなUI が用意されています。フィルタリングであれば、［Where］、ソートであれば［Order By］のアイコンからSQL の知識なしに操作が可能です。［Join］も可能です。

CData ODBC Driver 経由でモデル化されたSaaS、NoSQL データにも、MATLAB のUI からのフィルタリングやソートが利用可能です。

［DATABASE EXPLORER］の［Where］アイコンをクリックします。
Column でフィルタリングする項目を選択、Operator で演算子を選択、Value にフィルタリングをする値を直接入力します。［Add Filter］ボタンを押すと、フィルタリングのSQL が生成され、プレビューのデータがフィルタリングされます。もし、フィルタリングを変更する場合には、変更して［Update Filter］をクリック。また複数のフィルタリングを設定することができます。

![スクリーンショット (1063).png](https://qiita-image-store.s3.amazonaws.com/0/116843/4a8611ba-3d63-6e60-b30f-2e363ff7cf3d.png)

同様に、ソートを行うには、［Order By］アイコンを押し、並び替え項目を選択し、昇順・降順を指定するとSQL が生成されます。

![スクリーンショット (1066).png](https://qiita-image-store.s3.amazonaws.com/0/116843/4493774a-8d7c-5fee-7caa-87fe270cba25.png)

データの整形が終わったら、データをData Explorer からMATLAB のワークスペースにインポートします。

このように、CData ODBC Drivers と併用することで、100を超えるSaaS、NoSQL データをRDB データのようにMATLAB からコーディングなしで扱うことができます。CSV インポートと違い、リアルタイムODBC 連携なので、データソースをリフレッシュするだけで、繰り返し作業なく最新データへの更新も可能です。