OmniAICreator/Qiita-1.07M huggingface dataset:
ハコスコストアの動画URLを取得する

まず以下のスクリプトのブックマークレットを作成します。

```js
javascript:function copyToClipboard(o){if(window.clipboardData&&window.clipboardData.setData)return clipboardData.setData("Text",o);if(document.queryCommandSupported&&document.queryCommandSupported("copy")){var e=document.createElement("textarea");e.textContent=o,e.style.position="fixed",document.body.appendChild(e),e.select();try{return document.execCommand("copy")}catch(t){return console.warn("Copy to clipboard failed.",t),!1}finally{document.body.removeChild(e)}}}copyToClipboard("https://store-cdn.hacosco.com/videos_hacosco/"+location.href.match(/movies\/(.+)/)[1]+"/video.mp4");
```

そして動画ページを開くき、ブックマークレットをクリックします。
すると動画のURLがクリップボードにコピーされています。
GnuPG

# GnuPG

    gpgでファイル暗号化
    encrypt files by cmd line.
    
##  パスワードでの暗号化

```
gpg -c <file>
```
### デコード

```
gpg -d <file>
```

[Encrypt with passwd](https://www.cyberciti.biz/tips/linux-how-to-encrypt-and-decrypt-files-with-a-password.html)

## RSAで暗号化する

### RSAでpublicキーprivateキーを生成する

```bash
gpg --gen-key
 # it will show options.
```

生成後 ~/.gnupgにpub, pri キーが保存

```
gpg --encrypt --recipient <USER Name> <file>
#User nameはファイルをデコードしてほしい人をさせている、自分であればgen-keyで使った名前を入力
#これで、.gpgファイルが生成、暗号化されたファイル
 
 
#もしascii形式がほしいであれば
gpg --encrypt --armor --recipient <User name> <file>
```

### デコード
```
gpg <-d|--decrypt> <file>
```

### GnuPGサーバからpublicキーをもらう

```
gpg --search-keys --keyserver <server url> 'KEY_ID|E-Mail_ID|REAL_NAME'
```

[More detail](https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu-12-04-vps)
EnOceanの使い方メモ

# PCでの受信方法
1. USB400Jは、FT232Rが搭載されている模様。FTDIのドライバをインストールする必要があります。
2. 送信されてくるデータはバイナリなので、Tera termで受信をするときはdebug modeを有効にして、バイナリモードで受信する必要があります。
やり方は、「C:\Program Files (x86)\teraterm」のフォルダにある teraterm.iniを開き
```
; Display all characters (debug mode)
Debug=on
```
にすることで、バイナリモードを有効にできます。
3. tera termを起動し、SHIFT + ESC　を押すとモードが切り替わっていきます。２回押すとバイナリモードになります。
4. tera termを起動したら、シリアルポートで57600bpsを指定して終了です。
次のように、受信したデータを見ることができました。

![teraterm.png](https://qiita-image-store.s3.amazonaws.com/0/136933/1ed75b6e-6f8e-e498-c61a-b3ee7873f0e4.png)

# 受信データのフォーマット
温度センサーを設置してしばらくしたら、次のようなデータを受信しました。
![enocean.png](https://qiita-image-store.s3.amazonaws.com/0/136933/8180afc7-1277-a872-6017-52c20b7883d1.png)
データの意味は次の通りだそうです。

| データ             | Length | データの意味         | 補足                                                        |
|--------------------|--------|----------------------|-------------------------------------------------------------|
| 55                 | 8bit   | SYNC用のフラグ       | 　                                                          |
| 00AA               | 16bit  | データ長             | 　                                                          |
| 2                  | 8bit   | Optional Data Length | 　                                                          |
| 0A                 | 8bit   | パケットタイプ       | 　                                                          |
| 9B                 | 8bit   | CRC8                 | 　                                                          |
| 22                 | 8bit   | Radio Header         | 　                                                          |
| 04017D07           | 32bit  | ID                   | 送信機のID                                                  |
| 00005908           | 32bit  | DATA                 | 0x59   --> 89(DEC)     (255-89) * 40/255 = 26.0392156862745 |
| DD                 | 8bit   | CRC8(Radio)          | 　                                                          |
| 01                 | 8bit   | Sub telegram Count   | 　                                                          |
| 34                 | 8bit   | RSSI                 | 　                                                          |
| 99                 | 8bit   | CRC8(Data)           | 　                                                          |
| 99 8bit CRC8(Data) |        |                      |                                                             |
ISO-8601 メモ書き


Durationの事に関するメモ書き。

see: [ISO-8601 #Duration in en.wikipedia.org](https://en.wikipedia.org/wiki/ISO_8601#Durations)

# Duration

継続時間や時間指定とかに使用する表記です。

表記は `P[n]Y[n]M[n]DT[n]H[n]M[n]S` もしくは `P[n]W` になる。`[n]`は任意の数字になる。

- P は `Period` の頭文字。Duration が始まることを表す
- Y は年指定を表す
- M は月指定、もしくは分指定を表す（後述）
- W は週指定を表す
- D は日指定を表す
- T は時間指定が始まることを表す
- H は時間指定を表す
- S は秒指定を表す

## P5M と PT5M

`M` は月指定と分指定の意味がある。区別には`T`の前にある`M`は月を表し、後にある`M`は分を表す。

## 例

- `P3Y6M4DT12H30M5S` = 3年6ヶ月4日の12時間30分5秒
- `P23DT23H` = 23日と23時間
- `P0.5Y` = 半年
- `P5M` = 五ヶ月
- `PT5M` = 五分
- `PT35H` = `P1DT12H` = 一日と半日 (DSTから変換したときは、その限りじゃない、と書いているけど [DST](https://en.wikipedia.org/wiki/Daylight_saving_time) の事は知らないから詳しくかけない。)

## 他の表記

`PYYYY-MM-DDThh:mm:ss` がある。
gtx1080でchainer/example/mnistのプログラムを回す

# 目的

先日mbp2014midでchainerをうごかしてみたので、gtx1080を2台積んだデスクトップでどのぐらいはやくなるか試してみる
http://qiita.com/o-kei/items/88e8e8f5343ff8d770ec 

# スペック

筐体はこれ
http://qiita.com/o-kei/items/5934661de484ba617d52
あとでmsi GTX 1080 ARMOR 8G OCを増設して既存グラボとSLI接続。（近日中接続ネタ書く）
http://kakaku.com/item/K0000921018/

- CPU	Intel Core i7-6800K [3.40GHz/6Core/HT/L3 15MB/TDP140W]
- GPU0 サイコムオリジナル水冷静音仕様 GeForce GTX1080 8GB
- GPU1 msi GTX 1080 ARMOR 8G OC
- anaconda3-4.1.1

# 実験

```cpu
chainer/examples/mnist/train_mnist.py　
GPU: -1
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.189676    0.102646              0.943217       0.9688                    14.811        
(略)    
20          0.0071264   0.108168              0.99795        0.9826                    423.267       
```
mbpよりちょっと遅い。mbpは385だった。

```gpu0
chainer/examples/mnist/train_mnist.py'  -g=0
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.192582    0.0961112             0.942733       0.9676                    5.36615       
(ry)     
20          0.00554408  0.128831              0.998333       0.9775                    60.4961       
```
```gpu1
chainer/examples/mnist/train_mnist.py'  -g=1
GPU: 1
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.188862    0.111754              0.943217       0.9666                    2.9953        
(ry)
20          0.0106574   0.0979032             0.996966       0.9822                    60.098 
```
7倍早い。
両方つかってみると、

```
chainer/examples/mnist/train_mnist_data_parallel.py'
GPU: 0, 1
# unit: 1000
# Minibatch-size: 400
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.280058    0.114361              0.919867       0.9635                    2.29312       
(ry)    
20          0.00957223  0.101399              0.997067       0.9789                    30.4709 
```
7倍の2倍早くなる。7時間回す必要あるものが30分ですむのだ。
mbpのgpuと比べても6〜7倍早い。
しかしこれを考えるとmbpの優秀さも際立つ。mbpにnvidia搭載されたら買うだろう。

# 結論

- cpu 423秒
- gpu0,gpu1 60秒
- gpu0+gpu1 30秒
cpu1スレッドに対して、マルチgpuで約14倍早くできた。
NULLと戯れる: ORDER BYとNULL

ORDER BYで指定したカラムにNULLが含まれる場合、NULLの現れる順序はRDBMS毎に異なるので注意が必要です。

# 変更履歴
- 2017/07/03 12:30 DB2 11.1の変更点について修正
- 2017/02/28 16:00 DB2の実装について修正

# RDBMSごとの実装
ORDER BY時にNULLを最小の値として扱うRDBMSと、最大の値として扱うRDBMSの2種類が存在します。

RDBMSによっては、ORDER BYのオプションとしてNULLS FIRST/LASTを指定することで、NULLの順序を指定することが出来ます。

```sql
SELECT colname FROM tablename ORDER BY colname NULLS FIRST
SELECT colname FROM tablename ORDER BY colname NULLS LAST
```

以下のRDBMSについて、NULLのデフォルト順序（最小値/最大値のどちらとして扱うか）とNULLS FIRST/LASTのサポート状況を調べてみました。

- DB2 for LUW 11.1
- Oracle 12c
- SQL Server 2016
- PostgreSQL 9.1
- MySQL 5.7


結果は以下のように見事にバラバラとなっていました。

|RDBMS|NULLの扱い|NULLS FIRST/LAST|
|:--|:--|:--|
|DB2 10.5|最大値|×|
|DB2 11.1|最大値|○|
|Oracle|最大値|〇|
|SQL Server|最小値|×|
|PostgreSQL|最大値|〇|
|MySQL|最小値|×|


10.5までのDB2ではマニュアルを見ると一見NULLS FIRST/LASTが使えるように見えますが、実際はデフォルトの動作を変えない以下の指定の仕方しか許可されていません。

```sql
ORDER BY colname ASC NULLS LAST
ORDER BY colname DESC NULLS FIRST
```

なお、PostgreSQLのみの機能としてCREATE INDEX時のオプションでNULLS FIRST/LASTの指定が可能となっています。これにより索引のB-tree上でのNULLの配置を制御できるため、ORDER BY句で指定するNULLS FIRST/LASTと同じ順序を指定しておくと、索引を使用してソート処理をスキップする実行計画が選択可能になります。


# SQL標準での規定
SQL標準ではNULLのデフォルト順序は実装依存であるとしています。おそらく、規格の策定当初から実装ごとに仕様がバラバラで統一できなかったのでしょう。

NULLS FIRST/LASTはSQL:2003で標準化されたようです。これにより実装差異をある程度吸収可能になりましたが、先述のように未サポートのRDBMSもあります。

PostgreSQLのCREATE INDEXのNULLS FIRST/LASTについてですが、そもそもSQL標準は物理実装を規定しないためCREATE INDEX自体がSQL標準にはありません。


# 参考資料
- SQL-99 Complete, Really
    - [Sorting NULLs](https://mariadb.com/kb/en/sql-99/sorting-nulls/)
- IBM Information Center DB2 for Linux UNIX and Windows 11.1.0
    - [order-by-clause](https://www.ibm.com/support/knowledgecenter/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059211.html)
- Oracle Database Online Documentation 12c Release 1 (12.1)
    - [SELECT](https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702)
- SQL Server Transact-SQL Reference (Database Engine) 
    - [ORDER BY Clause (Transact-SQL)](https://msdn.microsoft.com/en-us/library/ms188385.aspx)
- PostgreSQL 9.1.24 Documentation
    - [7.5. Sorting Rows](https://www.postgresql.org/docs/9.1/static/queries-order.html)
    - [11.4. Indexes and ORDER BY](https://www.postgresql.org/docs/9.1/static/indexes-ordering.html)
- MySQL 5.7 Reference Manual
    - [4.3.4.6 Working with NULL Values](https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html)
Vagrantで作成したVMのHDD容量を増やす方法

#### VMのファイルが格納されているディレクトリに移動
```
$ cd /Users/xxxx/VirtualBox VMs/vm_default_xxxxxxx
```

#### ファイルを確認
```
$ ls
Logs						vm_default_xxxxxx.vbox
box-disk1.vmdk					vm_default_xxxxxx.vbox-prev
```

#### vdiにフォーマット変換する
```
$ VBoxManage clonehd "box-disk1.vmdk" "clone-disk1.vdi" --format vdi
```

#### 確認
```
$ VBoxManage showhdinfo clone-disk1.vdi

UUID:           a3d98aa8-ccd0-4899-9c83-xxxxxx
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/xxxx/VirtualBox VMs/vm_default_xxxxxxx/clone-disk1.vdi
Storage format: vdi
Format variant: dynamic default
Capacity:       40280 MBytes
Size on disk:   40194 MBytes
Encryption:     disabled
```

#### サイズ(Capacity)を増やす
```
$ VBoxManage modifyhd clone-disk1.vdi --resize 61440
```

#### 確認(Capacityが増加)
```
$ VBoxManage showhdinfo clone-disk1.vdi
UUID:           a3d98aa8-ccd0-4899-9c83-xxxxxx
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /Users/xxxx/VirtualBox VMs/vm_default_xxxxxxx/clone-disk1.vdi
Storage format: vdi
Format variant: dynamic default
Capacity:       61440 MBytes
Size on disk:   40194 MBytes
Encryption:     disabled
```

#### vmdkにフォーマット変換する
```
$ VBoxManage clonehd "clone-disk1.vdi" "box-disk2.vmdk" --format vmdk
```

=> Virtualボックスのストレージで新規作成したvmdkを指定する
(動作の確認ができたら古いvmdkとcloneしたvdiは削除が良い)
テキストファイルのヘッダー行(一番上の行)を取り除く

### 要望
csvファイルなどのヘッダー行を取り除きたい

### やり方

```bash
tail -n +2 test.csv
```

`+`をつけるとn行目から最後まで表示してくれるらしい。
`-n +5`だと5行目から最後まで表示
UbuntuのAWSCliで、S3にファイル転送の際にエラーが出る件

初めからpipでいれろという結論だったのですが一応…

#### マルチバイト文字が入っているファイルでエラー

```
upload failed: ./HOGE0006\udc82̉\udcf1\udc93]1.jpg to s3://example.com/HOGE0006\udc82̉\udcf1\udc93]1.jpg 'utf-8' codec can't encode character '\udc82' in position
```

+ LANGと同じエンコードにファイル名をエンコード

```
convmv -f shiftjis -t utf8 * --notest
```

+ (/・ω・)/

```
upload: ./HOGE0006の回転1.jpg to s3://example.com/HOGE0006の回転1.jpg
```


#### 空ファイルでエラー

```
upload failed: ./ae002.htm to s3://example/ae002.htm seek() takes 2 positional arguments but 3 were given
```

+ マニュアルではそういう用途のオプションはないぽい
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


+ 同じことで引っかかっている
https://www.bountysource.com/issues/41188073-error-uploading-empty-file-seek-takes-2-positional-arguments-but-3-were-given

```
$ dpkg -l |grep aws
ii  awscli                                     1.11.13-1ubuntu1~16.10.0                         all          Universal Command Line Environment for AWS
```


+ pipで入れなおす

```
$ aws --version
aws-cli/1.11.55 Python/2.7.12+ Linux/4.8.0-37-generic botocore/1.5.18
```

+ (/・ω・)/

```
$ aws s3 cp ae002.htm s3://example.com/ --profile=AWS
upload: ./ae002.htm to s3://example.com/ae002.htm
```
Titaniumで自動インストールされたnodeやnpmが/usr/local配下に残っていた件

初めてQiitaに投稿してみます。ドキドキ。。。

[remark-lint](https://github.com/wooorm/remark-lint)をインストールするために初めてnpmを使ったのですが、環境構築時にすごくハマったのでメモ。

Mac内に`/usr/local/bin/npm`コマンドが見つかったので、なんかのタイミングでHomebrewで入れたんだったかなーと思い、とりあえず`npm install`をしてみました。

するとこんなエラー。

```
~ % npm install --save remark-cli remark-lint remark-preset-lint-recommended
npm ERR! Error: EACCES, open '/Users/$USER/.npm/aeb23529-remark-cli.lock'
npm ERR!  { [Error: EACCES, open '/Users/$USER/.npm/aeb23529-remark-cli.lock']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/Users/$USER/.npm/aeb23529-remark-cli.lock' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Darwin 15.6.0
npm ERR! command "node" "/usr/local/bin/npm" "install" "--save" "remark-cli" "remark-lint" "remark-preset-lint-recommended"
npm ERR! cwd /Users/$USER
npm ERR! node -v v0.8.22
npm ERR! npm -v 1.2.14
npm ERR! path /Users/$USER/.npm/aeb23529-remark-cli.lock
npm ERR! code EACCES
npm ERR! errno 3
npm ERR! stack Error: EACCES, open '/Users/$USER/.npm/aeb23529-remark-cli.lock'
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/$USER/npm-debug.log
npm ERR! not ok code 0
```

エラーの直接の原因は、[~/.npm ディレクトリのオーナーがrootだった](https://github.com/npm/npm/issues/7407)からでした。

```
% ls -ld .npm
drwxr-xr-x  46 root  staff  1564 Apr 18  2013 .npm
```

ディレクトリをchownすれば動いたのかもしれませんが、もう少し考えてみる。
パスが`/usr/local/bin/npm`だと普通はHomebrewで入ったコマンド。でもbrewパッケージ関連のディレクトリがroot権限って変です。`brew list`で確認してもパッケージ入ってないし、自分でインストールした記憶もない。

ということでlsで確認してみる。
brewで入れたコマンドは以下のように`Cellar`配下へのリンクになるもんだけど、

```
~ % ls -l /usr/local/bin/git
lrwxr-xr-x  1 $USER  admin  28 Jan  5 14:22 /usr/local/bin/git -> ../Cellar/git/2.11.0/bin/git
```

nodeやnpmはCellarを見てないので、やっぱHomebrewではない！

```
~ % ls -l /usr/local/bin/node
-rwxr-xr-x  1 24561  wheel  18947216 Mar  7  2013 /usr/local/bin/node
~ % ls -l /usr/local/bin/npm
lrwxr-xr-x  1 root  wheel  38 Apr 18  2013 /usr/local/bin/npm -> ../lib/node_modules/npm/bin/npm-cli.js
```

リンク先の`node_modules`とやらを確認してみると、

```
~ % ls -l /usr/local/lib/node_modules
total 0
drwxr-xr-x  20 nobody  staff  680 Mar 29  2015 alloy
drwxr-xr-x  18 24561   staff  612 Mar 29  2015 npm
drwxr-xr-x  12 nobody  staff  408 Mar 29  2015 titanium
```

うぉ〜〜Titaniumからの自動インストールかぁ！！！前職で一時期TitaniumでiPhoneアプリ作ってたんですが、タイムスタンプもその時期だし間違いない。まともなアプリ作れないのでTitanium本体はすぐ削除したのですが、こんなタイミングでハマるとはすごい凹む。。。トロイのチタン馬。。。

調べてみると、同じような環境をきれいにした方がいたので、アンインストールまではすぐできました。
[nodebrew で Mac の Node.js 環境をスッキリさせた](http://akiyoko.hatenablog.jp/entry/2015/06/20/132239)

しかしこの後、Homebrewからnodebrewをインストールしようとして別途ハマるのですが、また[別記事](http://qiita.com/the_red/items/fd04d97947b9b0bd7a57)で書きまーす。
AWS　S3＋EC2　goofysでマウントする方法　共有ストレージ・ディレクトリ・ファイル、S3連携、同期

AWSに以下の環境を構築するまでの流れを実施したので、備忘録として残しておこうと思います。

##実施事項
goofysを用いたS3とEC2のマウント

##開発環境
・AmazonLinux
・Apache2.3

##事前準備
1.IAMロールの設定
２.EC2の設定
3.S3バケット作成

###1.IAMロールの設定
ダッシュボード　→　IAM →　ロール　→　新しいロールの作成

ロール名の設定
![s3-1.png](https://qiita-image-store.s3.amazonaws.com/0/114886/e65405fc-63b7-3aba-10f0-d40ded5c81d6.png)

ロールタイプの選択
![s3_2.png](https://qiita-image-store.s3.amazonaws.com/0/114886/471d5b95-d069-e099-97c8-396c04597940.png)
[AmazonEC2]を選択

ポリシーのアタッチ
![s3_3.png](https://qiita-image-store.s3.amazonaws.com/0/114886/a3b64b86-f65b-2ccd-c4cf-572dc89715a2.png)
[AmazonS３FullAccess]を選択

→　ロールの作成

###2.EC2の設定
EC2 →　インスタンスの作成

インスタンスの詳細の設定
![s3_4.png](https://qiita-image-store.s3.amazonaws.com/0/114886/c3f1eb31-2040-869a-d709-ce535495209a.png)

I AMロールの項目において、先ほど上記で作成したロール（ここでは、Qiita_S3）を選択

→　インスタンスの生成

※EC2の説明は省略します。詳しくは下記にあります。
[AWS環境構築...](http://qiita.com/hibriiiiidge/items/aebcd4184c7ab4c83bdf)

###3.S3バケット作成
S3 →　バケットを作成

![s3_6.png](https://qiita-image-store.s3.amazonaws.com/0/114886/6ff600e3-014a-efc7-2a10-d3c11c9a50b6.png)
英数字（大文字不可）でかつ、ユニークである必要がある

##goofysインストール・マウント

EC2にSSHでアクセス後、

```php:インストール
[myname@ip-10-0-1-239 ~]$ sudo yum install golang fuse -y #golangとfuseパッケージのインストール
[myname@ip-10-0-1-239 ~]$ export GOPATH=$HOME/go
[myname@ip-10-0-1-239 ~]$ go get github.com/kahing/goofys  #外部パッケージを取り込むために go get コマンド
[myname@ip-10-0-1-239 ~]$ go install github.com/kahing/goofys #インストール
```

`/home/myname/go/bin/goofys`という感じにインストールされる。
今回マウントするディレクトリは、`/var/www/html/test/images`とする。

```Php:マウント
[myname@ip-10-0-1-239 ~]$ cd /var/www/html/test/
[myname@ip-10-0-1-239 test]$ mkdir images
[myname@ip-10-0-1-239 test]$ sudo $GOPATH/bin/goofys -o allow_other --uid=48 --gid=48 --dir-mode=0666 qiitas3test images
#imagesディレクトリの所有者・グループをapache(id 48)にして、666の権限に変更
```

```php:確認
[myname@ip-10-0-1-239 test]$df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        487M   56K  487M   1% /dev
tmpfs           498M     0  498M   0% /dev/shm
/dev/xvda1      7.8G  1.8G  6.0G  23% /
qiitas3test     1.0P     0  1.0P   0% /var/www/html/test/images
```

```php:マウント解除
[myname@ip-10-0-1-239 test]$ sudo umount images
[myname@ip-10-0-1-239 test]$df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        487M   56K  487M   1% /dev
tmpfs           498M     0  498M   0% /dev/shm
/dev/xvda1      7.8G  1.8G  6.0G  23% /
```
以上です。

ここはこうした方が良い、何故ならば...等ありましたらご教示いただけますと幸いです。

参考にさせていただきました。
[Amazon S3と同期させるためのツール7選](http://webfood.info/amazon-s3-sync/)
[GitHub goofys](https://github.com/kahing/goofys)
[goofysを使ってAmazon LinuxにS3をマウントする。](http://qiita.com/kooohei/items/a14f22cb0381342d1861)
[[S3]今流行のgoofysでS3を爆速マウント](http://qiita.com/Yuki_BB3/items/9d661e7ad986c6a4f33d)
CentOSにてGit v2系をパッケージでインストール

# 背景
CentOSの標準パッケージでは古いgit 1.8系が採用されています。
これは元のRHELがエンタープライズ向けで安定性志向の為です。
最新版を利用する為には、ソースからコンパイルしてインストールするのが一般的ですが、
整備された別のリポジトリからパッケージでインストールする方法を投稿しておきます。
Dockerのcentosイメージでも問題無く出来ました。

# IUSリポジトリ
新しいバージョンのパッケージは、IUSで提供されています。

https://ius.io/GettingStarted/

追加リポジトリの自動登録スクリプトが簡単なので利用します。

````
# curl -s https://setup.ius.io/ | bash
````

ソースを見ると分かりますが、CentOS5,6,7を判別して設定されます。

参考情報：
http://qiita.com/ngyuki/items/68ae045ce79ce0c0d63f

# git2uパッケージのインストール
IUSのgitパッケージ名はgit2uです。インストールは以下の通りです。

````
# yum install git2u
````

関連パッケージと共にインストールされます。
バージョン確認してみます。

````
# git --version
git version 2.11.1
````
TidalCycles : シンセが鳴るようにする


[Tidalのチュートリアル](https://tidalcycles.org/patterns.html)の最後で、シンセを鳴らすにはプラグイン（Extension）が必要だと言われます。

```
For this section to work, you need to have installed the SuperCollider sc3-plugins. You can either install the latest version from git, or if you are using Linux, you may find it in your package manager. On Fedora the package is called supercollider-sc3-plugins.
Tidal - Tidal: the guide
Domain specific language for live coding of patterntidalcycles.org
```

インストール方法で詰まったので、メモ。なおMacで行いました。

1. sc3-pluginsのGithubページに進む
2. ダウンロードページからファイルを落とす
3. SuperCollider上でPlatform.userExtensionDirと入力し、Extensionの保存先がどこか確認する
4. 上記の保存先に、ダウンロードしたファイルを解凍したものを保存する
5. SuperColliderを再起動する

上記を行なったところ、無事シンセがなるようになりました。
Bash in Jupyter

# WindowsでLinuxのコマンドを使う方法
[Bash on Ubuntu on Windows](https://msdn.microsoft.com/ja-jp/commandline/wsl/about) や [Mingw](https://ja.wikipedia.org/wiki/MinGW) や [Cygwin](https://ja.wikipedia.org/wiki/Cygwin) や [Git](https://ja.wikipedia.org/wiki/Git)をインストールすれば、Windowsでも Linux のコマンドの一部を使えるようになります。

[Jupyter](http://jupyter.org/)からも、シェルのコマンドを簡単に使えるようです。例えば、Gitをインストールしていると、下記のように表示されます。

```py3:jupyter_notebook
%%bash
ls /
>>>
ReleaseNotes.html
bin
cmd
dev
etc
git-bash.exe
git-cmd.exe
mingw64
proc
tmp
unins000.dat
unins000.exe
usr
```

使えるコマンドは、"C:\Program Files\Git\usr\bin"などにありました。

Pythonを書きながら、ちょっと grep や sed や xargs などを使いたいときには、便利かもしれません。

以上
HTTP Status 206(Partial Content)を抑制する

apacheでHTTP２０６を抑制する方法

## 発生した障害

SprintBootにて、apacheプロキシを経由し、以下で公開したpdfファイルがIE11で正常に開けない。
→apacheでHTTP Status 206(Partial Content)で返戻している場合は、「カラースペースが無効です。」エラーが発生する。
→apacheでHTTP Status 200で返戻している場合は、同一ファイルでも正常に開くことができる。

```java:WebConfig.java
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    @Bean
    public ResourceUrlEncodingFilter resourceUrlEncodingFilter() {
        return new ResourceUrlEncodingFilter();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}
```

## HTTP Status 206(Partial Content)が返戻される条件

 [RFC7233](https://triple-underscore.github.io/RFC7233-ja.html "")よりRange(If-Range)要請があった場合、206が応答されるよう

## 設定内容(httpd.conf)

以下を追加　※本番適応時は、必要に応じFileディレクティブ等で適応範囲を絞ること

* 最低限の設定

```apache:httpd.conf
RequestHeader unset Range
```

* Example

```apache:httpd.conf
<Files *.pdf>
    Header set Accept-Ranges none　#クライアントへRangeアクセスは受け付けないよという応答
    RequestHeader unset Range　#Rangeアクセスを強制的に解除
</Files>
```

##　検証

* 検証に利用したファイル

```:index.html
[ec2-user@ip-172-31-1-128 ~]$ cat /var/www/html/index.html
01234567890123456789
```

* 設定なし

```bash:
[ec2-user@ip-172-31-1-128 ~]$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: localhost
Range: bytes=0-10

HTTP/1.1 206 Partial Content
Date: Tue, 28 Feb 2017 01:26:57 GMT
Server: Apache/2.2.31 (Amazon)
Last-Modified: Tue, 28 Feb 2017 00:41:57 GMT
ETag: "606b7-15-5498c769f64c3"
Accept-Ranges: bytes
Content-Length: 11
Content-Range: bytes 0-10/21
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.
```

* 設定あり

```bash:
[ec2-user@ip-172-31-1-128 ~]$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: localhost
Range: bytes=0-10

HTTP/1.1 200 OK
Date: Tue, 28 Feb 2017 01:27:28 GMT
Server: Apache/2.2.31 (Amazon)
Last-Modified: Tue, 28 Feb 2017 00:41:57 GMT
ETag: "606b7-15-5498c769f64c3"
Accept-Ranges: none
Content-Length: 21
Connection: close
Content-Type: text/html; charset=UTF-8
```
オリジナルデザインのチェックボックスをCSSだけで作る

入力フォームのコーディング時に、チェックボックスを各ブラウザが持っているデフォルト表示とは異なるデザインにしたい時によく使うCSSを紹介します。

画像を使った方法もありますが、**cssのみでサクッと記述したい時におすすめ**の方法です。

##CSSのみで作るチェックボックス

今回サンプルで作ったチェックボックスの完成形は下図の通り。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/146968/784434c0-12f1-cb7e-f843-16d151eea5da.png)

まずは簡単にhtml側の記述を見ていきます
htmlはlabel要素でinput要素囲み、テキスト部分もタップ可能になるようマークアップしています。

```html
<label type="checkbox" class="button checkbox">
  <input type="checkbox" name="" value="" checked="">
  <span>サンプルテキスト</span>
</label>
```

それでは、cssの記述を一つずつ見ていきます。
まずは、タップ範囲全体のデザインを整えていきます。

```css
.button {
  border: 1px solid #ccc;
  width: 180px;
  margin: 0 auto;
  padding: 10px 0 11px 25px;
  display: block;
  padding: 14px 0;
}

.checkbox {
  cursor: pointer;
  position: relative;
  overflow: hidden;
}

```

次にbefore要素、after要素を重ねて、チェックボックスにチェックが入ったときの緑色の部分を作ります。

```css

.checkbox:before {
  content: '';
  position: absolute;
  width: 17px;
  height: 17px;
  left: 12px;
  top: 15px;
  border: 1px solid #7b7b7b;
  background: #fff;
}

.checkbox:after {
  z-index: 1;
  content: '';
  position: absolute;
  top: 24px;
  left: 18px;
  display: block;
  margin-top: -8px;
  width: 5px;
  height: 11px;
  border-right: 3px solid #08b904;
  border-bottom: 3px solid #08b904;
  transform: rotate(45deg);
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -o-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
}
```

さらに、ブラウザがデフォルトで持っているcheckboxを削除する処理をしていきます。
checkboxにはovrerflow: hiddenが当たっているので、デフォルトのチェックをposition指定して外に飛ばしつつ非表示に。

そして、**box-shadowでbefore,after要素で作ったチェックの上に蓋をします。**

```css
.checkbox input[type="checkbox"] {
  position: absolute;
  left: -28px;
  top: 16px;
  width: 17px;
  height: 17px;
  display: block;
  box-shadow : 41px 0 #fff;
  -moz-box-shadow: 41px 0 #fff;
  -webkit-box-shadow: 41px 0 #fff;
  -ms-box-shadow: 41px 0 #fff;
  -o-box-shadow: 41px 0 #fff;
  appearance: none;
  -moz-appearance: none;
  -webkit-appearance: none;
  -o-appearance: none;
  -ms-appearance: none;
  z-index: 2;
}

```

最後に、チェックが入ったらbox-shadowで作った蓋を非表示にするstyleを記述。
これで、チェックを入れると独自にデザインしたcheckが入るようなstyleを記述することができました。

```css
.checkbox input[type="checkbox"]:checked {
  box-shadow : none;
}
```

#まとめ
label要素にラップさてたチェックボックスに対して独自のstyleを当てる方法を紹介しました。
checkboxだけでなく他のinput要素も同様の方法でstyleを当てることができるので、フォーム周りのcss記述の際にお役立て下さい。
エンターキーを押すと電源オプションが開く

個人用めも

改行とか実行とかしようとエンターキーを押すと何故か電源オプションが開く

・原因
なにかの拍子で[Windowsキー] + X のショートカットを間違えて押してしまい、Windowsモビリティセンターが開く→別窓選択しても何故かモビリティセンターを選択してる状態になっており、エンターを押すとモビリティセンターの一番先頭にある「電源オプション」（ディスプレイの明るさを変更する？）が開いてしまう

・対策
モビリティセンターを閉じるかタスクキル

おそらくみんな再起動したら治っているからネットに解決策落ちてないのかと
Proxy環境下での pip install (Windows)

Proxy環境下にある Windows から pip でパッケージを導入する場合、
--proxy オプションを使用することで対応できます。

```bat:
pip install <パッケージ名> --proxy http://xxx.xxx.xxx.xxx:xxxx
```

※Python 3.5 on Windows7(64bit)



複数の環境で作業を行うため Proxy を切り替える必要がある場合は、
環境変数でそれぞれの環境の proxy を定義して切り替えればよさそうです。

【環境変数】
Proxy-A=http://aaa.aaa.aaa.aaa:aaa
Proxy-B=http://bbb.bbb.bbb.bbb:bbbb

【コマンド】
pip install <パッケージ名> --proxy %Proxy-A%

環境に合わせて Proxy 環境変数を切り替えれば更に操作が楽になりそうですが、
コマンドプロンプトでどうやって実装するんだろう・・・
(bash なら .bashrc で制御すればできそうだろうけど)
Cognos BI ドリルスルー使用時のパフォーマンス上の注意点

##概要
Cognos BI & Analyticsで、ドリルスルーを使用する場合の、覚えておいた方が良いパフォーマンス上の注意点です。
ドリルスルーとは、あるレポート上の例えばグラフのバーをクリックすると、クリックしたアイテムの情報を持って他のレポートに遷移する機能です。
Cognosではドリルスルーを設定すると、ドリルスルーの元のレポートのレスポンスが遅くなる事がありますが、その動作を解説します。

##説明
例えば、以下のようなレポートがあったとします。
X軸に「年月」、Y軸に「販売数量」、プロンプトに「製品」を置いてます。
普通に実行すると、数秒でレポートが表示されますが、このレポートのグラフ部分にドリルスルーを設定すると、レポートのレスポンスに影響します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/c20f6b99-2417-7089-71a6-0b38f1977aa1.png)

Cognosでのパフォーマンスボトルネックは、データソースであるDB、Cognosサーバー、クライアントPC、と、3つのポイントが考えられますが、この場合のレスポンス影響は、クライアントPC上で現れます。
プロンプトで大量の選択を行い、レポート実行時にクライアントPC上でタスクマネージャーなどでリソースの確認を行うと、大量のCPUとメモリーが消費されている事がわかります。

これはFiddler等で、N/Wのパケットをモニターすると原因が分かるのですが、以下の様な選択されたプロンプトの情報が、ドリルスルーポイント数分繰り返されて送信されてきます。
**useValue=&amp;quot;151,99,129,128&amp;quot; displayValue=&amp;quot;アストロパイロット,アロエクリーム,インフィニティ,インフェルノ&amp;quot**

ドリルスルーポイント数とは、何を言っているかというと、例えば上のグラフで赤で囲っている「201001」のバーは、1個のドリルスルーポイントです。
当然、横の「201002」も別のドリルスルーポイントとしてカウントされます。
201001-201012で12個
201101-201112で12個
201201-201212で12個
201301-201307で7個
合計で43個のドリルスルーポイントがこのグラフには存在します。

つまり、このグラフでは先に出た、以下の行が43回繰り返しCognosサーバーからクライアントPCに送信される動作になります。
**useValue=&amp;quot;151,99,129,128&amp;quot; displayValue=&amp;quot;アストロパイロット,アロエクリーム,インフィニティ,インフェルノ&amp;quot**

ここまで分かれば、レポート開発経験がある方であれば、何を注意してレポートを作成すれば良いかお分かりになるかと思います。
例えば、X軸を「年月」ではなく「年月日」になっているようなレポートでは、ドリルスルーを設定するとさらに影響は顕著になり、プロンプトでより長い製品名称を扱ったり、大量のプロンプト選択をした場合は、これも影響が顕著に出ます。

この動作を理解しておいて頂ければ、レポートを開発してみてテスト局面でレスポンスを計測する前に、レポート設計の段階で注意すべきレポートかどうか判断ができます。

また、
・グラフでドリルスルーをやるのではなく、X軸の「年月」のプロンプトも別途作っておき、ドリルスルーボタンを1個配置してドリルスルーポイント数を抑える
・初期表示はX軸の範囲を「年月」レベルに留めておき、「日」はドリルダウンした場合に対象の月の中の日にちだけを表示して、ドリルスルーポイント数を抑える
・プロンプトでは略称を使ったり、displayValueを使わずにuseValueだけにする
など、色々な回避策を早めに打つ事ができます。

Cognosレポート開発でドリルスルーを使用する際には、是非この動作を頭に入れてレポート設計をご検討下さい。
GitHubを使った開発フロー(初心者用)

つい、先ほどgithubを使い共同開発していたのですが、使い方が分からず困ったのでまとめておきます。

##前提
基本的にメインプログラマーさんのgithubのレポジトリ`https://github.com/mainprogramer/test.git`に、僕がプルリクエストを送る形で開発をします。

##1.Fork
メインプログラマーさんのgithubレポジトリにブラウザでアクセスし、forkボタンを押します。
すると自分のgithubページ上に対象のレポジトリがforkされます。

##2.Clone
自分のPC（ローカル）で編集するために、forkしたレポジトリをcloneします。
`$ git clone https://github.com/naogify/test.git`

##3.ローカルリポジトリで新規ブランチを作成
修正する前にbranchを作成します。
`$ git checkout -b [your_branch_name]
Switched to a new branch '[your_branch_name]'`

##4.修正を加える（コミット）
修正します。
修正が終わったら'git add'して'git commit'します。

```
#txtファイルを作成。
$ touch test.txt

#ステージに追加
$ git add test.txt 

#コミット
$ git commit -m "add test.txt"
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
```
4を繰り返します。

##5. upstream（Fork元リポジトリ）の設定
Forkした自分のリポジトリ (https://github.com/naogify/test.git) は、Fork元のリポジトリ (https://github.com/mainprogramer/test.git) の変更内容を自動更新しないです。なので、Fork元のリポジトリの最新情報を自分のリポジトリに反映させる必要があります。

ここで、Forkした自分のリポジトリには、大抵デフォルト名としてoriginという名前がついています。新しくFork元のリポジトリにupstreamという名前をつけて追加します。

```$ git remote add upstream https://github.com/mainprogramer/test.git```

##6.Fork元リポジトリの最新バージョンを取得しlocalのmasterを更新

```
# branchをmasterに変更
$ git checkout master

# upstreamからfetch & mergeして最新を取得
$ git fetch upstream
$ git merge upstream/master(upstreamとローカルのmasterをマージ)

# localのmasterをoriginにpush（オプション）
$ git push origin master
```

##8.最新版にしたlocalのmasterとブランチとmerge。
```
# branchを修正したbranchに変更
$ $ git merge [your_branch_name]
```
※mergeの時点で、conflictが起こるようであれば、
解決し、もう一度```git add```、```git commit```してから、```git merge```する。

##9.作成したブランチをpush
```
$ git checkout [your_branch_name]
$ git push origin [your_branch_name]
```

##10.pullrequestを送る。
github上で相手にpullrequestを送る。



参考：
下の3つのリンクを特に参考にさせて頂きました。
ありがとうございます。

[Pull Requestの仕方](http://qiita.com/Commander-Aipa/items/d61d21988a36a4d0e58b)/Commander-Aipa様
[Github Fork Pull Request](http://kik.xii.jp/archives/179)/Keiko Oda様
[GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する](http://qiita.com/xtetsuji/items/555a1ef19ed21ee42873)/xtetsuji様
DEEP PROBABILISTIC PROGRAMMING ---”深層学習＋ベイズ”のライブラリ--- Edwardの紹介

#WHY

[Edward](https://github.com/blei-lab/edward)

実装面と今後の伸びしろに期待を込めて下記の観点から紹介します。

- Google Researchの人が共著者
- BackEndがTensorflow
- CaffeeのModel Zooのようなものがあり公開済みモデル用のエコシステムがある
- 深層学習よりも収束が早く次のトレンドになりそう

[Deep Probabilistic Programming](https://arxiv.org/pdf/1701.03757.pdf)を読んだのでこの内容から抜粋して紹介します。

---

#どんなもの?

従来の深層学習よりも柔軟性があり、かつ計算効率の良い確率的プログラミングが可能なライブラリの紹介。
同じモデルを別の推論機で使用できる。
推論の一部としてモデルの表現の再利用が可能なのでバラエティに富んだネットワーク構成も可能
バックエンドがTensorflowでできておりCaffeeのModel Zoo のようなものがある[Probability Zoo](http://edwardlib.org/zoo)

---

#先行研究と比べてどこがすごい?

・計算効率が深層学習よりも良い
・柔軟性のある推論部分の作成
・Stan,PyMC3に比べてロジスティック回帰で35倍の速度

---

#技術や手法のキモはどこ?
・ランダムな値生成と推論で構成
・オープンな技術で作成（バックエンドがTensorflow）
・推論部分にモデルの構築も含めている部分が従来のものと異なる。
・Bayesian Recurrent Neural Network with Variable Length

---

具体例

##Bayesian Recurrent Neural Network with Variable Length

Normal:正規分布

Weightと正則化の正規分布の平均と分散を学習

![Screen Shot 2017-02-28 at 8.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/10496/b76bc862-2e44-daaf-6252-222ef4080707.png)

---

##GAN

生成用のネットワークと識別用のネットワークを構成し、データのパラメータは分布から生成。予測値も分布から生成

![Screen Shot 2017-02-28 at 8.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/10496/a072571d-6ab7-049f-c243-146129ae5e60.png)

---

##推測器の複合

EM Algorithm

![Screen Shot 2017-02-28 at 8.06.14.png](https://qiita-image-store.s3.amazonaws.com/0/10496/c8b19baf-e3b4-3740-bbf4-1625206a0bff.png)

---

#どうやって有効だと検証した?

##各手法の比較検討

![Screen Shot 2017-02-28 at 8.07.27.png](https://qiita-image-store.s3.amazonaws.com/0/10496/dbec3811-cac6-af42-aa20-5e4a72b67121.png)

##従来ライブラリとの比較

PyMCとStanで速度検証

Stanの約20倍
PyMCの約40倍

```
Spec
12-core Intel i7-5930K CPU 3.5GHz NVIDIA Titan X(Maxwell) GPU

Task
generate posterior samples with Hamiltonian Monte Carlo

Data
Covertype dataset (N = 581012, D = 54; responses were binarized)

Other
100 HMC iterations, with 10 leapfrog updates per iteration and a step size of 0.5/N

35x speedup from stan 
```

---

#議論はある?

最新の技術は伝統的なベイズ手法をもっと取り入れていきたい
巨大なデータにおいても適用できるようにしていきたい

---

#次に読むべき論文は?

本格的な使用方法がわかるので下記の論文がオススメ
Tran, Dustin, et al. "Edward: A library for probabilistic modeling, inference, and criticism." arXiv preprint arXiv:1610.09787 (2016).

---

#Reference

[Deep Probabilistic Programming](https://arxiv.org/pdf/1701.03757.pdf)
ImageMagick > textを画像にする > convert -background lightblue -fill blue -pointsize 72 label:Anthony label.gif

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
ImageMagick 6.7.7-10 2016-06-01 Q16 http://www.imagemagick.org
```

任意のテキストをpngなどの画像にしたい。

http://www.imagemagick.org/Usage/text/
のBasic Labelsのコマンドで画像にすることができた。

### v0.1

Candiceというフォントはないようなので、以下のコマンドとした。

```bash
$ convert -background lightblue -fill blue -pointsize 72 label:Anthony label.gif
```

```
$ eog label.gif
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c8ecd804-29ec-3474-8385-777939cbe5bc.png)

### v0.2 > 画像サイズ指定(-size) + 文字をセンターに(-gravity)

```bash
$ convert -background lightblue -fill blue -size 150x150 -gravity center -pointsize 36 label:Anthony label.gif
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0b56cad8-3690-8acd-0347-b910b196bbaa.png)
AcctiveModel基礎　

##AttributeMethodsモジュール
```ruby:
class Person
include ActiveModel::AttributeMethods
attribute_method_perfix 'reset_'
attribute_method_suffix '_highest?'
define_attribute_methids 'age'
attr_accessor :age
private
def reset_attribute(attribute)
send("", 0)
end
def attribute(attribute)
send("#{attribute}=", 0)
end
def reset_attribute(attribute)
send("#{attribute}=", 0)
end
def attribute_highest?(attribute)
send(attribute) > 100
end
end
person = Person.new
person.age = 110
person.age_hifhest? # true
person.reset_age # 0
pereson.age_highest? # false
```
カスタムプレフィックス、サフィックス　追加

##Callbacksモジュール

```ruby:
class Person
extend ActiveModl::Callbacks
define_model_callbacks :update
before_update :reset_me
def update
run_callback(:update) do
#updateメソッドがオブジェクトに対して呼び出されるとこのメソッドが呼び出される
end
end
def reset_me
#このメソッドは、before_updateコールバックで定義されておいるとおり、updateメソッドがオブジェクトに対して呼び出される直前に呼び出される
end
end
```
ActiveRecordスタイルのコールバック
カスタムメソッド実行前、実行中、実行後（before,after,around）

##Conversionモジュール
```ruby:
class Person
include ActiveModel::Conversion
def persosted?
false
end
def id
false
end
def id
nil
end
end
person = Person.new
person.to_model == person # => true
person.to_key # => nil
person.to_param # => nil
persested?,idメソッドで、Conversionモジュール
```




##Dirtyモジュール
```ruby:
require 'active_model'
class Person
include ActiveModel::Dirty
define_attribute_methods :first_name, :last_name
def first_name@first_name
end
def first_name=(value)
first_neme_will_change!
@first_name = value
end
def last_name
@last_name
end
def last_name=(value)
last_name_will_change!
@last_name = value
end
def save
#保存を実行
changes_applied
end
end
```
first_name属性とlast_name属性を持つPersonというクラスの例
##変更されたすべての属性リストをオブジェクトから直接取得する

```ruby:
person =Person.new
person.changed? # => false
person.first_name = "First Name"
person.first_name # => "first Name"
#属性が１つ以上変更されている場合に返す
person.changed? # => true
#保存前に変更された属性リストを返す
person.changed # => ["first_name"]
#元の値かた変更された属性リストを返す
person.changed # => {"first_name"=>nil}
#変更のハッシュを返す（ハッシュのキーは属性名、ハッシュの値はフィールドの新旧の値の配列）
person.changes # => {"first_name"=>[nil, "First Name"]}
```














##アクセッサメソッド
###検出
```ruby:
#attr_name_changed?
person.first_name # "First Name"
person.first_name_changed? # => true
```
###直前の値
```ruby:
#attr_name_was accessor
person.first_name_was # => "First Name"
```
###変更　配列、変更なし　nil
```ruby:
#attr_name_changed
person.first_name_change # => [nil, "First Name"]
person.last_name_change # => nil
```


##Validationsモジュール
```ruby:
class personinclude ActiveModel::Validationsモジュールattr_accessor :name, :email, :token
validates :name, :email, :tokenvalidates :name, presence: truevalidates_format_of :email, with: /\A([^\s]+)((?:[-a-z0-9]\.)[a-z]{2,})\z/i
validates! :token, presence: true
end
person = Person.new(token: "2b1f325")
person.valid? # => false
person.name = 'vishnu'
person.email = 'me'
person.valid? # => false
person.email = 'me@vishnuatrai.com'
person.valid? # => true
person.token = nil
person.valid? # => ActiveModel::StrictValidtionFailedが発生する
```
クラスオブジェクト　AcctiveRecordスタイルで検証
Unityでカメラ外に出たらGameObjectを削除する

# 結論

```csharp
[RequireComponent(typeof(Renderer))]
public sealed class AutoDestroy : MonoBehaviour
{
  bool _enabled = false;
  Renderer _renderer;
  void Start() {
    _renderer = GetComponent<Renderer>();
  }
  void Update() {
    if (!_enabled && _renderer.isVisible)
      _enabled = true;
    if (_enabled && !_renderer.isVisible)
      Destroy(gameObject);
  }
}
```

- Renderer#isVisibleを使う
- 画面外で生成された場合も考慮して、一度visibleになってから再度not visibleになった場合に削除するようにする

 
# 参考記事

[http://qiita.com/niusounds/items/6c493dfea8049cdf2a47](http://qiita.com/niusounds/items/6c493dfea8049cdf2a47)
Kubernetesクラスタ上でDatadogフォワーダのリソース効率を劇的に改善するkube-veneur

[kube-collocated-pod-proxy](https://github.com/mumoshu/kube-collocated-pod-proxy)の代わりに以下のようなsidecar containerをつけることで、メトリクスにnamespaceをタグ付してDatadogに送れるようになりました（たぶん
https://github.com/mumoshu/kube-veneur/blob/master/local-veneur.yaml#L19-L60

## kube-collocated-pod-proxy

https://github.com/mumoshu/kube-collocated-pod-proxy

NginxによるUDPロードバランサのDaemonSetです。

Datadogエージェントをホスト毎に起動しつつ、Kubernetesの各Podから「いまこのPodがいるホストのDatadogエージェントに到達したい」という要件を満たすために開発しました。

## veneur

Stripe社で開発されたOSSで、Go言語で書かれたDogStatsDの代替です。
https://stripe.com/blog/introducing-veneur-high-performance-and-global-aggregation-for-datadog

速度と、分散デプロイしたときに本家とは違って99percentileメトリクスが正しく取れる、というのが売りらしいです。これならcollocated-pod-proxyの代用として使ってもそんなにリソースが無駄にならない・・と期待。

## 使い方

メトリクスによって、
１．sidecar containerから直接datadogに送ったり（そのためにAPIキーが必要っぽい？namespaceがタグ付けされる）、
２．global/central veneurを経由してからdatadogに送ったり（こうすると本家dogstatsdと違って、percentileがちゃんと計測できるらしい）、
３．同じホストのdogstatsd経由でdatadogに送ったり（今まで通り＋namespaceがタグ付けされる）
と、送り方が変わる感じになってます。

設定：

VENUE_KEY環境変数にDatadogのAPIキーが必要です
https://github.com/mumoshu/kube-veneur/blob/master/local-veneur.yaml#L33
VENEUR_FORWARD_ADDRESSはglobal/central veneurのホスト名＋ポートです
VENEUR_DEBUGは動作確認できたら基本falseがよいです（ログが増えるので

## 

一応、global/central veneurは以下にあります
https://github.com/mumoshu/kube-veneur/blob/master/global-veneur.yaml
が動作確認はまだです！とりあえず、percentileメトリクスを送らないと使われない模様なので必須ではないです。
技術英語 > we [tested for equality] with the == operator. / equally spaced / Equally distributed

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2009 / 12833)

> we **tested for equality** with the `==` operator.

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/799755ebc54b7dd8bb6f

> equally spaced

<hr>
関連して思い出したのは

> [Equally distributed](https://social.technet.microsoft.com/Forums/office/ja-JP/064cc282-4776-4716-b4d6-ec127e663ab9/generate-equally-distributed-random-numbers-between-a-range-in-excel?forum=excel)

> Generate Equally distributed Random numbers between a range in Excel
ActiveRecord　DB検索（find,firsrt,last,all）

##findメソッド　SQL文
```ruby:
#Find the client with primary key (id) 10.
client = Client.find(10)
#=> #<Client id: 10, first_name: "Ryan">
```
```ruby:
SELECT * FROM client WHERE (clients.id = 10) LIMIT 1
ActiveRecord::RecordNotFound
```
```ruby:
#Find the client with primary keys 1 and 10
client = Client.find([1, 10]) # Client.find(1, 10)でもよい
#=> [#<Client id: 1, first_name: "Lifo">,#<Client id: 10, first_name: "Ryan">]
```
```ruby:
SELECT * FROM clients WHERE (clients.id IN (1,10))
```
##find('1:主キー値')
```ruby:
def get_find
@article = Article.find(1)
render 'articles/show'
end
```
```ruby:
SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT 1
[["id", 1]]
```
```ruby:
def get_find2
@articles = Article.find(1,3,5)
render 'get_all'
end
```
```ruby:
SELECT "articles".* FROM "articles" WHERE "articles"."id" IN (1,3,5)
```
##find_all_by_'xxxx:フィールド名'('MVC入門:検索値')
##find_by_'xxxx:フィールド名'('MVC入門:')

```ruby:
@article =Article.find_by_title('member:検索値')
```

```ruby:
SELECT "articles".* FROM "articles"
WHERE "articles".* "title" = 'MVC入門'
```

```ruby:
@users = User.find_all_by_roles('membaer')
```

```ruby:
SELECT "users".* FROM "users" WHERE "users"."roles" = 'member'

```

```ruby:
#blogテーブルからIDが１のデータを検索し、ロードする
blog = Blog.find(1)
#findメソッドの引数に指定するIDは、数値でも文字列でも構わない
blog = Blog.find("1")

```
```ruby:
SELECT * FROM blog WHERE id = 1
```
```ruby:
#IDが1,2,3のレコードをロードする
blog = Blog.find(1,2,3)
#可変長引数ではなく、IDの値を複数含んだ配列オブジェクトを渡しても可
blog = Blog.find([1,2,3])
```
```ruby:
SELECT * FROM blog WHERE blog.id IN (1,2,3)
```
```ruby:
#blogテーブルから一番"先頭"のレコードを検索してロードする
blog = Blog.first
```
```ruby:
#blogテーブルから一番"最後"のレコードを検索してロードする
blog = Blog.last
```
```ruby:
#blogテーブルから"すべて"のレコードを検索してロードする
blogs = Blog.all
```

```ruby:
def index
flash[:notice] = "きょうは#{Date.today}"
end
```
```ruby:
<% if flash[:notice] %>
<div id="flash" style="color": green; border: green solid">
<%=flash[:notice]%>
</div>
<% end %>
```
```ruby:
def index
flash.now[:notice] = "ようこそ。今日は#{Date.today}です。"
#このメッセージはリクエスト内でのみ有効
end
```
```ruby:
redirect_to :root, :flash => {:error => "IDまたはパスワードが違います。"}
redirect_to :root, :notice => "ようこそ!!"
```
echoでRSAモードでJWTを使う

[JSON Web Token](https://jwt.io/introduction/) (JWT)はマイクロサービスの認証、認可に使える署名付きJSON。ユーザは内容を改ざんできないため、サーバ側に認証ステータスを保持しなくて良いし、検証時に認証サーバにアクセス不要。なので、スケーラブルな認証サービスをJSONのシンプルさを損なわず実装できる。GoogleはOAuth2のトークンに採用しているし、広く採用されている標準と言える。

Echoフレームワークでは、JWT Middlewareを使用可能。[公式のサンプル](https://echo.labstack.com/cookbook/jwt)

公式のサンプルは共有秘密鍵を使った署名であるHMACを使っているが、実際に運用する場合には秘密鍵を個別のマイクロサービスに複製しなくて良い公開鍵暗号方式の署名の方が楽なので、やりかたを調べてみた。

署名方法をRSAにして、JWTWithConfigをミドルウェアに渡してあげるだけ。楽チンですね　:)

``` Go
package main

import (
	"io/ioutil"
	"net/http"
	"time"

	jwt "github.com/dgrijalva/jwt-go"
	"github.com/labstack/echo"
	"github.com/labstack/echo/middleware"
)

func login(c echo.Context) error {
	username := c.FormValue("username")
	password := c.FormValue("password")

	if username == "jon" && password == "shhh!" {
		// Create token
		token := jwt.New(jwt.SigningMethodRS512)

		// Set claims
		claims := token.Claims.(jwt.MapClaims)
		claims["name"] = "Jon Snow"
		claims["admin"] = true
		claims["exp"] = time.Now().Add(time.Hour * 72).Unix()

		keyData, _ := ioutil.ReadFile("sample_key")
		key, _ := jwt.ParseRSAPrivateKeyFromPEM(keyData)
		// Generate encoded token and send it as response.
		t, err := token.SignedString(key)
		if err != nil {
			return err
		}
		return c.JSON(http.StatusOK, map[string]string{
			"token": t,
		})
	}

	return echo.ErrUnauthorized
}

func accessible(c echo.Context) error {
	return c.String(http.StatusOK, "Accessible")
}

func restricted(c echo.Context) error {
	user := c.Get("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	name := claims["name"].(string)
	return c.String(http.StatusOK, "Welcome "+name+"!")
}

func main() {
	e := echo.New()

	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())

	// Login route
	e.POST("/login", login)

	// Unauthenticated route
	e.GET("/", accessible)

	// Restricted group
	r := e.Group("/restricted")

	keyData, _ := ioutil.ReadFile("sample_key.pub")
	key, _ := jwt.ParseRSAPublicKeyFromPEM(keyData)

	r.Use(middleware.JWTWithConfig(middleware.JWTConfig{
		SigningKey:    key,
		SigningMethod: "RS512",
	}))
	r.GET("", restricted)

	e.Logger.Fatal(e.Start(":1323"))
}

```
[古]1>/dev/null 2>&1と2>&1 1>/dev/nullの違い

## 注意!!!
**こちらの記事には、多分に誤りがあります。**
**[修正後のページ](http://qiita.com/hasegit/items/2598963393e0395685f6)をご確認ください。**

せっかくコメントを頂けましたし、自分がどう勘違いしていたかを覚えておくため、
黒歴史として敢えて残しておきます。

## はじめに
「Linuxでコマンドをぶったたいてる時どっちが先だっけ？と迷うヤツ選手権」を開いたら、
恐らく、tarか/dev/nullリダイレクションが優勝すると思います。
ということで、今回は優勝候補の/dev/nullリダイレクションさんについて調べてみます。
順番間違ってても一見行けそうじゃん？と思うけど、実際はいけないんですよね。


## そもそもリダイレクションとか1とか2って何
…の前に、まずは標準出力と標準エラー出力について。

標準出力とは、プログラムのデータの出力先です。通常はディスプレイが出力先です。
標準エラー出力は、エラーメッセージ等に用いられます。こちらも通常はディスプレイが出力先です。

で、1は標準出力、2は標準エラー出力を指すファイルディスクリプタです。
ファイルディスクリプタというのは、OSが標準出力とかを認識するためのIDです。

...ややこいですね。

要するに、lsとかのコマンドをぶったたいた時、lsはコマンドの出力結果を
ディスプレイにぶっ飛ばそうとします。
正常終了した結果なので、1(~~最初は~~標準出力を指す)に飛ばします。

lsの引数に指定したファイルが見当たらないときは「見当たらん！」という
メッセージを、ディスプレイにぶっ飛ばそうとします。
これはエラーメッセージなので2(~~最初は~~標準エラー出力を指す)に飛ばします。

イメージ的にはこんな感じです。

~~![Untitled Diagram (1).png](https://qiita-image-store.s3.amazonaws.com/0/161568/f22873d7-41cc-b5a1-ab00-4d58d5ef2d31.png)~~

そのぶっ飛ばし先を変更するのがリダイレクションです。
あと、/dev/nullは書かれたデータを全部捨てるスペシャルファイルというものです。
ここにぶっ飛ばされたデータは出力されることなく海のもずくになります。

## 正しいほう(1>/dev/null 2>&1)の動作
とにかくディスプレイに何も出力させたくない！全部出力を捨てる！
という時に上記のリダイレクションを使います。

これはすなわち、以下のような感じです。

まず、1の出力先を標準出力から/dev/nullに切り替えて

![Untitled Diagram (2).png](https://qiita-image-store.s3.amazonaws.com/0/161568/780bd01c-ec2f-85f3-6c5d-21026cbf669d.png)

次に、2の出力先を1の出力先(=/dev/null)に切り替えます。
![Untitled Diagram (3).png](https://qiita-image-store.s3.amazonaws.com/0/161568/22bd7f6d-8751-0b17-0f41-45a3d89ca766.png)

これで、両方の出力を無事に捨てることができるわけです。
1というのが、所詮ポインタであって、イコール標準出力ではない、というところがミソです。

## だめなほう(2>&1 1>/dev/null)
ありがちな間違いのほうです。

まず、2の出力先を1の出力先(標準出力)に切り替えて
![Untitled Diagram (4).png](https://qiita-image-store.s3.amazonaws.com/0/161568/1dd26907-39c8-ab6b-ba69-0880f4a271a9.png)

次に、1の出力先を/dev/nullに切り替えます。
![Untitled Diagram (5).png](https://qiita-image-store.s3.amazonaws.com/0/161568/7de10f10-eb62-9cbf-00d9-51af771f631a.png)

…なんということでしょう。エラーメッセージが標準出力に残っちまいました。
1イコール標準出力と勘違いしていると、まず標準エラー出力を標準出力とまとめて、
そのまとまった標準出力をまとめてポイ出来ると思っちゃいますよね。

## 実証
正しいほうで、存在するファイルとしないファイルをlsしてみます。

```
# ls
dada
# ls dada mama 1>/dev/null 2>&1
#
```

ばっちりですね。次、だめなほう。

```
# ls dada mama 2>&1 1>/dev/null
ls: mama にアクセスできません: そのようなファイルやディレクトリはありません
#
```

…これだと標準出力なのか標準エラー出力なのかわからないので、もう一ひねりします。
|(パイプ)は通常、標準出力しか受け取りませんので、それを利用してどっちで出力されてるか判断します。
(蛇足ですが、|&とすると、標準エラー出力も受け取るようになります)

もしgrep mamaをして表示されれば標準出力、表示されなければ標準エラー出力です。

```
# ls dada mama 2>&1 1>/dev/null | grep mama
ls: mama にアクセスできません: そのようなファイルやディレクトリはありません
#
```

標準出力でした。

## 〆
こういった、一見よくわからない記載というのは、
「もう意味とかいいからそのまんま覚えろ！おまじない！」
とよく言われますが、私はおまじないとか言ってはぐらかすのは嫌いなんです。
やっぱり、意味をしっかり理解した上で納得して使わないとね。

…そういう性格のおかげで、調べるのにやたら時間かかったりしますが(笑)
intel edison ネットワークの初期設定作業まとめ

大半が普通にPCでやるのと同じでedison特有でもない作業だけど、メモしておく。

# wifiへの接続
edisonをusbケーブルで接続して、シリアルコンソールでログインする。

```
$ sudo screen /dev/cu.usbserial-A903BYDH 115200
```
Enter2連打くらいするとログインのメッセージが出てくるので、user: root、pass: edisonでログインしてやる。

```
# sudo configure-edison --setup
```
とすると、パスワード、edisonの名前の設定、wifiエンドポイントへの接続ができるので、wifiにつなげてやる。

rootユーザーじゃないのがあったほうがいいので作る。sudoができるようにもしておく。

```
# useradd -m -g users ksyundo
# visudo
# su ksyundo
```

# SSH設定
## 鍵認証設定
逐一書こうかと思ったけど、[この記事](http://qiita.com/gotohiro55/items/36a22516de2b381b3c6e)の通りに設定すれば良いので、する。

## エイリアス設定
sshのconfigにエイリアスを設定してやると楽。

```
$ vim ~/.ssh/config
```
```bash:config
$ vi ~/.ssh/config
Host edison
    HostName xxx.xxx.xxx.xxx
    User ksyundo
    IdentityFile ~/.ssh/id_rsa.pub
```
```
$ ssh edison
```
で接続できるようになる。

# sshfsでマウントする
edisonのホームディレクトリを母艦のディレクトリのように見えるようにマウントしてみる。IDEを使ってedison上でコード書くときに便利かもしれない。

[fuseとsshfs](https://osxfuse.github.io/)をインストールする。

```
$ mkdir /Volumes/edison
$ sshfs edison: /Volumes/edison
```
edisonのホームディレクトリが/Volumes/edisonにあるように見えるようになる。
CanvasGroupとDoTweenでお手軽フェードイン・フェードアウト

![fade.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/c932b76d-e6e6-55ec-ee39-ef0d073faf45.gif)

　Unityでは、uGUIの[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)とアニメーションライブラリ [DoTween](http://dotween.demigiant.com/documentation.php) を用いることで、上のGIFのようなフェードイン・フェードアウトは非常に簡単に実現できます。

　下記にフェードイン・フェードアウトを行うことができる、自作[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)の拡張メソッドを示します。

```
using DG.Tweening;
using UnityEngine;

namespace Murosta.Utility
{
    public static class CanvasGrouopExtensions
    {
        public static Tweener FadeOut(this CanvasGroup canvasGroup, float duration)
        {
            return canvasGroup.DOFade(0.0F, duration);
        }

        public static Tweener FadeIn(this CanvasGroup canvasGroup, float duration)
        {
            return canvasGroup.DOFade(1.0F, duration);
        }
    }
}
```
　以下、[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)のドキュメントより。

> Canvas Group は、個別に処理することなく一ヶ所から UI 要素のグループ全体における特定の機能を与えるのに用いることができます。[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)のプロパティーは、そのコンポーネントがアタッチされているゲームオブジェクトだけでなく、すべての子要素に影響を与えます。

　[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)を使うと、対象ゲームオブジェクトとその子階層のゲームオブジェクトの全てのUIコンポーネントの設定をまとめて行うことができます。設定項目は、Interactableかどうか、Raycastをブロックするかどうか、そしてα値などです。


　さて、アニメーションライブラリ [DoTween](http://dotween.demigiant.com/documentation.php)には、[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)クラスの拡張メソッドとして、`DOFade`というメソッドが定義されており、このメソッドを使うことでCanvasGroupのα値を刻々と変化させることができます。

　このようにUnityでは、uGUIの[CanvasGroup](https://docs.unity3d.com/jp/current/Manual/class-CanvasGroup.html)とアニメーションライブラリ [DoTween](http://dotween.demigiant.com/documentation.php) を用いることで、上のGIFのようなフェードイン・フェードアウトは非常に簡単に実現できます。

 * [キャラクターグラフィック【臼井の会 RPGツクール素材支部】](http://usui.moo.jp/rpg_tukuru.html) 様
 * [エネミーグラフィック【Ｒド】](http://www.geocities.co.jp/Milano-Cat/3319/) 様