OmniAICreator/Qiita-1.07M huggingface dataset:
Sequel::Mock::Datasetの使い方（ついでにDatasetとArrayの違い）

すごい雑なコードです。
Qiitaに載せるようにいろいろ変更を加えているのでサンプルコードでの動作確認まではできていないです。
なので参考程度に見ていただけると:bow:


```rb
require 'sequel'
require 'sequel/adapters/mock' # sequelのrequireだけではこのファイルはrequireしてくれない模様

class Sample
  # 0埋め済みの市区町村IDを返す
  # @return [Array]
  def get
    db = Sequel.connect(config)
    dataset = db.fetch('select city_id from sample_table')
    # 市区町村コードを０埋めした状態で返したいのでeachで処理する
    dataset.each do |row|
      row[:city_id] = '%05%d' % row[:city_id]
    end
    dataset.all
  end

  private def config
    # DB接続に必要な設定
  end
end

describe Sample do
  describe '#get' do
    subject { described_class.new.get }
    let(:db) { Sequel::Mock::Database.new(config) } # configメソッドと同内容を引数に取る
    let(:records) do
      [
        { city_id: 1101 },
        { city_id: 1102 }
      ]
    end
    let(:dataset) { Sequel::Mock::Dataset.new(db) }
    before :each do
      allow_any_instance_of(Sequel).to receive(:connect).with(config).and_return(db)
      db.fetch = records # DBに格納されているであろうデータをセットする
      allow(db).to receive(:fetch).with('select city_id from sample_table').and_return(dataset)
    end

    it 'city_idが０埋めされて５桁の文字列になっていること' do
      subject.each do |row|
        expect(row[:city_id]).to be_a(String)
        expect(row[:city_id].size).to eq 5
        # start_withも使って0で始まっていることの確認もしたいけど群馬県以南は１〜４で始まってる５桁なのでやらない
        # 脳死でsizeとか書いたけど正規表現で書けばいいじゃんって思う
      end
    end
  end
end
```

ざっくり雰囲気は掴んでもらえるでしょうか。
``Sequel::Mock::Database``に対して``fetch``でデータを投入しておくというのがミソです。
これをしないとdatasetのモックが``nil``や``[]``を返すようになります。
モック化、結構手間ですね:frowning2:


## ついでにDatasetとArrayの違い
実はこの``#get``は要件を満たせていないです:thumbsdown:

今回は[Rubyでの参照の値渡し](https://magazine.rubyist.net/articles/0032/0032-CallByValueAndCallByReference.html)を利用して``#each``内でcity_idを上書きする、ということをしようとしています。（サンプルなのでこれのいい悪いは一旦置いといて）

```rb
arr = [{city_id: 1101}]
arr.each {|row| row[:city_id] = '%05d' % row[:city_id]}
p arr #=> [{:city_id=>"01101"}]
```

``Sequel::Dataset``も``#each``を提供しているのでうまく行っているかのように見えますが、実際はそうではありません。

```rb
dataset = db.fetch('select city_id from sample_table')
dataset.each do |r|
  r[:city_id] = '%05d' % r[:city_id]
end
dataset.all # [{:city_id=>1101}]
```

この手法は``Array``であれば成立しますが``Sequel::Dataset``の場合は``dataset.each``の操作をするたびにSQLを実行した結果が返されます。（内部的にキャッシュをしていてSQLの実行は１回で済んでいる可能性もあるかもしれませんが、そこまで検証してないです）
そのため上書きした結果を返さずに``#all``を呼んだ際にまた別の配列を返しているというものになります。

---

対象のデータ型が何かを理解した上で実装を進めたいですね。
iOSアプリのコード数を数えたい！！！

そんなときありますよね。
clocを使うと簡単に数えられます。
Homebrewが必要なので、もし入ってなければいれましょう。

# Homebrewを入れる
ターミナルから下記コマンドをうってください。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

詳しいインストール方法は[公式](https://brew.sh/index_ja.html)を見てください。

# clocをインストール
clocをインストールしてください。

```
$ brew install cloc
```

ここまででお膳立ては完了！

# 使う
```
$ cloc (target directory name)
```
で対象のiOSアプリのライブラリを指定してやれば、下記のような結果が出力されます。

```
github.com/AlDanial/cloc v 1.82  T=5.73 s (329.7 files/s, 57670.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Objective C                    xxx          xxxxx          xxxxx         xxxxxx
Swift                          xxx           xxxx           xxxx          xxxxx
C/C++ Header                   xxx          xxxxx          xxxxx          xxxxx
HTML                            xx           xxxx            xxx           xxxx
（略）
-------------------------------------------------------------------------------
```

このcloc、Macのディレクトリであれば、何でもイケるので、便利です。

# 参考
[Macでソースファイルのステップ数をカウントする方法
](https://www.bloguchi.info/1306)
Lightning Web Componentsの忘備録

# LWC(Lightning Web Components)の些細な事
忘備録なので親切でもないし大雑把だし嘘があるかも。

## 共通のイベントハンドラーつかっちゃった
LWCはLightningComponentと違ってフォームで入力した値がバインドしてる変数に反映されないです。
なのでイベント拾って処理したりするのですが、
OnChageとかで共通のイベントハンドラ使っちゃうとどの変数を更新するんだよってわかんなくなります。
そんな時はEventオブジェクトから情報引っ張り出して、Reflectオブジェクトで代入すると幸せな感じになります。

`handleOnChange( event ) {
   Reflect.set(this, event.target.name, event.target.value );
   なんかの処理実行する的な・・・
}
`
前提としては変数名とlightning-inputのnameプロパティを同じにしとかないとダメっす。
## 名前
コンポーネント名とか変数名はキャメルケースで書くのですがTemplateからコンポーネントを参照するときはケバブケース（ハイフンで区切ってくやつ）にしないとダメです。
なので、
*getListOpp*なんてのは*get-list-opp*にします。
これTemplateに記載するときはVS Codeのコード支援があるのですが、JSからメソドを利用したい場合はquerySelectorの文字列なのでつい間違えます。。。
そんなときはTemplateのコード支援で正しいものを教えてもらいましょう。
##初期化処理
*connectedCallback*はLWCのコンポーネント初期化が完了したら。
*renderedCallback*はDOM操作が終わったら。
connectedCallbackで子コンポーネントのメソド呼び出そうとしたらNULLになりました。。。DOMが終わってないからか。
で、renderedCallbackに処理を移したらFirefoxで無限ループしました。
再描画の処理が入ってたからか。
回避方法はちょっと思いつかなかったです。
AWS上でmysqlをrpmでインストールするには。

# mysqlをrpmで構築した
案件でバージョンを細かく指定されたmysqlのリプロダクションを行った時に気づいたことのまとめです。

## 実際に入れたもの

```
mysql-community-client.x86_64        5.6.36-2.el6                  installed
mysql-community-common.x86_64        5.6.36-2.el6                  installed
mysql-community-libs.x86_64          5.6.36-2.el6                  installed
mysql-community-server.x86_64        5.6.36-2.el6                  installed
```

clientは本体。
commonはクライアントライブラリから必要とされ るファイルの全て。（MySQL データベース共通ファイル (/etc/mysql/my.cnf など）がある。
libsは各種ライブラリ
serverは実行ファイル。コレがないとmysqlの起動がそもそもできない。

なぜか、こいつはrpmのホームから検索かけても引っかからなかった。
[myqal-server5.6 el6 86_64](https://centos.pkgs.org/6/mysql-5.6-x86_64/mysql-community-bench-5.6.36-2.el6.x86_64.rpm.html)

## el6 とか　el7
RedHat Enterprise Linux 5, 6, 7 互換の事。AWSだと、Amazon Linuxがel6ベースだし、Amazon Linux2ならel7ベースだからコレにあわせて入れるようにすればスンナリ入る。
ただし、Amazon Linux2はamazon-linux-extrasっていう独自のライブラリを持っていて、あまりにも古いものだと強制的にバージョンの高いものを入れるように働いてくるので、注意。php5.3以下なんかはrpm使っても落としてこれなかったです。
GASでslackに画像をPOST

```js
var postUrl = 'https://hooks.slack.com/services/XXXXXXXXXXXX/XXXXXXXXXXX/XXXXXXXXXXX' // Slackのincoming-webhook
var username = '侍'  // 通知時に表示されるユーザー名
var icon = ':hatching_chick:'  // 通知時に表示されるアイコン
var URL = "https://www.googleapis.com/customsearch/v1?key=XXXXXXXXXXXXXXXXXXXXX" // googleの画像検索API
var room = '#random'

function postAnimalImage() {
  var data = getAnimal("柴犬")
  var urls = []
  data.items.forEach(function(it) {
    urls.push(it.image.thumbnailLink)
  })
  var randomUrl = urls[Math.floor( Math.random() * data.items.length )]
  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : randomUrl,
     "channel": room,
  }
  var payload = JSON.stringify(jsonData)

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  }

  UrlFetchApp.fetch(postUrl, options)
}

function getAnimal(keyWord) {
  var url = Utilities.formatString(URL, keyWord)
  var response = UrlFetchApp.fetch(url)
  var json = response.getContentText()
  var data = JSON.parse(json)
  return data
}
```
【Rails】FactoryBotをcreateしようとしたらErrorが吐き出されたので調べてみた


RSpecを書いたところ、FactoryBotからuserをcreateするところでエラーが発生してしまうので、原因を調べてみた。

# 事象

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { "テストユーザー" }
    email { "test_user@test.co.jp" }
    password { "12345678" }
  end
end
```

```user_spec.rb
require 'rails_helper'

RSpec.describe User, type: :model do
  let(:user) { user :user }

  describe "バリデーション" do
  
    it "nameが空だとinvalid" do
      user.name = ""
      expect(user).not_to be_valid
    end
  end
end
```

rspecを実行したところ、エラーが発生。
ちなみに今回、Userモデルのvalidatesは`:name,  presence: true`だけとする。

```
Failures:

  1) User バリデーション nameが空だとinvalid
     Failure/Error: let(:user) { create :user }
     
     ActionView::Template::Error:
       Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
     # ./spec/models/client_spec.rb:4:in `block (2 levels) in <top (required)>'
     # ./spec/models/client_spec.rb:9:in `block (3 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # ArgumentError:
     #   Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
     #   ./spec/models/client_spec.rb:4:in `block (2 levels) in <top (required)>'

Finished in 0.52519 seconds (files took 2.18 seconds to load)
1 example, 1 failure
```

何やら`Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true` というエラーが吐き出されている。

#結論

今回は**`devise`**を使っているのだが、メール認証機能の`confirmable`を有効にしている。


```user.rb
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
         :confirmable
```

メール認証機能とは→アカウント新規作成時に登録したアドレスにメールが送られ、確認用リンクをクリックするとログイン画面からログイン可能となる。
このリンクをクリックしたタイミングで、Userの**`confirmed_at`**カラムにその時刻がsaveされる。
どうやら`confirmable`が有効の場合、この**`confirmed_at`**がpresentかnilかを見分けて、そのユーザーがログイン可/不可を条件分けしているらしい。
（詳細までは調べられてません）

従って、FactoryBotのファイルに`confirmed_at`を書き加えると

```spec/factories/user.rb
FactoryBot.define do
  factory :user do
    name { "テストユーザー" }
    email { "test_user@test.co.jp" }
    password { "12345678" }
    confirmed_at { Date.today }
  end
end
```

```
.

Finished in 0.2486 seconds (files took 4.21 seconds to load)
1 example, 0 failures

```
無事、rspecが通りました。
わたしのMacの設定をメモメモ

# わたしのMacの設定をメモメモ

* 未来の自分用に記録

## インストールするもの

* chrome: ブラウザ
* Google日本語入力
    * https://www.google.co.jp/ime/
* spectacle: ウインドウ管理
    * https://www.spectacleapp.com
* alfred : rancher
    * https://www.alfredapp.com
* iterm : ターミナル
    * https://www.iterm2.com
* brew : macのパッケージ管理ツール
    * https://brew.sh/index_ja
    * (インストール手順あり)
* zsh : shell
    * (インストール手順あり)
* oh-my-zsh : zshのパッケージ管理
    * (インストール手順あり)
* docker for Mac
    * https://www.docker.com/products/docker-desktop
* vim : brewでインストールしましょう。Clipboard共有のため
    * (インストール手順あり)
   * Neobundle : vimのプラグイン管理
        * (インストール手順あり)
* vnote: markdownのノート
    * https://github.com/tamlok/vnote/releases
* clipy: clipboardの履歴
    * https://github.com/Clipy/Clipy/releases


### インストール手順

* brew

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

* zsh

```
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

* tmux

```
brew install tmux
```

* Neobundle

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh)"
```

## 諸々設定
* iterm
* zsh
* tmux
* vim

### iterm

* 色を設定
    * [Mac iTerm で iceberg のテーマを使う](https://qiita.com/tarosaiba/items/fcc399006025ebe9152c)

###  zsh

* プロンプトを変更

```
ZSH_THEME="mh"
```

* aliasを設定

```
alias ls="ls -G"
alias ll="ls -lG"
```

### tmux

* for share clipboard

```  
brew install reattach-to-user-namespace
```

* setting
    * [ファイルはこちら](https://github.com/tarosaiba/my-config/blob/master/.tmux.conf)

```  
ls .tmux.conf  
```

* 参考
    * [How to Copy and Paste with tmux on Mac OS X](https://thoughtbot.com/blog/how-to-copy-and-paste-with-tmux-on-mac-os-x)
        * 2019/6に変更があったみたい
    * [tmuxとMacのクリップボードを共有する（copy-mode, vim）](https://qiita.com/upinetree/items/cd80bc7865c52091be10)


### vim

* 設定ファイルはこちら [vimrc](https://github.com/tarosaiba/my-config/blob/master/.vimrc)
距離のあるメンバーとの飲み会で使える超簡単アプリの作り方 via Googleスプレッドシート

# 1.はじめに
こんにちわ。総務部秘書課につとめるラ塩ともうします。
主に、関係各所とお社長をとつなぐお仕事をしております。
Qiitaさんは技術系記事書くところって聞いてるんで、こまけえこと飛ばして簡潔にいきます。GASも、関数すらいらない奴、石で作った斧って感じのツールです。
### 本稿の対象となる方
- そんなに仲良くない関係性（会社等）の飲み会の幹事になった人
- オフ会ひらくけどハンドルネームしか知らないシィという場合
- LINEやら交換できる空気がない、かといって連絡手段メールとか面倒
- プログラミング一切できない人
 
# 2.超簡単アプリ＝要はテンプレート内容
- 出欠リスト（調整さんリスペクト）
- 適当チャット　※それぞれGoogleスプレッドシートのシートになっています

# 3.前提
- Googleアカウント取得
- 検証用のスマホに、Googleスプレッドシートのアプリをダウンロードしとくと吉
    - [アンドロイド](https://play.google.com/store/apps/details?id=com.google.android.apps.docs.editors.sheets&hl=ja)
    - [iphone](https://apps.apple.com/jp/app/google-%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88/id842849113)

# 4.テンプレートDL
1. Googleアカウントにログインします。

2. [このスプレッドシート※テンプレート※](https://docs.google.com/spreadsheets/d/1CeybYdPP7DMb_hj4O-yHMv4Gqkf5zSjplkQtth1G84Y/edit?usp=sharing)を、グローバルナビのファイル→コピーを作成で、マイドライブにコピーします。

# 5.出欠リストの設定
PCでやったほうが確実に早いです。

1. 出欠リストの基本情報（お店、日程、予算）を入力します。

2. 列Bに参加予定者を入力します。※各自勝手に入力してもらってもいいです

3. 参加者にリンクで共有し、予定を記載してもらいます。共有範囲は細かく決められます。かならず全員が編集できるようにしておきましょう。閲覧だと何も書けません。
![limit.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/236f9168-4a32-fa5b-852f-7c8dcc1676c7.jpeg)

「編集者の権限があっても、新しいメンバーの追加はできないようにする」といった設定もできます。調整さんにはない機能かもしれません。
![limit2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/a6716378-b49c-632c-ac58-c2db73f95bdc.jpeg)

# 6.適当チャットの設定
PCでやったほうが確実に早いです。

1. 列Bごと選択し、データ→データの入力規則で、出欠さんで決定した参加予定者を入力します。カンマ区切りでザクザク入れます。リストを直接指定にして、プルダウンリストを表示しましょう。警告は表示してもしなくてもどっちでもいいです。
 ![chat_name.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/c7c3c4d8-79e9-efd4-c8da-bb78f1cdbda4.jpeg)

2.列Bごと選択し、グローバルナビの表示形式→条件付き書式で、人ごとにセル色を変えます。
![namecolor.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/26551b46-35d8-39ff-dfaf-8ae5fb159348.jpeg)

3.列Cのいいね欄は、べつにあってもなくてもいいので、不要であれば削除しましょう。押したら数が増えたりしない、単に、これまた直接リスト入れてるだけです。9個もいいねつけばいいだろ…ということで上限9個です。
![iine.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/e1ea86d5-b365-1486-57ab-a0b6e7928a61.jpeg)

これで設定は完了です。

# 7.どんな感じに使うか
出欠リストはこんな感じですかね。幹事の田中さん大変なので、いいね多めにあげましょう。
![shukketu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/57780eff-62c9-b462-3445-8b20cfc52dfe.jpeg)
検討段階の適当チャットはこんな感じ。社長は来ないんですよ、ずうずうしい斎藤さんです。
![jizen.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/5a09d9fc-f4a3-88d6-78de-ca26e8baeb71.jpeg)
当日にスクロールめんどくさいので、長くなってたら非表示にしときましょう。
![hihyouji.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/9d3837d1-9603-7ce1-e786-6f4d2813c7b1.jpeg)
当日はこんな感じです。ピーターさん、たどり着けるでしょうか。
![todayt.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/718ef6b4-0619-3630-5b05-efebe6223878.jpeg)

# 7.まとめ
- LINEを交わすほどまだ親密じゃない、全員が知り合いとはいえ共通したチャットがない、という場合はわりと使えます。2ちゃんだと思えばたのしいです。
- 字とセル幅が小さいのは**レスポンシブ**だからです。レスポンシブです。
- 通知がないのが難ですね。まあ仮なんで。
- こういう、適当につくって遊ぶ＆なんとなく使えるの、たのしい。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454162/0ac7289b-401e-a42c-72ec-39f83a0231d8.jpeg)
MAMPでWordPressの開発環境を構築する

MAMPで複数のWordPressの開発環境を構築する方法です。
難しくはありませんが、念のためまとめておきました。

今回の内容は、以下の記事の続きになりますので、バーチャルホストの設定済みであること
を前提にしています。
「MAMPのインストール＆初期設定＋αをしてみる 」
https://qiita.com/shiki_neki/items/35d73f57615ed1f1d4fb


# WordPressの最新版をダウンロード

今回は、htdocsの中に作成したtestというフォルダを使用します。
こちらは、http://test.local/
でアクセスできるよう、Apacheの設定ファイルの編集とhostsファイルの編集をしてあります。

まず、WordPressの本体をダウンロードします。
https://ja.wordpress.org/download/

解凍したWordPressの本体を、上記のhtdocs内のtestのフォルダへ全て入れておきます。

#データベースを作成
データベースはサイトごとに新規に作成します。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447048/d69f49b6-29f9-8ba1-fdcc-2f771ae27eec.jpeg)
MAMPの「Open WebStart page」をクリックして開きます。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447048/0bf1a0c6-66c7-37a2-4485-35e6c0a43e49.jpeg)
このような画面が開きますので、MySQLの項目からphpMyAdminを開き、データベースを作成します。

今回は、「test_wp」というデータベースを作成しました。

#WordPressをインストールする
http://test.local/
にアクセスすると、WordPressのインストール画面が表示されますので、MySQLの情報を以下のように入力します。
![スクリーンショット 2019-07-04 15.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447048/7cfe6ba3-bcb2-6cd8-dc08-458677bfff5d.png)

送信をクリックして、あとは通常のWordPressのインストール時と同様に、必要事項を入力してインストールの完了です。


#引用・参考サイト
MAMPで複数のWordPress開発環境を簡単に作る方法
https://yosiakatsuki.net/blog/dev-mamp-multi/
DMSを使ってオンプレからAWSにデータ移行したよ

## 概要
仕事でオンプレDBからAWSにデータ移行したので振り返りも兼ねてまとめたくなった
ところどころ自分のプロダクトに依存する部分があるので参考程度に留めてね

自分のプロダクトでは、下記理由によりスキーマコピーとレプリケーションはMySQLの機能で行いデータ移行はDMSで行いました

+ エンジンがMyISAMのスキーマがあるがDMSでスキーマを作るとInnoDBに再構築されてしまう
+ DMSのレプリケーションには対応してない型があった
+ 本番DBの権限の問題で自由にデータをdumpできない＆DBへの負荷を考えてデータ全部dumpするのは避けたい

## データ移行って？
サービスや機能をオンプレからパブリッククラウドへ移行するにあたってDBのデータもクラウドで用意するDBに移す作業です
DBがオンプレにあっても問題はないですが疎通や相性など諸々含めると一緒にパブリッククラウドに移しちゃったほうが将来的に楽できると思います

## DMSってなに？
AWSにあるデータベースのデータ移行とレプリケーションサービス
正式名称は、AWS Database Migration Service
移行中もソースデーターベースを止める必要がないし異なったデータベースプラットフォーム間での移行もサポートされてるすごい奴
サポートされてるプラットフォームや細かい機能は挙げだすときりがないので[こちら](https://aws.amazon.com/jp/dms/)を参照ください
とにかくすごい。好き

## DMSでできること
### スキーマの移行
+ オンプレのスキーマ情報をAWSのDBにコピーできる
+ 完全にコピーされる保証はないのでmysqldumpなどを推奨

### データの移行
+ オンプレのDBに格納されているデータをAWSのDBにコピーできる
+ 一部のテーブルデータは移さないなどの設定も可能

### データ移行後の変更も追跡する
+ データの移行が終わった後に変更を追うことができるのでそのままレプリケーションを貼ることができる
+ １つの機能でデータ移行とレプリケーションの両方を実現できる
+ 移行後も変更に追従してくれるので、切替も切戻しもローリスク

### 最小のダウンタイムでのデータ移行
+ レプリケーションインスタンスを挟んでのデータ移行なのでオンプレの機能を制限する必要がない
+ すごい

### 異種間(OracleからMySQLなど)のDBの移行をサポートしている
+ レプリケーションインスタンスを挟んでのデータ移行なので中間インスタンスでいい感じにできる
+ まじですごい

## 移行のイメージ
DMSとオンプレDBへのデータの流れはこんな感じ
データ移行後にレプリケーションを貼り続ける場合、データ移行後もこれが続くイメージ
![DMSデータ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220950/e4802846-acc7-63fe-585b-275c9902c778.png)


## 移行手段の選択肢
### それぞれのDBの機能を使って移行
mysqldumpなどでスキーマ情報とデータをダンプし移行先のDBに流し込みコマンドでレプリケーションをとる方法

+ メリット
    + 障害発生点が減る
    + 同じデータベースプラットフォームの場合こちらの方がスタンダード
+ デメリット
    + dumpしてデータを移行する性質上どうしてもDBを止めるか書き込みを制限するタイミングが発生してしまう
    + 何かあったときロールバックやデータの差異の修正が大変
    + 異なったデータベースプラットフォームへの以降はできない？
    + dumpするために権限をもらうか権限がある人にファイルをもらう調整が必要

### DMSを使って移行
DMSを使ってデータ移行とレプリケーションをとる方法

+ メリット
    + ソースDBを止めないで移行できる
    + データ移行とレプリケーションが1つの機能でできる
    + 異なったデータベースプラットフォーム間での移行もサポートされてる
+ デメリット
    + サポートされてない型があり必ずできるとは言えない
    + レプリケーションインスタンスを立てる性質上、障害点が増えてしまう


## ハマりポイントあります
+ AuroraやRDS for MySQLでは、MyISAMはサポートしてない
    + サポートしてないのでMyISAMで作られたテーブルがある場合、DMSでスキーマ情報をコピーすると全てInnoDBで構築される
    + InnoDBで構築されてもいいならDMSで行うと勝手にエンジンがInnoDBになっていい感じ
+ DMSでは、サポートされてない型がある
    + スキーマやカラムの型次第では、DMSでサポートされておらず使えない可能性がある
    + サポートされている型一覧は[こちら](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html)
+ AWSのRDSには、replicate-ignore-db設定がない
    + ignore設定がないので全てのDBをレプリケーションしない場合、binlogに吐き出すDBを指定するなどの設定が必要
+ データ移行ではサポートされてるけどレプリケーションではサポートされてない型などがある
    + データ移行では問題なかったけどレプリケーションを貼るとうまくいかない場合があるのでどこまで出来てどこを他の機能に任せるかの判断が必要
+ セカンダリインデックス、非プライマリーキー制約、デフォルト値などはサポートしてないので移行先に自分で作る必要がある

## 実作業コマンド
＊ 作業メモには、オープンにできない内容が載っていたのであとでいい感じにして追記します

## 最後に
DMSは、とても便利ですごい機能ですが自分たちのプロダクト次第でできる範囲が変わってくる
どこまでできるかは実際に試さないとわからない部分があるので試してみるといい
MyISAMはAWSと相性が悪いのでめんどくさいから脱却したい
AWSへの移行は、どこまでをどの機能で行うかが難しいが自分のプロダクトにあった運用を
短期で終われるならロールバックなども考えるとできるならレプリケーションもDMSでやりたかった
DMSしゅき〜〜

## 参考文献
AWS DMS : https://aws.amazon.com/jp/dms/
DMS MySQLサポート : https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.MySQL.html
envsubstでDatadogのAPIキーをrun時にエントリポイントで差し替える

gitにコミットしたくなかっただけの表記のとおりの備忘録です。

envsubstの単体動作はこんなかんじ。

```
# vi hoge.txt 
# cat hoge.txt
var1=${aaaa}
# export aaaa=hoge ;envsubst < hoge.txt > fuga.txt
# cat fuga.txt 
var1=hoge
```

こんなかんじにfluentdで行先を増やしたかったとして、
https://github.com/DataDog/fluent-plugin-datadog

```
+  <store>
+    ＠type datadog
+    ＠id awesome_agent
+    api_key '${DATADOG_APIKEY}'
+    include_tag_key true
+    tag_key 'tag'
+    dd_source 'ecs'
+    dd_tags 'logshipper:fluentd,ecstask:ecs-td-web-prod'
+    dd_sourcecategory 'ecs-td-web-prod'
+    host 'intake.logs.datadoghq.com'
+    ssl_port '10516'
+  </store>

```

APIキーっぽい変数はdocker runにあたるECSでいうとタスク定義の環境変数からエントリポイントかなにかで読みこんで反映させたいとする（docker buildにあたるCodebuildのbuildspec.ymlとかにかくビルド時だとコンテナに埋め込まれるのがアレな気がする）

とすると、fluentdコンテナのエントリポイントにあたるファイルがDockerfileでみると普通にかかれてたので（既存コンテナがあればdocker inspect container-idでもみられる）

```
# tail -3 Dockerfile 
ENTRYPOINT ["/bin/entrypoint.sh"]

CMD exec fluentd -c /fluentd/etc/${FLUENTD_CONF} -p /fluentd/plugins $FLUENTD_OPT
```
こんなかんじにエントリポイントのスクリプトを修正するとよさそう

```
# cat entrypoint.sh 
#!/usr/bin/dumb-init /bin/sh

export DATADOG_APIKEY=$DATADOG_APIKEY
envsubst < /tmp/conf/fluent.conf > /fluentd/etc/fluent.conf

uid=${FLUENT_UID:-1000}

# check if a old fluent user exists and delete it
cat /etc/passwd | grep fluent
if [ $? -eq 0 ]; then
    deluser fluent
fi

# (re)add the fluent user with $FLUENT_UID
adduser -D -g '' -u ${uid} -h /home/fluent fluent

# chown home and data folder
chown -R fluent /home/fluent
chown -R fluent /fluentd

exec su-exec fluent "$＠"
```
ちなみに、このときのenvsubst の位置が大事で、chownしたあとにすると権限エラーでfluentdコンテナが起動しなくなりました。

あと、今回のfluentdコンテナのソースイメージがalpineなのでapkでgettextを入れとかないと(Dockerfileに追記しビルドしなおさないと)envsubstが居ないかんじでした。

```
RUN apk --no-cache add libintl && \
      apk --no-cache add --virtual .gettext gettext && \
      cp /usr/bin/envsubst /usr/local/bin/envsubst && \
      apk del .gettext
```

で、exportしてる変数をどこで指定するかというと、ローカルのテストでdockerコマンドつかってるならrun打つときに-e か--env-fileで指定、composeならymlにかけばよくて、ECSのタスク定義だったらコンテナ定義の環境変数のところにValueでじかにかくかValueFromでSystemManagerのSecretかなんかにいれたりしてそこからIAMロールの権限適切に定義してとってくる、という話でよさそうでした。

実際にさしかわったかどうかみるには以下のとおり。
（あとこの場合はログがとんできたかどうかなど）

```
# docker ps
# docker exec -it e12665df9414 grep api /fluentd/etc/fluent.conf
    api_key 58e401*******************2b67218
```

以上。
TECH ~Day11~

学習内容
・フォーム
・pry-rails
・binding-pry


・フォーム
ユーザーが情報を入力し、その情報をサーバーに送信するためのもの。HTMLコードの中にform要素を作成し、その中にフォームを構成する部品のinput要素やtextarea要素を配置することで作成できる。

Railsでフォームから情報を発信するには「form_tag」をはじめとするヘルパーメソッドを使う。


・pry-rails
Rails向けのデバックツール。
バグの有無、処理を止めて、ソースコードが正しいのかチェックするツール。


・binding-pry
これは、binding.pryという文字列をソースコードの中に記述することで、binding.pryという文字列が存在する部分でRailsの処理を止めることができるというものです。
[Git]merge(合流)という名前のせいで、どっちからどっちへの作業なのかが分かりにくい件

# はじめに
ペーペーながらgitを使っていて、`pull`、`push`、`commit`、`add`、`checkout`、`branch`なんかは見慣れてきたけど、最近mergeをする機会が出てきました。
やや混乱したので、備忘録を兼ねてまとめておきます。
# mergeはどっちからどっち？
mergeの意味を調べたら、合流とか合併という意味らしい。
これが、ややこしく感じた根源かと思ういます。

mergeはソースを合わせるということですが、**どっちからどっちに？ってところがややこしい。**
個人的に腑に落ちた表現は、次です。
#古いブランチが、新しいブランチの情報を取りに行く
たとえば、

AブランチとBブランチがあって、Aが最新だとする。
今回は**Bブランチが古いので、新しいAブランチに合わせたい**という場合についてです。

この場合、結論からいうと、**BブランチがAブランチの情報を取りに行く**、と考えると分かりやすいです。
こう考えたことで、

 - Bブランチが主体となって作業する
 - そのため、Bブランチにcheckoutしておく必要がある
 - また、対象がAブランチなので記述には`git merge Aブランチ`となる

これらが腑に落ちました。
# さいごに
今日はものすごく簡単な内容でしたが、なぜか僕は混乱したので共有させてもらいます。
最後まで、ありがとうございました。
Convert Excel to Markdown table

Excel to Markdown steps
Step 1. First, Open https://tableconvert.com with a browser.

Step 2. Click the import button in the menu bar and switch to the Excel tab. In the import window, you can see instructions like this:

Paste your cells from Excel, Numbers, Google Docs or Browser table

Step 3. As mentioned above, Copy a range of cells from Excel(or other spreadsheet programs) and paste it into the box, click the import data button.

Step 4. Now, the content copied from Excel has been imported into the website and automatically converted to a Markdown compliant table, you only need to ensure that the tab selected in the output area is Markdown.
今更だけどfind()とchildren()の違いについて

もう使われなくなってきたjQueryですが、コードを読むときにやたらjQueryが使われている＆Reactを用いた開発でもjQueryと共存ができるのでさきほど勉強をはじめました。
そこでfind()とchildren()が似てたので、使い分けについて説明していきます。

#find()とchildren()の違いとは
`小要素を取得できる階層の違い`です。
`find()`は小要素すべてを取得でき、`children()`は１階層下の要素のみ取得できます。

HTMLが以下のときに

```html
<div id="セレクタ">
  <a>あいうえお</a>
  <div>
    <a>かきくけこ</a>
  </div>
</div>
```

##find()の場合

```js
$('セレクタ').find('a');
```

で、親要素のセレクタ内にある小要素`すべて`の`<a>`を取得します。
なので、あいうえおとかきくけこ両方取得できます。

##children()の場合

```js
$('セレクタ').children('a');
```

で、親要素のセレクタ内にある`１階層下`の小要素`<a>`のみ取得します。
なので、あいうえおのみ取得できます。
Vuex内でAPIを叩きVue.jsのcreated内でstateを取得する

##はじめに
初めての投稿です。

今回Vuex内でaxiosを使いAPIからデータを取得します。
サイトにアクセスした際にVue.jsのコンポーネントへデータを渡し画面にデータを表示させます。

##準備
|    | バージョン | 必須 |
|:-----------|------------:|:------------:|
| Laravel    |  5.8.26  |  no     |
| Vue.js     | 2.5.17 |   yes   |
| Vuex     | 3.1.1 |    yes     |
| axios     | 0.18 |    yes     |
自分はLaravelを使いAPIもそちらで用意しました。
APIさえ使えればどのような状態でも大丈夫です。

##処理の流れ
①Vue.jsのcreated内でVuexのactionを呼び出す
②actionがAPIを叩く
③actionがAPIから取得したデータを引数としてmutationを呼び出す
④mutationでstateを更新する
⑤その後getterでstateを取得する

##Vuexのコード
```article.js
export default {
    namespaced: true,

    state: {
        articles: [],
    },

    getters: {
        getAll: state => {
            return state.articles;
        },

        getOne: state => id => {
            return state.articles.find(list => list.id === id);
        },
    },

    mutations: {
        setArticles: (state, payload) => {
            state.articles = payload.data;
        },
    },

    actions: {
        async setArticles({ commit }) {
            const payload = {
                data: '',
            };
            await axios.get('/api/articles')
            .then(response => {
                payload.data = response.data['data'];
                commit('setArticles', payload);
            })
            .catch(error => {
                console.log(error);
            });
        },
    },
}
```

APIから送られてくるデータはjsonです。

```
{
    "data": [
        {
            "id": 1,
            "title": "non",
            "body": "Sed non accusantium rem ad totam necessitatibus."
        },
        {
            "id": 2,
            "title": "totam",
            "body": "Ab et veritatis veniam et expedita voluptatem ipsam."
        },
        {
            "id": 3,
            "title": "magnam",
            "body": "Error enim laboriosam saepe delectus est."
        },
        {
            "id": 4,
            "title": "assumenda",
            "body": "Delectus tempore omnis occaecati quibusdam nisi."
        },
        {
            "id": 5,
            "title": "error",
            "body": "Quia exercitationem delectus vitae nulla corrupti eos."
        }
    ]
}
```

##Vue.jsのコード
```Article.vue
<template>
    <div>
        <p>{{ article_list }}</p>
    </div>
</template>

<script>
import { mapActions, mapGetters } from 'vuex';
export default {
    
    data() {
        return {
            article_list: [],
        }
    },

    created() {
        //this.setArticles;     非同期で処理されるためか遅れて完了する
        //this.article_list = this.getAll;　     stateが更新されるよりも先に実行される
        this.setArticles().then( () => this.article_list = this.getAll );       //この書き方でうまく動いた
    },

    computed: {
        ...mapGetters('articles', [
            'getAll',
        ]),
    },
    
    methods: {
        ...mapActions('articles', [
            'setArticles',
        ]),
    },

}
</script>
```

コメントアウトしている箇所で苦しみました。

##出力結果
![vue-article.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454133/4a082f92-f4a5-e8e6-c4a6-06d4c97131d3.png)
きちんと出力されました。

##最後に
JavaScriptを勉強したことがないためこのような書き方でいいのか正直わかっていません。
コメントのほうでご教授してもらえたら幸いです。
Datadogの便利機能 Live Processes編

# 概要
Datadogの便利機能をシリーズでお届けする予定です。
今回は、**Live Processes**のご紹介です。 
DatadogでEC2上のプロセス監視を行たい場合、Live Processes機能が便利かもよというお話です。
DatadogのLive Processes機能を使うことで、EC2上で起動しているプロセスが一覧できる上、
プロセスごとのCPU使用率、メモリ使用量、プロセス起動時刻等が一覧で確認できます。便利です。

まずは、導入後の画面から。
<img width="1656" alt="スクリーンショット 2019-07-04 14.24.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/ad0944ac-80a9-37f5-f5c9-b2f8374b1e69.png">

参考：https://docs.datadoghq.com/graphing/infrastructure/Processes/?tab=linuxwindows

# Live Processes 導入方法
導入方法はいたって簡単です。
設定ファイルに以下の設定を追加するか、コメントアウトして、Datadog Agentを再起動するだけです。

```yaml

# 以下の設定を追加 or アンコメント
Processes_config:
  enabled: "true"
```

```
# Datadog Agentの再起動
$ sudo initctl restart datadog-agent
```

ここがすごいな(楽だな)と思ったところなのですが、
今ままでのプロセス監視は、監視するプロセスを1つ1つを`Processes.d/conf.yaml`に定義する必要があった？かと思います。
参考：https://docs.datadoghq.com/integrations/Processes/

それが上述の設定のみで、起動しているプロセスを一覧化してくれます。

# 機密性の高い情報のマスキング
`custom_sensitive_words` にマスクしたいワードを登録しておくと、プロセス一覧で表示する際にマスキングしてくれるそうです。
<img width="1448" alt="Processes_arg_scrubbing-bc46f797.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/962408f5-9123-b256-a373-89922f34ab7a.png">
引用元： https://docs.datadoghq.com/graphing/infrastructure/process/?tab=linuxwindows#process-arguments-scrubbing


以下のように設定を追加して、Datadog Agentを再起動するだけです。

```yaml

Processes_config:
  enabled: "true"
  scrub_args: true
  custom_sensitive_words: ['personal_key', '*token', 'sql*', '*pass*d*']
```

また、`strip_proc_arguments`を設定することで、プロセスからすべて引数を削除することもできるようです。（未検証）

```yaml

Processes_config:
  strip_proc_arguments: true
```

# プロセス監視方法
プロセスの監視方法も簡単です。
Live Processesで抽出したプロセスを選択して、監視するだけです。
Manage Monitors →　New Monitor　→　Processesと遷移します。
<img width="585" alt="スクリーンショット 2019-07-04 14.56.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/f641798d-e8dc-ed81-9478-e7065e4c21ae.png">

あとは、`Live Processes Monitor`　を選択して、監視したいプロセスを設定していきます。
<img width="957" alt="スクリーンショット 2019-07-04 14.57.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95324/38e2af38-c58a-6535-47b4-be19ac995e9a.png">

もちろん、Tag等を使って対象をフィルタリングしたりもできます。

# 料金体系
このLive Processes機能は、[料金表](https://www.datadoghq.com/pricing/)をみると、EnterPriseプランからとなっていますが、日本だとまだこのEnterPriseプランがないらしく、`Pro Plus`というプランがあるようで、そちらで利用できます。
詳細は、Datadogに確認してみてください。

# まとめ
まずはフリートライアルで使ってみて、使えそうであれば導入を検討する感じがいいと思います。
プロセスごとのCPU使用率やMemory利用量がわかるので、トラブルシューティング時には便利だと思います。
`Live Processes`ぜひ使ってみてください。
Three.js でCOLLADA(.dae) を読み込み、モデルに紐づいた頂点カラーをシェーダで使用する。

daeのファイル名はcube.daeで、./model/に配置。

```Javascript
var loader = new THREE.ColladaLoader();
loader.load('./model/cube.dae', function(data)
{
    data.scene.traverse(function(obj)
    {
        if(obj instanceof THREE.Mesh === true)
        {
            var mesh = obj;
            mesh.material = new THREE.ShaderMaterial({
                vertexShader: document.getElementById('vertexShader').textContent,
                vertexColors: THREE.VertexColors,
                fragmentShader: document.getElementById('fragmentShader').textContent
            });
            // あらかじめ生成したsceneにadd
            scene.add(mesh);
        }
    }); 
});
```

data.sceneは、THREE.Scene。daeではカメラなどを含んだシーンまるごとがデータのため、Sceneの子要素からモデルを抽出している。.traverseは、THREE.Sceneの子要素を取り出す関数。

ローダーは、three.jsの本体には入っていないので、別途読み込む必要がある。

```html
<script src="js/loaders/ColladaLoader.js"></script>
```

ShaderMaterialで頂点カラーを使いたいときは、vertexColors: THREE.VertexColors を指定。Vertex Shader上では、attribute vec3 colorで渡される。

頂点カラーの情報をモデルにもたせて使いたい場合、daeが何かとやりやすいのでないかなと。fbxは何かとつらい。
【Swift】Swift5.1からenumのAssociated Valuesにデフォルト値を設定できるようになった

# Swiftのenum

**Associated Values**という付属の値をenumの要素に含めることができます。

Associated Valuesは初期化時に値を設定する必要がありましたが
Swift5.1よりデフォルト値を設定することができるようになりました。

今回は公式のガイドに載っている例を使って見てみました。
https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html

検証環境: Xcode11 Beta3

## これまで

下記ように全ての値を指定する必要があります。

```swift

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

var productBarcode = Barcode.upc(8, 85909, 51226, 3)

print(productBarcode) // upc(8, 85909, 51226, 3)
```

## Swift5.1

```swift

enum Barcode {
    case upc(a: Int = 1, Int, Int, Int)
    case qrCode(String)
}

var productBarcode = Barcode.upc(85909, 51226, 3)

print(productBarcode) // upc(a: 1, 85909, 51226, 3)
```

とデフォルトの値を設定することができるようになります。
ただし
**ラベル引数を設定しないとコンパイルエラーになりました。**


例えば下記のように間を抜かしても大丈夫なようです。

```swift

enum Barcode {
    case upc(a:Int = 1, Int, Int, d: Int = 4)
    case qrCode(String)
}

var productBarcode = Barcode.upc(85909, 51226)

print(productBarcode) // upc(a: 1, 85909, 51226, d: 4)
```

少しの変化かもしれませんが
これで冗長な記述が少し減ればうれしいですね:smiley:
VueでTwitter認証するときにCROSエラーが発生したときの対処法


vueでいつものように`axios`を使ってサーバーと通信していました。
が、Twitterと連携させるときに以下のようなエラーが発生。

```
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://api.twitter.com/oauth/authenticate?oauth_token=xxxxxxxxxxxxxx with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.
```

どうやら`CORB(Cross Origin Request Blocking)`によってブロックされてしまったらしい。
正直意味がわからなかったので色々調べてみたら`Same-Origin-Policy`が関わっていることが分かりました。

##そもそもSame-Origin-Policyとは何なのか

**Same-Origin-Policy(同一オリジンポリシー)**とは、**同じドメイン同士でしかやり取りできませんよ！というウェブセキュリティにおけるルール**のことです。

あるオリジン(スキーム + ホスト + ポート)にアクセスして、そのリソースから異なるオリジンにAjax通信できないよう制限する仕組みで、スキーム、ホスト、ポート等が一つでも違えばアクセスできません。

サーバーが二つあるとしたらこんな感じです。

![無題のプレゼンテーション (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242611/489e1bf1-ec7c-b962-26ce-05b2f6f94f0b.png)


1. クライアントがAサーバーにアクセス
2. Aサーバーはクライアントにレスポンスを返す
3. クライアントがBサーバーにAjax通信を送る
4. Bサーバーから違うオリジンからアクセスするな！と怒られる。

**https:://example.com**から**https::/test.com** にAjax通信はできません。
なぜならホスト名が違うから。(ポートやスキームが違ってもだめ)

では今回のTwitter認証のエラーに当てはめてみましょう。
![無題のプレゼンテーション (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242611/6dcf1f6b-363c-cea7-8439-e23bf60f756d.png)

1. `localhost`にアクセス
2. `localhost`はレスポンスを返す
3. `localhost`から`TwitterAPI`にAjax通信を送る
4. 違うオリジン(URL)からアクセスするな！と怒られる。

Twitter側のAPIサーバーで、私はこのURLからのアクセスは許可しないよ！と拒否されてたということですね。


そこで、今回のように`some-origin-policy`に弾かれずに**異なるドメイン同士で安全にリソースを共有するための仕組み**が**`CORS(Cross Origin Resource Sharing)`**というもの。

アクセスするには、通信される側のサーバーで特定のドメインからのアクセスを許可してあげる必要があります。

詳しくは調べていただければと思うのですが、
例えばサーバー側で、以下のようにヘッダーで許可するドメインを設定しなければなりません。

```
Access-Control-Allow-Origin: 'https://example.com'
```

もちろん僕たちがTwitterのAPIサーバーをいじることはできないので、諦めることに。

##解決法 Ajax通信をやめる
長々と調べごとをしてましたが、そもそもAjax通信する必要性がないことに気づいたので、XMLHttpRequestではなく、単純にHTTPRequestを送るように変更することで解決。

```
axios.get("users/auth/twitter")
```
↓

```vue
document.location.pathname = "users/auth/twitter"
```

フロントとバックエンドを分けると認証周りでつまづくことも多いですが、何かセキュリティ的に問題等ありましたらコメントいただけると幸いです。

参考: https://yukimonkey.com/fix-error/cros1/
willTransition系のまとめ

取り上げるのは
・[viewWillTransition(to newSize)](https://qiita.com/jbnkk40/items/2e868738174d4ea3950a#viewwilltransitionto-newsize)
・[viewWillTransition(to size, with coordinator)](https://qiita.com/jbnkk40/items/2e868738174d4ea3950a#viewwilltransitionto-size-with-coordinator)
・[willTransition(to newCollection, with coordinator)](https://qiita.com/jbnkk40/items/2e868738174d4ea3950a#willtransitionto-newcollection-with-coordinator)

※一旦和訳しただけ　あとでまとめます

# viewWillTransition(to newSize)
アプリケーション拡張機能の一部であるView Controllerの場合、そのビューのサイズが変更されようとしているときに呼び出されます。
#### newSize
View Controllerのビューの新しいサイズ。

### 使い方
サイズの変更に応じてレイアウトを変更したい場合、この方法をオーバーライドしてください（アニメーション化されている可能性があります）。

viewWillAppearみたいに考えればいいのかな


# viewWillTransition(to size, with coordinator)
ビューのサイズが変更されようとしていることをコンテナに通知します。
#### size
コンテナのビューの新しいサイズ

#### coordinator
サイズ変更を管理する遷移コーディネータオブジェクト。 
このオブジェクトを使用して、変更をアニメートしたり、進行中の移行に関する情報を取得したりできます。

### 使い方
表示されている`View Controller`のビューのサイズを変更する前に、`UIKit`はこのメソッドを呼び出します。 このメソッドを自分のオブジェクトでオーバーライドして、サイズ変更に関連する追加のタスクを実行するために使用することができます。 たとえば、コンテナ`View Controller`はこのメソッドを使用して、埋め込まれた子View Controllerの特性をオーバーライドすることがあります。 行った変更をアニメートするには、提供されているコーディネータオブジェクトを使用します。

カスタム`View Controller`でこのメソッドをオーバーライドする場合は、`UIKit`がサイズ変更メッセージを適切に転送できるように、実装のある時点で常に`super`を呼び出してください。 `View Controller`は、サイズ変更メッセージを自分のビューと子`View Controller`に転送します。 プレゼンテーションコントローラは、サイズの変更を表示されている`View Controller`に転送します。


# willTransition(to newCollection, with coordinator)
traitCollectionが変更されたことをコンテナに通知します。
#### newCollection
コンテナに適用される特性。

#### coordinator
特性変更を管理する遷移コーディネータオブジェクト。
このオブジェクトを使用して、変更をアニメートしたり、進行中の移行に関する情報を取得したりできます。

### 使い方
`UIKit`は、現在のオブジェクトの特性を変更する前、および影響を受ける`View`や`View Controller`の`traitCollectionDidChange（_ :)`メソッドを呼び出す前に、このメソッドを呼び出します。このメソッドの実装者は、`newCollection`の値に基づいてインターフェイスを適応させるためにこのメソッドを使用できます。このメソッドの一般的な使用方法は、現在のサイズクラスが変更されたときに高レベルの表示スタイルを変更することです。
たとえば、複数の子`View Controller`を管理するコンテナ`View Controller`は、サイズクラスが変更されたときに画面に表示される子`View Controller`の数を変更することがあります。標準の`View Controller`は、このメソッドを使用して、管理するビューに対する制約を変更します。行った変更をアニメートするには、提供されているコーディネータオブジェクトを使用します。
独自のオブジェクトでこのメソッドをオーバーライドする場合は、`UIKit`が特性の変更を関連するプレゼンテーションコントローラおよび任意の子`View Controller`に転送できるように、実装のある時点で常にsuperを呼び出します。 `View Controller`は、特性変更メッセージを子View Controllerに転送します。プレゼンテーションコントローラは、特性の変更を表示されているビューコントローラに転送します。

# 参考記事
・[viewWillTransition(to:) - NSViewController | Apple Developer Documentation](https://developer.apple.com/documentation/appkit/nsviewcontroller/1434443-viewwilltransition)
・[viewWillTransition(to:with:) - UIContentContainer | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uicontentcontainer/1621466-viewwilltransition)
・[willTransition(to:with:) - UIContentContainer | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uicontentcontainer/1621511-willtransition)
・[iOSTraining/1-3_Supporting-Multiple-Interface-Orientations.md at master · mixi-inc/iOSTraining](https://github.com/mixi-inc/iOSTraining/blob/master/Swift/pages/day2/1-3_Supporting-Multiple-Interface-Orientations.md)
mysqlworkbench-1-Configuration  

# 出来ること
　　　　<details><summary>折りたたみ</summary><div>
- SQL開発
  - 接続、作成、管理
  - クエリ実行

- データモデリング
  - リバース、フォワード可能
  - スキーマ操作をGUIで

- サーバー管理
  - ユーザー管理
  - バックアップ、リカバリ
  - 監査データの検査
  - DB状態の表示
  - パフォーマンス監視
  - インスタンスの管理
- データ移行
  - テーブル、オブジェクト、データの移行
  - 最新リリースへの移行 
</div></details>
 
# インストール
[☆](https://dev.mysql.com/doc/workbench/en/wb-installing.html)
コマンド操作出来る

# Configuration
Edit -> Preferences
### Workbench Prefarences
　　　　<details><summary>折りたたみ</summary><div>
>#### General Editors
SQL解析オプション等の汎用エディタオプション
#### SQL Editor
クエリエディタ、オブジェクトエディタ、SQL実行のサブセクション
#### Administration
管理機能
#### Modeling
モデル関連。
デフォルト、MySQL、ダイアグラム、外観。
#### Fonts & Colors:
フォント、色
#### Others
</div></details>


###  MySQL Workbench Settings and Log Files
設定、キャッシュ、ログの保存
[☆](https://dev.mysql.com/doc/workbench/en/wb-configuring-files.html)

###  Common Preferences and Configurations
一般的に使用される設定オプション
　　　　<details><summary>折りたたみ</summary><div>
>#### MySqlインスタンススキャン
Rescan for Local MySQL Instances:
ホーム画面右クリック
#### 安全な更新
Safe Updates
有効になっている場合。
DELETE FROM foo 等のミス防止機能。デフォルト有効。
SQL Editorタブにて設定可能。
#### ターゲットのデフォルトMySQLバージョン
Default Target MySQL Version
モデリング設定をターゲットMySQLサーバーのバージョンに設定。
間違ったバージョンを使用すると、構文が無効になる可能性がある。
#### 管理ツールとスキーマツリーを組み合わせる
Combine Management Tools and Schema Tree
SQLエディタ左部パネルを参照。
#### エディタでコード補完を有効にする
Enable Code Completion in Editors
コード補完。
</div></details>
curl コマンド よく使う時のオプションなどメモ

## curlとは
- httpプロトコルだけでなく、FTPやTELNETなど多くのプロトコルに対応している。
### curl
- オプションなしだとGETメソッドで取得する

### curl -I
- httpヘッダーのレスポンス情報を確認できる

### curl -X POST -H 'hoge' -d 'foo'
- httpのpostメソッドの場合は```-X```オプションを使用する

- httpのヘッダー情報を指定する場合は```-H```オプションを使用する

- httpのbodyのデータを指定する場合は```-data```オプションを使用する
例）“aaa=hoge&bbb=foo&ccc=bar”

- json形式のデータを指定する場合は```-d```オプションを使用する
例）'{"data":{"hoge":"aaaaaaaaaaa","foo":0,"bar":"123456789"}}'

## おまけ

私はcurlの他にpostmanというツールをよく使います。
GUIで直感的なので分かりやすいです。
名前は「postman」と言っていますが
POSTだけでなく、GET,PUT,DELETEなどある程度のメソッドは対応しているので
httpプロトコルベースのWebアプリ系の確認には便利です。

chromeの拡張機能もあればアプリ版もあります。
https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja
https://www.getpostman.com/downloads/
エディターがセーブできない。localhost が読み込めない。→dockerのメモリ足りてる？

・dockerを使っている
・エディターがセーブできなくて何度も npm start をしている
・localhost が読み込めない


こんなお悩み、dockerのメモリを上げることで解決するかもしれません。






やり方
1.dockerを一旦止める
![fullsizeoutput_9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367972/7e866a2e-ac96-38aa-cfe1-e74231aaded7.jpeg)
2.Preferencesをクリック

![fullsizeoutput_8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367972/66bcba4d-4a8f-abcb-058c-e7f4f2e66864.jpeg)
3.ここのMemory, Swapをあげてみる

解決を願います。
CANDY Piを使用した時のSPI通信で起きた問題

CANDY Piを使用した時にSPIの問題があったので情報共有します。


#伝えたいこと
 <font color="Crimson">**CANDY Piを使用するとSPIがCANDY Piに占有されて、通常の使い方ができなくなるようです。**</font> 

#内容

Raspberry Pi 3BにセンサをSPIで接続しており、データをクラウドに上げるためCANDY Piを使おうとしました。

CANDY Piのセットアップが完了し、センサデータを取得するプログラムを実行すると次のエラーが発生しました。

```
Unable to open SPI device: No such file or directory
```

原因を調べると、CANDY Piのフォーラムに答えがありました。
↓
https://forums.candy-line.io/t/spi/151/2


Raspberry PiのSPI設定がCANDY Pi専用設定に変更されるとの事です。
この影響で、<font color="Red">/dev/spi0.1</font> が利用できなくなります。



#終わりに
CANDY Piを使用した状況で使用可能なシリアル通信は、UARTかI2Cです。
CANDY Piの恩恵で、UARTポートが1つ追加されます。
Reactでひな形アプリケーションを作成＆起動する

参考URL：https://qiita.com/gumiTECH/items/4b82e4e3757f226df6b0

前提： node jsをインストールしておき npmコマンドが使えるようにしておく。


以下のコマンドでreact関連のパッケージをインストールする。

```
npm install -g create-react-app
```

その後、任意のフォルダに移動し、以下のコマンドを実行（以下は、[react-sample]というアプリ名の例）　※そこそこ時間かかる。

```
create-react-app react-sample
```
以下のコマンドを実行する。

```
cd react-sample
npm start
```

http://localhost:3000/
でアプリケーションのページを開くことができる。
TECH ~Day10~

学習内容
・erbファイルでrubyコードを使うとき
・改行の適応
・ヘルパーメソッド


・erbファイルでrubyコードを使うとき
Railsの見た目用のファイルである「erb」ファイルの中でRubyのコードを利用する場合、「<%= %>」という記述で囲う。
<%= %>を利用するにはビューの拡張子が、「erb」になっている必要がある。


・改行の適応
railsは「simple_format」というメソッドを使わなければ改行が適応されない。
（復習）
　①改行→＜br/＞
　②文字列を→＜p＞で括る


・ヘルパーメソッド
simple_formatのようにRailsではviewでHTML加工をするために、予めのメソッドが用意されている。これらをまとめて「ヘルパーメソッド」と呼ぶ。他にはform_tag（フォームを出現）やlink_to（aタグを出現）などがある。
Laravel MixのIE11対応

LaravelMixのextensionにlaravel-mix-polyfilltというものがあり、簡単に使えたので書いておきます。

https://laravel-mix.com/extensions/polyfill

# laravel-mix-polyfillのインストール

`npm install laravel-mix-polyfill --save-dev`

# laravel-mix-polyfillを使うための設定

```js
let mix = require('laravel-mix');

require('laravel-mix-polyfill');

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css')
   .polyfill({
      enabled: true,
      useBuiltIns: "usage",
      targets: {"firefox": "50", "ie": 11}
   });
```
C# double型 について


# はじめに

* 筆者が疑問に思って検証した結果を書いたもので、double型のすべてを記したものではない
* この記事内の「出力」というのは、Console.WriteLineの表示結果のこと
* 「16進数出力」は、BitConverter.DoubleToInt64Bits()を使用して、doubleのビットの状態を表示したもの

# 各種定数のビット

| 定数 | 16進数出力 |
|------|------------|
| 0 | 0x0000000000000000 |
| 1 | 0x3FF0000000000000 |
| MinValue | 0xFFEFFFFFFFFFFFFF |
| MaxValue | 0x7FEFFFFFFFFFFFFF |
| Epsilon | 0x0000000000000001 |
| NaN | 0xFFF8000000000000 |


# 0.99…　どのくらいまでなら正確に保持できるか

## 結論

* コード上で表記：0.9999999999999999
* 16進数の場合：0x3FEFFFFFFFFFFFFF

## 検証：コード上で直接入力して出力した結果

* 9の数が17以上になると、1.0となってしまう。
* 0x3FEFFFFFFFFFFFFFは、1.0 未満だが、出力すると 1.0 となる。

| 9の数 | コード上の表記     | 10進数出力             | 16進数出力         |
|----|-----------------------|------------------------|--------------------|
| 1  | 0.9                   | 0.9                    | 0x3FECCCCCCCCCCCCD |
| 2  | 0.99                  | 0.99                   | 0x3FEFAE147AE147AE |
| 略 |                       |                        |                    |
| 15 | 0.999999999999999     | 0.999999999999999      | 0x3FEFFFFFFFFFFFF7 |
| 16 | 0.9999999999999999    | 1.0                    | 0x3FEFFFFFFFFFFFFF |
| 17 | 0.99999999999999999   | 1.0                    | 0x3FF0000000000000 |
| 18 | 0.999999999999999999  | 1.0                    | 0x3FF0000000000000 |

## 検証：1.0から徐々に小さくしていった場合

* BitConverter.Int64BitsToDouble()を使用して、整数から実数に変換し出力
* 0x3FEFFFFFFFFFFFFFは、1.0 未満だが、出力すると 1.0 となる。

| 元の整数           | 実数出力           |
|--------------------|-------------------|
| 0x3FF0000000000000 | 1.0               |
| 0x3FEFFFFFFFFFFFFF | 1.0               |
| 0x3FEFFFFFFFFFFFFE | 1.0               |
| 0x3FEFFFFFFFFFFFFD | 1.0               |
| 0x3FEFFFFFFFFFFFFC | 1.0               |
| 0x3FEFFFFFFFFFFFFB | 0.999999999999999 |
| 0x3FEFFFFFFFFFFFFA | 0.999999999999999 |


# doubleで正確に保持可能な整数の最大値

## 結論

* 9007199254740992
* 16進数：0x20000000000000

## 検証：long→double→longの順番でキャスト

* 0x20000000000001 は、longに戻した後 0x20000000000000 になってしまう。

各出力結果

| 元のlong値       | 代入後のdouble値（16進数出力）   | キャスト後のlong値 |
|------------------|--------------------|------------------|
| 0x1FFFFFFFFFFFFF | 0x433FFFFFFFFFFFFF | 0x1FFFFFFFFFFFFF |
| 0x20000000000000 | 0x4340000000000000 | 0x20000000000000 |
| 0x20000000000001 | 0x4340000000000000 | 0x20000000000000 |

# ToStringのフォーマット

## double.Epsilon を小数表記で出力する方法

### 結論：桁プレースホルダーを使用する

"0.####・・・"の、"#"が338個並んだフォーマットを使用する。

### 検証：書式指定子を使用した場合

* 小数表記で表示されず、指数表記になる。
* 精度指定子では99桁が限界、100桁以上は"F100"のように出力されてしまう。
* 補足：C,E,Pは、そもそも目的が違うので、ここには載せていません。

| 書式指定子 | 出力結果 |
|---|---|
| F99 | 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
| G99 | 4.9406564584124654E-324 |
| N99 | 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |
| R99 | 4.94065645841247E-324 |

### 検証：桁プレースホルダーを使用した場合

* 桁プレースホルダーとは、"0.####"のように書いたフォーマットのこと

| #の数 | 出力結果 |
|---|---|
| 337 | 0.000(略)00049406564584125 |
| 338 | 0.000(略)000494065645841247 |
| 339 | 0.000(略)000494065645841247 |
TECH ~Day9~

学習内容
・一つのデータをテーブルから取り出す
・content　カラムの値を取り出す
・全てのデータをテーブルから取り出す
・配列のデータから投稿内容を取り出す


・一つのデータをテーブルから取り出す
書き方
　$ rails console
　　post = Post.first
！Post.firstの書き方でpostsテーブルにある最初のデータを取得できる。


・contentカラムの値を取り出す
書き方
　$ rails console
　　post = Post.first
　　post.content
　="~~~~~"
！　 post = Post.first
　　post.content
この二つの流れによってPost.firstで得たデータの投稿内容を取得できる。


・全てのデータをテーブルから取り出す
先ほど一つのデータの取り出し方で書いた「Post.first」のfirstの部分を「all」にすることで全てのデータをテーブルから取り出すことができる。

書き方
　posts = Post.all


・配列のデータから投稿内容を取り出す
Post.all[0]はPost.firstと同じ内容のデータ。
これを「Post.all[0].content」と書くことで投稿内容を取得できる。
[JS]連想配列に任意の値と等しい要素があれば、それらのインデックスを全て取ってくるサンプル~flatMap編~

# 2019/07/21追記
不適切な解説をしていたので、修正しております。コメント欄で、ご指摘頂いた内容もありますので、一緒に参考にして頂ければ嬉しいです。
# いきなり結論コード
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="riotam4" data-slug-hash="ZdRwgJ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="配列の一致インデックス取得flatMap版">
  <span>See the Pen <a href="https://codepen.io/riotam4/pen/ZdRwgJ/">
  配列の一致インデックス取得flatMap版</a> by riotam (<a href="https://codepen.io/riotam4">@riotam4</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
# 解説
```javascript:キモになる部分
      return this.users.flatMap((v,k) => v.gender === '男' ? k : [])
```
実際に処理を行なっているのは、↑この部分です。
this.usersにデータが入っていて、それをflatMapしています。
基本的には関連記事のmap版と似ているのですが、１つだけ簡単に書ける部分があります。
# map版との違い
```javascript:map版だとこんな感じ
      let idx = []
      this.users.map((v,k) => v.gender == '男' ? idx.push(k) : [])
      return idx
```
ズバリ、map版ではidx変数を宣言してそこにpushしているのですが、これが自体がいらなくなります。

逆に結論から説明すると、

```javascript:flatMap版
      return this.users.flatMap((v,k) => v.gender === '男' ? k : [])
```
これを

```javascript:mapに書き換えたら…
      return this.users.map((v,k) => v.gender === '男' ? k : [])
      // => [ [], 1, 2 ]
```
こうなっちゃいます。
`[]`を`''`にしたら`[ '', 1, 2 ]`と、
`[]`を`null`にしたら`[ null, 1, 2 ]`と、返されちゃいます。
mapはたとえnullでも、何かしらの値を入れた配列を作りますが、

~~対してflatMapはfalsyな値なら無しにしてくれます。便利。~~
**2019/07/21追記**
flatMapは値がない場合に、無視してくれるだけで、falsyを無視してくれるワケではありませんでした。
実際に、この`[]`を`null`や`0`にしたら、それぞれの値が格納されてしまいます。

# 最後に
最後までありがとうございました。
# 関連記事
同じ挙動を、mapメソッドで作ったのが[こちら](https://qiita.com/riotam/items/393d466bd5323419e442)
【備忘録】git remote add originできない時

あるリポジトリでgit管理を始める時、下記の手順に従ってコマンドを入力していくと、

<img width="1038" alt="スクリーンショット 2019-07-04 13.18.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/845d8f62-2dea-e8f4-003b-e777be28b959.png">

```
$ git remote add origin https://github.com/katsuomi/****.git
$ git push -u origin master
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/katsuomi/*****.git/'
```

となってしまう場合、
***git remote add origin https://{gitのID名}@github.com/katsuomi/****.git***
とすると、うまくいきました。


```
$ git remote rm origin
$ git remote add origin https://katsuomi@github.com/katsuomi/*****.git
$ git push -u origin master
```

以上。