OmniAICreator/Qiita-1.07M huggingface dataset:
Golang で MongoDB のデータを更新 (Update)

Golang で MongoDB のデータを更新します。
次のプログラムで作成したデータを更新します。
[Golang で MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/18f49a75cb90b5060464)

ライブラリーのインストール

```bash
go get gopkg.in/mgo.v2
go get github.com/joho/godotenv
```

```golang:mongo_update.go
// ---------------------------------------------------------------
//
//	mongo_update.go
//
//					Jun/11/2019
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
	"strconv"
	"github.com/joho/godotenv"
)

type City struct {
	ID        bson.ObjectId `bson:"_id,omitempty"`
	Key      string
	Name      string
	Population     int
	Date_mod time.Time
}

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	key_in := os.Args[1]
	population_in,_ := strconv.Atoi (os.Args[2])

	fmt.Printf ("key_in = %s\t" , key_in)
	fmt.Printf ("population_in = %d\n" , population_in)
	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
	}
 
	user := os.Getenv("user")
	password := os.Getenv("password")

	mongoDBDialInfo := &mgo.DialInfo{
	Addrs:    []string{"127.0.0.1"},
	Timeout:  60 * time.Second,
	Username: user,
	Password: password,
}

	session, err := mgo.DialWithInfo(mongoDBDialInfo)

	if err != nil {
		panic(err)
	}

	defer session.Close()

	session.SetMode(mgo.Monotonic, true)

	db_name := "city"


	cc := session.DB(db_name).C("saitama")

	colQuerier := bson.M{"key": key_in}
	change := bson.M{"$set": bson.M{"population": population_in, "date_mod": time.Now()}}
	err = cc.Update(colQuerier, change)
	if err != nil {
		panic(err)
	}

	var results []City
	err = cc.Find(bson.M{"key": key_in}).Sort("key").All(&results)

	if err != nil {
		panic(err)
	}
	fmt.Println("Results All: ", results)

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:Makefile
mongo_update: mongo_update.go
	go build mongo_update.go
clean:
	rm -f mongo_update
```

```text:.env
user = '******'
password = '******'
```

実行コマンドの例

```bash
./mongo_update t1166 9347600
```

次のバージョンで確認しました。

```text
$ go version
go version go1.13.8 linux/amd64

$ mongo --version
MongoDB shell version v3.6.8
git version: 8e540c0b6db93ce994cc548f000900bdc740f80a
OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020
allocator: tcmalloc
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64
```
Command Pattern

# Command Pattern

# Reference
- [tutorialspoint:Command](https://www.tutorialspoint.com/design_pattern/command_pattern.htm)
- [journaldev:Command](https://www.journaldev.com/1624/command-design-pattern)
- [geeksforgeeks:Command](https://www.geeksforgeeks.org/command-pattern/)
- [iluwatar:Command](https://github.com/iluwatar/java-design-patterns/tree/master/command)
Golang で MongoDB のデータを読む (Read)

Golang で MongoDB のデータを読みます。
次のプログラムで作成したデータを読みます。
[Golang で MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/18f49a75cb90b5060464)

ライブラリーのインストール

```bash
go get gopkg.in/mgo.v2
go get github.com/joho/godotenv
```

```golang:mongo_read.go
// ---------------------------------------------------------------
//
//	mongo_read.go
//
//					Jun/11/2019
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"os"
	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
	"time"
	"strconv"
	"github.com/joho/godotenv"
)

type City struct {
	ID        bson.ObjectId `bson:"_id,omitempty"`
	Key      string
	Name      string
	Population     int
	Date_mod time.Time
}


// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")

	err := godotenv.Load(".env")
	if err != nil {
		panic(err)
	}
 
	user := os.Getenv("user")
	password := os.Getenv("password")

	mongoDBDialInfo := &mgo.DialInfo{
	Addrs:    []string{"127.0.0.1"},
	Timeout:  60 * time.Second,
	Username: user,
	Password: password,
}
	session, err := mgo.DialWithInfo(mongoDBDialInfo)
	if err != nil {
		panic(err)
	}

	defer session.Close()

	session.SetMode(mgo.Monotonic, true)

	db_name := "city"

	cc := session.DB(db_name).C("saitama")

	var results []City
	err = cc.Find(bson.M{}).Sort("key").All(&results)

	if err != nil {
		panic(err)
	}

	fmt.Println("len(results): ", len(results))


	for _,value := range results {
		str_out := value.Key + "\t" + value.Name + "\t" + strconv.Itoa(value.Population) + "\t" + value.Date_mod.String()
		fmt.Println(str_out)
		}

	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}

// ---------------------------------------------------------------
```

```text:Makefile
mongo_read: mongo_read.go
	go build mongo_read.go
clean:
	rm -f mongo_read
```

```text:.env
user = '******'
password = '******'
```


実行コマンド

```
./mongo_read
```

次のバージョンで確認しました。

```text
$ go version
go version go1.13.8 linux/amd64

$ mongo --version
MongoDB shell version v3.6.8
git version: 8e540c0b6db93ce994cc548f000900bdc740f80a
OpenSSL version: OpenSSL 1.1.1f  31 Mar 2020
allocator: tcmalloc
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64
```
Visual Studio でテスト一覧にテストが表示されなくなった時

- プロジェクト>参照>参照の追加(R)...
- 検索枠で「unittest」と入力しを絞り込む
- バージョン違いで同じ名前のフレームワークが複数表示されたら、現在チェックされているものを外し新しいバージョンのものをチェック
[CSS・JS] id・class名の頭文字が数字の時にスタイル適用・発火できない方へ

# **現象**
`id=2cs3jk244k355vg3`のような、id名が乱数生成されたものに対して、スタイルを適用したかったが、どうしても反応している様子がなかった。
コードは以下のような形

```hello.html
<div id="2cs3jk244k355vg3">Hello</div>
```

```hello.css
/* 文字が赤くならない！！！！　*/
div#2cs3jk244k355vg3 {
  color: red;
}
```

# **解決策**
調べたら、頭文字の数字の`class` `id`は頭文字をエスケープしないと認識してくれない仕様らしい。
なので、`.html`の方はそのままで、`.css`を以下のように修正することで認識してくれました。

```hello.css
/* 無事文字が赤くなった　*/
div#\0032 cs3jk244k355vg3 {
  color: red;
}
```

`div#\0032` の部分は `div#\32` でもOKです。

要するに、`css`の`id` `class`の頭文字が数字の場合は `\003`または`\3`をエスケープ文字としてエスケープしてあげれば使用できるということです。

一般的に頭文字に数字があるパターンは広く使われてはいないし、私自身あまり困ったことはないので、そもそも命名をうまくできないかを考えた方がよいのだろうと思います。
今回のケースは広告設置の際に、勝手に決められた`id`に対して、無理やりスタイルを上書きするという稀なケースだったので。(結局先方にスタイル直してもらったからやらずに済んだ)


## jsも基本的に同じ
自分の環境で試してはいないのですが、調べると`js`も同じ挙動をするらしいです。
唯一違う点は、エスケープ文字が `\003` `\3` ではなく `\\003` `\\3` なので気をつけてください。

## 他の特殊文字
他の記号だったりもエスケープすれば使えるはずです。その場合はエスケープ文字は `\03` ではなくなると思うので、調べて試してみてください。(使わないし調べる気がでませんすいません)

# おわり
jsや他の記号も再現できた方はコメントしていただけると幸いですm(_ _)m
OpenCV、KinectV2、LeapMotionのVisual Studioでの環境構築 


 

最近、Windowsをインストールしなおしまして、いろいろと全ての設定を最初からしなければならない事態に…。
  以前にKinectとOpenCVを使ってたんだけど、環境構築にとても苦労した思い出。  
これからもKinectとOpenCVを使い続けるだろうし、さらにLeapMotionも使うことになりそうなので、ここで一旦Visual Studioでの環境構築手法をまとめときます。 


OpenCV,KinectSDK,LeapMotionSDKはダウンロード済みとします。



## OpenCV   

C:/ドライブ直下にOpenCVのファイルがある。  
プロジェクトを右クリック→プロパティを開く

「構成プロパティ｜C/C++｜追加のインクルードディレクトリ」に「C:\opencv\build\include]を追加 
「構成プロパティ｜リンカー｜追加のライブラリディレクトリ」に「C:\opencv\build\x64\vc14\lib」を追加 
「構成プロパティ｜リンカー｜入力｜追加の依存ファイル」に 「opencv_world320.lib」を追加  



##KinectV2   

プロジェクトを右クリック→プロパティを開く 

「構成プロパティ｜C/C++｜追加のインクルードディレクトリ」に「$(KINECTSDK20_DIR)\inc]を追加 
「構成プロパティ｜リンカー｜追加のライブラリディレクトリ」に 「$(KINECTSDK20_DIR)\inc　」を追加 
「構成プロパティ｜リンカー｜入力｜追加の依存ファイル」に 「Kinect20.lib」を追加    



##LeapMotion   

C:/ドライブ直下にLeapSDKのファイルがある。  

プロジェクトを右クリック→プロパティを開く 

「構成プロパティ｜C/C++｜追加のインクルードディレクトリ」に「C:\LeapSDK\include」を追加 
「構成プロパティ｜リンカー｜追加のライブラリディレクトリ」に 「C:\LeapSDK\lib\x64」を追加 
「構成プロパティ｜リンカー｜入力｜追加の依存ファイル」に 「leap.lib」を追加   



##遭遇したエラー   

####・dllファイルがない 　　
このエラーが出たら、実行した.exeファイルがあるフォルダ内に必要な.dllファイルを追加する。 
 

####・libファイルがない 　　
このエラーが出たら、pathが正しく通っていない可能性がある。プロジェクトのプロパティからもう一度pathを確認する。  


####・アプリケーション エラー : アプリケーションを正しく起動できませんでした (0xc000007b)。[OK] をクリックしてアプリケーションを閉じてください。  アプリケーションエラー(0xc000007b)  

![アプリケーションエラー.png](https://qiita-image-store.s3.amazonaws.com/0/259075/1ba4d4d3-1cf9-7dc3-1957-43e3282815b2.png)


全部正しく設定したはずなのに出たエラー。どうやら、64bitの実行環境なのに、32bit版のdllファイルを設定していたらしい。 自分のパソコンとプロジェクトに対応したbitのdllファイルを選ばなければ。dllファイル名からでは判断できないから注意。   


####・C:4996エラー 
fopen()やf ()の代わりにfopen_s()やstrcat_s()を使うか、_CRT_SECURE_NO_WARNINGSを使って警告をディセーブルするよう書かれています。
プログラムの先頭に#define _CRT_SECURE_NO_WARNINGS #pragma warning(C:4996)  を記述するとエラーが出なくなる。
 ただし、これは解決ではなくただ単にエラーを表示させなくするという処理。 サンプルプログラムのように信頼できるソースに対してはこの方法で良いが、自分で作成したファイルに関してはfopen_s()やstrcat_s()に書き換える方が安全なのでそっちを優先。    



とりあえずこんな感じ。また遭遇したエラーとかがあったら追記していく。
EC2 サーバー内に SWAP ファイルを作る (お手軽版)


EC2の AMI では SWAP が作られません。
念のために SWAP 領域をつくりたい時のコマンドです

参考
https://centos.bungu-do.jp/archives/65
https://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/
https://qiita.com/na0AaooQ/items/278a11ed905995bd16af

## SWAP 領域を 2GB 分作る

```
df -h # ディスクの空き容量を確認
sudo swapon -s # Swapfile が無いことを確認
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon -s
sudo sed -i '$ a /swapfile   swap        swap    defaults        0   0' /etc/fstab
```

## さきほど作った SWAP 領域を削除

```
sudo swapoff /swapfile
sudo vi /etc/fstab
# 下記の行を削除
-------------------------------------
/swapfile   swap        swap    defaults        0   0
-------------------------------------
sudo rm /swapfile
```

## SWAP を作り直す (ファイルを増量する方法)

SWAP ファイルを作り直します。
一旦ディスクの SWAP を削除するので、使用中のメモリの量を事前に確認すること。

```
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```

### 既存の SWAP ファイルを使い続けながら移動する方法

既存の SWAP ファイルを使い続けながら、新しい SWAP に移動する方法です。

既存のSWAPを `/swapfile1` として、
新しいい SWAP を `/swapfile2` とします

一時的に swap ファイルを二重に用意しないといけないので、ディスク容量に注意です。


```
sudo dd if=/dev/zero of=/swapfile2 bs=1M count=2048
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
sudo swapon -s
sudo sed -i '$ a /swapfile2   swap        swap    defaults        0   0' /etc/fstab
sudo vi /etc/fstab
# /swapfile1 の行を削除
sudo swapoff /swapfile1
sudo rm /swapfile1
```
【Unity】【WebGL】WebGLプレイヤーをブラウザ全体に表示したい

## 環境

Unity2017.4.3f1
Chrome(66.0.3359.181)

## やりたいこと

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/156809/bfc76d7b-d531-b78d-2111-6ed51a1d833b.png)

↑これを

↓こうしたい

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/156809/d9b17a52-4f47-17d7-ce92-6a465b1219dc.png)

## index.htmlとstyle.cssを変更する

index.html中のgameContainerからstyleを削除する

```html
<!-- <div id="gameContainer" style="width: 960px; height: 600px"></div> -->
<div id="gameContainer"></div>
```

TemplateData/style.cssに以下の2行を加える

```css
html,body,div { margin: 0; padding: 0; width: 100%; height: 100%;}
canvas { margin: 0 0 0 0; position: absolute; z-index: 9; width: 100%; height: 100%;}
```

以上。

## ビルドするごとに毎回変更するの？

[UnityのWebGLテンプレート機能](https://docs.unity3d.com/ja/2017.4/Manual/webgl-templates.html)を使えば、毎回手直しする必要は無い

今回の例なら、以下の2つのファイルを置いておけば良い

- Assets/WebGLTemplates/{TEMPLATE_NAME}/index.html
- Assets/WebGLTemplates/{TEMPLATE_NAME}/TemplateData/style.css

WebGLのPlayerSettingsのテンプレート選択項目に新しいテンプレートが追加されるので、それを選択してビルドする

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/156809/38b33492-a012-c268-166d-7ab19ba754e2.png)
OpenAPI Spec 3.0でのSwagger Specの分割管理

# 概要
Swaggerの定義ファイルを分割して管理したいと思ったことはないですか。
とかく長くなりがちなあのファイル、探してみると[分割した場合のサンプル](https://github.com/mohsen1/multi-file-swagger-example)は出てきます。
ただし、このサンプルは以下の二点が気になります

- 最終的に [`multi-file-swagger`](https://www.npmjs.com/package/multi-file-swagger) を使って、ファイルをマージすることが前提なこと
- ファイル形式が`Swagger 2.0`のものであること

できれば、以下のようなサンプルが欲しいです。

- Swaggerをファイル分割したままで、正しく表示できる
- [OpenAPI Specification 3.0](https://github.com/OAI/OpenAPI-Specification)形式であること

ないなら作るしかないのでサンプルを作ってみました

# サンプル
コードサンプル: https://github.com/funa1g/multi-file-oas-example
SwaggerUIサンプル: https://funa1g.github.io/multi-file-oas-example/

Swaggerのデフォルトのサンプルである `PetStore` を元にしています。

## ディレクトリ構成
* APIの各パスごとにファイルを作成
* コンポーネントは、各モデルごとにファイルを作成

以下のようなディレクトリ構成になります。

```
├── openapi.yml
├── components
│   ├── pet.yml
│   ├── pets.yml
│   └── error.yml
└── paths
    ├── pet.yml
    └── pets.yml

```

rootとなる`openapi.yml`は以下のようになります。

```yaml:openapi.yml
openapi: "3.0.0"
info:
  version: 1.0.0
  title: Swagger Petstore
  license:
    name: MIT
servers:
  - url: http://petstore.swagger.io/v1
paths:
  /pets:
    $ref: './paths/pets.yml'
  /pets/{petId}:
    $ref: './paths/pet.yml'
components:
  schemas:
    Pet:
      $ref: './components/pet.yml'
    Pets:
      $ref: './components/pets.yml'
    Error:
      $ref: './components/error.yml'
```

Swagger2.0の場合は、`paths`以下、すなわちAPIのパス指定から全て別ファイルにしているケースなどが[紹介されていました](https://dev.classmethod.jp/etc/split-swagger/)
OAS3.0でも、最終的にファイルをマージするならば、このやり方でも問題はありません。

ですが、公式のドキュメントでは、 `$ref` による参照は、どこでも使えるわけではなく、[個別の要素に対して指定するものであるとしています](https://swagger.io/docs/specification/using-ref/)。
事実、`paths` 以下を別ファイルにして、さらにそこから別ファイルを参照してという形式では、SwaggerUIでは正しく表示がされませんでした。
ですので、今回のような形式に落ち着いています。

## 問題点
一つのファイルで表示する場合と違って、正しく表示されない部分があります。
以下のような問題が確認できます。

- Modelが参照するModel名がおかしい
 - PetsというModelはPetのリストなんですが、Petsのリストかのように表示されています
- 各APIが参照しているModelの名前が表示されない
 - パラメータはきちんと指定通り表示されますが、Modelの名前が出ません
 - そのため、どこが共通要素か確認しづらいです
- エディタが複数ファイルによるプレビューをサポートしていない
 - VisualStudioCodeのSwaggerViewerはダメでした

パスの指定方法やファイルの分割箇所もいくつか試してみましたが、これでも現状が一番みやすそうという結論です

# 結論
* ファイル分割しても、 `multi-file-swagger` を利用してマージが推奨
* 分割したまま見るなら、パスやコンポーネントごとにファイルを作る。ただし表示の問題は目をつむる必要がある

厳密さが期待されるプロジェクトでは、やっぱり `multi-file-swagger` を利用するのがいいかなと思います。
小規模な開発なら今回のような方法を取るのもありって感じでしょうか。
より良い方法などご存知の方は、ぜひお教えください。
HUAWEI nova端末でログが出ないってばよ。。

こんにちは。m_saekiです。

HUAWEI novaでAndroidアプリのテストを行っていたら、AndroidStudioでLogが出ないってばよ。。
調べていたら秘密のコマンドを打つ必要がありましたとさ

# 環境
端末名 : HUAWEI nova 
モデル番号 : CAN-L12
Androidバージョン : 7.0

# 方法
電話アプリを起動
↓
「\*#\*#2846579#\*#\*」を入力
↓
ProjectMenu
↓
1. Background Settings
↓
3. LOG Settings
↓
下記項目にチェック
AP Log
Charge Log
Sleep Log

# 所感
複数のAndroid端末を持っているけど、Logを出すのにこんな手間がいるのは初めてでした。
しかも、1週間くらい経つとチェックが外れていてもう一度手順を踏む必要があるので気をつけてください。。
Microsoft Graph を使ってみよう : Microsoft Flow トリガーとアクション

# Microsoft Flow 

[Microsoft Flow](https://flow.microsoft.com/ja-jp/) はコードレスでワークフローを開発できる GUI ツールです。

# Microsoft Graph 連携

Microsoft Flow は以下のポイントで Microsoft Graph と連携します。尚、Microsoft Flow は開発者向けではないため、Microsoft Graph をいうキーワードではなく、Outlook や SharePoint、OneDrive for Business といった製品名で表示されます。

**トリガー**
ワークフローを起動するきっかけとなる処理を Office 365 のイベントとして登録できます。例えば以下のような処理が対象となります。

- メールを受信した時
- メールにフラグが設定された時
- 予定を作った時
- OneDrive や SharePoint にファイルが作成された時や変更された時
- Outlook のタスクが作成された時

**コネクター**
ワークフローの処理中に Office 365 に接続して数百種類以上のアクションを実行できます。例えば以下のような処理が対象となります。

- 予定の取得や作成、削除をする
- メールの送信や取得、移動や削除をする
- 会議室や連絡先などの情報を操作する
- OneDrive や SharePoint のドキュメントを取得したり移動する
- OneDrive や SharePoint のファイルを変換する

**テンプレート**
よくあるワークフローは、あらかじめテンプレートが用意されます。テンプレートはトリガーとアクションが組み合わさったものとなっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/76d743ab-0b11-a594-7d46-69f1e3e5b519.png)

# テンプレートからフローの作成

1\. [Microsoft Flow ポータル](https://japan.flow.microsoft.com/ja-jp/) にアクセス。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/9699a744-273f-eaa8-9cb1-8a4b8354c982.png)

2\. 検索バーに「office 365 のメールの添付ファイル」を入力して、「Office 365 のメールの添付ファイルを OneDrive for Business に保存する」を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/01e8f9d0-3128-e4a4-05f4-99ef7afebd08.png)

3\. 権限など詳細を確認後、フローの作成をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/ccf9178b-e032-99aa-53bd-1aed85057b05.png)

4\. 作成完了後、「フローの編集」をクリックして内容を確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/17c36a3e-99b9-f538-c92b-54b1c2f882dc.png)

5\. トリガーは新規メール受信時。二つ目のフローをクリックして展開。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/a65224bd-d2b0-b11e-025e-f86f5b768953.png)

6\. すべての添付ファイルを順次処理して OneDrive for Business に保存。条件分岐ではファイルの作成が失敗したか確認しており、結果によって次処理に繋げている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/f7abde1b-377a-adfc-dfb5-2bc35ecd6663.png)

7\. 失敗した場合は一定時間おいてリトライ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/b4bde20c-4a52-cd05-c4f9-cbedbab7f733.png)

8\. テストのため任意の添付ファイルを添付してメールを送信。ここでは PowerPoint のファイルを添付して受信。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/5d0718f3-044e-1d4c-4b25-22339c6ed591.png)

9\. OneDrive にファイルが保存されているか確認。
※フローがトリガーされるのはリアルタイムではないため、少し時間がかかる場合あり。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/08d21f5b-fb0c-852e-f433-a50985f31cc2.png)

# まとめ
Microsoft Flow は開発者の方でなくても使えるツールですが、開発者の方も HTTP トリガーを使って他のコードから呼び出すなど活用方法はあります。また一度組んだロジックを組み替えることも簡単ですので、是非お試しください。

[目次に戻る](https://qiita.com/kenakamu/items/6a1ca508dc093779eefa)

# 参照

[Microsoft Flow](https://flow.microsoft.com/ja-jp/) 
[Microsoft Flow のガイド付き学習](https://docs.microsoft.com/ja-jp/flow/guided-learning/)
[Build and extend applications for Office 365 with PowerApps and Flow : Build 2018 (動画:英語)](https://www.youtube.com/watch?v=WpsfnwTHFSA&t=1147s)
cmderメモ

cmderをwindows7で用いるときの日本語等設定メモ。
（先達が書いているメモだとなぜかうまくいかない箇所があったので）

cmderとはwindowsでlinuxのように使える便利なターミナルでfull versionだとgitも可能。
http://cmder.net/

個人的にはAWKとかshellscriptが使えるのが嬉しい。ファイル処理が早くてらくちん :)

## 日本語用等倍フォント
画面右下にある≡をクリックし、Settings > Mainにある

```
 Compress long strings to fit space
```

のチェックボックスのチェックを外す。


## コンソール画面での日本語表示
同じくsettingsで設定できるはずなんだけど、設定し保存してcmderを一度終了すると反映されない。xmlにエクスポートしてもうまく反映しない（パーミッションの問題かと）ということで直接xmlを編集。
cmder/vendor/conemu-maximus5/ConEmu.xml を適当なエディタで開く。

876行目付近に line data="set LANG=ja_JP.UTF-8" を追加する。こんなかんじになる。
例えばShift-JISだったら ja_JP.UTF-8 をjp_JP.sjisにする。

```
<value name="EnvironmentSet" type="multi">
        <line data="set PATH=%ConEmuBaseDir%\Scripts;%PATH%"/>
        <line data="set LANG=ja_JP.UTF-8"/>
</value>
```

## vimで日本語を表示させる
ホームディレクトリ下に_vimrcを作成。（.vimrcでもいける）
vimで作っているがもちろんメモ帳で作ってもよい。

```
C:\Users\me
λ vim _vimrc
```

上3つがエンコード指定。fileencodingsは自動判定用で前にあるものから判定してくれる。
shift-jisが必要ならsjisを=のあとに追加。fileformatsはmacのファイルもあるかうようならmacも追加。
set numberは行数表示用なのでこのメモの主旨からは蛇足。

```
set encoding=utf-8
set termencoding=utf-8
set fileencodings=utf-8, cp932, euc-jp
set fileformats=unix,dos
set number
```



## プロンプトのラムダを変更
なんとなくλだと違和感があるので変更。ここはネットに書いている方々の方法を踏襲。
参考：https://akamist.com/blog/archives/702

cmder/vendor/click.luaを開く。
45行目の

```
if env == nil then 
    lambda = "λ"
else
    lambda = "("...env...")λ"
end
```

を次のように変更

```
if env == nil then 
    lambda = "$"
else
    lambda = "("...env...")$"
end
```
SwaggerをAsciiDocに変換する



これを使う
Swagger2Markup のdocker image
https://hub.docker.com/r/swagger2markup/swagger2markup/


使い方

```
$ cd (swagger.json がある場所)
$ docker run --rm -v $(pwd):/opt swagger2markup/swagger2markup convert -i /opt/swagger.json -f /opt/swagger

```

同じ場所に、swagger.adoc が出力さる。


入力は JSONだけでなくYAMLにももちろん対応されていて、出力はAsciiDoc以外のドキュメントにも対応している。
すばらしい。


詳しくはこちら http://swagger2markup.github.io/swagger2markup/1.3.1/
docker-compose の ERROR: Windows named pipe error の対処

環境: powershell 5.1, docker-machine.exe version 0.14.0, docker-compose version 1.21.2

## 問題

windows上でコンテナが起動しない（docker-composeが起動しない）

1. `docker-machine start` でホストマシン( `"default"` )立ち上げ
1. `docker-compose up` を実行すると、以下のエラーが発生する。

```
ERROR: Windows named pipe error: 指定されたファイルが見つかりません。 (code: 2)
```

## 解決方法

`docker-machine start` でホストマシンを立ち上げた後に、以下のコマンドを実行する。

```powershell
docker-machine env default --shell powershell | Invoke-Expression
```

その後、 `docker-compose up` を実行する。

※ `default` は machine の名前 ( `docker-machine ls` で確認できる )
Pythonでオプション引数を受け取る

[別記事](https://qiita.com/taashi/items/07bf75201a074e208ae5)で、コマンドライン引数を受け取る方法は書いたが、
ツールを作っていて、必要な時だけ指定するオプション引数が欲しくなり調べたら、方法が別っぽかったので、そのメモ。

# オプション引数を受け取る
## 引数の設定
argparseモジュールのArgumentParserを使用する。
ArgumentParserを生成し、そこに、作りたい引数の設定を行っていく。

### 引数の追加
引数の追加は、ArgumentParserの`add_argument`関数で行う。
`add_argument`関数に渡す引数は、以下の感じ(ここに書いた以外にもいくつかある)

- 第1~n引数  
  　引数名を指定する。複数指定可能。  
  　ここに指定する名前に、プレフィックスとして`-`を付けると、オプション引数となる。  
  　`-`で始まらない引数名だった場合、位置引数[^1]となる。  
[^1]: 要するに、通常の引数となり、addした順番に、実行時の引数の前から順に結びついて認識される。

- `type`  
  　引数の型の指定。  
- `default`  
  　デフォルト値の指定。  
  　オプション引数が、実行時に指定されなかったときにこの値が使用される。　　
- `help`  
  　`-h`オプションで、help表示した際に表示される説明文。

以下のような感じで設定する。

```option_parser.py
from argparse import ArgumentParser


def get_option(batch, epoch):
    argparser = ArgumentParser()
    argparser.add_argument('-b', '--batch', type=int,
                           default=batch,
                           help='Specify size of batch')
    argparser.add_argument('-e', '--epoch', type=int,
                           default=epoch,
                           help='Specify number of epoch')
    argparser.add_argument('-dlc', '--drawLearningCurve', type=bool,
                           default=False,
                           help='Whether to draw learning curve after learning')
    argparser.add_argument('-po', '--predictOnly', type=bool,
                           default=False,
                           help='Only execute predict.')
    return argparser.parse_args()
```

## 引数の使用
上記で設定した引数は、ArgumentParserのプロパティ[^2]として、アクセスできる。

以下のソースは、上記のオプション引数設定関数`get_option`をコールして、ArgumentParserを受け取っている。

```main.py
if __name__ == '__main__':
    args = get_option(BATCH_SIZE, EPOCHS)

    print('batch : ' + str(args.batch))
    print('epoch : ' + str(args.epoch))
    print('drawLearningCurve : ' + str(args.drawLearningCurve))
    print('predictOnly : ' + str(args.predictOnly))
    
    ~ 省略 ~
```

## 引数の指定
こんな感じ
![option_args.PNG](https://qiita-image-store.s3.amazonaws.com/0/162097/73da3150-a51a-6723-ce16-bccc7323b9b5.png)

## 引数のヘルプ
こんな感じ
![help.PNG](https://qiita-image-store.s3.amazonaws.com/0/162097/a131c516-fcbb-e6b6-7d53-efec9dc4045e.png)


[^2]: この言葉があってるかわからない...
wordpressのプラグイン"WP Security Audit Log"で生成されるlogについて

検証してみた結果、WP Security Audit Logを導入して有効化すると、logのフォルダ内にwp-security-audit-logというフォルダが生成されます。
これは、有効化したことによってできたものであって、そのフォルダ内にサーバーのログが収納されていきます。
削除したとしてもプラグインが有効化になっている限り自動的に生成されます。

バグなどではありません。
Proxy Pattern

# Proxy Pattern
proxyオブジェクトが複雑なロジックを持つメインオブジェクトの代わりにクライアントとやりとりをする。他に似たパターンがあったはず。違いを明確にしなければ。。。

# Reference
- [tutorialspoint:Proxy](https://www.tutorialspoint.com/design_pattern/proxy_pattern.htm)
- [journaldev:Proxy](https://www.journaldev.com/1572/proxy-design-pattern)
- [geeksforgeeks:Proxy](https://www.geeksforgeeks.org/proxy-design-pattern/)
- [github:Proxy](https://github.com/iluwatar/java-design-patterns/tree/master/proxy)
技術者視点でサトウの切り餅事件の特許を考える(3)　価値の高い特許って？

[前回](https://qiita.com/kumokumocc/items/1ef4ae14dc686bf3ed01) から、有名なサトウの切り餅事件で特許を考えてみています。
前回は請求項をどう読むかという話を中心にしました。

以下が特許です。
https://patents.google.com/patent/JP4111382B2/ja?oq=%E7%89%B9%E8%A8%B1%E7%AC%AC4111382%E5%8F%B7

以下に絵なんかもあるので、概要を掴むにはいいと思います。
http://www.ypat.gr.jp/ja/case/patent/07.html

さて、今回は価値の高い特許とはどんなものかです。

##**1 特許の範囲が広い、代替技術が存在しない**
事業に参入しようとすれば、特許の使用を避けて通れないかどうかです。

越後製菓の特許ならば、他社が餅を販売するにあたって、「必ずスリットが入った餅にしなければならないか」です。
現在販売されている餅を見ればわかりますが、スリットが入っていない餅もたくさん売られていますので、この点ではあまり有効ではないと思います。

この点で有効な特許は、任天堂が白猫プロジェクトを訴えた特許です。任天堂の特許は、「タッチパッドに仮想的なジョイスティックを作る」というものですが、RPG系スマホゲームはだいたいこれを使っています。逃げられない。こういうのが範囲の広い特許です。

##**2 効果が高い**
発明の効果というのは、発明によってどの程度価値が上がるか、
越後製菓の特許ならば横にスリットを入れることでどれだけ美味しい焼き餅になるか、どれだけ綺麗な焼き餅になるか、それによって企業がどれだけ収益を上げることができるか。これが効果です。
他の企業はあまり越後製菓の特許を使っていませんので、それほど効果が高いわけではないと思います。

##**3 侵害の指摘が容易である**

越後製菓の特許を侵害した切り餅かどうかは、製品を見れば簡単にわかります。
これが侵害の指摘が容易であるということです。
この点、越後製菓の特許は非常に優秀です。

逆に、ソフトウェアに関連する特許などは、侵害の指摘が難しいと思います。
ユーザーインターフェースのように使えばわかるものであれば大丈夫ですが、
ソフトウェアの中身を解析しないと使っているかどうか判別できないものはかなり厳しい。

***
"基本特許"と呼ばれるような特許は、この3点がしっかり満たされているものです。
製品を販売するときに取得する特許は、だいたい3つ4つと、複数存在しています。
その中で、基本特許になりきれているものは、せいぜい1個だと思います。

もう１つ。特許は先に出した人が圧倒的に有利です。
一番最初に作った人がほとんど必ず一番価値の高い特許を取得できます。

これは、特許の理念がわかると、理解できると思います。
その点についてはまた次回書こうと思います。
プログラミングをする前に

##目的
プログラミングをする前に知っておいたら良い知識

##プログラミング言語の分類

・自然言語…人類が生まれてから自然に誕生言語
　　∟日本語英語

・人工言語…プログラミング言語のような人類が恣意的に作ったモノ
　　∟**マークアップ言語** … 演算はできず、装飾を担う（HTML/CSS）
　　∟**プログラミング言語** … 演算が可能（Java/JavaScript/Ruby/PHP…）
　　　∟**コンパイル型言語** … 明示的にコンパイルが必要な言語（C/Java…）
　　　　∟エラーが出るタイミング：*コンパイル時にエラーがでる（ビルドエラー）*
　　　∟**インタプリタ型言語** … 暗黙的にコンパイルしてくれる言語（Ruby/PHP…）
　　　　∟エラーが出るタイミン：*実行時にエラーがでる（ランタイムエラー）*

コンピュータが解釈できる言語は機械語（＝バイナリ：Binary）…2進数＝0と1だけの言語

上級言語　⇆　機械語 … 変換のことを**コンパイル（Compile）**
この変換器 … **コンパイラ（Compiler）**
 

##プログラミングを表す3つ基礎

1、 値 … データを表すもの

```ruby:値
var num = 100;
var str = "文字列";
var bool = true;
```

2、 式（演算子） … 値を加工して返す

```ruby:式
100 + 10;  // 110
```

3、 文 … 処理の流れを変える`

```ruby:文
if (num == 100) {
  hogehoge();
}
```

#コメント
プログラミングは、3つの基礎を活用して表現をする。

時間がある際に、このシリーズをゆっくり熟読してみたい。
[コンピューターはなぜ動くのか？](https://www.amazon.co.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AF%E3%81%AA%E3%81%9C%E5%8B%95%E3%81%8F%E3%81%AE%E3%81%8B%EF%BD%9E%E7%9F%A5%E3%81%A3%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A8%E3%82%A2%EF%BC%86%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A8%E3%82%A2%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%EF%BD%9E-%E7%9F%A2%E6%B2%A2-%E4%B9%85%E9%9B%84/dp/4822281655)
位置情報ハッシュ文字列quadKey

# quadKey方式での近傍検索

## 概要

地理情報から近傍検索をする方法は様々。
今回はシンプルに文字列検索で近傍検索の絞り込みができるような仕組みについて調査。

## 他の選択肢

- GeoHash
  - 緯度経度のビットを組み合わせて作られる
  - Base32文字列によって構成される（例：57.64911,10.40744 -> u4pruydqqvj）

## quadKeyの性質

![quadkey-map.png](https://qiita-image-store.s3.amazonaws.com/0/57142/672a4f9e-9fa8-786c-7524-5b864720bad2.png)

- 世界地図を分割し、どのエリアにいるかで決まる
- 4進数文字列で表現される（例：13201301)
- 20段階の精度で利用ができる（GeoHashより細かいらしい）
  - quadKeyの桁数とレベル数が一致
  - 世界地図を4つに分割したのがレベル1（0,1,2,3）、レベルが1上がると各エリアが同じように4分割（00,01,02,03,10,11...33）される
- quadKey文字列の先頭は親要素を完全に含んでいる（検索に利用しやすい）
  - 133（1の子の13の子）
- ベース（https://ja.wikipedia.org/wiki/Z階数曲線）

## quadKeyの作り方

quadKeyのレベルに応じたサイズの仮想マップを作成。
レベル（精度）が高いほどピクセル数が増える。

緯度経度からマップの位置をポイントする。（ピクセルのXY座標指定）
ピクセルの所属するquadKeyエリアに所属するのかを判定してエリア座標を取得する。

それぞれ2進数にする。桁数はLevelXのXとし、不足する分は上位桁を0パディングする。
3 -> 011
5 -> 101

YとXを最上位桁から1桁ずつ値を取得し、交互に先頭から埋めていく。
quadKey(2進数) = 100111

次にこれを4進数にする
quadKey(4進数) = 213 -> "213" (文字列のquadKeyとして利用できる)

## 近傍検索

quadKeyで近傍検索をする場合にまずquadKeyで絞り込みをおこなうことになる。
ただしエリア境界が近い場合に隣のエリアにある近傍情報が拾えない問題があるので、
検索対象に周囲8エリアも含めるのが一般的。
周囲8エリアの求め方は、検索quadKeyからエリア座標の特定（前章の[3,5]にあたる）、
8エリアの座標を求めてそれぞれのquadKeyを作成する。

実際にXkm以内という条件や、近い順ソートなどはこれだけでは行うことができない。
空間インデックス非対応DBで利用する場合には、一旦これで絞り込んでから、距離順で処理となるのだと思う。

## コードでの記述

エリア座標からquadKey文字列を作る場合の例を取り上げる。

レベルごと（quadKeyの1文字ごと）に処理する。
1文字は4進数なので、2進数だと2桁分に相当し、00、01、10、11の4パターンになる。
Y座標が4^1桁、X座標が4^0桁となるので、以下のような求め方ができる。

```java
public static String tileXYToQuadKey(PointInt tile, int levelOfDetail) {
		StringBuilder quadKey = new StringBuilder();
		for (int i = levelOfDetail; i > 0; i--) {
			char digit = '0';
			int mask = 1 << (i-1);
			if ((tile.getPointX() & mask) != 0) {
				digit++;
			}
			if ((tile.getPointY() & mask) != 0) {
				digit++;
				digit++;
			}
			quadKey.append(digit);
		}
		return quadKey.toString();
	}
```

* *[bingのblogより](https://msdn.microsoft.com/en-us/library/bb259689.aspx) これをJavaに置き換えたもの。*
Microsoft Graph を使ってみよう : PowerApps の Office テンプレート

# PowerApps 

[PowerApps](https://powerapps.microsoft.com/ja-jp/) はコードレスでアプリケーションを迅速に開発できる GUI ツールです。

# Office テンプレート
PowerApps はアプリケーションのテンプレートを複数用意していますが、Office 用のテンプレートが現時点で以下の 12 種類用意されています。

- Contacts
- Org Browser
- Meeting Capture
- Help Desk
- Leave Request
- Onboarding Tasks
- Out of Office
- Shoutouts
- QuickTask
- Book a Room
- Estimator Pro
- Company Pulse

この記事ではいくつか試してみます。

# Contacts テンプレート

名前の通り連絡先の一覧を表示します。

1\. [PowerApps ポータル](https://web.powerapps.com) にアクセス。[ホーム] より "Office" を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/a28e4d01-24c1-ccfb-8ff0-02236bf1568b.png)

2\. テンプレートより Contacts を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/b803ff67-661b-f9cd-fea0-862fa019d6d2.png)

3\. 必要な権限を聞かれるので、「許可」をクリック。

<img width="738" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/a68c66ae-a79c-dbc8-378f-f0375e1f8d40.png">

4\. 少し待つとアプリケーションが作成される。この時点でログインしたユーザーで情報が取得され表示。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/b68169d4-2689-63a6-4715-9d2a4fc7b8dd.png)

5\. 画面右上にある再生ボタンをクリック。これでアプリケーションを仮想実行。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/2c2213bd-f9e4-209d-6f5d-30f1ea236bd7.png)

6\. 画面に連絡先が表示されていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/6570ce9a-06a2-d915-8a69-5491d7e97420.png)

7\.　連絡先をクリックすると詳細が表示。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/47a4b4e6-ab30-8c1d-adb8-2b59ba54b53c.png)

この他にも、連絡先の追加や編集が可能です。

# Book a Room

もう 1 つ部屋の予約アプリを見てみます。

1\. アプリケーションテンプレートより Book a Room　をクリックし、このアプリを作成をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/e736638e-db89-2183-3204-b0f09fa150d3.png)

2\. 必要な権限を許可。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/4dc9d9e0-946c-c152-1e30-581a36f8bde3.png)

3\. 画面右上の再生ボタンをクリックしてアプリケーションを実行。"Book without a meeting" をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/7cb56007-e5f0-63fd-1b14-8145c7ca0880.png)

4\. 時間と会議室を選択。ここでは本日 10 時から 30 分、会議室 1 で予約。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/765ecf12-b5e0-ce36-d48b-7bf834b4a80e.png)

5\. 予約完了画面を確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/678babf8-4ff0-9937-78db-4f4003bfe3bb.png)

6\. Outlook からも予定が入っていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214116/ac57ed6b-59f9-1506-c3a4-b637ff3dd0dc.png)

件名がうまく行っていませんが、PowerApp でアプリケーションをカスタマイズできるため、文言も挙動も変更が可能です。

# まとめ

PowerApps は普段コードを書いている開発者の方にも、是非使っていただきたい製品です。Office 365 や Dynamics 365 にもライセンスがあるため、是非一度お試しください。

[目次に戻る](https://qiita.com/kenakamu/items/6a1ca508dc093779eefa)

# 参照
[PowerApps 公式サイト](https://powerapps.microsoft.com/ja-jp/) 
[Microsoft PowerApps ガイド付き学習](https://docs.microsoft.com/ja-jp/powerapps/guided-learning/)
[Build and extend applications for Office 365 with PowerApps and Flow : Build 2018: 動画(英語)](https://www.youtube.com/watch?v=WpsfnwTHFSA&t=1147s)
Speech API を使ってみたの巻

#目的
音声処理を賢く（雑音除いたり、音声認識ソフトを導入したり、、、といった手間なく）やりたくて

#目標
手軽にやってみるため、打合せを録音して、文字起こししてみる

#やったこと
GCP のコンソールへ音声ファイルをアップ　＞　SpeechAPI をたたいて文字ファイルをゲット

#結論
下のように、ルイージが出てきたり、痩せる薬を作ってる人になったりした。。。
※別にそんなこと話してません笑

```output
CB 2カスタム
今あるんですけどセンター
それがとても助かります
理科教えておりました
最近
LINE バイブレーション
やるとしてもこれ一個ちょっとやってみた
無理やりアパッチ常にさせるぐらい
サンプル作っといてルイージの申請が来た時はこれでどうでしょう
AI のツール jp 1だと思っていないが使えるような環境を整える
スーパー三和ってそのイメージできている画像
本当に痩せる薬時間ために人間がいる
領収が非常に多いようなイメージですねえちょっと冒険した'
```

#気づき
音声ファイルの質は、google 推奨のものがあるので、その形式（高音質）で録音しよう。
別形式でも対応してくれるみたいだが、私の質の悪いファイルは、言語として認識してくれず、応答なしとしてAPI から回答があった。

環境音（ガサガサ、隣の部屋の笑い声など）がかなり入っても勝手に削除してくれてそう。
ただ、人の会話はしっかり拾う必要があり、PC の録音（指向性なし、集音声なし）では、上のように訳わからんものになりそう。

音声ファイル自体も良くないので、Speech API が悪い！という意味ではないです。
自分で文字起こししてみましたが、聞き取れないものの方が多く、20~30% しか文字に起こせなかった。しかも、打合せしてた人間が文字起こししたので、半分ぐらいは記憶が補足していると想定すると、まぁ、、、SpeechAPI の評価には使えないかなと。

#やったこと
したのgithub にソース上げてます。
https://github.com/HaHatake/SpeechAPI

～～～　一部抜粋　～～～

```
Complete auth service account work

upload audio file to google cloud storage and finish open that file

start google cloud shell

"pip install --upgrade google-cloud-speech"

"sudo curl -LO https://raw.githubusercontent.com/HaHatake/SpeechAPI/master/speechapi"

"python speechapi.py gs://"yourbacket"/"youraudiofile.flac"

wait for 5min ~ 10min

output jp,utf-8 character file

end of the job
```
EC-CUBE2系 決済モジュールアップデートしたらクレジットカード入力画面に何も表示されなくなったメモ

EC-CUBE 2.13.1
GMO-PG決済モジュール(2.13系) Ver.4.3.22 にアップデートしたら、
お客様購入フロー最後にあるクレジットカード番号入力する画面で入力項目がすべて表示されなくなった。

なんじゃこれ、と思い調べてると、
Smarty/templates で使用しているテンプレート内の下記部分が何も吐き出さなくなっていた。
$tpl_form_bloc_path の値が空なので、そりゃ何もでない。

```shopping/load_payment_module.php
<!--{if $tpl_form_bloc_path != ""}-->
<!--{include file=$tpl_form_bloc_path}-->
<!--{/if}-->
```

どうしてそうなってるのかぜんぜんわかんないので、とっととサポートセンターに連絡してみる。

> - カスタムデザインテンプレートを使用してる場合は先に標準テンプレートにしておく
- オーナーストア > モジュール一覧 > 決済モジュール 設定内にある「決済テンプレートの初期化」
- デザインテンプレートをカスタムデザインテンプレートに戻す

ってことを教えてもらったので早速試すと、ちゃんと表示された。

ググっても情報がEC-CUBEの開発コミュニティで同じようなこと（サポートに連絡して上記対応方法を教えてもらった）を書いてる人がいたので、ボチボチそういうことがあるんだろうな、と思う次第。

もう2系なんて使ってる人減ってきてるかもしれないけど、同じような体験して脇汗をかいている人がいるかもしれないので、なにかの役に立てればと。
WebdriverいらずのE2EテストランナーTestcafe



まだSeleniumで消耗してるの？

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪


[testcafe]:https://devexpress.github.io/testcafe/
[Node.js]:https://nodejs.org/ja/
[nodebrew]:https://github.com/hokaccha/nodebrew
[Nodist]:https://github.com/marcelklehr/nodist

----
------------------- ↓ 余談はここから ↓-------------------
Selemiumは自ら開発したWebdriverによりすっかりオワコン化。
Webdriverサポートをブラウザ側がするようになり、
ツールの自由度が格段に上昇している。

一方でテストランナーのほうの進化は止まっている印象がある。
先行していたRuby界隈だがturnip以降なにも出ていない。
私もよく使っていたbehatだがだいぶ進化を止めている感じだ。
メインストリームはJavaScript界隈に遷った感じがする。

さて、またE2Eテストが必要な場面にあたり、
ツールを再検討していたところ、
Webdriver不要のツールがあるとのことで、
早速試してみたがいい感じだったので、
深堀していこうと思う。

> **[testcafe]**
> A Node.js tool to automate end-to-end web testing. 

node.jsベースのテストツール。
Webdriver不要でブラウザテストができ、
かつElectronでお茶を濁したものではない。

特徴は

1. WebDriver不要
2. コマンドオプションだけで実行するブラウザを切り替えられる
3. JavaScript対応
4. テストケースはTypeScript


----
------------------- ↓ 本題はここから ↓-------------------

## [testcafe]のインストール
例によってインストールから記述する。
適当に読み飛ばしてほしい。

[Node.js]で動作するので、
[Node.js]のインストールから行うが、
コンパイルが以上に時間がかかるうえ、
バージョンアップが頻繁に起こるので、
nodeマネージャである[nodebrew]\(Linuxなど), [Nodist]\(Windows)からインストールをする。

### [Node.js]のインストール
###### [nodebrew]のインストール
Linuxではaptやyumよりもこちらを使うことを薦める。
Mac？なにそれ。

```shell-session
$ curl -L git.io/nodebrew | perl - setup
$ set -o noclobber # 念のため
$ echo export PATH='$HOME/.nodebrew/current/bin:$PATH' >> ~/.bashrc
$ source ~/.bashrc
```
動作確認

```shell-session
$ nodebrew -v
nodebrew 1.0.0
```

###### [nodebrew]を使って[Node.js]をインストール

```shell_session
$ nodebrew install-binary latest
$ nodebrew use latest
$ node -v
v10.1.0
$ npm -v
5.6.0
```

###### [Nodist]のインストール
Windows上では[nodebrew]が動かない\(WSL環境を除く)のでこちらを使う。
以下より最新のexeファイルをダウンロード、実行してインストール
https://github.com/marcelklehr/nodist/releases

動作確認

コマンドプロンプト上で以下を実行

```shell-session
> nodist -v
0.8.8
```


###### [Nodist]を使ってnodeをインストール

```shell-session
> nodist + latest
10.1.0
> node -v
10.1.0
>npm -v
4.0.5
```

### [testcafe]のインストール
[Node.js]の用意ができらので、
npmより[testcafe]をインストールする。

```shell-session
$ npm install -g testcafe
+ testcafe@0.20.0
added 285 packages in 9.544s
$ testcafe -v
0.20.0
```

## テストケースの作成

testcafeには以下のサンプル実行用ページがある
http://devexpress.github.io/testcafe/example/

それを使ってのテストサンプル。

```
1. 左上のテキストボックスに「John Smith」と入力
2. 最下部の「Submit」ボタンをクリック
3. ページ遷移後「Thank you, John Smith!」と表示されているの
```
というテスト内容

```typescript:test1.js
import { Selector } from 'testcafe'; // first import testcafe selectors

fixture `Getting Started`// declare the fixture
    .page `https://devexpress.github.io/testcafe/example`;  // specify the start page


//then create a test and place your code there
test('My first test', async t => {
    await t
        .typeText('#developer-name', 'John Smith')
        .click('#submit-button')

        // Use the assertion to check if the actual header text is equal to the expected one
        .expect(Selector('#article-header').innerText).eql('Thank you, John Smith!');
});
```

### テスト実行

```shell-session
$ testcafe chrome test1.js  # chromeで実行
$ testcafe firefox test1.js # firefoxで実行
$ testcafe ie test1.js      # IEで実行
```

----
------------------- ↓ 後書はここから ↓-------------------

同様のツールに[Cypress](https://www.cypress.io)があるが、
chromeしか対応してないので除外した。
Flyweight Pattern

# Flyweight Pattern
同じようなオブジェクト生成時のメモリの消費を最小限にするため、あらかじめマップにオブジェクトを保管しておく。

# Reference
- [tutorialspoint:Flyweight](https://www.tutorialspoint.com/design_pattern/flyweight_pattern.htm)
- [journaldev:Flyweight](https://www.journaldev.com/1562/flyweight-design-pattern-java)
- [geeksforgeeks:Flyweight](https://www.geeksforgeeks.org/flyweight-design-pattern/)
- [github: Flyweight](https://github.com/iluwatar/java-design-patterns/tree/master/flyweight)
tcpサーバー(テスト環境)を一瞬で作る

# tcpサーバーを簡単に建てたい
プログラミングしてると、サーバー側とクライアント側の問題がわからない時があったのでtcp socketを簡単にできるようにした
## 最小構成(繰り返し)
```
while : ; do (echo -ne "response message" | nc -l 3000); done
```
## 1回だけのメッセージ
```
echo -ne "response message" | nc -l 3000
```

## 何回目のリクエストかカウント
```
while :; do echo -ne "$count 回目のリクエストを待ち受けています\n\n"; echo -ne "response message" | nc -l 3000; count=$((count+1)); done
```

## 展開するとこんな感じ
```
while : 
do
echo -ne "response message" | nc -l 3000
done
```
2018年のDApp開発ツールまとめ

DAppsとは、Decentralized Apps(非中央集権型アプリ)の略で、主にブロックチェーン上で動作するアプリケーションのことを指します。DAppsを構築するのに最もよく使われているブロックチェーンがEthereumで、Ethereum上で動くDAppをスマートコントラクトとも呼びます。

さて、[Ethereumのブロックが初めて採掘され](https://blog.ethereum.org/2015/07/30/ethereum-launches/)てから早3年、スマートコントラクトを開発する環境もかなり整ってきました。それらツール群をご紹介したいと思います。

### [Geth](https://github.com/ethereum/go-ethereum/releases)
基本ですね。GethはEthereumクライアントと呼ばれる類のものです。ネットワークとブロックを同期し、Ethereumのノードをになることができます。ノードになると、チェーンからデータの読み取り(call)や、チェーンへのデータの書き込み(transaction、要手数料)ができるようになります。
同様のものに、Parityがあります。

### [Solidity](http://solidity.readthedocs.io/en/latest/)
Ethereumとは切っても切れない関係のプログラミング言語、Solidityです。コントラクトを開発するための専用言語として設計されているのでスマートコントラクト開発の事実上の標準となっています。

### [Truffle](http://truffleframework.com/)
Solidityときたら次に挙がるのがTruffleでしょう。TruffleはSolidityでスマートコントラクトを開発するためのフレームワークです。コントラクトコードのコーディング、テスト、デプロイ(マイグレーション)のを簡単に行うための仕組みを備えています。Truffleがなくても開発することはできるのですが、導入することで、開発効率がぐんと上がります。

### [Ganache](http://truffleframework.com/ganache/)
先ほど「Gethがクライアントである」という紹介をしましたが、パブリックなチェーンと同期するクライアントではコントラクトが公開されてしまいますし、動作が遅かったり、手数料がかかってしまうため開発には向きません。一応ローカルだけでチェーンを構築するモードも備えているのですが、ブロック生成などは正規の手順できちんと行い、なかなかにリソースを食ってしまうので、開発段階では実用的ではありません。
そこで登場するのがこのGanacheです。Ganacheはローカルだけのチェーンをシミュレーションしてくれます。しかも、スマートコントラクト開発に必要無い部分を簡略化しているため、動作がとっても速いのです。また、マイニングなどせずとも、開発用にEtherの入ったアカウントを複数用意してくれたり、GUIが提供されていたりと、非常に開発を楽にしてくれます。

### [Drizzle](http://truffleframework.com/docs/drizzle/getting-started)
最後に紹介するのが、最近リリースされたDrizzleです。Drizzleは、ブラウザからGethなどのクライアントを経由してコントラクトに対する操作(call, transaction)を行うためのJavaScriptライブラリです。同じ役目を果たすツールとしてはweb3.jsが有名なのですが、コントラクトとの通信は基本的に非同期に行わないといけないのでコールバックやPromise地獄に陥りやすいのです。そこで登場したのがDrizzleです。Drizzleはweb3.jsをラップしたライブラリで、コントラクトの状態をローカルに持っておくことで、自分では非同期処理を行わずに素早いcallとsendを行うことができます。
もちろんweb3.jsの機能もそのまま使うことができるので、汎用性が高いです。

ちなみにTruffle, Ganache, DrizzleはConsenSysというEthereumでいろんなことをやっている会社が開発しているものです。いやー、ConsenSys様様ですよ。


ほかにもINFURA, Parity, Mythrilなど、スマートコントラクト開発のツール、サービスはたくさんあるので、興味ある方はぜひ調べてみてください。


今度これらを使ったHow To記事も書けたらなと思います。
Railsの1年は思いのほか厳密だった話

小ネタですが、不意に見つけたので。

## 1.year
```ruby
1.year.to_i
=> 31556952
```
1の位が2っておかしくない??

```ruby
1.year.to_f/60/60/24
=> 365.2425
```
この端数はもしや4年に一度固まって1日分になったりならなかったりするやつ…!!

> 西暦年が4で割り切れる年は閏年。
> ただし、西暦年が100で割り切れる年は平年。
> ただし、西暦年が400で割り切れる年は閏年。

```ruby
400.years.to_f/60/60/24
=> 146097.0
365*100 + 97
=> 146097
```
おー。。

## 1.month
```ruby
1.month.to_f
=> 2629746.0
1.month.to_f/60/60/24
=> 30.436875
1.month.to_f/60/60/24 * 12
=> 365.2425
```

おー。。

## 1.day
```ruby
1.day.to_f
=> 86400.0
1.day.to_f/60/60/24
=> 1.0
```

なるほど。

## ちなみに
```ruby
1.year.class
=> ActiveSupport::Duration
```

今回は`to_f`で数値化してるから端数が出てるだけであって、
`ActiveSupport::Duration`のまま普通に日数計算するとよしなにしてくれるので心配無用です。

```ruby
cur = Time.current
=> Mon, 21 May 2018 09:22:33 UTC +00:00
cur = Time.current + 1.year
=> Tue, 21 May 2019 09:22:33 UTC +00:00
```
わたしからの贈りもの 〜 じょうずなしごとのさぼりかた

やあやあ、ごきげんよう、🐱です。

最高にCoolなEngineerである諸賢は、気が向かなかったら、仕事をサボる。そうだろ？ 違う？ 何やってんだ。サボれ。サ！ ボ！ る！ べ！ き！ だ！

今日は🐱の超絶技巧をご紹介しましょう。ひみつだよ。

#せんてをうつ
なんか3日くらいゆーっくりしたいな、と思ったら大病ごっこの前振りとして、具合が悪いをするんだ。さりげなーくだよ？

周囲から"大丈夫？"という言葉を引き出せたら、このPhaseはExitしていい。

"大丈夫？ 帰った方がいいんじゃない？"まで引き出せたら、最高だ。

あとはわかるね？

#がんばってるかんじをだす
最高にCoolなEngineerである諸賢は、実に義理堅い。早退を勝ち取った次の日、就業前に電話で一報入れる。

"すんません、まじ具合悪いので、病院行ってきます。またご連絡致します"

近付いてきたな、3連休が。

後はメールで好きなだけ休暇申請を出し、コミュニケーションを断ち、たくさん楽しもう。自分へのご褒美だよ。5連休でもいいよ。土日合わせて9連休だ。海外旅行に行っておいで。

#ようきゅうをのませる
要するにサボりってのは高度な交渉術だ。交渉は仕掛けた方が圧倒的に有利だ。

交渉の要諦は情報/時間/力。[FBIの謂](https://www.amazon.co.jp/FBI%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC%E3%81%A7%E6%95%99%E3%81%88%E3%82%8B%E5%BF%83%E7%90%86%E4%BA%A4%E6%B8%89%E8%A1%93-BEST-BUSINESS-%E3%83%8F%E3%83%BC%E3%83%96-%E3%82%B3%E3%83%BC%E3%82%A8%E3%83%B3/dp/4532313937)だ。その全てにおいて相手が優っていようとも、交渉は出来る。

全ての事は、文字通り、交渉可能だ。

そのために、普段はしっかりした、倫理的な人を演じておくんだよ。勤怠が悪い人にこの作戦は採用し難い。"いつものこと"だからだ。"あいつ、だらしねえからなあ"という印象を持たれた時点で、わたしたちは交渉にあたり、圧倒的な劣位にある。

#もちべーしょん
🐱の経験上、"あー、やれやれ。今日も生き延びたぜ"という心地良い疲労感と、"つらい。しんどい。もーやだー"というのは天と地ほどの差がある。

後者は"[有限で、貴重な、モチベーションが削られ](https://qiita.com/inouetakuya/items/58e5fc12a8015882cfad)"ている。そんなひどいことするやつに、なぜ、最高にCoolなEngineerである諸賢のリソースを割いてあげなきゃならないんだ？

#生の唯一性/一回性
最高にCoolなEngineerである諸賢の生命は、掛け替えがないものだ。誰にも代わりを演じることなんて出来ない。

だから、あなたたち、最高にCoolなEngineerである諸賢が、ご自身の責任で、生命をコントロール、いや、マネージするんだ。

諸賢はね"有限で、貴重な、モチベーションが削られ"、しょうもないことに取り返しのつかないリソースを奪われている、被害者だ。サボるのが合理的なら、サボろう。それしかないだろ？

そのために、倫理的であれ。おひげの先から尻尾の先まで、洗練され尽くしたプロダクトのように、キラキラに、倫理的であれ。

諸賢がよく作ってるプロダクトだよ。作れるのにそれになれない理由がない。

#結びに
このポエムは最高にCoolなEngineerである諸賢への後方支援である。

[“Those about to rock, WE salute you"](https://www.youtube.com/watch?v=RtMGoU9NcMo)

さあ、次は何のおはなしをしよう？　マネジメントの極意のお話がいいかな？　それともNimとRust、同時に入門しちゃう？

読んでくれてありがとう。

このポエムがせめてなり、一人でも多くの、諸賢の心の傘になりますよう、心から祈っている。

My pleasure.
My honour.
see ya soon.
Your faithful 🐱
MacとWindows両方で動くwebpack.config.jsとpackage.jsonの設定

MacとWindowsで両方で動かせるように
NodeJSのpackage.jsonとwebpackのwebpack.config.jsを修正したときに
ハマったところを残しておきます。

# パスの指定はpathモジュールを使う
Windowsだとpathモジュールで絶対パス指定しないとファイルがないと言われる。
（そもそもWindowsとそれ以外のOSでディレクトリ構造違うし・・・）

NG:

```webpack.config.js
module.exports = {
  entry: {
    'bundle': [
      './src/main/index',
    ]
  }
}
```

OK:

```webpack.config.js
const path = require('path')

module.exports = {
  entry: {
    'bundle': [
      path.join(__dirname, '/src/main/index'),
    ]
  }
}
```

# ローカルサーバ起動用のIPアドレスは0.0.0.0ではなく、127.0.0.1を使う
WindowsだとデフォルトゲートのIPアドレスとして0.0.0.0は使われて起動できないので、
ループバックIPアドレス127.0.0.1を使う。

NG:

```webpack.config.js
module.exports = {
  devServer: {
    host: '0.0.0.0',
    proxy: {
      '**': {
        target: 'http://0.0.0.0:3232',
        changeOrigin: true,
      },
    },
  },
}
```

OK:

```webpack.config.js
module.exports = {
  devServer: {
    host: '１２７.0.0.1',
    proxy: {
      '**': {
        target: 'http://127.0.0.1:3232',
        changeOrigin: true,
      },
    },
  },
}
```


# １行で複数コマンド実行時は;ではなく&&を使う
Windowsだとpackage.jsonのscriptsに`;`は使えないので、`&&`に置き換えする。

NG:

```package.json
  "scripts": {
    "dev": "cd config; yarn dev",
  }
```

OK:

```package.json
  "scripts": {
    "dev": "cd config && yarn dev",
  }
```

`;`と`&&`は正確にはコマンド失敗時の挙動が違うが、連続実行したい分であれば代替できる。
参考：[シェルコマンド1行で複数コマンドや条件に応じた実行をする](https://qiita.com/wwwaltz/items/9ee247ee8fe3ab63fd27)

# NODE_ENV
Windowsだと環境変数の指定にsetコマンドが必須なのでコマンドを分けるしかない・・・
(もしくは開発時は環境変数指定しないなど割り切る)

・Mac

```
NODE_ENV=dev node server.js
```

・Windows

```
set NODE_ENV=dev node server.js
```
Ethereum スマートコントラクトのエンコードされた関数シグネチャを得る

- Ethereum スマートコントラクトのエンコードされた関数シグネチャを得る方法のメモです。

# エンコードされた関数シグネチャとは
- スマートコントラクトの関数を call するコードをローレベルで書いたり、マルチシグウォレットからスマートコントラクトの関数を call する際に必要となります。
- `functionName(type1,type2,...)` という関数のプロトタイプ文字列を、Keccak256 でハッシュ化したあとの最初の4バイトがエンコードされた関数シグネチャになります。
- たとえば、`sendMessage(string message, address to)` という関数の場合、エンコードされた関数シグネチャは`sendMessage(string,address)` を Keccak256 でハッシュ化した最初の4バイト `0xc48d6d5e` です。

# Web3 を使用して関数シグネチャを得る
- Web3 1.0.0 では、エンコードされた関数シグネチャを簡単に得ることのできる関数が用意されています。

```js
let encodedFunctionSignature = web3.eth.abi.encodeFunctionSignature('sendMessage(string,address)');
 console.log(encodedFunctionSignature);
 // => 0xc48d6d5e
```

# デモ
- [https://piyolab.github.io/playground/ethereum/getEncodedFunctionSignature/](https://piyolab.github.io/playground/ethereum/getEncodedFunctionSignature/)

# 関連
- [http://blog.playground.io/entry/2018/05/08/163727](http://blog.playground.io/entry/2018/05/08/163727)

# 参考
- [https://web3js.readthedocs.io/en/1.0/web3-eth-abi.html#encodefunctionsignature](https://web3js.readthedocs.io/en/1.0/web3-eth-abi.html#encodefunctionsignature)

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_スマートコントラクトのエンコードされた関数シグネチャを得る
【PHP】セッションIDを取得＆変更する関数

今回は、セッションIDを取得し、また、セッションIDを変更するための関数をご紹介します。
それが、session_id()とsession_regenerate_id()です。

まずは、HTMLをエスケープする関数を作成します。

```php:h.php

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>HTMLでのエスケープ処理をする関数</title>
</head>
<body>
<?php 

//HTMLでのエスケープ処理をする関数
function h($var) {
	// is_array() -> $varが配列かどうかを調べる
	// $varが配列だったら・・・
	if (is_array($var)) {
		// array_map() -> 配列の各要素に対して指定した関数を実行する
		// array_map('コールバック関数名',配列)
		return array_map('h', ($var));
	// $varが配列じゃなかったら・・・
	} else {
		// フォームなどからのユーザーのデータをブラウザに表示する場合は、
		// 原則すべてのデータにhtmlspecialchars関数を使用する。
		// ENT_QUOTES -> クオートを変換する
		return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
	}
}

?>
</body>
</html>
```

実際のセッションIDに関する関数を書いてみます。まず最初に、上のエスケープ関数を読み込みましょう。

```php:session_id.php

<?php 
// HTMLをエスケープする関数を呼び出す
require_once('../213/221/h.php');
// セッションを開始する：session_start()
session_start();
 ?>
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>現在のセッションIDを取得＆変更する</title>
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<?php 
echo "<p>現在のセッションIDは、「".h(session_id())."」です</p>";
// 出力：「現在のセッションIDは、「0o1pmvqd894gh19opj6kdjnfjq」です」

// セッションIDを変更する
// 同じセッションIDを使用することは、セキュリティ上宜しくない
session_regenerate_id(true);

echo "<p>現在のセッションIDは、「".h(session_id())."」です</p>";
// 現在のセッションIDは、「e95si5da9tje05kov7kg9g91hp」です
// 上とは異なるセッションIDが出力される

?>
</body>
</html>
```
以上です。押忍〜
古いMacでもAirDropを使えるようにする方法


私のiMacは2010年モデルなので、AirDropに対応していません。
2012年以降に発売されたものから対応しているらしい。

ですが、AirDropってふとしたときに便利ですよね
使いたかったので調べたところ、コマンドがあったので、メモしておきます。

```bash
$ defaults write com.apple.NetworkBrowser BrowseAllInterfaces -bool TRUE; killall Finder
 ```

もとに戻すには以下のコマンドです。

```bash
$ defaults write com.apple.NetworkBrowser BrowseAllInterfaces -bool False; killall Finder
 ```

参考
https://lifehacker.com/enable-airdrop-on-older-unsupported-macs-1556180698
CI機能作成録01 - 環境構築編：TravisCI導入

## CI環境を構築する
###今回やること
・TravisCI登録、Git連携
・リポジトリ、ブランチ等の準備
・TravisCI連携確認
###使用ツール等
・TravisCI
・GitHub Desktop
・Atom（エディタ）

##はじめにTravisCIとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/e04ddc43-2880-0faf-6448-3f584b6037a2.png)

TravisCIはCI（継続的インテグレーション）ツールのひとつ。Gitとの連携を売りにしている（らしい）。ソースをGitで管理している場合はテストが容易という利点がある。また、Git側もTravisCIに対応しているため、Gitからテストの可否が確認可能。

##前提
GitHubアカウントを持っていること

##TravisCI登録

下記から。
https://travis-ci.org/


右上のSign in with GitHubボタンから、GitHubアカウントを認証する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/a62cadb6-d634-80a4-fac3-e6d9cd5c1de9.png)
　

（途中のキャプチャは忘れたが、）連携させたいGitHubアカウント認証まで行うと、こんな感じの初期画面が出る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/87751427-59f8-5615-5cb8-d086cdb7a515.png)

##リポジトリの設定
右上のGitHubアイコンから、自分のGitHubアカウントの設定ページへ飛び、テストで使用したいリポジトリ隣のスイッチのようなアイコンを押下。
※これでpushするだけで自動でテストを行ってくれるようになる（らしい）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/8e7dd77c-3626-cd61-0b92-2e2bf57fc028.png)

##設定ファイル、テストスクリプトの作成
今回はTravisCiの連携確認までを目的としているため、テストスクリプトについては空ファイル（※内容は次稿で考える）、設定ファイルについては拾い物で用意。先程設定したリポジトリのプロジェクト配下に配置。
　
設定ファイル：.travis.yml
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/cb52573d-e06a-0cdd-a406-695bf4bc5903.png)
　
テストスクリプト：testCi.py
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/18ff547c-954e-252c-5320-5062363f8a58.png)

##TravisCi連携確認
###pushにはGitHub Desktopを使用
リポジトリ設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/a88766c1-e0fd-ce43-05dd-6cfb5c3be5d9.png)
　
Ci機能作成専用としてブランチを新規で切る　※今回は既にCIというブランチを作成済み
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/883fb8d5-f9cf-11ab-2e32-b0943e97ccf2.png)
　
Commit（push）する　※サマリー名は任意で
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/3917a164-8eb4-c720-b4b8-853c70512e35.png)
※pushの時点でテストが回り始める
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/ec266027-e642-0050-4522-506c8a5f2d27.png)
　
TravisCIを確認すると…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/77978bf8-56c7-dcd5-a357-bfe57c95a152.png)
　
今回のGitへのpushがTravisCIにテストとして連携され、テストが落ちていることが確認できる。※中身については次稿で考察しようと思う。
ちなみに成功すると、このような表示となる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/250578/646b4cc7-2116-c031-dac9-4007239d7df5.png)
　
今日はここまで。