OmniAICreator/Qiita-1.07M huggingface dataset:
毎回5分かけてたAWS Lambdaへのデプロイを20秒にしよう

# AWS LambdaのデプロイをJenkinsで自動化しようぜ。という記事です。

# はじめに

* 今回も小ネタ。
* はじめはHelloWorldで遊んでいても、複雑なものを作り始めると繰り返しFunctionの再登録をしたくなるわけですが、AWSのマネジメントコンソールからjarをアップロードしてFuctionの再登録する手間が面倒になってくるわけです。
* また、気付いたら依存ライブラリが多くなってしまい5MBくらいのjarになったあたりからアップロードするまでの時間がかかりすぎて段々イライラしてきます。
* ということでJenkinsを使ってLambdaFunctionを自動登録する方法をご紹介します。Jenkinsになれた人なら30分くらいあればできると思います。

# 処理の流れ

1. BitBucketへのコミット
2. BitBucketのweb hookでJenkinsのビルド起動
3. ビルド(Jenkins)
4. S3へのjarのアップロード(Jenkins)
5. S3からLambdaFunctionの登録(Jenkins)

私の環境では上記のような感じで稼働していますが、webhookとかそんなに目新しい話でもないので4と5についてご紹介します。

# 前準備

* S3へのファイルアップロードもS3からLambdaへのFunction登録もAWS上のJenkinsから行います。
* S3とLambdaへのアクセスするときにアクセスキーとシークレットアクセスキーは使いません。
* 代わりにInstanceProfileを利用しますので事前にJenkinsが稼働するEC2のインスタンスに対してS3とLambdaにアクセスできる権限をIAM Roleで付与しておいてください。

# S3へのjarのアップロード
 
* [S3プラグイン](https://wiki.jenkins-ci.org/display/JENKINS/S3+Plugin)を使うことでビルド後にできたjarファイルをS3にアップロードしてくれます。
* [Jenkinsの管理] - [システムの設定] - [Amazon S3 profile]に以下のように設定します。

![システムの設定 [Jenkins] 2016-03-14 15-00-27.png](https://qiita-image-store.s3.amazonaws.com/0/57686/663ccf6c-6d3f-5611-9562-d266ef9c49ff.png)

* Jenkinsのビルド設定画面で[ビルド後の処理の追加] - [Publish artifacts to S3 bucket]をクリックして以下にならって設定します。


![2.cmp-activity Config [Jenkins] 2016-03-14 15-21-11.png](https://qiita-image-store.s3.amazonaws.com/0/57686/3d1044eb-ed07-7fd9-f2d1-33f878093dcc.png)

* これで設定は完了です。超簡単ですね。

# S3からLambdaFunctionの登録

* [AWS Lambda Plugin](https://wiki.jenkins-ci.org/display/JENKINS/AWS+Lambda+Plugin)を使用します。
* S3に登録されたモジュールを取得してLambdaFunctionに登録してくれるプラグインです。
* Jenkinsのビルド設置画面で[ビルド後の処理の追加] - [AWS Lambda Deployment]をクリックします。
* 設定の内容はAWSのマネジメントコンソールでの設定と変わりませんが注意点はロール名でして、ARNで記載する必要があります。また、LambdaのVPN対応も行われていまして、[高度な設定]をクリックするとVPCとSecurityGroupを登録することができます。

![2.cmp-activity Config [Jenkins] 2016-03-14 15-14-05.png](https://qiita-image-store.s3.amazonaws.com/0/57686/0985034e-a432-4133-afba-2ae01f738d26.png)

# Lambda Functionが更新されているのか？

* 実はマネジメントコンソールからだと更新されているかどうかがよくわかりません。
* そういう場合はaws cliを使ってfunctionのLast Modifiedを見てあげるとか、Descriptionにビルド時間を入れてあげると良いと思います。
* ちなみにLastModifiedは以下のようなコマンドでみることができます。

```
[ec2-user@ip-10-0-1-26 target]$ aws lambda get-function --function-name Ec2InstanceState --region ap-northeast-1 | jq
{
  "Code": {
    "RepositoryType": "S3",
    "Location": "https://xxxxxx"
  },
  "Configuration": {
    "FunctionName": "Ec2InstanceState",
    "MemorySize": 512,
    "CodeSize": 8802205,
    "FunctionArn": "arn:aws:lambda:ap-northeast-1:194851312534:function:Ec2InstanceState",
    "Handler": "jp.gr.java_conf.uzresk.cmp.activity.aws.ec2.Ec2InstanceActivity::xxxx",
    "Role": "arn:aws:iam::123456789012:role/LambdaFunction",
    "Timeout": 300,
    "LastModified": "2016-03-14T06:09:37.885+0000",
    "Runtime": "java8",
    "Description": "getting ec2 instance status"
  }
}
```

# まとめ

* 1 Function入れ替えるのに5分くらいかかっていたのが20秒で済むようになりました。
* 私が使っているLambdaFunctionはせいぜい10個〜20個程度なのでいちいち設定すれば良いのですが、たくさんになった場合は再考が必要ですね。ということで小ネタでした。
CrossWalkで頻発する network change was detected の対処方法


CrossWalk 17.46.448.10で確認しています。


## そもそもなぜ CrossWalkを使うのか

Android4.4.2で発生する、WebViewでfile chooserがオープンできないバグ
http://stackoverflow.com/questions/23568792/android-4-4-webview-file-chooser-not-opening

のためだけにCrossWalkを使用しています。
早く絶滅しないものか。


しかし、時々

```
network change was detected
```

というメッセージが出て処理が止まります。
ちなみに以前はダイアログでしたが最近のCrossWalkではToastでメッセージが出ます。
でも処理が進まないのは変わらないのでたいして意味はありません。


## 対処法

```java
//呼び出し元
XWalkView view = new XWalkView(this);
XWalkView view.setResourceClient(new MyXWalkResourceClient());


.
.
.


public class MyXWalkResourceClient extends XWalkResourceClient {
.
.
.
   @Override
    public void onReceivedLoadError(XWalkView view, int errorCode, String description, String failingUrl) {
        if(errorCode == -1){
            // network change was detected.
            view.load(failingUrl, null);
            return;
        }
        super.onReceivedLoadError(view, errorCode, description, failingUrl);
    }

```

該当する場合は強制的にロードし直しているだけです。
URLで指定されたファイルのバイナリデータをBase64でエンコードする

# やりたいこと
* URLで指定されたファイルのバイナリデータをBase64でエンコードしたい
* スマホのブラウザで動かしたい

# やること
1. ファイルをバイナリデータでダウンロードする
2. ダウンロードしたバイナリデータをUnicode文字列に変換する
3. Unicode文字列をBase64エンコードする

# やりかた
## ファイルをバイナリでダウンロードする
やりかたはいろいろあるようですが、XmlHttpRequestを使うのが一番楽なようです。
下記のやり方で読み込みが完了した後、`var binaryData`の中に、[ArrayBuffer](http://qiita.com/edo_m18/items/612d2b31498d22d13b7b)が取得されます。

```js
function fetchImage( uri ) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', uri, true);
  xhr.responseType = "arraybuffer";
  xhr.onload = function() {
    var binaryData = this.response;
  };
  xhr.send();
};
```

## バイナリデータをUnicode文字列に変換する
Base64エンコードするために、バイナリデータを文字列に変換する必要があります。
1バイトにつき1文字のUnicode文字を生成します。
arrayBufferを操作するには、何らかのTypedArrayを使います。1バイトを1つの文字として扱いたいので、Uint8でよいでしょう。
`String`の[`fromCharCode()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)は、あるUnicode値を受け取り、文字(列)に変換することができます。

```js
function getUnicodeString( arrayBuffer ) {
  var bytes = new Uint8Array( arrayBuffer );
  var binaryString = "";
  for( var i = 0; i < bytes.byteLength; i++ ) {
    binaryString += String.fromCharCode( bytes[ i ] );
  }
  return binaryString;
};
```

## Unicode文字列をBase64に変換する
たいていのブラウザには、`window`オブジェクトに[`btoa()`](https://developer.mozilla.org/ja/docs/Web/API/WindowBase64/btoa)というメソッドが実装されています。
これを使うことで、Unicode文字列が簡単にBase64化できます。
ただし、注意したいのは、入力できるUnicodeの範囲は0～255までだということです。
本来、Unicodeは多くの文字列を扱うことができるため、255より大きなコードを持つ文字もありますが、そのような文字を含む文字列を渡した場合例外が発生します。
上でバイナリデータをUnicodeに変換しているとき、Uint8Arrayを使用しているのは、0～255までの文字コードで構成された文字列を取得したいからです。

```js
function getBase64( string ) {
  return window.btoa( string );
}
```

# 最終的な実装
以下のようになります。

```js
function main() {
  fetchImage( "hoge.png", function() {
    var unicode = getUnicodeString( this.response );
    var base64 = getBase64( unicode );
    printBase64( base64 )
  } );
}

function printBase64( base64 ) {
  console.log( base64 );
}

function fetchImage( uri, callback ) {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', uri, true);
  xhr.responseType = "arraybuffer";
  xhr.onload = callback;
  xhr.send();
};

function getUnicodeString( arrayBuffer ) {
  var bytes = new Uint8Array( arrayBuffer );
  var binaryString = "";
  for( var i = 0; i < bytes.byteLength; i++ ) {
    binaryString += String.fromCharCode( bytes[ i ] );
  }
  return binaryString;
};

function getBase64( string ) {
  return window.btoa( string );
}
```
【書きかけ】相関係数

相関係数はよく知られているものが３つ

pearson

spearman

kendall

医学統計で出てくるのは上2つが多い。

単純な相関係数を計算するだけであれば、

cor(data, method=c("spearman","pearson"))

で計算できる。検定を行いたい場合はtest.corである。

相関係数の検定では帰無仮説で相関係数＝０とおいているので、p値が小さくなった場合も相関係数は０であるとは言えない。
程度のことしか言えないことに注意。つまり実際の相関係数の値もよく確認すべきということ。

ちなみにメタ解析やシステマチックレビューの場合はそれぞれのデータにその試験アームの患者数などで重みをつけることが多い。

この時重み付けの解析となる。
C#でbrainfuck

C#の練習で実装
>brainfuckとは http://dic.nicovideo.jp/a/brainfuck

一部機能は実装してないが、Hello World!出力できたのでよし

### 入力
``+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.``

### 出力
``Hello, world!``

### コード

```cs:brainfuck.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace brainfuck
{
    class BrainFuck
    {
        static int search1(string str, int start)
        {
            int c = 0;
            for (int i = start + 1; i < str.Length; ++i)
            {
                if (str[i] == '[')
                {
                    c++;
                }
                if (str[i] == ']')
                {
                    if (c == 0)
                    {
                        return i;
                    }
                    else
                    {
                        c--;
                    }
                }
            }
            return -1;
        }

        static int search2(string str, int start)
        {
            int c = 0;
            string rev = new string(str.Reverse().ToArray());
            int rev_start = str.Length - start - 1;
            for (int i = rev_start + 1; i < rev.Length; ++i)
            {
                if (rev[i] == ']')
                {
                    c++;
                }
                if (rev[i] == '[')
                {
                    if (c == 0)
                    {
                        return str.Length - i - 1;
                    }
                    else
                    {
                        c--;
                    }
                }
            }
            return -1;
        }

        public static void Main(string[] args)
        {
            int[] memory = new int[3000];
            int address = 0;
            string str = "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.";
            for (int i = 0; i < str.Length; i++)
            {
                switch (str[i])
                {
                    case '>':
                        address++;
                        break;
                    case '<':
                        address--;
                        break;
                    case '.':
                        Console.Write((char)memory[address]);
                        break;
                    case '+':
                        memory[address]++;
                        break;
                    case '-':
                        memory[address]--;
                        break;
                    case '[':
                        if (memory[address] == 0)
                        {
                            i = search1(str, i);
                        }
                        break;
                    case ']':
                        if (memory[address] != 0)
                        {
                            i = search2(str, i);
                        }
                        break;
                }
            }
        }
    }
}
```
ズンドコVerilog


話題のズンドコを(無理|投げ)やりにVerilogで実装。

#方針
ズン、ドコの入力は1bit幅の`zundoko`信号により扱う。
`zundoko`の生成は外部に任せる。
ズンを0、ドコを1として、クロック立ち上がりで読む。

読んだ入力はシフトレジスタに詰めて、
5'b00001になったら`kiyoshi`信号をアサートする。

#コード
```verilog:zundoko.v
module ZundokoChecker(
    input clk,
    input rst,
    input zundoko,
    output reg kiyoshi
    );

localparam Zun = 1'b0;
localparam Doko = 1'b1;
localparam [4:0] SR_Initial = {Doko,Doko,Doko,Doko,Doko};
localparam [4:0] Target = {Zun,Zun,Zun,Zun,Doko};

reg[4:0] sr;
wire[4:0] sr_next = {sr,zundoko};
always @(posedge clk or posedge rst) begin
    if (rst) begin
        sr <= SR_Initial;
    end
    else begin
        sr <= sr_next;
    end
end

always @(posedge clk or posedge rst) begin
    if (rst) begin
        kiyoshi <= 1'b0;
    end
    else if(sr_next == Target) begin
        kiyoshi <= 1'b1;
    end
end


endmodule
```

#シミュレーション

とりあえず`zundoko`をシミュレーションで与える。

```verilog:zundokoTest.v

module ZundokoTest;
	reg clk;
	reg rst;
	reg zundoko;

	wire kiyoshi;

	ZundokoChecker uut (
		.clk(clk),
		.rst(rst),
		.zundoko(zundoko),
		.kiyoshi(kiyoshi)
	);

	always #10 begin
		clk <= ~clk;
	end

	always @(negedge clk ) begin
		zundoko <= $random & 1'b1;
	end
	initial begin
		clk = 0;
		rst = 1;
		zundoko = 0;

		#100;
        rst <= 0;

	end

endmodule

```

#結果

![zundoko.png](https://qiita-image-store.s3.amazonaws.com/0/72075/78551ae2-65de-466b-ed13-da78d128d5f3.png)
(完成した時の`zundoko`の取り込みタイミングに青丸を書いてます)
柔らか層外伝 グローバル・ネットワーク編

#SoftLayer と グローバル・ネットワークについて
SoftLayerの最大の強みのひとつである高品質・広帯域なグローバル・ネットワーク。インターネットと接続されている Public、とプライベート環境として利用できる Private があります。Privateは特に、データセンターをまたいだサーバー間の通信やデータの同期に活用されています。
ここでは、特に、Private 側についてお話しています。

#転ばぬ先の杖 :coffee: 

## 杖１：通信の「仕方」によっては課金されるものもある
課金されない代表格は、SoftLayer上にあるサーバーAとサーバーBの通信で、かつ、その通信がプライベート・ネットワークを使っている場合、です。
プライベート・ネットワークを使っているが、課金されるものの代表格が、SoftLayer上にある**海外**のサーバーから直接、自分のPCにデータを転送する場合、です。

## 杖２：同一VLANでも異なるセグメント間の通信を有効にするにはVLAN SpanningをONにする
プライベート・ネットワークを使って、同一VLANかつ異なるセグメントにあるサーバーの通信を有効にするさいに必要です。VLAN SpanningのON/OFFは、カスタマーポータル、またはTicketにて依頼ができます。費用はかかりません。

## 杖３：異なるDC間の通信を有効にするにはVLAN SpanningをONにする
内容は「杖２」と同じです。

## 杖４：データ転送の速度が思ったほど出ない
「SoftLayerのグローバル・ネットワークは10Gbps以上の帯域を持っていて、高速道路のようなものだ」という説明を良く耳にします。確かに。日本DCでは、執筆時点で計90Gbpsの帯域を持っています。ですが、高速道路で高速走行するのにハイスペックな車が必要なように、高速通信（正しくは、広帯域を使った通信）をするには、その帯域に対応したNICを搭載したサーバーが必要です。
SoftLayer では、10GbpsのNICを冗長構成でオーダーすると、Bonding Mode=4 で組みあがってきますので物理的には10Gbpsを二本使って通信することが出来ます。
なお、データ転送そのものの効率化には、AsperaやSkeedなど高速ファイル転送ツールが効果的であることが知られています。データの送受信の拠点が地理的に100km以上離れている場合などには効果が顕著でしょう。

#推奨されていない使い方がある
あまり知られていませんが、[Acceptable Use Policy](http://static.softlayer.com/sites/default/files/softlayer_acceptable_use_policy_-_may_2016.pdf)として、SoftLayer で推奨されていない使い方が定義されています。そのほぼ全ては、法を遵守すること、など当然のことが記載されています。しかし、一点、誤解しがちな記述があります。
> SoftLayer’s Direct Link Service may only be used to exchange traffic between Your existing SoftLayer bare metal servers, SoftLayer VSI, or SoftLayer Object Storage.

直訳すると、以下の通りですね。
> SoftLayer ダイレクトリンク・サービスは、お客様のSoftLayerサーバー（ベアメタル、仮想サーバー、オブジェクトストレージ）との通信に利用されることとします。

この記述から一転し、例えば以下のような通信は推奨されていません。
1. お客様拠点Aとお客様拠点Bの間の通信において、プライベート・ネットワークのみを**バイパス経路**のように使う通信
2. お客様拠点Aとお客様拠点Bの間の通信において、プライベート・ネットワーク上にプロキシサーバーを設置する。**AとBは直接通信しない。プロキシサーバーはBのプロキシ環境**であるような通信

これらはあくまでもプライベートでの条件となります。インターネットだけを通信経路とするシステムには適用されませんので、ご安心ください。

また、上記の1.に該当しつつも許可されている利用方法は、テレプレゼンスやVMware社のNSXを活用したハイブリッド・クラウドとしての形態です。
最新情報は [SoftLayer Legal](http://www.softlayer.com/jp/legal) か、または Ticket で確認する必要がありますので、似たような活用方法を検討されている場合は、念のため Ticket で確認しましょう。

#補足
プライベート・ネットワークのパフォーマンスを把握したいなぁ、と言う場合は、以下のサイトが参考になるでしょう。
> [developerWorks SoftLayerのプライベートネットワークのパフォーマンス ](https://www.ibm.com/developerworks/community/blogs/560da618-352c-4903-9e75-2dadfda71076/entry/softlayer%25e3%2581%25ae%25e3%2583%2597%25e3%2583%25a9%25e3%2582%25a4%25e3%2583%2599%25e3%2583%25bc%25e3%2583%2588%25e3%2583%258d%25e3%2583%2583%25e3%2583%2588%25e3%2583%25af%25e3%2583%25bc%25e3%2582%25af%25e3%2581%25ae%25e3%2583%2591%25e3%2583%2595%25e3%2582%25a9%25e3%2583%25bc%25e3%2583%259e%25e3%2583%25b3%25e3%2582%25b9?lang=en)
> [SoftLayer Looking Glass](http://lg.softlayer.com/)
> [SoftLayer スピードテスト](http://www.softlayer.com/jp/data-centers)
ボックスライブラリにtabletが表示されない

初心者です。tabletを使いたいのですが、ボックスライブラリにtabletというメニューが表示されません。２回ほど、再インストールしたのですが、表示されません。
「ボックスライブラリを開く」から表示されるのは、boxとpositionだけとなっております。
何か設定足りないでしょうか?　よろしくお願いいたします。
UNIXコマンド入門編

#環境
前回はローカル開発環境にvirtual box,vagrantを導入しcentos6.7を導入した。この環境のもとUNIXコマンドを覚えます。

#UNIXコマンドを覚えれば何ができるのか？

- ローカル(自分が使っているPC)で開発環境を構築することができる
- レンタルサーバーを借りてSSH接続で操作することができる。

注意：Windowsのコマンドプロンプトは別規格なので使えません。


#ログイン・ログアウト・パスワード

通常SSH接続する場合

```
$ ssh ユーザー名@IPアドレスorサーバー名
```

でパスワードを打ち込みログイン出来ます。

Vagrantを今回使用しているので

```
$ vagrant ssh
```

で接続します。

ログアウトは

```
$ exit
```

余談`[vagrant@localhost ~]$`はプロンプトと呼ばれていて、編集すれば変えることができます。

###passwordの変更

```
$ passed ユーザ名
```

注意:場合によって権限がないと言われる場合がある。

##ディレクトリの移動

pwd：現在のディレクトリを表示
cd :　違うディレクトリに移動。引数なしだとホームディレクトリ
~ :ホームディレクトリーを指す
. :現在のディレクトリーを指す
.. :一階層上のディレクトリを指す

ディレクトリの指定は絶対参照と相対参照がある。

#ディレクトリの構成を見る

```
$ ls
```

リスト型で表示

```
$ ls -l
```

隠しファイルすべて表示

```
$ ls -a
```

隠しファイルも含めリストで表示

```
$ ls -la
```

##ディレクトリ詳細情報(ls -la)

例えば

```
-rw-------.  1 vagrant vagrant  323  3月 14 13:57 2016 .bash_history
```

の場合、
先頭の-はシンボリックリンクか、ディレクトリなのかなどファイルの種類

でそのあとはパーミッションといい３つ区切りで所有者、所有グループ、その他で構成されている
r:read(読む)
w:write（書く）
x:‎Execute（実行）

##パーミッション

パーミッションを変更

```
$ chmod 数字　ファイル名　ユーザー名
```

##ディレクトリの削除、削除

```
$ mkdir ディレクトリ名
$ rmdir ディレクトリ名
#　ただし中身がカラの場合
```

##ファイルの作成、削除、コピー、移動、リネーム

```
$ mv　対象ファイル　行き先
```

リネーム

```
$ mv 対象ファイル リネーム名
```

ファイルのコピー

```
$ cp コピーするファイル コピーされるファイル
```

ファイル削除

```
$ rm ファイル名
```

ただしファイルがカラの場合に限る。
それ以外はオプションを指定しなければならない。

##ファイルの中身を見る

cat
less/more　（moreの方が使いやすい）
head/tail (オプションで指定可能)


##ワイルドカード

*　:任意の文字いくつでも
?　:任意の一文字
詳しくは正規表現を勉強しましょう


##ファイル検索(find)

`$ find　検索対象 -name "検索文字列" -type　　ファイルorディレクトリ(d or f)

##複数ファイルの中身から検索(grep)

`grep -オプション 探したい文字列 対象ファイル`

-cオプションは　探したい文字列とマッチした回数を表示

-rオプションは、検索対象の下層も検索される。

オプションは組み合わせることができる。

##コマンドラインの便利機能

tabキー:現在の候補を表示してくれる。
矢印キー：過去のコマンドに振り返る
history：過去のコマンド履歴
!番号:その番号のコマンド表示
!!:一回前のコマンド
!gr:先ほど実行したgrepコマンドを実行
!gr:p　実行せず先ほど実行したgrepコマンドを表示

##小技

マニュアル

```
$ man 対象コマンド
```

マニュアルにも種類があるがここでは解説しまい。

指定されたディレクトリの構成を隅々まで表示

```
$ tree
```

##時間確認

```
$ date
```

##カレンダー

```
$ cal
```

対象ファイルの行数などを表示

```
$ wc
```

オプション -l　は行数だけ指定
Pythonで波形の包絡線


scipyは非常に便利なツールで、数学的処理がたくさんつまっているモジュールで、お世話になっています。ヒルベルト変換を用いた波形の包絡線(絶対値)を描きたいと思ったら、数行で書けてしまったので、正直あっているのかどうかとても不安。``data``が、対象にしている波形とする

```python:envelope.py
from scipy import signal

envelope = abs(signal.hilbert(data))
```

これで、波形の包絡線が描けている。自分の持ってるデータで描いた結果がこれ。青が実データで赤が包絡線。
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/116528/19a51621-b76c-5eb3-6c3c-6dc084da3cd0.png "Unknown.png")


波形から特徴量を抽出して、機械学習とかを用いたいので、こういった作業はscipyにお世話になりっぱなし。ウェーブレット変換なんかも、
``signal.cwt(data, signal.ricker, np.arange(1, 31))``
こんな感じで計算が可能らしいが本当なのだろうか。それにしてもscipyすごい
Emacs の ssh接続 を peco と組み合わせて実用的にセットアップ

こんにちは、ゆめみ城田です。
今日は Emacs と peco を組み合わせた作業環境構築のことについて書きます。

# やりたいこと

```
覚えきれない数の接続先を設定した.ssh/configからホスト名を選択するだけで、
Emacsを起動させ、選択したホストにtramp接続(ssh接続)して、接続先で sudo su - を行って Diredit を開いておく
```

上記をMacのローカル環境ターミナルから実現します。

# 前提となる環境

```
Mac環境
homebrew環境
Emacs環境
pecoのインストール
```

## 目次
1）pecoのセットアップ
2）Emacsのセットアップ
3）シェル環境のセットアップ

### 1）pecoのセットアップ
pecoはゆめみF氏の紹介で知り、普段のssh接続でもお世話になりっぱなしです。
導入はhomebrewコマンドで簡単にできます

```
brew install peco
```

参考：http://qiita.com/d6rkaiz/items/46e9c61c412c89e84c38

### 2）Emacsのセットアップ

Emacs設定画面にて下記を設定

```
(add-to-list 'tramp-default-proxies-alist
             '(nil "\\`root\\'" "/ssh:%h:"))
(add-to-list 'tramp-default-proxies-alist
             '("localhost" nil nil))
(add-to-list 'tramp-default-proxies-alist
             '((regexp-quote (system-name)) nil nil))
```

これで ```C+X C+F /sudo:hostname:/``` で tramp接続 後 ```sudo su -``` をしてくれるようになります

参考ページ：http://qiita.com/miyakou1982/items/d05e1ce07ad632c94720

### 3）シェル環境設定
```vi ~/.bashrc``` などで下記aliasを設定

```
alias sudoemacs='emacs /sudo:$(grep -iE "^host[[:space:]]+[^*]" ~/.ssh/config|peco|awk "{print \$2}"):/'
```

今回はこのコマンドに ```sudoemacs``` という名前を付けました。

これにて、
Macローカル環境で ```sudoemacs``` と打つと、pecoが起動して下記のような画面になります。

```
QUERY>
Host server001.jp
Host server002.jp
Host server003.jp
Host test01.yumemi.jp
Host test02.yumemi.jp
Host test03.yumemi.jp
```

上記にて例えば ```yumemi``` と打つと、ホスト名に ```yumemi``` が入るホスト名だけ表示されますので、
今回は ```test01.yumemi.jp``` を選択してEnterするだけで

```
QUERY> yumemi
Host test01.yumemi.jp
Host test02.yumemi.jp
Host test03.yumemi.jp
```

Emacsが起動し ```test01.yumemi.jp``` にtramp接続後 ```sudo su -``` されました。

# 設定した背景

プロジェクトによっては、

* 自分専用の開発環境が無い
* 自分専用の開発環境をローカルに作成している時間がない

ということがあるかと思います。

そういった場合の共有開発環境でソースコードを触る際、
suして他のユーザになって、さらにEmacs派にとってvimで作業するのは
苦行以外の何者でもありません。

SublimeText や Atom、各IDEなどにもやり方はあると思いますが、
使い慣れたEmacsでこういったことをできるようにしておけば
フットワーク軽く作業できます。

以上です。
java Timer vs ScheduledExecutorService


#java Timer vs ScheduledExecutorService

▽：予定開始　▼：実績開始

##java.util.Timer.scheduleAtFixedRate
<span style="font-family:"ＭＳ ゴシック", monospace;">
　予定：　　▽ｎ-1　　間隔　▽ｎ　　　間隔　▽ｎ+1　　間隔　▽ｎ+2　　間隔　▽ｎ+3　　間隔　▽ｎ+4　　
　実績：　　▼ｎ-1　　間隔　▼ｎ　　　　　　　　　　　　　　▼ｎ+1　▼ｎ+2　▼ｎ+3　　間隔　▼ｎ+4　　
</span>
<p>
※：n回目の実行時間は長かった（お定の間隔時間を超える）場合
　　n+1回目からのタスクはn回目のタスクの実行完了を待ち、終了直後実行を開始する
</p>
---

##java.util.Timer.schedule
<span style="font-family:"ＭＳ ゴシック", monospace;">
　予定：　　▽ｎ-1　　間隔　▽ｎ　　　間隔　▽ｎ+1　　間隔　▽ｎ+2　　間隔　▽ｎ+3　　間隔　▽ｎ+4　　
　実績：　　▼ｎ-1　　間隔　▼ｎ　　　　　　　　　　　　　　▼ｎ+1　　間隔　▼ｎ+2　　間隔　▼ｎ+3　　
</span>
<p>
※：n回目の実行時間は長かった（お定の間隔時間を超える）場合
　　n+1回目のみのタスクはn回目のタスクの実行完了を待ち、終了直後実行を開始する
</p>
---

##java.util.concurrent.ScheduledExecutorService.scheduleWithFixedDelay
<span style="font-family:"ＭＳ ゴシック", monospace;">
　予定：　　▽ｎ-1　　間隔　▽ｎ　　　間隔　▽ｎ+1　　間隔　▽ｎ+2　　間隔　▽ｎ+3　　間隔　▽ｎ+4　　
　実績：　　▼ｎ-1　　間隔　▼ｎ　　　　　　　　　　　　　　　間隔　▼ｎ+1　　間隔　▼ｎ+2　　間隔　　
</span>
<p>
※：n回目の実行時間は長かった（お定の間隔時間を超える）場合も
n+1回目のみのタスクはn回目のタスクの実行完了を待ち、終了後、指定した間隔を空けて実行を開始する
</p>
---

#例：
```java:java.util.Timer
	TimerTask task = new TimerTask() {
	    @Override public void run() {
	    timeMessage("SCHEDULE start.");
	    timerRun(icon, args);
	    timeMessage("SCHEDULE end.");
	    }
	};
	
	Timer timer = new Timer();
```
```java:scheduleAtFixedRate
    timer.scheduleAtFixedRate(task, 0, 1000 * 3);
```
```java:schedule
    timer.schedule(task, 0, 1000 * 3);
```
---
```java:java.util.concurrent.ScheduledExecutorService
	Runnable newTask = new Runnable() {
	    public void run() {
	    timeMessage("CONCURRENT start.");
	    timerRun(icon, args);
	    timeMessage("CONCURRENT end.");
	    }
	};
	
	scheduler = Executors.newSingleThreadScheduledExecutor();
```
```java:scheduleWithFixedDelay
    scheduler.scheduleWithFixedDelay(newTask, 0, 3, TimeUnit.SECONDS );
```
capybaraでPage Object Patternの実装をする


```Ruby(pages/yahoo/basic_page.rb)
require 'capybara/dsl'
require 'rspec/expectations'

module Yahoo
  module BasicPage
    include Capybara::DSL
    include RSpec::Matchers

    def check_string(contents)
      contents.each do |v|
        expect(page).to have_content(v)
      end
    end

  end
end
```

```Ruby(pages/yahoo/top.rb)
require_relative 'basic_page'

module Yahoo
  class Top
    include BasicPage

    CONTENTS = ['Yahoo! JAPAN']

    def check_string
      super CONTENTS
    end
  end
end

module Kernel
  def top
    Yahoo::Top.new
  end
end
```

```Ruby(spec/features/top_page_spec.rb)
require 'selenium-webdriver'
Dir[File.expand_path('../../../pages/yahoo', __FILE__) + '/*.rb'].each {|file| require file}

describe "TopPage" do

  it "Body" do
    top.check_string
  end

end
```

```Bash
bundle exec rspec
```
S/MIMEで暗号化

AさんからBさんへ暗号化メールを送る場合の流れを調べてみる。双方ともオレオレ証明書で運用する。

Aさんが以下を実行して、鍵と証明書を作成

```
openssl genrsa 1024 > private-key1.pem
openssl req -x509 -new -key private-key1.pem -out cert1.pem -days 356
```

Bさんが以下を実行して、鍵と証明書を作成

```
openssl genrsa 1024 > private-key2.pem
openssl req -x509 -new -key private-key2.pem -out cert2.pem -days 356
```

![SMIME1.png](https://qiita-image-store.s3.amazonaws.com/0/104066/608067b3-55ca-4ef4-0178-8dffba091866.png)

AさんがBさんへ自分の証明書cert1.pemを渡して、BさんがAさんに自分の証明書cert2.pemを渡す。

![SMIME2.png](https://qiita-image-store.s3.amazonaws.com/0/104066/102644bf-9fd2-2e0d-583e-bbe0e3257a41.png)

Aさんがmail.txtというメールを書いてBさんの証明書cert2.pemで暗号化。これによりcert2.pemの秘密鍵を持っているBさんしか開けなくなる。

```
openssl smime -encrypt -des3 -in mail.txt -out encrypt.txt cert2.pem
```

これだけでも暗号化はされるが、Aさんが送ったか確定できないので、Aさんが自分の秘密鍵と証明書で署名をおこなう。

```
openssl smime -sign -in encrypt.txt -signer cert1.pem -inkey privkey1.pem -out sign.txt
```

このsign.txtをBさんに送る。

Bさんはまず署名を確認する。

```
openssl smime -verify -in sign.txt -CAfile cert1.pem -out sign_verify.txt
```

署名が正しいので復号化する。

```
openssl smime -decrypt -recip cert2.pem -inkey private-key2.pem -in sign_verify.txt -out plain.txt
```

これでAさんから送られたmail.txtが暗号化されてBさんがplain.txtとして読める。

S/MIMEの普及しないのは下記のような理由によるのではないかと思う。

* 証明書を正式に発行するのが面倒だったり費用がかかったりする
* 署名と暗号化は別なのだが分かりにくい
* 複数人に送る場合、全ての人の証明書が必要で煩雑になる
* ヘッダーは暗号化されない

とはいえ、メール関係で新しい仕組みができて普及するるとも思えないのでS/MIMEをうまい具合に使っていくしかないのかもしれない。
Node.jsでWindowsのキー状態を取得する

`document.addEventListener('keydown')`のようにアプリケーションにフォーカスがある時にキー入力を検知するのではなく、バックグラウンドで起動している状態でOSのキー入力状態を取得します。いわゆるキーロガーみたいなことができます。

```js
var FFI = require('ffi');

var user32 = new FFI.Library('user32', {
  'GetAsyncKeyState': [
    'int32', ['int32']
  ]
});

setInterval(function() {

  for (var i = 0; i < 255; ++i) {
    var state = user32.GetAsyncKeyState(i);
    if ( state == -32767) {
      // i = 押されたキーコード
      console.log(i);
    }
  }

}, 10);
```
SpriteKitで簡単にParticleを導入してみる

UIKitをベースに作成しているアプリである状態を達成したときに、
簡単なアニメーションを入れて欲しいと言われて確認したらパーティクルで
アニメーションしてました。

仕方なく実装してみたところ、意外とアニメーションの作成も導入も簡単だったので
覚え書きも含めて書いておくことにしました。


## 準備
### パーティクルを作成する
以下の記事を参考にさせていただきました。
[【SpriteKit】爆発や雪などの表現ができる「Particle File」について](http://qiita.com/Koi-fumi/items/55f5e68ef89a48a057b4)

今回は適当にタップさせたところにアニメーションを入れてみようと思うので、
とりあえずSparkを選択して作成。

・Particle
Birthrateが5,000はちょっと多すぎるので、適当に500くらいに。
タップするときに弾けて欲しいが、そんなに長時間アニメーションして欲しくも無いので
Maximumを50くらいにしてすぐに生成が終了するように調整します。

・PositionRange
別にX座標にランダム性は必要無いので0に変更しておきます。

その他は適当に、記事を参考にいろいろいじってみると面白いと思います。
こんなに簡単に、XcodeからParticleが作成できるようになっているとは……。


## 実装
### Frameworkの追加
当然ですが、「SpriteKit.framework」を追加しましょう。


### SKViewの追加
ここからの実装には、以下の記事が参考になります。Swiftですが。
[まだiOSでリッチな演出に疲弊してるの？](https://speakerdeck.com/ryusukefuda/madaiosderitutinayan-chu-nipi-bi-siterufalse)

適当にUIViewを追加し、Classを「SKView」に変更します。
![スクリーンショット 2016-03-14 13.38.31.png](https://qiita-image-store.s3.amazonaws.com/0/34166/7f4bd548-903c-b920-61bc-53e32ca9ff33.png)


### タップしたポイントでパーティクルを実行
本来ならSKSceneのサブクラスを作成して、そちらに全部処理を任せますが
とりあえず全部、UIViewControllerに書いてしまいます。

先ほど追加したSKViewのオブジェクトと、SKSceneのメンバ変数を追加しておきます。

```objc
#import "ViewController.h"

@import SpriteKit;
@interface ViewController ()
@property (strong, nonatomic) SKScene *sparkScene;
@property (weak, nonatomic) IBOutlet SKView *skView;

@end
```

SKViewは演出に使うだけなので、イベントなどを透過させます。

```objc
- (void)viewDidLoad {
    [super viewDidLoad];
    // タップイベントを透過させます
    self.skView.userInteractionEnabled = NO;
    self.skView.allowsTransparency = YES;
    
    self.sparkScene = [SKScene sceneWithSize:self.view.bounds.size];
    [self.sparkScene setBackgroundColor:[UIColor clearColor]];
    [self.skView presentScene:self.sparkScene];
}
```

適当にタップしたところでパーティクルが実行されるように実装します。
UIViewの座標は左上を(0,0)としていますが、SKViewでは左下が(0,0)になっています。
そのため、Y座標を反転させる必要があります。

```objc
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInView:self.view];
        // 
        [self sparkOnTouchPoint:CGPointMake(location.x, self.view.bounds.size.height - location.y)];
    }
}

- (void)sparkOnTouchPoint:(CGPoint)point {
    NSString *firePath = [[NSBundle mainBundle] pathForResource:@"MyParticle" ofType:@"sks"];
    SKEmitterNode *spark = [NSKeyedUnarchiver unarchiveObjectWithFile:firePath];
    
    spark.position = point;
    
    SKAction *fadeOut = [SKAction fadeOutWithDuration:.5f];
    SKAction *remove = [SKAction removeFromParent];
    SKAction *sequence = [SKAction sequence:@[fadeOut, remove]];
    
    [self.sparkScene addChild:spark];
    
    [spark runAction:sequence];
}
```

これで、画面内を適当にタップすることでアニメーションが実行されるのがわかると思います
背景が白でわかりづらければUIViewControllerの背景を黒に変更してみるとわかりやすいかと。
+"3"+3+"3"が"63"？ 意外に知られていないJavaScriptの単項プラス(+)演算子

JavaScriptにおいて下記は文字列(string)としての「3」です。

```js
"3"
```

では、下記を何を示すかご存知ですか？

```js
+"3"
```

意外に知られていない`+`の使い方ですが、これは数値(number)としての「3」を表します。`+`を数値でない値の前に記述すると、数値への型変換が行われます。決してバグやハックではなく、「Unary + Operator」（単項プラス演算子）というECMAScriptの仕様の一つです（※）。文字列を数値へ変換するときに使えます。

上記2つをjsdo.itで確認できるようにしました。`"3"`と`+"3"`の型をそれぞれ出力しています。
http://jsdo.it/tonkotsuboy/eJ33

※ ECMAScript® 2015 Language Specification内の「[Unary + Operator](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-unary-plus-operator)」

# `+"3"+3+"3"`の結果は？

では、下記の式を考えてみましょう。

```js
+"3"+3+"3"; 
```

`+"3"`は数値なので、上記の式は、`3+3+"3";`と同じ意味になります。これは、`6+"3";`と同じ意味となり、数値と文字列の結合により、結果は文字列の`"63"`となります。


動作が確認できるよう、jsdo.itにデモをアップしました。 
http://jsdo.it/tonkotsuboy/WXjq

#こんなの誰が使ってるの？ 見たこと無い！
そう思っていた時期が私にもありましたが、Google製の有名なフレームワーク「[angular](https://angular.io/)」の公式チュートリアルで使われているのを見かけました。

![Angularの公式チュートリアルで使われている単項プラス演算子](https://qiita-image-store.s3.amazonaws.com/0/67884/4cccd5b6-57c7-b040-4fde-e8e169162c75.png)

[Angular - Routing より](https://angular.io/tutorial/toh-pt5)

とは言えあまり直感的ではない記法なので、我々が文字列から数値への型変換をする際は`Number(3);`や`parseInt("3", 10);`を使用する方が好ましいでしょう。

JavaScript中で`+`が変な使われ方をしていた時は、今回の記事のことを思い出していただければ幸いです。
ローカル開発環境構成編（１）

CUI環境で勉強したいのでVagrantを活用した。

#環境

Mac el Capitan(v10.11.3)
HomeBrew導入済み
VirtualBox(v5.0.16)
Vagrant(v1.8.1)

今回はすでにbrewで上の環境を構築しております。

#仮想マシン構成編

##作業用ディレクトリを作成、設定

```
$ cd
$ mkdir MyVagrant
$ cd MyVagrant
$ mkdir mycentos
$ cd mycentos
```

vagrant file作成

```
$ vagrant init bento/centos-6.7
$ vim vagrantfile
```

vagrantfile設定

下記の内容がコメントアウトされているので外します。

```vim:vagrantfile
# config.vm.network "private_network", ip: "192.168.33.10"↲
↓
config.vm.network "private_network", ip: "192.168.33.10"↲
```

仮想マシン起動

```
$ vagrant up
```

しばらくする起動する。

起動の確認

```
$ vagrant status

~~~~
   running(virtual box)
~~~~
```

となっていれば起動しています。

##仮想マシンにSSH接続

```
$ vagrant ssh
[vagrant@localhost ~]$
```

となり、接続されました。

__注意__

- ユーザー名:vagrant
- password:vagrant

となっています。

##関連ソフトのインストール

###Git

```
$ sudo yum install -y git
```

スクリプトのダウンロード(GitHubで公開されているもの)

```
$ git clone https://github.com/dotinstallres/centos65.git
```

ダウンロードされているファイルに移動し、シェルスクリプトを実行

```
$ cd　centos65
$ ./run.sh
```

スクルプトで入れたもの一部

- PHP(v5.6.19)
- mysql(v14.14)
- python(v2.6.6)
- ruby(v2.2.2)
- apache(実行中)


時間がかかりまた500MB程通信します。
./run.shで初回failedが出るのは、コマンド存在チェックをしているからです。

再ログイン時にrubyが有効になりますが今すぐ実行さえたい場合

```
$ exec $SHELL -l
```

仮想マシンから抜け出す。

```
$ exit
```

仮想マシンを一時停止

```
$ vagrant suspend
==> default: Saving VM state and suspending execution...
```

##CentOSを再度立ち上げる。

```
$ vagrant up
$ vagrant ssh
```

##ファイル転送ツール(Cyberduck)を使う

Macにインストール

```
brew install Caskroom/cask/cyberduck
```

CentOS上のIPアドレスを確認する。SSH接続した状態で

```
$ ip a
または
$ ifconfig
```

で確認します。

```vim:ifconfig
eth1      Link uncap:Ethernet
inet addr:192.168.33.10
```

次にCyberduckを起動し、新規作成をクリック、以下のように設定してください

- サーバ:確認したIPアドレス
- ユーザー名:vagrant
- password:vagrant
- 詳細設定 パス: /var/www/html

<img width="593" alt="スクリーンショット 2016-03-14 13.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/57916/aaca5a6c-a14e-3fad-ebba-b847a4cf6844.png">

接続し、ホスト鍵が不整合と出るので許可を押すと接続が完了します。

###Cyberduck設定

環境設定を開きブラウザを選択、ダブルクリックしたファイルを外部エディタで開くをチェック

外部エディタを選択しお好みのエディタに設定
すれば完了です。

次にPHPファイルを作成します。
ファイル名の下の罫線が表示されている場所を副クリックし新規ファイルを押す。
ファイル名は`index.php`
中身を編集します、index.phpをダブルクリックし、中身を

```php:index.php
<?php

echo "Hello from Vagrant!";
```

で保存します。

##MacのブラウザからPHPファイルを確認

ブラウザのアドレスバーに先ほど確認した`IPアドレス/index.php`を入力しエンター

<img width="548" alt="スクリーンショット 2016-03-14 13.28.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/57916/2e8e1d4a-3f63-138d-60ef-e1cc44897668.png">

確認することができました。

##ブラウザーでアクセスするときのIPアドレスを分かりやすくする。

数字だとわかりにくいのでCentOS内のHostsファイルを変更します。
今回使うツールは`prefpane`です

```
$ brew install Caskroom/cask/cyberduck
```

Cyberduckを開き、鍵が開いていない場合は解除し、プラスをクリック
確認したIPアドレスとホスト名（任意）を入力します。
ホスト名にアクセスした場合、左のIPアドレスにアクセスする設定です。

先ほどブラウザにIPアドレスを入力しましたが、`ホスト名/index.php`でアクセスしてみます。表示されていることが確認できました。
正規表現 |  はてな ( ? ) と アスタリスク ( * )  の違い

# はてな

`/Apple?/`

最後の e はあってもなくても良い。
なので次の二パターンにマッチする。

- Appl
- Apple

# アスタリスク

`/Apple*/`

最後の e はあってもなくても良い。
そして。**e が何個連続していても良い。**

なので次の無限パターンにマッチする。

- Appl
- Apple
- Applee
- Appleee
- Appleeee
- Appleeeee
- Appleeeeee
- Appleeeeeee
- Appleeeeeeee
- Appleeeeeeeee ...



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Hubotくんに最近追加したネタほど多く発言してもらう

## Why
最近追加したネタほど内輪ウケが良いから。

## How
重み付けには random-weighted-choice を使います。`weight: Math.pow(1.1, i) + 1`の部分でそれぞれの発言に適当に重みを付けています。追加した発言の数や目的によっていい感じにしてください。

```bash
npm install random-weighted-choice --save
```

```coffeescript:scripts/example.coffee
  robot.hear /hi/i, (res) ->
    sayArr = [
      'あーいまいっさんせっ'
      (...発言たくさん..)
      '卒業'
    ]
    rwc = require('random-weighted-choice')
    weightedSayArr = sayArr.map (v, i) ->
      return { weight: Math.pow(1.1, i) + 1, id: v }
    res.reply rwc(weightedSayArr)
```

```bash
myhubot> myhubot: hi
myhubot> Shell: 卒業
```
これだけ知ってれば大丈夫（かもしれない）RxJS5の厳選オペレータ

RxJS5のオペレータはだいぶ削減されたようですが、それでも100近くあります。
なのでRx歴3日の私がこれだけ知ってれば大丈夫かも？と思ったオペレータを（三日坊主を避けるために）つらつら並べます。理解が相当怪しいと思うので、突っ込み大歓迎です、むしろお願いします。

#Reactive Programmingの荒い説明
例えば、ボタンが押されたら、入力した文字をWebAPIを叩いて検索して、結果を表示する、という処理を考えます。
すべてが同期的に行えるとしたら、以下のようになります。

```js

function main(){
  if(button.click){
    let inputText = inputTextBox.text;
    let result = query(iniputText);
    outputTextBox.text = result;
  }
}

```

このうち、参照された変数が変更された場合（この場合だと、button.click、inputTextBox.text）、自動的にロジックの再計算を走らせたらどうでしょう？というのが基本的な考え方です。

これはつまり、変数に変更に対して反応するコードです。Reactive ProgrammingのReactiveとは、これを指します。

#RxJS
JavaScriptはReactive Programming Languageではありませんので、この考え方をJavaScript界に具象化する必要があります。そのためのライブラリがRxJSになります。

何かに対して何かを行う、をつなげて、そこにメッセージを流し込む、というモデルです。

##Observable
何に対して反応するか、その「何」にあたるのがObservableになります。

##Operator
何をおこなうのか、その「何」に当たるのがOperatorです。

##subscribe
Operatorの端点です。これが呼ばれないとなにも起きません。

#厳選オペレータ
いきなりですが構造化プログラミングの基本です。
GOTO地獄から脱出するために必要なパーツは三つです。

* 順次
* 反復
* 分岐

これをRxJSにおいてどう実現するか、そして、そのオペレータが基本的なOperatorであるとみなして並べます。

##順次
流れてきたメッセージに対して処理を行います。

###map
流れてきたメッセージに対して、変更を加えて、次に渡します。

###do
メッセージが流れてきた、をトリガにして、処理を実行します。
主に副作用を担当します。

###switchMap,concatMap,flatMap
switchMapは、流れてきたメッセージをObservableに変換する関数を受け取り、それに置き換えます。
concatMapは直列に、flatMapは並列に繋ぎます。
順次実行の文脈では、主な使い道としては非同期処理です。

```js

text$
  .switchMap((t)=>query(t))
  .subscribe((t)=>console.log(t));

```

switchMapはPromiseを受け取ると、resolveされたらその値が流れるObservableに変換してくれます。
よって、もしquery()がPromiseを返す非同期処理ならば、

textにデータが流れて来たら、queryを実行、そして結果をコンソールに出力して、終了する。

という流れになります。

##反復
そもそもObservableという概念が、反復を内包しています。よって、配列等、反復対象になるデータをObservableに変換する処理があればOK、ということになります。

###concatMap
流れてきたメッセージをメッセージの流れに変換して、それを直列につなぎます。

```js

array$
  .concatMap((ts)=>Rx.Observable.from(ts))
  .subsribe((t)=>console.log(t));

```

###switchMap
また出てきましたが、例えば配列の終了通知が必要な場合は、こちらになります。

###flatMap
こちらは並列なので、反復内容に非同期処理が混ざって、各々を止めたくない場合に使用します。

```js

array$
  .switchMap((ts)=>Rx.Observable.of(ts))
  .flatMap(t=>query(t))
  .subsribe((t)=>console.log(t));

```


##分岐
メッセージの分配と、その条件が必要になります。

###share
流れてくるメッセージを分配します。注意したいのは、RxJSでは、以下は分配になりません。

```js

let source$ = text$.do((v)=>doIt(v));
source$.subsribe((v)=>console.log(v));
source$.subsribe((v)=>console.log(v));

```

意図に反して、textにメッセージが流れるたび、doItが二回呼ばれます。
この挙動を理解するためにはHotとColdの概念を理解する必要があります。
また、参照透過なOperatorのみの場合上でもうまくいく等、無意味に複雑です。
最初のうちは、分配したい場合はshare、でよいと思います。

###filter
条件を満たした場合、値を通過します。
分配した後、各々でfilterすれば、条件分岐は達成できます。
初期化済みの固定長二次元配列を作る。

PowerShellの講習を受けてて、他の受講者から「固定長の二次元配列を生成、初期化するには？」みたいな質問が出てたので、考えてみた。習った範囲では...

* 配列は基本的には固定長で、要素数の外をインデックスで指定するとエラーになる
* インクリメント演算（`$array += $element`）すると最後に追加されて配列長が伸びる。

...だったので、その範囲で教わった命令だけ使ってできるのはこんな感じか。

    PS C:\usr\powershell> $dim=(5,3);
    PS C:\usr\powershell> $myArray=@(); 0..($dim[0]-1) | %{$myArray+=$null; $myArray[-1]=@(); 0..($dim[1]-1) | %{$myArray[-1] += $null} }

`%`は`foreach`の略記。`$null`はNull値が入った特殊変数。
配列長を見ることで結果確認とする。

    PS C:\usr\powershell> $myArray.count
    5
    PS C:\usr\powershell> $myArray[0].count
    3

なんとなくshell芸やPerlのone liner的な変態っぽさを感じるのだけど、スクリプト環境で固定長二次元配列初期化済みというリクエストがそもそも変態っぽい気もする。あまり使い道を思いつかない。
XAMPPでApacheを起動しAndroidから接続

XAMPPでApacheを起動し、Android端末から確認しようとしたら無駄にはまったのでメモ 


# 環境
* Windows7
* Android4.2.2
* XAMPP3.2.2

# XAMPPのインストール
[Apachefrend](https://www.apachefriends.org/jp/index.html)
Windows向けをダウンロードしてインストールNextポチポチ...
特につまづくところもなくXAMPPインストール完了

# 問題発生
いざApache起動!
```
  Ploblem detected!
  Port 80 in use by "Unable to open process" with PID 4!
  Apache WILL NOT start without the configured ports free!
  ...
```
ポート80番が埋まっていてApacheが起動できないとのこと！

いろいろ調べていくとこのポート80番埋まっている問題に苦しめられた人がたくさんいるようで
真っ先に出てくるのは Skype
Skypeが80番ポートを占領することがあるらしいのだが今回は違う

コマンドプロンプトから
```
  netstat -naov
```
をたたきポート80番を占領しているプロセスのPIDを特定
```
  tasklist /svc /FI "PID eq [PID番号]"
```
でサービスを特定し、終了すればいいんだが今回私のPCで80番ポートを占領していたのが
PID番号：4
サービス名：System

これはうかつに止められん....

ぐぐると

  * うっかりIISをインストールし、起動している。
  * Web Deployment Agent Serviceが起動している。
  * SQL Server Reporting Servicesが起動している。
  * Windows Remote Managementが起動している。
  * BranchCacheが起動している

などなど様々な原因が出てきたけどどれも違う。
手当たり次第サービス停止しまくった結果
最終的に`MsDepSvc.exe`を消したと同時にポート80番が解放されました。

つ、疲れた....

XAMPPを起動し、Webブラウザで[localhost](http://localhost/)にアクセスしてみた結果XAMPPのダッシュボードが表示されうまくいってるよう！

# 問題発生2

**Androidのブラウザからみれねえ...**

URLに`http://ipアドレス/`を入れても接続できずに終わる...
困ってping飛ばすアプリを入れPCのipアドレスにping飛ばしても応答がない...

これでずーっと悩んでました
そりゃもう長い事悩んでました

## 解決

同一ネットワーク上にないとだめじゃないかと思い
Wi-Fi繋いだろ→解決

ﾁｬﾝﾁｬﾝ＼(^o^)／
AD2 > link > SOA > Safe operating area

```txt:動作確認
Analog Discovery 2 (以下AD2)
```

[reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#user_supplies_control)

> Programmable current-limit timer for <font color=red>safe operating area (SOA)</font>

この略が下の方で使われているかと思ったが、使われてなかった。

別のデータシートにでも出てくるのだろうか。
Javaでは循環参照によるメモリリークは発生しない。

Javaの開発を現役で５年ほどやって来ましたが、１つ勘違いしていたことがありました。
Javaでは循環参照してもメモリリークは発生しないのです。
すごく今更ですね。

確かに、Javaのメモリ解放は **リファレンスカウンタ式ではない** ため、前々から循環参照しないのでは？と思っていましたが、一応循環参照する部分はWeakリファレンスにしたり、Androidで言うなら破棄するタイミングでnullを入れたりしていました。

JavaのGCは **ルートからたどっていってたどり着かなかったものを開放する** ということは常に頭に入っていたので、循環参照しないのでは？と思いつつも、実際に答えを出さないままでした。
今更で当たり前かもしれないですが、実はこの事実を知らない人はいるのでは…？

実験

```java:Test.java
public class A {
    public final String message;
    public A ref;
    
    public A(String message) {
        this.message = message;
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println(message);
        super.finalize();
    }
}

public class Main {
    public static void execute() {
        A a1 = new A("a1 release.");
        A a2 = new A("a2 release.");

        a1.ref = a2;
        a2.ref = a1;
    }

    public static void main(String[] args) {
        execute();
        System.gc();

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }
    }
}
```

実行結果は、

> a2 release.
> a1 release.

でした。
結果、循環参照していてもきちんと開放される。

finalize()　はオブジェクトがGCの対象となった時にコールされます。（その前にプロセスが終了した等の場合は呼び出されないようです）
finalize()　がコールされ、その後のGCで開放されます。
つまり、ちゃんとGCの　"対象"　にされたということです。

GCのコストを考えれば、やはりこの程度のメリットもあるわけですね。
ということは（ネイティブを除き）Javaでメモリリークに気をつけないといけない場面というのは、不要なオブジェクトを「いつまでも保持しない」という点だけでしょうか？

いつかは正しく開放されるけど、不要なオブジェクトを参照しているとその不要なものは開放されない　＝　一応、メモリリーク

安全な言語ですね。
でも、GCのコストはやはり高い。
AD2 > link > Over current protection > exceeding 500mA:warning | 600mA: Overcurrent protection is enabled

```txt:動作確認
Analog Discovery 2 (以下AD2)
```

[reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#analog_supplies_control)

>  A warning is generated when exceeding 500mA (Status: OC = Over Current). If a value of 600mA is reached and Overcurrent protection is enabled

- 500mA超え: 警告発動
- 600mA: 保護機能の有効化

この機能でどこまでプロテクトできるかは未消化。
underscoreコードリーディング（isNaN）

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



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


##isNaNとは


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

こんな説明。
>####_.isNaN(object) 
>Returns true if object is NaN.
>Note: this is not the same as the native isNaN function, which will also return true for many other not-number values, such as undefined.


```javascript
_.isNaN(NaN);
=> true
isNaN(undefined);
=> true
_.isNaN(undefined);
=> false
```

------------- 
objectがNaNだった場合にtrueを返します。
注記：nativeのisNaN関数はundefinedなどのnot-numberな値だった場合にもtrueを返しますが、_.isNaNはそれとは挙動が違います。

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

```javascript
  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
  _.isNaN = function(obj) {
    return _.isNumber(obj) && obj !== +obj;
  };

```

isNumberに合致するかつ、objが+objと合致しない場合にtrueを返します。
cloud9でflaskアプリを書いてブラウザからアクセスしてみた

[この記事](http://qiita.com/soogie/items/34b8c34f182a6caa8bb5)に触発されて、僕の愛するpython用webフレームワーク「flask」をcloud9で動かしてみました。

まずは、cloud9にアカウントを作りPython用のworkspaceを作成します。
次に今回はPython3を使いたいので、「Cloud9」->「Preferences」から「PROJECT SETTINGS」を表示します。
この中に「Python Version」から「Python3」を選択してタブを閉じます。

さらにさらに、元記事にdjangoが入っていなかったように、Python3には標準でflaskは入っていません。
なので、下に並ぶ「bash」タブに以下のコマンドを入れてflaskを入れます。

```bash
$ sudo pip3 install flask
```

さて、ここまで出来たらworkspaceのプロジェクトルートに以下のファイルを追加します。

```py3:app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080)
```

Flaskの詳しい解説は[Flaskの公式サイト](http://flask.pocoo.org)をご確認ください。
大事なのは、最後に書いてあるhostとportの設定。
何も入れずに実行すると起動するもののブラウザからアクセスできなかったので、hostとportの設定を変更してアプリを起動します。

ここまで出来たら、app.pyを起動したらコンソールの1行目に出ている「Your code is running at ...」の「...」のURLにブラウザからアクセスすると、flaskアプリにアクセスできます。（上記コードでは、画面上に「Hello World!」と表示されます。）

これで、いつでもどこでもflaskアプリがかけますね！
UnityとF#で機械学習② 行列分解 (QR分解と特異値分解）

#はじめに

"F# for Machine Learning Essentials" (Sudipta Mukherjee 著　以下「原著」)　の第2章 "Linear Regression"（線形回帰）では、Math.NET for Numericsという.Net用の数値計算ライブラリを用いた線形回帰の方法を説明しています。色々盛りだくさんの内容なので、ここでは行列分解の代表的な方法のQR Decomposition (QR分解)とSingular Value Decomposition (SVD: 特異値分解)に関するところだけ取り上げます。これらを用いることで線形回帰の計算がラクになります（理由は参考資料を参照）。


#参考資料

原著のコード　[こちら](https://gist.github.com/sudipto80/3b99f6bbe9b21b76386d)にある。

大人になってからの再学習 

 - [行列の分解（Matrix Decomposition）](http://d.hatena.ne.jp/Zellij/20131208/p1)
 - [QR分解] (http://d.hatena.ne.jp/Zellij/20120524/p1)


Wikipedia 

 - [QR分解] (https://ja.wikipedia.org/wiki/QR%E5%88%86%E8%A7%A3)
 - [特異値分解] (https://ja.wikipedia.org/wiki/%E7%89%B9%E7%95%B0%E5%80%A4%E5%88%86%E8%A7%A3)

#Unityでの実行

今回使うMath.NET for NumericsはF#、C#どちらにも対応しており、Unityで実行させる場合も両方に対応させるよう準備する必要があります。原著のコードの部分でQRDとSVDの部分だけをまず試してみます。

まず、Visual StudioでQRDecompositionLibraryというF#ライブラリを作り、以下のコードを入力します。

```fsharp:Library1.fs
namespace QRDecompositionLibrary

open MathNet.Numerics.LinearAlgebra
open System.IO

module LinearRegress = 
    let myMat = matrix  [[1.0;2.0;3.0]
                         [4.0;5.0;2.0]
                         [7.0;0.8;9.0]]
    let qr = myMat.QR() //　QR分解
    let svdR = myMat.Svd(true) // 以下 特異値分解の計算
    let s= svdR.S
    let v' = svdR.VT
    let u = svdR.U
    let w = svdR.W
    let myMatSVD = u*w*v'
```

原著のコードと異なり, namespaceとmoduleが指定されていて、#load...が無いのに注意してください。この時点では、コードのあちこちに赤線（エラー）が出ているはずです。

次に、Referencesにいつも通りUnityEngine.dllを加えるだけで無く、Math.NET用のdllも加えます。そのために、Solution ExplorerでQRDecompositionLibrary（ソリューションではなく、プロジェクトの方）を右クリックし、Manage NuGet Packagesを選択します。

<img width="445" alt="ManageNuget.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/1bdea88c-b5fa-55f3-e4e5-bf3600596f24.png">


すると、以下のようにNuGet Package Managerが起動します。

<img width="679" alt="NuGetPackageManager.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/9a49cbb2-113d-a389-b2ba-2b86182dee23.png">


右上の検索窓でmathnet.numericsと入力して検索します。MathNet.Numericsが見つかったら、選択してInstallボタンを押してインストールします。いくつかダイアログが出ますが、デフォルトのままでお願いします。さらに、同じ検索で下の方にMathNet.Numerics.FSharpというのも引っかかるので、それもインストールします。うまくいくと、MathNet.Numerics, MathNet.Numerics.FSharpがReferenceに追加されます。

<img width="215" alt="MathNetDLLs.png" src="https://qiita-image-store.s3.amazonaws.com/0/58503/19380e2c-9007-7fad-f7d8-d2647f6b25d6.png">


これらの作業が終了したら、Library1.fsの中の赤線が無くなってるはずです。ここで、いったんビルドします。

次に、Unity C#で以下のスクリプトを作成します。スクリプトはゲームオブジェクトにアタッチしてください。

```csharp:SeeFSharp.cs
using UnityEngine;
using System.Collections;
using QRDecompositionLibrary;

public class SeeFSharp : MonoBehaviour
{
    void Start()
    {
        Debug.Log(LinearRegress.myMatSVD);
    }
}
```

Playすると以下の出力がコンソールに表示されます

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/ea9b28ab-0c4b-41a5-f459-b0594ded3bde.png)

行列の各要素はLinearRegress.myMatSVD[1, 2]などの形でアクセスできます。

ここで、UnityのAssetsフォルダ以下にMathNet.Numerics.dllがあることが重要です。Unity側でコンパイルエラーが出るときは、必ず確認してください。
パイプされたデータを行毎にドット(.)表示

やりたいこと
----------

いらない標準出力でも `/dev/null` に捨てるのはもったいない。ならば行数に応じてドット表示するエイリアスを作ろう。ちょうどコマンドラインツールでよくある、ドット状のプログレスバーのように。

![rvm.png](https://qiita-image-store.s3.amazonaws.com/0/102667/ebca661a-7033-e82c-9af9-fbd3583625f5.png)
※ 画面はRVMです

エイリアスを作る
----------------

以下のaliasを `.bashrc` なりに作る。

```sh
alias dots='while read; do echo -n .; done'
```

ジワジワコンパイル結果が出力されるコマンドも、プログレスバーのようにドットが増える。

```sh
make | dots
```

エラー時はそのまま画面に結果が表示される。
オブジェクトを配列にキャストする

オブジェクトにオブジェクト内オブジェクトが...といりこ状になっているオブジェクトの場合は、再帰的に (array) をかける必要があります。便宜的に次のような関数を定義すると楽。

```php:PHP
function obj2arr($obj)  
{  
    if ( !is_object($obj) ) return $obj;  
  
    $arr = (array) $obj;  
  
    foreach ( $arr as &$a )  
    {  
        $a = obj2arr($a);  
    }  
  
    return $arr;  
}  
```

引用：[スイナシア](http://suin.asia/2009/03/09/cast-object-to-array.html)
VSCodeでGAE/Goの開発環境をつくる（Windows編）

# 本記事中のVSCodeのバージョン

![vscode.png](https://qiita-image-store.s3.amazonaws.com/0/2883/5e99775d-9a1a-bcc2-0b29-2e8009409d1d.png)

# Go-Extension 

<a href="https://marketplace.visualstudio.com/items?itemName=lukehoban.Go" target="_blank">Go | Visual Studio Marketplace</a>

# +Go Extension

- <a href="http://qiita.com/qt-luigi/items/1e73c2e129c408c16cbf" target="_blank">vscode-go/READMEとdelve/Buildingの日本語訳 - Qiita</a>

## インストールの要点

1. コマンドパレット（ctrl+shift+p）Extensions:Install Extensionを選択
2. Go(lukehoban版)を選ぶ
3. エクステンションが使用しているツールは、**エディターの右下隅に"Analysis Tools Missing"の警告**からポチポチでインストール完了できる。手動の場合は<a href="http://qiita.com/qt-luigi/items/1e73c2e129c408c16cbf#%E3%83%84%E3%83%BC%E3%83%AB" target="_blank">vscode-go/READMEとdelve/Buildingの日本語訳：＃ツール</a>を参照

# +GAE

- <a href="http://qiita.com/m0a/items/ebcf964effbc7d50a489" target="_blank">VisualStudioCodeでGAE/Goの環境設定 - Qiita</a>


## プロジェクトごとのsetting.json

```json:setting.json
{
  "go.buildOnSave": true,
  "go.lintOnSave": true,
  "go.vetOnSave": true,
  "go.buildFlags": [],
  "go.lintFlags": [],
  "go.vetFlags": [],
  "go.formatOnSave": true,
  "go.formatTool": "goreturns",
  "go.goroot": "C:/go_appengine/goroot",
  "go.gopath": "C:/gopath" //<==Go開発環境のGOPATHを指定しています
}
```

## シンボリックリンクをはる

1. `cd path/to/appengine/goroot/bin`(筆者環境「c:/app_engine/goroot/bin」)
2. `mklink go.exe goapp.exe`
GitHubのIssue、Pull Requestにいいね！ 等

# GitHubのIssue、Pull Request等のコメントに新機能
[Add Reactions to Pull Requests, Issues, and Comments](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments)

> Every day, thousands of people are having conversations on GitHub around code, design, bugs, and new ideas. Sometimes there are complex and nuanced points to be made, but other times you just want to :+1: someone else's comment. We're adding Reactions to conversations today to help people express their feelings more simply and effectively.


## 実際に見てみる
BootstrapのIsuueで見てみた

![github.png](https://qiita-image-store.s3.amazonaws.com/0/54591/95a0697d-d774-d7f4-0570-1936cced1942.png)

![github2.png](https://qiita-image-store.s3.amazonaws.com/0/54591/b750b979-1973-9753-eefd-79c2f3c37bc1.png)

左から順に
### `+1`
いいね！

### `-1`
気に入らない

### `Laugh`
使いドコロがいまいちわからない

### `Confused`
混乱
原因不明のIssueに対してとか？

### `Heart`
これも使いドコロが……

### `Hooray`
やったね！
期待の新機能が追加された時とか？
gmail > タイトルのバグ > 受信トレイの時の表示がおかしい > スペースの抜け

```txt:動作確認
gmail on Chrome on Windows 8.1 pro(64bit)
```

警告メールを送信するシステムのテストにおいて以下に気づいた。

`XXX RECOVERY`という文字列が
`XXXRECOVERY`になる場合がある。

同じメールでも以下の選択で見え方が異なる。

- 受信トレイ > スペースが抜ける
- すべてのメール > スペースがある (正常)

ソフト実装中にスペースがない状態でメールテストしていて、後からスペースを追加したのが関係するのかは不明。

上記の状態になった時、自分のソフトをチェックし、かつgmailで「すべてのメール」を選択してチェックするのがよさそう。
無料のPush通知サービス LogPushを使ってみる


<img src="http://prtimes.jp/i/16407/3/origin/d16407-3-304008-0.jpg" height="300">
https://push.logbk.net/

---

## はじめに

自前で用意したサーバを使用してリモートPush通知を実装したものの、
invalidトークンの除去や、テスト環境の切り替え等めんどくさかったので無料サービス探したところあったので使ってみた。

## できること

- 無料で500万端末まで登録可能
- 設定したら自動定期配信してくれる
- APIからの配信
- tag付した特定ユーザに配信(有料になった)

## 使い方

証明書を発行してSDKを組み込みます。
公式サイトにわかりやすく手順が書かれているため、
割愛します。(公式サイトで見てください)

## つまづいた点

1つつまづいた注意点としては、swiftのDEBUG環境(AppStoreからダウンロードしたか、Xcodeからデバッグしたかの判断用)のところで
`-D DEBUG`
とあるのを
`"-D"`
`"DEBUG"`
と、分けて追加したところくらい。("も追加した)
これを付けておくとXcodeからビルドした際は
`#if DEBUG`
の処理を行い、AppStoreからダウンロードした際は
`#else`
が呼ばれるようになります。
(Releaseのところから`-D DEBUG`を消しておくことでelseの処理になる)
わざわざこれを分ける理由としてAppleのプッシュサービスのAPNSが
テスト環境(Xcodeから)と本番環境(AppStore)からで送る方法が違うそうです。

あと、実行してAppDelegateの参照でエラーが出たら、
よくある質問の
`[iOS] UIApplicationDelegate を置き換えない方法`
を試したところ解決しました

## APIから通知を叩く

ユーザの動きで通知が飛ばせます。(tag付けで特定の人に送れる！<-有料になった)
公式サイトによるとHeaderやBodyを使って送れるとのこと。
以下サンプル

### curl

```
curl -v -H "X-Api-Key: YOUR_KEY" -d '{"message": "Hello"}' https://push-server-api.logbk.net/v1/delivery
```

-v : 詳細情報表示
-H : ヘッダ情報送信
-d : Body送信

今送りたい！ってときに便利ですね。
cronで定期的にシェル回してもいいと思います。

### ブラウザ

ブラウザ上からはHeaderやBody情報を送るのは厳しいようです。
(Logpushのサイト上で配信することはできます)

### HTTP通信時付与する

アプリ側から叩きたい場合はこれが良さそうです。
こちらの投稿が参考になりましたので貼らせていただきます。
http://qiita.com/sushichop/items/ac4ae99b905ce523c2fe

---

対応プラットフォームが現在iOS,Android,Unityとのことで
使ってみて最高なら他プロジェクトの開発の際も使いたいと思います。

速度とかは今後調査してみます
iOS/Swift : UIViewに実際に描画されているピクセルの色を取得する

# 目的
 UIView上の任意の位置（ローカルｘ，ｙ座標）のピクセルの色を知りたい。

# 実装
下記のように画素配列を取り出してアクセスする。画素成分の並び順に注意。常に R, G, B, A という順序で並んでいるわけではない。（詳しくはコメント欄参照）

```swift
// view 上の位置 (x,y)の画素にアクセス
UIGraphicsBeginImageContext(view.frame.size)
view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let imgCtx = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(imgCtx!.CGImage))
// 画素バッファを得る
let pixelBuf = CFDataGetBytePtr(pixelData)

// 画素アドレス（バッファ内インデクス）を求める
let pixelAddr = ((view.frame.size.width * y) + x) * 4   // 1 Pixel==4 Byte
// 画素成分が、Green, Blue, Red, Alpha の順に並んでいる場合
let green = CGFloat(pixelBuf[ pixelAddr ])/255.0
let blue  = CGFloat(pixelBuf[ pixelAddr+1 ])/255.0
let red   = CGFloat(pixelBuf[ pixelAddr+2 ])/255.0
let alpha = CGFloat(pixelBuf[ pixelAddr+3 ])/255.0

// UIColor オブジェクト作成
let color = UIColor(red:red, green:green, blue:blue, alpha:alpha)

```