OmniAICreator/Qiita-1.07M huggingface dataset:
EC2上のMongoDBをローカルのubutnuのmongo-expressで眺める

#環境
＜ローカル＞
ubuntu 16.04
mongo-express＠0.44.0

＜EC2＞
Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-79873901
MongoDB version v3.4.11

#準備
AWSコンソールでEC2のsshのポートとmongodbのポートを開けておく
![aws_setting.png](https://qiita-image-store.s3.amazonaws.com/0/237062/5fd98718-dd9c-9e4a-dd3d-4c7f738c520f.png)
　
　
ローカルのubuntuのmongo-expressの設定を以下のように変更（一部抜粋）
※portは他で使っていないものならなんでもok。ここでは27027としたので以下もそうした前提で記述。
※usernameとpasswordはhogehogeと書きましたが、自分の環境に合わせて読み替えてください。
※dbとurlのdbname部分も自分の環境に合わせてください。

```~/node_modules/mongo-express/config.js
  mongo = {
    // setting the connection string will only give access to that database
    // to see more databases you need to set mongodb.admin to true or add databases to the mongodb.auth list
    db:       'dbname',
    host:     '127.0.0.1',
    password: 'hogehoge',
    port:     27027,
    ssl:      false,
    url:      'mongodb://localhost/dbname',
    username: 'hogehoge',
    connectionString: process.env.ME_CONFIG_MONGODB_SERVER ? '' : process.env.ME_CONFIG_MONGODB_URL,
  };
```

#手順
ローカルのubuntuの端末からssh接続（ポート転送）
※~/work/aws/MyKeyPair.pemは接続先のec2の認証キーが置いてあるpath
※-Lの後の27027は~/node_modules/mongo-express/config.jsで設定したport番号
※ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.coの部分はec2インスタンスのパブリックDNS

```
ubuntu@local$ sudo ssh -i ~/work/aws/MyKeyPair.pem -L 27027:127.0.0.1:27017 ubuntu@ec2-xx-xxx-xxx-xxx.us-west-2.compute.amazonaws.co
```

ec2インスタンス上でmongodbが起動しているか確認

```
ubuntu@ec2$ mongo
```

　
ログインできればok
起動していなければ起動
[MongoDBをsupervisorでプロセス監視する手順メモ](https://qiita.com/masashi_m/items/973943a4761cf4b13480)も参考にしてみてください。

```
ubuntu@ec2$ mongod
```

　　
ローカルのubuntuでmongo-expressを起動

```
ubuntu@local$ cd ~/node_modules/mongo-express
ubuntu@local$ sudo node app.js
```
　
ローカルのubuntuからブラウザで[http://localhost:8081](http://localhost:8081)に接続
![mongo-express.png](https://qiita-image-store.s3.amazonaws.com/0/237062/8982fc8c-f098-fd96-b296-bd6c1c80741a.png)

以上
Runge-Kutta法による数値解析

###Runge-Kutta法とは
Runge-Kutta法とは、常微分方程式における数値解析の1種である。Euler法では、シミュレーション時間を刻み幅で分割し、刻み幅を用いて数値解を算出していた。この刻み幅において、Euler法では演算を1回行い、その結果を次の数値解としていたが、Runge-Kutta法では、任意の回数だけ刻み幅の単位時間に演算を行い、次の数値解を算出している。従って、一般的にEuler法よりも精度は高くなる。しかし、次元を大きくしていくに従って、計算処理量が多くなってしまう。よって、Runge-Kutta法の演算次元は4次までとしていることが多い。今回、対象とする常微分方程式は、RC回路のコンデンサ電圧における回路方程式とします。この回路では、直流電源を用いるとします。

###Cによるソースコード

```
#include<stdio.h>
#include<math.h>

double func(double t, double Vc) {

	return 100000 - 1000 * Vc;

}

int main(void) {

	double Vc, t, step, R, C, end;
	double k1, k2, k3, k4;
	int error;
	FILE *fi;

	R = 10;
	C = 0.0001;
	step = ((R*C) / 100.0)*100;
	Vc = 0.0;
	end = 0.01;

	if ((error = fopen_s(&fi, "Runge_Kutta_data_100.txt", "w")) != 0) {

		printf("\nThis file can't opened \n\n");

		return 0;

	}

	for (t = 0.0; t <= end; t = t + step) {

		fprintf(fi, "%f %f\n", t, Vc);
                
                //Runge-Kutta法による演算
		k1 = step*func(t, Vc);
		k2 = step*func(t + step*0.5, Vc + k1*0.5); 
		k3 = step*func(t + step*0.5, Vc + k2*0.5);
		k4 = step*func(t + step, Vc + k3);
		Vc = Vc + (k1 + 2.0*k2 + 2.0*k3 + k4) / 6.0;


	}

	fclose(fi);

	return 0;
}


```
上記のソースコードを実行すると、時間領域におけるRC回路のコンデンサ電圧の値がtextファイルとして出てきます。
この出てきたファイルをgunuplotで実行させるとRC回路のコンデンサ電圧におけるEuler法を用いた数値解をプロットする事が出来ます。

以下に、簡単なGunuplotのソースコードを示します。


```

se grid
se xrange [0:0.01]
se yrange [0:110]
se xlabel "s[sec]"
se ylabel "Vc[V]"
plot "Euler_data.txt" using 1:2 with lines



```
会社で少し盛り上がった Project Euler をやってみる 014

# Problem 014

> 正の整数に以下の式で繰り返し生成する数列を定義する.

> $ n → n/2 $ ( $ n $ が偶数)
> $ n → 3n + 1 $ ( $ n $ が奇数)

> 13からはじめるとこの数列は以下のようになる.

> 13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
> 13から1まで10個の項になる. この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)

> さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.

> 注意: 数列の途中で100万以上になってもよい

---

# Answer 014 (Python)

```python3
import sys
from multiprocessing import Pool

class Problem14:

    CASH = {}

    def main(self, n):
        result = 1
        num = 1
        for i in range(2, n):
            count = p.collatzNumCount(i)
            self.CASH[i] = count
            if result < count:
                num = i
                result = count
        print(num, result)

    def collatzNumCount(self, n):
        i = 0
        while(n != 1):
            if n in self.CASH:
                i += self.CASH[n]
                return i
            n = self.collatzNum(n)
            i += 1
        return i

    def collatzNum(self, n):
        if n % 2 == 0:
            return self._collatzEven(n)
        else:
            return self._collatzOdd(n)

    def _collatzOdd(self, n):
        return 3 * n + 1

    def _collatzEven(self, n):
        return n / 2


if __name__ == '__main__':
    num = 1000000
    if len(sys.argv) == 2:
        num = sys.argv[1]
    p = Problem14()
    p.main(int(num))
```
---

# (参考) Project Euler とは

[Project Euler](https://projecteuler.net/) はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。

サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。

また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。

[Project Euler(日本語訳)](http://odz.sakura.ne.jp/projecteuler/)
XIBとかStoryboardでlabel配置するとwidthが0になる問題のワークアラウンド

<img width="261" alt="スクリーンショット 2018-02-08 12.43.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/8dfaaf61-1261-702e-3097-92717f4e856f.png">

適当にwidthの制約を付けて

<img width="261" alt="スクリーンショット 2018-02-08 12.43.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/28c8a29f-d2d5-d57b-8c31-290514a61898.png">

Remove at build timeにチェック
これでとりあえずプレビューはまともに見れる。

早く直ってくれー
[phpQuery] を使ってwebサイトをスクレイピングする

## 概要
スクレイピングはサイトの分析をするときに使える便利な技術です。phpQueryを使って簡単に行うことができます。使い方によっては、サーバーに負荷がかかったりすることもありますので、自身のサイトで使用してください。

### 必要なもの
* phpQuery
* MAMP（phpの実行環境を作成）

### ダウンロード

#### phpQuery
https://code.google.com/archive/p/phpquery/downloads

# 使い方
ファイル構成を整え、index.phpに取得したい情報を記述したのちMAMPを使ってphpを実行します。

## ファイル構成

```
scraping
 ├ index.php
 └ phpQuery-onefile.php
```

### ソースコード
URLにスクレイピングしたいサイトをhttpから記載します。

``` index.php
<?php

// phpQueryの読み込み
require_once("./phpQuery-onefile.php");

// 取得したいwebサイトを読み込み
$html = file_get_contents("取得したいwebサイトのURL");

// 取得したい情報を記述（以下を参照）

?>
```

## 情報を取得して表示する
下記のコードを追記することで情報を表示することができます。

### 見出しの取得と表示

```
echo phpQuery::newDocument($html)->find("h3")->text();
```
### 画像の取得と表示
```
echo phpQuery::newDocument($html)->find("img")->text("src");
```





## 参考サイト

基本情報
https://qiita.com/dia/items/3cf963fa89b08b87e8ef

繰り返し要素
https://qiita.com/zaburo/items/465ca691aebad2b5691e
https://person-link.co.jp/web/964

CSVヘの書き出し
https://qiita.com/inoyoh/items/0b8a9f25bdfcf73d2f3b#_reference-f94bb7e75cf94119ac30

キャッシュ化
https://www.tam-tam.co.jp/tipsnote/program/post9744.html

## おそらく役立つ情報 
痒いところに手が届くかもしれない記事を書いています。
フォローしてくれるとやる気になります！

- Qiita　プログラミングに関する情報はこちら
http://qiita.com/nadonado


- Twitter　日々のつぶやきはこちら
https://twitter.com/hironado
Skype Botの発言文を改行させる方法

QnAmaker×AzureFuntionsBot×SkypeでFAQチャットボット作っていて自分でハマったやつのメモ。
Skypeの中ではXML変換して通信しているらしく、「<>」とかタグっぽい記号つかうとBotが発言してくれなくなったりおかしくなった。

#やりたいこと
改行したい。ただそれだけ。

#結論：「\n\n」
改行には「\n\n」を使う。
Bot FrameworkではメッセージがJSON 形式でやり取りされるけどSkypeは画面表示のためにアプリケーションの中でXMLとしてメッセージを扱っているらしく、「<>」とかタグっぽい記号つかうとBotが発言してくれなくなるようです。

#試してみた
##\n入れる　→ダメ
QnAmakerにこんな風に登録して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/4aaf2fcd-dd56-bb43-5bef-c3093133db35.png)
Skypeだとスペースが入っただけ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/0aac22e3-cfb1-3b03-4b56-9f5beb424f6d.png)
Webだと改行するのに。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/52752312-89ac-e762-2b3a-b3216a0937f5.png)

##＜br＞入れる　→ダメ
QnAmakerにこんな風に登録して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/f31f6a21-e964-d22c-8e59-b214d6a815fc.png)
Skypeだと何も反応せずだんまり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/5ef7f8e8-d25e-de95-ee68-ed7cb90fb452.png)
WEBだと改行するのに。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/1dcdacb2-8b7d-fdf0-8f5e-7b92992d4c6e.png)

##スペース2ついれてみる　→ダメ
QnAmakerにこんな風に登録して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/90f6b5b3-acb7-f5d5-5785-60ca7b0a6539.png)
これはSkypeでもWEBでもダメだった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/a6ac3531-647f-c301-5e72-95af9d28eb71.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/0a6fac38-4a6f-8257-f79d-4ab0c6b6685b.png)

##\n\n入れてみる、QnAmakerの中で改行してみる　→でけた～～
QnAmakerにこんな風に登録して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/4b48c1dd-faa9-653e-694a-28efab5fa6f7.png)
でけた～～
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178016/d155b81f-6ffd-99d0-2c32-31a1c538be0d.png)
QnAmakerの中で改行すると、Publishしたときに改行が\n\nに変換されたので同じことだと思う。


#参考
https://github.com/Microsoft/BotBuilder/issues/881
UE4パッケージ化でハマったときに確認する3個の項目

# UE4パッケージ化でハマったときに確認する3個の項目
UE4使い始めて1か月ぐらいの時にパッケージ化ではまった物をまとめました

### 1.Intermediateフォルダを消す
- プロジェクトフォルダ直下にあるIntermediateフォルダを消す（念のためバックアップ取ったほうが良いかも）
- C++コードのビルド後の情報とかいろいろはいっているようだけど消しても次回起動時に復活するので消してみる
- 結構治ることが多い印象

### 2.uprojectファイルを編集する
- **この対策法は事前にバックアップを強く推奨します**
- 謎の長文エラー `Non-editor build cannot depend on non-redistributable modules...` を解消するときにやる
    1. プロジェクトフォルダ直下にある [プロジェクト名].uproject ファイルを適当なテキストエディタで開く
    2. AdditionalDependencies要素の下に `UnrealEd`, `UMGEditor` などエディター依存のものが書かれていないかチェック。書かれていた場合は該当のものを削除
    3. リビルド
- パッケージ後の環境はエディタ上ではないためエディタ依存のライブラリがあるとパッケージ化に失敗するとかなんとか

### 3.[Androidパッケージ化限定] Android SDKの利用規約に同意する
- 初めてAndroid向けにビルドする際はAndroid SDKの利用規約に同意する必要がある
- エディタ上から
    1. プロジェクト設定
    2. プラットフォーム
    3. Android
    4. Accept SDK Licenseボタンを押す
    5. 終わり
- エラーログを読むとすぐに分かるがUE4使い始めは割りと引っかかりやすいと思う

# 備考
- 上記手順は復旧不能な問題を引き起こす可能性は0ではないのでバックアップを行ってからやりましょう
- 他に何かあれば追記します / コメントでも解消法を書いていただければ追記します！
- 楽しいUE4ライフを！
twemproxyのdockerfile書いた

#やったこと

探しても使い勝手悪そうなのばかりなので、新規で書いた
https://github.com/the40san/docker-twemproxy
https://hub.docker.com/r/the40san/twemproxy/

自分なりに丁寧に書いたつもりですが、微妙なところあったら(日本語でもいいので)PRかissue下さい。
一応探したけど、もう既に同じような実装あったらごめん。

# 使い方
READMEに過不足なく書いたつもりですが、こんな感じで使います。
取り敢えず動きそうなコンフィグをデフォルトで同梱してますが、基本コンフィグは上書きして使います。

## 1. コンフィグを用意する

twemproxy用のコンフィグを用意します。
名前はなんでも良いですが、ここでは`nutcracker.yml`としておきます。


## 2. twemproxyを焼く

今回作ったイメージをベースに自分のイメージを焼きます。
例は愚直にローカルから`COPY`してますが、multi stage build使えるならそっちが良いと思います。

```
FROM the40san/twemproxy:latest

COPY nutcracker.yml /nutcracker/etc/
ENV NUTCRACKER_CONF="nutcracker.yml"
```

`NUTCRACKER_CONF`を指定すると、そのファイルを起動時にコンフィグとして読むようになります。


## 3. docker-composeに載せる

twemproxy専用に1台インスタンス立てても良いのだけれど、ELBやらhaproxyやらを間に挟んで冗長化するとスループット落ちるって噂があるので、自分は基本APローカルにtwemproxy立てておいて、そこから直にキャッシュのインスタンスを見るようにするつもりです。

こんな感じ

```
version: '3'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.myapp
    depends_on:
      - twemproxy

  twemproxy:
    image: my_twemproxy:latest
    depends_on:
      - redis

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    command: 'redis-server --save ""'
```
PlatioNotificationコンポーネントの使い方

#概要
PlatioNotificationコンポーネントは、プレートを使用しているユーザーにプッシュ通知を送るためのコンポーネントです。

#使用時の手順
1. Platioの準備

まずPlatio Studioでプッシュ通知を行いたいプレートを選択し、「設定」ボタンから「プレートの設定」ダイアログを開きます。
![Platio_notification_checkbox.PNG](https://qiita-image-store.s3.amazonaws.com/0/180278/8214c23b-6941-26aa-407d-eeb84cf4d565.png)

下の方に「プッシュ通知を有効にする」チェックボックスがありますので、チェックを入れて「保存」します。
プレートを「デプロイ」したら準備完了です。

2.フローの作成

PlatioNotificationコンポーネントを配置したフローを作成し、PlatioNotificationコンポーネントをダブルクリックして、コネクションを設定します。
コネクションの設定については<a href="https://qiita.com/ArimitsuIshii/items/e8ac0a134d0f9486a92c">ASTERIA WARP Platioコンポーネントのコネクション設定</a>を参照してください。
![Platio_notification_flow.PNG](https://qiita-image-store.s3.amazonaws.com/0/180278/73ce4574-9cad-2fd8-4742-f29c3bdcf124.png)


3.通知ユーザーの選択

コネクションを設定するとPlatioビルダーが起動し、プッシュ通知の送り先に指定できるユーザーのリストが表示されます。
![Platio_notification_builder.png](https://qiita-image-store.s3.amazonaws.com/0/180278/5f3005cc-dd17-8d59-1fda-c283edf1aec7.png)

プッシュ通知したいユーザーのチェックボックスにチェックを入れます。
「全ユーザー」を選択すると全てのユーザーへ通知します。

4.通知メッセージを設定

PlatioNotificationコンポーネントの「通知のタイトル」「通知の本文」プロパティへ通知内容をマッピングします。
![Platio_notification_mapping.PNG](https://qiita-image-store.s3.amazonaws.com/0/180278/974b5c24-2ce9-edf3-1353-4c72e34075dc.png)

 
#動作確認

作成したフローを実行してプッシュ通知が実行されることを確認します。

<img width="768" alt="IMG_0012.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/180278/d66fe700-a67f-f177-18df-96cec27aa1d1.png">



プッシュ通知はPlatio APIに公開されていましたが、やや敷居が高く感じていました。
PlatioNotificationコンポーネントを使用することで非常に簡単に利用することができるようになりました。
PlatioStartコンポーネントと一緒につかうことで、いろいろな使い道がありそうです。
GO言語をMacで使ってみる インストール

#　環境

- macOS
- Homebrew

# 事前準備

[Homebrewをインストールしておく](https://brew.sh/index_ja.html)

# 手順


## インストール

```
$ brew install go
==> Downloading https://homebrew.bintray.com/bottles/go-1.9.4.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.9.4.high_sierra.bottle.tar.gz
==> Caveats
A valid GOPATH is required to use the `go get` command.
If $GOPATH is not specified, $HOME/go will be used by default:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
🍺  /usr/local/Cellar/go/1.9.4: 7,654 files, 294MB
```

### バージョンの確認

```
$ go version
go version go1.9.4 darwin/amd64
```

## Hello World!

```go:hello.go
package main
import "fmt"

func main() {
    fmt.Printf("Hello World!\n")
}
```

### 実行

```
$ go run hello.go
Hello World!
```
### ビルド

```
$ go build hello.go
$ ls
hello		hello.go
$ ./hello
Hello World!
```

# 覚書

癖で↓みたいに書いたら「syntax error」になった

```go:hello.go
func main()
{
    fmt.Printf("Hello World!\n")
}
```

「syntax error」の件もあったので[goのコーディング規約](https://golang.org/doc/effective_go.html#formatting)を検索

最初の方を少し読んだだけだけどインデントはハードタブらしい

gofmtコマンドで修正してくれるらしい

```
$ gofmt hello.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World!\n")
}
```

packageとimportの間に1行追加されてインデントがtabになりました
Intel Galileo Tips

※スケッチでIPAddressの設定やMACアドレスの設定をしているとWANに接続できない場合がある。

#opkgを使う手順

基本的には下記を参照する。
[IntelのGalileoでパッケージマネージャopkgを使う　-　Galileo](http://wiki.tokor.org/index.php?plugin=related&page=Intel%A4%CEGalileo%A4%C7%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A5%DE%A5%CD%A1%BC%A5%B8%A5%E3opkg%A4%F2%BB%C8%A4%A6%A1%A1-%A1%A1Galileo)

リンク切れ等の可能性もあるため、下記に別の手順を記載する。

```
$ vi /etc/opkg/base-feeds.conf
```

下記３行を追記し保存する。

```
src/gz tokor-org-i586 http://storage.tokor.org/pub/galileo/packages/i586
src/gz tokor-org-all http://storage.tokor.org/pub/galileo/packages/all
src/gz tokor-org-clanton http://storage.tokor.org/pub/galileo/packages/clanton
dest root /
lists_dir ext /var/lib/opkg
```

パッケージの更新、最新化を行う。

```
$ opkg update
$ opkg upgrade
```

#NTPのインストールから設定まで

```
$ opkg install -force-overwrite ntpdate
$ opkg install -force-overwrite ntp
```

タイムゾーンのファイルがない場合

```
$ opkg install tzdata
```

タイムゾーンをJST-9に設定(再起動でデフォルトに戻る)

```
$ export TZ=JST-9
```

タイムゾーンの規定値の保存、変更

```
$ cp /etc/localtime /etc/localtime_default 
$ cp  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

ntpサーバーの設定

```
vi /etc/ntp.conf
```

```
server ntp.nict.jp iburst     
server 0.asia.pool.ntp.org iburst  
```

※「iburst」とつけることですぐに同期される。

```
$ vi /etc/default/rcS
```

下記のように変更する。

```
UTC=yes
→UTC=no
```
ffmpegのコマンド実行例

ffmpegは動画を作ったり抽出したり色んなことができるのですが、オプション多すぎてわからなくなるのでメモ

## 基本

```
ffmpeg -i input.mp4 output.avi
```
`-i`で入力を指定し、最後に出力を指定する。

## 何にでも付けられるオプション

```
ffmpeg -y -v error -i input.mp4 output.avi
```
`-y` は出力ファイル(`output.avi`)がすでにある場合に何も聞かずに上書く。
`-v error` はログレベルがエラー以上のもののみ画面に出力する。(指定しないと色んな情報が画面に出力される)


## 複数の動画をつなげて1つの動画にする

```
ffmpeg -f concat -safe 0 -i list.txt -c copy concat.mp4
```

list.txtファイルには、つなげたい動画を1行に1ファイルずつ頭に『file 』を付けて順番に書く。

```text:list.txt
file /path/to/input/file1.mp4
file /path/to/input/file2.mp4
```

## 1枚の静止画から動画を作る

```
ffmpeg -loop 1 -i pict.jpg -i audio.aac -c:v h264 -profile:v main -t 10 -pix_fmt yuv420p -r 60 out.mp4
```

`-i pict.jpg -i audio.aac` で静止画と音声を指定
`-c:v h264` で動画のコーデックをh264に指定
`-t 10` で動画の時間を10秒に指定
`-r 60` でフレームレートを60に指定

## 複数枚の静止画が5秒ずつ表示されるスライドショー的な動画を作る

```
ffmpeg -r 0.2 -i %02d.JPG -b:v 3000k -c:v h264 -pix_fmt yuv420p -r 30 out.mp4
```

`-r 0.2` はフレームレート(1秒に何枚静止画を出すか)の指定なので、0.2だと1枚の静止画が5秒間表示されることになる。
`-i %02d.JPG` で入力静止画のフォーマットを指定。`%02d`は2桁の数字を意味するので、この場合は`01.JPG`、`02.JPG`、...、`99.JPG`が対象となる。連番である必要がある。
`-b:v 3000k`で動画のビットレートを指定。大きくすると綺麗になるがファイルサイズも大きくなる。
`-r 30` 動画のフレームレートを指定する。

## 動画から静止画を抽出する

```
ffmpeg -ss 10 -t 5 -i input.mp4 -r 2 -f image2 pict%02d.jpg
```

`-ss 10` で抽出位置を開始から10秒の位置に指定(指定しない場合は最初から)
`-t 5` で時間を5秒間に指定(指定しない場合はすべてが対象)
`-r 2` で1秒に2枚抽出することを指定

1秒に2枚で5秒間なので、pict01.png〜pict10.jpgの10枚ぐらい(多少前後するっぽい？)の連番ファイルができる。
出力ファイル名の拡張子をpngにしたらpngになる。

## 無音の音声ファイルを作る

```
ffmpeg -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=48000 -c:a aac -t 1 silence.aac
```

`-t 1` で時間を1秒に指定
Euler法による数値解析

### Euler法とは
Euler法とは、常微分方程式の数値解析に使用される方法の1つです。
微分方程式では、ある関数の次の値を求めることが難しいので、様々な数値解を求める方法があります。今回は、そのEuler法をC言語で記述し、データをgunuplotで表記します。また、対象とする常微分方程式は、RC回路のコンデンサ電圧における回路方程式とします。この回路では、直流電源を用いるとします。まず、Cのソースコードを示します。


```
#include<stdio.h>
#include<math.h>

float func(float t, float Vc) {

	return 100000 - 1000 * Vc;

}//オイラー法用

int main(void) {

	float Vc, t, step, R, C, end;
	int error;
	FILE *fp;

	R = 10;
	C = 0.0001;
	step = ((R*C) / 100.0)*50;
	Vc = 0.0;
	end = 0.01;

	if ((error = fopen_s(&fp,"Euler_data_50.txt", "w")) != 0) {

		printf("\nThis file can't opened \n\n");

		return 0;

	}

	for (t = 0.0; t <= end; t = t + step) {

		fprintf(fp, "%f %f\n", t, Vc);
		Vc = Vc + step * func(t, Vc);

	} //Euler法用

	fclose(fp);
	
	return 0;
}

```

上記のソースコードを実行すると、時間領域におけるRC回路のコンデンサ電圧の値がtextファイルとして出てきます。
この出てきたファイルをgunuplotで実行させるとRC回路のコンデンサ電圧におけるEuler法を用いた数値解をプロットする事が出来ます。

以下に、簡単なGunuplotのソースコードを示します。


```

se grid
se xrange [0:0.01]
se yrange [0:110]
se xlabel "s[sec]"
se ylabel "Vc[V]"
plot "Euler_data.txt" using 1:2 with lines



```
GitHub+GitFlowでプロジェクト始めるときにやったこと覚書

## 前提
* OSはWindows7
* GitHub上に空プロジェクトは作成済
* 今更感ありありの初歩的な話のみ 
* プロジェクトがGitFlowなのでその辺の準備も含む
* あまり真面目に書いていない
 
## やった事

### 1. 作業フォルダの作成

適当に作業フォルダを作成
C:\work\projectX\

### 2. 作業環境の初期化
ひとまず、GitHubの指示にしたがってみる。
Git Bashとかで、作業ディレクトリに移動してから下記コマンド実行。

```
echo "# プロジェクトX" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/{your-account}/{repository-name}.git
git push -u origin master
```

#### 順番に意味をメモ ####

```
echo "# プロジェクトX" >> README.md
```
readmeファイルを作っているだけ。Git関係ないので割愛。

```
git init
```
新しいGitリポジトリを作成する。.gitディレクトリが実行した場所に作成される。
これでただのディレクトリがGitリポジトリに。なんということでしょう。

ちなみに、うっかり再実行しても上書きされたりはしないらしい。

```
git add README.md
```
作成したREADME.mdファイルをステージング。
リポジトリにコミットする準備できてるよマーキングですね。
舞台裏で出番をまつ女優みたいな感じ。もちろん男優でもいい。

```
git commit -m "first commit"
```
ステージングしてあるファイル（今回はREADME.mdのみ）を作成したローカルリポジトリにコミット。
この時コミットコメントとしてfirst commitを指定。
ついに初舞台に上ったわけですね。

```
git remote add origin https://github.com/{your-account}/{repository-name}.git
```
リモートリポジトリの追加。
originという名前に、指定したgithubリポジトリをリンク。
以降、originといえば、指定したgithubのリポジトリを指すようになる。

```
git push -u origin master
```
ローカルリポジトリのcommitをoriginに反映させる。
-uオプションを指定することでリモートの追跡が設定される模様。
つまり、今いるブランチのママンは origin masterだよということをメモしたということ。パパでもいい。
うーん、このコマンドはもうちょっと挙動を学んだ方がよさそうだ。

### 3. git-flow用の環境にする

#### CUIツールのgit-flowをインストールしてサクッと準備
参考）https://qiita.com/tanishi/items/09e72c65c0a0c9e1cc10
こちらの記事を参考に、CUIのgit-flowをインストールしてみた。

2018/02/05 追記 ： 
　開発フェーズ開始後はSourceTreeを利用しています。便利！

```
git flow init -d
```
ってやるとローカルリポジトリにgit-flow用のブランチがピャっとできる。ピャっと。


```
git push --all
```
取り合えずリモートに反映してみて恐る恐るGitHubサイトを確認。
よしよし、developブランチが追加されておる。


2018/02/05 追記 ：
　上記手順で作成したdevelopブランチがリモートを追跡していなかった（git push --allだったから）ので、追跡するように下記コマンドを実行しています。これで、ローカルのdevelopブランチがリモートのdevelopブランチをストーキングするようになりました。

```
git branch --set-upstream-to=origin/develop develop
```


#### デフォルトブランチの変更

ついでに、GitHubサイト上でデフォルトブランチをmasterからdevelopにしておく。
GitFlowなのにプルリク出そうとしたときに毎回masterブランチが選択されているのはつらいですよね…。
新しいメンバーが普通の手順でcloneしたらmasterになるのもつらいですね…。

1. タブメニューの[Settings]をクリック。
2. サイドメニューの[Branches]をクリック。
3. Default branchをmasterからdevelopに変更。
4. [Update]ボタンをクリック。
5. プルリクやクローンの対象が変わったりするけどいいのって聞かれる。
6. [理解の上、デフォルトブランチを更新]ボタンをクリック。

これで、よだれ垂らしながら作業してても大丈夫。

終わり

## 余談

初期化作業を、うっかりWindowsのコマンドプロンプトでやったらechoで作ったREADMEが文字化けして恥ずかしいコミットができてしまった。
こんな恥ずかしい履歴は後世に残してはいけないので、しれっと隠すべくrebaseしたりpush -fしたり普段あんまりやらないことをいきなりやる羽目になったわけですが、その再２回目のコミットを初回のコミットにリベースする場合は ```git rebase -i --root```みたいな感じで--rootを付けないと出来ないということをお勉強できた！ちょっとハマったので３時間後の自分のために残しておく。
怪我の功名、結果オウライ。

念のため git push の -fオプション は他の誰とも作業していない段階でしかやってはならないことも３時間後のｊ（略
【R】mygeneパッケージで遺伝子の情報を取得する

##概要
R用クライアントmygeneパッケージを用いて, 遺伝子情報取得ウェブサービス[MyGene.info](http://mygene.info)で遺伝子に関する要約文(GeneRIF)を取得する

##使用したRのバージョン
- R 3.4.3

##パッケージ
- [mygene](https://www.bioconductor.org/packages/release/bioc/html/mygene.html) (Bioconductor) 

##mygeneパッケージのインストール

```{r}
source("https://bioconductor.org/biocLite.R")
biocLite("mygene")
```

- [available fields](http://docs.mygene.info/en/latest/doc/data.html#available-fields) に取得できる情報の一覧がある

- 例えば`field = "generif"`とすると[NCBI gene GeneRIF](https://www.ncbi.nlm.nih.gov/gene/about-generif)のテキストとpubmedのNo.が取得できる

##Rのコード
遺伝子名 (symbol) でGeneRIFを古いものから5個取得する

```{r}
x <- read.table("genelist.txt")
x

##      V1
## 1 BIRC6
## 2  RND3
## 3  NSD1
## 4 CNNM1
## 5 MCMBP
```
<b>コード</b>

- in_fに遺伝子名リスト (genelist.txt) を指定

- 拡張子をのぞいた文字列をprefixとして, prefix_info.tsvというタブ区切りのテキストができる

- この例ではqueryとしてsymbolを用いているが, [available fields](http://docs.mygene.info/en/latest/doc/data.html#available-fields) にあるidであれば`queryMany(scopes = "ensembl.transcript")`のように`scopes`オプションで指定できる

```{get_generif.r}
#パッケージ読み込み
library(mygene)

#遺伝子名リストのファイルを指定
in_f <- "genelist.txt" 

#出力ファイル名を指定
prefix <- gsub("\\..+$","",in_f)
out_f <- paste(prefix,"info.tsv",sep = "_")

data <- read.table(in_f,stringsAsFactors = FALSE)
d_list <- c(data$V1)

#出力ファイルのヘッダー
header <- c("query","gene_id","pubmed","text")

#symbolをgene idに変換
geneid_list <- queryMany(d_list,scopes = "symbol",
                         fields="entrezgene", species="human")

#はじめにヘッダーを書き込む
write(header,file = out_f,ncolumns = 4,sep = "\t")

#GeneRIFのtextを古いものから5個まで抽出して書き込む
for (i in 1:nrow(geneid_list)){
  if (is.na(geneid_list$entrezgene[i])){
    na_text <- paste(geneid_list$query[i],"NA","NA","NA",
                     sep = "\t")
    write(na_text,file = out_f,append = TRUE)
  }
  else{
    gene <- getGene(geneid_list$entrezgene[i],fields = "generif")

    
    if (length(gene[[1]]$generif) < 5){
      gr_text <- rep(NA,length(gene[[1]]$generif))
      for (j in 1:length(gene[[1]]$generif)){
        gr_text[j] <- paste(geneid_list$query[i],
                            geneid_list$entrezgene[i],
                        gene[[1]]$generif[[j]]$pubmed,
                        gene[[1]]$generif[[j]]$text,
                            sep = "\t")
      }
      write(gr_text,file = out_f,append = TRUE)
    }
  
    else{
      gr_text <- rep(NA,5)
      for (j in 1:5) {
        gr_text[j] <- paste(geneid_list$query[i],
                            geneid_list$entrezgene[i],
                        gene[[1]]$generif[[j]]$pubmed,
                        gene[[1]]$generif[[j]]$text,
                        sep = "\t")
      }
      write(gr_text,file = out_f,append = TRUE)
    }
  }
}
```
##結果
```
symbol	gene_id	pubmed	text
BIRC6	57448	14765125	Overexpression of Nrdp1 promotes ubiquitination and proteasomal degradation of BRUCE.
BIRC6	57448	15300255	Apollon binds to, ubiquitinates and facilitates proteasomal degradation of SMAC and caspase-9, results suggesting that Apollon has an essential function in preventing SMAC-induced apoptosis
.....
```
[laravel]超楽debug出力

## For
ログ出力時に、変数の値だけじゃなくて`methodName`と`変数名`を出力したい...けどいちいち書きたくないひとへ

## これ
```php
...
function getMethodName(){

 $data = 200;
 logger(__method__ ,compact('data'));
}
...
// [2018-02-08 12:03:37] local.DEBUG: App\Libs\CartsUtil::getMethodName {"data":200} 
```

## 要点
- `__method__` : メソッド名の取得
- `compact()` : 変数を配列型にパッキングして渡せる
- `logger` : 第二引数は配列を渡す。compact()を使わないときは `[$data]`とするとよし

...
この方法に気づいて感動したので皆さんに共有。
jupyter notebook上でtensorboardを使うとscalarグラフが書き出されない時の対処法

# 起こった症状
ローカルで実行した時はscalarグラフも表示されるのに、
jupyter notebook上で実行したらscalarグラフが表示されない...

こんな感じでグラフだけ表示されて...
<img width="1421" alt="スクリーンショット 2018-02-08 10.57.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/177228/acb44abb-94e6-7b13-5f07-c4af69fa6ca6.png">

scalar開くと「No scalar data was found」って言われます。
<img width="1403" alt="スクリーンショット 2018-02-08 10.58.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/177228/d5e26e8b-2e4d-1565-9728-0f22755415fd.png">

## この時のコード
```python:test_board.ipynb
import tensorflow as tf

# 既存のグラフを削除
tf.reset_default_graph()

# tensorboardファイル出力先
logdir = './logdir/'

a = tf.constant(2, name='a')
x = tf.placeholder(tf.int32, name='x')
y = tf.multiply(a, x, name='y')

# yの値をグラフに表示
tf.summary.scalar('y_value', y)

# 全てのサマリーを集約
merged = tf.summary.merge_all()

sess = tf.Session()

if tf.gfile.Exists(logdir):
    tf.gfile.DeleteRecursively(logdir) 
writer = tf.summary.FileWriter(logdir, sess.graph)

init = tf.global_variables_initializer()
sess.run(init)

for i in range(10):
    summary, res = sess.run([merged, y], feed_dict={
        x: i
    })
    writer.add_summary(summary, i)

print('------finish!------')
```
※このコードをローカルで実行すると、しっかりscalarグラフが表示されます。

# 対処法
add_summary()の呼出しが全て終了した後の部分に

```python:
writer.flush()
```
って入れます。

こんな感じです

```python
for i in range(10):
    summary, res = sess.run([merged, y], feed_dict={
        x: i
    })
    writer.add_summary(summary, i)

'''追記箇所'''
writer.flush()

print('------finish!------')
```

ポイントは、add_summary()の**すぐ後ではなく、add_summary()の呼出しが全て終わってから記述すること**です。

## 結果
こんな感じで、ちゃんとscalarグラフが表示されます。
<img width="1406" alt="スクリーンショット 2018-02-08 11.16.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/177228/47ec3551-00d8-a18b-bf61-1cade55a1746.png">

余談ですが、グラフの曲がり具合は横のsmoothingを動かすと変わります。
こんな感じです。
<img width="1405" alt="スクリーンショット 2018-02-08 11.18.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/177228/9aaaeb15-1c7b-b941-e8d0-fafda7cfb215.png">

## 理由
writer.flush()の説明を見ると、
> Flushes the event file to disk.
 Call this method to make sure that all pending events have been written to disk.

と記述されているので、イベントが溜まりっぱなしで書き出されてなかったからscalarグラフが表示されなかったようです。
ローカルで実行した時にscalarグラフが表示されたのは、プログラムが終了する時にtensorboardがこれを自動的に行ってくれていたから。

そう考えると確かに、jupyterのセルって一度実行するとそのセルの内容を別のセルでも利用できるから、プログラムが終了してない。
そうなると、勝手に呼び出してくれないので、明示的に記述しないとダメってことなのかな？って思いました。

※jupyterとかプログラムとかに別段詳しい訳ではないので不適切な言い回しなどがあるかもしれないですが、そういう場合はどんどん指摘していただけると嬉しいです！！
Chalice(Python Serverless Microframework for AWS)ではまったメモ

# LambdaファンクションをVPC内にデプロイ
2018.02時点ではVPC Supportはプルリクが出ているが、マージはされていない模様。
一旦、VPC外にLambdaファンクションをデプロイしてから以下の通りLambdaファンクションの設定を変更する。再デプロイであれば変更した設定は引き継がれているので、その後はそのまま使い続けられる。
1. Lambdaファンクションに設定されているロールに AWSLambdaENIManagementAccess もしくは AWSLambdaVPCAccessExecutionRole のポリシーをアタッチする。
2. VPC、サブネット、セキュリティグループを適切なものに設定する。


# 例外が表示されない
Chaliceが握りつぶすので app.debug = True を設定する。

# PolicyLengthExceededExceptionが出た
```
ERROR - While deploying your chalice application, received the following error:

 An error occurred (PolicyLengthExceededException) when calling the
 AddPermission operation: The final policy size (20513) is bigger than the
 limit (20480).
```
Lambda関数を一回消すと出ない。
IMEの辞書ツールで資料作成を効率化

# はじめに

設計資料などを書き進めているとき，毎回入力してたりコピペしてたりする内容って多々ないでしょうか？
書いているとついつい忘れてしまい，自分で調べてしまうこともしばしば．

最近はMarkdownで何かを書く機会が多くなってきたので試しにIMEに辞書登録した．

# 登録内容と経緯

最終的にこうなった．

```
ｍづｒｌ：[title](http://...)
```

**これぐらい覚えろよ！！**って言われそうですが，意外と覚えられない．
（そこまで使い込んでいない）
段落だったりするのは簡単に覚えられるのですが，それ以外はことごとくダメ・・・

### 最初は`url`で定義した．

```
url：[title](http://...)
```
しかしこれ，変換したいときにそのまま打ってると`うｒｌ`となってしまう．これでは変換ができない．
また，ローマ字入力ではそのまま変換ができない．

個人的にCapsを押してから打つのも嫌なので・・・

### 登録を見直すことにした．

```
うｒｌ：[title](http://...)
```

ラクなんだけど・・・

よくコーディング中にめんどくさくて`url="http://..."`と打つときによくそのまま`うｒｌ＝”ｈっｔｐ：・・．．．”`と打ってからF9,F10することが多い．切り替えてから入力するより圧倒的にラクなので・・・

しかしこれ，**変なときに変換が暴発してｳﾜｱｱｱｧｧｧってなる**

### ならば

```
ｍづｒｌ：[title](http://...)
```

`md`ってつけてからでいいんじゃね？って単純な発想をした．とりあえず`mdurl`とそのまま打つと`ｍづｒｌ`となるので，そのまま変換できる．


# まとめ

今の自分のIMEはこんな感じになりました．適宜追加して徹底的に活用していきたいと思っています．

```
f32：0123456789ABCDEF0123456789ABCDEF　（半角32文字）
f16：0123456789ABCDEF　（半角16文字）
にちじ：XXXX/XX/XX XX:XX
ｍづｒｌ：[title](http://...)
```

こんな感じで辞書登録しています．画面設計書とか書く際には結構便利！
たぶんExcelの覚えてない関数とかも登録しとくと有効に使えそうですね．
IME辞書はもはや辞書ではなくコーディングツールとして有効活用したほうが手っ取り早いかも．
matplotlibのインストールでハマったメモ

# はじめに
CentOS7.4で、Python3の環境を整えようとしてハマったのでメモ。
日本語の記事がなかなか見つからなかったので、備忘録に。

#環境
CentOS 7.4-1708
Python3.6

#生じた問題

```bash:
pip3 install matplotlib
```
を実行後、python3環境にて、

```python:
import matplotlib.pyplot as plt
```
を実行したが、以下のエラーを吐いた。

```python:
ModuleNotFoundError: No module named 'tkinter'
```


#解決方法

tkinterなるものを入れれば良さそうだったので、下記のサイトに書いてある諸々を試した。
[CentOS 7 python + matplotlibでエラーになった対策](http://gkz505vaio.hatenadiary.jp/entry/2017/11/05/215528)
しかしこれでは解決しなかったので、以下のサイトを参考にした。
[【備忘録】CentOS6.7+Python2.7+matplotlibでハマった](https://qiita.com/Wanwannodao/items/aa881e21cff36e3268bd)
Python2系の記事だが、問題は同じ感じで、以下を試して解決した。

```bash:
yum install python36u-tkinter
```
これで、matplotlibやpython3の再インストールを行わずとも問題は解消したようだ。
今後これでもダメそうなら再インストールとか試すかも。
PrometheusのAlerting rulesをv1.xからv2.x用に書き換える

## 概要
Prometheusでalert設定をしようとしてなぜか、起動時にformatエラーになるので調べてみると、v1.xとv2.xでは記法が変わっていたのでメモ。


## versionごとの記法

- v1.xの記法

```instance.rules
ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS {
    severity="page"
  }
  ANNOTATIONS {
    summary = "Instance {{$labels.instance}} down",
    description = "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes.",
  }
```

- v2.xの記法

```yaml:instance.rules.yaml
groups:
- name: instance.rules
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: page
    annotations:
      description: '{{$labels.instance}} of job {{$labels.job}} has been down for
        more than 5 minutes.'
      summary: Instance {{$labels.instance}} down
```

なんとyamlに変わっていました。

## 変換方法
[こちら](https://prometheus.io/docs/prometheus/2.1/configuration/recording_rules/)のサイトに記載がありますが、下記でformatをチェックするpromtoolがインストールできます。

```
$ go get github.com/prometheus/prometheus/cmd/promtool
```

このtoolを使って、v1形式のファイルをv2形式に変換できます。

```
$ promtool update rules instance.rules
```

実行後、 `instance.rules.yml` というファイルが出来上がります.
MongoDBをsupervisorでプロセス監視する手順メモ

#環境
ubuntu16.04LTS
MongoDB version v3.4.11
supervisor 3.2.0


#手順
/etc/supervisor/conf.d/mongod.confを作成

```/etc/supervisor/conf.d/mongod.conf
[program:mongod] ;
directory=/var/lib/mongodb ; 
command=/usr/bin/mongod -f /etc/mongod.conf ;
numprocs=1 ; 
autostart=true ; 
autorestart=true ; 
user=mongodb ; 
redirect_stderr=true ; 
stdout_logfile=/var/log/supervisor/mongod.log ;
```

/etc/mongod.confはデフォルトだけど一応掲載

```/etc/mongod.conf
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: /var/lib/mongodb
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1


#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:
```

dbpathの/var/lib/mongodb 以下が全てmongodbユーザでアクセスできるか確認
なってなければ次のコマンドで所有権変更しとけばok

```
$ cd /var/lib
$ sudo chown -R mongodb mongodb
$ sudo chgrp -R mongodb mongodb

```

あとはsupervisorを起動してファイル読ませてmongod起動、起動確認

```
$ sudo service supervisor start
$ sudo supervisorctl reread
$ sudo supervisorctl start mongod
$ sudo supervisorctl status
mongod                           RUNNING   pid 5652, uptime 0:00:10
```

上手くいかなければsupervisorを再起動

```
$ sudo service supervisor restart
$ sudo supervisorctl status
mongod                           RUNNING   pid 5652, uptime 0:00:10
```

 
一応、

```
$ mongo
```

でmongodbに接続できるか確認
gcloud の  Pub/Sub へ node.js で Publish する

gcloud の Pub/Sub へ Node.js で Publish してみました。

認証の JSON については、こちらと同じものを使いました。
[gcloud の Pub/Sub を python3 で行う](https://qiita.com/ekzemplaro/items/09270045ff485c7e13f8)

トピックの作成

```js:create_topic.js
#! /usr/bin/node
// ---------------------------------------------------------------
var gcloud = require('gcloud');

console.error ("*** 開始 ***")

var pubsub = gcloud.pubsub({
  projectId: 'my-project-sep-10-2017',
  keyFilename: '../my-project-sep-10-2017.json'
})

// Create Topic
pubsub.createTopic('info_1', function(err, topic, apiResponse) {

  // Error check e.g. Authentication Check
  if (err) {
    console.log(err);
    return;
  }
})

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

パブリッシュ

```js:iot_publish.js
#! /usr/bin/node
//
//	iot_publish.js
//
//					Feb/08/2018
// ---------------------------------------------------------------
var gcloud = require('gcloud');

console.error ("*** 開始 ***")

var pubsub = gcloud.pubsub({
	projectId: 'my-project-sep-10-2017',
	keyFilename: '../my-project-sep-10-2017.json'
})

const dd = new Date()
const now = dd.getHours() + ":" + dd.getMinutes() + ":" + dd.getSeconds() 
const registerMessage = {
	data: { userId: 10003, name: '鈴木', event: '新規加入',
		key_1: 'おはよう', key_2: 'こんにちは',
		time: now
	}
}

console.log(registerMessage)

var topic = pubsub.topic('topic_1');
topic.publish(registerMessage, function(err) {
  if (err) {
    console.log(err);
  }
})

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```
IISのrewriteモジュールインストーラのダウンロードページ

なかなか見つけきれなかったのでメモ。

「LaravelをWindowsのIIS上で動作させるためには、IISにRewriteモジュールのインストールが必要ってことは分かるんだけどどこからダウンロードすればいいのか分からない」って人向け。
今時IIS使う人あまり居ないと思うけどお役に立てれば幸いです。

https://www.iis.net/downloads/microsoft/url-rewrite
（下の方に日本語版インストーラがある。）
.ipa ファイルを iPhone にインストールする

Mac は持っているけど、開発ツールは使ったことないや、という人向けに（デザイナーさんを想定）、開発者からもらった .ipa ファイルを iPhone にインストールする方法を説明します。

以前は iTunes が使えたのですが、仕様が変わってできなくなってしまったので、Apple Configurator 2 というアプリを使います。

# 用意するもの
Mac と iPhone と、それらをつなげるケーブル（ライトニングケーブルとか）だけです。

# 手順
まずは Apple Configurator 2 を App Store からインストールします。
次のリンクをクリックするか、App Store で Apple Configurator を検索するとすぐに見つかります。
https://apps.apple.com/jp/app/apple-configurator-2/id1037126344

<img width="148" alt="icon.png" src="https://qiita-image-store.s3.amazonaws.com/0/214356/199a5829-6577-0979-bb75-b4ff8dea5fad.png">

インストールが終わったら、さっそく Apple Configurator 2 を開きます。
使用許諾が終わったら、ようこそ画面が出るので、はじめようをクリックします。

<img width="429" alt="Welcome.png" src="https://qiita-image-store.s3.amazonaws.com/0/214356/4594e1e3-98a2-01d6-92c3-f40b03355aba.png">

iPhone と Mac をケーブルでつなぎます。

<img width="652" alt="DropTarget.png" src="https://qiita-image-store.s3.amazonaws.com/0/214356/13263e7c-83e5-1031-fc55-be24c52ad1bc.png">

上のように iPhone のイメージ画像が表示されます。
もらった .ipa ファイルをドラッグして、iPhone のイメージ画像のところにドロップします。

<img width="647" alt="Install.png" src="https://qiita-image-store.s3.amazonaws.com/0/214356/132ced6f-fd40-58b5-02b1-85d651d593bd.png">

すぐにインストールが始まり、待っていれば無事にインストール終了されるはずです。

うまくインストールできない場合は iPhone を開発用に登録したり、.ipa ファイルを作り直したりしないといけないので、.ipa を作った人に問い合わせてみて下さい。
【PHP】メール形式チェックの手段

複数メールアドレスを格納している配列に、個々メールアドレスのチェックを例として説明します。

## CakePHPのデータバリデーションによるメールチェック

```php:sample1
/**
* 厳密なチェック１ 
*   無効パターン：
*     ＠の前にドットがある（.@）
*     ドットが連続している（…）
*     
* ※回避方法はページ下部の[CakeEmailのメールアドレスチェックを回避する]にご参考
*  
*/
use Cake\Validation\Validator;
use Cake\Validation\Validation;

$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
	'mail' => [
		'rule' => function ($value, $context) {
			foreach ( $value as $mail ) {
				if (Validation::email ( $mail ) == false) {
					return false;
				}
				return true;
			},
		'message' => 'メールアドレス形式不正。'
	],
] );


```

## PHPのフィルターによるメールチェック

```php:sample2
/**
* 厳密なチェック２ 
* 
*   e-mail アドレスが RFC 822 に沿った形式であるかどうかを確かめます。
*   ただし、
*   　　コメント、空白の折り返しおよび ドットなしドメイン名には対応していません。
*   　　[参考](http://php.net/manual/ja/filter.filters.validate.php)
*/

use Cake\Validation\Validator;

$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
	'mail' => [
		'rule' => function ($value, $context) {
			foreach ( $value as $mail ) {
				if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) { // RFC 822 形式基準
					return false;
				}
				return true;
			},
		'message' => 'メールアドレス形式不正。'
	],
] );
```

## PHPの正規表現によるメールチェック

ある程度のかなり緩めのチェックをほしいとしたら、正規表現という手段にもあります。

```php:sample3
/**
* 緩めのチェック３ 
* 
*   e-mail アドレスが「半角文字(記号混在可)@半角文字(記号混在可)」というような形式であるかどうか。
*   
*/

use Cake\Validation\Validator;
$validator = new Validator ();
$validator
->allowEmpty ( 'mails' )
->add ( 'mails', [
	'mail' => [
		'rule' => function ($value, $context) {
			foreach ( $value as $mail ) {
				if (! preg_match ( '/^[!-~]+@[!-~]+$/', $mail )) { // 形式：半角文字(記号混在可)@半角文字(記号混在可)
					return false;
					}
				}
				return true;
			},
		'message' => 'メールアドレス形式不正。'
	],
] );

```


*参考*
[PHP-検証フィルタ ](http://php.net/manual/ja/filter.filters.validate.php)
[メールアドレスのバリデートはどっちが正しいの？ ](https://norm-nois.com/blog/archives/2945)
[CakeEmailのメールアドレスチェックを回避する](https://php-tips.com/2013/07/12/avoid-cakeemail-email-address-validatio/)

---I Love PHP (｡･ω･｡)ﾉ♡
AWS上でnvidia-dockerを使った機械学習環境を作る備忘録


私はDockerをよく使い、個人としてのソースコードの管理をCodeCommitで行っています。
仕事で利用するPCはGPUを搭載していないため、AWS上にGPUリソースが使える環境を使って学習させています。

どのように環境作成したかを忘れないための私による私のための記事です。

環境
---

* rootユーザーで実行
* AMI（Deep Learning Base AMI (Ubuntu) Version 3.0 (ami-de1476b8)）
* 利用するAWSサービス
	* IAM
	* CodeCommit
* docker
	* nvidia-docker2
	* docker-compose(1.19.0-rc3)



機械学習関連の環境作成
---


#### リポジトリ設定

```
apt-get -y install apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

apt-get update
```

#### dockerインストール

```
apt-get -y install docker-ce
```


#### docker-composeのインストール


```
curl -L https://github.com/docker/compose/releases/download/1.19.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
```

#### nvidia-docker2のインストール


```
curl -L https://nvidia.github.io/nvidia-docker/gpgkey |apt-key add -

tee /etc/apt/sources.list.d/nvidia-docker.list <<< \
"deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/amd64 /
deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64 /"

apt-get update
apt-get install -y nvidia-docker2
pkill -SIGHUP dockerd
```

ソースコード管理
---

#### CodeCommitとの連携

```
apt-get install -y git
git config --global credential.helper '!aws --region ap-northeast-1 codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```

#### EC2に紐付いているIAMの設定


* IAMSelfManageServiceSpecificCredentials 
*  AWSCodeCommitFullAccess 
*  IAMReadOnlyAccess



参考にさせていただいた記事
---

* https://qiita.com/lynlea/items/e00248dd697059969203


関連する自身の記事
---

* https://qiita.com/RyujiKawazoe/items/e034454d628bfa23055f
Javaで外部プロセスを実行する

#ProcessBuilder
今の現場で、Java内からShellを叩けという要望があったので調べた結果、[こちらの記事](https://qiita.com/itoa06/items/9e761d53c58eeb20490e)で紹介されていた**ProcessBuilder**というものを使えば良いらしい。
リンク先コードを流用してしまっているが、実際に使うときは動的にプロセスの呼び先を変えるだろうな…
ということで、完全にメモ書き。

```Java:CallOutsideProcess.java

/** 
呼び出し元で 引数を好きなだけ入れて呼び出す。
Ex) execute(new String[]{"ping","111,222,33,4"});
*/
public class CallOutsideProcess {
	public void execute(String args[]) {
		try {
			Process process = new ProcessBuilder(args).start();
			InputStream is = process.getInputStream();

			/* プロセス実行側での文字列等の出力によっては、
			文字コードが一致しないと、受け取る際に文字化けを起こす*/
			InputStreamReader isr = new InputStreamReader(is, "Shift-JIS");
//			InputStreamReader isr = new InputStreamReader(is, "UTF-8");

			BufferedReader reader = new BufferedReader(isr);
			StringBuilder builder = new StringBuilder();
			int c;
			while ((c = reader.read()) != -1) {
				builder.append((char) c);
			}
			// コンソール出力される文字列の格納
			text = builder.toString();
			// 終了コードの格納(0:正常終了 1:異常終了)
			int ret = process.waitFor();
			System.out.println(text);
			System.out.println(ret);

		} catch (IOException | InterruptedException e) {
			e.printStackTrace();
		}
	}
}

```
割と今後使いそうな内容だったので、覚えておこう…
~~(…忘れても見れば思い出すように書いてるんだけど)~~
今VRMLを動かすには

Unityの勉強を最近初めました。ふと「３DCGといえば、VRMLって今どうなったんだろう」と思い調べてみました。
#VRMLとは
Virtual Reality Modeling Languageの略。
Webで３DCGを利用するために設計された。VRML言語で記述しテキスト形式で保存したファイル（拡張子wrl）をブラウザで開くと、３次元の物体や仮想空間が表示される。
アニメーション、光源、視点などの設定もでき、またJavaやJacaScriptを使った制御もできる。
VRMLの最初のバージョン（VRML 1.0）は1994年11月に制定されたがVRML2.0が一般的。
#VRMLの現状
Web上での３DCGの表現についてはXMLベースのX3Dへと移行され、VRMLは現在ほとんど用いられていない。
##今でもVRMLを表示できるの？
はい！今でもVRMLプラグインが配布されていました。VRMLで記述された３DCGを表示できます。
Cortona3D
http://www.cortona3d.com/cortona3d-viewers
サンプルのVRMLファイルもダウンロード出来ました。
私が一番最初（ン十年前）にテキストエディタでコーディングしてみたのはVRML1.0で、それきりになっていましたので、VRMLによる綺麗で動きのあるグラフィックが見られて、ちょっと感激しました。
##編集するには？
かつては3DCGアニメーション制作ツールのBlenderでwrlファイルのエクスポートが出来たそうです。しかし現在ではできなくなっていました。
Blender.jp
https://blender.jp/
VRMLによる表現に限界があったことで次世代のX3Dに移行したとはいえ、制作環境が無い場合、限定的に活用するのも厳しくなってしまいますね。
###WrlファイルとBvhファイル
VRMLで形状のデータを記述し「ワールド」と呼ばれる３次元の世界を作るのですが、これはwrlファイルとして保存し、キャラクターなどの動き（アニメーション）はBvhファイルに保存するようです。
参考：Blenderを用いたVRMLとBVHファイルの作成
http://acerola3d.osdn.jp/docs/format/tutorial3/
加えて、制御はJavaやJavaScriptで行います。
参考：VRML with JavaScript Tutorial
http://www.ceres.dti.ne.jp/~kekenken/main/3d/script/index.html
##これからのVRML
HTML5の登場で脚光を浴びるようになったJavaScriptのようなことが、VRMLにも起こるでしょうか？
JavaScriptは、アプリ開発などに用いるJavaと名前の類似もあって常に比較されてきました。かつてJavaScritpはWebページ上で限定的な機能を実現するために使われていました。日付や時刻を表示する、入力チェックをするなどで、FlashやPHPの補助的な立場ともいえました。
しかしHTML5が登場してWebブラウザでのイベント制御や描画をJavaScriptで行えるようになってから、今ではJavaScriptが優位と言われることもあります。アプリもCordovaなどを使えばJavaScriptで作れるようにもなりましたしね。
私個人としてはJavaとJavaScriptは言語でメリットもそれぞれなので一概にはなんともと言えないと思っています。
VRMLも何かのきっかけでその特性が注目され、利用されるようになるかもしれませんね。Three.jsなどを見ていると、VRMLは３DCGの基礎の教育用として利用も可能性としてはあるのかと思いました。
AWS CodeDeployとCodePipelineでハマった時の対処法


## TL;DR
エラーの原因はAWS(ポリシーやロールの権限)、Github、CircleCI、etc... の設定ミスです。
やりたい事次第でエラーもそれぞれなので、ログ見てググりましょう！

```:EC2instance
# tailコマンドでログを200行表示
$ tail -f -n 200  /var/log/aws/codedeploy-agent/codedeploy-agent.log
```

## はじめに
Github push → CodePipeline → CodeDeployでデプロイ自動化をやりたくて
AWSのドキュメントを見るも意味不明。。。

以下の方々の記事を参考にしました。
[AWS CodeDeployの導入 & AWS CodePipeLineでgit pushの度にEC2に自動デプロイ & 結果をSlackに通知](https://qiita.com/hayashier/items/79ae7d5884faa518f430#aws-codedeploy%E3%81%AE%E5%B0%8E%E5%85%A5)
[AWS CodeDeployとGitHubを連携してEC2に簡単自動デプロイ](https://qiita.com/dq-nobuko-takatsuki/items/ba365966ae61e177a4da)
[GitHubへのpush時にCodeDeployを使ってEC2にアプリケーションをデプロイする](https://qiita.com/toshihirock/items/4ab08afcab2a0e7628a8)
[[AWS] CodeDeploy+CodePipeline+GitHub push時にEC2にデプロイ](https://qiita.com/hibriiiiidge/items/5e1dddaff40f22e57341#%EF%BC%93-github%E3%81%AE%E8%A8%AD%E5%AE%9A)


## 環境
CLB(Classic Load Balancer)
インプレースデプロイ
EC2インスタンス２台(AZ)

## ① まずはCodeDeployだけで動作するようにする
上記の記事を参考に設定し、CodeDeployのコンソールでデプロイボタンを押すと
案の定エラーになった。

（※画像はAWSフォーラムより引用）
<img width="1360" alt="ss2.png" src="https://qiita-image-store.s3.amazonaws.com/0/40799/c693f7fb-3a71-dd64-49b4-c34d4e5bcbfc.png">
↓ View Logsを踏むと

<img width="766" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/40799/758d54ca-b6eb-5acb-42c7-530544e2bdbc.png">


<font color="#ff0000">UnknownError</font> (＃＾ω＾)ﾋﾟｷﾋﾟｷ

```:私の場合
Error Code : UnknownError
Message : Access Denied
```

コンソール上ではそれ以上内容がわからないパターンがほとんどなので、EC2でエラーコードを見てググって解決する


```:EC2instance
# tailコマンドでログを200行表示
$ tail -f -n 200  /var/log/aws/codedeploy-agent/codedeploy-agent.log
```

## ② CodePipelineとGithubを連携する
Codedeployでデプロイが出来るようになったら、CodePipelineとGithubを連携。
そしてPUSHして見ると、またもやエラー・・・

（※画像はAWSフォーラムより引用）
<img width="1360" alt="ss2.png" src="https://qiita-image-store.s3.amazonaws.com/0/40799/c693f7fb-3a71-dd64-49b4-c34d4e5bcbfc.png">

ログを見て見ると、S3にアクセスできないと書いてある。

```:/var/log/aws/codedeploy-agent/codedeploy-agent.log
2018-02-06 10:34:21 ERROR [codedeploy-agent(11992)]: 
InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: 
Cannot reach InstanceService: Aws::S3::Errors::AccessDenied - Access Denied
```

どうやらCodePipelineはS3にログを取るらしいので
EC2インスタンスのロールにS3のアクセス権限を追加したら動きました :beer: 

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/40799/609b829f-0571-b65a-a612-6d126f987c0c.png)

## さいごに
AWSフォーラムもCodeDeployとCodePipelineの迷子だらけでしたw

はじめはわからないことが多いですが、一度出来てしまえば凄く楽です。
この記事が解決の参考になれば幸いです。
Ubuntuでsuコマンドでrootユーザになれない

Ubuntu16.04でsuコマンドでrootユーザになろうとしたら以下のようなエラーが出た。

```
$ su
Password: 
su: Authentication failure
```

#原因
Ubuntuのデフォルトでrootユーザのパスワードが設定されていないのが原因。

#対策
rootユーザのパスワードを設定する

```
$ sudo su -
# passwd
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
```

これでsuコマンドが使えるようになる。

```
$ su
Password: 
/home/xxx#
```
Sketch備忘録~iOS UI Design編~

#はじめに
iOS UI Designの関連でわかったことをここに整理。
自分の復習用に作った記事なので、ご了承ください

##環境
sketch Version48.2 (Free Trial)


#今回の備忘録

##パーツの分解
下のアイコンが表示されているとそのiOS UI Designは編集できない。
編集するには分解しなければいけない。
![スクリーンショット 2018-02-07 16.01.17.png](https://qiita-image-store.s3.amazonaws.com/0/153719/0e1d06ca-3898-09eb-548c-d47c9378a678.png)

Detach from symbolをクリックするとパーツを分解できる。
![スクリーンショット 2018-02-07 16.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/153719/467d7661-95c0-4581-1944-e6003ff759cf.png)

完成
![スクリーンショット 2018-02-07 16.02.21.png](https://qiita-image-store.s3.amazonaws.com/0/153719/a9dafea0-36c5-0c7f-5d03-f8a057fcb258.png)
【React Native】react-native-fbsdk Android エラー The SDK has not been initialized

### 「The SDK has not been initialized」エラー解決
SDKの初期化がされていませんというエラーです。

##＞環境

```
    "react-native-camera": "^0.13.0",
    "react-native-fbsdk": "^0.7.0",
```

![initialized error.png](https://qiita-image-store.s3.amazonaws.com/0/170662/ff2249c9-499d-64e9-27e2-7ed9db131acb.png)


##＞エラー内容

```
The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
sdkInitialized
    Validate.java:143
<init>
    AppEventsLogger.java:950
<init>
    AppEventsLogger.java:940
newLogger
    AppEventsLogger.java:452
initialize
    FBAppEventsLoggerModule.java:117
doInitialize
    ModuleHolder.java:198
markInitializable
    ModuleHolder.java:86
notifyJSInstanceInitialized
    NativeModuleRegistry.java:125
run
    CatalystInstanceImpl.java:385
handleCallback
    Handler.java:751
dispatchMessage
    Handler.java:95
dispatchMessage
    MessageQueueThreadHandler.java:31
loop
    Looper.java:154
run
    MessageQueueThreadImpl.java:194
run
    Thread.java:761
```

##＞修正内容
下記を追加
FacebookSdk.sdkInitialize(getApplicationContext()); 

```
    public void onCreate() {
        super.onCreate();
        SoLoader.init(this, /* native exopackage */ false);
        FacebookSdk.sdkInitialize(getApplicationContext());  // <- 追加
    }
```

##＞参考URL
https://tylermcginnis.com/installing-the-facebook-sdk-into-a-react-native-android-and-ios-app/
AndroidでアプリからOSの通知設定画面を開く

AndroidでアプリからOSの通知設定画面を開く

```java
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                               Uri.parse("package:" + BuildConfig.APPLICATION_ID));
    // カテゴリは設定しなくてもいいかも
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    // Flagは好みで設定
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    startActivity(intent);
} else {
    Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
    // カテゴリは設定しなくてもいいかも
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    // Flagは好みで設定
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

    // for Android 5-7
    intent.putExtra("app_package", BuildConfig.APPLICATION_ID);
    intent.putExtra("app_uid", activity.getApplicationInfo().uid);

    // for Android O
    intent.putExtra("android.provider.extra.APP_PACKAGE", BuildConfig.APPLICATION_ID);

    startActivity(intent);
｝
```
avaを使って非同期処理のテストをする方法の比較

テストコードを書くのが苦手でいつもどこまで書けばいいんだよ！
って思いながら書いています...
dynamoDBとか使ったテストは面倒だからいいやーって思って今までサボっていたのですが今回ちょっとやってみようかなーって思ってやろうと思った時に2つの手法を教わったので比較してみました。
今回テストしたのはdynamoDBからデータを取得する部分のテストです。
### coを使ってテスト
一番最初に思いついたのがcoを使ったテスト

``` co.test.js
const test = require("ava");
const co = require("co");
const service = require("../../../../services/service");
const id = "test"

test("#get data with co", t => {
  return new Promise((resolve, reject) => {
    co(function*() {
      return yield service.getData(id);
    })
      .then(() => {
        return resolve(t.pass());
      })
      .catch(() => {
        return reject(t.fail());
      });
  });
});

```

### generator関数を使ってテスト
avaではgenerator関数を使えるらしくそれを使ってみました。

``` generator.test.js
const test = require("ava");
const service = require("../../../../services/service");
const id = "test"
test("#get data with generator", function*(t) {
  try {
    yield service.getData(id);
    t.pass();
  } catch (e) {
    t.fail();
  }
});
```

なんかこっちの方がすっきりしてる...!!

### 比較してみて
コードの見た目的にもgenerator関数を使った方が読みやすく
処理時間もcoを呼ぶ時間を必要としていないからかgenerator関数の方が速かったです

```
  ✔ #get data with co (522ms)
  ✔ #get data with generator (506ms)
```


友人が言うにはテストの信頼性を損なうのでそもそもテストで外部モジュールを使うべきじゃない。
とのことだったので見やすく速く信頼できるgenerator関数を使いましょうということですね。