OmniAICreator/Qiita-1.07M huggingface dataset:
3分で準備するGo言語  ローカル環境

とにかくさくっとGo言語の環境を準備したかったので、次回必要なときのために備忘録としてまとめました。
go言語を使用してlocalでgo&html等のweb開発環境を構築するための手順です。
なお、環境はmacでHomebrewが入っている状態を前提としています。

## goenvのインストール
Homebrewを使ってインストールします。
こまめなupdateも忘れずに。

```
brew update
brew install goenv
```

## 環境変数適用
.bash_profileにgoenvの定義を追加、反映します。

```
echo 'eval "$(goenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```
また、goを使用するために必要なパスの定義も予め行っておきます。

```
vi ~/.bash_profile
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$PATH
export PORT=8080
```

## goのインストール
まずインストール可能なバージョンの一覧を見ます

```
goenv install -l
```

以下のような形で出力されるので、無難そうな最新のメジャーバージョンを選択。

```
Available versions:

  1.2.2
  1.3.0
  1.3.1
  ~~
  1.11.0
  1.11beta2
  1.11.4
  1.12beta1
```

インストール実行

```
goenv install 1.11.0
```

## globalに使用するgolangのバージョンを定義
これでgo言語を利用できる環境が整いました。

```
goenv global 1.11.0
goenv version
```

## さっそく書いてみよう
フォルダとファイルを以下のように作成

```
# プロジェクト用のフォルダを作成
mkdir ~/Desktop/GoApp
cd  ~/Desktop/GoApp 

# メイン用のGoファイル
touch main.go

# viewとして使うためのhtmlファイル用のフォルダを作成
mkdir views
cd views
touch index.html
```

```main.go
package main

import (
    "os"
    "log"
    "net/http"
)

func main() {
    http.Handle("/", http.FileServer(http.Dir("views")))
    log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT")), nil))
}
```
http.Handle　ハンドラの登録を行う
http.FileServer　静的ファイルを返してハンドラを生成
http.Dir　静的ファイルを配置したディレクトリの読みこみ
log.Fatal　ログを記録
http.ListenAndServer　第一引数でポート、第二引数nilでhttp.Handleに登録したハンドラを仕様　
os.Getenv　環境変数からPORTを取得（上で定義した8080が取得される）

```index.html
<html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>
```

## 実行する
```
go run main.go
```
http://localhost:8080 でローカル環境で動作している状態が確認できる

## ビルドする
特に必要はないが、ビルドする場合は以下

```
go build main.go
```
WindowsのTreeコマンドで階層指定ができなかったのでPowershellで作ってみた。

# WindowsのTreeコマンドで階層指定したい。

## WindowsのTreeコマンド

```
tree
```
と書けば現在のディレクトリ配下をツリー表示してくれる。

## 階層指定する場合

下記のように書くと階層指定できる

```
tree | findstr /R /C:"^├" /C:"^│  ├" /C:"^│  └" /C:"^└"
```

参考サイト:[Windowsのtreeコマンドで2階層目までだけを表示する方法](http://align-centre.hatenablog.com/entry/20090912/1252774157)

ただ、これだと一旦、treeコマンドで全階層をなめてから表示をフィルタリングするので、フォルダ階層が深かったりするととっても遅い。

## Powershellで書いてみる

標準では実現できないっぽかったので、Powershellで書いてみた。

```powershell
Param(
    [Parameter()][String]$Path = (Convert-Path .) ,
    [Parameter()][int]$Depth = 99
) 
Write-Host 
Write-Host "---------------------------------------"
Write-Host "対象パス："$Path 
Write-Host "深さ："$Depth
Write-Host "---------------------------------------"
$Output =""
function GetAclAndChildDirRoot($RootDir){
  
    Write-Host (Split-Path -Leaf $RootDir)
    $Children = Get-ChildItem -Path $RootDir -Force -Directory | select-object fullname
    foreach ($Child in $Children) {
        $i = 1
        GetAclAndChildDir $Child.FullName $i
    } 
}

function GetAclAndChildDir($CurrentTarget,$i){
    
    if($i -gt $Depth){
        return;
    }
    $Output=""
    for($j=0;$j -lt $i;$j++){
        $Output+=" "
    }

    $Output+=Split-Path -Leaf $CurrentTarget
    Write-Host $Output

    $children = Get-ChildItem -Path $CurrentTarget -Force -Directory | select-object fullname
    $i++
    foreach ($child in $children) {
        GetAclAndChildDir $child.FullName $i
    } 
}


GetAclAndChildDirRoot $Path
Write-Host "---------------------------------------"
Read-Host 

```

実行するときは、下記のような感じ
```
 .\Tree.ps1 C:\Folder 3
```
Callback関数の書き方の比較（Java, JavaScript, Ruby）

## Java
```java
public class Sample {
  public static void func(Action<String> a) { 
    a.apply('Hello');
  }
  public static void main(String[] args) {
    Sample.func(s -> System.out.println(s));
    // 複数行の場合
    Sample.func(s -> { 
      System.out.println(s)
      System.out.println(s)
    });
  }
}
```

## JavaScript

```js
const func = (callback) => {
  callback('Hello');
};

func((s) => console.log(s));
// 複数行の場合
func((s) => {
  console.log(s)
  console.log(s)
});
```

## Ruby

```rb
def func
  yield 'Hello'
end

func { |s| p s }
# 複数業行の場合
func do |s|
  console.log(s)
  console.log(s)
end
# {}でも動作するがdo~endがベター
```
MySQL@5.7 をインストールして接続できるようにする

その昔、インストールした `5.6` と比べて挙動が違ったのでメモ。

# brew install

まずは brew install するところから

```sh
$ brew install mysql@5.7
==> Downloading https://homebrew.bintray.com/bottles/mysql@5.7-5.7.26.mojave.bottle.tar.gz
Already downloaded: /Users/<your name>/Library/Caches/Homebrew/downloads/665d7cef7caaddc43ad93397ebb4a9cf1737a905403381440be05956e06e35a2--mysql@5.7-5.7.26.mojave.bottle.tar.gz
==> Pouring mysql@5.7-5.7.26.mojave.bottle.tar.gz
==> /usr/local/Cellar/mysql@5.7/5.7.26/bin/mysqld --initialize-insecure --user=t_horikoshi --basedir=/usr/local/Cellar/mysql@5.7/5.7.26 --datadir=/usr/local/var/mysql --tmpdir=/tmp
==> Caveats
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

mysql@5.7 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have mysql@5.7 first in your PATH run:
  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile

For compilers to find mysql@5.7 you may need to set:
  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"

For pkg-config to find mysql@5.7 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"


To have launchd start mysql@5.7 now and restart at login:
  brew services start mysql@5.7
Or, if you don't want/need a background service you can just run:
  /usr/local/opt/mysql@5.7/bin/mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql@5.7/5.7.26: 320 files, 231.8MB
```

接続を試みるも失敗...。

```sh
$ mysql -uroot
fish: Unknown command mysql
```

# brew services start

[こちら](https://superuser.com/questions/1333504/brew-install-mysql5-7-cant-connect-to-local-mysql-server-through-socket)を参考に `brew services start` とやらをやってみる。

```sh
$ brew services start mysql@5.7
```

# 接続できるようになる

💪

```sh
$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.16 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

> brew services start mysql@5.7

インストール時のログに出てたね。

# おわり
HugoとAWS Amplify Consoleでお手軽静的Webサイト開発

以前静的ページを作成するためにお手軽に安く、という目的で試したことがあるのですが、

[低コストかつ簡単な方法でWebページを作成・更新をできるようにしてみた](https://qiita.com/kojiisd/items/58ebc5cd848484b58677)

WordPressのインスタンスを立ち上げることすら面倒になったので、別の方法を試しました。

# TL;DR
1. [Hugo](https://gohugo.io/)を使ってさくっとWebページ置き換えてみました。
2. AWS Amplify ConsoleでHugoを利用できるようにして、自動ビルド＆デプロイのプロセスを作成しました。

以下、成果物（Hugo用Markdown）

https://github.com/kojiisd/web-kojiisd/tree/0.1

# Hugoを利用する

![スクリーンショット 2019-03-24 14.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/102769/e7217f1e-d17a-1d00-1191-c66ab20c375b.png)

Markdown形式くらいで自分の場合は十分作りたいもの（いわゆるポートフォリオ的なもの）が作れるので、これを利用してみます。

## 一からHugoでWebページを作成する
そんなに複雑なページ構成ではないので、Hugoである程度似通ったページを作ってしまいます。元々のコンテンツはこんな感じ。とてもシンプルです。

![スクリーンショット 2019-03-31 18.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/102769/a404e2a9-e47f-acfa-eb7f-2aaa314a45d1.png)

とりあえずHugoのThemeを適用して云々、というほどの規模のサイトでもないので、Blankプロジェクトから適当に作ります。

![スクリーンショット 2019-07-23 12.42.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/c2717aa5-d2e2-dbc3-a49e-943bbc4ad736.png)

詳細は割愛しますが、layouts配下のファイルとstatic配下にcss、imagesを置いただけで、特にthemeは適用していないので、ゼロからページを作りたい場合は参考にしてもらっても良いかもです。

##

# Amplify Consoleで自動デプロイ設定

これが恐ろしく簡単でした。GitHubのリポジトリを指定したら、hugoであることを自動検知して、デプロイまでの設定を自動で設定してくれました。この辺はNetlifyと同じ挙動ですね。

```yml:amplify.yml
version: 0.1
frontend:
  phases:
    build:
      commands:
        - hugo
  artifacts:
    baseDirectory: public
    files:
      - '**/*'
  cache:
    paths: []
```

これで設定がうまくいけば問題なくデプロイができるようになります。

![スクリーンショット 2019-07-23 17.50.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/87da8646-aaa1-c3e9-ff6a-f075c978eb30.png)

ついでに特に迷うこともなくドメインの付け替えもできました。一点、CloudFrontにすでにRoute53からの紐づけをしてしまっていると、それを外す旨のエラーメッセージが表示されますが、それ以外は簡単でした。

![スクリーンショット 2019-07-23 17.50.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102769/c3347545-d4b2-bf1f-b175-2e975a7400bc.png)

これで画面も問題なく表示されるようになります。

# まとめ
Amplify Consoleすごい便利。
GASを使って課題提出メールのチェック

#※自分用の覚書です

##課題提出
条件
-学生からの課題提出をGmailで受け付けている
-学生は課題提出時に，提出期限日を含めた件名をつけなければならない (例：progc1:20190607)

##準備
課題毎で提出時の件名が定まっているので，件名を使ってラベル分けする．

##やりたいこと
誰が提出したかを確認したい
→学生のアドレスは学籍番号が含まれるため，送信元アドレスが分かれば誰の提出かわかる
→ラベル分けしたメール一覧から送信元アドレスを取れればよい（要するにこれだけ）

##実装
Gmailのデータを処理したいので，GASが便利

##GASソースコード
```
function getMail() {
  var label = Browser.inputBox("label name");
  var start = 0;
  var max = 500;
  return GmailApp.search('label:' + label, start, max);
} 

function onSaveMailToSheet() {
  var sheetName = 'シート1';
  var ss = SpreadsheetApp.getActive().getSheetByName( sheetName );
  var row = ss.getLastRow() + 1;
  var threads = getMail();

  for( var i in threads ) {
    var thread = threads[i];
    var msgs = thread.getMessages();
    for( var j in msgs ) {
      var msg = msgs[j];
        var date = msg.getDate();
        var from = msg.getFrom();
        var values = [
          [date, from]
        ];
        ss.getRange("A" + row +":B" + row).setValues(values);
        row++;
      }
    }
  }
```

inputでlabelを入力
GmailApp.search 入力されたラベルに一致するメール（スレッド）を入手
msgs=thread.getMessages() スレッドをメッセージ単位に分割
date=msg.getDate()
from=msg.getFrom() 日付と送信元アドレスを入手

ただしこのままではメールの送信者が "kanon"<dawka@ga.fa.jp> などの場合にこのままgetされるので，区切る必要あり
ドメイン名取得するならこれからはGandi.netが良いと思った理由

# ドメイン名取得

ドメイン名の乗っ取りや管理を怠り重要なドメイン名が期限切れになった、オークションで買われたドメイン名がアダルトサイトになっていた、などなど最近よくドメイン名がニュースに出る中、ドメイン名の管理ひいてはドメイン名を管理する上でのレジストラの選定をちゃんとしないといけないと思い、世の中に複数あるレジストラを比較検討して諸々調査した結果、Gandi.netが一番よいということになったので、そのGandi.netでできることを共有したいと思います。

## Gandi.netの特徴
![gandi-net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293176/0283a62f-2284-9edf-c97c-9d4d2507641f.png)

ウェブサイト：https://www.gandi.net/

このドメインレジストラの名前は Gandiで「ガンディー」と呼ぶそうです。インドのガンディーと勘違いしてしまいそうですが、Wikipediaの情報によるとフランス語で"Gestion et Attribution des Noms de Domaine sur Internet"の頭文字を取ったものらしいです。意味は「インターネットドメイン名の管理と割り当て」というもの。

昨年2018年に日本語に対応していて、日本語で使用可能です。

また、AWSのRoute 53でドメイン名を登録すると、その多くのドメインエクステンションの提供元はGandiになっているようです。

実際にドメイン名を登録して使ってみたところ以下の機能が全て無料で使えます。

### プライバシー機能
- **Whoisプライバシー** ... デフォルト設定でWhoisプライバシーが有効化されている。ただヨーロッパのGDPR(EU一般データ保護規則)によりWhoisデータは隠すというのが業界の慣習になっているのでここは既にもう重要ではないかもしれません。
- **メールアドレスの匿名化** ... Whoisで確認できるメールアドレスを匿名化して結果として表示されることができます。(ランダムな文字列@gandi.net のようなメールアドレスになります)

### セキュリティ機能
- **二段階認証** ... 二段階認証アプリを使用したログイン時のアカウント保護をすることができます。
- **FIDO U2F** ... PCのUSBポートに挿して使用する物理キーを使用して、ログイン時のアカウント保護をすることができます。
- **IPアドレス制限** ... オフィスのIPアドレスを使用した場合のみなどアカウントへのログインを制限することができます。
- **DNSSECの設定** ... キャッシュポイズニングを防ぐためのDNSのセキュリティ機能を使用することができます。
- **サンライズ、ランドラッシュ** ... 新しく登録可能になるgTLDのサンライズ、ランドラッシュ登録(優先登録)に対応しているので、他に登録される前に登録を行うことができる可能性が上がります。
- **組織アカウント** ... 組織アカウントを作成してその下にチームを作成して、ドメイン名やセキュリティ証明書などの管理などの権限を付与することができます。

### ドメイン関連機能
- **メールアドレス** ... 無料の範囲で3GBあるメールボックスを2つ使用することができます。
- **メールアドレスのエイリアス設定** ... 1000こまでメールエイリアスを使用することができます。
- **リダイレクト、サブドメイン設定** ... 登録したドメイン名を別のドメイン名にリダイレクトをかけたり、blog.example.com などサブドメインなどを作成できます。
- **API** ... ドメイン名登録や登録可能なドメインエクステンションやドメイン名のリストなどウェブサイトでできる諸々の操作を行うことができます。 (https://api.gandi.net/docs/ - ここのAPI資料にあるサンプルコードから自分で簡単なアプリケーションを作れるようです。また別投稿でまとめます)

### ドメインの価格について

他と比べて安いのは一通り見た感じ以下がありました。

- .io: 通常価格 3,825円 / 年
- .tw: 通常価格 2,371円 / 年
- .ai: 通常価格 8,037円 / 円　など

日本の大手レジストラだと初年度のみ格段に安く2年目から他のレジストラの価格より高くなる場合があるので注意が必要で、たいていドメイン名登録後3年目から合計金額で損になる(経験談)。

.com は初めての購入だと1,493円で年間の購入金額が多くなってくると1000円以下で購入可能 (ウェブ制作会社などドメイン名を大量に購入するところだとよいかもしれない)

.jp は一年間で3,899円。他と比べると少し高く感じますが、上記機能が全て含まれていると考えれば妥当かなと思います。

その他、ccTLDやngTLDなどはレジストリから直接ドメイン名の販売許可を受けているものが多い印象です。

## 最後に

GodaddyやName cheapやお名前.comを今まで使用したことありますが、個人的に気に入っているのはユーザーインターフェイスが一番使いやすくわかりやすいことです。上に書いた機能の設定も直感的で簡単にでき、スマホのブラウザでも使えます。

自動更新はデフォルトでオフで、必要のないメールも送信されないのでおすすめです。

もっと使っていく上で他にも気づいたことがあれば追記します。
Dockerを起動すると接続できなくなる場合の対応方法（docker0ブリッジの削除と再設定）

社内のネットワーク設定とdockerのデフォルトブリッジ設定が衝突しているせいで、毎回設定し忘れてハマるのでメモ。

そしてDocker-CEになる前の設定方法を見ていてハマったのでメモ。

## そもそもの原因

操作しているPCが`172.17.x.x`のネットワークに属している場合に、dockerでデフォルトで設定される仮想ブリッジネットワークが`172.17.0.1/16`なので衝突してしまいdockerホストに接続できなくなってしまう。

## 対処方法

`docker0`仮想ブリッジを削除して、手動設定で再作成する。

## 環境

- CentOS 7
- Docker-CE 19.03
- 開発PCがのIPアドレスが`172.17.x.x`
- 設定変更用の`172.17.0.0/16`以外のPC

## 手順とコマンド

CentOSだったのでrootで操作。Ubuntuの場合は適宜sudoしてください。

### 衝突の確認

```shell
# ip addr
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:f7:ae:5c:3e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
```

```shell
# nmcli
...
docker0: 接続済み to docker0
        "docker0"
        bridge, 02:42:F7:AE:5C:3E, sw, mtu 1500
        inet4 172.17.0.1/16
        route4 172.17.0.0/16
```

確かに`172.17.0.1/16`が使われていることを確認

### dockerの停止

```shell
# systemctl stop docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead) since 火 2019-07-23 16:55:20 JST; 19s ago
     Docs: https://docs.docker.com
  Process: 58478 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)
 Main PID: 58478 (code=exited, status=0/SUCCESS)
...
```

### ブリッジの停止と削除

```shell
# ip link set dev docker0 down  # 停止
# nmcli
...
docker0: 管理無し
        "docker0"
        bridge, 02:42:F7:AE:5C:3E, sw, mtu 1500
...
#
# ip link delete docker0  # 削除
# nmcli
...
(docker0が表示されなくなる)
...
```

### docker0仮想ブリッジのIPを変更

`/etc/docker/daemon.json`として以下内容のファイルを配置する。

```json
{
  "bip": "192.168.1.1/16"
}
```
ここでは`192.168.1.1`にしているが、クラスC`192.168.x.x`も使われている可能性があるので、`10.0.x.x`とか適宜変更（DNSサーバーとぶつかって名前解決できなくなった……orz）。

参考： [Customize the docker0 bridge](https://docs.docker.com/v17.09/engine/userguide/networking/default_network/custom-docker0/)

※`/etc/sysconfig/docker`や`/etc/default/docker`や`/etc/systemd/system/docker.service`などを利用した方法はDocker-CEになる以前の`1.x`系の設定方法なので使えません。

### dockerを起動

```shell
# systemctl start docker
# nmcli
...
docker0: 接続済み to docker0
        "docker0"
        bridge, 02:42:38:75:80:FD, sw, mtu 1500
        inet4 192.168.1.1/16
        route4 192.168.0.0/16
```

これで`172.17.x.x/16`ネットワーク上のPCからでも接続できるようになる。
Mac環境でExcelマクロを自動実行したい件

# 前置き
- お仕事のお話
- 既存業務でExcelマクロを使って `hoge.json` を生成して、fugafugaするーみたいなつらみなものがあった
- 既存業務を全自動する際に、Mac環境でExcelマクロを自動実行をとりあえずしたい状況

# 環境
- Excel for Mac 16.16.12
- macOS High Sierra（10.13.6）

## プロジェクトの階層

```
./
├── 1_xxxxx
│   ├── 1_excel_project
│   │   ├── Main.xlsm　・・・どうにかしたいExcelファイル
└── tools
    └── exec_macro.scpt　・・・今回作成するスクリプト
```

# 対処法
- AppleScriptというものを使う。
- 作成したAppleScriptをshellから叩けるようにする。

## AppleScriptを作成する

```applescript:exec_macro.scpt
# 親ディレクトリのパスを取得
tell application "Finder"
	set ParentPath to parent of parent of (path to me) as text
end tell

# マクロの実行（Excelをactivateして、対象のファイル開いて、マクロ実行して、閉じる）
tell application "Microsoft Excel"
	activate
	open (ParentPath & "1_xxxxx:1_excel_project:Main.xlsm")
	run XLM macro "JikkousitaiMacroName"
	quit
end tell
```

## マクロのセキュリティレベルを下げる

- セキュリティ警告のダイアログの対処が難航したので、あんましたくないけど一旦対応
    - テキトーにExcelファイルを新規で開く
    - メニューで、Excel > 環境設定 > セキュリティとプライバシー を開く
    - マクロセキュリティで **すべてのマクロを有効にする（~）** を選択

## shellで実行する

```shell:exec.sh
osascript tools/exec_macro.scpt
```

一応実行できた。
セキュリティレベルの部分だけどうにかしたい……。

# 参照
- [自作のエクセルVBA関数をAppleScriptやC言語から呼ぶ](http://darumaexcel.uijin.com/info/callProcedure.html)
- [Excel + AppleScript](https://allabout.co.jp/gm/gc/80915/)
- [Applescriptで相対パスみたいにしたい場合](https://www.tantan-biyori.info/blog/2019/06/applescript-relative.html)
rails whereメソッドとfindメソッドの違い　メモ

#はじめに
railsのエラーを解く問題で解けなかった問題を復習のため
記述してます。

##問題内容
以下のエラーがでないようにコードを修正する。

~~~
NoMethodError in Products#show
<header class="header header--section">
 <h2 class="text-middle">
  <i class="icon-movie color-gray-light"></i><%= @product.title %>
 </h2>
</header>
~~~

###問題を解くときに考えたこと
NoMethodError in Products#showとあり
<i class="icon-movie color-gray-light"></i><%= @product.title %>
に赤線が引かれていたので
@productに対してのshowアクションが何かうまく行ってないのでは？と考えた。

そこでproductのコントローラーファイルを確認してみる。

~~~ruby
def show
    @product = Product.where(params[:id]) 
end
~~~

whereメソッドを使って対象のidの情報を@productに代入しているので大丈夫そう。
whereメソッドは引数に取得してきたい条件をもたせ、それに該当するレコードを配列として持ってくるメソッドだから、ここでは
対象のidを条件とし持ってくる様に指示しているから問題はないのでは？

###解答確認
before
@product = Product.where(params[:id])

after
@product = Product.find(params[:id])


###解答確認の感想
解答を確認して、修正箇所の着眼点は良かった。
けどなんでfind？
findの使い方はわかるけど、whereでもいいんじゃないの？
コード的には問題ないじゃん！

###復習

まずfindメソッドとwhereメソッドの違いを確認にすることにしました。

すると
@tsuchinoko_runの記事で今回の問題について納得ができました。ありがとうございます。

find、find_by、whereの違い
https://qiita.com/tsuchinoko_run/items/f3926caaec461cfa1ca3

##学習後の認識

・findメソッドはidを引数として持たせる。id以外での検索はできない。

・whereメソッドはid以外を引数として持たせる。idでの検索はできない。

そのため今回の問題はwhereメソッドの条件にid
をもたせていたため、DBの情報を持ってくることができず、
@product.titleを表示ができなく
エラーが発生していた。


まとめが非常に分かりやすかったので
引用させていただきます。
>idの値が分かっていて、そのidのデータを取得したい場合・・・find
idの値が不明で、id以外のカラムを検索条件としたい場合・・・find_by
id以外のカラムの検索条件で、複数の実行結果を取得したい場合・・・where
【PHP関数】fgetsによるファイル操作

# fgetsとは？
ファイル操作を行う関数の一つで、ファイルポインタの位置から1行分を読み取る関数です。
ファイルから読み取りを行う際には、`fopen関数`にて対象のファイルをオープンしてファイルポインタの設定を行う必要があり、ファイルをオープンした場合は`fclose関数`にてファイルポインタをクローズさせる必要があります。

### 関連する関数
|No.  |関数  |使い方  |
|---|---|---|
|1  |fopen()  |ファイル（URL）を開く  |
|2  |fgets()  |ファイルポインタより1行を取得する  |
|3  |feof()  |ファイルポインタがファイルの最後に達しているかどうか調べる  |
|4  |fclose()  |オープンされたファイルポインタをクローズする  |

# fopenの使い方
fopenメソッドの第一引数にファイルパスを、第二引数にはアクセス形式を指定します。

### ＜参考＞fopenの第二引数（アクセス形式）
アクセス形式を簡単にまとめると以下になります。
読み込み、書き込みをするアクセス形式、ファイルポインタ位置、ファイルがない場合のエラー有無で使い分けを行います。

|モード|アクセス|ファイルポインタ|ファイルがない場合|
|---|---|---|---|
|r|読み込み|先頭|エラー|
|r+|読み込み／書き出し|先頭|エラー|
|w|書き出し|先頭|作成|
|w+|読み込み／書き出し|先頭|作成|
|a|書き出し|終端（常に追記）|作成|
|a+|読み込み／書き出し|終端（常に追記）|作成|
|x|書き込み|先頭|エラー|
|x+|読み込み／書き出し|先頭|エラー|
|c|書き込み|先頭（常に追記）|作成|
|c+|読み込み／書き出し|先頭（常に追記）|作成|


# サンプルプログラム
サンプルとして以下のtextファイルを読み込むプログラムを用意しました。

### ＜読込み対象ファイル＞
```txt:I_Am_Cat.txt
吾輩わがはいは猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニヤーニヤー泣いてゐた事だけは記憶してゐる。
吾輩はここで始めて人間といふものを見た。しかもあとで聞くとそれは書生といふ人間中で一番獰悪だうあくな種族であつたさうだ。
この書生といふのは時々我々を捕へて煮て食ふといふ話である。
しかしその当時は何といふ考かんがへもなかつたから別段恐しいとも思はなかつた。
ただ彼の掌てのひらに載せられてスーと持ち上げられた時何だかフワフワした感じがあつたばかりである。
掌の上で少し落ちついて書生の顔を見たのがいはゆる人間といふものの見始みはじめであらう。
この時妙なものだと思つた感じが今でも残つてゐる。第一毛をもつて装飾されべきはずの顔がつるつるしてまるで薬缶だ。
その後猫にもだいぶ逢つたがこんな片輪には一度も出会でくはした事がない。のみならず顔の真中があまりに突起している。
さうしてその穴の中から時々ぷうぷうと煙を吹く。どうも咽むせぽくて実に弱つた。
これが人間の飲む煙草といふものである事はやうやくこの頃知つた。
```

### 1行のみ出力
オープンしたファイルを1行のみ表示するプログラム

```php:main1.php
<?php    
    /*変数宣言*/
    $file_name = 'I_Am_Cat.txt';    

    // fopenでファイルを開く（「r」は読み込みモードで開くオプション）
    $fp = fopen($file_name, 'r');

    // fgetsで読み込んだファイルの1行を変数に格納する
    $row_txt = fgets($fp);

    // 出力（格納された結果を出力）
    echo $row_txt;

    // fcloseでファイルを閉じる
    fclose($fp);
?>
```

### 全行を出力
オープンしたファイルの全行を表示するプログラム
feof関数にて末尾かどうかの判断を行っていますが、処理としては使用していません(-_-;)

```php:main2.php
<?php    
    /*変数宣言*/
    $file_name = 'I_Am_Cat.txt';    

    // fopenでファイルを開く（「r」は読み込みモードで開くオプション）
    $fp = fopen($file_name, 'r');

    // whileで行末までループ処理
    while (!feof($fp)) {
 
        // fgetsにてファイルポインタの位置から1行分を変数に格納
        $txt = fgets($fp);
   
        // ファイルを読み込んだ変数を出力
        echo $txt;
    }

    // ファイルが最後まで読み込まれたかどうかを確認
    var_dump(feof($fp));

    // fcloseでファイルを閉じる
    fclose($fp);

?>
```

#### ＜Topics＞
`fgets関数`と同じような関数として、ファイルにHTMLタグやPHPタグがあった場合にそれらを削除して読み込んでくれる`fgetss関数`というものがありますがPHP7.3.0で非推奨の関数となるのでできるだけ使わずに、`strip_tags関数`などで対応するのが良いのではないかと思います。
（詳しい方居りましたら情報頂きたいです。）


参考：
[PHP関数リファレンス（fgetss）](https://www.php.net/manual/ja/function.fgetss.php)
[PHP関数リファレンス（strip_tags）](https://www.php.net/manual/ja/function.strip-tags.php)
開発作業のためにSimpleなlocal webサーバを速攻で立てる

# 開発作業のためにSimpleなlocal webサーバを速攻で立てる

- 開発のためにlocalhostでwebサーバを速攻で建てたい！！ってことがある。
- dockerでnginx、とかもあるが、ただ使い捨てのjs貼り付けただけのhtml確認するのにnginx.conf書いて、とかもだるい。ともかく速攻でhtmlファイルのあるフォルダをDocumentRootにしてwebサーバを立ち上げたい！！って時。

## 結論(macの場合)
```
python -m SimpleHTTPServer
```
- macだと元から入っているpythonでSimpleHTTPServer起動すればそれが最速。。。素敵。。。

## それ以外
結論出ちゃってるのであれですが。
nodeが入っているなら以下の２つも簡単。

### superstatic(npm package)
- [superstatic - npm](https://www.npmjs.com/package/superstatic)

```
npm i -g superstatic
cd 公開したいファイルのあるフォルダ
superstatic
```
- 色々オプションもあるらしいがhtmlを見るだけならこれでok。

### http-srever(npm package)
- [http-server - npm](https://www.npmjs.com/package/http-server)

```
npm i -g superstatic
cd 公開したいファイルのあるフォルダ
http-server -c -1
```
- `-c -1`はキャッシュdisableにするおまじないです（デフォルトでは3600sec）。
Centos7 firewalld の拒否リストを登録するやーつ

# とりあえずコマンドを毎回打つのが面倒なので...
とりあえずコマンドを毎回打つのが面倒なのとやっつけ作ったw
...Centos7 firewalld の拒否リストを登録するやーつ。

## 補足説明
- 作り込み度 ★
- zoneの作成は、`drop`という名称のみ
- 使用方法は、権限付与した後、`./ip_ban.py`で起動して、`whois {IP}`で得た情報を元に使用する
- コマンドは、プレフィックスを含めた形式、または無しの直IPアドレスをinputする。　下の方に入力例がある。


```python3:ip_ban.py
#!/bin/python3.7
# -*- coding: utf-8 -*-
import subprocess
def banner(IP):
    cmd = f'firewall-cmd --zone=drop --permanent --add-source={IP}'
    r = subprocess.check_output(cmd.split())
    er = r.decode('utf-8')
    print(f'{er}Next IP...')

def reload():
    cmd = 'firewall-cmd --reload'
    r = subprocess.check_output(cmd.split())
    er = r.decode('utf-8')
    print(f'{er}')

if __name__ == "__main__":
    print('Hi! Welcome to IP BANNEEEER!')
    while True:
        ip = input('BAN IPaddress >>> ')
        if ip == 'end':
            reload()
            print('IP BANNER Shutdown...')
            break
        try:
            banner(ip)
        except:
            import sys
            print(f'{sys.exc_info()}')


```

```sh:example
Hi! Welcome to IP BANNEEEER!
BAN IPaddress >>> **.**.0.0/16 # or ***.***.***.***
```

### 課題

- 拒否以外のその他コマンドにも対応したい。
- そもそもファイル名など色々と名前がダサい...からかっこよく決めたいw
Git 2つのリモートリポジトリを同期する

2つのGitリモートリモートリポジトリをできるだけ手間なく同期する方法を紹介します。

#検証背景

- 本番用の環境にもリモートリポジトリを作成する必要があった
- 開発用のリモートリポジトリとヒストリレベルでも同期させる必要があった
- 開発用と本番用の環境は物理的に異なるネットワークにあった
    - 直接は繋がらない
- 中継用のPC（ローカルリポジトリ）を使ってコマンドだけでマージできないか。。。

#処理イメージ
このやり方で同期できました。
![gitlab2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364565/0a272800-6279-13ca-4229-c27565baaba4.png)

#初回のみ
①～②は初回のみ実行すればOKです。
####①本番用リポジトリのclone
```
$ git clone [https://本番用のリポジトリ]
$ cd [本番用のリポジトリフォルダ]
```

####②開発用のURLリンク(リモートリポジトリ追加)
```
$ git remote add devlab [https://開発用のリポジトリ]
```

#2回目以降

####③開発用最新ソースをpull
```
$ git pull devlab
```

####④比較(任意)
```
$ git diff master devlab/master
```

####⑤開発用マージ(パラメータはおまじない)
```
$ git merge --allow-unrelated-histories devlab/master
```
※Already up to date.なら変更なし。何もしないでよい

####⑥プッシュ (上記でマージしているのでadd&commitは不要)
```
$ git push -u origin master
```

これで完了です。おつかれさまでした。

#おまけ（その他よく使うコマンド、備忘録です）
２回目以降（ブランチ作成版）です。

```
#(3) 開発用最新ソースをpull
$ git pull devlab

#(4) 開発用コードのブランチを作成
$ git branch [devlabYmd] devlab/master

#(5) 開発用マージ
$ git merge --allow-unrelated-histories [devlabYmd]

#(6) プッシュ
$ git push -u origin master
```

その他よく使うコマンド

```
# ブランチ一覧
git branch

# ブランチの比較
git diff master [devlabYmd]

# ブランチの削除
git branch -d [devlabYmd]

#コンフリクト時：開発用コードを優先(無条件上書きでよい場合のみ)
git checkout --theirs [対象ファイル]

#コンフリクト時：本番用コードを優先(無条件上書きでよい場合のみ)
git checkout --ours [対象ファイル]

# コンフリクト時エディタによる修正対応後
git add .
git commit -m "edit file commit“

# push後の確認用
git pull origin
```

##最後に
Gitはできることが多すぎて覚えるものじゃないですね。
RCSが懐かしいです。
Azure で HA な NFS サーバーをサクッと構築する

　2019年7月現在、私のまわりではサーバーノード間でファイルを共有する際にはやっぱりNFSがいいよねという雰囲気である。

　一時期、ファイルサーバーが単一障害点(SPOF)になるのが嫌で、なおかつ複雑なクラスタをクラウドで組むことに抵抗があったので、[Azure File Storage](https://azure.microsoft.com/ja-jp/services/storage/files/) という SMB3.0 ストレージサービスを[Linuxからマウント](https://docs.microsoft.com/ja-jp/azure/storage/files/storage-how-to-use-files-linux)する運用をしていた。

　でもやっぱり、パーミッションがUNIXの世界と違ったり、ネットワーク距離があるため、ランダムアクセスの性能が残念であったりで、やはり同一リージョン、同一ネットワークにあるVMでNFSサーバーを立てるべきと一周回って元の場所に戻ってきたところだ。

　とはいえ単一障害点(SPOF)はやはり嫌なので、DRBD + Corosync + Pacemaker でHAなNFSサーバーを構築したいところ。

　DRBDは、複数のLinuxサーバーの間でブロックデバイスレベルでディスクの内容を同期してくれるカーネルモジュールで、一般的には Pacemaker などのクラスタリングソフトウェアと組み合わせてHAなサービスを構築する際に使うことができる。
　単にブロックデバイスなので、その上にファイルシステムを構築すれば普通にファイルとして保存しているだけで、別のサーバーのディスクにも同期されているという優れものだ。

　この環境を自分で構築するのはかなり面倒でつまらない作業だ。

　結論からいうとこの構成を自分で作成する必要はなかった。Azureの可用性セットとロードバランサーを含め適切に構成されたテンプレートが用意されているからだ。

https://github.com/Azure/azure-quickstart-templates/tree/master/nfs-ha-cluster-ubuntu

　Azureのポータルにログインしている状態なら以下のリンクからすぐに作成することができる。
[![Deploy to Azure](http://azuredeploy.net/deploybutton.png)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FAzure%2Fazure-quickstart-templates%2Fmaster%2Fnfs-ha-cluster-ubuntu%2Fazuredeploy.json)
<img width="1310" alt="スクリーンショット 2019-07-22 17.33.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131496/795ae5d7-24e9-5191-e5c1-48ed58fcf35d.png">

　クラスタをぶら下げたい仮想ネットワーク（Subnet Id）を指定して、あとは Node0 と Node1 のIPアドレス、およびロードバランサで提供されるクラスタの代表IPアドレス、サーバーにアタッチしたいディスクの数とサイズを指定するだけですべてがセットアップされたクラスタが作成される。

　クラスタが切り替わる様子はこちら。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">DRBDでブロックデバイスをミラーリングして、高可用性なNFSサーバーを構築し、書き込みながら切り替えた様子。 <a href="https://t.co/dB8IpWdWUf">pic.twitter.com/dB8IpWdWUf</a></p>&mdash; 石田健亮 (@kensuke_ishida) <a href="https://twitter.com/kensuke_ishida/status/1153584274311802880?ref_src=twsrc%5Etfw">July 23, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

　アクティブなノードをいきなり電源ダウンしたときも２分かからずにNFSクライアントからは復旧できている。

　サブネットのIDはAzure CLIがあれば以下のコマンドで調べることができる。

```
$ az network vnet subnet list --resource-group={リソースグループ名} --vnet-name={仮想ネットワーク名}
```

なお、DRBDはカーネルモジュールで動いているので、Ubuntuの自動更新・自動アップデートは停止しておいた方がいいだろう。

特にカーネルの更新にはナイーブなので要注意。
Linux（GNU）とMac（BSD）のsedの振る舞いの違いを解決（オーバーライド版）


## 要旨

sedでファイルを直接書き換えようとした際に、-iのサフィックスの振る舞いが Linux（GNU） と Mac（BSD） で異なります。


#### GNU Style

```Bash
sed -i -e 's/foo/bar/g' file.txt           # バックアップ作成されない
sed -i.bak -e 's/foo/bar/g' file.txt       # file.txt.bakが作成される
```

#### BSD Style

```Bash
sed -i '' -e 's/foo/bar/g' file.txt        # バックアップ作成されない
sed -i '.bak' -e 's/foo/bar/g' file.txt    # file.txt.bakが作成される
```

エイリアスを使った方法は
https://qiita.com/narumi_888/items/e425f29b84da6b72ad62
で紹介されていますが、この記事は sed のまま使いたい、既存のスクリプトを書き換えたくない人向けです。

#### こんな人向け
- シェルスクリプトで sed を iオプション 付きで使う
- Linux(GNU sed)とMac(BSD sed)の開発者が混在している
- Macの開発者にGNU sedへの入れ替えを強要するのはちょっと・・・
- エイリアスはなんか嫌だ

## 解決

sedというシェル関数を定義し、正しい振る舞いに書き換えます。

```Bash
function sed(){
    # sedコマンドオーバーライド
    # macOS標準の BSD sed は GNU sed の-iオプション指定方法と異なるので、GNUに合わせるようオーバーライドする

    if command sed --version 2>&1 | grep -q GNU; [ $? -ne 0 ] \
    && [ "${1:0:2}" == "-i" ]
    then
        # BSD sed かつ -iオプション有り
        # -iオプションの拡張子を書き換える
        BACKUP_EXT=${1:2}
        shift
        command sed -i "$BACKUP_EXT" "$@"
        return $?
    else
        # sedコマンドそのまま実行
        command sed "$@"
        return $?
    fi
}
```
JavaScriptで全角文字を半角文字に変換

#全角文字を半角文字に変換

全角文字の文字コードから65248個前の文字コードが半角文字になるようです。
``、``と``　``(全角スペース)の65248個前に変換すると違う文字になってしまうので``if``で判断し返しています。

```.js
const FULL_STR = 'ＡＢＣａｂｃ１２３（）、　'
                                     // ↑ 全角スペース
  const conversion = (str) => {
                                    // ↓ 全角スペース
    str.replace(/[Ａ-Ｚａ-ｚ０-９ （） 、　]/g, (c) => {
      if (c === '、') { return ',' }
      if (c === '　') { return ' ' }
      return String.fromCharCode(c.charCodeAt(0) - 65248)
    })
    return str
  }
  
  const HALF_STR = conversion(FULL_STR)
  console.log(HALF_STR)
```

``+ 65248``にすれば半角文字を全角文字に変換することもできます。

# 感想
文字コード難しい。
JavaScriptの綺麗な書き方がわからない。もっと書くぞ！
Python 3.8.0b3 からPGOビルドが速くなる

Python をビルドするとき、 `configure` で `--enable-optimizations` を指定するとビルド時に PGO (Profile Guided Optimization) を利用することができます。

PGO を有効にすると、一度ビルドしたバイナリを実行してプロファイルを取得し、そのプロファイルデータを利用してもう一度最適化ビルドをします。このプロファイル取得のために Python のテストを実行していたのですが、普通のPCでは20分以上かかる上に並列実行することもできませんでした。

`--enable-optimizations` を指定したときにプロファイル取得に使われるテストを 419 モジュールから 40 モジュールに減らす改善が [取り込まれました。](https://github.com/python/cpython/pull/14910) なので Python 3.8b3 からはPGOを利用したビルドが速くなります。

ちなみに、 `--with-lto` というオプションを使って LTO (Link Time Optimization) を有効にすると、リンク時間が伸びる代わりにさらに Python の実行速度が向上します。

例えば Ubuntu 19.04, Core i7 6700 で gcc を使って Python をビルドするのにかかる時間はこうなりました。

```
$ ./configure --enable-optimizations --with-lto; time make -j8

# 改善前
real    29m38.479s
user    33m39.337s
sys     0m53.246s

# 改善後
real    6m50.103s
user    15m55.335s
sys     0m27.544s
```

例えば pyenv を利用している場合、 `CONFIGURE_OPTS` 環境変数に `--enable-optimizations --with-lto` を指定すると速い Python をビルドすることができます。
Promise による nodejs 標準入力読み込みの実装

nodejs で標準入力から読み込むには複数の方法がありますが
(`fs` の `readFileSync` で `/dev/stdin` から読むとか、`readline` モジュールで読み込むとか)

`Promise` で `process.stdin` による実装を試してみました:

```javascript
function read() {
    return new Promise((resolve, reject) => {
        let buffer = '';
        process.stdin
            .resume()
            .setEncoding('utf8')
            .on('readable', () => {
                while ((chunk = process.stdin.read()) !== null) {
                    buffer += chunk;
                }
            })
            .on('end', () => resolve(buffer));
    });
};
```

使うときは `async` `await` でこうです:

```javascript
function doSomething(input) {
    console.log(input);
}

(async () => {
    const input = await read();
    doSomething(input);
})();
```


コールバックよりはマシかな程度になりましたね。

バッファに全部読み込むのではなく
ジェネレーターで行ごとに返せたりできれば
そっちのほうがいいなと感じますね。
iOSアプリのデバッグテクニック(NSLogによるConsoleデバッグ)

## 概要
普段アプリのデバッグで実行時のログを確認する際には`print()`を利用してXcodeのコンソールにログを出力しますが、
スキーム起動でアプリが起動された際や、AppExtensionなどをデバッグする際にはその方法が使えないため、その際のデバッグ方法を紹介します。

## 活用シーン
- スキーム起動によるアプリ起動時のデバッグ
- Notificaton Service ExtensionやNotification Content Extensionのデバッグ
- AppExtensionsのデバッグ

## 実装
`print()` ではなく `NSLog()`を用いてログ出力を行うようにするのみ。

```swift
NSLog("🎁デバッグログです：\(hoge)")
```
のようにprint文と同じ形式で書くことが出来ます。

## 確認方法
動作させるiPhoneをPCに接続して、Xcodeのメニューから[Window] - [Devices and Simulators]を選び、
左のConnected欄の中から動作させるiPhoneを選択して[Open Console]のボタンを押す。
コンソールが立ち上がるので、その画面上に仕込んだログメッセージが表示されます。
※右上の検索窓で確認したいログを絞り込みながらログを確認することをお勧めします。
<img width="716" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165931/8165a18f-8b15-1e0c-0550-d9bf3f4528e8.png">

## さいごに
知ってる人は当然のように知ってる手法ですが、備忘録としてまとめました。
誰かのお役に立てば幸いです。
dindなgitlab-ci で `Couldn't connect to Docker daemon at http://docker:2375 - is it running?` が出て困った話

# 最初に結論
- ~~簡単に治すなら`docker:18-dind`つかう~~　うまく動作しなくなりました。
- 公式ブログにしたがって、`docker:19.03.0-dind`と環境変数に`DOCKER_TLS_CERTDIR: ""`での動作を確認しました。
https://about.gitlab.com/2019/07/31/docker-in-docker-with-docker-19-dot-03/

# 詳細

はあとから書くよ

# 未検証
```
DOCKER_TLS_VERIFY=1
DOCKER_HOST=tcp://docker:2376
DOCKER_CERT_PATH=/hoge/.docker
```

して、`docker:dind`から許可される証明書を`/hoge/.docker`に設置する。

でも、servicesであるdocker:dindと証明書やりとりするの、gitlab-ci上では不可能な気がする...
AGC 036: A - Triangle

### 数学的知識
3点 $(x_1, y_1), (x_2, y_2), (x_3, y_3)$ によって張られる三角形の面積を考えます。
一般に、ベクトル $\overrightarrow{\mathstrut a}, \overrightarrow{\mathstrut b}$ によって張られる三角形の面積は

```math
S = \frac{1}{2}|\overrightarrow{\mathstrut a}||\overrightarrow{\mathstrut b}|\sin\theta
```

です。ただし、$\theta$ はベクトル $\overrightarrow{\mathstrut a}, \overrightarrow{\mathstrut b}$ がなす角です。三角関数に関する公式 $\sin^2\theta + \cos^2\theta = 1$ を用いると、

```math
S = \frac{1}{2}|\overrightarrow{\mathstrut a}||\overrightarrow{\mathstrut b}|\sqrt{1 - \cos^2\theta}
```

と書けて、$\overrightarrow{\mathstrut a}\cdot\overrightarrow{\mathstrut b} = |\overrightarrow{\mathstrut a}||\overrightarrow{\mathstrut b}|\cos\theta$ ですから、

```math
S = \frac{1}{2}\sqrt{|\overrightarrow{\mathstrut a}|^2|\overrightarrow{\mathstrut b}|^2 - (\overrightarrow{\mathstrut a}\cdot\overrightarrow{\mathstrut b})^2}
```

と変形することができます。
この問題の場合、$\overrightarrow{\mathstrut a} = (x_2-x_1, y_2-y_1), \overrightarrow{\mathstrut b} = (x_3-x_1, y_3-y_1)$ とおくと、

```math
\begin{align}
S &= \frac{1}{2}\sqrt{[(x_2-x_1)^2+(y_2-y_1)^2][(x_3-x_1)^2+(y_3-y_1)^2] - [(x_2-x_1)(x_3-x_1)+(y_2-y_1)(y_3-y_1)]^2} \\
&= \frac{1}{2}\sqrt{[(y_2-y_1)(x_3-x_1) - (x_2-x_1)(y_3-y_1)]^2} = \frac{1}{2}\left|(y_2-y_1)(x_3-x_1) - (x_2-x_1)(y_3-y_1)\right|
\end{align}
```

と求めることができます。

### 解法
$(x_1,y_1) = (0,0)$ とおいて一般性を失いません。仮に $(x_1,y_1)$ を原点でない別の点においたとしても、$(x_2,y_2)\mapsto(x_2-x_1,y_2-y_1), (x_3,y_3)\mapsto(x_3-x_1,y_3-y_1)$ と変換することによって、$(x_1,y_1)$ を原点においた場合に帰着できるためです。
したがって、問いは次式を満たす $x_2,y_2,x_3,y_3$ を構築することに帰着します。

```math
S = \left|y_2x_3 - x_2y_3\right|
```

すべて $10^9$ 以下という制約を満たすため、$(x_2,y_2) = (1,10^9)$ とおいてしまいます。すると、$S = \left|10^9x_3 - y_3\right|$ となるので、$S$ を $10^9$ で割った商と余りから $(x_3,y_3)$ を構成することができます。

### 感想
$x_3 = y_2 = \left\lceil \sqrt{S} \right\rceil$ とおいて $x_2y_3 = x_3y_2 - S$ を因数分解する（できなければ $x_3, y_2$ を増やしていく）という方法でACしたんですが、またしてもこれは嘘解法でした（$S = 999999998499999999$ のとき、$x_2y_3 = 1500000001$ が素数なので分解できず $x_3 = y_2 = 10^9+1$ となってWAする）。
Next.jsのテスト【Jest編】

## 概要
ReactのフレームワークNext.jsで開発することになったので、勉強したことをメモ的に投稿していこうと思います。

[Next.js 公式ページ](https://nextjs.org/)  
[Jest / TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/intro-1/jest)

## テストの準備
### 1. Jestのインストール
```
$ yarn add --dev jest babel-jest babel-core babel-preset-env babel-preset-react @types/jest
```

### 2. Jestの設定
```jest.config.js
module.exports = {
    roots: ["<rootDir>"],
    transform: { "^.+\\.tsx?$": "babel-jest" },
    testPathIgnorePatterns: [
        "<rootDir>.next/",
        "<rootDir>/node_modules/"
    ],
    moduleFileExtensions: [
        "ts", "tsx", "js", "jsx", "json", "node"
    ],
    testMatch: ["**/__tests__/**/*.test.(ts|tsx|js)"]
}
```

### 3. テストの実行
```package.json
{
  "test": "jest"
}
```

## ざっくりまとめ
１. 必要なパッケージをインストール  
２. `jest.config.js`をプロジェクトのルートに追加し設定  
３. `package.json`にコマンドを追加

あとは`__tests__`ディレクトリー を作成しその直下にテストファイル`〇〇.test.ts`など作成し、jestを実行するだけ。
Pythonの各種ライブラリ一覧

# 本記事について
データサイエンスや量子コンピュータに関連するPythonライブラリをまとめてみました。

### 改版履歴
- 2019/07/23 とりあえずマニュアル一覧的な物を公開（量子コンピュータは未着手）。

# ベースコンポーネント
- Python<br>
https://docs.python.org/3/

# 科学計算ライブラリ
- Numpy<br>
https://docs.scipy.org/doc/numpy/
- Scipy<br>
https://docs.scipy.org/doc/scipy/reference/

# データ加工・可視化
- Pandas<br>
https://pandas.pydata.org/pandas-docs/stable/
- Matplotlib<br>
https://matplotlib.org/3.1.1/contents.html

# 機械学習・ディープラーニング
- scikit-learn<br>
https://scikit-learn.org/stable/documentation.html
- TesorFlow<br>
https://www.tensorflow.org/guide

# 量子コンピュータ
TBD
Flaskでincludeしたhtmlをキャッシュさせない方法

### htmlをincludeした場合にキャッシュが残りファイル更新されない場合の回避方法

以下手順でhtmlの表示が切り替わらかったため回避手順を調べた
1.pythonからtemplatesにhtml出力
2.templates内のhtmlから1のhtmlをinclude
3.1のファイルを更新し2のhtmlを再度表示
4.1で作成したhtmlが表示される(古いhtml)

### 回避方法
起動時のpyファイルに下記記述を追加する

```python
app.config['TEMPLATES_AUTO_RELOAD'] = True
```

参考
https://stackoverflow.com/questions/37575089/disable-template-cache-jinja2
pythonでAPIから情報を書き出す

#はじめに
普段はjsを使ってばかりのフロントエンドエンジニアです。
諸事情でAPIを直接叩くことができず、json管理をしなければならないのですが、
毎日jsonを直接サイトで開く→コピーorダウンロード→jsonファイルの更新
という流れが非常に面倒だな、何か一発実行するだけでできないかなと思い、実践してみました。
pythonは５年ほど前に、`print()`させた程度の知識しかないです。
今回print関数以外を初めて扱ったので、その備忘録として本記事を書いています。

##実装
・特定のAPIを叩いて情報をjsonファイルに吐き出す

```python:jsonOutput.py
#必要モジュールの読み込み
import json
import urllib
import codecs

#読み込むAPIの指定
url='apiのurl'

#APIから取得したデータをpythonのメモリに保存する
firework = urllib.urlopen(url)

#保存したデータを読み込む
read_json = json.load(firework)

#エンコードして吐き出す
with codecs.open('output.json', "w", "utf-8") as fh:
  outputData = json.dumps(read_json, indent=2, sort_keys=True, separators=(",", ": "),ensure_ascii=False)
  fh.write(outputData)

```

##最後に
そもそも、こんなことするならAPI意味ないじゃんと感じる方もいらっしゃると思います。が、業務の関係でどうしてもやらなければならなくなりました。
少しでも無駄な動きを軽減するために
コマンドを1つ打つだけで情報取得→jsonに吐き出しをして欲しかったので今回このようなタスクを作成してみました。
もっといいやり方があったり、コードでよくない部分があれば教えていただきたければと思います。
Google Edge TPUは日本で購入できます-代理店Gravitylink!

## Edge TPU
エッジで推論を行うために設計された Google の専用 ASIC。

![1_Jryu97esXxkonWBj4t62fw.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/8662e109-a0d1-8752-e742-2178ba4c9fad.jpeg)


### エッジでの AI 実行
AI は今日、コンシューマ アプリケーションからエンタープライズ アプリケーションに至るまで広く使用されています。接続端末が急激に増加し、プライバシーや機密性保持、低レイテンシ、帯域幅の制約の需要とともに、クラウドでトレーニングした AI モデルをエッジで実行することがますます必要になっています。Edge TPU は AI をエッジで実行する目的に特化して Google が設計した専用 ASIC です。小規模で低消費電力のフットプリントで高いパフォーマンスを実現し、高精度の AI をエッジにデプロイできます。

#### エンドツーエンドの AI インフラストラクチャ
Edge TPU は Cloud TPU と Google Cloud サービスを補完し、エンドツーエンド（クラウドツーエッジ、ハードウェア + ソフトウェア）のインフラストラクチャを提供することにより、お客様の AI ベース ソリューションのデプロイが簡単になります。

Google Edge TPU搭載の開発ボード「Google Coral Dev Board」を追加しました

![微信截图_20190520145825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/385f28cd-8bee-dbf0-8250-1a430e8c5f76.png)

Google Edge TPUを購入して—代理店Gravitylink!( https://store.gravitylink.com )

Coral Dev Boardは、IoTなどのエッジデバイス向けのGoogle Edge TPU (Tensor Processing Unit)搭載の
- シングルボードコンピュータです。
- SoM (システムオンモジュール) により、オンデバイス機械学習推論アプリケーションを
- 試作することができます。

`Edge TPU の利点:`
・TensorFlow Lite サポート (デバイス上で推論を短時間で実施)
・低電力
・省スペース

#### 小規模で低消費電力のフットプリントで高いパフォーマンスを実現

パフォーマンス、小規模フットプリント、低消費電力により、Edge TPU は高品質な AI をエッジに広くデプロイできます。

#### AI のハードウェア、ソフトウェア、アルゴリズムの共同設計
Edge TPU は単なるハードウェア ソリューションではなく、カスタム ハードウェアやオープン ソフトウェア、最先端の AI アルゴリズムを組み合わせて、エッジ向けの高品質でデプロイしやすい AI ソリューションを提供します。

#### 広い応用範囲
Edge TPU は予測メンテナンスや異常検出、マシンビジョン、ロボット工学、音声認識など、増え続ける産業ユースケースに使用できます。また、製造、オンプレミス、ヘルスケア、小売、スマート スペース、交通機関などにも使用できます。

Edge TPU は高品質な ML 推論をエッジにデプロイできます。Edge TPU はオープンソースの TensorFlow Lite プログラミング環境のほか、AI とハードウェアの両方で Google の専門知識を組み合わせて、最初にいくつかの Google AI モデルとともにデプロイされます。

##### Coral USB Accelerator
- Raspberry Pi や Linuxコンピュータで動作させる機械学習のためのUSB Acceleratorです。
- Googleのエッジで推論を行うために設計された Edge TPU を、対応するLinuxコンピュータに
- 接続することで、デバイス上で ML推論を実行することが容易になります。

![微信截图_20190520145835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/15137d88-0568-e417-bec0-cb82d3091ee6.png)

Google Edge TPUを購入して—代理店Gravitylink!( https://store.gravitylink.com )

##Edge TPU の機能
この ASIC は Google の AI に関する専門知識を活用し、AI の急速な進化を追跡してハードウェアに反映するロードマップの第 1 歩です。

- 推論アクセラレータ
- Edge TPU では電力効率の良い方法を使い、高解像度の動画上でフレームごとに複数の最先端の AI モデルを 30 フレーム/秒で同時に実行できます。

Edge TPU SoM やキャリアボードが含まれる開発ボードを使用して Edge TPU で構築します。ついにGoogleからエッジ向けのプロセッサ「Google Edge TPU」が発売されました。

![微信图片_20190531135353_副本.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/d39d3794-321e-18d6-4235-fd581ea5b0ea.jpeg)

##### 「Dev Board」と「USB Accelerator」は日本で購入できます!
初心者がPHPのオブジェクト指向のコードを書いてみた(2)

昨日のコードからして進捗にあまり変化はないが、コンストラクタの使い方、処理の流れが分かった気がするのでアウトプット
コンストラクタ...インスタンスを生成したときに真っ先に呼び出される特殊なメソッド。

昨日はコンストラクタに引数を入れなかった為メソッドの呼び出しが分からなかったけど、実際に入れてみて実行したら、２つ分のインスタンスにそれぞれメソッド処理してたのでようやく腑に落ちた。this->でプロパディにアクセスしてechoで出力という(ここは曖昧)仕組みになっているのかな..

課題
1...this-＞の意味をもう少し深く掘り下げて理解すること
2...インスタンスとプロパティを後３つほど使った上で、今度は普通のメソッドの定義を記述して少しだけ複雑感を出してみる
3...そろそろHTMLも交えてコードを書くこと




```
<?php
class LieF{

  //プロパディ定義、

  public $name;
  public $age;


  // コンストラクタに引数を入力
  public function __construct($name,$age){
      $this->name = $name;
      $this->age =$age;
      echo '私の名前は'.$this->name.'です。年齢は',$this->age.'歳です';

  }



}
//インスタンスを生成

$Hahakigi = new stdClass;

$Hahakigi = new LieF('帚木日向子',22);
echo '<br>';
$Nitta = new LieF('新田司',23);
echo '<br>';

$Hahakigi->age ='22';
$Nitta->age ='23';


?>
対象githubアカウントの、全てのリポジトリから、指定したCollaboratorsを削除する。

# 対象githubアカウントの、全てのリポジトリから、指定したCollaboratorsを削除する。

こんにちは,[Rin](https://twitter.com/RinstarskyKujat)と申します。  
今回は、githubアカウント内の全てのリポジトリから同一Collaboratorsを一括削除するスクリプトを作成しました。 <br>社内共有しているアカウントからメンバーの離脱があった場合などに有効かと思います。<br>（自分が退職するので、Collaboratorsを手動で外すのが面倒で作成しましたw）  
  

詳しくはこちらの[Github](https://github.com/TakuyaTaniguchi/removeGitCollaborators)をご確認ください。

## 全体像

```php:remove.php

 /**
     * GLOBAL
     * gitアカウントのメールアドレス
     * ログインパスワード
     * githubのアカウント名
     * 削除したいユーザー
     * を入力してください。
     */
    $Email = '';
    $PASS = '';
    $USER = '';
    $DELTE_USER = '';


    /**
     * 下記のAPIを実行し、api.jsonを作成してください。別途アクセストークンが必要です。
     * curl  "https://api.github.com/user/repos?access_token={token}&per_page=100&page=1&sort=created" > api.json
     */
    
    $url = './api.json';
    $json = file_get_contents($url);
    $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
    $arr = json_decode($json,true);
    echo $count = count($arr);


    for ($i = 0; $i < $count; ++$i) {
        $repoName = $arr[$i]['name'];

        $cmd = "curl -X DELETE -u $Email:$PASS 'https://api.github.com/repos/$USER/$repoName/collaborators/$DELTE_USER'";
        echo $repoName;
        echo exec($cmd);
    }

```


## 使い方

まず始めにGithubの[setting](https://github.com/settings/tokens)からAPIKEYを作成します。<br>その際にSelect scopesのrepoをチェックしておいてください。
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273658/1b4b6927-369f-2eb9-9814-65414778701d.png)  

アクセストークンを入手したら下記コマンドを実行しapi.jsonを作成します。  

```shell:.bash
curl  "https://api.github.com/user/repos?access_token={token}&per_page=100&page=1&sort=created" > api.json
```
remove.phpの変数を指定します。    

```php:remove.php
$Email = 'hoge@gmail.com';
$PASS = 'password';
$USER = 'MYACCOUNT';
$DELTE_USER = 'user_id';
```

remove.phpを実行します。  

```shell:.bash
php remove.php
```

## 留意点

- リポジトリは最大で、100個までしか取得できないようです。<br>100個以上のリポジトリを取得する場合は、下記の様に別途追加のjsonファイルを生成し、<br>ファイルを指定して再度PHPを実行する必要があります。  
  
```shell:.bash

curl  "https://api.github.com/user/repos?access_token={token}&per_page=100&page=2&sort=created" > api_2.json

```

```php:remove.php
$url = './api_2.json';
```

- organizationアカウントについて  
このスクリプトは通常のuserアカウントで動作を保証していますが、おそらく、<br>
下記のAPIを使用すれば同様のことが可能だと思います。(検証はしておりません。)  
参照: [GitHub Developer](https://developer.github.com/v3/repos/#list-organization-repositories)

```shell:.bash

curl  "https://api.github.com/orgs/repos?access_token={token}&per_page=100&page=1&sort=created" > api.json

```

## ハマりどころ
アクセストークンを使用した場合、-uオプションなどで、ユーザを指定する必要ありません。<br>(むしろ指定すると、うまく取得できませんでした。)  

kubectl apply時のwarn調査

￼
## 気になった警告
kubectl apply時に

```bash

Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
```
というWARNが出現することがあるので原因を調査。
なお設定ファイルの変更はできているので結果に影響はない。
WARNの意味は「kubectl applyコマンドは『kubectl create --save-config』または『kubectl apply』で作成されたリソースに対して実行しなさい」

## 結論
設定ファイルを「kubectl create」で作成していて、作成から初めて実行した「kubectl apply」だったため。
 
## 調査
### kubectl applyの挙動
kubectl applyは、変更する設定ファイルに対し「過去（前回）」「現在」「未来（適用しようとしているもの）」の3つの設定の状態から差分を計算し、反映する。
「過去」の設定は「現在」の設定のannotationに保存されている。 ￼
<img width="400" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/b6de9c33-0f81-c193-11d0-0ad7b67815a2.png">
 
### create → applyしたとき
「kubectl create」で設定ファイルを新規作成すると、annotationの無い設定が作成される。

```
kubectl create -f my-sevice-secret.yaml
```
この新規作成したファイルに変更を反映するため「kubectl apply」を実施する。

```
kubectl apply -f my-sevice-secret.yaml
```
するとannotationが無い＝「過去」の探索ができず、「現在」と「未来」の2つの状態からしか差分を作れない。
ここで先のWARNが表示される。
<img width="400" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/381be5f6-ffd5-541a-1bf9-d73ff9fef90e.png">

### WARNの意味
「kubectl create」に「--save-config」オプションをつけると、作成した「現在」の状態の設定をannotationに保存する。
よって、「kubectl apply」で変更を反映しようとしたときも「過去（実際は現在）」「現在」「未来」の3方向全てから差分を作成できる。

```
kubectl create -f my-sevice-secret.yaml --save-config
```
 
または、「kubectl apply」（edit, replaceなども）は自動的にannotationを保存するので、applyコマンドで新規に作成しても結果は同じになる。

```
kubectl apply -f my-sevice-secret.yaml
```
WARNは「kubectl applyコマンドは（過去・現在・未来3つともから差分を計算するために）『kubectl create --save-config』または『kubectl apply』で作成されたリソースに対して実行しなさい」という意味（だと思います）
<img width="400" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63732/0c6a30ca-a536-c5b6-830e-cb8817f360d6.png">
￼
## 回避方法
新規作成時に以下のどちらかで実行すること
もしオプションを付け忘れたcreateで作ってしまっても、warnが出るだけなので特に影響はないはず

```bash

# applyなら自動的にannotationが生成される
$ kubectl apply -f my-sevice-secret.yaml

# --save-configオプションでannotationに現在の設定を保存する
$ kubectl create -f my-sevice-secret.yaml --save-config
```
 
## 関連記事・参考
https://kubernetes-v1-4.github.io/docs/user-guide/kubectl/kubectl_create/
https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#kubectl-apply
ユーザエージェントでの iPad 判定関数 iOS/iPadOS 対応版

## 追記 2019-09-03

@BYODKM さんから、簡潔に iPad か否かを判定するプロパティを教えていただきました。ありがとうございました。（実機 iOS12, iPadOS の iPad にて確認済みです）

下記のコードで iOS12 と iPadOS どちらでも iPad か否かを判定できます。

```JavaScript
const ua = window.navigator.userAgent.toLowerCase();
const isiPad = ua.indexOf('ipad') > -1 || ua.indexOf('macintosh') > -1 && 'ontouchend' in document;
```

iPhone も含めた iOS 端末か否かを判定する場合は下記になります。

```JavaScript
const ua = window.navigator.userAgent.toLowerCase();
const isiOS = ua.indexOf('iphone') > -1 || ua.indexOf('ipad') > -1 || ua.indexOf('macintosh') > -1 && 'ontouchend' in document;
```

macOS か否かの場合は下記です。追記 2019-09-24

```JavaScript
const ua = window.navigator.userAgent.toLowerCase();
const isMac = ua.indexOf('macintosh') > -1 && !('ontouchend' in document);
```

## 概要

- iPadOS は 2019 年秋にリリース予定の iPad 用 OS
- iPadOS Public Beta 版では macOS Safari と同一のユーザエージェントを返すためサーバサイドでは判定が困難
- iPad の解像度が固定であることから、解像度で iPad か否かを判定します
- （アプリケーションのウィンドウではなく）画面の解像度を取得しているため、スプリットビュー表示（画面分割表示）でも問題ないはず（未検証）

## PHP や Rails などのサーバサイドで判定するためには

- このスクリプトで Cookie にデバイスの種類を入れていただければ OK です
- Cookie の他 URL の末尾に `?device=ipad&os=ipados` を付与して、リダイレクトでもよいと思います。
  - 実際にはクエリやハッシュに対応するため location.href のクエリ部分を置換するか `location.pathname + location.search + '&device=ipad&os=ipados' + location.hash` のように、改めて URL を作ったほうがよいです（クエリが先で、ハッシュが後）

```JavaScript
// リダイレクトする URL を組み立てる例
const url = location.protocol + '//' + location.host + location.pathname + location.search + '&device=ipad&os=ipados' + location.hash;
```

## iOS/iPadOS 対応版 iPad 判定関数

記事が冗長なため、当初のコードを削除しました。前述のコードを推奨します。

## その他

- IE 対応が必要な場合は let/const の記述を var に置換してください
- iPadOS 正式リリース後 iPadOS 版 Safari が iPad の文字列を含む、適切な UA を返してくれれば、このスクリプトは不要です
PHP Storm Tips

## PHP Stormで役立つコマンド集
見つけたらどんどん追記する。Macで想定。

### なんでも検索
`shift + shift`

### 最後に編集した部分へ飛ぶ
`command + shift + del`

### 選択した部分を一気に大文字<=>小文字に変換
`command + shuft + u`

### セミコロンとか、配列の閉じタグとかを勝手に入力させる
`command + shift + enter`

### Class名で検索
`command + o`

### シンボル名で検索
`option + command + o`

### ファイル名で検索
`shift + command + o`

### アクション名で検索
`shift + command + a`

### 検索コンボ技
`shift + shuft`
を行って、
`command + shift + [ or ]`
をやると、タブ移動もできる。

### 画面左のプロジェクトに遷移
`command + 1`
プロジェクトにフォーカスされているときに実行すると閉じる

### 画面下に出てくるvertionコントローラーを表示
`command + 9`
もう一度実行すると閉じる

### 最近開いたファイル一覧モーダルを表示
`command + e`

### 最近編集したファイル一覧表示と編集箇所表示
`command + shift + e`

### 現在開いているファイルやterminalなどを行き来する
`ctrl + tab`

### ターミナルに移動する
`ctrl + tab + t`

`ctrl + tab` で開いた項目の横に書いてあるアルファベットを `ctrl + tab + d` などのように
実行すると、そこに移動する

### 定義箇所へ移動
`command + b`

### 使用箇所一覧モーダルを表示
対象メソッドやクラスにフォーカスされた状態で、 `command + b`

### ファイル内の特定の行へ飛ぶ
`command + l` => 行番号を入力

### 全体検索
`command + shift + f`

### 全体検索アンド置換
`command + shift + r`

### sqlの整形
`command + option + l`
NavMeshが若干浮いてしまう時の対処法

# 問題

あるオブジェクトに対してNavMeshを張る時、そのオブジェクトからNavMeshが微妙に浮いてしまう。

---

斜め上から普通に見た時は全く気にならないのですが、

<img width="563" alt="スクリーンショット 2019-07-23 午後2.57.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/a5c1876e-9294-94cb-f541-c27346a5d7cb.png">




このように横から見るとNavMeshとオブジェクトの間に隙間が生まれているのが分かると思います。

<img width="594" alt="スクリーンショット 2019-07-23 午後2.57.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/3e8ae914-f36a-3ff2-a39c-0d89543d9aad.png">

# 原因

NavigationウィンドウのBakeタブにあるAgent Heightが大き過ぎる時にこのようなことが起こるみたいです。

```
The NavMesh may not be generated properly as the ratio between Agent size and voxel size is large. Try setting voxel size to larger than 0.394.
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
```

<img width="474" alt="スクリーンショット 2019-07-23 午後3.22.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164430/0fe8608a-7035-8477-5fe9-798a08d0ab6f.png">


# 解決法

以下のどちらかの方法が有効だと考えられます。

- Agent Heightを小さくする

- Manual Voxel Sizeにチェックを入れ、Voxel Sizeを大きくする