OmniAICreator/Qiita-1.07M huggingface dataset:
ローカルにCloud9をインストールしてRuby開発をはじめるまで



新人教育の開発環境として
CentOS6 + Cloud9 + Ruby + sinatra
を選定したので、開発環境の構築手順を以下にメモしておきます。

※ 便利なクラウドサービスであるCloud9ですが、やっぱりローカルで使いたいですよね。
Cloud9のgithubはここ
https://github.com/c9/core


いずれまるまるdockerのイメージにしたい。


# CentOS6のインストール

## VirtualBoxのインストール

https://www.virtualbox.org/
ここからDL

## 仮想マシンの作成

VirtualBox上で実行
- メモリ 2048MB
- ストレージ
    - VDI
    - サイズ：10GB程度

## 仮想マシンの設定変更

ネットワークのアダプター1をブリッジアダプターにしておきましょう。
    
![image](https://qiita-image-store.s3.amazonaws.com/0/50872/1fd1008e-e5dd-85af-0b11-1ac4a9f27330.png)


## CentOS6のインストール

CentOS-6.7-x86_64-minimal.iso
作成した仮想マシンにCentOS6.7をインストールしてください
VirtualBoxを使用してインストールしてください。
http://www.kakiro-web.com/memo/centos6-install.html

## teratermからアクセス

CentOSにログインできたら、Terminal（端末）からifconfigを実行してIPアドレスを確認。
Window端末から、Teratermを用いて対象端末にSSH接続を行ってください。

```
service iptables stop
setenforce 0
```

```
vi /etc/ssh/sshd_config
```

```
#以下のコメントアウトを外します。
Port 22
PermitRootLogin yes
```

```
service sshd restart
```


## ネットワーク設定

```
 vi /etc/sysconfig/network-scripts/ifcfg-eth0
```

```
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.100.100
NETMASK=255.255.255.0
GATEWAY=192.168.100.1
DNS1=8.8.8.8
DNS2=8.8.4.4
[root@dlp ~]# /etc/rc.d/init.d/network restart 
```

# サーバ上に開発環境のインストール

## いろいろインストール

```
 yum install -y git gcc gcc-c++ openssl-devel readline-devel glibc-static
```

## rbenv、という、Rubyのバージョンを自由自在に変更するソフトを入れましょう。

```
#rbenvの取得
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
#rbenvコマンドを実行可能に。
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
rbenv -v
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

#インストールできるRubyのリストを確認
rbenv install --list

#バージョンを指定してインストール(今回は2.3.0)
#結構長いです(30分程度)。本でも読みましょう。
rbenv install 2.3.0

#使用するRubyバージョンを指定
rbenv global 2.3.0

```
※先にRubyをインストールしてしまっている場合は、```yum remove ruby```しておきましょう。

## cloud9のインストール
無敵のブラウザエディターです。

### Python2.7インストール
どうやら必要らしいのでいれましょう
以下を参考にさせていただきました。
http://qiita.com/informationsea/items/2a91ca07157a94b8594b

```
python -V
sudo yum install centos-release-scl-rh -y
sudo yum install python27 -y
echo 'scl enable python27 bash' >> ~/.bash_profile
exec $SHELL -l
#Pythonのバージョンがあがっているはず
python -V
```

### cloud9インストール

```
git clone git://github.com/c9/core.git c9sdk
cd c9sdk
# インストール開始
# 地獄みたいにながいので、20分位。本でも読むか、コーヒーでものんで待ちましょう。
scripts/install-sdk.sh
```

## nodejs インストール

```
yum install epel-release
yum install nodejs npm --enablerepo=epel
```

## 作業スペースを作成

```
mkdir /opt/workspace
chmod 777 /opt/workspace
chmod 777 /root/.c9
```

## cloud9 起動
前準備としてcd　c9sdk　でc9sdkディレクトリに移動
#このコマンドでファイアーウォールを止める

```
node ./server.js -p 8081 -l 0.0.0.0 -a test:test -w /opt/workspace/
```

以下のURLにブラウザからアクセス

```
http://[IPアドレス]:8081
```

ユーザID: test
パスワード: test

# sinatraのインストール

```
gem update --system
gem install rdoc
gem install sinatra
gem install sinatra-contrib
gem install sinatra-reloader
```

以上で完了です。
Bluemix：簡易ETLサービスDataConnect、GUIでワークフローを書くようにETLジョブをする機能がbetaされてたので試してみた

こんなかんじで、フローをGUIで視覚的にわかりやすく描くような機能「Design Data Flow」がbetaリリースされたようなので試してみました。
![スクリーンショット 2016-10-25 21.25.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/b4bfcc7f-b3fb-bd5b-ee3e-507cf1aca020.png)

##ちなみに
Dataconnectの使い方の簡単な紹介は以下の記事をご参照
http://qiita.com/azzeten/items/a0b604c67d993387ff5e

## 手順

ざっくりいうと
・必要なデータソース（A、B、Cとする）を全部いったん定義
・各データソースに対して行いたい処理（join、整形）をそれぞれ定義
　　Aには〜〜をする
　　Bには〜〜をする
　　Cには〜〜する
　というのを定義します。
・最後に、それぞれのデータソースに対し処理後の保存方式を定義します。
　　Aは最終的にはA_copyというテーブルで保存する
　　BはB.csvというファイルで出力する
　などなど。

というわけでここから詳細手順をキャプチャ交えて整理したいと思います。

### 左ペインのDesign Data Flowをクリック
キャンバスっぽいのが開くので右上の「＋」をクリック
![スクリーンショット 2016-10-25 20.44.55.png](https://qiita-image-store.s3.amazonaws.com/0/119378/dc844fe1-a9ec-3c2f-e3ae-f4b798ccb6f4.png)

### ソースを定義
見覚えある画面です。。
元ネタにしたいテーブルを選んで、ADDをクリックします。
![スクリーンショット 2016-10-27 19.42.39.png](https://qiita-image-store.s3.amazonaws.com/0/119378/66625399-9905-914f-7c6e-2fa14ee0f5dc.png)


### 整形
ソースとして定義したアイコンをクリックすると、以下キャプチャのように枠が紫になります。
その状態だと、右ペインに「どんな整形しますか？」という画面が表示されるので、
データのソートや重複排除等、好きな処理を色々定義します。
![スクリーンショット 2016-10-27 19.43.01.png](https://qiita-image-store.s3.amazonaws.com/0/119378/13a533ab-8632-e7a3-b36c-500ef5c15e4e.png)



###それぞれのデータソースに対し処理後の保存方式を定義
ここまでの手順で、整形やらjoinやらを定義したので、最後はそれをどのテーブルに（orどのファイルに）書き出すかのターゲットを定義します。
右上のターゲットボタン（ゴルゴのバズーカのターゲットっぽいアイコン）をクリックすると・・・
![スクリーンショット 2016-10-25 21.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/119378/44df5419-3cf0-c706-0d1a-beaec8348cdb.png)


見覚えのあるこの画面にうつります。あとは従来同様、定義を決めてあげればOKです。SAVEで保存します。
![スクリーンショット 2016-10-25 21.24.46.png](https://qiita-image-store.s3.amazonaws.com/0/119378/428a6de3-300a-f1ae-c1be-7204afb03204.png)


### 最終的にはこんな形
全部の定義を終えたキャンバスはこんな感じになります
**視覚的に、どのテーブルに対して何の仕事をさせるのかが一発でわかるようになっています。**

で、最後、非常ドアのマークみたいなアイコンをクリックすれば、jobが走り出します。
![スクリーンショット 2016-10-25 21.25.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/5cfc44cc-f371-fb16-2ea1-817fcdb9eb0e.png)



### ジョブを走らせた結果は、今までと同じように確認できます。
ちょこちょこリンクになっている文字もあるので、そこをクリックすればそれぞれ詳細が確認できます。
たとえばview dataとかをクリックすると、あらためてDBに接続し直さなくても、このブラウザからターゲット先DBのテーブルを閲覧し、想定している結果がちゃんと入っているかを確認できます。
 ![スクリーンショット 2016-10-25 21.25.59.png](https://qiita-image-store.s3.amazonaws.com/0/119378/1e36169c-e4e2-db48-65aa-332fb010dd52.png)
DRBD9で使えるDRBDプロビジョニングツールDRBD Manageコマンド一覧

DRBD9から使用可能になったDRBD環境を簡単に構築するツール「DRBD Manage」で使用できるコマンド一覧です。
コマンドは2016年10月現在のバージョン「0.97.3」のものになります。

コマンドは随時追加していきます。

## 使い方
drbdmanage <オプション>


|オプション|説明　　　　　　　　　　　　|
|:--|:--|
|a||
|add-node|ノード追加|
|add-resource|リソース追加|
|add-snapshot|スナップショット追加|
|add-volume|ボリューム追加|
|an|add-nodeの短縮系|
|ar|add-resourceの短縮系|
|as|add-snapshotの短縮系|
|assign||
|assign-resource||
|assign-satellite||
|assignments||
|attach||
|attach-volume||
|av|add-volumeの短縮系|
|cat-config|GLOBAL設定表示|
|clear-message-log||
|clear-ml||
|cml||
|commands||
|connect||
|connect-resource||
|create-snapshot||
|cs||
|dbus-trace||
|debug||
|delete-node|ノード削除|
|delete-resource|リソース削除|
|delete-snapshot|スナップショット削除|
|delete-snapshot-assignment||
|delete-volume|ボリューム削除|
|deploy|リソースデプロイ|
|deploy-resource||
|detach||
|detach-volume||
|disconnect||
|disconnect-resource||
|disk-options||
|dn|remove-nodeの短縮系|
|dr|remove-resourceの短縮系|
|ds|remove-snapshotの短縮系|
|dsa|remove-snapshot-assignmentの短縮系|
|dv|remove-volumeの短縮系|
|edit-config|GLOBAL設定編集|
|exit||
|export||
|export-config||
|export-ctrlvol||
|export-res||
|flags||
|free-space||
|handlers||
|help||
|howto-join||
|import-ctrlvol||
|init||
|initcv||
|interactive||
|join||
|join-cluster||
|list|DRBD Manageコマンド一覧|
|list-assignments|アサイン一覧|
|list-free-space||
|list-message-log||
|list-ml||
|list-nodes|ノード一覧|
|list-options||
|list-resources||
|list-snapshot-assignments||
|list-snapshots||
|list-volumes|ボリューム一覧|
|load||
|lowlevel-debug||
|ma||
|message-log||
|ml||
|mn||
|modify-assignment||
|modify-config||
|modify-node||
|modify-resource||
|modify-volume||
|mr||
|mv||
|n||
|net-options||
|new-node||
|new-resource||
|new-snapshot||
|new-volume||
|nn||
|nodes||
|nr||
|ns||
|nv||
|peer-device-options||
|ping||
|poke||
|qc||
|query-conf||
|quit||
|quorum-control||
|r||
|reconfigure||
|reconnect||
|reconnect-resource||
|remove-node||
|remove-resource||
|remove-snapshot||
|remove-snapshot-assignment||
|remove-volume||
|resize||
|resize-volume||
|resource-options||
|resources||
|restart||
|restore-snapshot||
|resume-all||
|rn||
|role||
|rr||
|rs||
|rsa||
|rv||
|s||
|sa||
|save||
|server-version|DRBD Manageのサーババージョン表示|
|set-flags||
|show-options||
|shutdown||
|snapshot-assignments||
|snapshots||
|startup||
|unassign||
|unassign-resource||
|undeploy||
|undeploy-resource||
|uninit||
|update-pool||
|v|volumesの短縮系|
|volumes|ボリューム一覧表示|
FreeBSDのVLAN

.1Qと言われるVLANの機能はイーサーフレームに4バイトのタグを入れます(tagged)。タグのID部分は12ビットで全のビットが1と0以外が指定できるので4094通りの区別ができます。

![VLAN-FIG.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d2fb1540-a583-32f3-c98f-e93f822385f7.png)

FreeBSDではvlan(4)がこの機能をサポートしています。

FreeBSDのホスト間でのVLANを使ったデータの流れは以下のようになります。

![VLAN-FIG2.png](https://qiita-image-store.s3.amazonaws.com/0/104066/71321137-85ae-1053-f7ee-6cb05a362bbc.png)

vlanはtag入りのパケットをifに渡します。インターフェースはそれをEthernetに出します。

受け取ったインターフェースはtagが入っているため該当のIDのvlanに渡します。

Switchへ送る場合はタグが一致しているポートからtagが削除(untagged)されて出されるように、Switchを設定します。

![VLAN-FIG3.png](https://qiita-image-store.s3.amazonaws.com/0/104066/b512ee23-b83b-a896-eee6-c8139b27d5ad.png)

etherswitch(4)を使った設定につていは[こちら](http://qiita.com/yamori813/items/183bd279fbdfa5b9c70f)に書きました。

.1Qなパケットが入ってきているかどうかはtcpdumpのeオプションで確認できます。

```
# tcpdump -e
00:02:29.230425 xx:xx:xx:xx:xx:xx (oui Unknown) > xx:xx:xx:xx:xx:xx (oui Unknown
), ethertype 802.1Q (0x8100), length 102: vlan 1, p 0, ethertype IPv4, 10.10.10.
3 > 10.10.10.5: ICMP echo request, id 30032, seq 7, length 64
```

ついでにSwitchの事も書いておく。90年代の10BaseTの頃はハブがほとんどでしたが2000年前後に100BaseTの時代になってSWITCHが安価に提供されるようになりました。

SwitchはMACアドレスを元に送信先のポートを限定して、通信効率を上げる仕組みです。

![HUB-SW.png](https://qiita-image-store.s3.amazonaws.com/0/104066/0f2c20b5-440a-5efd-41a9-a6da569fbe69.png)

通常の通信はポート間のみになりますが、通信の最初におこなわれる相手のMACアドレスを解決するARPはブロードキャストなので全てのポートに送信されます。マルチキャストも全ポートに送信されます。[マルチキャストの説明](http://ascii.jp/elem/000/000/417/417556/index-2.html)

1998年に.1qがIEEEで規格化されSwitchにVLAN機能が付くようになりました。VLANはSwitchを複数のネットワークに分離する仕組みで主にセキュリティ確保の為に使われます。複数のSwitchにまたがって設定する事もできます。

![HUB-SW2.png](https://qiita-image-store.s3.amazonaws.com/0/104066/fe5ab94e-3e1d-0611-9c32-2a96783ba0cf.png)

上の図ではポートeはcとdとは通信できるがaとbとは通信できない設定を示しています。

この仕組を利用してネットワークインターフェースが1つしかないSOCにSwitchをつないでデュアルポートのルータを作る事ができます。

VLANには.1qとPORT BASEの仕様があります。.1qは上で書いたようにtagで区別していて、PORT BASEはPORT毎に通信できるPORTを設定します。

タグを挿入する事でフレーム最後のCRCが変わってくるので再計算が必要になります。

ifconfigでvlan(4)を設定する場合に、元のインターフェースがupされてないと機能しません。

netgraphにもvlanのモジュール(ng_vlan)がありますが、調べていません。
【Rails】Railsチュートリアルが長すぎてやる気が起きない人向け指南書

Webサービスを開発したい！
低コストで開発したい！
プログラミング言語を習得したい！
<br>
などなどRailsを始める方はそこそこ多いと思います
<br>
<h2>「チュートリアルをみて勉強するぞい！」</h2>
<br>
Rails定番中の定番である「<a href="http://railstutorial.jp/">Rails チュートリアル</a>」

![スクリーンショット 2016-10-27 19.14.21.png](https://qiita-image-store.s3.amazonaws.com/0/110135/a0a9d41a-becd-0f3a-8caa-b5333c332a77.png)


とてもボリューミーでこれさえマスターすればRails使いになれることは確実であろう。

だがしかし、問題点が一つ....

![スクリーンショット 2016-10-27 19.15.54.png](https://qiita-image-store.s3.amazonaws.com/0/110135/3acf73fe-f94f-fbea-ef6d-de0129b648d4.png)
![スクリーンショット 2016-10-27 19.16.06.png](https://qiita-image-store.s3.amazonaws.com/0/110135/a1de1f0c-e104-eeca-7ffa-f0a637d12874.png)
![スクリーンショット 2016-10-27 19.16.21.png](https://qiita-image-store.s3.amazonaws.com/0/110135/fe788435-dd3c-cd7a-9db0-5b22959dbe2c.png)
![スクリーンショット 2016-10-27 19.16.32.png](https://qiita-image-store.s3.amazonaws.com/0/110135/f15230fa-c2d9-6f14-ad96-751425558b8f.png)
![スクリーンショット 2016-10-27 19.16.44.png](https://qiita-image-store.s3.amazonaws.com/0/110135/61eae2c2-bcb4-565d-5120-1b579fcd55c8.png)
![スクリーンショット 2016-10-27 19.16.54.png](https://qiita-image-store.s3.amazonaws.com/0/110135/8c106a45-0954-aadb-d36c-e378263892c5.png)
![スクリーンショット 2016-10-27 19.17.06.png](https://qiita-image-store.s3.amazonaws.com/0/110135/24563001-c22e-f0ed-b4b9-fa5698c1f33c.png)


<br>
<h3>まてまて、
入門長くね？
難しそうじゃね？
私に一人で全部とか無理じゃね？</h3>
<br>
<br>

そう、やる前からやる気が起きないチュートリアル長すぎ問題。


自分自身、Railsを勉強する際に知り合いのエンジニアにこれを勧められたが

長い、長すぎる。到底できるとは思えない(そもそもコーディングが嫌い←）


このチュートリアルを始める前に諦めた方や、第1章でGame Overになってしまった人は多いだろう

どうやったらツユダク特盛を頭の大盛り程度にできるか悩んだところ...

そうだ
<h3>別のチュートリアルをやって、それからコイツをドキュメント代わりにしよう</h3>

そこで登場「<a href="https://openbook4.me/projects/92/sections/485">小学生でもわかるRuby on Rails入門</a>」

![スクリーンショット 2016-10-27 19.27.47.png](https://qiita-image-store.s3.amazonaws.com/0/110135/b04b878c-cd1c-049c-3a52-4085d8f0a849.png)

これの作りかすごい。
1日で終わる程度の内容なのに解説、インプットできる内容のクオリティが高すぎる。
おつむが弱い私ですらわかる素晴らしい。
※小学生にRails開発を教えるときに使った教材だそうです
これである程度Railsの動きを把握することができた。

そして、このチュートリアルの次のステップとして利用するのが
先ほど紹介した「<a href="http://railstutorial.jp/">Rails チュートリアル</a>」
これには小学生チュートリアルの次のステップに必要なことがわんさか書かれており、全ての章を読まず、必要な章のみを読んで実装するスタイルが良いとてもいい！！！


<h2>結論</h2>
「<a href="https://openbook4.me/projects/92/sections/485">小学生でもわかるRuby on Rails入門</a>」でスタートアップして、
自分で開発するWebサービスの実装でわからないところは「<a href="http://railstutorial.jp/">Rails チュートリアル</a>」で補完する
スタイルが一番学習しやすいと感じました。
このスタイルのおかげでHello World専用機である私がWebサービスの開発へと日々邁進してます。
チュートリアル長すぎという方にオススメあれ
VIMで文字化けCSV変換するときのメモ

# Y?
毎回VimでCSV変換するときに忘れてイライラするため

# Hw?
```
:e ++enc=shift-jis " ファイルをshift-jisに変換して開き直す
:set bomb " ファイルにBOMつける
:wq! " ファイルの書き込み
```


# References
http://qiita.com/meio/items/08143eacd174ac0f7bd5
http://qiita.com/prinum/items/af7b35287b4139d629bf
http://qiita.com/meio/items/08143eacd174ac0f7bd5
Watson Analyticsのビジュアライゼーションをカスタマイズして自分好みのグラフを作成する

大量のデータを簡単かつ綺麗にビジュアライズして表示してくれるWatson Analytics。
デフォルトで綺麗なビジュアライゼーションのグラフを表示してくれるが、Formatを変更することで自分好みのグラフにカスタマイズすることが可能です。

以降、折れ線グラフを使ってグラフをカスタマイズしたときのメモです。

## まずはグラフを作成する
なにはともあれ、まずはDiscoverを始めることが重要です。
ここではサンプルのデータセットを利用してDiscoverを始めました。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/81fb326e-ebe7-3efc-cdc9-fecc15f59d93.jpeg)

## Formatを開く
画面左側にある「Format」を開くことでビジュアライゼーションのカスタマイズが可能になります。「Title Style」や「Show」などいくつかのセクションに分けられていることがわかります。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/528afd85-11e3-bfba-3858-639d0cc1f8ee.jpeg)

## グラフタイトルの表示/非表示を切り替える
ここでは「Title style」>「Show title」「Show filter details」のチェックをはずしグラフタイトルを非表示にしグラフの表示域を広げてみます。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/a4a868c1-a653-621f-594d-87a2cd21d42b.jpeg)

## Legendの表示/非表示を切り替える
さらに「Show」>「Legend」のチェックをはずしLegendの表示を非表示にすることでグラフの横幅を大きく見せます。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/7b6ed2ca-561e-89b7-4159-77a147595b5c.jpeg)

## 線のテーマを変える
「Variations」>「Smooth lines」にチェックを入れて折線に動きを出してみます。
さらに「Vertex symbol」を星型に変更してみます。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/ccc4a5ee-8bda-856e-ea90-9c27932995aa.jpeg)

## カラーテーマを変更する
「Colors and opacity」>「Color palette for this visualization」で赤を基調にしたテーマに変更しインパクトを強くしてみました。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/2f3323c2-f822-2524-9790-ed27a3ab4e46.jpeg)

## 以上で完成
Formatの変更自体は以上で完了です。「Format」ペインを閉じでグラフ表示に戻ります。
![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/89d3a0ab-8ad5-ab54-e3d3-08f20d9aba34.jpeg)

## 追加で
「Discoveries」の表示を消せばされにグラフを大きく表示することができるようになります。
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/146283/b1653d4b-03b3-f983-3a40-4e9d96cedc78.jpeg)



ここで紹介したほかにも、「Numbers」>「Rotate axis labels for items」にチェックを入れることでX軸の系列名表示を縦書きに変更できたりとまだまだカスタマイズできる部分があります。またグラフの種別が変われば変更できる項目も変わってきます。

と言うことで、Discoverでグラフを作成する際には、Formatからグラフの表示をカスタマイズすることでより自分好みのグラフに仕上げることが可能です。色々とTry & Errorで自分の好みのグラフを簡単に作成するのもおもしろいと思いました。
DigdagサーバへのTreasureData接続情報設定

やりたいこと
===========

http://qiita.com/pilot/items/e763a67675e264ed0347 で作成したDigdagサーバに
http://qiita.com/pilot/items/ff49174adbbfd0a3c9e4#digdag%E3%81%AEtd%E3%82%B5%E3%83%BC%E3%83%90%E3%83%A2%E3%83%BC%E3%83%89 でプロジェクトをpushしたがAPIキー・エンドポイントの設定ができず実行できなかった

当該プロジェクトにTreasureData接続情報(APIキー・エンドポイント)を設定して実行できるようにしたい

結論
====

digdag secretsで設定する

APIキー設定
==========

digdag secretsコマンドでサーバに設定する
以下のいずれかの方法で

方法1 - APIキー文字列をコマンドラインにべた書き
----------------------------------------------------------

```
$ digdag secrets --project proj1 --set td.apikey=XXX
2016-10-26 12:43:59 +0900: Digdag v0.8.17
Secret 'td.apikey' set
```

ヒストリにAPIキー文字列が残る

方法2 - APIキー文字列をファイルに書く
----------------------------------

```
$ vi tmpfile # APIキー文字列を書く
$ digdag secrets --project proj1 --set td.apikey=@tmpfile
2016-10-26 12:44:29 +0900: Digdag v0.8.17
Secret 'td.apikey' set
$ rm tmpfile
```

方法3 - td.confから抜き出し
--------------------------

```
$ digdag secrets --project proj1 --set td.apikey=`grep apikey ~/.td/td.conf | sed 's/.*= *\(.*\)/\1/'`
2016-10-26 12:45:45 +0900: Digdag v0.8.17
Secret 'td.apikey' set
```

digdag secretsに「td.confからAPIキーを取得」機能があると嬉しい

エンドポイント設定
=================

前述のAPIキー設定方法のいずれかで
apikeyでなくendpoint

`https://`はつけない
td.confでは付いてるのでどちらかに統一してあると嬉しい

方法3だと以下

```
$ digdag secrets --project proj1 --set td.endpoint=`grep endpoint ~/.td/td.conf | sed 's#.*= *https://\(.*\)#\1#'`
2016-11-02 18:51:41 +0900: Digdag v0.8.18
Secret 'td.endpoint' set
```

実行
====

```
$ digdag start proj1 xxx --session now
2016-10-26 12:46:05 +0900: Digdag v0.8.17
Started a session attempt:
  session id: 94
  attempt id: 93
  uuid: 09141eca-f97c-4424-957e-cc76a732c58a
  project: proj1
  workflow: xxx
  session time: 2016-10-26 03:46:07 +0000
  retry attempt name:
  params: {}
  created at: 2016-10-26 12:46:08 +0900

* Use `digdag session 94` to show session status.
* Use `digdag task 93` and `digdag log 93` to show task status and logs.

～ 何度かdigdag session 94を実行して終わるのを待つ ～

$ digdag log 93
2016-10-26 12:47:11 +0900: Digdag v0.8.17
2016-10-26 12:46:08.989 +0900 [INFO] (0288@+xxx+task1) io.digdag.core.agent.OperatorManager: td>: xxx.sql
2016-10-26 12:46:09.969 +0900 [INFO] (0288@+xxx+task1) io.digdag.core.agent.OperatorManager: td>: xxx.sql
2016-10-26 12:46:11.280 +0900 [INFO] (0288@+xxx+task1) io.digdag.standards.operator.td.TdOperatorFactory$TdOperator: Started presto job id=8044900:
SELECT COUNT(*) AS count FROM xxx

2016-10-26 12:46:13.391 +0900 [INFO] (0288@+xxx+task1) io.digdag.core.agent.OperatorManager: td>: xxx.sql
2016-10-26 12:46:15.227 +0900 [INFO] (0288@+xxx+task2) io.digdag.core.agent.OperatorManager: echo>: 42
```
誰にでもわかるMVC

#### CakePHPとは

＊手っ取り早くWeb開発するためのFramework
＊htaccessを使わなくてよい
＊MVCモデル採用（アプリのプログラムを3層に分けて作成する）

#### MVCとは？？

＊ソフトウェアデザインパターンの一種。
＊Model Layer
＊View Layer
＊Controll Layer
の３つから構成される

#### MVCを例えると。。。

＊Model→倉庫（データベース）
＊View→受付のお姉さん
＊Controll→倉庫で働くお兄さん

⓵あなたは、ある日、欲しいもの（情報）があって、受付のお姉さんに電話をします。
（ユーザーがサイトを見る）

⓶電話に向かって、「お姉さん、この商品が欲しいです」と話します
（ユーザーがサイト内のリンクをクリック）

⓷お姉さんは倉庫で働くお兄さんに、あなたの欲しいものを伝え、それを取ってきてもらいます
（ViewとControllerが連携）

⓸お姉さんは、お兄さんから受け取ったものをあなたに送りました
（ユーザーがサイトでリクエストした情報を見る）
Max 7でよく使うショートカットキーまとめ

Cycling '74 Max 7でよく使うショートカットキーのまとめです
Maxに詳しい訳ではないので、文言修正等ありましたら宜しくです、、

### 環境

- Mac OS X 10.11.6
- Max 7.2.3

### 基本系
|コマンド|動作|
|:----|:--|
|n|新規オブジェクト|
|m|メッセージボックス|
|c|コメント|
|i|ナンバーボックス(int型)|
|f|ナンバーボックス(float型)|
|b|ボタン|
|t|トグルスイッチ|
|s|スライダー|

メッセージやコメントは、入力後 `shift + Enter` で確定

### 便利系
|コマンド|動作|
|:----|:--|
|cmd + shift + H|ヘルプパッチ開く|
|cmd + shift + R|リファレンス開く|
|cmd + I|インスペクタ開閉|
|shift + N|パッチコードを繋いだまま、新規オブジェクトを作成 *1|
|cmd + shift + M|コンソールウィンドウ表示
|cmd + E|編集モードと実行モードの切り替え
|cmd + alt + E|プレゼンテーションモードの切り替え|
|cmd + 矢印|選択しているオブジェクトを切り替える *2|
|shift + 矢印|選択しているオブジェクトの位置を移動|
|cmd + Y|整列（オブジェクトを複数選択時）|
|cmd + 1|100%表示|

*1

- オブジェクトを選択した状態: マウスの位置にオブジェクトを作成し、相対位置によってin, outletを自動判別してくれる
- パッチコードを選択した状態: オブジェクトをその位置に挿入することが出来る

*2

- alt + 矢印だとパッチコードレベルでの切り替えになる

### 番外編

実行モードの時に、パッチコードは非表示にしたい、みたいな時がある
なので、全体を非表示にしてから、オブジェクトだけを表示する設定にすれば良い

1. alt + 選択（オブジェクトとパッチコードが選択される）
2. cmd + K（実行モード時に非表示する）
3. 選択（オブジェクトのみが選択される）
4. cmd + L（実行モード時に表示する）
AWSのALB(Application Load Balancer)で複数アベイラビリティゾーンの設定で詰まった

簡単なWebアプリケーションを作っていてALBの設定で詰まったという話です。

AWS上のAPIサーバーとWebアプリケーションサーバーの2台構成で、JavaScriptでもAPIの特定のエンドポイントだけを利用したいとき、特定のエンドポイント(```/api/hogehoge/```)のときだけAPIサーバーに、それ以外はRailsのサーバーに振り分ける設定をしていました。

そのとき、「[ALB(Application Load Balancer)](https://aws.amazon.com/jp/blogs/news/new-aws-application-load-balancer/)を利用すれば簡単に作業が終わるよ」というアドバイスを先輩からいただき、その通り設定して試してみました。

[公式ドキュメント](https://aws.amazon.com/jp/blogs/news/new-aws-application-load-balancer/)にも次のような記述があります。

> アプリケーションロードバランサーはHTTPヘッダーにアクセスし、リクエストを異なるバックエンドにルーティングすることができます。例えば、/apiがURLパスに含まれているリクエストを1つのサーバグループ(これをターゲットグループと呼びます)に送り、/mobileが含まれるリクエストをもう1つのグループに送りたいとします。こういった手法でリクエストをルーティングすることで、複数のマイクロサービスをそれぞれ独立して実行しスケールさせることができます。

ところが、確かに簡単に設定できたのですが、およそ半分のリクエストがタイムアウトするようになってしまいました。[公式のトラブルシューティング](https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-latency-troubleshooting/)に従って、

```bash
$ for X in 'seq60'; do curl -Ik -w "HTTPCode=%{http_code} TotalTime=%{time_total}\n"
$ http://***************.elb.amazonaws.com/api/hogehoge/ -so /dev/null; done
```

上のようなcurlコマンドを何度か実行すると、確かに504エラーが返って来ていることが確認できました。

```
HTTPCode=200 TotalTime=0.142
HTTPCode=504 TotalTime=10.256
```

APIの呼び出し(```/api/hogehoge/```のエンドポイント)でも、アプリケーションでも同様だったので、サーバー側の問題ではなさそうです。

よくよく調べると、

* (ALBを含む)[ELBでは複数アベイラビリティゾーンを設定した場合、それぞれにインスタンスが必要](http://dev.classmethod.jp/cloud/aws/careful-multi-az-elb/)
* ALBでは（今のところ）複数アベイラビリティゾーンを設定する必要があるらしい

ということが原因だったみたいです。

異なるアベイラビリティゾーンに空のサブネットを作って指定していたのですが、指定したインスタンスのあるアベイラビリティゾーンにLBが自動で振り分けてくれるものだと勝手に思い込んでいました…。

今回はサーバーの台数も必要ないので、結局、通常のELBを使い、「アプリケーションサーバーに入れてあるnginxで、```/api/hogehoge/```のエンドポイントのみAPIサーバーを呼び出す」という実装をしようと思います。

# 10/28 追記

今日設定しなおしたところ、タイムアウトを起こさなくなっており、「あれ？」と思ってしばらく後にまた試したところ、またタイムアウトが発生するようになりました。

昨日はきれいに1回おきでエラーが返ってきていて、微妙に挙動が違うのでよくわからないのですが、できる限り調べてみます。

まず、[digコマンド](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230743/)でIPを調べます。

```bash
$ dig test-********.ap-northeast-1.elb.amazonaws.com
;; QUESTION SECTION:
;test-********.ap-northeast-1.elb.amazonaws.com. IN A

;; ANSWER SECTION:
test-********.ap-northeast-1.elb.amazonaws.com. 59 IN	A 54.***.***.189
test-********.ap-northeast-1.elb.amazonaws.com. 59 IN	A 54.***.***.150
```

このうち、```.150```のほうのIPアドレスが504エラーを出しており、おそらく空のサブネットにあるLBのほうがエラーを出していることが分かります。
もう片方(```.189```)のほうはきちんと通信できていました。

ただし、実行するタイミングにより、```.150```のIPアドレスが存在したりしなかったりしていました。おそらくオートスケーリングの仕組みが働いているのでしょう。

```bash
$ curl -vs 54.***.***.150 > /dev/null
* Rebuilt URL to: 54.***.***.150/
*   Trying 54.***.***.150...
* Connected to 54.***.***.150 (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 54.***.***.150
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 504 Gateway Time-out
< Server: awselb/2.0
< Date: Fri, 28 Oct 2016 02:43:11 GMT
< Content-Type: text/html
< Content-Length: 181
< Connection: keep-alive
<
{ [181 bytes data]
* Connection #0 to host 54.***.***.150 left intact
```

ここで、以下の2つの項目を調べてみます。

* 空のサブネットにEC2インスタンスを立て、railsのサーバーに疎通できるか確認する
* フローログを取得する

まずは、「ALB用に作った空のサブネットからrailsのサーバーに通信する設定ができていないんじゃないか」ということを確認するために、（NACLやルートテーブルの設定に問題が無さそうなことを確認した後で）空のサブネットの中にEC2インスタンスを立てて確認してみます。

と思ったら、```.150```のIPアドレスが消えてしまいました。ログを見て検証するのもいったんは難しそうです…。
Cisco Nexus vPC×STP［やってみた］

Cisco Catalyst SwitchにてSpanning-Tree Protocol（STP; スパニングツリー プロトコル）が動作している環境にCisco Nexusを接続した際の注意点をまとめておく。

# 前提
- Cisco Nexus － Cisco Catalyest 接続環境にてSTPを構成する場合は、vPCドメイン内のメンバー(vPC Primary or vPC Secondary)をRoot Bridgeにすることが推奨されている。さらに、CiscoはvPC配下のL2スイッチにはRoot Guardの設定を推奨している。
    - 参考リンク：[Spanning Tree Design Guidelines for Cisco NX-OS Software and Virtual PortChannels]
(http://www.cisco.com/c/dam/en/us/products/collateral/switches/nexus-7000-series-switches/C07-572834-00_STDG_NX-OS_vPC_DG.pdf)
- しかし、実際構成したところ、Cisco Nexus、Cisco Catalyst 混在環境でCisco CatalystをRoot Bridgeにすることは可能だった。
- ここでは主に、Cisco Nexus、Cisco Catalyst 混在環境でCisco CatalystをRoot Bridgeにした際の考慮点をまとめたい。

# Cisco NexusにおけるvPC×STP 考慮点
- NX-OSではSTPポートタイプとして、エッジポート(Portfastみたいなもの)、ネットワークポート(Nexus同士の接続で推奨)、標準ポート(普通のSTPポート)の3つを定義。
- vPCピアリンクは自動でNetwork Stateとなり常にForwarding となる。
- 通常、DPがどこであってもPC PrimaryのみBPDUを生成し、vPC Secondary が受け取ったBPDUはPrimary に転送される。
    - peer-switch機能を使用することによりvPC PrimaryおよびvPC Secondary両方からBPDUを送信することができる。( [参考リンク](https://supportforums.cisco.com/ja/document/12233711) )
    - peer-switch機能はvPC PrimaryおよびSecondaryがSTP上1台のスイッチとして振る舞う。
- vPC Secondaryは自身がBPDU送信しないが、STPポートStateについてはvPCピアリンク経由で共有される。
- グローバルでBridge AssuranceがEnableになっている場合、ネットワークポートでそれが有効になる。これは変更しないことが推奨される。具体的には、すべてのネットワークポート(port type network)からBDPUがhellotタイムごとに送出される。
- vPCメンバーポートでBridge Assuranceを有効化しないこと。
- 同vPCドメイン内の各vPCピアスイッチは自分のブリッジIDを使用する。
- vPCポートでLoopGuardを有効化しないこと。(Default無効)
    - vPC Secondaryポートの対向ではBPDUを受け取らないため。
- CatalystとSTP混在環境でのSTP Cost計算方法を統一する。想定外のPort Roleとなる。( [参考リンク](http://www.cisco.com/c/dam/en/us/products/collateral/switches/nexus-7000-series-switches/C07-572834-00_STDG_NX-OS_vPC_DG.pdf) )
- vPCのRoleに注意：vPC のOperational RoleがPrimaryの機器がBPDU送信を担う。 

以上。
Node.js で https.request の TLS オプションが効かなかった

Node.js で Web アプリケーションを書いていて、別の Web サーバー (HTTPS) からデータを取ってきたくてこんなコードを書いた。

```js:route/index.js
var https = require('https');

...

var request_options = {
    host : 'xxx.yyy.zzz.nnn',
    port : 'mmmm',
    path : '/hogehoge',
    method : 'GET'
    };

var request = https.request(request_options, function(response) {
    ...
    };
```

アクセス先の Web サーバーがテスト用の自己署名証明書を提示してくるもんで、実行するとこうなる。

```
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: self signed certificate
    at Error (native)
    at TLSSocket.<anonymous> (_tls_wrap.js:1022:38)
    at emitNone (events.js:67:13)
    at TLSSocket.emit (events.js:166:7)
    at TLSSocket._init.ssl.onclienthello.ssl.oncertcb.TLSSocket._finishInit (_tls_wrap.js:586:8)
    at TLSWrap.ssl.onclienthello.ssl.oncertcb.ssl.onnewsession.ssl.onhandshakedone (_tls_wrap.js:428:38)
```

自己署名なんで検証に失敗するわけだ…。

[https://nodejs.org/api/https.html#https_https_request_options_callback](https://nodejs.org/api/https.html#https_https_request_options_callback) を読んでいると、`rejectUnauthorized` オプションが見つかった。
テストなのでとりあえずつながればいいので、これの値を false として `request_options` に追加してみるが結果変わらず。

上のリンク先をよく読むと気づくのだが、こう書いてある。

> a globalAgent silently ignores these.

書いてもいいけど、globalAgent だと何も言わずに無視されるわけだ。
続きにはこうある。

> In order to specify these options, use a custom Agent.

Custom Agent とやらを書けばいいらしい。
書き方はこの引用の続きにあるので、これを参考に書き直してめでたし。
Cisco NX-OSの基本

「Cisco IOS、Catalyst OSは触ったことがあるけれど、Cisco NX-OSははじめて」
という人がつまずくポイントをまとめておきます。

# NX-OS の基礎
- Featureを有効にする必要がある
    - VLAN Interface 設定にはinterface-vlan Feature が必要なので注意が必要

```
N7K-1(config)# feature vpc
N7K-1(config)# show feature | grep vpc
vpc                   1         **enabled**
```

- Interface にRange オプションは不要
- (config)でshow コマンドが使用可

# NX-OS 単語集
- ピアキープアライブリンク
- vPCピアリンク
    - Cisco NX-OS ソフトウェアは、vPC ピア間のピアキープアライブ リンクを使用して、キープアライブ メッセージを定期的に送信する。
    - これらのメッセージを送信するには、ピア デバイス間にレイヤ 3 接続がなくてはならない。
        - ピアキープアライブリンクにはDefault VRF ではなく新規作成するのが推奨

# NX-OS 設計の注意点
- ピアキープアライブ リンクが有効になって稼動していないと、システムは vPC ピア リンクを稼動させることができない。
- vPC ピアリンクは10G以上、Port Channel でないと設定不可。

# vPC 関連
- vPC の Role を手動で切り替える。

手順1.Primary,Operational Secondlyとなっているデバイスへログインし、Operational Secondlyとなっている側よりも低いPriority値を設定

手順2.,Secndly Operational Primaryとなっているデバイスへログインし現在のPriority値よりも高い値を設定

手順3.Primary,Operational Secondlyとなっているデバイス側からpeer-linkをshut/no shutする。

```
N7K-1(config-if)# show vpc role

vPC Role status
----------------------------------------------------
vPC role                        : secondary                     
vPC system-mac                  : 00:23:04:ee:be:01             
vPC system-priority             : 32667
vPC local system-mac            : 00:26:98:07:22:c1             
vPC local role-priority         : 32668

N7K-1(config-if)# vpc domain 1

N7K-1(config-vpc-domain)# role priority 100

Warning: 
 !!:: vPCs will be flapped on current primary vPC switch while attempting role change ::!! 
Note: 
 --------:: Change will take effect after user has re-initd the vPC peer-link  ::--------

# ピアリンクを shut / no shut する
N7K-1(config-vpc-domain)# int po10
N7K-1(config-if)# shut
N7K-1(config-if)# no shut

N7K-1(config-if)# sh vpc role

vPC Role status
----------------------------------------------------
vPC role                        : primary                       
vPC system-mac                  : 00:23:04:ee:be:01             
vPC system-priority             : 32667
vPC local system-mac            : 00:26:98:07:22:c1             
vPC local role-priority         : 100 
N7K-1(config-if)# 
```

以上。
Elixirでプラグイン的な仕組みを作る

Codeモジュールを使うとプラグイン的なものを簡単に作ることができる。

コードは以下に
https://github.com/maueki/elixir-plugin-sample

## 準備

```bash
$ mix new plugin_sample
$ cd plugin_sample
$ mkdir plugins
$ cd plugins
$ mix new test_plugin --module PluginSample.Plugin.TestPlugin
```

プラグイン側にモジュール名を設定するのはもちろん必須ではないが、名前空間は揃えたいよね？

## プラグイン側コード

```ex:plugins/test_plugin/mix.exs
defmodule PluginSample.Plugin.TestPlugin.Mixfile do
  use Mix.Project

  # ...

  defp deps do
    [
      {:plugin_sample, path: "../../"}
    ]
  end
end

```

プラグインから呼出側モジュールの関数を呼び出すため`deps`を設定している。

```ex:plugins/test_plugin/lib/test_plugin.ex
defmodule PluginSample.Plugin.TestPlugin do
  def plugin_init() do
    IO.puts "call plugin_init"
  end

  def call() do
    PluginSample.callback()
  end
end
```

関数名はテキトウ。プラグインロード時に呼び出される`plugin_init()`とその後に呼び出される`call()`を作ってみた。

プラグインはあらかじめコンパイルしておく

```bash
$ cd test_plugins
$ mix deps.get
$ mix compile
$ cd ../../
```

## プラグイン呼び出し側コード

プラグイン一覧はconfig.exsに記述してみた

```ex:config/config.exs
use Mix.Config

config :plugin_sample, plugins: [%{path: "plugins/test_plugin/_build/#{Mix.env}/lib/test_plugin/ebin", mod: PluginSample.Plugin.TestPlugin}]
```

このパスの指定をもうちょっと簡略化できないものかと思うがよくわからない。

```ex:lib/test_plugins.ex
defmodule PluginSample do
  require Logger

  def get_plugins() do
    plugins = Enum.map(Application.get_env(:plugin_sample, :plugins), fn %{path: path, mod: mod} ->
      try do
        Code.append_path(path)
        {:module, mod}= Code.ensure_loaded(mod)
        apply(mod, :plugin_init, [])
        mod
      rescue
        error ->
          Logger.warn "plugin loading failed: #{mod}, #{error}"
          nil
      end
    end) |> Enum.filter(fn x -> not is_nil(x) end)
  end

  def call_plugins(plugins) do
    Enum.each(plugins, fn mod ->
      try do
        apply(mod, :call, [])
      rescue
        error ->
          Logger.warn "#{mod}.call failed: #{error}"
      end
    end)
  end

  def callback() do
    IO.puts "callback called"
  end

end
```

`get_plugins()`では`Code.append_path()`と`Code.ensure_loaded()`を使いプラグインに指定されたモジュールをロードしてモジュール一覧を返している。
`call_plugins()`ではそのモジュールに対して`call()`を呼び出している。

## 実行

```iex
$ iex -S mix
iex(1)> plugins = PluginSample.get_plugins
call plugin_init
[PluginSample.Plugin.TestPlugin]
iex(2)> PluginSample.call_plugins(plugins)
callback called
:ok
iex(3)>
```
テンプレートエンジンslimを導入し、既存のerbテンプレートをslim形式に変換するまでの流れ

## slim導入手順

- テンプレートエンジンslimのgemを導入

```ruby
gem 'slim-rails'
```

- gemを導入するだけでslim拡張子のファイルを認識されるようになる  
※同じファイル名でerb拡張子のファイルがある場合はerbの方を優先する模様

## erbをslim形式に変換する手順

- erbをslim形式に変換できるgemを導入

```ruby
gem 'html2slim'
```

- erbをslim形式に一括で変換するコマンドは下記

```ruby
bundle exec erb2slim app/views app/views 
# -dを付けるとslimに変換した後にerbを削除する
bundle exec erb2slim app/views app/views -d
```

## 参考

- [Railsメモ(31) : テンプレートエンジンをERBからSlimに変更する](http://wonderwall.hatenablog.com/entry/2015/08/26/220723)
- [erbをslimに変換する](http://qiita.com/hmuronaka/items/f0e4da231ce97da49043)
- [Slim入門をして書き方を練習をしました](http://qiita.com/pugiemonn/items/b64171952d958dc4d6be)
【iOS10】設定画面に遷移するURLスキームの設定について

iOS10でアプリから設定画面に遷移するURLスキームの設定が少し変わったようなのでまとめました。
#設定画面への遷移方法（iOS9まで）

特定のアプリから、設定->Twitterへ画面遷移する際には、
呼び出したい設定画面（今回はTwitter）のURLスキームを下記のように設定します。

```swift　
if let url = URL(string:　"prefs:root=TWITTER") {
      UIApplication.shared.openURL(url)
}
```
iOS9までであれば上記の実装で「設定->Twitter」へ画面遷移することができるのですが、iOS10になり遷移ができなくなっていました。


#対応
URLを設定している”prefs:root=TWITTER”の先頭に「app-」または「App-」を付けることで指定した設定画面へ遷移が可能になります。

```swift:prefsの前に「app-」を追加
if let url = URL(string:"app-prefs:root=TWITTER") {
      if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
      } else {
            UIApplication.shared.openURL(url)
      }
}
```

###URLスキームサンプル
| 設定 | スキーム | 
|:-----------|:------------|
| Wi-Fi      |   App-Prefs:root=WIFI | 
| Bluetooth    |    App-Prefs:root=Bluetooth |  
| モバイルデータ通信  |   App-Prefs:root=MOBILE_DATA_SETTINGS_ID |  
| インターネット通信(テザリング) |   App-Prefs:root=INTERNET_TETHERING | 
| キャリア  |    App-Prefs:root=Carrier |  
| 通知  |   App-Prefs:root=NOTIFICATIONS_ID |  
| 一般   |  App-Prefs:root=General |
| 一般 > 情報  |    App-Prefs:root=General&path=About |  
| 一般 > キーボード  |   App-Prefs:root=General&path=Keyboard |  
| 壁紙    |    App-Prefs:root=Wallpaper |  
| Siri   |   App-Prefs:root=SIRI |  
| プライバシー  |  App-Prefs:root=Privacy | 
| Safari  |    App-Prefs:root=SAFARI |  
| ミュージック |   App-Prefs:root=MUSIC |  
| ミュージック > イコライザ   |  App-Prefs:root=MUSIC&path=com.apple.Music:EQ|
| 写真とカメラ  |    App-Prefs:root=Photos |
Onsen UI 2でモバイルWebアプリを作るための準備（ローカル環境）

ローカル環境で、Onsen UI 2を使った**モバイルWebアプリ**を作る方法です。
（ハイブリッドアプリではありません。）

# ライブラリのダウンロード #
下記のサイトからOnsen UI 2のライブラリをダウンロードします。
[Onsen UI配布リリース](https://github.com/OnsenUI/OnsenUI-dist/releases)

最新バージョンのDownloadsから`Source code (zip)`をクリックしてタウンロードします。（執筆時点の最新は2.0.2でした。）
ダウンロードしたzipファイル`OnsenUI-dist-2.0.2.zip`を解凍すると、`OnsenUI-dist-2.0.2`のフォルダが出来上がります。

# Webアプリへの組み込み #
`OnsenUI-dist-2.0.2`フォルダを、これから作るWebアプリのフォルダにコピーします。
この時フォルダ名を`onsenui`などに変更してコピーすると良いでしょう。

```text:フォルダ構成
onsenui_sample
  \onsenui    <-- ここにコピー
    \css
    \js
    \stylus
  index.html
  ```
  
## HTMLにcssとjsを追加 ##
Onsen UI 2を使うために必要なのは、以下の３行です。

```html:
<link rel="stylesheet" href="onsenui/css/onsenui.css" />
<link rel="stylesheet" href="onsenui/css/onsen-css-components.css" />
<script src="onsenui/js/onsenui.min.js"></script>
```

## Onsen UI 2を組み込んだHTMLテンプレート ##
Onsen UI 2を組み込んだ、スマートフォン向けHTMLテンプレート[^template]です。

``` html:index.html
<!DOCTYPE html>
<html>
<head>
    <title>Onsen UI サンプル</title>

    <meta charset="utf-8">
    <meta name="description" content="">
    <meta name="author" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" href="">

    <meta name="mobile-web-app-capable" content="yes">
    <link rel="icon" sizes="196x196" href="">
    <link rel="apple-touch-icon" sizes="152x152" href="">

    <!-- Onsen UI 2 -->
    <link rel="stylesheet" href="onsenui/css/onsenui.css" />
    <link rel="stylesheet" href="onsenui/css/onsen-css-components.css" />
    <script src="onsenui/js/onsenui.min.js"></script>
</head>
<body>

    ・・・

</body>
</html>
```

これでUnsen UIを使う準備ができました。

- - -

[^template]: テンプレートは下記のサイトを参考にさせていただきました。[HTML5でWebページを作成する時用の必要最小限をまとめたシンプルなテンプレート（IE8以下も配慮） | コリス](http://coliss.com/articles/build-websites/operation/work/generic-html5-template-by-sixrevisions.html)
Tera Termマクロのパラレル/シリアル実行

Tera Term をバッチ起動させる時に、引数を取らせる方法

#### パラレルで数秒間隔で流す
<TeraTermStart.bat>

```

:変数を使用する場合は以下を参考に
SET myfile=a.txt
start "" "%ProgramFiles(x86)%¥teraterm¥ttpmacro.exe" "%~dp0mymacro.ttl" "aaa" "bbb" %myfile%
timeout 5
start "" "%ProgramFiles(x86)%¥teraterm¥ttpmacro.exe" "%~dp0mymacro.ttl" "ccc" "ddd" %myfile%

```

注意
%~dp0 はバッチファイルの存在するフォルダを表す
引数を変えることで、同じマクロに違う引数を取らせてパラレルで実行させることができます


#### シリアルで流したい場合
最初の [start ""]をなくして実行すれば、1つめのテラタームマクロが完了するまで、次のマクロは流れません

#### 呼び出されるマクロの例
<mymacro.ttl>
```
sendln ' ssh user@192.168.1.1'
wait ':'
sendln 'passwd'
wait '$'

;現在のフォルダパスを取得
getdir macrodir

;引数の確認
messagebox param2 'param2'
messagebox param3 'param3'

;ディレクトリを作って、タイムスタンプ付きのログを取得する
getdate dirname "%Y%m%d"
foldercreate dirname
setdir dirname
getdir logdir
changedir logdir

;ログファイル名を作る
getdate mytime "%H%M%S"
sprintf2 logname '%s_%s' dirname mytime
logopen logname 0 1 0 1

sendln 'date'

```
Python Tools for Visual Studioでdlibを入れて楽しむ為の手順

## 前置き
仕事で__python__に触る機会に恵まれたので、せっかくだからVisualStudioで開発する事にした。
https://www.visualstudio.com/vs/python/ 

importやらpipやら何もしなくても用意されている環境は素晴らしいが、
dlibはpip installでサクッと……はいかなかったので、なんとしてでも仲良しになろうとしたメモ書き。

## 環境
windows 10 Enterprise
Visual Studio 2015
Visual C++ 導入済み
Python Tools for Visual Studio 導入済み

## cmake
とりあえずcmakeが必要なのでインストールする。
私は[Chocolatey](https://chocolatey.org/)がとても好きなので、皆さんもぜひ使うようにしましょう。

```ps1
$ choco install cmake
```
その後、`C:\Program Files\CMake\bin`へPATHを通しましょう。

## Boost
> :notebook: BOOSTまわりは下記ページを参考にしました。ありがとうございます。
> http://tadaoyamaoka.hatenablog.com/entry/2016/09/22/223507

BoostはC++の巨大ライブラリ群で、~~闇の~~C++erならだいたい知ってるすごいやつです。
Boostの[公式](http://www.boost.org)へ行き `windows binaryes`から最新の環境にあったものをDLします。
その後 ダウンロード→解答したディレクトリへpowershell上で移動しましょう。移動したら下記を実行しましょうね。

```ps1
$ ./bootstrap.bat
$ ./b2 install
$ ./b2 -a --with-python address-model=32 toolset=msvc runtime-link=static
```
:memo: address-modelが64だと、後の処理で怒られたので32にしています。
:memo: ちなみに私はこの時、pyconfig.hppだかが無いと怒られましたので下記パスをPATHに通しました。
__Pythonのバージョンが違うようならよしなに修正してくださいね。__
> %LOCALAPPDATA%\Programs\Python\Python35-32;


Boostのビルドが通ったら VisualStudioを再度開いて、projectを右クリック（ソリューションではない）し、
`OpenCommandPrompt Here`をクリックし、cmdを立ち上げる。

cmdにBOOSTのパスを通す、__ディレクトリの位置については各自変えてくださいね。__

```
$ set BOOST_ROOT=C:\boost_1_61_0
$ set BOOST_INCLUDEDIR=C:\boost_1_61_0
$ set BOOST_LIBRARYDIR=C:\boost_1_61_0\stage\lib
```
## そして実行へ

```ps1
$ pip install dlib
```

```
Collecting dlib
  Using cached dlib-19.1.0.tar.gz
Installing collected packages: dlib
  Running setup.py install for dlib ... done
Successfully installed dlib-19.1.0
```

__やったぜ。__
後は使えるかどうかを確認だ！
→ 使えました　やったね！
VMware Fusion でキーボードが英語で認識されてしまった時

VMware Fusion 8.5 で OS X の VM を作ったらキーボードが英語になってしまったので対処方法をメモ。

1. Finder で `OS X.vmwarevm` のような対処したい VM を見つけたら、右クリックして「パッケージの内容を表示」する。
2. パッケージの中に `OS X.vmx` のような .vmx ファイルを見つけたらエディタで開く。
3. 以下の 2行を追加して保存。

```
keyboard.vusb.idVendor = 0x05AC
keyboard.vusb.idProduct = 0x020D
```

次に VM を起動したら、日本語キーボードになっているはず。
バックグラウンドから戻る際にアプリを初期化する

最初に書いたやり方だと、アプリからホーム画面に行ってアプリに戻るとリセットされませんでした。

今は以下のようにしています。今のところよく動いています。

```swift:AppDelegate.swift
    ...
    func applicationWillEnterForeground(application: UIApplication) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        storyboard.instantiateViewControllerWithIdentifier("MainViewController")
    }
    ...
```

`"MainViewController"`には*Initial View Controller*を入れて下さい。これでフォアグラウンドに出るたびにアプリ全体が初期化されます。

## 最初に書いたやり方

**Info.plist**に以下の項目を追加する

`Application does not run in background: YES`

アプリがおかしくなったときにユーザーがリセットすることができる。アプリがまだ不安定なときに使える。
Dockerお掃除コマンド


ググると`grep`やら`awk`やら駆使してるのが出てくるんですが、filterオプションというものがあるのでそれを使った方がスマートです。

**docker 1.12時点のものです。**

## 動いていないコンテナを消す

```
docker ps -aq -f status=exited -f status=dead | xargs docker rm
```

コンテナのステータスはこちら

- `created`
- `restarting`
- `running`
- `paused`
- `exited`
- `dead`

## タグの付いてないイメージを消す

`dangling`は`<none>`になってるイメージです。

```
docker images -f "dangling=true" -q | xargs docker rmi
```
EC2のメモリ使用量とdisk使用量をcollectdでサクッとCloudWatchに登録

CloudWatchの標準メトリックではメモリ使用量とdisk使用量が取れないので
これまでは
公式のCloudWatchMonitoringScripts をcronでcloudwatchにputしていく必要があった
あとperlのモジュールが色々必要
（古いせいなのか最新のamazonlinuxでは色々足りなかった）

めんどくさいので何か新しいやり方ないかなと思っていたところ
公式でcollectdの記事が！

しかしamazonlinuxのリポジトリにから引っ張ってこれるcollectdはまだ5.4.1
5.5以降でないとdfが取れないらしい
[新しい collectd の CloudWatch プラグイン](https://aws.amazon.com/jp/blogs/news/new-cloudwatch-plugin-for-collectd/)

なのでcollectdの公式から最新を引っ張ってこよう

## collectdのインストール
```
$ wget https://storage.googleapis.com/collectd-tarballs/collectd-5.6.1.tar.bz2   or  collectd-5.5.2.tar.bz2
$ tar xvf collectd-5.6.1.tar.bz2
$ cd collectd-5.6.1
$ ./configure
$ make
```

エラーが発生

```
Can't locate ExtUtils/MakeMaker.pm in @INC
```

perlモジュールのインストール

```
$ sudo yum install perl-ExtUtils-MakeMaker
```

```
$ make clean
$ ./configure
$ make && make install
```

## CloudWatch-Pluginのインストール
```
$ git clone https://github.com/awslabs/collectd-cloudwatch.git
$ collectd-cloudwatch
$ ./src/setup.py
```

```
Installing dependencies ... OK
Installing python dependencies ... OK
Downloading plugin ... OK
Extracting plugin ... OK
Moving to collectd plugins directory ... OK
Copying CloudWatch plugin include file ... OK

Choose AWS region for published metrics:
  1. Automatic [ap-northeast-1]
  2. Custom
Enter choice [1]: 1

Choose hostname for published metrics:
  1. EC2 instance id [インスタンスID]
  2. Custom
Enter choice [1]: 1

Choose authentication method:
  1. IAM Role [ロール名]
  2. IAM User
Enter choice [1]: 1

Choose how to install CloudWatch plugin in collectd:
  1. Do not modify existing collectd configuration
  2. Add plugin to the existing configuration
  3. Use CloudWatch recommended configuration (4 metrics)
Enter choice [3]: 3
Plugin configuration written successfully.
Creating backup of the original configuration ... OK
Replacing collectd configuration ... OK
Replacing whitelist configuration ... OK
Stopping collectd process ... NOT OK
Starting collectd process ... OK
```

`/opt/collectd-plugins/cloudwatch/config/whitelist.conf`
には既に以下のメトリクスが入っているのでcloudwatchでしばらく待つと使えるようになる

```
df-root-percent_bytes-used
memory--percent-used
swap--percent-used
cpu--percent-active
```

後はcollectdをdaemon登録して完了

autoscaleやAMIコピーだとインスタンスIDが違うため動かないかもしれないので
再度pluginのセットアップをするとよい
NginxによるTrailingSlashのメモ

# Trailing Slash
いつものように個人的なメモ
nginxのメモばかり増えていく
Trailing SlashとはURLの末尾につける「/」、その設定方法

# 目的
nginxでTrailingSlashを付与する設定
その際に特定のパスはTrailingSlashを付けない、付けるの判断をする
# テスト
## 0. テスト環境
パス構成を下記の様に想定
テスト時に存在しない /example/ccc と /example/aaa/bar.png を使用する

```
.
└── example
    ├── aaa
    │   ├── foo
    │   ├── hoge.jpg
    │   └── index.html
    ├── bbb
    │   ├── foo
    │   ├── hoge.jpg
    │   └── index.html
    └── index.html
```

## 1. 全部 / を付与する
```nginx.conf
rewrite ^(.*[^/])$ $1/ permanent;
```
全URLに / が付与されるので index.html も index.html/ になる
hoge.jpg なども hoge.jpg/ となり404になる
存在しない /ccc や /aaa/bar.png などにアクセスしても /ccc/ や /aaa/bar.png/ となる

## 2. .jpg等の拡張子・ファイルには付けない
```nginx.conf
rewrite ^([^.]+[^/])$ $1/ permanent;
```
index.html などはそのまま
hoge.jpg などもそのままになる
/aaa や /bbb/foo にアクセスすると /aaa/ や /bbb/foo/ となる
存在しない ccc などにアクセスしても /ccc/ となる
/aaa/bar.png へアクセスした際は hoge.jpg と同じように / 無しで /aaa/bar.png のまま

## 3. 一部のみ除外したい場合
```nginx.conf
if ( $request_uri ~ "/aaa" ) {
   set $not_ignore false;
}
if ($not_ignore != false ) {
  rewrite ^([^.]+[^/])$ $1/ permanent;
}
```
/aaa/hoge.jpg はそのまま
/aaa/foo もそのままで/はつかない
/bbb/hoge.jpg はそのまま
/bbb/foo は /bbb/foo/ となる
/ccc/foo は /ccc/foo/ , /aaa/bar.png は /aaa/bar.png といった形になる

# まとめ
3のように $request_uriでマッチさせてフラグを立てると行った形にしている。
locationに記載するrewrite条件で記載できるのだろうが、複雑化する可能性が高く追加が手間なのでフラグを使う


参考：
[ScaleScale Tips/Nginx](https://www.scalescale.com/tips/nginx/add-trailing-slash-nginx/)
custom ripple button の state_enabled 設定


background 置き換えた場合の `state_enable=false` の設定
こんな感じ

```xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/awesome_ripple_color">
    <item>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item
                android:drawable="@drawable/awesome_button_disabled"
                android:state_enabled="false"/>
            <item android:drawable="@drawable/awesome_button"/>
        </selector>
    </item>
</ripple>
```

`state_enable` を切り替えてやることで、 `selector ` の `item` 表示が切り替わる。
`item` の `drawable` の中にも `selector` は使える。
これで active, non-active な状態を持つボタンが作れる。
新規でHololensプロジェクトを作るときの備忘録

Hololens アプリケーションを作ろうと思ったとき、最低限の機能を考えると自分が見ている位置をわかるようにカーソルが必要ではないでしょうか？
プロジェクトを新しく作るたびに、設定を変更して、カーソル追加して、コード追加してとやり方を調べるのが面倒なので、備忘録を書きました。

# 前提条件
* [Hololens の開発キット](https://developer.microsoft.com/en-us/windows/holographic/install_the_tools)をインストール済み
* [HoloToolkit-Unity](https://github.com/Microsoft/HoloToolkit-Unity)のパッケージを作成済みであること

# 全体の流れ
1. 新規プロジェクトを作成
2. プロジェクト設定を変更
3. HoloToolkit をインポート
4. シーンの作成

## 新規プロジェクトを作成
1. **NEW**を選択して新しいプロジェクトを作成する
2. **Project name** にプロジェクト名を設定する
3. **Location** にプロジェクトの保存先フォルダを設定する
4. **3D** を選択する
5. **Create project**をクリックする

![プロジェクト作成](https://prsfrst.qiita.com/files/2da757ff-d66d-0eae-6544-1691309c6a0b.png)

## プロジェクト設定を変更
1. **Edit > Project Settings > Player**を　選択する
2. **Windows Store**を選択する
3. **Other Settings**グループを展開する
4. **Rendering** セクションの **Vertual Reality Supported** にチェックを入れる
5. **Virtual Reality SDKs** が **Windows Holographic** になっていることを確認する
6. **Edit > Project Settings > Quality**を　選択する
7. **Default** 右、Windows Store マークの列の▼をクリックして、**Fastest** を選択する

![Playerの設定](https://prsfrst.qiita.com/files/6e3dc920-97d3-d723-5eb7-8352ea4427a4.png)

![Qualityの設定](https://prsfrst.qiita.com/files/55ba03cb-b0f0-0b08-250d-4cf4653c416f.png)

## HoloToolkitインポート
1. **Projects** パネルの **Asserts** を右クリックする
2. **Import Package > Custom Package...** を選択する
3. HoloToolkit-Unity.unitypackage を選択して、開くをクリックする
4. **All** をクリックし、 **Import** をクリックする

## シーンの作成
1. Hierarchyパネルから **Main Camera** と **Directional Light** を削除する
2. Projectsパネルの **HoloToolkit > Utilities > Prefabs** 内の **Main Camera** をHierarchyパネルにドラッグアンドドロップする
3. Hierarchyパネルで右クリックして、 **Create Empty** をクリックする
4. 新しく作成した **GameObject** の名称を **Managers** に変更する
5. HierarchyパネルからManagersを選択して、Inspectorパネルで **Add Component** をクリックする
6. **Gaze Manager** を検索して、選択する
7. Projectパネルから **Assets > Input > Prefabs** 内の **Cursor** をHierarchyパネルにドラッグアンドドロップする
クロスドメインで他のページを取得する方法


[他のページのHTMLを取得する方法](http://qiita.com/taishi41228/items/b6bcf974e8056afbdd2c)

\> [クロスドメインで他のページを取得する方法](http://qiita.com/taishi41228/items/b3827f48542ae231dff8)

[Ajaxで取得したHTMLからタイトルを取得する方法](http://qiita.com/taishi41228/items/6e0772122d6c80f12fa6)

index.html

```
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Get A Other Page Title</title>
    </head>
    <body>
        <script src="js/jquery.js"></script>
        <script src="index.js"></script>
    </body>
</html>
```

index.js

```
$.ajax({
	url: 'http://localhost/test/',
	type: 'GET',
	success: function(data) {
		console.log(data);
	}
});
```

PHP

```
echo file_get_contents('https://www.google.co.jp');
```

取得したページ

```
<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。" name="description"><meta content="noodp" name="robots">
...
```
メモリの種類と速度について表にしてみた【2016秋】

プログラミングでいくら頑張っても、ハードウェアの限界は超えられない。ならば、ハードウェアの限界値を知っておくことは大事なんじゃないか。ということでまとめてみました。

注）同じ規格のメモリでも速度に開きがあるので、なるべく速いほうの数値を書いています。また、マザーボードとメモリの相性などでもスペック通りの値は出ないので、数値は参考程度に見ていただきたいです。

### 種類
------------------------------------------------------------

#### ■メモリ

| メモリ名称      | 速度（GB/s） | 容量（GB） | 使用しているHW     |
|-----------------|-------------:|-----------:|--------------------|
| DDR3-2666       |         21.3 |         16 | PC                 |
| DDR4-4266       |         34.1 |         32 | PC                 |
| LPDDR4          |         25.6 |          4 | スマホ             |
| LPDDR4x（今年） |         34.1 |          4 | スマホ             |
| GDDR5(titan x)  |          336 |         12 | グラフィックカード |
| GDDR5X          |          320 |          8 | グラフィックカード |
| GDDR5(PS4)      |          176 |          8 | PlayStation®4      |
| GDDR5(PS4 Pro)  |          217 |          8 | PlayStation®4 Pro  |
| DDR3-2133       |           68 |          8 | XBOX ONE           |
| HBM1            |          512 |          4 | グラフィックカード |
| HBM2            |         1024 |          8 | グラフィックカード・スパコン向けGPU |
| HBM3（予定）    |         2048 |         16 | グラフィックカード・スパコン向けGPU |

PC遅いやんと思うかもしれません。ですが、CPU内部にはキャッシュメモリが内蔵されており、IntelCPUで、eDRAM(Embedded DRAM)も含めると、CPU内部キャッシュのみで4層構造になります。（1次cache、2次cache、3次cache、eDRAM）（3次以降が共有メモリ）
内部のキャッシュメモリは、DARMよりめっさ速いので、なんとかしている感じです。

また、各メインメモリの速度比較に関しては、下記図を見ると分かりやすいと思います。

- [メモリ速度の図（PC・グラボ）](http://pc.watch.impress.co.jp/img/pcw/docs/746/633/html/1.jpg.html)
- [メモリ速度の図（モバイル）](http://pc.watch.impress.co.jp/img/pcw/docs/1022/475/html/11.jpg.html)

#### ■DDR4メモリと言っても、相性問題やオーバークロックメモリもあり速度はバラバラ

- [DDR4速度比較](http://akiba-pc.watch.impress.co.jp/docs/dosv/1025780.html)

相性問題まであると、買って刺して計測してみるまで分からないですよね。。。

#### ■ストレージ

| ストレージ名称  | 速度（GB/s） | 容量（GB） | 使用しているHW     |
|-----------------|-------------:|-----------:|--------------------|
| SSD             |            3 |       2048 | PC                 |
| HDD             |          0.2 |      10240 | PC                 |

おまけで、データ永続化先のディスク速度を載せます。遅いですね。。。SSDはシーケンシャルREADが速いやつの参考値なので、もっと遅いSSDもあります。

### メモリとストレージの速度ギャップを埋めるもの
------------------------------------------------------------

メモリーと、永続化層のギャップを埋めるものとして、Intelが「3D XPoint」というものを、Micronと組んで作っているそうです。「Intel Optane Memory」という名前で、今年末か来年頭くらいに出てくるそうです。

- CPUキャッシュメモリ
- メインメモリ
- Intel Optane Memory
- SSD or HDD

と、今まで以上にPCのデータアクセス階層が多くなって、パフォーマンスは上がるのでしょうが、複雑化していきます。。。（自作PC大好きなので、コストアップが気になります。）

### 出典
------------------------------------------------------------

- [DDR3](https://ja.wikipedia.org/wiki/DDR3_SDRAM)
- [DDR4](https://ja.wikipedia.org/wiki/DDR4_SDRAM)
- [xbox one](http://pc.watch.impress.co.jp/docs/column/kaigai/612762.html)
- [PS4Pro](http://pc.watch.impress.co.jp/docs/column/kaigai/1019021.html)
- [メモリウォールと３つの壁](http://pc.watch.impress.co.jp/docs/column/kaigai/153641.html)
GitHubに公開鍵登録するときに知らなかった情弱コマンド（てきとう

```zsh
# 自分のホームに戻るよ
$ cd ~
# sshフォルダにいくよ
$ cd ~/.ssh

# githubに登録するための鍵つくるよ
$ ssh-keygen -t rsa

# gitのコンフィグ確認するよ
$ git config --global --list

# ちゃんと登録できたか確認するよ
$ ssh -T git@github.com
```