OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript概念

JavaScriptの概念的な用語を簡単にまとめてみました。

### DOM
- DOMとは「Document Object Model」の略で、HTMLを解釈してツリー構造で表したもの。
- JavaScriptはDOMを操作することでHTMLの見た目を変えている。
- DOMはディベロッパーツールから見ることができる。
- 素のJavaScriptやjQueryではDOMを直接操作している。

### 仮想DOM
- JavaScriptのオブジェクトで仮想的に作られたDOMのこと。
- DOMを直接操作するとレンダリングコストやコードが複雑化してしまうが仮想DOMはそれを解決してくれる。
- 仮想DOMはいきなりDOMを操作せずにJS上で仮想DOMを操作し、差分を出してからDOMに反映している。

### npm/yarn
- 従来のパッケージマネージャーでは、1つのJSファイルに全ての処理を記述していたり、他のJSファイルを読み込んで使っていたが、これだとコードがカオスかしたり、読み込み順を意識しないとエラー、どこから読み込まれているか分からないとう問題点があった。
- この問題を解決するためにnpm/yarnが誕生。
- npm/yarnは依存関係勝手に解決してくれたり、import先が明示的で読み込み先が分かりやすく、世界中に公開されているパッケージをボタン一つで利用できる。

### ECMAScript 
- 通称えくますくりぷと
- JSの標準規格（JSの書き方のルール）
- ES6(ES2015)の大幅アップデートで機能追加が多くありJSの転換期と言われているらしい。
    - letやconstを用いた変数宣言
    - アローファンクション
    - 分割代入
    - スプレッド構文
    - etc...

などが様々な機能が追加された。

### モジュールバンドラー
- 複数のJS(css/image)ファイルを1つにまとめるためのものでwebpackが代表的。
- 分けて開発していたファイルを本番環境では1つにまとめてくれる。


### トランスパイラ
- 新しいJavaScriptの記法を古い記法に変換してくれるもの。BABELが代表的。
- JSはブラウザ上で動くものだが、新しいJSの記法に対応していないブラウザもある。トランスパイラを使用すると、新しい記法で開発し、実行するときにトランスパイラが変換してくれるのでどのブラウザでも実行ができる。

### SPA
- シングルページアプリケーションの略。HTMLは1つでJSで画面を書き換える技術。
- 従来のwebシステムはリクエストに応じた画面(HTML)を都度返却する。
- SPAは最初は同じようにHTMLを返却するが、2回目以降は画面表示に必要なデータだけを返却し、JSでHTMLを書き換えることで画面が変わったように見える。

SPAのメリットは、

- ページ遷移ごとのチラつきがなくなる。
- 表示速度のアップによりユーザー体験の向上。
- コンポーネント分割による開発効率のアップ。

などがある。

# 参考

https://www.udemy.com/course/modern_javascipt_react_beginner/
侍エンジニア塾とテックアカデミーとテックキャンプをchromeの検索結果から一掃する方法

カスみたいな情報量しかないのに検索上位に必ずと言っていいほど出てくる某侍エンジニア塾と某テックアカデミー。
こいつらをchromeから一掃しましょう。
ついでに某テックキャンプもお掃除します。上記の二つになんか似てるし。

## Chrome / 設定 / 検索エンジン
赤枠をクリックすると検索エンジンの設定画面が表示されます
設定TOP画面で `chrome://settings/searchEngines` と入力しても飛べます

![スクリーンショット 2021-10-13 113220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/3ddcdcea-7fd0-ff52-6959-e84f362aa24d.png)


## 既定の検索エンジン / 追加

検索エンジンの設定画面から画像の場所をクリックすると
![スクリーンショット 2021-10-13 120122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/6f710e9c-27ef-c0e7-82ee-274dc601f68b.png)


以下のモーダルが出てくるので入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/216fd061-dffd-940f-63ee-e9ae268664f4.png)


```text:URL(%s=検索語句)に入力するワード
{google:baseURL}search?q=%s+-site:sejuku.net+-site:techacademy.jp+-site:-tech-camp.in&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}
```

参考サイトでは`www.sejuku.net`が使われていたが、これだと記事内に某侍エンジニア塾のURLが記事内にあるサイトも除去されちゃうので`site:sejuku.net` を使用している（参考サイトのコメントより）

「その他の検索エンジン」に追加した検索エンジンがあるので、それの縦３点リーダーをクリックし「デフォルトに設定」を選択
※ 既定のブラウザとして使用しない場合は、アドレスバーに `ご自身で設定されたキーワード ＋ スペース` で、作成した検索エンジンでの検索ができる。

![スクリーンショット 2021-10-13 114036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/cb38bd15-9359-5060-33aa-2bfd7649e1d9.png)

この設定によってアドレスバーで検索ワードを検索すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/89957c85-06b3-87c1-47db-f584d9541a25.png)

となり、検索すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/90367609-2a25-4206-e8d3-678a64db49a2.png)


きれいさっぱりいなくなりました。これでインターネット公害対策の完了。
ほかにもお掃除したいサイトがあれば、`search?q=%s`の末尾に`+-(対象のサイト)`を追加していくとよい。

```text:URL(%s=検索語句)に入力するワード
{google:baseURL}search?q=%s+-site:sejuku.net+-site:techacademy.jp+-site:-tech-camp.in+-xxxxxxx
```

参考サイト
[侍エンジニア塾の記事を Chrome 拡張なしに Google 検索結果から一掃するわりと簡単な方法](https://qiita.com/komiya_atsushi/items/7d2cbf322dd5e8f2dc8e)
Java Silver アウトプット6

前回の続きです

https://qiita.com/0W5E8fPq1EOm4yE/items/9ad1d33ddc307e3ff433

chapter6の継承とポリモフィズムのアウトプットをします。
やはりコードとなると今までのことが混ざってしまって全然理解できていない状況ですが回数を重ねて慣れていこうと思います。


・オーバーライドの際はメソッドの「メソッド名」「引き数」「戻り値」を全く同じにする必要がある。

・throws句は子で指定しなくてもオーバーライドとして認識される。 ・throws句のExceptionクラスは親と同じか、サブクラスでなければならない。

・インターフェースは公開すべき必要な操作をまとめたクラスの仕様のこと

・[アクセス修飾子]interface インターフェース名{}と記述する

・インダーフェース宣言にはinterfaceキーワードを指定する

・インスタンス化はできず、利用する場合実装クラスを作成し、実装クラス側では抽象メソッドをオーバーライドして使用する

・実装クラスを定義するにはimplementsキーワードを使用する

・インターフェースをもとにサブインタフェースを作成する場合extendsキーワードを使用する

・インタフェースではpublic staticな定数を宣言できる。定数となるため初期化しておく(しないとコンパイルエラー)

・デフォルトメソッドはpublicのみ指定することができる

・抽象メソッドpublic abstractは記述がなくても強制的に付与される

・thisを使用しないと引数で受け取った値はインスタンス変数に代入されない

・スーパークラスのコンストラクタを呼び出すにはsuper()を使用し、呼び出すにはコンストラクタ内の先頭に記述する

・抽象クラスの場合、インタフェースのメソッドをオーバーライドしなくてよい

・サブクラス型の変数でスーパークラスのオブジェクトを代入できない

・ポリモフィズムはstaticメンバには適用しない

・アクセスレベルはデフォルトとprotectedではprotectedが緩い

・オーバーロードのルールとして引数や値が同じ型かどうか確認する

・compare()メソッドは第2配列が第１配列に比べて大きいと負の値を返す

・mismatch()メソッドではどこの要素でおきなのかその時の番号を返す

・substringは文字列の開始から終了の一つ前の値を取り出す

・List<String> city = Arrays.asList(ary);は固定リストである

・固定リストは値の削除ができない

・List<String> city = new ArrayList<>(Arrays.asList(ary));は可変リスト
Word（ワード）で左側の余白に表示された黒い四角（点）を消す方法

https://prau-pc.jp/word/black-square-delete/

コレってqiitaにメモっていた気がするけどしてなかったのでメモ失礼いたします。

```
［ホーム］タブ　→　［段落］起動ツールをクリックします。場所が分かり難い場所なので注意しましょう。

［段落］ダイアログボックスが表示されますが、右側の［改ページと改行］タブに移動します。

その中のピンクの枠で囲んだ部分、どれかにチェックがあると黒い点が表示されます。

チェックが入っている場所を外してから［OK］をクリックすれば消えます。
```

との事っ

Ctrl+Aで文章を全て選択した後にやってネっ
for_eachで属性の値により作成対象を制御する方法

for_eachで回しつつ属性の値によってリソース作成したり、作成しなかったりする。

たとえば以下のようなvariablesがあるとする。

```
log_groups = {
    "application" = { 
        retention_in_days = 1 ,
        transition_glacier_days = 1 ,
        filter_pattern = "?test ?error" ,
    },
    "dataplane" = { 
        retention_in_days = 1 ,
        transition_glacier_days = 1 ,
        filter_pattern = null ,
    },
    "host" = { 
        retention_in_days = 1 ,
        transition_glacier_days = 1 ,
        filter_pattern = null ,
    },
}
```

上記、`filter_pattern`に値がある場合はリソースを作成し、値がない場合はリソースを作成しないようにしたい。上記の例だと前者は`aplication`、後者は`detaplane`、`host`が該当する。

以下のように`for_each`に指定するmapをforとifで再構成してあげれば良い。こうすれば`aws_cloudwatch_log_subscription_filter.container_insights["aplication"]`のみ作られる。

```
resource "aws_cloudwatch_log_subscription_filter" "container_insights" {
  for_each = {
    for k, r in var.log_groups : k => r
    if r.filter_pattern != null
  }

  name            = "${var.base_name}-${each.key}-alertfilter"
  log_group_name  = "/aws/containerinsights/eks/${each.key}"
  filter_pattern  = each.value.filter_pattern
  destination_arn = aws_lambda_function.log.arn
}
```
phpでWordpressの動画をランダム再生する方法

[基本環境](#基本環境)
[wordpressでカスタムページを作成](#wordpressでカスタムページを作成)
[ランダム表示php](#ランダム表示php)
[動画再生htmlタグ](#動画再生htmlタグ)
[ランダム表示と動画再生組み合わせ](#ランダム表示と動画再生組み合わせ)
[動画アップロード](#動画アップロード)
[カスタムページをカスタマイズ](#カスタムページをカスタマイズ)
[表示確認](#表示確認)
[参考記事](#参考記事)

#基本環境
WordPressで子テーマ設定済み

#wordpressでカスタムページを作成

親テーマのpage.phpをコピペしてカスタムページvideo-random.phpを作成

```
# cp -p /var/www/html/example.com/wp-content/themes/親テーマ/page.php /var/www/html/example.com/wp-content/themes/子テーマ/video-random.php
```

video-random.php最上部に以下を追記

```:#&nbsp;vim&nbsp;/var/www/html/example.com/wp-content/themes/子テーマ/video-random.php
<?php
/*
Template Name: video-randomページ
*/
?>
```

WordPressで新規固定ページを作成、テンプレートで「video-randomページ」を選択

#ランダム表示php

```
<?php
$random = array(
    "＜HTML_option1＞",
    "＜HTML_option1＞",
    "＜HTML_option1＞",
);
 
$random = $random[mt_rand(0, count($random)-1)];
echo $random;
?>
```

画像表示の場合、HTMLタグをまとめるとシンプルなコードに

```
<?php
$random = array(
    "＜画像URL_1.jpg＞",
    "＜画像URL_2.jpg＞",
    "＜画像URL_3.jpg＞",
);
 
$random = $random[mt_rand(0, count($random)-1)];
echo '<img src="'.$random.'" alt="">';
?>
```

#動画再生htmlタグ

```
<video src="動画URL_1.mp4"></video>
```

###属性
自動再生

```
<video src="動画URL_1.mp4" autoplay ></video>
```

無音声再生

```
<video src="動画URL_1.mp4" muted ></video>
```

繰り返し再生

```
<video src="動画URL_1.mp4" loop ></video>
```

その他の属性
https://webliker.info/52510/#toc_2

#ランダム表示と動画再生組み合わせ

```
<?php
$random = array(
    "＜動画URL_1.mp4＞",
    "＜動画URL_2.mp4＞",
    "＜動画URL_3.mp4＞",
);
 
$random = $random[mt_rand(0, count($random)-1)];
echo '<video src="'.$random.'" autoplay muted loop >';
?>
```

#動画アップロード

WordPressメディアに動画をアップロード

#カスタムページをカスタマイズ

video-random.php`<main> </main>`間をカスタマイズ
自動再生、無音声再生、繰り返し再生を設定

```:#&nbsp;vim&nbsp;/var/www/html/example.com/wp-content/themes/子テーマ/video-random.php
<main>

<?php
$random = array(
    "＜動画URL_1.mp4＞",
    "＜動画URL_2.mp4＞",
    "＜動画URL_3.mp4＞",
);
 
$random = $random[mt_rand(0, count($random)-1)];
echo '<video src="'.$random.'" autoplay muted loop >';
?>
</main>
```

#表示確認

WordPress固定ページで表示確認

***
#参考記事
`https://webnetamemo.com/coding/php/201608313448`
`https://webliker.info/52510/#toc_2`
Raspberry Pi Imagerで日本語キーボードを指定する

Raspberry Pi ImagerのAdvanced options（Ctrl+Shift+X）で、日本語キーボードレイアウトの指定方法が分からなかったのでメモ。


Keyboard layoutに`jp`と入力すればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109634/b9d4d4c9-b099-b43b-1ea9-88dbdb256ea7.png)
EC-CUBE4.0.3|docker-compose|install

EC-CUBE4.0.3は、docker-compose.yamlが付属していません。
どうやってローカル環境を構築するかを書いておきます。

```
$ git clone -b 4.0.3 https://github.com/EC-CUBE/ec-cube.git  eccube-4.0.3
$ cd eccube-4.0.3
```
docker-compose.yamlというファイルを作成して、そこに他のバージョン（4.0.5）から持ってきたものを貼り付けます。

```
version: "3"

networks:
  backend:
    driver: bridge

volumes:
  pg-database:
    driver: local
  mysql-database:
    driver: local
  mailcatcher-data:
    driver: local

  ### ignore folder volume #####
  var:
    driver: local
  vendor:
    driver: local

services:
  ec-cube:
    build:
      context: .
      args:
        SKIP_INSTALL_SCRIPT_ON_DOCKER_BUILD: "true"
    ports:
      - 8080:80
      - 4430:443
    volumes:
      - ".:/var/www/html:cached"
      - "var:/var/www/html/var"
      - "vendor:/var/www/html/vendor"
    networks:
      - backend

  postgres:
    image: postgres:10
    environment:
      - POSTGRES_DB=eccubedb
      - POSTGRES_USER=dbuser
      - POSTGRES_PASSWORD=secret
    ports:
      - 15432:5432
    volumes:
      - pg-database:/var/lib/postgresql/data
    networks:
      - backend

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: eccubedb
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: secret
    volumes:
      - mysql-database:/var/lib/mysql
    ports:
      - 13306:3306
    networks:
      - backend

  mailcatcher:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
    networks:
      - backend
```

#Composerの問題の解消

composerのバージョンを「1」に固定しないと、当時のライブラリをインストールできないので、
`Dockerfile`を開いて45行目あたりを編集して下さい。

```
RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/bin/composer
```
↓

```
RUN curl -sS https://getcomposer.org/installer | php -- --version=1.10.15 && mv composer.phar /usr/bin/composer
```

当時と、名前が変わっているライブラリがあります。
composer.jsonを開きます。大文字のSをsに直します。

```
"mikey179/vfsStream"
```
↓

```
"mikey179/vfsstream"
```
インストールしていきます。

```
$ docker-compose up -d
```
エラーが出ていないことを確認したら、
localhost:8080 にアクセスします。

いろいろな設定をやっていきますが、1番ハマりやすいのがデータベースの接続です。
パスワードの部分はスクリーンショットだとみえませんが、「secret」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216132/d82b30dc-e195-2ee5-421e-215cba4f80d8.png)

途中でうまく行かなかった場合は、滅びの呪文でイメージを消します。

```
$ docker-compose down --rmi all --volumes --remove-orphans
$ cd ../
4 rm -r eccube-4.0.3
```

時間が経ってくると、composerライブラリの名前が違うとかはあると思いますので、
そういうエラーが出た部分を修正して、また最初の手順から繰り返します。
GPUを活用した機械学習ツールNVIDIA RAPIDSをArch Linux + CUDA11.4 でビルドし、Cupy にも組み込んだ(Ver21.10版) (3) CUgraph


# やったこと＝RAPIDS のビルド
データ処理、機械学習のフレームワーク[RAPIDS](https://rapids.ai/)を  [Arch Linux](https://www.archlinux.org/)  でビルドした。ただし、ビルドまでにエライ手間がかかったので、皆さんへの共有も兼ねて
0. **基本構成その0** ・・・ Cupyのビルド方法については[こちらの記事](https://qiita.com/daisuzu_/items/971ff080bb8e16d7c815)で紹介してます。
1. **基本構成その1** ・・・ [こちら](https://qiita.com/daisuzu_/items/6b2564450c75f25cc882)。RMM, cuDFというRAPIDS の基本コンポーネントの一部のビルド手順。
2. **基本構成その2** ・・・ [こちら](https://qiita.com/daisuzu_/items/032db63947604b960f8d)。CUMLというRAPIDS の基本コンポーネントの一部のビルド手順。ついでに、cuSignal という信号制御ライブラリやcuxfilter という描画データ変換ライブラリも
3. **基本構成その3** ・・・ いまここ。グラフを扱うCUGraphのビルド手順。

# cuGraph って何？
NVIDIAから提供されている、グラフ分析用ライブラリ。上述の[github](https://github.com/rapidsai/cugraph)や[ドキュメント](https://docs.rapids.ai/api/cugraph/stable/)のとおり、RAPIDS経由で提供されている.

#事前想定
* NVIDIA GeForce RTX/GTX を持っている人
* CUDA含めた開発環境が揃っている。
* Arch Linux の使い手。EndeavourOSなど派生ディストリビューションでもOKだが、Manjaro のように独自リポジトリを持ち、カーネル、ドライバなどのリリースのペースが異なるものは関知しません。
* yay とか PKGBUILD とかが何やってるかが、ある程度わかること。


#ビルド方法
[GitHubリンク](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110)に、PKGBUILDとかビルド順とか。で済ませたいですが、補足説明を。あと参考までにビルドの依存関係をつけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64164/1751744e-04bd-bd22-d558-3ea091e9c00d.png)


０  事前に、pacman で spdlog をインストールしてください。外部でspdlogを持つ強い根拠はないです。[別記事](https://qiita.com/daisuzu_/items/6b2564450c75f25cc882)のとおりRAPIDSの他コンポーネントのビルド設定と合わせただけです。

```
sudo pacman -S spdlog
```

その後、 /etc/makepkg.cfg のコンパイルフラグに、「-DSPDLOG_FMT_EXTERNAL」というフラグをつけて、SPDLOGはOSにインストールしたほうを呼び出す設定にしてください。

```
CFLAGS="-march=skylake-avx512 -mtune=native -DSPDLOG_FMT_EXTERNAL -O3 -pipe -fno-plt -fexceptions \
        -Wp,-D_FORTIFY_SOURCE=2,-D_GLIBCXX_ASSERTIONS \
        -Wformat -Werror=format-security \
        -fstack-clash-protection -fcf-protection"
```


１. [cuGraph](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/cugraph)
  GITにあるファイルをローカルに置いて、ビルドすればOK。ただし、現行バージョン(21.10)の制限は、
- 他のコンポーネント(CUML,CUDF)はGCC11でビルドできるが、**CUGraphはGCC11ではビルドできない**。GCC10を使う必要がある。cugraph でなくそこから呼び出している外部のライブラリがGCC11でビルド不可のため。

というのがある。あとは、test中のコマンドなどで動作を確認してほしいが、CPU vs GPU の動作比較となるため、networkXのインストールも必要になる。

```
sudo pacman -S python-networkx
```

##Cupy に cuGraph を組み込み
なんのことはなく、cuGraphをインストール後に、Cupyを再ビルドすれば、cuGraph も自動的に組み込まれる


2. [Cupy](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110/tree/main/python-cupy)

基本的には[以前の投稿](https://qiita.com/daisuzu_/items/971ff080bb8e16d7c815)と同じ（cuSparseLtは無くてもよい）。
ただし、パッチとして、
* cugraph ヘッダファイルの位置の訂正
* cugraph の 21.10 から一部ライブラリが、Legacyに移っている（[参考](https://github.com/rapidsai/cugraph/commit/f1dffc46a3f7e91a684ae378b3898e08920f93e3#diff-edf3e2bf578ba13be9e52fc0fe75b158ed9205daffa3ebcf9793d9d7b68229c5)）ためその対応をしている。



#記録
1. (2021.10.13 23:00 JST)...初版


#おことわり
この記事は、筆者以外の方の環境でも同様に成功することを保証するものではありません。**ビルドや動作確認の失敗**、（ないとは思いますが）**環境が破壊されても責任は一切負いかねます**（基本的には自己責任でお願いします。）。

#今回紹介したリンク
[https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110](https://github.com/gdaisukesuzuki/PKGBUILD_rapidsai2110)
MathJaxを動的に処理した

# 初めに
どうも、最近 `Ruby on Rails` 初めた人です。~~（記事と全く関係ない）~~

今回の記事は。
MathJaxというライブラリを使って数学のwebアプリを作っていたとき、**動的に**処理できなくて困ったので記事にまとめます。

# MathJaxってなに？
> MathJax はMathML、LaTeX、ASCIIMathMLで記述された数式をウェブブラウザ上で表示するクロスブラウザのJavaScriptライブラリである。MathJaxはApache Licenseのもとでオープンソースソフトウェアとしてリリースされている。
> [MathJax - Wikipedia](https://ja.wikipedia.org/wiki/MathJax MathJaxのwiki)

まぁ、要するに「カッコいい数式を表示できる機能」ってこと

## 例
<!-- ピコピコうざいから、後でコードブロックに変更する -->
```math
二次方程式　[x=ax^2+bx+c]　の解は \\
x = {-b \pm \sqrt{b^2-4ac} \over 2a}
```
こんなかんじ

## どうやって使うの？
```html
<script type="text/javascript" id="MathJax-script" async
  src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</script>
```
↑こいつを `<head>` タグの中に入れるだけ！

あとは、 `<body>` タグの中に数式を放り投げるだけ。
数式は、ぐぐったら出てくるから、自分で調べて。

# 自分がしたかったこと
**ボタンを押して数式を表示する**
「スタートボタンを押して、事前に用意してあった数式を表示して、回答する」
という簡単な計算アプリを作っていた。
数式を表示するだけならすぐに実行できたが、`.innerHTML` もしくは `.html` を書き換えると、うまく行かなくなった。

# 結論
```html
// head
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/5.0.4/math.min.js"></script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript" src="script.js" charset="utf-8"></script>
```
```html
// body
<div id="math">\\begin\{align\}半径 = \\frac{直径}{2}\\end\{align\}</div>
<button onClick="changeMath()"></button>
```
```js
// script.js

function changeMath() {
  $("#math").html("\\begin\{align\}");

  $("#math").append("y=\\sin(\\theta+\\frac{\\pi}{2})+1");

  $("#math").append("\\end\{align\}");
  MathJax.Hub.Queue(["Typeset",MathJax.Hub,"quMain"]);
}
```
# 解説

表示されたボタンを押すと `changeMath()` が発火する。
そうすると、表示されていた数式が上の数式から下の数式に置き換わる。

```math
半径 = { 直径 \over 2 }
```

```math
y=\sin(\theta+\frac{\pi}{2})+1
```

---
**以上**
AWS Amplifyで静的サイトを構築してみた

#背景

今年の初めに法人を作ったので、楽天銀行で法人口座を開設しようと手続きを進めてみたら、自社Webサイトがあると提出書類が減るとのことだったので簡易にサイトを構築してみました。
[楽天銀行　口座開設に必要な書類](https://www.rakuten-bank.co.jp/business/account/id.html#anchor-02)

最近PO/PM業務が多かったので久しぶりの技術です。


#事前の用意
 - ドメイン（AWS Route53で取得も可）
 - AWSアカウント
 - githubアカウント

私はmuumuuドメインでドメインを取得、静的サイトはReactで作りました。

#構築手順
ほぼ[ここ](https://aws.amazon.com/jp/getting-started/hands-on/host-static-website/)に書かれた内容そのままですが、手順を追って説明します。

#### 静的サイトの構築
まずはローカル環境で静的サイト（Reactアプリ）を作ります。Reactって何？って方は[こちら](https://ja.reactjs.org/docs/getting-started.html)を参照ください。

```zsh
npx create-react-app ｍysite
cd mysite
yarn start
```

#### githubリポジトリの作成
[github](https://github.com/new)で新しくリポジトリを作成します。

#### githubへ静的サイトをpush
Reactアプリのディレクトリで以下のコマンドを打ちます。環境によって6行目の文字列は異なるのでgithubでリポジトリ作成時に表示されたコマンドをそのまま打ちましょう。

```zsh
echo "# mysite" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:account/mysite.git
git push -u origin main
```
githubのデフォルトのブランチが`master`から`main`に変わってました。


#### AWS Amplifyからgithubに接続
Amplifyから、githubで作成したリポジトリへ接続して、Reactアプリをデプロイしてあげます。
[Amplify](https://ap-northeast-1.console.aws.amazon.com/amplify/home)にアクセスして、いくつかの質問に答えていくだけで設定が終わります。
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/6a292d4b-e824-1842-ed7f-7005840a75b9.png)
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/8c427177-3856-034d-5d55-598c81c1c782.png)
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/743ed55f-e3b3-8ebe-6573-480d3c415178.png)
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/42668745-8e59-df0f-ba9e-95e8eccf4a09.png)

ここまでくれば、Amplifyのサブドメイン上で、作成したReactアプリがインターネット公開されます。とても簡単ですね。
以前、herokuでもReactアプリをデプロイしたことがありますが、それと比べるととても簡単でした。

#### ドメイン設定
取得済みのドメインでサイトにアクセスできるようにします。

Route 53の[ここ](https://console.aws.amazon.com/route53/v2/hostedzones#CreateHostedZone)からホストゾーンの作成をします。
![スクリーンショット 2021-10-13 10.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/e5dc26a5-20b0-dc37-1e0c-d192b40ea468.png)

そうすると、ネームサーバー情報が表示されるので、これをドメイン取得サイト（私の場合はmuumuu）に設定します。
![スクリーンショット 2021-10-13 10.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/1eb82e60-6538-254e-52f7-1bb90a0a6873.png)

ネームサーバー設定の以下の部分にRoute 53で表示されたネームサーバーを入力します。
![スクリーンショット 2021-10-13 10.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/11f2bdb2-8e95-bf63-6f93-7f21b484a813.png)

あとは、Amplifyのドメイン管理からドメインを割り当てます。
設定画面を取り忘れましたが、設定が終わると以下のような画面になります。
![スクリーンショット 2021-10-13 10.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/046d528d-c82c-2790-7709-0bcf4aaf16d4.png)

以上で作業は完了です。

#### 補足
一部画像が表示されない事象が発生したので調べたら、拡張子を`jpeg`としているのがだめだったようで。
以下の”書き換えて、リダイレクト”（翻訳が、、、）の設定を書き換えたら表示されるようになりました。
もともと`jpg`しかなかったところ`jpeg`を追加してます。
![スクリーンショット 2021-10-13 10.56.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163132/819581c9-d02e-d4cb-6dd3-94a209dd080a.png)



#所感
１-２年技術から離れてから戻ってくると、その進化の速さに驚きます。
静的サイトくらいであればサーバなんて立てる必要もないし、ApacheやらNginxの設定もいらないんですね。。。
DeveloperNameフィールドの新しい権限要件

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


セキュリティーの強化のためにDeveloperNameフィールドの参照に制限が付与されたようです。

[DeveloperNameフィールドの新しい権限要件](https://help.salesforce.com/s/articleView?id=000362829&type=1)


プロファイルに設定がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/083305eb-55e5-68eb-3a1b-7a2db225e987.png)




元の質問
[サービスプレゼンス状況のレポート表示](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000DbwIGSAZ)

# record page

+ [Customize the User Interface for a Recruiting App > Create a Custom Position Record Page](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000oFP9)
+ [I could not create a "Custom Lightning Record Page"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PZypz)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/95d8479b-ca4d-be0c-70e6-f055c43d3663.png)

:::note
There may already be a record page with the same name.

Goto Setup --> Lightning App Builder -->

Try renaming or deleting the existing record page
:::

+ [i face this issue how i can solve it if it not occurs? then my module is not complete and i will not eligible for certificate](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SWxQN)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5c72e5c0-47e0-41ae-a497-69f18a36769c.png)

:::note
Try deleting the record page with the same name. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6bd10e8b-95c4-414a-955b-96f7e4b374ce.png)
:::


# 関連するエラー

+ [Developer name has to be unique](https://qiita.com/Keiji_otsubo/items/2cd7de015cafefc95923)

# Error: Invalid Data.Review all error messages below to correct your data. You can't access this field .

+ [deactivate an user でのエラー](https://qiita.com/Keiji_otsubo/items/107001f7a5191c7bd7b5)
+ [Approval Process](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7PADSA3)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/aad685b7-8163-de02-a7a7-9658bb20331b.png)


# 関連

+ [Error: This Unique Name already exists or has been previously used. Please choose a different name.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Pf9Vi)
+ [【未解決】error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvnoJ)
+ [【未解決】I am trying to complete " customize record page unit but keep getting this error 'You must enter a value for page property 'DeveloperName'.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvVRb)
ラズパイにカメラモジュール(Raspberry Pi Camera Module V2)を接続して写真を撮ってみる

#本記事の内容
- ラズパイにカメラモジュールを接続する

ラズパイで画像認識等を行ってみたく、その前段階としてまずはカメラを接続する。

#実施環境
- Windows 10
- TeraTarm Version 4.9.4
- Raspberry Pi 2 Model B
- PLANEX 無線LAN子機 GW-USNANO2A ※Raspberry Pi 2はWi-Fi通信モジュールがないため、無線LAN子機をUSBに接続しWi-Fi通信を行う。
- 家庭内の無線LANネットワーク環境にて実施
- Raspberry Pi Camera Module V2 

#手順の流れ 
0. カメラモジュールを接続する
1. TeraTarmでsshログインする
2. raspi-configでの設定
3. 設定の反映確認
4. カメラでの撮影テスト
5. 写真ファイルをダウンロードして確認

## 1. カメラモジュールを接続する

Raspberry Piに対して以下のようにカメラモジュールを接続した。

![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/99a6b022-6aed-1e58-361a-c11d13014951.jpeg)

カメラモジュールは裸のままだと心許ないので、こちらのマウントキットに取り付けて、三脚に固定した。またカメラケーブルはデフォルトの物だと短かったので、長いものを購入し差し替えました。

[マウントキット](https://www.amazon.co.jp/gp/product/B071FC2578/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1)
※フタを閉めようとするとカメラにぶつかり、フタが閉まらないという噂がありました。。怖いのでフタは閉めていません。

[三脚](https://www.amazon.co.jp/gp/product/B084392JQM/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1)

[カメラケーブル](https://www.amazon.co.jp/gp/product/B0865NXTGS/ref=ppx_yo_dt_b_asin_title_o05_s00?ie=UTF8&psc=1)


## 2. TeraTarmでsshログインする

WindowsにてTeraTarmを起動して、ラズパイにSSH接続する。

## 3. raspi-configでの設定

`sudo raspi-config`コマンドを実行する。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/80be2ae5-2d05-ded1-6de8-3946c85f9497.png)

"3 Interface Options"を選択し、Enterキーを押す。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/e2c4d5e8-c80c-56fd-3da0-ef6ee53af275.png)

"P1 Camera"を選択し、Enterキーを押す。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/bb149d86-7abf-15c6-e350-78367c09639c.png)

"Yes"を選択し、Enterキーを押す。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/e98771ad-fc26-d36c-8514-92a51371f3f3.png)

"OK"を選択し、Enterキーを押す。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/6834a5a9-1c0c-7dd3-ef3c-6d535093f1ed.png)

"Finish"を選択し、Enterキーを押す。

![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/dda14c58-5f14-770a-8db4-76ca34053ab0.png)

"Yes"を選択し、Enterキーを押す。

## 4. 設定の反映確認

`vcgencmd get_camera`コマンドにて以下のように値が変化し、カメラが利用できる状態になったことを確認する。

	pi@raspberrypi:~ $ vcgencmd get_camera
	supported=1 detected=1
	pi@raspberrypi:~ $

## 5. カメラでの撮影テスト

`sudo raspistill -o image.jpg`コマンドを実行する。

	pi@raspberrypi:~ $ sudo raspistill -o image.jpg
	pi@raspberrypi:~ $

## 6. 写真ファイルをダウンロードして確認

メニューから`ファイル > SSH SCP...`をクリックする。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/82b049a9-2eac-1e44-582e-d7916359815f.png)

画面下半分のメニューのFromに取得したいファイルのパスを入力し、Toにはダウンロード先のWindows PCのディレクトリを指定する。※今回ダウンロードしたい写真ファイルは、/home/pi/image.jpgにあるため、Fromにはこちらを指定する。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/32b84e4e-63d2-e587-ab23-f4b157344e0a.png)

PCにダウンロードしたファイルを開く。
こんな感じに撮影できた。

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/4ffd6ed9-d914-479f-b166-14eebbe05c72.jpeg)

手順は以上。

# 参考文献
本記事の作成に当たり、以下の情報を参考にさせて頂きました。
- [Raspberry Piカメラのセットアップ方法](https://www.rs-online.com/designspark/raspberry-pi-camera-jp)
Windows11のWSL上でGPUを使おう！(2021/10時点)

# 1.本記事の目的

Windows11ではWSL上でGPUが使用できるようになりました。(WSLg：Windows Subsystem for Linux GUI、と呼ばれています）WSL側でGPUが使用できるようになったことで、GUIプログラムや機械学習のプログラムをWSL上で動作させることができるようになります。

さっそく、Window11上で環境を構築していきましょう！

# 2.使用する環境の前提
* Windows 11がインストールしてあること
* NVIDIAのグラフィックボードが搭載されていること

もし、Windows11への更新がまだの場合は手動のインストール(参考：)ができますので、そちらをためしてみましょう。__残念ながらWindows10秋の更新(21H2)には、グラフィック機能はサポートされない様子ですので、Windows11にアップデートを行ってください。__

>グラフィックスの機能は当初、WSL2で搭載されるという話でした。Windows10でWSL2はサポートされましたが、グラフィックスの機能は搭載されず、結局、Windows11からのサポートとなったようです。Windows11に移行できないHWも多そうですので、ぜひ、Windows10のWSL2にもサポートしてほしいところです。


# 3.Windows側でグラフィックドライバーの更新
WSLgを使用するには、__Windows側のグラフィックドライバー__を更新する必要があります。以下から最新版のグラフィックドライバーをダウンロードします。

https://developer.nvidia.com/cuda/wsl/download

# 3.WSL上にLinuxをインストール

Power Shellを管理者権限で起動します。

![スクリーンショット 2021-10-13 092113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35954/fa75691b-fa6d-43a5-7f2d-5121fed048f3.jpeg)


Ubuntu-20.04 をインストールします。

```
> wsl --install -d Ubuntu-20.04

```

# 4.LinuxにWSL用のCUDAをインストール

Linuxを起動し、WSL用のCUDAを入れていきます。ポイントはここです。]

* __①Linux側でのドライバーは不要__
* __②WSL用のCUDAを入れる__

以下、WSL上でのLinuxでのCUDA 11.4.0の場合のコマンドを示しています。機械学習ユーザー（TensorFlow/PyTorch）の方は必要なバージョンに適宜読み替えてCUDAをインストールお願いします。

```
$ wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
$ sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget https://developer.download.nvidia.com/compute/cuda/11.4.0/local_installers/cuda-repo-wsl-ubuntu-11-4-local_11.4.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-wsl-ubuntu-11-4-local_11.4.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-4-local/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda
```

通常、CUDAをインストールするとグラフィックドライバ等までインストールされてしまいますが、その依存関係を修正したうえで最後にインストールかけているということでしょうか。

# 5. GPUが使える仮想環境(Docker)をインストール

WSL上のLinuxにDockerもインストールできます。この場合、Dockerの中でもGPUを使うことができます。Windows->WSLのLinux->Docker内のLinuxという３階建て構成です。

この場合、__DockerもGPU対応にする必要があります。__

まずは素のDocker-CEをインストールします。

```
$ curl https://get.docker.com | sh       
```

つづいて、NVIDIA Container Toolkit（旧名：nvidia-docker2）をインストールします。

```
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2      
```

また、ユーザーをdockerグループに追加します。(これをしないとdockerコマンドがユーザーから起動できません）

```
$ sudo usermod -aG docker $USER
```

最後にWSL上のdockerサービスを再起動します。

```
$ sudo service docker stop
$ sudo service docker start
```

以上で環境は構築されたと思います。

# 6. nvidia-smiコマンドのパス

なお、nvidia-smiコマンドは、ちょっと変なところにインストールされていてびっくりしました。
パスが通っていないので、最後にパスを通してください。

```
$ sudo cp /usr/lib/wsl/lib/nvidia-smi /usr/bin
$ sudo chmod +x /usr/bin/nvidia-smi
```

# 7. 参考
本稿では以下を参考にしています。
https://docs.nvidia.com/cuda/wsl-user-guide/index.html
相互作用特徴量

# この記事の狙い・目的
機械学習を取り入れたAIシステムの構築は、
①データセット作成（前処理）→ ②モデルの構築 → ③モデルの適用
というプロセスで行っていきます。
その際「データセット作成（前処理）」の段階では、正しくモデル構築できるよう、事前にデータを整備しておくことが求めらます。
このブログでは、その際用いられることのある「**相互作用特徴量**」の生成方法について解説していきます。

# プログラムの実行環境
Python3
MacBook pro（端末）
PyCharm（IDE）
Jupyter Notebook（Chrome）
Google スライド（Chrome）

# 相互作用特徴量
相互作用特徴量の生成方法について、解説したいと思います。
相互作用特徴量とは、二つ以上の変数をかけ合わせた新しい変数を作る方法のことです。
特に、二つの特徴量の積で表された特徴量を「**ペアワイズ交互作用特徴量**」と言います。

**メリット**
二つ以上の特徴量の組み合わせにより、目的変数をうまく表現できる場合、単一の特徴量よりモデルの精度が高まる場合があります。

**デメリット**
元の項目数が「$n$個」の場合、特徴量の生成後はの項目数は「$n^2$乗個」となる為、学習コスト増大します。
これを回避する方法として、特徴選択があります
##
https://qiita.com/tk-tatsuro/items/759acd001d4fbb8ef6c5
##
以下の結果では、精度の向上が見られはしますが、非常に微々たる変化です。特徴量を精査すれば更に改善が可能でしょう。

```Python
from sklearn.ensemble import RandomForestClassifier # ランダムフォレスト
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score # 各評価指標
from sklearn.metrics import confusion_matrix # 混同行列
import sklearn.preprocessing as preproc
from sklearn.model_selection import train_test_split

def learning(X_train, X_test, y_train, y_test):
    model = RandomForestClassifier(random_state=42) 
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    
    # 評価
    print('Accuracy = ', accuracy_score(y_true=y_test, y_pred=y_pred).round(decimals=3))
    print('Precision = ', precision_score(y_true=y_test, y_pred=y_pred).round(decimals=3))
    print('Recall = ', recall_score(y_true=y_test, y_pred=y_pred).round(decimals=3))
    print('F1 score = ', f1_score(y_true=y_test, y_pred=y_pred).round(decimals=3))
    print('='*20)

    # 混同行列
    y_pred = model.predict(X_test)
    matrix = plot_confusion_matrix(y_pred, y_test)
    return matrix

def plot_confusion_matrix(predict, y_test):
    pred =  np.where(predict > 0.5, 1, 0)
    cm = confusion_matrix(y_test, pred)
    matrix = pd.DataFrame(cm)
    matrix.columns = [['予測_負例(0)', '予測_正例(1)']]
    matrix.index = [['実際_負例(0)', '実際_正例(1)']]
    return matrix

# 特徴選択
Interaction = df.copy()
features = ['残高', 'クレジットカードスコア']
X1 = Interaction[features]
y = Interaction['退会区分']

# ペアワイズ交互作用特徴量
X2 = preproc.PolynomialFeatures(include_bias=False).fit_transform(X1)
print(f'生成前の列数: {X1.shape[1]}')
print(f'生成後の列数: {X2.shape[1]}')
print('='*20)

# 目的変数の抽出、データ分割
X1_train, X1_test, X2_train, X2_test, y_train, y_test = train_test_split(X1, X2, y, test_size=0.3, random_state=42)

# 学習、評価
matrix1 = learning(X1_train, X1_test, y_train, y_test)
matrix2 = learning(X2_train, X2_test, y_train, y_test)
matrix1
matrix2
```
![スクリーンショット 2021-10-08 17.08.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569276/e5875f01-0798-1046-81cf-7d60d1f903ff.png)

# まとめ
今回は相互作用特徴量の生成方法について、簡単に触れてきました。他にも多くの手法がるため、別途紹介とさせていただきます。また相互作用特徴量の精度評価も別記事で取り上げさせていただきます。

# 最後に
他の記事はこちらでまとめています。是非ご参照ください。
##
https://qiita.com/tk-tatsuro/items/f27c012e0cb95a5f51d2
##

# 解析結果
[実装結果：GitHub/churn_modeling.ipynb](https://github.com/tk-tatsuro/data_science/blob/master/20201007_churn_modelling_classification_dataset/churn_modeling.ipynb)
[データセット：Churn Modelling classification data set - kaggle](https://www.kaggle.com/shrutimechlearn/churn-modelling)

# 参考資料
##
https://www.oreilly.co.jp/books/9784873118680/
##
[SQL学習②] ４大命令でテーブル操作の練習（SELECT UPDATE DELETE INSERT)

<h2>初めに</h2>
SQL学習２日目です。
今回は①の記事で４大命令を学習したので、
それを使って問題形式でテーブルをいじっていきます。

<h2>SQLの４大命令</h2>
①の記事で記載した
SELECT UPDATE DELETE INSERT

```
SELECT　列名 FROM テーブル名
UPDATE　テーブル名　SET 列名＝値
DELETE　FROM テーブル名
INSERT　INTO テーブル名（列名） VALUES(値）
```

<h2>SELECT文</h2>

以下のようなテーブルがあるとします、
ここから商品IDと品名の列を取得したい場合どのように記述するでしょうか。

![スクリーンショット 2021-10-13 9.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a25932f2-6d8f-3816-8fda-18958be39f50.png)

<details><summary>答え</summary><div>

```
SELECT 商品ID,商品名
FROM 商品表
```
</div></details>

<h2>UPDATE文</h2>

商品名　「フルーティー」の販売価格を350円に値上げしたいです。

![スクリーンショット 2021-10-13 9.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a25932f2-6d8f-3816-8fda-18958be39f50.png)

ヒント：WHEREを使わないと、UPDATEは全件更新してしまう。
<details><summary>答え</summary><div>

```
UPDATE 商品表
SET 販売価格=350
WHERE 商品名　='フルーティー'
```
</div></details>

<h2>DELETE文</h2>
行を丸ごと削除する機能であり、特定の列を指定することはできません。
行は横で、列は縦です。
先ほどのテーブルを削除します。

<details><summary>答え</summary><div>

```
DELETE FROM 商品表
```
</div></details>

WHERE無しで実行すると全て削除されてしまいます。

<h2>INSERT文</h2>

```SELECT UPDATE DELETEにはWHEREを使うことができますが、
INSERT分には使用できません。```

それでは以下のテーブルに、
商品ID「５」　商品名「アイス」　販売価格「１００」　ジャンル「空欄」を追加してみましょう。

![スクリーンショット 2021-10-13 9.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a25932f2-6d8f-3816-8fda-18958be39f50.png)

↓

![スクリーンショット 2021-10-13 9.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/f3c0fd5c-398b-1151-ab6c-15722e012739.png)

ヒント：全ての列に　INSERT文を追加する訳ではない。
<details><summary>答え</summary><div>

```
INSERT INTO 商品表
　　　　　　　　　　　　　　　　　　　　　　　　（商品ID,商品名,　販売価格　)
VALUES.    (5,'アイス',100)
```

</div></details>

<h2>INSERT文②</h2>

![スクリーンショット 2021-10-13 9.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/5b2ea071-630d-81f0-de5d-8a838c6d2890.png)


次に、商品ID ６、商品名　タルト、販売価格500,ジャンルケーキを追加します。

ヒント：全ての列に　INSERT文を追加する。

<details><summary>答え</summary><div>

```
INSERT INTO 商品表
VALUES　(6,'タルト',500,'ケーキ')
```

</div></details>


<h2>おわり</h2>
Webpack 5 で HtmlWebpackPlugin を使っている時に、 HTMLファイル変更時にホットリロードする方法

調べても出てこず、1時間くらい悩んだので、他にも困っている人がいるかもと思い投稿します。

## 対象読者

- Webpack 5 を使っている
- HtmlWebpackPlugin を使って、HTMLファイルを生成している
- webpack-dev-server でホットリロードさせながら開発している
- JavaScriptやCSSのホットリロードは効くのに、HTMLは効かないな..ってなっている人


## 解決方法

[html-webpack-harddisk-plugin](https://github.com/jantimon/html-webpack-harddisk-plugin) を入れて、 pluginの設定をする。以上です。。

設定方法は上記GitHubに書いてある通りですが、以下となります。

```javascript:webpack.config.js
// ファイル先頭近く
const HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin'); // 追加

// webpackのconfig
plugins: [
  // ...
  new HtmlWebpackPlugin({
    // ...
    alwaysWriteToDisk: true // 追加
    // ...
  }),
  new HtmlWebpackHarddiskPlugin() // 追加
  // ...
]  

```


## 余談

[HtmlWebpackPluginのGithub](https://github.com/jantimon/html-webpack-plugin) を見ていたら

> html-webpack-harddisk-plugin can be used to always write to disk the html file, useful when webpack-dev-server / HMR are being used

↓注目
> useful when webpack-dev-server / HMR are being used

と書いてあって、気づきました。公式大事...。
今日から使えるMarkdown

<!-- @import "[TOC]" {cmd="toc" depthFrom=1 depthTo=6 orderedList=True} -->

<!-- code_chunk_output -->

1. [Markdownの準備](#markdownの準備)
    1. [必要なもの](#必要なもの)
    2. [Markdownファイルの作成](#markdownファイルの作成)
    3. [VScodeの拡張機能のDL](#vscodeの拡張機能のdl)
2. [Markdownの書き方](#markdownの書き方)
3. [章番号の設定](#章番号の設定)
4. [画像の挿入](#画像の挿入)
5. [HTMLへの変換](# HTMLへの変換)

<!-- /code_chunk_output -->

# Markdownの準備
**Markdown**は、もともとプレーンテキストからHTMLを作成するために開発された軽量マークアップ言語で(Wikipedia談)、\TeX ライクなコードによって簡単に数式を入力することができる強みを持っています。この記事は入門として、体裁の整ったMarkdownファイルを誰でも作れるようになることを目指します。

## 必要なもの
Markdownはプレーンテキストで作成するので、メモ帳のようなエディタが必要です。メモ帳でも差し支えはありませんが、より高機能な**VS Code**を利用します。

## Markdownファイルの作成
Markdownは、特段インストールは不要です。次のようなファイルを新規作成してください。

> hoge.md

hogeの部分はお好みの名前でOKです。拡張子のみ**md**にしてください。

## VScodeの拡張機能のDL
MarkdownをVScodeで運用するには**Markdown Preview Enhanced**の拡張機能がオススメです。プレビューが見やすく、HTMLへの出力も便利になります。VScodeの一番左側のテトリス的なところから拡張機能をインストールしてください。

![085515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635832/ed0a8a33-77db-4887-f26e-28d39d99ec3d.png)


インストールし終わったら一旦VScodeを閉じてもう一度立ち上げましょう。これで準備完了です。

# Markdownの書き方
1.2で作成した「hoge.md」のファイルを開きます。まずはサンプルとして以下をコピペしてみてください。

```:markdown
<div style="text-align: center;">
<span style="font-size: 300%; color: black; font-weight:bold;">
サンプルノート
</span>
</div>

# Section1
ハローワールド！これは三平方の定理$a^2 + b^2 = c^2$で発見車の名前をとって、ピタゴラスの定理とも呼ばれます。この指数部分を一般化したもの

$$\tag{1}
a^n + b^n = c^n  ~~~~~n \in \mathbb{N}
$$

は上式ですが、$n\geq 3$ではこれを満たす自然数$(x,y,z)$は存在しないことが知られています。(**フェルマーの最終定理**)

<!-- 
ここはコメントアウトされます。
-->

また複数行の数式は**align環境**に入れます。LateXと異なり、align環境でも必ず数式モードにする必要があります。

$$
\begin{align*}
\frac{dL}{dT} &= C_{p1} - C_{p2} +\frac{L}{T} - L\frac{V_1\beta_1-V_2\beta_2}{V_1-V_2}\\
& \sim C_{p1} - C_{p2} + \frac{L}{T} - L\beta_2 \\
& = C_{p1} - C_{p2}
\end{align*}
$$

# Section2
## 2-1
### 2-1-1
```

まあ大体見てもらえればわかると思います。いじって試してみてください。うまく表示てきていない場合はプレビューの画面上にエラーメッセージとエラー箇所が表示されます。

コンパイルエラーが起こらない点が、Markdownの最も良いところです。



# 章番号の設定
章番号を自動でふることができます。次の記事を参考にしてみてください。

https://qiita.com/UKawamura/items/42f907c88686fb3be4da

先程のhoge.mdでも以下のように章番号がつくはずです。

<div align="center">
<img width="80%" alt="091046.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635832/4caf5f77-5fef-72b8-de5e-fc0abceeb900.png">
</div>

# 画像の挿入
画像の挿入はHTMLと同じように行います。

```:markdown
<div align="center">
<img src="./hogehoge.png" width=80%>

図１．hogehogeの画像
</div>
```

src="./hogehoge.png"の部分で画像ファイルの場所を指定します。画像が同じディレクトリにある場合は上と同じように指定すれば良いです。

# HTMLへの変換
HTMLに変換するにはプレビュー上で右クリック->Open in Browserでいけます。

![092541.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635832/fb9596a8-82f5-16c3-0169-abb044ad3c75.png)

ブラウザで開いたのち、印刷するなりPDFに保存すればまるでLateXのように使えちゃいます。
ご苦労さまでした。
【深層学習】活性化関数ReLUについて

深層学習モデルを構築する時、うまく活性化関数を選ぶことは大事です。
その中で、よく使われている活性化関数<strong>ReLU</strong>について紹介したいと思います。

## ReLUとは?
ReLUは<strong>Re</strong>ctified <strong>L</strong>inear <strong>U</strong>nitの頭文字から取ってきたものです。
数式を書くと


```math
f(x) = max(x, 0)
```

数式により、$x$が負数の場合であれば、
$f(x)$は$0$のままということがわかります。

Pythonで書いてみると

```python
def relu(x) :
    return max(x, 0)
```

## ReLUの微分

- $x$が正数の場合であれば:

```math
\frac{\mathrm{d} f(x)}{\mathrm{d} x}=\frac{\mathrm{d} x}{\mathrm{d} x}=1
```

- $x$が$0$以下の場合であれば:

```math
\frac{\mathrm{d} f(x)}{\mathrm{d} x}=\frac{\mathrm{d} 0}{\mathrm{d} x}=0
```

Pythonのif文で書いてみると

```python
def relu_derivative(x):
    if x > 0:
        return 1
    if x <= 0:
        return 0
```

## ReLUのグラフを作成

```python
import numpy as np
import matplotlib.pyplot as plt

# inputデータ作成
X = np.linspace(-10, 10, 100)

plt.figure(figsize=(8,6))
plt.plot(x, list(map(lambda x: relu(x), X)), label="ReLU")
plt.plot(x, list(map(lambda x: der_relu(x), X)), label="Derivative of ReLU")
plt.title("ReLU")
plt.legend()
plt.show()
```
![截圖 2021-10-13 01.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067829/da588cdd-5fba-fc5d-b320-923ee9c0e8cf.png)
オレンジの線を見ると、
$x>0$の時、微分の数値は$1$で、
$x\le 0$の時、微分の数値は$0$です!

以上、簡単にメモしました。
プロキシ経由でTableau DesktopからAWS Athenaに接続する方法

#環境
　Tableau Desktop 2020.4.7
　Windows 10 Enterprise（バージョン1909）

#手順
###JDBCのインストール
[AmazonのWEBサイト](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html)からJDBC（AthenaJDBC42.jar）をダウンロードして
C:\Program Files\Tableau\Drivers に保存
   
https://www.tableau.com/ja-jp/support/drivers?_ga=2.94889822.376843540.1618467021-200669354.1617154422&_fsi=rWQD3tvL

###プロキシ設定
以下の内容をathena.propertiesという名前で
C:\Users\（ユーザ名）\Documents\マイ Tableau リポジトリ\データ ソース　に保存

```athena.properties
ProxyHost=（プロキシURL）
ProxyPort=443
UseResultSetStreaming = 0
```

proxyportはネットワーク環境設定によります（444やその他のポート番号の場合があります）
UseResultSetStreaming = 0　は無いほうがつながる場合もあるようです。


https://kb.tableau.com/articles/issue/unable-to-connect-to-athena-via-proxy-server?lang=ja-jp

###tableauから接続
　tableau起動⇒接続の「サーバーへ」 ⇒その他⇒Amazon Athena⇒以下の設定

サーバー
　athena.（リージョン）.amazonaws.com
　例）athena.us-east-1.amazonaws.com
ポート
　443
S3ステージングディレクトリ
　Athena → 設定の「クエリの結果の場所」を入力
　例）s3://e-stat/Athena/
AccessKey / SecretKey
　アクセスキーとシークレットキーをそれぞれ入力

![staging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/298f2735-8410-80d6-8e3c-d69ed119b374.png)


以下のように表示されれば接続成功です。
![connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114658/073e9326-f7a9-92d8-cf30-7dc9a167b84a.png)


https://help.tableau.com/current/pro/desktop/en-us/examples_amazonathena.htm
一年ぶりに０から作り直す個人開発（リファクタリング）

これは１年間だけプログラミングを勉強した、文系大学卒、日本の非エンジニア職に務める人間が、作ったアプリを一年ぶりにリファクタリングしよう！という試みの記録です。

今回は、公開した以上やるしかないよね、と自分を追い詰めるためのお気持ち表明です。

## 経歴と経緯

文学部卒、31歳の人間です。
元々は商品開発を５年くらいやっており、カナダ留学してプログラミングを勉強。
その後日本に戻ってきてからはSQLと統計を学びつつ、データの分析を延々とやってます。

2020年1月から12月まで、カナダのカレッジでプログラミングを勉強しました。
カレッジではモバイル（Swift,Kotlin,ちらっとObject-C＋アルゴリズム）を専攻し、
個人学習として、MENTAを利用してReactを勉強しておりました。

昨年12月に、学校の卒業制作として作成したWebアプリ（Reactとfirebaseで作りました・・・）があるのですが、
日本の職場に戻ってからは、延々と概念の勉強と、実務ではSQLを書いておりほぼプログラミングノータッチ。

気づけば最後にがっつり卒業制作をしてから一年が経過しそうになっているため、いろいろ頑張りきれなかった自分のアプリを改修しよう！
リファクタリングして再度公開したいと考えてこの記事を書いてます。
ただ、自分のコードが汚すぎて絶望したので、０ベースでコードを書いて作り直すのを目標とします。

## 今のアプリに拘っている理由

1. 最低限の機能実装のみで終わってしまい、自分が入れたかった機能を全部作り込めなかったこと
1. 現時点の機能にも粗があること
1. アプリ（機能）としては、有用性があり広く使ってもらえる可能性を秘めている（と信じている）こと

が主な理由です。

当時はデータの持ち方や、非同期処理などあまり深く考えずに実装してしまったため、
理解を深めつつ、きちんとアプリを完成させたいなと思ってます。

## 今のプログラミングレベル

最低限の書き方覚えてるね、程度です。
今の職はBigQueryでSQLを駆使する完全にデータ分析職人になっているため、
JavaScriptでUDF書いたり、VBAでマクロ組んだりする程度。

副業で一回だけ、本当に簡単なReactアプリは作りました（日付情報加工してTwitterに投稿&画像ランダム表示させるだけ、レベルです）

完全にITから離れたわけではないですが、がっつりコードを書いてはいません。

## 前回制作時点で使ったもの

* React
* Redux
* firebase
* material-ui
* styled-components
* eslint
* prettier
* i18next

技術的な進化はまったく遂げていないので、基本は上記をベースにしつつ、
構造面やコードの最適化を図りたいと考えています。
（できればTypeScriptを導入したい気持ちでいっぱいです。）

## スケジュール

今年中に完成・公開させる。以上。

今後は１週間ごとに進捗をメモしていきたいと思います。
【JavaScript】変数と参照の振り返り⑥　参照とコピーについて


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/485a45b65f7b4bc3b358

#目的

* 変数についての理解を深める


#本題
###1.プリミティブ型とオブジェクト

####用語の説明

データ型：文字列、数値などの異なる値の型　→　８種類

このデータ型は２種類に分けることができる。

プリミティブ型

* 変数には**値**が格納される。
* 一度作成するとその値を変更することはできない。

オブジェクト

* プリミティブ型以外の型を指す。
* 変数には**参照**が保持される。
* 値を変更することができる。
* 名前（プロパティ）付きの**参照**を管理する入れ物

###2.参照とコピー

プリミティブ型とオブジェクトで値をコピーした場合には挙動が変わる。

####例

#####プリミティブ値のコピー
参照先の**値**がコピーされる。

````javascript
// プリミティブ型
// 変数aはhelloという値への参照を保持している
let a = "Hello";
// 変数bをaに代入
// ここで変数bにもhelloという値への参照をコピーした
let b = a;
// 変数aの参照先である値自体が変更されるわけではない
// bに"bye"が格納されるだけでaに代入されたわけではない
b = "bye";
console.log(a,b);

// それぞれの値が独立しているのでbを変更したからaも変わるというわけではない。
````


#####オブジェクトのコピー
オブジェクトへの**参照**がコピーされる。

```javascript

let c = {
  prop: "hello"
}

let d = c;
// 値を"bye"に変更すると
d.prop = "bye";
// どちらも"bye"に変更されてしまう
console.log(c,d);
// これはcもdも同じオブジェクトへの参照を保持しているため
```

propを変更するのではなく、dに新しい値を入れるとどうなるか。


```javascript
let c = {
  prop: "hello"
}

let d = c;
//  変数dにオブジェクトを定義
d = {};
// このようにすると互いの変数に影響がない
// それぞれの{...}への参照をコピーしているため
console.log(c,d);
```

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
GAE+Go(2nd-Gen)API実装のサンプル

こんにちは。みなさんは[Google App Engine](https://cloud.google.com/appengine)(GAE)使っていますか？
フルマネージドでオートスケールでお気に入りのプロダクトなのですが、やや情報が少ないような・・・

実戦投入しようと思うと、環境変数の設定や、サービス間認証、はたまたcloud_build.yamlどう書くんだ、など結構詰まるポイントが多いかと思います。

そこで、基本的な部分を実装したGAE+goのAPI実装のサンプルを公開します！ これからGAE+Goを始める方のご参考になればと。

## サンプル

[GAE-Go-sample](https://github.com/AkihikoOkubo/GAE-Go-sample)

- GAEスタンダード環境です
- GAEのruntimeはgo116です
- ユーザオブジェクトを登録/取得するだけの簡単なAPIのサンプルです
- Firebaseを使うので、Firebaseのセットアップと、GAEサービスアカウントへの「Firebase管理者」ロールの付与が必要です

## ポイントの紹介
工夫しているポイントをいくつかご紹介します。

### 環境変数が使えるようにしてあります
調べても意外とサンプルが出てこないように思います。[envconfig](https://github.com/kelseyhightower/envconfig)を使い、ビルド時にapp_{ENV}.yamlから埋め込みます。

### クリーンアーキテクチャを意識したレイヤリング
　全体の構成は↓こんな感じです。

```
- /src
    - /handler
        - /input
            - request bodyをマッピングする構造体
        - /output
            - response bodyをマッピングする構造体
        - router.go
            - APIのルーティング
    - /domain
        - /model
            - ドメインモデル
        - /repository
            - infra層(DBやFirestoreなど)のinterface
    - /usecase
            - ビジネスロジックの実装
    - /infra
            - repositoryの実装
    - /registry
            - repositoryの実装を返す
    - /lib
            - logging、HTTPリクエストなど共通基盤
    - /main
        - app_{ENV}.yaml(ビルド時にenvconfigで出し分けます)
        - main.go 
```

テスト時にRepository層をモックできるようにDIを実装してあります。
[こちら](https://qiita.com/yoshinori_hisakawa/items/a944115eb77ed9247794)の記事がとても参考になります。

### ロギングの強化
GAEは1st-Genのロギングが素敵すぎるのですが、これはもう諦めるしかないですね。。。
[こちら](https://medium.com/google-cloud-jp/gae-%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%AB%E6%86%A7%E3%82%8C%E3%81%A6-895ebe927c4)の記事を参考に、できるだけGAE-1st-Genに近い使い心地のログを出せるようにしています。

### Identity Aware Proxy(IAP)のサンプル
GAE-2nd-Genでは魔法のヘッダ`x-appengine-appid`がつかないため、サービス間認証はIAPで実現することになります。
IAP有効状態で、他サービスにHTTPリクエストを投げる場合のサンプルコードを実装してあります。

### Firebaseのサンプル
大体どこでも使うAuthenticationとFirestoreのサンプルを実装してあります。

### cloudbuild.yaml
Cloud Buildについても案外サンプルが少なく苦労したので。
Cloud Buildの代入変数で`_APP_YAML_NAME`に指定したい環境の`app_{ENV}.yaml`を指定してください。

## 終わりに
参考になれば幸いです。今後は工夫ポイントそれぞれの詳しい解説も投稿していく予定です！
Exponential Backoffアルゴリズム

DNS サーバー、スイッチ、ロードバランサーなど、ネットワークの多数のコンポーネントが、特定のリクエストの存続期間中どこでもエラーを生成する可能性があります。
ネットワーク環境でこれらのエラー応答を処理する通常の方法は、クライアントアプリケーションで再試行するロジックを実装する。

連続したコリジョン(衝突)を避けるため、乱数によってタイミングをずらす実装がされていますが、ここではコリジョンを避ける必要があるわけではないので、乱数の実装は不要です。

可用性を高め、運用コストを削減するアプローチとしてAWS SDKには、自動再試行ロジックが実装されている。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html
【Nuxt】ライフサイクルのメモ


### nuxtServerInit

Vuexに事前入力するために呼び出される
store/index.jsに書く

※サーバーサイド側でのみ実行

###  RouteMiddleware

ページのレンダリングよりも前に行いたい処理を書く
Vuexの中のデータを使用してページの出し分け等の処理が書ける

※クライアント・サーバーどちらでも実行

###  validate

ページ自体をバリデーションできる。
エラーの場合、エラーページに遷移させたりできる。

実行タイミング
サーバーサイド：SSRで初回に一回呼び出される
クライアントサイド：初回リクエスト以降呼び出される

### asyncData()

ページを表示する前にデータを取得しておきたい時に使用する。
値を取得し、コンポーネントのデータにセットできる。

実行タイミング
サーバーサイド：SSRで初回に一回呼び出される
クライアントサイド：初回リクエスト以降呼び出される

### beforeCreate

インスタンス生成前

### created()

インスタンス生成の後、リアクティブデータが初期化された後に呼び出される。
インスタンスを指すthisを使用できるようになる。
また、createdの後からローカルデータにアクセスできるようになる。

### fetch()

ページを表示する前にデータを取得しておきたい時に使用する。
asyncData()と似ているが、fetchは取得した値をstoreに入れたい場合に使用する。

実行タイミング
サーバーサイド：SSRで初回に一回呼び出される
クライアントサイド：初回リクエスト以降呼び出される

### beforeMount

DOMが生成される前
※クライアントサイド側でのみ実行

### mounted()

DOMが生成された後に呼び出される。ここで初めてDOM操作の記述書くことができる。
ただし、子コンポーネントの終了は保証されていないので注意が必要。

実行タイミング
クライアントサイド：ビューがレンダリングされた前に呼び出される
※クライアントサイド側でのみ実行


### 参考
https://nuxtjs.org/docs/concepts/nuxt-lifecycle/?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui,sc
【Vue】バインディングについてのメモ


## データバインディング 

データを更新した時、その更新をDOMに反映する仕組みのことです。
また、データバインディングには種類があります。

## 単方向バインディング

### 親→子

親が更新されたら子、子が更新されたら親のように一方方向に更新されます。
propsを利用して値を渡せます。

ちなみに、親は呼び出し元のファイルで、子は呼ばれた側のファイルです。

```vue:parent.vue
<template>
   <div>
　　　　　　　　<!-- 子に送るもの「:msg」>
    <Child :message="msg"></Child>
   </div>
</template>

<script>
import child from './component/child.vue'
export default {
  data() {
    return {
      msg: 'World'
    }
  },
  components: {
    Child: child,
  },
}
</script>
```

```vue:child.vue
<template>
  <div>
    <p>Hello,{{ message }}</p>
  </div>
</template>

<script>
export default {
  //親から受け取ったものは「props」で受け取る
  props: ['message']
}
</script>
```

【出力】
Hello,Wold



### 子→親

$emitで子から親にイベントを渡すことができます。

```vue:parent.vue
<template>
  <div>
    <p>text: {{ parent_text }}</p>
    <Child @child-click='parent_text = $event'/>
  </div>
</template>

<script>
import child2 from './component/child2.vue'
export default {
  data: function() {
    return {
      parent_text: '親コンポーネントのテキスト'
    }
  },
  components: {
    Child: child2
  }
}
</script>
```

```vue:child.vue
<template>
  <div>
    <button @click='sendParent'>値を渡す</button>
  </div>
</template>

<script>
export default {
  data: function() {
    return {
      child_text: '子コンポーネントのテキスト'
    };
  },
  methods: {
    sendParent() {
      // $emit('イベント名',渡したい値)
      this.$emit("child-click", this.child_text);
    }
  }
};
</script>
```

【出力】
子コンポーネントのテキスト




### 双方向バインディング

データオブジェクトの値を動的に変化させたい場合は双方向にバインディングさせてあげます。
スクリプトとブラウザのどちらからでも自動反映されます。
双方向バインディングにはv-modelディレクティブを使用します。

```vue:
<template>
   <div>
      入力：{{ data }}
      <input v-model="data">
   </div>
</template>

<script>
export default {
  data() {
    return {
      data:'',
    }
  }
}
</script>

```


ブラウザからの入力がリアルタイムで反映されます。


## 属性のバインディング

HTMLタグの属性にも値をバインディングできます。
v-bindディレクティブを使用します。

属性の名前や真偽値で

idの名前を渡す

```vue:
<template>
  <div>
    <div v-bind:id="dynamicId">text</div>
  </div>
</template>

<script>
export default {
  data() {
    return{
      dynamicId: "textId"
    }
  }
}
</script>
```

真偽値で出し分ける

```vue:
<template>
  <div>
    <div v-bind:class="{ active: isActive }">text2</div>
  </div>
</template>

<script>
export default {
  data() {
    return{
      isActive: true
    }
  }
}
</script>
```


## HTMLのバインディング

v-htmlディレクティブでHTMLを渡す事ができます。
Mustache構文({{  }}二重括弧)でもデータを描画できますが、テキストとして扱われます。
v-htmlはhtmlとして描画できます。

```vue:
<template>
  <div>
    Using mustaches:
    <p>{{ rawHtml }}</p>
    Using v-html directive:
    <p v-html="rawHtml"></p>
  </div>
</template>

<script>
export default {
  data() {
    return{
      rawHtml:'<span>テキストです</span>'
    }
  }
}
</script>
```

以下のように表示されます。
Mustache構文を使用した方は文字列、v-htmlを使用した方はHtmlとなります。

【出力】
![スクリーンショット 2021-09-26 13.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185027/924a905f-8433-3c66-d64e-2a2355a1068b.png)