OmniAICreator/Qiita-1.07M huggingface dataset:
はじめてiOSアプリ公開申請して個人的にハマったこと及び解決法

全体的な手順は以下のサイトを参考にさせていただいた。
[iOSアプリ申請・公開手順まとめ 〜2016年3月版〜](http://kinsentansa.blogspot.jp/2016/03/ios-20163.html)

## Xcodeからビルド時、"Product>Archive"がグレーアウトしていて押すことができない
* Xcodeのシミュレータを「Generic iOS Device」にしてやる必要がある
* 参考元：[Archiveを選択できず、ipaファイルが作成できない時の対処法](http://qiita.com/naoyashiga/items/14608929a36f5f17e1e0)

## Xcodeからビルド時、"WWDR Intermediate Certificate"というエラーが出る
* 中間証明書がない、もしくは期限切れになっているのが原因
* https://developer.apple.com/certificationauthority/AppleWWDRCA.cer をダウンロード、ダブルクリックしてキーチェーンアクセスに登録
* 期限切れの中間証明書があれば削除する（メニューの「表示」から「有効期限の切れた証明書を表示」としたうえで、"Worldwide"とかで検索すれば見つかる）
* 参考元：[まだAppleの中間証明書で消耗してるの？ (2016/02/15 - iOSアプリをAppStoreへ申請できない、ipaが作成できない問題の解決)](http://qiita.com/koutalou/items/25903ead2b9ef26fa4d9)

## Xcodeでビルド後、アップロードすると、"This action could not be completed. Try again."というエラーが出る
* [このあたり](http://stackoverflow.com/questions/35429801/this-action-could-not-be-completed-try-again-22421/35601072)とかを見ると、再度トライするとできるよ、的なことが書いてある
* 実際、もう一度やったら成功した何だこれ

## バイナリアップロードしたにも関わらず、iTunes Connectの「App 情報>ビルド」項目に反映されない
* ここははっきりとした原因がわからなかった
* 反映までに時間がかかるという情報もあったので待ったが反映されず
* 「審査へ提出」を押してみるが当然ながら通らない
* が、ここで、年齢制限指定の「編集」から、設定をしていなかったことに気づいたため設定
* すると「ビルド」の項目にバイナリアップロードが反映された
Autodesk network license managerをcentosにいれたらエラー

非エンジニアの人も多いかもなので。
```
$ /opt/flexnetserver/lmgrd
-bash: /opt/flexnetserver/lmgrd: /lib64/ld-lsb-x86-64.so.3: bad ELF interpreter: そのようなファイルやディレクトリはありません
```
と怒られたので、
```
$ cd /lib64
$ sudo ln -s ld-2.12.so /lib64/ld-lsb-x86-64.so.3
```
としました。というだけの話。
RAIDまとめ

# **経緯**
- RAID色々あってよくわからない
- 最近Solarisも使ったりしてRAID Zとかもあってよくわからない
- 基本的な部分だけでもまとめないと！！

# **概要**
- RAIDの種類
- RAIDに使うディスクについて

# **RAIDの種類**
## **よくある一般的なRAIDの種類**

|No|種類|重要度|説明|
|:---:|:---:|:---:|:---|
|1|RAID 0|高|**データをブロック単位に分割し、複数のディスクに分散して配置することで読み込み／書き込み速度を向上**<br>・ストライピングとも呼ばれる<br>・データ使用効率がもっとも良い<br>・冗長性を持たないため、ディスクに対する耐障害性がない|
|2|RAID 1|高|**同じデータを二つのディスクに書き込むことで、片方のディスクに障害が発生した場合でも、データが失われない**<br>・ミラーリングとも呼ばれる<br>・データの二重化<br>・システムの高信頼性<br>・容量コストが倍になる<br>・リードパフォーマンスの向上|
|3|RAID 0 + 1|低|**データをブロック単位に分割（ストライピング）し、さらに二つのディスクへ同時に書き込む（ミラーリング）**<br>・RAID 0の高速性とRAID 1の冗長性を組み合わせたRAID方式<br>・容量コストが倍になる<br>・本体とミラーを別々に束ねる|
|4|RAID 1 + 0|高|**二つのディスクにまったく同じデータを書き込み、さらに、データをブロック単位に分割して並列に書き込む**<br>・二つのディスクへ同時書き込む（ミラーリング）を行い、かつ、データをブロック単位に分割（ストライピング）して書き込む<br>・RAID 1の冗長性とRAID 0の高速性を組み合わせたRAID方式<br>・容量コストが倍になるが安全性の高いRAID構成<br>・本体とミラーをセットで束ねる|
|5|RAID 2|低|**データ本体とエラー修正用の冗長コードをそれぞれ複数の専用ドライブに分割して記録する方式**<br>冗長コードには、メインメモリなどで使用されるハミングコードという仕組みが採用されている点が特徴ですが、この仕組みはHDDでは、動作も遅く実用的ではありません。また、データと冗長コードはそれぞれ複数の専用ドライブが必要であり、最小構成の場合でもデータ用2台・修正コード用3台の計5台のHDDが必要となります。そのため、RAID2が採用されているものは、見受けられません。|
|6|RAID 3|低|**データをバイト（ビット）単位で分割して並列に書き込む**<br>・エラー訂正コード（パリティコード）を付加することでエラー訂正／データ復旧を可能にしている|
|7|RAID 4|低|**RAID 4はRAID 3のデータ処理単位をブロック単位にしたもの**<br>・読み出しは高速だが、書き込みはパリティディスクにアクセスが集中するため遅くなる|
|8|RAID 5|中|**RAID 4で固定していたパリティディスクをブロック単位でシフトすることで、パリティディスクへのアクセス集中を防ぐ**<br>・パリティディスク（分散）の採用<br>・ライト時も並列処理が可能<br>・大量、小サイズデータの処理に効果大<br>・独立I/Oアクセス<br>・トランザクション処理に効果大<br>・パリティコード更新時のボトルネック（ライト時）<br>・2回のディスクアクセスが必要<br>・信頼性、可用性<br>・容量コストパフォーマンスの向上<br>・リード時のエラーリカバリ<br>・障害ディスクの再構築|
|9|RAID 6|中|**RAID 5のパリティディスク1台を2台に増やし、同時に2台のディスクが故障した場合もデータ回復が可能**<br>・パリティディスク（分散）2台の採用<br>・ライト時も並列処理が可能<br>・独立I/Oアクセス<br>・トランザクション処理に効果大<br>・信頼性、可用性<br>・RAID 5より信頼性高い<br>・リード時のエラーリカバリ<br>・障害ディスクの再構築|

## **つまり簡単にまとめると**

- とにかく速度重視
**RAID 0**

- とにかく信頼性重視
**RAID 1**

- 速度も信頼性も重視
**RAID 10 > RAID 01**

- 信頼性、可用性、トランザクション処理重視
**RAID 6 > RAID 5**


# **RAIDに使うディスクについて**
## **ディスクによる違い**
- RAIDに用いるディスクには向き不向きがある
- 原則として速度、容量は合わせる
- 遅いディスクにパフォーマンスが引っ張られる


# **参考**
https://hikaku.cman.jp/raid/
PythonコードをNumbaで高速化したときのメモ

#はじめに
[Pythonで書いた移動平均の計算時間を比較してみた](http://qiita.com/toyolab/items/215a943c5cb0c677fa5a)
で、for文を使った移動平均(LWMA)が遅くて使い物にならないことがわかったのですが、MetaTraderのテクニカル指標のなかにはfor文使わないと書けないものもあって、それであきらめるわけにはいかないので、高速化に挑戦してみました。

とりあえず高速化にはCythonがあることは知っていたのですが、コードを書き換えなくてはいけないということだったので、ほかを調べてみたところ、Numbaというのがありました。今回はNumbaを試したときのメモです。

#for文を使ったとても遅いコード

````py
import numpy as np
import pandas as pd
dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                     names=('Time','Open','High','Low','Close', ''),
                     index_col='Time', parse_dates=True)

def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'], 10)
````
    1 loop, best of 3: 3min 14s per loop

[前回の記事](http://qiita.com/toyolab/items/215a943c5cb0c677fa5a)と同じく３分を超えてしまいます。

#Numbaを使ってみる

NumbaはAnacondaに入っているようなので、単にimportして、`@numba.jit`を追加するだけです。

````py
import numba
@numba.jit
def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'], 10)
````
    1 loop, best of 3: 3min 14s per loop

おや、同じ結果。全然効果がありません。Numbaっていうのは名前からしてNumpy専用なのかな？

#pandasをnumpyに変えてみる
入力データがpandasのSeries型だったのをnumpyのarray型に変えてみました。

````py
@numba.jit
def LWMA(s, ma_period):
    y = np.zeros(len(s))
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'].values, 10)
````
    1 loop, best of 3: 2.11 s per loop

こんどは速くなりました。90倍くらい。ただ、scipyの数ミリ秒に比べるとまだまだ遅い。

#if文を除いてみる
コンパイルするにしても、コードはシンプルな方がいいに決まっているので、if文を除いてみました。実はこのif文、あってもなくてもいいコードだったのです。

````py
@numba.jit
def LWMA(s, ma_period):
    y = np.zeros(len(s))
    for i in range(len(y)):
        for j in range(ma_period):
            y[i] += s[i-j]*(ma_period-j)
        y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'].values, 10)
````
    100 loops, best of 3: 5.73 ms per loop

出ました！ミリ秒。for文があってもscipy並みに高速化することができました。やればできるじゃないか、Python。

#まとめ

for文を使って遅くなったコードもNumbaを使うことで高速化できました。ただし、効果があるのはnumpyに対してで、pandasに対しては全く効果はありませんでした。


#参考記事
[NumPyでfor文を使うと遅いと思ったがそんな事はなかったぜ](http://qiita.com/termoshtt/items/d6cf43e777946b3c1d93)
PowerShellを使ってユーザー定義オブジェクトを作成

## 環境
Windows PowerShell 2.0

## コード
New-Object コマンドレットと -Property パラメータ を使用してユーザー定義オブジェクトを作成。

```ps1
# 配列
$arr = @()

# ユーザー定義オブジェクトを追加
$p = @{index=-1; name=""; age=-1}
$arr += New-Object PSObject -Property $p
$arr += New-Object PSObject -Property $p
$arr += New-Object PSObject -Property $p

$arr[0].index = 0
$arr[0].name  = "あいうえお"
$arr[0].age   = 30

$arr[1].index = 1
$arr[1].name  = "かきくけこ"
$arr[1].age   = 18

$arr[2].index = 2
$arr[2].name  = "さしすせそ"
$arr[2].age   = 99
    

# こっちの方がいいかも
# ただし、index が inde とかになっていてもエラーにはならない
<#
$arr += New-Object PSObject -Property @{index=0; name="あいうえお"; age=30}
$arr += New-Object PSObject -Property @{index=1; name="かきくけこ"; age=18}
$arr += New-Object PSObject -Property @{index=2; name="さしすせそ"; age=99}
#>

# 表示
$arr
```

出力

```
name          age      index
----          ---      ----
あいうえお     30       0
かきくけこ     18       1
さしすせそ     99       2
```

----
Windows PowerShell 3.0以上であれば、

```
$c = [pscustomobject]@{index=1; name="あいうえお"; age=30}
```

のようにも記述できるらしい。

## 注意
文字列として展開したい場合、下記のようにすると失敗する。

```ps1
# あいうえお と表示されてほしい
"$arr[0].name"
foreach ($a in $arr)
{
    "$a.name"
}

# 下記のように出力されてしまう
<#
  [0].name
@{name=あいうえお; age=30; index=0}.name
@{name=かきくけこ; age=18; index=1}.name
@{name=さしすせそ; age=99; index=2}.name
#>
```
----

属性を文字列に展開する場合、**\$(\$arr[0].name)** のように記述する必要がある。

```ps1
"$($arr[0].name)"
foreach ($a in $arr)
{
    "$($a.name)"
}

# 出力
<#
あいうえお
あいうえお
かきくけこ
さしすせそ
#>
```

## 参考 
[【改訂新版】 Windows PowerShell ポケットリファレンス](https://www.amazon.co.jp/dp/477415542X)
AmazonLinuxにswapを作成する。

# はじめに
_Amazon Linux_に2048MBのスワップを作成する作業を行います。

その前にまずスワップとは、
> スワップとは、ハードディスクなどの補助記憶装置を利用して使用可能なメモリ容量を増やすOSの機能の一つ。－ IT用語辞典(e-Words)より抜粋

つまり今回で言うとEBSボリュームの一部をメモリとして扱えるようにした領域のことです。

ということで作成してみます。


# 事前確認

```bash:swap確認①
$ free -m
             total       used       free     shared    buffers     cached
Mem:           491        353        138          0          8        294
-/+ buffers/cache:         49        442
Swap:            0          0          0
```

```bash:swap確認②
$ swapon -s
```


# スワップ領域の作成
まず、`dd`コマンドでスワップ用の領域を確保します。

```bash:swap領域作成
$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048k
2097152+0 レコード入力
2097152+0 レコード出力
2147483648 バイト (2.1 GB) コピーされました、 32.0676 秒、 67.0 MB/秒
```

```bash:権限変更
$ sudo chmod 600 /swapfile 
```

作成したら`mkswap`でスワップを作成します。

```bash:swap作成
$ sudo mkswap /swapfile 
mkswap: /swapfile: warning: wiping old swap signature.
スワップ空間バージョン1を設定します、サイズ = 2097148 KiB
ラベルはありません, UUID=88c217dc-d8e0-42f9-b2bc-eb814505b5e3
```

以上で作成が完了しました。


# スワップ領域の有効化
`mkswap`で作成しただけでは利用できません。スワップの作成ができたら`swapon`でスワップ領域の有効化をします。

```bash:swap有効化
$ sudo swapon /swapfile 
```

```bash:swap確認①
$ free -m
             total       used       free     shared    buffers     cached
Mem:           491        485          6          0          4        421
-/+ buffers/cache:         59        432
Swap:         2047          0       2047
```

```bash:swap確認②
$ swapon -s
Filename				Type		Size	Used	Priority
/swapfile                              	file	2097148	0	-1
```


# スワップ領域の無効化
スワップ領域の有効化は`swapon`ですが、無効化は`swapoff`で行います。

```bash:swap無効化
$ sudo swapoff /swapfile 
```


# 自動マウント設定
毎回コマンドでスワップを有効化するのは大変ですので、起動時に自動マウントするように_/etc/fstab_に追記しておきます。

```bash:自動マウント
$ sudo vi /etc/fstab
/swapfile   none        swap    defaults        0   0
```
参考：[Arch Linux - fstab](https://wiki.archlinuxjp.org/index.php/Fstab)

以上で完了です。


# おわりに
かつての物理サーバでは、コストや仕様などの理由で利用出来るメモリに制限がありました。
ただ、今ではクラウドを利用することによって**swapを作成するならそれ以上にメモリを積む**であったり、**一台あたりのパワーを求めるよりスケールアウト**という発想の方が効率的になってきたこともありswapの利用する場面が少なくなっています。
とはいえ、**いざという時のswap**はあっても損じゃないかなと個人的には思います。
matplotlibの２次元マップで色を指定する

matplotlibで色を指定するにはcmapを指定します

```py
import numpy as np
import matplotlib.pyplot as plt

x = np.random.random((100, 100))
plt.imshow(x, cmap="GnBu")
plt.colorbar()
```

![tmp.png](https://qiita-image-store.s3.amazonaws.com/0/30426/5658b190-eac9-745f-bfe4-f5913a1c58de.png)

ここでは`GnBu`（Green-Blueだとおもう）を指定しましたが、他にもさまざまな色が定義されています：
http://matplotlib.org/examples/color/colormaps_reference.html

これらの多くには逆向きの色が用意されています（`_r`を後ろにつける:`gray_r`とか）
複数ホストに一括デプロイするコマンドを作る

複数ホストに一括デプロイするコマンドをわざわざ作ってみた。
subversionと連携してデプロイできるようにする。
rsync前にコピーを作成しバージョン管理することでデプロイ単位でロールバックできるようにもする。
OSはCentOS6.5。
※デプロイ対象ホストへはパスワード無しでssh接続できるように公開鍵を登録しておく。
※pssh、subversionは事前に入れておきリポジトリも作成しておく。
[(参考) pssh-2.3.1をCentOS6.5にインストール](http://qiita.com/a-killer-bee/items/af92bf898625159b17f5)
[(参考) SVNクライアントをyumで簡単インストール](http://qiita.com/a-killer-bee/items/86bfb21c11d82e787dca)

**デプロイタスクの流れ**

| No. | 内容 |
|:-:|:--|
| 1 | デプロイ元ホストのsvn作業コピーの更新(svn up) |
| 2 | デプロイ元ホストのコピー用ディレクトリに作業コピーをコピー |
| 3 | 2.のディレクトリでシンボリックリンク(*_current)を作成 |
| 4 | 3.のディレクトリを元にデプロイ対象ホストにrsyncでデプロイ |

***

1. 一般ユーザーの作成
`# useradd test`
`# passwd test
ユーザー test のパスワードを変更
新しいパスワード:{testpasswd}
新しいパスワードを再入力してください:{testpasswd}
passwd: 全ての認証トークンが正しく更新できました。`
`# su - test`

2. svn作業コピーのチェックアウト
`$ mkdir -p /home/test/svn/apps`
`$ cd ~/svn/apps`
`$ svn co --username test https://svn.example.com:8443/svn/test_app.repo test_app`
`$ svn co --username test https://svn.example.com:8443/svn/test_api.repo test_api`

3. デプロイ元コピー用ディレクトリの作成
`$ mkdir -p /home/test/deploy/apps`

4. デプロイプログラム設定
[sample](https://github.com/a-killer-bee/killer-deploy-tool) ※自己責任の元ダウンロードしてご使用ください。
`# ls -la /usr/local/src/deploy-1.0.1
total 24
drwxrwxr-x  5 root root 4096 Jun 30 12:21 .
drwxr-xr-x. 3 root root 4096 Jun 30 12:22 ..
drwxrwxr-x  2 root root 4096 Jun 30 12:21 bin
drwxrwxr-x  2 root root 4096 Jun 30 12:21 conf
drwxrwxr-x  2 root root 4096 Jun 30 12:21 logs
-rw-rw-r--  1 root root  691 Jun 30 12:21 README.md`
`# ln -s /usr/local/src/deploy-1.0.1 /usr/local/deploy`

5. デプロイプログラムのパスを通す。
`# ln -s /usr/local/deploy/bin/deploy /usr/local/bin/deploy`

6. デプロイ対象ホストリストが無い場合は作成
`# touch /usr/local/pssh/nodelist/{test_app, test_api}`
`# vi /usr/local/pssh/nodelist/test_app
192.168.0.1
192.168.0.2`
`# vi /usr/local/pssh/nodelist/test_api
192.168.0.3
192.168.0.4`

7. デプロイ＆確認
`# deploy test_app
Updating '.':
リビジョン 4 です。
[1] 14:15:47 [SUCCESS] 192.168.0.1
[2] 14:15:47 [SUCCESS] 192.168.0.2
Success: Deploy test_app`
`# ls -la /home/test/deploy/apps/
drwxrwxr-x.  7 test test 4096  4月 13 12:15 2016 test_app.20160413121538
drwxrwxr-x.  7 test test 4096  4月 13 13:11 2016 test_app.20160413131158
drwxrwxr-x.  7 test test 4096  4月 14 14:15 2016 test_app.20160414141545
lrwxrwxrwx.  1 test test   57  4月 14 14:15 2016 test_app_current -> /home/test/deploy/apps/test_app.20160414141545`

終わり
ドットインストール　Vagrant入門

ドットインストールにて[ローカル開発環境](http://dotinstall.com/lessons/basic_localdev_win)・[MySQL](http://dotinstall.com/lessons/basic_mysql_v2)を見た後、その中で出てくるvagrantがよく分からなかったのでVagrant入門を見ました。

その際の**ドットインストールの[Vagrant入門](http://dotinstall.com/lessons/basic_vagrant)の講義メモです。**
見直し用にざっと流れを書いています。

###§1　Vagrantとはなにか？
必要な環境の説明
BirtualBox Vagrantをインストールする

###§2　Boxを取得してみよう
####手順
**１．Box(テンプレート)を取得**
２．仮想マシンを初期化
３．仮想マシンを起動

vagrant box add hashicorp/precise64　ボックスをダウンロード

###§3　vagrantbox.esを使ってみよう
[vagrant box](http://www.vagrantbox.es/) 　必要なボックスを選択
vagrant box add　ボックス追加
bagrant box list　virtualboxに入っているvagrant boxを確認
vagrant box -h　使用可能なコマンドが分かる
vagrant box remove ボックスの削除
./.vagrant.d/boxes　このディレクトリにboxが入っている

###§4　仮想マシンを立ち上げてみよう
１．Box(テンプレート)を取得
**２．仮想マシンを初期化**
**３．仮想マシンを起動**

仮想マシンごとにディレクトリを作る
vagrant init ボックス名　初期化する
vagrant up　vagrantfileがあるフォルダで仮想マシンを立ち上げる

###§5　仮想マシンの停止・再起動・削除
####仮想マシンのコマンド
- status　状態を見る
- suspend -resume　スリープ・復帰させる
- halt -up　終了・立ち上げる
- reload　再起動
- destroy　削除

###§6　仮想マシンに接続してみよう
vagrant ssh　ssh接続で仮想マシンに接続

**webページを作る**
sudo yum -y install httpd　webサーバーをインストール
sudo service httpd start　webサーバーを立ち上げる
sudo chkconfig httpd on　再起動してもwebサーバーが立ち上がるように
sudo service iptables stop　firewallを切る
sudo service iptables off　再起動してもwebサーバーがfirewallが立ち上がらないように

###§7　Webページを表示させてみよう
####webページを表示させる
cd /var/www/html　移動
sudo vi index.html　index.htmlを作成
cat index.html　index.htmlの中身をコマンドラインに表示
vi Vagrantfile　プライベートネットワークを使えるようにコメントアウトをはずす
vagrant reload　設定を変更したので再起動
コメントアウトした行のIPをブラウザでたたくとindex.htmlが表示される

###§8　共有フォルダを使ってみよう
####共有フォルダを使う
Vagrantfileが存在するローカルのディレクトリと仮想マシンにある/vagrantは共有フォルダになっている
touch hoge ファイルを作成
sudo rm -rf /var/www/html　
sudo ln -fs /vagrant /var/www/html　シンボリックリンクを貼る


###§9　Provisioningを使ってみよう (1)
####もう一つ新しい仮想マシンを作る
§4のあと、provisioning をするために
vagrantfileに
```
config.vm.provision :shell, :inline => "echo hello world"
```
と記載。
vagrant up　をすると hello worldとコマンドラインに表示される

###§10　Provisioningを使ってみよう (2)
先ほど記述した文をコメントアウトし、

```
config.vm.provision :shell, :path => "provision.sh"
```

と記述。外部ファイルとして読み込むため。
provision.shというファイルを作成し、

```
sudo yum -y install httpd
sudo service httpd start
sudo chkconfig httpd on
```

と入力する
vagrant provision provisionだけを再実行


###§11　自分でBoxを作ってみよう
####今の環境をboxにする
vagrant package　今の環境をboxにする
vagrant box add hoge package.box　hogeに今作ったpackage.boxの中身をコピー
ls ~/.vagrant.d/boxes　boxの一覧が参照できる
rm package.box　package.boxを消去

####新しい仮想マシンを作る
cd ..
mkdir myBox
cd myBox
vagrant init my_box
vagrant up
####webサーバーが立ち上がっているかを確認
vagrant ssh
sudo service httpd status


###§12　pluginを使ってみよう
vagrant plugin install sahara　saharaプラグインをインストール
vagrant plugin -h　プラグインコマンド一覧を表示
vagrant plugin list　プラグイン一覧を表示
vagrant plugin uninstall sahara　プラグインをアンインストール
###§13　saharaを使ってみよう
####saharaは変更を取り消したり、決定することが出来るプラグイン
vagrant sandbox on　sandboxの状態にする
vagrant sandbox status　sandboxがonかoffか分かる
vagrant sandbox rollback　onの状態に戻る　仮想マシンが動いていると時間がかかるので、vagrant suspendを先に行う。
vagrant sandbox commit　今の状態を決定する　仮想マシンが動いていると時間がかかるので、vagrant suspendを先に行う。
vagrant sandbox off　sandboxの状態をやめる
condaによるポータブルなPython環境構築のすすめ

## 概要

最近はデータ分析などのためにPython環境を手っ取り早く構築する際に[Anaconda](https://www.continuum.io/why-anaconda)がよく使われているようです。

Anacondaおよびそれを最小構成にした[Miniconda](http://conda.pydata.org/miniconda.html)では、付属のパッケージマネージャ[conda](http://conda.pydata.org/docs/)を用いてPython本体を含む環境全体を管理することができます。
従来のPython開発では、次のように用途に応じて個別のツールを使い環境を構築することが必要でした。

* pip: パッケージの管理
* virtualenv | venv: 複数のパッケージを含む環境の管理
* pyenv: Python本体の管理

Anaconda/Minicondaではこれらをcondaのみで行うことが可能です。

* `conda create` でPython本体を含めた環境を作成
* `conda install` でパッケージを追加

チーム開発を行っていたり、成果物を本番サーバで稼働させるような場面では、構築した環境を別のマシンで素早く再構築できると便利です。
pip, pyenvを用いる場合はそれぞれ `requirements.txt` , `.python-version` のようなファイルを用意することでライブラリやPython本体のバージョンを管理していました。
condaでは、環境設定をYAML形式で書き出すことで、そこから簡単に環境を再構築することができます。

以下ではその詳細な方法を解説します。

## Miniconda のインストール

Anacondaは多数のメジャーなパッケージを含めたオールインワンのプラットフォームですが、今回のようにプロジェクト毎に必要最小限の環境を構築したい場合はMinicondaを用いるほうがスマートです。

Minicondaのインストール方法は[こちら](http://conda.pydata.org/docs/install/quick.html)に記載の通り、ダウンロードしたインストーラを起動すれば開始します。

```shell-session
$ bash Miniconda2-latest-MacOSX-x86_64.sh
```

Macの場合は、brew caskでもインストールできます。

```shell-session
$ brew install Caskroom/cask/miniconda
```


以下ではMinicondaがインストール済みであり、condaをはじめとする各コマンドにPATHが通っている状態を想定しています。

## 環境の構築

ここではmyenvという名前でPython3.5の環境を作成してみます。
condaではPython本体とパッケージを環境の構成要素として同等に扱うため、パッケージも同時にインストールすることができます。

```shell-session
$ conda create --name myenv python=3.5 numpy=1.11.1
```

作成した環境を有効化します。

```shell-session
$ source activate myenv
```

追加でパッケージをインストールすることもできます。

```shell-session
$ conda install scipy
```

PyPIに登録されている全てのパッケージがcondaでインストールできるわけではありません。
condaでインストールできないパッケージは、従来通りpipでインストールすることが可能です。
pipはcondaで作成した環境に最初から入っています。

```shell-session
$ pip install peewee
```

## 環境設定の書き出しと再利用

環境を有効化済みの状態で `conda env export` を実行することで、環境設定をYAML形式で書き出すことができます。

```shell-session
$ conda env export > myenv.yaml
```

書き出されたファイルは以下のようになります。
pipでインストールしたパッケージも正しくexportされています。

```yaml:myenv.yaml
name: myenv
dependencies:
- mkl=11.3.3=0
- numpy=1.11.1=py35_0
- openssl=1.0.2h=1
- pip=8.1.2=py35_0
- python=3.5.1=5
- readline=6.2=2
- scipy=0.17.1=np111py35_1
- setuptools=23.0.0=py35_0
- sqlite=3.13.0=0
- tk=8.5.18=0
- wheel=0.29.0=py35_0
- xz=5.2.2=0
- zlib=1.2.8=3
- pip:
  - peewee==2.8.1
```

このファイルさえあれば、別のマシンで同じ環境を簡単に再構築することができます。

```shell-session
$ conda env create --file myenv.yaml
```

## 環境設定ファイルを自分で書く

exportによって書き出された環境設定ファイルには、意図してインストールしたパッケージの依存関係によってインストールされたパッケージも含まれてしまいます。
プロジェクトの構成として直接的に使用するライブラリのみを明示したい場合は、設定ファイルを自分で書く必要があります。

```yaml:myenv.yaml
name: myenv
dependencies:
- python=3.5.1
- numpy=1.11.1
- scipy=0.17.1
- pip:
  - peewee==2.8.1
```

おすすめは、RubyのBundlerにおける `Gemfile` , `Gemfile.lock` に倣い、 `myenv.yaml` には直接的に使用するライブラリのみを記述しておき、これを用いて作成した環境をexportして `myenv.frozen.yaml` のような名前で保存するという方法です。
こうしておけば、`myenv.yaml` を見ればプロジェクトで直接使用するパッケージを把握でき、 `myenv.frozen.yaml` を使えば依存パッケージを含めて全く同じ環境を再構築することができます。

## 参考

* [Conda — Conda documentation](http://conda.pydata.org/docs/index.html)
* [GitHub - conda/conda-env: Provides a unified interface to dealing with Conda environments.](https://github.com/conda/conda-env)
Windows 7 > Windows Update > KB3138612とKB3161664インストール時のひっかかり対処

[Windows7のWindowsUpdateが進まない問題の対処（2016/6）](http://qiita.com/taka379sy/items/1b1f1eb0e2b4594dc561)
を参考にWindows Updateをしてみた。

4つのパッチを適用するのだが、以下の２つのファイル適用時にひっかかった。

- Windows 7 および Windows Server 2008 R2 用 Windows Update クライアント: 2016 年 3 月(KB3138612)
- Windows 7 用セキュリティ更新プログラム (KB3161664) 

それぞれのファイルをダウンロードしてインストール時に「Windows Updateスタンドアロンインストーラー」というダイアログが出てくるが「このコンピュータ上の更新プログラムを検索しています...」という画面から先になかなか進まない。

以下の対処をするとインストールがすぐにできた。

- PCを再起動する
- 再起動直後にインストーラファイルのある場所(ダウンロード）に移動し、インストーラファイルを実行する

再起動が有効だったのか、起動直後に実行したのが有効だったかは切り分けできていない。
（法的に正確な）満年齢を算出する


18歳選挙権で法律的に満年齢に達するのは、誕生日の前日であるという話があって、プログラム的にどうなるのかを実験してみた。

以下のように算出すると、

```php
function getAge($bithday, $date)
{
	$objBirthday = new \DateTime($bithday);
	$objDate = new \DateTime($date);
	$diff = $objDate->diff($objBirthday);
	return $diff->format('%y');
}

var_dump(getAge('2010-06-29', '2010-06-30'));
var_dump(getAge('2010-06-30', '2010-06-30'));
var_dump(getAge('2010-07-01', '2010-06-30'));
var_dump(getAge('2010-07-02', '2010-06-30'));

string(1) "6"
string(1) "6"
string(1) "5" // ここが問題
string(1) "5"
```

法律的には、こちらが正解

```php
function getAge($bithday, $date)
{
	$objBirthday = new \DateTime($bithday);
	$objDate = new \DateTime($date);
	$diff = $objDate->diff($objBirthday->sub(new DateInterval('P1D')));
	return $diff->format('%y');
}

var_dump(getAge('2010-06-29', '2010-06-30'));
var_dump(getAge('2010-06-30', '2010-06-30'));
var_dump(getAge('2010-07-01', '2010-06-30'));
var_dump(getAge('2010-07-02', '2010-06-30'));

string(1) "6"
string(1) "6"
string(1) "6"
string(1) "5"
```
PyOpenSSLのインストール(CentOS 6.7)

#発端
p12ファイルを使った認証を含むpythonスクリプトを走らせたところ、
以下のようなエラーが。

```
[root@localhost home]# python some.py
/略
NotImplementedError:
This library only implements PKCS#12 support via the pyOpenSSL library.
Either install pyOpenSSL, or please convert the .p12 file
```

#PyOpenSSLのインストール（一回目）
なるほど、pyOpenSSLをインストールすればいいのか…

```
[root@localhost home]# pip install pyOpenSSL
/略
 error: command 'gcc' failed with exit status 1
/略
```
失敗。
まさかgccがないとか？

# gccのインストール
```
[root@localhost home]# yum install gcc
/略
完了しました!
```
よし。

# python-devel, openssl-devel, libffi-develのインストール
しかし、もう一回``pip install pyOpenSSL``するとまた同じエラーが。
調べると、python-devel, openssl-devel, libffi-develが必要とのこと。
そこで、

```
[root@localhost home]# yum install python-devel
/略
完了しました!
[root@localhost home]# yum install openssl-devel
/略
完了しました!
[root@localhost home]# yum install libffi-devel
/略
完了しました!
```

#pyOpenSSLのインストール(二回目)
もう一度、``pip install pyOpenSSL``すると

```
Successfully installed cffi-1.7.0 cryptography-1.4 pyOpenSSL-16.0.0
```
ということで、もとのスクリプトも動いた動いた。
よかったよかった。
安装更新swiftlint

June 30, 2016         
 [安装更新swiftlint](https://github.com/willingseal/willingseal.github.io/blob/master/Note-Blog/命令行_小白/安装更新swiftlint.md)
***


###SwiftLint 
是一个用于强制检查 Swift 代码风格和规定的一个工具，基本上以 [GitHub's Swift 代码风格指南](https://github.com/github/swift-style-guide)为基础。

####安装 swiftlint
```
➜  ~ brew search swiftlint
swiftlint
Error: GitHub API Error: API rate limit exceeded for 61.49.105.18. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)
Try again in 21 minutes 43 seconds, or create a personal access token:
  https://github.com/settings/tokens/new?scopes=&description=Homebrew
and then set the token as: export HOMEBREW_GITHUB_API_TOKEN="your_new_token"
➜  ~ export HOMEBREW_GITHUB_API_TOKEN="afeab1e439be9ecb5adddddddd463c5"
➜  ~ brew search swiftlint
swiftlint
➜  ~ brew install swiftlint
==> Downloading https://homebrew.bintray.com/bottles/swiftlint-0.10.0.el_capitan
######################################################################## 100.0%
==> Pouring swiftlint-0.10.0.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/swiftlint/0.10.0: 48 files, 15.2M
➜  ~ brew list
carthage    swiftlint
➜  ~ swiftlint version
0.10.0
```

####更新swiftlint版本
- 查看brew版本号，更新brew版本
- 查看安装的包列表，查看包是否需要更新
- 更新某个包／全部更新
- 删除老的包


```
➜  Brienne git:(master) brew outdated          查看你的包是否需要更新
➜  ~ brew list
➜  Brienne git:(master) brew list --versions          查看你安装过的包列表
carthage 0.16.2
swiftlint 0.10.0
➜  Brienne git:(master) brew upgrade swxftlint     更新某个包swxftlint
Error: swiftlint 0.10.0 already installed

➜  Brienne git:(master) brew -v
➜  Brienne git:(master)  brew --version          查看brew版本
Homebrew 0.9.9 (git revision b2c96; last commit 2016-06-02)
Homebrew/homebrew-core (git revision a74a; last commit 2016-06-03)
➜  Brienne git:(master) brew update          更新brew
Updated Homebrew from b2c9625 to cab97cf.
Updated 1 tap (homebrew/core).
==> New Formulae
。。。

➜  Brienne git:(master) brew --version          查看brew版本（对比老的版本看看）
Homebrew 0.9.9 (git revision cab97; last commit 2016-06-27)
Homebrew/homebrew-core (git revision 44de; last commit 2016-06-29)
➜  Brienne git:(master) brew list --versions
carthage 0.16.2
swiftlint 0.10.0

➜  Brienne git:(master) brew outdated          查看你的包是否需要更新
carthage (0.16.2 < 0.17.1)
swiftlint (0.10.0 < 0.11.1)
➜  Brienne git:(master) brew upgrade          更新包（所有的）
==> Upgrading 2 outdated packages, with result:
carthage 0.17.1, swiftlint 0.11.1
==> Upgrading carthage
。。。
➜  Brienne git:(master) brew list --versions
carthage 0.16.2 0.17.1
swiftlint 0.10.0 0.11.1
➜  Brienne git:(master) brew cleanup          清理旧版本的包缓存（Homebrew 将会把老版本的包缓存下来）
Removing: /usr/local/Cellar/carthage/0.16.2... (44 files, 11.7M)
Removing: /usr/local/Cellar/swiftlint/0.10.0... (48 files, 15.2M)
==> This operation has freed approximately 26.9M of disk space.
➜  Brienne git:(master) brew list --versions
carthage 0.17.1
swiftlint 0.11.1

```
AWS CLIとjqコマンドを使ってHostedZoneNameから登録されているFQDNを検索する方法

```shell-session
 % aws route53 list-resource-record-sets --hosted-zone-id `aws route53 list-hosted-zones-by-name --dns-name example.com. --max-items 1 | jq -r '.HostedZones[] | .Id' | cut -f 3 -d '/'` | jq -r '.ResourceRecordSets[].Name' | grep aws-in | grep momokuri | sed 's/.$//'
momokuri-dev-admin.aws-in.example.com
momokuri-dev-admin01.aws-in.example.com
momokuri-dev-admin02.aws-in.example.com
momokuri-dev-api.aws-in.example.com
momokuri-dev-api01.aws-in.example.com
momokuri-dev-api02.aws-in.example.com
momokuri-dev-db-arbiter.aws-in.example.com
momokuri-dev-db-primary.aws-in.example.com
momokuri-dev-db-secondary.aws-in.example.com
momokuri-dev-factory01.aws-in.example.com
momokuri-dev-search.aws-in.example.com
momokuri-dev-search01.aws-in.example.com
momokuri-dev-search02.aws-in.example.com
momokuri-dev-search03.aws-in.example.com
```

さすがに長過ぎて見づらいので、変数に一度割り当てるとこんな感じ。

```shell-session
 % HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name example.com. --max-items 1 | jq -r '.HostedZones[] | .Id' | cut -f 3 -d '/')
 % aws route53 list-resource-record-sets --hosted-zone-id $HOSTED_ZONE_ID | jq -r '.ResourceRecordSets[].Name' | grep aws-in | grep momokuri | sed 's/.$//'
```
Windowsで WebDAVサーバー をローカルディスクのようにマウントできるツール

最近は、オンラインストレージが多く ファイル共有には WebDAVサーバー というケースも少なくなってきましたが、まだまだ利用されるケースは多いと思います。

しかし、この WebDAVサーバーでもファイルを編集するときに、
1. WebDAVクライアントでサーバーに接続
2. ファイルのダウンロード
3. ファイルの編集
4. ファイルのアップロード
するのは大変ですね。

WebDAVクライアントとして動作し、Windowsのエクスプローラーからファイルを開いたり編集できるものはないか調べて見ました。

Windows OSの WebFolder もありますが、WebDAV実装がいけてない(下記CarotDAV作者 麗さんの受け売り)なので除外します。(Windows 10はまだマシな気がしますが。)

麗の小屋 - WebDAV Client CarotDAV -
http://rei.to/carotdav.html

# 1. WebDAV ドライブマウントソフト(順不同)

#### 1. WebDrive
Map drive letter to FTP, SFTP, WebDAV, S3, Cloud.
https://southrivertech.com/products/webdrive/
$39.95/1年アップグレード
Mac版有り

#### 2. NetDrive
NetDrive - The Network Drive for Windows (FTP, SFTP, WebDAV, Google Drive, Dropbox, Box.com, S3, OneDrive, OpenStack)
http://www.netdrive.net/
5530円/1年アップグレード
Mac版有り
※トライアル終了後も制限有りで利用可能

#### 3. WebDrive
WebDrive - SFTP, WebDAV, S3, OneDrive, Box に対応したマルチクライアント
http://webdrive.add-soft.jp/
※WebDriveの日本語ローカライズ版
9,400円/1年アップグレード

#### 4. ExpanDrive
ExpanDrive for Mac & Windows | SFTP, Dropbox, Google Drive, S3, OneDrive, Box.com, WebDAV, Swift as Network Drive
http://www.expandrive.com/
Mac版有り
$49.95/1年アップグレード
$74.95/永久アップグレード

#### 5. Mountain Duck
Mountain Duck
https://mountainduck.io/
$39.00/
Mac版有り

#### 7. CloudMounter(Macのみ)
CloudMounter - クラウドストーリッジをローカルドライブの様にマウント
http://mac.eltima.com/jp/mount-cloud-drive.html
Mac版のみ

#### 6. Proself Client
Proself Client
https://www.proself.jp/category-options/client/
ドライブマウントソフトはできないが、エクスプローラーから接続できる。
無料

#### 7. Raid近は、オンラインストレージが多く ファイル共有には WebDAVサーバー というケースも少なくなってきましたが、まだまだ利用されるケースは多いと思います。

しかし、この WebDAVサーバーでもファイルを編集するときに、
1. WebDAVクライアントでサーバーに接続
2. ファイルのダウンロード
3. ファイルの編集
4. ファイルのアップロード
するのは大変ですね。

WebDAVクライアントとして動作し、Windowsのエクスプローラーからファイルを開いたり編集できるものはないか調べて見ました。

Windows OSの WebFolder もありますが、WebDAV実装がいけてない(下記CarotDAV作者 麗さんの受け売り)なので除外します。(Windows 10はまだマシな気がしますが。)

麗の小屋 - WebDAV Client CarotDAV -
http://rei.to/carotdav.html

# 1. WebDAV ドライブマウントソフト(順不同)

#### 1. WebDrive
Map drive letter to FTP, SFTP, WebDAV, S3, Cloud.
https://southrivertech.com/products/webdrive/
$39.95/1年アップグレード
Mac版有り

#### 2. NetDrive
NetDrive - The Network Drive for Windows (FTP, SFTP, WebDAV, Google Drive, Dropbox, Box.com, S3, OneDrive, OpenStack)
http://www.netdrive.net/
5530円/1年アップグレード
Mac版有り
※トライアル終了後も制限有りで利用可能

#### 3. WebDrive
WebDrive - SFTP, WebDAV, S3, OneDrive, Box に対応したマルチクライアント
http://webdrive.add-soft.jp/
※WebDriveの日本語ローカライズ版
9,400円/1年アップグレード

#### 4. ExpanDrive
ExpanDrive for Mac & Windows | SFTP, Dropbox, Google Drive, S3, OneDrive, Box.com, WebDAV, Swift as Network Drive
http://www.expandrive.com/
Mac版有り
$49.95/1年アップグレード
$74.95/永久アップグレード

#### 5. Mountain Duck
Mountain Duck
https://mountainduck.io/
$39.00/
Mac版有り

#### 7. CloudMounter(Macのみ)
CloudMounter - クラウドストーリッジをローカルドライブの様にマウント
http://mac.eltima.com/jp/mount-cloud-drive.html
Mac版のみ

#### 6. Proself Client
Proself Client
https://www.proself.jp/category-options/client/
ドライブマウントソフトはできないが、エクスプローラーから接続できる。
無料

#### 7. RaiDrive
RaiDrive
https://www.raidrive.com/

他にご存じの方があれば、コメント欄にでもお知らせ下さい。
ActiveRecordから取得したデータを日付別のハッシュにする


#ありがちなコード
```rb
hash = {}
User.all.each do |u|
  date = u.created_at.strftime('%Y%m%d')
  hash[date] ||= []
  hash[date].push u
end
# {"20160601"=> [#<User:..>...], "20160602" => ... }
```

#Enumerable#group_byを使う
```rb
hash = User.all.group_by{|u| u.created_at.strftime('%Y%m%d') }
# {"20160601"=> [#<User:..>...], "20160602" => ... }
```


Enumerableの機能であるため、ActiveRecordが関係ない場所であっても使える。
集計関数を使う時はActiveRecordのgroupで出来るのだが、それ以外の時はActiveRecordのgroupだけでは解決しにくいので書いてみた。
Amazon EFS へ Windows EC2インスタンスから接続する

Amazon EFS とは
======
EFSはAWSによるマネージドサービスのNFSです。
NFSサーバのお守りをやったことが有る人は、きっと自分ではしたくないはず。
そう、だからこそのマネージドで。

2016年6月29日、みんなが待ってたEFSがついにGAになった！
Auroraと同時に一昨年のre:Inventで発表されたのに１年半以上Previewという過去最長となりましたが、満を持して正式サービスとなりました。
プレビューはバージニアのみでしたが、発表と同時に３リージョンでサービス開始。
バージニア・オレゴン・アイルランドで使用可能です。東京まだかなまだかなー。


目的
=====
そんなEFSですが、NFSv4.1のみの対応で、NFSv2やNFSv3では接続出来ません。
ウィンドウズの標準NFSクライアントはNFSv3までしか対応していません。
このためそのままではEFSへ接続する事ができないのです。
そこで、Windows ServerへNFSv4クライアントを導入してEFSへ接続することを試みます。


前提条件
========
- EFSでFileSystemを作成済みであること
- EFSが利用可能なAZにWindowsServer 2008R2以降のEC2インスタンスを作成済みであること(2012はOK。2003はダメでした)
- 今回は us-west-2(オレゴン)リージョンで作業します。他リージョンも可能です。


1. NFSv4.1クライアントの導入
===========

NFSv4の先駆者であるミシガン大学からWindows用NFSv4クライアントが提供されています。
プロジェクトページはこちら
https://www.cohortfs.com/project/windows-nfs-clients
32bit,64bit版ともに用意されています。


1.1. クライアントのダウンロード
---------------------

今回はOSが64bitなのでx64版をダウンロードします。
上のページからリンクをたどれますが、ファイル直リンクはこちら。
https://www.cohortfs.com/sites/default/files/ms-nfs41-client-setup-x64_0.exe
これをEC2インスタンスの適当な場所に保存しておきます。

1.2. インストール
---------------------

ダウンロードしたファイルを実行します。

```bash:コマンド
ms-nfs41-client-setup-x64_0.exe
```
```text:結果:
      インストーラが起動します。
      注：デフォルトのインストール先は C:\Program Files\NFSv4.1 Client ですが
      後でコマンドプロンプトを使う関係上 C:\BIN など打ちやすいものにした方が良いです。
      インストールを進めていくと最後に再起動が必要である旨の表示が出ます。
      rebootを押し、サーバが再起動されます。
```

再起動を確認したら再度EC2インスタンスへリモートデスクトップでログオンします。


2. NFSクライアントの起動とマウント
===========
2.1. NFSクライアントサービスの起動
---------------------

コマンドプロンプトを開き、以下のコマンドを実行します。
ここでは先のインストール場所を C:\BIN としています。

```bash:コマンド
CD C:\BIN
NET START "NFSv4.1 Client"
```
```text:結果:
      The NFSv4.1 Client service is starting.
The NFSv4.1 Client service was started successfully.
```

最新版では自動的にサービスの登録がされ、再起動時に自動開始されるようです。
この場合、 already started とか出ると思います。それならそれでOKです。


2.2. NFSマウントの実行
-----------------------

マウントする時が来ました。EFSの接続条件を確認しておきます。
EFSのマウントポイントは、AWSマネジメントコンソールを開き
EFS - FileSystem からアクセスしたいFileSystemを選び詳細情報が表示されたら
Mount targets からEC2インスタンスのあるAZの IP address を探してコピーします。
例: 172.31.2.123
これがEFSサーバのIPアドレスになります。

ZドライブにEFSをマウントします。
先ほどから開いているコマンドプロンプトに以下のように入力します。

```bash:コマンド:
nfs_mount Z: 172.31.2.123:/
```
```text:結果(例):
      Successfully mounted 172.31.2.123 to drive Z
```


2.3. 実際にアクセスして動作確認
-----------------

これでドライブZにEFSがマウントされています。
本当にアクセスできているのか確認してみましょう。

```bash:コマンド:
DIR Z:\
```
```text:結果(例):
```
![efs.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/674fab8c-4eae-efe1-a4d1-15099fd5732b.jpeg)

EFSのファイル（ここではhoge）と、とてつもない空き容量が表示されれば成功しています。

```bash:コマンド:
type hoge
```

などと叩けば、EFSのファイルの中身が表示されるはずです。


3. アンマウントの方法
========

nfs_mount -d Z:
のようにしてアンマウントします。


4. EFSとWindowsでの制約事項（既知の問題点）
===========

EFSはNFSv4の全機能を実装しているわけではありません。このWindows NFSv4クライアントもまた。
よっていくつか制約がでてきます。（執筆時点の構成によるものです。改善可能かも）

- ウィンドウズ側からディレクトリを作成すると誰でも読み書き可能なmode 777(drwxrwxrwx)になります。
- ウィンドウズ側からのアクセスは uid:666 gid:777 になります。
- 現在、ウィンドウズ側からファイル新規作成ができない（読取・削除・フォルダ作成は可能）


5. まとめ
===========

ウィンドウズ側からファイルを作成できないため、読み取りのみの運用になってしまいます。
Linux側で作成したファイルをEFSで共有してウィンドウズ側で読み出す。という使い道しかないですよね。
これは今回使用したソフトウェアでcreate file functionが未実装だからです。今後に期待しましょう。
SublimeText3で文字列のボックス選択

業務の都合で、文字列を手で加工することが多いのですが、
Windowsのテキストエディタ「秀丸」でできる文字列のボックス選択がSublimeTextでもできないかなーと思い調べてみました。
## やりたいこと
固定長の文字列の一部分を取得。
例）前からN文字、後ろからN文字、N文字目〜N文字目まで など

## ユースケース
僕の場合は、プログラムコード中から一部文字列を抜き出すときによく使っています。
例えば以下のようなPHPコードがある場合、

```php
$whiteList = array(
					'p4CNLTErGusmG',
					'Rgdl1UNFVRT3U',
					'6eM8AbEz13PmN',
					'kIJ2qt2oQ1sxQ',
					'BlZwBuPQOC1Vk',
					'SxhRgnP4ZBz3l',
					'gJS0b5n3mb0fv',
					'GFqDNzXniAfCy',
					'QcM229n9bn8tP',
					'dVtRwpcAZHYF9',
					'8bgMWU8q9VlIk',
					'C9otUcwLSOlpk',
					'wNUFtElVTXyAY',
					'8SSEXSwJ07GSQ',
					'n5AIBiB6ol1mo',
					'scok9lxCkT6lY',
					'4WBuZURAZCAy1',
					'ohU4o1KlQsjb3',
					'14JA6oDp4oZ1q',
					'HXn8fi4tWxx7b'
				);
```
配列に定義している値部分（シングルコーテーション内）だけを抜き出す等でよく使います。

## 調査方法
[Google先生](https://www.google.co.jp/)に質問
質問ワード：ボックス選択 Sublime

## 調査結果
以下ページをおすすめされました。
> http://www.starlod.net/sublime-text-3-shortcutkey.html
> http://webdesign-workbook.com/sublimetext-useful-shortcut-10/

以降でおすすめされたページを参考にさせていただき、ボックス選択の方法をご紹介します。

## ボックス選択の方法
※SublimeTextにおいては、ボックス選択のことを矩形選択と呼ぶようです。

### 矩形選択（マウス操作）
Windows:Shift+右ドラッグ
Mac:Option+左ドラッグ
### 矩形選択（キーボード操作）
（範囲選択していない状態で）
Windows:Ctrl+Alt+↑or↓
Mac:なし（涙）

## 使ってみた
ユースケースに記載した内容で実際に使ってみました。

![使ってみた](https://media.giphy.com/media/26BRwGsmtXBnRTJwk/giphy.gif)


## 最後に
僕はMacなのでキーボード操作で矩形選択できないのが少し痛いのですが、
マウス操作で可能な事が知れてよかったです。
SublimeTextにはまだまだ便利な機能があると思いますがご参考まで。
rcon Install on CentOS/LinuxAMI


https://github.com/matsumoto-r/rcon

## Download

```bash
cd /usr/local/src
git clone https://github.com/matsumoto-r/rcon.git
cd rcon
```

## Build

```bash
yum install libcgroup libcgroup-devel
yum groupinstall 'Development Tools'
yum install pam-devel
```

```bash
# よくわかってないが、CentOS6/LinuxAMIではcgconfigを起動しないと以下のエラーでうまくいかなかった
# collect2: ld returned 1 exit status
service cgconfig start
```

以下のエラーで失敗するのでcgconfig起動する必要がある

```
....
/vagrant/shared/rcon/mruby/build/mrbgems/mruby-cgroup/src/mrb_cgroup.c:573: undefined reference to `cgroup_set_value_bool'
/vagrant/shared/rcon/mruby/build/mrbgems/mruby-cgroup/src/mrb_cgroup.c:573: undefined reference to `cgroup_strerror'
/vagrant/shared/rcon/mruby/build/host/lib/libmruby.a(mrb_cgroup.o): In function `mrb_cgroup_get_memory_oom_control':
/vagrant/shared/rcon/mruby/build/mrbgems/mruby-cgroup/src/mrb_cgroup.c:596: undefined reference to `cgroup_get_value_bool'
/vagrant/shared/rcon/mruby/build/mrbgems/mruby-cgroup/src/mrb_cgroup.c:596: undefined reference to `cgroup_strerror'
collect2: ld returned 1 exit status
rake aborted!
```

以下のエラーで失敗するのでpam-develが必要

```
configure: error: Cannot compile PAM module without libpam!
rake aborted!
```

```bash
pwd
  # /usr/local/src/rcon/
rake
cp -i mruby/bin/rcon /usr/bin
```

## Check

```bash
# 通常実行だとCPU100%になるコマンドなので注意して実行してください
rcon --user root --command "yes >> /dev/null" --cpu 10
```

## Environment

以下3環境でinstallできることを確認

```
% uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

% cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
```

```
% uname -a
Linux *** 3.14.27-25.47.amzn1.x86_64 #1 SMP Wed Dec 17 18:36:15 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

% cat /etc/issue
Amazon Linux AMI release 2014.09
Kernel \r on an \m
```

```
% cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```
Sublime Text > Comment out > 空白行には//が挿入されない場合の対処

```txt:動作確認
Sublime Text2
Windows 7 pro (32bit)
```

以下のような実装があるとする。

```cpp
String __fastcall SomeFunc(int idx)
{
	String path = GetLocalFilePath(idx);

	String dstDir = ExtractFileDir(path);
	if (DirectoryExists(dstDir) == false) {
        ForceDirectories(dstDir);
	}

	std::unique_ptr<TStringList> sl(new TStringList);
	sl->SaveToFile(path);
}
```

上記に対して、`Ctrl+\`にてコメントアウトすると以下になる。

```cpp
// String __fastcall SomeFunc(int idx)
// {
// 	String path = GetLocalFilePath(idx);

// 	String dstDir = ExtractFileDir(path);
// 	if (DirectoryExists(dstDir) == false) {
//         ForceDirectories(dstDir);
// 	}

// 	std::unique_ptr<TStringList> sl(new TStringList);
// 	sl->SaveToFile(path);
// }
```

タブや空白だけの行の行頭には`//`は挿入されないようだ。
上記のようなコメントを読む場合、本来１つの構造で定義していたものが3つの構造に見えてしまい、ソースリーディングしにくい(少なくとも僕には)。

Sublime Textの設定を変更せずに１つの構造とするには以下の方法だろうか。

1. 各空行において`Ctrl+\`する
2. 関数全部を選択して`Ctrl+\`する

以下のようになる。

```cpp
// String __fastcall SomeFunc(int idx)
// {
// 	String path = GetLocalFilePath(idx);
// //
// 	String dstDir = ExtractFileDir(path);
// 	if (DirectoryExists(dstDir) == false) {
//         ForceDirectories(dstDir);
// 	}
// //
// 	std::unique_ptr<TStringList> sl(new TStringList);
// 	sl->SaveToFile(path);
// }
```

関数まるまるをコメントアウトしたまま残すこと自体がお薦めではないが、そういう状況になった場合は上記のようにすれば読みやすい。
Apache2.4で、アクセス制限の記述方法が変更されていた


# 事象
Apache2.2をyumインストールしていた環境から、Apache2.4環境に移行するために、2.4をソースビルドでインストールしました。

その際に、必要な設定とあわせてバーチャルホストも設定。2.2の設定内容を、そのまま`conf/extra/httpd-vhosts.conf`に記述しました。


```conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
  ServerName sandbox
  ServerAdmin test@example.com
  DocumentRoot /home/sandbox/htdocs/
  ErrorLog /home/sandbox/logs/error_log
  CustomLog /home/sandbox/logs/access_log combined

  <Directory /home/sandbox/htdocs>
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
```

Apacheを再起動してブラウザで開いたところ、無情にもForbiddenが・・・。

```
Forbidden

You don't have permission to access /test.html on this server.
```

ちなみに、error_logには以下の内容が出力されていました。

```
AH01630: client denied by server configuration: /home/sandbox/htdocs/index.html
```

# 原因
### ファイル・ディレクトリのパーミッションを疑う
問題ありませんでした。

### Apacheの設定ファイルの記述ミスを疑う
どうやら、2.2から2.4では、アクセス許可設定の方法が変わっているらしい・・・。以下、変更内容。

```2.2系
<Directory "/home/sandbox/htdocs">
    Order allow,deny
    Allow from all
</Directory>
```

```2.4系
<Directory "/home/sandbox/htdocs">
    Require all granted
</Directory>
```

ここを古い記述にしていることで、今回と同様のエラーが出ている人がたくさんいる様子。なるほど、そうだったのか・・・。

ちなみにhttpd.confを見ると、ルートディレクトリのアクセス制限の記述は、以下のとおり。

```conf/httpd.conf
<Directory />
    AllowOverride none
    Require all denied
</Directory>
```

デフォルトではアクセス制限がかかるようになっています。それじゃ、アクセスできませんね・・・。

#対応

ということで、`httpd-vhosts.conf`に`Require all granted`を追記します。

```conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
  ServerName sandbox
  ServerAdmin test@example.com
  DocumentRoot /home/sandbox/htdocs/
  ErrorLog /home/sandbox/logs/error_log
  CustomLog /home/sandbox/logs/access_log combined

  <Directory /home/sandbox/htdocs>
    Options FollowSymlinks Includes
    AllowOverride All
    AddType text/html .html

    # ここを変更
    Require all granted
  </Directory>
</VirtualHost>
```

Apacheを再起動して、再度ブラウザでアクセス。無事に表示されました。
WebGL(2D) - 入門編 - 4日目: 滑らか(アンチエイリアス)な円を描く

# 目標

なめらかな円を描く(アンチエイリアス)



# 円の設定

```js:study.js
var x = 200; // 中心x座標
var y = 200; // 中心y座標
var r = 80; // 半径
```

# WebGL開始。

```js:study.js
var w = 400; // 幅
var h = 400; // 高さ
var canvas = document.getElementById("canvas");
canvas.width = w;
canvas.height = h;
var gl = canvas.getContext("webgl");
```


# 初期化

```js:study.js
gl.clearColor(1.0, 1.0, 1.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
```


# alphaを有効にする

```js:study.js
gl.enable(gl.BLEND);
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
```


# 空のバッファオブジェクトを生成

```js:study.js
var buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
```

# バーテックス(頂点)シェーダー

```js:study.js
var vSource = [
    "precision mediump float;",
    "attribute vec2 vertex;",
    "void main(void) {",
        "gl_Position = vec4(vertex, 0.0, 1.0);",
    "}"
].join("\n");

var vShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vShader, vSource);
gl.compileShader(vShader);
gl.getShaderParameter(vShader, gl.COMPILE_STATUS);
```

# フラグメントシェーダー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/80502/8917b4c9-d6f9-540e-5787-5d47f987fc59.png)


```js:study.js
var rgba = [0.0, 0.0, 0.0, 1.0]; // Red, Green, Blue, Alpha
var fSource = [
    "precision mediump float;",
    "void main(void) {",
        "vec3 s = vec3("+ x +", "+ (h - y) +", "+ r +");",
        "float x = gl_FragCoord.x - s[0];",
        "float y = gl_FragCoord.y - s[1];",
        "float d = sqrt(x * x + y * y);",
        "float r = s[2] + 0.5;",
        "if (d < r) {",
            "vec4 color = vec4("+ rgba.join(",") +");",
            "float alpha = clamp(1.0 - (d + 1.0 - r), 0.0, 1.0);",
            "gl_FragColor = color * alpha;",
        "} else {",
            "discard;",
        "}",
    "}"
].join("\n");

var fShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fShader, fSource);
gl.compileShader(fShader);
gl.getShaderParameter(fShader, gl.COMPILE_STATUS);
```

# プログラムオブジェクトの生成

```js:study.js
var program = gl.createProgram();
gl.attachShader(program, vShader);
gl.attachShader(program, fShader);
gl.linkProgram(program);
gl.getProgramParameter(program, gl.LINK_STATUS);
gl.useProgram(program);
```

# シェーダー側の変数をjs側で受け受け取る

```js:study.js
var vertex = gl.getAttribLocation(program, "vertex");
gl.enableVertexAttribArray(vertex);
gl.vertexAttribPointer(vertex, 2, gl.FLOAT, false, 0, 0);
```

# 4点の座標をセット

[WebGL(2D) - 入門編 - 3日目: 円を描く](http://qiita.com/ienaga/items/3263a752da3287a6c4b6)

```js:study.js
var x1 = x - r;
var y1 = y - r;

var x2 = x + r;
var y2 = y - r;

var x3 = x - r;
var y3 = y + r;

var x4 = x + r;
var y4 = y + r;

var vertices = [
    (x1-(w/2))/(w/2), -(y1-(h/2))/(h/2),
    (x2-(w/2))/(w/2), -(y2-(h/2))/(h/2),
    (x3-(w/2))/(w/2), -(y3-(h/2))/(h/2),
    (x4-(w/2))/(w/2), -(y4-(h/2))/(h/2)
];
```



# 描画

```js:study.js
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
gl.drawArrays(gl.TRIANGLE_STRIP, 0, vertices.length/2);
```


# 備忘録

[WebGLStudy](https://github.com/ienaga/WebGLStudy)
連番のカラム、変数をBottleのテンプレートで表示する


連番のカラムや変数をBottleのテンプレートで表示する方法

### サンプルクラス

``` python
class Sample(object):
    def __init__(self):
        self.val_1 = 1
        self.val_2 = 2
        self.val_3 = 3
        self.val_4 = 4
        self.val_5 = 5
        self.val_6 = 6
        self.val_7 = 7
        self.val_8 = 8
        self.val_9 = 9
        self.val_10 = 10
```

### テンプレート

```py
% for i in range(1, 11):
    {{ sample.__dict__['val_' + str(i)] }}
% end
```
el.querySelectorはセレクタに自身を含めて検索できる

## はじめに

あるDOM要素を起点に `querySelector` をして、その直下の要素だけを取得したいと思いました。
まずは、素直にこのように書いたのですが、これはエラーになったのでどうすればいいのかな？という話です。

```js
var select = document.querySelector('select.foo');
// "> option" は CSS セレクタの構文として誤っており、エラーになる
select.querySelectorAll('> option');
```


## 結論

```js
var select = document.querySelector('select.foo');

// 自身を含んだセレクタを記述できる
select.querySelectorAll('select.foo > option');

// また、ブラウザサポート範囲は不明だが :scope 擬似セレクタ
select.querySelectorAll(':scope > option');
```


## 検証

このような HTML を用意し、

```html
<!DOCTYPE html>
<html>
  <body>
    <ul class="list1">
      <li class="item1">list1-item1</li>
    </ul>
    <ul class="list2">
      <li class="item1">list2-item1</li>
      <li class="item2">list2-item2</li>
    </ul>
  </body>
</html>
```

Chrome の Console で要素抽出をしてみる。

全体から `.item1` を抽出：

```
document.querySelectorAll('.item1')
> [<li class=​"item1">​list1-item1​</li>​, <li class=​"item1">​list2-item1​</li>​]
```

`.list1` を起点に `.item1` を抽出：

```
document.querySelector('.list1').querySelectorAll('.item1')
> [<li class=​"item1">​list1-item1​</li>​]
```

`.list1` を起点に `.list1 .item1` を抽出：

```
document.querySelector('.list1').querySelectorAll('.list1 .item1')
> [<li class=​"item1">​list1-item1​</li>​]
```

`.list1` を起点に `:scope .item1` を抽出：

```
document.querySelector('.list1').querySelectorAll(':scope .item1')
> [<li class=​"item1">​list1-item1​</li>​]
```

`.list1` を起点に `.list2 .item1` を抽出：

```
document.querySelector('.list1').querySelectorAll('.list2 .item1')
> []
```


## 参考
- [ルート以外からの querySelector の意外な動き](http://var.blog.jp/archives/54689026.html)
- [Selectors Level 4 - 7.5. The contextual reference element pseudo-class :scope](https://www.w3.org/TR/selectors4/#scope-pseudo)
- https://twitter.com/gtk2k/status/748355841393192961 (Twitter経由でいただいたコメント)
c++ builder XE4, 10.2 Tokyo > TFile::Delete() > 指定した Path が無効であったりファイルでない場合には、Delete は例外を発生させます。

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

ファイルを削除するTFile::Delete()について。
TFile::Copy()と同様、例外が発生する場合がある。

XE4のヘルプ
http://docwiki.embarcadero.com/Libraries/XE4/ja/System.IOUtils.TFile.Delete
によると

> メモ：  指定した Path が無効であったりファイルでない場合には、Delete は例外を発生させます。

以下のように使ってみた。

```Unit1.cpp
    // localpathにファイルパスがあるとする

	if (FileExists(localpath) == false) {
		return;
	}

	try {
		TFile::Delete(localpath);
	} catch (...) {
	   /* 例外処理: 必要であれば */		
    }
```

上記FileExists()で例外が出る条件「pathが無効, ファイルでない」は排除されるので大丈夫とは思うが、念のためtry, catchをつけている。


関連 http://qiita.com/7of9/items/92c113b42b4663051a4c
関連 http://qiita.com/7of9/items/78bca6e3c592926c42f4
Xcode 和 Application Loader 的恩怨

最近在處理上傳 app 到 Apple 那端的事情

用 Xcode 在 `Upload to App Store` 那段，每個大步驟就 **只有** 一個有動畫的進度條，每次等了很久完全不知道他在做什麼 :angry::grey_question: 
常常會覺得他是不是又壞掉了 :rage: 

再來因為同公司共用一個 Apple 開發者帳號，憑證會互相誤刪，就失效了（使用方式真的很混亂）
再來 Xcode 只會跟你說你的帳號已經有憑證了，你這台電腦上面沒有

於是就和同事嘗試了 Application Loader 這個東西
除了蘋果官方把 Application Loader 的載點放的很不好找之外
給使用者的回饋真的好很多啊！

他在上傳過程中做了什麼事情，都有更細節的步驟可以查看
還會顯示這個步驟目前為止花了多少時間，比較貼心

後來用 Application Loader 就很順利的上傳完成了 :sparkles:
Windows環境から SSHでポートフォワード(port forwarding)[別名 SSHトンネル]するには何が最適か？

Windows OS で SSHのポートフォワーディングするには何が最適か試してみました。
# 結論を先に
PowerShell/Win32-OpenSSH: Win32 port of OpenSSH
https://github.com/PowerShell/Win32-OpenSSH
がよい。
お勧め。
最強。

バイナリのダウンロードは、こちらから。
Releases · PowerShell/Win32-OpenSSH
https://github.com/PowerShell/Win32-OpenSSH/releases

# 1. ポートフォワードとは。

以下を参照してください。とてもよく分かります。
sshポートフォワーディング - Qiita
http://qiita.com/mechamogera/items/b1bb9130273deb9426f5

# 2. Windowsアプリでポートフォワードできるものにはどういうものがあるか。
#### 1. putty
言わずと知れたSSHターミナルソフト
PuTTY: a free SSH and Telnet client
http://www.chiark.greenend.org.uk/~sgtatham/putty/
PuTTY本体でポートフォワード可能  

#### 2. poderosa
画面分割ができるのでずっと愛用しておりました。
poderosaproject/poderosa: Terminal Emulator Poderosa - Source
https://github.com/poderosaproject/poderosa
Poderosa本体ではないが、SSH PortForwarding Gateway というGUIツールがついてくる。  

#### 3. TeraTerm
シリアル接続は今もこれですね。
Tera Term Open Source Project
https://ttssh2.osdn.jp/
TeraTerm 本体でポートフォワード可能  

#### 4. xshell
最近一押し。
Overview | Products : Xshell 5
https://www.netsarang.com/products/xsh_overview.html
本体のみでポートフォワード可能

※詳しい記事はこちら参照
Windows用高機能sshクライアント Xshell - Qiita
http://qiita.com/gujauja/items/15135ef0eb16cdbdfcce

#### 5. Win32-OpenSSH
ポートフォワード一押し
PowerShell/Win32-OpenSSH: Win32 port of OpenSSH
https://github.com/PowerShell/Win32-OpenSSH

#### 6. Bitvise SSH Client
https://www.bitvise.com/ssh-client
使ったことはありません。

# 3. テスト結果

Win32-OpenSSH以外は、データの転送が激しいと落ちてしまいました。
よって、Win32-OpenSSH に決定。
`すみません。ちゃんとしたベンチマークとかしてなくて。`

# 4. 何がしたかったか。

- お客様のLinuxサーバーのセットアップ
- しかし、サーバーはインターネットにつながっていない。
- サーバにはVPN接続してつなぐしかない。
- VPN接続ツールは、Windows OS用しかない。
- VPN接続ツールは、強制的にデフォルトゲートウェイを奪われてしまう。
- Linuxサーバーは、minimalでインストールされていて何をするにも何もかも足りない。

という、「サーバーセットアップさせたくないの？死ぬの？」
というぐらいサーバーをセットアップしなければならない状況でした。

OSの RPMは、DVDイメージを転送して事なきを得たものの、
Ansibleでセットアップしようにも外部レポジトリが参照できずにいたわけです。
＃RPMファイルを一つ一つダウンロードするのは死んでも嫌だったので。。

しょうがないので、Windowsの隣にプロキシーを動かして、
Windows OSからVPN接続した上で、OpenSSHを使って
SSHのポートフォワーディングをリモートフォワードで接続。
サーバーからリモートフォワード経由でプロキシーを参照
外部レポジトリを読み込ませました。

そして、その時に上記のポートフォワードツールを片っ端から試したのですが、
どれもデータ転送量が増えると落っこちるという感じでした。
唯一生き残ったのが、Win32-OpenSSHでした。