OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerのphpイメージでzip extensionを使えるようにする

# (2020/02/09更新)最新版イメージであれば使用可能（なはず）です
7.2 もそろそろサポートが切れるので7.4 のイメージを使おうとしたら
ちゃんとバージョンがあがっていました

```file:Dockerfile
FROM php:7.4-apache

RUN apt-get update
RUN apt-get -y install libzip-dev
RUN docker-php-ext-install zip
```

![Screenshot_138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/c5a3b58d-0eb2-3a13-125b-77e58aa80456.png)

なので大丈夫だと思います

過去記事は単純に記録として残しておきます

# 以下過去記事


# やりたいこと
Docker hub から phpイメージを引っ張ってきても
zip extensionでパスワード付きzipを作成できない。
それを作成できるようにするのです。

# 原因さがし
とりあえずこんな感じでできるかな？
とやってみると

```file:Dockerfile
FROM php:7.2-apache
...
docker-php-ext-install zip
```

zip 使えるようになったかなー、という気がしてくる。
でもよーくログを見ると

```file:log
checking for libzip... from pkgconfig: version 1.1.2 found in /usr/lib/x86_64-linux-gnu
checking for zip_open in -lzip... yes
checking for zip_file_set_encryption in -lzip... no
configure: WARNING: Libzip >= 1.2.0 needed for encryption support
```

バージョン古くて泣けるのです。
なにか情報ないかな、と思ってベースとなっているubuntuのトラッカーを見に行くと

https://bugs.launchpad.net/ubuntu/+source/libzip/+bug/1674057

一応 In Progress

でも待っていられないので自分で入れてしまいましょう

# むりやりコンパイルして入れる
これが正解かどうかわかりません。
むしろだれかもっとスマートな方法教えてください(´；ω；｀)

抜粋しているだけなので、もしかしたら足りないものあるかも

```file:Dockerfile
FROM php:7.2-apache
RUN apt-get update &&\
    apt-get install apt-utils curl gnupg cmake -y &&\
    mkdir /tmp/libzip && cd /tmp/libzip && curl -sSLO https://libzip.org/download/libzip-1.4.0.tar.gz &&\
    tar zxf libzip-1.4.0.tar.gz && cd libzip-1.4.0/ && mkdir build && cd build && cmake ../ &&\
    make > /dev/null && make install &&\
    docker-php-ext-configure zip --with-libzip=/usr/local/lib/libzip.so &&\
    docker-php-ext-install zip
```

こんなんでいいのでしょうか？

# 確認
<img width="314" alt="36144847-c4c2deb6-10f2-11e8-8fd5-35b313ff41a5.png" src="https://qiita-image-store.s3.amazonaws.com/0/217092/6d050f57-b12c-ade1-4bfd-8330c0a6c640.png">

できてましたヽ(^o^)丿
入門Kubernetes の 2 章をそのままやったら、docker build で COPY failed が発生した

入門Kubernetes を購入したので、早速手を出してみたら 2 章の途中でこけました。
メモとして残しておきます。

# Dockerfile の COPY で指定するディレクトリが違う?
2.2.1 では、 Dockerfile を使い、実際に Docker イメージを作成します。

kuar というサンプルアプリケーションを使うので、

- https://github.com/kubernetes-up-and-running/kuard

の README を元に、サンプルアプリをビルドし、Dockerfileを作成しました。

```.sh
$ git clone https://github.com/kubernetes-up-and-running/kuard.git
$ cd kuard
$ make build
```

```Dockerfile:Dockerfile
# 参考：kuard の README.md
FROM alpine
COPY bin/1/amd64/kuard /kuard
ENTRYPOINT ["/kuard"]
```

しかし、入門 kubernetes の Dockerfile は、以下のようになっています。

```Dockerfile:Dockerfile
# 参考：入門kubernetes 2.2.1
FROM alpine
MAINTAINER kelsey Hightower <kelsey.hightower@kuar.io>
COPY bin/kuard /kuard
ENTRYPOINT ["/kuard"]
```

あれ？ `COPY` で指定しているディレクトリが違う...

そこで

先ほどの `make build` によって、kuard 内に作成された、bin ディレクトリの構造を見てみると、

```
bin
├── 1
│   └── amd64
│       ├── kuard
│       └── linux_amd64
├── 2
│   └── amd64
│       ├── kuard
│       └── linux_amd64
└── 3
    └── amd64
        ├── kuard
        └── linux_amd64
```

(`bin/kuard` なんてなかった...)

...

試しに、参考書の Dockerfile (`COPY bin/kuard /kuard` の方) で、`docker build` を行うと、

```.sh
$ docker build -t kuard-amd64:1 .
Sending build context to Docker daemon  64.93MB

...

Step 3/4 : COPY bin/kuard /kuard
COPY failed: stat /var/lib/docker/tmp/docker-builder735597194/bin/kuard: no such file or directory

```

必要なものが見つからないよと、怒られました。

...

というわけで、Dockerfile を以下のように書き換えました。

```Dockerfile
FROM alpine
MAINTAINER kelsey Hightower <kelsey.hightower@kuar.io>
COPY bin/1/amd64/kuard /kuard
ENTRYPOINT ["/kuard"]
```

そして、先ほど同様に `docker build -t kuard-amd64:1` を行うと、`Successfully built` の文字が！
`$ docker images` で、Docker イメージが作成されたことも確認できました
Tilemapでノイズ(線とちらつき)が発生したらSprite Atlasで対処する

次の画像のように一つのTextureの中に複数のSpriteを含んでいる画像を使って、Tilemapを作成することが多くあります。（画像は、Unity公式のサンプルの[2d-techdemos](https://github.com/Unity-Technologies/2d-techdemos)より）


![dungeon.png](https://qiita-image-store.s3.amazonaws.com/0/4125/0926035c-8014-347e-fb54-a2caf714ac18.png)


その場合、次のようなノイズが発生してしまうことがあります。

Editor上での実行時に、ノイズ(予期せぬ線)が発生

![Editor.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/85132087-1741-7989-1bc8-fe2dc825a71c.gif)

製品版実行時に、ノイズ(予期せぬちらつき)が発生

![Build.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/b02c1420-9c1a-41af-356d-f434cc3dd4a2.gif)

このノイズは、`SpriteAtlas`を作成することで修正可能です。


`SpriteAtlas`の作成方法は[公式ドキュメント](https://docs.unity3d.com/ja/current/Manual/SpriteAtlas.html)を確認してください。



# 関連


* [【Unity】スプライト端の謎の線/ゴミ/ちらつきの修正方法](http://www.f-sp.com/entry/2016/11/24/152957)

ノイズの発生原因は、こちらの記事の解説が非常にわかりやすいです。

* [2d-techdemos](https://github.com/Unity-Technologies/2d-techdemos)

Unity公式のサンプルの2d-techdemosでは、Tilemapで使うSpriteをSpriteAtlas化しています。

* [SpritePacker](https://docs.unity3d.com/Manual/SpritePacker.html)

`SpriteAtlas`を作成する以外でも、LegacyなSpritePackerを利用することでノイズを回避できます。
Mindmup > RTOS > マルチタスクのstart, stop図 v0.1

### 概要

RTOSのタスクのstartとstopについて、簡易に描けないか考えてみた。

### マインドマップ

[公開マップ](https://atlas.mindmup.com/yasokada/test_rtos_multipletask_180323/index.html)
(2018/03/23 17:20あたりから閲覧可能)

上記の画像を以下に示す。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/68bceaae-2ea3-a4a9-e82f-db259e16db6f.png)


### 図の説明

- 左側から右側へいくに従い、タスクのPriorityが下がる
- 矢印にてタスクのstart, stopを記載
- 各タスクは青色ノートで表示  
- どのタスクがどのタイミングでstart/stopされるかの確認に使えるか?
    - UMLと比べて見やすいかどうか?

- 留意事項
    - 欠点としてHIGHERのタスクがHIGHERのタスクをstart, stopする図は描きにくい
    - sleepとwakeupをどう描画するか?
    - [Priority inheritance](https://www.embedded.com/design/configurable-systems/4024970/How-to-use-priority-inheritance)の描画は無理?



### Mindmup使い方

- 青色ノード追加は:<kbd>Shift</kbd> + <kbd>Enter</kbd>
- サブノード追加は:<kbd>Tab</kbd>
Open3Dの使い方：ICPの収束の様子を1ステップ毎に見る

pythonで点群処理できる[Open3D](http://www.open3d.org)の探検．[Open3Dの使い方：読み込みと表示，点と法線の取得](https://qiita.com/tttamaki/items/2be476cc15fa39601243)の続き．

stanford bunnyの2つをICPで位置合わせする様子を，1反復毎に表示してみる．

# コード

```python:open3d
import sys
sys.path.append("../..") # Open3D/build/lib/ へのパス
import numpy as np
import py3d


pcd1 = py3d.read_point_cloud("bun000.ply")
pcd2 = py3d.read_point_cloud("bun045.ply")

pcd1.paint_uniform_color([1, 0, 0])
pcd2.paint_uniform_color([0, 0, 1])

kdt = py3d.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)
py3d.estimate_normals(pcd1, search_param=kdt)
py3d.estimate_normals(pcd2, search_param=kdt)


th = 0.02

criteria = py3d.ICPConvergenceCriteria(relative_fitness = 1e-6, # fitnessの変化分がこれより小さくなったら収束
                                       relative_rmse = 1e-6, # RMSEの変化分がこれより小さくなったら収束
                                       max_iteration = 1) # 反復1回だけにする
est_method = py3d.TransformationEstimationPointToPoint()

for i in range(30):
    info = py3d.registration_icp(pcd1, pcd2, 
                                 max_correspondence_distance=th, 
                                 # init=T, # デフォルトで単位行列
                                 estimation_method=est_method,
                                 criteria=criteria
                                )
    print("iteration {0:02d} fitness {1:.6f} RMSE {2:.6f}".format(i, info.fitness, info.inlier_rmse))
    
    pcd1.transform(info.transformation)
    
    py3d.draw_geometries([pcd1, pcd2], "iteration {}".format(i), 640, 480)

```


# 結果

```text:結果
iteration 00 fitness 0.659380 RMSE 0.010144
iteration 01 fitness 0.716738 RMSE 0.010305
iteration 02 fitness 0.785870 RMSE 0.010074
iteration 03 fitness 0.863424 RMSE 0.010018
iteration 04 fitness 0.920633 RMSE 0.009083
iteration 05 fitness 0.928433 RMSE 0.007641
iteration 06 fitness 0.945002 RMSE 0.007052
iteration 07 fitness 0.971085 RMSE 0.006552
iteration 08 fitness 0.982462 RMSE 0.005477
iteration 09 fitness 0.985741 RMSE 0.004569
iteration 10 fitness 0.987281 RMSE 0.003869
iteration 11 fitness 0.988325 RMSE 0.003337
iteration 12 fitness 0.989219 RMSE 0.002945
iteration 13 fitness 0.989641 RMSE 0.002634
iteration 14 fitness 0.989890 RMSE 0.002404
iteration 15 fitness 0.990237 RMSE 0.002254
iteration 16 fitness 0.990362 RMSE 0.002140
iteration 17 fitness 0.990511 RMSE 0.002069
iteration 18 fitness 0.990685 RMSE 0.002029
iteration 19 fitness 0.990784 RMSE 0.002000
iteration 20 fitness 0.990834 RMSE 0.001979
iteration 21 fitness 0.990859 RMSE 0.001965
iteration 22 fitness 0.990908 RMSE 0.001959
iteration 23 fitness 0.990933 RMSE 0.001954
iteration 24 fitness 0.990958 RMSE 0.001951
iteration 25 fitness 0.990958 RMSE 0.001947
iteration 26 fitness 0.990983 RMSE 0.001947
iteration 27 fitness 0.991032 RMSE 0.001950
iteration 28 fitness 0.991032 RMSE 0.001949
iteration 29 fitness 0.991032 RMSE 0.001948
```

![bunny.gif](https://qiita-image-store.s3.amazonaws.com/0/44835/aa44a6fa-083e-5e5b-1af5-aa314082d07e.gif)

このapiではウィンドウが1回毎に表示されて消えるので，matplotlibかなにかの3Dプロットが使えないかなぁ，とおもってaxis3dで表示してみたけど，点の数が多すぎて表示速度が極端に遅かった．
CakePHP2.5におけるValidation::inListの仕様変更について

# はじめに
CakePHP2系のバージョンアップにおいて、CakePHP2.4以前とCakePHP2.5移行ではValidationメソッドの一つであるinListの仕様が若干異なるので記しておきます。

# Validation::inList
2.4以前と2.5以降ではチェックの厳密さが変わっています。

## 2.4以前
[CakePHP2.4におけるinList](https://api.cakephp.org/2.4/class-Validation.html#_inList)の実装は下記のようになっています。

```php
public static function inList($check, $list, $strict = true) {
      return in_array($check, $list, $strict);
}
```
https://api.cakephp.org/2.4/source-class-Validation.html#788-798

内部的には、`in_array()`をつかっています。defaultでは第三引数がtrueになっているので、型チェックまでを含めた厳密なチェックになっています。

## 2.5以降
[CakePHP2.5におけるinList](https://api.cakephp.org/2.5/class-Validation.html#_inList)の実装は下記のようになっています。

```php
public static function inList($check, $list, $caseInsensitive = false) {
     if ($caseInsensitive) {
          $list = array_map('mb_strtolower', $list);
          $check = mb_strtolower($check);
     } else {
          $list = array_map('strval', $list);
     }
     return in_array((string)$check, $list, true);
}
```
https://api.cakephp.org/2.5/source-class-Validation.html#803-819

2.4以前と異なる大きな点として、

- 型チェックまではしなくなった
   - `in_array()`を用いて判定することは変わっていませんが、チェック対象の値である`$check`とリストである`$list`が両方文字列変換して、`in_array()`に渡しています。
- 第三引数の扱い
    - 2.4以前では第三引数をtrueにした場合より厳格に型チェックをしていましたが、2.5以降の場合はtrueにした場合、Insensitiveという意味どおりよりゆるいチェックをするようになっています。

## 結論
CakePHP2.5以降のほうがゆるい判定になるので後方互換性は保たれた変更ではありますが、cakePHP2.4以前からバージョンを上げる際にはinListの第三引数に注意が必要そうです。
30 Days of Codeに文系学生がPHPでやってみた!! Day0-Day5編!

##はじめに
インターン先でプログラミングを勉強中の文系学生。

社員さんから[30 Days of Code](https://www.hackerrank.com/domains/tutorials/30-days-of-code)の存在を教えてもらったから早速やっていこう!!

##Day0
[Dayo](https://www.hackerrank.com/challenges/30-hello-world/problem)は'Hello,World'を表示させる問題。
解説要らないよね。
それじゃあ次。

##Day1
[Day1](https://www.hackerrank.com/challenges/30-hello-world/problem)は計算と文字列の結合かな。
変数とか定義する必要があるのかなと思ったけど、stdinに設定されているみたい。
ファイルを読み込んで、printf(小数点以下の指定,変数)をすれば終わりそう。

##Day2
[Day2](https://www.hackerrank.com/challenges/30-operators/problem)は飲食店の計算システムみたい。
消費税とかね。
Explanation通りにやればできるね。
floorだとTestcaseの最後がうまくいかなかったけれど、roundだとできた。
消費税とかって四捨五入してるの?

##Day3
[Day3](https://www.hackerrank.com/challenges/30-operators/problem)は数の大きさと偶数か奇数かの判定かな。
WeirdかNotWeirdか。
elseif使えばできそう。

…Weirdってどういう意味?

##Day4
[Day4](https://www.hackerrank.com/challenges/30-class-vs-instance/problem)はクラスとインスタンスか…。
でも、ほとんどつくってくれてるから。
必要な条件がわかればそこまで難しくないと思う。

##Day5
[Day5](https://www.hackerrank.com/challenges/30-loops/problem)はかけ算のリスト。
Day4に比べたら楽でしょ…。

##まとめ
今回はHackerRankの30Days of CodeのDay0-Day5までをやりました!!
文系学生の挑戦はまだまだ続く!!
php学習メモ

## 基本
+ ```<?```から始まり、```?>```で終わり
+ 注釈： ```/*   */``` or ```#```

### 変数
+ 変数の前は$を使用
+ ```$_123q``` $の後数字不可、アンダースコアおっけ！

### 「""」と「''」の違い
+ 文字列の結合 「"AB"."CD"」
+ 「""」的中间不能再有「""」。同様に、「''」の中にも「''」あって行けない。
+ 対策：「"」の前に「\」をつける。  
　　 「""」の中に「''」を使う
+ 「""」中间的内容可以展开。（里面是变量的话可以输出变量的值）
+ 「''」中间的内容无法展开。即输出变量的文字列

### date関数による日付・時刻表示
### ループと条件分岐

```
for(初期値,繰り返しの条件,変化){
 繰り返し実行する処理}
----------------------------------------------
while(繰り返しを行う条件){} 
----------------------------------------------
if(){
  }
elseif(){
  }
else{
  }
----------------------------------------------
switch(変数){
case 変数1:
  
  break
case 変数2:

 break
}
```

###配列
```
$s=array("wan","hong","xiang")

$s["english"]=455  #連想配列
Scala版 BRMS ツール(Drools)を試してみた

BRMSという言葉を最近聞いた。
ビジネス・ルール・マネージメント・システムの略らしい。
こいつを適用すると、アプリと業務処理を分別することができるらしい。
確かに昔は、Javaで業務処理を書いた時はif文の嵐だったから、これを適用すれば
業務処理は、BRMSに委ねることができるので大幅に作業の効率化が図れるのは間違いなさそうだ。

今回は、RedHat提供のBRMSツール（Drools）を試してみることにする。
[github](https://github.com/hisahisa/drools-scala-example)

```scala:DroolsMain.scala

package jp.co.drools.droolsscalaexample

import scala.collection.mutable.ListBuffer

object DroolsMain extends App{
  println("start")

  for {
    // ローンパターン適用。autoclose してくれる inputStream系も使えるのがナイス
    hd <- Loan(HogeDecision)
  } {
    val hdb = HogeDecisionBean(101, 1, ListBuffer.empty)
    val fdb = FugaDecisionBean(2, ListBuffer.empty)
    val ret_hdb = hd.determine(hdb)
    val ret_fdb = hd.determine(fdb)

    ret_confirm(ret_hdb)
    ret_confirm(ret_fdb)

    def ret_confirm[A](facts: Decision[A]):Unit ={
      facts.get().foreach(println(_))
    }
  }

  println("end")
}
```

Droolsとのデータ一時格納領域
イミュータブルな性格のScalaでListBufferを使うのはちょっと抵抗あるけど、
Droolsはクラスを予めオブジェクト化する特徴があるから、しょうがないかなあ。

```scala:HogeBean.scala
package jp.co.drools.droolsscalaexample

import scala.beans.BeanInfo
import scala.collection.mutable.ListBuffer

trait Accesser[A]{
  def set( s: A): Unit
  def get():ListBuffer[A]
}
abstract  class Decision[A]( lst: ListBuffer[A]) extends Accesser[A]

@BeanInfo
case class HogeDecisionBean(id:Int, id2:Int, lst: ListBuffer[Int]) extends Decision[Int](ListBuffer.empty[Int]){
  def set(set: Int) = lst += set
  def get() = lst
}

@BeanInfo
case class FugaDecisionBean(id:Int, lst: ListBuffer[String]) extends Decision[String](ListBuffer.empty[String]){
  def set(s: String) = lst += s
  def get() = lst
}
```

実際のアプリとDroolsとのExcelデータ連携をする場所
これまではビジネスルールをアプリ内に記載していたが、Droolsを使うことにより
Excelにてビジネスルールを分別することができるようになった。

```scala:HogeDecision.scala
package jp.co.drools.droolsscalaexample

import us.bleibinha.droolsscalaexample.Kie

object HogeDecision extends AutoCloseable {

  val session = Kie.newSession_s("DecisionKS")

  def determine[A](facts: Decision[A]): Decision[A] = {
    session.insert(facts)
    session.fireAllRules()
    facts
  }

  override def close(): Unit = {
    if (session !=null )session.dispose()
  }
}
```
ローンパターン適用。DroolsがExcelとのデータ連携でセッションを確立するが、
セッションクローズは、ローンパターンで透過的に閉じるようにした。

```scala:Loan.scala
package jp.co.drools.droolsscalaexample

/**
  * Created by http://d.hatena.ne.jp/gakuzo/20110630/1309442452
  */
class Loan[T <: {def close()}] private (value: T) {

  def foreach[U](f: T => U): U = try {
    f(value)
  } finally {
    value.close()
  }
}

object Loan {
  def apply[T <: {def close()}](value: T) = new Loan(value)
}
```



参考サイト
[ローンパターン](http://d.hatena.ne.jp/gakuzo/20110630/1309442452)
dockerの特定コンテナの管理を外部に委託する[実験中]

dockerを仮想環境として利用する際に、コンテナの管理（コンテナ上のサービスの管理ではなく、コンテナ全体の管理）を他の人に丸投げしたくなった。ただし、同じ人に別のコンテナは触ってほしくないので、docker execできるrootやdockerグループ所属ユーザアカウントを渡すというやり方は、使いたくない。

#やってみたこと
ホストのログインシェルを特殊なものにして、外部からsshでアクセスしたときに直接コンテナ内のシェルへ入り込むというのをやってみた。

##仕組み
sshで外部からホストLinuxに特定コンテナ専用アカウントでアクセス。このアカウントのログインシェルを以下のシェルスクリプトにして、スクリプトからdocker execして特定コンテナにつなげる。

以下はLinux環境（ホストはCentOS、コンテナはUbuntu）での例。
mycontainerという名前のコンテナに外部からsshで入ることを想定する。

##手順
- 参考文献[1]の方法で、sudoしなくてもdockerコマンドが使えるようにする。
- 以下のシェルスクリプトをログインシェルとするユーザをホストに作成
    - ***ユーザ名は対象コンテナ名は同じ***にする

```bash:/usr/local/bin/dockershell
#!/bin/bash

if [ $# -eq 0 ]; then
	exec docker exec -it `whoami` su - `whoami`
else
	shift 1
	exec docker exec -i `whoami` su - `whoami` -c "$*"
fi
```

/etc/passwdファイルはこんな感じ：

```conf:/etc/passwd
....
mycontainer:x:1010:1010::/home/mycontainer:/usr/local/bin/dockershell
```
- このユーザをdockerグループに加えてsudoしなくてもdockerコマンドが使えるようにする

```conf:/etc/group
....
docker:x:994:mycontainer
```

- コンテナ内にも同じユーザ名のユーザを作成する
    - コンテナ内のユーザのユーザIDを他のユーザIDと同じにすることで権限を同等にする
        - ホストのユーザとIDは一致しなくてよい
    - コンテナ内はrootアクセスでよい場合は不要。この場合、上記スクリプトの "su - \`whoami\`" の部分を"/bin/bash"にしておく
- scpによるファイルコピーをするのであればコンテナにscp（openssh-clientsなど）を入れておく
- sftpによるファイルコピーをするのであればコンテナにsftp-server（openssh-serverなど）を入れておく
- sshでのアクセスは公開鍵認証とする
    - ホストの /etc/ssh/sshd_config で `PubkeyAuthentication yes` のコメントを外す
- このアカウントについてはパスワード認証はできないようにしておくのが吉（検討事項参照）
- sshアクセスのための公開鍵を用意して、***ホスト側***のユーザアカウントホームの ~/.ssh/authorized_keys に入れておく

これで、sshでホストに作成したコンテナ名と同名のアカウントにアクセスすれば、コンテナ内に入れる。

##検討事項
今回、公開鍵でのアクセスに限ったのは、ホストに新アカウントで入れないようにするため。このユーザはdockerコマンドが使えるため、直接ホストに入れてしまうと、他コンテナをいじることができてしまう。パスワード認証で入れると、ホスト側の別アカウントから su(switch user)することができるので、これを防ぐために公開鍵のみでのアクセスにしてみた。利用するユーザを完全に信頼できるならそこまでしなくてよいかもしれませんが。

#他の解決策
○ コンテナにipアドレスをつけておいて、コンテナでsshdをあげてsshで直接入れるようにする。
    → ip必要とかめんどくさいよね。
○ コンテナでsshdをあげて、ホストからのポートフォワードでsshで入れるようにする。
    → ポート転送の設定めんどくさいよね。

##dockershellスクリプトの説明
コンテナが１つしかないのであれば、ユーザ名とコンテナ名を一致させるとかしなくても、スクリプト内に直接コンテナ名を埋め込んでしまってもよいのだけど、ちょっと汎用性を持たせてみようと思ってこんな感じに。`$*`で引数の有無を調べているんだけど、引数がないときは、ターミナルとしてのシェルが期待されているので、 `docker exec` のオプションとして、`-t` をつけています。tがあると、 `scp` や `sftp` がうまくいかないので、こうして切り分けています。また、もともと、 `$*` の１番目には `-c` が入っていてシェルに直接引っ付くようになっているのですが、これをそのまま `su` コマンドに渡すと  `$*`  の一部を `su` コマンドの引数と解釈されることがあって困ったので、上記のように `shift` で一度取り除いてから改めて `-c` をつけています。

#その他(不具合など)

- CentOS6.9+docker-io 1.7 だと、scp/sftpがうまく動かない…(完了しない)。

#参考文献
 [1] Dockerコマンドをsudoなしで実行する方法 https://qiita.com/DQNEO/items/da5df074c48b012152ee
PhpStormでLaravelをセットアップする


##はじめに
###やること
タイトル通りにPhpStormのウィザードからLaravelプロジェクトをセットアップし、デフォルトのスタートページを表示させるとこまでやります。

###前提環境（筆者の環境）
* macOS 10.13.1
* PhpStorm 2017.2.4
* composerインストール済

###プロジェクトのインストール場所
ルートフォルダ直下に`myProject`フォルダを作成し、そこにプロジェクトをインストールします。

##インストール
###新規プロジェクトを作成
PhpStormの起動画面から「Create New Project」を選択します。
![ss_1_cap.png](https://qiita-image-store.s3.amazonaws.com/0/138421/07c73ffa-d813-01f6-0770-ecb2b52b3f07.png "ss_1_cap.png")

###Composer Project を選択
左側のメニューから「Composer Project」を選択します。
![ss_2_cap_1.png](https://qiita-image-store.s3.amazonaws.com/0/138421/70edb98a-6757-4068-87b5-44e86a48dc34.png "ss_2_cap_1.png")

###設定値を入力
設定値を入力していきます。
![ss_2_cap_2.png](https://qiita-image-store.s3.amazonaws.com/0/138421/d7f88e66-3486-bece-578b-dd6ec833df66.png "ss_2_cap_2.png")

* Location: ここでは「~/myProject」とします
* 'composer' executableを選択。右ボックスの値はデフォルト(composer)のままで
* プロジェクトの構成ファイルはmyProject直下に展開したいので「Command line parameter」に`--prefer-dis`と入力
* Filter packages: 「laravel/laravel」と入力。下部のリストに候補が絞り込まれるので「laravel/laravel」を選択してください 

全て入力し終えたら「Create」を押下しましょう。
プロジェクトの生成がはじまります。

![ss_3_cap.png](https://qiita-image-store.s3.amazonaws.com/0/138421/807f32ad-3767-c985-6b6e-45a8e5ecbe44.png "ss_3_cap.png")

##確認
###サーバを起動
早速laravelを動かしてみましょう。
laravelには簡易なサーバ機能を備えていますので、これを利用します。
ターミナルから次のコマンドを実行します。

```
php artisan serve
```

するとサーバが立ち上がります。

![ss_5_cap.png](https://qiita-image-store.s3.amazonaws.com/0/138421/fce8edfa-920a-2b37-8cf8-a79b8485f205.png "ss_5_cap.png")

ターミナル上に表示されたアクセスURLをコピーしておきましょう。

###ブラウザでURLにアクセス
ブラウザを開き、先程コピーしたURLをペーストしてアクセスします。
次に示すようなlaravelの初期ページが表示されます。

![ss_6_cap.png](https://qiita-image-store.s3.amazonaws.com/0/138421/d3897b8c-86da-b118-e515-14c9558702f4.png "ss_6_cap.png")

##最後に
この後のファイルパーミッションの設定やプラグインの導入やらを後日追記するかもしれません。
JavaVM 用圧縮ライブラリの比較

JavaVM での可逆圧縮アルゴリズムの選定のためにいくつかのライブラリを集めてベンチマークを行った (ソースや数値は [github](https://github.com/torao/benchmark.compression) で)。結果、圧縮アルゴリズムの個人的な認識は以下のようになった。

| アルゴリズム | タイプ | 適していると思われる用途 |
|:------------|:-------|:---------|
| [Zstandard](https://ja.wikipedia.org/wiki/Zstandard) | 高圧縮率/低処理速度型 | ファイル単位のデータ保存やサーバ間の転送 |
| [lz4](https://ja.wikipedia.org/wiki/LZ4) &gt; [Snappy](https://en.wikipedia.org/wiki/Snappy_(compression)) | 低圧縮率/高処理速度型 | ストリーミング処理など高スループット/低レイテンシーが必要な局面 |
| [bzip2](https://ja.wikipedia.org/wiki/Bzip2) $\approx$ [Brotli](https://ja.wikipedia.org/wiki/Brotli) | 圧縮率最優先 | 巨大なデータ配布やコールドデータの保存 |
| [gzip](https://ja.wikipedia.org/wiki/Gzip) $\approx$ [ZLib](https://ja.wikipedia.org/wiki/Zlib) ([ZIP](https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))) | 可搬性最優先 | データの受け渡しや長期保存 |

Java 標準の GZIP や Deflate (ZIP) に加えて以下のアルゴリズムを実装しているライブラリを使用した。それぞれの Maven リポジトリ ID はページ末リンクの build.sbt 参照。

* **Zstandard**: 圧縮率は gzip 以上 bzip2 未満だがそれらより有意に速い。既存の gzip はもちろん、数%のサイズ差が事業コストに跳ねるようなシビアな世界でなければ bzip2 も Zstd 化を検討する価値あり。レベルで調整可能。
* **lz4**: 圧縮率で Snappy と同等、速度面で Snappy より有利なため、処理速度優先なら lz4。
* **Brotli**: 高圧縮率勢の中でも頭一つ抜けることがある。圧縮と展開の速度差が大きく、展開速度は Zstd に劣るが gzip, bzip2 よりは速い。UTF-8 モードを使えばテキスト圧縮の効率は上がる (未確認)。
* **Snappy**: 高速度型だが速度面で lz4 に劣るため特に出番がなさそう。何らかの理由で lz4 が使えない時の振替手段と理解。

以下のベンチマークにおいて Block は各ライブラリが提供する `byte[]` to `byte[]` の API を使用したときの速度、Stream は Java で標準的な `InputStream`/`OutputStream` を使用した時の結果である。

## テキストデータ圧縮

最初に紹介するのは米国[独立宣言](http://memory.loc.gov/cgi-bin/query/r?ammem/bdsdcc:@field%28DOCID+@lit%28bdsdcc02101%29%29)をサンプルバイナリとした圧縮処理結果。US-ASCII であるためすべてのバイト値が 0x00-0x7F に収まっておりエントロピーも低め。圧縮率は Brotli が最も高く処理速度は lz4 が最も高かった。
![20180322_us-ascii.png](https://qiita-image-store.s3.amazonaws.com/0/2287/b421d463-8f35-290a-02f4-a7a4e38482d3.png)

次は夏目漱石「こころ」全文をサンプルとして用いた結果。日本語の UTF-8 表現は 1 文字 3 バイトとなりパターンが冗長となるため us-ascii 文書より圧縮率は高い。
![20180322_utf-8.png](https://qiita-image-store.s3.amazonaws.com/0/2287/deebd556-56c3-5ebb-5169-d1c777c50cd0.png)

テキストデータに関しては高圧縮率型と高速度型の特性がはっきり出ている。なお Brotli には UTF-8 最適化モードがあるようだがこのベンチマークではバイナリ型との比較のため GENERAL モードを使用している。

## 数値データ圧縮

下の図は配列要素を正規乱数 $\lfloor {\rm Norm(\mu=0,\sigma^2=100)} \rfloor$ で初期化した `int[]` をビッグエンディアンでバイト配列化しサンプルバイナリとしたもの。つまり全配列要素の 68% が $\pm 10$ の範囲にあり、また 95% が $\pm 20$ の範囲に含まれている。言い換えれば、ほとんどの値が最下位 1 バイトを除いた 3 バイトが `0x00` または `0xFF` となるバイト配列である。

このようなバイナリの圧縮率は高く、高圧縮率型で 70-80% 程度が削減されている。また速度面において高速型との差が縮むことから高速型の優位性は薄くなる。
![20180322_norn-int.png](https://qiita-image-store.s3.amazonaws.com/0/2287/e54dfa9e-4514-9b09-4ef0-aa5f22869d3e.png)

下の図は標準正規乱数 ${\rm Norm(\mu=0,\sigma^2=1)}$ で値を生成した `double[]` を IEEE 754 形式でバイト配列化し圧縮サンプルとしたもの。浮動小数点型データに対しては高圧縮率型でも 5% 未満とほぼ圧縮効果は期待できない結果となった。実際、サンプルバイナリのエントロピーも高く、バイト配列としては各バイト値を一様乱数で生成したケースに近いように見える。
![20180322_norn-double.png](https://qiita-image-store.s3.amazonaws.com/0/2287/f9943788-4458-4ec4-4900-ec5e13690fb8.png)

lz4 がマイナス値を取っているのは若干のサイズ増加があったことを示している。

## 参照

* [github](https://github.com/torao/benchmark.compression)
* [実行結果](https://github.com/torao/benchmark.compression/blob/master/benchmark/amd64_windows10_20180322.md)
Docker コンテナ上で動く X11 アプリケーションのウィンドウをディスプレイに表示させる

## やりたいこと
- Docker ホスト (Linux サーバ) の上で X11 アプリケーションのコンテナを動かす
- 手元のノート PC (MacBook) から Docker ホストに接続して、コンテナとして動いている X11 アプリケーションのウィンドウを手元のノート PC のディスプレイに表示する

![](https://qiita-image-store.s3.amazonaws.com/0/16369/07f43770-3602-a13c-da34-f5134f1f70c8.png)


「なんでそんなことやってんだ」と思うかもしれないが、やりたくなったもんはしょうがない。

## Docker ホストに X11 Forwarding しながら SSH 接続する
このあたりはググればいくらでも情報が出てくるのでサラッと。

- Docker ホスト側の `sshd_config` で `X11Forwarding yes` を設定する
- Docker ホストに SSH 接続する際に `-X` オプションを付けるなどして X11 Forwarding を有効にする

## X11 アプリケーションの Docker イメージを準備する
今回は簡単な例として `xeyes` が動くだけの Docker イメージを作る。

``` Dockerfile:Dockerfile
FROM alpine

RUN apk --no-cache add xeyes

CMD ["/usr/bin/xeyes"]
```

``` console
$ docker build -t xeyes .
```

`xeyes` という名前の Docker イメージを作成できた。

## X11 アプリケーションの Docker コンテナを起動する
コンテナを起動する際のポイントとしては以下の二点。

- host ネットワーク (`--net host`) で起動することでディスプレイ (`$DISPLAY`) にアクセスできるようにする
- X11 の認証情報 `$HOME/.Xauthority` をコンテナに共有する

``` console
$ docker run --rm -it \
    --net host \
    -e DISPLAY=$DISPLAY \
    -v $HOME/.Xauthority:/root/.Xauthority \
    xeyes
```

ちゃんと起動すれば、このようなウィンドウが手元の PC の画面に表示される。

![](https://qiita-image-store.s3.amazonaws.com/0/16369/482aed9c-3e26-f6e4-c61e-3a283c2a7df5.png)
[Flow Type] Reactコンポーネントchildren属性の型の書き方

#### Flow typeでReactコンポーネントのchildren属性の型を記載する方法をメモする。

### 普通の書き方

```react

import * as React from 'react';

type Props = {
  children?: React.Node,
};

function MyComponent(props: Props) {
  return <div>{props.children}</div>;
}
```

### ある種類の子コンポーネントのみを許可する

下記は`React.ChildrenArray<React.Element<typeof TabBarIOSItem>>`でTabBarIOSItem型のみを設定できる。それ以外のものが内包されたら、`flow check`エラーとなる。

```react
import * as React from 'react';

class TabBarIOSItem extends React.Component<{}> {
  // implementation...
}

type Props = {
  children: React.ChildrenArray<React.Element<typeof TabBarIOSItem>>,
};

class TabBarIOS extends React.Component<Props> {
  static Item = TabBarIOSItem;
  // implementation...
}

<TabBarIOS>
  <TabBarIOS.Item>{/* ... */}</TabBarIOS.Item>
  <TabBarIOS.Item>{/* ... */}</TabBarIOS.Item>
  <TabBarIOS.Item>{/* ... */}</TabBarIOS.Item>
</TabBarIOS>;
```


### 子コンポーネントを一つのみに限定する

```react
import * as React from 'react';

type Props = {
  children: React.Element<any>,
};

function MyComponent(props: Props) {
  // implementation...
}

// Not allowed! You must have children.
<MyComponent />;

// Not ok! We have multiple element children.
<MyComponent>
  <div />
  <div />
  <div />
</MyComponent>;

// This is ok. We have a single element child.
<MyComponent>
  <div />
</MyComponent>;
```

### React.Nodeから一部の型を除く

- React.Nodeの定義

>This represents any node that can be rendered in a React application. React.Node can be undefined, null, a boolean, a number, a string, a React element, or an array of any of those types recursively.


- 下記は文字列や数字を許可しないようにする

```react
import * as React from 'react';

type ReactNodeWithoutStrings = React.ChildrenArray<
  | void
  | null
  | boolean
  | React.Element<any>
>;

type Props = {
  children?: ReactNodeWithoutStrings,
  // other props...
};

class View extends React.Component<Props> {
  // implementation...
}
```


### React.Childrenを使う

- childrenが必ず配列として存在するわけではない為、直接に`children.map(...`などを使うと、`Flow check`エラーとなる。

>Note: If you want methods like map() and forEach() or to handle a React.ChildrenArray<T> as a normal JavaScript array then React provides the React.Children API to do just this. It has functions like React.Children.toArray(props.children) that you can use to treat your React.ChildrenArray<T> as a flat array.

- children型定義を`children: Array<any>`見たいに配列として定義できない理由

childrenの型をArrayとして定義すると、親コンポーネントにchildren属性を設定しないと怒られる。

```react

<Parent children=...>
```

Reactのchildrenの意味が内包される子タグである。その為、配列型の場合、下記がLintエラーとなる

```react
<Parent>
  <Sub />
</Parent>

```

- childrenの代わりにReact.Childrenのmapやforeachを利用する

```react

const names = React.Children.map(
  this.props.children,
  e => e.props.hoge
);
```

### 参考記事
- [flow type:children](https://flow.org/en/docs/react/children/)
RailsのDeviseで特定の条件のアカウントをログインさせなくする

# はじめに
DeviseをしようしているRailsのアプリケーションで、データベースにユーザーのレコードはあるがそのユーザーにはログインさせたくない時にする実装をする機会があった。はじめは `authenticate_user!` メソッドを上書きしようとしたが、少し調べた結果 `active_for_authenticatation?` というユーザーモデルのインスタンスメソッドを上書きするのが良いことに気づいた。以下に実際に特定の条件のユーザーのログインを不可にする実装とその際のエラーメッセージの設定の仕方を書いた。

参照:

[How To: Customize user account status validation when logging in](https://github.com/plataformatec/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in)

[Module: Devise::Models::Authenticatable](http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable)

# 実装

例:
- Userモデルにデバイスをインストールしている
- 運営のメールに返信していないアカウントのログインを不可にしたい
- 運営のメールに返信したかどうかは `users` テーブルの `mail_reply` カラムが0か1で表されている

## 特定の条件のユーザーのログインを不可にする実装

[DeviseのGithub Wikiページに](https://github.com/plataformatec/devise/wiki/How-To:-Customize-user-account-status-validation-when-logging-in) に書いてあるとおりログイン時にバリデーションを足したい場合はUserモデルの `active_for_authentication?`を上書きします。このメソッドはログイン時にDeviseが呼び出しています。今回の例ではコードは以下のとおりになります。

```ruby:user.rb
class User < ApplicationRecord
  def active_for_authentication?
    super && mail_reply?
  end
end
```

## エラーメッセージの変更

`active_for_authentication?` メソッドが `false` を返すと、Deviseは `Account Not Active Error` のメッセージを表示します。ですが、今回は「運営のメールに返信していないこと」を伝えたいので、独自のメッセージを表示したいです。

[こちら](http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable)にあるように、 `active_for_authentication?` が `false` を返すと Userモデルのインスタンスメソッドの `inactive_message` を呼び出し、デフォルトでは `Account Not Active` のエラーメッセージを表示します。なので、`inactive_message` を上書きましよう。

```ruby:user.rb
class User < ApplicationRecord
  def active_for_authentication?
    super && mail_reply?
  end

  def inactive_message
    mail_reply? super : :mail_not_replied
  end
end
```

デフォルトでは `locales/device.en.yml` の `en.devise.failure.inactive` のメッセージを表示するところを、運営のメールを返していない場合は `en.devise.failure.mail_not_replied` のメッセージを表示するようになります。日本語化をされている場合は `locales/device.ja.yml`の `ja.devise.failure.inactive` と `ja.devise.failure.mail_not_replied` になります。

ですが、現在は `mail_not_replied` のメッセージがないので追加してあげる必要があります。

### 英語の場合

```yaml:locales/device.en.yml
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n

en:
  devise:
    confirmations:
      # 略
    failure:
      # 略
　　　 # ここに追加
      mail_not_replied: "Please reply mail from our company."
    mailer:
      # 略
```

### 日本語の場合

```yaml:locales/device.ja.yml
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n

en:
  devise:
    confirmations:
      # 略
    failure:
      # 略
　　　 # ここに追加
      mail_not_replied: "運営からのメールを返信していません"
    mailer:
      # 略
```

上記のようにすると運営からのメールを返していないアカウントのログインを不可にできると思います。質問、コメント、指摘などあればコメントしていただけると幸いです。
環境変数で Rewrite の挙動を制御したい時に IF ディレクティブを使うのをやめよう



動かんかったりする

````
<If "env('APP_FORCE_HTTPS') == 'true'">
    RewriteEngine on
    RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
````

動く

````
RewriteCond %{ENV:APP_FORCE_HTTPS} ^true$
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
````
Unity 2Dサービス開発時のCanvasの初期設定


Unityで2D開発する際に、スケーリング設定は始めに行っておいたほうがいいです。
オススメの設定としては以下です。

# Canvas Scalerの設定
- UI Scale Mode : Scale With Screen Sizeにする
    - 後述するReference Resolutionの設定が基準となります
    - UIがサイズに合わせて追従してくれるようになります
- Reference Resolution X: 320 Y:480 にする
    - 3:4の設定です。これで大体のサイズが吸収できます。

<img width="337" alt="スクリーンショット 2018-03-23 15.55.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/1a0e3bb5-6e49-fcbb-8741-2f1d161fa6ee.png">


[（参考）Canvas Scaler | https://docs.unity3d.com/ja/540/Manual/script-CanvasScaler.html](https://docs.unity3d.com/ja/540/Manual/script-CanvasScaler.html)
[Rails] redcarpetを使ったマークダウンのHTML書き出しタグをカスタマイズする


# 先に結論

`Redcarpet::Render::HTML`を継承したカスタム用Rendererクラスを作って必要なタグを上書きします。

### highlightのときのタグを変更したい
デフォルトでは`==`で囲うと`<mark>`タグでrenderされます。
例えばこれを赤文字にしたい場合で、CSSの構成上、`mark`に対してスタイルを宣言するのではなく、赤文字にするclassをあてたいということがあると思います。
このような場合、テキストを囲うだけのタグなら

```
# application_helper.rbなど
def markdown(text)
  markdown = Redcarpet::Markdown.new(MyRenderer)
end

# 適当な場所（lib以下とか）
class MyRenderer < Redcarpet::Render::HTML
  def highlight(text)
    %(<mark class="text-danger">#{text}</mark>)
  end
end

# index.html.slimなど
== markdown("==ほげほげ==")
#-> <mark class='text-danger'>ほげほげ</mark>

```

こんな感じでできます。
同じように`emphasis`とか`underline`とかもカスタマイズできると思います。
インライン要素のタグを生成するメソッド名は[こちらを参照](https://github.com/vmg/redcarpet#span-level-calls)してください。


### list item

ul>liとかol>liにclassを付けたい！ときにREADMEにヒントがなくてちょっと困ったんですが、わりとシンプルでした。

```
def list_item(text, list_type)
  case list_type
  when :ordered
    %(<li class="list-ordered">#{text}</li>)
  when :unordered
    %(<li class="list-circle">#{text}</li>)
  end
end
```

### list

ul / ol 自体をカスタマイズしたい！なら

```
def list(contents, list_type)
  case list_type
  when :ordered
    %(<ol class="ordered-list">#{contents}</ol>)
  when :unordered
    %(<ul class="circle-list">#{contents}</ul>)
  end
end
```

簡単ですね！

# 背景

ECサイトのコンテンツを運用していて、例えば商品情報の追加・更新をエンジニアではなく運用チームがやります。
そのとき、商品の詳細内容などを運用チームに入れてもらうのですが、商品によって「赤文字にしたい」「ここは太字にしたい」「文字を大きくしたい」など要件があるので、プレーンテキストというわけにはいかず、かといって、HTMLを書いてもらうことに抵抗がありました。

HTML🙅な理由としては

- HTMLに慣れていない非エンジニアだと簡単にタグのとじ漏れとかが発生する
- できることが多すぎて煩雑な（某®的な）画面になるリスク
- 赤文字にする等でclassを使わないといけない場合、スタイルシートの刷新とかCSSフレームワークを変更するときにテーブルの中で文字列検索・置換などしないといけなくなる

みたいなところです。

そこで、マークダウンで運用してもらって、HTMLに変換するときにアプリケーション側で必要なclass名等をカスタマイズしてあげるという方法がよいのではとなりました。
（社内でドキュメントの共有にDocbaseを使っていて、運用チームもマークダウンには親しみがある）


マークダウンのパーサーを自前で作るのは大変だなーと直感的に思ったので、Railsアプリケーションだしいい感じのGemがあるかなーと調べたら、[redcarpet](https://github.com/vmg/redcarpet)というGemでできそうだなとなったので、カスタマイズを試してみました。


# よさそう

わりと簡単にカスタマイズできたし、これならば、例えば場所によって見せ方を変えたいときにもその場所毎にrendererを用意すれば対応できて良さそうと思いました。
コンテンツは同じだけど、Aページではリンクを有効にしてBページではリンクさせないで太字にする、とか。

※環境はRuby2.3.0/Rails4.2.6/redcarpet3.4.0です。
AutoScalingが急に起動しなくなった

# AutoScalingでEC2を起動しようとしたら起動しなくなった

ちょっと前まで普通に起動していたのに、急に起動しなくなりました。

```
Status Reason: Instance became unhealthy while waiting for instance to be in InService state. 
Termination Reason: Client.InternalError: Client error on launch
```

・・・なんでやねん

# 他の設定と比べてみる

AutoScalingの設定を見ていると新しい設定が追加されてました。
``サービスにリンクされたロール``

(´-`).oO(権限が足りないのかなぁ・・・よくあるパターンだと暗号化（KMS）とか？)

## 中身を見てみた

問題児は``AutoScalingServiceRolePolicy``の模様
なお、こやつはManagedロールなので、一切いじれないようです。

で、肝心の中身は、、、

```json:AutoScalingServiceRolePolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceManagement",
            "Effect": "Allow",
            "Action": [
                "ec2:AttachClassicLinkVpc",
                "ec2:CancelSpotInstanceRequests",
                "ec2:CreateTags",
                "ec2:DeleteTags",
                "ec2:Describe*",
                "ec2:DetachClassicLinkVpc",
                "ec2:ModifyInstanceAttribute",
                "ec2:RequestSpotInstances",
                "ec2:RunInstances",
                "ec2:TerminateInstances"
            ],
            "Resource": "*"
        },
        {
            "Sid": "EC2InstanceProfileManagement",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": "ec2.amazonaws.com*"
                }
            }
        },
        {
            "Sid": "EC2SpotManagement",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:AWSServiceName": "spot.amazonaws.com"
                }
            }
        },
        {
            "Sid": "ELBManagement",
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:Register*",
                "elasticloadbalancing:Deregister*",
                "elasticloadbalancing:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "CWManagement",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:DeleteAlarms",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:PutMetricAlarm"
            ],
            "Resource": "*"
        },
        {
            "Sid": "SNSManagement",
            "Effect": "Allow",
            "Action": [
                "sns:Publish"
            ],
            "Resource": "*"
        }
    ]
```

なるほど、、、足りとらん。

# 鍵側にアクセス設定をする

EBSを暗号化してる鍵にこのポリシーからアクセス出来るよう設定しました。

結果、無事解決。めでたしめでたし
Pythonで子クラスに親クラスの一部の実装を委譲する

# やりたかったこと
親クラスのメソッドを子クラスがオーバーライドする際，共通処理をしたい．
共通処理はまとめて親クラスに書きたい．(個別の実装部分だけ子クラスに書きたい)

# デコレーター
あんまり綺麗にできなかった

# 特に何もせず頑張る
```python
class Human(object):
    def eat(self, **kwargs):
        try:
            # 共通処理: 引数チェック
            food = kwargs.pop('food')
            assert isinstance(food, Food)
            # 個別処理: Childで実装してくれ
            self.__class__._eat(self)
            # 共通処理: 食後の挨拶
            print('ごちそうさま')
        except KeyError:
            print('何も食べるものがないんだが')
        except AssertionError:
            print('これ食べるものじゃないでしょ')

    def _eat(self):
        pass


class Child1(Human):
    def _eat(self):
        print('child 1 is eating')


class Child2(Human):
    def _eat(self):
        print('child 2 is eating')


class Food:
    pass


class Fish(Food):
    pass


class Garbage(object):
    pass


def create_a_child(a) -> Human:
    if a == 1:
        return Child1()
    else:
        return Child2()


if __name__ == '__main__':
    child1 = create_a_child(1)
    child1.eat(food=Fish())
    child2 = create_a_child(2)
    child2.eat()
    child2.eat(food=Garbage())
    child2.eat(food=Fish())
```
UMAPについて私的まとめ


最新の次元圧縮手法UMAPについて、[論文](https://arxiv.org/abs/1802.03426)と[UMAPモジュールのgithub](https://github.com/lmcinnes/umap)をそれぞれ流し読みしたので特徴をまとめてみる。

必要な代数幾何学の知識が圧倒的に不足しているため、間違っている可能性が大いにある.

※まとまりきってないけど一度仮公開(2018/3/23)

## UMAPの特徴

- t-SNEより高速

これに関しては、論文で様々なデータセットに対して検証しているが、8コア並列のt-SNEよりも早くなっているようだ。
自分でgoogle colaboratoryを用いて試したところ、t-SNEよりも1/4以下の処理速度で終わった。

- 可視化だけでなく、機械学習の次元削減にも利用できる

t-SNEは圧縮後の次元数を大きくすると、計算時間が急増する。
UMAPでは、いくつかの高速化手法が用いられており、圧縮後の次元数が大きくても現実的な時間で終了する(?)ため、機械学習データへの次元圧縮にも使用できるということだと思う。

- t-SNEよりも、マクロ/ミクロな関係性をうまくとらえている

論文中では、t-SNEとの可視化結果の比較が掲載されており、「まぁ、確かにそんな感じがする」といったところ。

- コサイン距離および相関距離などの距離指標が使用できる

これは結構大きい違いで、分散表現の可視化にコサイン距離が使えるのはありがたい。

- 処理の過程において確かな理論的基盤を持っている

この辺りの説明は、新たに論文で投稿されるらしい。


## UMAPモジュールのパラメータ

目的に応じてn_neidhborsやmetricは決まっているはずなので、
後は、データに応じて、alphaやmin_dist、spread辺りを調整するのだと思う。

- n_neighbors　(default:15)
大きくするとマクロな、小さくするとミクロな構造を振る舞いを反映させる。
t-SNEでいうところのperplexityのような値だと思われる。
2~100が推奨されている。

- n_components
圧縮後の次元数。

- metric
使用する距離指標が選択できる。

- alpha
圧縮データの学習率。

- init
初期化法。
"spectral"は、Spectral Embeddingを使って初期値を決定しているようだ。
"random"よりは、おそらく良いのだろう（適当）。

- random_state
いつもの乱数シード。

- negative_sample_rate
計算時にネガティブサンプリングを行う際のサンプリングレート

- gamma
ネガティブサンプルにかかる重み。
正規化項の重みのようなもので、大きくするとまとまりは悪くなる傾向にある。
ノイジーなデータに対しては、この値を調整することで、可視化結果をある程度操作できそう。


以下、よくわからないもの。

- min_dist
同一クラスタとして判定する距離。
おそらく、距離指標によっても適切に設定する必要がある。

- spread
同一クラスタとして判定する指標。min_distと関連。
大きくするとまとまりが悪くなる。
- set_op_mix_ratio
- local_connectivity
- a
- b


## 関連
- [最新の次元圧縮法"UMAP"について](https://qiita.com/cheerfularge/items/27a55ebde4a671880666)
CData Drivers ハンズオン（サマリ 編）

# はじめに

本資料は、[CData Software Japan](http://www.cdata.com/jp/)のハンズオン向けの資料です。本ドキュメントをもとに実機にCData製品をインストールして手順に沿って実際に各種ツールやプログラムから使用する事でCData製品の特徴や具体的な利用方法を理解して頂くことを目的としています。

# 前提環境

ハンズオンには以下の環境が必要となります。

- Windowsマシン （Windows10が望ましい）
- インターネットへ接続可能　（プロキシサーバ経由でのアクセスが必要な場合はご連絡ください）
- Windowsの管理者権限が付与されており、プログラムのインストールが可能であること

# 事前準備

ハンズオンを行うマシンにインストールが必要なP.P.は以下の通りです。事前にインストールしてください。

- Microsoft　Excel （2007以上）
- [Microsoft Power BI Desktop](https://powerbi.microsoft.com/ja-jp/desktop/)
 - (注)デフォルトだと英語版がインストールされますので「高度なダウンロード オプション 」から「Japanese」を選択してダウンロードください。
- [VisualStudio Community 2017](https://www.visualstudio.com/ja/downloads/)
- Salesforce、および、kintoneアカウント取得用のメールアドレス 

※ メールアドレスをお持ちでない場合は、下記の「アカウント取得」手順内の「MicrosoftアカウントのOutlookメールアドレスを取得する方法」にてメールアドレスを取得してください。ただし、その場合、SMSメッセージが受信可能な携帯電話の番号の登録が必要となります。

# ハンズオンの内容

## アカウント取得 編

- [MicrosoftアカウントのOutlookメールアドレスを取得する方法](https://qiita.com/TomoyoH/items/fca3f49729d82d9884eb)

※ メールアドレスをお持ちの場合は、既存のメールアドレスを利用していただいても結構です。上記手順でメールアドレスを取得するにはSMSメッセージが受信可能な携帯電話の番号の登録が必要となります。

- [Salesforce Sales Cloud 開発者アカウント、および、セキュリティトークン取得方法](https://qiita.com/kuwazzy/items/68bc7c4a5b36721cfe83)
- [kintone 評価版アカウント取得、および、サンプルアプリケーションの作成方法](https://qiita.com/kuwazzy/items/416b9c884892016bcc9f)

## Excelからの利用　編

- [ExcelからSalesforceのデータを取得&登録](https://qiita.com/kuwazzy/items/7cec7baa4df4482c11e7)
- [Excelからkintoneのデータを取得&登録](https://qiita.com/kuwazzy/items/ce82227db6876832eddf)

## BIツールからのビジュアライズ 編

- [Microsoft PowerBIからkintoneのデータを可視化](https://qiita.com/kuwazzy/items/027dd204a9d28b245fec)

## サービス間連携アプリケーション 編

- [Salesforce と kintone の顧客データを同期するC#アプリケーション](https://qiita.com/TomoyoH/items/d5ffb61390207d69e67a)


- [サンプルプログラム](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/HandsOn/20180326/Salesfoerce2KintoneSample.zip)

※ 上記サンプルプログラムは、既にSalesforceおよびkintoneへの接続情報を含んでおります。ただし、同じアカウントで複数の参加者でご利用となりますので、複数の参加者がご利用の場合は他の方が登録したデータが表示されますのでご承知ください。

# (ご参考)CData製品ビルド格納パス

## Salesforce

- [ExcelAddIn for Salesforce](http://www.cdata.com/jp/drivers/salesforce/excel/)
- [ODBC Driver for Salesforce](http://www.cdata.com/jp/drivers/salesforce/odbc/)

## kintone

- [ExcelAddIn for kintone](http://www.cdata.com/jp/drivers/kintone/excel/)
- [ODBC Driver for kintone](http://www.cdata.com/jp/drivers/kintone/odbc/)
GoogleAppsScriptでGmailの下書きを、より簡単に作成する方法

## はじめに
"Gmail GoogleAppsScript 下書き"で検索すると、Gmail APIを利用する方法がヒットしますが、
2017年のアップデートでClass GmailAppにcreateDraftが追加され、より簡単に作成できるようになりました。

## 公式情報
https://developers.google.com/apps-script/reference/gmail/gmail-app
### createDraft(recipient, subject, body, options) 
> Creates a draft email message with optional arguments.


## 作例
日報や週報など、定型報告メールを作成しなければいけない場面は、まだ多いようです。

宛先、件名、本文の定型文の設定は自動化して、~~せめて手を抜き~~　本来の報告部分に注力しましょう。

おまけで、Utilities.formatDateを利用して、Excelライクな年月日フォーマットを当日の日付に変換しています。
（これにより、例えば件名に"YYYY年MM月dd日"と設定しておけば、当日の日付に変換されるので毎回、日付部分を書き換える必要がなくなります。）

## コーディング
~~~ js
function myFunction () {
  var mailTo = "to@example.com"
  var mailCc = "cc@example.com"
  var mailTitle = "日報　yyyy年MM月dd日(ddd曜) ほげほげ"
  var mailBody = '' //　テキストメールの場合はここに本文テキストを設定します。 
  var mailHtmlBody = 'yyyy年MM月dd日(ddd曜)分の、ほげほげの日報をお送りします。<br><br>[コメント]<br><br>本日もお疲れ様でした。'  // HTMLメールを作成する場合は、option引数に、htmlBodyとして本文を設定します。

  var date = new Date()
  
  mailTitle = myDateFormat(date, mailTitle)
  mailHtmlBody = myDateFormat(date, mailHtmlBody)
  var mailArgs = {
      cc: mailCc,
      htmlBody: mailHtmlBody
  }
  GmailApp.createDraft(mailTo, mailTitle, mailBody, mailArgs)
}

//テキストデータ「text」内の'yyyy', 'MM', 'dd', 'hh', 'mm', 'ss', 'aaa'の日付形式文字を、日時データdateに該当する年月日時分秒曜日に変換する
function myDateFormat (date, text) {
  var result = text
  var timeZone = 'Asia/Tokyo'
  // ’aaa’を曜日に変換
  var yobi = ['日', '月', '火', '水', '木', '金', '土']
  var rep = yobi[date.getDay()]
  result = result.replace(/aaa/g, rep)

  // 'yyyy', 'MM', 'dd', 'hh', 'mm', 'ss'を年月日時分秒に変換
  var f = ['yyyy', 'MM', 'dd', 'hh', 'mm', 'ss']
  var i = 0
  for (i in f) {
    var reg = new RegExp(f[i] + '(.*?)', 'g')
    rep = Utilities.formatDate(date, timeZone, f[i])
    result = result.replace(reg, rep)
  }
  return result
}
~~~

## テスト実行
myFuctionを選択した状態で「実行」ボタンを押します。
![gas実行.png](https://qiita-image-store.s3.amazonaws.com/0/93705/e2d312c2-f22d-80c1-6dd0-9a6c11767305.png)

初回実行時のみ、承認が必要です。「許可を確認」ボタンを押します。
![gas承認.png](https://qiita-image-store.s3.amazonaws.com/0/93705/4a7ad920-b7a4-f9d0-1e34-e7e93be6c6df.png)

実行するアカウントを選択します。
![gasアカウント選択.png](https://qiita-image-store.s3.amazonaws.com/0/93705/3ed18b73-b436-f49a-5559-1de9ddb9d2ec.png)


お使いのGmailの下書きフォルダに下書きメールが追加されます。
![gas下書きフォルダ.png](https://qiita-image-store.s3.amazonaws.com/0/93705/ed1ff091-f393-257a-7a47-364c08d12462.png)

![gas下書きメール.png](https://qiita-image-store.s3.amazonaws.com/0/93705/a9413c9c-8b4c-f92d-e1db-e7a15844e5a3.png)

## 自動実行のため、トリガー登録
繰り返し自動で下書きメールが作成されるように、トリガーを登録します。
![gasトリガー.png](https://qiita-image-store.s3.amazonaws.com/0/93705/85222850-65b4-a238-ad14-db75ad938c8c.png)

![gasトリガー追加.png](https://qiita-image-store.s3.amazonaws.com/0/93705/8b170efd-286d-c3ad-38e5-0d6228f2eb01.png)

下書きメールを追加するタイミングを設定します。
ここでは毎日、午前0時台に追加されるように設定しています。
![gasトリガー設定.png](https://qiita-image-store.s3.amazonaws.com/0/93705/6f259ae2-1c48-74bc-6719-c05658fc2de2.png)

以上で、毎日指定の時刻に下書きメールが自動作成されます。

## その他
Googleスプレッドシートと組合せて、セルから宛先・本文などを取得するようにすると、
非開発者の同僚にも利用してもらいやすくできます。

Hope you enjoy.
白グラデーションでマスク

# 白グラーデーションでマスクする

参照：http://brightonline.jp/web/css/s42/

商品一覧に付随して表示する商品説明などで、文字量がバラバラだが、カラムの高さを一定にしたい。
カラムの高さを固定化すると、文字がスパッと切れてしまい、見た目が悪い。

そこで、その要素に白グラデーションをかぶせて、文字量の影響をなくす？

# 結果

<p data-height="265" data-theme-id="0" data-slug-hash="RMgMwg" data-default-tab="css,result" data-user="annnews" data-embed-version="2" data-pen-title="白グラデーションでマスク" class="codepen">See the Pen <a href="https://codepen.io/annnews/pen/RMgMwg/">白グラデーションでマスク</a> by annnews (<a href="https://codepen.io/annnews">@annnews</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# ソース

```html:html
<div>
<p class="white-grade-mask">この文章はダミーです。文字の大きさ、量、
字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、
量、字間、行間等を確認するために入れています。この文章はダミーです。文字の大きさ、</p>
</div>
```

```less:less
body {
  background-color: white;
}

div{
  border:1px solid gray;
  width:400px;
  padding:10px;
}
p{
  padding:0px;
  margin:0px;
}

.white-grade-mask {
	position: relative;
	&:after {
		position: absolute;
		bottom: 0;
		left: 0;
		z-index: 2;
		content: '';
		width: 100%;
		height: 40%;
		background: linear-gradient(rgba(255, 255, 255, 0) 0, rgba(255, 255, 255, .7) 20%, rgba(255, 255, 255, 1) 80%);
	}
}
```
- afterのheightを変更すれば、グラデーションの高さを変えられる
- 背景が白じゃない場合は、適当にグラデーション設定を変更すればOK
Db2 クライアントのSSL接続でエラーになったときの対処法


Db2クライアントからのSSL接続時にエラーとなり接続出来なかったので、一つの対応策をシェア。

**問題
Db2 V11.1 のイメージに含まれるGSkitを利用して、Db2 クライアントからDb2 データベースサーバーに対してSSL接続を試みたところ、**

`SQL1022C There is not enough memory available to process the command. SQLSTATE=57011`

**というエラーとなり接続が出来ません。**

**原因**
これは鍵の運用で利用しているGSKitのバージョンが古いために発生するエラーでした。

**対応策**
GSKitの最新版をダウンロードし、更新する事で接続出来るようになりました。

**苦労したところ**
・Db2のイメージに同梱されているGSKitがそもそも古く、そのままでは利用できなかった
・GSKit自身のダウンロードサイト等が不明で探すのに苦労した

**ではさっそく、Fix Central へ移動します。**
https://ibm.com/support/fixcentral

製品の選択のところから
製品グループ：Information Management
その下：Db2 for Linux Unix and Windows

ここから下はご環境に合わせて選択
バージョン：11.1
プラットフォーム：Windows 64bit

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/0374e635-bc66-02af-3b74-cbd8aabdfa13.png)

フィックスの特定の「個々のフィックスID」の項目で```*GSKIT*``` と入力して次へ

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/30e504e0-3989-a412-6385-3a288edb4007.png)

環境に合わせて最新のGSKITをダウンロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/112854/9c69b8ae-cacc-07bf-8699-571482a9e689.png)

なお、GSKITの導入については以下のURLが参考になります。
http://ibm.com/support/docview.wss?uid=swg21631462

導入後エラーもなくなり、無事に接続する事ができました
TensorFlowでOpenPose（macでできるモーションキャプチャ）

OpenPoseのチュートリアルやってみたまとめです。
https://github.com/ildoonet/tf-pose-estimation
<img width="227" alt="スクリーンショット 2018-03-27 10.08.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/85347e11-200e-63b4-564e-dd6b391cd3ff.png">
人物の骨格などを、モーションキャプチャなしで簡単に表示できるツールです。内蔵カメラがあれば、リアルタイム動画描写もできます。

<details><summary>OpenPose</summary>
※本家本元は、https://github.com/CMU-Perceptual-Computing-Lab/openpose ですが、
　今回はそれをTensorで動くようカスタマイズされたものを使用します。
※Chainerで試したい方は [こちら](https://github.com/DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation/blob/master/README_JP.md#caffemodel%E3%82%92chainer%E7%94%A8%E3%81%AB%E5%A4%89%E6%8F%9B) です。
　尚、Chainerは、手の描写に特化したものも入っており幅が広いですが、Tensorよりも動画のモーキャプが遅くCPUではカクカクでした。
</details>

動作環境は、macOS Sierraです。


# １.仮想環境を作る
homebrewでpython3をインストールしたあと、
virtualenvでopenposeの仮想環境作り、その中に入って作業します。
不要な方はスキップしてください。


### - 仮想環境作り
```:homebrewのインストール
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

```:homebrewでpython3のインストール
brew install python3
```

```:virtualenvのインストール
pip install --upgrade virtualenv
```

```:virtualenvで仮想環境を作る　hogeは任意の名前でよい
virtualenv --system-site-packages -p python3 hoge
```

### - 仮想環境に入る
`source hoge/bin/activate`
で、ターミナル左に(hoge)が出てればOK


# ２.必要なものをインストールする

```:openposeのパックをダウンロード
git clone https://github.com/ildoonet/tf-pose-estimation
```
`cd tf-openpose`で、ダウンロードされたファイルに移動して

```:必要なモジュールのインストール
pip3 install -r requirements.txt
```

```:tensorflowのダウンロード
pip3 install tensorflow
```
```:matplotlibのインストール
pip3 install matplotlib
```
`cd models/graph/cmu`　でさらにcmuという階層に移動して

```:重みなどなど？インストール
bash download.sh
```



# ３.実行する

1行ずつ実行

```:tf-openpose/srcの階層に移動
cd ../../..
cd tf-openpose/src
```

### - 静止画の検証

```
python3 run.py --model=mobilenet_thin --resolution=432x368 --image=(検証したい画像のPATH)
```

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/192887/20215f2d-6fb5-f1b3-3e23-5b1ddae82681.png)

いい感じです。

### - 内臓カメラでの検証

```
python3 run_webcam.py --model=mobilenet_thin --resolution=432x368 --camera=0
```
カメラが自動で起動され、リアルタイムで動き始めます。
ウィンドウを閉じても終了しないので、
ターミナルをcontrol+Cで抜けてください。

# 4. さいごに
■エラー処理
matplotlibがvirtualenvで動かないエラーが結構でます。
https://qiita.com/Kodaira_/items/1a3b801c7a5a41c9ce49
ご参考までに。

■他の環境で実装したい方はこちらみるといいかも、C++とか。
https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
配列とハッシュの使い分け

**ハッシュと配列の使い分け**

ハッシュは細かい個別情報を管理するために使用

配列は個別情報を１つのグループ（塊）として管理するデータベースのようなもの

```
human = {}  個別情報をハッシュに格納

puts"名前を入力して下さい"
  human[:name]=gets.chomp
puts"年齢を入力して下さい"
  human[:age]=gets.to_i
puts"身長を入力して下さい"      
  human[:tall]=gets.to_f
puts"体重を入力して下さい"
  human[:weight]=gets.to_f

group << human ***個別情報を１つの塊として渡す***

group = []  ***配列の中にインデックス番号0番の塊が入る***


```

もしも配列から個別情報をとりだしたい場合

```
human = group[インデックス番号]　　***ハッシュに配列の中から使いたいデータを渡す***
```

この手順を踏めば
```
puts human[:name]
puts human[:age]　配列の中の指定したハッシュにしまった個別情報を引き出せる。
```
Fatal error: Cannot redeclareのよくある原因

#定番の原因
- 同じ関数名を定義している
- 2回includeしてる(2回読み込み)

#見つけにくい2回include
##①　index.php　←　A.php, B.php　
##②　A.php　　　←　　 B.php


①index.phpがA.phpとB.phpをinclude
②A.phpがB.phpをinclude

#コメント
極めてくだらないが、見つからなかったりする。
include文を一つずつコメントアウトして、どのファイルとどのファイルが同じ物を読み込んでいるかを検証するとすぐ気づける