OmniAICreator/Qiita-1.07M huggingface dataset:
【BigQuery】pandasにBQデータの一部を高速で読み込み

#背景
BigQueryデータをpythonコードで使う方法はいくつかあるが、中でも最近登場した**BigQuery Storage API**は読み込み速度の点で非常に優れているらしい。
公式ページ：https://cloud.google.com/bigquery/docs/bigquery-storage-python-pandas?hl=ja

まだ新しめのAPIで、ちょっと変則的なことをしようとするとなかなかサンプルコードがなかったので残しておく。実行速度などの検証は他記事に任せることとする。

#やりたいこと
BigQueryのデータをPythonで直接読み込みPandasに格納する。今回は件数が多いデータを処理したかったので条件をつけて一部データのみ取り出す。

#前準備
まずは使用するライブラリをpipインストール。
conda createなどで**新たに別の仮想環境を用意する**のがおすすめ。（私は普通にいつも使う環境に入れてしまったが、ライブラリ同士のバージョン依存関係が壊れてしまったのかエラーを取るのが個人的にめっちゃ面倒だった）

```pip install --upgrade google-cloud-bigquery[bqstorage,pandas]
```

#実装
まずは認証情報を設定してクライアントを作成。

```python:
import google.auth
from google.cloud import bigquery
from google.cloud import bigquery_storage_v1beta1

credentials, your_project_id = google.auth.default(
    scopes=["https://www.googleapis.com/auth/cloud-platform"]
)

bqclient = bigquery.Client(
    credentials=credentials,
    project=your_project_id,
)
bqstorageclient = bigquery_storage_v1beta1.BigQueryStorageClient(
    credentials=credentials
)
```

いよいよデータを読み込む。プロジェクトIDなどは適宜書き換えてください。

```python:
        print('Loading data...')
        table = bigquery_storage_v1beta1.types.TableReference()
        table.project_id = "PROJECT_ID"//読み込みたいBQのあるプロジェクトID
        table.dataset_id = "DATASET_ID"//読み込みたいデータセットID
        table.table_id = "TASBLE_ID"//読み込みたいテーブルID
        
        read_options = bigquery_storage_v1beta1.types.TableReadOptions()
        #読み込みたいカラム名
        cols = ['col1', 'col2', 'col3']
        for col in cols:
            read_options.selected_fields.append(col)
        #例えば「userid = "hogehoge"」という条件でとってくるデータを絞り込みたい場合
        read_options.row_restriction = 'userid = "hogehoge"'
        parent = "projects/{}".format(your_project_id)
        session = bqstorageclient.create_read_session(
            table,
            parent,
            read_options=read_options,
            format_=bigquery_storage_v1beta1.enums.DataFormat.ARROW,
            sharding_strategy=(
                bigquery_storage_v1beta1.enums.ShardingStrategy.LIQUID
            ),
        )
        stream = session.streams[0]
        position = bigquery_storage_v1beta1.types.StreamPosition(stream=stream)
        reader = bqstorageclient.read_rows(position)
        
        dataframe = reader.to_dataframe(session)

        #datafremeの中に読み込んだデータが入っているので、あとはよしなに。
```
Alfredで範囲選択した文字列をホットキーで取得する際にクリップボード履歴を汚さない方法

## TL; DR
Alfredで翻訳ワークフローを使うときにクリップボード履歴に保存しない方法を探して、解決策を見つけたので知見としてまとめます。

実例として下記翻訳ワークフローを使用しています(作者様に感謝)。
[Alfredの翻訳ワークフローv2リリース（DeepL翻訳や言語選択などに対応）][god]


## 環境
- macOS Catalina 10.15.5
- Alfred 4.1


## 前提知識
Alfredは範囲選択した文字列をホットキーで取得する際にクリップボードに一時的に保存します。
<img width="665" alt="selection_hotkeys.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/b6c2a12a-f9df-6164-5921-fc4963e8de3a.png">

そのため、Workflow内で**Hotkey**アクションの引数に`Selection in macOS`を指定すると、**Copy to Clipboard**アクションを使用しなくてもクリップボードに保存されるので、必ずクリップボード履歴に残ってしまいます。
<img width="524" alt="hotkey_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/cb6047b8-a72b-d92a-9ab6-d0895c8e4549.png">

これは**Selection Hotkeys**を`Restore previous clipboard item`に設定しても回避できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/7f190338-6348-788e-7e95-45b72393607c.png)


## 解決策
現状のAlfredの機能ではクリップボード履歴に保存しない方法がないので、クリップボード履歴に保存された直後に直接削除します。

[Alfredのフォーラム][query]にも投稿されていたのですが、Alfredのクリップボード履歴はSQLite3に保存されているので、直接シェルスクリプト内で削除クエリを発行すればWorkflow内で削除できます。


## 実例
下記のようなシェルスクリプトを**Run Script**に書いて、**Hotkey**アクションに接続します。

```shell
sql="DELETE FROM clipboard WHERE dataType = 0 ORDER BY ts DESC LIMIT 1;"
/usr/bin/sqlite3 ~/Library/Application\ Support/Alfred/Databases/clipboard.alfdb $sql

echo -n $1
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/071f9daf-fd33-60e8-3ced-abd26b932096.png" width="60%">  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120125/a4f2da1c-50a6-9f0c-cfdd-d57d3f5522ab.png" width=39% =>


スクリプト自体はとても単純で、SQLite3のclipboardテーブル内の最新の1件を削除します。
他に処理する必要もないので、あとは`echo`で**Hotkey**アクションから受け取った引数を出力してそのまま後続のアクションに渡すだけです。


## まとめ
直接DBを操作しているのでアップデートで使えなくなる可能性もありますが、翻訳ワークフローに限らず、範囲選択した文字列を色々加工したいときに加工前の文字列がクリップボード履歴に不要な場合は、今回の方法で回避できるので是非活用してみてください。
(そもそもクリップボード履歴に保存されてしまう現象自体、[フォーラムのコメント][bug]でもバグレポートとして提出する旨が書かれているので、そのうち修正されるとは思いますが……。)


[god]:https://qiita.com/nkmr_jp/items/a577e1c4265c2c6a6531
[query]:https://www.alfredforum.com/topic/10118-how-to-delete-last-clipboard-entry/?do=findComment&comment=50925
[bug]:https://www.alfredforum.com/topic/10118-how-to-delete-last-clipboard-entry/?do=findComment&comment=69984
Rust言語の勉強を初めてみた。その2

# サンプルコード Variables and Mutabilityを実行してみる

[Variables and Mutability](https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html#variables-and-mutability)

## Variables and Mutability

```src/main.rs
fn main() {
    let x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}
```

x = 6の時に、xはmut指定していないため、ビルドエラーとなる。

![](https://taki-lab.site/bocci/wp-content/uploads/2020/07/561ada6287b36bf24b9b0cbe7fb03b4f.jpg)

VSCodeでもエラーが表示される。

```src/main.rs
fn main() {
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}
```

これで問題無く動作する。

## Differences Between Variables and Constants

定数の定義

```
const MAX_POINTS: u32 = 100_000;
```

mutはできない。常に不変。
Rustのコーディング規約では、アンダーバー入りの大文字で書く。

## Shadowing

```src/main.rs
fn main() {
    let x = 5;

    let x = x + 1;

    let x = x * 2;

    println!("The value of x is: {}", x);
}
```

mutが無くてもlet指定すれば変数の値を上書きできる。
（上書きというよりかは変数の再定義）

```
    let spaces = "   ";
    let spaces = spaces.len();
```

こういう使い方は可能だが、

```
    let mut spaces = "   ";
    spaces = spaces.len();
```

こういう使い方はできない。
変数spacesは&str型で定義されているので、
let spaces = spaces.len()のように再定義することで設定可能だが、
spaces = spaces.len()のようにすると変数の型が異なるためエラーとなる。

![](https://taki-lab.site/bocci/wp-content/uploads/2020/07/600fa70575952046380511e9f808544b.jpg)
【React Native】fontFamily "FontAwesome" is not a system font and has not been loaded through Font.loadAsyncエラーの解決

# 実装背景
FontAwesomeでアイコンを実装していて、Navigationを導入しようとして、
react-navigationをnpm installした時に上記のエラーに遭遇した。

# エラー内容

```
fontFamily "FontAwesome" is not a system font and has not been loaded through Font.loadAsync.

- If you intended to use a system font, make sure you typed the name correctly and that it is supported by your device operating system.

- If this is a custom font, be sure to load it with Font.loadAsync.

```
# ライブラリ依存関係
```package.json
"dependencies": {
    "@expo/vector-icons": "^10.2.0",
    "@react-native-community/masked-view": "^0.1.10",
    "@react-navigation/native": "^5.7.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^7.4.0",
    "eslint-config-airbnb": "^18.2.0",
    "eslint-plugin-import": "^2.22.0",
    "eslint-plugin-jsx-a11y": "^6.3.1",
    "eslint-plugin-react": "^7.20.3",
    "expo": "~37.0.0",
    "expo-font": "^8.2.1",
    "expo-status-bar": "^1.0.2",
    "react": "~16.11.0",
    "react-dom": "~16.11.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-37.0.1.tar.gz",
    "react-native-gesture-handler": "^1.6.1",
    "react-native-reanimated": "^1.8.0",
    "react-native-safe-area-context": "^0.7.3",
    "react-native-screens": "^2.7.0",
    "react-native-web": "~0.11.7",
    "react-navigation": "^4.3.7",
    "react-navigation-stack": "^2.3.13"
  },
```

# 解決方法
https://github.com/expo/expo/issues/5507
こちらのissueを見ると、
`rm -rf ./node_modules/expo/node_modules/expo-font/`
上記をTerminalで実行するしか対応方法はなさそう・・。
本番環境にて、複数画像投稿したら、413 Request Entity Too Largeと出る

###経緯
本番環境で複数枚の画像を上げようとしたら、標題のエラーが出て、困っていた。
調べたら、対処法が出てきたので、備忘録として、まとめる

###設定方法
EC2サーバーで設定するためのファイルを開く

```
sudo vi /etc/nginx/nginx.conf
```

容量を増やすための記述をする。

```
http{

    keepalive_timeout   65;
    types_hash_max_size 2048;
    client_max_body_size 20M; #追加
    以下略*******************
```

nginxに適用させるために下記のコードを実行。
```
sudo /etc/init.d/nginx reload
```

参考にした記事
https://qiita.com/dir_sh0606/items/74a51389fc24344cbc48
Firebase Cloud FunctionsでFireStore書き込みエラー

#権限エラーが出た

久しぶりにFirbaseで別プロジェクトを作って、
firebase serveでローカルテスト中に
CloudFunctionsからFireStoreに書き込みにいったら下記のエラーが…:cry:

> Error: 7 PERMISSION_DENIED: Missing or insufficient permissions.

読むのは読めるので、なんか書き込みの権限が無いのかなと
**firestoreのルールを見てみる**

```rules:firestore.rules
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
```

cloud functionsから呼ぶときってauth関係なくいけるんじゃなかったっけ…

```js:index.js
const admin = require('firebase-admin');
admin.initializeApp();
```

admin使ってるしなんも問題無さそう？:hushed:
ローカルがおかしいのかも？**1回デプロイして試してみる**
firebase deploy:muscle:

###deployしたら書き込めた

ローカルだけの問題ですね…
ぐーぐる先生おたすけ:innocent:

#解決方法

一応ローカルだけの問題ということで、解決方法が二つありましたので
とりあえず両方記載しておきます:yum:

##その１　serviceAccountを読み込む

そういえば忘れてたって感じなんですが、Firebaseコンソールのユーザーと権限の
サービスアカウントのタブにFirebaseAdminSDKというのがあって
そこで秘密鍵を生成するんでした…:kissing:

そこから生成したjsonファイルをダウンロードして
**functionsフォルダの直下**に置きます。

そして、functionsのindex.jsへコンソールに表示されている
AdminSDK構成スニペットを貼り付けます

パスの部分をさっきダウンロードしたjsonに置き換える（直下に置いたので./）
ファイル名はそのままだと長いので変えても大丈夫です。

```js:index.js
const admin = require("firebase-admin");
const serviceAccount = require("./hogehoge.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://コンソールに出てる自分のやつ.firebaseio.com"
});
```

これを入れると、ローカルからも無事firestoreに書き込みが出来るようになりました:grinning:

##その２　GOOGLE_APPLICATION_CREDENTIALSを変える

*GOOGLE_APPLICATION_CREDENTIALS*というのを設定するというのを見つけたので
今の自分のを確認してみたら、前のプロジェクトで使ってたものになっていました。

なので、**その１の設定をしていない**場合、
デフォルトでここのjsonを参照しにいくようで、別プロジェクトのjsonが設定されており
その状態で別プロジェクトのfirestoreに書き込みに行こうとして、そんな越権できないよっていうエラーだったのかも？

上記を設定する方法はこれ↓

```powershell:command
set GOOGLE_APPLICATION_CREDENTIALS={先ほどのダウンロードしたjsonのパス}
```
これを設定すると、index.jsは

```js:index.js
const admin = require('firebase-admin');
admin.initializeApp();
```
↑のままでもローカルからfirestoreに書き込みが出来るようになります。

##まとめ

ローカルで色んなプロジェクト使ってる人はいちいち書き換えるのめんどいので**その１**
ずっと同じプロジェクト使ってるぜって人は**その２**でも良い？

って感じで:hand_splayed:
Anacoda Navigatorが立ち上がらなくなった

# 実行環境
下記の症状が発生した実行環境は以下の通りです。

- Anaconda NavigatorのVersion : 1.9.12
- OS :  Windows 10
- ネットワーク環境 : 社内LAN (Proxyはあるが外部接続はほとんど制限されている)


# 症状
Anaconda Navigatorを起動しようとしても、起動時のアイコンが途中でクリックすると消える状態になる。
タスクマネージャーで確認すると、pythonのプロセスが2個、ゾンビ的に残っている。
再度Anaconda Navigatorを起動しようとすると、起動中とのメッセージが出る。タスクマネージャーで先のpythonのプロセスを終了させると、起動は受け付けるようになるが、起動しないのは変わらず。

Anacondaをアンインストールして、インストールし直しても症状は変わらず。


# 試したこと
「Anaconda Navigator 起動しない」で検索して出てきたを一通りやってみたけど、症状は変わらず。
試してみたのは以下。

> Anaconda Promptで
> **conda update conda**
> **conda update --all**

> Anaconda Promptで
> **anaconda-navigator --reset**

> Anaconda Promptで
> **conda clean --all**

> .condrc にproxy設定を追加

> .condrc にoffline設定を追加

# spyderの問題は解決
spyderもおかしくなっていて、ファイルセーブ後などに、外部アクセスをトライしている感じで数分止まる症状が出ていたのですが、こちらは上記を試した結果、なぜか解決していました。

# コンソールで確認
検索で出てきたページに書かれていたように、コンソールからAnaconda Navigatorを起動しようとしてエラーメッセージを見ていて気付いたが、なんか外部URLからファイルを取ってこようとしてエラーで死んでる。
会社のFirewallがきつく、proxyサーバーはあるけど、ほとんどのサイトはアクセスできない(pipやcondaで行くサイトはアクセスできる)ために、そこで引っかかっている。

これをやめさせようと、**.condrc** を色々いじくってみたが、offline設定も無視して、相変わらず外部URLにアクセスしやがる！
「Anaconda Navigator offline」で検索すると、Anaconda Navigatorにofflineモードがあることが判明。ただし、そこで解説されていたのは、Navigator起動後に設定する方法。

# 解決した方法
フォルダーを探してみると、`C:\Users\USERNAME\AppData\Roaming\.anaconda\navigator\.anaconda\navigator\anaconda-navigator.ini` を発見！この中に、`first_time_offline = True` ってあるのに無視してる！

このiniファイル中の`offline_mode = False` を`offline_mode = True`に変更してからAnacoda Navigatorを起動したら、無事起動し解決した。
ADDMONTHS 数式を使って、何か月後の日にちを求める

1か月が必ず30日じゃないので、補正が必要みたい。

ADDMONTHS 関数を使えば解決できる。

[How to add months to a date with Salesforce formula with ADDMONTHS function – (Spring 18′ Release)?](http://getawayposts.com/add-months-date-salesforce-formula-addmonths-function)

[help](https://help.salesforce.com/s/articleView?id=sf.customize_functions_addmonths.htm&type=5)
Macからcolorfulboxのレンタルサーバーにssh接続した手順

#レンタルサーバー側の準備

参考サイト
https://help.colorfulbox.jp/manual/ssh-use/

管理画面からSSHアクセスをクリック
SSHキーの管理
新しいキーの生成

公開キーをAuthorize

#怒られるのでパーミッション変更

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$ chmod 0600 id_rsa
```


#ターミナルでアクセス

```
ssh [ユーザー名]@サーバー名 -p 22 -i [id_rsaのパス]
```
これで接続OK
「テレワーク」と「新型コロナ」には相関性があるのか確かめてみた。


# はじめに
この記事は、5日前にプログラミングの勉強を始めたばかりの初心者による、初めてのQiita投稿です。
まだまだ未熟者ではありますが、完璧を求めてアウトプットしないのは悪だ！
ということで、定期的にアウトプットしていければと思っております。
ご指摘、アドバイスなど随時いただけると嬉しいです！

# 目的
「Qiita上で"テレワーク"というワードが含まれる記事の数を日別に抽出し、新型コロナの感染者数との相関性を見る」

つい昨年までは、"テレワーク"という言葉はIT業界やベンチャー界隈では当たり前に聞くものの、世間一般ではまだマイノリティな働き方だったように思われます。それが、コロナの感染拡大により一気に広まり、今ではどの業界でも積極的にテレワークを取り入れるようになりました。
本記事では、Qiita上での"テレワーク"と"新型コロナ"の相関性を可視化し、分析していきます。

# 環境
Visual Studio Code　v1.47.0
node v14.5.0
axios 0.19.2

# サンプルコード
まず、下記コードで"テレワーク"というワードが含まれる記事の数（日別）を抽出しようと試みました。
コロナとの関連性が見たいので、2020年以降のものに絞ります。

```Javascript

const axios = require("axios");

async function main() {
  let response = await axios.get(
    "https://qiita.com/api/v2/items?query=" + encodeURIComponent("テレワーク")
  );
  for (let i = 0; i < response.data.length; i++) {
  console.log(response.data[i].created_at);
 }
}

main();
```
ところがどっこい、QiitaAPIのデフォルトでは取得件数が20になってました＞＜
（参照：https://qiita.com/api/v2/docs#%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%8D%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3）

そこで、per_pageの最大値を100に設定し、2回繰り返すと欲しいデータがすべて取得できました！


```Javascript

const axios = require("axios");

async function main() {
  let response = await axios.get(
    "https://qiita.com/api/v2/items?per_page=100&query="+encodeURIComponent("テレワーク")
  );

  for (let i = 0; i < response.data.length; i++) {
  
   console.log(response.data[i].created_at);
 }
}

main();
```



```Javascript

const axios = require("axios");

async function main() {
  let response = await axios.get(
    "https://qiita.com/api/v2/items?per_page=100&page=2&query="+encodeURIComponent("テレワーク")
  );

  for (let i = 0; i < response.data.length; i++) {
  
   console.log(response.data[i].created_at);
 }
}

main();
```


# 抽出結果と考察

Qiitaの記事数がわかったので、全国のコロナ陽性者数データと並べてグラフにしてみました。
（参照：「厚生労働省」https://www.mhlw.go.jp/stf/covid-19/open-data.html）


![ようせい.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/31dbeb23-9f88-e13c-2258-36a687d6f20c.png)

▲日別にしたら、見づらい・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/7bf819ab-5c64-d206-2fea-180da5526bd0.png)

▲半月ごとにしてみた。こっちの方が分かりやすいですね。

コロナの感染拡大が広がるにつれて、"テレワーク"を含む記事数も増加しているのがハッキリと見てとれます。

ただ今後の展開としては、増減は比例しないのではないかと思います。
というのも、7月に入って全国的にも第2波が押し寄せていて、グラフ上でも陽性者数は急増していますが、記事数は微増に止まっています。

これは、"テレワーク"が世間的にも当たり前になってきているからではないかと推測します。
半年前に比べれば、平均の数はもちろん増えるとは思いますが、今後は安定的なグラフを描いていくのではないでしょうか。


# おわりに
今月から通っているスクール（プロトアウトスタジオ：https://protoout.studio/ ）で課された宿題が「Visual Studio Codeを利用し、Node.jsのaxiosライブラリを使ってQiita APIのタグ情報にアクセスして自分なりにデータを考察し発表する」という内容で、今回上記テーマに取り組みました。
まず宿題内容を知ったときに、Qiitaをざっと見てみるも、ど素人でプログラミング用語の理解が乏しく、何をテーマにすればいいか正直焦りました・・・。でも少なからず自分らしいことをしたいなと考えた時に、私がHRベンチャーに勤めているので、HR周り→働き方→テレワークというテーマを設定しました！
ただシンプルにデータ取得しただけですが、「csvで出力したい」「日付フォーマットを変えたい」など、改善点もたくさん見えたので、楽しかったです。もっと色々知りたいな！
【画像で説明】Microsoft Azureの無料アカウント登録方法


# まずはこちらへ
https://azure.microsoft.com/ja-jp/free/

![スクリーンショット 2020-07-16 7.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/d559291e-428f-dbd6-e140-c5be67874dd9.png)

# サインイン

![スクリーンショット 2020-07-16 7.46.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/864cc7ce-f8b7-d2d7-930f-86acbc9eced1.png)

# 情報入力

![スクリーンショット 2020-07-16 7.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/1c148f7e-3060-cca6-c029-dc19e4b317a3.png)

![スクリーンショット 2020-07-16 7.50.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/fefc6b78-de38-0dbe-4676-9b3e8277795d.png)

**無料アカウントでもクレジットカードの登録は必須になります。
自分でアップグレードしなければ勝手に引き落とされることはないそうです。**

![スクリーンショット 2020-07-16 7.51.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/71464104-f6ae-044b-2852-623ad0e59dab.png)


![スクリーンショット 2020-07-16 7.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287998/cd1e9cb7-5044-bff2-4dea-66b6be41fb5e.png)
【初心者向け】覚えておくべきCSSセレクタ5つ！（初級編）　byウェブカツ

HTMLやCSSの学習を始めたばかりの初心者は**「セレクタって何？」「セレクタの種類がたくさんあって覚えきれない」**といった状況に陥りがち。
&nbsp;

そこで今回は（初級編）として**「セレクタとは？」「まず覚えるべきセレクタの種類5つ」**をまとめてみました。


# セレクタとは？
## セレクタ
CSSではHTMLの要素に対して様々なスタイルを指定することができるが、その際に**「どの要素に」**</span>を指定するためのもの。

## セレクタの基本的な書き方
**「セレクタ」「プロパティ」「値」の組み合わせ**</span>で構成されています。


* **「プロパティ」→「何を」**を指定するところ。
* **「値」　　　　→「どのようにするか」**を指定するところ。
* **「セレクタ」　→「どのHTMLに対してか」**を指定するところ。
&nbsp;



### 基本的なCSSの記述例
とりあえず、順番に例をみていきましょうか。
これが基本中の基本の書き方。

```CSS
p {
   color : red;
}
```
上記のCSSの記述内容を分解すると、
● プロパティ：「color」の部分　→「文字色」を指定
● 値　　　　：「red」の部分　→「赤色」を指定
● セレクタ　：「p」の部分　→「HMTLのpタグ要素に対して」を指定


「**{ }** 」記号の内側で、プロパティと値を指定。
そして、**{ }** 記号の前に記述しているのが**「セレクタ」**</span>。
※上記の例だと「p」がセレクタ。

## セレクタの種類（基本編）

セレクタは、上記ように「pタグ」のような要素名での指定方法だけではなく、他にもたくさんの方法があります。
その中でも今回は（初級編）ということで、特に初学者向けに覚えていただきたい**5つ**に絞って紹介します。

また、セレクタの指定には「優先順位」というものがあるので注意が必要です。
※詳しくは下記リンク参照。
[CSSが効かない！？確認すべきポイント3つを解説！-優先順位とは？](https://webukatu.com/wordpress/?p=3455&preview=true#i-7)


### 要素型セレクタ
**「要素名で指定するセレクタ」**です。


【例】「p」の箇所が要素型セレクタ　→　「pタグ」を指定。
　　　「pタグの 文字色を 赤く します」

```CSS
p {
    color : red;
}
```
【例】「div」の箇所がセレクタ　→　divタグを指定。
　　　「divタグの マージン上下左右を 20px とし、背景色を #CCCCCCに します」

```CSS
div {
    margin : 20px;
    background-color : #cccccc;
}
```

### 全称セレクタ
**「すべての要素を指定するセレクタ」**です。（セレクタには「\*」の記号を指定）
【例】「*」の箇所が全称セレクタ　→　 「全ての要素」を指定。
　　　「全ての要素の 文字色を #223344 にします」

```CSS
* {
   color : #223344;
}
```

### classセレクタ
**「特定のclass名のある要素を指定する</span>セレクタ」**です。
【例】 「.class」の箇所がclassセレクタ　→　class名「sample」を持つ要素を指定。
　　　「class名sampleを含む要素の 文字色を 青色 にします」

```CSS
.sample {
   color : blue;
}
```

### idセレクタ
**「特定のid名のある要素を指定するセレクタ」**です。
【例】「#demo」の箇所がidセレクタ　→　id名「demo」を持つ要素を指定。
　　　「id名demoを含む要素の 文字色を 黄色 にします」

```CSS
#demo {
   color : yellow;
}
```

### 擬似クラス
この擬似要素は上記4つとは少し異なっていて、「**特定のある状況にある要素を指定するセレクタ」**です。
例えば、**マウスカーソルがホバーした時**に**カーソルをポインター（指差す手の形）に変える**、といった使い方ですね。
ここでは6つの擬似クラスについて、例と共にご紹介します。

#### ・要素名 :link
**未訪問の状態にある場合**に装飾を反映。
【例】未訪問状態のaタグに対して 文字色を 青色に します

```CSS
a:link {
    color : blue;
}
```

#### ・要素名 :visited
**訪問済みの状態にある場合</span>**に装飾を反映。
【例】訪問済みのaタグに対して 文字色を 緑色に します。

```CSS
a:visited {
    color : green;
}
```

#### ・要素名 :hover
**カーソルがホバーしている場合**に装飾を反映。
【例】マウスカーソルがホバーしているaタグに対して カーソルを ポインター にします
　　（ホバー時のみ反映する）

```CSS
a:hover {
    cursor : pointer;
}
```

#### ・要素名:active
**クリック中の場合**に装飾を反映。
【例】クリック中のaタグの 文字色を 赤色に します

```CSS
a:active {
    color : red;
}
```

#### ・要素名:focus
**フォーカスされている場合**に装飾を反映。
【例】フォーカスされているinput要素の 背景色を 黄色に します

```CSS
input:focus {
    background-color : yellow;
}
```

#### ・要素名:first-child
**要素内の最初の要素だけ**に装飾を反映。
【例】div要素の中の最初の要素だけ、 文字色を 赤く します

```CSS
div:first-child {
    color : red;
}
```

擬似クラスでしていする要素名は「要素型セレクタ」だけではなく、**「classセレクタ」や「idセレクタ」を指定することも可能</span>**。


## まとめ

セレクタは他にもたくさんありますが、まずはご紹介した5つのマスターを目指してください。
次回では、中級編ということでさらに複雑な要素指定ができるセレクタについてご紹介いたします。

---
#### かずきち
プログラミング学習サイト「ウェブカツ!!」の顧問。
不動産、保険の営業マンから、エンジニアへ転身。
「HTMLって何？」という状態から3ヶ月の独学のみでエンジニアへ転職し、１年で年収１千万を稼ぐエンジニアへ。
独学時代のプログラミング学習の分かりにくさや、「技術しか出来ずに稼げていないエンジニア」の現状を変えるため「ウェブカツ」を立ち上げ運営している。

【ウェブカツ公式WEBサイト】
[https://webukatu.com/](https://webukatu.com/?utm_source=blog&utm_medium=bl02&utm_campaign=blog_pr)
[論文読み] SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks for Real-Time Object Detection for Autonomous Driving

(2020/07/16) 自分が参考にするための備忘録として記述．
私より詳しい人がいましたら，代わりに書いてください．


## SqueezeDet

論文：https://arxiv.org/abs/1612.01051

### モチベーション


安全な自動運転を実現するためには，物体検出は必須の技術である．環境内の歩行者，サイクリスト，道路標識といった物体をリアルタイムに認識する必要がある．モデルは，GPUよりも電力消費が少ない，組み込みプロセッサで動作することが望ましい．

自動運転における物体認識での要件：

- 正答率
- スピード
- モデルサイズの小ささ
- 電力効率

SqueezeDet：YOLOの構造をベースに，SqueezeNetを用いたもの．

（SqueezeNetは，AlexNetレベルの正答率を保ちつつ，サイズを小さくしたモデル）

> メモ：ここで言うYOLOの構造とは，end-to-end のこと（多分）

### 検出の流れ

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/ad31526f-9df6-5195-9749-0675a14e2016.png)

YOLO同様に，1つのネットワークで，領域検出と分類を行う．入力画像を低解像度・高次元の特徴マップを抽出する．その後，特徴マップをConvDetに与える．

confidence score を次のように定義する：

$$ Pr(Object) * IOU_{truth}^{pred} $$

また，Bounding Box の座標推定の指標として，

$$ \max_c Pr(class_c | Object) * Pr(Object) * IOU_{truth}^{pred} $$

を用いる．

この指標を用いて，top-N の Bounding Box を選び，冗長な Bounding Box を除いて検出結果とする．

### モデルの構造

ConvDet の部分は，VGG16 や ResNet といった，一般の CNN アーキテクチャを用いることができる（論文では，"backbone" アーキテクチャとしている）．モデルサイズと消費電力の観点から，ここに SqueezeNet を適用する．

この研究では，2種類の SqueezeNet アーキテクチャを用いた．

- Squeeze Ratio = 0.125 のアーキテクチャ
    - ImageNet-1k top-5 accuracy: 80.3%
    - 以降，これをバックボーンに用いた検出器を SqueezeDet とする
- Squeeze Ratio = 0.75 のアーキテクチャ
    - ImageNet-1k top-5 accuracy: 86.0%
    - 以降，これをバックボーンに用いた検出器を SqueezeDet+ とする

ImageNet で事前学習し，頭に fire module を2つ追加して使用．

### 性能
KITTI データセットによる実験を通じた性能評価．

![table2_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286106/48ac7955-f1b4-0547-f037-d73282bf252f.png)


モデルサイズ，推論速度（1データあたり）では SqueezeDet が優れる．
同じパフォーマンスを，30.4倍小さいモデルサイズ, 19.7倍の推論速度，35.2倍小さい消費電力で実現した.

> Design space explorationについて: 時間があれば追記する


## 参考

SqueezeDet: [SqueezeDet: Unified, Small, Low Power Fully Convolutional Neural Networks
for Real-Time Object Detection for Autonomous Driving](https://arxiv.org/abs/1612.01051)

YOLO: [【物体検出手法の歴史 : YOLOの紹介】](https://qiita.com/mdo4nt6n/items/68dcda71e90321574a2b)

mAP, IOU: [【物体検出】mAP ( mean Average Precision ) の算出方法](https://qiita.com/mdo4nt6n/items/08e11426e2fac8433fed)
エンジニアの知的生産術を読んで 【ねぎたメモ】

エンジニアの知的生産術を読んだ内容を、各章ごとに簡単にまとめています。
自分用なので読みづらいかもです。
書籍を購入する際の参考程度にしていただければ幸いです。

<h2>第1章　新しいことを学ぶには</h2>

学びとは：「情報収集」「モデル化」「検証」のサイクル
情報収集：知識という箱を横に並べていく作業。
モデル化：箱を積み上げていくイメージ。情報収集によって集めた情報を積み上げる。1つの知識につい
　　　　　て深く知る。モデル化をするには、たくさんの箱が土台になければならない。つまり基礎知
　　　　　識がたくさん必要になる。
検証：試行錯誤を重ねていくこと。うまくいかなかったことに目はいかないが、成功の裏にはたくさん
　　　の失敗がある。どこが違うのか？を解明していく。たくさん並んだ箱の奥行きが試行錯誤の部
　　　分。成功しか見ていない人は、箱の手前側しか見ていない。


情報収集のコツは知りたいことから学ぶこと。
将来必要なことを学ぶのは必要になってからで良い。
時間は貴重なので、目の前の必要なことに目を向ける。

プログラミングに置き換えてみる
情報収集：写経や参考書を読む
モデル化：情報収集で得た知識を自身の経験から抽象的なものにしていく
検証：プログラムを書いて「実行」、「デバッグ」を繰り返し正しく理解できているか確かめる

<h2>第2章　やる気を出すには</h2>

やる気を出すためには、一旦全てのタスクを洗い出す
（やる気が出ない人の65%はタスクを絞れていない）


<h3>タスク整理の方法</h3>
<ul>
<li>「行動を起こす必要がないもの」をゴミ・資料・保留の3つに分類する
<li>「次にとるべき具体的な行動」が複数ならプロジェクト化する
<li>「次のとるべき具体的な行動」が2分以内でできるなら、今やる
</ul>

タスクの優先順位付けは難しい。
1次元でないと、観点が複数になるため優先順位をつけにくくなる

<h3>集中力を維持する方法</h3>

<ul>
<li>出来るだけタスクを小さくする：4時間以上かかるタスクは分割して管理
<li>タイムボックス：量ではなく時間でタスクを区切る：終了条件が明確でないタスクの場合に有効</li>
</ul>

<h2>第3章　記憶を鍛えるには</h2>

海馬を鍛える
→人間の記憶を司っている場所

インプットよりもアウトプット（テストを行うなど）を多くすることで記憶の定着力が向上する。

人間の主観的な覚えている感覚と、実際の記憶の定着率は一致していない
→繰り返し学習するなら、1週間後よりも1ヶ月後の方がその後の定着率が良い

<h3>学習する際のポイント</h3>
<ul>
<li>理解できないことを学ばない</li>
<li>暗記をする前に理解をする</li>
<li>干渉を見つけて取り除</li>
</ul>
※似たような内容のものは、混乱して覚えられなくなるので一方を捨てて一方だけ先に覚える</li>

<h2>第4章　効率的に読むには</h2>
<h3>本を読む目的</h3>
<ul>
<li>娯楽</li>
<li>情報を見つけること</li>
<li>理解を組み立てること</li>
</ul>

本が存在する理由：経験した情報を他人に伝達するため。脳内の情報を相手の脳内に直接インプットさせることができないから。

・読む速度と理解度
理解度を高めたい→速度は落ちる
速く読みたい→理解度は落ちる

自分の読書のボトルネックになっている要因は？目の動き？理解度？ページをめくる手？

理解度がボトルネックの場合
・速く読むことを意識する
→速く読んでわからなければもう一度読めば済むから。遅く読んで時間を使いすぎてしまうと生産性が落ちてしまう
見出しに注目して本の全体像を掴むなどの工夫をする

本を理解するには、読んだ内容について自分なりに濃縮したノートを作る。
→自分の欲しい内容を抽出することができて、脳内にもインプットされやすい（レバレッジリーディングより）

<h2>第5章　考えをまとめるには</h2>
情報の書き出し：重複しても良いので、頭に浮かんだことは全て書き出す。
情報の整理：書き出しで出てきた内容の中で似ているものは全て同じものとして分類分けをしていく。
→関係のありそうな事柄をグループにしてまとめていく。
（自分の主観でまとめて良い）
自分の主観と、他人の意見の違いを受け入れることが大切。

KJ法を繰り返し行うことにより知識のアップデートと理解を深める。

対立関係に注目して考えを整理する：NM法
→似ているもの同士だと分類分けが難しいため、対立関係にあるものから分類していきまとめる

<h2>第6章 アイデアを思いつくには</h2>

<h3>アイデアを思いつくステップ</h3>
<ul>
<li>耕すフェーズ
→集めた情報から規則性や繋がりを見つける</li>

<li>芽生えるフェーズ
→アイデアが思いつくのを待つ。時間が決まっている場合は、時間内に思いつくアイデアで勝負する</li>
<li>育てるフェーズ
→アイデアを磨いていく。試行錯誤を繰り返し有用であるか検証していく</li>
</ul>

※参考
Youngのアイデアの作り方
川喜田二郎の発想法
Otto Scharmerの変化のパターン

自分の中の言語化されていない抽象的な部分を自問自答しながら言語化していく
→抽象概念は自分の中の身体的感覚や経験に落とし込んで言語化させる

他人の視点を大切にする：一方向からだと見えないものがある
→他の人の目(経験)を借りる

<h2>第7章　何を学ぶかを決めるには</h2>
知識拡大再生産戦略の3つとは
<ol>
<li>知識を使って時間を得て、その時間を知識獲得に投資する</li>
<li>知識を使ってお金を得て、そのお金を知識獲得に投資する</li>
<li>知識を使って立場を得て、その立場を使って知識獲得をする</li>

他人から教わると、短時間で効率的に成長できるが伸び代がない
→教えてもらった人の知識の上限が自分の上限だから

知識の掛け合わせで他人と差別化を図る
→生き残っていくための手段
A-Frameで日本語を表示(スクリプトで実装)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674233/b362b02a-9c62-d778-9d2f-48393ada81e9.png)

#はじめに
はじめまして、最近A-Frameがマイブームです。
むちゃくちゃ簡単に3D､VRが出来ることに感動するのですが、
如何せん日本語の表示が未対応なのがつらいところです。

現状は2つほど表示する方法がありますが、どちらも十全ではないので、
別の方法をjavascriptで実装してみました。

#既存の方法
既存の方法は以下の2つとその欠点

- フォントデータを変換して使う
 - 欠点：あらかじめ使用する文字すべてを準備する必要がある。
- HTML Shaderを使う
 - 欠点：透過できない。htmlのbackgroundを透明にすると、3D空間ではなくcanvasを透過してしまう。(demo参照)

# 別の方法
ざっくりした方法
1. 対象の日本語テキストを生成したcanvasに描画
2. canvas情報をbase64に変換
3. src=base64のa-imageを挿入

# コード
今回の方法と、参考にHTMLShaderを使った方法を実装
ざっくり実装なのでいろいろ適当

```javascript

<html>
<head>
    <meta charset="utf-8"/>
    <title>aframeMultiByte</title>
    <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>
    <script src="./js/aframe-html-shader.min.js"></script>
    <script src="./js/html2canvas.min.js"></script>
    <style>
        .target{
            width:500px;
            height:100px;
            font-size:20pt;
            background:rgba(0,0,0,0);
        }
    </style>
</head>
<body>
    <div id="target1" class="target">
        <p>旧.こんにちは世界(HTML Shader)🌝</p>
    </div>
    <a-scene vr-mode-ui="enabled: true" style="position:fixed;top:0;">
        <a-box position="-1 0.5 -3" rotation="0 45 0" color="#4CC3D9"></a-box>
        <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
        <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
        <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
        <a-sky color="#ECECEC"></a-sky>
        
        <a-plane position="-1.5 2 -1" width="2" height="0.5" material="shader:html;target: #target1;"></a-plane>

        <a-entity mb-text position="1.5 1.5 -1" data-text="新.こんにちは世界(script)🌝"></a-entity>
      </a-scene>
</body>
<script>
function aframeMutlByte(){
    document.querySelectorAll('[mb-text]:empty').forEach(mb_text=>{
        console.log(mb_text.dataset.text)
        const text  =mb_text.dataset.text
        const text_cnt = text.length
        const width = text_cnt*1.4
        const height= 1.6
        let cvs = document.createElement('canvas')
        let ctx = cvs.getContext('2d')
        cvs.width = width*100
        cvs.height = height*100
        ctx.fillStyle = "rgb(0, 0, 0)"
        ctx.font = '100pt Arial'
        ctx.fillText(text,0,125)

        const base64 = cvs.toDataURL("image/png")
        mb_text.innerHTML=`<a-image scale="${(width)/10} ${height/10} 1" src="${base64}"></a-image>`
    })
}
    aframeMutlByte()
</script>
</html>

```

# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674233/47e1f02f-4c24-3eec-ca05-c9f1b4f80811.png)

日本語だけでなく顔文字も透過した状態で表示される。

# 最後に
作りこめば、フォントの指定とか、改行とかオプションをいろいろ実装できそう。
ざっくり作ったので、VR端末での動作確認などは要検証

# 追記(2020-07-18)
VRモードの設定つけ忘れてたのでコード修正
一応Android9のChrome、iOS13のsafari、OculusQuestで大丈夫だったので、
おおよそ使えそう。

#参考サイト
[A-Frame: Hello WebVR](https://aframe.io/docs/1.0.0/introduction/)
[A-Frameで日本語を表示したい](https://qiita.com/emuyuu/items/df90a011d73643b8adcb)
[A-FrameとHTML Shaderで美しい日本語テキストを表示する方法](http://vr-lab.voyagegroup.com/entry/2016/11/16/122115)
Vue.js  v-forの使い方　シャッフルをする　lodash

#lodashを使用したシャッフルボタンの実装

参考記事:https://www.youtube.com/watch?v=S0b1ZBIooyY&list=PLh6V6_7fbbo-SZYHHBVFstU2tp0dDZMAW&index=7

lodash：https://lodash.com/
（lodashはシャッフルを簡単にするために使用している。）

**前回学んだ配列をv-forで表示させるものの続き**
前回記事
[Vue.js v-forの使い方　配列とオブジェクト比較](https://qiita.com/H-Toshi/items/a3f89a0c5a945c0750b5)

ボタンを押すと配列の並びが変化するようにした。
コード

```javascript

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .flip-list-move{
            /* このflip-listはtransition-groupのname属性を差す。-moveはここが動いた時にこのcssを着火させるという意味 */
            transition:transform .5s;
        }
    </style>
</head>
<body>
    <h1>Vueの練習:v-for</h1>

<!-- オブジェクトの配列のv-for -->
<div id="app2">
    <button v-on:click='shuffle'>シャッフル</button>
    <transition-group name='flip-list' tag='ul'>
        <!-- transition-groupタグで囲う時はtagで指定したulタグの開始タグは不要 -->
        <li v-for='item in items' v-bind:key='item.name'>{{item.name}}</li>
        <!-- transition-groupをかける為にv-bind:keyの設定が必要 -->
        <!-- v-bind:key は :keyに省略も可能 -->
    </transition-group>        
    </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js"></script>
<script>

// オブジェクトの配列のv-for
new Vue({
    el:'#app2',
    data:{
        items:[
            {name:'北海道'},
            {name:'青森県'},
            {name:'岩手県'},
            {name:'宮城県'},
            {name:'秋田県'},
            {name:'山形県'}
            ]
    },
    methods: {
        shuffle:function(){
            this.items = _.shuffle(this.items);//「_.」はlodashを使うときの宣言。参考:https://lodash.com/
        }
    },
})

    
</script>
</body>
</html>
```

結果
![スクリーンショット 2020-07-16 6.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/c96b7613-e968-1e4d-c563-77b055c890ad.png)
これが
ボタンを押すと

![スクリーンショット 2020-07-16 6.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/1f5fb7d1-f621-d482-fb7e-26da3d6a8375.png)
このように順番が変わる


##ポイント
```javascript

 <transition-group name='flip-list' tag='ul'>
        <li v-for='item in items' v-bind:key='item.name'>{{item.name}}</li>
 </transition-group>        
```
transition-groupで前回書いていたulタグを囲む
**この時、ulの開始タグを消し、transition-groupの開始タグ内でtag='ul'を設定する点注意**

###属性keyの扱い
v-bind:keyを設定することでシャッフルする対象を指定している。
この辺りの扱いがまだ理解できていない。
公式ドキュメントを貼っておく。今後理解できるようにしたい。
https://jp.vuejs.org/v2/api/#key


#####その他ポイントはコード内のコメントに記載
Vue.js  v-forの使い方　配列とオブジェクト比較

前回のv-forはこちら
[Vue.js v-forの使い方](https://qiita.com/H-Toshi/items/be7dc39edb2de0da3a9c)

##配列とオブジェクトで指定の仕方に違いがあった為その実装方法の備忘録

コード

```javascript

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Vueの練習:v-for(基本的な配列とオブジェクトの比較）</h1>


<!-- 基本の配列のv-for -->
<div id="app">
    <ul>
        <li v-for='item in items'>{{item}}</li>
    </ul>
</div>

<!-- オブジェクトの配列のv-for -->
<div id="app2">
    <ul>
        <li v-for='item in items'>{{item.name}}</li>
    </ul>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script>

// 基本の配列のv-for
new Vue({
    el:'#app',
    data:{
        items:['北海道', '青森県', '岩手県' ,'宮城県' ,'秋田県' ,'山形県']
    }
})

// オブジェクトの配列のv-for
new Vue({
    el:'#app2',
    data:{
        items:[
            {name:'北海道'},
            {name:'青森県'},
            {name:'岩手県'},
            {name:'宮城県'},
            {name:'秋田県'},
            {name:'山形県'}
            ]
    }
})

    
</script>
</body>
</html>
```
結果
![スクリーンショット 2020-07-16 6.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/f42488b8-38cc-7c1d-5ea2-28abebc8ff5f.png)




##ポイント
####html側
マスタッシュの書き方
通常の配列:{{item}}
オブジェクト:{{item.name}}

####js側


通常の配列:

```
 data:{
        items:['北海道', '青森県', '岩手県' ,'宮城県' ,'秋田県' ,'山形県']
    }
```

オブジェクト:

```
data:{
        items:[
            {name:'北海道'},
            {name:'青森県'},
            {name:'岩手県'},
            {name:'宮城県'},
            {name:'秋田県'},
            {name:'山形県'}
            ]
      }
```
ruby on rails で作ったアプリを公開する

基本的に下記の記事に従って、やっていく

https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39

Genfileの設定は、開発環境からPostgreSQLを使用していたので行なっていない

config/environments/production.rbの設定
config.assets.compile = false をtrueに変えた

local環境でproductionを起動するように設定していたので,それを戻す作業


```~/.bash_profile
//export RAILS_SERVE_STATIC_FILES=1
//export TASKLEAF_DATABASE_PASSWORD=password
```
上記二つをコメントアウト

```config/environments/production.rb
config.public_file_server.enabled = true
```
を

```config/environments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
```
に戻す

######公開したアプリ
https://tasknotice.herokuapp.com/
深層学習の説明性って！！（生涯初、日付ガチ間違い「Qiita夏祭り2020_パソナテック」に出したかった。。。）

#とほほ
タイトル記載のとおり、
**生涯初、日付ガチ間違い「Qiita夏祭り2020_パソナテック」に出したかった。。。**
なんとなく、金曜日、金曜日は実際は7/17ですが。。。までだと思ってた。

**とほほ**、なので、
以下、示し方、構成を変えて、端的に記事を書きます。

#深層学習の説明性

深層学習において、何がどうなっているかわからない、という指摘がある。
それに対して、Grad-CAMという技術が、結構前からあり、
説明性に寄与している。

大前提として、このGrad-CAMというのは、わかり易いと思います。基本、肯定的に考えています。

しかし、
この深層学習の判断根拠を示すGrad-CAMに対して、人が気持ち（感情？？）をのせすぎる、思い入れを加えると
めちゃくちゃになりますという**アンチパターン**です。

#例１

<img width="300" alt="kohan.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/f08fae59-0444-254a-d8cb-afbaa93ddf31.png">

深層学習がlakeside(湖畔）と判断した部位は、以下。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/720f29db-74d8-8c3b-ee57-ad8ef4564a21.jpeg" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/9d1cfae8-4791-8402-f5a1-703fab19dd66.jpeg" width=300>

なるほど。。。

* 湖畔の写真の撮り方の定番の、(a)手前の木の枝、(b)向こう岸、を完璧におさえている。
* 特に、(a)の手前の木の捉え方が、水面を背景にした部分を抑えており、これで、
湖畔(度)があがる。


って、気持ちを入れられますが、
ここまでに示したのは、**dock(ドック）**と判断する根拠を示したものです。
正しく、**lakeside(湖畔）**は、以下。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/451b416d-648f-8852-cb51-8326a0d237c2.jpeg" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/70f8a98a-058b-a451-3889-4f2691f3dc05.jpeg" width=300>

ここで、説明を加えると、アンチにはまるので。。。


#例２

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/aec65539-5315-625d-dc98-de603892f0ec.jpeg" width=300>

深層学習がtaddy(日本語ではトラ猫）と判断した部位は、以下。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/004fffc9-ca99-48f7-d8f0-4bc1a047f100.jpeg" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/e0188215-14fe-a63b-6c9c-9a00041db67a.jpeg" width=300>

なるほど。。。

* 猫の特徴は、一言で言えば**目**にある。もう少し、詳しく言うと、目自体とそのまわりの模様。
* あと、他の動物との差として注目するのが、**胸元の模様。**


って、気持ちを入れられますが、
ここまでに示したのは、**doormat(ドアマット）**と判断する根拠を示したものです。
正しく、この場合、**taddyなのでtaddy(日本語ではトラ猫）**は、以下。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/b776e3a2-b96c-73a4-962e-6042935bad6c.jpeg" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635153/fb80bfc8-5e4c-b3ca-d322-4244d378c4f5.jpeg" width=300>

ここで、説明を加えると、アンチにはまるので。。。
しかし、taddyは、目の上に「M」という文字があり、これが特徴なので、
正しい、捉え方です。念のため。

#作業方法
ここで記載のGrad-CAMは、
実行コードは、以下のサイトのものを利用。
https://github.com/eclique/keras-gradcam

以下なども参考になると思いますが、
以下のコードは、issuesとかの状態も見られたほうがいいような気もします。
ちょっと、自分の使い方か？、変なところがあるような気がしないでもないです。
https://github.com/sicara/tf-explain/blob/master/examples/core/grad_cam.py

#まとめ
「参加ボタン」を押したら、参加できませんってなったのが、衝撃でした！
いやでも、過ぎてから気づいて良かった。直前とかだと、かえってより悲しかっただろう。
それはさておき、**深層学習の説明性をこれからもみていきましょう。もっと、明確なものが出てくると思います。**

|何のアンチを示したのか（再掲）|
|:---|
|深層学習の判断根拠を示すGrad-CAMに対して、**人が気持ち（感情？？）をのせすぎる、思い入れを加えるとめちゃくちゃになります**　　|
AWSで最弱の権限選手権

AWSのIAM(Identity and Access Management)について、AWSの公式ページに
[「ユーザーに必要最低限の権限 (最小権限とも呼ばれます) を付与します」](https://aws.amazon.com/jp/iam/details/manage-users/)
と書いてあるにも関わらず、その「最小権限」とは何なのか書いてないんですよ。

「いや、それはケースバイケースだから」
と言われるかもしれませんが、とりあえず何か例示して欲しいのが初心者。

[【AWS IAMとは？】初心者にもわかりやすく解説](https://www.wafcharm.com/blog/aws-iam-for-beginners/)
という初心者向けを名乗る記事もAWSの記事をそのままなぞっているだけで、何ら例示されていない。絶望。

いや、何も権限つけないのが通るんなら、それでも良いんですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/2616cbc8-2510-12de-a03c-85cbfca9a7fe.png)
でもなんか怒られる。（実際には無視してユーザー作成を終了させることもできますが）

仕方がないので最弱の権限を探す旅に出る。見つかりました（秒で）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/11a24f75-8098-f68b-0f23-944958541e8d.png)
その名も**「AWSDenyAll」**。期待できそうです。

とりあえずこの権限をつけると怒られずにユーザーを作成できます。

そして、ユーザー作成時に「パスワードのリセットが必要」も「はい」にしておくと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/442c822f-3a32-131d-2f3b-71428f045ca0.png)
**パスワードを変更する権限すらないので、入れません。まさに最弱。**

けっこう有名なのかな、と思ったんですが、日本語の厳しめ検索をしたら引っかからなかったので、もしかしたらそんな有名じゃないのかな。（そもそも他にもっと良い権限が周知されてるのかもしれないけど）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/5f3f2bcc-00a1-40da-78b8-4dae49329de5.png)

そんな訳で、とりあえず権限を最低限にしてユーザを作りたい場合には、**「AWSDenyAll」**はいかがですか、という記事でした。では😇
Pythonプログラミング備忘録（辞書に関する操作）

あまりにもググるので自分用Pythonプログラミング備忘録
(自分が忘れるものに特化しています)
試験的に1ブロックで書いています。
参考書：[独学プログラマー Python言語の基本から仕事のやり方まで](https://www.amazon.co.jp/dp/B07BKVP9QY/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
(セクション名などは参考書に従います)
対象言語：Python 3.6.3
# §5　コンテナ
### 辞書
```python:dictionary.py
## 辞書の定義
fruits = {"Apple": "Red",
          "Banana": "Yellow"}
fruits
## valueの追加(str,int)
fruits["Carrot"] = "Orange"
fruits["Daikon"] = -2200
# ハツカダイコンの栽培記録は紀元前2200年頃のエジプトが最古らしい

## key参照
fruits["Carrot"]
fruits["Daikon"]

## keyはimmutableのみ(変数は使えることに注意)
## valueはlistなどimmutableでも可能
#  Eggplant = [0,1]
#  fruits[Eggplant] = "Maybe TypeError"
#  Result->  TypeError: unhashable type: 'list'

## in演算子の検索対象はkeyであってvalueでない
"Carrot" in fruits
"Orange" in fruits
"Zgg"    not in fruits

## keyとvalueのペアを削除するにはdelキーワード
fruits
del fruits["Daikon"]
fruits

## リストの要素に辞書を持たせる
my_list = [fruits]
my_list
```

実行結果

```python
{'Apple': 'Red', 'Banana': 'Yellow'}
## キー参照結果
'Orange'
-2200
## in演算子検索結果
True
False
True
## delete結果
#### delete前
{'Apple': 'Red', 'Banana': 'Yellow', 'Carrot': 'Orange', 'Daikon': -2200}
#### delete後
{'Apple': 'Red', 'Banana': 'Yellow', 'Carrot': 'Orange'}
## リストの要素に辞書を持たせた結果
[{'Apple': 'Red', 'Banana': 'Yellow', 'Carrot': 'Orange'}]
```
地味なテスト作業を自動化へ (Jest、Puppeteer)


WEBサイトの動作確認など、地味な手動テスト作業をで自動スクリプトでやって貰います。こんな感じです。
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665134/bed69561-710e-8eb4-eb6d-ea5e3275299d.gif)

## 開発環境
- `node.js` & `npm`　すでにインストール
- なんかのコードエディター (VS Code 2019)
- `Chrome` or `Chromium` ブラウザ

## 利用モジュール
- **jest**: テスト実行専用のJavascriptフレームワーク
https://jestjs.io/

- **puppeteer**: Chrome/Chromiumブラウザを操作するためnode.jsの高水準APIライブラリ
https://github.com/puppeteer/puppeteer#puppeteer

##テスト目標

今回は例で`Amazon.co.jp`をテスト対象として使います。
通常であれば、検索結果のページは最大48個表示されます。
検索結果のページに表示される商品の数は通常に表示されるかどうかの動作確認する目的

## 1. プロジェック新規作成

フォルダを新規作成し、ネームタグは任意でフォルダ内に下記のコーマンド実行:

```
npm init
npm install --save jest
npm install --save puppeteer
```


## 2. テストコマンドを指定
`package.json`で実行スクリプトの`"test": "jest --verbose true"`を`"scripts"`の下に指定します。

```json:package.json

   {
    "name": "test-automation",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
        "test": "jest --verbose true"
    },
    "author": "",
    "license": "ISC",
    "dependencies": {
        "jest": "^26.1.0",
        "puppeteer": "^5.1.0"
    }
}
```

## 3. 自動スクリプト作成

``` javascript:amz.test.js

let puppeteer = require('puppeteer');
let browser = null;
let page = null;

describe('AMAZON TEST', () => {

    // ユニットテスト起動
    beforeAll(async() => {
        //{headless:false}を除いたら、ブラウザを開かずにテスト実行可能
        browser = await puppeteer.launch({ headless: false });
        page = await browser.newPage();
        await page.setViewport({
            width: 1280,
            height: 720
        });

        // ロード時間が長いかもしれないので、60秒のタイムアウト設定しておく
        jest.setTimeout(60000);
    });

    // テスト終了後ブラウザを終了させる
    afterAll(async() => {
        await browser.close();
    });

    // テストケース前にamazonへ移動
    beforeEach(async() => {
        await page.goto('https://www.amazon.co.jp/');
    });

    test('うどん', async() => {
        expect.assertions(1);
        // 検索ボックスを特定、`うどん`を入力してEnterキーを押す
        const searchBox = await page.$('#twotabsearchtextbox');
        await searchBox.type('うどん');
        await searchBox.press('Enter');

        // ページがロードできたまで待機、商品ごと表示させる要素を特定し、
        // 想定した数で表示されるかどうかチェック
        await page.waitForNavigation();
        const products = await page.$$('div[class="s-expand-height s-include-content-margin s-border-bottom s-latency-cf-section"]');
        expect(products.length).toBe(48);
    });

}) 

```

## 4. テスト実行

```
npm run test
```

ページ毎ちゃんと48個の商品が表示させ、テスト合格とのコンソールアウトプット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665134/72705519-023d-4e57-46e2-f8a3aee5b3d1.png)

テストFAILの場合(48以外のテスト値を設定するなど)、エラーが投げられます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665134/2c7b3855-f9f2-ffee-bd39-c4e6f44094f2.png)

##参考先 
https://www.youtube.com/watch?v=wqRKEd0_suw
https://www.youtube.com/watch?v=lgkyhEHIC_c
https://www.youtube.com/watch?v=7r4xVDI2vho
全人類はSpring Boot入門の最初に「Spring Boot 2 入門: 基礎から実演まで」を読むべき

https://www.amazon.co.jp/dp/B0893LQ5KY/

Spring Boot 入門者に対して何か参考文献を提示してあげたい、と思い調べ始めているのですが、最初の調査対象として選んだ表題の「[Spring Boot 2 入門: 基礎から実演まで Kindle版](https://www.amazon.co.jp/dp/B0893LQ5KY/)」がめちゃめちゃよくて、もうこれで良いんじゃないの！？という感想になりました。

ちゃんとした書評は調査対象全部見終わった後にまとめようと思っているのですが[^1]、取り敢えず簡単に特徴を記録しておくとこんな感じです。

[^1]: Qiitaにまとめるとは言っていない。

- ○ とにもかくにも、著者がちゃんとSpring Bootを理解している、というのが文章を読んでいて分かるので安心できる。
- ○ 公式リファレンスへ準拠しようという意志が感じられる。
    - (槍玉に挙げて申し訳ないですが)ここQiitaでのSpring Boot記事なんかを見ていると、一次情報を確認せずどこの馬の骨が書いたかわからない記事を根拠にして「こうすればできます！」みたいなことをやってる人が一定数いますが、この書籍はちゃんと一次情報に当たった上で書いている、というのが読み取れます。
- ○ Spring Boot 2.3 対応、というのがタイトル詐欺ではなく、本当にSpring Boot 2.3での変更点も取り入れられています。
- ○ 章の構成がうまい。「この章でやること」を最初に説明した上で内容に入っていって、最後に「振り返り」でまとめが書かれているので、初見のときも再読するときも、自分はこの章に書かれていることに関心があるのか(注意して読むべきなのか)の判断がすぐつきます。
- ○ JPA(Spring Data JPA)について中立。
    - ぶっちゃけ、Qiitaの記事とか読んでて思うんですけど、Spring Boot使ってる人、JPAに対してコンプレックス持ち過ぎじゃないですかね…？そういうのを読んで学んじゃうのはマイナスでしか無いと私は考えています。
- ☓ 一方、実際のプロジェクトでJPAでなくMyBatisを使ってるんだ、ということも当然あり得ますが、MyBatisに関しては一切言及がないのでこの書籍以外で学ぶ必要があります。
- ☓ もうちょっと公式リファレンスへのリンクなどがあると良かったかなと思います。Spring Bootで開発する際は[Spring Bootのリファレンス](https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/htmlsingle/)以外にも、例えば[Spring Data JPA](https://docs.spring.io/spring-data/jpa/docs/2.3.1.RELEASE/reference/html/#reference)だったり[Thymeleaf](https://www.thymeleaf.org/doc/tutorials/3.0/thymeleafspring.html)だったりのリファレンスを参照する必要が出てきますが、「参照すべきリファレンスは色々あるんだよ」と読者が理解できるような内容が含まれているとより良かったかなと思います。
- ☓ Spring Bootマジックの根幹であるところのauto-configurationに対する言及がない。
  - 本書ではSpring AOPの章があるのですが、Spring AOPよりはauto-configurationの方が優先度は高いかなと考えます。
- ☓ テストに関する話が全く出てこない

内容もちゃんとしてるし、書籍としての構成もちゃんとしてる。
正直、Kindle Unlimitedの個人出版のものに期待はしてなかったのですが、予想を大きく裏切られました。

(界隈の事情には詳しくないのですが、著者は有名な方なんですかね…？ググっても情報が全然出てこなかった。)
フォルダ配下の画像一覧HTMLの作成バッチ

## はじめに

「アニメーションGIF」はエクスプローラ上だとアニメーションされないらしく、一挙に数十ファイルのアニメーションGIFを１ウインドウで表示させたい。
というワガママさんに、一覧表示するHTMLを出力するからブラウザで見ろと対応した。

## 使い方
1. 一気に表示させたい画像を一つのフォルダにまとめる
2. 作ったバッチをそのフォルダにコピーする
3. バッチを実行する
4. "thumbnail.html"が作成されるのでブラウザで表示する

## 作ったバッチ

```Batchfile:make_thumbnail_html.bat
@echo off
rem 画像をタイル状に表示させるHTMLを作るバッチ

rem 出力するファイル名
set HTML_FILE=thumbnail.html
rem タイルの列数
set TABLE_COLUMNS=3
rem タイルの幅（画像の幅）
set IMAGE_WIDTH=300

rem 検出する画像ファイルの拡張子
set FILE_TYPES=*.gif, *.png, *.jpeg, *.jpg, *.bmp

rem 出力先のファイルを消す（あったら）
if exist "%HTML_FILE%" del "%HTML_FILE%"

rem フォルダの名前を取得する
for %%I in (.) do set CUR_DIRNAME=%%~nI%%~xI

rem HTMLファイルの先頭部を出力する
call :OUT_HTML "^<!DOCTYPE html^>"
call :OUT_HTML "^<html lang='ja'^>"
call :OUT_HTML "^<head^>"
call :OUT_HTML "^<meta charset='Shift_JIS'^>"
call :OUT_HTML "^<title^>%CUR_DIRNAME%^</title^>"
call :OUT_HTML "^<style type='text/css'^>^<!-- td {vertical-align:top;}--^>^</style^>"
call :OUT_HTML "^</head^>"
call :OUT_HTML "^<body^>"

set /a FILE_COUNT=0
set /a COLUMN_NO=0

call :OUT_HTML "^<table^>"

rem ファイルを検索してタイルを出力する
for %%a in (%FILE_TYPES%) do (
     echo %%a
     call :OUT_TD_TAG "%%a"
)
rem 列数に満たなかった分だけ空のTDタグを出力する
if %COLUMN_NO% LSS %TABLE_COLUMNS% (
    call :OUT_DUMMY_TD_TAG
)
call :OUT_HTML "^</table^>"

rem HTMLファイルの終端部を出力する
call :OUT_HTML "^</body^>"
call :OUT_HTML "^</html^>"

goto :EOF

rem ============================================================
:OUT_TD_TAG

set IMAGE_FILE=%~1

rem 列番号を求める
set /A COLUMN_NO=%FILE_COUNT% %% %TABLE_COLUMNS% + 1

rem 1列目ならTRタグを出力する
if %COLUMN_NO% EQU 1 (
    call :OUT_HTML "^<tr^>"
)

rem 画像用タグを出力する
call :OUT_HTML "  ^<td^>"
if "%IMAGE_FILE%" NEQ "" (
    call :OUT_HTML "    %IMAGE_FILE%^<br/^>"
    call :OUT_HTML "    ^<img width='%IMAGE_WIDTH%' src='%IMAGE_FILE%' /^>"
)
call :OUT_HTML "  ^</td^>"

rem 最終列なら/TRタグを出力する
if %COLUMN_NO% EQU %TABLE_COLUMNS% (
    call :OUT_HTML "^</tr^>"
)

rem ファイル数を数える
set /a FILE_COUNT=%FILE_COUNT%+1

exit /b

rem ============================================================
:OUT_DUMMY_TD_TAG

rem 列数に満たない分のTDタグの個数を計算する
set /A DUMMY_LOOP=%TABLE_COLUMNS%-%COLUMN_NO%

rem 空のTDタグを出力する
for /l %%i in (1,1,%DUMMY_LOOP%) do (
    call :OUT_TD_TAG ""
)

exit /b

rem ============================================================
:OUT_HTML
set OUT_TEXT=%1
set OUT_TEXT=%OUT_TEXT:^^=^%

echo %OUT_TEXT:"=% >> %HTML_FILE%

exit /b
```

## まとめ

Windows Batchだけで心配だったが、なんとか出力できた。
アニメーションGIF数十ファイルを表示させると壮観だが結構うざい。

HTMLタグ```<```,```>```のエスケープが面倒で、他に良い方法が思いつかなかった。
バッチファイルのセオリーのようなものが見つからなかったので、もう少し調べてみようと思う。
PRML　演習問題 5.31 （基本）

## 問題
> 以下の式の結果を確かめよ。

>```math
\begin{align*}
\frac{\partial \tilde{E}}{\partial \sigma_{j}}=\lambda\sum_{i} \gamma_{j}\left(w_{i}\right)\left(\frac{1}{\sigma_{j}}-\frac{\left(w_{i}-\mu_{j}\right)^{2}}{\sigma_{j}^{3}}\right)
\tag{5.143}
\end{align*}
```


## 方針
　(5.143)は、ニューラルネットワークにおいて、重みをグループに分類し、同じグループの重みについては似たような値を取るように学習する、ソフト重み共有についての議論の中で出てきます。
　そして、(5.143)は、ソフト重み共有考えた際の全体の誤差関数 $\tilde{E}$ の微分について考えています。
　本設問は、演習問題(5.29)および(5.30)と関連があります。ソフト重み共有を用いた学習では、重みのグループ分け、各グループの重みの平均値、そして各グループの重みの広がり具合(分散)が、全て学習過程の一部として学習されます。
　全体の誤差関数 $\tilde{E}$ に対して、演習問題(5.29)は重みに関する微分、(5.30)は平均に関する微分、そして本設問は分散に関する微分を考えています。

　なお、本文中で定義されている通り、以下の式に基づいて題意の式の導出を行うことに注意します。

```math
\begin{align*}
\widetilde{E}(\mathbf{w})=E(\mathbf{w})+\lambda \Omega(\mathbf{w})
\tag{5.139}
\end{align*}
```

```math
\begin{align*}
\Omega(\mathbf{w})=-\sum_{i} \ln \left(\sum_{j=1}^{M} \pi_{j} \mathcal{N}\left(w_{i} \mid \mu_{j}, \sigma_{j}^{2}\right)\right)
\tag{5.138}
\end{align*}
```

```math
\begin{align*}
\gamma_{j}(w)=\frac{\pi_{j} \mathcal{N}\left(w \mid \mu_{j}, \sigma_{j}^{2}\right)}{\sum_{k} \pi_{k} \mathcal{N}\left(w \mid \mu_{k}, \sigma_{k}^{2}\right)}
\tag{5.140}
\end{align*}
```

＊なお、証明すべき式が教科書の日本語版と英語版で異なっているようです( $\lambda$ の有無)。本解答では、英語版の式(5.143)について証明することにします。

## 解答
ガウス分布の式は

```math
\begin{align*}
N\left(x \mid \mu, \sigma^{2}\right)=\frac{1}{\sqrt{2 \pi} \sigma} \exp\{ -\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\}
\end{align*}
```

よって、分散に関する微分は、

```math
\begin{align*}
\frac{\partial \Omega}{\partial \sigma_{j}} = -\sum_{i} \frac{\left.\pi_{j} \{-\frac{1}{\sigma_{j}}+\frac{\left(w_{i}-\mu_{j}\right)^{2}}{\sigma_{j}^{3}}\right\} N\left(w_{i} \mid \mu_{j}, \sigma_{j}^{2}\right)}{\sum_{i} \pi_{j} N\left(w_{i} \mid \mu_{j}, \sigma_{j}^{2}\right)}
\end{align*}
```

よって、(5.140)より、

```math
\begin{align*}
\left.\frac{\partial \Omega}{\partial \sigma_{j}}=\sum_{i} \gamma_{j}\left(w_{i}\right) \{ \frac{1}{\sigma_{j}}-\frac{\left(w_{i}-\mu_{j}\right)^{2}}{\sigma_{j}^{3}}\right\}
\end{align*}
```

また、$ \frac{\partial E}{\partial \sigma_{j}}=0 $ より、(5.143)を得る。
GrubをUSBメモリにインストール(UEFI)　〜USBメモリのgrubからLinuxを起動〜 

[前記事](https://qiita.com/kitarow0309/items/26ccb5f35e4044f38e5a)でUSBにgrubをUSBメモリにインストールしました。
いよいよ、実際にUSBメモリからgrubを起動させましょう

PCを再起動、電源が切れたらF12キーなどを長押ししながら起動します
大概のPCはこれでUSBを選択できるはずです。(違ったらごめんなさい)

すると真っ黒な画面で以下のようになっていると思います。

```ruby:grub
grub>
```

こんな画面で止まっています。
これがでれば成功です。ではLinuxを起動しましょう。
Linux起動に必要な情報は以下の3つです

1.Linuxがインストールされているパーティション
2.linuxのカーネルとインストールされている場所の先頭パス
3.起動に必要な処理をメモリに読み込ませるのに必要なソフトのパス

まずはLinuxがインストールされているパーティションを調べましょう
ここが一番面倒くさいです。まずは以下のようにコマンドを打ちましょう
(...は省略事項)

```ruby:grub
grub>ls
(memdisk) (hd0) (hd1) (hd1,gpt8) (hd1,gpt7) (hd1,gpt6) ...
```

こんな風に表示されるはずです。これはPCに接続された全ての記憶領域とそのパーティションを示しています。当方の環境では以下のようでした

hd0=usb
hd1=PC内のSSD
 --gpt1=1つ目のパーティション
 --gpt2=2つ目のパーティション
 ....
 --gpt8=8こ目のパーティション

という形で示される。これは個々のPCのSSDやHDD環境により異なる。
(というか自分の環境はhd1のパーティションが多すぎる、、これが不調の原因かなあ...)

つまり、hd1のgpt1~gpt8の中のどれかにLinuxが入っている。以下の方法でどのパーティションにLinuxがいるのかを探せる。


```ruby:grub
grub>ls (hd1,gpt8)/
lost+found/ boot/ hdata/ etc/ media/ var .....
```
上記のようにlost+found boot/ ....　と出てきたらそれがLinuxのインストール場所です。今回はhd1 (PCのSSD) の gpt8 (8番目のパーティション) に入っていました。
重要なのは(hd1,gpt8)です。

次に　残りの
2.linuxのカーネルとインストールされている場所の先頭パス
3.起動に必要な処理をメモリに読み込ませるのに必要なソフトのパス
について述べます
 以下のコマンド中の#(1)については下に述べますので注意してコマンドを打ってください

```ruby:grub
grub>set root=(hd1,gpt8)/
grub>linuxefi /boot/vmlinuz root=/dev/sda8 　　　#(1)
grub>initrdefi /boot/initrd.img
grub>boot
```
 #(1)に関してはroot=/dev/sda8の「sda8」に注意してください。これはLinuxがインストールされた最も先頭のパスを入力します。これは人それぞれですが、先程入力した(hd1,gpt8)の「gpt8」とroot=/dev/sda8の「sda8」の数字( 8 )を合わせるとうまくいくことが多いようです。この数字はそれぞれのPCで異なりますので注意してください。この部分がlinuxのカーネル(vmlinuz)とインストールされている場所の先頭パス(sda8)になります。

そして最後のinitrdefiが起動に必要な処理をメモリに読み込ませるのに必要なソフトのパス(initrd.img)です。

うまくいけばこれでUSBメモリにインストールしたgrubでLinuxを起動できます
。
お読みいただきありがとうございました。