OmniAICreator/Qiita-1.07M huggingface dataset:
glslでhsv2rgbとrgb2hsv


glslでhsv2rgbとrgb2hsv変換
http://glslsandbox.com/e#41371.0

```glsl
vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

vec3 rgb2hsv(vec3 c)
{
    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
 
    float d = q.x - min(q.w, q.y);
    float e = 1.0e-10;
    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
}
```
合成した画像をドラッグさせる Swift3

![on.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/302e25ba-878c-d71e-3083-3cf0ffc23e40.gif)


# 環境

-xcode8
-swift3

# 実装

```swift


import UIKit

let imageView = UIImageView()
var preDx : CGFloat!
var preDy : CGFloat!


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
        let topImage:UIImage = UIImage(named:"topImage")!
        let bottomImage:UIImage = UIImage(named: "bottomImage")!
        let newSize = CGSize(width:bottomImage.size.width, height:bottomImage.size.height)
        UIGraphicsBeginImageContextWithOptions(newSize, false, bottomImage.scale)
        bottomImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height))
        topImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height),blendMode:CGBlendMode.normal, alpha:1.0)
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        
        
        
        let screenWidth:CGFloat = view.frame.size.width
        let screenHeight:CGFloat = view.frame.size.height
        //画像をイメージに追加
        //imageView.image = UIImage(named:"topImage")!
        //合成した画像をイメージに追加
        imageView.image = newImage
        let newRect = CGRect(x:0, y:0, width:200, height:200)
        imageView.frame = newRect
        imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2)
        self.view.addSubview(imageView)
        imageView.isUserInteractionEnabled = true
        
        
        let panGestureRecognizer06 = UIPanGestureRecognizer(target: self, action: #selector(panGesture06(sender:)))
        imageView.addGestureRecognizer(panGestureRecognizer06)
        
    }
    
    
    func panGesture06(sender:UIPanGestureRecognizer) {

        if sender.state == UIGestureRecognizerState.began {
            preDx = imageView.frame.origin.x
            preDy = imageView.frame.origin.y
        }
        let point: CGPoint = sender.translation(in: self.view)
        let movedPoint: CGPoint = CGPoint(x: sender.view!.center.x + point.x, y: sender.view!.center.y + point.y)
        //print(movedPoint)
        sender.view!.center = movedPoint
        sender.setTranslation(CGPoint.zero, in: self.view)
    }
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


```

# ソース

[github](https://github.com/Ryosuke-Hujisawa/merge-images-Drag-Swift-3)
[don't think twice it's alright](http://off.tokyo/blog/2017/07/09/%E5%90%88%E6%88%90%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%95%E3%81%9B%E3%82%8B-swift3/)
PHPのisset,empty,is_null早見表

#早見表
| 値 | if($var) | empty| isset | is_null |
|:-:|:-:|:-:|:-:|:-:|
|  $var=1 | **TRUE**  | FALSE  |  **TRUE** | FALSE  |
|  $var=""; |  FALSE |  **TRUE** |  **TRUE** |  FALSE |
|  $var="0"; | FALSE   |  **TRUE** | **TRUE**  | FALSE  |
| $var=0;  | FALSE  | **TRUE**  | **TRUE**  | FALSE  |
|  $var=NULL; |  FALSE |  **TRUE** | FALSE  | **TRUE**  |
| $var  |  FALSE | **TRUE**  |  FALSE | **TRUE**  |
|  $var=array() | FALSE  |  **TRUE** |  **TRUE** |  FALSE |
| $var=array(1)  |  **TRUE** |  FALSE | **TRUE**  | FALSE  |

if($var) 　↔︎　empty
isset　↔︎ 　is_null

ってことですね

参考（というかもろ）
[PHPのisset,empty,is_null](http://d.hatena.ne.jp/sngmr/20080209/1202520832)

2017/07/09追記
コメントでいただきましたがしっかり基本を覚えるならこちらを参考にしてください
[isset, empty, is_null の動作まとめ - Qiita](http://qiita.com/mpyw/items/51bf42fe1ad8a7e535aa)
githubのマルチアカウント環境構築

## やりたいこと
githubのマルチアカウント環境構築を構築する
e.g. 基本的には普段使うアカウントAを使うが特定ディレクトリ配下では、アカウントBを使う

## 困ったこと
`git config --local`
でuser.nameとuser.mailを設定するだけで良いかと思ったら、`remote repository not found`で怒られ続けた。特にsubmoduleでハマった。

## やっったこと
- rsa鍵を追加
- configファイル作成
- 使用するURLを変更した

## 前提
OS: macOS Sierra 10.12.5
アカウントBとして操作したいディレクトリ配下で、`git config --local ..`で、user.nameとuser.mailを設定済み

## 詳細手順
### rsa鍵を追加
1 - アカウントBのメアドでRSAキーを作る
`$ ssh-keygen -t rsa -C "foo@bar.com"`

多分id_rsaは既存のものがあるので、別ファイルを作りましょう  
ここでは`id_rsa_hoge`とします。

```
Generating public/private rsa key pair. 
Enter file in which to save the key (/home/user_name/.ssh/id_rsa):
```

2 - sshキーを追加する
`ssh-add ~/.ssh/id_rsa_hoge` 

3 - 追加されていることを確認します
`$ ssh-add -l`



### configファイル作成
1 - `$ vim ~/.ssh/config`

```
Host acountB.github.com
	HostName github.com
	User git
	IdentityFile ~/.ssh/id_hoge
```

2 - テストする
`ssh -T git@acountB.github.com`

アカウントBのユーザー名で下記のように認証が通ればオッケー。

```
Hi {your_user_name}! You've successfully authenticated
, but GitHub does not provide shell access.
```

### 使用するURLを変更した
1 - アクセスしたいURLを確認する
こんなのだったとしましょう
`https://github.com/user/Repo.git`

2 - URLを修正する
クローンしたいとして
`git clone git@acountB.github.com:user/Repo.git`
でOK

2' - submoduleをなんとかしたい場合
親レポジトリをクローンしたディレクトリにて、.gitmodulesを編集する。
`vim .gitmodules`

```
[submodule "sub_repo"]
	path = sub_repo
	url = https://github.com/user/sub_repo.git
```

↑のような設定だったら、
`url = git@acountB.github.com:user/sub_repo.git`
と書き換える

そして
**`$ git submodule sync`**

これにより通常の操作が可能となります。


## 参照リンク

- https://gist.github.com/jexchan/2351996
- https://stackoverflow.com/questions/3336995/git-will-not-init-sync-update-new-submodules


githubとstackoverflowに感謝です
画像をドラッグさせる Swift3

# 環境

-xcode8
-swift3

# 実行

![on.gif](https://qiita-image-store.s3.amazonaws.com/0/135794/5decc540-41b8-1c50-129c-15334160b1bc.gif)



# 実装

```swift

import UIKit

let imageView = UIImageView()
var preDx : CGFloat!
var preDy : CGFloat!


class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
        
//        let topImage:UIImage = UIImage(named:"topImage")!
//        let bottomImage:UIImage = UIImage(named: "bottomImage")!
//        let newSize = CGSize(width:bottomImage.size.width, height:bottomImage.size.height)
//        UIGraphicsBeginImageContextWithOptions(newSize, false, bottomImage.scale)
//        bottomImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height))
//        topImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height),blendMode:CGBlendMode.normal, alpha:1.0)
//        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
//        UIGraphicsEndImageContext()
        
        
        
        
        let screenWidth:CGFloat = view.frame.size.width
        let screenHeight:CGFloat = view.frame.size.height
        
        //画像をイメージに追加
        imageView.image = UIImage(named:"topImage")!
        let newRect = CGRect(x:0, y:0, width:200, height:200)
        imageView.frame = newRect
        imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2)
        self.view.addSubview(imageView)
        imageView.isUserInteractionEnabled = true
        
        
        let panGestureRecognizer06 = UIPanGestureRecognizer(target: self, action: #selector(panGesture06(sender:)))
        imageView.addGestureRecognizer(panGestureRecognizer06)
        
    }
    
    
    func panGesture06(sender:UIPanGestureRecognizer) {

        if sender.state == UIGestureRecognizerState.began {
            preDx = imageView.frame.origin.x
            preDy = imageView.frame.origin.y
        }
        let point: CGPoint = sender.translation(in: self.view)
        let movedPoint: CGPoint = CGPoint(x: sender.view!.center.x + point.x, y: sender.view!.center.y + point.y)
//      print(movedPoint)
        sender.view!.center = movedPoint
        sender.setTranslation(CGPoint.zero, in: self.view)
    }
    
    
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

```

# ソース

[github](https://github.com/Ryosuke-Hujisawa/Drag-image-Swift-3)
[画像をドラッグさせる Swift3](http://off.tokyo/blog/2017/07/09/%E7%94%BB%E5%83%8F%E3%82%92%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%95%E3%81%9B%E3%82%8B-swift3/9)
透明なボタンを透明なイメージで作らない．


タイトルでよくある，クリックしたらメニューに移動するやつ．

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/58627d0d-cc87-49b7-5fe8-6b67a335b992.gif "test.gif")


こちらの記事で紹介されていた，全画面タッチの方法
http://qiita.com/sevenstartears/items/5004cd913578fa78e6ea


今まで，Imageを透明にして全画面タッチを実装してきたので，Graphicを継承するだけでよかったというのは衝撃でした．

具体的には以下のようなクラスを作成します，


```
using UnityEngine;
using UnityEngine.UI;

public class RaycastDetector : Graphic {

    protected override void Reset()
    {
        this.color = new Color(0, 0, 0, 0);
    }
}
```

OnClickの検知にはButtonほどたくさんの機能は不要なので，EventTriggerを使います．

![スクリーンショット 2017-07-09 0.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/113504/1c21deb3-c7fd-c7c8-2b4e-6af78f13fe58.png "スクリーンショット 2017-07-09 0.54.18.png")

全画面にする
![スクリーンショット 2017-07-09 0.55.16.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/a4d60312-644e-d04b-460b-72f5de1c580b.jpeg "スクリーンショット 2017-07-09 0.55.16.jpg")
|
ラズパイでsudo pythonして色々怒られた時の対策

`wiringpi`を利用する時など、`python`を管理者権限で実行しないといけない時ってありますよね。

そんなとき以下のような感じで怒られた時の対策です。

私はラズパイ3に`pyenv`を入れ、その上で`python3`へ設定した環境で起きました。

```bash
$ sudo python foo.py
Traceback (most recent call last):
  File "bar.py", line x, in <module>
    bar = bar()
.
.
.
ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
```

要は管理者権限にすることでパスがわからなくなっているんだと思います。

ですので

```bash
$ sudo /home/pi/.pyenv/shims/python /home/pi/foo.py
```

とすればうまくいきます。
画像の合成 Swift3

![スクリーンショット 2017-07-09 0.35.01.png](https://qiita-image-store.s3.amazonaws.com/0/135794/efff4768-f3b9-f56e-470e-6a5b318ea1a8.png)

![スクリーンショット 2017-07-09 0.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/135794/f0b03696-bbbc-4910-af3a-6a958ba2f0ae.png)

![スクリーンショット 2017-07-09 0.35.20.png](https://qiita-image-store.s3.amazonaws.com/0/135794/3ca92882-adfb-7b48-e460-f33e86d08a19.png)

# 説明

`UIGraphicsBeginImageContextWithOptions`から`UIGraphicsEndImageContext()`の中で画像を合成します。この中で、`draw()`関数を使って合成する画像を使います。なぜ`draw()`関数を使えば二枚の画像が合成されるのか中身の仕組みは良くわかりませんが、とにかく下記のように実装することで二つの画像は合成されます。合成された画像は`UIGraphicsGetImageFromCurrentImageContext()`で受け取ることができます。




# 実装

```swift

import UIKit

class ViewController: UIViewController {
    
    let imageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        

        let topImage:UIImage = UIImage(named:"topImage")!
        let bottomImage:UIImage = UIImage(named: "bottomImage")!
        let newSize = CGSize(width:bottomImage.size.width, height:bottomImage.size.height)
        UIGraphicsBeginImageContextWithOptions(newSize, false, bottomImage.scale)
        bottomImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height))
        topImage.draw(in: CGRect(x:0,y:0,width:newSize.width,height:newSize.height),blendMode:CGBlendMode.normal, alpha:1.0)
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        

        
        
        let screenWidth:CGFloat = view.frame.size.width
        let screenHeight:CGFloat = view.frame.size.height
        imageView.image = newImage
        let newRect = CGRect(x:0, y:0, width:200, height:200)
        imageView.frame = newRect
        imageView.center = CGPoint(x:screenWidth/2, y:screenHeight/2)
        self.view.addSubview(imageView)

    }

    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

```

# ソース

[github](https://github.com/Ryosuke-Hujisawa/merge-two-different-images-in-Swift3)

# 参考

[merge two different images in Swift](https://stackoverflow.com/questions/37619161/merge-two-different-images-in-swift)

[don't think twice it's alright](http://off.tokyo/blog/2017/07/09/merge-image-swift3/)
スタックトレースから呼び出し元の情報を取得する（java）

# スタックトレースから呼び出し元の情報を取得する
javaでプログラムを組んでいると、メソッドがどこから呼び出されたのかを知りたい時があります。
そんな時は、スタックトレース情報を取得して呼び出し元情報を取得することが出来ます。

スタックトレース情報を取得するには`Throwable#getStackTrace()`を利用します。

```java
StackTraceElement[] ste = new Throwable().getStackTrace();
for (int i = 0; i < ste.length; i++) {
	System.out.println(ste[i].getClassName()); // クラス名を取得
	System.out.println(ste[i].getMethodName()); // メソッド名を取得
	System.out.println(ste[i].getFileName()); // ファイル名を取得
	System.out.println(ste[i].getLineNumber()); // 行番号を取得（nativeメソッドの場合は取得できない）
	System.out.println(ste[i].isNativeMethod()); // nativeメソッドか判定する。
	System.out.println(ste[i]); // スタックトレースの情報を整形して表示
}
```

`Throwable#getStackTrace()`の代わりに`Thread#getStackTrace()`を使うこともできます。

```java
StackTraceElement[] ste = Thread.currentThread().getStackTrace();
```

ただし、2つの方法で取得したスタックトレース情報には若干の違いがあります。
サンプルプログラムを実行して確認してみます。

```java:Main1
package sample;

public class Main1 {
	public static void main(String[] args) {
		SampleClass1 sc = new SampleClass1();
		sc.method1();
	}
}

class SampleClass1 {
	public void method1() {
		method2();
	}
	public void method2() {
		System.out.println("Throwable#getStackTrace()を利用してスタックトレース情報を取得");
		StackTraceElement[] ste = new Throwable().getStackTrace();
		for (int i = 0; i < ste.length; i++) {
			System.out.println(ste[i]);
		}

		System.out.println("\nThread#getStackTrace()を利用してスタックトレース情報を取得");
		ste = Thread.currentThread().getStackTrace();
		for (int i = 0; i < ste.length; i++) {
			System.out.println(ste[i]);
		}
	}
}

```

サンプルプログラムを実行した結果は以下のようになります。

```
Throwable#getStackTrace()を利用してスタックトレース情報を取得
sample.SampleClass1.method2(Main1.java:18)
sample.SampleClass1.method1(Main1.java:13)
sample.Main1.main(Main1.java:7)

Thread#getStackTrace()を利用してスタックトレース情報を取得
java.lang.Thread.getStackTrace(Thread.java:1556)
sample.SampleClass1.method2(Main1.java:24)
sample.SampleClass1.method1(Main1.java:13)
sample.Main1.main(Main1.java:7)
```

`Thread#getStackTrace()`を利用した場合、スタックトレース情報が1行多くなります。
大した違いではありませんのでどちらを利用してもよいと思います。

# スタックトレース情報を取得する際の注意点

取得できるスタックトレース情報には上限があります。
つまり、取得した`StackTraceElement[]`に全てのスタックトレース情報が含まれているとは限りません。

以下のサンプルプログラムを実行して確認してみましょう。

```java:Main2
package sample;

public class Main2 {
	public static void main(String[] args) {
		SampleClass2 sc = new SampleClass2();
		sc.printStackTrace(200);
		sc.printStackTrace(500);
		sc.printStackTrace(1000);
		sc.printStackTrace(2000);
		sc.printStackTrace(3000);
	}
}

class SampleClass2 {
	public void printStackTrace(int stackCount) {
		if (stackCount > 2) {
			printStackTrace(stackCount - 1);
		} else {
			StackTraceElement[] ste = new Throwable().getStackTrace();
			System.out.println("ste.length=" + ste.length);
		}
	}
}
```

実行結果はJVMによって変わりますが、私の環境では以下のように出力されます。

```
ste.length=200
ste.length=500
ste.length=1000
ste.length=1024
ste.length=1024
```

取得できるスタックトレース情報の上限数が`1024`となっていることが分かります。
つまり、呼び出し元を大元まで遡れるとは限らないということになります。
Pythonでファイルを一行ずつ読み込む


[Pythonでファイルから一行ずつ読み込み \- Qiita](http://qiita.com/tortuepin/items/d74e5b75dde93d877e6b)

ファイルを読むにはwith文を使うのが良いようだ。

```py
def main():
    import inspect
    filename = inspect.currentframe().f_code.co_filename

    with open(filename) as fh:
        for line in fh:
            print(line.strip())


if __name__ == '__main__':
    main()
    exit(0)
```
機械学習論文読みメモ_75


[Discrete Variational Autoencoders](https://arxiv.org/abs/1609.02200)
離散変数を含むような確率モデルを用いる事で離散データを扱う事が可能になる。
しかしながらそうしたモデルを学習する事は困難である。
これは、離散モデルにおけるback propagationが難しい事に起因する。
本論で提案するネットワークは、離散変数に対して無向グラフ、連続変数に対しては有向グラフを用い、これをvariational autoencoderの枠組みで学習を行う。
この中では、離散変数は、互いに非連結な連続変数で表現される各多様体への対応を示す事になる。
このモデルを利用する事で、クラスと画像のセットを教師なし学習の枠組みで学習し、それらの対応を学習する事が可能になる。

[High Dimensional Human Guided Machine Learning](https://arxiv.org/abs/1609.00904)
人間が特徴抽出・選択を行った特徴データと、オリジナルデータを直接用いたXGBoostによる学習結果を比較した。
結果、人間が作成したデータを用いた場合が性能は低くなったが、ほぼ迫るような結果が得られた。
これは人間が作成したデータを援用した高次元データ学習に対して指針を与える。

[Law of Large Graphs](https://arxiv.org/abs/1609.01672)
サンプルに基いて平均のグラフ構造を推定する事はネットワークサイエンスにおいて重要である。
しかしながら、推定すべきパラメータ数に対してサンプルサイズが少ない事が問題になりがちである。
一般に隣接行列の要素平均が従来使われているが、グラフの構造そのものを考慮しないため課題がある。
本論では、この手法の上にさらに低ランク仮定を置く事で、この問題へ対処する。
理論解析の結果、この手法を用いると、verticeの数が多い場合に、改善幅が大きい事が分かった。
機械学習論文読みメモ_74


[Decoupled Neural Interfaces using Synthetic Gradients](https://arxiv.org/abs/1608.05343)
従来のfeedforward neural networkはback propagationによる誤差伝搬によって重みの更新がなされる。
これはすなわち、誤差が伝搬されてくるまでは更新が出来ずロックされたままの状態であるということになる。
本論では、このようなfeedforward-backpropの直列接続構造をdecoupleし、局所的な情報から誤差伝搬情報を予測し人工的に生成するモデルを導入する事で、feedforwardとbackprop更新を独立に並行して行う事可能にした。
この手法はネットワークの入力自身を予測する事にも応用可能である。

[Deep-Anomaly: Fully Convolutional Neural Network for Fast Anomaly Detection in Crowded Scenes](https://arxiv.org/abs/1609.00866)
本論では混雑した環境の動画に対する異常箇所の検知と同定を行う手法を提案する。
本論はfully convolutional netに基づいた手法を用い、temporalデータに対する適用方法と、教師なし学習手法へお拡張方法を提案し、ビデオに対する異常検知を可能にした。
性能改善のために、cascaded-out layer detectionを導入する。
これはカスケード構造を導入し、最初のステージで学習済モデルから見て異常、あるいは判断がつかない領域のみを次のステージに渡していく。

[Deep Gaussian Processes](https://arxiv.org/abs/1211.0358)
deepなgaussian process (GP)を導入する。
これはGPによる特徴表現を用いたdeep belief networkとなる。
１つのGPはここではGPLVMと一致する。
このモデルにおける推論には、approximate variational marginalizationを用いる。
これにより厳密なモデル尤度の変分下界を求める事が可能になり、これを利用する事でモデル選択を行う。
従来のdeep belief networkは大量データに対して利用されたが、本論ではベイジアンな扱いを行う事でより疎なデータに対しても適用可能になった。
Javascript の yield と generator

TypeScript を学習中で、非同期の挙動が良く理解できていないことがわかった。その挙動を理解するために、TypeScript の async/await が JavaScriptにコンパイルされる際に登場する、Generator と yield について意味を調べてみた。

# はじめのサンプル

[yield](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield) Generator function をポーズしたり、レジュームしたりするのに使われるキーワード。具体例を見てみよう。

```javascript
function* generator(age){
    console.log("Hi");
    yield;
    console.log("My name is ");  // point 2
    yield;
    console.log("Tsuyoshi.");
    yield;
    console.log(`age ${age}`);
}

let g = generator(46); // point 1

console.log(g.next()); // point 3
console.log(g.next());
console.log(g.next());
```
実行結果

```
Hi
{ value: undefined, done: false }
My name is
{ value: undefined, done: false }
Tsuyoshi.
{ value: undefined, done: false }
```

`function*` で定義されるのが、[Generator function](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/function*) と呼ばれるもので、[Generator Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator) を返却する特殊な関数だ。Generator Object は、[iterable protocol と iterator protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable)を持っている、Generator function から返却されるオブジェクト。

# yield の振る舞いの要点

ポイントとしては、この関数を実行すると、Generator　Object が帰ってきて(point 1) その時点では、最初の`yield句`までしか、関数が実行されておらず、関数の実行が、yield句の箇所で停止(point 2)したようになっている。次に、返却されたGenerator Object の、`next()` メソッドをコールすると再び、yield 句のところから実行される。実行結果を見ても、制御が呼び元と、Generator 関数を行き来しているのがわかるだろう。

　通常の関数実行だと制御は次のようになる。

```
呼び出し元 -> 関数 -> 呼び出し元
```

　Generator function と yieldを使うと

```
呼び出し元 -> Generator 関数 yield まで -> 呼び出し元 next() まで -> Generator 関数 次の yield まで -> 呼び出し元 次のnext() 
```

# yield からの値の返却

yield に引数を持たせることもできる。呼び出し元のnext()でその値が返却される。

```javascript
function* generator(age){
    console.log("Hi");
    yield 1;
    console.log("My name is ");
    yield "hello";
    console.log("Tsuyoshi.");
    yield 2;
    console.log(`age ${age}`);
}

let g = generator(46);

console.log(g.next());
console.log(g.next());
console.log(g.next());
```

```
Hi
{ value: 1, done: false }
My name is
{ value: 'hello', done: false }
Tsuyoshi.
{ value: 2, done: false }
```

# Generator Object を for で回す

ちなみに、Generator Object は、イテレーターということなので、試しに
for 文でうまく書けないか試した見たら、この方法だったらいい感じみたい。

```javascript
function* generator(age){
    console.log("Hi");
    yield 1;
    console.log("My name is ");
    yield "hello";
    console.log("Tsuyoshi.");
    yield 2;
    console.log(`age ${age}`);
}

let g = generator(46);

for (gen of g) {
    console.log(gen);
}

```

```
Hi
1
My name is
hello
Tsuyoshi.
2
age 46
```

結果が違うのは、先のプログラムだと、Generator Object の next() は、値と、イテレーターが終了するかの属性のあるオブジェクトを返却しているのに対して、`for ( ... of ... ) `の構文だと、純粋な戻りの値のみになっているためである。

さて、これで、TypeScript の async/await の仕組みに対して言及する準備ができた！
Visual Studio Mobile CenterでXamarin.Formsをビルドするまで

# Visual Studio Mobile Centerとは
[Visual Studio Mobile Center](https://www.visualstudio.com/ja/vs/mobile-center/)はモバイルアプリを開発・管理するためのクラウドサービスです。
現在はプレビュー版となっており、公開されている機能は無料で使用できるようです。

現在対応しているプラットフォームは「Objective-C, Swift, Java, Xamarin, React Native, UWP」で
以下の機能が提供されています。

| 機能   | 説明 |
|:---------|:---------|
| ビルド | アプリの自動ビルド |
| テスト | 数百種類のデバイスとアプリテストツールを使っての自動テスト |
| 配布 | テスターへのアプリの配布 |
| 解析 | アプリの利用状況・アクセス状況などのレポート機能 |
| クラッシュ | アプリの不正終了などのレポート情報を収集する機能 |
| クラウド機能 | 認証、データ記憶域、プッシュ通知、オフライン同期 |

# アプリを追加する
今回はXamarin.Formsで作成したAndroidアプリをMobile Centerで自動ビルドするところまで試してみます。

まずはMobile Centerにログイン( https://mobile.azure.com/login )します。
私の場合「Connect with Microsoft」よりMicrosoftアカウントでログインしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/9de05a9c-1b6e-6166-f346-ffb709686016.png)

左ペインの「All Apps」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/054ef935-a133-af84-5884-6a04de539243.png)

「Add new app」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/eae0e975-7cb0-0d48-3ac1-e546058ad478.png)

入力フォームが開きますので、アプリ名・備考（任意）を入力します。
今回Xamarin.Formsで作成したAndroidアプリを対象としますので
OSはAndroid、PlatformはXamarinを選択しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/39917e2f-7d2d-65c7-7a6b-3d9eff0bf253.png)

「Add new app」をクリックすると新しいアプリが作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/029f55df-53ba-0a95-97d6-6c1f936eac3c.png)

# ビルドするアプリを登録する
次にビルド対象のアプリを登録します。
左ペインより「build」を選択するとサービス選択画面が開きます。

- Visual Studio Team Services
- GitHub
- Bitbucket

より選択可能です。
今回は「GitHub」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/482d5fde-bc27-66e4-9191-45098a56c753.png)

GitHubに接続するとリポジトリが表示されますので、対象のリポジトリを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/9c035468-366d-ac77-cd81-bfcbea085c66.png)

ビルドの設定は以下の「Configure build」より行うことができます。
デフォルトではプッシュされるたびにビルドが行われる設定になっています。今回はデフォルト設定のまま使用しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/ad87be8e-9613-0b92-aecd-bad7bf5e37b2.png)

# 変更をプッシュしてみる
変更前のブランチの状態です。
5日前にビルドされたことが分かります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/cee2ea82-e7d8-82e5-35f9-246ed8011fa0.png)


さっそく変更をプッシュしてみます。
VisualStudioからプッシュしてみました。すると自動的に画面が更新されキューに入ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/29cff342-f85a-1e8f-ef57-c110c7a2580c.png)

しばらくすると自動的にビルドが開始されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/f95fb9ad-8b74-c058-29ae-f57d41718087.png)

ビルドに成功するとStatusがBUILTに変わります。

# ビルドに失敗した場合
ビルドに失敗した場合どうなるでしょうか。
わざとビルドに失敗するソースをプッシュしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/72e67b7d-297c-5150-5e99-175f8b096f2b.png)

アイコン等が赤くなりStatusがFAILEDになりました。
また、ビルドの詳細でエラーの内容も参照可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/171118/576f5122-6b83-f522-6cf5-4d86e19ed0dd.png)

# 最後に
今回は自動ビルド機能を試してみましたが、機会を見つけてその他の機能も試してみたいと思います。
KotlinのSingletonについて

####注意：objectなどkotlinのsingletonを乱用しないようにしましょう。
少なくともAndroidでは参照がないとGarbage Collectionで回収される可能性があるのでApp全体のグローバル的にデータの保持とかする時は注意して使いましょう。

https://discuss.kotlinlang.org/t/singleton-with-object-declarations-gets-garbage-collected/4786/10

ActivityA->ActivityBで行った時にActivityAが参照しているobjectシングルToneクラスは回収されて
ActivityB->ActivityAで再び初期化が走る可能性があります。当然保持して使おうとしているデータも消えるはず。
AndroidではちゃんとonSaveInstanceStateとかを対応した方がいいです。
Javaの時代もそうですがstatic変数/クラス参照も乱用するのはよくないことでしたね。


##KotlinのSingletonを調べて見た。
Kotlin documentにも書いているが
https://kotlinlang.org/docs/reference/object-declarations.html
**object declarations are initialized lazily, when accessed for the first time**
これはKotlin bytecodeでのjava codeを見るとstatic initializeで初期化されることが分かる

```
   static {
      new Singleton();
   }
```

なので
##結論
###1.基本的objectを使った方がいい。(Thread safe)

```
//kotlin bytecodeで生成されたjava codeを見ると分かるが
//objectはSingleTone(static)+lazily(static initialize)にinstanceを作成する
object Singleton{}
```

例：

```
//AndroidのPreferencesでSharedpreferenceを初期化して使うときに便利
object PreferencesHelper{
  private lateinit var prefs: Sharedpreference
  fun setUp(context: Context){
    prefs = PreferenceManager.getDefaultSharedPreferences(context)
  }

　　　　var userId: String
        get() = prefs.getString("userId","")
        set(value) { prefs.edit().putString("userId", value).apply() }
}
```

**もうちょっといい方法**:
もし、初期化にパラメタが必要な場合はDIで必要なインスタンスを渡すことをオススメします。
万が一GCでコレクションされでも問題なく必要なパラメタで初期化ができます。
DIはKotlinで定番（個人的に） [Koin](https://github.com/InsertKoinIO/koin)を使います。

```
object PreferencesHelper: KoinComponent{
  private var prefs: Sharedpreference
  private val context: Context by inject()

  init{
    prefs = context.getSharedPreferences("prefName", Context.MODE_PRIVATE)
  }
}
```


###2.lazy方式でSingleToneをやる方式は推奨できない,ただスレッドセーフを求めていなければLazyThreadSafetyMode.NONEで使ってもいい。
理由はlazyのdefault mode SYNCHRONIZEDが実際はjavaのSingleTone方式:DoubleCheck方式なのでoverheadがある。また初期化パラメタを1.と同じく別途設定する必要がある

```
class LazyThreadSafeDoubleCheck private constructor() {
    companion object {
        //lazy modeディフォルトはLazyThreadSafetyMode.SYNCHRONIZEDである
        //スレッドセーフを求めていなければlazy(LazyThreadSafetyMode.NONE)とパラメタをづける

        val instance by lazy(LazyThreadSafetyMode.NONE) {
            LazyInit()
        }
    }
}
```

###3.ただparameterも含めで厳密に一回だけ初期したい場合はかきの方法がいいだろう。Thread safeではないのでこれをベースにもうちょっと処理が必要。

https://stackoverflow.com/a/40437274

```
class TasksLocalDataSource private constructor(context: Context) : TasksDataSource {
    private val mDbHelper = TasksDbHelper(context)

    companion object {
        private var instance : TasksLocalDataSource? = null

        fun  getInstance(context: Context): TasksLocalDataSource {
            if (instance == null)
                instance = TasksLocalDataSource(context)

            return instance!!
        }
    }
}
```
**もうちょっといい方法**
上記の１。で説明したDI方法で必要なパラメタを取得するのがいいと思います。
Microsoft製 OpenSSHでemacs

**2017年8月24日 追記　**<font color="#FF0000">v0.0.19.0で、ここに書いた方法で対策されたようです</font>

# はじめに
2017年7月8日、Microsoft製のOpenSSH、[Win32-OpenSSH](https://github.com/PowerShell/Win32-OpenSSH)のバージョンはv0.0.17.0です。
Windows10のPowerShellからssh.exeを起動してLinuxマシンに接続してemacsを実行すると下から２行目の表示が崩れる問題がありました。
Win32-OpenSSHのソースコードをちょっと直したら正しく表示されるようになったのでメモ。
やってみたらうまくいってる感じという状態なので、試される方は、そのあたりを注意してください。

**Anniversary Update for Windows 10以降でしか**動作しないかもしれません。

# 修正方法
ソースコードを展開してフォルダ
Win32-OpenSSH-0.0.17.0\Win32-OpenSSH-0.0.17.0\contrib\win32\win32compat
の中にあるconsole.cを次のように修正します。

	dwAttributes |= (DWORD)ENABLE_VIRTUAL_TERMINAL_PROCESSING | 0x0008;

0x0008は、DISABLE_NEWLINE_AUTO_RETURN とdefineされるものですがWin32-OpenSSHはVisual Studio 2015でないとコンパイルできないので定義されていないようです。

# 公式のGitで提案してみた
[https://github.com/PowerShell/Win32-OpenSSH/issues/802](https://github.com/PowerShell/Win32-OpenSSH/issues/802)
投稿の最初で説明したconsole.cへの僕のpatchが、そのまま使われた(DISABLE_NEWLINE_AUTO_RETURNがdefineでなく直接の値になっていますが)
文字数にして数十文字だけど、このpatchを作るのに原因の調査開始から僕は５日も、かかりました。ただ、正しい保証はありませんでしたが。

次のバージョンの0.0.18.0で僕のpatchのDISABLE_NEWLINE_AUTO_RETURN は、他と干渉するから使いたくないということで、使わずに対策したとあった。ソースコードをコンパイルすると、直っていないのに、バイナリだけ直るという、不思議な現象が起きた。不思議に思って対策したというソースコードの開示を言ってみたが、開示してくれなかった。

結局、次のバージョンの0.0.19.0でDISABLE_NEWLINE_AUTO_RETURNを使って対策したようです。

**2017年7月16日 追加**
Linux上ではexport TERM=vt100としてTERMを設定するとうまくいきます。
Ctrl-Spaceはset-mark-commandですが、ただのSpaceになるようです。私はCtrl-@でset-mark-commandを使うようにしました。
Emacsで現在のキーバインドを確認する方法は、[こちらの投稿](http://qiita.com/icb54615/items/3e9976bb9ae8a0b793dd)にあるようです。

**2017年7月20日 追加**
vt100よりもxtermのほうがemacs以外でも、画面が崩れずに動作するようです。TeraTermと比較すると完全ではないですが。
TeraTermではできないICカードによる認証が可能なのでMicrosoft製 OpenSSHを使いたい場合があると思います。

**2017年12月17日 追加**
Windows 10バージョン1709、オプション機能でOpenSSHベータ版が利用可能になっているようです。
[スラド記事](https://developers.srad.jp/story/17/12/16/0739213/)
Win32-OpenSSHの0.0.24.0でも、この投稿のパッチが使われていることを確認。
[WPF][MVVM] DataGridの右クリックメニューからViewModelのCommandを実行する

以前 TreeView でも似たようなことを実装したんですが、今度はDataGridでContextMenuを使いたかったので使用方法を調べました。

[[WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する - Qiita](http://qiita.com/koara-local/items/9e5f9cbcf4a937c1d34d)

基本的には以前書いた上記のTreeViewでの場合とやりかたはほぼ同じです。

# 実装例

```xml:ContextMenu側XAML
<UserControl.Resources>
    <ContextMenu x:Key="SampleContextMenu">
        <MenuItem Header="右クリックメニューアイテム"
                  Command="{Binding
                        Path=PlacementTarget.Tag.Command,
                        RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
                  CommandParameter="{Binding
                        Path=PlacementTarget.DataContext,
                        RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
    </ContextMenu>
</UserControl.Resources>
```

```xml:Data側XAML(DataGridRowを指定)
<DataGrid ItemsSource="{Binding Path=...}">
    <DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
            <Setter Property="ContextMenu" Value="{Binding Source={StaticResource SampleContextMenu}}"/>
        </Style>
    </DataGrid.Resources>
</DataGrid>
```

ContextMenu側の実装はTreeViewのときと同じで良いのでそのままです。
DataGrid側の方も、TreeViewのときの実装と同様にTagにDataGrid本体のDataContextを設定し、Resourcesに定義したContextMenuを指定しています。

TreeViewでの実装との差異は、`TargetType` に `DataGridRow` を指定しているところです。これでDataGridの行の上で右クリックした場合に表示されるメニューが対象になります。

# 捕捉
上記の例でのTargetTypeを `DataGridCell` で指定している例もありましたが、セルごとのコンテキストメニューの動作切り替えは未検証です。

[c# - Add context menu in datagrid, how to get the select Item value - Stack Overflow](https://stackoverflow.com/questions/18610905/add-context-menu-in-datagrid-how-to-get-the-select-item-value)
AnsibleでgrepがどうしてもFAILEDになるのでググってみた貴方へ


こういうやつ。
思わずググってしまいました。

```bash
$ ansible test -m shell -a 'egrep -i "warn|error|crit|fail|fatal" /var/log/messages'
192.168.59.103 | FAILED | rc=1 >>


```

そ、そんなバカな
俺のgrepがエラーになるなんて。。

・・・

・・・

・・・


これはマッチする行がないだけですね。。
`| wc -l`を付けてあげると平穏が訪れました。

```bash
$ ansible test -m shell -a 'egrep -i "warn|error|crit|fail|fatal" /var/log/messages | wc -l'
192.168.59.103 | SUCCESS | rc=0 >>
0
```

ふぅ...
EC-CUBE 2系から SES でメールを送信する

2010年に EC-CUBE 2系をベースに構築したシステムがあり、さくらの専用サーバ（ベーシック）上で稼働している。

システムも、サーバもさすがに老朽化が進んできていて、メンテナンスを継続できないので、新規システムをフルスクラッチで制作し、AWS 上で稼働させることにしたい。

ただ、システムを一から作り直すには時間が足りないので、まず現行システムをそのまま AWS に移行させる。そこまでが第1フェイズ。

AWS 上での安定運転を確認してから、おもむろにシステム制作に着手し、リリースする。これが第2フェイズ。

第1フェイズでは、現行システムが1台の物理サーバで兼務している各機能（ただしストレージ用途にはもう1台、別の物理サーバがある）を、AWS のそれぞれのサービスに分担させる（もちろん最小限の改修は必要）。

- EC2 - Web/APサーバ
- RDS - データベース
- S3 - ストレージ
- SES - メールサーバ

しかし、SES で数時間ハマった。

EC-CUBE 2系では、メール送信で内部的に PEAR を使用している。いろいろ設定を変えてやってみたが、これがうまく SES と連携してメールを送信することができない。

最終的になんとかメール送信までこぎつけたが、その設定とカスタマイズは次のようにした。

- 管理画面にログインし、
 - SMTP_HOST を "tls://email-smtp.us-west-2.amazonaws.com" に設定
 - SMTP_PORT を "465" に設定
- /data/class/SC_SendMail.php を以下のように変更

```php:/data/class/SC_SendMail.php
function getBackendParams($backend) {

  switch ($backend) {

    /* 省略 */

    case "smtp":
    default:
      $arrParams = array(
        'host'     => $this->host,
        'port'     => $this->port,
        'auth'     => TRUE,          // 追加
        'username' => SES_USER,      // 追加
        'password' => SES_PASSWORD   // 追加
      );
      break;
  }

  return $arrParams;
}
```

SMTP_HOST を "tls://" で始めるのがポイント。これがないとどうやっても STARTTLS コマンドを送出できない。また、ポート番号は 465 しか効かなかった。587 でがんばっても、たぶん徒労。あ、あと管理画面からパラメータを設定するときは、両端の `"` を忘れないようにする。

EC-CUBE 2系から SES を使用してメールを送信しよう…などと考える人はまずいないと思うけど、万が一にもありえないとは言い切れないので、参考のために記録を残しておく。
本番に近いテストサイトの作成

##お客様のサイトの管理画面
いよいよ、本格的に始動するであろうサービスのサイトを作ることになった。と言ってもデザイン班とシステム班とで分かれているのでデザインの部分は人任せであるｗ

色々と作りこみたいとは思うがなかなか思うように行かない。ファイルのアップロードがあるのでディレクトリトラバーサル対策とSQLインジェクション対策はしっかり行わなければいけないと思っているが如何せん、知識不足は否めない。これでいいんだろうか？と悩みに悩んで細かく見直して脆弱性がない状態で納品しなければならない。

お客様自身で画像の更新やテキストの更新、ブログの作成、更新ができるシステムになるのだがぶっちゃけこれくらいのことなら独自にやらなくてもWordPressですぐできるんじゃね？とか思ってしまうが、そんなことを思っていたらプロのプログラマにはなれないだろう。

PHPやJavaScriptを理解してこそ、WordPressを使いこなせるようになるんじゃなかろうか。付け焼刃では、いつかボロが出ると思っている。


##根本的な脆弱性への対策
ディレクトリトラバーサル、各種インジェクション、この2種類は最低限理解して対策しておかないとヤバいことになりそうなので参考サイト読みまくって頑張って対策できるようにしておかないと。他にも色々あるけども踏み台にならないよう気を付けないといけない。

具体的に対策を書くわけでもないのでチラ裏程度の心構えを書いておきたい。

誰の得にもならないような記事だけど思い返して再度、初心を確認するためにも書き残しておきたいので昔の自分がどんなだったかQiitaに書いていこうと思う。
Dockerのtips的な自分のメモ

# Dockerで使える小技集
Dockerを使っていて、「あーこれいいね」と思ったものを集めた
自分のメモを公開しました。

皆様のお役に立てたらいいねしていただけると嬉しいです。

## よく使うオプション一覧
- -a 全ての
- -q IDのみの取得
- --filter フィルターの利用
- -f 強制削除(--force)
- -v 関連付けボリューム(--volumes)

## Dockerの初期化
DockerにはFactory Reset(初期化)なるものがあり
これをすることで全てをまっさらにしてくれます。
全てを抹消しDockerそのものを再インストールします。

<img width="492" alt="スクリーンショット 2017-07-08 22.40.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/eea62762-7196-0254-e129-72aa46006355.png">


### 手順

`Dockerアイコンをクリック > Preferences > Reset > Reset to factory defaults`


## タグの付いてない<none>imageを削除する

タグのついていないDockerのimageの取得方法は以下の通り

```
$ docker images --filter "dangling=true"
```

合わせて削除をするのであれば

```
$ docker rmi -f $(docker images --filter "dangling=true" -q)
```

ちょっと長ったらしいですが…

```
$ docker rm -f $(docker ps -aq) & docker rmi -f $(docker images -qf "dangling=true") & docker system prune
```
なんかしてみるといいかもですね。
.bashrcなんかにaliasとして追加しておくのもありかもしれません

ちなみにprocessでも下記の通りでできます

```
$ docker rm -f $(docker ps -aq)
```

## あれこれ一括で削除をする

- 停止中のコンテナ全て
- 紐ついていないVOLUME全て
- 紐ついていないネットワーク全て
- 紐ついていないイメージ全て

を一括で削除できるコマンドが

```
$ docker system prune
```

```
WARNING! This will remove:
	- all stopped containers
	- all volumes not used by at least one container
	- all networks not used by at least one container
	- all dangling images
Are you sure you want to continue? [y/N]
```

これら消しちゃうけど本当に大丈夫？続けてもいい？
的な感じのメッセージが来るので`y`でokです

### GUIでもいける!!!!

`Dockerアイコンをクリック > Preferences > Reset > Remove all data`

<img width="492" alt="スクリーンショット 2017-07-08 22.40.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/177207/e01ad41f-54a0-8156-366c-2d6e25962529.png">

## Railsコンテナを立ち上げてコンテナに入らずにコマンドを打つ！

```
$ docker-compose run {service} rake routes
```

とか

```
$ docker-compose run --rm app rake db:migrate
```

とか

```
$ docker-compose run --rm app rails generate controller user
```

ちなみにrun系のオプション一覧はこちらです
http://docs.docker.jp/compose/reference/run.html

## コンテナ内のファイルをコピーする

```
$ docker cp {コンテナID} or {プロセス名} :{パス} ローカルの保存したい場所
```

```
$ docker cp b5e5bab3c242:/etc/httpd/conf/httpd.conf $HOME/Downloads/
```

もちろんコンテナ内へローカルからコピーも可能です

httpd.confの上書き

```
$ docker cp $HOME/Downloads/httpd.conf b5e5bab3c242:/etc/httpd/conf/httpd.conf
```
TLS1.2サポートするサーバとのHTTPS通信実装

SSL3.0、TLS1.0、TLS1.1の脆弱性が発見され、TLS1.2に移行するWebサイトが多数あります。TLS1.2の移行に伴い、SSL3.0、TLS1.0、TLS1.1の入り口も残していれば問題ないが、廃止された場合、いままで外部からHTTPS通信でAPI連携するプログラムも書き換える必要があります。

従来TLS1.0のみ対応の場合

``` c#
/// <summary>
/// Get Response From TLS Support Server
/// </summary>
private void GetDataByHttps()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}
```
TLS1.2に移行後、TLS1.0、TLS1.1が廃止された場合、下記のような例が出力される
System.Net.WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。 
---> System.IO.IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。
   場所 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
・・・   

解決するには、.NET4.5を利用し、Tls1.2のSecurityProtocolを利用
[.NET 4.0 supports up to TLS 1.0 while .NET 4.5 supports up to TLS 1.2](https://stackoverflow.com/questions/28286086/default-securityprotocol-in-net-4-5)

```csharp
/// <summary>
/// Get Response From TLS or Above Support Server
/// </summary>
private void GetDataByHttpsTls10Above()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}
```

.NET4.0以下で対応したい場合、自前でポートを定義

```csharp

/// <summary>
/// Get Response From TLS or Above Support Server with .Net 3.5 or 4.0
/// </summary>
private void GetDataByHttpsTls10Above()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}
```           

対象サーバがTLSをどこまでサポートしているか以下分析サービスを利用するとわかりやすい
https://www.ssllabs.com/ssltest/analyze.html?d=office.yahoo.co.jp
※d=の次にはFQDNをくっつけます。
yahooの例、TLS1.2も対応済みですが、既存のSSL、TLS1.0、TLS1.1もそのまま維持
![yahoo.png](https://qiita-image-store.s3.amazonaws.com/0/191079/1ac43f0b-18d6-2abe-5981-c44dae117134.png)
Railsのdelegateライクな関数を提供するjsライブラリを作ってみた

https://www.npmjs.com/package/relegater

Ruby on Rails の `delegate` メソッド的なインターフェースで、他オブジェクトに処理を以上するためのライブラリを作ってみた。

# 使い方
```js
import { delegate, $delegate } from 'relegater';
 
const baseObj = {
  a: 1, b: 'b'
};
const delegated = {
  c: () => 'c',
  d: {
    e: true
  }
};
 
// delegate()は baseObj を拡張した新しいオブジェクトを新たに生成する。
// 基となった baseObj は一切更新されない。
var result = delegate(baseObj).to(delegated, 'c', 'd').self;
 
result.a // 1 
result.b // 'b' 
result.c() // 'c' 
result.d.e // true 
 
baseObj.a // 1 
baseObj.b // 'b' 
baseObj.c // undefined 
baseObj.d // undefined 
 
// $delegate() は baseObj を破壊的に変更する。
// baseObjそのものは書き換えるが、baseObjのprototypeは更新しない
$delegate(baseObj).to(delegated, 'c', 'd');
 
baseObj.a // 1 
baseObj.b // 'b' 
baseObj.c() // 'c' 
baseObj.d.e // true 
```

# 経緯
- 業務中にAオブジェクトからBオブジェクトに処理を移譲するコードを書いていた時、「一々グルーコード書くのメンドくせー」ということで、作ってみた
- その愚痴が頭に浮かんだ時、ちょうどプライベートでRails5でAPIサーバーをゴリゴリ書いていて、「Railsのdelegateメソッドみたいな感じでサクッと移譲を書けたら便利じゃね？」から、Railsのdelegateを模したインタフェースで実装
- 業務でTypescriptを使っていて便利だったので、環境構築も含めて全部TSで始めてみたかった。

# 実装で困ったこと
- 最初は「delegatedとして渡されたオブジェクトを、baseObjのprototypeとして差し込めばイケる？」と思って始めたが、「delegated自体がprototypeチェーン持ってたらどーすんのよ」ということで断念
    - `Object.defineProperty` による実装に変更
- 「オブジェクト直接書き換えるのは、その方が嬉しい場合も有るけど基本行儀悪いよな・・・」「書き換えるやつと書き換えないパターン両方用意しよう！」「書き換えないパターンの時、どうやって新しいオブジェクト取ろう・・・」 -> delegate(...).self というキモいAPI爆誕
    - もっと良い名前有る気もする
    - 最終的に行儀悪いやつの方が使い勝手良くなりそうな皮肉
- 「Typescriptで使う場合は色々なIFのオブジェクト受け取る必要が有るけど、ジェネリクス使えば柔軟に対応できるよね！」「Typescriptで使う時、型キャストが不可避になったンゴ・・・」
    - ジェネリクス + 直行型 etc の活用で、将来的には回避できるようになりそうな気がするようなしないような

# 作ってみた感想

- Typescript超便利。誰かエラい人が言ってた気がするけど、全てのjsライブラリはTSで実装されるべき
- npmに公開する時、名前と用途の被りが激しくて困った。下調べの時点ではDOMイベントの移譲ライブラリが多い印象だったけど、近いことはみんな考えてる法則。
- ついでに、前々から気になっていた色々な開発ツール(TravisCI,Coveralls,mocha + chai)にも手を出してみた結果、開発が超快適に。
    - 正直Travisのビルドが回ってるの眺めるだけでも楽しい段階
    - CircleCIとかも気になってきた
    - Jenkinsも、どっかのタイミングでAWSかGoogleCloud?とかに構築してみたい
- 英語ヤバい
    - README書いている段階で瀕死
P/ECEのUSB端子をType BからMicro-Bに換装する

# 前文
[AQUAPLUS](http://aquaplus.jp/)が一昔前に出していた携帯端末[P/ECE](http://aquaplus.jp/piece/)は、ハードウェアの仕様が公開されていることもあり、ユーザによる改造が盛んに行われていました（[Wikipedia](https://ja.wikipedia.org/wiki/PIECE)）。
今回は、今風（？）の端末にするため、PCとの通信（データ送受信）に使うUSB端子を、元々ついているType BからMicro-Bに換装してみます。

## メリット
* Type Bと比べて抜き差しに力が要らない
* スマホ等他端末のケーブルが流用できる
* きょうび携帯端末側の端子でType Bて（10年以上前のハードに何を言うか）

## デメリット
* 元々のType Bは基板がガッチリ固定されているが、改造後は何かしらできちんと固定しないと不安定
* 自己責任（お約束）

# 材料
* [P/ECE](http://aquaplus.jp/piece/)
これが一番手に入らないかもしれない。
2ch情報によると[駿河屋](http://www.suruga-ya.jp/)とか[ヤフオク](https://auctions.yahoo.co.jp/)でたまに出ているらしい。

* USB Micro-B→2.54mmピッチ変換基板
検索したら種類がいくらか出てくると思いますが、ケースに収まるならどれでも良いです。
私はこちらを使いました。
https://store.shopping.yahoo.co.jp/vshopu2/nwm9c66eg9.html

# 手順
（もはや当たり前のようにバラしているので）分解手順の写真撮り忘れました。:scream:
ネジ外してツメ外して、スピーカーと電池ボックスのリード線を破壊しないようにケース背面をそっと開いて、さらに基板を固定しているネジを外すと、ケース前面と分離できます。
詳しくは[P/ECE HAND BOOK Vol.2](https://www.amazon.co.jp/gp/product/488554727X/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=zurachu-22&camp=247&creative=1211&linkCode=as2&creativeASIN=488554727X&linkId=f104be08654f1b13e033d6f91c48a6e9)とか見てください。

## ケース加工
ケース前面を少し加工したらmicroUSB基板をうまく固定できそうだったので、そのようにしてみました。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/880df878-9ca8-6871-8c92-195f8b64d324.jpeg" width="50%">
接着剤等で固定してしまうと、今後別の加工をしたくなった時に取り外しが困難になってしまうので、それはできるだけ避けます。

仮に基板を置いてみたの図。
下に薄いゴム板を敷いて、水平になるよう調整しています。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/6afadb55-45df-6f49-12e2-9888425bff5d.jpeg" width="50%">

## Type B基板取り外し
取り外し前の写真を撮り忘れ。:scream:

スピーカーと電源ボックスのリード線が邪魔になる場合は、端子の半田を溶かして一時的に外してしまってください。

USB基板と本体基板は端子間の半田のみで固定されているので、4点それぞれに半田吸い取り線を当ててその上から半田ごてを当てて半田を吸い取ると、取り外すことができます。

## Micro-B基板接続
P/ECE開発環境についてくる回路図（p.3）と実際の基板から、各端子は以下の通りです。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/4fe2fb04-fb1f-49ab-0a3d-1940d598e1fe.jpeg" width="50%">

Micro-B基板の各端子をリード線で繋ぎ、半田付けします。
Micro-B基板側のID端子が余りますが、P/ECEはUSBホスト機能ないので、繋ぐ必要がありません。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/aad3c36a-45b5-b21f-227d-6ce33957a7bd.jpeg" width="50%">
（スピーカーのリード線を接続した後で、見づらいです、すみません）

## テスト
PCとUSB接続して、電源がつくか（画面が表示されるか）、「PIECEコミュニケータ」等でファイル送受信できるかを確認します。
うまくいかない場合は、テスタで各端子の導通を確認するなどしてください。

## 穴埋め
このままケースを閉じると、Type B端子があった部分が穴空きになってしまうので、何かしらの手段で埋めます。
私は厚めのゴム板を加工して、Micro-B基板に両面テープで接着し、ケースを閉じたらピッタリ埋まるようにしました。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/abb1c2fe-0b0d-0319-c263-38d4ef4a93ce.jpeg" width="50%">

# 今後の課題
今風（？）という意味ではType-Cに対応できたらなお良し。
これがあればできる？・・・けど在庫切れ。
https://www.switch-science.com/catalog/2456/
コネクタから自力で端子を引っ張り出すほどの技量は持ち合わせていない。
あと規格的に電流が問題ないかどうかも不安。
識者の方、色々教えていただけるとありがたいです。

# 参考文献
* [ＵＳＢ端子形状の種類メモ](http://ktsite.ddo.jp/kikaku/usb/index.html)
【Android】SimpleDateFormatのフォーマットパターン一覧

SimpleDateFormat(String pattern)の引数patternに入るフォーマットパターンの一覧

Android API Referenceの内容を少しわかりやすくしたもの
例は2017年7月8日20時11分58秒 Locale.JAPAN とする


| 文字 |  説明                                    |     例         |
|:---:|:---------------------------------------:|:--------------:|
|  G  |  紀元                                    | 西暦  |
|  y  |  年                                     |  yyyy = 2017  <br> yy = 17     |
|  M  |  月                                     |  MMMM = 7月 <br> MMM = 7月 <br> MM = 07 <br> M = 7       |
|  w  |  週番号 ( 年に対する )                     |     27      |
|  W  |  週番号 ( 月に対する )                     |     2      |
|  D  |  日(年に対する)                            |    189      |
|  d  |  日(月に対する)                            |    08      |
|  F  |  aligned                                |     2     |
|  E  |  曜日                                    |    土      |
|  u(*)  |  曜日番号 ( 1 = 月曜, ... , 7 = 日曜 )                                    |    6      |
|  a  |  AM / PM   |   午後                  | 
|  H  |  時間 ( 0 - 23 )                         |    20              |
|  k  |  時間 ( 1 - 24 )                         |    20                |
|  K  |  AM / PM時間 ( 0 - 11 )                  |    8      |
|  h  |  AM / PM時間 ( 1 - 12 )                  |    8      |
|  m  |  分                                      |   11      |
|  s  |  秒                                      |   58   |
|  S  |  ミリ秒                                    |   4960      |
|  z  |  タイムゾーン ( General タイムゾーン )         |   JST      |
|  Z  |  タイムゾーン ( RFC 822 タイムゾーン )         |   +0900      |
*APIレベル24から


```
　G,yyyy,yy,MMMM,MMM,MM,M,w,W,D,dd,d,F,E,a,H,k,K,h,mm,m,ss,SSSS,z,Z
```
と指定したところ

```
　西暦,2017,17,7月,7月,07,7,27,2,189,08,8,2,土,午後,20,20,8,8,11,11,58,4960,JST,+0900　
```

と返ってきました
その結果を踏まえた表です
API21だったのでuの例は推測です
~~シュミレーター動かすの面倒~~

YとXに関しては、


```
Unknown pattern character 'X'
```

```
Unknown pattern character 'Y'
```

と出てしまい取得することができませんでした
誰か何か知ってたら教えてください


またこのような場でのアウトプット初めてですので至らない点あったらコメントいただけるとありがたいです
フルボッコにしてあげてください

出典：[Android Developers リファレンス SimpleDateFormat](https://developer.android.com/reference/java/text/SimpleDateFormat.html)


## 追記
今更リファレンスを確認したところ、
X, Yの値が取れなかったのはAPIレベルの問題だったようです

だからエミュレーターを動かすべきなんですまったく
Basic認証で躓いた

# 出来事
ConoHaのVPSを契約して個人サイトを作る際に
完成するまではBasic認証をかけようとして躓いた話


１．いつも通りに.htaccessと.htpasswdを作成してサーバーにアップ。
２．サイトにアクセス

理想：認証ダイアログが表示される。
現実：普通にサイトが表示される。

あれ、Basic認証が効いてない。

# 解決方法
今までファイルおけば出来ていたので知らなかったんですが
Apacheのhttpd.confで.htaccessが有効になるようにしとかないといかんのですね。

ドキュメントルートのAllowOverrideがNoneになっていたので、Allに変更。

```httpd.conf
<Directory "/var/www/html">
...
#AllowOverride None
AllowOverride All
...
</Directory>
```

これで無事Basic認証がかかりました。
AWS Lambda上の時間やタイムゾーン

# AWS Lambdaでプログラムを実行したタイムゾーンなど

Lambdaで日本時間に合わせてバッチを実行させたい時などどうすればよいか試してみた

テストコード

``` test.scala
  def handler(inputStream: InputStream, outputStream: OutputStream, context: Context): Unit = {
    //DateTime.now().getZone.getID()
    context.getLogger.log(s"DateTime.now().getZone.getID() : ${DateTime.now().getZone.getID()}")

    //DateTime.now()
    context.getLogger.log(s"DateTime.now() : ${DateTime.now()}")

    //DateTime.now(DateTimeZone.forID("Asia/Tokyo"))
    context.getLogger.log(s"""DateTime.now(DateTimeZone.forID("Asia/Tokyo")) : ${DateTime.now(DateTimeZone.forID("Asia/Tokyo"))}""")

    //LocalDate.now
    context.getLogger.log(s"LocalDate.now : ${LocalDate.now}")

    //LocalDate.now(DateTimeZone.forID("Asia/Tokyo"))}
    context.getLogger.log(s"""LocalDate.now(DateTimeZone.forID("Asia/Tokyo")) :  ${LocalDate.now(DateTimeZone.forID("Asia/Tokyo"))}""")

    //LocalDateTime.now
    context.getLogger.log(s"LocalDateTime.now : ${LocalDateTime.now}")

    //LocalDateTime.now(DateTimeZone.forID("Asia/Tokyo"))}
    context.getLogger.log(s"""LocalDateTime.now(DateTimeZone.forID("Asia/Tokyo")) :  ${LocalDateTime.now(DateTimeZone.forID("Asia/Tokyo"))}""")
  }

```


日本時間の**2017/07/08 20:14**頃に実行した
日本時間を前提としてプログラムを組む場合は**DateTime.now(DateTimeZone.forID("Asia/Tokyo"))**として取得するのがよさそう

```
DateTime.now().getZone.getID() : UTC

DateTime.now() : 2017-07-08T11:14:20.798Z

DateTime.now(DateTimeZone.forID("Asia/Tokyo")) : 2017-07-08T20:14:20.938+09:00

LocalDate.now : 2017-07-08

LocalDate.now(DateTimeZone.forID("Asia/Tokyo")) : 2017-07-08

LocalDateTime.now : 2017-07-08T11:14:20.941

LocalDateTime.now(DateTimeZone.forID("Asia/Tokyo")) : 2017-07-08T20:14:20.942
```