OmniAICreator/Qiita-1.07M huggingface dataset:
LinuxでSQLServerを動かしてみた

詳しくは[LinuxでSQLServerを動かしてみた](https://xn--v6q832hwdkvom.com/post/sqlserveronlinux/)を参照してください

```
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list | sudo tee /etc/apt/sources.list.d/mssql-server.list
```

```
sudo apt-get update
```

```
sudo apt-get install -y mssql-server
mssql-server (14.0.800.90-2) を設定しています ...

+--------------------------------------------------------------+
'sudo /opt/mssql/bin/mssql-conf setup' を実行し、
Microsoft SQL Server のセットアップを完了してください
+--------------------------------------------------------------+
```
```
sudo /opt/mssql/bin/mssql-conf setup
この製品のライセンス条項は、
http://go.microsoft.com/fwlink/?LinkId=746388
からダウンロードできるほか、/usr/share/doc/mssql-server/LICENSE.TXT にも記載されています。

ライセンス条項に同意しますか? [Yes/No]:Yes

SQL Server のエディションを選択します:
  1) Evaluation (無料、製品使用権なし、期限 180 日間)
  2) Developer (無料、製品使用権なし)
  3) Express (無料)
  4) Web (有料)
  5) Standard (有料)
  6) Enterprise (有料)
  7) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。

エディションの詳細については、以下を参照してください
https://www.microsoft.com/en-us/sql-server/sql-server-2016-editions

このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります
Microsoft ボリューム ライセンス プログラム。
有料エディションを選択することは、
このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。

エディションを入力してください(1-7): 3

SQL Server の言語の選択:
(1) English
(2) Deutsch
(3) Español
(4) Français
(5) Italiano
(6) 日本語
(7) 한국어
(8) Português
(9) Русский
(10) 中文 – 简体
(11) 中文 （繁体）
オプション 1-11 を入力: 6
SQL Server システム管理者パスワードを入力してください:
SQL Server システム管理者パスワードを確認入力してください:
Configuring SQL Server...

This is an evaluation version.  There are [167] days left in the evaluation period.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /lib/systemd/system/mssql-server.service.
セットアップは正常に完了しました。SQL Server を起動しています。
```
```
systemctl status mssql-server
● mssql-server.service - Microsoft SQL Server Database Engine
   Loaded: loaded (/lib/systemd/system/mssql-server.service; enabled; vendor preset: enabled)
   Active: active (running) since 水 2017-07-26 04:32:57 JST; 1min 4s ago
     Docs: https://docs.microsoft.com/en-us/sql/linux
 Main PID: 3221 (sqlservr)
   CGroup: /system.slice/mssql-server.service
           ├─3221 /opt/mssql/bin/sqlservr
           └─3241 /opt/mssql/bin/sqlservr

 7月 26 04:33:02 ubuntu sqlservr[3221]: [194B blob data]
 7月 26 04:33:02 ubuntu sqlservr[3221]: [193B blob data]
 7月 26 04:33:02 ubuntu sqlservr[3221]: [195B blob data]
 7月 26 04:33:02 ubuntu sqlservr[3221]: [106B blob data]
 7月 26 04:33:02 ubuntu sqlservr[3221]: [103B blob data]
 7月 26 04:33:03 ubuntu sqlservr[3221]: [101B blob data]
 7月 26 04:33:03 ubuntu sqlservr[3221]: [146B blob data]
 7月 26 04:33:03 ubuntu sqlservr[3221]: [154B blob data]
 7月 26 04:33:03 ubuntu sqlservr[3221]: [121B blob data]
 7月 26 04:33:03 ubuntu sqlservr[3221]: [159B blob data]
```

Windows版のSQLServerよりインストールがお手軽じゃないか
早く正式リリースして欲しい
React 16でError Boundaryが導入された

## このスライドについて

* 弊社（株式会社チームスピリット）のフロントエンドランチネタとして用意したスライドです
* [ブログ](http://dackdive.hateblo.jp/entry/2017/07/29/100000) にはもうちょっと詳しく書きました

---

## この話

[![SS 2017-08-02 5.03.45.png](https://qiita-image-store.s3.amazonaws.com/0/36518/51a0ccc6-7a43-3f66-7b4d-e9cfbe11475c.png)](https://facebook.github.io/react/blog/2017/07/26/error-handling-in-react-16.html)

https://facebook.github.io/react/blog/2017/07/26/error-handling-in-react-16.html

---

## これまで

* コンポーネント内で発生したランタイムエラーをうまくハンドリングする方法が提供されていなかった
* エラーが発生すると React の内部状態（internal state）も壊れ、結果的によくわからないエラーがコンソールに表示される要因になっていた 
 
（※internal state については訳がおかしいかも）

> In the past, JavaScript errors inside components used to corrupt React’s internal state and cause it to emit cryptic errors on next renders.

---

## Error Boundary

---

```javascript
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  /********* これが新しく追加 ************/
  componentDidCatch(error, info) {
    // Display fallback UI
    this.setState({ hasError: true });
    // You can also log the error to an error reporting service
    logErrorToMyService(error, info);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children;
  }
}
```

---

通常のコンポーネントと同じように使う

```xml
<ErrorBoundary>
  <AddTodo />
  <VisibleTodoList />
  <FilterLinkList />
</ErrorBoundary>
```

---

## [Demo](https://codepen.io/gaearon/pen/wqvxGa)

---

## Error Boundary

* 子孫コンポーネントツリーで発生したエラーを catch するためのコンポーネント
* `componentDidCatch` というライフサイクルメソッドが追加され、子孫コンポーネントツリーで発生したエラーはそこでハンドリングできるように
* コンポーネントツリー内にいくつでも置ける
  * 独立して動作するUIパーツ単位で Boundary を設けたり

---

## `componentDidCatch(error, info)`

* `error`: Error オブジェクト
* `info`: `info.componentStack` で Component Stack Trace が取れる
    * コンポーネントのどこで発生したエラーか？が追いやすい
    
```
in BuggyCounter (created by App)
in ErrorBoundary (created by App)
in div (created by App)
in App
```

---


## Uncaught Error時の挙動の変更

* React 15 まではエラーが発生しても UI はそのまま残る（[Demo](https://codepen.io/zaki-yama/pen/RZWVpK)）
* React 16 以降、Uncaught Exception が発生すると **コンポーネントツリーが全部 unmount される（非表示になる）**（[Demo](https://codepen.io/zaki-yama/pen/dzYWNM)）

---

## 所感

* Error Boundary の導入によってエラーハンドリング（特に外部へのエラーログ送信など）はやりやすくなった
* Uncaught Error 時の仕様変更があるので、最低限「ルートに1個 Boundary を追加する」ぐらいはやっておかないといけなさそう
CLIP STUDIOプラグインで座標型のパラメータを受け取る

CLIP STUDIO PAINT EX用プラグイン開発で、座標型のパラメータを使う際のポイントを書く。

### 座標型のパラメータとは
SDKのサンプルは色相・彩度・明度の整数型のパラメータを受け取っている。
同じ要領で座標型のパラメータを受け取るようにすると、ダイアログボックスには何も表示されない。代わりに画面上に赤いバツ印が表示され、これをドラッグして移動することにより2次元の座標の値を変化させられる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60268/9052c3a4-f654-0592-cb01-89f0d191f7e0.png)

### 使用方法
追加するには、プロパティサービスのaddItemProcの第3引数にkTriglavPlugInPropertyValueTypePointを渡す。
```例 TriglavPluginCall()内
(*pPropertyService).addItemProc(propertyObject, kItemKey, kTriglavPlugInPropertyValueTypePoint, kTriglavPlugInPropertyValueKindDefault, kTriglavPlugInPropertyInputKindDefault, caption, 'p');
```

値はTriglavPlugInPoint型になる。値を読み込むにはプロパティサービス2のgetPointValueProc()を使う。
```例 TriglavPlugInFilterPropertyCallBack()内
TriglavPlugInPoint	po;
pFilterInfo->pPropertyService2->getPointValueProc(&po, propertyObject, itemKey);
```

### TIPS
  - プロパティサービス**2**を使う必要がある。
    - ドキュメントにある座標型のプロパティに関する関数は、プロパティサービスではなく、プロパティサービス**2**を使って行うようになっている。サンプルのHSVフィルタではプロパティサービス2を使用していないので、プロパティサービス**2**を初期化する処理を追加する。

```
TriglavPlugInPropertyService2*	pPropertyService2 = (*pluginServer).serviceSuite.propertyService2;
```

  - デフォルトでは左上端にバツ印が表示されるので見逃しやすい。プロパティサービス2のsetPointDefaultValueKindProc()で最初の場所を指定できる。下のようにすると最初に中央に表示されるのでおすすめ。

```
(*pPropertyService2).setPointDefaultValueKindProc(propertyObject, kItemKey, kTriglavPlugInPropertyPointDefaultValueKindCanvasCenter);
```
  - 整数型のパラメータ2個で座標を指定させるのは避けたほうがよいと思う（恐らく最大値・最小値をキャンバスサイズに応じて設定する方法がないので）
面接で絶対に押さえておきたいアルゴリズム問題(7) ~ ListNode(連結リスト)~

## 問題：Merge Two Sorted ListNodes　（二つの連結リストを繋げる）

タイトルの通りですが、二つの連結リストを昇順に繋げてください。
 - 連結リストの中のData(この場合Int)は順番に入ってることにしましょう。
 - ListNodeのリンクはどこまで続いているかわからないです。

連結リストってなに！？という人がいれば、[こちら](http://qiita.com/Saayaman/items/657689d6f2cc99048dca)を読んでください。

ListNodeのクラスはこちらを使ってください。

```
public class ListNode {
   public var val: Int
        public var next: ListNode?
        public init(_ val: Int) {
        self.val = val
        self.next = nil
        }
}
```

メソッド：

```
func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {

 //ここにコードを書く
}
```

## 実行例：

```
// List1
var node0 = ListNode(11)
var node1 = ListNode(10)
node1.next = node0
var node2 = ListNode(4)
node2.next = node1
var node3 = ListNode(1)
node3.next = node2

// List2
var nodeA = ListNode(9)
var nodeB = ListNode(3)
nodeB.next = nodeA
var nodeC = ListNode(2)
nodeC.next = nodeB

//実行メソッド：それぞれの頭のListNodeを渡しています。
var merged = mergeTwoLists(node3, nodeC)

//merged が繋がったNodeListです。それぞれHeadからTailまでの値をプリントしています。
while merged?.val != nil{
    print(merged?.val ?? 0)
    merged = merged?.next
}
```

実行結果

```
1
2
3
4
9
10
11
Program ended with exit code: 0
```


## ヒント：
それぞれのListNodeの値の大きさを比較して、それによりどっちのListNodeをリンクさせるか判定させる。


## 解答：

```
func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
    let dummy = ListNode(0)
    var node = dummy
    
    
    var l1 = l1
    var l2 = l2
    
    while l1 != nil && l2 != nil{
        if l1!.val < l2!.val {
            node.next = l1
            l1 = l1!.next
        } else{
            node.next = l2
            l2 = l2!.next
        }
        node = node.next!
    }
    
    node.next = l1 ?? l2
    return dummy.next
    
}

```

### メモ / ポイント
        
自分の回答ではなく、この方の回答を見ました。
https://github.com/soapyigu/LeetCode_Swift/blob/master/LinkedList/MergeTwoSortedLists.swift
[Swift] 連結リスト(ListNode)

## ListNode(連結リスト)ってなに？

**連結リスト**とは、データ構造の一種であるリストの中で、自分の次、および、前の要素を示す情報**（リンク情報）**を持つことで、要素を連結（リンク）させたリストのことである。

リストは、データの要素を順番に並べて扱うデータ構造のことである。
![Screen Shot 2017-08-01 at 11.26.54 AM.png](https://qiita-image-store.s3.amazonaws.com/0/158705/35d36c2b-2bd7-39e2-58e0-bc12513ced28.png)

### デメリット
- リンクを辿らないと各々の要素にアクセスができない！
- リンクのためのメモリを余分に持つ必要がある。

### メリット
- データの個数がダイナミックに増やせる
- データの追加や削除が頻繁に発生する場合は便利


### SwiftでListNodeクラスを書くとこんな感じ
ListNodeというクラスはないので、自分で作ります。

```
public class ListNode {
   public var val: Int
        public var next: ListNode?
        public init(_ val: Int) {
        self.val = val
        self.next = nil
        }
}

```
ListNodeクラスの中に、別なListNodeクラスが入ってます。これがリンクです。

使用例はこちらに載せました〜
http://qiita.com/Saayaman/items/63edacc424a97540f3d4
Lua で、プログラムから変数を作る方法

# この文書の目的
Lua で遊んでいると、プログラムにて変数を**「作る」**必要性に出くわす場合があります。この文書では、Lua のプログラムを用いて、グローバル変数を作る（宣言する、もしくは、定義する）方法を説明します。

英文を読むことに抵抗のない人は、Stackoverflow の記事 [How do I make a dynamic variable name in Lua?](https://stackoverflow.com/questions/5061755/how-do-i-make-a-dynamic-variable-name-in-lua) を見ると良いかもしれません（というか、そこに全て書いてあります）。以前、私が調べていたときには、日本語で書かれた情報を見つけることができなかったので、ここにまとめた次第です。

# 動作確認した Lua のバージョン
Lua-5.3.4。_G （＝大域環境を保持するグローバル変数）が備わっているバージョンであれば、多分、使えると思います。

# しくみ
グローバル変数は _G に格納されているフィールドです。そのため、_G["PI"]=3.141592 を実行すれば、3.141592 という値を持つグローバル変数 PI が定義されます（実際には、_G["PI"]=4*math.atan(1) としたほうが良いかもしれない）。

```lua:しくみの確認.txt
Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
> PI
nil
> _G["PI"]=3.141592
> PI
3.141592
> 
```
# コードの例
Office VBA におけるキーコード定数の一部 vbKeyA から vbKeyZ までを、プログラムにより定義してみます。これらの値は、vbKeyA には文字 A の ASCII コードである 65 が、vbKeyB には文字 B の ASCII コード 66 が格納されているといった具合です（参考：[MSDN Keycode 定数](https://msdn.microsoft.com/ja-jp/library/office/gg278677.aspx)）。

```lua:define_vba_keycodes.lua
do
    local kCodeA=string.byte("A")
    local kCodeZ=string.byte("Z")
    for i=kCodeA,kCodeZ do
        _G["vbKey"..string.char(i)]=i
    end
end
```

このスクリプトを実行し、それぞれの仮想キーコードが格納されている変数の値を確認すると…

```lua:vk確認.txt
> vbKeyA
65
> vbKeyB
66
> vbKeyZ
90
```

それぞれの変数が定義されていることを確認できます。

# まとめ
本文書では、グローバル変数がテーブル _G のフィールドであることを紹介し、その応用としてプログラムにて動的に変数を定義する方法を示しました。この仕組みを応用すると、様々なことができますが、それらについてはまた別の記事で説明したいと思います。
intellijでのauto importの設定

#intellijの場合

```
Settings...
```
```
Editor ＞ Code Style ＞ TypeScript
```

Punctuationの Use double quotes のdoubleをsingleにすることでauto importの際にパスの部分をシングルクォートに変更することができる

tslintの規約にダブルクォートだと引っかかる
毎回直すのが面倒な人向け
arp-scanでLANにつながっているデバイスのIPアドレスを調べる

先日、RaspberryPiを触っていた時に、LANに接続している内のIPアドレスを知る方法はないかと思っていろいろ調べてみた。すると、`arp-scan`というコマンドがあった。

```bash
$ arp -i en0 -a
? (192.168.11.1) at 0:24:a5:f:8f:ae on en0 ifscope [ethernet]
? (192.168.11.14) at 70:48:f:74:ce:b on en0 ifscope [ethernet]
? (192.168.11.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
? (224.0.0.251) at 1:0:5e:0:0:fb on en0 ifscope permanent [ethernet]
broadcasthost (255.255.255.255) at ff:ff:ff:ff:ff:ff on en0 ifscope [ethernet]
```

`arp`コマンドでもある程度は出るんだけど、`arp-scan`コマンドを使うとよりわかりやすい情報を見ることができる。

Macでは`brew install arp-scan`で簡単にインストールできる。

インストールしたらコマンドを実行すると、次のような結果が出力される。

```bash
$ sudo arp-scan -l
Password:
Interface: en0, datalink type: EN10MB (Ethernet)
Starting arp-scan 1.9 with 256 hosts (http://www.nta-monitor.com/tools/arp-scan/)
192.168.11.1	00:24:a5:0f:8f:ae	Buffalo Inc.
192.168.11.7	00:17:88:1c:ac:62	Philips Lighting BV
192.168.11.15	b8:27:eb:07:66:12	Raspberry Pi Foundation
192.168.11.8	00:25:00:4d:f8:90	Apple, Inc
192.168.11.10	84:d6:d0:a1:c3:f9	(Unknown)
192.168.11.9	f0:f6:1c:d0:0c:65	(Unknown)
```

これを見ると、RaspberryPiのIPアドレスは`192.168.11.15`であることがわかる。便利。
MacでVagrant上にdocker環境を構築する



Docker for Macでなく、Mac内にVM（Vagrant使用）を作成して、その中にdocker環境を作成します。


#環境
MacOS 10.12.6 (Sierra)

#下準備
##homebrewインストール
https://brew.sh/index_ja.html
ここに書いてあるワンライナーでインストール
（たまに変わるらしいので本家サイトで確認する）


##caskインストール
```
brew tap caskroom/cask

#インストールアプリのバージョンを指定できるようにversionもインストール
brew tap caskroom/versions

#例えばJavaインストールするときに
$ brew cask search java
==> Exact Match
java ✔
==> Partial Matches
charles-applejava                   java-beta                           java6                               netbeans-java-ee                    yourkit-java-profiler
eclipse-java                        java-jdk-javadoc                    java9-beta                          netbeans-java-se
#こんな感じにバージョン違いを探してインストールできる
```


#caskでVirtualBox、Vagrantのインストール

```
#VirtualBoxのインストール
brew cask install virtualbox

#Vagrantインストール
brew cask install vagrant
```

#VagrantにCentOSをセットアップ

```
#Vagrant用ディレクトリを作成
mkdir [任意のPATH]/vagrant
cd [任意のPATH]/vagrant

#CentOS用ディレクトリを作成
mkdir CentOS73
cd CentOS73

#イメージを取得しカレントディレクトリにセットアップ
vagrant init bento/centos-7.3
#Vagrantfileが作成される

#Vagrant起動
vagrant up
#初回はインストールがはしるので時間がかかる

#Vagrantに入る
vagrant ssh

#OS,バージョンを確認
cat /etc/redhat-release
```
###UP時に"Vagrant was unable to mount VirtualBox shared folders."が表示される場合
参照：
[Vagrantで共有フォルダのマウントに失敗するときの対処方法](http://qiita.com/ozawan/items/9751dcfd9bd4c470cd82)

```
vagrant plugin install vagrant-vbguest
```



#CentOSにDockerをインストール

注）下記の手順は手動でのインストールで一度破棄されると再度実行する必要があります。
毎回自動でインストールするにはこちら[[Vagrant up時に自動でDockerをインストールする](http://qiita.com/Manjiii/items/d09233728b5a5d68f67b)]
を参照して下さい。

```
#まずはyum自体をアップデート
sudo yum update

#yumでdockerインストール
sudo yum install docker

#docker起動
sudo systemctl start docker

#dockerの起動確認
systemctl status docker

#OS起動時に自動的にスタートするようにしておく
sudo systemctl enable docker
```


#dockerコマンドをroot以外でも実行できるようにする
参照：
[CentOS7でsudoなしでdockerを利用するちょっとした工夫](http://qiita.com/tubone/items/9c1b3d807197b7162fd9)

```
sudo gpasswd -a $USER dockerroot
sudo chown root:dockerroot /var/run/docker.sock
```
#dockerが動いていることを確認
```
#バージョンを確認
docker version
```
#dockerをvagrant up時に自動的にインストールして実行されるようにする
上記手順でも作業ができますが、VMの破棄などをした場合は再度実行する必要があります。
自動的にインストールする設定は下記参照
[VagrantでVM起動に自動でDockerをインストールする](http://qiita.com/Manjiii/items/d09233728b5a5d68f67b)
【Ruby】Daru + gnuplot で散布図を描く

# Irisのデータをプロットする
有名なアヤメのデータセットを用いて散布図を描いてみます。
まずCSVファイルを用意します。
[iris.csv](https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv)

# 使用するライブラリ
* numo-gnuplot

##Jupyter Notebookを使うとき
[IRuby : Ruby kernel for Jupyter/IPython Notebook](https://github.com/SciRuby/iruby)
Numo.gnuplot のかわりに Numo.noteplotメソッドを使います。

```ruby
Numo.noteplot do
  plot "sin(x)"
end
```

## 2D散布図
```ruby
require 'daru'
require 'numo/gnuplot'

df = Daru::DataFrame.from_csv 'iris.csv'

setosa     = df.where(df.Name.eq 'Iris-setosa')
versicolor = df.where(df.Name.eq 'Iris-versicolor')
virginica  = df.where(df.Name.eq 'Iris-virginica')

Numo.gnuplot do
  set :title,  'The Iris DataSet', :font, 'Times,16'
  set :xlabel, 'sepal length'
  set :ylabel, 'sepal width'
  set :zlabel, 'petal width'
  opts = { w: :points, pt: 6, lw: 3 }
  plot [setosa.SepalLength, setosa.SepalWidth, opts, t: 'setosa'],
       [versicolor.SepalLength, versicolor.SepalWidth, opts, t: 'versicolor'],
       [virginica.SepalLength,  virginica.SepalWidth, opts, t: 'virginica']
end

gets # 終了まち
```

![iris2d.png](https://qiita-image-store.s3.amazonaws.com/0/144608/7f601c69-1db9-580c-f004-ea5d26b546ea.png)

Jupyter Notebook での表示
![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/144608/e683d45a-532d-08cb-0e8a-14b4e8bed7c8.png)

## 3D散布図
```ruby
require 'daru'
require 'numo/gnuplot'

df = Daru::DataFrame.from_csv 'iris.csv'

setosa     = df.where(df.Name.eq 'Iris-setosa')
versicolor = df.where(df.Name.eq 'Iris-versicolor')
virginica  = df.where(df.Name.eq 'Iris-virginica')

Numo.gnuplot do
  set :title,  'The Iris DataSet', :font, 'Times,16'
  set :xlabel, 'sepal length'
  set :ylabel, 'sepal width'
  set :zlabel, 'petal width'
  opts = { w: :points, pt: 6, lw: 3 }
  splot [setosa.SepalLength, setosa.SepalWidth, setosa.PetalWidth,
         opts, t: 'setosa'],
        [versicolor.SepalLength, versicolor.SepalWidth, versicolor.PetalWidth,
         opts, t: 'versicolor'],
        [virginica.SepalLength, virginica.SepalWidth, virginica.PetalWidth,
         opts, t: 'virginica']
end

gets # 終了まち
```
![iris.gif](https://qiita-image-store.s3.amazonaws.com/0/144608/245992e6-5a97-a869-58b2-190f8706c19c.gif)

## おまけ gif anime の出力
Gnuplotのfor文ではなく、Rubyのループを使っています。とっても簡単です。

```ruby
require 'daru'
require 'numo/gnuplot'

df = Daru::DataFrame.from_csv 'iris.csv'

setosa     = df.where(df.Name.eq 'Iris-setosa')
versicolor = df.where(df.Name.eq 'Iris-versicolor')
virginica  = df.where(df.Name.eq 'Iris-virginica')

Numo.gnuplot do
  set :title,  'The Iris DataSet', :font, 'Times,16'
  set :xlabel, 'sepal length'
  set :ylabel, 'sepal width'
  set :zlabel, 'petal width'
  set :term, 'gif animate delay 10'
  set output: "iris.gif"
  opts = { w: :points, pt: 6, lw: 3 }
  60.times do |i|
    set view: "60,#{i*3},1,1"
    splot [setosa.SepalLength, setosa.SepalWidth, setosa.PetalWidth,
           opts, t: 'setosa'],
           [versicolor.SepalLength, versicolor.SepalWidth, versicolor.PetalWidth,
            opts, t: 'versicolor'],
            [virginica.SepalLength, virginica.SepalWidth, virginica.PetalWidth,
             opts, t: 'virginica']
  end
end
```
iPhoneからのファイルアップロードの罠

アップロードフォームをダイジェスト認証で保護していると、アップロードできません。
基本認証であればOKです。iOS 10.3.3で確認。

「送信」ボタンを押すとアップロードが始まったかのように見えますが、ウェブサーバにアクセスがいきません。
当然、アップロードは終わりません。
macOS版のDiscordにBetterDiscordを導入する方法

BetterDiscordのサイトにはmacOS向けのダウンロードボタンがありますが、何故か押せません。

そこで、BetterDiscordのGitHubリポジトリのReleasesを開き、OSXという文字列が含まれている名前のZIPファイルをダウンロードし、その中のinstall.shをターミナルにドラッグ・アンド・ドロップし、エンターキーを押せば、インストールができるはずです。
『ゼロから作る Deep Learning』の代わりになりそうな情報



同僚『ゼロから作る Deep Learning』の読書会をやろうと思います。
本を持っていない方のために、代わりになりそうな情報をメモしていこうと思います。


## 『ゼロから作る Deep Learning』の特徴
https://www.oreilly.co.jp/books/9784873117584/

* Python 3によってゼロからディープラーニングを作ることで、ディープラーニングの原理を楽しく学べる

以下、書評
http://s0sem0y.hatenablog.com/entry/2016/11/17/225635
http://tnakamura.hatenablog.com/entry/2016/12/01/deep-learning-from-scratch

* 「機械学習 名古屋 分科会」という勉強会で使われています。
https://machine-learning.connpass.com/

## 環境構築

### Anaconda

### Jupyter Notebook

[Jupyter Notebook Online（インストール不要。サーバ上で実行可能）](https://try.jupyter.org/)
[Jupyter Notebook を使ってみよう](http://pythondatascience.plavox.info/python%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83/jupyter-notebook%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)
[Jupyterのショートカットキー一覧を調べてみた](http://qiita.com/masafumi_miya/items/6524dbd227705351a00c)
[Jupyter事始め](http://qiita.com/taka4sato/items/2c3397ff34c440044978)


## 1章 Python入門

以下、参考サイト
[機械学習 名古屋 分科会 #1](https://machine-learning.connpass.com/event/54539/)
http://miyamo765.hatenadiary.jp/entry/2017/04/22/

やること。

* Python インタプリタ
* Pythonスクリプトファイル
* NumPy
* Matplotlib


## 2章 パーセプトロン

以下、参考サイト
https://machine-learning.connpass.com/event/55649/
http://miyamo765.hatenadiary.jp/entry/2017/04/26/
時間経過により何かするためのJavaScriptコード

任意のページ滞在時間でイベントを起こすためのJavaScriptコード

指定のページ滞在時間が経過する度に`intent()`が実行され、[カスタムイベント](http://qiita.com/shouchida/items/de326cb608027b46f58c)`elpsTime`が発火する。
このコードは複数の滞在時間を設定しても同時に走るタイマー数を1つに抑えることにより、ページ負荷を軽減している。

```js:
;(function($) {
    var timerSec = [1, 3, 5, 8, 10, 30, 60, 61, 75];   // ここで目的の滞在時間を秒単位で設定

    var timerId = 0;
    var stayOverSec = 0;
    var now, start = new Date();

	var intent = function(sec){
        $(window).trigger('elpsTime', sec);
	};

    var timer = function(){
        clearInterval(timerId);
        stayOverSec = timerSec.shift();
		intent(stayOverSec);
        if(timerSec.length){
            now = new Date();
            timerId = setInterval(timer, timerSec[0]*1000 - (now - start));
        }
    };


    timerSec.sort(function(a,b){return a - b;});
    timerId = setInterval(timer, timerSec[0] * 1000);
})(jQuery);
```

以下のようなコードでカスタムイベント`elpsTime`を捕捉できる。

```js:
$(window).on('elpsTime',function(){
    var toHms = function(rawSec){
        var hms= '';
        var h = rawSec / 3600 | 0;
        var m = rawSec % 3600 / 60 | 0;
        var s = rawSec % 60;
        if(h){ hms = h + 'h';}
        if(m){ hms += m + 'm';}
        if(s){ hms += s + 's';}
        return hms;
    };
    console.log(arguments[0].type + ': ' + toHms(arguments[1]));
});
```

**実行結果**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/41265e0c-3d75-39a5-bbe0-d71b32365e86.png)

**完**
Carthage updateとCarthage bootstrapの違い

#CarthageでLibraryを管理する
   1.導入
                                                             
    brew install carthage
   2.Cartfileを作成と編集
                                                             
    touch Cartfile
    vim Cartfile
   3.実行
                                                             
    carthage update --platform iOS　
platformを指定するとiOSだけBuildされる。指定しないと、OSXとwatchOSも全部Buildされる。
実行したあと以下のfilesなど生成される。
  
- Cartfile.resolved
- Carthage/Build
- Carthage/Checkouts

 4.プロジェクトにframworkを追加
　xcodeprojのLinked Frameworks and Librariesのところで追加すれば良い。

#Carthage updateとCarthage bootstrapの違い
update    ->        Update and rebuild the project's dependencies
bootstrap  ->     Check out and build the project's dependencies


updateはCartfileを読んで、libraryのversion情報などCartfile.resolvedに書き込みます。
bootstrapはCartfile.resolvedを読んで、Cartfile.resolvedで指定してるversionを使う。って感じかなぁ。
個人的には新しいversionへ更新したい時はupdate、
projectで使ってるlibrariesをchecked outしたいだけなら、bootstrapを使う。
　　
#そのほか
1.指定libraryだけをupdateする
                                                             
    carthage update <Lライブラリ名>　

 ・・基本の使い方しか書いてませんが、もっと勉強できたら更新するかも。
gem開発を楽にするためのGemfile設定

ローカルで新しくgemを開発したい。

そんなとき、gemを使用する側のアプリからの確認を効率的にするための設定を書く。

## Gemfile

まず、アプリ側のGemfileにはgemのgithubリポジトリを指定する。branch名を忘れずに。

```ruby:Gemfile

gem 'GEM_NAME', github: git@github.com:repository/GEM_NAME.git, branch: 'master'
```

これだと、ローカルでgemを更新しても、すぐにアプリ側で確認できない。gemの更新後githubリポジトリへのプッシュしてアプリ側ではbundle updateしてやっと確認、という無駄なステップを踏むことになってしまう。

そこで、アプリ側のカレントディレクトリで以下設定をする。

```sh:sh
$ bundle config local.GEM_NAME /path/to/local/git/repository
```

アプリの使用するgemをgithubではなくローカルパスのディレクトリから参照してくれる。
これでローカルのgemを更新すれば、アプリ側でもすぐ確認できるようになる。

## 注意点
Gemfileのgithub: は、プライベートリポジトリの場合はgit@~のパターンを使用する。でないとステージング環境などでgit cloneが成功しないことがある。

また、branch:にブランチ名を指定し、ローカルのgemのブランチもそれに合わせないとうまくいかないのでご注意を。

## 参考
[Bundler: The best way to manage a Ruby application's gems](http://bundler.io/git.html)
Web Audio APIでカスタムAudioNodeを作る方法

Web Audio APIのノードをconnectで繋いで音を作る方法はわかりやすいのですが、ノードの種類自体は多くなく、複数のノードを組み合わせて一つのエフェクターなどを作っていく感じのようです。
そのため、既存ノードを組み合わせてエフェクターなどの単位で新しいAudioNodeを作ってconnectできるようにすれば便利なんじゃないかと思いました。

とりあえず、以下のようにAudioNodeを継承できるか試してみましたが、`Uncaught TypeError: Illegal constructor`というエラーがでてこれは無理そうです。

```js
class MyAudioNode extends AudioNode {}
const myAudioNode = new MyAudioNode();
```

AudioNodeを継承したサブクラスならと思って以下も試してみましたが、これも`Uncaught TypeError: Failed to construct 'OscillatorNode': 1 argument required, but only 0 present.`というエラーが出て駄目そうです。

```js
class MyOscillatorNode extends OscillatorNode {}
const myOscillator = new MyOscillatorNode();
```

いろいろ調べた結果、直接AudioNodeを継承することはできないようです。
そのかわりに、以下のように入出力をGainNodeでラップして、内部で音を作ったり、加工したりしてあげることでほぼ既存のAudioNodeと同じように振る舞う自作ノードを作ることができます。
この方法だと他のノードを接続するときに、`squareOscNode.connect(highpassFilter.in)`というように自作ノードのinプロパティに接続しないといけないことが既存のノードに接続するときとは異なります。

```js

class BaseCustomNode {
  constructor(context) {
    this._context = context;
    this.in = context.createGain();
    this._out = context.createGain();
  }

  connect(audioNode) {
    this._out.connect(audioNode);
  }
}

class SquareOscillatorNode extends BaseCustomNode {
  constructor(context) {
    super(context);
    this._osc = context.createOscillator();
    this._osc.type = 'square';
    this._osc.connect(this._out);
  }

  start(when) {
    this._osc.start(when);
  }

  stop(when) {
    this._osc.stop(when);
  }

  get frequency() {
    return this._osc.frequency;
  }
}

class HighpassFilter extends BaseCustomNode {
  constructor(context) {
    super(context);
    this._filter = context.createBiquadFilter();
    this._filter.type = 'highpass';
    this.in.connect(this._filter);
    this._filter.connect(this._out);
  }

  get frequency() {
    return this._filter.frequency;
  }
}

const context = new AudioContext(),
      squareOscNode = new SquareOscillatorNode(context),
      highpassFilter = new HighpassFilter(context);

squareOscNode.frequency.value = 880;
highpassFilter.frequency.value = 440;
squareOscNode.connect(highpassFilter.in); // 自作ノードに接続するときだけ、inプロパティに接続する
highpassFilter.connect(context.destination);

squareOscNode.start();
```

### 参考

* [Case\-study: JAM with Chrome \- How we made the audio rock \- HTML5 Rocks](https://www.html5rocks.com/en/tutorials/casestudies/jamwithchrome-audio/)
【JavaScript】文字列の配列で正規表現にマッチするものだけを取り出す方法

[JavaScript の this を理解する多分一番分かりやすい説明](http://qiita.com/takkyun/items/c6e2f2cf25327299cf03)という記事を読んで、`bind`メソッド (`Function.prototype.bind`[^1])をビルトイン関数やビルトインメソッドと組み合わせて面白そうな例を作れないか考えてみたところ、`RegExp.prototype.test`[^2]と`Array.prototype.filter`[^3]と組み合わせ、文字列の配列で正規表現にマッチするものだけを取り出す例を思いついたので紹介します。

(2017/08/15追記)
"`bind`メソッドは要らなかった" を追記しました

# サンプル
文字列の配列から郵便番号の書式に合うものだけを取り出します

```JavaScript
['123-413','213-3123','213-4212','4333-4343'].filter(RegExp.prototype.test.bind(/^[0-9]{3}-[0-9]{4}$/))
```

実行結果は以下の通りです

```js:Node.js
> ['123-413','213-3123','213-4212','4333-4343'].filter(RegExp.prototype.test.bind(/^[0-9]{3}-[0-9]{4}$/))
[ '213-3123', '213-4212' ]
```

`RegExp.prototype.test`は`/./.test`でも呼び出せるので、もう少しシンプルに書くこともできます

```JavaScript
['123-413','213-3123','213-4212','4333-4343'].filter(/./.test.bind(/^[0-9]{3}-[0-9]{4}$/))
```

`bind`メソッドで`RegExp.prototype.test`の`this`を`/^[0-9]{3}-[0-9]{4}$/`に強制しているので、`/./`は`test`メソッドを呼び出すためだけにある正規表現リテラルということになります。
当初は`Array.prototype.slice`が`[].slice`で呼び出せるように、`//.test`でも大丈夫だろうと思っていましたが、これはコメントアウトになってしまうので`/./.test`のように何か1文字はスラッシュの間に必要となるようです。

実行結果は以下の通りです

```js:Node.js
> ['123-413','213-3123','213-4212','4333-4343'].filter(/./.test.bind(/^[0-9]{3}-[0-9]{4}$/))
[ '213-3123', '213-4212' ]
```

ECMAScript 6以上の仕様は使っていないので、Internet Explorer 11でも動作しました。
ブラウザ上のURLバーに直接打ち込むと、実行できます。

```js
javascript:alert(['123-413','213-3123','213-4212','4333-4343'].filter(/./.test.bind(/^[0-9]{3}-[0-9]{4}$/)).join());
```

実行結果は以下の通りです

![ie11_filter_regexp.png](https://qiita-image-store.s3.amazonaws.com/0/137045/40dfb7ae-303f-bdd3-d94c-e649cf037722.png)

# `bind`メソッドは要らなかった
`Array.prototype.filter`[^3]の第2引数(省略可能)で、第1引数で指定されたコールバック関数のthisを束縛できるようです。
よって、`bind`メソッドを使わずに標題のことを実現できました。

```JavaScript
['123-413','213-3123','213-4212','4333-4343'].filter(RegExp.prototype.test,/^[0-9]{3}-[0-9]{4}$/)
```

`bind`メソッドを使うよりもシンプルに書け、可読性もこちらの方が良いかと思います。

実行結果は以下の通りです

```js:Node.js
> ['123-413','213-3123','213-4212','4333-4343'].filter(RegExp.prototype.test,/^[0-9]{3}-[0-9]{4}$/)
[ '213-3123', '213-4212' ]
```

# 参考文献
[^1]: [Function.prototype.bind() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)
[^2]: [RegExp.prototype.test() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test)
[^3]: [Array.prototype.filter() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
org-modeでclock-inしているタスクをMacのメニューバーに表示する

普段のタスク管理にはorg-modeを使用しています。
org-modeには素晴らしいタスクの時間計測機能がついているのですが、
タスク自体はEmacs以外で行うことが多いのもあり
clock-inするのを忘れてタスクに取り掛かってしまったり、
逆にclock-outするのを忘れて次のタスクに取り掛かってしまうことがよくあります。

そこで現在clock-inしているタスクが何か一目でわかるように
[BitBar](https://github.com/matryer/bitbar) というアプリケーションを使って
メニューバーに現在のタスクと経過時間を表示させてみました。

<img width="519" alt="スクリーンショット 2017-08-01 23.51.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/55219/ff6eac41-d51e-1c04-f81c-f61b3c86c266.png">


## BitBar のインストール

BitBarとはMacのメニューバーに任意の情報を表示することができるアプリケーションです。

brew cask を用いてインストールすることができます。

```
$ brew cask install bitbar
```

インストールが完了し、アプリを起動したらメニューバーの `BitBar` をクリックし、
`Change Plugin Folder` で任意のディレクトリを指定します

## BitBar プラグインの追加

先程指定したディレクトリに以下のプラグインを追加します

BitBarのプラグイン名の命名規則は以下のようになっています

```
{任意の名前}.{更新間隔}.{拡張子}
```

今回は5秒間隔で実行するように設定してみました

```sh:org_clockin_task_bitbar_plugin.5s.sh
#!/bin/bash

if [ -e ~/.clockin_task ]; then
  task_name=`cat ~/.clockin_task | cut -f 2`
  start_time=`cat ~/.clockin_task | cut -f 1`

  elapsed=$(expr `date +%s` - $start_time)

  h=$(expr $elapsed / 3600)
  m=$(expr $elapsed % 3600 / 60)

  disph=`printf %02d $h`
  dispm=`printf %02d $m`

  echo ":hourglass_flowing_sand: [$disph:$dispm] $task_name"

else
  echo ":coffee: Break Time"
fi
```

後ほど記述しますがorg-modeでclockinしたタスクの開始時間(unixtime)とタスク名を
`~/.clockin_task` に出力するようにしています


## org-clock-hookの設定

clock-inした際にタスク名とタスクの開始時間を `~/.clockin_task`に出力し、
clock-outまたはclock-cancelした際に`~/.clockin_task`を削除するように設定します

```el
  (defvar clockin-task-file "~/.clockin_task")
  (defun write-clockin-task-file ()
    (with-temp-buffer
      (insert (concat (format-time-string "%s" org-clock-start-time)
                      "\t"
                      org-clock-heading))
      (write-region (point-min) (point-max) clockin-task-file))
    )

  (defun delete-clockin-task-file ()
    (delete-file clockin-task-file))

  (add-hook 'org-clock-in-hook 'write-clockin-task-file)
  (add-hook 'org-clock-out-hook 'delete-clockin-task-file)
  (add-hook 'org-clock-cancel-hook 'delete-clockin-task-file)

```

適当な関数を作成し、`org-clock-*-hook` に追加しています

## 今後の課題とか

タスクをクリックしたら本日やる予定のタスクの一覧とか並べられたらいいなーとか思ったり
消すに消せない自分アプリをaws-serverless-expressでserverlessにする


ある程度コードを書くというのをやっていると、軽率な気持ちで作ったのになぜか自分以外が使うようになって、消すに消せなくなったアプリとかあるのではないかと思います。それをaws-serverless-expressに書き換えて（ほぼ）タダで運用しようと移行した結果を書いておきます。

ソースはここです。
https://github.com/celeron1ghz/gomitter-nodejs



## 1. NodeJSに移植
一番大事な箇所かもしれませんがあまり本質的ではないので要点を書きます。

### memcachedとmysqlをDynamoDBに置き換える
多分一番の障壁はここではないかと思います。

色々と調べましたが、無尽蔵にスケールが可能なLambdaに対し、mysql(RDS)はコネクション数で限界がきます。まぁ自分アプリなのでコネクションが限界まで行くとは思えませんが、コネクションプールの問題はハマると面倒なので、ここは潔くNoSQLに書き換えます。

自分アプリなのでそんな規模が大きくないとは思いますが、そこは頑張りましょう。がんばルビィ。

memcached（というかsessionの保存先）は `connect-dynamodb` というモジュールがありますのでほぼ何も考えることなく設定を書くだけでいいと思います。



## 2. aws-serverless-expressを参考にセットアップ
[aws-serverless-express/example](https://github.com/awslabs/aws-serverless-express/tree/master/example) にチュートリアルがあるので従います。
細かい点は本家を読んでください。

 1. `git clone https://github.com/awslabs/aws-serverless-express.git`
 2. `example` ディレクトリから下記4つのファイルをコピってくる
   * api-gateway-event.json
   * cloudformation.yaml
   * lambda.js
   * simple-proxy-api.yaml
 3. `package.json` が既にあったらいい感じに `exmaple/package.json` の `scripts` と `config` の部分を移植する。なかったらそのまま持って来ればいい。
 4. `npm run config -- --account-id="<accountId>" --bucket-name="<bucketName>" [--region="<region>" --function-name="<functionName>"`
   * 自分の場合は引数指定が面倒だったので `credstash` から読み込むように書き換えました。でも `package.json` の `config` で参照している箇所があって書き換えられなかったのであんまり意味はなかったかも。ここは真似はしなくていいと思います。
 5. `npm install --save aws-serverless-express`
 6. `npm run package-deploy`
 7. ぃぇーーーーーーーーーーーぃ！

とゴールしたいところですがもうちょっとやることがあります。

さすがに独自ドメインで運用している（と思われる）自分アプリをいきなりAWSな感じのアドレスにはできないと思うのでドメイン設定です。



## ドメイン設定
API Gatewayで独自ドメインを使うにはHTTPSが必須なので、証明書を取得してから各種設定をしていきます。


独自ドメインはRoute53で設定済みのつもりで書いてます。
ここでは `moge.com` にて `gomi.moge.com` に対して設定する場合の例。


 * Certificate Manager
   * `*.moge.com` で証明書を取る
   * メールのリンクをクリックし、リンク先にある `Approve` ボタンを押して認証
 * API Gateway
   * カスタムドメインを作成する
     * ドメイン名 : `gomi.moge.com`
     * ACM証明書 : `*.moge.com`
     * パス : 空白
     * 送信先 : `GomitterCloudNative`
     * ステージ : `prod`
   * 作成後40分くらい待つ
   * 表示される **ディストリビューションドメイン名** をコピー
     * `abcdefg.cloudfront.net` みたいな文字列
 * Route53
   * `moge.com` のHostedZoneを開く
   * `moge.com` に以下のレコードを作成する
     * Name : `gomi.moge.com`
     * Type : A
     * Alias : `Yes`
     * Alias Target : **ディストリビューションドメイン名** を入力
 * API Gatewayで発行されたURLと独自ドメインのURLの内容が同じかを確認する
   * https://abcfed.execute-api.ap-northeast-1.amazonaws.com/prod/ （API Gatewayが発行したURLの例）
   * https://gomi.moge.com （独自ドメインのURL）



## 感想とか
 * 思ったよりは簡単に動いた
 * 自分アプリはNodeJSに書き換えちゃおうかなと思う程度にはいい感じである
 * アクセスごとに時間計算されて行く様はおもしろい
 * Lambdaはほぼ一ヶ月のリソースがタダなので自分アプリの置き所としてはかなりよいと思う
 * DynamoDBも25RCU/25WCUまでタダなのでかなりよい
 * NodeJSの辛ささえ許容できれば全然有りな手段
 * とはいえほぼアクセスがない自分アプリ前提の話なので、ある程度の規模ならば普通にEC2+RDSのが良いと思う
 * Lambdaは早くver7対応してawait/async使わせて
rails チュートリアルをローカルでやるための環境をDockerで構築してみる

# 動機

rails チュートリアルをやろうとお思いチュートリアル通りにcloud9で進めていたのですがどうしてもcloud9の環境に慣れることができずローカルの環境を作りたいなと思いました。
ただしあんまりローカルの環境を色々入れて変えたくないという思いもあり dokcer で構築することにしました。

# docker環境の構築
自分の場合はmacですでに docker for mac が入っている状況でしたのでこの時点でdokcer環境は手に入っていました。まだ手に入れてない場合は、[こちら](https://www.docker.com/docker-mac)からダウンロードしてインストールします。

# railsコンテナの作成

## rubyのイメージの取得
rubyのイメージはすでにあるようでしたので、そのままイメージをダウンロードし利用することにしました。

```
docker pull ruby:2.3.0
```

落ちてきたら下記のコマンドで念のために確認。

```
docker images
```


その後に今回はイメージをrunしてコンテナ化します。

```
docker run -it -p ローカルのポート:3000 -v ローカル(ホスト側)の絶対パス:/var/www/ 上記で取得したdokerのイメージID  /bin/bash
```

いくつかオプションを指定しています。
-p を使いdockerを起動しているパソコンのポートとrailsがデフォルトで使うポートの3000を繋げます。これでhttp://localhost:ローカルのポート/ でブラウザからアクセスできます。
またソースの変更するのにいちいちコンテナに入るのは面倒だったので -v でこれまたローカルのパソコンとコンテナ側を特定のフォルダを指定して共有させます。

## railsを入れる前にnode.jsを入れる

railsを入れる前にまず取得してきたイメージのディストリビューションなんだっけということで確認します。

```
uname -a
```

GNU/Linux と出てきたのでdebian系だなとなります。
なのでyumでなくて下記を実行しレポジトリを最新にします。

```
apt-get update
```

さてこれからnode.jsを入れ込みます。
なぜこの作業をするかというと実はnode.js入れないでrailsを入れて立ち上げようとしたのですが下記のエラーが出てうまくいかなかったのです。

```
Gem Load Error is: Could not find a JavaScript runtime
```

node.jsをインストールします。

```
apt-get install -y nodejs npm
```

## railsを入れる

これでいよいよrailsをインストールします。

```
gem install rails -v 5.0.3
```

ここまで行ってうまくいけばあとはチュートリアル通りにいけるかなと、、、、。

## docker commit
念のためここまでの状況を残しておく場合は下記のコマンドを実行してコンテナをイメージ化しておきましょう。

```
docker ps 
docker commit コンテナid rails_tutorial
```

# 最後に
ここまででローカル環境でrailsチュートリアルをスムーズに進める準備が整ったかと思います。
自分も含めてみなさんrailsチュートリアル頑張って夏の終わりにはrailsある程度わかるようになりましょう！
RROR 1045 (28000): Access denied for user 'ROOT'@'localhost' (using password: NO)

#rails s しようとしたら以下のエラーが出た。

```
RROR 1045 (28000): Access denied for user 'ROOT'@'localhost' (using password: NO)
```

```
$ rails server
=> Booting Puma
=> Rails 5.0.4 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Exiting
Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)(Sequel::DatabaseConnectionError)
```



一旦サーバーを止め以下のコードを打ち込みます。

```
$ mysql.server stop
$ mysqld_safe --skip-grant-tables &
```

そしたら上手く言いました。


>http://www.aipacommander.com/entry/2014/05/26/152247
スクレイピングしようとしたら (Capybara::Poltergeist::StatusFailError)と言うエラーに見舞われた

```
Capybara::Poltergeist::StatusFailError
```
と言うエラーが出た。

以下のコードで試してみるもうまくいかない

```
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {
                    js_errors: false,
                    timeout: 1000,
                    phantomjs_options: [
                              '--load-images=no',
                              '--ignore-ssl-errors=yes',
                              '--ssl-protocol=any']})
end
```

以下のコードで試してみたら上手にいきました。

```
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, {inspector: true, js_errors: true, timeout: 1000, phantomjs_options: ['--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=any']})
end
```
Gitとは

# Gitとは

ソースコードのバージョンを分散型で管理するツール。ローカルで開発者各自もソースコードを持っているため、オフラインでも作業ができる。また１箇所のみに集中させて管理をすると同時にソースコードを変更した時に困ったりするが、各自でもソースコードを所有しているためぶつかっても致命傷にならない。

# Gitの流れ

* 作業ディレクトリ
    * ファイルを作ったり修正したりするところ
* ステージングエリア（インデックス）
    * ある程度のまとまりにするためにリポジトリにpushする前にためておく所
* リポジトリ
    * ローカル
        * 開発者各自の開発環境
    * リモート
        * 共有する場所

# ファイルをデプロイするまでの流れ

* ファイルやディレクトリをインデックスに登録
* インデックスされたファイルをローカルレポジトリにコミットする
* ローカルレポジトリからリモートレポジトリにpushする
* リモートレポジトリから本番環境へデプロイ

# gitで行う動作

* クローン
    * リモートレポジトリを複製すること
* プッシュ
    * ローカルからリモートへ変更履歴をアップすること
* プルリク（プルリクエスト）
    * 他の開発者にレビューしてもらうためにプルするのをリクエストする事。
* コミット
    * ファイルやディレクトリの変更を記録すること。
NODE_ENVの値を設定してなかったら、サーバが起動しなかった

NODE_ENVの値を設定しておかないとnodeのサーバ起動の際にエラーになるというお話。

# 事の発端
vue-cliでVue.jsのプロジェクトを作成。しかし、[ガイド](https://jp.vuejs.org/v2/guide/installation.html#CLI)に従って`npm run dev`を実行しても、下のようなエラーが出てサーバが起動しませんでした。

```
Module build failed: Error: "extract-text-webpack-plugin" loader is used without the corresponding plugin, refer to https://github.com/we
bpack/extract-text-webpack-plugin for the usage example
    at Object.module.exports.pitch (C:\xampp\htdocs\som\node_modules\extract-text-webpack-plugin\loader.js:25:9)
```

調べたところ、Vue.jsのひな型プロジェクトの中のdev-server.js(をはじめとするサーバスクリプト)では、NODE_ENVの値を使っていて、それが`development`じゃないとうまく動かないようです。

# NODE_ENVの値を調べる
現在の値が確認するために以下のコマンドを実行します。

```
node
>process.env.NODE_ENV
```

```
production
```
どうやらデフォルトだとproductionになっているようです。

# NODE_ENVを指定してコマンドを実行
コマンドの前に`cross-env 変数名=値`を指定するとその値にしてからコマンドを実行してくれます。
なので、scriptのdevを以下のように書き換えます。

```
"dev": "cross-env NODE_ENV=development node build/dev-server.js",
```

これでとりあえず、`npm run dev`で起動できるようになりました。

# 環境変数を変える
NODE_ENVの値のデフォルトは環境変数NODE_ENVの値を見に行くので、NODE_ENV=developmentで環境変数を指定しておきましょう。
基本的に、開発マシンであればdevelopmentにしておいたほうがよさそうです。
[Swift] MainThreadで処理を実行する

# MainThreadで実行されているか確認
`Thread.isMainThread`で確認する

```swift
if Thread.isMainThread {
    print("MainThreadです")
} else {
    print("MainThreadではない")
}
```

# MainThreadで実行する方法
GCDを利用

## Swift3.0
```swift
DispatchQueue.main.async {
    // メインスレッドで実行 UIの処理など
}
```

## Objective-C
```Objective-C
dispatch_async(dispatch_get_main_queue(), ^{
    // メインスレッドで実行 UIの処理など
});
```
Dialog内のViewを関連付ける

###はじめに
Dialog内のViewを関連付けて通常のView同様に使いたいときに毎回調べるの面倒なのでメモします。
やってることはDialog用のLayoutをViewに読み込んで表示させてるだけです。

####Layoutの読み込み
LayoutInflaterを使って読み込みます

```java
//Dialogレイアウト取得用のView
View inputView;

//Dialog用レイアウトの読み込み
LayoutInflater factory = LayoutInflater.from(this);
inputView = factory.inflate(R.layout.layout_dialog, null);
```

####関連付け
findViewByIdの前にさっきLayoutを読み込んだViewをつけてやるだけです。

```java
//関連付け
dialogText=(TextView)inputView.findViewById(R.id.dialog_text);
```

###Dialogに反映
.setViewで表示するViewをセットします。

```java
//Dialog生成
alertDlg = new AlertDialog.Builder(TagEditActivity.this)
                    .setView(inputView)
                    .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    // OK ボタンクリック処理
                                }
                            })
                    .create();
```

###おしまい！
これだけで関連付け終わりなので、どこからでもViewの中身を操作できます。
煮るなり焼くなり好きにしてください。

###サンプルコード

```java
//Dialogレイアウト取得用のView
View inputView;
//Dialog内のTextView
TextView dialogText;
//Dialog
AlertDialog alertDlg;

//Dialog用レイアウトの読み込み
LayoutInflater factory = LayoutInflater.from(this);
inputView = factory.inflate(R.layout.layout_dialog, null);
//関連付け
dialogText=(TextView)inputView.findViewById(R.id.dialog_text);
//Dialog生成
alertDlg = new AlertDialog.Builder(TagEditActivity.this)
                    .setView(inputView)
                    .setPositiveButton(
                            "OK",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int which) {
                                    // OK ボタンクリック処理
                                }
                            })
                    .create();
```
Monorepoについて



### Monorepoとは何か

npmで管理する複数のpackageを、まとめて一つのgitリポジトリで管理すること。


#### 具体的に

例えば、 [npm上にBabelは108以上のパッケージがある](https://www.npmjs.com/~loganfsmyth#packages)。

![babel: Babel is a compiler for writing next generation JavaScript. 2017-08-01 22-21-41.png](https://qiita-image-store.s3.amazonaws.com/0/34573/27c83b65-4a0f-6979-4ada-9abad554f813.png "babel: Babel is a compiler for writing next generation JavaScript. 2017-08-01 22-21-41.png")


![@loganfsmyth 2017-08-01 22-19-04.png](https://qiita-image-store.s3.amazonaws.com/0/34573/0673aae7-42cb-1a3d-8281-805f4bd35c75.png "@loganfsmyth 2017-08-01 22-19-04.png")


babelはpluginを追加していくスタイルなので、
babel-core, babel-cli, babel-preset-es2017,  babel-preset-flow ....
と、たくさんのパッケージがあり `npm install babel-preset-flow` 等々して取り込んでいく。


従来、npmでは「１リポジトリ＝１パッケージ」が標準だったが、多数パッケージを管理するBabelのようなプロジェクトでは多数リポジトリを扱うことになり、混乱が大きい。

そこで、単一リポジトリの `/packages` 以下にたくさんパッケージを作り(フォルダとpackage.jsonを多数作り）、管理するのがMonorepo。


これ以上は [実際のBabelのpackagesディレクトリ](https://github.com/babel/babel/tree/master/packages) を見たほうが早い。


![babel 2017-08-01 22-20-28.png](https://qiita-image-store.s3.amazonaws.com/0/34573/4892783b-6e1a-b229-0a57-d2c84d4f81d9.png "babel 2017-08-01 22-20-28.png")


単一リポジトリの中に多数のパッケージがあるのがわかると思う。



### 使用しているプロジェクト

Babel, React, Meteor, そして Ember などが採用。
基本的には多数パッケージを扱う巨大フレームワークが採用しているわけですね。

### 何が利点か

[Why is Babel a monorepo](https://github.com/babel/babel/blob/master/doc/design/monorepo.md) によると

利点:

- 統一された lint, build, test, release プロセス。
- モジュールを横断した変更が容易。
- issueを上げる場所がひとつ（のため見落としがすくない）
- 開発環境を立ち上げるのが簡単。（100のリポジトリで、個別に100個の開発環境を整備するために100回 `npm install` と考えるだけで・・Oops)
- モジュールを横断するテストを走らせるのが容易で、それはつまり複数モジュール環境で起きるバグを見つけやすくなる。


欠点:

- コードが必要以上に威圧的になっちゃう
- gitリポジトリが肥大化
- npmの検索結果で低く表示される。(npmはテストのコードカバレッジを計測しているが、monorepoは個別パッケージでテストしてないのでカバレッジが低くなるため）



#### 僕も/私も使うべきか

規模によっては使用することも考えて良い。
SPAで、フロント・サーバサイド・両者共通機能パッケージ(model関連など)幾つか…と3-10個程度のが存在するときに、
両者共通機能パッケージをmonorepoとし、例えばサーバサイドに寄生させてもいいかもしれない。


**ただし**、十分に小さく独立性があまりない機能セットの場合、無意味なパッケージ分割は単に混乱を生むだけである。どういう単位で分割するのが良いかはアーキテクチャ・設計なのでよく考えよう。
Node-REDで品質の高いソフトウェアを開発する

開発者へのアンケートによると、Node-REDを用いると高品質なソフトウェアが開発できることがわかりましたが、そこには注意点がありました（[Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -](http://sakaba.cocolog-nifty.com/sakaba/2017/06/visualnode-red-.html)）。

Node-REDで開発する際にはNode-REDに合わせた設計やテストが必要です。以下に説明します。

#データ設計

Node-REDのノードは関数ではなく、msgオブジェクトを加工しながら処理をしていきますので、msgオブジェクトのデータ構造をきちんと決めておかないと混乱してしまいます。

msgオブジェクトと同じ様に処理館の共通データであるフロー変数やグローバル変数、データベースも同様にデータ構造をきちんと決めておきます。

#構造設計

フローをどのように構成するか、非同期並行処理（[コールバック地獄よさようなら。Node-REDで非同期処理を使いこなせ！](http://sakaba.cocolog-nifty.com/sakaba/2016/12/node-red-4e94.html)）か順次処理かを検討します。非同期処理は処理が速く効率的です。順次処理はメモリーをあまり消費しないので、大量データを扱う際に有利です。メモリー消費が多いとシステムやDBノードが停まることもありますので、注意深く検討してください。

#システム間連携

[Node-REDでより大規模な開発を - モジュール化とフロー・システム間連携 - http://sakaba.cocolog-nifty.com/sakaba/2017/07/node-red-----50.html
に書いた様に様々な連携方法があります。それぞれの長所短所を検討して方式を決めてください。

いずれの場合もなるべく早い時期から結合すれば、信頼性を高めることができます。

#モジュール設計

いわゆるモジュール強度（凝集度）や結合度を考慮してモジュール化します。なるべく単機能のノードやサブフローになる様に、インタフェースのデータ構造が単純になる様に設計します。

また、ノードの出力が参照なのか、データのコピーなのか、あるいは新しいオブジェクトにするのかを検討します。新しいオブジェクトにすると、渡していないデータは破壊されます。特にhttpレスポンスには多くのデータが必要なですので注意してください。

#逐次開発・テスト

いわゆるxunitはカスタムノードでないと利用できません。改造する際ははデグレが生じ易いので気をつけてください。良いモジュール構造にして、逐次開発とテストを並行して行います。

少しずつ開発ながら随時テストすることで、信頼性の高いソフトウェアを増やしていきます。常に追加した部分を動作確認すれば、まとめてテストした場合よりも抜けが少ない様です（[Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -](http://sakaba.cocolog-nifty.com/sakaba/2017/06/visualnode-red-.html)）。

#機能テスト

機能テストを行う際は、機能の観点だけでなく、データの網羅性に注意すると良いでしょう。もちろん境界値を重視してテストデータを決めます。

Node-REDはスタブやモック、ドライバなどテストダブルの開発にも向いていますので、実記の利用が難しい場合に検討してください。特に[Dashboard](https://github.com/node-red/node-red-dashboard)は使い易いテスト環境を実現します。

#非機能テスト

デバッグノードなどを不用意に繋ぐと、フローの二股になったところでデータがコピーされ、メモリー負荷や、処理速度の低下に繋がるので注意してください。

Node-REDはNode.js上で非同期に動作しますので、スレッドによる実装よりも線形に性能が出ますが、それでも上限性能はあります。想定される負荷を実際に与えてテストしてください。
Node-REDでより大規模な開発を - モジュール化とフロー・システム間連携 -

Node-REDはマルチユーザ対応に向けて[バージョンアップが進んで](https://nodered.org/blog/2017/07/17/roadmap-to-1-dot-0
)いますが、現在のエディタは基本的に一人でしか使えません。しかし、モジュール化やフロー・システム間連携を使えば、複数人で連携してより大規模な開発ができます。

# 1. 機能モジュールの作成方法

## (1-1) エクスポート/インポート
エディタ上の任意のフロー/現在のタブ/全てのタブをJSONでエクスポートして人に渡したり、エクスポートしたJSONを受け取ってインポートすることができます（もちろんバックアップや複製にも使えます）。

エクスポートはフローを選択した後に、
```
　右上のハンバーガー（3本線）メニュー ⇒ 書き出し ⇒ クリップボード
```
を選択すると、 エクスポートのダイアログが表示されますので、選択したフロー／現在のタブ/全てのタブ、 それをコピーします。インデントのないJSONフォーマット／インデントのあるFOMAとを選択し、クリップボードに書き出します。

インポートは、
```
　右上のハンバーガーメニュー ⇒ 読み込み ⇒ クリップボード
```
を選択すると、 インポートのダイアログが表示されますので、現在のタブか新規のタブを選択して、エディタにコピーします。

##(1-2) サブフロー
フローが大規模になると、同じフローが何度も出てくるなど見通しが悪くなりがちです。フローの一部をサブフローと呼ばれるモジュールを定義して扱うことができます。

```
右上のハンバーガーメニュー ⇒ サブフロー ⇒ サブフローを作成
```
を選択すると、左ペインにサブフローが追加されサブフローのタブが開かれます。プロパティを編集するとサブフロー名や情報タブに表示される詳細情報を編集できます。入力（最大1つ）や出力（0以上）を設定すると、inputやoutputが表示されます。

またはサブフローにしたいフローの部分を選択しておいて、ハンバーガーメニュー ⇒ サブフロー ⇒ 選択部分をサブフロー化を選択するとその部分がサブフローになり、左ペインにサブフローが追加されます。左ペインのサブフローをダブルクリックするか、エディタ上のサブフローをダブルクリックして「フローのテンプレートを編集」をクリックすると、サブフローのタブが開かれます。

サブフローのタブを閉じてもサブフローは消えませんので、サブフローのタブを開いて削除します。

##(1-3) カスタムノード
ユーザが独自のノードをJavascriptとHTMLで書くことができます。requireもできますので、様々なノードを 作ることもできます。 詳しくは[Creating Nodes](https://nodered.org/docs/creating-nodes/)を見てください。

#2. フロー・処理間の連携

機能モジュール毎に担当者を分けて開発し、それらを以下のような方法でつなぎ合わせれば、より大きなシステムを作ったり、外部のシステムと連携することができます。

##(2-1) デバッグノードの出力をインジェクトノードで送信
別の担当者のモジュールと接続する部分にデバッグノードをつないで、その出力のJSONをコピー（取り出）して担当者に渡します。担当者は受け取ったJSONをインジェクトノードに設定すると、異なるNode-RED間を直接つながないで、JSONデータを介してフローの続きを開発することができます。

##(2-2) 異なるタブをリンクノードでつなぐ
機能ごとにタブを分けて、それぞれに担当者を決めておくとマージが容易になります。各タブのフローを繋いで大きなフローとするには、出力と入力のリンクノードを使います。

リンクノードは複数への出力や、複数からの入力の設定が可能です。リンクノードにわかりやすい名前をつけておくと良いでしょう。

##(2-3) グローバル/フロー変数結合
取得したデータをメモリーやストレージに保存し、それを一定のタイミングで取得することも可能です。インジェクトノードで繰り返しを設定すると、一定間隔や指定日時、あるいはその組合せで処理を実行して、いわゆるポーリング処理やタスク処理を実現できます。

最も簡単な方法はグローバル変数やフロー変数を用いる方法です。グローバル変数は全てのノードから参照・更新が可能で、（いまのところ）Node-RED起動時に初期化されます。フロー変数は同じタブ（フロー）内のノードから参照・更新が可能で、デプロイ時に初期化されます。

##(2-4) システム間連携
httpノードやwebsocketノードを使えば、他のシステムと連携することができます。http inノードで要求を受けたら、同じ処理のフローにhttp responseノードを入れないと呼び出しが終了しないので気をつけてください。また、http requestノードは出力形式を文字列、バイナリバッファ、JSONを選ぶことができます。

他システムのデータをタスク処理やポーリング処理をするなら、ファイルやデータベースを使うと良いでしょう。ファイルは入出力のほかwatchノードで更新を検出することができます。また、カスタムノードをインストールすればPostgreSQLやSQLiteなどのデータベースを利用することができます。

#3. おわりに

Node-REDで開発する際のモジュール化とフロー・システム間連携についてまとめました。

ここに挙げた方法を用いれば、複数人でNode-REDを用いてより大規模なシステムを開発することができます。みなさんも色々と工夫してください。

開発者へのアンケートによれば、大きなシステムを開発する場合はここにあげた方法だけでなく、設計やテストを工夫することで高品質なソフトウェアを短期間で開発することができます（[Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -](http://sakaba.cocolog-nifty.com/sakaba/2017/06/visualnode-red-.html)）。設計やテストの工夫もいつかまとめたいと思います。
EC2(Linux) awslogs/ssm-agent 自動起動設定

通常の制御だからか需要が無いからか、公式ドキュメント上での自動起動設定制御の記載は確認できませんでした。
ディストリビューション、バージョンによって違いがあるのでまとめておきます。

# 環境

- Amazon Linux AMI 2017.03
- CentOS release 6.9
- CentOS Linux release 7.3.1611
- Ubuntu 14.04.5 LTS
- Ubuntu 16.04.2 LTS

# awslogs

- [CloudWatch Logs の使用開始 \- Amazon CloudWatch ログ](http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_GettingStarted.html)
- awslogs のバージョンは 1.1.2-rpm(yum) と 1.4.1(setup.py)

| 操作 | AmazonLinux | CentOS6 | CentOS7 | Ubuntu14 | Ubuntu16 |
| :--- | :---: | :---: | :---: | :---: | :---: |
| インストール | yum | setup.py | setup.py | setup.py | setup.py |
| 起動/停止 | service | service | systemctl(service) | service | systemctl(service) |
| 自動起動 | chkconfig | chkconfig | systemctl(chkconfig) | sysv-rc-conf(update-rc.d) <b>(*1)</b> | systemctl(sysv-rc-conf/update-rc.d) <b>(*1)</b> |

- <b>(*1)</b> sysv-rc-conf は環境によっては要インストール

## cron.d と logrotate.d

インストール時に毎分の起動チェックとログローテートの cron が格納されます。
必要に応じて以下のファイルの退避(削除)も行います。
尚、yum でインストール(AmazonLinux)した場合、<i>awslogs_log_rotate</i> は作成されません。

```
/etc/cron.d/awslogs
/etc/cron.d/awslogs_log_rotate
/etc/logrotate.d/awslogs
```

## AGENT_ETC_DIR

awslogs.conf 等の設定ファイル格納場所です。
yum でインストール(AmazonLinux)した場合と setup.py(AmazonLinux以外)とで格納場所が異なります。

| インストール | ディレクトリ |
| :--- | :--- |
| yum | /etc/awslogs/ |
| setup.py | /var/awslogs/etc/ |

# amazon-ssm-agent

- [SSM エージェントのインストール \- Amazon EC2 Systems Manager](http://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ssm-agent.html)
- amazon-ssm-agent のバージョンは 2.0.879.0-1

| 操作 | AmazonLinux | CentOS6 | CentOS7 | Ubuntu14 | Ubuntu16 |
| :--- | :---: | :---: | :---: | :---: | :---: |
| インストール | yum(rpm) | yum(rpm) | yum(rpm) | apt(deb) | apt(deb) |
| 起動/停止 | initctl <b>(*1)</b> | initctl <b>(*1)</b> | systemctl(service) | initctl(service) <b>(*1)</b> | systemctl(service) |
| 自動起動 | (upstart) <b>(*2)</b> | (upstart) <b>(*2)</b> | systemctl | (upstart) | systemctl |

- <b>(*1)</b> initctl は省略可
- <b>(*2)</b> upstart はファイル退避/コメントアウト/manual記入等で無効化
	- /etc/init/amazon-ssm-agent.conf