OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 に php-mcrypt をインストールする

php-mcrypt は CentOS 標準の yum リポジトリでは提供されていないパッケージのため、EPEL リポジトリを用いてインストールする必要がある。
（ `yum -y php-mcrypt install` ではパッケージが見つからないとなる。）

以下、 EPEL リポジトリのインストールから php-mcrypt のインストールまでを記載する。

## 環境

* CentOS Linux release 7.1.1503
* 64bit

## EPEL インストール

### RPM ダウンロード

`http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/7/x86_64/e/` にCentOS の EPEL があるので、 RPM をダウンロードする。ダウンロードディレクトリはお好みで。  

※ 今回は執筆時点の最新版 `epel-release-7-5.noarch.rpm` をダウンロードする。 OS の Bit により rpm ファイルは異なるので注意。

```
$ wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
```

### RPM インストール

下記コマンドで RPM パッケージをインストールする。

```
$ sudo rpm -ivh epel-release-7-5.noarch.rpm
```

※　rpm のオプションについて

* -i　 RPMパッケージをインストール
* -h　インストールの進行状況を「#」で表示
* -v　詳細情報を表示

### EPELリポジトリの初期設定

yum コマンドを実行する度に EPEL も使用することになってしまうので、EPEL を無効にして必要時だけ使用するように、下記コマンドで enabled=0 に書き換える。

EPEL をデフォルト無効にするかなどはお好みなので、muniereさんの [CentOSにEPELリポジトリを追加する](http://qiita.com/muniere/items/6c4923a070cbbd824f39) が参考になるかと。

```
$ sudo sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo
```

一応 epel-release のアップデートを行っておく。

```
$ sudo yum --enablerepo=epel -y update epel-release
```

## EPEL リポジトリから php-mcrypt をインストール

やっと本題へ…。
下記のように yum コマンドのリポジトリに EPEL を指定して一発でインストールできるようになっている。

```
$ sudo yum install --enablerepo=epel php-mcrypt
```

## 備考

EPEL をデフォルト無効に設定しているので、 EPEL リポジトリを使用するときは下記コマンドで使用できる。

```
yum --enablerepo=epel <command> <package-name>
```
python / plotly > 入門

Unityでplotlyは使ったことあるが、RPi2でもplotlyが使える。

入門はこちら。api_keyの設定などが書かれている。
https://plot.ly/python/getting-started/

line graphを作るのはこちら。
https://plot.ly/python/line-and-scatter/

ストリーミングでDHT11の温度、湿度をグラフ化するのもいいかもしれない。
RSpec - change の基本動作。 ( by / from / to の使い方 )

## change

単に、状態が変わったことだけを検証する。
「何から何に変わったか」「どれぐらい変わったか」ということは気にしない。

x に 1 を足したら、`change` が成り立つ。

```rb
x = 1
expect { x += 1 }.to change { x }     

# => true
```

x に 2 を足しても、`change` が成り立つ。

```rb
x = 1
expect { x += 2 }.to change { x }

# => true
```

x に 1 を足して、さらに 1 を引いた場合。
状態は変わっていないので、 `change` は成り立たない。

```rb
x = 1
expect { x += 1; x -= 1; }.to change { x }     

# => RSpec::Expectations::ExpectationNotMetError: result should have changed, but is still 1
```

## change.by

値の増減を、相対値で検証する。

値が5増えた場合、 `change.by(5)` が成り立つ。

```rb
x = 1
expect { x += 5 }.to change { x }.by(5)

# => true  
```

値が5減った場合、 `change.by(-5)` が成り立つ。

```rb
x = 1
expect { x -= 5 }.to change { x }.by(-5)     

# => true  
```

増減した後の「絶対値」を検証しているわけではないので注意。
たとえば 3 + 4  を計算した時、`change.by(7)` は成り立たない。

```rb
x = 3
expect { x += 4 }.to change { x }.by(7)

# => RSpec::Expectations::ExpectationNotMetError: result should have been changed by 7, but was changed by 4
```

増えた値は 4 なので、成り立つのは `change.by(4)` だ。

```rb
x = 3
expect { x += 4 }.to change { x }.by(4)

# => true
```


## change.from.to

状態が何から何に変わったのかを検証する。
たとえば `x = 3 + 4` を計算した場合、 値は3から7に変わる。

よって `change.from(3).to(7)` が成り立つ。

```rb
x = 3
expect { x += 4 }.to change { x }.from(3).to(7)

# => true
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
コマンドが完了したりなんかしたら、Android Wear(Apple Watch)に通知する

いろいろ方法は試したけど、一番簡単だった方法。いまさらGrowlかよって気もしたけど、エコシステムに乗っかるため選択。画面とか音とかで完了していることが通知されても、気づかないことが多かったから便利。

## 用意するもの

他のツールの組合せでもできると思うけど、数百円の出費で簡単に用意できるので以下がおすすめ。

- iTerm 2
- [Growl](http://growl.info/)
- [Pushover](https://pushover.net/)(アカウントとモバイルアプリ両方)

### iterm 2の設定
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/4319/dfcb68f2-0836-47b8-0c96-ca425998a65f.png)

好みに応じてAdvancedのTriggerの項目でターミナル上に出力される文字列を正規表現でトリガとしてGrowlに通知することも可能。

### Grwolの設定

![環境設定.png](https://qiita-image-store.s3.amazonaws.com/0/4319/de511b17-3e77-ecbd-bd23-2b6b922c4fd0.png)

Growl側でもiTermとの連携を有効化

![環境設定.png](https://qiita-image-store.s3.amazonaws.com/0/4319/b1ae3414-219e-c9db-db20-df0f29007376.png)

1. [Pushover](https://pushover.net/)に登録してUserKeyを取得
2. Growlへ設定
2. モバイルアプリをインストール
3. Test Settingで通知をテスト
4. Actionsを好みに応じて設定

僕はグローバルには設定せず、iTermだけから通知が来るように設定した。
Python2.xのprint文でunicode文字列のエンコーディングを指定する


Python2.xのprint文は、``unicode``型を``str``型に暗黙変換してから標準出力をします。
``unicode`` --> ``str`` へ変換する際のエンコードは ``locale.getpreferredencoding()`` で決まります。

* [PythonのUnicodeDecodeError、UnicodeEncodeErrorを正しく理解する]
* [file.write() 時の UnicodeError 対策]

## 試してみる

↓MacのTerminalからPython実行してみたとき。

```
>>> import locale
>>> locale.getpreferredencoding()
'UTF-8'

>>> print u'あああ'
あああ
```

↓Windows7のコマンドプロンプトからPython実行してみたとき。

```
>>> import locale
>>> locale.getpreferredencoding()
'cp932'

>>> print u'あああ'
あああ
```

↓EclipseのPyDev ConsoleからPython実行してみたとき。

```
>>> import locale
>>> locale.getpreferredencoding()
'US-ASCII'

>>> print u'あああ'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
```

特殊な環境でasciiだったので ``u'あああ' `` は``UnicodeEncodeError``エラーになります。

## 指定したエンコーディングで変換してほしい

あえてエンコーディングを指定したい場合、以下の方法で出来ます。

```
>>> import sys, codecs
>>> sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

>>> print u'あああ'
あああ
```

## エラーを出さないようにする

バグを隠蔽してしまう可能性大ですが...

```
_ENC_LOCALE = locale.getpreferredencoding()
sys.stdout = codecs.getwriter(_ENC_LOCALE)(sys.stdout, errors='replace')
sys.stderr = codecs.getwriter(_ENC_LOCALE)(sys.stderr, errors='replace')
```


[PythonのUnicodeDecodeError、UnicodeEncodeErrorを正しく理解する]:http://hikm.hatenablog.com/entry/20130328/1364492471
[file.write() 時の UnicodeError 対策]:http://d.hatena.ne.jp/taotao1942/20110921/1316584741
MACへJenkinsをインストール(分散ビルド編)

# MAC(複数台)の分散ビルド

## 前提
- 用意するもの
 - MAC複数台
 - ツール/ライセンスをMAC数分
（私のケースだと「Unity Pro」ライセンスがMAC台数分必要でした）

- できること
 - ジョブ(ビルド)の分散

- できないこと（やり方が分からないので誰か知ってたら教えてほしい）
 - 分散の優先順変更
 - ワークスペースのクリア（後述：カスタムワークスペースとの連携）

## 手順

指示を出すMAC＝<b>マスターMAC</b>
処理をするMAC(たち)＝<b>スレーブMAC</b>
とします。
※ MACのスペック差があるのでしたら、スレーブMAC の方に高スペックを割り当てた方が無難です。

### 1.マスターMACにJenkinsを入れる
### 2.「Jenkinsの管理」-「ノードの管理」-「新規ノード作成」を選択

- 「ダムスレーブ」→「OK」

- 「同時ビルド数」
スレーブMACに同時に任せられるジョブ数
- 「リモートFSルート」
スレーブMACのどこにworkspaceを配置するか
例）/Users/Shared/hoge_mac_slave　どのMACからのスレーブフォルダかわかるようにしておいた方がいいと思う。
- 「用途」
「このスレーブをできるだけ～」とするとマスターMACの全てのジョブをスレーブでやろうとしちゃうので、個人的には「このマシーンを特定のジョブ専用にする」にしておく
- 「起動方法」
「SSH経由で～」にして、「ホスト＝スレーブMACのIPアドレス」、「認証情報＝スレーブMACのログインIDとパスワード」
(※スレーブMACの共有設定-リモートログインに許可をいれておく)

で「保存」

### 3.マスターMACでジョブを作成
- 「実行するノードを制限」

「slave01(※さきほど作ったノード名) || master（自分自身）」
とすると、スレーブMAC→(忙しければ)マスターMACの順にビルドをしてくれる
<b>※これをマスターMAC→(忙しければ)スレーブMAC にできないものか…</b>

これでOK

## Tips

### Unityビルドをする場合
「Unity3d plugin」を入れている場合、
「jenkinsの管理」で「Unity3d」を設定していると思われる。
そのためマスターMACとスレーブMACのUnityの名前と置き場所は同じにしておかないとエラーになる！

| MAC | Unityの名前 | Unityの置き場所 |
|:-----------|------------:|:------------:|
| マスターMAC       |        Unity5.0.2 |     /Application/Unity5.0.2     |
| スレーブMAC     |     |    /Application/Unity502    |

マスターMAC中心で「Unity5.0.2」でビルドと設定していると、スレーブMACの「/Application/Unity5.0.2」フォルダを探してしまう。。。
マスターMACとスレーブMACで置き場所を統一しておかないといけない。

### 上流/下流プロジェクトを使う場合
ジョブAをマスターMACでやってその成果物を使ってジョブBをしてもらうはずが、ジョブBがマスターMACで実行されてしまった！？→そしてエラー…。

ジョブを同じノードで実行するには
「Parameterized Trigger Plugin」
というJenkinsプラグインをインストールしておく

1. 上流ビルドのビルド後の作業に「Trigger build without parameters」で下流ビルドを追加
標準メニューの「他のプロジェクトのビルド」をこっちに置き換える
1. 「Add Parameters」で「Build on the same node」を設定
これで、上流ビルドと同じノード(MAC)で下流ビルドを行ってくれます！

### カスタムワークスペースとの連携
正直文章ではうまく説明できる気がしないのだが・・・。

#### ▼まず、ノードで急にフォルダ構成を変えてくるJenkinsさん。。。

- Jenkins(Master)のデフォルトのワークスペース

```
/{JENKINS_HOME}/jobs/{JOB_NAME}/workspace
```

- Jenkins(slave)のデフォルトのワークスペース

```
/{リモートFSルート}/workspace/{JOB_NAME}
※リモートFSルート：ノード設定で設定したパス
```

<b>What's!?</b> なぜにフォルダ構成を変えるのかJenkinsさんよ・・・・
まあ普通のビルドならそれでも良いです。
ただ、これが<b>カスタムワークスペースと非常に相性が良くない！！</b>(と個人的に思った)

#### ▼具体的な問題
JOB_AAAをJOB_BBBのワークスペースで一緒にやろうとしていた。
マスターだけでやっていた時は、JOB_AAAのカスタムワークスペースに「jobs/JOB_BBB/workspace」と記述するだけで同じワークスペースを使ってくれていた。

しかし、こいつがスレーブ(ノード)で動かすと…
JOB_AAAは「/{リモートFSルート}/jobs/JOB_BBB/workspace」
JOB_BBBは「/{リモートFSルート}/workspace/JOB_BBB」（※ 上記デフォルトのワークスペース参照）
とそれぞれ別のワークスペースで実施されていた。。。

#### ▼最終的にやったこと

- JOB_HOMEという環境変数をマスター(システムの設定)、スレーブ(ノードの設定)で作成。

```master.
JOB_HOME=${JENKINS_HOME}/jobs
```
```slave.
JOB_HOME=/Users/Shared/hoge_mac_slave/jobs
```
- 全てのジョブにカスタムワークスペースを適用

```カスタムワークスペース.
${JOB_HOME}/JOB_BBB(ジョブ名)/workspace
```

こうすることで、マスターのワークスペースを維持した状態で、かつスレーブの意図したところにワークスペースを作成できる
'ある文字'を'指定した文字'で置き換える

"I'm learning Python"の'learning'を'********'で置き換える。(置き換えたい文字数相当数の**)

```py
def censor(text,word):
    x = []
    star = "*"*len(word)
    for i in text.split():
        x.append(i)
    for j in x:
        if j == word:
            x.insert(x.index(word),star)
            x.remove(j)
    return " ".join(x)
    
print censor("I'm learning Python", "learning")
```

別パターン。

```py
def censor(text, word):
    x = text.split()
    for i in x:
        if i == word:
            x[x.index(i)]= "*"*len(word) 
    return " ".join(x)
print censor("I'm learning Python", "learning")
```

がしかし、上記だと処理時間がかかってしまうので、enumerate()を使う方が良い。

```py
def censor(text,word):
    x = []
    star = "*"*len(word)
    for i in text.split():
        x.append(i)
    for index,j in enumerate(x):#here
        if j == word:
            x.insert(index,star)#here
            x.remove(j)
    return " ".join(x)
    
print censor("I'm learning Python", "learning")
```

```py
def censor(text, word):
    x = text.split()
    for index,i in enumerate(x):#here
        if i == word:
            x[index]= "*"*len(word)#here
    return " ".join(x)
print censor("I'm learning Python", "learning")
```

@usai さんありがとうございます！
gmail / office365 > smtp設定が失敗する > サーバ名を outlook-japan.office365.com にする

gmailにおいてoffice365のアカウントからsmtpでメール送信設定をする。

[Microsoft](https://support.office.com/ja-jp/article/POP-%E3%81%BE%E3%81%9F%E3%81%AF-IMAP-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-Office-365-for-Business-%E3%81%BE%E3%81%9F%E3%81%AF-Microsoft-Exchange-%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B-44f951cc-2041-47ed-b674-506889ca9d8b)に記載の以下では設定失敗する (なんたらtimeout)。

- smtp.office365.com : ダメ


[デジタルライブラリ技術研究](http://digilib.net/2015/07/03/office-365%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92gmail%E3%81%A7%E9%80%81%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8B/) にある設定で成功する。

- サーバー名: outlook-japan.office365.com
- ポート: 587
- 暗号化方法: TLS

上記のサーバー名outlook-japan.XXXは`ping smtp.office365.com`で表示されると記載されたブログがあったが、検索しなおして見つからなくなった。そのブログのおかげで解決が早く済んだ。感謝。
ファイルの転送でSCPを使って失敗した話

# ファイルの転送でSCPを使って失敗した話

という訳で某案件で、システムの移行を行ったわけですよ。

システムの移行にあたっては、データの移行ってのが付き物ですよね？

その際のお話です。

## 最初の計画

データの移行にあたって、要件としてデータベースと画像ファイルの移行があります。

サーバ自体も移行をするためこれらのデータのサーバ間の移行が必要でした。

その際に、初めはファイルを保存しているディレクトリごとtarで固めて送る予定だったのですが・・・

**おせぇ・・・全然おわんねぇ・・・**

というのも旧サーバが大分死にかけでサーバ自体を移行する必要が有る状態だったためだったりします・・・

## という訳で

そうだ！**もう圧縮とかせずにSCPで送っちゃおう！**

つーわけで`scp -r`でディレクトリごと転送しました。

まぁ普通ならこれで全ファイル問題なく移行できますよね？**普通なら**

## 起きたこと
**何故か一部ファイルだけ転送されてねぇ・・・**

一部ファイルなので自分で確認した際には特に問題が見当たらず、お客様からのご指摘で判明した次第です・・・。

しかも、再度移行しようとtarで固めようとしたらディスクエラーが出てread onlyになったあげく、諦めて再起動かけようと思ってもなぜか`shutdown - r now`を打って、`REBOOT!`って出てくるのにいっちょん再起動せんしなんなのなんなの！

ま、最終的には、DBに保存されている画像情報を利用して不足分の画像を抽出して1個ずつSCPで取ってくることで何とか事なきを得ました。

## 反省
はじめて知ったんですが、SCPってファイルの欠損とかが起こる可能性とかあるらしいですね。([参考](http://blog.thty.net/entry/2011/11/14/161159))

普通にやる分には問題ないと思うし、こういった問題が出たことはなかったのですが、移行元のサーバが死にかけだったせいか転送出来ていなかったファイルがあったみたいです。

(因みに2,3万程度のファイル中、約50ファイルが移行先で不足していました)

- SCP転送後は、ファイル数にズレがないか確認をすること。(全部送れてる前提にしない)
- しっかり転送を保証したい場合は、rsyncやsftpコマンドを利用した方が良いよね！(でも、このサーバイントラだったおかげでrsyncとかインストールできなかった・・・)
OpenSSLをソースからインストールする手順


OpenSSLをソースからインストールする手順です。
RPM版だとパスだのいろいろややこしくなってやってらんねーぜ!!って時に通る道です。

# インストール環境

インストールするマシンは下記の通り。

+ CentOS 6.5
+ 32bit

インストールするOpenSSLのバージョンは下記の通り。

+ openssl-0.9.8zd


# インストールする

ソースファイルをダウンロードしてインストールします。
ちなみにコンパイル時は ``configure`` じゃなくて ``config`` を使用。

```bash
$ cd /usr/local/src/
$ wget ftp://ftp.openssl.org/source/openssl-0.9.8zd.tar.gz
$ tar -xzf openssl-0.9.8zd.tar.gz
$ cd openssl-0.9.8zd
$ ./config --prefix=/usr/local/openssl shared zlib
$ make
$ make install
```

これでインストール完了。
一応確認してみます。

```bash
$ /usr/local/openssl/bin/openssl version
OpenSSL 0.9.8zd 8 Jan 2015
```

お疲れ様でした。
tvOSでOpenGLを使ってみる


## はじめに

Xcode7.1でtvOSアプリケーションを作れるようになったのだが、なぜか新規プロジェクト作成時にGameを選ぶと、SceneKitとSpriteKitとMetalは選べるのにOpenGLは選べない。

tvOSはOpenGL ESもサポートしているようなので、使えないわけではなさそうだ。
そもそもMetalだとSimulatorで動作確認できないのが辛い。

そんなわけで無理矢理、OpenGLを使ってみた。

## 準備

まず、iOS用のOpenGLプロジェクトを用意します。ここでは新規でGame->OpenGL ESで作成されるサンプルソースを使います。おそらくすでにOpenGLアプリがあるのならそのソースを使ってもビルド出来るのではないかと思います（責任は持たない）。

次に、tvOS用のMetalプロジェクトを用意します。

## 手順

基本的に、iOS用プロジェクトの中身をtvOS用プロジェクトに流用して使います。

１．iOS用プロジェクトからShader.fsh,Shader.vshをtvOS用プロジェクトに持ってきます。新規でファイルを作成して中身だけコピペも良いでしょうし、ファイルごとコピペでも良いでしょう。

２．iOS用プロジェクトのGameViewController.swiftの中身を、tvOS用プロジェクトのGameViewController.swiftにまるごとコピペします。

３．tvOS用プロジェクトのShaders.metalファイルは要らないので削除します。

４．tvOS用プロジェクトのMain.storyboardのViewがMetal用のMTKViewになっているので、GLKViewに変更します。

![スクリーンショット 2015-10-28 14.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/20722/ee20225c-5c7d-01cd-1ff7-7905e8f29898.png "スクリーンショット 2015-10-28 14.11.21.png")

>余談ですが、tvOSではiOSとは違い、frameworkをプロジェクトに含めたりする必要がなさそうな気がします。
>実際、OpenGLもframeworkとか気にしないで動きました。


## ビルド

![スクリーンショット 2015-10-28 14.13.51.png](https://qiita-image-store.s3.amazonaws.com/0/20722/26235e87-038f-a407-4eda-5e31cfc40e57.png "スクリーンショット 2015-10-28 14.13.51.png")

あとはApple TV Simulatorを選んで実行すればシミュレーター上でOpenGLアプリが動きます。

![スクリーンショット 2015-10-28 14.26.09.png](https://qiita-image-store.s3.amazonaws.com/0/20722/f186c5f7-2253-a185-1947-6dd6922811ea.png)

以上。
Ansible で include で渡した変数は遅延評価っぽくなる

**※Ansible 1.9.2 です、2系では試していません**

次のようにプレイブックから別のプレイブックを `include` するときに `ore.msg` を用いた変数 `are` を渡して、

*main.yml*

```yaml
- debug:
    msg: "this is test message"
  register: ore

- include: hoge.yml
  are: "{{ ore.msg }}"
```

インクルードされたプレイブックで `ore` を変更すると `are` にも影響します。

*hoge.yml*

```yaml
- debug:
    msg: "{{ are }}" # "this is test message"

- debug:
    msg: "this is another message"
  register: ore

- debug:
    msg: "{{ are }}" # "this is another message"
```

この例だと *hoge.yml* のインクルードで渡した `are` は、タスクの実行時に `ore.msg` と評価されて、`ore.msg` の指す値に解決されます。

なんとなく、インクルードした時点で `are` は値に解決されるような気がしていたのでちょっとハマりました。

----

`set_fact` で普通の変数として登録しなおせば大丈夫ですが、、、

*hoge.yml*

```yaml
- set_fact:
    are: "{{ are }}"

- debug:
    msg: "{{ are }}" # "this is test message"

- debug:
    msg: "this is another message"
  register: ore

- debug:
    msg: "{{ ore.msg }}" # "this is another message"

- debug:
    msg: "{{ are }}" # "this is test message"

```

当然、インクルード元の `are` に影響してしまいます。

*main.yml*

```yaml
- debug:
    msg: "this is test message"
  register: ore

- include: hoge.yml
  are: "{{ ore.msg }}"

- debug:
    msg: "{{ are }}" # "this is test message"
```
PHP 配列　

以下の配列をforeachを利用して展開したいです。

foreach($hairetu as $key => $value)
としており、$key、$value、$valueの中身どれも必要なのですが
三つのうち二つしか受け取ることができません。
二つとれた場合、残りの一つはarrayとなってしまいます。
なにか良い案はありますでしょうか。

$hairetu=>array(5) {
    [1]=>
  　　  array(6) {
    　　[1]=>
    　　　　string(1) "0"
    　　[2]=>
    　　　　string(1) "0"
    　　[3]=>
    　　　　string(1) "3"
    　　[4]=>
    　　　　string(1) "0"
    　　[5]=>
    　　　　string(1) "0"
    　　[6]=>
    　　　　string(1) "0"
  }
  [12]=>
  　array(6) {
    　　[1]=>
    　　　string(1) "0"
    　　[2]=>
    　　　string(1) "0"
    　　[3]=>
    　　　string(1) "0"
    　　[4]=>
    　　　string(1) "0"
    　　[5]=>
    　　　string(1) "0"
    　　[6]=>
    　　　string(1) "0"
  }
Z.com is 何

# 一行で説明 
GMOのクラウドVPS・共用サーバ・wordpress専用サーバ・ドメイン取得代行
```
またブランドとサービス増やすのかよ
```

## 調べるに至った経緯
GMO運営のwordpress専用サーバ「WP Cloud」を業務にて使用していたところ、「新規受付終了」との不穏な文字が。どうやら10月頭にリリースした新サービス「Z.com」に編入されることと至ったらしい。

https://www.wpcloud.jp/service/gmo-wp-cloud-finished-z-com-wordpress-hosting-start/

>“Z.com”とはGMOインターネットグループの海外戦略統一ブランドです。「すべての人にインターネット」というGMOインターネットグループのスローガンの元で、いままで体験したことがない高品質なドメイン、ホスティングサービスを、気軽にご利用いただけるリーズナブルな価格で提供します。

お、おう。
海外展開もしてるらしく、海外（アメリカ西海岸、シンガポール）リージョンも可能らしい。

## 雑感

### 価格
[z.com cloud 料金](https://cloud.z.com/jp/cloud/pricing/)
[z.com 共用サーバー 料金](https://cloud.z.com/jp/shared/pricing/)
[z.com WordPressサーバー 料金](https://cloud.z.com/jp/wp/pricing/)

実際、リーズナブルだと思う。
（少なくとも今までのGMOのサービスの低価格帯レベルにはなってる）

### 強み
- 共用サーバ、月額1800円以下でSSD容量無制限とかマジなのだろうか。
- WPCloudは鯖側でWordPress本体を強制更新してたのが、手動更新に変更になるらしい。吉と見るか凶と見るか。個人的には吉。
- でも自前でサーバ管理できる組織がWordPress使うなら、WPサーバー契約せずZ.com Cloudに[KUSANAGI](http://kusanagi.tokyo/)入れとけ。対応してるみたいだし。
- 追加料金無しでCPanel使えるというのは、人によっては利点？

### 弱み
- 共用・WordPressサーバにSSLの話が存在しない。共用SSLはセキュリティ的に駄目だし、SSL導入できる奴は別の会社から取得してCloudで使うんだろどうせ、という意志を感じる。もにょる。
  + 2017/03/29追記：世界的な流れで、専用SSL安く出ました。どのプランも1枚月額100円。ワイルドカードはない。
- 固定IPが350円と、若干高くなった（それでも競合他社よりは安いががが）。
- サポートがFAQページとお問い合わせフォームだけ。電話してくるなという意志を感じる。
  + 2017/03/29追記：電話サポート追加されました。ただし平日10:00-18:00。

# で、どうよ
うーん。情報少ない上に表立って宣伝してる感じもないし、どうなんだろうね……。

2017/03/29追記：職場で契約することになりました。使ってみて雑感書きたいですね。
SQL で FROM を使わず、架空のレコードを SELECT する方法

SELECT に、ただ文字列や数字を渡せば良い。

```sql
SELECT 'john', 'programmer', 30;
```

結果：

```sql
+------+-----------+----+
| john | programmer | 30 |
+------+-----------+----+
| john | programmer | 30 |
+------+-----------+----+
```

この架空のレコードに対しても、SQLの構文が使える。
たとえば `AS` でカラム名をつけられる。

```sql
SELECT 'john' AS Name, 'programmer' AS Job, 30 AS Age;
```

結果：

```sql
+------+------------+-----+
| Name | Job        | Age |
+------+------------+-----+
| john | programmer |  30 |
+------+------------+-----+
```

この方法は、SQL 自体の動作確認をするときに便利だ。
（テスト用のデータを作らなくて良いので）



# 環境

- mysql  Ver 14.14 Distrib 5.6.26, for osx10.10 (x86_64) using  EditLine wrapper

# 参考

- http://www.oss-db.jp/measures/dojo_09.shtml

>FROM 句を省略することが可能な RDBMS と省略できない RDBMS があります。
>PostgreSQL、MySQL など主な OSS-DB と一部の商用 RDBMS では省略可能ですが、代表的な商用 RDBMS である Oracle と DB2 では FROM 句を省略できません。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
ClamAV（Clam AntiVirus）の設定方法（CentOS6）

１．um-prioritiesのインストール
初期設定では、yumでclamdをダウンロード出来ない為、
RPMforgeリポジトリを使用出来るようにする。

yum -y install yum-priorities
yum -y install yum-plugin-priorities


２．リポジトリ優先度設定

vi /etc/yum.repos.d/CentOS-Base.repo

標準リポリトジの優先度を最優先＝1に設定する。
 
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
\#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
●「priority=1」を追加する。

\#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
\#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
●「priority=1」を追加する。
 
\#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
\#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
priority=1
●「priority=1」を追加する。

３．RPMforgeリポジトリのインストール

wget http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm --import RPM-GPG-KEY.dag.txt
rm -f RPM-GPG-KEY.dag.txt

※wgetが使用できない場合、wgetをインストールする。
　# yum install wget

パッケージの確認
http://pkgs.repoforge.org/rpmforge-release/

確認したパッケージをダウンロードする。
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

ダウンロードしたパッケージをアップデート
rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
yum -y update rmpforge-release

４．clamAVのインストール

yum -y install clamd

５．ROOT権限で動作するように設定変更
vi /etc/clamd.conf

\#User clamav
●コメントアウトする

６．clamdを起動
 /etc/rc.d/init.d/clamd start

７．Clamdを自動起動設定
chkconfig clamd on

８．ウィルス定義ファイルの更新機能を有効化
sed -i 's/^Example/#Example/g' /etc/freshclam.conf

９．ウィルス定義ファイルを更新
freshclam

10．ウィルススキャン
clamscan --infected --remove --recursive
Pocket WiFi 401HW > youtube > 受信データ通信量: 20MBから30MB

Y!mobileの401HW

Youtubeで動画(音楽もの)を1曲見た時の受信データ通信量: 20MBから30MB

1日3曲みたらだいたい100MB。
3日に1GBの制限に対しては、それほど逼迫はしなさそう。

と思っていたが、15分のcoding関連tutorial動画を見ると100MBほどいくかもしれない。
1日2-3本見ていくと、3日制限にひっかかりそう。

さらに、月の7GB制限には厳しい。

強制値上げになるフレッツをやめて、これ１本でいくとしたら、結局コストが増えるか、tutorial動画の閲覧をもっと制限しないといけなくなる。
Start Developing iOS Apps.Classes and Initializers


#Classes and Initializers

```
オブジェクト指向プログラミングにおいてプログラムの動作は主に、オブジェクト同士の相互作用に基づいています。
クラスとはそのオブジェクトの設計図と考える事が出来ます。
クラスは、プロパティとメソッドを使用してその動作を定義します。
```

#Swiftでのクラスの生成方法

```
クラスで定義する定数と変数 => プロパティ
クラスで定義する関数 => メソッド


class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A sahpe with \(numberOfSides) sides."
    }
}
```


##Swiftでのインスタンス(クラス(設計図)の実体)の生成方法

```
あるクラスのインスタンスを生成する場合、classの名前の後に()を置く
そしてその値をローカル変数shapeに代入する事で、ローカル変数shapeはShapeクラスにメソッドを扱う事が出来る。

var shape = Shape() //インスタンスの生成

shape.numberOfSides = 7 // 変数numberOfShapesに7の値を代入している。

var shapeDescription = shape.simpleDescription() //インスタンス変数shapeを介して、simpleDescriptionメソッドを変数shapeDescriptionに代入している。
```

##Shapeクラスの初期化に関して

初期化はinitという特別なメソッドで構造体とクラスでの初期化の為に使用します。
インスタンス生成時に必ず呼ばれるメソッドです。

```
class NamedShape {
    var numberOfSides = 0
    
    var name: String
    
    init(name: Stirng) {
        self.name = name  /現在のオブジェクトを表す。
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides"
    }

}
```
## "継承"  あるクラスをもとに別のクラスを生成する事 

```
super class = 親クラス
sub class = 子クラス

・子クラスは親クラスで定義されたプロパティ、メソッドをすべて扱う
・親クラスのメソッドをOverride(上書き)出来る
・Override自体を禁止出来る => 親クラスメソッドの前にfinalをつける。
・親クラスのメソッド、プロパティを呼び出す事が出来る。=> superを使う
```

#スーパクラス(親クラス)の記述法

URL http://gawao.hateblo.jp/entry/2015/03/25/002018

```
class サブクラス: スーパークラス {
    //サブクラスで新たにプロパティとメソッドを定義する
}
 ```
 

```
class Square: NamesShape {
    var sideLength: double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
        
    }
    
    func area() -> Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}

let testSquare = Square(sidelength: 5.2, name: "my test square")
testSquare.area()
testSquare.simpleDescription()
```

Squareクラスを初期化する時とは違う3つの点が存在する。
HaskellでAtCoder Beginner Contest 001

Haskellの勉強を兼ねた、完全に個人的な記事になっています。
関数型言語初心者なので、同じようなHaskellビギナーの参考になればいいなぁと思います。
（上級Haskellerのみなさんからアドバイスいただければ嬉しいです！）


## AtCoder Beginner Contest 001
問題はこちら　→　[AtCoder Beginner Contest 001](http://abc001.contest.atcoder.jp/)


### A問題
#### 回答コード
```hs
main = do
  h1 <- readLn
  h2 <- readLn
  putStrLn . show $ h1 - h2
```

#### コメント
- 標準入力を数値で受け取るには`readLn`というIOアクションを使う。
- しかし、1行ずつしか受け取れないので…ウーン……

### B問題
#### 回答コード
```hs
module Main where
import Text.Printf

main = do
  meter <- readLn
  if ((vvTell meter) <= 9)
    then printf "0%d\n" (vvTell meter)
    else printf "%d\n" (vvTell meter)

vvTell :: Int -> Int
vvTell meter
  | meter < 100  = 00
  | meter <= 5000 = v2
  | meter >= 6000 && meter <= 30000 = v3
  | meter >= 35000 && meter <= 70000 = v4
  | otherwise = v5
  where v2 = meter `div` 100
        v3 = meter `div` 1000 + 50
        v4 = ((meter `div` 1000 - 30 ) `div` 5)+80
        v5 = 89
```

#### コメント
演算したいので、実際に扱いたいのは「数値」。
しかしI/Oアクションで扱えるのは`String`の型なので(たぶん？)、少し苦労しました。
結果、とりあえず`readLn`で標準入力を`Int`型で受け取り、そのまま計算。
出力には`printf`を使うことにしました。
C言語系ライクな`printf`が使えるのは嬉しいです笑
でもなんかあんまりHaskellっぽくない…というかHaskellの良さを活かしきれてないきがする……精進します。
ソースコードのコメントを書こう

# はじめに
私はコメントをよく書く人です。
書かないと気がすまない。
そんな人の意見として読んで頂ければと思います。

コメントを書く/書かないの論争でよく言われているのは
「コメントを書かないと読めないようなコードを書くな」
というものです。

これは、コメントを書かない人の意見として言われているものですが
本当に良いコードを書けばコメントは不要なのでしょうか？
私はそうは思いません。

# 英語が読めない
プログラミングは変数名、メソッド名等、英語でかかれている事がほとんどです。
たまにローマ字で書いているものもありますが
特別な理由がない限り、それこそ良くないコードだと思います。

日本人には、英語が読めない人も多いと思います。
こういう時、日本語でコメントが書いてあるのは良いのではないかと思います。
(でも英語はちゃんと読めた方が良いです。私はあまり読めないですが・・・)

# 修正箇所の特定が容易
例えば「開始する」というボタンを押した時の動作を追加したいと思いました。
コメントで「開始するボタンの処理」とか書いてあれば
grepで「開始する」を検索するだけで、目的のコードが見つけやすいはずです。

もし、コメントが書いてない場合は、
 1. その画面のレイアウトが記載されいているファイルを探す
 2. レイアウトから「開始する」ボタンを見つける
 3. ボタンを押した時に呼ばれるコールバック関数を探す
という手順を踏む可能性があり、目的のコードにたどり着くまでに幾分か時間がかかってしまいます。

# 見栄えが良い
これは意見が分かれる所かもしれませんが、パッとコードを見た時の見栄えが良いのではないかと思います。
コメントが非常に少ないコードの場合、コードを読む気がなくなってしまいます。

とあるメソッドを実装しようとした場合、そのメソッドに求められる機能を実現するためには
 1. Aして
 2. Bして
 3. Cした結果を返す
のように、いくつかのステップに分かれる事が多いと思います。

それぞれのステップの先頭にコメントが書いてあれば
こういうステップで実現している事も分かりますし
処理ごとの区切りがはっきり見通しやすいです。

# ソースコード レイアウトの統一化が図れる
C++やJava等、クラスが扱える言語はコンストラクタが存在するはずです。
そのコンストラクタでは各初期化処理が行われますが
例えば、画面表示用のクラスの場合、メンバ変数の初期化をしたり、UIパーツへどのような値を表示するかの設定を行うかもしれません。
(UIクラスはUIがロードされる際のメソッドがあるからそこでやった方が良いとかは、ひとまず置いておいて・・・)

自分はコンストラクタで
1. メンバ変数の初期化
2. UIパーツへの表示設定処理
という順番を守って処理を行っているとします。

```java:
public HogeClass() {
    // メンバ変数初期化
    mData1 = 0;
    mData2 = 5;

    // UIパーツへ表示を反映
    mTextField1.setText(mData1);
    mTextField2.setText("あいうえお");
}
```

そうした時に、上記のようにコメントを書いておくと
別の人が新しい画面を追加してクラスを作った場合、この順番に従って書いてもらえる可能性が高まり
結果、どの画面クラスのコードも、同じようなコードレイアウトになって見通しがしやすいコードになります。

# コメントは簡潔に
長いコメント、主に複数行に渡るコメントはやはりコードの見栄えとしても悪くなってしまいます。
コメントは簡潔に書きましょう。

ただ、コードを見た時に「何故こんなことしているの？」と思ってしまう処理を止む無く書かなければいけないこともあります。
そういう時は説明として長くなってしまう事もありますので、その場合は仕方が無いと思います。

# 関数コメントも書こう
Javaでは、JavaDocでヘルプを生成するためにメソッドの先頭に特定のフォーマットに従ったコメントを書く事があります。
Javaに限らないですが、これは是非やった方が良いです。
細かく引数や戻り値の説明だったり書くのは手間ですので、省略することもありますが
関数コメントを書くことで、これもメソッド間の区切りが分かりやすくなり、コードの見通しが良くなると考えます。

# 終わりに
ソースコードの書き方というのは人それぞれで宗教論争のようなもので、その中にはコメントの是非も含まれます。

ただ、コメントを書かない理由を探すのではなく、書くことでメリットはこんなにあるんだよ。と探す方が楽しいですし
コード自体もより良いものを書くことができるようになるのではないかと思っています。
Google Chromeで？？？？な文字化け

いつからか、こういう文字化けが起こるようになった。
![スクリーンショット 2015-10-28 12.01.26.png](https://qiita-image-store.s3.amazonaws.com/0/11587/9acf8f73-adf8-e991-6d0f-2e14b22434de.png "スクリーンショット 2015-10-28 12.01.26.png")


新しいなーChromeさんどうしたーエンコーディングじゃねぇしなぁー

って最初は笑ってたんですが、
Googleフォーラムとか記事系で結構文字化けしていよいよ困ってました。

で、ちゃんと調べるとCSSで'Open Sans'が指定されている部分のようで
[こちら](http://okdirector.blog.jp/archives/38643689.html)の記事を参考にAdobe Creative CloudのTypeKitからOpen Sansを削除したら直りました。

よかった。
HTTPトンネリングをして通信を行う。

Proxy環境下にて外部サーバにTCPコネクションしてHTTP以外の通信したい場合HTTPトンネリングで通信できる場合がある。

1. プロキシサーバとTCPコネクションを行う。
2. HTTP CONNECTメソッドを送信する。"CONNECT xxx.xxx.xxx.xxx:yy HTTP/1.1CRLFHost:xxx.xxx.xxx.xxx:yyCRLFCRLF
3. 以上でコネクションクローズされていなければプロキシサーバと接続したTCPセッションで相手先サーバとの通信を行うことができる。
テストケース管理ツールを色々試してみたメモ

# Testlink
* bitnami のインストーラを利用
* https://bitnami.com/stack/testlink/installer
* 機能は十分で申し分ない
* ただしUIがモダンじゃない。操作しづらくて煩雑

# Tarantula
* http://www.testiatarantula.com/
* UIが煩雑すぎて辛い

# Impasse
* http://kawasima.github.io/redmine_impasse/
* Redmineのプラグイン
* 一番使いやすい！！
* テスト結果のエクスポートができない。これが辛い
* Redmineで完結できる人は、超オススメ

# Redcase
* https://www.redmine.org/plugins/redcase
* Redmineのプラグイン
* 自分の環境ではバグが出てしまって使えませんでした。残念

# MozTrap
* https://github.com/mozilla/moztrap/
* Mozilla謹製のテストケース管理ツール
* Litmus っていうツールの代替
* ちょっと学習コストはかかるけど、UIがクールで使えるツールだと感じた
* 日本語を扱うと結構エラーで出る
* テスト結果のエクスポートができない

# QABook
* http://www.qabook.com/
* スタンドアロンタイプ
* インストールしたけど、うまく動かなかった。なんでだろ

# Klaros Test Management
* http://www.klaros-testmanagement.com/en/home
* スタンドアロンタイプ
* コミュニティエディションが無料
* 無料だとテスト計画が利用できない模様。つまりテストの再利用が難しそう
* テスト内容と結果はエクスポートできる
* 悪くない
Slack のチャンネルを切り替える最速の方法 ( キーボード操作 )

`Ctrl + k` でスイッチャーが起動できる。

1. 移動したいチャンネル名を入力する
1. キーボードの上下 + Enter で決定

これが一番速い！

![スクリーンショット 2015-10-28 12.15.02.png](https://qiita-image-store.s3.amazonaws.com/0/90607/05625235-262a-1b03-c104-f39448a28dfe.png)


# ヒント

- チャンネル名は先頭から打たなくても良い。 たとえばチャンネル名が **#hobby-game** の場合、後ろの *game* から入力を始めても補完してくれる。
- ハイフンやアンダーバーは書かなくても良い。たとえばチャンネル名が **#cat-food** の場合。catfood (完全につなげて書く) とか cat food (スペースを入れる) とかいう入力で良い。（タイピング数の削減！）
- 特にチャンネル数が増えてくるとこのスイッチャーは威力を発揮する。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
TortoiseGitでpullが出来なくなったけどなんとかなった

出来なくなった現象：
pullをしようとしたら、
>0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487
AllocationBase 0x0, BaseAddress 0x71690000, RegionSize 0x20000, State 0x10000
D:\msys\1.0\bin\sh.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0

と出て、エラーで終わる

メッセージでググると
[MSYSの謎のエラー](http://d.hatena.ne.jp/wantora/20100328/1269761282)
[VistaでMSYSが変なエラーを吐いて突如動かなくなる件](http://d.hatena.ne.jp/kazy/20080310/p1)
[WinAVR and Windows Vista](http://www.madwizard.org/electronics/articles/winavrvista)
なんかよく分からないけどめんどそうだ。

msys-1.0.dllがC:\Program Files\Git\binにあるところまで調べて、めんどくさいからと駄目もとでPCを再起動してからまたpullしてみたら、無事通った。
なんだったのかしら。というか最初に再起動してしまえばよかったのか？？
pullする前にMicrosoft Security Essentialsでクイックスキャンをかけたのだけど、その時にファイルを掴まれたか何かで、起きたのかな？なんて想像してる。
cronを設定したのに、シェルスクリプトが動かない時

以前、サーバーでcronを設定したシェルスクリプトが動かないという問題に当たりました。

調べてみる感じ、cronが動いていない、というよりもスクリプト自体が実行されていないよう。
調べていくと、こちらのサイトで解決する事ができました。

crontabがどうしても動かないときに確認すべき3つの点+α
http://d.hatena.ne.jp/natsumesouxx/20100313/1268479064

確認する事は
1. crondが動いている事。
2. 実行ファイルの権限は正しい事
3. cronのログを確認する

この3つを確認してみるようです。

・まず、1つ目。

```
chkconfig --list crond
crond   0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

2 ~ 5番までonになっているのでこれはOK。

2つ目の実行ファイルの権限が原因でした。

設定しているシェルスクリプトに実行権限が付与されてなくて実行されてなかったみたい。

当然と言えば当然ですが、当たり前すぎて見落としていたのでちょっと解決に時間がかかりました。

念の為、3つ目のログを確認してみると。

```
vim /var/log/cron
```

ファイル自体実行されていないからログは何も出力していないみたいでした。


だいぶ初歩的なところにつまづいてしまってましたが、今後の為にメモとして記録しておきます。
Excel ファイルのウィンドウサイズを保存する方法

超バッドノウハウ。Windows 環境が前提。Mac でどうなるかは知らない。

1. ウィンドウ右上の [最大化] ボックスをクリックして、いったんウィンドウを最大化する。
2. 最大化されたウィンドウのタイトルバーをぐいっと掴んで、最大化を無理やりキャンセルする。
3. ウィンドウ位置を調整する。
4. 保存する。

この作業は、ファイルごとに行うしかない。しかも、既に別の Excel ウィンドウが開いていると、あっさりその既存ウィンドウのサイズを継承してしまうので効かなくなる。

Excel が登場して20年にもなろうというのに、これをデフォルトに設定する手段が未だになく、今後も絶対に行われないであろうところが、Excel の開発元の実力とやる気の度合いをくっきりと示している。Excel憎んで人を憎まず。

参考: http://answers.microsoft.com/en-us/office/forum/office_2013_release-excel/excel-doesnt-open-window-in-size-last-closed/d95f9a61-48da-4304-b30b-557cc1e8d5b5
Windowsのnpm installで串を刺してもコケる場合

Electron-prebuiltのnpmインストールの際に

ECONNREFUSED

というエラーが出ました。

この解決はProxyであることはわかったのですが、
npm set proxy "proxy:8080"を設定しても直りません。

大体がここで回答が終わっているんですね。串の設定、あとはregistryをhttps>httpだよ。はい終わり、みたいな。
海外のスタクオバフロウなんかでもそうです。

終わらねーんだよ。
終わっちゃいけねえんだ。

一度串を外してみた所、違うエラー名が出てくるし、最初からこけてる。
configで串を刺してる状態だと途中まで進み、どうやらnpm外のダウンロード？でコケてる。がヒントでした。

そんなわけで会社の串がそんなに高性能だとも思ってなくて、さぼりながらちょくちょく乗り越えかたを探してたらようやくわかりました。
というかもう、すごい初歩的だった。

http://d.hatena.ne.jp/nyanplus/20120622/1340343289

>プロキシ環境下のネットワークで、コマンドプロンプトからのHTTP/HTTPS接続がうまくいかない時があります。これはIEのオプションで設定したプロキシ設定は、そのままではコマンドプロンプトに反映されないため、です。

え…そうなの？なんで？コマンドプロンプトとGUI部分は別の稼働なの？
それなんのうまみが…。
で、解決はワンライナー

>netsh winhttp import proxy source=ie

は？ソース=アイイーで参照できるってことは半ば参照設定してくださいねみたいな設計やろ？
それ、逆に、逆にやで。
要る？？
勝手に合わせてくれたらええんちゃうん。

おいMS。よう聞けよ。どういう場合想定したらIEの設定とコマンドプロンプトを分離するねん。
そういえば最近Win10のバグ報告で何万円の懸賞金ってみました。

これ、特定のこの仕様が想定した状況がないならバグですよね。お金ください。
それかこんなバカな仕様してる奴の頭殴れるように部長待遇で雇ってください。

ユピカ・ゲイツ　ザ・ヘッドオブマイクロソフト（ダンコガイの真似）
AndroidのCheckboxの枠線色を変更する

Checkboxの枠線の色というのはこれです。

![Screenshot_2015-10-28-10-40-44_png.png](https://qiita-image-store.s3.amazonaws.com/0/15267/8b136277-4ac6-6dbe-91ce-472953727735.png "Screenshot_2015-10-28-10-40-44_png.png")

結論からいうと、`theme` の `textColorSecondary` を変更するだけです。

ただ `textColorSecondary` を変更するとToolbarのアイコンあたりにも影響が出るので、そのへんも含めてメモしておこうと思います。


# themeの変更
`android:textColorSecondary`を変更します。

```theme.xml
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/theme500</item>
    <item name="colorPrimaryDark">@color/theme600</item>
    <item name="colorAccent">@color/accent500</item>
    <item name="android:textColorPrimary">@color/white</item>
    <item name="android:textColorSecondary">@color/grey600</item>
</style>
```

CheckBoxの内部では、`TintManager` というクラスがthemeに基づいて `@drawable/abc_btn_check_to_on_mtrl_000` にいい感じに色をつけてくれます。

また、AndroidStudio1.4から[ThemeEditor](AndroidStudio1.4http://android-developers.blogspot.jp/2015/09/android-studio-14.html)がついたので、テーマのどこを変更したらどこに影響が出るかわかりやすくなりました。Editorを見ながら設定するといいかもしれません。

![Theme_Editor_-_TranslationSample_-____work_private_TranslationSample_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/ba2f8777-bc3c-60e1-d492-fd50744ca40e.png "Theme_Editor_-_TranslationSample_-____work_private_TranslationSample_.png")

参考 : http://qiita.com/katsuki/items/6944d26ca9e372ade1dd

# Toolbarのアイコン色の変更
上記でCheckboxの色は変更されるのですが、Toolbarのアイコンの色も変わってしまいます。
Toolbarのstyleだけ別途設定したい場合は、toolbarにthemeを適用すればOKです。

```style.xml
<style name="Toolbar">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">?attr/actionBarSize</item>
    <item name="android:background">?attr/colorPrimary</item>
    <item name="theme">@style/ToolbarTheme</item>
</style>

<style name="ToolbarTheme">
    <item name="android:textColorSecondary">@color/white</item>
</style>
```

```layout.xml
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    style="@style/Toolbar" />
```
JavaScriptの静的な構文チェックをお手軽に

# ちょっとしたJavaScriptの構文チェック
JavaScriptの場合、単純なスペルミスでも基本的には実行時のエラーで気づくケースが多いかなと思います。そんなミスで時間をムダにしないようにするオンラインサービスです。

## JSHint
コピペで作成したJavaScriptを貼り付けると、定義されていない／利用されていない変数やオブジェクトや、構文ミスを指摘してくれる大変便利なサービス。瞬時にチェックしてます。

URL： [JSHint](http://jshint.com/)

![image](https://qiita-image-store.s3.amazonaws.com/0/77804/339949ad-0baa-6c42-b318-91afc32b979e.png)

上画像では、以下の指摘がされてます。
　・セミコロン忘れ
　・「msg」変数が定義されていない
　・「message」変数が利用されていない

## JSFIDDLE
構文チェッカーというよりも、ちょっとした構文検証なんかで利用できるオンラインJS実行サービスです。htmlやcssはオプション的に使ってますが、jsをちょっと書いてalertを出して確認したり、フォーム操作したりといった使い方になります。jQueryなんかのライブラリをロードした状態での確認もできるので、あまりJSに慣れていない人なんかは使えるのではないかと思います。

URL： [JSFIDDLE](http://jsfiddle.net/)

![image](https://qiita-image-store.s3.amazonaws.com/0/77804/bd1e4d9e-edd3-5a2a-a1f5-a8785430bc95.png)

上画像では、html欄に簡単なフォームタグを書いて、css欄にhtml欄のスタイル記述しています。js欄でhtml欄に記述したタグの値を操作する記述をして「Run」アイコンを押すとresult欄に結果が表示されます。単純にjs欄にalertを書けば、html欄やresult欄を使わなくてもjsの確認ができます。
Kotlinで手軽に文法チェックしたい

簡単な文法チェックをしたい時のためのメモ.

# kotlincを使う

べんりなcompilerとreplがあるのでコレを使う。

```shell-session
$ brew install kotlin
$ kotlinc
Welcome to Kotlin version 0.13.1513 (JRE 1.8.0_25-b17)
Type :help for help, :quit for quit
>>> println("hello world")
hello world
```

# try kotlinで試す

- http://try.kotlinlang.org/

<img width="1166" alt="trykotlin.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/f4e096cb-1a87-9b2a-c488-eaf333f49d56.png">

手軽に試せるの嬉しいですよね。
windows 8.1 > 処理が重い > 「更新を適用して再起動」をする

Windows 8.1を使っていて、どうにも処理が重い時。

スタートメニュー -> 右クリック -> シャットダウンまたはサインアウト -> 右下に「更新を適用して再起動」と表示されていれば、それを選択して再起動する。
(通常は「再起動」となっている。）

![win8.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6a7d02c9-d70d-03fb-37e0-2e651e64e89b.png)

これをしない限り、裏で何かが動いていて遅くなるのが経験上いくつもあった。
PROCESSMAKER WEB2.0 Login

# PROCESSMAKER 画面作成

https://developers.google.com/apps-script/reference/xml-service/xml-service

xmlFilePath = "sample.xml";
$xmlData = simplexml_load_file($xmlFilePath);
$array = json_decode(json_encode($xmlData), true);
var_dump($array);

# PROCESSMAKER SOAP LOGIN

#ROUTING ERROR CHECK

```login:xmlparse
javascriptでログインしてXMLをパースする
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>

xml = '<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.processmaker.com"><env:Body><ns1:loginResponse><ns1:status_code>0</ns1:status_code><ns1:message>557234039562f8d61c74302007690088</ns1:message><ns1:version>2.0</ns1:version><ns1:timestamp>2015-10-27 10:42:41</ns1:timestamp></ns1:loginResponse></env:Body></env:Envelope>';
var textAfter = xml.replace(/ns1:/g,"");
textAfter = textAfter.replace(/env:/g,"");

//$(xml).find('item').each(disp);
var parser, xmlDoc;
var text = "<bookstore><book>" +
"<title>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book></bookstore>";

parser = new DOMParser();
xmlDoc = parser.parseFromString(textAfter,"text/xml");

document.getElementById("demo").innerHTML =
xmlDoc.getElementsByTagName("timestamp")[0].childNodes[0].nodeValue;
</script>

</body>
</html>

```

（uniq関数は http://stackoverflow.com/q/7651/454997 より引用）

```ruby:uniq.rb
p [1, 1, 2, 3, 3].uniq
```
...test:aaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
...

（uniqにブロックを与える書き方は http://ruby-doc.org/core-2.2.0/Array.html を参照）
CSVファイルを取り込む(HTML、jQuery、PHP)

#CSVファイルを取り込む

***フォームからCSVファイルを取り込んで、読み込んだCSVデータをDB登録する。***

・参照ボタンをクリックして取込みファイルを選択後、取込みボタンをクリックでDB登録という処理。

![スクリーンショット 2015-10-28 10.22.26.png](https://qiita-image-store.s3.amazonaws.com/0/97158/4ff52ed6-fa4b-0217-1783-82bdd88468d2.png)

実装サンプルはこんな感じ。
当たり前ですがjQueryのライブラリは読み込んでおく。

```lang:importCsv.html
<form id='csv' class="form-horizontal">
    <div class="form-group">
        <label class="col-md-2 control-label" for="file_input">取込ファイル</label>
        <div class="col-md-6">
            <input id="fake_input_file" onclick="$('#file_input').click();" 
                readonly="readonly" type="text" value="" class="form-control input-sm" 
                maxlength="12" >
            <input id="file_input" onchange="$('#fake_input_file').val(files[0].name)"
                 style="display: none;" class="form-control input-sm" type="file">
        </div>
        <div class="col-md-2">
            <input onclick="$('#file_input').click();" 
                class="btn btn-default btn-sm btn-block open" type="button" 
                value="参 照">
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-2 col-md-push-8">
            <input type="button" class="btn btn-primary btn-sm btn-block import_csv"
                value="取 込" id="import_csv">
        </div>
    </div>
</form>
```
PHP側では以下のように処理する。

```lang:importCsv.php
    //取り込んだファイルを受け取る
    $file = file($_FILES['file']['tmp_name']);

    //ファイルをエンコード
    mb_convert_variables("UTF-8", "SJIS", $file); 

    //ここから先はそれぞれの仕様、設計、要件に合わせた形で実装してくださいｍ(＿ ＿)ｍ
    //１行づつ取り出し、登録
    foreach ($file as $line) {
        //csvの１行を配列に変換する
        $line_list = explode(',',$line);
        //DBに登録
        .....
        .....
    }
```


やり方が分かればお作法的に出来ますね。

※開発環境や文字コードが異なる場合はそれぞれの環境に合わせて対応してください。
Camera2 で視野角

Camera2 で[視野角 (画角)](https://ja.wikipedia.org/wiki/%E7%94%BB%E8%A7%92) を取得するにはどうすればいいかというご質問を頂いたのでお答えします。

`Camera.Parameters` の `getHorizontalViewAngle()` や `getVerticalViewAngle()` を使って簡単に角度が取得できた以前の Camera API とは違って、新しい Camera2 API では少し込み入った計算を行う必要がありますが、そのぶん柔軟性の高い対応が可能です。


# 説明

焦点距離を $f$ とし、センサーの物理寸法 (幅または高さ) を $d$ としたとき、視野角 $\alpha$ は以下の式で求めることができます。

```math
\alpha = 2 \arctan \frac {d} {2 f}
```

焦点距離は [CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#LENS_INFO_AVAILABLE_FOCAL_LENGTHS) で取得できます。配列の形で返されますが、入っている要素は 1 つです。光学ズームをサポートしたカメラでは複数の要素が返されますが、現状そのようなデバイスは存在しません。

センサー全体の物理サイズは 
[CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_PHYSICAL_SIZE) で取得できます。単位はミリメートルです。

画像処理を目的とする場合には必ずしも画素配列全体を利用するわけではありません。ほとんどのセンサーでは端に余分な画素があります。完全な領域は 
[CameraCharacteristics.SENSOR_INFO_PIXEL_ARRAY_SIZE](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_PIXEL_ARRAY_SIZE) で取得できますが、画像 (写真) を生成する上で有効な領域は [CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE](https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_ACTIVE_ARRAY_SIZE) で取得できます。

もし [CaptureRequest.html.SCALER_CROP_REGION](https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.html#SCALER_CROP_REGION) を使ってデジタル ズームを適用しているのであれば、それも勘案に入れる必要があります。

最後に、出力と切り取り領域のアスペクト比が一致しない場合は、FOV がさらに狭められている可能性があります。[こちらのダイアグラム](http://source.android.com/devices/camera/camera3_crop_reprocess.html)を参考にしてください。

# 例

以下のような CameraCharacteristics を持った端末を考えます。

```
焦点距離 = 3 mm
画素配列の物理サイズ = 3 x 2 mm
画素配列の画素数 = 3200 x 2132
有効な配列領域 = 上 100, 左 100, 幅 3000, 高さ 2000
切り取り領域 = 0, 0, 3000, 2000 (フルサイズ)
```

また、出力は以下に設定しているとします。

```
出力ストリーム = (1980, 1080) [1080p 16:9]
```

この 1080p 出力における、横と縦両方の FOV を求めるには、

```
出力のアスペクト比 = 16:9
切り取り領域のアスペクト比 = 3:2
```

16/9 > 3/2 なので 出力ストリームの面積を最大化するためには縦に切り取る必要があります。

```
出力ストリームの横方向の画素数 = 切り取り領域の幅 = 3000
出力ストリームの縦方向の画素数 = 「横」方向の画素数 / (16 / 9) = 1687

出力ストリームの横方向の物理サイズ = センサー幅 * 出力画素幅 / 画素配列幅 = 3 mm * 2667 / 3200 = 2.5 mm
出力ストリームの縦方向の物理サイズ = センサー高さ * 出力画素高さ / 画素配列高さ = 2mm * 200 / 2132 = 1.88 mm
```

よって

```
横 FOV = 2 * arctan (2.5 mm / (2 * 3 mm)) = 45.2 度
縦 FOV = 2 * arctan (1.88 mm / (2 * 3 mm)) = 34.8 度
```

以上です。
テキストボックスの変更感知(jQuery)

どうでも良いんだけど、テキストボックスの変更感知をしてインクリメンタルサーチとかをするときにイベントがいまいち拾えなかったのでメモ。

```coffeescript
  $(document).on 'input change keyup', '#id', ->
    # テキストに文字が入っているかどうか？
    if $(@).val().length > 0
      # テキストが入っている場合の処理
    else
      # テキストが入ってない場合の処理
```

複数のイベントを捕まえれば入力中の文字列も拾える。


## JSのみで検索する場合。
[jquery-searcher](http://lloiser.github.io/jquery-searcher/)を使うとJSだけの検索がやりやすかった。
上記のメモはこのコードの中を読んで知った。
Kotlin Android Extensionsをつかってみる。

#まえがき
Android DevelopのトレーニングをKotlinでやってみる -Building Your First App[2]-
http://qiita.com/kamedon39/items/73f956dcc0cf1811b6bc
の番外編です

#Kotlin Android Extensions
https://kotlinlang.org/docs/tutorials/android-plugin.html
Kotlinでレイアウトからviewを簡単にアクセスできる方法があります。
null安全でとっても便利。もちろん補完ききます！

##インストール
1. android studioにkotlin-android-extensions をインストール
   Settings->Plugins->Install JetBrains plugin ->kotlin-android-extensions(検索などで) ->Download and Install->Apply->Restart

2. app/build.gradleにkotlin-android-extensionsを記述
   KotlinをAndroid Studioに自動設定してる場合、+の部分を追加するだけ。

```diff
buildscript {
    ext.kotlin_version = '1.0.0-beta-1038'
    repositories {
        mavenCentral()
    }
    dependencies {
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}
repositories {
    mavenCentral()
}
```

##利用法
>import kotlinx.android.synthetic.\<layout\>.*

\<layout\>はsetContentViewしてるlayout名です
するとid名の変数が作られ、しかもnot null。
すごい便利です。しかもちゃんとキャストまでしてくれる賢いやつです。
レイアウトの修正した時などに、間違って使ってるviewけしちゃってもすぐ気づけます！

例：

```kotlin
import kotlinx.android.synthetic.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btn_send.setOnClickListener({ view -> Log.d("MainActivity", "click: btn_send") })
    }
}
```

#比較
##前提
```xml
<Button
    android:id="@+id/btn_send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"/>
```

##JAVA

###findViewById
```java
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Log.d("MainActivity", "click: btn_send") 
            }
});
```
###xml直記述
```xml
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="clickSend" />
```

###butterknife
```java
    @OnClick(R.id.btn_send)
    void clickSend(View v) {
      Log.d("MainActivity", "click: btn_send") 
    }
```

##Kotlin
###findViewById
```kotlin
   findViewById(R.id.btn_send).setOnClickListener { view -> Log.d("MainActivity", "click: btn_send") };
```
###KotterKnife
```kotlin
 val btnSend: Button by bindView(R.id.btn_send)

 btnSend.setOnClickListener({ view -> Log.d("MainActivity", "click: btn_send") })
```

###Kotlin Android Extensions
```kotlin
import kotlinx.android.synthetic.activity_main.*

btn_send.setOnClickListener({ view -> Log.d("MainActivity", "click: btn_send") })

```

##github
https://github.com/kamedon/KotlinAndroidTraining
DELL > テクニカル電話サポート > 0120-912-738 / サービスタグによる保証の確認

電話サポートのページ (いつも見つけにくい)

[テクニカル電話サポート](http://www.dell.com/support/incidents/jp/ja/jpbsd1/Phone/GetPhone?ServiceTag=HSTC9V1&SaveAsDefault=False&InvalidValue=False)

> ハードウェアサポート
0120-912-738
24時間365日
24時間365日

サービスタグによる保証の確認
http://www.dell.com/support/home/jp/ja/jpdhs1


10台購入したノートPCのうち4台がHDDが認識しなくなるという故障(うち、1台は修理後に再度故障)。
DELLやめたい。
RSS フィード (XML) のエラー「PCDATA invalid Char value XX」対処方法 (PHP編)


## ブログ記事 & 最新情報

最新情報があります。こちらからご覧いただけます。
http://ja.katzueno.com/2015/10/3517/

## 本文

直感的な操作が売りの CMS である「[concrete5](http://concrete5-japan.org/)」の古いバージョンで RSS フィードがうまく表示されないという問題がありました。

原因は UTF8 だけど、XML では使えない文字列が存在していたので、RSS Feed リーダーでエラーが出ていたのでした。

テキストも UTF8 にきちんとエンコーディングして、文字列も
`<?xml version="1.0" encoding="UTF-8"?>`
と指定しているのに

Chrome で
`PCDATA invalid Char value XX. Below is a rendering of the page up to the first error.`

というエラーが表示され、正常に XML が表示されなくなっていました。

これは、XML ではサポートしていない文字列があるからです。

なので、それらの 文字列を取り除く簡単な PHP 処理がこれです。

``` php
function utf8_for_xml($string)
{
    return preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $string);
}
```

参考 & コード引用
http://stackoverflow.com/questions/12229572/php-generated-xml-shows-invalid-char-value-27-message
convert java.util.Map[String, Object] to scala.collection.immutable.Map[String, Any]

```scala

import scala.collection.JavaConversions._

val m = new java.util.HashMap[String, Object]()
m.put("Foo", java.lang.Boolean.TRUE)
m.put("Bar", java.lang.Integer.valueOf(1))

val m2: Map[String, Any] = m.toMap
println(m2)
```
【Coldfusion】文字列のバイト数をShift-JISで取得する

題名通りの備忘録。

```
<cfset aString="テストabc試験123">
<cfoutput>
#Len(aString.getBytes("shift-jis"))#
</cfoutput>
```

CFだけ見てても分からないよね。Javaベースであることを忘れないようにしなければ。
資料作成やモック作成時に使えるフリーアイコン

# flaticon

主に単色のフラットアイコンをダウンロードできるサービスです。
自分で色やサイズの変更ができて、png, svg, eps psd, base64形式でダウンロードできます。
英語でのみ検索可能です。

URL： [flaticon](http://www.flaticon.com/, "flaticon")

![image](https://qiita-image-store.s3.amazonaws.com/0/77804/d3c98be0-b6c2-81d5-790f-76fe89218b2c.png)

# icons8

複数色を使ったフラットアイコンを検索・ダウンロードできるサービスです。
自分で色やサイズの変更ができて、png, svg, eps psd, base64形式でダウンロードできます。
英語でのみ検索可能です。

URL：　[icons8](https://icons8.com/, "icons8")

![image](https://qiita-image-store.s3.amazonaws.com/0/77804/3283a714-bec9-d91f-e7dd-1e46af1b6a0a.png)
clipboard.jsに関して

###clipboard.js web site###
https://zenorocha.github.io/clipboard.js/

＊ インストール
``$ npm install clipboard --save
``

＊ 使い方
ダウンロードしてdistフォルダに配置

```
<script src="dist/clipboard.min.js"></script>
```

外部から

```
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.1/clipboard.min.js"></script>
```

例

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>constructor-selector</title>
</head>
<body>
    <!-- 1. Define some markup -->
    <button class="btn" data-clipboard-text="1">Copy</button>
    <button class="btn" data-clipboard-text="2">Copy</button>
    <button class="btn" data-clipboard-text="3">Copy</button>
    <!-- 2. Include library -->
    <script src="../dist/clipboard.min.js"></script>

    <!-- 3. Instantiate clipboard by passing a string selector -->
    <script>
    var clipboard = new Clipboard('.btn');
    clipboard.on('success', function(e) {
        console.log(e);
    });
    clipboard.on('error', function(e) {
        console.log(e);
    });
    </script>
</body>
</html>
```
ZFS on GEOM ELI on ZVOL

#ZFSのZVOLで作ったブロックデバイスをGEOM ELI(geli)で暗号化してその上にZFSのpoolを作る

physical disk→ZFS→ZVOL→GEOM-ELI→ZFS

##zvolの作成

```console
% sudo zfs create -V 256m zroot/encvol
```

##キーの作成

```console
% openssl rand -out geli_key 64
```

##初期化

```console
% sudo geli init -s 4096 -K geli_key /dev/zvol/zroot/encvol
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/zvol_zroot_encvol.eli and
can be restored with the following command:

        # geli restore /var/backups/zvol_zroot_encvol.eli /dev/zvol/zroot/encvol
```

##アタッチ

```console
% sudo geli  attach -k geli_key /dev/zvol/zroot/encvol
Enter passphrase: 
```

##zpoolの作成

```console
% sudo zpool create encpool /dev/zvol/zroot/encvol.eli
% sudo zfs set mountpoint=none encpool
```

##再起動後
再起動するとデタッチされてるので

```console
% zpool list
NAME      SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
encpool      -      -      -      -         -      -      -  FAULTED  -
zroot    1016M   431M   585M    31%         -    42%  1.00x  ONLINE  -
```

アタッチする

```console
% sudo geli  attach -k geli_key /dev/zvol/zroot/encvol
Enter passphrase: 
% zpool list
NAME      SIZE  ALLOC   FREE   FRAG  EXPANDSZ    CAP  DEDUP  HEALTH  ALTROOT
encpool   250M   528K   249M     2%         -     0%  1.00x  ONLINE  -
zroot    1016M   431M   585M    31%         -    42%  1.00x  ONLINE  -
```