OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでReactをデバッグする方法

<br>Reactで開発する際に、VScodeでデバッグしたいと思い、
Debugger for Chromeをインストールしました。

<img width="890" alt="スクリーンショット 2020-07-22 13.11.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/68918a65-90c9-e8fc-596c-46acd749813b.png">

「⇧⌘D」でRun viewへ行き、「create a launch.json」を押してファイルを作成する。
次に、urlの箇所でポート番号「8080」から「3000」へ変更して保存します。
保存したら、npm startする。

```
"version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome against localhost",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}"
    }
  ]
```

任意の箇所でブレークポイント(赤丸)を置き、F5または
緑矢印を押してデバッグを実行します。
<img width="271" alt="スクリーンショット 2020-07-23 14.51.34 2.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/ee08d032-26f3-e4fc-b930-1f54ec91d217.jpeg">

すると、ブレークポイント置いた箇所で処理が一時停止します。
もしステップオーバーするなら、F10または画面上部に出ているボタンを押します。

<img width="489" alt="スクリーンショット 2020-07-23 14.50.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/0255f3a9-1ad0-b6ad-ff1a-17dc0294aae5.png">

一時停止したら以下のように中身を確認できます。

<img width="385" alt="スクリーンショット 2020-07-23 14.51.34.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/d2044caa-ce06-6ca2-f674-052580d587e2.jpeg">

停止する時はコールスタックのところで停止すればOK。

<img width="350" alt="スクリーンショット 2020-07-23 14.54.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/296f6744-050e-cae4-6f70-3c08627908cc.png">

参考資料
[Using React in Visual Studio Code](https://code.visualstudio.com/docs/nodejs/reactjs-tutorial)<br><br>
初心者向けLookerで複数Dimensionの並びをソートする方法


LookerのDimensionに複数項目が存在する場合、それらを同時にソートする手順の紹介です。

## やりたいこと。

**Lookerの複数DIMENSIONをソートしたい。**

例：初回購入商品でソートした後に、２回目購入商品をソートする
<img width="６００" alt="ソート0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/33aa3eca-828b-82b8-4988-e6206b399a42.png">

## 手順

- まずは、**DATAタブ**からソートしたい項目（以下では初回購入商品）の横をクリックすると、初回購入商品が昇順に並び替えられる。
<img width="600" alt="ソート１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/956ac2e5-d7c7-876e-6b45-2aaf0d7bbbf4.png">

- 次にソートしたい項目（以下では２回目購入商品）の横をクリックすると、２回目購入商品が昇順に並び替えられるが、初回購入商品が昇順ではなくなる。
<img width=600" alt="ソート２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/efb56c6c-2b60-e860-f6ac-df9a28ac1c82.png">

こんな感じで普通にやろうとすると複数項目でソートすることができませんが、以下手順を踏めば対応可能です。



- 初回購入商品をソートした後に、**Shiftキーを押しながら**２回目購入商品をソートすると初回購入商品のソートはそのままで、２回目購入商品がソートされる。

<img width="600" alt="ソート３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/76e46049-6493-b450-6e2e-38a349aec242.png">

知ってしまえば単純な話でしたが、最初はわからないと思うので手順メモを残すことにしました。

ちなみに、**Live Chat**で手順を教えてもらったのですが、日本語化された[公式ドキュメント](https://docs.looker.com/ja/exploring-data/exploring-data#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%BD%E3%83%BC%E3%83%88)にも載っていました。
キャパシティプランニングの目的

応用情報技術者令和元年秋期 午前問14

キャパシティプランニングの目的の一つに関する記述のうち，最も適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/381466c9-b6a9-c976-d2ae-446812efa489.png)

当該問は、プランニングの目的との質問なので、問題を解決ではなく、最大性能に引き出すでもなく、長期的にあるレベルのことを維持することですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2561b231-a40a-1b03-fe8f-40a9b5102ba1.png)
laravel7でユーザー認証

##概要
laravel7でユーザー認証の実装のまとめ

##バージョン
- mac Catalina 10.15.5
- PHP: 7.4.6
- laravel: 7.20.0

##前提
- larevelでプロジェクトを立ち上げていること。
- データベースとの接続ができていること。

##実装手順

認証に必要なテーブルを作成する。

```
$ php artisan migrate
```

composerを使ってlarevel/uiをインストールする。

```
$ composer require laravel/ui
```

artisanコマンドでを実行する。

```
$ php artisan ui vue --auth

Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
Authentication scaffolding generated successfully.
```

パッケージのインストールとビルドを行う。

```
$ npm install
$ npm run dev
```
React初心者覚書04 - イベント処理 -

- React のイベントは小文字ではなく camelCase
- JSX ではイベントハンドラとして文字列ではなく関数を渡す

イベントの処理

頭が回らなくなってきたけどひとまずめも、
すでに全く理解できない、、
ほぼ JS の理解が足りないことが原因な気がしてきた。
JSに戻った方がいいのか？

```htmlの場合.html
<button onclick="activateLasers()">
  Active lasers
</button>
```

```react.html
<button onclick={activateLasers}>
  Active lasers
</button>
```

- React では false を返してもデフォルトの動作を抑止することができません。明示的に preventDefault を呼び出す必要があります。


```
<a href="#" onclick="console.log('The link was clicked.'); return false">
  Click me
</a>
```

```
function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}
```


```
class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState(state => ({
      isToggleOn: !state.isToggleOn
    }));
  }

  class LoggingButton extends React.Component{
    handleClick = () =>{
      console.log('this is:',this);
    }

    render() {
      return (
        <button onClick={this.handleClick}>
          {this.state.isToggleOn ? 'ON' : 'OFF'}
        </button>
      );
    }
  }
}

ReactDOM.render(
  <Toggle />,
  document.getElementById('root')
);
```
システムの性能を向上させるために，スケールアウトとスケールアップ

応用情報技術者令和元年秋期 午前問13

システムの性能を向上させるために，スケールアウトが適しているシステムはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e8a1f867-20e1-aba8-16a0-5f207dffe92d.png)

サーバーの性能向上は、二つ２方法あります：
・スケールアウト：サーバー台数増加で、参照機能が多く、更新・削除・登録機能が少ないのシステムが適用
・スケールアップ：サーバー自体が性能向上で、処理時間が少なくなる、更新・削除・登録機能が多いのシステムが適用




補足
ーーーーーーーーーーーーーーーーーーーーーー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/91ca9436-0757-a825-ecbf-25013a702f7b.png)



参照：

https://www.ap-siken.com/kakomon/30_haru/q14.html
findコマンドで見つけたファイルを５つだけ削除する

解決：2020-07-23、tail, xargsを組み合わせたやり方を見つけた。
更新：2020-07-23、findの分かりやすい解説を見つけた。
登録：2020-07-23

# 背景

とある処理で、条件に適合するファイルを削除したい。けど、一気に削除すると一時的にでも処理が集中するので負荷が上がる（はず）。

# 目標

適合するファイルを、findを実行する度に５ファイルずつ消したい。

# 結果

```
$ find {ディレクトリ} {条件} | tail -{数字} | xargs -L 1 -t rm
```

- 今回使った条件
    - ```-name string\*``` ファイル名に一定のルールがある場合
    - ```-size -1``` touchコマンドで作成したからファイルなので
    - ```-not -newermt "20200720 10:00"``` 「t」で文字列の参照になるみたい
- ```tail```
    - ```head``` を使ってもいいよ。
    - ファイル名に意味を持たせて ```cut``` を使うのもありかもね。

# メモ

- https://eng-entrance.com/linux-command-find
    - -anewer, -newer, -sizeは近い。けど、ちょっと違う。 
- https://orebibou.com/ja/home/201507/20150727_001/
    - xargsの使い方
- https://kiririmode.hatenablog.jp/entry/20170107/1483792640
    - findの-newerオプションについて
OctocatでもわかるGitとGitHubの違い

# Gitとは
バージョン管理システムです。これだけだと大半の人が理解できないと思うので説明を続けます。バージョン管理システムとは、プログラマが書いたコードの履歴みたいなものです。いつでもその履歴を見て、前のコードにもどせたりできます。この履歴一覧のようなものに書き直したコードを追加することをGitではコミットといいます。GitではさらにコミットAとコミットBを比較して変更点を見ることが
# GitHubとは
gitにさらに機能を足してweb上でアクセスできるようにしたものです。gitにできてgithubにできないことはありません。なぜなら、githubはgitの一種であるからです。

# GitとGitHubの違い
gitはツール、githubはサービスです。ですから、gitにはインストールして、コマンドを打つのが基本、githubはサインアップしてSNSとして使ったりコードをアップロードするのが基本となります。
Windows10でのIMEのオン／オフのショートカットキーを切り替える

# 経緯
中学時代から現在に至るまで、ずっとWindowsばかりでやってきた。
Macなんて一生触らないと思ってやってきた。

だがしかし、その時は訪れた。

自分のPCを仕事で使っていたけど、ちょっと遅い。（5年も使ってたし）
自分で買うのもなぁと思っていたら、お客さん先でPCを貸してもらえることになった。
最新のPC・・・・MacBook Proを。。
Windowsがいいなぁとは言ってみたけど、うちWindowsやってないんで的なことだった。
まぁWindowsでもMacでも変わらんだろう、すぐに慣れるだろうと思っていた。

## Macとの格闘
大体は慣れた。大体は慣れたのだがしかし、待ってほしい。
日本語入力を何度も何度も間違える・・・！

家パソはWindowsで、仕事PCはMacでキーボードをスイッチで切り替えながら使ってるのだが、日本語入力MacはCtrl＋スペースでWindowsは半角全角漢字キーというのがやりにくすぎる・・・！

なんでこんなにやりにくいのか。
それはWindowsの左上にあるボタンより、Ctrl＋スペースの方が楽だからだ。

もはや、ミスるのはWindowsでの日本語入力の時だけになっていた。
すでに手は日本語変換はCtrl＋スペースですることを望んでいる・・・。
格闘している相手はいつの間にかMacではなくWindowsであった。

# Windowsでの日本語入力キーの変更方法

ということで、日本語入力のキーの切り替えをするわけだが、パッと探した情報とは操作感が違う・・・。
なのでこの記事を書く。

重要なのはWindows10のバージョンらしい。
自分の環境では `Windows10 バージョン：2004` だった。

以降は手順。


- ツールバーのIMEのアイコンを右クリックで設定開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57515/31c44e99-00e9-9e51-e9d5-851040629690.png)

- `キーとタッチのカスタマイズ`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57515/a363a5b6-8bfb-47f5-2aca-b4b6af139c56.png)

- `Ctrl＋Space`で、`IME-オン/オフ`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57515/f406fe53-2ae3-8931-19c1-f2c1b34fdf8a.png)

Ctrl+Spaceでさも「日本語入力切替Ctrl＋Spaceでやりたいよね？」という感じ。
ていうか前はもっといろんなキー割り当てできた気がするけど、かなり絞ったな。

# 終わりに

コピペについてもCtrl＋c/vなのかCommand（キーボード上はWinキー）＋c/vなのかでややこしいけど、キーの距離が近い分、ストレスは少なかった。
WinとMac両刀の日とは昔からこの変更やってたのかな？
SDメモリカードの上位規格の一つであるSDXCの特徴

応用情報技術者令和元年秋期 午前問12

SDメモリカードの上位規格の一つであるSDXCの特徴として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/48cf066f-7521-e4ce-972b-da9a06ffcb2e.png)

サイズについて、microは標準の４分の１は間違いないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d6f11144-b537-5702-3580-25b76a399c06.png)


確か、Amazonで、SDカードを探すと、SDXCですね。64GBだけではなく、32GBもSDXCですよ。その技術は主流ですね。知らなかった。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/160b1449-49df-2e53-b8bc-0a2c9180aecc.png)
[Rails]ancestryを使った時のちょっとしたつまづきから学んだこと

# はじめに
個人制作でファッション系ECサイトを制作した時に「階層のあるカラム」を実装したいと思い、まさにそれを実現してくれる**ancestry**を使用した時のちょっとしたつまづきから学んだことを備忘録として残しておきます。

**また、本記事は手順書ではなく、初学者が陥りがちな失敗の紹介です！**

※実装の手順等は割愛します。Qiitaにもたくさん他の方の記事があるので以下参考にしていただければと思います。
 [ancestryによる多階層構造データを用いて、動的カテゴリーセレクトボックスを実現する~Ajax~](https://qiita.com/ATORA1992/items/bd824f5097caeee09678)
 [ancestryで作ったセレクトボックスに初期値を表示する方法](https://qiita.com/hukuro310/items/1843d22b4ea29c2b1692)

# 実現したいこと
ancestryを用いた以下の動的なセレクトボックスを**編集時も有効にしたい**です。

[![Image from Gyazo](https://i.gyazo.com/0e31ac44068f37b78b6701f17dba718c.gif)](https://gyazo.com/0e31ac44068f37b78b6701f17dba718c)

# 前提

以下のようにコントローラーで子階層をsearchするアクションを定義していることが前提です。
ajaxもしっかりsearch_childを定義しておきます。

```ruby
(controllers/items_controller.rb)

（省略）

  def edit
    child_category = @item.category

    @category_parent_ary = []
    Category.where(ancestry: nil).each do |parent|
      @category_parent_ary << parent
    end

    @category_children_ary = []
    Category.where(ancestry: child_category.ancestry).each do |children|
      @category_children_ary << children
    end
  end

  def search_child
    respond_to do |format|
      format.html
      format.json do
        @children = Category.find(params[:parent_id]).children
      end
    end
  end

（省略）

end

```
```javascript
(省略)

  $("#parent-form").on("change", function() {
    var parentValue = document.getElementById("parent-form").value;
    if (parentValue != "---") {
      $('#category__box--children').remove();
      $.ajax({
        url     : 'search_child',
        type    : 'GET',
        data    : { parent_id: parentValue },
        dataType: 'json'
      })

(省略)
```

# 編集時にサーチしてくれない！？

[![Image from Gyazo](https://i.gyazo.com/64ed927c6eef285cf6f50126f833b42d.gif)](https://gyazo.com/64ed927c6eef285cf6f50126f833b42d)

諸々、実装して新規登録ではできているし、おそらく問題ないだろうと思っていたので、フリーズしました。

# 解決

すごく単純で、ルーティングを追加しただけです。

```ruby
(config/routes.rb)
Rails.application.routes.draw do

（省略）

  resources :shops, only: [:new, :create, :show, :edit, :update, :destroy] do
    resources :items, only: [:new, :create, :edit, :update, :destroy] do
      collection do
        get "search_child", defaults: { format: "json" }
      end
     #####↓ここを追加↓＃＃＃＃
      member do
        get "search_child", defaults: { format: "json" }
      end
    #####↑ここを追加↑＃＃＃＃
    end
(省略)
```

# 教訓

ついつい１機能の実装範囲が膨らむと足元をすくわれがちで、今回のエラーも書いたコードの内容ばかりに目がいってしまい、それなりに時間を溶かしました。。

改めて動作するまでのコードの流れをちゃんと理解して疑いの目を向けることが大事だなと、反省です！
Rubyで文字コードをUTF-8からShift-jis の変換に詰まったお話

# Rubyで文字コードをUTF-8からShift-jisに変換に詰まったお話

現職でCSV吐き出しの時に文字列のデフォルト文字コードをShift-jisにして欲しいという依頼がありました。

Rubyの文字列のデフォルト文字コードはUTF-8になるので、それをCSV吐き出しの時にShift-jisに変換するだけで実現できるので余裕だと思ったのですが、意外にハマりました。

同じようにハマってる人がいるかもしれないので、解決方法を記載します。

# ハマった実装箇所

RubyのライブラリのCSVクラスのgenerateメソッドを利用すればCSV吐き出しは割と簡単に実装できます。


実装イメージ
↓

``` ruby
require "csv"

text =<<-EOS
id,first name,last name,age
1,taro,tanaka,20
2,jiro,suzuki,18
3,ami,sato,19
4,yumi,adachi,21
EOS

csv = CSV.generate(text, headers: true) do |csv|
  csv.add_row(["5", "saburo", "kondo", "34"])
end

```
コード参考：https://docs.ruby-lang.org/ja/latest/method/CSV/s/generate.html


shift-jisに変換したいときは:encoding というキーを使用すると出力のエンコーディングを指定することができます。

```ruby
CSV.generate(text, headers: true, encoding: "SJIS")
```

このオプションをつけると、出力されるエンコーディングがutf-8からshift-jis自動変換されます。

こちらで実装をすると、なぜか以下のエラーが発生しました.....

```
incompatible character encodings: Windows-31J and UTF-8
```

# 原因調査

なぜ、エンコードエラーになるのか調査します。

どの文字列がエラーになるのか調べた結果、以下の文字列にエラーが発生していました。

```
"AAA−0001"
```

特に違和感のない文字列です、なぜエラーになるのでしょうか？

詳しく調べてみると、以下の文字をshif-jisに変換すると例外エラーになってしまうらしいです。

| 文字コード（UTF-8） | 文字 | 備考 |
| :--- | :---: | ---: |
| U+00A2 | ¢ | セント記号（通貨） |
| U+00A3 | £ | ポンド記号（通貨） |
| U+00AC | ¬ | NOT記号 |
| U+2016 | ‖ | Double vertical line |
| U+2212 | − | マイナス記号 |
| U+301C | 〜 | 波ダッシュ |
参考： https://osa.hatenablog.com/entry/2014/08/21/113602

```
"AAA−0001"
```

この文字列には−（マイナス記号）が含まれているので、例外エラーが発生したと想定されます。

# 解決方法

エラー原因はわかりました。ではどう解決すれば良いのでしょうか？


一番簡単な方法はRubyのオープンクラスを利用した文字列クラスの拡張です。

Rubyはクラスの継承に制限がありません。StringクラスやArrayクラスなど、組み込みライブラリのクラスであっても継承して独自のクラスを定義することができます。

なので以下のようにStringクラスにWindows-31Jに変換する時の例外を防止するためのメソッドを追加します。

``` ruby
class String
  def sjisable
    str = self
    #変換テーブル上の文字を下の文字に置換する
    from_chr = "\u{301C 2212 00A2 00A3 00AC 2013 2014 2016 203E 00A0 00F8 203A}"
    to_chr   = "\u{FF5E FF0D FFE0 FFE1 FFE2 FF0D 2015 2225 FFE3 0020 03A6 3009}"
    str.tr!(from_chr, to_chr)
    #変換テーブルから漏れた不正文字は?に変換し、さらにUTF8に戻すことで今後例外を出さないようにする
    str = str.encode("Windows-31J","UTF-8",:invalid => :replace,:undef=>:replace).encode("UTF-8","Windows-31J")
  end
end
```
コード参考：https://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018


このメソッドを例外エラーになる箇所で実行することでえ例外エラーが出なくなる。

``` ruby
"AAA−0001".sjisable
```

# オープンクラスを利用したくない場合

オープンクラスやは非常に強力で、うまく使えば開発の効率を高めることができます。

その辺面、Rubyの標準クラスに独自のメソッドを追加したのはいいが、追加した本人以外はコードを読んでも誰がどこで何の目的で定義したメソッドなのかわからず、かえってチーム全体の開発効率を落とす。

または、予期せぬタイミングでエラーが発生するといったデメリットも考えられます。

もしくは一部の人は文字コードをShift_JISに変更することがStringクラスの責務なのか、それはCSVにするときに必要になるのでCSVを扱うクラスの責務ではないのか？という疑問も出ると思います。

なので、もしオープンクラスを利用しない場合はCsvUtilityクラス的なものを作成して、CSVを扱う手続きはそこに集約し、Shift_JISなりUTF-8なりで出力できるようにしてあげる実装にする方がベターになります。


# 参考
[伊藤 淳一. プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで](https://www.amazon.co.jp/dp/B077Q8BXHC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
DisplayPortの説明

応用情報技術者令和元年秋期 午前問11

PCとディスプレイの接続に用いられるインタフェースの一つであるDisplayPortの説明として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e16927bf-085b-b673-5a5f-c307e4858740.png)


エは難しいですね。
私は、エを選んでしまいました。エは、実は、暗号化しているかを聞いているですね。なによ。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ca550ee7-d58f-299d-af2f-949c6964dead.png)
tweenmaxをつかって描画時のアニメーションを書く

#はじめに
[前回の記事](https://qiita.com/mmomm/items/60f0d112df7714566128)でtweenmax導入したのでアニメーション付けてみました。


![pf-animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418870/7add78b3-057b-c963-a20d-d80ae52617d4.gif)

#コード
nuxt/ts tailwindを使っています。クラス名とかが適当なのともう少しでなくなるclassコンポーネント使っているのはお許しください。
ちょっと汚かったのでcss省略してます。

```index.vue
<template>
//省略
　<div>
　　<p class='welcome'>Welcome</p>
　　<p class='to'>to</p>
　　<div class='flex flex-no-wrap'>
　　　<div v-for='(text, i) in texts' :key='i'>
　　　　<p class='text-xl　title'>{{ text }}</p>
　　　</div>
　　</div>
　</div>
</template>
<script lang='ts'>
import { Vue, Component } from 'vue-property-decorator';
import { gsap } from 'gsap'
@Component
export default class Index extends Vue {
  texts: string[] = [
    'K','I','S','S','E',' ', ' ','P','O','R','T','F','O','R','I','O'
  ]
  mounted() {
    gsap.fromTo('.welcome', { duration: 0.5, opacity: 0, y: 50 },{ delay: 1, opacity: 1, y: 150 })
    gsap.fromTo('.to', { duration: 0.5, opacity: 0, y: 300 }, { delay: 1.25,opacity: 1, y: 200 })
    gsap.to('.welcome', { duration: 0.5, delay: 2 , opacity: 0, y: 50})
    gsap.to('.to', { duration: 0.5, delay: 2.25 , opacity: 0, y: 250})
    document.querySelectorAll('.title').forEach((title, i) => {
      gsap.from(title, { duration:0.4, delay: 2.25 + i * 0.1, ease: 'power1.out', x: 50, y: -50, opacity: 0 })
    })
  }
}
```

vueがわからない人のために説明するとmouted()という関数がdomにマウントされたときに動きます。

```index.vue
<div v-for='(text, i) in texts' :key='i'>
　<p class='text-xl　title'>{{ text }}</p>
</div>
```

この部分はtextsというdataを一つずつtextに入れていき
それを　{{}}　で囲まれた部分に入れています
つまり今回の場合

```index.ts
texts: string[] = [
　'K','I','S','S','E',' ', ' ','P','O','R','T','F','O','R','I','O'
]
```

これが代入されるため

```index.vue
<p class='text-xl　title'>K</p>
```

このようなのがdataの分だけ作られます。


結構ぐちゃぐちゃですがこんな感じです
書いていることとしてはそんなに複雑なことはしておらず
[gsapのドキュメント](https://greensock.com/docs/)をみたら意味は理解できると思います。
最後の部分ですがこのようにforEachを使って回すことによって順番にアニメーションをつけることができます。
timelineを使うことによってもっとまとめて書くこともできそうです。

問題点としてアニメーションをつけるとz軸の順番が最優先になるのでどうにかして解決したいです。

簡単なので是非使ってみてください！！！
PRML 演習問題6.7(基本)　解答

<a id="eq:1.152"></a>
##はじめに
本記事は, 機械学習の教科書の決定版ともいえる, Christopher Bishop先生による『Pattern Recognition and Machine Learning （パターン認識と機械学習）』, 通称PRMLの演習問題のうち, 私が解いた問題の解答を記したものです

今回は演習問題6.7の解説です
<a id="eq:1.152"></a>

##問題

以下の二つが有効なカーネルであることを示します

```math
\begin{aligned}
k\left(\mathbf{x}, \mathbf{x}^{\prime}\right) &=k_{1}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)+k_{2}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)\quad(\text { 6.17 }) \\ \\

k\left(\mathbf{x}, \mathbf{x}^{\prime}\right) &=k_{1}\left(\mathbf{x}, \mathbf{x}^{\prime}\right) k_{2}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)\quad(\text { 6.18 }) \\
\end{aligned}
```

つまり、カーネル同士の足し算と掛け算です

##前提
```math
k\left(\mathbf{x}, \mathbf{x}^{\prime}\right)
```
で定義されるカーネル関数が有効であるということは

```math
k\left(\mathbf{x}_{n}, \mathbf{x}_{m}\right)
```
で与えられるグラム行列$\mathbf{K}$が任意のベクター$\mathbf{a}$について

```math
\mathbf{a}^{\mathrm{T}} \mathbf{K a} \geqslant 0
```
となることが必要十分条件です。
これによってカーネル関数が有効か確かめることができます

##解答
6.17は有効であるかを簡単に確かめることができます

```math
\mathbf{a}^{\mathrm{T}} \mathbf{K a} \geqslant 0
```
を前提に、半正定置のものを足し合わせるとやはり半正定置となることから明らかに

```math
\mathbf{a}^{\mathrm{T}}\left(\mathbf{K}_{1}+\mathbf{K}_{2}\right) \mathbf{a}=\mathbf{a}^{\mathrm{T}} \mathbf{K}_{1} \mathbf{a}+\mathbf{a}^{\mathrm{T}} \mathbf{K}_{2} \mathbf{a} \geqslant 0
```
とかけるので、(6.17)が有効であることが示されます

----
(6.18)を考えるために、カーネル関数が有効であるとき、以下のような写像$\phi$,$\psi$を考えることができたことを思い出します(教科書と演習6.5を参考)

```math
k_{1}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)=\phi(\mathbf{x})^{\mathrm{T}} \boldsymbol{\phi}\left(\mathbf{x}^{\prime}\right)
```

```math
k_{2}\left(\mathbf{x}, \mathbf{x}^{\prime}\right)=\boldsymbol{\psi}(\mathbf{x})^{\mathrm{T}} \boldsymbol{\psi}\left(\mathbf{x}^{\prime}\right)
```

これを用いて(6.18)を変形すると


```math
\begin{aligned}
k\left(\mathbf{x}, \mathbf{x}^{\prime}\right) &=k_{1}\left(\mathbf{x}, \mathbf{x}^{\prime}\right) k_{2}\left(\mathbf{x}, \mathbf{x}^{\prime}\right) \\
&=\phi(\mathbf{x})^{\mathrm{T}} \phi\left(\mathbf{x}^{\prime}\right) \psi(\mathbf{x})^{\mathrm{T}} \psi\left(\mathbf{x}^{\prime}\right) \\
&=\sum_{m=1}^{M} \phi_{m}(\mathbf{x}) \phi_{m}\left(\mathbf{x}^{\prime}\right) \sum_{n=1}^{N} \psi_{n}(\mathbf{x}) \psi_{n}\left(\mathbf{x}^{\prime}\right) \\
&=\sum_{m=1}^{M} \sum_{n=1}^{N} \phi_{m}(\mathbf{x}) \phi_{m}\left(\mathbf{x}^{\prime}\right) \psi_{n}(\mathbf{x}) \psi_{n}\left(\mathbf{x}^{\prime}\right) \\
&=\sum_{k=1}^{K} \varphi_{k}(\mathbf{x}) \varphi_{k}\left(\mathbf{x}^{\prime}\right) \\
&=\varphi(\mathbf{x})^{\mathrm{T}} \varphi\left(\mathbf{x}^{\prime}\right)
\end{aligned}
```

ここで $K=M N$ であり$\phi_{k}$とは以下の式で与えられるものであるとしています

```math
\varphi_{k}(\mathbf{x})=\phi_{((k-1) \oslash N)+1}(\mathbf{x}) \psi_{((k-1) \odot N)+1}(\mathbf{x})
```
$\oslash$ 整数部 $\odot$ 余剰部

よって(6.18)も示されました

参考
[PRML公式解答(Solutions to Exercises Web-Edition)](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/05/prml-web-sol-2009-09-08.pdf)
package.json内の全パッケージをバージョンアップする方法

#一括でパッケージのバージョンアップ
GitHubからpackage.jsonファイルで脆弱性のあるモジュールの
バージョンがあるとのことで注意勧告的なお知らせが来ました。
要は、新しいバージョンに更新してくださいということでしたので、
updateしました。

```
$ npm i -g npm-check-updates

//更新できるパッケージのバージョンを確認。
$ ncu
```
<img width="331" alt="スクリーンショット 2020-07-21 16.45.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/ed503596-124e-146b-c256-d5c6c23e8130.png">

```
//アップデートする。
$ ncu -u

//確認する。
$ ncu
```

<img width="382" alt="スクリーンショット 2020-07-21 16.47.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624401/84f0c7d6-f7f4-21b3-6f3b-0366635c4bbb.png">

参考資料
[GitHubから通知が来た：依存関係の1つに潜在的なセキュリティ脆弱性があります](https://www.l08084.com/entry/2018/04/22/162130)<br><br>
PMBOK 覚え書き 用語


#プロジェクトの始まり方
- 市場の要求
　需要の高まり
- ビジネス・ニーズ  
　例：既存システムを刷新しないと、現状業務を裁けない。コスト削減。
- 顧客の要求

- 技術の進歩
　例：インターネットの進歩で　ショッピングサイトの立ち上げ
- 法的な要求
　例：税制が変わるから、システムの対応
- 社会的なニーズ
　CSR的な考え。例：発展途上国への支援。エコ


#ステークホルダー
プロジェクトに利害関係のある人

- 顧客、組織の上長、ベンダー、サプライヤー
- プロジェクトマネージャー、PMO
- プロジェクト・スポンサー：一般に組織を代表する責任者、資源の割り当てや、プロジェクトに関する決定権限あり。
- プロジェクト・チャンピオン：プロジェクトへの権限、責任はないが、技術的または業界知識の権威。俗にいう「ご意見番」


#プロマネに必要なスキル
- コミュニケーションスキル:
　最も重要なスキル
- 組織化スキル:
  文書化、見積、契約、報告書、記録
-計画スキル:
タイムマネージメント    優先度と重要度
- 予算化スキル
- コンフリクト・マネジメントスキル:問題解決スキル
- 交渉力スキル
- 影響力スキル:人にやらせる能力 権威と政治力
- リーダシップのスキル
- チーム育成と動機付け
- 適用分野に対する専門知識（必須ではない。他者の協力を得る場合もあり）

実際のところ、確かにコミュニケーションスキルが重要だけど、
組織化するにしても、交渉、影響力にしても、ある程度適用分野に関する
専門知識がないとだめだよね。

#プロフェッショナルの責任
- 利害の衝突
- 個人のインテグリティ
 - PMP職務規程
- 成果物のインテグリティ
- 文化的多様性の尊重
 - カルチャーショック
 - 異文化の「多様性」を尊重する。
 - 対応するためには事前にトレーニングを受けることがPMI推奨 
 - 信頼関係の構築が重要

例題
|問い|答え|

|進行中に設計ミスを見つけたら|ミスに対処する代替案作成が適切。|
|業者選定中の業者からの接待|礼を言って利害の衝突になり得る事を伝える。|
|ステークホルダの満足を得るのに重要なアクティは|要求事項を文書化する|
|贈答品の習慣がある国での贈答品への対応|受け取る。受け取った事実を適切な部署に報告する|


#概算とは
超概算見積もり(ROM)：-50～100%
概算:-25%～75%
予算：-10%～25%
最終案：-10%～25%

#権力の源泉
|強制的な権力|脅迫感による|
|------------|----------|
|専門家として権力|個人の特別な技量による|
|役職上の権力（合法的な権力）|組織の立場などによる|
|後ろ盾による権力|権力志向に基づく|
|報償の権力|望ましい行為の増強|



#動機付け理論
人が行動を起こして、成果をあげるためにはどのような影響を与えるべきかを
まとめたもの。要は、どうやって人を操縦するかという理論

###マズローの欲求５段階
下の階層の欲求が満たされた時点でそれらは動機付けには
ならなくなる。
- 生理的な欲求：衣食住などの衛生要因
- 安全の欲求：安全な暮らしができる。
- 社会的欲求：何らかのコミュニティに所属する。
- 尊厳の欲求：業績、尊敬をうける。
- 自己実現の欲求：自分の能力を発揮できる。

###マクレガーのX理論、Y理論
労働者は次の２種類に分類される
- X理論：性悪説
- Y理論：性善説

###ハーツバーグの「動機づけと衛生理論」
労働意欲阻害要因と意欲増加要因とは独立事象である。

- 衛生要因
 - 報酬
 - 労働環境
 - 対人関係
 - 地位

- 動機付け要因
 - 作業をすることによる満足感
 - 自己実現
 - 認知
 - 責任、使命感

###期待理論
よい結果が得られるという期待が動機付けになる

###達成理論
人は３つの欲求によって動機づけられる。
 - 達成感
 - 権力：人を動かしたい
 - 関係構築：仲間意識

###コンティンジェンシー理論
引用元http://wiki.livedoor.jp/mizunobara/d/%A5%B3%A5%F3%A5%C6%A5%A3%A5%F3%A5%B8%A5%A7%A5%F3%A5%B7%A1%BC%CD%FD%CF%C0%A1%DAContingency%20Theory%A1%DB
望ましいリーダーシップの姿というものは、そのリーダーの特性や行動パターンによるものではなくして、
そのリーダーの置かれた環境によって変わってくるものであると言う考え方に立脚したリーダーシップ理論のこと。
経営環境が比較的順境であるような時期にはボトムアップを取り込んだマネジメントが機能するが、
昨今のような厳しい経営環境のもとでは強力なリーダーシップが必要になってくる。

別名、状況適合理論


###ハーシー・ブランチャードの状況リーダシップ理論
 -  スタイル１：指揮（強）、援助（弱）
 -  スタイル２：指揮（強）、援助（強）
 -  スタイル３：指揮（弱）、援助（強）
 -  スタイル４：指揮（弱）、援助（弱）


#アーンド・バリュー法(EVM)

| | | |
|------------|----------|---|
|計画バリュー|PV||
|実コスト|AC||
|アーンドバリュー|EV|作成した価値|

| | | |
|------------|----------|---|
|コスト差異|CV=EV-AC|Cost Variance|
|スケジュール差異|SV=EV-PV|Schedule Variance|

| | | |
|------------|----------|---|
|コスト指数|CPI=EV/AC|１より大きいとコストパフォーマンス|
|スケジュール指数|SPI=EV/PV|1より大きいと早く進行している|

| | | |
|------------|----------|---|
|完成時総予算|BAC |プロジェクトの総予算|
|残作業のコスト見積もり|ETC=(BAC-EV)/CPI|残りのコストの見積もり|
|完成時総コスト見積もり|EAC=AC+ETC||

PMBOK試験で必須と言われる計算式ですね。
でも、EVって普段　数値化して把握することってないよね。
Rust: rusqlite の使い方

こちらのサンプルを改造してみました。
[Crate rusqlite](https://docs.rs/rusqlite/0.23.1/rusqlite/)

フォルダー構造

```text
$ tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    └── debug
```

```text:Cargo.toml
[package]
name = "sqlite_read"
version = "0.1.0"
edition = "2018"

[dependencies]
rusqlite = "*"
```

```rs:src/main.rs
// --------------------------------------------------------------------
/*
	src/main.rs

					Jul/23/2020
*/
// --------------------------------------------------------------------
use rusqlite::{params, Connection, Result};

#[derive(Debug)]
struct City {
	id: String,
	name: String,
	population: i32,
}

fn main() -> Result<()> {
	eprintln! ("*** start ***");

	let conn = Connection::open_in_memory()?;


	conn.execute(
		"CREATE TABLE person (
				  id			  VARCHAR(10) PRIMARY KEY,
				  name			TEXT NOT NULL,
				  population	  INTEGER
				  )",
		params![],
	)?;


	conn.execute(
		"INSERT INTO person (id,name, population) VALUES (?1, ?2, $3)",
		params!["t0711".to_string(),"郡山".to_string(), 18954],
	)?;

	conn.execute(
		"INSERT INTO person (id, name, population) VALUES (?1, ?2, $3)",
		params!["t0712".to_string(),"会津若松".to_string(), 83576],
	)?;

	conn.execute(
		"INSERT INTO person (id, name, population) VALUES (?1, ?2, $3)",
		params!["t0713".to_string(),"白河".to_string(), 51769],
	)?;

	let mut stmt = conn.prepare("SELECT id, name, population FROM person")?;
	let city_iter = stmt.query_map(params![], |row| {
		Ok(City {
			id: row.get(0)?,
			name: row.get(1)?,
			population: row.get(2)?,
		})
	})?;

	for city in city_iter {
		println!("{:?}", city.unwrap());
	}

	eprintln! ("*** end ***");

	Ok(())
}

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

実行結果

```text
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/sqlite_read`
*** start ***
City { id: "t0711", name: "郡山", population: 18954 }
City { id: "t0712", name: "会津若松", population: 83576 }
City { id: "t0713", name: "白河", population: 51769 }
*** end ***
```
WSLでxeyesやRvizでエラーが出たのでその原因と解決策


#はじめに
WSL2(Ubuntu 18.04)でROS1(ROS-Melodic)を使おうと設定を進める中でGUI関連のエラーに悩まされたので、それらの記録です。

#環境
- Windows10 Professional（バージョン2004 （OSビルド 19401.388））
- WSL2
    - https://qiita.com/tomokei5634/items/27504849bb4353d8fef8 (1)
- VcXsrv
    - https://demura.net/misc/16305.html (2)

WSL2導入までは(1)、WSL2導入後からGUI設定までは(2)のサイトを参考にしていた
自分の環境はWSL2だが、WSL1でも参考になると思われる

#生じたエラー

##xeyesなどのx11系アプリのGUIすら表示されない

WSLの設定を進める中で、```xeyes```等を実行してもXサーバが起動しない
###エラーメッセージ
```
Error: Can't open display: ~IPアドレス~ :0.0
```
####原因
**Windows Defender ファイヤウォール**や**その他セキュリティソフト**によってXserverの通信がブロックされている
>自分の環境ではESETが原因でした

###解決策
Windows Defender ファイヤウォールやESETのネットワーク保護を解除する

#####Windows Defender ファイヤウォールを直接編集できる場合

https://odaryo.hatenablog.com/entry/2020/01/08/114846

#####ESETが入っている場合

Windows Defender ファイヤウォールを直接編集できないため、
```ESETを起動``` -> ```設定``` -> ```ネットワーク保護``` -> ```トラブルシューティングウィザード``` -> ```VcXsrv windows xserver を「ブロック解除」```
を行う

#####その他セキュリティソフトが入っている場合

上記を参考に、どこかで通信がブロックされていないかチェックする

---

##Rvizが起動直後に落ちる
xeyesなどは起動するが、ROSインストール後に```rviz```を実行すると**一瞬起動画面が表示されてすぐに落ちる**
###エラーメッセージ
```
segmentation fault (core dumped) rviz
```
####原因

```.bashrc``` に設定していた ```LIBGL_ALWAYS_INDIRECT=1``` が悪さをしていた

###解決策
```~/.bashrc
LIBGL_ALWAYS_INDIRECT=
```
として数値を指定しない

####参考
https://github.com/ros-visualization/rviz/issues/1438


#まとめ
セキュリティソフトと環境変数には気をつけろ！という教訓を得ました
(初投稿です。ありがとうございました。)
Tableauでクロス結合（Cross Join）

Tableauにはデータベースで言うところのクロス結合（Cross Join）がないという記事を読みました。
確かにinner join, left join, right join, full joinしかないように見えますが、実はcross joinもできます。

Cross Joinは2つの表を全てのパターンで結合するときに使うものです。例えば以下のような処理を考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/31563e19-ac91-1e40-4c95-a5852d7039dc.png)

やり方は以下の通りです。

まずは片方のテーブルを読み込みます。今回はクリップボードから直接貼り付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/fa7ae6c5-c3f1-2443-ef7f-4ea402827c77.png)

次に、もう一つのテーブルを読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/e98bb285-97fd-2145-9a9c-cb6a4ba7758b.png)

Tableauのバージョンによって若干手順が異なりますが、以下のように2つのテーブルを結合させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/71873b3d-6b45-67fb-20a0-3efed43c6525.png)

結合計算を使って1=1の条件で結合します。1=1でなくても、必ず条件式がTRUEになるならば、どのような式でも大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679299/7af2fa49-3e5a-8a7a-cdca-ce0592bc38a5.png)

以上になります。今回は1列と1列を紐づけましたが、複数列ある場合でも同じ動作となります。
PHPからTwitterを操作する

# OAuth 認証
TwitterOAuthというライブラリを使用して認証します。
下記のサイト参考にしました。
[PHP で Twitter API OAuth 認証 「ログイン」](https://wepicks.net/twitter-restapi-login/)…(1)

##概要
- 下記でツイッターアプリケーションの登録をする
[https://developer.twitter.com/en/apps](https://developer.twitter.com/en/apps)
※参考サイト[Twitter Developerの開発者申請（例文あり）とAPIキー取得方法まとめ【2019年版】](https://digitalnavi.net/internet/3072/)


- (1)を参考に下記phpファイルを作成する。まずはコピペする
　　config.php
　　login.php
　　logout.php
　　callback.php
　※member.phpは認証後のページなので任意のページでOK

- config.phpは環境変数(.htaccess)から取得するように、下記の修正をする

```修正前.php
<?php
//アプリケーションの Consumer Key と Consumer Secret
$sTwitterConsumerKey = '***********************************'; //Consumer Key (API Key)
$sTwitterConsumerSecret = '***********************************'; //Consumer Secret (API Secret)
 
//アプリケーションのコールバックURL
$sTwitterCallBackUri = 'https://wepicks.net/code-example/twitter-restapi/login/callback.php'; //コールバックURL
 
//~~~~~~~以下省略
?>
```


```修正後.php
<?php

//アプリケーションの Consumer Key と Consumer Secret
$sTwitterConsumerKey = getenv('TW_CONSUMER_KEY');
$sTwitterConsumerSecret= getenv('TW_CONSUMER_SECRET');
$sTwitterCallBackUri = getenv('TW_CALLBACK_URL');

//~~~~~~~以下省略
?>
```

- callback.php終了後のページを任意のページに変更する

```php
//~~~~~~~以上省略
header('location: member.php'); //←任意のページに変更する
```

# 投稿
以下を参考に実施
[PHPからTwitterに投稿する](https://qiita.com/kumasun/items/ae3ff60acab4b1227d61)

```php5


<?php
##############################################
### 初期設定
 
//セッションスタート
session_start();
 
//文字セット
header("Content-type: text/html; charset=utf-8"); 
 
//インクルード
require_once 'config.php';
require_once 'twitteroauth/autoload.php';
 
//インポート
use Abraham\TwitterOAuth\TwitterOAuth;

if(empty($_SESSION['twAccessToken'])){
    echo 'error access token!!';
    exit;
}
 
##############################################
$objTwitterConection = new TwitterOAuth
(
    $sTwitterConsumerKey,
    $sTwitterConsumerSecret,
    $_SESSION['twAccessToken']['oauth_token'],
    $_SESSION['twAccessToken']['oauth_token_secret']
);

// ツイート
$result = $objTwitterConection->post(
    "statuses/update",
    array("status" => "自動ツイートテスト")
);

?>
```

# 参考
[TwitterOAuth](https://twitteroauth.com/)
[Twitter REST APIの使い方](https://syncer.jp/Web/API/Twitter/REST_API/)
[OAuth 2.0 の仕組みと認証方法](https://murashun.jp/blog/20150920-01.html)
【Vue.js】コンポーネントについて

Vue.jsについて必要な知識をまとめました。
自身の備忘録として記載します。

#コンポーネントとは
Vue.jsはVueオブジェクトを作成し、そこで設定したHTMLのタグに表示を組み込み操作します。Vueオブジェクトは１つだけでなくいくつか作成し利用することができます。そうなると同様な表示を行うときに「Vueオブジェクトを再利用できないか」と考えます。ここでコンポーネントが出てきます。

コンポーネントとは一言で言うと「名前のついた再利用可能なVueオブジェクト」となります。
「Vueインスタンスを作成し、特定のタグにレンダリングを適用する」という、JavaScriptのScript側とHTMLタグ側の両方の処理をひとまとめにし、いつでも簡単に利用できるようにしたのがコンポーネント。
コンポーネントは一度定義するとあとはHTMLタグを書くのと同じ感覚で利用できます。

##コンポーネントの定義と利用
コンポーネントを実際にコードに記載するときは下記のように記載します。

```
Vue.component(　名前　、　{　設定情報　}　);
```

第１引数の名前がコンポーネントの名前を指し、実際に利用するときに使用します。
第２引数はコンポーネントの具体的な情報を記載します。

##実際にコンポーネントを書いてみる
定義されたコンポーネントをHTMLの中に記述する際は以下のように書きます。

```
<コンポーネント名　/>
```
例えばworldというコンポーネントであればHTMLのソースコード内に<world />と書けばコンポーネントを挿入することができます。

##変数をコンポーネントに渡す
コンポーネントは用意されたタグをただ表示するだけでなく、用意した値を変数に収めコンポーネントに渡して表示することもできます。
コンポーネントの場合は、dataは「関数」として定義する必要があります。

```
data: function(){ return { 変数の情報 }; }
```
Vueオブジェクトでのdataは変数として渡す値をオブジェクトにまとめたものです。
このdataはオブジェクトにまとめたものをreturnする関数として用意するということです。

#参考URL
Vue.js & Nuxt.js超入門
https://www.amazon.co.jp/dp/4798056596?tag=maftracking247988-22&linkCode=ure&creative=6339https://www.amazon.co.jp/dp/4798056596?tag=maftracking247988-22&linkCode=ure&creative=6339
【Python】LINEからYoutubeの曲や動画を落としたい3/3

#概要
・[【Python】LINEからYoutubeの曲や動画を落としたい1/3](https://qiita.com/Trusted_Dream/items/9e1019efe2a14b6e5199)
・[【Python】LINEからYoutubeの曲や動画を落としたい2/3](https://qiita.com/Trusted_Dream/items/b02e8d84e149b15280bc)
・[【Python】LINEからYoutubeの曲や動画を落としたい3/3](https://qiita.com/Trusted_Dream/items/f564041ce8c6cb7f3513)

・[GitHub](https://github.com/Trusted-Dream/line)へアップロードしました。
・Zennの記事の方が最新です。
https://zenn.dev/trusted_dream/articles/6fbb229fb71216

#LINE BOT実行プログラムの作成
[前回](https://qiita.com/Trusted_Dream/items/b02e8d84e149b15280bc)ではメインとなる部分のプログラムを作成しました。
今回はそのプログラムを常時させるためのシェルスクリプトを作成します。

なお、screenを使いますのでインストールしてない方は行ってください。

```
# yum -y install screen
```
###シェルスクリプト作成
```console
$ cd $HOME/line
$ vim start.sh
```
```start.sh
#!/bin/bash
DIR=$(cd $(dirname $0); pwd)
PID=$(ps x |grep app.py |grep -v grep |awk '{print $1}')

case "$1" in
  "start" )
        env python $DIR/app.py > /dev/null &
        env ngrok http -region=ap 9000
        ;;

  "restart" )
        if [[ $PID != "" ]]; then
                kill $PID
                sleep 1
        fi
        env python $DIR/app.py > /dev/null &
        env ngrok http -region=ap 9000
        ;;

  "stop" )
        if [[ $PID != "" ]]; then
                kill $PID
        else
                echo "pid does not exist."
        fi
        ;;

  "status" )
        if [[ $PID != "" ]]; then
                echo "running PID:"$PID
        else
                echo "not running."
        fi
        ;;

  * )
        if [[ $PID != "" ]]; then
            kill $PID
            sleep 5
        fi
        env python $DIR/app.py > /dev/null &
        env ngrok http -region=ap 9000
esac
```
注意点としては、ngrokを使用する場合はリージョンを**-region=ap**に変更する必要があります。
指定しなかった場合は、Webhook設定でステータスコード200が返ってこない可能性があります。
実はngrokはセキュリティ上の問題で、LINE側で一部制限を掛けているそうです。[詳細について](https://www.line-community.me/question/5f07c0fb851f74ab9c18e8dc)

##実行と確認
それでは実行して確認します。

```console
$ chmod +x start.sh
$ screen
$ ./start.sh
//抜ける場合
Ctrl a + d
//入る場合
screen -r
//screen一覧
screen -ls
//screenの終了
実行中ならCtrl + d
```
暫く(1,2分)してから[LINE Developer](https://developers.line.biz/console/)でWebhook設定を行い確認を行います。
URLは**https://xxxxxxxx.ap.ngrok.io/callback**という風にして検証ボタンを押し、200が返ってきたら成功です。
LINEアプリから実際に入力し、確認してみてください。

それではまた次回でお会いしましょう。閲覧いただきありがとうございました。
Profiler のOthersオプションの時間コストの最適化

今回の主な話題：「Profiler のOthersオプションの時間コストの最適化」、「UI共有図集合併」、「UGUI図集がアンロードできない」、「Shader.WarmupAllShaders()コンパイル」…

---
###メモリ
Q１：プロジェクトはUnity 5.6にアップグレードされたばかりで、テスト中にひどい重い現象が出てきた。Profiler実機テストをしたとき、CPUのOthersオプションの時間コストはとても高いと見つけた。しかし粒子コストもAnimatorコストも高くない、これはなぜだろうか？
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/d799ebd8-f9ad-f5e8-569b-7ab998cc0e02.png)
>Unityエンジンには10個以上のモジュールがあるが、Profilerにはっきり見られるのはRendering、Scripts、Physicsなどの六つのみ。他のモジュールの時間コストは全部Othersに統合されている。だからOthersが高いも正常だ。
問題主のProfilerスクリーンショットから見ると、当分のフレーム時間コストは166msであるが、BehaviorUpdateとLateBehaviorUpdateはそれぞれ36msと37msである。いわゆる、パネルの下に多くのCPU時間コストが書いている。問題主にはこのページを検査して、またどのようなコストがあるのを確認必要がある。理論的には、これらの時間を合計すると166msに相当すべきだ。

---
###アニメーション
Q２：プロジェクト中の骨格「Weapon R」の軌跡がおかしかったので、UWAに聞きたい。
私のやり方は：
Step１：＠skin.fbxの設定
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/388523e6-3890-5ac8-ac5f-692e27cb5284.png)
順次にReset→Enforce T-Poseを実行する。

Step２：アニメーションファイルの設定
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/6d044068-b750-d38a-5f5d-2c4bbbaf37d9.png)
Step3：Play。骨格「Weapon R」を観察し、idle→Runに不気味な曲線がある。

上記の設定を繰り返す、＠skin.fbxを設定する時にはResetをするのみ、Enforce T-Poseをしなければ、Weapon Rは正常だと観察された。
>添付ファイルのプロジェクトを見ると、Weapon Rの骨格が存在するため、Enforce T−Poseの場合、手部の回転がおかしい。Idle→Runの場合、humanoidの補間が乱れ、誤った手部アニメーションが得られ、Weapon Rに影響する。configurationにPose−>BindPoseを使える、これで体の各部位が正しくマッピングでき、そして補間に問題がないことが保証されており。こうやってすればテスト時に「不気味な曲線」が現れていない。またconfigを修正した後にアニメーションfbx中のupdateを忘れないようにしてください。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/8166235b-d014-da8b-a0df-79a05f269901.png)

---
###UI
Q3：今使っているのはUnity 4.7、NGUIである。いくつかの小さなフォントの図集を持っているが,本来は部分機能モジュールに特有のものであり,現在多くの機能インタフェースがお互いに引用されている。ほぼ256×256と512×256のいくつかの図集であるが、これを1枚の1024×1024の大きな共通図集に統合したいと思う。使いやすいが、1024の共有図集はすでに2枚ある、それを加えると3枚の大きい図集になる。NGUIが1024の図集を使い過ぎる時に、GPU にアップロードするにも影響があるか？もしUGUIであればこのような問題も存在するの？注:図集はメモリに常駐させ,独立してパックする。
>「GPU にアップロードする」はロードされた後に行われることが多いので、これらの小さな図集が確かに同時に使われることが多いのであれば、1つの1024図に合わせるのが合理的であり、DrawCallの統合にも顕著なメリットがある。小図を大図に合併 するによる影響については、UGUIとNGUIはほぼ同じであるが,UGUIはSprite Packerで確に1枚しか合成されていないかを確認する必要がある。

---
###ロード
Q4：Shader.WarmupAllShaders();には全てのShaderを事前にコンパイルしたか？まだ通常のShaderを1つのPrefabの上に置いて、ゲーム起動時にロードする必要があるの?
>Shader.WarmupAllShadersには2つの問題がある。1つはwarmupするのは現在のすべてのShaderだけであり、その後に新たなShaderがロードされていれば、再び解析する必要がある。もしwarmupの時にほとんどのShaderがメモリにあることが保証されている場合、このAPIを使えば十分である；二つ目はこのAPIの時間コストは非常に高い。プロジェクトに使うかどうかを問わず、全てのkeywordsの組み合わせをwarmupするため、Unity 5.0以降はshadervariantcollection.warmupで取り替えるとやってみられる。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
[Java] openjdk から　oracle jdk への切り替え方法

```:/usr/lib/jvm
ダウンロードしたoracle jdkをいれる
```
```:環境パス設定
export JAVA_HOME=ここのパスを上のパスにする
```
```terminal:Javaのデフォルト設定
sudo update-alternatives --set java /usr/lib/jvm/jdk1.8.0_version/bin/java
```
```
java -version
```
メモリの平均アクセス時間　＝　キャッシュメモリのアクセス時間×ヒット率＋主記憶のアクセス時間×(1－ヒット率)

応用情報技術者令和元年秋期 午前問10

容量がaMバイトでアクセス時間がxナノ秒のキャッシュメモリと，容量がbMバイトでアクセス時間がyナノ秒の主記憶をもつシステムにおいて，CPUからみた，主記憶とキャッシュメモリとを合わせた平均アクセス時間を表す式はどれか。ここで，読み込みたいデータがキャッシュメモリに存在しない確率をrとし，キャッシュメモリ管理に関するオーバヘッドは無視できるものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b1b19253-6e34-040f-fc4e-05d307128430.png)

私は、アを選択してしまった。説明によりますと、キャッシュメモリに存在している率が容量関係なしで固定数ので、平均アクセス時間も容量と関係なくなりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b871af8b-30b0-0e31-4dd3-bfc5b096b4fb.png)

From https://www.ap-siken.com/kakomon/22_aki/q11.html
Mac OSXでもドキュメントブラウザーZealを使う

OSXで有名なAPIドキュメントブラウザーとしてDashがあります。自分も購入して日々のコーディングのお供として使用していますが、仕事上Linux, Windowsをどうしても使用する必要がありそちらの環境ではZealを使っています。ZealはDashで使えるdocsetをそのまま使えるようにしてあるマルチプラットフォームなドキュメントブラウザーで、LinuxとWindowsをサポートしています。

実は非サポートでありながらOSXで動かすこともできて、自分の手元では特に問題なく動作しています。

Dashを使い続ける利点としては

- Snippet managerの機能が必要
- 見た目がきれい

等あるかと思うのですが、Dashは課金しないと快適に使えないのに対して、ZealはOSSかつ無料で全機能使うことができます。

## Install

Dependencyのインストールがあるのでちょっと手間ですが、[Build Instructions for macOS · zealdocs/zeal Wiki · GitHub](https://github.com/zealdocs/zeal/wiki/Build-Instructions-for-macOS)の通りにやれば特に問題なくbuildできます。

buildはcmakeを使っているので、cmakeが入っていない方は別途cmakeをインストールしてください。(brew install cmake).

## ZealがDashよりも優れている点

![timing-diagram.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177/6b50c0d7-8d26-1be9-2eb1-6f12b9f7ff4c.gif)


Dash、Zealでは複数の言語、フレームワークのdocsetをダウンロードしてその中から、自分が調べたい事柄を検索フォームに入力します。しかし、言語が増えてくると自分が調べたい言語とは異なる他の言語が検索結果に含まれることになります。

そこで、docsetを絞り込めるSearch keyword機能があるのですが、ZealはSearch keywordに補完機能がついているので、Tabで高速に絞り込みができます。

マルチプラットフォームで快適なドキュメント閲覧環境を！
「かな入力」と「ローマ字入力」を切り替える方法

時々は、ロマ字入力しているのに、急にかな入力になってしまうことがあるでしょう。
こんな時に、手動で、IMEバーのプロパティで変換できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ef9e9ce0-9806-6b9e-d344-27127202b771.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8873f976-3d0e-44e4-f22e-09b17b0699f3.png)


ですが、入力際に、頻繁に出て、プロパティで調整するのはいやですね。

ショットキーでも設定できますよ。

それは、**[Alt] キー ＋ 「カタカナ ひらがな｜ローマ字」 キー**　です。

ぜひ試してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/033986ba-6c4e-9564-5f94-242e04263fc8.png)
Makefile　事前に定義された変数一覧

ドキュメントが見にくかったので、テーブルにまとめました。
参考: [GNU make](https://www.gnu.org/software/make/manual/make.html#Implicit-Variables)

| 変数名 | 説明 | default |
|  ---  |  ---  |  ---  |
| AR | アーカイブのメインテナンスプログラム | ar |
| AS | アセンブリの実行プログラム | as |
| CC | Cプログラムのコンパイルプログラム | cc |
| CXX | C++プログラムのコンパイルプログラム | g++ |
| CO | RCSからの展開プログラム | co |
| CPP | Cのプリプロセッサプログラム、標準出力への結果 | $(CC) -E |
| FC | FortranとRatforプログラムのためのコンパイルあるいはプリプロセッサプログラム | f77 |
| GET | SCCSからの展開プログラム | get |
| LEX | Lex文法のものをCあるいはRatforに変換するプログラム | lex |
| PC | Pascalプログラムのコンパイルプログラム | pc |
| YACC | Yacc文法のものをCあるいはRatforに変換するプログラム | yacc |
| YACCR | Yacc文法のものをRatforに変換するプログラム | yacc -r |
| MAKEINFO | TexinfoソースファイルをInfoファイルに変換するプログラム | makeinfo |
| TEX | TeXソースからTeX DVIファイルを作成するプログラム | tex |
| TEXI2DVI | TexinfoソースからTeX DVIファイルを作成するプログラム | texi2dvi |
| WEAVE | WebをTeXに翻訳するプログラム | weave |
| CWEAVE | C WebをTeXに翻訳するプログラム | cweave |
| TANGLE | WebをPascalに翻訳するプログラム | tangle |
| CTANGLE | C WebをCに翻訳するプログラム | ctangle |
| RM | ファイルを削除するコマンド | rm -f |
| ARFLAGS | アーカイブメインテナンスプログラムに与えるフラグ | rv |
| ASFLAGS | アセンブラに与えるフラグ（.sあるいは.Sファイルについて 明示的に呼び出される場合） | なし |
| CFLAGS | Cコンパイラに与えるフラグ | なし |
| CXXFLAGS | C++コンパイラに与えるフラグ | なし |
| COFLAGS | RCS coプログラムに与えるフラグ | なし |
| CPPFLAGS | Cのプリプロセッサとプログラムに与えるフラグ（CとFortranコンパイラ） | なし |
| FFLAGS | Fortranコンパイラに与えるフラグ | なし |
| GFLAGS | SCCS getプログラムに与えるフラグ | なし |
| LDFLAGS | リンカldを呼び出すときにコンパイラに与えるフラグ | なし |
| LFLAGS | Lexに与えるフラグ | なし |
| PFLAGS | Pascalコンパイラに与えるフラグ | なし |
| RFLAGS | Ratforプログラムに対するFortranコンパイラに与えるフラグ | なし |
| YFLAGS | Yaccに与えるフラグ | なし |
【cygwin】色々メモ

１ページを割くまでもない細々したことをメモする。

# 1. cygwinパッケージ

| name | category | comment |
| --- | --- | --- |
| vim-minimal | Base | デフォルトで入るvi |
| perl-DBD-SQLite | Perl | Perlでsqlite3を使う時に必要 |

# 2. コマンド

## 2.1. 単一行で実行

- ```egrep -l '正規表現' *```　条件にマッチしたファイル名を表示する
- ```| xargs -L 1 -t command```　標準入力から受け取ったテキストを１行ずつ処理する
- ```sed -e 's/\(AAA\)\t\(BBB\)/\2\t\1/ sample.txt``` データの入れ替え
    - perlだと「$」を使いそうな場面で「\」を使う。
    - perlは「初めからメタ文字」が多い印象で、sedは「"\"を使って初めてメタ文字」な印象。

## 2.2. 複数行で実行

### 2.2.1. ```ed```　特定の文字列を変更する

```bash
ed file_name <<__end__
g/正規表現/p
s/変更前パターン/変更後文字列/
p
wq
___end___
```

### 2.2.2. findコマンド［UNIXコマンド］2020-07-23

- https://qiita.com/koKekkoh/items/b6899be9a02b98a2da9f
- ```find```, ```tail -5```, ```xargs -L 1 -t```



# 3. perl

## 3.1. 全般

- お約束として
    - ```use strict;```
    - ```use warings;```
    - ```use utf8;```

## 3.2. 関数の共有化

- 呼ばれる側
    - ```package PackageName;```
    - ```my $class = shift;```　第一引数を返して ```$class``` に保存。
    - 以下の ```return …;``` までにゴニョゴニョやっておく。
    - ```return bless $self, $class;```
    - ```my $self = shift;```　第一引数を返して ```$self``` に保存。
- 呼ぶ側
    - ```require "ScriptName.pm";```　ファイルを読み込む。
    - ```new PackageName()``` と ```Packagename::new()``` は同じ。
    - ```PackageName->theFunction()```　で呼ぶと第一引数がクラス参照（クラスの参照渡し？）になる。
    - ```PackageName::theFunction()```　とで動作が変わる
- メソッドの名前（データのやり取りをするもの）
    - ```動作_区分_対象```
    - ```PackageName```　```PackageNameBase```を継承してI/O系のメソッドを追加する
        - ```output_tsv_レコード名```　一つのレコード(=一揃いのデータ群)をファイルに書き出す。TSV形式。
        - ```get_tsv_レコード名```　一つのレコード(=一揃いのデータ群)を受け取る。TSV形式。
        - ```load_レコード名```　データを一旦配列に溜め込む。
    - ```PackageNameBase```　クラス内で簡潔するデータの取り扱いを担当
        - ```clear_item_all```　データをリセット。
        - ```set_item_要素名```　データをオブジェクトに登録。
    - ```PackageNameDB```　```PackageNameIO```を継承してDBの高度な読み書き
        - ```import_レコード名```　配列に溜め込んだデータをDBに書き込む。
        - ```put_item_要素名```　データをDBに書き込む。レコードを特定するデータを得るまで実行不可。
        - ```put_レコード名```　一つのレコードをDBに書き込む。データのあるなしを考慮。
        - ```get_レコード名```　データを取り出す。
    - ```PackageNameIO```　DBの基本的な読み書き
        - ```select_レコード名```　DBからデータを取り出す。
        - ```insert_レコード名```　一つのレコードをDBに書き込む。同じデータがあるとエラー。
        - ```update_レコード名```　DBに登録済みのデータを更新する。データがないならエラーにしたい。
    - ```set``` v.s. ```put```　前者は仮置。後者はちゃんと仕舞う感じ。
    - ```要素名```　カラム名と同じ。もしくは対応が容易に分かる。
    - ```レコード型```　テーブル名と一致するレコート型と一致しないをレコード型を整理。
- TSV,CSVデータをロードするツールがある時
    - 先ずはロード用のテーブルに一旦取り込む。

# 4. Redmine

## 4.1.1. rubygemとredmineの依存関係に配慮したバージョンアップ

- 登録：2020-07-23
    - rubygemの方をサクサクと「gem update」をしてもいい？
    - 何に注意すべき？
- 解決：2020-07-24
    - redmine-4.1.1.tar.gzを展開すると、その中にGemFileがある。
    - redmineなら、このGemFileがある場所でbundleを実行すればいい。

# A. 課題

## A.1. cygwinとrubygemそれぞれのパッケージ管理の競合

- 登録：2020-07-23
    - 同じコマンドがそれぞれで管理されれていると思う。
    - 一方で削除したら他方ででも消える？リカバリ方法はある？
    - どう管理すべき？

## A.2. wcコマンドの使い所

- 登録：2020-07-24
    - tsvファイルのようなテキストファイルであれば、項目数＝単語数/行数として使えないか
    - その他、「ほほぉ～」と思う機能があるか

## A.3. 複数のcygwin環境

- 登録：2020-07-24
    - 主にセットアップ手順の確認のため、まっさらな状態からの手順の再確認をしたい。
- 更新：2020-08-07
    - cygwin環境を作り直して落ち着いているので、現状モチベーションなし。

# 以上
HTTPbodyとURLクエリストリングについて

Swiftでアプリ作成中に、GETでAPIを叩く際にhttpbodyで値を渡したいがエラーが出てしまい、解決策としてURLクエリがあるみたいなので調べてみました。

#発端

Swiftでユーザー一覧を取得する際に、ページ数と１ページあたりに表示するユーザー数をAPIに渡してそれ通りに取得したいと思っていました。

```
let params = Request.UserList.Parameters(
                                         page: String(currentPage), //表示するページ
                                         limit: 10)                 //ページに表示できるユーザー数
```

上記のパラメーターをhttpbodyに入れて、GETを呼び出すと以下のようなエラーが発生してしまいました。


```
2020-07-23 12:12:20.882314+0900 hogehoge[30805:1206517] GET method must not have a body
```

GETにはhttpbodyを渡せないようです。

[GETメソッドでリクエストボディを指定してはいけない(Swift)](https://qiita.com/uhooi/items/e82c8d294a8465a3e6f3)

#URLクエリとは
GETメソッドにパラメータを渡す方法として**URLクエリ**を使用できるようです。

>IT用語辞典
クエリ文字列とは、WebブラウザなどがWebサーバに送信するデータを、送信先を指定するURLの末尾に特定の形式で表記したもの。

簡単にいうと、さまざまな情報をWebサーバーに伝えるためにURLに情報を付け加えることができます。

例えば、Qiitaで「Swift」と検索したページのURLが

```
https://qiita.com/search?q=Swift
```

**?q=Swift**
の部分をクエリパラメータと言います。

これは一覧や検索で使われることが多いようで、GET以外で見ることはほぼありません。

#URLクエリの読み方
先ほどのQiitaの検索画面で説明をすると

```
https://qiita.com/search?q=Swift
```

**?**が「ここからクエリパラメータ」ということを示し、**q**という名前のパラメータ（変数）の値として**Swift**を指定していることになります。

```
? パラメータ（変数）名 = パラメータ（変数）の値
```

Swift検索結果画面で２ページにいくと

```
https://qiita.com/search?page=2&q=Swift
```

となり、**page** = 2、**q** = Swiftがパラメータとして与えられていることがわかります。

そのため、今回の私の作成したいアプリにおいても**GETメソッド**のときは、HTTPbodyではなくURLクエリにパラメータを渡す実装が正しいことになります。

```
// 実装イメージ
if httpmethod != "GET" {
    let encoder = JSONEncoder()
    encoder.keyEncodingStrategy = .convertToSnakeCase
    let httpBody = try? encoder.encode(params)
 }
        
if httpmethod == "GET" {
            
    //クエリ作成処理を記述

 }
```

#まとめ
GETメソッドでパラメータを渡したいときは**URLクエリストリング**を使用する。（HTTPbodyでパラメータを渡せないため）

それ以外のPUT、POST、DELETEなどはHTTPbodyで渡すことが好ましい。

URLクエリは**?**以降がクエリパラメータであり、複数のパラメータを渡す際には**&**で連結を行う。

#参考にした記事
[そのリクエストパラメータ、クエリストリングに入れますか、それともボディに入れますか](https://qiita.com/sakuraya/items/6f1030279a747bcce648)

[URLクエリパラメータ(クエリストリング)の意味とは。使い方は? 除外はすべき?［第4回］](https://webtan.impress.co.jp/e/2012/04/26/12663)
【haml】画像プレビュー 方法(コピペOK)

# 画像のプレビュー
javascriptを使用して、ページを遷移すること無く、画像のプレビューをする
※ファイル選択を出来る状態にする必要がある

## 見 本
[![Image from Gyazo](https://i.gyazo.com/a3ee2e8a3a9148f36cf76c9533746253.gif)](https://gyazo.com/a3ee2e8a3a9148f36cf76c9533746253)

## 実際のコード
```ruby:haml
%img{id:"image-file"}
      :javascript
        document.addEventListener('change', function(e){
          var file = e.target.files[0];
          var fileReader = new FileReader();
          fileReader.onload = function() {
            var dataUri = this.result;
            var img = document.getElementById('image-file');
            img.src = dataUri;
          }
          fileReader.readAsDataURL(file);
        });
```

## 各コードの内容
- ```addEventListener``` さまざまなイベント処理を実行することができるメソッド

- ```document``` Chrome等のブラウザ上で表示されたドキュメントを操作する事

- ```change``` 値が変化した後に発火

- ```e.target.files[0]``` で選択されたファイルを取得

- ```FileReader``` ユーザーのコンピューター内にあるファイルをウェブアプリケーションから非同期的に読み込むことが出来る。

- ```result``` ファイルの内容を返す

- ```getElementById``` 指定されたidの属性を持つ、要素の参照を返します

- ```readAsDataURL``` FileReaderのメソッドです。ファイルを、Data URIとして読み込むメソッドです。例えば画像ファイルをこのメソッドで読み込んで、読み込んだデータをimg要素のsrc属性に指定すればブラウザに表示できます。
[Rails]deviseで思わぬバリデーションエラー

# はじめに

ユーザー管理でお世話になっているdeviseで思わぬエラーにハマり、かなりの時間を溶かしたので備忘録として残しておきます。


# 環境/Gem(ver)

* Ruby (2.5.1)
* Rails (5.2.4.3)

# 結論

**自分でUserモデルにvalidatesをかける時は気をつけよう。**

ちゃんと下調べをして今後実装するようにします。。

# 前提

devise を bundle install 後、以下のように Userモデルにバリデーションをかけていました。
passwordには7文字以上の制限をかけたいと考えていました。

これで、新規ユーザーの登録は問題なくできていました。

※UserとShopは多対多の関係で中間テーブルにStylistテーブルがあるイメージで実装しています。

```ruby
(models/user.rb)
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many   :stylists
  has_many   :shops, through: :stylists

  (省略)

  validates :password, presence: true, length: { minimum: 7 }, format: { with: /(?=.*\d+.*)(?=.*[a-zA-Z]+.*)./ }
end 
```

# 現象

ユーザー（Userモデル）登録後に新規でショップ（Shopモデル）を作成と同時に中間テーブル(Stylistモデル)を作成しようとすると、、エラー。

[![Image from Gyazo](https://i.gyazo.com/921b6bc21385c300d2b476e37a222f77.png)](https://gyazo.com/921b6bc21385c300d2b476e37a222f77)

パラメーターにはちゃんと値が入っているし、何が**「不正な値」**なのか、その原因が突き止められず。
また、**「新規登録(new/create)はできないが編集(edit/update)はできる」**という状況で、謎が深まり、多くの時間を溶かしました。。

# 仮説

外部キーのnilを許可すれば解決するのでは？

```ruby
(models/stylist.rb)
class Stylist < ApplicationRecord
#修正前
  belongs_to :shop
  belongs_to :user
#修正後
  belongs_to :shop, optional: true
  belongs_to :user, optional: true
end
```

・・・ダメでした。

# 解決策
バリデーションに原因があるのは間違いないので、Userモデルに記述しているvalidatesを一つ一つ解除しながら、挙動を確かめていくと、、

```ruby
(models/user.rb)
class User < ApplicationRecord

  (省略)

  validates :password, presence: true, length: { minimum: 7 }, format: { with: /(?=.*\d+.*)(?=.*[a-zA-Z]+.*)./ }
end 
```

↑ validates :password を消したら万事解決でした！！

そして、以下の場所にカスタマイズ内容を書き換えました。

```ruby
(config/initializers/devise.rb)
class User < ApplicationRecord

  (省略)

#修正前
  config.password_length = 6..128
#修正後
  config.password_length = 7..128
```

そもそもなぜ中間テーブルを保存する際にエラーを吐き出すのか？謎のままですが、deviseにはデフォルトのバリデーションがあり、自作したバリデーションと良からぬ反応をしたのかなと思います。。（勉強します）

また、以下の記事を参考にさせていただき、カスタマイズをしたところ問題なく動作しております！

# 参考記事

https://qiita.com/hirokihello/items/862284c60429be5e01cd
https://github.com/heartcombo/devise/wiki/Customize-minimum-password-length