OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCVで人数カウント 後編

## コードの解説
簡単にですが、OpenCVによる人数カウントのコードの解説を書きます。
コード自体は[ここ](http://qiita.com/c-nova/items/44c70a8eb918d3dc1b09)から前編を御覧ください。

### 動画の設定
動画ソースは以下の箇所を変更します。ソースはファイルでも、httpでもrtspでも動作しました。あまりいないとは思いますが、もしEagle Eye NetworksのLiveをソースとして使用する場合には直接指定できなかったので、一度VLCで受取り、それを再度RTSPでストリーミングすることでうまくいきました。ご参考までに。

```
#Open video file
cap = cv2.VideoCapture('C:\\Work_Documents\\sandbox\\OpenCV\\with_EEN\\viaVLC\\camera0490_02.mp4')
#cap = cv2.VideoCapture('http://127.0.0.1:8080')
```

### 分解精度
カウントを行なうFPSを記載します。15とある場合には、15FPSに一度居場所をチェックすることになります。短すぎるとカウントが行われないことがあり、長すぎると他の人の位置と入れ違ったりすることがあります。
このフレームの長さが「直前の座標と現在の座標」の項目で使用される交差の判定を行なう線分の一つとなります。そのため短すぎると交差したかのチェックが行えず、長すぎると現在の対象が消えた時点で最も近い全く別の点との線分を作成してしまうので、これもまた注意が必要です。

```
fps = 15 #int(cap.get(5)+4)
print 'Current FPS is ' + str(fps)
```

### 移動体検出用のアルゴリズム
今回は移動体検出用のアルゴリズムはBackground SubtractorのKNN版を使用しました。もちろんMOG2のほうがスコアがいいことがありますので、照明環境や背景、人物のコントラスト、影の発生具合に応じて変えて頂いたほうがいいと思います。個人的にはライブで長時間カウントするのであれば、GMGにしてみたいような気もします。

```
fgbg = cv2.createBackgroundSubtractorKNN(detectShadows = True) #Create the background substractor
```

### 直前の座標と現在の座標
ここが一番悩んだポイントで、かつ誰かいいアイデアが無いかなーと感じているポイントです。
とある線分を過去と現在の2点間で交差したかどうか、というのを今回のカウント方法に採用したのはいいのですが、直前の点をどうやって自分の点と判断するのか、の解が浮かびませんでした。
今は1判断フレーム前の全行列から、KNNでもっとも今の点から「近しいか」を判別して採用する方法にしています。ということは、誤ることも多いのかも・・・というのが今の一番の懸念です。

```
# find a nearest neighbour point
def serchNN(p0, ps):
    L = np.array([])
    for i in xrange(ps.shape[0]):
        L = np.append(L,np.linalg.norm(ps[i]-p0))
    return ps[np.argmin(L)]
```

### 凸包と矩形
現在の抽出オブジェクトから凸包を作成し、そこからオブジェクトを囲む輪郭を作成します。その後に輪郭の中心点を作成します。

```
# apply convexHull to the contour
def convHull(cnt):
    epsilon = 0.1*cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, epsilon, True)
    hull = cv2.convexHull(cnt, returnPoints = True)
    return hull

# detect a centroid from a coutour
def centroidPL(cnt):
    M = cv2.moments(cnt)
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    return cx,cy
```

### ループ処理
上述の関数などを、`for c in contours:`のループ内で処理しています。処理している順番は、

1. 現フレームが処理するフレームかを判断し
2. 各輪郭の領域サイズを計算し
3. 凸包を輪郭から作り
4. 輪郭から矩形を作り
5. 矩形から中心点を計算し
6. 前フレームの行列データがあったら
7. 前フレーム行列から最近傍の点を探し
8. 前フレームと現フレーム間で線を引き
9. 線分同士が交差しているかチェックし
10. 物体のフローティングテキストを更新し
11. 中心点を描画し
12. 矩形か輪郭を描画し
13. カウント数の表示文字を更新し
14. 線分を描画し
15. 上記をFrameウィンドウ、背景差分、輪郭の画像をそれぞれのウィンドウに表示し
16. 現在の行列を前フレームの行列として置き換えて

1の処理に戻ります。

# 最後に
OpenCVでの人物カウントには色々とやりかたや手法があると思います。
このコードが皆さんのコード作成の手助けになれば幸いです。
そしていいコードができましたら、是非フィードバックをお願いします。
jsonを利用したデータ通信

jsonを利用したデータ通信方法です。

```js
 $.ajax({
            url : "ファイルパス", //実行ファイルパス
            type: 'POST', //値の通信形式。指定しないとGET
            dataType: 'json', //サーバーから返されるデータの型
            timeout: 10000, //サーバーと通信をする間隔
            data:{ //送るデータの中身
                "id" : id,
                "user_id": user_id,
                "send_data": send_data
            },
        }).done(function(data){ //成功した時の処理
 
        }).fail(function(data){ //失敗した時の処理

        });
```

PHP側は配列を出力したい場合は`json_encode`した後に`echo`
そうでない場合は普通に`echo`で出力。そして`die;`で終了。
IEでjQueryが正常に読み込めない時の確認

jQueryを利用したWEBサイトを作成中に、IEだけレイアウトが崩れていた。（Chromeでは正常表示）
理由を調べてみると互換表示設定が原因らしかったので、HTMLファイル側に互換表示設定を強制無効化する記述をする事で解決できた。

```html
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
```
aliasをずっと登録しておく方法

aliasコマンドは日常よく使うコマンドを登録しておくと便利。
だがターミナル上で普通に実行しただけでは再起動した際に登録が失われてしまう。
ずっと登録しておくには、ホーム（/homeというわけではなく、繋いでいる場所のホーム。つまり繋いだ最初の場所）にある
.bashrcに登録しておく必要がある。

例えばMySQLの接続をさぼるやり方としては

```
alias mysql='mysql -h ホスト名 -u ユーザー名 -pパスワード'
（-pの後に半角スペースを空けてはいけない）
```
のような登録内容になる
ログインログからログイン数を集計するクエリ

会員制のシステムでは、大抵ログインログがある。
そこからログイン数を集計するクエリだがMySQLとSQL SERVERで若干違う。

管理ID（id）とログイン時間（login_date）がフィールドに用意されているログインログテーブル（login_log）から
アクセス数を集計するクエリは

MySQL

```
SELECT
SUBSTRING(login_date,1,10) AS '日付',
COUNT(id) AS 'アクセス数'
FROM login_log GROUP BY SUBSTRING(login_date,1,10) ORDER BY '日付' DESC
```

SQL SERVER

```
SELECT
CONVERT(DATE , login_date) AS '日付',
COUNT(id) AS 'アクセス数'
FROM login_log GROUP BY CONVERT(DATE , login_date) ORDER BY '日付' DESC
```
Amazon S3からHiveやPigを使ってデータをロードしたかった

# Hadoop使おう
- S3に上がっているデータをHiveでHDFSに取り込みたい
- ファイルはgzip圧縮されており、TSV形式だ
- EMR上でHadoop+Hive, Pigなどをインストールしてテストしている

環境設定は [AWSのEMRで分散クエリエンジンPrestoクラスタ作成→rubyから接続してS3の大量ファイル操作体験をしてみよう！](http://qiita.com/mix/items/887c545daf5491eed552) を参考にしました。ありがとうございます。

## [S3 Support in Apache Hadoop](https://wiki.apache.org/hadoop/AmazonS3)

上記のサイトによれば、現在Hadoop-2.7+では、S3に対して以下のようなプロトコルが許容されている

* S3A (URI scheme: s3a://) - Hadoop 2.7+
* S3N FileSystem (URI scheme: s3n://)
* S3 Block FileSystem (URI scheme: s3://)

### Amazon EMRでのS3のサポート (S3 Support in Amazon EMR)
>Amazon's EMR Service is based upon Apache Hadoop, 
>but contains modifications and their own, proprietary, S3 client. 
>Consult Amazon's documentation on this. Due to the fact that their code is proprietary, only Amazon can provide support and/or field bug reports related to their S3 support.

AmazonのEMRはApache Hadoopを元にしているが、AWS側による彼ら自身の商用のS3クライアントについての改変が含まれている。
Amazonのドキュメントは[これ](http://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-file-systems.html)を参照せよ。彼らのコードが商用であるという事実により、AmazonのみがS3のサポートについてのバグやサポートを提供できる。

## Hive
- [How to load CSV data with enclosed by double quotes and separated by tab into HIVE table?](http://stackoverflow.com/a/38852554/2565527)

ここの回答に従うと、Hiveの内部クラス `org.apache.hadoop.hive.serde2.OpenCSVSerde` を使えば、TSV形式で取り込めた。

- コマンドのイメージ

```:sql
$ hive
> CREATE EXTERNAL TABLE example (
- 定義…
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "\""
)
LOCATION 's3n://your-s3-directory-is/'
;

-- コマンドがOKで返ったらhiveからselectできる
> select * from example limit 20;
```

- S3のディレクトリ単位でしかEXTERNAL TABLEを作れない（？）
- ディレクトリを表現するにはPARTITIONを使うことが多いようだ
- Hiveで作ったテーブルはPrestoからもクエリをかけられる

## Pig
- [How to access data files stored in AWS S3 buckets from HDP using HDFS](https://community.hortonworks.com/articles/25578/how-to-access-data-files-stored-in-aws-s3-buckets.html)

~~ここの回答に従って、データを取り込もうとしたのですがPigからの応答がなくなってしまう…~~

- テキストファイルを読みだしたら行けた
- "s3n://" → "s3://"

```:bash
$ pig -x tez
grunt> a = load 's3://your-s3-directory-is/here.txt' AS (line:chararray);
grunt> dump a;
```
charとvarcharとncharとnvarcharの違い

結構よく使うけれど、ついつい忘れがちなのが
char、varchar、nchar、nvarcharの取り扱い方の違い。

すごく簡単に説明すると

- **char**→文字数固定。全角非推奨。
- **varchar**→最大文字数固定（未満でもOK）。全角非推奨。
- **nchar**→文字数固定。全角半角関係なし。
- **nvarchar**→最大文字数固定（未満でもOK）。全角半角関係なし。

超大雑把な説明ですみません。
AtomのVue.js関係プラグインまとめ

AtomのVue.js関係のプラグインをまとめてみました。

##language-vue-component
vue用のシンタックスハイライトが追加される
https://atom.io/packages/language-vue-component

<img width="522" alt="スクリーンショット 2017-03-13 12.42.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/fc8ac812-db4f-2872-2c65-36022f6f6be9.png">

##vue-autocomplete
vue componet用の入力の自動補完
https://atom.io/packages/vue-autocomplete

<img width="760" alt="スクリーンショット 2017-03-13 12.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/58695/a4532861-c4e4-0945-abdd-20de9c039301.png">

##vue-snippets
vue用のスニペットが追加される
https://atom.io/packages/vue-snippets

![vue1.gif](https://qiita-image-store.s3.amazonaws.com/0/58695/09e17bc7-cb78-d124-94cc-28621bd8180e.gif)

##vue-hyperclick
vue componetから定義元へジャンプできる
＊hyperclickとjs-hyperclickとlanguage-vue-componentがインストールされている必要がある
https://atom.io/packages/vue-hyperclick

![vue2.gif](https://qiita-image-store.s3.amazonaws.com/0/58695/d6a28681-ba58-f2f2-a1c2-1652cd206584.gif)

##atom-beautify
ソースコードを自動整形してくれるプラグイン。Vueはもちろん、HTMLやCSS、Javaなどいろいろなものに対応している。
https://atom.io/packages/atom-beautify

![vue.gif](https://qiita-image-store.s3.amazonaws.com/0/58695/0c90be96-c89c-edd0-898b-c796cad4819a.gif)

##vue-format
こちらも自動整形のプラグイン。（js-beautifyのdefaultを使っているようで、自分で設定はできないっぽい）
https://atom.io/packages/vue-format

![vue.gif](https://qiita-image-store.s3.amazonaws.com/0/58695/1b8a451a-0886-7ef8-9f39-3eeefc1c2399.gif)
テーブル数をカウントするクエリ

DBのテーブル情報を棚卸する際に、DBのテーブル数を確認する事に。
その際に以下の様なクエリを実行する事で解決した。

MySQL
```SELECT * FROM sysobjects WHERE xtype = 'u'```

SQLServer
```SELECT COUNT(*) FROM `information_schema`.`tables` WHERE `table_schema` = 'DB名';```
SQLServerでLIMIT句を利用する

DBから指定の数だけレコードを引っ張ってくる際に、MySQLではLIMIT句を使えば簡単にできるが
SQLServerはひと工夫が必要。

```sql
/* テーブルAからname順に最初の10件のデータを取得する */
SELECT TOP 10 * FROM テーブルA ORDER BY name
 
/* テーブルAからname順に11件目～20件目のデータを取得する */
SELECT * FROM
(SELECT name,ROW_NUMBER() OVER (ORDER BY name) AS record_num FROM テーブルA) AS t
WHERE record_num BETWEEN 11 AND 20
ORDER BY record_num
```
頭から表示させるのは難しくないが、途中から表示させるのは難しい。
別テーブルのデータを引用コピーしたい場合

新しく作成したテーブルの特定のフィールドに、既に存在している別テーブルの特定フィールドのデータを引用コピーしたい、
そんな事があった。

そういう時にどんなUPDATE文を作ればいいのかというと、下記のようになる。

UPDATEをかけたいテーブル → テーブルA
引用元のテーブル → テーブルB

```
UPDATE (テーブルA)
SET (テーブルA).(フィールド名) = (テーブルB).(フィールド名)
FROM (テーブルA)
JOIN (テーブルB) ON (テーブルA).(結合させるフィールド名) = (テーブルB).(結合させるフィールド名)
```
SQL Server Management StudioでExcelファイルのデータをインポートする方法

30000レコード程あるデータの更新を依頼され、それがExcelファイルで渡された。
SQL Server Management StudioではExcelファイルをコピー&ペースト（以下コピペ）でinsertできる機能が備わっているようだ。

```
①insertするテーブルのフィールド数と同じセル数（1行当たり）で必要データをすべてコピー
②SQL Server Management Studioでinsertしたいテーブルを開き、最終行を右クリックし貼り付け
```
以上

私の場合は元データをすべて削除してからコピペinsertしたが、両方合わせて20分ぐらいかかった・・・
kagomeでの形態素解析にユーザ辞書を使う雑なサンプル

kagomeで形態素解析をするときユーザ辞書を使うサンプル。

とりあえずコード

```go
import "github.com/ikawaha/kagome/tokenizer"

func Tokenize() {
	t := tokenizer.New()

	// bindataから辞書ファイルを取得
	dic, _ := Asset("dic.txt")

	// ユーザ辞書を設定
	userDicRecords, _ := tokenizer.NewUserDicRecords(bytes.NewReader(dic))
	userDic, _ := userDicRecords.NewUserDic()
	t.SetUserDic(userDic)

	tokens := t.Tokenize("cとc++とc#とobjective-c")
	for _, token := range tokens {
		if token.Class == tokenizer.DUMMY {
			// BOS or EOS
			continue
		}
		fmt.Println(token)
	}
}
```

辞書を設定せずにコードを実行した場合の出力は以下のようになる。見事に分解されてしまっているのでcとc++とc#とobjective-cが単語として判定されるようにユーザ辞書を設定したい。

```
c(0, 1)UNKNOWN[5]
と(1, 2)KNOWN[47729]
c(2, 3)UNKNOWN[5]
++(3, 5)UNKNOWN[39]
と(5, 6)KNOWN[47729]
c(6, 7)UNKNOWN[5]
#(7, 8)UNKNOWN[39]
と(8, 9)KNOWN[47729]
objective(9, 18)UNKNOWN[5]
-(18, 19)UNKNOWN[39]
c(19, 20)UNKNOWN[5]
```

辞書データはこんな感じ。狙ったとおりに単語を分解したい、という需要なら至極簡単でいい。

```dic.txt
c,c,,名詞
objective-c,objective-c,,名詞
c#,c#,,名詞
c++,c++,,名詞
```

これで結果はこうなる

```
c(0, 1)USER[0]
と(1, 2)KNOWN[47727]
c++(2, 5)USER[2]
と(5, 6)KNOWN[47727]
c#(6, 8)USER[1]
と(8, 9)KNOWN[47727]
objective-c(9, 20)USER[3]
```
[Linux][sed] 文字列から部分抽出する/置換後に特定文字列を使いまわす方法

毎回調べるので自分のユースケースでまとめ

`sed -e` よりも拡張正規表現を使用する `sed -r` をおすすめします。（本記事は `sed -r` を前提とします）

# 使用例
## 基本

`s/^.*(one).*$/\1` のように抽出したい条件をカッコで括り、マッチした順番で連番が振られるので `\1` 等で取得します。

```console:１つの場合
$ echo "one two three" | sed -r 's/^\s*(one).*$/1: \1/'
1: one
```

```console:２つの場合
$ echo "one two three" | sed -r 's/^\s*(one)\s+(two).*$/1: \1\n2: \2/'
1: one
2: two
```

## 抽出条件の一部が欠けるケースに対応する

よくあるパターンとして、部分抽出に指定している文字が欠けるケースが有ります。

```console:そのままだと失敗する
$ echo " two three" | sed -r 's/^\s*(one)\s+(two).*$/1: \1\n2: \2/'
 two three
```

その場合は抽出条件に `?` をつけることで、存在しないケースに対応できます。（連番はそのまま）

```console:２つの場合
$ echo "one two three" | sed -r 's/^\s*(one)?\s+(two).*$/1: \1\n2: \2/'
1: one
2: two
$ echo " two three" | sed -r 's/^\s*(one)?\s+(two).*$/1: \1\n2: \2/'
1: 
2: two
```

抽出条件がさらに複数どこか欠けるケースは、抽出条件をさらにグループ化して同じように `?` で無い場合に対応できます。（空白の考慮が甘いですが、あくまでも例なので厳密さは気にしないでください・・・）

連番はグループ化のはじめのカッコがある順に振られるので注意して下さい

```console:抽出条件複数欠けるケース
$ echo "one two three" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: one 
2: two 
3: three
$ echo "one three" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: one 
2: 
3: three
$ echo "two three" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: 
2: two 
3: three
$ echo "one two" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: one 
2: two
3: 
$ echo "one" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: one
2: 
3: 
$ echo "two" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: 
2: two
3: 
$ echo "three" | sed -r 's/^\s*((one\s*)?(two\s*)?)?(three)?.*$/1: \2\n2: \3\n3: \4/'
1: 
2: 
3: three
```

# 参考
[sedで特定の文字列を抽出 - Qiita](http://qiita.com/todanano/items/5be0f9a85602844d2c2d)
[sed/grepコマンドの正規表現 - Miuran Business Systems](http://www.m-bsys.com/linux/sed-reg)
yumによるパッケージインストールの切り戻し    

yumは目的のパッケージの依存性を考慮して関連パッケージを含めて導入できるため、大変便利なのですが、依存パッケージが多い場合、作業の切り戻しに苦労します。

そんな場合、yumの履歴管理が便利です。依存パッケージのインストールやアップデート含め、yumによる導入作業をロールバックすることができます。

###手順

```bash:コマンド
$ sudo yum history packages-list nginx
```
```bash:結果
ID     | 操作           | Package
-------------------------------------------------------------------------------
     6 | インストール   | nginx-1:1.10.3-1.el7.ngx.x86_64                    EE
history packages-list
```
```bash:コマンド
$ sudo yum history undo 6（上記IDを指定）
```
```bash:結果
読み込んだプラグイン:fastestmirror
Undoing transaction 8, from Mon Mar 13 15:17:05 2017
    インストール nginx-1:1.10.3-1.el7.ngx.x86_64 @nginx
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ nginx.x86_64 1:1.10.3-1.el7.ngx を 削除
--> 依存性解決を終了しました。

依存性を解決しました

=======================================================================================================================================
 Package                     アーキテクチャー             バージョン                                リポジトリー                  容量
=======================================================================================================================================
削除中:
 nginx                       x86_64                       1:1.10.3-1.el7.ngx                        @nginx                       2.3 M

トランザクションの要約
=======================================================================================================================================
削除  1 パッケージ

インストール容量: 2.3 M
上記の処理を行います。よろしいでしょうか？ [y/N]
```
上記の例では依存パッケージはありませんが、あった場合まとめてロールバックされます。

```bash:コマンド
$ sudo yum history packages-list nginx
```
```bash:結果
読み込んだプラグイン:fastestmirror
ID     | 操作           | Package
-------------------------------------------------------------------------------
     7 | 削除           | nginx-1:1.10.3-1.el7.ngx.x86_64
     6 | インストール   | nginx-1:1.10.3-1.el7.ngx.x86_64                    EE
history packages-list
```
削除した履歴が追加されます。
Excel 3D集計で下半期(9月～3月)を柔軟に集計する方法

### 環境
* Excel 2010

売上予測のようなものを集計するのに、シートごとの共通のセルを合計する必要が出てきた。それも、場合によっては、10月～1月の合計を式だけで計算したいというような要望が出た。

![WS000197.JPG](https://qiita-image-store.s3.amazonaws.com/0/160188/f3a240d2-9c1a-0e24-fbce-38b62c9996ba.jpeg)

ここで、Excelのセルに配列があることを知り、それを利用することで柔軟に開始月から終了月までの合計が出せるような式を考えた。ちなみに単純に月シートだけあるなら3D集計で事足りる。私の場合シートが連続していなかったり何かそれ用のシートで挟むというのが好みでなかった。はるかに挟み方法が楽である。

```
='第1Q:第2Q'!E14'
```
これだと、第1Qから第2Qの間にあるシートのE14セルの合計を計算してくれる。その代り間にある全てのシートの合計を計算してしまうから、いちいちシートの移動をしたりする必要は出てくる。

### コード - code
$A$13 = 開始月
$A$14 = 終了月
もちろん、開始月や終了月はリストから選択できるようにしている。

```
=IF($A$14>3,SUMPRODUCT(SUMIF(INDIRECT("'"&ROW(INDIRECT($A$13&":"&$A$14))&"'!E14"),"<>0")),SUMPRODUCT(SUMIF(INDIRECT("'"&ROW(INDIRECT($A$13&":"&"12"))&"'!E14"),"<>0")) + SUMPRODUCT(SUMIF(INDIRECT("'"&ROW(INDIRECT("1"&":"&$A$14))&"'!E14"),"<>0")))
```
長い。
いつも思うのだが、Excelの式である程度複雑なことをやろうとすると可読性が落ち、理解が困難になる。ちょっとずつ分解して考えてみる。


会社の年間という概念が、4月始まりなのが厄介だ。このせいで、上記のような10月～1月といった処理を行わなければいけなくなる。これは簡単で、10～12月、1月～3月と分けて足し算してあげればいい。仕方なくIF文で条件判断をしている。

```
ROW(INDIRECT($A$13&":"&$A$14))
```
数式配列を作成する。

```
ROW(10:1)
```
というのは1～10の配列になってしまう。都合が悪い。

```
INDIRECT("'"&ROW(INDIRECT($A$13&":"&$A$14))&"'!E14")
```
何故だか"'"でくくってやる必要がある。このページ最後のMicrosoftのリンクの後ろの方に書いてある。
そして、配列を処理できる関数のSUMPRODUCTを使うが、その前にSUMIFをかます。正直こうやらないと動かないのでよくいまだに理解しきれていない。

```
SUMPRODUCT(SUMIF(～,"<>0"))
```

### その他
もっといいやり方があれば是非教えてほしいです。
特に、配列数式で

```
{10,11,12} + {1} = {10,11,12,1}
```
とできたらもっとスマートに記述できるのに、、、

### 参考：
[配列数式のガイドラインと例 - Excel | Microsoft](https://support.office.com/ja-jp/article/%25E9%2585%258D%25E5%2588%2597%25E6%2595%25B0%25E5%25BC%258F%25E3%2581%25AE%25E3%2582%25AC%25E3%2582%25A4%25E3%2583%2589%25E3%2583%25A9%25E3%2582%25A4%25E3%2583%25B3%25E3%2581%25A8%25E4%25BE%258B-3be0c791-3f89-4644-a062-8e6e9ecee523?ui=ja-JP&rs=ja-JP&ad=JP)
link / naming > Command authorization code

```txt:動作環境
C++ Builder XE4
```

通常実行はしない特殊な処理に対してのプロテクトとして、なんらかのキーを入力して実行する、という状況を考える。

その時のキーの名前は何か?

http://memory-alpha.wikia.com/wiki/Command_authorization_code

Janewayのキーは5種類あるようだ。

上記のキー内の数字には、[47のような意味のある数字](http://memory-alpha.wikia.com/wiki/47)を使っているのだろうか。

authorization codeで検索するとソフトウェアライセンス関連の検索結果が多い。
jupyter notebook で外部からの接続を許可する

VM 環境で jupyter を立ち上げた際、VM 側で jupyter 用のポートを localhost にフォワードするように設定していても接続を拒否されてしまう。
恐らく LISTEN が `localhost` とかになってるんやろな、ってのは想像ついたけど、調べてみるまで設定どうすればいいか全然分からなかったのでメモ。

まずは設定ファイルを作成する。

```bash
$ jupyter notebook --generate-config
```

デフォルトでは `~/.jupyter/` 内に `jupyter_notebook_config.py` というファイルが作成される。
このファイル内の下記あたりの行を編集。

```py3
## The IP address the notebook server will listen on.
c.NotebookApp.ip = 'localhost'
```

この `localhost` を `0.0.0.0` とか `*` とかに変えてやればおｋ。

```py3
## The IP address the notebook server will listen on.
c.NotebookApp.ip = '0.0.0.0'
```

これで VM の外からもアクセス出来るようになった。
ついでに書いとくと、Jupyter 起動時にいちいちブラウザが立ち上がるのがウザいって場合は

```py3
## Whether to open in a browser after starting. The specific browser used is
#  platform dependent and determined by the python standard library `webbrowser`
#  module, unless it is overridden using the --browser (NotebookApp.browser)
#  configuration option.
c.NotebookApp.open_browser = False
```

のように `open_browser` 値を `False` にしておけば、立ち上げ時に何も開かないようにできる。

---

**追記**

コメント欄で教えていただきましたが、アドホックにやりたかったら

```bash
$ jupyter notebook --ip=* --no-browser
```

で良いらしい。便利ですね。
Python 2.7 で 標準入力(stdin)を1行ずつ処理するプログラムのテンプレート

```
echo -e "hoge\nfuge" |python templ.py --format json
{"line": "hoge"}
{"line": "fuge"}

echo -e "hoge\nfuge" |python templ.py --format raw 
hoge
fuge
```

## templ.py

```
import argparse
import sys
import json

parser = argparse.ArgumentParser(description='hoge')
parser.add_argument('--format', type=str, default="raw", help="output format")
args = vars(parser.parse_args())

type_of_format = args["format"]

while True:
    line = sys.stdin.readline()
    if not line: break
    line = line.rstrip('\r\n')
    if type_of_format == "json":
        _dict = {"line": line}
        print json.dumps(_dict)
    else:
        print line
```

## メモ

```
for line in fileinput.input():
  print line
```

だと、args があるとそれをファイルとして読みに行ってしまう。
stdin 強制モードとかあると良いのだが、無いように見える。
CakePHP3のMySQL接続で「General error: 1298 Unknown or incorrect time zone:」が出た時の対処法


\config\bootstrap.php

    date_default_timezone_set('Asia/Tokyo');


\config\app.php

    'timezone' => 'Asia/Tokyo',


/etc/my.cnf

    [mysqld_safe]
    timezone = Asia/Tokyo

コマンド実行

    mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql -p

mysql再起動
Homebrewのreadlineが7系でtigが動かなった時の対処法

Homebrewを最新にupdateしたらreadlineが7系にアップデートされており、
以下のエラーが出てtigが動かなくなったので、対処法をメモ。

```
Library not loaded: /usr/local/opt/readline/lib/libreadline.6.dylib
```

* readlineの6.3.8をアップしてくれている人がいたので、ここから直接インストール

```
brew install https://raw.githubusercontent.com/esse/homebrew-readline6.3.8/master/Formula/readline.rb
```
https://github.com/esse/homebrew-readline6.3.8

* `brew info readline`で指定バージョンがインストールされたかを確認
* インストールされていたら、`brew switch readline 6.3.8`でバージョンを移行
* この状態でtigを実行すれば正常に動作した
Mysql/Mariadbのインストールが依存関係で失敗した時の対処方法＠ubuntu16.04

https://mariadb.com/kb/en/mariadb/mariadb-100-installation-errors-on-linux-mint-16/

この記事の翻訳になりますが、ubuntu16.04でredmineをインストールしようとしてうまく行かないので諦めようとした時、mysql/mariadbが下記のエラーで死んだのでどうしたことやらと思っていた時に見つけたTips

## 再現方法

```
apt install redmine
```

##エラー内容
```
su: No module specific data is present
`/var/www` is not writable.
Bundler will use `/tmp/user/33/bundler/home/www-data' as your home directory temporarily.
```

おそらくdependency packageとして何かが足りていない。
英語をそのまま訳すと、/var/wwwはwritableじゃないぜという感じ。
\#後で調査して追記します。

```
mariadb-server (10.0.29-0ubuntu0.16.04.1) を展開しています...
systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
man-db (2.7.5-1) のトリガを処理しています ...
libdbi-perl (1.634-1build1) を設定しています ...
libdbd-mysql-perl (4.033-1ubuntu0.1) を設定しています ...
libterm-readkey-perl (2.33-1build1) を設定しています ...
libaio1:amd64 (0.3.110-2) を設定しています ...
mariadb-client-core-10.0 (10.0.29-0ubuntu0.16.04.1) を設定しています ...
mariadb-client-10.0 (10.0.29-0ubuntu0.16.04.1) を設定しています ...
mariadb-server-core-10.0 (10.0.29-0ubuntu0.16.04.1) を設定しています ...
mariadb-server-10.0 (10.0.29-0ubuntu0.16.04.1) を設定しています ...
dpkg: パッケージ mariadb-server-10.0 の処理中にエラーが発生しました (--configure):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
dpkg: 依存関係の問題により mariadb-server の設定ができません:
 mariadb-server は以下に依存 (depends) します: mariadb-server-10.0 (>= 10.0.29-0ubuntu0.16.04.1) ...しかし:
  パッケージ mariadb-server-10.0 はまだ設定されていません。

dpkg: パッケージ mariadb-server の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
libc-bin (2.23-0ubuntu5) のトリガを処理しています ...
エラーメッセージは前の失敗から続くエラーであることを示しているので、レポートは書き込まれません。
                systemd (229-4ubuntu16) のトリガを処理しています ...
ureadahead (0.100.0-19) のトリガを処理しています ...
処理中にエラーが発生しました:
 mariadb-server-10.0
 mariadb-server

```

で、なんのエラーかというと
以前インストールしたmysqlのゴミ(depended package)が残っていた様子。
なので

## 不要パッケージの削除

```
dpkg -l | grep -i 'maria\|mysql' | awk '{print $2}' | xargs sudo apt-get purge
```
で依存関係を解決しつつ丁寧に消して行った結果うまく行った。

## mysqlへのログイン
``
sudo -i 
mysql -u root
```
して

## mysqlへログイン、データベースの確認

```
root@sasukeh:~# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 45
Server version: 10.0.29-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]> 

```

このくらいの確認作業は、しておきましょう。
Doze無効化対策コード


例えば、過去にAndroid端末のデータを一定間隔でサーバに送り続ける試作アプリを作ったが、Android 6.0あるいは7.xでは正常に動かなくなってしまったということはないでしょうか？

その場合、6.0で導入され、7.0で仕様が変更になったDoze(バッテリー最適化)モードが悪さをしている可能性があります。
回避するには、設定→電池→メニュー開く→電池の最適化→すべてのアプリを開いて該当アプリを「最適化しない」に変更する必要があります。
しかし、開発中にインストールするたびに毎回設定するのは面倒だし忘れる可能性があります。
そこで下記のようにするとユーザにダイアログを出して、許可されたらDozeを無視するようできます。

```java
PowerManager powerManager = getSystemService(PowerManager.class);
if (!powerManager.isIgnoringBatteryOptimizations(getPackageName())) {
    Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivity(intent);
}
```

また、マニフェストに下記設定も必要になります。

```xml:AndroidManifest.xml
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
```

これを起動時に毎回通るコードに書いておけば忘れなくなります。

注意点は、上記でユーザがダイアログで許可した後に
設定→電池→メニュー開く→電池の最適化
を開くと反映されていないようにみえる点です。
実際は反映されています。設定アプリを一度殺してから開くと反映されます。
Xcode Organizerのプロキシ設定(Xcode8.2.1)

XcodeのApplication Loaderなどのツールを使用する際に、Proxyに阻まれてしまった際の設定。

**編集ファイル**
`/Applications/Xcode_8_2_1.app/Contents/Applications/Application Loader.app/Contents/itms/java/lib/net.properties`

**編集内容**
http.proxyHost=`**.**.**.**`
http.proxyPort=`****`
https.proxyHost=`**.**.**.**`
https.proxyPort=`****`

を環境に合わせて設定する。
Xcodeのバージョンによってファイルの格納場所が異なるようなのでご注意ください。

[こちら](http://qiita.com/hisamekms/items/23d0c8dd01f9568f0979) の記事を参考にさせて頂きました。
network > IPアドレスの確認 @ Windows > Win+r して cmd /c,ipconfig | msg console という方法を教えていただきました > cmd /c,のカンマは重要 (はまり回避)

```txt:動作環境
Windows 10 Pro (64bit) Anniversary Update適用済
Windows 7 Pro (32bit)
Windows 8.1 Pro (64bit)
```

IPアドレスを確認したい。

OSが変更のたびに、操作も変わってきて、それを指示するのが大変になってくる。GUIの場合は「ネットワークと共有センター」の表示までの操作方法がOSごとに異なる。

コマンド経由での確認方法。

1. 「プログラムとファイルの検索 (もしくは「ファイル名を指定して実行」、もしくはCortana)において`cmd` と入力し`Enter`
  - DOSプロンプトが起動する
2. DOSプロンプトで`ipconfig`と入力し`Enter`

これも手順1においてOSごとに異なる。

### OS非依存 (Windowsに限る)

以下のbatファイルをエディタで作って、ダブルクリックして使うとOSごとの説明は不要にはなる。

```my_ipaddress.bat
ipconfig
pause
```

ファイルを作るという点はマイナス一つ。

batファイルを使うことで、OS依存をなくすというのは一つの利点ではあるかも。

### 教えていただいた方法

@DamashiGamiさんの[コメント](http://qiita.com/7of9/items/d0a995c39606e247213b/#comment-d8c673ede308142ea540)にてファイル作成不要の方法を教えていただきました。
情報感謝です。

手順

1. <kbd>Win</kbd> + <kbd>r</kbd>
   - 「ファイル名を指定して実行」が起動します
2. `cmd /c,ipconfig | msg console`
   - IP情報のメッセージウィンドウが表示されます。

「ファイル名を指定して実行」に履歴が残るため、再実行が楽です。


### 教えていただいた情報
(追記 2017/03/31)

@DamashiGami さんの[コメント](http://qiita.com/7of9/items/d0a995c39606e247213b/#comment-0e8858d9c569f3f34e27)にてカンマの重要性を教えていただきました。

情報感謝です。

カンマは付けて使おうと思います。
UITextViewにて入力文字列に応じた高さの伸縮をコーディングなしで実装する

先日投稿のあった以下の記事を拝見して
「UITextView自体の伸縮だけだったらもう少し簡単にできたような・・・？」と思ってたところ
最近実装する機会があったのでメモ。
http://qiita.com/KikurageChan/items/4e1a467858eb2323e009

上記記事と同様に、背景に設定してるUIViewと一緒に伸び縮みさせる感じ。
![可変テキストボックス.gif](https://qiita-image-store.s3.amazonaws.com/0/113982/dabd8ebc-8956-af68-4c9e-b9867fe642c4.gif)

#実装

Storyboard上のAutoLayoutの設定のみで対応。
ただし、高さが変更された際に併せて他のこともしたい場合は
UITextViewDelegateのメソッドでガリガリすることが必須。

####その1. 背景用のUIViewを放り込んで、幅とY座標を確定させる

例：
![スクリーンショット 2017-03-10 13.31.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/ccff3812-c1dc-f411-9866-78579d765bae.jpeg)

####その2. UITextViewを上記UIView内の子要素として放り込んで、幅とY座標を確定させる

例：
![スクリーンショット 2017-03-10 13.34.09.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/6dd6a7b0-68e1-f664-808d-a8528c20aafc.jpeg)

####その3. UITextViewの高さを決める**(Greater Than or Equalを選択)**

例：
![スクリーンショット 2017-03-10 13.35.21.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/2c51ba99-4045-edf8-c897-bfd99eda160c.jpeg)


####その4. 親のUIViewとUITextViewの高さを連動させる

例：
![スクリーンショット 2017-03-10 13.35.52.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/0b9ea571-ec50-73f2-178a-cb225f1524e3.jpeg)

####その5. UITextViewのScrollViewの設定にて、Scrolling EnabledとBouncesのチェックを外す

例：
![スクリーンショット 2017-03-10 13.36.48.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/40b07fcc-e650-f093-e03c-41d6efb2b10e.jpeg)

####その6. 5まででレイアウトのエラーが警告になるので、Update Framesをして完成

例：
![スクリーンショット 2017-03-10 13.37.37.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/10710bea-bff3-8061-ef82-f95e33acd0d4.jpeg)

1〜6までで以下の設定がされる。
![スクリーンショット 2017-03-10 13.45.39.jpg](https://qiita-image-store.s3.amazonaws.com/0/113982/5c2b0f47-8f6d-cd11-a182-ca77eadb011c.jpeg)
pythonでツイッターの画像を複数投稿

#1. はじめに
画像の複数投稿をしたかったのですがちょっとはまったところがあったので投稿します。
python 3系列で動かすことを想定しています

#2. 画像の投稿とその引数
1枚の画像の投稿はほかにも記事が多く、簡単に実装ができます。
参考: [Python で画像付きツイート](http://qiita.com/yubais/items/864eedc8dccd7adaea5d)
こちらに記述されているソースコードを流用しましょう。

#3. 複数枚投稿
複数枚投稿にはmedia/uploadをその分使います。

(media/upload -> media_idの取得) * 枚数 -> statuses/update

media_idですが複数枚投稿にはカンマ区切りの文字列を挿入しましょう。
上記のソースコードをお借りして次のように書き換えました。

```python:media.py

def tweet_with_image(oauth_sess, tweet_text, path_list_images):
    
    url_media = "https://upload.twitter.com/1.1/media/upload.json"
    url_text = "https://api.twitter.com/1.1/statuses/update.json"
    
    media_ids = ""
    
    # 画像の枚数分ループ
    for path in path_list_images:
        files = {"media" : open(path, 'rb')}
        req_media = oauth_sess.post(url_media, files = files)

        # レスポンスを確認
        if req_media.status_code != 200:
            print ("画像アップデート失敗: {}".format(req_media.text))
            return -1
        
        media_id = json.loads(req_media.text)['media_id']
        media_id_string = json.loads(req_media.text)['media_id_string']
        print ("Media ID: {} ".format(media_id))
        # メディアIDの文字列をカンマ","で結合
        if media_ids == "":
            media_ids += media_id_string
        else:
            media_ids = media_ids + "," + media_id_string
    
    print ("media_ids: ", media_ids)
    params = {'status': tweet_text, "media_ids": [media_ids]}
    req_text = oauth_sess.post(url_text, params = params)

    # 再びレスポンスを確認
    if req_text.status_code != 200:
        print ("テキストアップデート失敗: {}".format(req_text.text))
        return -1
    
    print ("tweet uploaded\n")
    return 1

```
ReactでDataGridViewが欲しくなった

# 背景
リソースとってきて。  
ループでゴリゴリ`<table>`、`<tr>`、`<td>`配置して。  
いちいちそんなことをやりたくなかった。  

`react table`とか、`react datagrid`でググると良さげなコンポーネントは結構あるみたい。
けど、ソートとか、カラムの移動とか、そこまで仰々しいものは必要なかった。  

なのでお勉強を兼ねて簡単なものを実装することにした。  

# やりたいこと
最低限、以下の2つが出来ればOK。

- dataProvider、dataFieldをプロパティに与えると、そこからテーブルを生成する
- デザインは外からcssを充てるスタイル

# 実装
コンポーネントはこんな感じで。  

```javascript
import React, { Component, PropTypes } from 'react';

/**
 * データとフィールドを指定して<table>を描画する。
 * 内部的にはシンプルなテーブルなので、デザインは外部からCSSにて操作する。
 * @param {*} props - 利用元から渡されるプロパティ
 * @example
 * <DataGrid dataProvider={array of object}>
 *   <DataGridColumn dataField="dog"></DataGridColumn>
 *   <DataGridColumn dataField="cat"></DataGridColumn>
 *   <DataGridColumn dataField="rabbit"></DataGridColumn>
 * </DataGrid>
 */
export const DataGrid = (props) => {
  // DataGridColumnより、ヘッダを構築
  const makeThead = (children) => {

    let theadCols = children.map((child) => {
      return <td>{child.props.dataField}</td>
    });

    return (
      <thead>
        <tr>
          {theadCols}
        </tr>
      </thead>
    );
  };

  // データプロバイダをリソースに、レコード部を構築
  const makeTbody = (provider, children) => {

    let tbodyRows = provider.map((item) => {
      return (
        <tr>
          {
            children.map((child) => {
              return <td>{item[child.props.dataField]}</td>
            })
          }
        </tr>
      );
    });

    return (
      <tbody>
        {tbodyRows}
      </tbody>
    );
  };

  return (
    <table className={props.className}>
      {makeThead(props.children)}
      {makeTbody(props.dataProvider, props.children)}
    </table>
  );
};

/**
 * データグリッドのカラムを定義する。
 * <DataGrid>の子要素として必ず1つ以上配置する。
 * @param {*} props - 利用元から渡されるプロパティ
 */
export const DataGridColumn = (props) => {
  // datafieldを受け取るのみ。
  // 要素の描画は親コンポーネントにて実施
  return null;
};

DataGrid.propTypes = {
  dataProvider: PropTypes.arrayOf(PropTypes.object).isRequired,
  children: PropTypes.node.isRequired,
  className: PropTypes.string,
};

DataGridColumn.propTypes = {
  dataField: PropTypes.string.isRequired,
};

```

呼び出し側はこんな感じで呼び出す。  

```javascript
import { DataGrid, DataGridColumn } from '../components/DataGrid';

const dp = [
  { dog: "犬", cat: "猫", rabbit: "兎" },
  { dog: "いぬ", cat: "ねこ", rabbit: "うさぎ" },
  { dog: "dog", cat: "cat", rabbit: "rabbit" },
];

return (
  <DataGrid dataProvider={dp} className="mygrid">
    <DataGridColumn dataField="dog"></DataGridColumn>
    <DataGridColumn dataField="cat"></DataGridColumn>
    <DataGridColumn dataField="rabbit"></DataGridColumn>
  </DataGrid>
);

```

# TODO
やっぱソートとかしたいし、ヘッダ固定でスクロールしたいね。  
後者はcssで出来なくもないのかな。
redisプロトコルをbashで出力する話

大量のデータをredisに流し込む際に、コマンドを送るよりバルクでプロトコル流すと速いので、
http://redis-documentasion-japanese.readthedocs.io/ja/latest/topics/mass-insert.html

# pythonで書いてみたけど

```py3:redis_bulk.py
def cmd2bulk(*cmd):
    z = lambda x: (len(bytes(str(x), "utf-8")), x)
    return "*%d\r\n%s" % (len(cmd), "".join(["$%d\r\n%s\r\n" % z(x) for x in cmd]))

if __name__ == '__main__':
    import sys
    import unittest

    class TestRedisBulk(unittest.TestCase):

        def test_redis_proto1(self):
            expect = "*3\r\n$3\r\nSET\r\n$6\r\nKEY985\r\n$8\r\nVALUE985\r\n"
            result = cmd2bulk("SET", "KEY985", "VALUE985")
            self.assertEqual(expect, result)

        def test_redis_proto2(self):
            expect = "*5\r\n$4\r\nSADD\r\n$4\r\nhoge\r\n$9\r\nあああ\r\n$6\r\nいい\r\n$3\r\nう\r\n"
            result = cmd2bulk("SADD", "hoge", "あああ", "いい", "う")
            self.assertEqual(expect, result)

    unittest.main()
```

# bashでもいけるんじゃね

```bash:redis_bulk_test.sh
function redis_bulk() {
    printf "*%d\r\n" "${#@}"
    for x in "${@}"; do
        printf "$%d\r\n%s\r\n" $(echo -ne "$x" | wc -c) "$x"
    done
}

redis_bulk HMSET "ほげ" foo 123 bar "ばー" | redis-cli --pipe
```

っていう話。

# 注意

bashの方は実運用してないから未知数。

pythonの方は100万件くらいの塊を連続で一気に流し込んでも問題なく動いてます。
コマンドを都度送るより断然速いです。
Jenkins2.0のPipelineでupstrem buildを取得する

諸事情でjenkinsのUpstreamJob(上流ジョブ)の差分が欲しくなったのでそれをどうしたもんかなーと思って作ってみました。
これやるとpermissionがめちゃくちゃ出るので頑張って許可してあげてください。

currentBuild.rawBuild.causesでビルドの原因がとれます。
そのなかの最初のものが上流ジョブだったら上流ビルドをラップして返してます。
あとはbuild.changeSetsで差分が取れるのでそれを文字列にしておしまいです。
ただ、build.changeSetsはCPSに引っかかるので取り扱い注意

あと直近の原因が[0]でとれるのかは知りません。だれか確認してー

```groovy:getUpstream

@NonCPS
def getUpstreamBuild(){
    //ビルドの原因
    def causes = currentBuild.rawBuild.causes
    if(causes.isEmpty()) { //ないけど一応
        return null
    }
    def upstream = causes[0]
    //上流以外の要因でのビルド
    if(upstream.class != hudson.model.Cause.UpstreamCause.class) {
        return null
    }
    
    def r = new org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper(upstream.upstreamRun,false)

    return r
}

@NonCPS
def getChangeLog(build)
{
    def changeSets = null
    // empty List
    if( build.changeSets.isEmpty() ) {
        return "差分がありません"
    }
    changeSets = build.changeSets.toArray()
    
    def diff = ""
    if( changeSets.size() != 1 ){ // Multiple SCM

        diff += "差分が複数あります。最初の一つを採用します\n"
    }
    changes = changeSets[0]
    for( change in changes )
    {
        diff += change.msg + ":" + change.author.fullName + "(" + change.commitId + ")" + System.properties['line.separator']
    }
    changes = null // avoid CPS
    return diff
    
}
echo getChangeLog(getUpstream())

```
array_diff()を使って差分を取得する

配列の要素を比較し、その差分を抽出したい時にはarray_diff()が便利。

```
// array array_diff (array $array1, array $array2 [, array $... ])
// $array2以降と比較し、$array1にだけ存在する要素を配列で返す。

$oldHobby = array('プログラミング', 'ファッション', '楽器', 'アニメ');  // 昔の趣味
$nowHobby = array('プログラミング', 'ゲーム', 'アニメ', '資産運用'); // 現在の趣味

$addHobby = array_diff($nowHobby, $oldHobby);  // ゲーム、資産運用
$lostHobby = array_diff($oldHobby, $nowHobby); // ファッション、楽器
```
このようにすることで新しく増えた趣味(\$addHobby)、逆にもう興味が無くなってしまった趣味(\$lostHobby)等を差分を取得する事ができる。
IE11でJavaScriptがうまく動かない時

JSでの機能実装確認をしている際に、IE11にて開発者ツールを立ち上げているときちんと動作するのに
開発者ツールを閉じると動作しないという不具合が起こった。

調べた結果、理由はconsole.log()をIEが認識できずにエラーが起こっていたからだった。
console.log()部分をコメントアウトすることで解決した。
キーボードを使わずにMacをTDM(ターゲットディスプレイモード)にする

# 確認した環境
- ディスプレイとして使うMac：iMac (27-inchi, Mid 2011) OS X Yosemite 10.10.5
- ディスプレイとして使うMacのキーボード：Apple Wireless Keyboard
- 接続するMac：iMac (Retina 5K, 27-inch, Late 2014) OS X El Capitan
- ケーブル：Thunderbolt

# 手順
1. ディスプレイとして使うMacにsshで接続
2. `osascript -e 'tell application "System Events" to key code 144 using command down'`

# 注意
ディスプレイとして使うMacに接続しているキーボードによってkey codeが異なります．
CentOS7(x86_64)+PHP7+CakePHP3環境構築手順メモ


PHP7のインストール

	yum update -y
	yum install epel-release -y
	yum -y update epel-release
	rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
	yum -y update remi-release
	sudo yum -y --enablerepo=remi-php70,epel install php-fpm php-gd php-gmp php-mbstring php-mcrypt php-opcache php-pdo php-pear-MDB2-Driver-mysqli php-pecl-memcached php-pecl-msgpack php-xml php-devel php-gd php-intl


コンポーザのインストール

	curl -sS https://getcomposer.org/installer | php
	mv composer.phar /usr/local/bin/composer


gitのインストール

	yum -y install git


CakePHP3のインストール

	composer self-update && composer create-project --prefer-dist cakephp/app hoge


apacheのインストール

    yum install httpd -y
Cognos パフォチュー事例 - プロンプトとフィルターの対象

##概要
Cognosに限らず、BIでレポートを生成する場合は、データソースとしてのテーブル構造はいわゆるスター・スキーマ型になると思います。
例として以下のようなテーブル構造の場合、プロンプトとして選択するデータ項目、フィルターの対象となるデータ項目はどのように考えれば良いでしょうか。
この選択を誤り、パフォーマンスに大きな影響が出ている環境を見かける事が多いので、投稿しておきます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/69e66aad-cbc9-23e5-3fb7-5b9450321fbf.png)

##プロンプトとして選択するデータ項目
例えば日付のプロンプトを作成する場合、図のようにDimension表の「日」を選択します。
時々、FACT表の「出荷日」をプロンプトに指定している環境を見かけますが、この場合、プロンプトに日付を並べたいだけなのに、巨大なFACT表を全行取得して、日付を取得する処理になってしまいます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a24604b2-d040-f560-52ff-a00d8382fefc.png)

また、「製品ライン」をプロンプトで使用したい場合に、そのままプロンプトウィザードで「製品ライン」をDimension表から取得しているケースも多く見られます。
この様な場合、下記のように表示する値は「製品ライン」で良いですが、使用する値に「製品ラインコード」を使用するようにしましょう。
「製品ライン」の名称より「製品ラインコード」の方が、文字数として短い事が一般的で、レポートのクエリーにフィルターをかける際に、より効率的な絞込みができます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ad30baf7-4e8c-873c-7a34-6ea46f73ba63.png)

また、プロンプトを取得するクエリーのプロパティで「Limited Local」に設定して、キャッシュを使用する事でパフォーマンスが改善される事もあります。
パフォーマンスが出ない場合は、試してみてください。

##フィルターの対象となるデータ項目
フィルターの対象となるデータアイテムの選定は、
・PK、INDEXが張られているデータアイテムを使用する
・可能であれば、ファクトテーブルのキー項目のデータアイテムに対してフィルターを作成し、Dimension表との間に不要なテーブル結合を発生させない
という事を考慮して行いましょう。
以下の図の場合、前者が「製品ラインコード」、後者が「出荷日」という事になりますね。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8397877d-9943-a951-2f12-f5a8d8a61af7.png)
macOS SierraにアップデートしたらgithubにアクセスするたびにSSHのパスワードを聞かれる

## 現象

macOS Sierraにアップデートしてから、 `push` のときも `pull` のときもgithubにアクセスするたびに、以下のようにパスワード聞かれる。

```:bash
$ ssh -T git@github.com
Enter passphrase for key '/Users/hoge/（内緒）': 
```

## 解決方法

`~/.ssh/config` の先頭に `UseKeychain yes` を記述した。

↓こんな感じ

```:~/.ssh/config
UseKeychain yes

Host github
  HostName github.com
  IdentityFile （内緒）
  User git
```

(内緒)のところは鍵が置いてあるパスです。


## 参考にした記事

- [Saving SSH keys in macOS Sierra keychain](https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain)
- [git パスワード を毎回聞かれる問題の解決方法](http://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468)
- [macOS Sierra にしたら ssh の度にパスフレーズを求められる問題の解決方法](https://www.d-wood.com/blog/2016/12/21_8704.html)
helm-find-filesで不要なファイル・ディレクトリを候補に入れないようにするには

helm-find-filesを実行すると、選択候補のファイル名一覧に、`.`と`..`が含まれるのがとてもストレス。

ググったらredditに解決方法を書いてくれている人がいました。

[How to remove 2 first dot files from helm-find-files ? ](https://www.reddit.com/r/emacs/comments/3f55nm/how_to_remove_2_first_dot_files_from_helmfindfiles/)

```elisp

(advice-add 'helm-ff-filter-candidate-one-by-one
        :around (lambda (fcn file)
                  (unless (string-match "\\(?:/\\|\\`\\)\\.\\{1,2\\}\\'" file)
                    (funcall fcn file))))
```

Macの人はstring-matchの部分に.DS_Storeとかも書くと良いと思う。

おしまい。
[Alibaba Cloud] MFA設定手順

# MFAとは
MFAとは、Multi-Factor Authenticationの略で日本語でいうと多要素認証になります。
簡単に言えば従来のIDとパスワードの認証だけでなく様々な認証を組み合わせてセキュリティ強度をあげる方式になります。
ただ認証の数が増える分だけ利便性が下がる場合もあります。

## Alibaba CloudでのMFA認証
AlibabaCloudのMFA認証は、GoogleのAuthenticatorのアプリを使って認証を行います。
GoogleのAuthenticatorは、時限的なパスワードを発行することにより漏洩・盗聴リスクに強い強度を実現してます。

### 「アカウント」→「セキュリティ設定」→「仮想MFA」を選択
<img width="1615" alt="スクリーンショット 2017-03-13 10.46.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/8d3d509b-b7de-3cd8-4343-fc3574f09c24.png">

### メール認証の設定
Alibaba Cloudでは現在(2017.3.13時点)ではメール認証のMFAのみを提供しているようです。

#### 検証コードの送信
<img width="827" alt="スクリーンショット 2017-03-13 11.08.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/dd2b6505-659c-4e21-e94e-3337b5d77f7e.png">

#### 検証コードメールの確認
以下のようなメールが登録したアドレス宛てに送付されるので記載されているコードを確認する
<img width="1030" alt="スクリーンショット 2017-03-13 11.10.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/c0aa0b9d-79b9-ae7c-80d7-a8b9bc71eff7.png">

#### 検証コードの入力
送付されたコードを先ほどの画面へ入力
<img width="769" alt="スクリーンショット 2017-03-13 11.17.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/1cb1fd2c-8a07-00e6-dd05-45a1e1df89d6.png">

#### ~~なぜかエラー。。。。~~
（解決しました。300秒以内に入力しないと無効になるようです。）
<img width="602" alt="スクリーンショット 2017-03-13 11.19.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/a7981de7-75aa-b375-04ca-6db243297945.png">


#### QRコードの画面の表示と読み込み
以下のようなQRコードが表示された画面が表示
<img width="1274" alt="スクリーンショット 2017-03-13 11.25.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/413836e0-e93c-e667-d24b-1aa908419c91.png">

#### スマートフォンにMAFアプリケーション(Google Authenticator)をインストール
[(iOS)MFAアプリ](https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8)
[(Android)MFAアプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)

MFAアプリケーション-AppSotre
<img width="375" alt="IMG_0864.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/2eb8c1aa-beae-1f40-f103-01eff2a0192e.png">


#### MFAアプリケーションの起動とQR読み込み
アプリを起動してQRコードを読み込むと以下のような時限式の認証コードが生成される
<img width="375" alt="IMG_0867.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170028/39c444ca-23d5-e433-ec66-8bc153d9bd8c.jpeg">


※時間がたつと認証コードが変わるため以降の対応はすばやく入力する必要があります。

#### 認証コードの入力
認証コード１に表示されている６桁の番号を入力
その後30秒ほどで認証コードが変わる。認証コード２に変更後の２番目のコードを入力
<img width="466" alt="スクリーンショット 2017-03-13 13.07.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/29f2fc38-2039-fbcf-14e2-8562ac63cb4b.png">

#### 先ほどの「アカウント設定」→「セキュリティ設定」で以下のようになってればMFA設定完了
<img width="1382" alt="スクリーンショット 2017-03-13 13.09.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/170028/e36e4916-fbed-878e-7da9-2507998e78eb.png">
AppCodeでSwiftLintを有効にする

`plugins`から`SwiftLint`と検索してインストールします。

今のところ1件しか引っかからないけど、コイツです。
* [bealex/SwiftLintAppCode: Provides highlighting of the SwiftLint errors in the AppCode](https://github.com/bealex/SwiftLintAppCode)

設定は`Other Settings` - `SwiftLint Configuration`から。
quick-fixを有効にするかと、.swiftlint.ymlが無い時に無効にするかの設定が行えます。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/6092/e1e15abe-3e49-4560-1d1f-35475c134ed7.png)

指摘されるとこんな感じです。

![ViewController_swift_-_ExampleForConcourse_-____ios-concourse_ExampleForConcourse_.png](https://qiita-image-store.s3.amazonaws.com/0/6092/0c820aec-a1b3-07e1-62c2-c41ccf7dbfa7.png)

quick-fixが効くのなかなか良い感じです。
paiza.ioでSQL　その３

#概要
paiza.ioでSQLやってみた。
rubyでsqlite3でやってみた。

#成果物

https://paiza.io/projects/_oal8mophECqAO_VbduBlg

#サンプルコード

```
require"sqlite3"

db = SQLite3::Database.new("test.db")
sql = "create table Item(商品コード integer primary key, 商品名 text, 価格 int)"
db.execute(sql)
puts "Itemテーブルを作成しました。"
db.transaction do
     sql = "insert into Item values(?, ?, ?)"
     db.execute(sql, 101, "メロン", 800)
     db.execute(sql, 102, "いちご", 150)
     db.execute(sql, 103, "りんご", 120)
     db.execute(sql, 104, "レモン", 200)
end
db.execute2("select * from Item") do | row |
    puts row.join("\t")
end
db.close


```
UniWebView2使い方　メモ


■Webview用アセット
https://www.assetstore.unity3d.com/jp/#!/content/32461

■できる事・体感
　・ヘッダー・フッターの間にWebView表示化可能
　・背景画像よりも手前にWebView表示化可能
　・メモリそんなに食わない感じ
　・ロードがちょっと長いようにも感じる（ページ次第？？）

## １．UniWebViewコンポーネントを追加もしくは取得する。

■ゲームオブジェクトから取得

```
var webView = ゲームオブジェクト.GetComponent<UniWebView>();
```

■無ければUniWebViewコンポーネントを追加

```
var webView = ゲームオブジェクト.AddComponent<UniWebView>();
```

## 2.指定URLのページをWebView上にロード完了時のイベントと紐づける

```
webView.OnLoadComplete += (view, success, errorMessage) => {
    if (success) {
        フラグとかメソッドを呼んで完了を知らせる;
    } else {
        エラー処理
    }
};
```

## 3.WebViewクローズイベントと紐づける

```
webView.OnWebViewShouldClose += (view) => 
{
    webView.Hide(fade, (UniWebViewTransitionEdge)transitionEdge, 0.4f, ()=>{
        クローズしたときの処理を書く
    });
    webView.HideToolBar(true);
    return false;
};
```

## 4.イベントの紐づけが完了したのでロードする。
```
_webView.Load(URL文字列);
```

## 5.ロードが完了したのでWebViewを表示する。
```
_webView.Show(fade, (UniWebViewTransitionEdge)transitionEdge, 0.4f, ()=>
{
    表示完了時の処理
});
_webView.ShowToolBar(true);

```



---

## ※キーイベント受け取り(Androidのbackボタン向け)

　■スクリプト内のコメントによると、下記backButtonEnableをTrueにすると
　　Unityの入力イベントとそれに関連するイベント系は受け取れないらしい
```
　　When set true, Unity will not receive the Input.KeyDown or other similar event in Android.
```

```
　　webView.backButtonEnable = true;
```

　　**・・・だが、イベントを紐づける時にKeycode受け取りイベントと紐づけておくと
　　backButtonEnableがTrueでも受け取れた。**

```
webView.OnReceivedKeyCode += (view, keycode) =>
{
    if(keycode == keyCodeBack)
    {
        _webView.Hide(fade, (UniWebViewTransitionEdge)transitionEdge, 0.4f, () =>
        {
            
        });
        _webView.HideToolBar(true);

    }
};

```


## サイズ指定時の注意事項

ネイティブ側は解像度ではなくポイント（iOSのboundsやframe等を参照）で設定されるので、
RetinaディスプレイであればRetinaの倍率に合わせて
下記を参照に2分の１・３分の１とした値を渡す必要がある
http://qiita.com/tomohisaota/items/f8857d01f328e34fb551


```
_webView.insets = new UniWebViewEdgeInsets(_insets.top, _insets.left, _insets.bottom, _insets.right);
```
Microsoft Graph SDK でイベントID指定でイベント取得

## 1.Microsoft Graph API
REST APIでO365などを操れたりするAPI。SDKも提供されている。
https://developer.microsoft.com/ja-jp/graph

## 2.問題
Outlookに入っている特定のイベント(予定)をイベントIDで取得しようとしたとき、HTTPリクエストURIは
https://graph.microsoft.com/v1.0/me/calendar/events/[eventId]

これをSDKを使ってC#でリクエストしようとすると、

``` csharp
var result = await graphClient.Me.Calendar.Events.Request().GetAsync();
```

・・・で、イベントIDをどう指定するかわからない。

## 3.解決

てっきりRequest()の引数オプションとかで指定するのかと数時間ハマっていたら、Githubの[サンプル](https://github.com/microsoftgraph/xamarin-csharp-meetingmanager-sample/blob/master/XamarinFormsMeetingManager/XamarinFormsMeetingManager/Helpers/CalendarHelper.cs#L48)にこう書いてあった。

``` csharp
var result = await graphClient.Me.Calendar.Events[eventId].Request().GetAsync();
```
paiza.ioでSQL　その２

#概要
paiza.ioでSQLやってみた。
python3でsqlite3でやってみた。

#成果物

https://paiza.io/projects/oaMU1stzBygh6ae0mkR8GQ

#サンプルコード

```
# coding: utf-8
import sqlite3 as sq3

conn = sq3.connect('test.db', isolation_level=None)

create_str = "create table データ (id integer, name text)"
conn.execute(create_str)

insert_str = "insert into データ values(?, ?)"
conn.executemany(insert_str, [(1, 'データ1'), (2, 'データ2')])

select_str = "select * from データ"
for val in conn.execute(select_str): 
    print(val)

update_str = "update データ set name = 'データ11' where id = 1"
conn.execute(update_str)

update_str = "update データ set name = 'データ12' where id = 2"
conn.execute(update_str)

select_str = "select * from データ"
for val in conn.execute(select_str): 
    print(val)

delete_str = "delete from データ where id = 2"
conn.execute(delete_str)

select_str = "select * from データ"
for val in conn.execute(select_str): 
    print(val)
conn.close()



```
Google Cloud Functions for Firebaseを試してみた（環境構築編）

[Google Cloud Functions](https://firebase.google.com/docs/functions/)というものがBetaで公開されました。

詳しくはこの動画で紹介されています。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/GNR9El3XWYo/0.jpg)](http://www.youtube.com/watch?v=GNR9El3XWYo)

# Google Cloud Functions for Firebaseとは？
簡単にいうと、Firebaseでできる機能（ユーザ認証、DB、ストレージの追加/変更）のイベントを基にサーバ側の処理を提供するサービスのようです。

2017/03/13現在、JavaScript(Node.js)しかつかえないようです。
基本的にCLIで管理するようで、[CLIリファレンスはこちら](https://firebase.google.com/docs/cli/)に掲載されています。

# 初期設定
前提として、Node.jsとnpmが使える必要があります。
Node.jsの環境構築は[こちら](http://qiita.com/furusin_oriver/items/4962f25e0663a4acd783)を参考にしてください。

## Firebase Tools SDKのインストール
npmでインストールします。

```lang:Terminal
$ npm install -g firebase-tools
```

色々メッセージは出ますが、エラーにならなければOKです。

## ログイン
SDKのインストールができたら、Googleアカウントでログインします。

```lang:Terminal
$ firebase login
```

## 作業ディレクトリの準備
ログインができたら、作業ディレクトリを準備します。
作業したいディレクトリ（私の場合は`/Users/furusin/workspace/nodejs/Google_Cloud_Function/GCF_test`としました）を作成し、プロジェクト ディレクトリを初期化します。

```lang:Terminal
$ cd 作業ディレクトリの場所
$ firebase init
```

`firebase init`コマンドを実行すると、必要なファイルの作成が始まります。
<img width="551" alt="スクリーンショット 2017-03-13 10.31.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/84307/e9dca64f-cd1e-31db-dda2-be089007f9e4.png">


## 処理の作成
`~/functions/index.js`に処理を書いていきます。

デフォルトではこのようになっているので、自由に記載します。

```JavaScript:index.js
var functions = require('firebase-functions');

// // Start writing Firebase Functions
// // https://firebase.google.com/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// })
```

## デプロイ
```lang:Terminal
$ firebase deploy
```

これでデプロイできます。

#　まとめ
簡単にリファレンスにあることをまとめただけですが、非常に簡単に環境が構築できました。

おそらくこれを使えば、サーバレスでRest APIが構築できそうですね。ワクワクします。

次は実際にNode.jsでAPIを立ててみようと思います。
vb.netで作ったexeが起動直後に「動作を停止しました。」と表示され終了する

vb.netで作ったプログラムが「動作を停止しました。」で終了してしまう。
原因と修正方法を調査したのでメモ

#結論
プロジェクト設定の「コンパイル」タブから詳細コンパイルオプションを開き
一番下のターゲットCPUをx86に変更して再ビルドすると動くようになった。

#原因
32bit環境で作ったものを64bit環境で動かしているかららしい。
32bit環境で Any CPU　設定にしていたのでデフォルトでも問題ないと思っていたがダメみたい。

#修正方法
１．プロジェクト設定の「コンパイル」タブから詳細コンパイルオプションを開く
![32bit設定.png](https://qiita-image-store.s3.amazonaws.com/0/143913/287aba46-2cda-49cd-f0ef-d80e7fa93a85.png)


２．一番下のターゲットCPUをx86に変更して再ビルド
![32bit設定2.png](https://qiita-image-store.s3.amazonaws.com/0/143913/488908b3-6346-725c-589f-407b737e4730.png)
Node.jsでGUIプログラムの作成＆RS-232Cとの接続



Node.jsでGUIプログラムを構築しようとして、以下のHTMLをnw.exeで起動しました。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>node-webkitを試す</title>
</head>
<body>
<script>
var fs = require('fs');
fs.readFile('package.json', function (err, data) {
if (err) throw err;
document.write(data);
});
</script>
</body>
</html>

すると、画面が表示され、package.jsonの内容が表示されます。

ここに、RS-232Cとの接続をしたいので、
var SerialPort, serialPort;
SerialPort = require("serialport");
の2行を
var fs = require('fs');
の前に挿入すると、何も表示されなくなります。

恐らく
SerialPort = require("serialport");
が失敗しているのだと思うのですが、原因が分かりません。

serialportは
npm install --save serialport
でインストールしました。

何がいけないのでしょうか？

ご教授下さい。