OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Cloud Private(ICP)標準ELKのX-Packにライセンスを導入する

# 目的

IBM Cloud Private(ICP)は標準でELKスタックが導入され、システムやアプリケーションのログを管理しています。そしてELKの拡張機能である[X-Pack](https://www.elastic.co/jp/products/x-pack)もプラグインとして導入されていますが、機能は無効化されています。それは、X-Packがライセンス製品のためだと考えられます。しかしX-Packには便利な機能が多いため、今回はこの標準ELKにX-Packのライセンスを導入してみます。

検証環境
- IBM Cloud Private 2.1.0.2 (Kubernetes 1.9.1)
- ELK 5.5.1

# 手順

## X-Packライセンスの取得

[公式サイト](https://www.elastic.co/jp/subscriptions)でライセンスを取得することができます。Basicライセンスは無料ですので、今回はこれを使います。ライセンスの有効期間は1年間ですので、これで**本番運用する場合は、ライセンスの更新にご注意**ください。

具体的な手順はサイトに従ってください。しばらく待つとガイドがメール送信されてきます。

## 

## 現在のライセンスの確認

ElasticsearchにAPIを投げて確認します。elasticsearch-client Podのes-clientコンテナを使います。

```
$ kubectl get pods -n kube-system | grep elasticsearch-client
elasticsearch-client-56cf688d8f-7cwzj                     2/2       Running   2          8d

$ kubectl exec -it -n kube-system -c es-client elasticsearch-client-56cf688d8f-7cwzj bash

[elasticsearch-client]$ curl http://elasticsearch:9200/_xpack/license
{
  "license" : {
    "status" : "active",
    "uid" : "c49e0cb6-17e3-4e58-89a9-a4865fb3224e",
    "type" : "trial",
    "issue_date" : "2018-03-25T05:33:15.951Z",
    "issue_date_in_millis" : 1521955995951,
    "expiry_date" : "2018-04-24T05:33:15.951Z",
    "expiry_date_in_millis" : 1524547995951,
    "max_nodes" : 1000,
    "issued_to" : "elasticsearch-cluster",
    "issuer" : "elasticsearch",
    "start_date_in_millis" : -1
  }
}

```

`"type": "trial"`になっているのがわかります。

## ライセンスの更新

先ほどダウンロードしたライセンスファイルをコンテナ内にファイルとして保存します。viでもechoでも何でもいいです。

次のコマンドでライセンスを更新します。

```
[elasticsearch-client]$ curl -XPUT http://elasticsearch:9200/_xpack/license?acknowledge=true -H 'Content-type: application/json' -d @lic.txt
{"acknowledged":true,"license_status":"valid"}

[elasticsearch-client]$ curl http://elasticsearch:9200/_xpack/license 
{
  "license" : {
    "status" : "active",
    "uid" : "f38c7929-6cd5-453e-b829-bccf542c85fd",
    "type" : "basic",
    "issue_date" : "2018-04-08T00:00:00.000Z",
    "issue_date_in_millis" : 1523145600000,
    "expiry_date" : "2019-04-08T23:59:59.999Z",
    "expiry_date_in_millis" : 1554767999999,
    "max_nodes" : 100,
    "issued_to" : "Teruyuki Takazawa (***)",
    "issuer" : "Web Form",
    "start_date_in_millis" : 1523145600000
  }
}
```

`"type": "basic"`になりました。これでライセンスの導入は完了です。
RailsでParamsを確認

Post値を確認したい！といった際に。
稼働確認はRails4.1.1

####コード
```ruby:controller.rb
  def create etc...
    # ①全部確認
    render plain: params.inspect
    # ②特定値のみ確認
    render plain: params[:key].inspect
  end
```

####出力イメージ
①全部確認の場合
※改行はされません。
![スクリーンショット 2018-04-09 3.36.48.png](https://qiita-image-store.s3.amazonaws.com/0/228538/876481da-f6b3-cfee-d7e9-592373b936df.png)

####参考
[Railsドキュメント：params](http://railsdoc.com/references/params)
オプショナル型と暗黙のアンラップ

#オプショナル型って？

なんでしょか

```swift:viewController.swift
//こんなんとか
 @IBOutlet var label: UILabel!

//こんなんとか
 var number: Int?

```

こういうのいっぱいあります。けど案外探さないとこれの理解って難しいのです。

じゃあ、こいつは何なんでしょうか？

# 0とnilの違い
じゃあまず、プログラミングに置ける0とnil,nullの違いが必要かと思います。

nil, nullは何もないことを表します！これはどんな言語を通しても言えることですが、何もないという状態は、パソコンにとってかなり気持ちの悪い状態です。Swiftは特にエラーを吐くほど嫌いです。

ということは、これを避ける方法がSwiftでは、Optional型というものが準備されています！

どういう動きをするかというと！

<img width="835" alt="スクリーンショット 2018-04-09 午前2.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/237569/8ada1663-d7c8-44be-ed18-f91c24e55401.png">

こんな感じ！

箱を用意します -> 包装して今は中身がなくてもいいよ！最終的に準備してるから！って伝えます

->途中で空箱に数値を入れます

すると！

箱開ける（これをアンラップって言います）とあら不思議、値が取れた！

っていうことができるのが、Optional型です。

# ？と！のちがい
さぁ、ここからちょっと細かくなるんですけど

``` swift:ViewController.swift
 var number: Int? 
//こいつと
 var number: Int!
//は違うんです
```

同じオプショナル型ではあるんですけど、？はアンラップをしてあげないといけなくて！はしなくていいっていう違いがあります。

## ?はこんな感じでアンラップします
``` swift:ViewController.swift
var number: Int?
number = 1
// Force Unwrapping -> 強制的なアンラップ
print(number!) // 1

//Optional Chaining -> アンラップをしてオプショナル型に戻す方法
print(number?) // optional<1>
```

## ！は、暗黙的なアンラップを行うんです。
普通の変数として使えるんですねぇ。途中までnilでも大丈夫！そんな特徴があります。

``` swift:ViewController
var number: Int!

number = 1

//暗黙的なアンラップが!では行われるため
print(number) // 1
```

# よくあるエラー
``` swift:ViewController.swift
 var number: Int!

 print(number) //ここでエラー
```
なぜかというと！箱開けたらからだからなんですね！
オプショナル型は、初期値にnilが入るから問題なんです。ここで共有しておきたいのは、このエラーは結構多いです！
オリジナルなんかを作っていても、
<img width="1106" alt="スクリーンショット 2018-04-09 午前3.41.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/237569/4d0589e4-8bbd-2d56-b3a4-a360e4e499d0.png">
こんなんはよく出てきます。落ち着いて関連付けと、値をちゃんと代入してるかを確認しましょう！

#レファレンス

[[Swift] Optional 型についてのまとめ Ver2](https://qiita.com/cotrpepe/items/518c4476ca957a42f5f1)
有理数を小数に、小数を有理数に

有理数(整数/整数の形で表せる数)は必ず有限小数か循環小数のいずれかで表せる。
逆に有限小数や循環小数は必ず有理数の形に表せる。

例
3/4 = 0.75
1/7 = 0.142857142857... = 0.(142857)
(循環小数の循環する部分を循環節といい、循環節の最初と最後の数字の上に点を打って表したり、
循環節を括弧でくくって表したりする。)

任意の有理数を途中で打ち切らない小数で表してみたいと思い、有理数を表すクラスを作成し、
そのメソッドの1つに「有理数から循環節表現も可能な小数表記を出す」メソッドを作成してみた。
また、ファクトリメソッドの1つとして、循環節表現を含む小数の文字列を受け取って有理数に変えるメソッドも作成した。

有理数クラスのフィールドは、
molecule：分子、long型
denominator: 分母、long型
とした。また符号要素は統一して分子が持つことにし、既約分数の形で不変クラスとした。
整数なら分母が1という形で持つことにした。

```java:有理数を小数に
	public String toDecimalString() {
		// 整数ならそのまま表示
		if (denominator == 1L)
			return String.valueOf(molecule);
		// 筆算の要領で割り算。まずは整数部分を取り出す
		LinkedHashMap<Long, Long> restAndDigit = new LinkedHashMap<>();
		long integer = Math.abs(molecule) / denominator;
		long remind = Math.abs(molecule) % denominator;
		// 既出の余りと同じ余りが出るか、割り切れるまで割り算を繰り返す
		while (!restAndDigit.containsKey(remind) && remind != 0L) {
			long r = remind * 10L;
			restAndDigit.put(remind, r / denominator);
			remind = r % denominator;
		}
		StringBuilder builder = new StringBuilder();
		if (molecule < 0L)
			builder.append('-');
		builder.append(integer).append('.');
		// 割り切れたなら桁をすべて並べて表示
		if (remind == 0L) {
			restAndDigit.values().forEach(builder::append);
			return builder.toString();
		}
		Iterator<Map.Entry<Long, Long>> iterator = restAndDigit.entrySet().iterator();
		Map.Entry<Long, Long> temp;
		while (!(temp = iterator.next()).getKey().equals(remind)) {
			builder.append(temp.getValue());
		}
		builder.append('(').append(temp.getValue());
		iterator.forEachRemaining(e -> builder.append(e.getValue()));
		return builder.append(')').toString();
	}
```

```java:小数表記を有理数に
	public static Fraction2 parseDecimal(String str) {
		Matcher matcher = Pattern.compile("(-?\\d+\\.\\d*)(\\(\\d+\\))?").matcher(str);
		if (!matcher.matches())
			throw new NumberFormatException("Illegal input : " + str);
		BigDecimal decimal = new BigDecimal(matcher.group(1));
		if (matcher.group(2) == null)
			return fromDecimal(decimal);
		BigInteger m1 = decimal.unscaledValue();
		BigInteger d1 = TEN.pow(decimal.scale());
		BigDecimal decimal2 = new BigDecimal(matcher.group().replaceAll("[\\(\\)]", ""));
		BigInteger m2 = decimal2.unscaledValue();
		BigInteger d2 = TEN.pow(decimal2.scale());
		// BigIntegerを使って有理数にする別メソッド
		return fromBigInteger(m2.subtract(m1), d2.subtract(d1));
	}
```

もともと分母分子をBigIntegerで作っていて放置していたものを、「そこまで大きな数が分母分子に来ることはないだろう」と思ってlongに書き換えていたが、加算や乗算でオーバーフローを気にしだすと面倒だからBigIntegerを使っていたということを思い出したorz
Azureで作成したVirtualMachineのプライベートなFQDNの取得


tl;dr
-------

- Azureは内部ネットワーク向けのDNSを持っており、リソースはこれを見て名前解決することができる
- Azureの同一VNet内に存在するVirtualMachine(VM)であれば、VM名のみでプライベートIPを解決できる
- ただし、Application GatewayはVM名のみでは解決できず、DNSサフィックスを付け足す必要がある


未調査
-------

- VNetピアリングした場合にVNetをまたいだリソースの名前解決（できない？）
- App Service（WebApp,Functions）やAzure Database等も内部向けのFQDNを持っているかどうか（VNetで管理できないからなさそう？）


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

VMの**プライベートなFQDNでプライベートIPの名前解決**を行いたい。

VM作成のパブリックIP割り当て時にFQDNを指定することができるので、パブリックIPの名前解決ができるが、プライベートIPにはないのかどうなのかわからなかった。

プライベート向けのFQDNがあると嬉しい事例としては、APサーバ用のVMとDBサーバ用のVMを作り、APからDBに接続するときの接続情報を決め打ちにできるとか、プライベート接続なので多少早いんじゃないか、とか。プライベートIPを調べて手で設定をやっても多分困らないんだろうけど、なんか嫌だった。


調査
--------

`Azure VM プライベートIP 名前解決`辺りの単語で調べても、Azure DNSサービスのプライベート対応の話が多く出てきて、欲しい情報が見つからなかった。

「こりゃできないな！あきらめて手でやろう！」って思い、別の調査でARMテンプレートの再利用性について調べてたところ、NICのリソース定義の部分で、以下の定義を見つける。

```
    "dnsSettings": {
        "dnsServers": [],
        "appliedDnsServers": [],
        "internalDomainNameSuffix": "xxxxx.lx.internal.cloudapp.net"
    },
```

※xxxxxの部分は伏字です

ここの`"internalDomainNameSuffix": "xxxxx.lx.internal.cloudapp.net"`ってなんだろう？

サフィックスということはもしかして、`vmname.xxxxx.lx.internal.cloudapp.net`とすれば参照できるのでは？と思い、試したらできた。

```
$ nslookup vm-db.xxxxx.lx.internal.cloudapp.net
Server:         168.63.129.16
Address:        168.63.129.16#53

Name:   vm-db.xxxxx.lx.internal.cloudapp.net
Address: 10.0.1.4
```

168.63.129.16はMicrosoftが持つDNSサーバらしい。

で、RHEL系のLinuxなら、/etc/resolve.confにDNS回りの事を書くので覗きに行くと以下のようになっていた。

```
; generated by /usr/sbin/dhclient-script
search xxxxx.lx.internal.cloudapp.net
nameserver 168.63.129.16
```

search（DNSサフィックス）が定義されているので、省略しても見に行くはず。

```
$ nslookup vm-db
Server:         168.63.129.16
Address:        168.63.129.16#53

Name:   vm-db.xxxxx.lx.internal.cloudapp.net
Address: 10.0.1.4
```

これで完全なFQDN名を知らなくても、VM作成時につけた名前さえわかれば名前解決ができそう。

自動化が少し楽になりますね。


残念なところ
-----------

分かっている範囲では、Application GatewayはDNSサフィックスを知らないので、バックエンドプールやカスタムプローブを登録する際はDNSサフィックスを含めたFQDNで登録する必要があります。

ただAzure Resource ManagerでTemplateとして管理すれば、`reference`等からFQDNを取り出せそうなので自動化は出来そうかな？


関連資料
-----------

`internal.cloudapp.net` あたりで調べるといろいろ出ますので、そちらを調べると良いかも。

公式なら「[VM とロール インスタンスの名前解決](https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-name-resolution-for-vms-and-role-instances)」 が一番詳しい・・・詳しい？
golangのreflectとinterface

golangのreflectとinterfaceを色々と触ってみたので備忘録。

## reflect

まずはreflectからですが動的に型を扱いたいってやつです。
が、チートシートがまとめられてたので特に説明不要かなと、、、実際に書いてみると理解しやすいかなと思いました。
[Go 言語 reflect チートシート](https://qiita.com/nirasan/items/b6b89f8c61c35b563e8c)

## interface

メソッドリストみたいな言い方をされたりしてますが、golangのjavaのinterfaceみたいに色々と書かなくても簡単に使えます。よく見る例ですがこんなかんじ。

```golang
package main

import (
	"fmt"
)

type Animal interface {
	Cry() string
}

type Dog struct{}

func (d *Dog) Cry() string {
	return "わん"
}

type Cat struct{}

func (c *Cat) Cry() string {
	return "にゃん"
}

func Sound(a Animal) {
	fmt.Println(a.Cry())
}

func main() {
	Sound(&Dog{})
	Sound(&Cat{})
}
```

ただ個人的にこのコードに違和感があり、色々と調べてみたところ、mixinっぽい？traitっぽい？ことができそうでした。

## mixin？trait？

golangでmixinというのもおかしいかもしれませんが、phpのtraitみたいなものをinterfaceを使って実装することができます。上のサンプルコードに少し手を加えてみます。

```golang
package main

import (
	"fmt"
)

type IAnimal interface {
	Cry() string
}

type Animal struct {
	IAnimal
}

type Dog struct{}

func (d *Dog) Cry() string {
	return "わん"
}

type Cat struct{}

func (c *Cat) Cry() string {
	return "にゃん"
}

func main() {
	dog := Animal{&Dog{}}
	fmt.Println(dog.Cry())

	cat := Animal{&Cat{}}
	fmt.Println(cat.Cry())
}
```

構造体で宣言していたDogとCatには手を加えていませんが、新たにAnimalという構造体を追記してます。中身はinterfaceをそのまま突っ込んでるかんじです。
もちろん名前をつけることもできますが、その場合呼び出すときに名前を記述する必要がでてきます。

```golang
type Animal struct {
	inf IAnimal
}
func main() {
	dog := Animal{&Dog{}}
	fmt.Println(dog.inf.Cry())
}
```

## 動的に...reflectを使って...

としたかったのですが、結果的にはどこかで明示的に型を書かないとうまく動かなかったという結果でした。やりたかったのはDBとかに格納してる値を元にインスタンス生成して関数をコールしようとしましたが、、、
構造体に値を格納するところをreflectで書いたところまではよかったのですが、最初の処理でswitchで分けてしまってるという結果。

```golang
package main

import (
	"fmt"
	"reflect"
	"strconv"
)

type IContainer interface {
	MethodA() string
	MethodB(x, y int) int
}

type Driver struct {
	IContainer
}

type DriverType int

const (
	ADD = "ADD"
	MINUS = "MINUS"
)

func CreateDriver(driver string) IContainer {
	switch driver {
	case ADD:
		return &Add{}
	case MINUS:
		return &Minus{}
	}
	return nil
}

func New(driver string, args ...interface{}) *Driver {
	container := CreateDriver(driver)
	rt, rv := reflect.TypeOf(container).Elem(), reflect.ValueOf(container).Elem()
	for i, arg := range args {
		field := rt.Field(i)
		value := rv.FieldByName(field.Name)
		value.Set(reflect.ValueOf(arg))
	}

	return &Driver{container}
}

type Add struct {
	Value int
}

func (c *Add) MethodA() string {
	return strconv.Itoa(c.Value)
}
func (c *Add) MethodB(x, y int) int {
	return (x + y) + c.Value
}

type Minus struct {
	Value int
	Digit int
}

func (c *Minus) MethodA() string {
	return fmt.Sprintf("%d, %d", c.Value, c.Digit)
}
func (c *Minus) MethodB(x, y int) int {
	return c.Value - (x+y)*c.Digit
}

func main() {
	a := New("ADD", 193)
	fmt.Println(a.MethodA())
	fmt.Println(a.MethodB(9, 3))

	m := New("MINUS", 200, 3)
	fmt.Println(m.MethodA())
	fmt.Println(m.MethodB(3, 9))
}
```

[Go Playground](https://play.golang.org/p/LeksQAsG_BG)

いろいろと書いて勉強にはなりましたが、まだまだ理解ができてないなと思ったかんじです。
良い書き方などあれば是非。
3月やったこと整理

# contents creator側
##chat chart機能の追加
### どのように
youtubeを記事に追加する機能を参考にして行った。
formを作ったあと、その処理をjsで行う感じ。
### 得た知識
s3に上げた画像をurlで指定する方法を知った。
validationをそれ用のライブラリを入れて行っていることがわかり、もうちょっと拡張できそうなことに気づいた(行っていはいない)。
## テーブルに列を追加出来るようにした。
###どのように
ボタンが押されたら、jsでajax通信を呼ぶようにする。その際、表に挿入されているキーワードの中から、ボタンよりも下にある、キーワードのみをgrepで所得、それをajaxでcontrollerに渡す。
controller内では取って来たキーワードの列に+1をして、それをidで探してアップデートする。
###得た知識
grepでブロックの条件で指定した配列を抽出出来る。
phpでのcontroller内での操作がなんとなくわかった。
## テンプレート機能の実装
###どのように
まずはformでテンプレートに使用したい仮想通貨名を取ってこれるようにする。挿入ボタンを押したら、イベントが発火し、毎度の如く、ajaxが呼ばれる。ajaxには通貨名と記事idを渡すようにする。また、もし、すでに何かしらのコンテンツが入力されていた場合はブロックするようにした。こっからcontrollerへ処理を渡す。
テンプレートの内容をarrayで定義したものを生成し、eachで回して、それぞれに記事idを付与し、保存する。その際保存が成功すれば、itemのidを返すようにする。そのidをitems_orderにどんどんぶっこんでいく。これらを保存して、完了。
### 得た知識
controller内でうまい具合データを成型しつつ保存する方法
うまくいかない時にdebugだったり、consoleをうまく使うことで解決できること。
複雑な動作が入っていて、エラーになる時はそこらへんの操作を外してから一回うまくいくかどうかをみてから、エラー個所を探すなど。
##テンプレートによるエラーの修正
###どのように
足し算するときの空白の有無には気をつけよう。
formが２重になっていると、エラーが発生するので気をつける。
##widget機能の実装
毎度毎度のように新しい機能を実装するはいいもののhtmlrenderの部分で、どうやってitem以外のtableを参照したらいいのかがわからない。
->深津さんの実装方法
itemのkindがexchangeだった場合にloadmodels　exchangeをして、tableを呼び出し、いつものようにthis->からtable指定で内容を取ってくる。
#core側
##LP用のカテゴリーを作った。
###どのように
layoutディレクトリにLP用のfileを設置、controllerでもそのレイアウトを参照するように指定。
###学んだこと
layoutを指定しさえすれば、かなり自由にviewを切り替えることが可能。わざわざ大げさにif分岐しなくてもlayoutごと変えるのもあり(ものによるけど)。
routingを配列をeachで回して定義することができる。route.rbってfileは一見特別fileで変なことしちゃいけないように感じるけど、案外柔軟なことがわかった。
配列で定義したやつを回してevalで各要素ごとにメソッドを定義することができた。とても簡単だが、メタプログラミングになった。
##toppageの変更
###どのように
toppageに表示させる記事を可変にした。dbで指定した記事番号を取ってきて、それをtoppageに表示させる。
###学んだこと
dbは単にデータを格納するだけの場所じゃなくて、他のアプリとかと同一のdbを参照すれば、橋渡し的なポジションを取ることもできることがわかった。
##APIとの接続
###どのように
jsonとかopenuriとかを利用して、apiと通信したものを開いてデータとして取得、あとはdbに保存したり、使いまわしたり、割と自由。
###学んだこと
大抵のAPIは使いやすいようにできているのでそれを見逃してはだめ、何かできないと思ったら、まずは自分がまだ認識していない機能があるなどの場合を考える。
APIってどんなもんなんだろぐらいに思っていたけど、リクエストを送ったら、ページが描画される代わりに、データが飛んでくるものなんだなって感じに認識できた。(当然他にもいろんな種類があるとは思うけど。)
##schedule.rbからcrontabに登録してapiを回す
###どのように
まず、apiをよんで取得したデータをデータベースに保存するためのメソッドを作る。それをrunnerで呼べるようにlib/taskの下におく。crontabでrunnerを定期的に呼ぶように設定。
###学んだこと
定期的に何かを実行させたいとき、crontabに対して、コマンドを登録するという方法がある。
何かメソッドを実行したいときにrunnerという選択肢がある。
##market_idを取ってくるメソッドを作った。
###どのように
メソッドを作った。一回しか回す必要がないので、pryで回した。
###学んだこと
pryでメソッド実行は思った以上に結構使える。
Zinrai（AI学習Engine）を調べてみた話

#はじめに
当方、AIや機械学習というものについて、全くの初心者です。以下の記載内容や感想には基本的な知識等が欠如していると思いますが、ご理解頂ければと存じます。

#Zinraiって？
Zinraiは富士通が提供するAIのこと。
AIによる機械学習をAPIとして提供するサービス（Zinraiプラットフォームサービス）を展開している。
http://www.fujitsu.com/jp/solutions/business-technology/ai/ai-zinrai/

#調査のきっかけ
携わるシステムの検索機能を、AIを使って検索結果を意味として近いものもヒットさせる、ようはAIで賢く検索がしたいとのことで調べてみた。

#専門分野別意味検索
サイトの言葉を引用すると、
>専門分野別意味検索APIは、キーワードや文章の「意味」で文書を検索します。 
Zinraiが大量にある文書を構造化し、ある単語（キーワード）や文章と意味の近い文書を検索します。意味の近さで検索するため、キーワードを含まない文書も探すことができます。

ずばりやりたいことが実現できるAPI。
サイト内にAPIのリファレンスがあるので、仕様面についてはこちらで確認可能。
https://k5-doc.jp-east-1.paas.cloud.global.fujitsu.com/doc/jp/zinrai-pf/document/reference/reference_domain_specific_semantic_search_v2.pdf

---
使用することができたのでいろいろとやってみたが、詰まるポイントがところどころあった。
今後のためにいろいろと記載したいところだが、上記のリファレンスに載っていない内容を含むことになるため、コンプライアンスを考えて掲載しないこととする。。。
（まだ新しいサービスである、有償である、等の理由でネット上にはほとんど情報がないので、本当は載せたい。。。）
SVNマージ時のコンフリクトの対応

SVNでマージ時に以下のエラーが出た場合の対応をメモ。
※あくまでも今回自分のした内容のメモなので、最適解とは異なるかもしれないので注意
>Reintegrate can only be used if revisions xxxx through xxxx were previously merged from (URL) to the reintegrate source, but this is not the case:
(xxxxはマージ対象のリビジョン、URLはマージ先のレポジトリURL)

上記の要約は以下の通り。
再統合は、xxxxからxxxxまでのリビジョンが（URL）から再統合ソースに以前にマージされた場合にのみ使用できますが、そうではありません。

SVN上の状況は以下の通り。

```
　trunkソースA　 r1
　brunchソースA　r2（trunkソースAを元にブランチ作成）
　trunkソースA　 r3（あるファイルを修正）
　brunchソースA　r4（trunkソースAと同じファイルを修正）
```

上記のtrunkソースAとbrunchソースAのマージ時に前述のエラーメッセージでマージに失敗した。

以下の手順で対応したところ、正常にマージを完了した。

```
①trunkソースAからbrunchソースAにマージ
　⇒コンフリクトが発生するので、正しく編集を行いコンフリクトを解決する
②brunchソースAからtrunkソースAにマージ
　⇒問題なくマージが完了
```

---

同じケースの場合、試すことで解決の糸口になるかもしれない。
PostmanでEnvironmentを利用する

これまでもWebAPIのテスト実行にはPostmanを使ってきたが、最近まで知らなかったことがあったのでメモを残す。

#Environmentって？
Environmentで何ができるか？について、簡単に説明すると、**API実行時の環境変数の様なものを定義することができる機能**、である。

APIではよく認証した証跡としてトークンを払い出し、各APIのヘッダ等にトークンを指定するということがあると思う。
毎回毎回、払い出されたトークンをヘッダのvalueにコピペをしていたが、これが結構おっくうに感じていた。
こんな「ちょっとめんどくさい」と思う手順をEnvironmentは解消してくれる。

#Environmentの設定
設定はとても簡単。
Postmanウィンドウの左上のNewボタン＞Environmentを選択。
Environmentの名称を入力。（これは、Environmentの選択プルダウンに表示される）
任意のkeyとvalueを設定する。入力が完了したらAddボタンを押下する。
以上で完了。

#Environmentの使用
使用方法も簡単。
任意の箇所（URL欄、パラメータ欄、pre-script欄等、どこでもけっこうどこでも呼び出せる）でkeyを{{}}で囲うことで使用できる。

```postman:使用例
http://localhost:8080/hogehoge/{{key}}
```

{を入力した時点でインテリセンスのような予測機能で候補が表示されるため、入力も簡単にできる。
また、tests(リクエスト完了後に実行されるscript)内でレスポンスの値をEnvironmentで定義したkeyにセットすることもできるので、Runnerで実行する際の自由度もかなり上がる。

---

Postmanを使用していてEnvironmentを使用していない場合はお試しあれ。
FlowType 最小構成のビルド環境 Babel WebPack

# はじめに

JavaScript で型チェックできる FlowType (flow) を使ってみています。

React/Reduxなどと同時に使用されることが多いようなので、ビルド構成がReact/Reduxも含んだものになっていることが多いようなのですが、

FlowTypeだけを学ぶために、Flowを導入するためのシンプルな最小構成のビルド環境を整えてみました。

# GitHub

FlowType と Babel のコマンドで変換したサンプル
FlowType と Browserify Babelity で変換したサンプル
FlowType と WebPack で変換したサンプル

あわせてGitHubでダウンロードできるようにしておきました。

standard-software/FlowType_Sample
https://github.com/standard-software/FlowType_Sample

# インストール

ダウンロードした各フォルダ

01_flow_babel
02_flow_babel_browserify
03_flow_babel_webpack

それぞれをカレントにして次のコマンドを入力すると、Package.json に記載している内容にしたがって、必要なモジュールをダウンロード・インストールしてくれます。

```
npm install
```

あとは、それぞれのフォルダの ``` run_flow.bat ```を動かしてみてください。
そうすると型チェックが行われます。

# ビルド方法

各フォルダの、```run_build_*.bat ``` を動かしてみると、.\build\build.js が作成されて、index.html と build.js とでプログラムが動作します。

これは、WEB用のプログラムですが、console.log に内容を出力しているだけです。

Babel の設定は、.babelrc
FlowType の設定は、.flowconfig にかかれています。
Browserify や WebPack の設定は、GitHubにアップしているサンプルプログラムをそれぞれみてください。
HTMLでラベル表示すると連続した半角スペースが1つに丸められる件


もしかしたら、「そんなの常識だよ」レベルなことかもしれないが、知らなかったのでメモ。。。

---

HTMLで文字列を表示する方法はいろいろあると思う。
labelタグで囲う、表組されている場合はtdタグにそのまま出力、spanタグで囲う、などなど。
これらの方法で、半角スペースが連続して入っている文字列を設定すると、半角スペースが1つに丸められてしまう。

```html:例
<td>
    string   end
</td>
```
と記述すると

```
string end
```
と表示される。

この対策としてさっと思い浮かんだのは、preタグで囲う方法。
これでいくと上手いこと連続した半角スペースが表示される。

```html:例2
<pre>
    string   end
</pre>
```
と記述すると

```
string   end
```
と表示される。

万事解決と思ったが、1つ問題が発生。
表示する領域の幅は限定されているが、preタグは自動で折り返さないため、
表示領域の幅以上の文字列を指定すると幅を超えてはみ出てしまう。

この問題の対策として1番最初に思いついた方法はスタイルに「word-break:break-all;」を指定して折り返しを強制する方法。
しかし、preタグにはこの方法では自動折り返しはかからない。
「word-wrap:break-wod;」についても同様に効果がなかった。

調べてみたところ、preタグで自動折り返しをするにはスタイルに「white-space: pre-wrap;」を指定すればできるとのこと。

```html:例3
<td style="width:100px;">
    <pre style="white-space: pre-wrap;">
        start                string             end
    </pre>
</td>
```
と記述すると100pxあたりで折り返しがかかる。

この方法で晴れて連続した空白を表示し、表示領域内に幅を収めることができた。


#「white-space: pre-wrap;」ってpreタグだけにしか効かない？

一件落着したと思ったが、「white-space: pre-wrap;」ってpreタグにしか効かないのか？そもそもこの指定がtdやlabelに効けばpreタグで囲い直す必要がない。
結論、効果あり。

```html:例3
<td style="width:100px;white-space: pre-wrap;">
    start                string             end
</td>
```
これにて一件落着。

#詳しくは
white-spaceについて詳しくはこちらを参照するのが吉。
https://developer.mozilla.org/ja/docs/Web/CSS/white-space
postgresqlで正規表現を使う

LIKE演算子では正規表現ほどの強力な判定はできない。
postgresqlでは以下の演算子を用いることで、正規表現（POSIX正規表現）を使って判定を行うことが可能。

>**~**

postgresqlのドキュメントに演算子について以下のパターンがあるとの記載あり。
https://www.postgresql.jp/document/9.5/html/functions-matching.html

#使用例
使用例は以下の通り。

```sql:使用例１
select s.id,--社員ID
       s.name,--社員名
       s.busyo,--部署コード
       s.id ~ '^[A-C].*0001$'--A,B,Cのいずれかで始まり0001で終わる社員IDか判定
from syain s
```
idが'A0100001'、'C9910001'はTRUE、'a0100001'、'C9911001'、'D0100001'はFALSEの判定となる。

#右辺にDB値を使用する

右辺にDB値を使用したい場合、以下のように指定する。

```sql:使用例２
select s.id,--社員ID
       s.name,--社員名
       s.busyo,--部署コード
       s.id ~ ('^' || s.busyo || '.*0001$')--部署コードで始まり0001で終わる社員IDか判定
from syain s
```

LIKE演算子とは異なり、右辺全体を()で閉じる必要がある。
()で閉じない場合、最初の結合子(||)の前までを右辺と判断するようだ。
以下の例では判定した結果の文字列表現を結合子以降の文字列と結合した形で取得される。

```sql:使用例３
select s.id,--社員ID
       s.name,--社員名
       s.busyo,--部署コード(A01とする)
       s.id ~ '^' || s.busyo || '.*0001$'--IDの最初が部署コードと同じ場合、'trueA01.*0001$'の文字列が取得される
from syain s
```

#SIMILAR TO演算子

正規表現を使った判定に用いることができる演算子にSIMILAR TOがある。
この演算子はLIKE演算子と~演算子のハイブリッドのようなもので、LIKEのパターンマッチ、正規表現のパターンマッチを用いることができる。
個人的には、SIMILAR TO演算子はLIKEのパターンマッチが含まれているためあまり直感的に使用できないと感じたため、今回は~演算子のみの説明とし、SIMILAR TO演算子は紹介のみにとどめる。

#使用する場面の制限

~演算子の使用については、postgresqlのドキュメントにセキュリティ上の問題を抱えているとの記載がある。
~演算子の左辺、右辺にプリペアードステートメントでアプリ使用者の任意の値を受け付ける場合、悪意のある攻撃を受けることがあるということ。
使用する際はこのような点に十分に気を付けることを心がける必要がある。
bcで基本統計量を計算する

#**はじめに**
基本統計量を計算するbcコマンドのスクリプトです。 







#**スクリプトと出力形式**

#####**【bcスクリプト】**

~~~code:basic_statistics.bc
define set_scale(x, s) {
	auto old_scale
	old_scale = scale
	scale = s
	x /= 1	#scale 設定
	scale = old_scale
	return (x)
}
define round(d, s) {
	auto temp;
	if(scale(d) < s) return (set_scale(d, s))
	temp = (d - set_scale(d, s)) * (10^(s+1))
	if(temp > 5) d += (1/(10^s))
	return (set_scale(d,s))
}
define power(d, i) {
	return(e(i*l(d)))
}

scale = 100
n = read()
for(i = 0; i < n; i++){
	ds[i] = read()
}
sum = 0
for(i = 0; i < n; i++){
	d = ds[i]
	sum += d
	if( i == 0) {
		max = d
		min = d
	} else {
		if(d > max){
			max = d;
		}
		if(d < min){
			min = d;
		}
	}
}
old_scale = scale
if( (n % 2) == 0) {
	scale = 0
	m1 = ds[n/2]
	m2 = ds[(n/2)+1]
	scale = old_scale
	med = (m1 + m2) / 2
} else {
	scale = 0
	med = ds[n/2]
	scale = old_scale
}
ave = sum / n
sum_dev2 = 0
sum_dev3 = 0
sum_dev4 = 0
for(i = 0; i < n; i++){
	dev = ds[i] - ave
	devs[i] = dev
	sum_dev2 += (dev * dev)
	sum_dev3 += (dev * dev * dev)
	sum_dev4 += (dev * dev * dev * dev)
}
svar = sum_dev2 / n
ssd = sqrt(svar)
uvar = sum_dev2 / (n - 1)
usd = sqrt(uvar)

skew = (n /((n -1 ) * (n - 2))) * sum_dev3 / (usd^3)
kurt = ((n * (n + 1)) /((n -1 ) * (n - 2) * (n - 3))) * (sum_dev4 / (usd^4)) - ((3 * (n - 1)^2) / ((n - 2) * (n - 3)))

print "n = "; n
print "min = "; min
print "max = "; max
print "med = "; round(med, 20)
print "ave = "; round(ave, 20)
print "sum = "; round(sum, 20)
print "svar = "; round(svar, 20)
print "uvar = "; round(uvar, 20)
print "ssd = "; round(ssd, 20)
print "usd = "; round(usd, 20)
print "skew = "; round(skew, 20)
print "kurt = "; round(kurt, 20)


~~~

#####**【出力形式】**

~~~
n = データ数
min = 最小値
max = 最大値
med = 中央値
ave = 平均値
sum = データの総和
svar = 標本分散
uvar = 不偏分散
ssd = 標本標準偏差
usd = 不偏標準偏差	
skew = 歪度
kurt = 尖度

~~~

#**実行例**

#####**【データファイル】**

~~~code:q11.txt
1
2 2 2
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
4 4
5
~~~
データは空白、タブ、改行で区切る。

#####**【実行方法】**
~~~bash:実行例
((cat q11.txt | wc -w); sort -g q11.txt) | bc -l -q basic_statistics.bc
~~~

データ数、データを空白、タブ、改行で区切って、bcにわたします。
中央値を計算する都合でデータは(数値として)ソートする必要があります。


~~~code:実行結果
n = 30
min = 1
max = 5
med = 3.00000000000000000000
ave = 2.96666666666666666667
sum = 89.00000000000000000000
svar = .43222222222222222222
uvar = .44712643678160919540
ssd = .65743609744386733227
usd = .66867513545937177714
skew = .03679696392430356743
kurt = 4.50339722463221514906


~~~


#**環境**

ホスト　Windows10 COREi7 
VM　　　VirtualBox バージョン 5.2.6 r120293 (Qt5.6.2)
　　　　　CentOS Linux release 7.4.1708 (Core)
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
bc 1.06.95




#**おわりに**
「[gawkで基本統計量を計算する](https://qiita.com/EjiriAkira/items/e92e919bb9ee1c52b7ae)」の検算用に作りました。
bcを選んだのは以下の理由によります。

 - 多倍長演算(Multiple Precision Arithmetic)をサポートしている
 - できるだけ標準的なもの（Unix/Linux）

データの読み込みに`read()`を使っています。bcはスクリプトの読み込みも`read()`も標準入力を使用しているので、shスクリプトとして作成するのが難しいです。数が少なければ環境変数で渡すのも手ですが、配列に渡すのは骨です。
以上
Files.copy(pathA, pathB)のエラー時の挙動について

JavaのFiles.copy(pathA, pathB)がエラーであった場合の挙動で少しハマったため、メモしておく。

Files.copy(pathA, pathB)はファイルAをファイルBにコピーするAPI。
実行すると、下記のエラーが発生。

```java:コピーエラー
java.nio.file.NoSuchFileException: \pathA-> \pathB
```

pathAのファイルが存在しない！？と思い、実際にファイルパスの示す先のフォルダを確認したところ、ファイルが存在していた。
存在するのに何故「存在しない」とのエラーが出るのか！？と考えたため、ドハマり。。。


あの手この手を試した後に、Files.copy(pathA, pathB)のjavaDocをちゃんと確認。すると、
>Files.copy(Path source,Path target)のjavaDoc（抜粋）
>>デフォルトでは、ソースとターゲットが同じファイルである場合を除き(その場合、このメソッドはファイルをコピーしないで終了する)、ターゲット・ファイルがすでに存在するか、シンボリック・リンクである場合にそのコピーは失敗します。

とある。ターゲット・ファイルのパスはどうなっているのか！？とやっと気づく！

pathBの示す先のフォルダを開こうとするとパス内の最後のディレクトリが存在していないことがわかった！！

#今回の教訓
パスの存在確認はきっちりする！
使用するAPIについてはよくAPI仕様を理解する！

今後、気をつけたいと思います。。。
IEでinputのform要素が機能しない

表題の通りIEではHTML5で追加されたinputのform属性が機能しない。せっかく追加されたのに、残念である。。。
Chromoのみ動作確認をしたが正常に動作した。
恐らくモダンブラウザは対応済みかと思われる。（Edgeは対応されているのか？未確認）

#form属性は何が嬉しい？
HTML5のリファレンスを確認すると、HTML5までは<form>と<input>の関連付けは<form>タグ中に<input>を記述することで行っていたが、HTML5からは<form>タグ外の<input>のform属性に<form>のid属性を記述することで関連付けすることができる。

```html:form属性は何が嬉しい？
#HTML5までの実装例
<form id="form1">
    #<form>と<input>の関連付けは<form>タグ中に<input>を記述
    <input type="text" name="text1"/>
</form>

#HTML5の実装例
<form id="form1"/>
#form属性に<form>のid属性を記述することで関連付け
<input type="text" name="text1" form="form1"/>
```

上記の実装ができることで、javascriptにより<input>単位に動的に<form>との関連付けを変更することができる。

#でもIEでは機能しない。。。
未だにメインの開発ターゲットのブラウザにIEを採用する現場は多い。このため、この機能がIEで使えないのは残念だ。
今後のIEの更新に期待したい。
いろんな違いを教えてくれるサイト集

- [CP932とMS932の違いを調べて知ったCP932とSJISの違い - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2020/10/08/002458)
- [電子署名と電子証明書の違いの説明を集めてみました。 - Qiita](https://qiita.com/ponsuke0531/items/47e147896467e7ba5838)
- [DDL と DLL の違い - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2018/09/18/221953)
- [パラメータと引数の違い - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2018/03/23/171557)
- [いろんなMacがある - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2021/04/09/213653)

### &lt;br&gt; と &lt;br /&gt; と &lt;br/&gt;

```text
<br> : HTML
<br /> : XHTML
<br/> : XML >> XHTMLでも書けるけどブラウザによっては理解できないからスペースを入れたほうがいい
```

- [&lt;br&gt; と &lt;br /&gt; タグの違い 【HTML と XHTML 】｜新入社員（インターンシップ）研修日誌](https://ameblo.jp/midorieng03/entry-10929028852.html)
- [&lt;br /&gt; じゃなくて &lt;br&gt; だよ - Qiita](http://qiita.com/irxground/items/dc3e688d7d48c01c3988)
- [&lt;br&gt;と&lt;br /&gt;タグの違いとは | 覚え書き.com](http://write-remember.com/archives/2309/)

**スマートフォン**での表示も意識したら\<br>だけじゃなくて\<p>を合わせて使おうというサイトも見かけてお勉強になりました。

- [[HTML] BRタグは使うな! 私が「改行」を一切使わなくなった1つの理由 | ヨッセンス](https://yossense.com/br-do-not-use/)
- [やってはいけない改行＜br＞タグのこんな使い方 &#8211; ポイントサイトで毎月プラス××万円貯金](http://pointsite-net.info/html-br-tag/)
- [連続改行brはNG！？覚えておいて損はない改行と段落の使い分け方](https://naifix.com/br/)
電子署名と電子証明書の違いの説明を集めてみました。

調べてもすぐ忘れてわからなくなるのでいろんな説明を集めておきます。

### ハンコ VS 身元証明書
- [「電子署名」と「電子証明書」の違い｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](http://wa3.i-3-i.info/diff335hanko.html)

> 電子署名
> コンピュータの世界のハンコ。主に他の人に送るファイルにくっつけるデータで、そのファイルの正当性を証明するもの
> 電子証明書
> コンピュータの世界の印鑑証明みたいなもの。コンピュータの世界における「どこかの誰かが発行した身元証明書」

### 押印やサインに相当する行為を電子的に行う技術 VS 「電子署名」の検証する際に用いられるもの
- [電子署名、電子証明書とは](http://edoc-proc.pref.gifu.lg.jp/howto/esgn/cert.html)

> １．電子署名とは
> 電子署名とは、書面での申請や入札における押印やサインに相当する行為を電子的に行う技術です。間違いなく本人から送信されたものであるということを確認できるため、成りすまし（第三者があなたや他の誰かの人のふりをして申請すること）やデータの改ざん（第三者が内容を書き換えること）を防ぐことができます。
> ２．電子証明書とは
> 「電子証明書」とは、「電子署名」の検証する際に用いられるもので、書面手続でいえば、本人確認のための「印鑑証明書」の役割を果たします。電子証明書は、信頼される第三者機関が発行する電子的な証明書で、ＩＣカード等の記憶媒体に保存されています。

### 対象はデータ VS 対象は証明したい内容
- [デジタル署名とデジタル証明書  CapmNetwork](https://qiita.com/drafts/47e147896467e7ba5838/edit)

> デジタル署名は、文書に対して「ハッシュ化」と「秘密鍵による暗号化」を行ったものです。文書、画像や音声データなどに対して、ある時点の状態を明示するという役割を果たします。
> デジタル証明書は、証明したい内容に対して「ハッシュ化」と「秘密鍵による暗号化」を行ったものです。証明書を信頼できる第三者機関から発行してもらうことで、公的な確認（証明）ができる仕組みです。

### 秘密鍵で暗号化する VS 公開鍵を保証する
- [ディジタル署名 - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2018/04/08/212434)
- [ディジタル証明書 - ponsuke_tarou’s blog](http://ponsuke-tarou.hatenablog.com/entry/2018/04/08/234013)
Swift：初めてのHello Worldアプリ

アプリ開発超初心者が、SwiftでHello Worldアプリを作った時の備忘録\_φ(･\_･
今回はXcodeを使いました。


## 環境

- Mac OS X 10.12.6
- Xcode 8.0（インストール済）

# 方法その1：コーディングなし（Storyboard）版
[Swift言語によるiOSアプリ開発](http://www.dcom-web.co.jp/technology/swift1/)を参考にしました。

- Xcodeを起動
- Create a new Xcode project を選択
- Single View Application を選択して Next ボタンをクリック
- プロジェクトの設定を行い Next ボタンをクリック
- とりあえずXcodeの画面左上の Build ボタンをクリック
- Xcodeの画面左側のプロジェクトウィンドウの Main.storyboard を選択
- Xcodeの画面右下のlibrary参照画面から Label を探し、View へドラッグ&ドロップ
- ドロップした Label に Hello World! を入力
- Xcodeの画面左上の Build ボタンをクリック

###### 出力結果
![スクリーンショット 2018-04-08 21.36.57.png](https://qiita-image-store.s3.amazonaws.com/0/215142/4325eaaa-3f80-97dc-b5f7-988c88642fcf.png)

とっても簡単に出来ました。


# 方法その2：コーディング版
[Swift言語によるiOSアプリ開発](http://www.dcom-web.co.jp/technology/swift1/) と [初めてのiOSアプリ(Swift)で HelloWorld!](https://qiita.com/toshihirock/items/b0399e7f357b3f59c903) を参考にしました。

- Xcodeを起動
- Create a new Xcode project を選択
- Single View Application を選択して Next ボタンをクリック
- プロジェクトの設定を行い Next ボタンをクリック
- とりあえずXcodeの画面左上の Build ボタンをクリック
- ViewController.swift に `print("Hello World!")` を入力
- Xcodeの画面左上の Build ボタンをクリック
- ViewController.swift に以下を入力

```text
let label = UILabel(frame: CGRectMake(100, 100, 200, 50))
label.text = "Hello Swift"
self.view.addSubview(label)
```

- Xcodeの画面左上の Build ボタンをクリック

###### 出力結果
```text:log
...,generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
Hello World!
```
無事、ログ上に `Hello World!` が表示されました。
表示場所に気づくのに時間がかかってしまいました…(･_･;

シミュレータにも表示されました。
![スクリーンショット 2018-04-08 22.50.54 1.png](https://qiita-image-store.s3.amazonaws.com/0/215142/d049faa4-b54f-2f33-b79a-919e46734913.png)

コーディングした方が表示が思い通りになりそうだな、と感じました。（ただの慣れかも？）
PostgreSqlメモ for ubuntu

#インストール

```shell:インストール
sudo apt-get update
sudo apt-get install -y postgresql
```

#初期設定
##ロールの作成
最初のインストールが出来たら、postgresというユーザかつ同名のロールが作られるらしい。
psqlを実行するためにpostgresユーザーに切り替える。

```shell:ユーザー切り替え
sudo -i -u postgres
```

```sql:現在のロール確認
psql
postgres=# SELECT rolname FROM pg_roles;
/* または */
postgres=# \du
```
ロールを作成し、LOGIN CREATEDB PASSWORD属性を付与する。
そもそもロールとユーザーの違いについては[こちら](http://dbnote.web.fc2.com/note_u_00_role_and_user_and_group.html)参照。

```sql:ロールの作成
postgres=# CREATE ROLE test LOGIN CREATEDB PASSWORD 'test1';
```
名前がtestでパスワードがtest1のロールが作成された。

##データベースの作成
作成したロールがアクセスするためのデータベースを作成する。

```sql:データベースの確認
postgres=# SELECT datname FROM pg_database;
/* または */
postgres=# \l
```
```sql:データベースの作成
postgres=# CREATE DATABASE test OWNER test;
```

##作成したロールでログイン
作成したロールtestでログインする。

```sql:testでログイン
psql --username=test --password --dbname=test
```

##クライアント認証の設定
作成したロールでログインするときに「psql: FATAL:  Peer authentication failed for user "test"」のようなメッセージが出る場合、[こちら](https://qiita.com/ibara1454/items/40ce2d82926f48cf02bc)参照。

#コマンド集
##テーブル関連
```sql:テーブル一覧
\dt;
```

```sql:テーブル構成表示
\d テーブル名;
```

#SQL集
##テーブル定義
```sql:テーブル定義
select
    *
from
    information_schema.columns
where
    table_catalog = current_database()
  and
    table_name = 'table_name'
order by
    ordinal_position
;
```
「ゼロから作るDeep Learning」の実行環境を、Colaboratoryを用いて作成する

# はじめに
Colaboratoryとは、Googleが提供を始めたJupyter Notebook互換のデータ分析ツールです。
今回、オライリー社の「ゼロから作るDeep Learning」の本にあるコードを、
Colaboratoryで実行する方法を紹介します。

まずはそのために「ゼロから作るDeep Learning」のコードを、Google Driveに保存します。
https://github.com/oreilly-japan/deep-learning-from-scratch

# Google Driveをディレクトリとしてマウントする

ノートブックを新規作成して、「Python3」のノートブックを作成します。
https://colab.research.google.com/

Colaboratoryでは、コマンドを実行できます。
下記の実行が終わると、URLと認証コード入力フォームが表示されるので
認証をします。

認証したあと、!lsを実行して、driveディレクトリがあればマウントは成功です。

```
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
```

# 「ゼロから作るDeep Learning」のコードを動かす（p.73）
書籍では、MNISTデータセットをダウンロードやNumpy配列への変換を行うためのスクリプトを提供しています。(datasetディレクトリの、mnist.py)

これをGoogle Driveに保存しているので、Colaboratoryから使用します。
下記を実行して、printが正しく出力されれば成功です。

```
import sys, os
# sys.path.append(os.pardir) # 下記に変更
sys.path.append('/content/drive/deep-learning-from-scratch')

# 最初の呼び出しは数分待ちます...
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False)

# それぞれのデータ形状を出力
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,)

```

# さいごに
自分自身も機械学習について初心者ですが、学習と同時にColaboratoryを試してみたので紹介しました。
Colaboratoryを使用することで、マシンスペックを気にせず実行できると思うので参考にしていだければ幸いです。

# 参考
https://qiita.com/uni-3/items/201aaa2708260cc790b8
Moodleバージョン番号早見表

Moodleプラグイン開発(version.phpの`$plugin->requires`で指定するMoodleバージョン番号など)でよく検索するので、早見表を作ってみました。
(よく自分で使う範囲で・・・)

# Moodle 3.4

|バージョン番号(humanfriend)|バージョン番号|
| --- | --- |
| Moodle 3.4 | 2017111300 |
| Moodle 3.4.1 | 2017111301 | 
| Moodle 3.4.2 | 2017111302 |

# Moodle3.2 

|バージョン番号(humanfriend)|バージョン番号|
| --- | --- |
| Moodle 3.2 | 2016120500 |
| Moodle 3.2.8 | 2016120508 |

# Moodle3.1 

|バージョン番号(humanfriend)|バージョン番号|
| --- | --- |
| Moodle 3.1 | 2016052300  |
| Moodle 3.1.11 | 2016052311 |

# 参考

https://docs.moodle.org/dev/Releases
Meteorで長押しイベントを実装する

フルスタックJSフレームワーク「Meteor」で、ボタン長押しイベントを実装する際に戸惑ったので、メモ。

Meteorでボタン長押しイベントを実装するには、

* `Meteor.setTimeout()`

というものを利用します。素のJSにも存在するAPIですね。

[MeteorのTimeout API公式ドキュメント](https://docs.meteor.com/api/timers.html)

他にも、同じ分類に属する

* `Meteor.clearTimeout()`
* `Meteor.setInterval()`
* `Meteor.clearInterval()`

を使って長押しイベントを実装できますが、実際`setTimeout()`のみで実装できるので、今回はそちらに絞って書こうと思います。

# 実装

サンプルとして、下のようなシンプルなカウントアップを作ります。

![スクリーンショット 2018-04-08 22.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/203817/ed428452-16ce-2c3b-f532-caf2baf99209.png)

## HTML
longPressというテンプレートを作ります。

```html
<head>
  <title>longPress</title>
</head>

<body style="text-align: center">
  <h1>Long Press Counter</h1>
  {{> longPress}}
</body>

<template name="longPress">
    <button class="plus">＋</button>
    <p>{{counter}}</p>
    <button class="minus">ー</button>
</template>
```

## JS(通常のクリックの書き方)
まずは比較のために通常のクリック書き方から。

```js
Template.longPress.onCreated( function () {
    this.counter = new ReactiveVar(0);
});

Template.longPress.helpers({
    counter() {
        return Template.instance().counter.get();
    },
});

Template.longPress.events({
    'click .plus'(event, instance) {
        instance.counter.set(instance.counter.get() + 1);
    },
    'click .minus'(event, instance) {
        instance.counter.set(instance.counter.get() - 1);
    }
});
```

## JS(長押しイベントでの実装方法)
`click`を`mouseup`、`mousedown`に変更し、`setCount()`というメソッドを追加。
setTimeoutを利用することで、再帰的にメソッドを呼び出すようにします。

```js
Template.longPress.onCreated( function () {
    this.counter = new ReactiveVar(0);
    this.holding = new ReactiveVar(false);

    this.setCount = (count) => {
      if(this.holding.get()) {
          this.counter.set(this.counter.get() + count);
          return Meteor.setTimeout(() => this.setCount(count), 100);
      }
    };
});

Template.longPress.helpers({
    counter() {
        return Template.instance().counter.get();
    },
});

Template.longPress.events({
    'mousedown .plus'(event, instance) {
        instance.holding.set(true);
        return instance.setCount(1);
    },
    'mousedown .minus'(event, instance) {
        instance.holding.set(true);
        return instance.setCount(-1);
    },
    'mouseup .plus'(event, instance) {
        instance.holding.set(false);
    },
    'mouseup .minus'(event, instance) {
        instance.holding.set(false);
    }
});
```

これで完成です。
`Meteor.setTimeout()`は返り値としてIDを返します。
これを`Meteor.clearInterval(id)`の引数に渡してあげることで止めることもできますが、上の方法でも止めれるのでこっちの方がいい気がします。

同様にして、マウスオーバーしている間といったイベントも`mouseenter`、`mouseleave`に変えてあげれば可能です。

[サンプルコード](https://github.com/daitasu/longPress)
Python3 openpyxlを使って楽にExcelファイルを操作しよう

# はじめに
設計書だったり(使い方的には間違っていますが)なんかの仕様書なんかをExcelで作って納品するということがある方も多いかもしれません。
退屈なことはPythonにやらせよう(by オライリー)ということでPython勉強ついでにExcelファイルをぱぱっと操作出来るようになろうという一貫です。

2019/09/30 アップデート
社内で機能追加依頼があったので、機能追加しました。
Pythonバージョンを3.6から3.7にアップデートしました。
Openpyxlバージョンを2.5.1から3.0.0にアップデートしました。
ファイル名が英名のみの対応となっていたのを日本語も対応するようにアップデートしました。

# 今回やること
納品作業する際に手作業するのは何かと考えた際に思いついたことが2つあったので、今回はそれを達成したいと思います。

・全てのシートのフォーカスをA1の指定する
・アクティブシートを先頭シートにする
・表示倍率を全て100％(2019/09/30追加)
・全てのシートを表示状態に変更(2019/09/30追加)

前提として納品対象のExcelファイルが格納されているフォルダはPythonファイルが同じフォルダに存在しているとします。

# 環境（2019/09/30追加）
Python 3.7.2_2
openpyxl 3.0.0 https://pypi.python.org/pypi/openpyxl

# コード
``` python
import openpyxl
import os
import re
path = "."
files = os.listdir(path)
excel_files = [file for file in files if os.path.isfile(os.path.join(path, file)) and re.compile(r"^(.*).(xls|xlsx)").match(file)]
for file in excel_files:
    wb = openpyxl.load_workbook(file)
    sheet_names = wb.sheetnames
    for sheet_name in sheet_names:
        sheet = wb[sheet_name]
        sheet.sheet_view.selection[0].activeCell = 'A1'
        sheet.sheet_view.selection[0].sqref = 'A1'
        sheet.sheet_view.tabSelected = False
        sheet.sheet_view.zoomScale = 100
        sheet.sheet_view.zoomScaleNormal = 100
        sheet.sheet_state = 'visible'
    wb.active = 0
    wb.save(file)
```

# 最後に
コード書いてみたら本当に簡単にアクセスすることが出来ました。
基本的な操作は特にはまることなく操作可能になる感じはしますが、やれることが多く様々なことに対応することが出来そうでもあります。
納品作業みたいな簡単な作業だけではなく、帳票なんかもこれで作れそうです。

簡単すぎてPythonの勉強にはほとんどなりませんでしたが、良いLibrayを知りました。
Ruby入門（他言語から）

#【前置き】
はい。週1のアウトプットのお時間。
ちょっとPlayFramworkアプリを置いておいて平日ぱらぱら読んだりやったRubyについてアウトプットをしておく。

ちなみに使用した参考書は以下。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)

ターゲットとして別言語を使ってPG出来る人や、
次の仕事でRubyを使うようになるとかそんな方がマッチする。
私の場合凄くマッチしてさくさくペアプロしてるような感覚でとってもお勧め。
ifなんですかforってなんですかメソッドとはクラスとはって方にはお勧め出来ない。

これだけで現場で必要最低限の知識は付くと著者さんが言ってるので信じて呼んでアウトプットしましょ。

#【環境について】
他言語からやろうと思った時、たとえばJAVAでいうJDKをインストールしなければRubyは使用出来ません。ＯＳで導入に差異がありますが調べて簡単そうなのをピックアップ。

Linux⇒ＯＳ標準のRubyを使う。
Windows⇒RubyInstallerを使う。

OS差異についてはこんな感じ、私がRubyを認識した時の頃はLinux専用機な感じがしたがwindowsでもインストーラーが出て動くようになった模様。
ちなみにwindowsの場合、別口でも方法があってそれは以下。

・仮想環境にLinuxＯＳをインストールして使用する。
・AWSのCloud9を使用する。

ちなみに仮想環境とは、その昔HDの領域を切り分けてOSをインストールするというのが主流だった覚えがあるが最近では仮想環境というものがある、VirtualBoxだったりVMwareだったり、他にもいろいろあったり、興味があれば調べてみると知識が広がって為になる。

どういうものかざっくり言うとソフトウェア上にＯＳをインストールする事が出来るという事。昔でいうＨＤ領域を切り分けてＯＳをインストールする、っていうのをソフトウェアがやってくれてるようなもので、いろいろ言語に手を出したいとかじゃなくて、Rubyをがっしりやりたいけどwindows端末しかない方はこのやり方を推奨します。Ruby以外にもサーバーはほぼLinuxなのでLinux扱いに慣れる必要がありますしね。

いろんな言語をやりたいって方にお勧めなのがAWSのCloud9を使う方法。
Cloud9は言うなればクラウド接続するだけで使用出来るIDEで、RubyだけでなくJavaでもCでもhtmlでもいろいろ動かせる。自社管理の端末だと何かとインストールする時に管理者権限必要でろくに開発環境整えねぇ！って方にとってもお勧め。デメリットは完全イングリッシュの為、苦戦する人もいると思う。

で、今回は今後の事も考えてCloud9を使用。
ちなみにCloud9は手軽にrailsを導入する事が出来ます。

#【Ruby特有メモ】
まず前提としてRubyは動的型付けで、Javaとは違って動かした時エラーを吐いたりする。
Javaはコンパイルでエラーがわかる、eclipseで赤字吐いたりとかはそのため。

以下、違いを認識する為にざっくりまとめる、若干違ったりするけど既にある知識とマッピングする事で本質まで覚えなくてすみそうなので。本当はAWSにソースとか叩き込んだのでそれ乗せたかったんだけど・・・

・オールオブジェクト⇒なんでもメソッドが引っ付いてくる。
・nullの代わりにnilがいる⇒javaだとぬるぽしそうな判定処理でfalseのようにnilが使える便利
・配列の扱いがとっても柔軟。文字列すら配列のように扱える配列の比較が出来たりする。
・ハッシュ⇒JAVAのMAP
・シンボル⇒変数をインデックス番号にするようなもの。ハッシュのキーにする事で処理をスマートに出来る。
・ブロック⇒javaでいう拡張forの柔軟バージョン
・定数はフリーズしないといけない⇒JAVAでいうstaticfinalって魔法文だけじゃ固まってくれない。しかも要素まで固めないとゆるゆる
・モジュール⇒javaでいうライブラリみたいなもの、includeとかextendsして使う。
・self⇒staticみたいな感じ

3分の2ほど読んでやってピックアップダイジェスト。
もちろんこれ以外にも説明も細かくやった内容を追うように例題とかあるので参考書の購入をお勧めします。今回はここまで

# 【少しやった感想】
選択した参考書が優秀だった事もあり結構さくさく進めれる
で楽しくプログラミング出来る！って理念通り書き方のパターンと柔軟性が凄いこれは凄いメリットだと思う。逆に書き方のパターンが多すぎるというのもデメリットと思う。参考書途中にリファクタリングフェーズがあるが熟練者と初心者でコードの差がくっそ出ると思う。大規模になればなるほど書き方がばらばらになりそうなので打ち合わせ規約の意識あわせが大変そうです。

# 【最後に】
エンジニアは常にキャッチアップ人生だと思うが、幅が広かったり転職活動とか業務とか重なると結構きつかったり・・・やりたいこといっぱいで時間がネ・・・
転職活動しつつ思う事があり、Javaしてます⇒Java求められてる企業様へってのはありありだと思うけど、マイナーな言語っていうのも失礼かもだけどその言語の経験者ってそもそも巡り合う事が困難だと思ったりしてて。ってなるとキャッチアップは必要としてそんな別言語スキルチェンジする方ってよくいるのかなぁと。
素人の peco

# 始めに

zsh peco でググるとすごいのが一杯でてきます。履歴検索を入力するところ (zle って言うの？) に叩き込んでカーソルを末尾に持ってくるとかすごいです。私も中身が分からないまま、コピペで使ってます。でもすごすぎて、普通の人は、こんなの自分じゃ使いこなせないって、自分なりのカスタマイズを諦めてしまうかもしれません。ということで、私がこんな程度の使い方もあるんだよと紹介することで、普通の Linux ユーザーに、勇気を与えられればと思います。ちなみに私のプログラミング力は hello.c をググらないと書けないレベルです。

# peco は ログインマネージャー

漢たる Linux ユーザはグラフィカルなログインマネージャーなんて使いません。しかし毎度 `startx` するのも無粋というものです。そこで、$HOME/.zprofile に

```zsh
# tty1=起動直後のやつのときだけ有効
if [[ "$(tty)" == '/dev/tty1' ]]; then

  # echo で出力したのを peco に流すという簡単設計
  # 自分しか使わないんだから、複数選んじゃったとか、何も選ばなかったとかの例外処理
  # なんて不要です。
  case $(echo 'X\nTTY\nLogout\nPoweroff\nReboot' | peco) in
    X)
      startx -- vt7
      logout
    ;;
    Logout) logout ;;
    Poweroff) sudo /sbin/poweroff ;;
    Reboot) sudo /sbin/reboot ;;
  esac
fi
```
![loginmanager.png](https://qiita-image-store.s3.amazonaws.com/0/248613/8cec5ed7-f60e-2bf9-054f-96bc33d9f39f.png)

# peco は環境変数セレクタ

Linux の醍醐味は ``./configure && make && make install`` です。そして pgo や lto を追い求めることが更なる漢のロマンでしょう。そこで、CFLAGS や LDFLAGS などが簡単に切り替えられないといけません。

```zsh:~/.local/bin/oreflags
#!/bin/zsh
# echo で出力したのを peco に流すという簡単設計
i=$(echo 'pre-pgo\npost-pgo\nregular\nsafe\nlto\ncurrent'|peco --prompt "CFLAGS? > ")

# なんだかんだで、何も選ばなかったときの処理を学びました
if [ -z $i ]; then return; fi

  case $i in
    pre-pgo)
      export CFLAGS="-march=native -O2 -ftree-vectorize -fprofile-generate=/sources/gcda -fprofile-arcs -pipe"
      export CXXFLAGS=$CFLAGS
      export LDFLAGS='-lgcov'
      export LIBS='-lgcov'
    ;;
    post-pgo)
      export CFLAGS="-march=native -O2 -ftree-vectorize -fprofile-use=/sources/gcda -fprofile-correction -pipe"
      export CXXFLAGS=$CFLAGS
      unset LDFLAGS
      unset LIBS
    ;;
    lto)
      export CFLAGS="-march=native -O2 -ftree-vectorize -flto -pipe"
      export CXXFLAGS=$CFLAGS
      unset LDFLAGS
      unset LIBS
    ;;
    regular)
      export CFLAGS="-march=native -O2 -ftree-vectorize -pipe"
      export CXXFLAGS=$CFLAGS
      unset LDFLAGS
      unset LIBS
    ;;
    safe)
      export CFLAGS="-mtune=native -O2 -ftree-vectorize -pipe"
      export CXXFLAGS=$CFLAGS
      unset LDFLAGS
      unset LIBS
    ;;
    current)
    ;;
  esac
echo "CFLAGS=$CFLAGS"
echo "CXXFLAGS=$CXXFLAGS"
echo "LDFLAGS=$LDFLAGS"
echo "LIBS=$LIBS"
```

```zsh:~/.zshrc
# 私は .zshrc に function を余り書かない派。.zshrc は短かくしたいから、基本アウトソース
alias oreflags='source ~/.local/bin/oreflags'
```

![cflagselector.png](https://qiita-image-store.s3.amazonaws.com/0/248613/b492f244-9fed-2f7e-2f3b-da906ac7c990.png)

TTY での日本語文字化けや `make` のエラーを英語で記録して何かしらのフォーラムに投稿したいときなどに向けて LANG の切り替えも重要です。

```zsh:~/.local/bin/orelang
#!/bin/zsh

i=$(echo 'ja\nen\ncurrent' | peco )
[ -z $i ] && return

  case $i in
    ja)
      export LANG=ja_JP.utf8
      # break
    ;;
    en)
      export LANG=en_US
      # break
    ;;
    current)
      # break
    ;;
  esac
echo "LANG=$LANG"
```

# まとめ
自分で決め打ちの `echo` を `peco` に流して `case` してやれば、簡単に俺メニューが完成します。
Kaggle の Titanic Prediction Competition に、Keras でモデル作成し submit してみるまで

# はじめに
　昨日、kaggle の Getting Started Prediction Competition の一つである、Titanicのデータを分析して見たが、傾向はいまひとつよく分からず。
https://qiita.com/kznx/items/fcbc49320411f9d4fe81

　せっかくなので、予測してsubmitしてみることにしました。手法としては、RandomForest や boostingが向いているようですが、サクッとkerasでどこまで行けるか、3時間ほど試して見ました。参考にしたのは下記のgithubです。コメント等は英語ですが、とても分かりやすいコードです。

https://github.com/savarin/neural-networks

https://github.com/savarin/python_for_ml

#  方針
　前処理は上記のsavarinさんの方針そのまま採用させていただきました。

* 'Name', 'Ticket', 'Cabin’は使わない
* ‘Age’, ‘Fare’ の欠損値は平均で埋める
* ‘Sex’ は 0,1 に
* ‘Embarked’ は Onehot ベクトルに

　Neural Networkはシンプルに隠れ層 2層のMLPで。あとはそれらしいパラメータで。コードは以下に置きました。

https://github.com/kznx/kaggle_titanic

#  終わりに
　とりあえずsubmitしてみたところ、77%で6548位とのこと。とは言っても、同じ正解率の人が500人以上いるようで、中盤は競争が激しいようです。ハイパーパラメータチューニングすれば、80%ぐらいまでは行きそうな気がするので、ちょっと試してみたいと思います。
初心者はコピペ？　　Heart to you !💖 ： It may be Qiita's first novice blog：

　初めは、コピペでするといいと言いますが、コピペはつまらない
振り付けでも振り写しという人がいますが、コピペでなく、自分の力で作る方が、たとえ簡単でも良いと思うけど、、、エンジニアでないから難しい。
　[undefined]() 添付資料を作り、挿入できたのですが、見れませんでした。
　最初のページが見えないのは淋しいので、4／14編集し直して最初にふさわしいものをコピペして試して見たら、見れました！
　まずは見れること、、コピペだけになりました。

　Qiita さんのブログはエンジニアだけのものかもしれませんが、
『もっとプログラミングやオープンデータが広がるためには、初心者が挑戦することに意義がある！』と言って励ましてくれた方もいたので、
またQiitaでブログ書いたらと創始者の方から勧められたので頑張って見ました。

　で、
　４月１日は新年度の始まり、エイプリールフールでもありますが、
もう一つ　　　:point_up:   HAPPY BIRTHDAY  IchigoJam   

100 '4th Anniversary
110 VIDEO 5:CLS:CLV
120 POKE 1800,1,1,1,1,1,0,1,0,4
130 POKE 1809,4,119,69,117,0
140 POKE 1814,255,0,64,0,93,85
150 POKE 1820,93,4,221,0,4,4
160 POKE 1826,197,69,221,0,255
170 POKE 1831,0,0,0,223,74,234
180 POKE 1837,0,255,0,0,0,128
190 POKE 1843,128,128,0,128,0
200 FOR I=1 TO 6
210 POKE 2304+I,224+I:NEXT
220 FOR Y=0 TO 6 STEP 2
230 FOR X=3 TO 0 STEP -1
240 A=PEEK(416+Y)
250 B=PEEK(417+Y)
260 C=128+(A>>(X*2+1)&1)
270 C=C+2*(A>>(X*2)&1)
280 C=C+4*(B>>(X*2+1)&1)
290 C=C+8*(B>>(X*2)&1)
300 POKE 2312+(Y/2)*8+(3-X)+2,C
310 NEXT:NEXT
320 FOR I=1 TO 2
330 POKE 2346+I,PEEK(3076+I)
340 NEXT
350 IF !INKEY() GOTO 350
360 VIDEO 1

IchigoJam web by WebAssembly 
FUKUNO.JIG.JP<img width="548" alt="スクリーンショット 
2018-04-15 4.59.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/248242/bc34af3e-e27d-f50e-bdaf-2dc529acc9bc.png">
[UE4] PostProcessでObjectにOutlineをつける~後編~[UE4.18]

#はじめに
前編では、SobelFilterを用いたエッジ検出を行い、特定のオブジェクトに対してOutlineを描画しました。
-> https://qiita.com/kanurapoison/items/1b36fdaa0a33f0d278d5
今回は、少し手を加えて見栄えを良くしていきます。

#Outline色変更
まずはOutlineの色を変えてみましょう。これは本当に簡単で、マテリアル内に少し修正を加えます。SobelFilterの結果に応じて、赤色に描画されるようにLerpをかけています。また、MF_GetSobelValueに対する入力としてSobelWidth=3に設定することで、Outlineを太くしています。

描画結果
![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/b501c7f1-b0c8-a693-44c2-bbd7bd32aeb4.jpeg)

マテリアル
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/5dcd3f99-d9dc-6883-c870-2ea530176919.jpeg)
これだけでかなり見栄えが良くなりましたね!

#壁越しの場合
次は、この描画結果をもう少し詳しく見ていきましょう。ゲームなどで多く目にする場面が”壁の向こう側にObjectが存在する”状態です。
先ほどの2Objectを壁越しに見てみると以下のようになります。壁越しでもOutlineがしっかりと描画されていることが分かります。
![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/b131c93b-c0f0-c80f-9c30-25853de24870.jpeg)

しかし、ゲームによっては壁越しには描画してほしくない場合もあります。その時は、もう少し修正を加えます。そのために**SceneDepthとCustomDepthの比較**”を行います。壁の向こうにオブジェクトが存在する場合は、”SceneDepth < CustomDepth”となるので、そのピクセルは描画しないようにします。以下が修正を加えたマテリアルと描画結果です。以下の場合は、”SceneDepth = CustomDepth”のピクセルだけ描画するように実装しています。

描画結果
![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/5b16fecc-f0ce-9c6d-a002-7a0128b5916a.jpeg)
手前に壁がある部分はOutlineが描画されていないことが分かりますね!

マテリアル
![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/73380609-c8d0-7e6a-5296-650b49e56f94.jpeg)

#おまけ
また、CustomStencilValueを用いることで、下図のように、特定のオブジェクトに対してのみ壁越しの描画のon/offを切り替えることも可能です。

![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/65a80659-402a-8a73-a62c-9c0efbb99652.jpeg)

他にも、OverWatchでインフラサイト使用時風にもできます。（同ゲームでは、もっと複雑な処理をしていると思いますが...）
![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/245572/f43e2957-bb36-da81-ba6e-00b2168c90c3.jpeg)
Visualstudioで実機デバッグできた

無事にタブレットPCでVisualstudioを使って、実機デバッグ出来ました。

ただ、HTML5のWeb Speech Synthesis APIで音声合成をここ見た部分と、加速度センサーの部分は、動きませんでした。

onsen-UIの部分は、無事に動きました。

音声合成とセンサー部分は、Cordovaの機能を使うように、ソースを書き換えて対応します。

AndroidのOSのバージョンは、5.0.1です。
MYSQLの更新系自動ユニットテストを無限に可能にする。更新が瞬間的に元どおり。MYSQLでフラッシュリカバリしたい

#unit testの問題に取り組んでみた
自動unit testの問題点の一つに、「更新すると元に戻さなければならない」という課題がある。
DBを元に戻すコードやら更新する機能をテストコードで動かして・・・
それは本当に元に戻るんですかい？バグがあっても戻るんですかい？

この課題をクリアするためにORACLEで言うフラッシュリカバリが使えないか？と考えてみた。MYSQLにそんな便利な機能あったかな？そもそもORACLEのフラッシュリカバリってそんなに早くないぞ。。。unit testは平気で１万ケースとかになってしまうので高速に実行しなければ立ち向かえない。ORACLEのフラッシュリカバリってそんなに早くないし、MYSQLでやりたい。

#結果
MYSQLで一瞬で元にもどして、テストを高速に無限に更新できるようにした。
もちろんDB部分だけなので、ファイルとか外部のデータは別です。
これが超便利。
自分の環境ではすこぶる便利につかえる。


ここから下は試行錯誤の中身

#MYSQLってフラッシュリカバリないの？

**ない。。。**
探してもない。どこにもない。なんて不便な。。。。


#無いなら作ればいいじゃない！！Replication Protocolでなんちゃってフラッシュリカバリ
[Replication Protocol](https://qiita.com/mokoenator/items/05b23af7321cfab95198)の記事でやった仕組みを使う。


考え方を説明する。

Replication Protocolで流れてるイベントを認識して、バックアップして逆順にもどせばいい。

準備として
unit testと会話するためのDB、TEABLEをつくる。このテーブルに向けてコマンドを投げるようにUPDATEする。
たとえば、UPDATE AAA SET COMMAND='バックアップ開始'; みたいな感じでdummy slaveに認識させる。こうすることで、会話が成立する。
コマンドのやりとりにredisとかmq使えそうだけど、Replication Protocolで繋がってるんだからコレを使った方が便利。

図↓
![frfr.png](https://qiita-image-store.s3.amazonaws.com/0/185049/1a6415a9-c991-f64e-4840-9ca9a29b7a36.png)


- unit testのSETUPメソッドで、バックアップ開始して!コマンドをなげる
- dummy slaveは更新記録モードに入る
- dummy slaveはポジティブアクノリッジ(ACK)的なOKを回答する
- unit testはACKを認識してテストを実行する（グリーンかどうかはどうでもいい）
- unit testのteardownで、リカバリして！コマンドを投げる
- dummy slaveは更新記録停止→記録を逆順に適応する（記録順に適応してももどらない）
- dummy slaveはACKを回答する
- unit testはACKを認識して一つのテストを終わる

Replication Protocolを使えば高速でこんなことができる。
unit testの確認を人間の目でやってるのであれば使えないが、1万ケースもあるのに人間が間に入ったら自動じゃないし。

#感想
データの使い回しができるし、バグで間違っても戻るし、想定外の動作しても戻るしほんとに便利。
不便なところは、
・なんちゃってフラッシュリカバリがない環境に、あると思い込んでテストを実行してしまう
・同時実行ができない。共通の開発DB環境とかだったら使えない。