OmniAICreator/Qiita-1.07M huggingface dataset:
FORTH の情報まとめてみた 2016 年版

# FORTH の情報をまとめてみた('16)
あまりにも FORTH の情報が少ないのでここでまとめておこう。まずは、一体全体 FORTH とは何者でどうつかったらよいか？というところから始めるべきか？
## FORTH よお前は何者だ？
ここのページが充実してますね。
[impos-forth](http://www18.atwiki.jp/imops-forth/) iMops というオブジェクト指向型の Mops という言語の実装のようです。全部読んでいないのですが、[プログラミング言語Forth 序章](http://www18.atwiki.jp/imops-forth/pages/18.html) っていうのを呼んでいけば FORTH を学べそうな気がしています。
早食いなら [Rpn and forth 超入門 ](http://www.slideshare.net/seosoft/rpn-and-forth) をみればいいかな？
Mind という日本語 FORTH もある。[日本語プログラミング言語 Mind](http://www.scripts-lab.co.jp/mind/whatsmind.html)

そこから抜粋。
>Mindは，スタック・マシンの機構を計算上の中心概念としながら，処理系に負担をかけずにかなり自由な表現を許すという特徴を持ち，よい処理系と開発環境が整備された現時点でもっとも実用的な日本語プログラミング言語と言えよう．

>(財)機械システム振興協会『２１世紀における新 社会システム開発に関する調査報告書－日本語プ ログラミングの調査－』(昭和63年3月)より抜粋

昭和63年の引用が泣けます。

有名な FORTH としては [Gforth](https://osdn.jp/projects/freshmeat_gforth/) も紹介しておきましょう。

そのほかの情報
- http://www.forthworks.com/retro/
- http://freecode.com/projects/ffl
- http://www.mpeforth.com/index.htm
- http://www.excamera.com/sphinx/fpga-j1.html

## FORTH の哲学的な何か
FORTH の何か哲学的なところに触れたいならこの辺のページも参照しておきましょう。とくに samwyn さんのところの情報は面白い。
-[MOVING FORTH[(http://www.bradrodriguez.com/papers/moving1.htm)
- http://www.h7.dion.ne.jp/~samwyn/forth.htm

## なぜFORTH?
コンパイラを作ったりすると最後は VM に行きついたりするのですが、VM を作ろうとするとなぜか FORTH を参照することになったりします。昔の技術ですが、pic でも動いて 64bit 環境でも当然動く。スピードも負けない（なんぜプログラマがコンパイルしているようなもんだからね）。温故知新でもうちょい情報があってもいいかなと思う今日この頃。

# ついでに VM の情報もまとめておこう。
自分の興味のある所だけつまみ食い的にリンクを紹介します。VM はやっている人も多いの(LLVM って VM ですか？)情報にはそう困らないでしょう。

[Cog VM リリース記念： Squeak、Ruby、Python を恒例のフィボナッチベンチで戦わせてみる](http://d.hatena.ne.jp/sumim/20100621/p1)
VM というと最近では V8 (古いか、、、)が速いといううわさです。確かに速いのですが、驚きなのは VisualWorks という Smalltalk の VM が速いこと。Cog VM も早い。
 
[Forthでハノイの塔](http://sile.hatenablog.jp/entry/20110816
/1313494249)
Fort-VFX という商用の FORTH が早い。早い VM の代表の VisualWorks も商用。商用だと金がかかっているというのもあるだろうけど、フィードバックがかかるから早くなるのかな？

[NASM / Linux x86-64でForth開発日誌3 ベンチマーク](http://phaendal.hatenablog.com/entry/2015/07/07/012224)
フィボナッチでの速度比較。squeak(Cog VM かな?) 速い。

その他リンク
- https://www.cs.tcd.ie/David.Gregg/papers/toplas05.pdf
- https://developer.android.com/reference/dalvik/bytecode/Opcodes.html
- https://source.android.com/devices/tech/dalvik/
  
# だからどうなのよ
gforth も retro もすごく難しい。なんとなく、そこにいろんな技術が眠っている気がしている。ちゃんとこの箱を開けて技術共用したいというのが狙い。誰か続いてくれ。
underscoreコードリーディング（pairs）



underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##pairsとは


###[underscorejs.orgのpairs](http://underscorejs.org/#pairs)

こんな説明。
>####_.pairs(object) 
>Convert an object into a list of [key, value] pairs.


```javascript
_.pairs({one: 1, two: 2, three: 3});
=> [["one", 1], ["two", 2], ["three", 3]]
```
------------- 
objectをkey,valueのペアのリストに変換します。

###[underscore.compose](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L974)
コード的にはこのあたり。

```javascript
  // Convert an object into a list of `[key, value]` pairs.
  _.pairs = function(obj) {
    var keys = _.keys(obj);
    var length = keys.length;
    var pairs = Array(length);
    for (var i = 0; i < length; i++) {
      pairs[i] = [keys[i], obj[keys[i]]];
    }
    return pairs;
  };
```

keysにobjを_.keysに入れた結果を格納する。
keysの長さをlengthに格納する。
lengthの長さ分だけarrayを生成し、pairsに入れる。
index=0からlengthの長さだけfor文を回す。
pairsのi番目に [keys[i], obj[keys[i]]]を入れる。
その後、pairsを返す。
Microsoftの翻訳API をRから使う

[`translateR`](https://cran.r-project.org/web/packages/translateR/index.html) というパッケージからMicrosoft翻訳を使って、Rでテキストを翻訳する。対応言語はこの[サイト](https://msdn.microsoft.com/en-us/library/hh456380.aspx)を参照。



```r
library(translateR)
txt <- c("Hello", "How are you?", "What's your name?")
translate(content.vec = txt,
          microsoft.client.id = "<Client ID>",
          microsoft.client.secret = "<Client Secret>",
          source.lang = "en", target.lang = "ja")
[1] "こんにちは"   　  "お元気ですか。"     "あなたの名前は何ですか。"
```

# Microsoft Translatorにサインアップ（[参考](http://qiita.com/kemayako/items/21fe36005e6e729aff77)）


- [このページ](https://www.microsoft.com/en-us/translator)から。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/80588/2a198be1-061b-2024-7826-a9d239276324.png)

--------------------------------------------------------------

- 「無料で２百万字プラン」を選択
![img.PNG](https://qiita-image-store.s3.amazonaws.com/0/80588/7a5fb9a8-c743-1bac-b645-8d05ead6f3e5.png)

--------------------------------------------------------------


- マイクロソフトアカウントがない場合は作ってサインイン。
![img2.PNG](https://qiita-image-store.s3.amazonaws.com/0/80588/baa0eabe-2a88-fc16-860c-64188f67129b.png)

--------------------------------------------------------------

- Microsoft Translatorにサインアップ
![Screenshot from 2016-02-09 21:59:03.png](https://qiita-image-store.s3.amazonaws.com/0/80588/a9682e01-8d42-06e5-2b63-dfbcff61f3ba.png)

--------------------------------------------------------------


# [開発者ページ](https://datamarket.azure.com/developer/applications)へ行き、アプリケーションを登録

![Screenshot from 2016-02-09 22:03:57.png](https://qiita-image-store.s3.amazonaws.com/0/80588/57115174-d8b4-29fe-95b9-230b57a45027.png)

--------------------------------------------------------------

- クライアントID は既存のものとかぶらないものを、リダイレクトURIは無効なURLを指定する（例：https://localhost/）
- クライアントIDと顧客の秘密はあとで使うのでメモしておく。
![Screenshot from 2016-02-09 22:07:18.png](https://qiita-image-store.s3.amazonaws.com/0/80588/ae5e7e22-3ee3-c577-d448-7d8bb73751e7.png)


# Rから利用する。

`translateR`はインストールしておく(`install.packages("translateR")`)。

```r
library(translateR)
txt <- c("Hello", "How are you?", "What's your name?")
translate(
  content.vec = txt,
  microsoft.client.id = "<クライアントID>",
  microsoft.client.secret = "<顧客の秘密>",
  source.lang = "en", target.lang = "ja")
#[1] "こんにちは"               "お元気ですか。"          
#[3] "あなたの名前は何ですか。"
#Warning message:
#The content appears to be in BRETON. However, the
#language code you provided suggests that the text is in
#ENGLISH. If you entered the wrong language code, stop
#the process. Otherwise, translateR will treat the text
#as ENGLISH. 
```

警告メッセージは不思議だが（どうしてブルトン語に見えるのか）、きちんと翻訳できている。
対応言語も豊富（[一覧](https://msdn.microsoft.com/en-us/library/hh456380.aspx)）なので、使い道は多そう。
head コマンド（Broken pipe エラー）

こんにちは。
```head``` コマンドは、長大な標準出力をパイプラインで受け取って使うと、打ち切りを行うので、Broken pipe エラーが起きてエラー出力が目障りかもしれません。

対処方法は、エラー出力を捨てるか、打ち切られてもエラーを出力しないコマンドを挟むかなどがあるようです。

```console
$ 長大な標準出力 2>/dev/null | head
$ 長大な標準出力 | tail -n +1 | head
```

対処無しですとエラー出力はこのような具合です：

```console
$ 長大な標準出力 | head
  :
  :
Broken pipe - <STDOUT> (Errno::EPIPE)
```
Railsアプリをどこにデプロイするか考える。（Heroku vs AWS）

ローカルで開発してきたRailsアプリをリリースするときに、どこにデプロイするか考えてみました。

# 前提

* 流行るかどうかわからないアプリなので、コストをかけたくない
* もし流行ったときに、スケールアウトしたい
* 運用にはなるべく人手をかけたくない

今回は、メジャーなHerokuとAWSに絞って比較してみました。

# [Heroku](https://www.heroku.com/home)

* デプロイが簡単
  * `git push`するだけ。nginxとかunicornとか考えなくていい。
  * Githubと相性がいい。
* DBはPostgresがデフォルト
* スケールアウトが容易
* コストは安い
  * 1dyno Hobbyで **$7/mo**
  * DBはHobby Free（10k rows）なら無料
  * 開発環境/ステージング環境など常時起動しないでいいなら無料
* 日本リージョンがない

# [AWS](https://aws.amazon.com/jp/)

* デプロイ自動化は可能
  * ansible + capistranoとかでコードを書く必要がある。
* DBは同じインスタンスに入れることができるが、スケールアウトができない
* スケールアウトを考えると、PaaSのDB（[Amazon RDS](https://aws.amazon.com/jp/rds/)）を使う
  * RDSはMySQL, Postgres, SQL Serverなど
* スケールアウトは構成を考える必要がある
* コストはRDS使うならHerokuより高い
  * EC2 t2.nano $0.01/h = **$7.44/mo**
  * RDS db.t2.micro $0.026/h = **$19.344/mo**
* 日本リージョンを選べる

# 結論

* 1dynoとt2.nanoで性能差がどれだけあるかは分からないが、運用コストと月額コストを考えて、Herokuを選択しました。
* HerokuはPaaSなので、できないことが多々あるかもしれませんが、まずはHerokuで運用しようと思っています。

※価格などは、2016/2/9現在の情報です。
API Gateway でGETに対してS3オブジェクトを返す

# はじめに
API Gateway にやってきたリクエストのうちGETメソッドについてはS3のオブジェクトを返す
ということをやってみました。

これは、商品情報のような以下の特性を持ったデータの取得について
性能問題を無視できるようしてみたいというニーズから考えて見ました。

* 公開目的でセキュリティーの考慮が不要
* データ取得の頻度が高く、秒間数アクセス
* データ更新頻度は１日１回程度で高くない

ということで、WebAPIで毎回DBアクセスを行うのではなく
戻り値そのものをS3に置いておいてしまったらどうなのか試して見ました。

じゃあ、ただS3をそのままとればいいじゃん？
となるんてすが、API Gatewayをかませることでさらに以下のようなメリットを生み出そうと考えました。

* POST/PUTではLambdaを呼び出せ、同一URLで更新が出来、RESTっぽい。
* Cloud frontのキャッシュが使える
* 不正なURLの場合、カスタムエラーを出せる

ということで、まずはAPI GatewayからS3を呼び出してみます。

# S3へのファイルアップロード

最初にS3に戻り値となるjsonを持ったファイルをアップして公開します。

![2016-02-09.png](https://qiita-image-store.s3.amazonaws.com/0/112407/d9e81865-93a1-6941-85c3-f9d94b860209.png)

ブラウザで見ると、こんな感じです。

![2016-02-09 (2).png](https://qiita-image-store.s3.amazonaws.com/0/112407/eb9a8b01-4c98-864e-1381-9852ced8148e.png)


# API Gatewayの設定

API Gatewayでは、まずResourceを作成します。
ここでの注意点はResourceは１階層ずつ作る必要があることです。
今回の例ではitemの下にitem idを指定出来るようにします。
なので、item には何のメソッドも紐付きません。
追々、ここに検索用のEndpointを作るのもありですね。

![2016-02-09 (4).png](https://qiita-image-store.s3.amazonaws.com/0/112407/7d4cb834-ee84-31f2-6a45-a3c58a48f460.png)


itemの下に｛id｝というResourceを設定します。
これでAPI Gatewayはidをパラメータと認識します。

GETメソッドと追加しますが、Integration TypeをHTTP Proxyとして、
Endpoint URLに取得したS3のバケットを指定します。
ここでは、{id}で指定された値のテキストファイルを取得するようにしています。

![2016-02-09 (6).png](https://qiita-image-store.s3.amazonaws.com/0/112407/b79a3cf7-bf01-90a3-0911-a2f085359a7d.png)


次にS3の{id｝にセットする値を設定します。
同じ画面のURL Path Parametersで以下のように設定します。

![2016-02-09 (7).png](https://qiita-image-store.s3.amazonaws.com/0/112407/074cfaa1-6e03-f090-4c45-c248b3eddd76.png)

このmethod.request.querystringでクエリ文字列を取得できます。
ただし、querystringでidというプロパティを追加するには、もう一手間必要です。
idというプロパティを作ってあげないといけません。

これはMethod Requestの方で設定します。
Request Pathsにidを設定します。
これで、method.request.querystringにidというプロパティが追加されます。

![2016-02-09 (8).png](https://qiita-image-store.s3.amazonaws.com/0/112407/87e04e34-851c-5f41-791a-cbb48e51f233.png)

これにてブラウザでAPI GatewayのEndpointにアクセスして、
S3の内容が表示されるようになりました。

![2016-02-09 (9).png](https://qiita-image-store.s3.amazonaws.com/0/112407/b3220de2-d54f-5069-4619-a77d90465e19.png)
AWSに複数アカウントを作ってもいいのか

AWSで複数アカウントを作ってもいいのか、また別アカウント作成により再度無料枠をもらえるのかを調べたところ、AWSのフォーラムに下記のような記述がありました。

> Creating multiple accounts is not against the terms of service. It is OK to have different accounts for test and production systems, for example, or for separate business units which have completely distinct email sending that doesn't overlap. However, attempting to circumvent service limits or policies is prohibited by the terms of service, and creating multiple accounts for the purpose of circumventing limits would be a violation of the TOS.
>
> （引用元：[AWS Developer Forums: Multiple Accounts with Same Company and Billing Information](https://forums.aws.amazon.com/thread.jspa?messageID=381770)）

これによれば、複数アカウントを持つこと自体は問題ないようです。

以下、責任は持てませんが和訳。

> 利用規約上、複数のアカウントを作ることに問題はない。たとえば、テストと商用環境とで別のアカウントを作っても構わない。また、別々のビジネスについて完全に独立なメールを送るのであれば、異なるアカウントを利用してもよい（訳注：質問者は複数サービスについて複数アカウントからSESを使っていいか聞いている）。しかし、サービスの制限や方針を回避しようとすることは利用規約で禁止されている。つまり、制限回避のための複数アカウント作成は利用規約違反となる。

この「サービスの制限や方針を回避してはいけない」というのは合理性がある条件のように思えます。

要するに、独立したサービスそれぞれで別アカウントを使うのはアリ、しかし1つのサービスで複数アカウントをうまくやりくりしてクォータを超えるような運用は利用規約違反だぞ、ってことになるでしょう。そりゃそうですよね。

そこで言うと、新規ユーザー向けの12ヶ月無料枠を別アカウントで再度利用するのはまずそうです。AWSとしては「新規ユーザーにAWSに慣れてもらうため」という方針でやっていることだと思うので、既存ユーザーが課金を免れるためだけに別アカウントを作るのは利用規約違反と言われかねません。

# 複数アカウントでの無料枠利用について、追記

> これらの無料利用枠は、AWS の新規のサービス利用者のみが対象であり、AWS にサインアップした日から 12 か月間ご利用いただけます。サービス利用者またはサービス利用者の組織が1つ以上のアカウントを作成して本無料提供の追加特典を得ようとする場合、または新しいアカウントが一括請求（コンソリデーティッドビリング）に含まれている場合は、サービス利用者は追加の特典を受ける対象とはなりません。サービス利用者が本無料提供の対象外であると判断された場合には、AWS サービスをご利用いただくにあたり、標準料金が課金されます。
>
> （引用元：[AWS 無料利用枠提供規約](https://aws.amazon.com/jp/free/terms/)）

ダメだぞって書いてあるのを見つけました。ま、そりゃそうですよね。
Raspberry Pi をMacでセットアップ忘備録 3 - SFTPと接続

Raspberry PiのiMacを利用したセットアップ忘備録です。


1.  [初期設定](http://qiita.com/PonDad/items/bfb1cc6ddc18ccf08208) 
2. [無線LANと接続](http://qiita.com/PonDad/items/c0f559962d4108774424) 
3. [SFTPと接続](http://qiita.com/PonDad/items/516e0ef5295f47228a5c) <<
4. [USBスピーカーと接続](http://qiita.com/PonDad/items/80fb3abebb5adaa7888d)
5. [USBマイクと接続](http://qiita.com/PonDad/items/565f816dc1ebcbe2467e) 
6. [VNCでリモートデスクトップ](http://qiita.com/PonDad/items/232f1aacbef2c4fcb746) 

## 環境

- iMac Late 2013 （OSX 10.11.3）
- Raspberry Pi2 ModelB （raspbian-wheezy）
- PLANEX 無線LAN子機 (USBアダプター型) GW-USNANO2A (FFP)

## ファイルをアップロードしたい

音声ファイルを再生してみようと思い、ふとファイルのアップロードのやり方が分からないことに気づく。

ターミナルからのファイル操作が今ひとつ不安だったのでFTPを使えば良いことに気づく。SSHから操作するFTPはSFTPというそうだ。

そういえばFTPクライアントアプリにSFTPとかAmazon S3とかの指定が出来たことを思い出す。

## Transmit

[Transmit - Mac App Store ](https://itunes.apple.com/jp/app/transmit/id403388562?mt=12)

FTPアプリならなんでも良いと思うけれど、Webサイト用に持っていたこのアプリを利用する。


## 接続の仕方

念のためサーバー名を確認する。

```bash:ssh
pi@raspberrypi ~ $ hostname -I
192.168.○.○ 
```

今のところIPアドレスがそのまま表示される。Transmitに「サーバー名」として登録する。ユーザー名とパスワードはRaspberry Piのデフォルトのままなのでそれを入力する。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/47128/6c37edc1-a476-2a59-5789-9d165370aae3.png)

ポートは設定しなくても接続出来た。

![２.png](https://qiita-image-store.s3.amazonaws.com/0/47128/d644f24b-0e85-6be6-f9d8-93b8b37db88c.png)

不可視ファイル以外は表示された。今まで中身が見られずどんなファイル構成になっているかわからなかったがこれで少し安心した。

## 参考にさせていただきました

[MacからRaspberry Pi（ラズベリーパイ）にファイルを転送する](http://okuzawats.com/sftp-20140924)
VBのFor文でのStepの仕様を微妙に勘違いしていたっぽい

前提知識
-------

ForのStepは普通、

```vbnet
Dim i as Long
For i = 1 to 10 Step 1

  ' なんやかんやあって桶屋が儲かる

Next i
```
こんな感じで使う。
Stepを省略するとデフォルトで「1」になる。
大体は省略していると思う。

たまに、データを削除するときとかは逆順で処理するので、以下のように使うことがある。

```vbnet
Dim i as Long
For i = 10 to 1 Step -1

' なんか消す

Next i
```


なん...だと...
---------

今日やろうとしたのは、
非再帰のマージソートを実装しようとした以下のコード。

```vbnet
' 単位を倍々にしていってマージする。1, 2, 4, 8, ...
Dim i as Long
For i = 1 to map.Count Step i

' マージソートする

Next i
```

こんな感じで書いたら、ループが一回まわるたびにiの値も増えるから、うまく動くはず！と思っていたわけですよ。

ただし、実際は**無限ループ**になってしまいフリーズしたんですね。
ステップ実行して処理を追ってみると、このときiは1のままで増えることはありませんでした。

つまり、**Stepは0になってました。**


どういうことだってばよ
--------------------

わたしがしていた勘違いをCとかの構文で書くと

```c
for (int i = 1; i <= map.length; i += i) {
  // なんか処理
}
```
こうだと思っていたんです。

でも実際は

```c
for (int step = 0, i = 1; i <= map.length; i += step) {
  // なんか処理
}
```
こんな感じみたいです。


まとめ
------

つまるところ、以下の2点が理解できていませんでした。

* Stepの値はループごとに再評価されない
* ループ用のカウンタの初期化より先に、Stepの設定がされる

なるほどなー。
つーか前から思っていたけどVBのForってなんでわざわざ劣化させた仕様にしているんだろう。。。
使いにくくてしょうがないな。。。

ちなみに確認したのはExcelVBAです。
他のVB系でも同じっぽいけど動作確認はしていないのであしからず。
Swiftはじめたい...その１４ プロトコル


# プロトコルを試してみます

+ Objective-Cと同じですよね？
+ Javaとかでいうとinterfaceかな？

## protocol

+ 基本的な感じのを書いてみます。

```swift:protocol
import Foundation

protocol Animal {
    func nakigoe()->String
    func poo()->String
}

protocol Pet {
    func food()->String
    func older(other:Self)->Bool
}

class Dog: Animal , Pet {
    var name = ""
    var age = 0
    init(_ name:String) {
        self.age  = 10
        self.name = name
    }
    func nakigoe()->String {
        return "\(name) > 「わん」 "
    }
    func poo()->String {
        return "\(name) > 「💩」 "
    }
    func food()->String {
        return "\(name) > 「ホネ」 "
    }
    func older(other:Dog) -> Bool {
        return (self.age > other.age)
    }
}

let pochi = Dog("🐶")
pochi.age = 10
print(pochi.nakigoe())
print(pochi.poo())
print(pochi.food())

let shiro = Dog("🐩")
shiro.age = 6

print(shiro.older(pochi))
print(pochi.older(shiro))
```

```shell:結果
🐶 > 「わん」 
🐶 > 「💩」 
🐶 > 「ホネ」 
false
true

```

+ 書けはしましたけど、あんまり面白くはないですね。
+ 複数のプロトコルが使えます。


## まとめ

+ ライブラリを使うときにはdelegateでこのプロトコル使いますよね。
+ でも、自分で作るプログラム程度ではあんまり使わない気もします。

# 今日はここまで

+ 次はstructを試します。
Xcode7で「linker command failed ...」でビルドエラーが出た時の対処方

Xcode7に上げてからビルドしようとすると度々「linker command failed ...」でエラーが起きます。
しょっちゅう起きるし、その度に調べてたり忘れると怖いのでメモ。

Build Settings > Build Options内のEnable Bitcodeの項目がYesになっていたらNoに変える。

これだけでビルドが成功するようになりました。

<img width="602" alt="img.png" src="https://qiita-image-store.s3.amazonaws.com/0/43281/50b884f0-ca24-c62d-9d41-debd8f49444d.png">
RSpec+Capybaraで複数セッションを扱う

Railsのテストで、ユーザの同時ログインとかリアルタイムでユーザの挙動をテストしたいってときがあると思います。
Capybaraの[using_session](http://www.rubydoc.info/github/jnicklas/capybara/Capybara.using_session)を使えば、テストの中で複数のセッションを扱うことができます。

``` ruby
using_session :user1 do
  visit root_path
end
```

JavaScriptつかうとき（js: trueのとき）、SeleniumのデフォルトだとFirefoxが起動します。
配列で回すと、簡単にいくつでも立ち上げることができます。

``` ruby
scenario '2人で同時ログイン', js: true do
  users = [
    { symbol: :user1, name: 'user01', gender: 'male' },
    { symbol: :user2, name: 'user02', gender: 'female' }
  ]

  users.each do |user|
    using_session user[:symbol] do
      visit root_path
    end
  end

  users.each do |user|
    using_session user[:symbol] do
      expect{
        fill_in 'user[name]', with: user[:name]
        find(user[:gender]).click
      }.to change(User, :count).by(1)
    end
  end
end
```

当然ですが、あまり多くのブラウザを同時に開くと重いです。

また、今回試した環境は以下の通りです。

* rspec-rails 3.4.1
* capybara 2.6.2
eslint-config-airbnbを守りたかった

ESLint のルールに [eslint-config-airbnb](https://www.npmjs.com/package/eslint-config-airbnb) v5.0 を採用してみたけど、一部のルールが厳しかったという話です。


## eslint-config-airbnb の設定

おそらく、一番デフォルトの全部入りの設定

> Our default export contains all of our ESLint rules, including EcmaScript 6+ and React. It requires eslint and eslint-plugin-react.
> 
> npm install --save-dev eslint-config-airbnb eslint-plugin-react eslint
> add "extends": "airbnb" to your .eslintrc


## no-param-reassign

http://eslint.org/docs/rules/no-param-reassign
https://github.com/airbnb/javascript#7.12
https://github.com/airbnb/javascript#7.13

- 引数を更新してはいけない
- オブジェクトのプロパティも更新してはいけない

こういうのが作れない。

```js
const preventDefaultEvent = (event) => {
  if (event.preventDefault) {
    event.preventDefault();
  } else {
    event.returnValue = false;  // For IE8
  }
};
```

ルールを無効にする以外にエラー抑止ができない。
[議論済み](https://github.com/airbnb/javascript/issues/641) なので今後も変わらなそう。


## arrow-body-style

http://eslint.org/docs/rules/arrow-body-style


### パターン1

これは一文にすべきと言われるので

```js
const foo = () => {
  return [
    1,
    2,
  ];
};
```

こうしたり、

```js
const foo = () => {
  const result = [
    1,
    2,
  ];
  return result;
};
```

こうしないといけない。

```js
const foo = () => (
  [
    1,
    2,
  ]
);
```

### パターン2

これは空の関数作るなよといわれるので、

```js
const foo = (callback = () => {}) {
};
```

色々修正すると、修正が修正を呼びこうしないといけない。

```js
const foo = (callback = function callbackName() {}) {
};
```


## no-unused-vars

http://eslint.org/docs/rules/no-unused-vars の厳しい方 `{ "args": "all" }`

これは `x`, `y` 使ってないからダメ。

```js
const foo = (x, y) => {
};
```

destructing を使って、こんな風に雑に引数仕様を残したいときに不便だった。

```js
this.on('foo', ({ a, b, c }) => {
});
```


## react/jsx-no-bind

https://github.com/airbnb/javascript/tree/master/react#methods

二つあって、片方は理由が示されているが、以下のもうひとつの方

> Do not use underscore prefix for internal methods of a React component.

理由を調べたら、"React is a special subset" という結論でモヤモヤした。

https://github.com/airbnb/javascript/issues/490


## 以上

ﾏﾓﾚﾅｶｯﾀ..
脱Apple、出戻りWindows


2016年2月、MacをやめてWindowsを久々に使い始めたので、環境構築のためのメモ。

今回買ったマシンはMicrosoftが2月4日に発売した[Surface Book](http://www.microsoftstore.com/store/msjp/ja_JP/pdp/Surface-Book/productID.332729600)の最上位モデル（SSD 512GB, Intel Core i7, メモリ16GB, nVIDIA GPU付き）。

# Windows10 環境設定・アプリケーション等

## まずやること

* Google Chrome インストール、Googleアカウントログインと同期
* Dropbox インストールと、Googleアカウント経由のログイン
* Keepass 環境の再構築
* 職場のプリンタセットアップ( https://www.fujixerox.co.jp/download/apeosport/4_c3370/ )
* [Microsoft Office](https://www.microsoft.com/ja-jp/office/homeuse/office2016/default.aspx)
* [Shift](https://tryshift.com/)のインストール

## インストールするもの (Boxstarter経由)

[Chocolatey Gallery](https://chocolatey.org/) ,
[Boxstarter](http://boxstarter.org/) をインストール

[run-boxstarter.ps1](https://gist.githubusercontent.com/hayamiz/7cc8a033f7d3b9417b1914deff369d25/raw/run-boxstarter.ps1) を C:\ などに保存して，boxstarter shell から実行する．

* [Ctrl2cap](https://technet.microsoft.com/ja-jp/sysinternals/bb897578.aspx) ... まず最初にやるやつ
* [Bitvise SSH client](https://www.bitvise.com/ssh-client) ... SSHクライアント。SSHトンネルを切れるたびに自動で張りなおしてくれるので便利
* [Listary](http://www.listary.com/) ... エクスプローラで文字入力をすることでインクリメンタルにファイル選択を行うことができるようになる。その他便利機能多数
* [KeePassXC](https://keepassxc.org/) ... パスワード管理ソフト。Windows/Mac/Linux/iOS/Androidとマルチプラットフォーム対応しているので、1PasswordのようにOSにロックインされない良さがある
* [Java](https://www.java.com/ja/download/help/download_options.xml) ... サーバのiDRAC等リモートコンソール起動に必要

## 手動でインストール・設定するもの

* Windows Subsystem for Linux の有効化
* MS Store から Ubuntu、Windows Terminal インストール
* [OpenVPN GUI](https://openvpn.net/index.php/open-source/downloads.html)
* [Adobe Creative Cloud](https://creative.adobe.com/ja/products/download/creative-cloud?promoid=KSPDX)
* [Explzh](http://www.ponsoftware.com/) ... 多数の形式に対応した圧縮解凍ソフト
* [Slack](https://slack.com/)
* [PicPick](http://ngwin.com/picpick) ... 高機能なスクリーンキャプチャソフト
* [Typora](https://typora.io/) ... シンプルなMarkdownエディタ

## Cygwinインストール

下記のパッケージをインストール

* openssh
* mosh
* ruby
* rubygems
* vim
* wget
* git
* nc

`~/.minttyrc` を下記の内容で作成する。

https://gist.github.com/hayamiz/6a46e27507fc249503852eab85971aae

## MSYS2 の初期設定

`C:\tools\msys64\msys2.exe` にインストールされているので、ショートカットを作成する。

下記のコマンドで必要なツール等をインストールしておく。

```
pacman -Sy --noconfirm git
pacman -Sy --noconfirm mosh
```

`/etc/fstab` に下記の内容を追加して、Windowsのユーザディレクトリを `/home/yuto` としてマウントする。

```
C:/Users/yuto /home/yuto
```

## Emacsに日本語IMEパッチを当ててビルドする

MSYS2をインストールして，https://github.com/chuntaro/NTEmacs64 の手順に従ってビルドする．

## 日本語入力の変換、無変換キーによるトグル

Windowsのデフォルトの日本語入力切替は半角/全角キーだが、Macのようにスペースキーの両隣の変換、無変換キーで日本語入力のON/OFFを操作できるようにしたい。

> [Windowsの変換・無変換キーでIMEの有効無効をMac風に操作する](http://www.karakaram.com/mac-ime) 

上記を参考に、Google IME 用の[キーマップファイル](https://gist.github.com/hayamiz/eaa46150356e6d66d2fcd4628808e157)を作成した。

Ctrl-F12でプロパティを起動するショートカットも追加している。

* Google IME プロパティ　→　「キー設定の選択」を「カスタム」にして「編集」をクリック→「編集」→「インポート」で上記ファイルをインポートする
PostgreSQLアンチパターン：UPDATEの濫用

RDBMS といっても、SQLiteをシングルユーザで使ってたり、ORMやRESTful APIでWrapされた状態で使っていると、SQL問い合わせのできる「ファイル」という感覚になるかもしれません。
その感覚で PostgreSQL を使うとしばしば落とし穴にはまります。

# DBMSは大変なのだ
DBMSは昔から同時多発の更新要求を矛盾無くさばくトランザクション処理が要件でした。
この要求の苛烈さ・複雑さに思いを馳せるには、"Transaction Isolation Level", "トランザクション隔離性水準",  "トランザクション分離レベル"　あたりをキーワードにググってみるのがいいでしょう。

たとえばこんなページ
http://language-and-engineering.hatenablog.jp/entry/20110104/p1
DBの「トランザクション分離レベル」が必要な理由 （PostgreSQLで，ファントム・リードを防止すべきサンプル事例）

http://gyouza-daisuki.hatenablog.com/entry/2013/11/19/150838
トランザクション分離レベルについて極力分かりやすく解説してみた[SQL]

# PostgreSQLの追記型アーキテクチャ
要件が複雑なので、RDBMSによって実装方針はいろいろですが、かなり複雑な実装になります。
PostgreSQLが採用した実装は、「追記型アーキテクチャ」です。

- UPDATE でも上書きしない。前の値のレコードがそのまま残っています。
  - はい、ご明察。DELETE しても、前の値のレコードがそのまま残っています。
- ようするに古いトランザクションが生き残っていて、古い値を期待している可能性があるかぎり、そのままとっておくのです。
- トランザクションが重なると、前の値だけでなく、前の前の値も、前の前の前の値も、ずっと前まで生き残り続けることがあります。
- 前の値のレコードを参照にくる可能性のあるトランザクションが全部終わったら、ようやく古いレコードはガーベジとなりさがり、vacuum 処理すると始末される。

このアーキテクチャでよくはまるパターン

- Diskの空きが少なくなってきたから古いレコードを大量にDELETEしたら、DiskFullになってしまった。  
- smallint のカラムを smallint の値で UPDATE するだけだから、Disk使用量には影響ないだろうと思って大量に繰り返し処理したら、ブクブクDBが膨張してパンクした。
 - 悪例：すでにほとんどの対象が status=1 になっているのに、緩い WHERE 条件で `UPDATE .. SET status=1..` 同じ値を上書きしても結果は同じでしょ？　ってRDBMSにはご無体な話です。トランザクション中で更新対象になったというだけで、やらなきゃいけないことが山ほど出てくるのです。 
 - パンクしないまでも、ガーベジだらけになって、正味データ量に変化はないのに、だんだん処理効率低下・応答速度劣化に見舞われる

# 対策
スキーマ設計段階からです。RDBの設計の基本=TABLEの正規化は前提として、

- カラム単位で情報の寿命／更新頻度を検討する
 - 利用者の入会から退会まで変わらない情報や年1回くらいで更新される情報？
 - 毎月更新される情報？
 - バッチ処理などで一時的に必要な情報？
- TABLE設計では、情報寿命の粒を揃えることを考慮する
 - どこか1カラムでも短寿命のが混じると、TABLE全体のガーベジ発生率があがります
- 1-2ヶ月で不要になる情報は、時系列パーティションテーブルに入れて、不要になったものを DROP
 - TABLE まるごと DROP なら、vacuum を待つこと無く回収されていきます
- バッチ処理などで一時的に必要な情報などは、TEMPORARY TABLE で使い捨てにする

「INSERT したら、SELECT しまくって、UPDATE することなく DROP する」パターンを最大化します。
awkで簡易アクセスログ解析

障害調査対応時に使ってみた。
今までExcelとかで集計してたから多少は早くなりそう。


# 材料(必要な物)
* awkコマンド。
* sortコマンド。
* uniqコマンド。

# 想定

apacheのLogFormatは以下を想定。

* 第一フィールドにSorceIPが出力される想定。

```
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

```

## SourceIP毎に一時間あたり何回アクセスがあったか抽出する。

```bash
# awk '{print $1}' /var/log/httpd/access_log |sort |uniq -c |sort |awk '{print $1/3600, "From:"$2"/hour"}'
```


## 実行結果。

```bash
# awk '{print $1}' /var/log/httpd/access_log |sort |uniq -c |sort |awk '{print $1/3600, "From:"$2"/hour"}'
0.000277778 From:104.131.170.117/hour
0.000277778 From:104.131.187.65/hour
0.000277778 From:104.236.72.31/hour
0.000277778 From:109.234.34.82/hour
0.000277778 From:141.212.122.81/hour
0.000277778 From:142.54.169.164/hour
0.000277778 From:157.55.39.109/hour
0.000277778 From:162.222.227.163/hour
0.000277778 From:180.76.15.11/hour
0.000277778 From:180.76.15.14/hour
0.000277778 From:180.76.15.140/hour
```
Eclipse workspaceのバックアップ

#概要
Eclipse環境でデータをバックアップする

##データをアーカイブする
```linux:
tar cfvz /home/`logname`/archive/eclipse`date +%y%m%d-%H%M`.tar.gz /home/`logname`/workspace
```

```linux:
tar cfvz $HOME/archive/eclipse`date +%y%m%d-%H%M`.tar.gz $HOME/workspace
```

### tar
#### アーカイブを生成・展開する

|オプション|説明|
|:--------|:----------------|
|c|新しくアーカイブを作成する|
|f|アーカイブファイル名を指定する|
|v|ファイルリストを表示する|
|z|gzip形式圧縮・展開する|

### date
#### 日時を表示・設定する

|オプション|説明|
|:--------|:----------------|
|+[format]|表示形式を形式で指定する|

|形式|説明|
|:--------|:----------------|
|%y|西暦下2桁|
|%m|月(mm)|
|%d|日(dd)|
|%H|時(hh)(24時間制)|
|%M|分(mm)|

### logname
#### 現在のログインユーザー名を表示する

### $HOME
#### ログイン中のユーザーのホームディレクトリを表示する
CakePHP: The datasource configuration default was not found in database.php

表題の不具合でハマったので、共有です。

Cakephpでは、モデルにおいては```$useDbConfig```を通じて接続先のデータベースを切り替えることができます。私は```database.php```を作成する際、```$default```を削除して新たに接続先を定義していました：

```database.php
class DATABASE_CONFIG {

        public $database1 = array(
                'datasource' => 'Database/PostgresLog',
                'persistent' => false,
                'host'       => 'localhost',
                'port'       => '5432',
                'login'      => 'postgres',
                'password'   => '',
                'database'   => 'database1',
                'prefix'     => '',
                'encoding'   => 'utf8',
        );
        public $database2 = array(
                'datasource' => 'Database/PostgresLog',
                'persistent' => false,
                'host'       => 'localhost',
                'port'       => '5432',
                'login'      => 'postgres',
                'password'   => '',
                'database'   => 'database2',
                'prefix'     => '',
                'encoding'   => 'utf8',
        );

```

またモデルでは次のようにしていました：

```MyModel.php
<?php
App::uses('AppModel', 'Model');
/**
 * Model
 *
 */
class MyModel extends AppModel {

/**
 * Use database config
 *
 * @var string
 */
        public $useDbConfig = 'database1';

}
```

そして、モデルをコントローラから次のように読み込んでいたのです：

```myController.php

public $uses = array('MyModels');

```

これを実行するとどうなるか？とても不可解なことに

```
The datasource configuration default was not found in database.php
```

と出力されます。原因は、モデルの指定が間違っているためです：

```
public $uses = array('MyModel');     // モデル名は単数形で指定
// public $uses = array('MyModels'); // 複数形は間違い
```

複数形で指定すると「モデルが見つからない！」というエラーは出ません。
その代わりに```AppModel.php```のインスタンスが作られます。
```AppModel.php```は（デフォルトでは）```$useDbConfig```が指定されてないので、
```lib/Cake/Model/Model.php```の```public $useDbConfig = 'default';```
が有効になります。

結果として表題のエラーメッセージが出るという仕組みです。

書いていて「自分ってアホだな」と思ったのですが、デバッグには相当時間がかかっため、
検索等でここに辿り着いた方のヘルプになれば幸いです。
【Unity】音にディレイをかける

# はじめに
UnityのOnAudioFilterReadを使う事で、スピーカーから出ている音にエフェクトをかけることができます.
この記事ではディレイエフェクトの作り方について解説したいと思います.

#OnAudioFilterReadについて
通常の音の流れ
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/59b2c78a-99c6-4b6e-f8fa-92469d475866.png)

OnAudioFilterReadを使った場合
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7792b867-b907-e2fa-cc77-8e586fbdebc7.png)

今回の記事ではOnAudioFilterReadの中で音を書き換える処理を書き、ディレイを実装していきます




#ディレイを作る流れ
以下の流れでディレイエフェクトを作ります.
1. 遅延器・乗算器を作る
2. 遅延器・乗算器でループ回路を作る
3. 音の出力時に原音と混ぜる

図で表すと以下のようになります
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/7d17fc6d-3593-90c9-04e8-8f089ddb4136.png)
 
#1. ディレイエフェクトを作る
遅延器の音の出力を遅延器に入力させることでループを作っています.

```DelayEffect.cs
using UnityEngine;
using System.Collections;

// ディレイエフェクト
class DelayEffect
{
  private float[] buffer = new float[48000];
  private int position = 0;
  private float g = .75f;
  private int delayTime = 18000;

  // 音の入力
  public void Input(float[] data, int channels)
  {
    int dst = this.position + delayTime;
    dst = dst % this.buffer.Length;
    for (int i = 0; i < data.Length; i++)
    {
      this.buffer[dst] += data[i];

      dst++;
      if (dst == buffer.Length) { dst = 0; }
    }
  }

  // 音の出力
  public void Output(float[] data, int channels)
  {
    int src = this.position;
    for (int i = 0; i < data.Length; i++)
    {
      data[i] += this.buffer[src] * g;
      this.buffer[src] = 0f;

      src++;
      if (src == buffer.Length) { src = 0; }
    }
    this.Input(data, channels);

    this.position = src;
  }
}
```

#2. 音にディレイエフェクトをかける

``` SoundEffect.cs
using UnityEngine;
using System.Collections;

public class SoundEffect : MonoBehaviour
{
  DelayEffect delay = new DelayEffect();

  void OnAudioFilterRead(float[] data, int channels)
  {
    delay.Input(data, channels);
    delay.Output(data, channels);
  }
}
```

SoundEffect.csをAudioListnerコンポーネントがついているGameObjectにアタッチすればスピーカーから出る音にディレイがかかるようになります。

#参考
Unity のオーディオの再生・エフェクト・解析周りについてまとめてみた
http://tips.hecomi.com/entry/2014/11/11/021147
OnAudioFilterRead - Unity - スクリプトリファレンス
http://docs.unity3d.com/ja/current/ScriptReference/MonoBehaviour.OnAudioFilterRead.html
MacOSXにAerospikeを入れてコマンドラインツールから動かしてみる


Aerospikeを触る必要がでてきたので触ってみます。
MacにAerospikeをインストールしてAQLで一通りコマンドを発行して確認することがゴールです。

## 環境
MacOSX Yosemite 10.10.5
Vagrant 1.7.3

## Install
MaxOSX用の[インストール手順](http://www.aerospike.com/docs/operations/install/vagrant/mac/)にそって行います。

### 手順
まずVM(仮想環境)用のディレクトリを作成します。

```:VM用ディレクトリ作成&移動
mkdir ~/aerospike-vm && cd ~/aerospike-vm
```

作成したディレクトリ内でVagrantfileを作成します。
[オプション](https://www.vagrantup.com/docs/cli/init.html)はお好みで

```:Vagrantfile作成
vagrant init aerospike/centos-6.5
```

VMを起動します。

```:Aerospike起動
vagrant up
```

このあとAQLを使いたいのでVMにsshで入ります。

```:ssh
vagrant ssh
```

AerospikeとAMCが動いているか確認してみましょう。
AMCは[Aerospike Management Console](http://www.aerospike.com/docs/amc/)の略で、ダッシュボードのようなものみたいですね。

```:状態確認
sudo service aerospike status
sudo service amc status
```

両方ともrunningになっていればOKです！
成功するとサーバログに「もうすぐケーキだよ」の書き込みがあるそうです。
（Web+DB Pressによると、Aerospikeのリリース時にケーキでお祝いしたことが関連しているとかしていないとか）

```ログ確認
sudo grep -i cake /var/log/aerospike/aerospike.log
```

私は確認できませんでした。。ケーキはおあずけです
しかし、AQLに入ってみましょう。

## AQLコマンド

### 起動
```AQL起動
aql
```

### Info

```namespace一覧
show namespaces
```
```sets一覧
show sets
```
```indes一覧
show indexes
```

### Record

#### insert

```
INSERT INTO <ns>[.<set>] (PK, <bins>) VALUES (<key>, <values>)
```
```例
insert into test.hoge (PK, name, age) values (1, 'fuga', 20)
insert into test.hoge (PK, name, age) values (100, 'piyo', 30)
```

#### select
```
SELECT * FROM <ns>[.<set>]
```
```例
select * from test.hoge
+--------+-----+
| name   | age |
+--------+-----+
| "fuga" | 20  |
| "piyo" | 30  |
+--------+-----+

select * from test.hoge where PK = 1
+--------+-----+
| name   | age |
+--------+-----+
| "fuga" | 20  |
+--------+-----+
```

#### update
```
select * from test.hoge where PK = 1
+--------+-----+
| name   | age |
+--------+-----+
| "fuga" | 20  |
+--------+-----+

insert into test.hoge (PK, name, age) values (1, 'fugagaga', 50)

select * from test.hoge where PK = 1
+------------+-----+
| name       | age |
+------------+-----+
| "fugagaga" | 50  |
+------------+-----+
```

#### delete
```
delete from test.hoge where pk = 1
```


Aerospikeはキーは保存せずダイジェストのみ保存しているそうで、AQLからキーを参照することができないようです。

どのクライアントライブラリにも`WritePolicy.sendKey`のような設定があり、ここをtrueにすればキーも保存され参照できるようになるらしいです。
（全部[このブログ](http://skatsuta.github.io/2015/10/20/aerospike-key/)で説明されていましたm(_ _)m）

## PHPクライアントから使ってみる
[公式マニュアル](http://skatsuta.github.io/2015/10/20/aerospike-key/)

後ほどアップデートします。
VMWare vSphere 6にマルチパスプラグインをインストールする 2

さて2回目ではマルチパスプラグインをインストールしてみよう。
ここでは某社製のプラグインをインストールするけど、他のベンダーでもやり方は同じはず。

##1. プラグインファイルをアップロードする
vSphere Clientのデータストアブラウザを使ってファイルをアップロードする。
ファイルはZIPファイルのままアップロードする。
※ダウンロードしたファイルはさらにZIPで固められている場合が多いので、一度解凍してみよう。


##2. 対象ホストをメンテナンスモードにする

##3. SSHでログインしてインストールする
ESXiにSSHでログインして、以下コマンドを実行。
なお、インストールする前に1回目で書いたコマンドでどんなSATP,PSPを使っていたのかを確認しておくことを忘れずに。
正常に終わると再起動を求められる。

```
> esxcli storage nmp device list
naa.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   Device Display Name: FUJITSU Fibre Channel Disk (naa.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
   Storage Array Type: VMW_SATP_ALUA
   Storage Array Type Device Config: {implicit_support=on;explicit_support=off; explicit_allow=on;alua_followover=on; action_OnRetryErrors=off; {TPG_id=32912,TPG_state=ANO}{TPG_id=32897,TPG_state=AO}}
   Path Selection Policy: VMW_PSP_RR
   Path Selection Policy Device Config: {policy=rr,iops=1000,bytes=10485760,useANO=0; lastPathIndex=1: NumIOsPending=0,numBytesPending=0}
   Path Selection Policy Device Custom Config: 
   Working Paths: vmhba4:C0:T0:L0
   Is USB: false

> esxcli software vib install -d "/vmfs/volumes/Storage2/FJT_satp_eternus_112.zip"
Installation Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: FUJITSU_bootbank_fjt_satp_eternus_1.1.2-0
   VIBs Removed: 
   VIBs Skipped:
```

##4. ESXiを再起動する

##5. インストール確認
ESXiにSSHでログインして、以下コマンドを実行。
SATPが切り替わっていることを確認する。

```
> esxcli storage nmp device list
naa.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
   Device Display Name: FUJITSU Fibre Channel Disk (naa.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
   Storage Array Type: FJT_SATP_ETERNUS
   Storage Array Type Device Config: {FJT_SATP_ETERNUS device config options }
   Path Selection Policy: VMW_PSP_RR
   Path Selection Policy Device Config: {policy=rr,iops=1000,bytes=10485760,useANO=0; lastPathIndex=1: NumIOsPending=0,numBytesPending=0}
   Path Selection Policy Device Custom Config: 
   Working Paths: vmhba4:C0:T0:L0
   Is USB: false
```

##7. 対象ホストのメンテナンスモードを解除する

##8. vMotionして他の機器もインストールする
1台だけでは意味が無いので、ちゃんと全台にインストールしましょう。

## 効能
効果はわからないけど、いざというときに役に立つ感じかな。
ベンダーによっては性能向上できるものもあるので、インストールできるなら積極的に試すのがいいと思う。
AngularJSで 連動するSelectタグを作成する


大項目と詳細が定義されたJsonを用いる前提で、ユーザーの大項目の選択によって、詳細の内容を変更したい場合。
また、UIはSelectボックスを想定しています。

```data.js
$data = [{
	top_key: 't1',
	top_label: '大項目1',
	details: [
		{ key: 'd1', label: '大項目1の詳細1' },
		{ key: 'd2', label: '大項目1の詳細2' }
	]
},
{
	top_key: 't2',
	top_lebel: '大項目2',
	details: [
		{ key: 'd3', label: '大項目2の詳細1' },
		{ key: 'd4', label: '大項目2の詳細2'}
	]
}];
```

filterでなんとかなったりします。

```sample.html
<div class="top">
	<select ng-model="top"
		ng-options="t.top_key as t.top_label for t in data"></select>
</div>
<div class="detail">
	<select ng-model="detail"
		ng-options="d.key as d.label for d in (data | filter:{top_key:top})[0].details"></select>
</div>
```

処理の流れとしては

- $dataに関して、top_keyプロパティの値でfilterして、それぞれに対応するdetails配列を取得
- あとはそのコレクションで普通にselectを表示してあげる

ただ、arrayをfilterした結果はarrayなので、unwrapするために[0]でアクセスしているのがかっこ悪い。また、ng-modelの初期値には気をつける必要があるので、もっとかっこいい方法を知っている方がいたら教えて下さいm m
【PHPStrom】保存したら自動でFTPのアップロードを行う設定

ローカルで開発してサーバで動作確認しているので自動でFTPしてくれる機能重宝している。以下設定方法。

##FTP先のサーバの設定
メインメニュー->Tools->Deployment->Configuration…

左上のプラスボタンを押すと以下の画面が表示される。
適当な名前とType選択。

![image](https://qiita-image-store.s3.amazonaws.com/0/34560/5d9b5068-27c9-bcad-7923-ba7725dc180a.png)

Connectionタブで各設定を行う。Testで接続できればOK。

![image](https://qiita-image-store.s3.amazonaws.com/0/34560/fc41b1f0-59c5-a874-47bb-713d9153638b.png)

##FTP先のサーバの設定
Mppingsタブでローカルのディレクトリとサーバのディレクトリの紐付を行う。

![image](https://qiita-image-store.s3.amazonaws.com/0/34560/7c7a18ba-9ee5-1e3e-62ed-ae7dd5b9e5c1.png)

##保存でアップロードする設定
ToolsメニューからDeproyment＞Automatic Uploadにチェックを入れる。
Deproyment＞Options...を開き、Upload changed files automatically to the default serverをOn explicit save actionにして保存したときのみアップロードにする。

参考
[FTPのアップロード・同期化の設定](http://www.mikame.net/pr/archives/162)
[[PhpStorm]FTPアップロードの設定](http://www.happyquality.com/2012/06/14/2292.htm)
pythonでグラフを描くと縦横比がずれる


`plt.axis('equal')`

としても縦横比がずれた画像が出力されてしまいます。

`plt.gca().set_aspect('equal', adjustable='box')`

とするとうまくいくようです。

参考：
http://stackoverflow.com/questions/17990845/how-to-equalize-the-scales-of-x-axis-and-y-axis-in-python-matplotlib
[Excel] 列文字・列番号の変換をかろやかに行いたい

# やりたいこと

ExcelでADDRESS関数を使おうとなると、列番号は数字でないとかろやかに変換ができない。けれども、列はいつもABCのABC26進法で表示されている。Gぐらいまでならなんとか、でもY列とかどうよ！ 数えたくない！　

そんな、Z列なら26番目、26番目といったらZ列、を軽やかに関数で取得する簡単なTipsです。

# EXCEL関数でごにょごにょする。

## 列文字から列番号に変換する（Z->26）
```
=CELL("col",INDIRECT(A1&"1"))
```

CELL関数で、列番号情報を取得します。

## 列番号から列文字に変換する（26->Z）
```
=SUBSTITUTE(ADDRESS(1,B15,4),1,"")
```

ADDRESS関数でCELL文字を取得したところから、行番号をSUBSTITUTEで削除します。

# 実際例

上記を適用した関数の実際例です。

 ![WS001.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/497e2234-66ea-b8ca-0493-16f681e78f32.jpeg)
【NCMB】Nifty Cloud Mobile Backendのパーミッションの基本

今まであまり注意してみていなかったNCMBのパーミッション

![permission.png](https://qiita-image-store.s3.amazonaws.com/0/92141/3ec27327-3a2b-62ef-16a3-fd42229926b8.png)


「読込」って何だよ？(´・ω・｀)

となってので、いろいろ試してみました。
ちなみに権限が無いと403エラーが返ってきます。

一応、公式ドキュメントはこちら
[データストア（JavaScript）:アクセス権限設定](http://mb.cloud.nifty.com/doc/current/datastore/contents_javascript.html)

#読込
**findById()に制限**を与えます。
読込と検索の違いですが、**「読込はObjectId指定でのレコードの読込」**のことです。
エンドユーザーに特定のデータ以外を見せたくない場合は制限をかけましょう。

**findByIdとか普段使わないから、存在すら知りませんでした。**

以下、サンプル。

```
var read_test = (function(){
	var Test = ncmb.DataStore("Test");
	Test.fetchById("hogeHogeFugaFUga")
	.then(function(res){
		alert(JSON.stringify(res));
	})
	.catch(function(e){
		alert(e);
	});
});
```

これ以降は公式ドキュメントにも記載がある内容です。

#検索
読込でも触れましたが、こちらは**fetch()**または**fetchAll()に制限**を与えます。
エンドユーザーにデータを一切見せたくない場合は制限をかけましょう。

```
var find_test = (function(val){
	var Test = ncmb.DataStore("Test");
	Test
	.fetchAll() // or fetch()
	.then(function(results){
		if (results.length == 0)return;
		alert(JSON.stringify(results));
	})
	.catch(function(e){
		alert(e);
	});
});

```

#更新
**update()に制限**を与えます。
私の認識では、既存の行Objectを取得しておく必要があるので、
利用の際は、少なくとも**「読込」または「検索」のどちらかに権限が必要**です。
エンドユーザーにデータを更新させたくない場合は制限をかけましょう。

```
var update_test = (function(val, new_val){
	var Test = ncmb.DataStore("Test");
	Test.equalTo("value", val)
	.fetchAll()
	.then(function(results){
		if (results.length == 0)return;
		var obj = results[0];
		obj.set("value", new_val);
		obj.update();
	})
	.catch(function(e){
		alert(e);
	});
});
```
#作成
**create()**または**batch()に制限**を与えます。
エンドユーザーにデータを作成させたくない場合は制限をかけましょう。

```
var create_test = (function(val){
	var Test = ncmb.DataStore("Test");
	var test = new Test();
	test.set("value", val).save().then(function(results) {
		alert(JSON.stringify(results));
	}).catch(function(err) {
		alert(err);
	}); 
});
```

#削除
**delete()に制限**を与えます。
「更新」と同様に私の認識では、既存の行Objectを取得しておく必要があるので、
利用の際は、少なくとも**「読込」または「検索」のどちらかに権限が必要**です。
エンドユーザーにデータを削除させたくない場合は制限をかけましょう。

```
var delete_test = (function(val){
	var Test = ncmb.DataStore("Test");
	Test.equalTo("value", val)
	.limit(1)
	.fetchAll()
	.then(function(results){
		if (results.length == 0)return;
		var obj = results[0];
		obj.delete();
	})
	.catch(function(e){
		alert(e);
	});
});
```
#フィールド追加
**set()に制限**を与えます。
フィールド追加のため、利用の際は、少なくとも**「作成」または「更新」のどちらかに権限が必要**です。
エンドユーザーにカラムを追加させたくない場合は制限をかけましょう。

```
var add_col_test = (function(val){
	var Test = ncmb.DataStore("Test");
	var test = new Test();
	test
	.set("value", val)
	.set("add", "add") //←ここで増えてます。
	.save().then(function(results) {
		alert(JSON.stringify(results));
	}).catch(function(err) {
		alert(err);
	}); 
});
```

#まとめ
javascriptから**NCMBを使うのはとても簡単**です。

簡単なサービスなら無料ホスティングサービスと組み合わせることで、**コストを掛けず**サービスのリリースが可能です。

個人的には**神バックエンド**だと思ってます。

その反面、権限周りを正確に設定しておかないと悪意のあるユーザーに大切な**データを破壊される危険性**があります。（可能性は低いですが…）

というのもChromeやsafariの開発者向けコンソールから任意のコードが実行できるからです。
権限をすべて与えていると、記述したjavascriptに関係なく、意図しないコードを実行されるリスクが出てきます。

そのため権限設計は丁寧に行いましょう。
CumulusLinuxのインストール〜ライセンス投入まで

#DHCP&httpサーバー
- 都合によりWin機しか無かったのでBlackJumboDog（！）で
- httpサーバーのルートディレクトリにCumulusLinuxのbinファイルを`onie-installer`という名前で置いておく

#インストール
- スイッチの電源を入れる
- コンソールに`Press Esc to stop autoboot ...`と表示されたら急いでEscキー
- TUIが出るのでInstall OSを選択

```
 +----------------------------------------------------------------------------+
 |*ONIE: Install OS                                                           |
 | ONIE: Rescue                                                               |
 | ONIE: Uninstall OS                                                         |
 | ONIE: Update ONIE                                                          |
 | ONIE: Embed ONIE                                                           |
 | ONIE: Diag ONIE                                                            |
 | DELL-DIAG                                                                  |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 +----------------------------------------------------------------------------+
```

- 勝手にOSを探してインストールしてくれる

```
Info: Fetching http://10.0.0.1/onie-installer ...
ONIE: Executing installer: http://10.0.0.1/onie-installer
Verifying image checksum ... OK.
Preparing image archive ... OK.
```

- ちなみに、httpがダメだとtftpも探してくれるみたい

```
Info: Fetching tftp://10.0.0.1/onie-installer ...
```

#ライセンス
- ブートプロセスを見ていると、licenseの所でfailしている

```
[....] Starting Cumulus Networks switch chip daemon: switchd1455033617.683636 2016-02-09 16:00:17 license.c:318 CRIT No license file.
logger: No license.  Switchd will not start
failed!
```

- ログインしてライセンス投入

```
cumulus@cumulus$ sudo cl-license -i
[sudo] password for cumulus:
Paste license text here, then hit ctrl-d
**ライセンス文字列をペーストしてctrl+d**
License file installed.
Service 'switchd' is not running.
Run 'service switchd restart' or
Reboot to enable functionality.
```

- 再起動してみるとライセンスでfailが出ないことが確認できる
[改訂版]継承可能なSingleton基底クラス（VB.Net）

#元ネタ
[継承可能なSingleton基底クラス（VB.Net）](http://qiita.com/redseen/items/46d92faf547505240285)

これに関して後輩と話していたところ「型推論効くっすよ、ディクショナリはいらねーしw」と言われ驚愕。提示されたのが下のソース。

#[改訂版]基底クラス
```vbnet:AbstractSingletonClass.vb
''' <summary>
''' [改訂版]シングルトン基底クラス
''' </summary>
''' <remarks></remarks>
Public MustInherit Class AbstractSingletonClass(Of T)

    ''' <summary>
    ''' シングルトンインスタンス
    ''' ディクショナリ不要！！
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared _Instance As T = Nothing

    ''' <summary>
    ''' インスタンス生成排他ロックオブジェクト
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared ReadOnly _SyncLockCreateInstance As New Object

    ''' <summary>
    ''' コンストラクタ（Protected）
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

    End Sub

    ''' <summary>
    ''' インスタンス取得
    ''' </summary>
    ''' <typeparam name="T"></typeparam>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetInstance() As T

        SyncLock _SyncLockCreateInstance

            'インスタンス生成済みかチェックする
            If _Instance Is Nothing Then
                '無ければ生成する
                _Instance = CType(System.Activator.CreateInstance(GetType(T), True), T)
            End If

            '返す
            Return CType(_Instance, T)

        End SyncLock

    End Function

End Class
```

#派生クラス
```vbnet:SingletonA.vb
''' <summary>
''' 派生クラスA
''' </summary>
''' <remarks></remarks>
Public Class SingletonA
    Inherits AbstractSingletonClass(Of SingletonA)

    ''' <summary>
    ''' コンストラクタ（Protected）
    ''' </summary>
    ''' <remarks></remarks>
    Protected Sub New()

    End Sub

End Class
```

#使い方
```vbnet:
'型推論が効く！！
Dim S = SingletonA.GetInstance()
```

え？？これじゃ静的フィールドの_Instanceを入れ替えてるんだから2個目、3個目の派生クラスのインスタンスが保持れないでしょ？と指摘したのだが「いや、イケてますww」との返事。・・・確かに。

#今回勉強になったポイント
**ジェネリクスの静的フィールドの場合、型毎に保持される。**

[参考:ジェネリッククラス内の静的フィールドの挙動について](http://neue.cc/2014/09/16_478.html)

なので、ディクショナリを使わずとも1つの型に対して別々の静的フィールドが割り当てられるためインスタンスを正しく保持することができる。

#残る問題
以前のクラスでは扱う型を基底クラスの派生に制限していたが、今回はクラス宣言の時点で型を決めるため制限することができない。
・・・が、そもそも制限しなければいけない理由が見つからなかった。結局、単に派生しただけではSingletonは保証されるわけではなく、派生先のコンスタラクタを隠すことを忘れてしまうと複数のインスタンスが生成可能になってしまう。（これを強制する仕組みは今のところ無い？）

#最終的には
問題点よりもいちいちGetInstanceを書かなくてよい、インスタンス生成に型推論が効くということの恩恵の方がはるかに大きいので改訂版を使用することに決めた。
サーバーってなんなのか改めて考えてみた

#はじめに
私もエンジニアの端くれとして社会人になって間もなく丸一年が経過しようとしています（とてもペーペーですが）
いろいろ書きたい記事があって温めてはいるんですが、
>そもそも僕らエンジニアが扱ってる"サーバー"って一体何なの？

あんまり考えたこと、ありませんでした・・・。
というわけで、備忘録までに。

#サーバーって何よ？
##1. 語源
英語のServer(serveする人/もの)に由来する。
→　Serveとは... 尽くす/(任務などを)務める/(人に)役立つ/(食物などを)提供する/サーブする/(人に)仕える etc...
(スーパーアンカー英和辞典 学習研究社より)

つまり社ちｋ・・・じゃなくてサーバーとは(相手に対して)**何らかの商品を提供して役に立つ存在のことを指す。**ということです。

##2. 相手との関係性
語源からしてサーバーには相手が必要です。
じゃあその相手って何よというと、**"顧客(クライアント)"**という言葉がそれに当たります。よく聞く言葉ですね。
サーバー・クライアント型のネットワークがまさにそれの象徴ともいえる形と言えます。

一般には、サーバーがクライアントに提供する商品のことを**"サービス"**と呼びます。

#サーバーは何を提供するのか
ひとえにサーバーと言っても、世の中本当に様々な種類があります。そもそもサーバーとして稼働しているのが見えるのって、一般ユーザー的には外部公開用セグメントにいるWebサーバーや普段自分たちが利用しているメールで使う送受信サーバーくらいですよね、実際。
代表的なサーバーの種類について、軽くではありますがまとめてみます。

##1.Webサーバー
Webシステム上において、**クライアント側のWebブラウザーが要求するリクエストに対して**、自身の持つデータを提供するサーバーのことです。
ブラウザーがリクエストするものということなので、基本的にはHTTP(HyperText Transfer Protocol)プロトコルを中心としたHTML(HyperText Markup Language)ファイルなどを扱います。基本的にはサーバーマシン(またはPC)に対して、サーバーソフトウェアと呼ばれるミドルウェアを導入することで実装が可能です。
主なサーバーソフトウェアとしては、Apache, nginx, h2o, IIS(Windows)などがあります。

##2.メールサーバー
クライアントに対して**メールの送受信サービスを提供する**サーバーのことです。
とくに、自身のネットワーク宛に送られたメールを保管して適切なユーザーに対してメールを渡すサーバーを受信メールサーバーといい、
自ネットワーク内のユーザーから他ネットワークへメールを送り届けるサーバーのことを送信メールサーバーといいます。
受信サーバーではIMAPやPOP3、送信サーバーではSMTPと呼ばれるプロトコルを使ってメールの送受信を行います。こちらも、サーバーソフトウェアを導入することで実装できます。
主なメールサーバーのソフトウェアにはPostfixやDovecotなどがあります。

##3. データベースサーバー
**データベース内に顧客情報などを管理し、必要に合わせて情報を保存・上書き・引き出す**ためのサーバーです。
規模の比較的大きいウェブサイトやアプリケーションにおいては必須の存在で、顧客のデーターが多ければ多いほどこのサーバーが運用上の体感速度に影響を与えるとも言えます。
顧客情報を直接管理するという関係上、普段は社内ネットワークや外部から直接閲覧できないセグメントに置かれていますが、Webサーバーなどのリクエストに合わせて情報をやりとりすることがあります。
一般にはSQL(MySQL, PostgreSQLなど)を導入することが多いです。

##4. DNSサーバー
名のとおり、DNS(Domain Name System)サービスを提供するためのサーバーです。
今回DNSについて詳しくは書きませんが、外部用のDNSサーバーと内部のみで利用するタイプがあります。
外部DNSはインターネットにアクセスする際の名前解決を担ってくれるサーバー、内部DNSは内部でのやりとりを円滑に進めるためのサーバーです。
よく知られたDNSサーバーのソフトウェアにはBINDなどがあります。

##5. アプリケーションサーバー
俗にWebアプリケーションサーバのことを指す用語ですが・・・。
クライアントからの要求に対し、**データベース等から必要なデータを取り出して提供するための、橋渡しをしてくれる**サーバーを指します。
ウェブサイトでマークアップ言語(HTMLなどブラウザが解釈できるもの)以外に何らかのプログラミング言語によって作成されたコンテンツがある場合、クライアント側に対してその実行環境を提供したり、従来クライアント側で対応しなければならなかった面倒な制御を一挙に行ったりしてくれます。
流れとしては以下のようなイメージ
クライアント <---> Webサーバー - アプリサーバー <---> DBサーバー
代表的なアプリケーションサーバーソフトウェアには(といってもプログラミング言語自体大量にありますけど)JavaのTomcatやRuby on RailsのUnicornなどがあります。


# まとめ
今回挙げた5つ以外にも、ProxyやVPNなど、みなさんが利用するネットワークのあらゆるコンテンツにはかならず提供者(サーバー)が存在します。
運用フェーズに携わる人間としては24時間365日稼働(メンテ等除く)というのがどれだけ維持に工数かかってるかというのは本当に考えるのが辛いですが、世の中には、以上のような、いろいろなサービスを提供してくれる人やサーバーたちがいるんだなあと再認識することができればいいかなと思っています。
内容についてご指摘・修正点等あればご教示をお願い致します。ただし○○ちゃんが入ってない！などはきりがないのでお控えください・・・。
SHOW SLAVE STATUSでRelay_Log_Posのみ更新されない現象

複数のDBサーバーをレプリケーションしていたときに遭遇した現象。

# 結論
**server_idが重複していた。**

# 環境
本件ではあまり関係ないと思うが、一応記載。
OSバージョン CentOS 5.6　\#ｺﾏﾝﾄﾞ $ cat /etc/redhat-release
MySQLバージョン 5.1.66　 \#ｺﾏﾝﾄﾞmysql -u username -p'password' -D mysql -e "SELECT version()"

# 経緯
そこそこの台数のDBサーバーをレプリケーション設定していく中で、
レプリケーションが上手くいかないサーバーが出てきた。

しかし、SHOW SLAVE STATUSを見ても、
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
となっており、エラーにも何も出力されていない。
(レプリケーションが失敗していれば大抵は上記ステータスがNoとなる)

Read_Master_Log_Posなども更新されている中
Relay_Log_Posの数値が全く動いてないことに気づいた。

しかしググッても解決できず、
何度構築し直しても改善されず、困り果てた。

そして調査を続けるうちに、Masterサーバーとserver_idが被っていることが判明。

あまりにも単純なミス故にネットでも情報が少ないのか、
検索の仕方が悪かっただけなのか。

遭遇しそうで、遭遇しないだろう貴重(?)な体験だったので、メモ程度に。
ノーツのビューで、値があるのに空白表示されたり、おかしな内容が表示される場合、$nというフィールドが出来てしまっているかも。

#なりゆき
ドミノ/ノーツで、データベースのビューを作成していました。
いちばん左の列に、式 [＠NoteID](http://www-01.ibm.com/support/knowledgecenter/api/content/SSVRGU_8.5.3/com.ibm.designer.domino.main.doc/H_NOTEID.html?locale=ja) を指定して表示させたのですが、いくつかの文書（ビューエントリ）で空表示されてしまいました。ダブルクリックすれば文書が開けますし、文書のプロパティをみるとしっかりIDやURLは表示されるので、壊れているようでもなく。
＠NoteID を表示させる列を一番右の列に移動させたところ、こんどはしっかり表示されました。

該当文書について、プロパティのフィールド一覧の値を確認してみると、他の文書には見られない $1 なるフィールドを発見。

#解消方法
ビューにアクションをつくり、次のようなスクリプト (LotusScript) を走らせて、フィールド $1 を削除しました。
とりあえず、解消。

```
Sub Click(Source As Button)
	Dim ws As New NotesUIWorkspace
	Dim uv As NotesView
	Set uv = ws.CurrentView.View
	
	Dim doc As NotesDocument
	Set doc = uv.GetFirstDocument
	Do Until doc Is Nothing
		If doc.HasItem("$1") Then
			Call doc.RemoveItem("$1")
			Call doc.Save(False, False)
		End If
		Set doc = uv.GetNextDocument(doc)
	Loop
End Sub
```

ノーツ利用者とともに、フレッシュな情報も年々減少していることと思います。ドミノ／ノーツをお使いの皆様、ぜひ情報共有しましょう！