OmniAICreator/Qiita-1.07M huggingface dataset:
【改善済み】DialogflowからMicrosoft Flow（Azure Logic Apps）を呼ぶ際の注意点

※2019/6/18 追記
本記事の内容ですが、Dialogflow側のアップデートで改善済みのようです。
Microsoft Flow/Logic AppのURLをDialogflowにそのまま貼っても問題なく動くようになったようです。

----

## 前置き
Googleが提供する自然言語処理作成プラットフォームのDialogflowでは、Fulfillmentという機能で外部のWeb APIを呼び出し、インテント内でその結果を使うことができます。

また、Microsoft Flow（またはAzure Logic Apps）ではノンコーディングでHTTPリクエストをトリガーとした簡易プログラムを作ることができます。

そのためDialogflowからMicrosoft Flowを呼び出すことで、簡単に自然言語処理を含んだ処理をノンコーディングでつくることができる…のですが、ふつうにやると、エラーが出てハマります。

本記事は、その回避方法です。

## Dialogflow＋Microsoft Flowで起きるエラー
Dialogflowでインテントを設定し、そこから呼び出すことを想定します。
問題は、DialogflowにMicrosoft FlowのURLを設定する部分です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/f2379ed1-f8b3-c506-9300-b6d715a49f62.png)
以下のようにMicrosoft FlowからコピーしたURLを、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/b55a0109-4402-6037-ca0e-0d703df0b6e7.png)
このようにDialogflowのFulfillmentにそのまま貼っただけでは、呼び出し時にDialogflowで以下のようなエラーが出てしまいます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/f4e2b448-3759-b78f-c476-e98598500761.png)

Microsoft Flowから返されるメッセージ↓

```json
��{"error":{"code":"AuthorizationFailed","message":"You do not have permissions to perform action 'run' on scope '/triggers/manual/paths/'. Verify you are making the request with the appropriate HTTP method. See http://aka.ms/logic-trigger for details."}}
```

DialogflowのDiagnostic infoで確認できるレスポンス情報↓

```json
{
  "responseId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "queryResult": {
    "queryText": "60",
    "action": "xxxx",
    "parameters": {
      "hoge": 0,
    },
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/xxxx/agent/intents/xxxxxxxx",
      "displayName": "xxxxx"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {
      "webhook_latency_ms": 739
    },
    "languageCode": "ja"
  },
  "webhookStatus": {
    "code": 16,
    "message": "Webhook call failed. Error: 401 Unauthorized"
  }
}
```

なぜか、 **401の認証エラー** が出ます。
Microsoft Flowに作ったHTTPトリガーのフローは認証不要でアクセスできるはずなのに…。

## 解決策
答えは以下にありました。

[Using webhooks on dialogflow to Azure logic apps - stackoverflow](https://stackoverflow.com/questions/47891106/using-webhooks-on-dialogflow-to-azure-logic-apps)

このように、URLの中にある「%2F」→「/」に変更してあげます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e2915799-2c67-6443-9f58-50b61a738463.png)

これにより、おかしな認証エラーが出ずにDialogflowとMicrosoft Flowを連携させることができます。

## 補足
のちほどDialogflow＋Microsoft FlowでLINE Botを作成する記事を出すので、DialogflowとMicrosoft Flowおよびその組み合わせについての詳細な解説はそちらをご参照ください。
→書きました：[賢いLINE Botを完全無料＆ノンコーディングで開発する（Dialogflow＋Microsoft Flow）](https://qiita.com/himarin269/items/5c0190a13f95b5538546)
ジェネレータベースのコルーチンを async で書き換えるにはどうすればいいか？ 

Pythonのジェネレータには `.send()`, `.throw()`, `.close()` というメソッドがあり**コルーチン**として使うことができます（[PEP 342](https://www.python.org/dev/peps/pep-0342/))。

しかし、残念なことにジェネレータベースのコルーチンは[Python 3.10での廃止が予定されている](https://docs.python.org/3/library/asyncio-task.html#generator-based-coroutines)ので、async def ベースのコルーチンに書き換えなければなりません。

・・・が、なぜか、具体的な書き換え方法はドキュメントに書かれていませんでした（ジェネレータベースのコルーチンを、@types.coroutine　でラップして async ベースとして使う方法は書かれていましたが）。

# 書き換える方法

コルーチン関数の方は、単に`def`を`async def` に書き換えるだけです。

| Generator-based| Async-based |
| :-- | :-- |
| `def` | `async def` |
| `yield` | `yield`（変更なし） |

コルーチンと通信する部分は、頭に`a`がついたメソッドを`await`で呼び出すようにします。

| Generator-based| Async-based |
| :-- | :-- |
| `c.send()` | `await c.asend()` |
| `c.throw()` | `await c.athrow()` |
| `c.close()` | `await c.aclose()` |

さらに、 *コルーチンを呼び出す側の関数（それ自体はコルーチンではない）*も、async コルーチンに書き換え、`asyncio.run`で実行するようにします。

| Generator-based| Async-based |
| :-- | :-- |
| `caller()` | `asyncio.run(caller())` |


# 書き換えの例

わざとらしいですが、こんな数値の合計値を随時返すコルーチン（`sumup`）と、呼び出す関数（`main`）があったとします。

```python
def sumup():
    n = 0
    while True:
        n += yield n

def main():
    coroutine = sumup()
    coroutine.send(None)

    x = coroutine.send(1)
    print(x)
    x = coroutine.send(2)
    print(x)
    x = coroutine.send(3)
    print(x)

    coroutine.close()

main()
```

出力:

```
1
3
6
Bye!
```

書き換えるとこうなります。

```python
import asyncio

async def sumup():
    n = 0
    while True:
        n += yield n

async def main():
    coroutine = sumup()
    await coroutine.asend(None)

    x = await coroutine.asend(1)
    print(x)
    x = await coroutine.asend(2)
    print(x)
    x = await coroutine.asend(3)
    print(x)

    await coroutine.aclose()

asyncio.run(main())
```
MVVM Light Toolkitで簡易アプリ作成

## はじめに
WPF（MVVM）でのHello World的なアプリ作成を試してみる。
たぶんもっとスマートな方法があると思うけど…。

## 環境
- Windows 10
- Visual Studio 2017
- MVVM Light Toolkit

MVVM Light Toolkitでのサンプルとしては、[こちら](https://code.msdn.microsoft.com/windowsdesktop/MVVMMVVM-Light-ReactiveProp-e998b7b1)でサンプルコードが提供されている。
今回の簡易アプリ作成の上で参考にした。


## プロジェクト作成
WPFでプロジェクト作成し、

ツール → NuGetパッケージマネージャ → ソリューションのNuGetパッケージの管理

でパッケージマネージャを表示させ、下記パッケージを導入する。

- MvvmLight
- ReactiveProperty

インストールに成功すると、`ViewModel`フォルダが生成され`MainViewModel.cs`, `ViewModelLocator.cs`が作成される。
自分の環境では、生成された`ViewModelLocator.cs`にエラーが出てビルドできず、下記修正を加えた。

```csharp:ViewModelLocator.cs
// using GalaSoft.MvvmLight; // コメントアウト
using CommonServiceLocator; // 追加
using GalaSoft.MvvmLight.Ioc;
// using Microsoft.Practices.ServiceLocation; // コメントアウト
```

Viewに下記を追加する。

```xml:MainWindow.xaml
<Window x:Class="WpfMvvmTrain01.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfMvvmTrain01"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        DataContext="{Binding Source={StaticResource Locator}, Path=Main}">
        <!-- ↑ DataContext を追加 -->
```

## なんか表示させる
`MainViewModel.cs` の MainViewModelクラスに適当にプロパティを追加して動かしてみる。
数字を表示させ、ボタンで増減させてみる。

```c#:MainViewModel.cs
        public MainViewModel()
        {
            this.Number = new ReactiveProperty<int>();

            this.IncrementNum = new ReactiveCommand();
            this.IncrementNum.Subscribe(_ => this.Number.Value++);

            this.DecrementNum = new ReactiveCommand();
            this.DecrementNum.Subscribe(_ => this.Number.Value--);
        }

        public ReactiveProperty<int> Number { get; set; }
        public ReactiveCommand IncrementNum { get; private set; }
        public ReactiveCommand DecrementNum { get; private set; }
```

```xml:MainWindow.xaml
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding Number.Value}"/>
            <Button Content="increment" Command="{Binding IncrementNum, Mode=OneWay}"/>
            <Button Content="decrement" Command="{Binding DecrementNum, Mode=OneWay}"/>
        </StackPanel>
    </Grid>
```


## 実行結果
![rapture_20190217174145.png](https://qiita-image-store.s3.amazonaws.com/0/172509/a4a8e5ed-3930-1361-4c24-93e3d41f4a20.png)

ボタンを押すと左上の数値が変動する。
自分でほとんどコードを書くことなく動作させることができた。
fastlaneでiOSのAdHoc用アプリをビルドする

## fastlaneをインストール

```sh
# もしXcodeのコマンドラインツールをイントールしていなければインストールする
xcode-select --install

# Xcodeプロジェクトのディレクトリに移動
cd ./AwesomeProject

# Gemfileファイルを生成
# 直接インストールする事も可能だが、Gemfileでインストールする
vi ./Gemfile
```

プロジェクト直下に`Gemfile`というファイルを作成し、以下の通り記載。

```ruby:Gemfile
source "https://rubygems.org"

gem "fastlane"
```

```sh
# Rubyがインストールされていなければインストール
# ここの手順は省く

# もしbundlerがインストールされていなければインストール
sudo gem install bundler

# Gemfileをベースにfastlaneをインストール
bundle install
```

## fastlane gymを設定

```sh
# fastlane初期化
bundle exec fastlane init

# fastlane gym初期化
bundle exec fastlane gym init
```

書き出されたGymfileを編集する。
プロジェクトのプロファイル名は[iOS Provisioning Profiles](https://developer.apple.com/account/ios/profile/)のName。

```ruby:fastlane/Gymfile
export_options({
  method: "ad-hoc",
  provisioningProfiles: { 
    "com.example.awesome-project" => "iOS Distribution AdHoc AwesomeProject"
  }
})
```

## ビルド

```sh
bundle exec fastlane gym
```

するとプロジェクト直下にipaが出力される。
これを[TestFlight](https://developer.apple.com/jp/testflight/)にアップロードしたり[Apple Configurator 2](https://itunes.apple.com/jp/app/apple-configurator-2/id1037126344?mt=12)を使って実機にインストールしたりする。
iOS開発者アカウントの2段階認証を設定する

最近、iOS開発者の元にこんなメールが届いています。
<img width="756" alt="email1200.png" src="https://qiita-image-store.s3.amazonaws.com/0/243326/1fc99af2-beec-6b01-245e-73badc4efb7a.png">
要は「2月27日までに開発アカウントの2段階認証（2FA）を有効化せよ」というお上からの御触れです。逆らわずに2FAを設定しましょう。

2FAをオンにするには、iOS端末もしくはMacに開発者アカウントでiCloudにログインします。具体的な方法は[こちら](https://support.apple.com/ja-jp/HT204915)。

既にiPhoneもMacも個人用のアカウントでログインされていて、わざわざログアウトするのが面倒な場合は、Macに[ユーザーを追加](https://support.apple.com/ja-jp/guide/mac-help/mtusr001/mac)して、そこで開発者アカウントにログインすると良いでしょう。自分の場合はそうしました。2FAの設定に使う電話番号は、個人用アカウントで使われているものと同じでも大丈夫でした。

**注意：** Macにユーザーを追加する場合は、なるべく強固なパスワードを使いましょう。2FAをONにする際に「このユーザーのパスワードでデータを暗号化します」というメッセージが表示され、今後もたびたび入力を求められます。
<img width="887" alt="mac-icloud.png" src="https://qiita-image-store.s3.amazonaws.com/0/243326/770ed9a9-e00d-ff47-786e-a0b42696b1c0.png">
開発者アカウントの2FAを設定できたので、次に確認コードを受け取る端末を設定します。このために新しい端末を用意しても良いのですが、個人用アカウントで使っている端末を併用することもできます。具体的な手順は以下の通り。

1. iPhoneの「設定」アプリを開く
2. 「パスワードとアカウント」項目を開く
3. 「アカウントを追加」をタップする
4. 「iCloud」を選択する
5. 開発者用アカウントでログインする
6. 「メール」や「カレンダー」などはすべてオフにする

こうすると追加されたアカウントのステータスは「停止中」となりますが、2FAの確認コードは受け取ることができます。

参考：
[Adding a Separate Developer Account to your iOS Device] (https://kylesethgray.com/adding-a-separate-developer-account-to-your-ios-device/)
AtCoderでTLEと言われどうやって綺麗なコードを書くかという話



# 事の発端
エンジニアとしてやはり力をつけるには自発的な勉強が必要と考えて**AtCoder**の過去問を解き始めることにした。
しかし、**日本沈没**という問題で以下のコードを提出した所、**Time Limit Exceeded**で怒られてしまった。


```JapanSinksTle.java

import java.io.*;
import  java.util.*;
import static java.lang.System.in;
class Main{
    public static void main(String[] args)throws IOException{
      Scanner sc = new Scanner(System.in);
      int field = sc.nextInt();
      int jRyouiki[] = new int[field];
      int high = 0;
      for(int i = 0; i < field; i++){
        jRyouiki[i] = sc.nextInt();
        if(high < jRyouiki[i]){
          high = jRyouiki[i];
        }
      }   
      int umi = 0;
      int island = 0;
      int islandcnt = 0;
      int maxIsland = 0;
      while(high > umi){
        for(int i = 0; i < field; i++){
          if(umi < jRyouiki[i]){
            island = i + 1;
             if(i == (field-1)){
              islandcnt++;
            }
          }else{
            if(island != 0 ){
              islandcnt++;
            }
            island = 0;
          }
        }
        if(islandcnt > maxIsland){
        	maxIsland = islandcnt;
        }
        umi++;
        islandcnt = 0;
        island = 0;
      }
      System.out.println(maxIsland);
    }
}
```

# 原因と今後
はっきり言ってしまえば、**単調なループ処理のせいで実行時間が長くなっている**のだろう。
今まで、ただ動けばよいと良いと思っていましたがあまり処理に負荷がかからないスマートなコードをかけるように努力しようと思います。

続く…
Create an environment for Golang and MySQL using docker-compose.yml

## Goal

To create an environment for Golang and MySQL, and getting data from database via go application.

## Directory Structure

```bash:on_your_computer
Docker/
　├ Go/
　│　└ Dockerfile
　└ MySQL/
　 　└ Dockefile
　　 └ test.sql
```

## Create files

```yaml:docker-compose.yml
version: '3'
services:
  db:
    build:
      context: ./MySQL
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
    container_name: golang_db
    ports:
      - "3306:3306"
    tty: true
  app:
    build:
      context: ./Go
    volumes:
      - "./Go:/go"
    container_name: golang_app
    ports:
      - "8080:8080"
    tty: true
    depends_on:
      - db
```

```dockerfile:Go/Dockerfile
FROM golang:latest

RUN apt-get update
RUN apt-get install vim -y
RUN go get "github.com/go-sql-driver/mysql"
```

```dockerfile:MySQL/Dockerfile
FROM mysql:5.6
COPY test.sql /docker-entrypoint-initdb.d/test.sql
```

```sql:MySQL/test.sql
Use test_db;

Create table `test_tb` (id int, name varchar(20));

Insert into test_tb (id, name) values (1, 'test-user');
```

Then run command below

```bash
docker-compose up --build
```

## How to use

You can edit main.go at local or docker container (golang_app)

```bash:get_into_docker_container
docker exec -it golang_app bash
```

```main.go
package main
  
import(
        _ "github.com/go-sql-driver/mysql"
        "database/sql"
        "fmt"
        "log"
)

func main() {
        cnn, err := sql.Open("mysql", "docker:docker@tcp(db:3306)/test_db")
        if err != nil {
                log.Fatal(err)
        }

        id := 1
        var name string

        if err := cnn.QueryRow("SELECT name FROM test_tb WHERE id = ? LIMIT 1", id).Scan(&name); err != nil {
                log.Fatal(err)
        }

        fmt.Println(id, name)
}
```

## Build & Run

```bash:on_golang_app_container
go run main.go
```
or

```bash:on_your_computer
docker exec -it golang_app bash -c "go run main.go"
```

you can get line below

```bash
1 test-user
```

## Refs

https://github.com/docker-library/mysql/issues/129#issuecomment-178265632
https://hub.docker.com/_/mysql/
Gitでブランチ操作とマージして、graphで確認してみた。

#環境
・Git version 2.20.1.windows.1

#今日の目標
ブランチ操作とマージについて操作を覚える。

#目次

1.ブランチの一覧を表示する。
2.新しいブランチを作成し、作業するブランチを切り替える。
3.ブランチのマージ
4.ツリー風なCUIでブランチを確認する。


#1.ブランチの一覧を表示する。

masterブランチの左側にある*が現在のブランチを表すらしい。

```
$ git branch
* master
```

#2.新しいブランチを作成し、作業するブランチを切り替える。

新しいブランチSampleAを作成する。

```
$ git checkout -b SampleA
Switched to a new branch 'SampleA'
M       README.md

```

このコマンドは次のコマンドでも同じ動作が期待できる。

```
$ git branch SampleB
$ git checkout SampleB
```

ブランチSampleBが作成され、チェックアウトされたことがわかる。

```
$ git branch
  SampleA
* SampleB
  master
```

この状態でREADME.mdに１行追加してステージングしてからコミットしてみる。
（編集は省略）

```
$ git add README.md
$ git commit -m "add SampleB"
[SampleB f41dde9] add SampleB
 1 file changed, 2 insertions(+)
```

この状態でmasterにステージがコミットされていないことを確認する。

```
$ git checkout master
Switched to branch 'master'
A       .README.md.swp

$ git branch
  SampleA
  SampleB
* master

```

まずはmasterにブランチを切り替える。
この状態でREADME.mdの中身を確認すると、SampleBで追加した内容が存在しないことがわかる。

再び元のSampleBブランチに戻る。
checkoutコマンドの引数に-を付けると１つ前のブランチに戻る。

```
$ git checkout -
Switched to branch 'SampleB'
A       .README.md.swp

$ git branch
  SampleA
* SampleB
  master
```

元のSampleBのブランチに移動した。

#3.ブランチのマージ

SampleBのブランチをmasterブランチにマージする。
まずmasterブランチをチェックアウトする。

```
$ git checkout master
Switched to branch 'master'
A       .README.md.swp
```

現在のブランチを確認する。

```
$ git branch
  SampleA
  SampleB
* master
```

masterに切り替わった。

マージコマンドを入力する。
このときに--on-ffオプションを付ける。
これにより、ブランチからマージしたことがロギングされる。

```
$ git merge --no-ff SampleB
hint: Waiting for your editor to close the file...
[main 2019-02-17T08:12:29.924Z] update#setState idle
[main 2019-02-17T08:12:59.927Z] update#setState checking for updates
[main 2019-02-17T08:13:00.052Z] update#setState idle

```

テキストエディタが開くので、コミットメッセージを入力する。
デフォルトでブランチ先からのコミットであるメッセージが入力されているため
編集しなくてもＯＫ。

```
Merge made by the 'recursive' strategy.
 README.md | 2 ++
 1 file changed, 2 insertions(+)

```
マージされた事をログで確認できる。

#4.ツリー風なCUIでブランチを確認する。

```
$ git log --graph
*   commit 1ea19865678c353a23dac5168f097d82e760fac1 (HEAD -> master)
|\  Merge: 8381fa5 f41dde9
| | Author: 僕の名前 <僕のメルアド>
| | Date:   Sun Feb 17 17:12:26 2019 +0900
| |
| |     Merge branch 'SampleB'
| |
| * commit f41dde96d8ac51edac62f2faaae97914f60eff26 (SampleB)
| | Author: 僕の名前 <僕のメルアド>
| | Date:   Sun Feb 17 00:11:49 2019 +0900
| |
| |     add SampleB
| |
* | commit 8381fa57775415a1b8b39e841e987de678f8bf88
|/  Author: 僕の名前 <僕のメルアド>
|   Date:   Sun Feb 17 17:11:24 2019 +0900
|
|       swp commit
|
* commit 1e18d76875063f058644bbc2083447bc95aae385 (SampleA)
| Author: 僕の名前 <僕のメルアド>
| Date:   Thu Feb 14 21:41:36 2019 +0900
|
|     テストコミット
|
|     テストしたかったから。
|
* commit 1da12c37794122b58c6c099067c27249c38c24c1
  Author: 僕の名前 <僕のメルアド>
  Date:   Thu Feb 14 21:28:47 2019 +0900

      First commit
```

これ、見やすいか？
俺にはみやすくない。

ちなみに、一番下がFirst commitでどんどん上に派生してく感じで書かれている。


今回はここまで。
次はコミットの変更とリモートリポジトリに送信するとこまでやる予定。
【Ruby on Rails】changeとup・downの使い分けについて

スクールで学習していたときにはchangeのみしか扱っておらず、up・downとの違いがわかりにくい部分があったのでメモしておきたいと思います。
初投稿が故、マークダウンの練習も兼ねています。

# そもそもup・downって？
マイグレーションファイルのchangeメソッドではバージョンを上げるときの処理を書いておけば、下げるとき（ロールバック）の処理も記述したかのように動作してくれる仕組みになっているらしい。
ただし、変更内容によっては下げるときの処理も別で書く場合もあり、その際にはupメソッドとdownメソッドという形で書くとのこと。

## changeを使う場合
単純にカラムを追加するとき(add_column)であれば、changeで記述してもバージョンを下げる処理を行うことができます。命名規則に従うだけで内容まで記述されたマイグレーションファイルが生成されるのは便利ですね。

```Ruby:20190217071419_add_detail_to_user.rb
class AddDetailToUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :detail, :string
  end
end
```


## up・downを使う場合
カラムの変更(change_column)の場合、changeメソッドで記述するとバージョンを下げる処理を生成してくれません。downを使ってバージョンを下げる際の処理を書きます。

```Ruby:20190217072540_change_column_to_user.rb
class ChangeColumnToUser < ActiveRecord::Migration[5.2]
  def up
    change_column :users, :detail, :text
  end

  def down
    change_column :users, :detail, :string
  end
end
```
####マイグレーション

```
$ bin/rails db:migrate
== 20190217072540 ChangeColumnToUser: migrating ===============================
-- change_column(:users, :detail, :text)
   -> 0.0025s
== 20190217072540 ChangeColumnToUser: migrated (0.0031s) ======================
```
####ロールバック
```
$ bin/rails db:rollback
== 20190217072540 ChangeColumnToUser: reverting ===============================
-- change_column(:users, :detail, :string)
   -> 0.0010s
== 20190217072540 ChangeColumnToUser: reverted (0.0017s) ======================
```

ロールバックも正しく行えているようです。

#changeで書くとどうなるか

```Ruby:20190217080251_change_column_to_user2.rb
class ChangeColumnToUser2 < ActiveRecord::Migration[5.2]
  def change
    change_column :users, :name, :string, limit: 20
  end
end
```

```
$ bin/rails db:migrate
== 20190217080251 ChangeColumnToUser2: migrating ==============================
-- change_column(:users, :name, :string, {:limit=>20})
   -> 0.0435s
== 20190217080251 ChangeColumnToUser2: migrated (0.0442s) =====================
```

マイグレーションはできる、が、

```
$ bin/rails db:rollback
== 20190217080251 ChangeColumnToUser2: reverting ==============================
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

(以下略)
```

ロールバックができません。たしかにchangeメソッドだと変更前のカラムの情報がないのでロールバックできないのも道理ですね。
マイグレーションまではできてしまうのでうっかりミスしても気づかない可能性があるので気を付けたいところです。

以下のコマンドを使うとロールバックしてからもう一度マイグレーションしてくれるので確認が楽になります。

```
$ bin/rails db:migrate:redo
```

#最後に
初投稿でした。
何か捕捉の情報や修正などありましたら、コメント欄にてご指摘頂けますと幸いです。
#参考にした記事
[RailsのMigrationに関する基本まとめ](https://qiita.com/pon-san/items/c54aee04e56e6bb26eff)
[AWS]同S3バケット内のファイルコピー

S3アクセスログなどで、同じS3バケット内でコピーを実行する場合、
以下のようなコマンドでは、コピー後のファイルが再帰的にコピーされてしまう。

```bash:cmd
aws s3 cp s3://test-qiita-bucket/ s3://test-qiita-bucket/logs/2019/02/17/ \
--recursive \
--exclude "*" \
--include "logs/2019-02-17*"
```

コピー後の再帰コピーを防止するため、コピー後のパスをexcludeする。
こうすることで、同じバケット内のコピーが気兼ねなく行える。

```bash:cmd
aws s3 cp s3://test-qiita-bucket/ s3://test-qiita-bucket/logs/2019/02/17/ \
--recursive \
--exclude "*" \
--include "logs/2019-02-17*" \
--exclude "logs/2019/02/17/"
```
【初心者向け】GCEインスタンスでのAnsibleの導入と実行

# はじめに
前々から気になっていた、**構成管理ツールの1種であるAnsible**をGoogle Cloud PlatformのVMインスタンス上で動作させてみた。
自分と同じような、**「AnsibleをGCE上に導入して試してみたい」**という人向けに、自分が試したことを残しておきたいと思います。

# 環境準備
1. AnsibleをインストールするVMインスタンスの準備
    2. [GCPプロジェクト](https://console.cloud.google.com/compute/instances)にアクセス
    3. 「インスタンスを作成」を選択
    4. 任意のインスタンスを作成(インスタンスの作成例は以下の通り)
        - インスタンス名：ansible-host
        - リージョン：asia-northeast1
        - ゾーン：asia-northeast1-b
        - マシンタイプ：**f1-micro** (テスト用なので料金を抑える)
        - ブートディスク(OS)：CentOS 7
        
    4.作業用のディレクトリの作成

  ```
  $ mkdir gcp_ansible
  ```

2. Ansibleのインストール
    
    ```
    $ sudo yum install -y epel-release
    $ sudo yum install -y ansible
    $ ansible --version
    ansible 2.7.7
    ```

3. Ansibleの実行に必要なコンポーネントのインストール (apache-libcloudをインストールするため、まずはpipをインストール)

    ```
    $ sudo yum install -y python-pip
    $ sudo pip install --upgrade pip
    $ sudo pip install apache-libcloud
    ```

3. サービスアカウントのCredentialファイルの作成と導入
    4. GCPプロジェクト-> 「IAMと管理」->サービスアカウント->今回利用するサービスアカウントを選択->「編集」を選択->「キーを作成」->JSONを選択し、「作成」を押下 (その後、credential fileがダウンロードされる)
    5. 1.で取得したcredential fileを「my_account.json」と名前を変更し、VMインスタンスのgcp_ansible配下に配置


4. Ansible Playbookの作成 (以下のymlファイルをVMインスタンスのgcp_ansible配下に配置。[YOUR...]の部分は適宜書き換え。)
※ちなみに[Ansibleのドキュメント](https://docs.ansible.com/ansible/latest/modules/gce_module.html)からymlに設定できるパラメータを確認できる
    
    ```yml:gce.yml
    - name: Create an instance
      hosts: localhost
      gather_facts: no
      connection: local
      vars:
          project_id: [YOUR_PROJECT_ID]
          service_account_file: ./my_account.json
          service_account_email: [YOUR_SERVICE_ACCOUNT_EMAIL]
          zone: "asia-northeast1-c"
    
      tasks:
        - name: Create an instance
          gce:
            instance_names: "ansible-test"
            machine_type: "f1-micro"
            image: "ubuntu-1604"
            zone: "{{ zone }}"
            disk_size: 64
            service_account_email: "{{service_account_email}}"
            credentials_file: "{{service_account_file}}"
            project_id: "{{ project_id }}"
```
    
5. Ansible Playbookの実行 

    ```
    $ ansible-playbook gce.yml 
    ︙
    localhost                  : ok=1    changed=1    unreachable=0    failed=0  
    ```

6. Ansibleで作成されたGCEインスタンスの確認
[GCPプロジェクト](https://console.cloud.google.com/compute/instances)にアクセスすると、「ansible-test」インスタンスができていることが確認できた
![ansible.png](https://qiita-image-store.s3.amazonaws.com/0/234000/5e9fc361-166c-0e4b-879a-c8f39384896f.png)

# 参考にしたサイト
https://docs.ansible.com/ansible/latest/scenario_guides/guide_gce.html
https://docs.ansible.com/ansible/latest/modules/gce_module.html
【Rails】minitestでログインしてる時の処理を書きたい【devise】

# 前提条件
- Rails5
- ログイン処理はdeviseを使用
- minitest

# ログインしてる時のtestを書きたい
今、userがpostを複数持っているとします

```ruby:user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :delete_all
end
```

```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
end
```

この時、「新しいpostの新規作成画面」はログインしているユーザーにしか表示したくありません。

```ruby:posts_controller.rb
class PostsController < ApplicationController
  # ログインしてないユーザーを弾く
  before_action :authenticate_user!, only: [:new]

  def new
    @post = Post.new
  end
end
```

ここでtestを普通に書くと

```ruby:posts_controller_test.rb
require 'test_helper'

class PostsControllerTest < ActionDispatch::IntegrationTest
  def setup
    @post = posts(:one)
    @user = users(:one)
  end

  def test_new
    get new_post_path
    assert_response :success
  end
end
```

```
$ rails test test/controllers/posts_controller_test.rb

...
Expected response to be a <2XX: success>, but was a <302: Found> 
```
ユーザーがログインしてない状態でアクセスしようとしてるので、当然エラーになってしまうんですね。
deviseでログインしてる前提のテストの書き方を調べました。

# Devise::TestHelpersはうまくいかない
調べてみると出てくるのが`Devise::TestHelpers`をincludeするという方法なのですが、これだとエラーが出てうまくいきません。

```ruby:posts_controller_test.rb
require 'test_helper'

class PostsControllerTest < ActionDispatch::IntegrationTest
  include Devise::TestHelpers #追加

  def setup
    @post = posts(:one)
    @user = users(:one)
  end

  def test_new
    sign_in(@user) #追加
    get new_post_path
    assert_response :success
  end
end
```
テスト実行すると

```
$ rails test test/controllers/posts_controller_test.rb

E

Error:
PostsControllerTest#test_new:
NoMethodError: undefined method `env' for nil:NilClass
```

どうやらこれはPostsControllerTestが`ActiveSupport::TestCase`を継承してる時に使える方法らしいです。
`rails g`で生成される標準のtestのファイルの中だと、modelのtestなどは`ActiveSupport::TestCase`を継承しているのでこの方法が使えます。
ただ、controllerのtestは標準で`ActionDispatch::IntegrationTest`を継承しているので、この方法だとエラーが出ているんですね。

# Warden::Test::Helpersを使おう！
```ruby:posts_controller_test.rb
require 'test_helper'

class PostsControllerTest < ActionDispatch::IntegrationTest
  include Warden::Test::Helpers #追加

  def setup
    @post = posts(:one)
    @user = users(:one)
  end

  def test_new
    login_as(@user, scope: :user) #追加
    get new_post_path
    assert_response :success
  end
end
```
`ActionDispatch::IntegrationTest`に関してはこの書き方でうまく行くはずです
C/C++で NOP を表現する

とある Pull Request のレビューをしていて、詳細は省略しますが、以下のような `MY_FALLTHROUGH` の定義をするコードを見ました。

```cpp
#if defined(__has_cpp_attribute) && defined(__cplusplus) && __cplusplus >= 201103L
# if __has_cpp_attribute(fallthrough)
#  define MY_FALLTHROUGH [[fallthrough]]
# elif __has_cpp_attribute(gnu::fallthrough)
#  define MY_FALLTHROUGH [[gnu::fallthrough]]
# elif __has_cpp_attribute(clang::fallthrough)
#  define MY_FALLTHROUGH [[clang::fallthrough]]
# endif
#elif defined(__has_attribute)
# if __has_attribute(fallthrough)
#  define MY_FALLTHROUGH __attribute__((fallthrough))
# endif
#endif
#ifndef MY_FALLTHROUGH
# define MY_FALLTHROUGH do { } while (0)
#endif
```

なるほど、C++11 で使える `[[fallthrough]]` 属性が使えるならそれを、そうじゃない場合は処理系の拡張構文が使えるなら使う、というものです。

で、最後のところ、どの記法も使えない場合の部分

```cpp
#ifndef MY_FALLTHROUGH
# define MY_FALLTHROUGH do { } while (0)
#endif
```

に関して 「なぜ空マクロじゃないのか」という意図の確認をしたところ、以下のような回答を得ました。

> そこまで強いこだわりはないのですが、
> 意図としては「セミコロンをつけることを強制できる」です。
> 
> `[[fallthrough]]` もセミコロンが必要なんですけど忘れがちなんですよね。


なるほど、空マクロにしてしまうと式の終わりのセミコロンをつけずにいてもビルドが通ってしまい、将来環境が変わって有効な定義付きのマクロになった瞬間にビルドエラーになる、という時限爆弾になり得ます。

結局のところ、これは「NOP命令を表現したい」ということでしょう。
アセンブラを知っている方には言わずもがなでしょうが、そうでない人のために書いておくと NOP つまり No Operation ＝ 何もしない命令 です。（NOOP と書くこともありますね）

さて、ここで本題。
C/C++ のマクロで NOP を表現する書き方をいくつか考えてみました。（ググったらきっともっと出てきそう）

ルールは以下くらいです。

- 言語規格標準の範囲内の書き方
    * 特定のバージョン以降（C++11 以降とか）というのは許容
- 最適化の結果最終的にコード生成されない（＝周辺コードに影響を及ぼさない）ことが期待できる

```c++
#define NOP_1 do { } while (0)            // 上記のやつ（ 0 を false と書くバリエーションもありそう）
#define NOP_2 static_cast<void>(0)        // 数値はなんでもいいのかも
#define NOP_3 (void)0                     // NOP_2 の C言語版
#define NOP_4 static_assert(true, "")     // C++11 以降なら
#define NOP_5 [](){}()                    // 空で名前もついてないラムダ式の呼び出し（C++11 以降)
```

`NOP_5` はもはや呪文ですが :sweat_smile:
VS Codeで、C/C++のライブラリのincludeに緑色の線がつかないようにする(include失敗しないようにする)

# 環境
Windwos 10
VS Code
MinGW

# 問題点
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/f17d8a88-1f13-42c9-1be2-f66da30036a0.png)

上の画像のように、includeの部分に緑色の下線がつくことがある。
これは、includeするファイル(写真の場合だと、windows.h, math.h, time.h, stdio.h, stdlib.h)が見つからないというエラーが原因。

[拡張機能無効](https://qiita.com/ayatokura/items/4eecba2826ab0985e5b1)で起動したところ、問題はなかったので、C/C++関係の拡張機能が原因だが、特定はしていない。

# 解決方法
カーソルを合わせると、黄色のはてなマークがでるので、それをクリックして、「Edit "includePath" setting」を押す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/fc5ff7f7-f8b5-405d-5efe-5ee6689bcb5e.png)
そうすると、上の写真のような画面が出てくるので、"includePath"の中に、MinGWのincludeフォルダを書き加える。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/183842/f43a9b30-f863-6d75-4ce9-2fae8d21cfba.png)
これによって、MinGWの中にあるヘッダファイルを参照することができる。

# 別解
windows.hなどは、Microsoft SDKsの中に入っているという記事をいくつか見つけたが、そちらはwindows.hが見つからなかったので断念した。
[React] Hooksを触ってみた

#Hooksとは
HooksはReactの新機能で、classコンポーネントでしか使えないstateの定義や更新、ライフサイクルメソッドをファンクションコンポーネントでも使えるようにしたものです。

公式　https://reactjs.org/docs/hooks-intro.html

色々なHooksがあります。
`useState`, `useEffect`, `useContext`, `useRef`, `useReducer`など。
これらはそれぞれファンクションコンポーネントでクラスコンポーネントでしかできなかったことを可能にさせます。
今回は`useState`と`useEffect`についてみていきます。
#useState
公式のサンプルです。

```javascript
import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```
`useState`を使うことによってstateに保存したいもの、またそれを更新するものを定義することができます。
`useState(0)`は保存したいものの初期値を入れることができます。今回では初期値０が入っています。
`this.state.count`みたいに長くならず、スマートに書くことができます。
#useEffect
`useEffect`は`componentDidMount`や`componentDidUpdate`などのメソッドをまとめたものになります。

```javascript
import React, { useState, useEffect } from 'react';

const App = () => {
  const [ text, setText ] = useState('');

  useEffect(() => {
    console.log(text);
  }, [text]);

  return (
    <div>
      <button onClick={() => setText('One')}>buttonOne</button>
      <button onClick={() => setText('Two')}>buttonTwo</button>
    </div>
  );
}

export default App;
```
これはボタンを２つ用意してクリックすると`state`に保存してその時のtextを`console.log()`するという簡単なサンプルです。
`useEffect`は第一引数に関数を定義してページを読み込んだ時にしてほしい処理を書きます。
そして第二引数にキーを設定すればそのキーが更新されるたびに`useEffect`が動きます。
一回だけ呼び出したいのであれば第二引数のところを`[text]`から`[]`にすれば一回だけ実行されます。
これによって従来の`componentDidMount`や`componentDidUpdate`が一つにまとまってくれています。
#まとめ
Reactの新機能であるHooksを触ってみました。
`useState`と`useEffect`にのみ触れましたが、他のHooksについても勉強していきたいです。
参考になれば幸いです。
UbuntuサーバのGUIをMacクライアントで扱う



・Server:Ubuntu16.04.5 LTS(Xenial Xerus)
・Client:MacOS X10.12.6(Sierra)

VNCよりも手軽に（そして高速で)サーバのGUI画面をクライアントに表示できるX11 Forwardingを利用してみました。

まずクライアント(MacOS)に[xquartz](https://www.xquartz.org/)をインストールして、下記でログイン
<pre>
$ ssh -X サーバのユーザ名@サーバのIPアドレス
</pre>

Ubuntu標準エディタ(gedit)をMacのターミナルから起動してみる。
<pre>
\# gedit
</pre>

<img width="800" alt="スクリーンショット 2019-02-17 12.55.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/115339/c8cc598b-5d91-2acf-8822-db0f41963cb3.png">

②が起動。
ちゃんとテキスト編集できる。
ただしショートカットキーは読み替えが必要みたい
\(saveなら'command+S'じゃなくて'control+S'\)

オススメなのは画像ビューア
<pre>
$ eog 画像ファイル名
</pre>
で、Ubuntu標準のビューアが立ち上がりサーバ上の画像を確認できる。
OpenCVの修正結果をみるときに重宝している。
複数のウィンドウを同時利用する場合はコマンドのあとに[&]をつければOK
<br>
そして何回か起動を繰り返すと起動できなくなった。

<pre>
Failed to connect to Mir: Failed to connect to server socket: そのようなファイルやディレクトリはありません
Unable to init server: Could not connect: 接続を拒否されました

(eog:16215): Gtk-WARNING **: cannot open display: localhost:10.0
</pre>

どうやら「ssh -X」にて接続したX11のセッションは自動でKeepAliveせずに時間と共に終了してしまうらしい(20分)。終了してしまったら再ログインしないとセッションを復活できない。

Timeout値を変更すればよいという記載を見かけるけれどセキュリティの問題からか設定できなかった。(「man sshd_config」に存在しない)

余談だけど通信量が多いウィンドウを利用する場合は「ssh -XC」とすると通信内容を圧縮してくれるらしい。またWindowsの場合であれば、PuTTYとXmingを使うことで同様の機能を利用できるとのこと


参考
https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/10/X11forwarding.html
顔認証で打刻する話


---
## やったこと

顔認証で打刻できるシステムのプロトタイプのを作りました。

---
## システム概要

![f](https://docs.google.com/drawings/d/e/2PACX-1vRORfVO7UWLQjKUUuNsLC0K3icJ9HHN0xZercExOJmXwNnoMx-DNTPfqN6bPbOrTNPJhCfTvmq9sNeq/pub?w=761&h=463)

---

## 画像キャプチャ
* [MediaDevices API](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices)のgetUserMediaでカメラの情報をvideo.srcObjectにストリームとして流す。

```typescript
const canvas = this.canvasDom.nativeElement;
const context = canvas.getContext('2d');
let video;
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
　const stream = await navigator.mediaDevices.getUserMedia({
    video: true,
  });
  video = this.videoDom.nativeElement;
  video.srcObject = stream;
} else { /* エラー処理 */ }
context.drawImage(video, 0, 0, 640, 480);
```

---
## クライアント側で顔検出
[face-api.js](https://github.com/justadudewhohacks/face-api.js): Tensorflow.jsをベースとした顔認識・検出などのAPIを提供するライブラリ

```typescript
await faceapi.loadTinyFaceDetectorModel('assets/models');
const data = canvas.toDataURL();
let result = await faceapi.detectAllFaces(
  canvas,
  new faceapi.TinyFaceDetectorOptions(),
);
```
---
# 登録済みの顔と比較
AWSのRekognitionというサービスを利用

```python
class FaceSearchService:
    ...
    def search(self, image: str) -> Tuple[str, bool]:
        response = self.client.search_faces_by_image(
            CollectionId=self.collectionId,
            FaceMatchThreshold=self.faceMatchThreshold,
            Image={"Bytes": image},
            MaxFaces=self.maxFaces)
        if len(response["FaceMatches"]) == 1:
            return (response["FaceMatches"][0]["Face"]["FaceId"], True)

        return ("", False)
```

---

# FaceIdに対応するユーザーを検索

```python
def find_by_face_id(self, face_id: str) -> Optional[User]:
    face = Face.query.filter_by(face_id=face_id).first()
    if face is None:
        return None

    return User.query.filter_by(id=face.user_id).first()
```
---

# 打刻

```python
def submit(self,
          user: UserAuthInfo,
          mode: AttendanceMode = AttendanceMode.START) -> bool:
    # ログインして打刻に必要なクッキーを取得
    session = requests.Session()
    session.get(
        self.endpoint,
        auth=HttpNtlmAuth(user.email, user.password),
        verify=False)

    # 上のリクエストで得られたクッキーを使って打刻
    payload = {"SubmitMode": mode}
    r = session.post(self.endpoint, data=payload, verify=False)
    if r.status_code == requests.codes.ok:
        return True

    return False
```

---

# まとめ

* 顔認証で打刻ができたらいいなと思ってプロトタイプ作りました。
* もっとこうした方がいいとかあれば、[GitHub](https://github.com/superwower/look)でPRお待ちしています!
  

---
圏論的プログラミング生活の勧め １

# 前置き
今回は、完全にネタだと思って構いませんが、出来る限り分かりやすい説明を心がけたいと思います。

## ま〇かマ〇カに例えてみる

まず、圏論を説明するのに一番都合の良い状態を示します。

```
dom --(f)-- x
            |
           (g)
            |
            y --(h)-- cod
```

### 圏の説明
このような単純な関数と値の関係を整理したものを　圏　と呼びます。

dom と書いたのは、始まりの値の事を言います　（始域）ドメイン
cod は終わりの値です。　（終域）コドメイン

### 射の合成
そして、この状態は、実はとても都合がよく f g h を合成した状態を作り出すことが出来ます。

この時、然るべき掛け算の法則が、各々の関数にはあることを覚えておくと便利だと思います。

なので、関数は基本的に合成順序に関わらず、以下のような取り換えが可能です。

```
(f . g) . h === f . (g . h)
```

そして合成すると、何が起こるでしょうか？

答えは…

### 僕と契約して、魔法少女に殺されようよ（笑）
あれ？途中のストーリなし？


# 関手と自然変換
では、その上の図全体を括弧でくくり、それをCとします。

```
C --(F)-- D
  \       |
   \      |
   (Nat) (G)
      \   |
       \  |
          E
```
ここで、まず気が付いて欲しいのが、大文字になったってことです。

##関手（Functor）は高階関数
Fには、CからDへ圏を計算して移すために必要な無名関数が取られます。
下のjavascriptのコードは、それが根拠です。

```javascript
//F:C -> D
let D = C.map(d => d + 5);
```
そして、このような図の時に圏を説明する場合、の書き方は、

```
C = Hom(dom, cod)
```
というように書くみたいです。
こうすることで、原因と目的と結果が整理して書けるようになってきます。

##自然変換は、関手を引数に取る高階関数
Natが示す線を自然変換と呼んでいます。
Natは、FとGの合成だとは限りません。
よって、

```
Nat(F, G)
```
となる場合の関係を示す関数の事を、自然変換と呼んでいるにすぎません。

# 本当の数学を知ってほしい
本当の数学は、算数で計算することではありません。
数学の構造すらも、自己言及的に証明することこそが、正に数学なのです。

気が向いたら、また投稿します。
それでは～
Kaggleを提出(submit)を最短で行うやり方


データ分析・機械学習の勉強をするのに「kaggleのデータを分析する」はよい方法です。

ただ、実際のkaggleのコードを見ていると、数百行も書かれていて読むのが挫折してしまいそうになります。

これは学習精度を上げるために「データ変換の前処理」「モデルのパラメータの調整」などを行っているためです。

実はモデルを作成してsubmitするためには、これらの処理は必要ありません。
一度、submitまで行ってから精度を上げるために前処理などを行えばよいです。

この記事では最短でsubmitする方法を解説します。

※前提として、この記事では「py拡張子」のスクリプトまたは「jupyter notebook」を使用します。

####最速でsubmitする手順

１．提出(submit)するファイルの形式を確認します。
２．必要なライブラリを読み込みます。
３．ファイル読込みます。
４．データをデータフレームに読み込みます。
５．機械学習をして学習モデルを作ります。
６．予測をして提出ファイルを作ります。
７．ファイルを提出します。

----------------------------------

１．ライブラリをインポートする

まず機械学習に必要なライブラリをインポートします。
データ操作用にpandasをインポートします。
import pandas as pd

モデル作成用にskleanをインポートします。

分類問題の場合はクラス分類のアルゴリズム
from sklearn.tree import DecisionTreeClassifier
回帰問題の場合は回帰のアルゴリズムをインポートします。



##ファイルを読み込む
train = pd.read_csv('../input/train.csv')
test = pd.read_csv('../input/test.csv')

##データをデータフレームに読み込みます。
##機械学習をして学習モデルを作ります。
##予測をして提出ファイルを作ります。
##ファイルを提出します。


#参考の記事
タイタニック号乗客の生存予測モデルを立ててみる
https://qiita.com/suzumi/items/8ce18bc90c942663d1e6
データ分析で頻出のPandas基本操作
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a
一見マトモなISO-2022-JPメールがmacOS Mail.appで文字化けするやつ

```
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
```
なヘッダーでボディも一見問題なくエンコードされているにも関わらず、macOS付属のMail.appで文字化けするメールを受け取るケースがある。いったい何が起こっているのか？

# 調査結果

文字化けが発生する条件

1. メールの最終文字までが日本語
2. メールの最終文字(日本語)の行末で**ASCIIへ復帰するエスケープシーケンスが含まれていない** 
3. 日本語の文字数が500文字前後以上
4. Message-IDからJavaMailが発信したと類推できるメール

環境依存文字の有無は関係なく2番が肝。メールの最終行でASCIIに復帰させる手続きが何故か漏れている。通常必要なエスケープシーケンス ```\x1B\x28\x24```("ESC ( B") を付与すると文字化けせずに表示できるようになる。また3番はわりと興味深くて、文字数が少ないと文字化けは発生しなかった。
ってかさ、最後のやつがオチじゃん？予想では「最終行を改行していないStringをencodeしたら最後のASCIIへの復帰が漏れちゃった」のではないかと思ってみたが、本当のところは知らない。

該当する実装を使っている事業者の皆様におかれましては再確認をよろしくお願い申し上げます。~~具体的には日本郵便。~~
書き方で変わる消費メモリ with Ruby

##書き方を変えるだけで消費メモリは変わるらしい
今回は、書き方を変えれば消費メモリは変わるよっていう記事です。今後、要因がわかり次第追記予定です。
##メモリとは
データ・プログラムの一時保存を行うメモリー メモリーとは、データを記憶する部品のことです。
##考えるべきメモリ領域
メモリ領域には3つの種類があります。メモリ領域には、静的領域、ヒープ領域、スタック領域と3種類あります。
##ヒープ領域とは
ヒープ領域とは、プログラムの実行時に動的に確保するためのメモリ領域です。
プログラム実行時に逐次メモリの割り当てが要求されるような動的処理、動的なオブジェクトの定義の際にメモリ領域を割り当てる役割を担っています。割り当ては、プログラム実行時にアプリケーションから必要なサイズのメモリを要求される事により、ヒープ領域から割り当てられます。また、この領域は、まとまった空き領域をなるべく大きくしてメモリの有効活用をはかることや、複数スレッドから同時に割り当て要求が来た場合でも整合性を保つ制御が必要なため、OSや仮想マシンが提供してくれます。割り当てや、不要なメモリの解放処理はこの管理機能を介して行います。
ヒープ領域は限られているので余分なメモリの確保や不要なメモリの解放を忘れてしまう事によるメモリリークも存在する事を把握しておきましょう。
##競プロ問題で発見した消費メモリを減らした書き方
Rubyのような動的型づけ言語では、プログラム実行時にかなりのヒープ領域を消費します。但し、書き方によっては、消費メモリーを減らす事もできるという事を現在やっているAtCorderで気づきました。では、解説していきたいと思います。
(githubでAtCorderの自分のAnswerも公開しています!)→https://github.com/fujisawaryohei/AtCorder

今回の問題は、こちらです。
https://atcoder.jp/contests/abs/tasks/abc085_b

かなり優しい問題ではありますが、自分はこのような解答をしました。

```rb
arr = readlines.map{|x| x.chomp.to_i}
mochiLength = Array.new
(0..arr[0]-1).to_a.each_index do |idx|
   mochiLength[idx] = arr[idx+1]
end
print mochiLength.uniq.length
```

簡単に処理の流れを説明すると、まずは標準入力で受け取った複数行の数字の文字列の改行文字省きつつ、数値型に変換しました。この時、問題のSample入力の１行目が要素数であったので、その要素数を省いた配列を作りたかったため、その後、空配列を定義して、イテレーターで生成しました。その配列の中から被っている値を省いて、その要素数を出力して終了です。

この時の実行時間と消費メモリはこのようになりました。一番右が消費メモリです。右から2番目が実行時間です。
<img width="1086" alt="スクリーンショット 2019-02-17 16.03.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/308967/cc09d725-f415-c73a-dd3e-fc414067662b.png">

こちらをこのように書き直してみました。

```rb
arr = readlines.map{|x| x.chomp.to_i}
mochiLength = Array.new
(0..arr[0]-1).to_a.each_index{|idx| mochiLength[idx] = arr[idx+1]}
print mochiLength.uniq.length
```

この時の実行時間と消費メモリはこのようになりました。実行時間が早くなり、消費メモリが減りました。
<img width="1090" alt="スクリーンショット 2019-02-17 16.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/308967/598ea082-b02b-80df-6787-736dfd30c8cc.png">

##今後要因がわかり次第追記予定
下記の要因がわかり次第追記予定ですが、今回は、少し書き方を変えれば消費メモリが変わるよっていう記事でした。
おそらくヒープ領域のポインタ格納メモリとRubyのオブジェクト領域のメモリについてより深く知る事ができると、何故なのかがわかると思うのですので、要因がわかり次第追記していく予定です。

下記の記事を参照しつつ、使って検証していきます。
http://yoskmr.hatenablog.com/entry/2015/12/08/031234
https://techracho.bpsinc.jp/hachi8833/2017_11_30/48130
青空文庫のXHTMLファイルからPython3でルビなしプレーンテキストを作る

# 必要なもの
* Python3（Python 3.7.2で試しました。）
* lxmlライブラリ

# やり方
1. [青空文庫](https://www.aozora.gr.jp/ "青空文庫へのリンクです")からXHTMLファイルをダウンロードする。
1. `pip install lxml`で`lxml`ライブラリをインストールする。
1. 下の`sanitize.py`を走らせる。

<details><summary>sanitize.pyのソース（クリックで展開）</summary><div>

```python:sanitize.py
import lxml.html
from lxml.html.clean import Cleaner

# ダウンロードしたXHTMLファイルのファイル名を書きます。
# ちなみに1567_14913.htmlは《走れメロス》です。
FILE_NAME = '1567_14913.html'

f = open(FILE_NAME, encoding='shift_jis')
data = f.read().encode('shift_jis')
f.close()

cleaner = Cleaner(page_structure=False, remove_tags=('ruby', 'br'), kill_tags=('rt', 'rp'))
cln_html = cleaner.clean_html(data).decode('utf-8')

plain_text = lxml.html.fromstring(cln_html).find_class('main_text')[0].text_content()
print(plain_text)
```
</div></details>

# うまくいかない場合
下の記事も参考に、lxml.html.clean.Cleanerのremove_tags、kill_tagsを色々試してみて下さい。
[Pythonのlxmlライブラリでencoding="Shift_JIS"のxhtmlを処理しようとしてstr型とbytes型に翻弄された話](https://qiita.com/sgigagaeru/items/50b6287787a48d0c14e8 "Qiita記事へのリンクです")
RMeCabのdocDFコマンドで文書-単語行列を作成する際にNEologd辞書を使う方法


#はじめに
RMeCabのdocDFコマンドで形態素解析する場合NEologd辞書を使用して文書－単語行列を作成する場合エラーが出ます。
これはdocDFコマンドでは内部の処理で単語区切りにスペースを用いている様で、
一方でNEologd辞書では原型語に"AIR Do"の様にスペースを持った語が登録されているためにエラーとなるようです。
http://rmecab.jp/new/forums/topic/neologd%E8%BE%9E%E6%9B%B8%E7%AD%89%E3%81%AE%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%82%92%E5%90%AB%E3%82%80%E5%8D%98%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84%E3%81%AB%E3%81%A4%E3%81%8D%E3%81%BE%E3%81%97/

このため、原型語を使わないオプションGenkei=1をつけてdocDFで文書-単語行列を作る際はエラーが出ません。
ただこれだと形態素数が増え行列が大きくなるのと、活用によって形態素が分かれてしまうので疎な行列になってしまいます。

#解決方法
コンパイル前のNEologd辞書の原型語の列のスペースを"_"に変換してからコンパイルする。
ただ、NEologd辞書はUTF-8の500MB程のcsvファイルなのでこれを編集する必要があります。
##手順
###1．NEologd辞書のseedのcsvファイルを開く
2019/02/17現在　原型語にスペースが含まれているのはecab-user-dict-seedファイルのみです。
mecab-user-dict-seed.(NEologd辞書の日付).csvをUTF-8の大容量ファイルを編集できるアプリケーションで開く。
自分はEmEditorを用いました。
https://jp.emeditor.com/
###2．原型語の列(11列)目の全角スペースを"_"に変える。
###3.ファイルを保存
###4.後は通常の手順と同じくコンパイルして.dicファイルを作成する。
コンパイル以降は以下の記載を参照ください。
https://qiita.com/zincjp/items/c61c441426b9482b5a48

#課題
ただ、この方式を用いると複数語からなる原型語の間には_が入ってしまいます。

```
ベルトコンベア  名詞,固有名詞,一般,*,*,*,conveyor_belt,ベルトコンベア,ベルトコンベア
```

なんとかプログラムでそれもRで出来ないか考えましたが、
!|||!( ♉ฺ ω ♉ฺ ;)!|||!
↑こんなのがうまくread.csvで読めずに諦めました。
kubesecを使ってkubernetesのsecret定義を暗号化する

https://github.com/shyiko/kubesec を使ってみたので調べたことをメモ。

# kubesecとは

kubernetesのsecret.ymlの管理ツール。（secret.ymlはsecretリソースの定義ファイル）
secret.ymlのデータ構造を保ったまま、必要なところだけを[Google Cloud KMS](https://cloud.google.com/kms/)や[AWS KMS](https://aws.amazon.com/jp/kms/)などを使って暗号化してくれる。
ついでに、base64のエンコードもやってくれるので便利。

詳しい内容は[kubesec](https://github.com/shyiko/kubesec)のreadmeを要参照。

# kubesecを使う目的

- dbのcredentialなどを平文のままgitにcommitすることを避ける
- そのために必要な手続きがkubesecを使うと多少楽にする

# 使用の流れ

## 事前準備

[Google Cloud KMS](https://cloud.google.com/kms/)や[AWS KMS](https://aws.amazon.com/jp/kms/)などでkeyを作成しておく

## 開発時

1. kubesecのインストール
2. credentialなどをkubesecで暗号化（事前に作成したkeyを使う）しsecret.ymlに追加
3. git commit

## デプロイ時

1. デプロイ用のサーバーでkubesecのインストール
2. kubesecでdecrypt
3. `kubectl apply`でsecretリソースを作成

# 基本的なコマンド

## インストール

#### mac

```
brew install shyiko/kubesec/kubesec
```

#### linux

```
curl -sSL https://github.com/shyiko/kubesec/releases/download/0.9.2/kubesec-0.9.2-linux-amd64 \
  -o kubesec && chmod a+x kubesec
```

## Encryption

```
kubesec encrypt --key=gcp:<resource-id of Google Cloud KMS key> secret.yml --cleartext
```

[Google Cloud KMS](https://cloud.google.com/kms/)を使う場合は上記のように`gcp:`を付ける。
`--cleartext`を付けるとbase64のencodeをしてくれる。

## Modification（secret dataの追加）

```
kubesec patch -i secret.yml --data my_key=secret_value
```

## Decryption

```
kubesec decrypt -i secret.yml
```

こちらも`--cleartext`を付けるとbase64のdecodeをしてくれるが、
基本的にはdecryptした後はそのまま`kubectl apply -f secret.yml`することになるので不要な場合が多い。
Python + OpenCVによる色情報の取得


画像の特定範囲の色平均情報(RGB、HSV)の取得方法

```ruby:test.py

import cv2
import os

# 対象画像読み込み
img = cv2.imread("testImg.png",cv2.IMREAD_COLOR)

# 対象範囲を切り出し
boxFromX = 20 #対象範囲開始位置 X座標
boxFromY = 40 #対象範囲開始位置 Y座標
boxToX = 80 #対象範囲終了位置 X座標
boxToY = 60 #対象範囲終了位置 Y座標
# y:y+h, x:x+w　の順で設定
imgBox = img[boxFromY: boxToY, boxFromX: boxToX]

# RGB平均値を出力
# flattenで一次元化しmeanで平均を取得 
b = imgBox.T[0].flatten().mean()
g = imgBox.T[1].flatten().mean()
r = imgBox.T[2].flatten().mean()

# RGB平均値を取得
print("B: %.2f" % (b))
print("G: %.2f" % (g))
print("R: %.2f" % (r))

# BGRからHSVに変換
imgBoxHsv = cv2.cvtColor(imgBox,cv2.COLOR_BGR2HSV)

# HSV平均値を取得
# flattenで一次元化しmeanで平均を取得 
h = imgBoxHsv.T[0].flatten().mean()
s = imgBoxHsv.T[1].flatten().mean()
v = imgBoxHsv.T[2].flatten().mean()

# HSV平均値を出力
# uHeは[0,179], Saturationは[0,255]，Valueは[0,255]
print("Hue: %.2f" % (h))
print("Salute: %.2f" % (s))
print("Value: %.2f" % (v))

```

上記を実行すると、色情報が以下のように出力される

```
B: 87.23
G: 82.33
R: 188.25
Hue: 121.54
Salute: 150.21
Value: 188.25
```
faviconを作る（HUGO）

[HUGOとGitHub Pagesで自分のBlogページを作ってみた（Windows）](https://qiita.com/Blank71/items/88a6c76ca9e162af73fe)の続き。読まなくてもたぶん大丈夫。

あのブラウザのタブにあるアイコンのことをfaviconっていうんだ！っていうぐらいレベルなので、ツヨツヨの人は帰ってください。

# faviconのデザイン
[Dotgrid](https://wiki.xxiivv.com/#dotgrid)っていう点と点を選択して線でデザインするっていうものを使っていく。デスクトップにダウンロードしてポチポチって作った。
![Dotgrid.jpg](https://qiita-image-store.s3.amazonaws.com/0/329632/eac7926d-f707-3d5e-3e0c-d2bb00be15c4.jpeg)
超絶ダサいけどまぁこれでいいや。
ウィンドウサイズは1:1になるようにしておこう。
また利用するかもしれないので、`Save(.grid)` `Save(.png)`の二つを保存した。gridで再度編集ができる。

# 整形
faviconはiOSやAndroid向けのも作らなくてはいけないらしい。
[前記事](https://qiita.com/Blank71/items/88a6c76ca9e162af73fe)で使ったテーマの[README.md](https://github.com/josephhutch/aether#favicons)書いてあった内容に従った。

- https://realfavicongenerator.net/ にアクセス。
- 「Select your Favicon picture」で作ったPNGを選択。
- 好みのパラメーターを設定して、「Generate your Favicons and HTML code」。
- 「Favicon Package」をDLして解凍。
![Favicon Package](https://qiita-image-store.s3.amazonaws.com/0/329632/e7d2a9dc-3806-8b30-962e-81eba0186bbe.jpeg)

# 配置
faviconが作れた。
これ以降は[前記事](https://qiita.com/Blank71/items/88a6c76ca9e162af73fe)の続き。
Staticsのフォルダにこれをぶち込めば終わり。

# まとめ
書き始めてみたものの、案外くそ記事になってしまった。
自分のページ( https://blank71.github.io/blog/ )とQiitaの記事のためのページ( https://blank71.github.io/hugo-test/ )があるので、ぜひ見てみてください。
タブが「HOME」しかないので、ここも増設できるようにしていきたい。
Pythonではじめる機械学習写経メモ

# はじめに
進めていく中で見つけたものを書き足していくスタイルです

# 環境
- Python 3.7.2
- Ubuntu 16.04
- pandas 0.24.1

# バージョン差分があった箇所
- P20 pd.scatter_matrixを使用している箇所<br>
以下がpandasのバージョン差分によりAttributeErrorになっていた

```python
grr = pd.scatter_matrix(~)
```
  - 対処<br>

```python
grr = pd.plotting.scatter_matrix(~)
```
とする

# そのままだとうまくいかなかったところ
- p70 決定木の出力をしているところ<br>
graphvizがimportできないとエラー出力された
- 対処

```shell
sudo apt install graphviz
pip install graphviz
```
を実行
自作静的サイトジェネレータのアップデート（nginx→express）

詳細はこちらのブログに書いた。

[S\.F\. Blog:静的サイトジェネレータのアップデート（nginx→express）](https://www.sfpgmr.net/blog/entry/2019/02/c064a49aa7a58d04d8cf9c19dfc308b5.html)

静的サイトジェネレータ（静的ブログジェネレータ）の関連記事

[S\.F\. Blog:キーワード「静的ブログジェネレータ」 のアーカイブ](https://www.sfpgmr.net/blog/archive/category/%E9%9D%99%E7%9A%84%E3%83%96%E3%83%AD%E3%82%B0%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%AC%E3%83%BC%E3%82%BF.html)
とりあえず、Microsoft Partner Network に登録してみる！これだけなら無料なので




アクションパック（4万円くらい）を買うとお得だと言うことを前回、[ここに書きました。](https://qiita.com/dms/items/8ffa5489142ae74dc982)

そもそもそのまえに、MPN（Microsoft Partner Network）に登録して置く必要があります。
これはこれで結構めんどくさいというか、難しくないけど、単純に面倒なのでこれについても書いておきます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/d78a72a2-fc5c-ee02-6c32-ce1259a5ea37.png)

# サイトの登録フロー・概要

手順
1. Microsoft Account / マイクロソフトアカウント　の作成
2. MPNのサイトにログイン
3. MPNに登録

概要
Microsoftの製品を使って、お仕事をしたりライセンス販売したり、ソフトウェア開発をする人にとってメリットになるような情報を発信しています。パートナー限定での非常に安くライセンスを買うための方法なども載っています。前回の[これ](https://qiita.com/dms/items/8ffa5489142ae74dc982) です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/c76ef13c-3978-3aa1-f29e-3f36504f99fa.png)


構築。革新。成長。
サイトに書かれている説明はびっくりするくらい、意味がわかりませんが、おそらく日本語訳が変なのでしょう。

それはさておき、上記の手順をおこなうと、MPN会員になれます。すると
パートナーポータルサイトにログインできるようになります。無料とはいえこの辺りの詳細は、おそらくパートナーNDAの範囲なきがするので、是非皆さんもやってみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/04dc3105-fb83-8826-e51e-238be87060dd.png)

早速、ログイン設定から、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/a236ab95-3772-dc76-2ce7-07b9413b4319.png)



わかりにくいので、構造を勝手に整理すると、Partner Network、というのがログインするための大前提のアカウントのようなもので、これだけだとあまりメリットもなければ大したハードルもありません。このMPNになった後にいくつかの選択肢があります。

1. メンバーシップオファー
2. コンピテンシー
3. CSP

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/5f8cdd7c-2bc8-6711-5540-33addbd88c08.png)

メンバーシップオファーは、初めは、アクションパックしか購入できません。コンピテンシーがあがると、それ以外のオファーを受け取ることができます。いずれも有料です。

コンピテンシーは、パートナーとしてのビジネス実績や、社内の技術者の数です。技術者の数の照明は、MSP（マイクロソフト認定プログラム）を取得して登録することで証明できるようです。

CSPは、Azureなどクラウドの代理店制度のようです。コンピテンシーがなくても登録することができます。
RGBフルカラーLEDの色調整をソフトウェアPWM（pigpio）で実現する

[「カラー図解 最新 Raspberry Piで学ぶ電子工作」](https://raspibb1.blogspot.com/)に載っている、ボリューム抵抗の値をADコンバータで読み取り、その値を元にPWMでRGBフルカラーLEDの色調整をやってみました。

Raspberry pi3書籍ではGPIO.PWMでPWM信号を出力していますが、精度が低いというのが気になって、高精度のソフトウェアPWMが利用できるpigpioを使う方法に変えてみました。pigpioのPWM出力精度については[RPi.GPIO と pigpio のパルス幅の精度を測定](http://nw-electric.way-nifty.com/blog/2018/11/rpigpio-pigpio-.html)を参照してください。

なお、書籍ではADコンバータの読み取りをGPIOの制御で実現していますが、こちらもspidevを使う方法に変えてあります。（[前回の記事](https://qiita.com/Zensa55/items/1a2779c24de20ee35af8)参照）

##使用機材
- Raspberry pi 3 model B+
- 12bit 8ch ADコンバータ MCP3208
- RGBフルカラーLED カソードコモン
- ボリューム抵抗 10kΩ

##配線図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346401/2943a2be-69c7-d307-f2fa-570d49bc8044.png)

###仕組み
それぞれのボリューム抵抗を回すと、RGBフルカラーLEDをに送られるR,G,Bの信号のそれぞれのデューティ比が変化します。
この配線図では、次のように対応しています。

|             | ボリューム抵抗（左） | ボリューム抵抗（中）| ボリューム抵抗（右）|
|:------------|:-----------------:|:------------------:|:------------------:|
| ADコンバータの入力Ch | Ch0 |  Ch1        |     Ch2        |
| 制御するGPIO      |     GPIO 25  |  GPIO 24 |    GPIO 23  |
| RGBとの対応       |     Blue |   Green    |   Red      |

##Pythonコード
pigpioを使う場合の約束として、最初に`sudo pigpiod`を行う必要があります。

```python
# -*- coding: utf-8 -*-
import pigpio
import time
import spidev

LED_PIN = [25,24,23]
FREQ = 50
RANGE = 255

pi = pigpio.pi()


# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc_spidev(adcnum):
    if ((adcnum > 7) or (adcnum < 0)):
        return -1
    command1 = 0x6 | (adcnum & 0x4)>>2
    command2 = (adcnum & 0x3)<<6
    ret=spi.xfer2([command1,command2,0])
    adcout = (ret[1]&0xf)<<8 | ret[2]
    return adcout



spi=spidev.SpiDev()
spi.open(0, 0) # bus0, CE0
spi.max_speed_hz = 1000000 # 1MHz

for j in range(3):
    pi.set_mode(LED_PIN[j], pigpio.OUTPUT)  #pigpioで制御するピンの指定
    pi.set_PWM_frequency(LED_PIN[j], FREQ)  #PWMの周波数(Hz)を指定。デフォルトは800。
    pi.set_PWM_range(LED_PIN[j], RANGE)  #PWM値(μs)の最大値を指定。指定可能な値は25〜40000。デフォルトは255。


inputVal = [0,0,0]
inputDuty = [0,0,0]

try:
    while True:
        for i in range(3):
            inputVal[i] = readadc_spidev(i)
            inputDuty[i] = inputVal[i]*100/4095
            print(inputDuty)
            pi.set_PWM_dutycycle(LED_PIN[i], inputDuty[i]*2.55) #デューティー比変更
        time.sleep(0.5)

except KeyboardInterrupt:
    pass

spi.close()
pi.stop()


```

pigpioを使ったPWMは簡単で使いやすいので気に入ってます。

##参考
[Raspberry PiのGPIO制御の決定版 pigpio を試す](https://karaage.hatenadiary.jp/entry/2017/02/10/073000)
[Raspberry PiのハードウェアPWMをpigpioで出力する](https://qiita.com/s417-lama/items/0ef64a7af3fcf6a56cc5)
[Raspberry Pi 3 pigpioを使ってLチカ PWMパラメータ確認編](https://hakengineer.xyz/2017/09/29/post-378/)