OmniAICreator/Qiita-1.07M huggingface dataset:
EmbulkとFake-s3とDockerの組み合わせ

#概要
Embulkを使用して、ローカル環境にあるファイルを取り込んでいたが、そのファイルをs3から取り込む必要が出てきた。開発環境で実際のs3を使うのが良い手ではないため、fake-s3を使うことにした。
Dockerの中のfake-s3の設定とEmbulkのs3プラグインの設定を本記事に記載しておきます。

#Fake-s3
Fake-s3とは？
https://github.com/jubos/fake-s3
>Fake S3 is a lightweight server that responds to the same API of Amazon S3.

APIがほぼ一緒。実はAWS CLIでの操作も可能。

さて、Dockerのコンテナを作って、そこでfake-s3を起動させる。

**fake-s3の最新バージョンはLicenseが必要。（有料）**

お金がもったいないためもっと低いバージョンをインストールする

```
RUN gem install fakes3 -v 0.2.5
```

fake-s3のルートディレクトリーが必要なので、それを作成する

```
RUN mkdir -p /fakes3_root
```

/fakes3_rootのしたにあるディレクトリーがバケットになるので（下記のように）、事前に作っといても良い。

- fakes3_root
 - bucket_name_1
 - bucket_name_2

```
RUN mkdir -p /fakes3_root/test_bucket
```

最後は下記のラインをDockerfileにたす。ルートとポートを指定してfake-s3を起動させる

```
# run s3
CMD [ "fakes3", "-r", "/fakes3_root", "-p", "4567" ]
```

接続できるようにポートを開ける必要がある (docker-compose用)

```
expose:
   - 4567
ports:
   - 4567:4567 
```

これでコンテナを起動して、ブラウザーから http://127.0.0.1:4567 をアクセスすると、XMLが表示される

```
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>123</ID>
<DisplayName>FakeS3</DisplayName>
</Owner>
<Buckets>
<Bucket>
<Name>bucket_name_1</Name>
<CreationDate>2019-06-24T08:54:00.000Z</CreationDate>
</Bucket>
<Bucket>
<Name>bucket_name_2</Name>
<CreationDate>2019-06-24T08:54:00.000Z</CreationDate>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
```

これでfake-s3が動いている状態。API又はCLIを使って、ファイルをアップロードすることが可能。

###注意点
- コンテナをビルドする前にバケットの下にファイルを置いといても、それが認識されない。fake-s3を起動してからファイルをアップロードするしかないみたい。
- コンテナの中でAWS CLIをインストールして、gzipファイルをアップロードしようとするとエラーになる。（エラー内容がおかしい (Syntax error)、おそらくfake-s3のバージョンが最新ではないのが原因）自分はコンテナの外からアップロードするようにした。

#Embulk
s3からファイルを取り込むプラグインが存在する。それがembulk-input-s3というプラグイン。
https://github.com/embulk/embulk-input-s3

実際のs3とfake-s3、どちらを使っても設定はほとんど一緒だがfake-s3が認証を問わない。AccessとSecret Keyの値はなんでも良い。
そして今回faka-s3が別のコンテナで動いているからproxyを設定する必要がある。

Embulkのyml.liquidファイルの設定が下記になる

```
in:
  type: s3
  bucket: {{ bucket }}
  path_prefix: {{ path_prefix }} 
  endpoint: {{ endpoint }} 
  auth_method: anonymous
  http_proxy:
    host: fake-s3
    port: 4567
```

bucket: 自分のバケット名
path_prefix: お好きにどうぞ
endpoint: はfake-s3の場合に http://fake-s3:4567 になる
host: fake-s3 は自分のコンテナの名前
auth_method: basicの場合はAccess/Secret Keyはなんでもいい、anonymousもそのまま動く。ただし、instanceを設定してみた時は unable to load credentials というエラーが出た。インスタンスのメソッドを諦めた。


#おまけ

これでとりあえずEmbulkで別コンテナからS3プラグインを使ってファイルを取り込むようになった。
問題は色々あったが、それは多分バージョンが低いのが原因。
無料でローカルでシミュレーションができたからよしとする。
CentOS環境のパッケージを別のCentOS環境にまとめてコピー

#概要

CentOS環境にインストールされているパッケージを、別のCentOS環境にもインストールしたいときに実施したことのメモ。

#手順
######1.「コピー元」で以下のコマンドを実行する

```
$ rpm -qa --qf "%{NAME}\n" | sort > old_packages.txt
```
インストール済みパッケージ一覧をソートして`old_packages.txt`に出力する。

######2.`old_packages.txt`をscpコマンドで「コピー先」の環境に転送する
・リモートからローカルへコピー

```
$ scp username@remote.example.com:/remote/directory/old_packages.txt /local/directory
```

・ローカルからリモートへコピー

```
$ scp old_packages.txt username@remote.example.com:/remote/directory
```

######3.「コピー先」で以下のコマンドを実行する

```
$ rpm -qa --qf "%{NAME}\n" | sort > new_packages.txt
```
######4.「コピー元」と「コピー先」の差分を出力する
以下のコマンドを実行すれば、「コピー元」にインストールされていて、「コピー先」にはインストールされていないパッケージの名前が`packages_diff.txt`に出力される。

```
$ diff old_packages.txt new_packages.txt | grep "^<" | cut -d ' ' -f 2 > packages_diff.txt
```

######5.`packages_diff.txt`を確認し、不要なパッケージを削除する

######6.「コピー先」でパッケージをインストールする
以下のコマンドを実行すれば、まとめてパッケージをインストールできる。

```
$ yum install $(<packages_diff.txt) -y
```

#参考文献
https://linuxfan.info/post-3077
simplecovでデフォルトのタブを消す方法


## 結論

spec/rails_helper.rbにgroups.clearを記述して1つづつ再定義しよう

## 環境

Ruby 2.3.7
Rails 4.2.5
simplecov 0.16.1
rspec-rails 3.4.2


## やりたい事

simplecovのデフォルトグルーピングを削除したい。
（うちはMailers、Jobsとか殆ど使ってないんで無くしたい。）

### これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319254/27138438-f700-17f5-8b6a-1fa5ce5047d5.png)

### こうしたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319254/d22a0c9a-890e-0d14-21d0-d080721cac29.png)

## やり方

### 以下のファイルを編集しよう

spec/rails_helper.rb

```
  SimpleCov.start :rails do
    groups.clear # 一旦全定義をclear
    # グルーピングしたい定義を1つづつ再定義
    add_group 'Controllers', 'app/controllers'
    add_group 'Models', 'app/models'
    add_group 'Helpers', 'app/helpers'
    add_group 'Libraries', 'lib/'
    # 集計除外したい場合はfilterにぶち込もう
    add_filter %w[app/services app/jobs]
  end
```
### デフォルトのタブは以下で定義されている。（これは編集しない）

.bundle/ruby/2.3.0/gems/simplecov-0.16.1/lib/simplecov/profiles/rails.rb

```
# frozen_string_literal: true
[SimpleCov.profiles.define "rails" do
  load_profile "test_frameworks"

  add_filter %r{^/config/}
  add_filter %r{^/db/}

  add_group "Controllers", "app/controllers"
  add_group "Channels", "app/channels" if defined?(ActionCable)
  add_group "Models", "app/models"
  add_group "Mailers", "app/mailers"
  add_group "Helpers", "app/helpers"
  add_group "Jobs", %w[app/jobs app/workers]
  add_group "Libraries", "lib/"

  track_files "{app,lib}/**/*.rb"
end](url)
```
並列処理学習６－本当の意味での並列性

Pythonで、CPUを複数使用した複数スレッドによる実装を行うために用意されているのものがある。
それが、concurrent.futuresから利用できるmultiprocessingモジュール。

複数CPUでの処理が可能となり、子プロセスを並列処理として扱うことが出来る。
GILは、プロセスごとに適用されるため、CPUの利用を完全に個別に扱うことが可能となる。
プロセスはリンクを持つので、データの受け渡しも可能。

# concurrent.futures
multiprocessingを拡張し、扱いやすくしたモジュール。
multiprocessingのみ使用しようとすると、とても複雑な処理を行う必要がある。

特別理由がなければ、concurrent.futuresのThreadPoolExecutorを利用すると良い。
速度向上を求めたいのであれば、ProcessPoolExecutorの利用も検討する。
上記の判断は、処理の分離具合と、やりとりするデータ量を鑑みて判断するのが良い。

どうしてもさらなる高速化が必要ならば、multiprocessingモジュールを利用を検討する。

[まにゅある](https://docs.python.org/ja/3/library/concurrent.futures.html)
マイクロサービスでは環境によって変わる変数は環境変数を直接書いた方が良いと思ったという話

## About

タイトルだけを見ると何を当たり前の事をと思われると思いますが
Ruby on Railsではdevelopmentやproductionでの変数を切り替える方法がいくつかあります。

#### プログラム内で分岐する
```Ruby
def switch_var
  case Rails.env
  when 'production' then 'var of production'
  when 'development' then 'var of development'
  else 'default var'
  end
end
```
こんなコードを書いている人もいると思います。
私も昔書いていましたが、何度か変数の変更が入ると変更すべきコードを探すのが億劫になります。

#### dotenv-rails
https://github.com/bkeepers/dotenv
.envファイルを読み込む事で各環境での変数を定義します。
ただ、.envはgitへのコミット非推奨な割に
dotenvとrailsが密になってしまいstaging環境やproduction環境を構築する際に窮屈さを感じました。
ただ、ローカル環境においてはdocker-composeと.envを組み合わせるという方法はアリだと思います。

#### config設定用のgemを利用する
- [EasySettings](https://github.com/nownabe/easy_settings)
- [Chamber](https://github.com/thekompanee/chamber)
- [RailsConfig](https://github.com/railsconfig/config)
- [configatron](https://github.com/markbates/configatron)

他にも色々ありますが、yamlでconfigを管理する様なgemがあります。
それなりに便利なので一時期使っていましたが、
結局gemに依存するとメンテナンスコストもかかってしまうので
特にマイクロサービスレベルでの環境変数程度で有ればgemは不要だと私は思いました。

## 環境変数をアプリケーションに渡す

#### test, development環境
Docker前提で作っているのでdocker-composeで渡します。
CI上でもdocker-compose.ymlを専用に作っておいてそちらを利用しています。

```
version: '3'
services:
  web:
    environment:
      - RAILS_ENV
      - RACK_ENV
      - AWS_BUCKET_NAME=xxxx
      - AWS_ACCESS_KEY_ID=xxxx
      - AWS_SECRET_ACCESS_KEY=xxxx
```
何も書かないとhostの環境変数が使われます。


#### production環境

マイクロサービスをTerraformで定義しています。
ECSのタスク定義で渡します。

```ecs.tf
resource "aws_ecs_task_definition" "task" {
  container_definitions = data.template_file.service_container_definition.rendered
}

data "template_file" "service_container_definition" {
  template = file("./templates/container_definitions.json.tpl")
}
```

```container_definitions.json.tpl
[
  {
    "environment": [
      {
        "name": "RAILS_ENV",
        "value": "production"
      },
      {
        "name": "RACK_ENV",
        "value": "production"
      },
      {
        "name": "AWS_BUCKET_NAME",
        "value": "xxxx"
      },
      {
        "name": "AWS_ACCESS_KEY_ID",
        "value": "xxxx"
      },
      {
        "name": "AWS_SECRET_ACCESS_KEY",
        "value": "xxxx"
      }
    ]
  }
]
```

実際にはアプリケーションケーションの規模によって
最適なツールが有るのかも知れませんが
マイクロサービスにおいてはこういう形で渡した方が見通しも良くなっていると思いました。
go moduleを導入した時にinttelijで設定する事

## 背景
gomoduleを入れてからintellijで「モジュールが見つかりません」的なエラーが出るようになった。
go getをしても下記のようなエラーが出る。

```
$ go get github.com/xxxxd/xxxxxd
go get: warning: modules disabled by GO111MODULE=auto in GOPATH/src;
        ignoring go.mod;
        see 'go help modules'
```

## どうすれば良いか
go moduleでインストールされたパッケージは$GOPATH/pkg/に置かれるらしい。

なのでパッケージを読み込んでいる場所を変えてあげる必要がある。

preferences > 言語 & フレームワーク > Go > Go module(vgo) 
で下記のチェックボックスを入れるとちゃんと読み込んでくれる様になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270608/2a780507-b8ab-888c-cbe0-1646b5cc8b1e.png)

## 参考
- [Go Modules](https://qiita.com/propella/items/e49bccc88f3cc2407745)
- [intellij で go module の設定を行う](https://ema-hiro.hatenablog.com/entry/2019/04/12/020646)
Swift 動画撮影をlandscape(横向き)で




#AVCaptureMovieFileOutputの設定
まず，　ファイル出力の設定時点で，向きを変更可能にします。(デフォルトは変更不可)

```swift
captureSession.addOutput(videoFileOutput)
let videoDataOuputConnection = videoFileOutput.connection(with: .video)
videoFileOutput.setRecordsVideoOrientationAndMirroringChangesAsMetadataTrack(true, for: videoDataOuputConnection!)
```



録画開始時にファイル出力の向きをデバイスの向きに合わせます。

```swift
let videoDataOuputConnection = videoFileOutput.connection(with: .video)
let orientation = UIDevice.current.orientation
videoDataOuputConnection!.videoOrientation = AVCaptureVideoOrientation(rawValue: orientation.rawValue)!
```

参考：
[How to record landscape video in a portrait application? (Swift 2, iPhone)
](https://stackoverflow.com/questions/38072441/how-to-record-landscape-video-in-a-portrait-application-swift-2-iphone/38077058#38077058)

#表示映像の設定

回転した際に向きを取得します。

```swift
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition(
        nil,
        completion: {(UIViewControllerTransitionCoordinatorContext) in
            //画面の回転後に向きを教える。
            if let orientation = self.convertUIOrientation2VideoOrientation({return UIApplication.sharedApplication().statusBarOrientation}) {
                videoPreviewLayer?.connection.videoOrientation = orientation
            }
        }
    )
}


func convertUIOrientation2VideoOrientation(f: () -> UIInterfaceOrientation) -> AVCaptureVideoOrientation? {
    let v = f()
    switch v {
        case UIInterfaceOrientation.Unknown:
            return nil
        default:
            return ([
                UIInterfaceOrientation.Portrait: AVCaptureVideoOrientation.Portrait,
                UIInterfaceOrientation.PortraitUpsideDown: AVCaptureVideoOrientation.PortraitUpsideDown,
                UIInterfaceOrientation.LandscapeLeft: AVCaptureVideoOrientation.LandscapeLeft,
                UIInterfaceOrientation.LandscapeRight: AVCaptureVideoOrientation.LandscapeRight
            ])[v]
    }
}

```

参考：
[Swift - iOSでビデオカメラを使用時、端末の向きに対応](https://qiita.com/flowtumn/items/9ad3c5554e5ade62a4eb)
複数の不必要なファイルを消すコマンド

uxix コマンドの備忘録です。

名前・場所のわかっている不必要なファイルがある場合、ファイルに書いてそれらをrm コマンドで消すやり方です。



temp.txt というファイルにファイル名を書きます。以下のような状態

```bash
cat temp.txt
/usr/local/include/hogehoge.h
/usr/local/include/test.h
```

この状態で、以下を実行するだけで、削除したいファイルが消せます。

```bash
xargs rm < temp.txt
```
Android Studio からエミュレータを実行できないとき（一時的な対処）

# 対象
Andoroid Studioでソースを記述。
実行(U) - 実行(U)
を選択して以下のようなエラーがビルド出力に出てエミュレータが起動できないときの対処を記述します。

```
Invalid escape sequence at line 1 column 28 path $[0].name
```

# 対処
## build.gradleを開く
プロジェクト中にあるbuild.gradleをエディタで開きます。

```Gradle:build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

```
こちらのclasspath 'com.android.tools.build:gradle:3.4.1'のバージョンを3.2.1に変更します。
バージョン自体はお使いのAndroidStudioに依存します。

```Gradle:build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

```

保存して再度
実行(U) - 実行(U)
を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165632/eebd68b1-53d7-cf0e-aaa4-c7b9de2d2d2d.png)

上記のようなダイアログが表示されますので「明日に通知」か「このプロジェクトでは確認しない」を押してください。

「更新」をクリックすると再びcom.android.tools.build:gradleのバージョンが最新に変更されます。
一度は起動するのですが、再度実行時にエラーとなります。


根本的な対処はまた後日。
並列処理学習５－平行実行はコルーチンを使用検討

スレッドにより、複数の関数を、見た目上ではあるが、同時に実行することが出来のがPython。

しかし、スレッドにはいくつか問題がある

# 問題
以下の３つが存在する
### 安全な協調性
互いの安全に動作させるには、Lock()だったりQueueの利用といった、特別な処理をほどこさなくてはならず、ソースが複雑化してしまい、協調性として安全とは言えなくなる。

### 使用メモリの肥大化
スレッドは、１つの実行に8MBもメモリが必要となってしまう。
数えられないほどのスレッド数を利用することになってしまったら、システムエラーの温床となってしまう。

### スレッド利用コスト
逐一、処理用関数を起動し、終了させるとなると、スレッド利用にオーバーヘッドが発生してしまうい、処理の低速化へ繋がってしまう。

# 解決策
上記問題には、コルーチンを使用することで回避できる。
コルーチンであれば、プログラム内で、複数の関数を擬似的に動かせる。

コルーチンは、ジェネレータの拡張機能として実装されており、コルーチンの起動は関数呼び出しだけで済む。
また、使用するメモリは、1KB以下しか消費せず、パフォーマンスの向上へつながる。

# コルーチン作成方法
以下の実装が必要となる
- コルーチンとして実行できるよう、yield式進行を許容する関数（コルーチン）を実装
- next()、send()関数を用いて適切に実装

# コルーチン
永遠に実行され続けるジェネレータにて、処理を適時実行できる。
独立した処理として扱える。
スレッドとは異なり、必要に応じてyeild式を実行時にのみ処理を行えるようになる。
yieldを適切に利用して、多くの処理を並行処理的振る舞いをさせることが出来る。
このように、コルーチンはとても素晴らしい機能なのだ。
Mac でスクリーンショットを撮る方法

Mac でスクリーンショットを撮る方法を何度調べても忘れる。

ちょっと記録。


Mac でスクリーンショットを撮る方法
https://support.apple.com/ja-jp/HT201361
>macOS Mojave にアップグレードしている場合は、「shift + command (⌘) + 5」キーを押して、全種のスクリーンショットを撮影したり、画面上の映像を収録したりできます。ほかのキーボードショートカット (「shift + command + 3」「shift + command + 4」など) も引き続き、すべてのバージョンの macOS で機能します。

#shift + command (⌘) + 5
macOS Mojave
#shift + command + 3
全画面取得

ファイルはデスクトップに

#shift + command + 4
範囲を指定して取得

ファイルはデスクトップに
なぜかActiveRecord::RecordNotUniqueで怒られる

#状況
rails初心者です。
railsでdeviseを使ってログイン機能を作った際に新規登録のUIを変更し実行した際に
**ActiveRecord::RecordNotUnique**で怒られた。
#原因
主な原因はテーブルのindexにありそうでした。

```ruby:db/schema.rb
#~~省略
t.index ["username"], name: "index_users_on_username", unique: true
t.index ["nil"], :name "index_users_on_name", unique: true

```
このようにnilに対してのインデックスがなぜに出来たのかもどのような効果があるのかもはっきりとは分かっていませんが用意されていました。
#解決策
直前に'username'というカラムを追加していました。
そこで一旦

```
$ rails db:rollback
```
テーブルを１つ前の状態に戻し

```
$ rails db:migrate
```
migrateし直した結果見事にnilに対してのindexは削除されていました！
#終わりに
nilに対してのindexをremove_indexで消す方法もありなのかなと思いましたがあんまりやり方が分からず今回のやり方でうまくいったのでよしとしました。
どうしてnilに対してのindexが作られていたのかあんまり分かっていないのでどなたか詳しい方教えていただけたら嬉しいです。
【IFTTT】いいねしたツイートを自動でSlackのチャンネルに送信されるようにする

#概要
Twitterでいいねしたツイートを自動でSlackに投げるようにする．

[IFTTT](https://ifttt.com/)を使います．

ノンコーディングなのですごく簡単です．
ポチポチするだけです．

#手順
1. IFTTTアカウント作成
2. 新規アプレット作成
3. THISにTwitterを選択
4. THATにSlackを選択
5. いいねする
6. 寝て待つ

#1. IFTTTアカウント作成
[IFTTTのページ](https://ifttt.com/
)でアカウントを作ります．

#2. 新規アプレット作成
こういうボタンを見つけて押す
<img width="177" alt="スクリーンショット 2019-06-25 11.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/724921e5-d489-8c60-4994-445b058bee4c.png">

#3. THISにTwitterを選択
thisを押す.
<img width="774" alt="スクリーンショット 2019-06-25 11.12.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/910aef71-fb1f-5dc3-ce1d-313bbdc8b3f5.png">

Twitterを選択する．
<img width="818" alt="スクリーンショット 2019-06-25 11.12.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/4f2a7b13-0726-4d01-39d4-b0e0214da999.png">

これを押す．
<img width="319" alt="スクリーンショット 2019-06-25 11.12.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/b7215f27-937f-fdc6-2965-caac6ba31e61.png">


#4. THATにSlackを選択
thatを押す．
<img width="695" alt="スクリーンショット 2019-06-25 11.13.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/85999405-5547-29e2-8af9-646108f75c46.png">

Slackを選択する．
<img width="761" alt="スクリーンショット 2019-06-25 11.13.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/18a854a4-6294-b8d0-5fdb-78e52421c462.png">

これを押す．
<img width="318" alt="スクリーンショット 2019-06-25 11.13.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/d84638a9-33e3-7bd9-6952-34d0fa31dd3f.png">

送信するチャンネル設定と送信する時の内容設定をする．
<img width="257" alt="スクリーンショット 2019-06-25 11.16.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390000/5dd03b2d-1aa9-093c-0e03-66acbd011985.png">

#5. いいねする
Twitterで適当にいいねする．

#6. 寝て待つ
20秒くらいしたらSlackチャンネルに投稿されます．


# Happy Hacking :sunglasses: !
wordpressにmarkdown形式で投稿するための設定

# 背景
- qiitaと会社ブログの両方に投稿したい
- wordpressでタグなんか書きたくないしリッチエディターも最悪

# やりたいこと
- qiitaに投稿したmarkdownから内容コピペでwordpressに投稿したい
- ソースコード部分はqiitaやgithubのように綺麗に表示したい

## 環境
- wordpress 5.2.2
- Crayon Syntax Highlighter 2.8.4
- WP Githuber MD 1.11.5

# 手順

## 流れ
環境欄でほぼすべてを語ってしまっていますが…

1. WP Githuber MDプラグインをインストール
2. Crayon Syntax Highlighterプラグインをインストール

## WP Githuber MDプラグインをインストール
1. プラグインの新規追加ページでWP Githuber MDを検索してインストール＆有効化
2. プラグイン > WP Githuber MDで各種設定（ここでは特に設定をいじらなくても大丈夫なはず）
3. 試しにqiitaからコピペしてwordpressに投稿してみる

→ だいたい綺麗に表示されるが、肝心のソースコードがNG
→ 「```」で囲まれた文字列内のXMLのタグがエスケープされていないので、\<properties>のようなXMLタグがブラウザの画面上に表示されない

# Crayon Syntax Highlighterプラグインをインストール
1. プラグインの新規追加ページでCrayon Syntax Highlighterを検索してインストール＆有効化
2. 設定 > Crayonで各種設定（ここでも特に設定をいじらなくても大丈夫なはず）

→ wordpressの該当投稿ページを表示
→ 綺麗に出来た！

# 結論
- markdownのプラグインだけで綺麗にできるかと思いきやプラグインが別途必要でした
- WP Githuber MDにもタグエスケープするような設定がありましたが、自分の環境では動かず…
c++ の二分法について

f(θ)=0.245cosθ-0.098/(cosθ)^2=0となるようなθの値を二分法によって解析し、求めたθを
g(θ)=-0.245sinθ+0.196sinθ/(cosθ)^3に代入しg(θ)が正になるか、負になるかを調べたいのですがどのようにコードを書けばいいでしょうか？
また、θの角度は0≦θ≦πです。
firebase functionsとSlack coustom slash commandとSlack appで適当になんかして表示する

# 準備
firebaseでプロジェクトを作りましょう、適当で大丈夫です。
以下を実行して適当なプロジェクトでアレします。
今回は適当なのでjsを選択します。

```
firebase init functions
```

# Slack coustom slash command
なんかよくわからんけど、カスタムコマンドが設定できます。
[この辺](https://api.slack.com/slash-commands) 見れば分かると思うよ。
適当なのを設定しておきます。
実行するとAPIリクエストします。今回はFirebase functionsのURLにPOSTします。

# Slack App
Firebase functionsからリクエストして適当なチャンネルにpostするために使用します。
Incoming Webhooksって言うんか、よく知らんけど。
[この辺](https://api.slack.com/incoming-webhooks) 見とく。

# コード
```index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const axios = require('axios');

const URL = 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXXXXXXXXXXX';

admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
exports.postSlack = functions.https.onRequest((req, res) => { 
  try {
    if(req.method === 'POST'){
      let user_id = req.body.user_id;
      let now = new Date();
      let dateString = `${now.getFullYear()}-${('0' + (now.getMonth() + 1)).slice(-2)}-${('0' + now.getDate()).slice(-2)} ${('0' + now.getHours()).slice(-2)}:${('0' + now.getMinutes()).slice(-2)}:${('0' + now.getSeconds()).slice(-2)}`
      db.collection('hoge').doc(user_id).get().then(
        (doc)=> { 
            if(doc.exists){
              //前のデータと見比べてなんかする
              res.status(200).send('ok');
            }else{
              //そのユーザーのアレがないのでなんかする
              res.status(200).send('ok');
            }
        }).catch( 
          (error)=> {
            console.log("Error getting document:", error);
            res.status(200).send('ok');
        });
    }else{
      throw new Error('only post method is accepted');
      res.status(200).send('ok');
    }
  }
  catch (error) {
    console.error('error');
    res.status(500).send(error);
  } 
});
```
`なんかする`

### その他
なんかNodeのバージョンで頭を抱えたので適当に固定しとく

```package.json
{
  ...
  engines:{
  "node": "8"
  },
  ...
}
```

`なんか` `適当`
Vueで複数条件(and,or,フリーワード)の絞り込みを実装する

# まずはサンプル
https://kackie.github.io/sort/vue.html

機能の違いが多少ありますが、下記記事のVueJS版になります。
[jQueryを使った複数条件(and,or入り混じり)の絞り込みを実装する](https://qiita.com/Kackie/items/baf07e5e4b7a9e8ae096)

表示しているのは[こちら](https://qiita.com/Kackie/items/e732f8e76382c011812b)の記事で使ったお店のリストの改良版です。
今回は管理するデータがより多く複雑になったので、データはjson形式でまとめてaxiosで読み込んでいます。

# 絞り込みの条件
グループ化されたカテゴリがあり、同グループ内を複数選択した場合はor（和食||洋食）、グループを跨いで選択した場合はand（和食||洋食&&肉）での絞り込みになります。
またフリーワード検索を作り、これもフリーワード&&選択したカテゴリというふうにandで絞り込まれます。

# jQuery版との比較
データバインディングの面でVueが圧倒的に優れています。さすが。
そのおかげでjsのソースもシンプルに書くことができました。
必然的にオブジェクト指向に則って書いていくので、ソースが整理されて見やすくわかりやすいです。
またVueのtransitionクラスを利用して切り替えのインタラクションを簡単に作ることができました。

# 今後実装したいもの
- URLにパラメータ付与  
jQuery版にあったやつ。管理する情報が増えたので書き方を新しく考えないと..。
- フリーワード検索の改良  
微妙に挙動が怪しいことに気づいた。。  
大文字小文字を区別しないようにしたいのと、URLを検索の対象から外したほうが良さそうか。
- 複数キーワードでの検索  
今は単一キーワードでの絞り込みしかできないので、スペース区切りで複数入力された場合の処理が必要。
	- その場合はand検索のほうが良いか？
- 時間による絞り込み  
~~開店時間で絞り込んだり、早い順でソートしたりできればよいかなと。~~  
~~インターフェースはプルダウン？~~  
**実装しました！！**  
`input="time"`で選ぶor現在時刻を設定して絞り込めるようになっています。折角項目があるから..と置いてみたものの、管理するデータによってはほぼ死に機能になりそう。
- json更新のシステム  
手動でもいいけど、PHP等の勉強用に作ってみたい。
- 非表示時のインタラクション  
これはどうしようもないかもしれないけど、非表示のものが左上に集約されていくのがちょっと面白..気持ち悪い。  
おそらくflex配下の要素に`position:absolute;`を指定すると親要素基準で左上に移動してしまうせい（初めて知った）。  
flexをやめると高さ揃えをjsでやることになるしうーん。


# 感想
jsonを手動で作成し管理するなんてことを初めてやりましたが、このインターフェースを組み合わせれば色々できそうですね。
何かの実績を整理してみたり、読んだ本や見た映画をまとめてみたり、料理のレシピを材料やジャンル別でカテゴライズしてみたり...。
思いついたら自分用にでも使ってみようと思います。
テストとかでassertEqualsにdoubleを指定するときは注意

Javaを勉強中で、自分で練習プログラムを組むときにテストを作ったほうが確認になると思って挑戦しています。

テストを作成しているときに、エラーが発生したので「なんでかなー」といろいろ調べていたら、理解が進んだのでまとめてみました。


## 今回のプログラム
今回作成したプログラムは、よくあるBMIを算出するやつです。

```java:study.java
public class study {
    public static void main(String[] args) {
    }

    public static double calcBMI(int weight, double height){
        double BMI;
        BMI = weight / height / height;
        return BMI;
    }
```

これに対してテストプログラムを作成。

```java:studyTest.java
import org.junit.Test;
import static org.junit.Assert.*;

public class studyTest {
    @Test
    public void calcBMI() {
        assertEquals(21.798202394816208, drill01.calcBMI(73, 1.83));
    }
}
```

IntelliJ上だとこんな感じ。項目の解説が出るのでわかりやすい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242277/a3bab3c9-74be-d8b0-3a7e-98e5eebf0f9a.png)


## いったんテスト実行
この時点でなんかエラーが出てるけど、気にせずこのテストコードをとりあえず実行してみます。
するとエラー発生、
`java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare floating-point numbers`
と言われました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242277/b3f98c7a-2bef-6892-34a3-5538b91bb38b.png)

定石通りに、エラーコードをググります。
だいたいエラー全文でググると英語の記事とか質疑応答ばっかり出てくるんだよなー。と思ってたら、それっぽい日本語記事を発見しました。（英語勉強しよ・・・）

どうやらdouble型を比較するときには誤差を考慮に入れる必要があり、assertEqualsで取り扱うときは引数に許容値を設定する必要があるようです。

[double型のアサーションにおける罠 ｜ DevelopersIO](https://dev.classmethod.jp/testing/unittesting/trap-when-double-value-assertion/)
> **Assert#assetEqualsメソッドを使う**
JUnit3系のメソッドですが、assetEqualsメソッドを利用して比較することができます。ただし、assetEquals(double, double)は非推奨となっており、assetEquals(double, double, double)を利用してください。3つ目の引数には比較する時に許容する誤差を指定します。+0.0と-0.0の比較であれば誤差は0で良いので、次のように記述できます。
`assertEquals(+0.0, -0.0, 0.0);`

それを知ってからエラーを改めて読んでみるとなるほど、書いてあるように
Use assertEquals(expected, actual, delta) to compare floating-point numbers
↓Google翻訳
浮動小数点数を比較するには`assertEquals（expected、actual、delta）`を使います。

ということで`delta`の位置に誤差を指定する必要があったようです。

実際に引数を追加してみると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242277/273180f9-fd3f-721d-000d-cb72d1d36d82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242277/3c9d13b6-eb74-402d-468c-229c01e0d63a.png)


ということで、テストを無事実行できました。めでたしめでたし。
Confluenceに添付したDraw.io図が失わた時の復元方法

# 概要
Confluenceの記事にDraw.ioで作成して貼り付けた図が、何かの手違いで失われてしまった場合の復元方法です。

# 手順
##1. 当該ページの添付ファイル一覧を開く
ページ上部のクリップアイコンから
![clipicon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/2b20da73-97b9-f222-766c-9181b360fd90.jpeg)

##2. 添付データのダウンロード
図の名前の添付ファイル（pngではない方）があればダウンロード
無い場合はこの方法は諦めてください
![attachments.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/eb5b1dd5-396e-73f2-e347-7268dd365d81.jpeg)

##3. [オプション]同じ名前で再添付するには
前と同じ名前で貼り付けたければ、一旦当該添付ファイルを削除してください。
pngもdrawioの両方とも。
![delattachments.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/6bb23a31-e4cd-f214-a5a2-67fcad380919.jpeg)

##4. 新しい図の挿入
当該ページを編集モードにして、貼り付けたい場所にDraw.ioの図を新規で挿入します。
前と同じ名前にしたければ、ここで[`名前`.drawio]を指定します。
![diagramname.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/f2637ec2-fb7a-f935-f628-4eaf40c74a27.jpeg)


##5. 退避したデータをインポート
Draw.ioの[ファイル]＞[次の場所からインポート]＞[デバイス]でさっきダウンロードしたファイルを読み込む。
![drawiomenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/0231b21c-f76c-8573-5f9d-38623666b315.png)

##6. Draw.ioを保存して閉じる
![saveexit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75035/6c27d05e-f393-2379-eec4-c6558e5e500b.jpeg)

以上で復元できます。

## 補足
同じ方法で複製をつくったり、それをベースに改変したりできますよ。
Tableau Map Viz Gallery

Tableau Mapに関するVizギャラリー（随時更新）

- [Tableau Public - Map](https://public.tableau.com/ja-jp/gallery/?tab=featured&topic=capability-maps)
- [Melbourne Trees](https://public.tableau.com/profile/evgenia.stancheva#!/vizhome/MelbourneTrees_2/1d_StreetViewDash)
- [Comparing income and insurance coverage in NYC](https://public.tableau.com/en-us/gallery/comparing-income-and-insurance-coverage-nyc)
- [Centers of Global Capital Cities](https://public.tableau.com/profile/klaus.schulte#!/vizhome/CentersoftheWorldsCapitals/Dashboard1)
- [Visual Vocabulary - Spatial](https://public.tableau.com/en-us/s/gallery/visual-vocabulary)
- [コロンビア特別区の犯罪発生分布](https://www.tableau.com/ja-jp/solutions/gallery/crime-spotting)
- [Tokyo Earthquake Damage Risk Projections by Area](https://public.tableau.com/profile/property.systems.kk#!/vizhome/TokyoEarthquakeDamageRiskProjectionsbyArea/PSKKAreaRiskDashboard)
- [2011 年の東北地方太平洋沖地震による地震活動のマッピング](https://www.tableau.com/ja-jp/solutions/gallery/one-week-japanese-earthquakes)	
- [Wi-Fiによる人流データをTableau Publicで公開、データがもたらすパワーを改めて実感](https://www.tableau.com/ja-jp/solutions/customer/Kokusai-Kogyo-review-flow-wifidata-in-tableaupublic)
JavaScript で ISO 8601 に準拠した週番号を計算する

ISO 8601と言えば日付や時刻を`20190624`や`2019-06-24`、`2019-06-24T09:00:00+09:00`というように表現する規格だ。
ISO 8601では日付を表す方法は一般的な年月日による表現の他にも以下のような表現が用意されている。

- 年とその年の1月1日からの経過日数 (例: `2019-175`)
- 年と週番号、曜日番号(1=月曜日, 7=日曜日) (例: `2019-W26-1`)

今回は JavaScript を用いて、渡された`Date`からISO 8601の週番号を用いた文字列を返す関数を作成する。

## 定義

週番号を用いた表記は以下のように定義される

- 一週間は**月曜日**で始まり、**日曜日**で終わる
- その年の第一週は**最初の木曜日**を含む週
- そのため年の境目では、年月日の場合と異なる年を表記する場合がある (例: 2018年12月31日は `2019-W01-1` となる)

## 実装

``` js
function dateToIso8601Week(date){
  // 引数のDateと同じ週の木曜日を計算
  // 259200000 = 3days * 24hour * 60min * 60s * 1000ms
  // 604800000 = 1week * 7days * 24hour * 60min * 60s * 1000ms
  const thursday = new Date(Math.ceil((date.getTime() - 259200000) / 604800000) * 604800000);

  // 木曜日と同じ年の1月1日を計算
  const firstDayOfYear = new Date(thursday.getFullYear(), 0, 1);

  // 木曜日がその年の第何週かを計算する
  const weekOfYear = Math.floor((thursday.getTime() - firstDayOfYear.getTime()) / 604800000) + 1;

  // 曜日をISO 8601に直す (jsは0=日~6=金、ISO 8601は1=月~7=日)
  const dayOfWeek = date.getDay() !== 0 ? date.getDay() : 7;

  // yyyy-Www-D 形式に直す
  return `${thursday.getFullYear()}-W${('0' + weekOfYear).slice(-2)}-${dayOfWeek}`;
}

// input: 2018-12-31
// output: 2019-W01-1
console.log(dateToIso8601Week(new Date(2018, 11, 31)));
```

## 参考文献

- [ISO 8601 - Wikipedia](https://ja.wikipedia.org/wiki/ISO_8601)
- [Date.prototype.getTime() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)
- [JavaScriptでISO 8601形式の週番号を取得する - ltd.hatenablog.com](http://ltd.hatenablog.com/entry/2014/07/02/181833)
私がプログラミングスクールにいく理由

大学4年生法学部の学生です！
私がなぜ4年生になってプログラミングスクールに行こうと思ったのかを簡単に紹介したいと思います。
現在、プログラミング未経験だけど、プログラマーになりたいと思った方は是非参考にしてください。

## 入社するまでに周りと差をつけたいから
私は法学部ですが、学んできたことと全く関係のないIT企業にシステムエンジニアとして内定を頂いております。法学部ですので、プログラミング経験はほとんどありません。私はその状況に危機感を覚え、入社するまでにはある程度実践的なプログラミング知識を身につけておこう、そうすることで入社するまでに他の学生と差をつけようと考えプログラミングスクールに参加することを決めました。


## 学習の成果
実際にどのようなことを学んだのか最後に一部だけ紹介します。スクール２日目で書いた内容です。
わからないことは全てメンターに聞けるので、早く学習を進めることができました。

```php
<?php
session_start();
if (empty($_SESSION["name"]) && empty($_SESSION["email"])){
  require('validation.php');
  validation($_POST["name"],$_POST["email"]);
}
?>
<!DOCTYPE html>
<html lang="ja" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <h4>入力内容を確認してください</h4>
    <form action="complete.php" method="POST">
      <p>氏名</p>
      <?php
        if (isset($_SESSION["name"])) {
          echo $_SESSION["name"];
        }
      ?>
      <p>メールアドレス</p>
      <?php
        if (isset($_SESSION["email"])) {
          echo $_SESSION["email"];
        }
      ?>
      <p><input type="submit" value="送信する"></p>
    </form>
    <form action="input.php" method="POST">
      <p><input type="submit" value="戻る"</p>
    </form>
  </body>
</html>
```
KiCadで手軽に電子回路基板設計　ネットリスト出力

#KiCADで簡単に電子回路基板を設計する
前回製作した回路図からネットリスト出力します。
[前回 非安定マルチバイブレータ回路図製作](https://qiita.com/mat-MUNET/items/31e71d0bda0ed464db03)
[フットプリントエディタの使い方](https://qiita.com/mat-MUNET/items/0fc8730ccc99f560a3d5)
###ネットリストとは
電子回路上の部品同士の接続情報を持ったデータのことです。
Aの部品の○○番ピンとBの部品の○○番が繋がっている　などといった情報を持っています。
KiCADの電子回路エディタ「Eeschema」にはこのネットリストを出力する機能があります。

##フットプリントの割当
ネットリストを出力するためには電子回路図のシンボルと実際の部品パターン（フットプリント）を関連付ける必要があります。
フットプリントはライブラリに存在するもののほかに自作することも可能ですが、作成方法については、[別の回](https://qiita.com/mat-MUNET/items/0fc8730ccc99f560a3d5)でお示しします。
今回は既存のフットプリントの割当を行います。
割当方法はグループ一括で行う方法と、個別に割り当てる方法があります。

####フットプリントを個別に割り当てる方法
対象のシンボルを右クリックして、シンボルプロパティを開きます
![63_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/645988bf-40c3-5e70-370f-1c2a939bb713.png)
フットプリントの定数項目のファイルを開くマークをクリック
![56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/b523c389-2946-bb9a-358f-3ad96da427bd.png)
ブラウザーが開くので、ライブラリーから割り当てたいパーツを選択し、挿入をクリックします。
![57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/b827af67-6418-ef5b-19cc-407f60478438.png)
シンボルプロパティにて、パスが挿入されるとOKです。
![58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/86475890-32eb-f854-9fc4-30f0e4021311.png)
この作業を全シンボルに対して行います。

####複数のシンボルに割り当てる場合
部品が多い場合、抵抗など全く同じフットプリントを複数のシンボルに割り当てる方法を示します。
シンボルフィールドを選択をクリックします。
![400.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/2d2abdc4-ef0a-d8b6-74cc-f8a355399e28.png)
グループを確認して、フットプリントを割り当てます。
この先は個別に割り当てる場合と同様です。
![401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/2c3ff9c2-262b-b1fe-fa9b-0d8d32e1ebdc.png)

##netリスト出力
いよいよnetデータ出力です。
すごく簡単です。
ネットリストの生成をクリックします。
![64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/3da59b34-8526-d3a8-cac2-bb7dd220a28f.png)

ネットリストが出力されるディレクトリを確認します。
後にネットリストを拾いに行くので忘れないようにします。
ファイル名は、特に編集する必要がないのですが、幾つかのタイプ違いを作るときなどは、適に変更してください。
![65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/29660ed2-62f0-c158-44a3-0cfd54aaf6e3.png)
これでネットリストが生成されました。

[次回](https://qiita.com/mat-MUNET/items/3fb314cfdcb328fab7fb)は今回生成したネットリストからPCBレイアウトを行います。
Visual StudioでClassic ASP（VBScript）をデバッグする



#はじめに

Visual Studio のデバック機能を利用して、Classic ASP（VBScript）をデバッグする方法を書きます。

#Visual Studio Expressのインストール

[Express 2017 for Windows Desktop](https://visualstudio.microsoft.com/ja/vs/express/?rr=https%253A%252F%252Feng-notebook.com%252Fpost-2665%252F)

|![cap1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/c47a80b3-2497-d162-44e3-4118492732e0.png)|
|:-:|

上記ページ内、赤枠の箇所をクリックしてダウンロードしたインストーラを実行してインストールを行います。
「Express」よりも機能が豊富な「Community」とうエディションも使用可能ですが、商用利用においては条件がありますので詳細については[公式サイト](https://visualstudio.microsoft.com/ja/)をご参照下さい。


#ブレークポイント


インストールしたVisual Studio を「管理者で実行」で起動します。
起動後、メニューバーの「ファイル」>「開く」>「ファイル」からデバッグしたいファイルを開き、処理を止めたい行をクリックしてブレークポイントを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/eba0264f-1090-9534-97d6-b002d3aa67b7.png)

特定の条件の場合にだけヒットさせたい場合は赤丸の箇所を右クリック＞「条件」で条件を指定することが出来ます。
![adfjhafdas_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/1cbdae52-a491-d395-3c0d-3dede8fdef2a.png)

「ブレークポイント」ウィンドウで設定したブレークポイントが一覧で見ることが出来ます。
![adfjhafdas_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/f2bf35ed-a134-494c-8624-6510a18695bb.png)


#デバック実行


「デバッグ」＞「プロセスにアタッチ」を押下します。
![adfjhafdas_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/a7371c3c-5340-667a-f80d-2052789495ec.png)

以下の通り設定し、「w3wp.exe」プロセスを選択して「アタッチ」を押下します。
![adfjhafdas_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/1fe71731-70fd-7811-0ee7-4cc3f476a3a8.png)

ブレークポイントを設定したファイルを使用している処理を動かすと、以下のようにヒットします。
![adfjhafdas_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/9e1097af-f3c6-f198-d3d7-e724cb6c5022.png)

#ステップ実行

| 主な機能       |    説明    | 
|:-----------------|:------------------|
| ステップ イン(F11)          |              1行ずつ実行します。            | 
| ステップ オーバー(F10)      |            1行ずつ実行しますが、メソッド内はスキップします。| 
| ステップ アウト(Shift + F11)　 | メソッド内から呼び出し元の処理までスキップします。| 
| 続行                          |                次のブレークポイントまでスキップします。 | 
| デバッグの停止             |             デバッグを終了します。| 


以下はステップ インを実行した場合です。

![cap10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/487c1445-6e00-b5ca-1921-a9cbcd1a6c62.gif)


#ステップの巻き戻し、値の書き換え


以下のようにステップの巻き戻し、「ローカル」または「ウォッチ」ウィンドウで変数に格納されている値を書き換えが出来るため、単体テストを効率的に行うことが出来ます。

![adfjhafdas_8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/935712b4-c1be-142c-1a70-e34eb37c0483.gif)


#呼び出し履歴

「呼び出し履歴」でデバッグ中の行がどのメソッドからどのような順番で呼ばれているかを確認することが出来ます。

![adfjhafdas_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385323/30e5f0d6-34fe-b61b-2b5f-9533765df1ba.png)


#おわりに

簡単な実装であれば標準出力を使ったデバッグでも可能ですが、ステップが多く複雑な実装であればツールを使う方が効率的です。
Visual Studioを使うことでClassic ASP（VBScript）でもデバッグや単体テストが簡単に行えるので、是非お試し頂ければと思います。
readrのチートシート(＋α)を和訳してみたよ

前回、[stringrのチートシート](https://qiita.com/taro_6974/items/07b4d6b2b741d77989ee)なるものを今更ながらつくってみましたが、今回はみんな大好きreadrのチートシートを和訳してみました(＋αでtibble、tidyrについても言及したシートもあります)。
公式のサイトを参考にしたので基本形は網羅できているはずです。


###readr(+α)のチートシートを和訳してみた

無償のPDFいじりツールを使ったのでちょっとレイアウトに邪魔なものが紛れ込んでいますが、どうぞお気になさらず。

![readr_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/00afd7e6-6dea-bb28-4238-2d8fe2d0d4f5.png)

![readr_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162354/7812e6f2-1b46-18d6-a1c0-8203c06ce087.png)


自分用に和訳した暇人の工作シートを公開するだけで恐縮ですが、どなた様でもご自由にご利用ください。
やっていきましょう。


###参考
[readrのチートシート](https://readr.tidyverse.org/)
Node.jsでCLIツールを作る

Firebase initとかcreate-react-appとかめちゃくちゃ便利だなーと思ったのと、CLIツールってどうやって作られてるのか知らなかったため今日はcreate-react-appを参考にCLIで自分のやりたいことができるようになったのでその共有です。

create-react-appというReactの開発環境を一瞬で作れるCLIツールが有るのですがそちらのpackage.jsonを見てみます。

### create-react-app
https://github.com/facebook/create-react-app/blob/56d1de274576f8e5371d83f07a87c32473c4ae9a/package.json#L21-L40


この中のパッケージを使っているのかな(puppeteerもあるけれどどこで使っているんだろうか)

#### meow
https://github.com/sindresorhus/meow
CLIとのやり取りをするときに便利になるツール

react-dev-utilsというものがよく使われていて、基本的なCLIとのやり取りはここで行われていそうreact-dev-utilsはlernaでモノレポ管理されているみたいCLIとのやり取りはこのcross-spawnでやり取りしてそう
#### node-cross-spawn
https://github.com/moxystudio/node-cross-spawn

### firebase-tools
##### firebase init

https://github.com/firebase/firebase-tools/blob/e36933b8fb65d4f59cac491fff4a4f77233c09b4/src/commands/init.js

promptからrequireしたソースコードを使用している、60行ほどのソースコードでpromptクラスとpromptOnceという関数の2つをエクスポートしている

https://github.com/firebase/firebase-tools/blob/e36933b8fb65d4f59cac491fff4a4f77233c09b4/src/prompt.ts


#### Inquirer
https://github.com/SBoudrias/Inquirer.js/
対話型のシェルを作るためのライブラリ
2019-06-25 Visual Studio Code (v1.35.1) > 実行ファイルの場所

```txt:動作環境
Windows 10 v1903
Visual Studio Code (Version: 1.35.1 (user setup)
```

sendtoに登録するため、VScodeの実行ファイルを探した。

下記が参考になった。

Visual Studio Code install location
https://stackoverflow.com/questions/30263459/visual-studio-code-install-location/42502791

<!--
C:\Users\{UserName}\AppData\Local\Programs\Microsoft VS Code
-->

別途、以下の情報もある。
windows – Visual Studio Codeのインストール場所
https://codeday.me/jp/qa/20190323/434257.html

インストール方法（ユーザ指定、全ユーザ）によって異なるのだろう (未確認)。

<!--
C:\Program Files (x86)\Microsoft VS Code\
C:\Program Files (x86)\Microsoft VS Code\Code.exe   
-->
Kubernetesで始めるHCI（第零回 ~前置き~）

#HCIとは
Hyper Converged Infrastructure は主に仮想環境で利用される、NW, Storage, Computeを組み合わせたものを指すことが多いが今回はKubernetesを使いContainerでHCIを目指す。動機はGKEの検証環境を使いたい。もっと言うとGitLabから参照できる先としてOn Premise環境で気軽に開発したい。そのために必要になってくるのがKubernetesのバックエンドで動くStorageとNetwork。細かいものは色々あるけどこの二つがとりあえず重要なのでこれについて検証していく。第十回くらいには収めたいと思っているが、まだ未定。

#Storageの必要性
色々世のContainerで動いているアプリを見ているとDeploy方法としてDockerを使いそれがそのままアプリになっているケースが多いようだ。Container前提で作られるアプリが定着する世の中がくるのはまだまだ先な気がしている。だから、Statelessなんて夢のまた夢だということを思い知らされる。CloudでStorageを選択する場合は、Cloud専用のものを使うのがベストだということは議論の余地がないだろう。これに負けないStorageとしてOn PremiseでStorageを準備することはなかなかのハードルを持っているようだ。各ストレージベンダーも手をこまねいているように思われる。今回はKubernetesとの相性を考えてCephとRookを選択することにする。高機能、高性能、オープンソース。On PremiseでKubernetesのStorageを作る場合はこれが定着してくるのではと思われる。概要は[ここ](https://qiita.com/edayuzi/items/57538f5c7fc033839816)に記載している。詳細は今後更新予定。

#Networkの必要性
KubernetesのNetworkと言えば、CalicoやFlannelなどのSDNを想像されることが多いかと思われるが、今回はもう少し掘り下げた構成でHCIのNetworkを考えていく。冗長性と拡張性を加味してBGPと組み合わせた内部ネットワーク。Metal LBとNginx Ingressを利用してGKEと同等のものを用意する。全体の検証がなかなか進まないので後で書き直すことになったらお詫びしますが、個別の検証ではいけると今は思っている。こちらも回を追って更新予定。

#検証環境
何事にも検証は重要。「道理証文よりも現証には過ぎず」とのありがたいお言葉を拝借して検証環境から作ることにした。手早く作れる検証環境を[構成図](https://docs.google.com/drawings/d/1oPxzcAMq00S_RbSquBigkG51K6devmwkFlUPDEHL8lI/edit?usp=sharing)こんな感じ。
Ubuntu, KVMで動作させている。KVMで動かすのでGUIとXrdpがあると便利。最初にやること[リスト](https://docs.google.com/document/d/1709z2A_ubAaHFOjL3TjqMUejWfDZJGA4Nn3ojLuvAk4/edit?usp=sharing)はこんな感じ。
スペックはメモリさえあれば、あとは気長に待つということで大体何とかなるだろう。今回はCephとNVMeの相性を見たかっと省電力がどこまで有効かを見たかったのでこの機材を選定している。NICは拡張性、冗長性のため2port増やしている。
[CPU搭載 MB](https://www.amazon.co.jp/gp/product/B07NJ1Z2K9/ref=ppx_yo_dt_b_asin_title_o07_s02?ie=UTF8&psc=1)
[Memory](https://www.amazon.co.jp/gp/product/B07DVWTZ64/ref=ppx_od_dt_b_asin_title_s02?ie=UTF8&psc=1)
[NIC](https://www.amazon.co.jp/gp/product/B07MDM12VC/ref=ppx_yo_dt_b_asin_title_o06_s02?ie=UTF8&psc=1)
[Case](https://www.amazon.co.jp/gp/product/B017XHIKZ4/ref=ppx_yo_dt_b_asin_title_o06_s01?ie=UTF8&psc=1)
[NVMe](https://www.amazon.co.jp/gp/product/B078VBL3T9/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1)
[HDD](https://www.amazon.co.jp/gp/product/B07911QK3W/ref=ppx_yo_dt_b_asin_title_o06_s02?ie=UTF8&psc=1)

---
メモ: 検証環境なので泥臭いやり方も厭わない、自動化とか冪等性とかにこだわりすぎると検証が進まない。でも、手戻りや同じことの繰り返しは避けたい。この葛藤がエンジニアの宿命なのかもしれない。


##あとがき
Rook記事の前回からもう一年もたったのかと時が立つのは早い。社会も生活もどんどん変わっていき、日進月歩は止まらない。ただ、前へ前へ。とにかく勇猛精進あるのみ。文章は読むのも書くのも辛いので何処かで動画配信なんかもできたらいいな。
Linux でカレントにあるディレクトリの各々の合計容量サイズ を確認する

> 現在いるディレクトリ**（カレント・ディレクトリ）にあるディレクトリの各々の合計サイズ**を知りたい。

毎回忘れる。[「`linux` `カレント` `ディレクトリ` `容量` `サイズ` `確認`」と Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+linux+%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%88+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA+%E5%AE%B9%E9%87%8F+%E3%82%B5%E3%82%A4%E3%82%BA+%E7%A2%BA%E8%AA%8D&tbs=qdr:y)も、タイトルから一発でわかる記事がなかったり、サブディレクトリを全部表示しちゃう記事や、オプション情報が多すぎてわかりづらかったので、自分のググラビリティとして。

## TL;DR

```bash
du -d 1 -h [検索パス]
```

## TS;DR

> `-d 1` オプションで１階層ぶんのみと指定するのがポイント

```shell-session:ルート・ディレクトリにあるディレクトリ
$ du -d 1 -h /
198M    /boot
0       /dev
0       /proc
8.6M    /run
0       /sys
40M     /etc
275M    /root
4.0K    /tmp
764M    /var
4.4G    /usr
3.5G    /home
0       /media
0       /mnt
48M     /opt
0       /srv
14M     /backup
0       /.pki
9.2G    /
```

### 専用のコマンドを作成して楽をする

どうせ忘れるので、パスの通ったディレクトリに以下のシェル・スクリプト（`lsd`）を設置して `lsd` コマンドを作成してみました。

```bash:lsd
#!/usr/bin/env bash

du -d 1 -h $1
```
```shell-session:使い方
$ # ディレクトリの移動
$ cd ~/
$ # lsd の実行
$ lsd
  0B	./.config
5.8M	./Music
 24K	./.docker
4.0K	./.vim
2.2G	./.vagrant.d
 28K	./.subversion
 31M	./.local
  0B	./Pictures
 40K	./.pylint.d
 24M	./.bundle
9.3M	./.phpls
 65M	./Desktop
 12G	./Library
1.5M	./.bash_sessions
 16K	./Data_VirtualMachine
  0B	./Public
  0B	./Movies
8.0K	./Applications
  0B	./BuildJwCad
342M	./.Trash
339M	./Documents
 16M	./.gem
110M	./Downloads
 12K	./.circleci
1.6M	./.cache
218M	./Share
 15G	.
$ # パスを指定して実行
$ lsd ~/
...（略）...
```
偏差値40の未経験プログラミング学習.ver6

2019年6月25日（火）所要時間：1時間半

個人的に社内ツールを作成する予定で社内のプロダクト部の方にお願いして手伝ってもらっている。
7月末までに1つサービスをリリースする目標で取り組んでいる。

#〜学んだこと〜

```<li>〇〇</li>``` リンクについて

#【2つリンクを作って同じ画面上の移動を行なった】

・リンクをクリックし表示させるには、まず親要素を作ってその中の子要素に反映させる。
・パターンによっていろいろあるけど、基本的に親要素→子要素ってのを学んだ。

※エラーの原因の理由として多いのがcss側の確認ミス※
※あと個人的に【#】←これめっちゃ忘れやすいので注意※

2019年6月26日（水）所要時間：20分

#【メニューバーの追加】

◎HTML↓

```
<ul id="nav">
  <li><a href="#">MENU1</a></li>
  <li><a href="#">MENU2</a></li>
  <li><a href="#">MENU3</a></li>
  <li><a href="#">MENU4</a></li>
</ul>
```

◎CSS↓

```
#nav {
  list-style: none;
}
 
#nav li {
  width: 140px;
  text-align: center;
  background-color: #333;
  display: inline-block;
}
 
#nav li a {
  text-decoration: none;
  color: #fff;
  font-weight: bold;
}
```
偏差値40の未経験プログラミング学習.ver5

2019年6月25日（火）所要時間20分程度

〜学んだこと〜

そもそもGitで大事なこと。
共同開発する上で、自分が行った場所を「把握」して変更した場所だけを「選択」し共有すること。
把握に使う　※変更があれば赤色で表示
→git status

2019年6月26日（水）所要時間40分程度

〜学んだこと〜

変更内容の把握(※変更前のコードが赤色、変更後のコードが緑色)

→git diff

→git commit -m "修正"

コミットメッセージの確認

→git log
MySQLのデータ型について勉強したことをまとめた

実践ハイパフォーマンスMySQLを読んで考えたことをまとめました。

### 通常は小さい方がいい

当たり前だがデータ型が小さい方がパフォーマンスが良くなるので、なるべく小さいデータ型を使うよううにする。
しかし、この時にデータ型の大きさを過小評価すると、あとでデータ型の範囲を広げる必要が出てくる。

### 単純なものがいい

データ型が単純であるほど、操作に時間がかからない。
例えば、日付と時刻は文字列ではなくMySQLの組み込み型として格納すべき。
IPアドレスは文字列でなく整数型で格納すべき。(.は人間が認識しやすいようにつけられているだけだから)

### できればNULLを使用しない

NULL値を設定できる列はインデックス、インデックス統計、値の比較を複雑にするので、それらを参照するクエリをMySQLで最適化するのは難しい。NULL値を格納できる列はより多くの記憶域を使用し、内部でも特殊な処理を要求するから。
ただし通常NULL値を格納できる列をNOT NULLにしてもパフォーマンスの向上はわずかなので、列にインデックスをつける予定がある時以外は優先しなくていい。

[ここのリンク](https://www.ketancho.net/entry/2018/03/14/074500)にも書いてある通り、NOT NULLを使わずに例えば`''`を使うことはSQLアンチパターンとして知られているので、慎重に考える必要がありそう。
NOT NULLを使わずに`''`とかでNULLを表現すると`''`がNULLであることを開発者が覚えておく必要があるので、生産性を下げる原因になりうる。

## 整数

整数型には
- TINYINT
- SMALLINT
- MEDIUMINT
- INT
- BIGINT
がある。
整数型は`UNSIGNED`属性を持つことで、格納できる正の数の上限を約2倍にすることができる。


## 実数

実数とは少数部分を持つ数字のこと。
BIGINTに収まらない大きな整数を格納するためにDECIMALを使うこともできる。

### 不正確な型

- FLOAT
- DOUBLE

どちらも標準の浮動小数点演算の近似計算をサポートする。
それぞれの違いについては
[https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html](https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)
に詳しく書いている。

### 正確な型

DECIMAL型

http://dcx.sap.com/1201/ja/dbreference/decimal.html

記憶域と計算のコストが増えるため、財務データを格納するなど少数部分の正確な結果が必要な時だけにする

## 文字列型

### VARCHAR型

可変長の文字列を格納する最も一般的なデータ型。
必要な記憶域しか使用しないので、固定長の型ほど多くの記憶域を使用しない。
格納する値が短ければ短いほど使用する記憶域も小さい。
VARCHAR型は値の長さを保存するために1か2バイトを使用する。

### CHAR型

固定長の文字列データ型。
nバイトに満たない場合は文字列の右側に空白が追加され、10バイトぴったりに調整される。

## BLOB型とTEXT型

BLOB型は大量のバイナリデータを格納する。
TEXT型は大量の文字列データを保存する。

他のすべてのデータ型と異なり、MySQLはBLOB型とTEXT型の値を独自のIDを持つオブジェクトとして処理する。

### VARCHAR型とTEXT型どちらを使うべき？

[ここのサイト](https://www.84kure.com/blog/2014/09/19/mysql-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AB%E3%81%AFvarchar%E5%9E%8B%E3%81%A8text%E5%9E%8B%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B%EF%BC%9F/)に詳しく書いてある。

ストレージエンジンごとに違いはあるが、TEXT型は外部記憶領域を使ってDBにはそのポインタが格納される。
一方VARCHAR型は値そのものをDB内に保存するためアクセス速度が早い。
基本的にはVARCHAR型を使った方がいい。

## 日付と時刻型

### DATETIME

1001~9999年までの値を格納することができる。精度は1秒。YYYYMMDDHHMMSS形式で整数にアンパックする。これには8バイトの記憶域が使用される。

### TIMESTAMP型

1970年1月1日午前0時からの経過時間を秒数で格納する。記憶域を4バイトしか使用しないのでDATETIME型より範囲はずっと狭い（1970年から2038年の途中まで）
他のデータ型と違いTIMESTAMP型の列はデフォルトでNOT NULL。

### どちらを使うべき？

記憶域が小さいことを考えると基本的にTIMESTAMPだが2038年問題や特集な挙動があるようなので注意が必要。
CentOS7.6にMariaDB10.2をインストール

  
<p><b>CentOS7にバージョン指定したMariaDBを入れてみた。</b>

・CentOS7.6
・MariaDB10.2

#MariaDBとは
・MySQLから派生したリレーショナルデータベース。
・ほぼMySQLと同じ。
・MariaDBの方がパフォーマンスが高いらしい。

#インストール
①リポジトリ確認

```
# ls -l /etc/yum.repos.d
```

②リポジトリ作成

```
# curl -sS http://douwnloads.mariadb.com/MariaDB/mariadb_repo_setup | bash -s -- --mariadb-server-version=mariadb-10.2.12

```

もう一度リポジトリを確認
「mariadb.repo」が作成されている。

③インストール

```
# yum -y install --enablerepo=mariadb* MariaDB-common MariaDB-devel MariaDB-shared MariaDB-compat MariaDB-server MariaDB-client

```

#初期設定
①文字コード変更追記

```
# vi /etc/my.conf
```

「character-set-server=utf8」を追記

②起動確認

・開始コマンド

```
# systemctl start mariadb
```
・確認コマンド

```
# systemctl status mariadb
```
・自動起動コマンド

```
# systemctl enable mariadb
```
③初期設定

```
# mysql_secure_installation
```

rootのパスワードなどを設定していく。
今回はすべてyで対応した。

④ログイン

```
# mysql -u root -p
```

ログインの成功を確認

exitコマンドでログアウト

>参考サイト

・[https://server.etutsplus.com/centos-7-mariadb-install-and-mysql-secure-installation/]
（圧倒的謝謝

今後はデータベースの作成、MySQLTunerを使用してのチューニング方法についてまとめていきます。
メモ程度にざっくりまとめたので何かありましたらコメントの方をよろしくお願いします。
コーディング無し！日本語で書いた設計書が！！「ワンダーロボ」帳票設計で印刷用のExcel、PDFの設定方法

###ステップ1.「印刷タイプ」をExcel、PDFに設定する方法

###ステップ2.　印刷用のExcel用シートとPDF用シートを設計

###ステップ3.　ワンダーロボに取り込む

###ステップ4.　ユーザー利用画面にて印刷

---
###ステップ1.「印刷タイプ」をExcel、PDFに設定する方法
まずは、帳票出力用の画面設計テンプレートで設定をします。
今回は、下の図の赤線で囲んでいる「請求書一覧出力(Excel)、入金予定一覧出力(PDF)」の印刷で説明します。（shapeにて設定）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/49c2eb4f-592f-8530-c611-bf8f27ccc4a5.png)


「shape」画面詳細設計の項目の「印刷」の「印刷タイプ」から、ExcelとPDFでそれぞれ出力形式を選択することが出来ます。

###ステップ2.　印刷用のExcel用シートとPDF用シートを設計

2-1　印刷ボタンでを1枚のシートに印刷する場合、Excel帳票設計書シート名を「帳票設計_帳票名」に設定します。
2-2　印刷ボタンで2枚又は2枚以上シート(1つのブック)に印刷する場合、Excel帳票設計書シート名を「帳票設計_帳票名_ファイルブック名」に設定します。
インポートされた帳票は、ファイルブック名によって結合されます。

印刷用Excelシート↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/706a8494-8d2f-20c5-4531-bdba4c46f263.png)

・印刷した時に実際に出力されますので、設計者のお好み通り記載してください。

印刷用PDFシート↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/f152ffaa-cdce-bdc6-2a9d-ec8e6c190081.png)
・印刷した時に実際に出力されますので、設計者のお好み通り記載してください
・PDFで印刷する際は、Excel帳票設計でグリッド(赤枠)の設定が必要となります。

##ステップ3.　ワンダーロボに取り込む
SaaSForceの開発環境にログインし、ファイルをインポートします。
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/b5df5670-4b37-4fee-e91c-ba295891244c.png)


###ステップ4.　ユーザー利用画面にて印刷

####ユーザー利用画面表示例↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/7664e11c-f615-2908-2ffd-9b2b207b4506.png)


####Excel、PDFが印刷ボタンをクリックすると、表示されます。

実際に印刷されたExcel↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/b6cee0fa-94ec-9085-d847-004ffaab16d7.png)

実際に印刷されたPDF↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/60e58c9c-e881-0925-da93-97c971aeaec7.png)
pgloaderで約50GBのデータをMySQLからPostgreSQLへ移行した時に躓いた所のメモ

ざっとしたメモ書き

・homebrewでinstallしたものでは動作しない 
デフォルトで割り振られてるRAMでは足りないため gitから最新を落としてmakeする

・キャストをしっかりとする
日付と数値系の型でERRORをはきまくるため
0000-00-0-00 00:00:00はMySQL独自仕様

・デフォルトの設定だとindexに勝手に数値がふられる
preserve index namesで回避可能

・親子テーブル関係にあるものの、その関係を崩すようなデータは勝手に省かれる
Include no dropで回避可能 ただし無効外部キーエラーを新たに吐く

・viewは移行できない

・MySQLのtimeoutが起きる可能性があるので、延長する

・設定はもろもろloadファイルに書き込む