OmniAICreator/Qiita-1.07M huggingface dataset:
ffmpeg (API)を用いてWebカメラからキャプチャ

ほとんどの部分は[このへん](http://hasanaga.info/how-to-capture-frame-from-webcam-witg-ffmpeg-api-and-display-image-with-opencv/)に説明を加えたもの。

基本的には「Webカメラ用フォーマット」なるフォーマット指定（Mac: `-f avfoundation`、Win: `-f dshow`）ができるので、入力ファイルとしてデバイスの番号を指定（`-i "0"`とか`-i "1"`とか）して適当なファイルに書き出せばよい。

たとえばMacbookでFaceTimeカメラからmp4ファイルに書き込む場合：

```
ffmpeg -f avfoundation -framerate 25 -i "0" -target pal-vcd -vf scale=640x480 ./test.mpg
```
上のコマンドの場合、ffmpegは永遠に書き込みを続けるので、終わりたい時はCtrl-Cを押す。

Windows用のコマンドは更新予定（だけれども時期は未定）。


# Webカメラをリストアップする

## ターミナルを使用 (Mac)
WebカメラはAV Foundationなるフレームワーク経由で見えるらしい。
`-f`オプションで`avfoundation`を指定する：

```
$ ffmpeg -list_devices true -f avfoundation -i dummy
```
<img width="515" alt="mac.png" src="https://qiita-image-store.s3.amazonaws.com/0/177526/0c06d530-f699-d49c-80bb-a7c45771c35f.png">

たとえば`sed`とか使うことで、インデックスが入っているところだけ取り出すことができる：

```
ffmpeg -list_devices true -f avfoundation -i dummy 2>&1 \
| sed -n -e "/video devices/,/audio devices/s/\[AV[^]]*\] //gp" \
| sed -e "/video devices/d; /audio devices/d"
```

<img width="318" alt="mac2.png" src="https://qiita-image-store.s3.amazonaws.com/0/177526/94a06873-6b9a-0123-6c71-fb186b78e870.png">

## ターミナルを使用 (Windows)
Windowsでは、`avfoundation`ではなく`dshow` (stands for DirectShow)になるので注意。あとはほとんど同じだが、どのように出力からデータをとってくればよいのか…

参考：[ffmpeg.zeranoe.com](https://ffmpeg.zeranoe.com/forum/viewtopic.php?t=651&p=2963&hilit=enumerate)

## APIを直接使う

これもやったことない。[ここ](https://gist.github.com/amki/3210277)の丸写し：

1. 通常通り`AVFormatContext`をつくる
2. `ffmpeg`に渡すオプション`list_devices`を`AVDictionary`に渡す
3. `av_find_input_format("dshow")` (Windowsの場合)を用いてキャプチャに対応した`AVInputFormat`を取得
4.  `"video=dummy"`なるファイル名を用いて`avformat_open_input()`を呼ぶ
5.  ログは（おそらく）`av_log_set_callback()`でコールバック関数を指定することでとってくることができる。

以下も参照：
[How to enable ffmpeg logging](https://stackoverflow.com/questions/31181618/how-to-enable-the-ffmpeg-logging#31183796)


# APIからWebカメラキャプチャを起動

上の節と同様。コードは[こちらのページ](http://hasanaga.info/how-to-capture-frame-from-webcam-witg-ffmpeg-api-and-display-image-with-opencv/)のほうが詳しい。

ただし情報が最新のものなのか未確認。ffmpegは仕様がよく変わるのでわからない。

1. 通常通り`AVFormatContext`を作る。
2. 対応する`AVInputFormat`を、`av_find_input_format("dshow")`のようにしてとってくる
3. ファイル名は`"video=<device name or index>"`の形式のC文字列で指定する
4. 上記の設定を利用して`avformat_open_input()`を呼ぶ
5. あとは通常のAPI操作と同じ：
    + `AVFormatContext`オブジェクトは個々のストリームへのポインタを持っている。そのうちどれかがビデオストリームに対応している：`coder_type`メンバーが`AVMEDIA_TYPE_VIDEO`になっているかどうかでチェックできる（でよいのか？未確認） 
    + ビデオストリームに対応するデコーダを`avcodec_find_decoder()`で取得
    + ビデオフレームを取得するための`AVFrame`オブジェクトを用意して、`avpicture_fill()`でバッファと関連づける（これも未確認）
    + ストリームからデコーダに渡していくための`AVPacket`を用意する
    + あとは`AVFormatContext`オブジェクトに対して`av_read_frame()`を用いてパケットにデータを転送、`avcodec_decode_video2()`を呼んで随時`AVFrame`を自分の用途に用いていく（未確認）
    + 最後に`*_free*()`するのを忘れない
Google spreadsheetの値を取得する

Google spreadsheetから値を取得する方法について記載します。

##1.API　Keyを取得



・以下にアクセスします
<a href="https://console.developers.google.com/apis/credentials">Google Cloud Platform</a>

・GCPのアカウントを作成、もろもろ登録

・Google APIロゴの横のプロジェクト名をクリック「プロジェクトの選択」を開く

・「プロジェクトの選択」から「新しいプロジェクト」をクリックして作成する

・作成したプロジェクトを選択して開く

・「認証情報を作成」から「APIキー」を選択

・アプリケーションの制限を「なし」に設定


##2.スプレッドシートを作成

・Google drive を開く
https://drive.google.com/


・「新規」ボタンからスプレッドシートを作成する
シート名：sheet1
各セルは適当に入力

・「共有」ボタンから「リンクを知っている全員が閲覧可」を選択する

・スプレッドシートIDを確認する
スプレッドシートを開いた以下のURLの場合「1C8InaScasCtc2Bk」がスプレッドシートIDになります・

https://docs.google.com/spreadsheets/d/1C8InaScasCtc2Bk/edit#gid=0


##2.API　URLを開く

・以下のURLを元に上記で確認した内容を入力して開きます。

https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{SheetId}!{開始Cell}:{終了Cell}?key={API キー}

・JSONが開かれて、セルのが取得できていれば成功


以上
pip installがエラーになる

#pip installがエラーになる
以下のコマンドでライブラリをインストールしようとするとエラーが出力される。

**コマンド：**

```
pip install [ライブラリ名]
```

**エラー：**

```
Collecting [ライブラリー名]
  Could not fetch URL https://pypi.python.org/simple/[ライブラリ名]/: 
There was a problem confirming the ssl certificate: 
[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping
```

#解決方法
以下のコマンドでpipをアップグレードすることで解決。

```
curl https://bootstrap.pypa.io/get-pip.py | python
```
私の未来予想図  2050年

####BIT 奥多摩日本語学校

##私の2050年を表す３つのキーワード
1. フィリピンの農業
2. ファーミングロボット
3. 環境技術

##解決したいことの問題
フィリピンの現状は全部の家で22%は食べ物が足りないと言いました。
そして、農家はフィリピンで最も貧しい人の一つです。お金が少なくて、生活は大変ですから、だんだん農家が少なくなる。

これから、２０５０年に国連の見当によるとフィリピンの人口は一億六千九百万人になります。どうやってフィリピンは食糧安全保障ができますか？私の考えは技術で最初は農民に助けたいです。

##作りたいことの技術
今、Precision Agriculture という農業の技術の分野があります。この分野にAIで植物と土地の現状をモニタリングしたり、病害を予測したりすることができます。

将来にフィリピンのP.A.の技術を進みて、環境技術という地球に優しいエナルギーを使った技術を組み合わせて、ファーミングロボットを作くりたいです。

P.A.について三種のファーミングロボットを作くりたいです。

1. 収穫のロボット
    - 実りのタイミングを分析する
    - 作物を取り入れることができる
    - ロボットは農民の労働を手伝うことができる

2. 化学者のロボット
    - 土地と植物の健康をモニタリングすることができる
    - 水と肥料が必要時、ロボットが植物は水をあげて、肥料を入れることができる
    - システムで掛かった水や肥料やエネルギーなどを管理することができる
    - もし、土地と植物の病気があったら、分析して、農家に報告して、救急をやることができる


3. フィンテックのロボット
    - AIでキャッシュフローを記録する
    - お客様の注文を整理する
    - お金の管理を手伝うことができます

*全部のロボットは再生可能エネルギーとくにソーラーを使る。*

##未来予想図のイメージ
[未来予想図のビデオ](https://youtu.be/SE0QYMXF-1k)
[Kaggle]画像で遊んでみる(dogs vs cats)

[前回](https://qiita.com/ryo_naka/items/26c9d63d07caf9990ce6)までは属性に対しての解析だったので今度は画像を分類わけしてみることにした。

といっても、右も左もわからない状態がどうやって進んだのか？という参考になればという程度のメモである。

# 犬猫
試してみたのはこっちのコンペのデータ
https://www.kaggle.com/c/dogs-vs-cats

犬か猫かを分類しようぜというやつだ。

# データ確認
DLしながらデータセットの中身を確認


>The training archive contains 25,000 images of dogs and cats. Train your algorithm on these files and predict the labels for test1.zip (1 = dog, 0 = cat).

といっても、データを確認するも何もない。
画像を犬(1)か猫(0)に分類しろってだけな模様。


## どこから手を付ければよい？

が、とっかかかりがさっぱりわからない。
画像を認識しようと思ったら、Kerasを使うのが一般的なのか？


## とりあえずググってみた

いくつかググってみた現時点の自分にわかりやすかったのが以下
https://qiita.com/wtnb93/items/65633bcbe2942b440128
http://blog.asial.co.jp/1502


雰囲気としては、
対象となる画像のサイズを合わせ、
それをベクトルにして読み込む
といった感じか。


## とりあえずやってみる

こんな感じでファイルを読み込んでデータセットを作成

    def get_data_and_label(image_path):
        labels = []
        datas = []
        files = []
        for path in os.listdir(image_path):
            if 'dog' in path:
                labels.append(1)
            else:
                labels.append(0)

            feature = data.imread(f'{image_path}/{path}')
            feature = transform.resize(feature, (100, 100), mode='reflect')    
            datas.append(convert_image(feature))
            files.append(path)
        return datas, labels,files

RGBの画像を一次元にする処理はこんな感じ

    def convert_image(img):
        dim = img.shape[0] * img.shape[1] * img.shape[2]
        img_vector = img.reshape(1, dim)
        return img_vector[0]

あとは前回作成していた各モデルの生成処理に食わせてあげればなんとなくできそう。

いきなり全部やるのは無理な話だと思ったので100枚ずつでやってみた。


結果
<img width="66" alt="2018-09-30_20h24_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/8911a6c9-f6ef-9ab1-4829-7c10e2a6cb22.png">

なんとなくできてる感はある。
※実際はファイルの番号(IDに対応)とデータのソート順が合ってなくてできてなかったのだが。。

本当はグリッドサーチだったりいくつかの手法で試してみたかったのだが、あほみたいに時間がかかりそうだったので、適当なパラメータでPerceptronとRandom Forestだけで試してみることにした。

あと、何回もモデル作成を試せないので以下を作って、一回作ったモデルを保存できるようにした。

    def save_model(model):
        from sklearn.externals import joblib
        filename = 'finalized_model.sav'
        joblib.dump(model, filename)


## 全部でやってみる

全部読み込ませてやってみたら、データ読み込みだけで20分ぐらい

<img width="320" alt="2018-09-30_18h15_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/03dec6a1-8fce-d5ce-5ee3-51aa0fd0ac77.png">

これいつ終わるんだ・・・

<img width="506" alt="2018-09-30_19h58_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/ad3e2d0c-8bca-db92-876d-dc42483247e5.png">

Random Forestは意外に早く終わった。

## とりあえずできあがり？
で、できあがったのでSubmitしてみようかと思ったのだが、このコンペはオープンではなかったので投稿できなかった。
通りでサンプルと試しているのが全く見当たらないわけだ。

https://www.kaggle.com/c/digit-recognizer
こっちでやってみるべきだったのかもしれない。

## なんとなくわかったこと
なんとなくのやり方はわかったような気がする。
・画像を読み込み一枚ずつ1次元のベクトルにする
・それに対するラベルをつける
・モデルを作成する
・推定させる

ただこれだと特徴量もくそもない気がするのだが、どうするんだろう？
単純にTrainデータを増やすのか？


あとから気が付いたが、せっかく作ったモデルで何もためしてないや。
CSVデータをDBに入れてみる

# この記事について
拾ってきたCSVデータをDBに保存してみます。
使用するデータは[気象庁](http://www.data.jma.go.jp/gmd/risk/obsdl/index.php)で公開されている過去一年分のモノを使用します。

# 関連記事
[python3でDBにデータを保存する（with PostgreSQL and psycopg2）](https://qiita.com/yokotate/items/cec2dfcdfe88e37b82dd)

# データ用意
今回使用する気象庁のデータを貰ってきましょう。
[ココ](http://www.data.jma.go.jp/gmd/risk/obsdl/index.php)のページを開いてCSVファイルをダウンロードしてください。
私は東京・日別・日平均気温・過去一年間のデータを取得してきました。

とりあえずCSVを開いてみるとヘッダー行が5行ほどあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/0ffeb61a-7fc1-f4d7-d7d6-af6b7de015d8.png)
邪魔なので削除しました。

# 保存用のDBを用意
今回はCSVのデータをDBに保存するまでを行いますので、テーブルも用意しておきます。
テスト用のモノなので簡単なものでよいでしょう。

```sql:create_table.sql
CREATE TABLE KIONDATA(
    HIDUKE DATE,
    KION numeric(3,1)
)
```

# ソースコード
では、CSVからデータを取り出して、それをDBに保存していきます。
試しに一行ずつ取り出して出力してみましょう。

```python:getcsvdata.py
import csv
with open('csv/data.csv', newline='') as csvfile:
    read = csv.reader(csvfile)
    for row in read:
        print(row)
```

```text:Result
['2018/9/14', '21.9', '8', '1']
['2018/9/15', '20.5', '8', '1']
['2018/9/16', '23.1', '8', '1']
.
.
.
（以下略）
```
という感じに出力できたと思います。
あとは簡単ですね、print(row)の部分をINSERT文に変更してあげるだけでDBに保存することができます。

[過去の記事](https://qiita.com/yokotate/items/cec2dfcdfe88e37b82dd)を参考にしていただければ実装できるかとは思いますが、一応私が書いたものを載せておきます。

```python:getcsvdata.py
import csv
import psycopg2

path = "localhost"
port = "5432"
dbname = "test"
user = "postgres"
password = "password"

conText = "host={} port={} dbname={} user={} password={}"
conText = conText.format(path,port,dbname,user,password)
connection = psycopg2.connect(conText)
connection.get_backend_pid()
cur = connection.cursor()

with open('csv/data.csv', newline='') as csvfile:
    read = csv.reader(csvfile)
    for row in read:
        sql = "INSERT INTO KIONDATA VALUES('{}',{})"
        sql = sql.format(str(row[0]).replace("/","-"),row[1])
        cur.execute(sql)
        connection.commit()

cur.close()
connection.close()
```

formatの部分でreplaceを使用して置換していますが、CSVデータが「/」で区切られているのに対してPostgreSQL側が「-」で区切っていたためです。
前半部分でヘッダー部分を削除しましたが、実はnext(read)と記述すれば一行飛ばすことができます。
ですがさすがに

```python:getcsvdata.py
next(read)
next(read)
next(read)
next(read)
```
と書くのはダサすぎたので削除いたしました。

これにて終了です。
ありがとうございました。
CMakeでOpenMPアプリケーション開発

# この記事について
CMakeを使って、OpenMPアプリケーション開発用プロジェクトを作ります。WindowsとLinuxの両方でビルドできるようにします。

- CMakeを使うことのメリット
	- マルチプラットフォーム対応
	- インクルードパスやライブラリ設定を自動化できる
	- (特に、GitHub等で他の人に渡すときに便利)

## 環境
- Windows10 64-bit
	- Visual Studio 2017 Community
- Ubuntu 16.04 on VirtualBox on Windows 10


## 対象とするプログラム
以下のように、4スレッドでfor文を回すOpenMPのサンプルコードをビルドするプロジェクトを作ります。

```c:main.cpp
#include <stdio.h>
#include <omp.h>

int main()
{
	omp_set_num_threads(4);
	#pragma omp parallel for
	for (int i = 0; i < 20; i++) {
		printf("%d / %d\n", omp_get_thread_num(), omp_get_num_threads());
	}

	return 0;
}
```

# OpenMPの準備
Windows10(VS)、Linux(Ubuntu 16.04)共に、特別な設定やインストールは不要です。素の状態でOpenMPを使えます。



# プロジェクトの作成
```txt
└─TestOpenCV
    │  CMakeLists.txt
    │  main.cpp
```

```txt:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(MyOpenMPProject)

# Create Main project
set(SOURCES
	main.cpp
)

set(HEADERS
	# main.h
)

add_executable(Main
	${SOURCES}
	${HEADERS}
)

# For OpenMP
find_package(OpenMP REQUIRED)
if(OpenMP_FOUND)
	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
```

OpenMPをfind_packageして、必要なCFLAGSを追加しているだけです。
includeパス設定やライブラリリンク設定は不要でした。
単体テストで開始時にモックサーバを起動し、終了時に停止する: その 2

## やりたい事
前回の、[単体テストで開始時にモックサーバを起動し、終了時に停止する - Qiita](https://qiita.com/aoisakura/items/4d25df1e93c345f873af) では json-server をライブラリとして使ってサーバを起動・終了する手順を書きました。
json-server はコマンドラインからの実行もできるので、そちらを利用した書き方です。

前回の記事は、mocha 単体では実行できたのですが mocha-webpack を使った時に、うまく動かなかったので、そういう場合の回避策として調べました。

## どうやるか
child_process.spawn を使ってコマンドを (background で) 起動し、標準出力への出力内容から起動したかどうかを確認します。
終了は、起動時の PID を記録しておき、それを kill することで実現します。

## 実装例

```js
import * as child_process from "child_process";
import assert from "power-assert";
import http from "http";

describe('load with stub', function() {
    this.timeout(100000);
    let child;
    before(() => {
        return new Promise((resolve) => {
            child = child_process.spawn(
                "/home/example/server_test/node_modules/.bin/json-server",
                ["test_sample.json"],
                {detached: true, stdio: ['ignore', 'pipe', 'ignore']});
            child.stdout.on('data', (data) => {
                //console.log("before(): " + data.toString());
                if (data.toString().indexOf("Type s + enter at any time to create a snapshot of the database") >= 0) {
                    resolve();
                }
            });
        });
    });
    after(() => {
        // 起動した json-server を kill
        child_process.execFile("/bin/kill", [child.pid]);
    });

    it("test 1", (done) => {
       http.get("http://localhost:3000/tasks", (res) => {
          let body = '';
          res.setEncoding('utf-8');
          res.on('data', (chunk) => {
              body += chunk;
          });
          res.on('end', (res) => {
              res = JSON.parse(body);
              assert(res[0].description == 'first context');
              assert(res[1].description == 'second text');
              done();
          });
       }); 
    });
});
```

json-server はコマンドラインから起動すると、最後に "Type s + enter at any time to create a snapshot of the database" という文字列を出すのでそれが出ているかどうかで判定しています。
kill の方が execFile になっているのは深い理由はありません、こちらも spawn 使っても実装できます。
MacにApache Tomcatをインストールする方法

#1. Tomcat(9)をダウンロード

1. 以下のTomcatのサイトにアクセス

####http://tomcat.apache.org/

<img width="1674" alt="Screen Shot 2018-10-01 at 21.38.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/c24b6d0d-44de-9bee-31ea-36a51346972d.png">

2. 画面左の「Download」からインストールしたいバージョンのリンクをクリック


<img width="1674" alt="Screen Shot 2018-10-01 at 21.50.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/c007ecd5-5044-f48d-2bea-fd17c9e6bbd5.png">

3. Coreにある「tar.gz」　を押下し、ダウンロードする。



#2. Tomcatのダウンロードファイルを解凍し、任意の場所にコピー
<img width="882" alt="Screen Shot 2018-10-01 at 22.03.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/2c4da2d1-1c69-4888-15d9-5902d022be5c.png">



#3. パーミッションの変更

###bin配下に移動し、startup.shなどに実行権限を付与します。

```shell:Terminal
$ cd /users/username/java_development/apache-tomcat-9.0.12/bin/
$ chmod 755 *.sh
```


#5. Tomcatを起動

以下のコマンドを入力する

```shell:Terminal
$ ./startup.sh
Using CATALINA_BASE:   /users/rick/java_development/apache-tomcat-9.0.12
Using CATALINA_HOME:   /users/rick/java_development/apache-tomcat-9.0.12
Using CATALINA_TMPDIR: /users/rick/java_development/apache-tomcat-9.0.12/temp
Using JRE_HOME:        /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
Using CLASSPATH:       /users/rick/java_development/apache-tomcat-9.0.12/bin/bootstrap.jar:/users/rick/java_development/apache-tomcat-9.0.12/bin/tomcat-juli.jar
Tomcat started.
```

###ブラウザで、http://localhost:8080 とURLを入力してみると、次のようなTomcatのデフォルトページが表示されるはずです。

###以下のような画面が表示されれば成功です。

<img width="1674" alt="Screen Shot 2018-10-01 at 21.50.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/277948/cdaddea1-7aff-feb0-c309-ac0b172a4062.png">

###以上
BQコマンドを使って既存テーブルのスキーマをベースに新しいテーブルを作る




### 1. パクりたいテーブルからスキーマ情報をぶっこ抜く
```shell
bq show --project_id=プロジェクトID --schema --format=prettyjson データセット.テーブル名 > ファイル名.json

```
※デフォルトのプロジェクトを使う場合は--project_idの設定は不要

### 2. テーブルを作る
```shell
bq --project_id=プロジェクトID mk --schema ファイル名.json -t データセット.新しいテーブル名
```
※デフォルトのプロジェクトを使う場合は--project_idの設定は不要
チェックボックスのOn/OffでList.jsのレコードの表示・非表示を切り替える

久しぶりにList.js

#困ったこと
List.jsを調べたけど、チェックボックスで特定のデータを非表示にするサンプルが見当たりませんでした。filter関数（メソッド）を使い方のサンプルをつくりました。チェックボックスでもラジオボタンでも同じことができます。

#使ったもの
List.js　(v1.5)
jQuery

#ソース

```html
<label for="hide_zero">
    <input type="checkbox" id="hide_zero"> 両方ゼロを非表示
</label>
<br>
表示数：<span class="badge">-</span>

<div id="users">
  <table>
    <thead>
      <tr>
        <th class="sort" data-sort="name">Name</th>
        <th class="sort" data-sort="num1">Num1</th>
        <th class="sort" data-sort="num2">Num2</th>
      </tr>
    </thead>

    <tbody class="list">
      <tr>
        <td class="name">A</td>
        <td class="num1">0</td>
        <td class="num2">0</td>
      </tr>
      <tr>
        <td class="name">B</td>
        <td class="num1">0</td>
        <td class="num2">1</td>
      </tr>
      <tr>
        <td class="name">C</td>
        <td class="num1">1</td>
        <td class="num2">0</td>
      </tr>
      <tr>
        <td class="name">D</td>
        <td class="num1">1</td>
        <td class="num2">1</td>
      </tr>
    </tbody>
  </table>
</div>
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/list.js/1.5.0/list.min.js"></script>
<script
  src="https://code.jquery.com/jquery-3.3.1.min.js"
  integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
  crossorigin="anonymous"></script>

<script>
  //いつも通りListJSのインスタンスを作成
  var options = {
    valueNames: [ 'name', 'num1','num2' ],
  };
  var userList = new List('users', options);

  //jQueryでチェックボックスにイベントハンドラを登録
  //clickされると、ListJSのfilterメソッドを実行する
  $('#hide_zero').on('click', function(){
    console.log('click');
    if( $('#hide_zero').is(':checked')){
      userList.filter(
        //item変数にListの全てが順番に渡される。表示したいときにtrue返す。
        function(item){
          if( item.values()['num1']==0 && item.values()['num2']==0){
            return false;
          }else{
            return true;
          }
          //return item.values()['num']!=0 || item.values()['num2']!=0;
        }
      );
    }else{
      //全部表示する
      userList.filter();
    }
  });

  //filterが終わったら呼び出されるListJSのメソッド。リストの中で表示状態の件数を取得
  userList.on('filterComplete', function(a){
    $("span.badge").html(a.matchingItems.length);
  });

  //初回起動で全件表示＝表示件数を出すため
  userList.filter();
</script>
  
<style>
/* style for sort */
  .sort.desc:after {
    content:"▼";
  }
  .sort.asc:after {
    content:"▲";
  }
</style>

```

#解説
ListJSのfilterメソッドを呼ぶときに、表示・非表示の判定関数を渡してあげるだけです。指定した関数の第一引数にListの内容が1つずつ渡されてくるので、表示したいときはTrue、表示しないときはfalseを返すだけです。
item変数から値を取り出したいときは、```item.values()```を使って取り出します。```_values```変数を直接触っても同じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/168315/d17fe8c9-211d-1845-5fa7-f20749ca1182.png)


http://listjs.com/api/#filter
正準相関分析（多変量解析入門Ⅰ　河田至商先生）

```{r}
#正準相関分析

#平均と分散がわかっているものとする
ave_sd=data.frame(variables=c("x1","x2","x3","x4"),ave=c(166.8,90.4,56.1,84.5),sd=c(5.17,2.97,5.7,3.88))

#共分散関数がわかっているものとする
cov_mat=matrix(c(26.76,11.67,16.91,6.38,11.67,8.81,10.57,4.69,16.91,10.57,32.45,17.39,6.38,4.69,17.39,15.07),nrow=4,ncol=4)

#同じく相関もわかっているものとする
cor_mat=matrix(c(1,0.76,0.57,0.32,0.76,1,0.62,0.41,0.57,0.62,1,0.79,0.32,0.41,0.79,1),nrow=4,ncol=4)

#x1,x2とx3,x4の特徴量をもとに相関を最大にする線形方程式の係数を決定する

#a1*x1+a2*x2とa3*x3+a4*x4のa1,a2,a3,a4のことである

sigma11=cov_mat[1:2,1:2]

sigma12=cov_mat[1:2,3:4]

sigma21=cov_mat[3:4,1:2]

sigma22=cov_mat[3:4,3:4]

lambda=sqrt(eigen(solve(sigma11)%*%sigma12%*%solve(sigma22)%*%sigma21)$values)

a=eigen(solve(sigma11)%*%sigma12%*%solve(sigma22)%*%sigma21)$vectors

#最適な係数を計算した場合の最大相関値

lambda1=lambda[1]

#係数が正しいかどうかの確認

(solve(sigma11)%*%sigma12%*%solve(sigma22)%*%sigma21-(lambda1^2)*diag(1,2))%*%a[,1]

#x1,x2の最適な係数

a1=as.vector(a[,1]/sqrt(t(a[,1])%*%sigma11%*%a[,1]))



t(a1)%*%sigma11%*%a1

#x3,x4の最適な係数

b1=(1/lambda1)*solve(sigma22)%*%sigma21%*%a1


```
Google Maps APIのスクリプトタグのURLだけ変更してOpenStreetMapの地図を表示する

# 差し替え方法
Google Maps APIのスクリプトタグ1行を[Tablacus Maps API](https://github.com/tablacus/tablacusmapsapi)のURLに置き換えると[Leaflet](https://leafletjs.com/)を使って[OpenStreetMap](https://openstreetmap.jp/)の地図を表示します。

```html:Google&nbsp;Maps&nbsp;API
<script async defer src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"></script>
```
上記の場合は以下の様に書き換えます。

```html:Tablacus&nbsp;Maps&nbsp;API
<script async defer src="https://unpkg.com/tablacusmapsapi/tablacusmapsapi.js?alias=google&callback=initMap"></script>
```
1. 先頭の「http」から「?」までを「https://unpkg.com/tablacusmapsapi/tablacusmapsapi.js? 」に置き換え
2. 「key=YOUR_API_KEY」を「alias=google」に置き換え
3.  その他の部分はそのままコピーします。上記の例では「callback=initMap」

# この方法のメリット
* Google Maps APIの地図を簡単にOpenStreetMapに切り替えることができる。
* タグ1行を元に戻すだけでGoogle Maps APIに戻すことができる。

# サンプルページ
[Tablacus Maps API](https://tablacus.github.io/maps/)

# ソース(GitHub)
[Yet another Maps API with leaflet (OpenStreetMap)](https://github.com/tablacus/tablacusmapsapi)
Chrome拡張「vimium」

Chromeの操作をvimっぽくするための拡張プラグインです。
結構vimってます。
※ただし非対応なwebページもあるのでマウス操作が皆無になるかと思うとそうでもありません。

## インストール方法
https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb

上記サイトへアクセスしインストールするのみ

## 使い方

| Command    | Description |
|:-----------|:------------|
|?           |使い方を説明してくれる    |
|h           |左へスクロール            |
|j           |下へスクロール            |
|k           |上へスクロール            |
|l           |右へスクロール            |
|gg          |一番上へスクロール        |
|G           |一眼下へスクロール        |
|d           |半ページ下へスクロール    |
|u           |半ページ上へスクロール    |
|f           |現在のタブでリンクを開く  |
|F           |新しいタブでリンクを開く  |
|r           |更新                      |
|gs          |view sourceを表示         |
|yy          |URLをコピーする           |
|yf          |リンク作のURLをコピーする |
|/           |ファイル内検索           |

## カスタム ショートカットキーを追加できます。

chromeの右上にvimiumボタンのoptionsをクリックする
個人的には左右スクロールは不要なのでブラウザの戻る/進むボタンを割り当て
あとはタブキーもShift + H とShift + Lで移動できるように設定します。

```
# 戻る
map h goBack
# 進む
map l goForward
# タブ移動
map H previousTab
map L nextTab
```

## 特定のサイトでVimiumを止める方法

Vimiumを利用していると、特定のサイトのみ利用を停止したい場合があります。
その場合は、Vimium Optionsの「Excluded URLs and keys」に以下の形でURLを追加すればOKです。

## 感想
ありとあらゆる操作がキーボード1つで出来るようになります。
しかも詳細なカスタマイズが可能です。

単純なネット閲覧ではマウスやChromeデフォルトのショートカットと大差ありませんが、
色々なページを頻繁に行き来するハードなネットサーフィンをする場合は大きな差が出ます。

手放すことのできない機能になることは間違い無いですね。
問答無用でプロセス(Chromeとか)を殺すバッチファイル

# 問答無用でプロセス(Chromeとか)を殺すバッチファイル

読んで字のごとく。
電源ボタンでPCの電源を落とすような暴挙だけど、
普通に×押すと支給されているPCが貧弱なので1分くらいプロセスが残り続けるので
一時期使ってたバッチファイル。

例) chrome_kill.bat

```
W:\>taskkill /im chrome.exe /f
```

# 余談
昔会社から支給されてたPCが貧弱すぎて、
不必要なプロセスをちょっとでも削ってメモリを確保してました。
この際には、タスクマネージャーから
Admin権限無しでKillできる自分のプロセスを確認するのが一番ですが

```
W:\>tasklist /V
イメージ名                     PID セッション名     セッション# メモリ使用量 状態            ユーザー名                                             CPU 時間 ウィンドウ タイトル
========================= ======== ================ =========== ============ =============== ================================================== ============ ========================================================================
System Idle Process              0 Services                   0         24 K Unknown         NT AUTHORITY\SYSTEM                                     9:30:00 N/A
System                           4 Services                   0      1,104 K Unknown         N/A                                                     0:15:00 N/A
process.exe                   9999 Console                    1     99,999 K Unknown         username                                                0:00:01 N/A
...
```
Rubyの基本記述の仕方〜その4〜 繰り返しメソッドとスコープ

- 繰り返しメソッド(each)
-

配列などの形で複数の値を持った変数に対して、
同一の処理を繰り返し行う為の記法です。

```ruby.qiita.rb
変数名(複数形).each do |変数名（単数形）|


players = ["イチロー", "ジロー", "サブロー"]
＜例＞
players.each do |player|
puts pleyer + "さん"
end
```
上の＜例＞では、３つの値をまとめたprayersの変数にたいして後ろに「さん」を付けて出力する処理を繰り返します。
処理の記述が完了したら、必ず「end」で閉じます。

```ruby.qiita.rb
puts players[0]+"さん"
puts players[1]+"さん"
puts players[2]+"さん"
```
と同じ処理を複数回書かずに済ませることができます。
例では、３回だけの繰り返しでしたが、100回、２００回を繰り返しが必要な場合もeach文の記法を使うことで３行で表現できます。


- スコープ
-
「each〜endまでの範囲」をスコープと呼びます。
繰り返しの対象となるかならないかの重要な境目です。

```ruby.qiita.rb
players = ["イチロー", "ジロー", "サブロー"]
＜例＞
players.each do |player|
puts pleyer + "さん"
end
```
players = 〜の定義の記述はeachメソッドのスコープ外です。
繰り返しの機能を呼び出す前に処理されるため、繰り返されません。
また、「end」で閉じた行より下に書かれた記述も繰り返し処理として読まれる行は[end」までなので
繰り返しの処理が終わったあとにコードが読み込まれ、1度しか処理されません。

puts pleyer + "さん"の記述のみスコープの中に記述されているので、
ここの処理だけが繰り返し処理されます。


「endの閉じ忘れ」があったりすると、本来繰り返す必要のない、繰り返してほしくない範囲まで
スコープの対象となってしまったり、そもそも「each〜end」の書き方が成立しないケースではSyntax errorが返ってきます。
コードを読んでいる時にeach文を見かけたら、endを必ず探してスコープの範囲を確認しましょう。

今日はこのあたりで失礼します。
Permission denied (publickey) on Travis.CI

はい。タイトルで察した方もおられると思います。やっていきましょう。

Travis.CIは最初に`git clone --recursive`でレポジトリをクローンするため、submoduleがすべて自動的にクローンされていきます。ただ、ここでgitのデータ転送プロトコルとしてsshを使用していると、秘密鍵はレポジトリに置かれていないのでログインに失敗し、結果クローンが失敗します。そしてバッジが赤くなります。

これを何とかする方法として、そもそも常に`https`を使えばいいんじゃないのという話なんですが、既に`git@...`でsubmoduleを登録してしまっているし、CIのことはCIでしたいので、`travis.yml`上で解決しましょう。

早速ですが解決方法です。以下の`travis.yml`を見て下さい。

https://gist.github.com/petrbel/c3bf7e0f59c22a52f534

この方は何をしているかというと、まずTravisが`git clone --recursive`しないようにします。

```yml
# disable the default submodule logic
git:
    submodules: false
```

続いて、力技で`.gitmodules`に書かれている全ての`git@github.com:`を`https://github.com/`に書き換え、その後手動で`git submodule update --init --recursive`するというわけです。

```yml
before_install:
  - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
  - git submodule update --init --recursive
```

さて、これで解決、といきたいところですが、OS Xだとこれは動きません。OS Xでだけ、`sed: 1: ".gitmodules": invalid command code .`というエラーが出ます。

LinuxはLinuxですが、OS XはUnix系列なのでこの辺のコマンドの使い方がほんの少しだけ違うことがあり、発狂することがあります。

何がなんだかわからないですが、とりあえず`sed`のマニュアルを見ましょう。OS Xで。手元にない方のために付け加えておくと、BSDもUnix系列であり、OS XはBSD版の`sed`を提供しているので、例えばこれ（https://www.freebsd.org/cgi/man.cgi?query=sed&sektion=&n=1 ）とほぼ同じであることが期待されます。

```
     -i extension
             Edit files in-place, saving backups with the specified extension.  If a zero-length extension is given, no backup will be saved.  It is not recommended to
             give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
```

`-i`オプションはファイルをその場(in-place)で変更します。なので元のファイルは消えてしまいます。これは怖い操作なので、`sed`はバックアップファイルを作ってあげたいと思ってくれています。さらにありがたいことに、バックアップファイルの拡張子を選ばせてくれます。`-i ".bak"`のようにすれば、`file.bak`にバックアップが作られるというわけです。ありがたいことです。

ところで、先のコマンドに戻りましょう。

```sh
sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
```

まず、`sed`は`-i`オプションを見て、続く文字列（`'s/git@github.com:/https:\/\/github.com\//'`）がバックアップファイルの拡張子だと解釈します。ということは、`sed`コマンドは`.gitmodules`のはずです。おや、`.gitmodules`は有効な`sed`コマンドではないですね。というわけでエラーを伝えましょう。

```console
sed: 1: ".gitmodules": invalid command code .
```

はい。

解決策は、適当な拡張子を`sed -i ".bak"`のようにして渡すか、もう空文字列`""`にしてしまうことでしょう。空文字列を設定した場合、`sed`はバックアップファイルを作りません。

なので、`"${TRAVIS_OS_NAME}" == "linux"`なら`sed -i 's/...' .gitmodules`を、"osx"なら`sed -i "" 's/...' .gitmodules`を実行すれば解決です。お疲れ様でした。
AWS サポート

##1.AWSサポートプラン##

4つのプランがあります。

- ベーシック
- 開発者
- ビジネス
- エンタープライズ

詳細は↓のサイトを確認してみましょう。
[AWS サポートのプラン比較] (https://aws.amazon.com/jp/premiumsupport/compare-plans/)

＊本番環境を運用する場合は即時対応を求められます、エンタープライズは見ておきましょう。

- 15分の応答時間
- 電話、チャット、メール（24時間年中無休）
- 専任のテクニカルアカウントマネージャー(TAM)の専門的なアドバイスができる。
　など。



##2.AWS Trusted Advisor##
AWS 環境を最適化することで、コスト削減、パフォーマンスの向上、セキュリティの向上を高める機会がないかチェックするオンラインリソースです。

[AWS Trusted Advisor](https://qiita.com/leomaro7/items/69ce216c754491117812)



##3.ヘルスチェックのサポート##
ヘルスチェックのサポートは Amazon EC2 コンソールに表示されたステータスチェックのいくつかをモニタリングします。
これらの 1 つがチェックに合格しないときには、すべてのお客様に、緊急度が高い技術サポートのケースをオープンするオプションがあります。
ヘルスチェックのサポートは Amazon EC2 と Amazon EBS の特定のチェックをカバーしています。
EC2 システムステータスチェックが 20 分以上できない場合は、AWS のお客様がケースをオープンできるボタンが表示されます。

3 つのヘルスチェックのシナリオをカバーしています。

- EC2 システムステータス（インスタンスステータスチェックは対象としていません。）
- 無効になった I/O の EBS
- アタッチ中のまま変化しない EBS



##4.AWS Support API##
説明しにくいので、↓で。
[【AWS発表】 AWSサポートもプログラマブルに! AWS Support API リリース!](https://aws.typepad.com/aws_japan/2013/05/the-new-aws-support-api.html)



##5.インフラストラクチャイベント管理（IEM）##
AWS サポート による短期間のサービスです。



##6.テクニカルアカウントマネージャー##
専任担当者が提言およびガイダンスを提供し、ベストプラクティスに沿ったソリューションの計画と構築、およびお客様の AWS 運用環境を正常に保つようお手伝いします。



##7.ホワイトグローブケースルーティング##
「エンタープライズ」レベルのお客様から提出されたケースは、緊急性の高い問題を迅速かつ正確に解決するために、AWS 内の関連部署が密に連携し注意深く問題対応を実施いたします。 



##8.管理ビジネス評価##
テクニカルアカウントマネージャー（TAM） は、お客様のインフラストラクチャのパフォーマンスの計画、実行、評価を支援します。TAM は、定期的なパフォーマンスレビューを実施し、会議に参加します（要請された場合）



##9.サポートコンシェルジュ##
お客様とお客様のアカウントによく通じた専任シニアカスタマーサービスプロフェッショナルが、お客様からの請求、アカウントに関するお問い合わせに迅速かつ効率的に回答します。
コンシェルジュは技術的なこと以外で、課金およびアカウントレベルのすべての質問に対処します。



##10.AWSプロフェッショナルサービスとAWSパートナーネットワーク##

**AWSプロフェッショナルサービス**
AWSクラウドを使用して期待するビジネス上の成果を実現するようお客様をサポートできる、専門家からなるグローバルチームです。

**AWSパートナーネットワーク**
AWSの世界的なパートナープログラムです。ビジネス、技術、マーケティング、および販売促進をサポートすることで、APN パートナーが AWS ベースのビジネスやソリューションの構築に成功するよう支援することに重点を置いています。
Proxy環境下のためのDockerの設定

Proxy環境下で作業していると、何か知らないけどハマったり、余計な設定をしなければなりません。
Dockerを使用する際にもProxyがあるだけで手間が増えますし、コンテナを作成する度にProxy用の設定をするのは疲れます。
なので、それを解消するための設定を書きたいと思います。

# Environment
- Ubuntu 16.04.5 LTS
- Docker 18.06.1-ce

# Configuration
## daemon用のproxy設定

docker-hubからimageをダウンロードする際に必要になるProxyの設定が必要になります。
これは、docker-daemonをsystemd上で動作させている場合には必須です。

```
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ echo -e "[Service]\nEnvironment=\"HTTP_PROXY=http://your.proxy.url:port/\"" | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://your.proxy.url:port/"

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

## container用のproxy設定

containerを作成するごとにproxyの設定をするのは面倒なので、一度設定ファイルを書くことでそれを解消します。
docker-composeとかを使用すればいいのですが・・・

```
$ mkdir ~/.docker
$ vi ~/.docker/config.json

{
    "proxies":
    {
        "default":
        {
            "httpProxy": "http://your.proxy.url:port"
        }
    }
}
```

このように記述することで、コンテナ内の環境変数`HTTP_PROXY`にproxyのURLがセットされます。

### DNSの設定(おまけ)

ProxyをFQDNで書いた場合、それを名前解決できるDNSサーバを指定する必要があります。
これも、コンテナごとに設定しなくてもいいようにすることができます。

```
$ vi /etc/docker/daemon.json

{
    "dns": ["xxx.xxx.xxx.xxx."]
}

$ sudo systemctl restart docker
```

これでproxyを名前解決できるようになります。
DNSサーバを２つ以上指定したい場合は、コンマで区切ればOKです。

# Reference
- [Control Docker with systemd](https://docs.docker.com/config/daemon/systemd/#httphttps-proxy)
- [Configure Docker to use a proxy server](https://docs.docker.com/network/proxy/)
iOSローカル通知実装

下記でローカル通知が可能

```

import UIKit
import UserNotifications
...
        let content = UNMutableNotificationContent()
        content.title = "Notification Title(BG)"
        content.subtitle = "Notification Subtitile(BG)"
        content.body = "Notification Body"
//        content.body = myLabel.text!
        content.badge = 5
        content.sound = UNNotificationSound.default
        
        if let path = Bundle.main.path(forResource: "DL", ofType: "jpeg") {
            content.attachments = [try! UNNotificationAttachment(identifier: "renchon", url: URL(fileURLWithPath: path), options: nil)]
        }
        
        let interval_time : TimeInterval = 10   //sec
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: interval_time, repeats: false)
        let request = UNNotificationRequest(identifier: "later", content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

```
WebStorm のテスト開発を Live Template でちゃっちゃか書く

Jest でテストを書いているのですが、テストはこまごまコーディングする文字量が多いですよね。パターンは同じなのに。面倒だ。

そんなあなたに WebStorm の Live Template 機能です。

Live template 機能は、平たく言えば emmet の HTML, CSS 「以外」バージョンです。例えばテストファイルの中で、it と書いてから tab を押せば、以下のようなコードが展開されます。あとはテストの内容を書くだけですね。

```js
it('should', function () {
  
})
```

他にも descr + tab で

```js
describe('', function () {
  
})
```

すごい便利なのですが、今や function は () => に、それから it の中ではだいたい async/await を書くことが多いので、これもテンプレートに入れたいと思います。

設定を変更しましょう。

### Live Template の変更

設定から Live Templates を検索して、JavaScript Testing の項目を開きます。
すると、it と descr がありますね。この内容を修正します。

<img width="664" alt="Screen Shot 2018-10-01 at 7.15.50 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/240885/ca30fbc7-4478-b6ee-30bd-7726b52fb405.png">


こんな感じで。

<img width="374" alt="Screen Shot 2018-10-01 at 7.23.47 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/240885/270b10cf-66b5-592c-eec4-236a4a83d46d.png">

## 自分の Live Template を追加する

もちろん自分で Live Template を追加することもできます。

arrow function を arf + tab で作れるようにしてみました。

新しく作るには、右側の + を押します。

<img width="637" alt="Screen Shot 2018-10-01 at 7.34.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/240885/b759254d-ed42-bd9d-0beb-f3a6fff09440.png">

それからどこで実行するかも選択しましょう。ここでは JavaScript ないならどこでも！にしました。

<img width="275" alt="Screen Shot 2018-10-01 at 7.34.56 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/240885/1c71ba0f-8cc3-90f9-3ba2-d12985e076d6.png">

これで高速でコーディングできますね！
非IT系で高齢な職場だけどがんばってslack導入したいけどめげそうだけどなんとか持ちこたえたい

導入から3日以上経過。めげるにはまだ早い？
本日までに受けた質問、雑感、メモ、愚痴

*****
<b>「そもそもわかんないんだけど」</b>

あなたが何に対してわからないのかが私にはわからない...わからない箇所がわからない状態と推察。

まず、どこからメッセージを書くのかわらない、というケースも見受けられた。対面説明でフォロー。

ワークスペースとチャンネルの違いの説明も必要だと感じた。

押した覚えないけど（）チャンネルがスター付きになっていて、それが混乱を生んでいたケースもあった。

60歳以上でITに明るくない人には、とっつきづらいのだろうか...？
難なく使えている人もいるようなので、個体差だと思う。

*****

<b>「リアクションの絵文字が小さくて見づらい」</b>

うーん、環境設定でどうにかするしかないのか？保留。

*****

<b>「だいぶ前の発言に対して返信したいんだけど」</b>
スレッドかなあ...。

*****
あとなんか細かい質問いろいろあったけど、書く気力なくて割愛。

プロフィールとかリアクション絵文字などは、教えなくても勝手にやってるので、説明不要な人（特に若手～中堅）は勝手にやってくれそう。

シニア層、とくにITに明るくない人への説明、導入コストが大変だという気がしている。

飲み込みの早い人もいるし、おおーべんりーと言ってくれる人もいるので、うまく軌道に乗せたい。
UIStackViewのArrangedSubViewをisHiddenするときに気をつけること

# 環境

Xcode 10
Swift 4.2
iOS 12

# 現象

UIStackViewのArrangedSubViewをisHiddenで、表示したり非表示にしたりする場合に対象のSubViewにWidthかHeightのConstraintを設定しているとたまにおかしな表示になる。

下の図でいうと、
1. StackViewのAxisがHorizontalでピンクのViewにWidthのConstraintを設定
2. コード上でピンクのViewにたいしていｓHidden=trueをする
3. ピンクのViewが消えることを想定しているが、たまに消えない　← よくわかってないのですが特定の条件が重なると起きます

<img width="1088" alt="スクリーンショット 2018-10-01 19.05.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/70276/1ddaf692-eaf6-5114-7d78-b013f714552d.png">

# 原因

isHidden=trueにした際にピンクのViewの幅が0になるのですが、そのConstraintともともと設定していたWidth=150のConstraintが競合してしまうのが原因です。
どちらもPriorityが1000　なので、どちらが優先されるかはOSが勝手に決める(たしか)。

# どうすりゃいいの

ピンクのViewにもともと設定しているWidth=150のConstraintのPriorityを750(High)とかにすればOKです。
750じゃなくてもいいんですが、1000以下で低すぎない値なら999とかでもたぶん大丈夫です。

# 焦ったPoint

ViewHierarchyを見たときには要素が消えているが、ビルドした画面には要素が表示されており焦りました。
logのwarningを見ていれば焦らなくても済んだのかもしれませんが、warningが出まくっていて見てなかったです。
AWS ビックデータ

##■そもそもビッグデータとは？##
[ビッグデータとは？](https://aws.amazon.com/jp/big-data/what-is-big-data/) を読みましょう。
ポイントは、素早く結果を出して、改善を繰り返していくことが重要です。

参考:[ビッグデータのお客様成功事例](https://aws.amazon.com/jp/solutions/case-studies/big-data/)


##■ビックデータで使えるAWSサービス事例##
AWSには、データレイク構築や多様なデータ分析を可能にするサービスが多数あります。

＊[データレイクとは](https://aws.amazon.com/jp/big-data/datalakes-and-analytics/what-is-a-data-lake/)？
規模や形式にかかわらず、すべてデータを加工することなく、保存すする単一のデータストアのことです。

|項目|内容|AWSサービス|
|:-----------------|:-----------------|:-----------------|
|1.収集|データを収集し、データレイクへ格納する。|AWS Snowball→オンプレミスからの物理的なデータ移行が可能。<br>AWS DM→既存DBからのデータ移行レプリケーション（複製して同期）が可能。<br>Amazon Kinesis→ビデオなどのストリーミングをデータを連携可能。<br>AWS IoT→デバイスからのセンサー情報などを連携可能。|
|2.保存|全期間保存、共通APIで保存する。|Amazon S3→データレイク|
|3.処理|データレイクにアクセスして分析する。|AWS Glue、Amazon EMR→HandoopやSparkを用いたデータの抽出や変換<br>Amazon RDS、Amazon Redshift→DWHやデータマートなどSQLによる抽出・集計<br>Amazon Athena→S3上のデータを直接クエリするアドホックな抽出・集計|
|4.可視化|人間が活用し易い形に可視化する。 |Amazon　QuickSight→BIサービスと連携して可視化が可能| 

AWSは大量なデータ処理への各段階において、必要なサービスが提供される。
![スクリーンショット 2019-05-11 19.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e3fbba0d-336e-ce96-da60-0c8a6b94be54.png)


##構成例##
S3 ＋ Athena ＋ QuickSight
![スクリーンショット 2018-09-30 21.50.38.png](https://qiita-image-store.s3.amazonaws.com/0/280929/5e285abf-dee2-2536-0e5b-32dcbdf7feda.png)

[Amazon QuickSight + Athena + S3 ハンズオン]() 後日公開
5歳でもわかる、タブメニューの作り方（jQuery編）

![jquery_tab.001.png](https://qiita-image-store.s3.amazonaws.com/0/178894/ba1bbeec-e491-fdbc-df70-8f70211b5f37.png)

こちらの記事は内容を改善して移転しました。
https://itokoba.com/archives/1761
AWS ECS上でDjangoを動かそう

最近Webフレームワークをちゃんと勉強したくてDjango Girlsチュートリアルをやりました。

https://tutorial.djangogirls.org/ja/


Webシステムを作ったことはあるけど、Webフレームワークを触ったことない自分でもわかりやすくてよいチュートリアルでした。

話は変わって2018年7月にAWS Fargateが東京リージョンに出てきた影響もあって、
AWSのコンテナサービスもいろいろ触って動かしています。

勉強がてらDjangoをElastic Container Service（ECS）上で動かす環境を構築しました。

今回構築したAWS環境はCloudFormation（CFn）で作成しており、テンプレートはGitHubで公開しています。

https://github.com/rednes/django-tutorial

## AWS構成図

今回構築するAWSの構成はこんな感じです。
Elastic Load Balancerを前段に置いて、動的ポートマッピングを利用してEC2上で動作しているECSのタスクへアクセスできるようにしています。

![AWS構成図](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/ecs.png)

## Elastic Container Repository（ECR）の作成

CFnテンプレート( [cloudformation/template-for-ecr.yml](https://github.com/rednes/django-tutorial/blob/master/cloudformation/template-for-ecr.yml) )を使用して、CFnスタックを作成してECRを構築します。

CFn動作完了後に、ECRへのpushコマンドがアウトプットされるようになっています。

AWSのデフォルトプロファイルを環境変数に設定したうえで、ECRのプッシュコマンドを実行すると、ECRにDockerイメージが構築できます。

![CFnForECR](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/cfn-for-ecr.png)

```
$ export AWS_DEFAULT_PROFILE=<<YOUR PROFILE>>
$ <<PushCommandsForEcrをコピー＆ペーストして実行>>
```

## Elastic Container Service（ECS）の作成

CFnテンプレート( [cloudformation/template.yml](https://github.com/rednes/django-tutorial/blob/master/cloudformation/template.yml) )を使用して、CFnスタックを作成してECSほか必要な環境を構築します。

CFn動作完了後に、ELBのURLがアウトプットされるようになっています。

URLにアクセスしてDjangoの動作を確認できます。

![CFn](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/cfn.png)

## 動作確認

URLにアクセスするとDjangoが動いていることを確認できます。

![web01](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/web01.png)

URLの後ろに `admin/` を追記してアクセスするとDjango管理サイトが開きます。
ユーザー名とパスワードは以下の通り設定しています。

- USER: test
- PASS: test-password

![](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/web02.png)

ログインしてトップページ右上の `+` ボタンをクリックするとブログの投稿ができます。

![](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/web03.png)

投稿するとトップページに反映されますが、SQLiteで動作しているため、ECSのタスクが止まると投稿したデータはすべて消えてしまいます。

![](https://raw.githubusercontent.com/rednes/django-tutorial/img/img/web04.png)

## 所感

とりあえず、AWS ECSを利用してDjangoを動かすことができました。
ECSの概念は動かして見ないとわからないところが多いなーと感じたので、ガシガシ動かしていきたいです。

本番運用で使うには次のようなことをまだまだ考えていかないといけませんが、とりあえず動かせるところまでいけたので満足です。

- RDSとの接続
- ログの保存をどうしていくか
- 運用監視
- エラー発生時のハンドリング
Kubernetes Secret


Kubernetes の [Secret](https://kubernetes.io/docs/concepts/configuration/secret/) 使い方メモ。

Secret とは? Kubernetes で秘密にしたい設定を Pod 定義とは別に分ける。秘密設定は BASE64 で保存される。Pod からはファイルまたは環境変数で参照する。

## Secret の作り方

例として、secretfile と secretenv という二つの秘密を作ります。データを作るには base64 でエンコードします。

```shell
$ echo -n 'This is a secret file.' | base64
VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
$ echo -n 'This is a secret env.' | base64
VGhpcyBpcyBhIHNlY3JldCBlbnYu
```

これを yaml 書けば良い。二つの秘密を topsecret という名前の Secret リソースに保存します。

```yaml
# secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: topsecret
type: Opaque
data:
  secretfile: VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
  secretenv: VGhpcyBpcyBhIHNlY3JldCBlbnYu
```

読み込んで内容を確認します。

```shell
$ kubectl apply -f secret.yaml 
secret "topsecret" created
$ kubectl get secret topsecret -o yaml
apiVersion: v1
data:
  secretenv: VGhpcyBpcyBhIHNlY3JldCBlbnYu
  secretfile: VGhpcyBpcyBhIHNlY3JldCBmaWxlLg==
...
```

## Secret の使い方

作成した Secret はファイルか環境変数を通じて取り込む事が出来ます。

* 環境変数として取り込むには、.spec.containers[].env[].valueFrom.secretKeyRef を指定します。
* ファイルとして取り込むには、.spec.volumes[].secret を指定します。

```yaml
# run.yaml

apiVersion: v1
kind: Pod
metadata:
  name: run
spec:
  containers:
  - name: run-container
    image: debian
    command: ["bin/bash"]
    args: ["-c", "echo ${SECRET_ENV} ; cat /etc/secret/secret"]
    env:
    - name: SECRET_ENV # 環境変数名
      valueFrom:
        secretKeyRef:
          name: topsecret # 環境変数として取り込みたい secret の名前
          key: secretenv # 環境変数として取り込みたい値の名前、この場合 secretenv が SECRET_ENV に割り当てられる。
    volumeMounts:
    - name: secretdir
      mountPath: "/etc/secret" # マウントしたいディレクトリを指定する。
  volumes:
  - name: secretdir
    secret:
      secretName: topsecret
      items:
      - key: secretfile
        path: secret # マウントしたいファイルを指定する。この場合 secretfile が /etc/secret/secret にマウントされる。
```

試してみます。

```shell
% kubectl create -f run.yaml
pod "run" created
tyamamiya@ducttape:~/doc/docker/secret% kubectl logs run 
This is a secret env.
This is a secret file.%
```


## ファイルから Secret を作る

このように手動で base64 して Secret を作るのは非常に面倒臭いので、ファイルから作る方法がいろいろあります。特に、env file (キー=値 形式のファイル) から読み込むと簡単です。

    kubectl create secret generic my-secret --from-env-file=path/to/bar.env

Secret は、似たような機能の ConfigMaps と似たオプションが使えるらしく、詳しくは [Create ConfigMaps from files](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#create-configmaps-from-files) 参照。
Excelに実装されるアイデア機能のポテンシャル

Excelはデータを分析できますが、データの分析手法を決めるのは人間です。
グラフを一つ作るにも、生データをそのままグラフにすると加工し、集計してから作ることになります。
でも、生データからそのままグラフが作れたら素晴らしいと思いませんか。
バグ件数管理も楽になるというもの。何かがバグの発生件数と相関があるとか、そのようなことが一度にわかるといいですよね。
よく考えてみると、数値を分析して傾向を見つけ出すというのは、とても数学的、アルゴリズム的なので、コンピュータでできないことはなかったわけですが。
先日、OfficeInsiderで追加されたアイデア機能は、そんなことができる機能です。
#アイデア
Excelのアイデア機能は、OfficeInsiderプログラムに参加している場合、ホームタブの一番右側に表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/81d14a60-b43e-2d1b-b0f4-2abc059a74b5.png)
アイデアは次期Excelに追加される機能の一つでもあります。
使いかたは簡単で、一覧表をクリックして、ホームタブのアイデアをクリックするだけです。
すると画面右側に「アイデア」の作業ウィンドウが表示されます。
その中にこんなグラフを作成したら？という一覧が表示されるので、その中から自分の求めているものの「グラフの挿入」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/3cb26eb8-679a-3d3c-4801-cbf47edd586b.png)
するとグラフがシートに入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/6cc47524-cd80-ef3d-5257-c74fc9909e48.png)
「グラフの挿入」だけではなく、「ピボットグラフの挿入」となっているものもあります。この場合、データを集計したグラフを新規シートに作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/769ccc1e-43de-4517-3d57-0bf674504e62.png)
グラフだけではなく、集計されたピボットテーブルも表示されます。ということは集計方法を自分で変更できるということです。
日付のデータを右クリックしてグループ化します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/b00b1e13-2fc6-ea01-4644-bd911e85c743.png)
月を選んで月ごとの集計にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/4f992640-ca3c-f1cf-9593-96577ff34d45.png)
月ごとの集計データになりました。2か月分しかデータがなくてごめんなさい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/92cf8405-211f-03e8-cd63-748d906a654d.png)
もっとデータがあれば月ごと、年毎と分析できます。
この記事を書いている時点では、残念ながらこの月集計や年集計を自動では行いません。まだ、どのデータを選ぶかとちょっとした加工は人間の仕事です。
また、思った通りのアイデア案がリストされないこともよくあり今後の改善が待たれます。
#アイデアの本当のすごいところ
以上がアイデア機能の使いかたです。
しかし、アイデア機能には、もう少し踏み込んだ機能が備わっています。
アイデア機能は、折れ線グラフの他に、棒グラフ、円グラフ、散布図などを提案してくれます。
例えば散布図の提案を見てみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/2fb8504c-af3c-eb94-5f42-6ae5a2497c1e.png)
タイトルを見ると、「A店人数(人) and A店売上(円) appear highly correlated.」となっています。
高い相関があると、表現してくれているのです。
今までは人間が「あ、直線ぽくて相関ありだな」と言っていたものが、Excelで機械的に判断しても出てくるようになりました。
操作が簡単になったということに併せ、「Excelで分析しても相関あり」というエビデンスを簡単に得られるのです。
また、相関図を提案するのは正の相関のみで、負の相関や無相関ではしません。疑似相関は出してしまうのがタマにきずですが、ここまでやってくれればそのくらいは仕方ないと思っています。
このデータをアイデア機能で処理すると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/4963bd97-7aba-a650-a022-b60be2493d29.png)
円グラフがアイデア案に入り「'店舗': A店 accounts for the majority of '売上(円)'.」とA店の売上がほとんどであることを分析してくれます。
1つのカテゴリが多い割合を示していると円グラフの提案がリストされるようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/f3a76d1c-a419-b3c8-6ad2-6c2f897fb285.png)
同じデータで処理したアイデアの中には、このような折れ線グラフも出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/6af0b165-0758-90af-ae30-64286d5b6031.png)
データの中からC店舗を抜き出してみたら、異常値が4つ見つかったと言ってくれています。
これは、動作チェック時のバグ値の洗い出しに貢献できるかも知れません。
以上の他にも、近似曲線を描いて、時間ごとに増加傾向だとかの解説が入る場合もあります。
#まとめ
新しいExcelには、様々な追加機能がありますが、このアイデア機能はExcelのAI化ということで追加された機能です。
今までのデータ分析は、データを集める、集計する、分析する、考察する、レポートするという順番が必要でしたが、アイデア機能では、データを集めてアイデアから選んでレポートに貼り付けるという作業で済みます。
今のところ完璧な機能ではなく、思った通りの提案をしないこともありますし、視点が全然違う提案をする場合もあります。そこを選別し、少し手を加えるスキルは必要で、データを分析する力が不要になるわけではありません。それはこの機能が完璧なものになったとしても必要な力です。
C++ - static

Very detail. Static had only 4 cases in C++.
https://medium.com/@alan81920/c-c-%E4%B8%AD%E7%9A%84-static-extern-%E7%9A%84%E8%AE%8A%E6%95%B8-9b42d000688f



This post is about using static map.
https://stackoverflow.com/questions/13464325/static-map-initialization

```c++
//MyClass.h
class MyClass {
public:
      typedef std::map<std::string, int> OpMap;
      static OpMap opMap_;
};

//MyClass.cpp
MyClass::OpMap MyClass::opMap_ = { 
    { "x", 1 }
}; 
```

By the way, using **unnamed namespace** is the same behavior as static. They had only one memory space and shared with all instances.
🍺Redisより早いNoSQL DBのAerospikeをRubyから使ってみた

以前、アドテクについて学ぶ機会があったので知見を残しておく。

アドテク界隈ではAerospikeがよく使われるようだ。
https://www.aerospike.jp/

>Aerospikeとは
NoSQL（キー・バリュー・ストア）データベース
インメモリ、もしくはフラッシュメモリ（SSD）にデータを保持
ノードの追加により、処理能力とデータ容量をスケールアウト可能
99%以上のトランザクションを1ms以下のレイテンシで処理可能
僅か数台で百万TPS超のスループットを実現
AppNexusやBlueKaiで稼働実績あり
みたいな感じです。要約すると超絶速いKVSってことでいいと思います。

http://tech.im-dmp.net/entry/archives/421

Rubyから使用した。
`Aerospike Ruby Client`というGemを使用した。
https://github.com/aerospike/aerospike-client-ruby

ぶっちゃけ、Rubyから使うのはオススメしない。Aerospikeで速さを求めているのに、わざわざ遅いRubyを使うのはナンセンスだと思う。
自分は短時間で成果が求められる環境で使用したため慣れているRubyを使用した。

### RubyからAerospikeの使い方

RDBとAerospikeの名前の対応関係は以下のようになっている。
Aerospikeでnamespaceを新しく作るのはそこそこめんどくさいので、初期からあるtest namespaceをとりあえず使っておけばOK

| RDB | Aerospike |    
|:----------------:|:----------------:|
| db             |            namespace       |
| table           |            set |
| column            |       bin        |



```ruby:shared/shared.rb
module Shared

  attr_accessor :write_policy, :policy, :client, :logger

  def init

    host = '33.222.111.00'


    @@options = {
      :host => host,
      :port => 3000, # Aerospikeはデフォルトで3000番
      :namespace => 'test', # デフォルトでtestというnamespaceがある
      :set => 'advertisers', # 操作したいsetをする(メソッドの引数にしてもよさそう)
    }

    @write_policy = WritePolicy.new
    @policy = Policy.new(connection_queue_size: 10000, timeout: 0.005)
    @logger = Logger.new(STDOUT, Logger::INFO)
    @client = host ? Client.new(Host.new(host, port)) : Client.new
  end

  def host
    @@options[:host]
  end

  def port
    @@options[:port]
  end

  def namespace
    @@options[:namespace]
  end

  def set_name
    @@options[:set]
  end

end
```

`shared/shared.rb`を利用することで、Aerospikeとの処理を行う。

```ruby:app.rb
require 'sinatra'
require 'aerospike'
require './shared/shared'

include Aerospike
include Shared

class MyApp < Sinatra::Base

　# ~~~~いろいろ省略~~~~

  # binを更新する
  # 引数
  # pk: primary key
  # client: Aerospikeクライアント(ex: Shared.client)
  # add_bin1: bin1の増加量(ex: 5)
  # add_bin2: bin2の増加量(ex: 10)
  def update_bins(pk, client, add_bin1, add_bin2)
    key = Key.new(Shared.namespace, Shared.set_name, pk)
    record = client.get(key)
    bin1 = record.bins['bin1']
    bin2 = record.bins['bin2']
    bin1 += add_bin1
    bin2 += add_bin2
    client.put(key, record.bins)
  end

  # bin1, bin2を取得する
  # 引数
  # pk: primary key
  # client: Aerospikeクライアント(ex: Shared.client)
  # return: Hash{ :bin1 => Int, :bin2 => Int }
  def get_bins(pk, client)
    key = Key.new(Shared.namespace, Shared.set_name, pk)
    bins_hash = client.get(key, ['bin1', 'bin2'], Shared.policy).bins
    bins_hash
  end

   # update_bins(1, Shared.client, 5, 10) のように呼び出して使用
end
```

### ハマったところ(バグ？)

```ruby
  def get_records(client)
    stmt = Statement.new(Shared.namespace, Shared.set_name, ['bin1'])
    records = client.query(stmt)
  end
```

このように書くとSQLでいうところの`select bin1 from Shared.set_name`が動くはずなのだが、全件ひっぱてくることができなかった。なぜか、4割ほどのレコードだけ引っ張ってくることができた。対策として、一つのレコードで全件分のデータを保存するために、Integer型でなくList型でbinを持つことが考えられる。Listとかこねくりまわさないといけないのでめんどくさい。バグなのかなんなのか調べる必要がありそう。
ubuntu 16.04 (xenial) で sshd が org.freedesktop.login1 の time out まで応答しない場合の対処


この記事で見付けた，#81のコメント．
[\#770135 \- systemd: ssh logins considerably delayed \(until PAM timeout\) when systemd is upgraded but the system not rebooted \- Debian Bug report logs](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=770135)

環境は他人に作ってもらったので，よく把握してないけど，LDAPで認証している鯖(下のログのhostname)に192.168.1.2からログインしているシチュエーション．
困ってたのが，こんなログで，3行目が出るまでの，大体30秒くらい待たされる．
ちなみに，公開鍵認証ではなくパスワード認証でも同じ症状．

```
Oct  1 17:57:46 hostname sshd[2177]: Accepted publickey for username from 192.168.1.2 port 52340 ssh2: ED25519 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Oct  1 17:57:46 hostname sshd[2177]: pam_unix(sshd:session): session opened for user username by (uid=0)
Oct  1 17:58:12 hostname sshd[2177]: pam_systemd(sshd:session): Failed to create session: Failed to activate service 'org.freedesktop.login1': timed out
```

で，pam_systemd.so をコメントアウトするだけで直った．

```diff:/etc/pam.d/common-session
--- /etc/pam.d/common-session.org
+++ /etc/pam.d/common-session
@@ -31 +31 @@
-session	optional	pam_systemd.so 
+#session	optional	pam_systemd.so 
```

今のログはこんな感じ．
パスワード認証でも同じく解消する．

```
Oct  1 18:09:39 hostname sshd[2808]: Accepted publickey for username from 192.168.1.2 port 52522 ssh2: ED25519 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Oct  1 18:09:39 hostname sshd[2808]: pam_unix(sshd:session): session opened for user username by (uid=0)
```

む…認証通っててもpam_systemdを見に行ってたのか．

sshを通す以外のことをしてないので，他に問題が生じているかは分からない．
Xcode で Project Navigation を ダブルクリックしたときの動きを変更する

Xcode9系からXcode10系にしたら、勝手に設定が変わってた。

僕は、 `Cmd+1` で開ける Project Navigation にあるファイルをダブルクリックしたときには、新しいWindowで表示されて欲しい派でして、それがクリックと同じ動きになっていたのでその変更方法をメモします。[^memo]
[^memo]: Cmd+Tabでアプリケーションを変更、 Option+TabでWindowを変更するようにしてると、Xcode9系で使ってた設定のほうが便利 だなって感じてます。

## 変更方法

`Xcode` -> `Preference` -> `Navigation` の `Double Click Navigation` を変更すれば戻せる。

参考までに選べるのは以下通り。

ダブルクリックしたときに:

* Tabを分けて開いてほしい　＝　`Uses Separate Tab`
* Windowを分けて開いてほしい　＝ `Uses Separate Window`
* クリックと同じ動きしてほしい　＝ `Same　as click`

### Preferenceとは、Navigationとは、

これ。

![スクリーンショット 2018-10-01 17.53.34.png](https://qiita-image-store.s3.amazonaws.com/0/93918/31415901-3d27-1df0-c0fd-74ac00b82c06.png)

以上 φ(´ ‿｀」)