OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyプログラムでメールが送れないときの対処法

#はじめに
授業でRubyを扱ってメールを送るという課題があったのですが、うまく動作しなかったので動作させる方法をまとめました。
今回はGmailでの利用のみ想定しているため@yahoo.ne.jpなどで動くかは**未確認** です。
#前提条件
- Postfixをインストールしていること
- Ruby環境が構築済みであること
- CentOS8であること

#やってみる
まず、CentOSからメールを送信するために、外部のSMTPサーバーを経由する必要があります。今回の場合はGmailのSMTPサーバーを利用します。

####必要なパッケージのインストール

```
$su
#yum install cyrus-sasl cyrus-sasl-plain mailx
```

必ずrootに切り替えてからSASLをインストールするようにしましょう。

####postfixの設定ファイルに追加で書き込む

`/etc/postfix/authinfo` へ認証情報を設定するために、authinfo.dbを作成、権限を与えます。

```
# postmap /etc/postfix/authinfo
# chmod 600 /etc/postfix/authinfo
```

下記のうち自分がよく使うテキストエディタで `/etc/postfix/main.cf` を編集しましょう。


```
# nano /etc/postfix/main.cf
# emacs /etc/postfix/main.cf
# vi /etc/postfix/main.cf
```

追加内容は以下の通り

```
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/authinfo
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
```
ここで、内容が重複するとwarningが発生すると思うので、かぶってるところがないように確認しながら追加してください。




メールを送信するために、送信元がはっきりしていないとダメなので、googleアカウントのメールアドレスとパスワードを以下に使います。

```
# echo "[smtp.gmail.com]:587 ここがメアド:ここがパスワード" >/etc/postfix/authinfo
```

Postfixを再読み込みさせて、設定を反映させる。

```
# systemctl reload postfix
```

##ここでgmailをみてみよう

大体の人は、Google運営からこんなメールが来ると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508595/67f6a424-eda6-369b-1df3-c98f539c94a7.png)


Googleが勝手にログインされるのを防いでしまい、このままではメールが送れないので、「安全性の低いアプリのアクセスの許可」をオンにしなければなりません。

まず、[ここ](https://support.google.com/accounts/answer/6010255?hl=ja) にアクセスしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508595/7eedf808-f7ff-822c-eab4-8354d5a1b7a9.png)

「アカウントで安全性の低いアプリの許可がオンになっている場合」をクリックし、「安全性の低いアプリの許可をオフにする」というセクションの指示に従って無効にしましょう。

##動作テスト

これで動く条件は整いました。
早速動かしてみましょう。

```
# systemctl reload postfix
```

以下のmailtest.rbファイルを実行します（GemFileなどは各自で入れて必ずセットすること）

```
require 'mail'
require "openssl"

options={ :address =>"localhost",
          :port =>25,
          :authentication => :nil,
          :openssl_verify_mode => OpenSSL::SSL::VERIFY_NONE,
          :enable_starttls_auto => true }

body=""
body=body+"本文です。\n"
body=body+"2行目\n"
body=body+"3行目\n"

mail=Mail.new

mail.from="送信元（googleアカウントのやつ）のメアド"
mail.to="送信したいメアド"
mail.cc=""
mail.bcc=""
mail.subject="適当"
mail.body=body
mail.date=Time.now
mail.charset="utf-8"
mail.delivery_method(:smtp,options)

mail.deliver
```

実行してみます。

```
$ bundle exec ruby mailtest.rb
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508595/254d9ab5-fda0-cd31-68c6-60deb1879585.png)

メールが送れてました。
【今日の学びメモ】CSR に対する SSR の利点

# CSR とは
**クライアントサイドレンダリング**の略。
ブラウザ上でウェブページのレンダリングを行うこと。

# SSR とは
**サーバーサイドレンダリング**の略。
通常ブラウザで生成される html をサーバー側で用意し、クライアントに返す機能のこと。
かつて js はブラウザ上でしか動かせなかったが、Node.js によりサーバ上でも動作することが可能になったため普及した。

# 使い分け
閲覧しているユーザによって表示する内容が異なる場合（マイページやレコメンドなど）、CSR が適しているらしい。

# 利点

- 画面描画までの時間が短い
- キャッシュを活用してレンダリング時間が短縮できる
- 完全な html を返すため、SEO の質が良い（Google クローラが js を認識しなかったことが理由、今は改善されている）


インターン先で SSR について簡単に聞く機会があったのでメモ。
数式処理と量子力学

#数式処理と量子力学について
この記事では数式処理と量子力学の関わりについて学んだことをまとめる。
###参考文献
最近面白そうなモノグラフを見つけたので、研究室で購入してもらった。自主ゼミの前に学んだことをまとめていこうと考えている。
![22C01B8D-67F2-46AD-98A1-3C4DA91652FB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1774640/95d72594-e2b1-a92b-13e8-6f3f61a83bb0.jpeg)
通常、学部の講義で量子力学は線形代数に基づいて構成されている。しかし、この本では代数幾何学を用いて量子力学を築いていこうとするユニークな試みが示されえいる。内容は、まず、抽象的なところから。最後に第一原理的量子化学計算の実例が示されている。
中身に関しては、私の学習の進展に応じて少しずつ概要を掻い摘んで行こうと思う。
#感想
最近、量子コンピューターの絡みで、量子力学が、学部で教えてもらう標準的なもの、前世紀的なスタイルとはとは、かなり趣を異にするものであることが明らかになってきた。この本も、最近の数学の発展を背景にして、古いスタイルの量子力学を書き換えようとする試みなのだろう。ことによると、ヨルダン、ボルンの提示した行列力学とは、また別個の量子論が立ちあがろうとする様を私たちは目撃しているのかもしれない。
もし、この本をいっしょに読んでみたいと思う方は、ぜひコメントをください。

#第一回報告予稿
本の各章でどんなことが書いてあるか。
数式処理とは。
数式処理の背景。多項式環。イデアル理論。
ブッフバーガーアルゴリズム。グレブナ基底。
これが何故量子力学と関連してくるか。

個人的な意見。もし、数式処理が流行りの、もしくは今回登場予定の量子コンピューターで実行できるようになれば、この本で解説されている代数幾何学的量子化学は巨大な革命となるのかも。研究室の前回のゼミで招待公演の某先生から量子コンピューターを用いた量子化学について学んだ。でも、それは単に、、伝統的な方法を超高速実行する可能性があると言うことである。一方で、この本で提示された代数幾何学を用いた新しい量子力学の方法であれば、順問題と逆問題の統一的計算、電子原子核系の同時最適化(超カーパラネロ法)、あらゆる配位の同時探索、など様々の問題向かって、「ポストモダン」的展開が拓かれるのかも。私の修士のテーマはいまはマテリアルズインフォマティクスだか、博士論文のテーマは、こっちに切り替えてみるのも面白いか。
Pandasの日付と時刻

## 日付と時刻データの読込み

ファイル読込み時または読込み後に、文字列を日付・時刻に変換することができます。

ファイル読込み時

```python
df = pd.read_csv('test.csv', parse_dates=['Start Date', 'End Date'])
```

ファイル読込み後

```python
df['Start Date'] = pd.to_datetime(df['Start Date'], format='%Y-%m-%d %H:%M:%S')
```
## 日付と時刻データのサマライズ

日付と時刻でグループ化し、サマライズを行うにはpandasのresampleメソッドを使用します。

月でグルーピング

```python
df.resample('M', on='Start Date')['Summarize Target'].mean()
```

出力：

```text
Start Date
2020-10-31 1886.453704
2020-11-30 854.174757
2020-12-31 635.101266
Freq: M, Name: Summarize Target, dtype: float64
```

日でグルーピングとプロット

```python
df.resample('D', on='Start Date')['Summarize Target'].mean().plot
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260307/fe7ab452-b643-d41f-1fe0-9ef73f44d27b.png)

## タイムゾーン

タイムゾーンを設定するには、tz_localizeを使用します。

```python
print(df['Start Date'].iloc[0])

df['Start Date'] = df['Start Date'].dt.tz_localize('America/New_York', ambiguous='NaT')

print(df['Start Date'].iloc[0])
```

出力：

```text
2020-10-01 15:23:25
2020-10-01 15:23:25-04:00
```

設定済みのタイムゾーンを切り替えるには、tz_convertを使用します。

```python
print(df['Start Date'].iloc[0])

df['Start Date'] = df['Start Date'].dt.tz_convert('Europe/London')

print(df['Start Date'].iloc[0])
```

出力：

```text
2020-10-01 15:23:25-04:00
2020-10-01 20:23:25+01:00
```
初心者がPHPの開発で注意すること

個人的に役に立った記事をまとめメモ
各記事の執筆者様本当にありがとうございます…！
# 開発の前に読むとはかどる記事
by @mpyw 様

https://qiita.com/mpyw/items/b00b72c5c95aac573b71

https://qiita.com/mpyw/items/2f9955db1c02eeef43ea

by @7968 様

https://qiita.com/7968/items/6f089fec8dde676abb5b

#注意することポイント(初心者)
### ビューとロジックは分けて実装する
間違い↓

```
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Example</title>
    </head>
    <body>
        <ul>
<?php

try {

    $pdo = new PDO('mysql: ... ', 'root', 'password', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
    $stmt = $pdo->query('SELECT * FROM users');
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo '<li>' . htmlspecialchars($row['name']) . '</li>';
    }

} catch (PDOException $e) {

    exit($e->getMessage());    

}

?>
        </ul>
    </body>
</html>
```

正しい↓

```
<?php

try {

    $pdo = new PDO('mysql: ... ', 'root', 'password', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
    $rows = $pdo->query('SELECT * FROM users')->fetchAll(PDO::FETCH_ASSOC);

} catch (PDOException $e) {

    exit($e->getMessage());    

}

function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Example</title>
    </head>
    <body>
        <ul>
<?php foreach ($rows as $row): ?>
            <li><?=h($row)?></li>
<?php endforeach; ?>
        </ul>
    </body>
</html>
```

### $_POST['id'] などの外部入力からきた変数が定義されているか確認
変数が 未定義でない かつ NULLでない かつ 配列でないか チェック

```
if (!isset($_POST['email']) || !is_string($_POST['email']) || $_POST['email'] === '') {
    $errors[] = 'Eメールアドレスが入力されていません';
}
```
C++でエラって詰んだ時の備忘録

2時間ぐらい理由不明で詰んでた時の対処法を載せるだけの備忘録

# 定義してあるはずのものが未定義とエラーが出る
``` C++:例
class hoge{
    int a;

public:
    void fuge(){
        a = 5; //aは未定義
    }
}
```

## 解決策

・VSの再起動
・ビルドではなくリビルドをする

これで治らなければほかのを試す

# 静的アサーションに失敗 and 関係なさそうなエラーいっぱい
```C++:a.h
#include "b.h"

class a{
    b* pb;

     /*省略*/
}
```

```C++:b.h
#include "a.h"

class b{
    a* pa;

    /*省略*/
}
```

## 解決策
ヘッダー同士でincludeしあっているのが原因なので、片方includeを外してクラスの宣言だけ書いておく。

```C++:a.h
#include "b.h"

class a{
    b* pb;

     /*省略*/
}
```

```C++:b.h
class a;

class b{
    a* pa;

    /*省略*/
}
```

そもそも設計がよくない可能性もあるけどここでは触れないです
# オブジェクトにメンバ関数と互換性のない型修飾子があります
```c++
class abc {
    int a;
    void fuga() {
        //なんか
    }
    void hoge() const {
        fuga();
        a = 0;
    }
}
```
##解決策
`hoge`は`const`なので関数内で、`const`ではない関数呼び出しや変数の変更は不可
`std::vector::at`とかの`const`ありなしでオーバーロードされてる関数は、`const`ありしか呼べない。`push_back`などはそもそもintelisenseにも表示されないのでそこで頑張って気づけ自分。

```c++
class abc{
    int a;
    void fuga() {
        //なんか
    }
    void hoge() {
        fuga();
        a = 0;
    }
}
```

# 最後に
思い出したり、出くわしたら追記する
正しい言葉ではなかったりするかもしれませんが自分がわかればおｋなのです。
間違ってたりしたら教えてください。
[Ruby on rails] 新着順に指定件数のみ表示　ランキング

<h2>やりたいこと</h2>
新着の４件のみを表示させたい

![スクリーンショット 2021-07-17 21.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/6a54400d-5c09-edea-35c6-6761477a7e87.png)


<h2>コード</h2>

```
  def top
    @items = Item.order('id DESC').limit(4)
    # ASCだと古い順でDESCで新着順です。
  end

```

limit()に表示したい件数を記述すれば完成です。


以下のサイトを参考にすれば、いいねランキングとかもできそうです

https://qiita.com/hitochan/items/258215ec62ead338c2eb
Local - WordPressローカル環境のSSL化

#まえがき
前回投稿したLocalシリーズ（🔗 [わたしのQiita](https://qiita.com/figgy-pudding/items/8a4b2db4ed98d286e447)）の、
WordPressのローカル環境のSSL化についてでございます。
Localの公式ドキュメントを見ながらSSL化しました。
ローカル環境でSSL化することで、本番環境への移行がスムーズにできるのですね。
HTTPからHTPPSに置き換えるプラグイン（Better Search Replace）もあるのですが、
勉強のために使用せず、今回はターミナルを用いてSSL化に挑戦します。
これでレオリオとクラピカに会うことができました。船長さんに認めてもらいましょう。

#動作環境
・MacBook Air (Retina, 13-inch, 2020)
・Big Sur 11.4
・ターミナルシェル：zsh
・Google Chrome：91.0.4472.114

#前提
Mac BigSurであること。
∟ Big Sur以前はSSL証明書をワンクリックでできます。

#方法
（1）Localで証明書を作成します
LocalでSSL化したいサイトのSSLセクションの横にある <font color="green">TRUST</font> をクリック
![local0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/84eceb5e-7f17-11b3-446a-6fdcd85ae962.png)
（2）Macアプリケーションの「キーチェーン」を開きます
パスワードやsshキーだけでなく、SSL証明書なども含まれるとのことで、
いかに重要なアプリケーションかが分かります。覗き込まれたら話になんない。
🔍 SSL化したいサイト名を検索 -> <font color="blue">＞ 信頼</font> をクリック
![local1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/0b736abf-b8dd-9ed2-1a3c-75ef3cff3655.png)
（3）この証明書を使用するとき：<font color="blue">常に信頼</font> に変更します
![local2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/a20abd71-f1ba-904c-5c7e-f3a5ed631ea9.png)
（4）証明書が機能しているかを確認します
再度Localを開き、OPEN SITEをクリック
-> アドレスバーのhttp://からhttps://に書き換えてEnter
-> 鍵マークが付いたhttpsサイトが表示されるか確認
![local3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/1280e5dd-aee2-ca75-765b-ac913f18da15.png)
（5）ローカルサイトのデータベース内のURLを更新します
前述通りターミナルで更新します。プラグイン希望の方はこちらを参考にしてみてください。
🔗 [WordPressサイトをSSL化！httpからhttpsに変更するお手軽３ステップ](https://yumegori.com/htp_htps_change20190326)
SSL化したいサイト名を右クリック -> Open Site Shell をクリック
![local5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/d97f2203-86c8-167c-f3bd-4f568e985b5f.png)
（6）ターミナルが開かれるので、

```zsh
wp search-replace 'http://あなたのSSL化したいアドレス.local' 'https://あなたのSSL化したいサイトのアドレス.local'
```

と入力します。
例）

```zsh
wp search-replace 'http://phptest.local' 'https://phptestlocal'
```

```zsh
/Users/watashi/Library/Application\ Support/Local/ssh-entry/RgkikxVMm.sh ; exit;  
watashi@figgy ~ % /Users/watashi/Library/Application\ Support/Local/ssh-entry/RgkikxVMm.sh ; exit;
-n -e 
Setting Local environment variables...
----
WP-CLI:   WP-CLI 2.5.0-alpha
Composer: 1.10.8 2020-06-24
PHP:      7.4.1
MySQL:    mysql  Ver 14.14 Distrib 5.7.28, for macos10.14 (x86_64) using  EditLine wrapper
----
Launching shell: /bin/zsh ...
watashi@figgy public % wp search-replace 'http://あなたのSSL化したいアドレス.local' 'https://あなたのSSL化したいサイトのアドレス.local'
```

（7）Success!と表示されれば完了です！
![local6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1588933/31fff82e-c397-b7ed-3b3e-fbfafc0fb89b.png)
たまたまなのか、すぐには反映されず数時間はかかったと思われます。
前日の夜に行い、次の日の朝にOPEN SITEをクリックするとSSL化されていました。

#あとがき
なにかのエラーや、一難去ってまた一難を経験すると、
わたしたちが普段見ているホームページを作成する・継続することは
苦労や厳しさを痛感しますが、達成できた時の喜びはそれに勝るなぁと感じます。
自分でもまえがきの段階の踏み方は細かすぎるやろ！と思いますが、
これくらいの方が楽しいかなと。。いつハンター試験をクリアできるか楽しみです。

お読みいただき、ありがとうございました。

#参考
https://localwp.com/help-docs/ssl/managing-local-sites-ssl-certificate-in-macos/
[Ruby on rails]kaminariでページネーション　ページ毎の表示件数を変える

<h2>やりたいこと</h2>
ページネーションの追加。
ページによって表示する件数を変えたい。
(ユーザー一覧は１ページ最大１０件までで、投稿一覧は１５件まで等）

![スクリーンショット 2021-07-17 21.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/5fd46c18-9e4c-fda4-e0d1-28dfb61985ff.png)


<h2>kaminari　インストールの説明
</h2>


その一、 　gemfileに以下追記。```gem 'kaminari','~> 1.2.1'```

その二、　```bundle install```

その三、　```rails g kaminari:config```でkaminariの設定ファイルを作成します。

その四、　```rails g kaminari:views default```

ページあたりで表示させる件数は、```config/initializers/kaminari_config.rb```で変更可能です。
（デフォルトは２５件になってますので、変えなくても良いと思います。）

その五　　indexアクションで、```　@items=Item.all```としているところを、
```@items = Item.page(params[:page]).reverse_order```とする。

その六　　indexのviewページの最後とかに、<%= paginate @items %>と追記してあげると完成です。

<h2>ページ毎の表示件数を変えたい場合</h2>

per()に表示件数を入れれば完成です！！！！

```
  def index
    @items=Item.page(params[:page]).per(8)
  end 
```

```
@items=Item.page(params[:page]).per(10)
```
[Unity]ノードベーステクスチャ生成ツールMixtureの導入と画像の出力をやってみた

## Mixtureとは

ノードベースでいい感じにテクスチャを生成できるツール。
オープンソース、MITライセンス
ShaderGraph風味のUI、Unityで動作する。

https://github.com/alelievr/Mixture

## 導入
記事が古くなっている可能性があるためGithubのInstallation項目を見たほうが確実

https://github.com/alelievr/Mixture#installation

### 実行環境
Unity2020.3.8f1　(執筆時点ではUnity 2020.2beta以上が必要)

###インストール
1.Unityプロジェクトを作成
2.Edit->Project Settings->Package Manager で以下を入力
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/44f797cf-c845-9858-ad2b-6b398666dcde.jpeg)

```
Name:     Open UPM
URL:      https://package.openupm.com
Scope(s): com.alelievr
```

3.同じ場所のAdvanced Settings項目のEnable Preview Packagesにチェックをいれる。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/6a277a2d-3582-2ea4-d445-61e089cbc5c0.png)

4.Window->PackageManagerで PackageManagerウィンドウを開き、左上のドロップダウンを”Packages:My Registries”にするとMixture項目があるのでインストールする。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/6bbcbc00-64f8-b1a5-c819-21ef40f92266.png)

## 使ってみる
Projectタブ内で右クリックしていい感じにStaticMixtureGraphを作ります
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/04026485-c87e-b61f-d579-7c10c9935582.png)

作成したStaticMixtureGraphをダブルクリックするとノードエディタウィンドウが開くので右クリックとかでいい感じにテクスチャを作ってSaveAllを押しましょう。これでTexture2Dとして扱われるテクスチャが作成されました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/5a3c9be8-683c-c923-0b48-ccc101fc719c.png)

## 作ったテクスチャを出力する。
StaticMixtureGraphはasset形式で保存されており、外部へ持ち出すことができません。StaticMixtureGraphはTexture2Dとして扱われるので画像を出力するスクリプトを書いてもいいのですが、面倒くさいので書かない方法で出力します。

RealtimeMixtureGraphを作ります
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/f746919d-d505-7b64-cc20-6988530c62cb.png)

ダブルクリックでRealtimeMixtureGraphエディタ内にはいり、OutputTextureAssetノード以外のノードを削除し、以前に作成したStaticMixtureGraphのノードをコピペしてウィンドウを閉じます
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/1ecb345d-8792-2539-8314-82aba522c803.png)
インスペクタからRealtimeMixtureGraphを選択して右上のメニューからエクスポートを選択するとexr形式でテクスチャをエクスポートできます。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440297/a981eca9-ce07-7b70-1ce0-e148cf88d452.png)

### 余談
・何故RealtimeMixtureGraphならExportできるのか
StaticMixtureGraphはTexture2D扱いでRealtimeMixtureGraphはCustomRenderTexture扱い。CustomRenderTextureにはExport機能があるから

・全部RealtimeMixtureGraphで作ればいいんじゃね？
RealtimeMixtureGraphは常に実行されていてRealtimeMixtureGraphを大量に作ってみたらGPUがゴリゴリ使われて重くなったからノード情報をStaticMixtureGraphで持っています。私のよわよわPCだとかなり重かったけどつよつよPC環境なら全部RealtimeMixtureGraphでもいいかもしれないですね。

## おわりに
Mixtureを使っているとエラーとか警告とかが結構出てくるので実際のプロジェクトに導入しにくいのですが、テクスチャ生成だけを担当するプロジェクトにわけるといい感じに使えるんじゃないかなぁと思いました。

自作のシェーダーノードとか作れるみたいなので色々応用が利きそう。
Rails tutorial 2週目の手引き (Docker-compose ,vscode , RSpec, heroku, circleCI)

# 想定する読者
Ruby on Railsの初学者で、Railsチュートリアルの次に何をしようかと悩んでいる方
(Railsチュートリアルをベースに開発現場で使われている技術を取り入れた学習をしたい方)。


### （参考情報）私の学習計画と現状について
私は、現在ある事情から離職をし、
未経験からWEBエンジニアになるべく独学をしています。

学習ロードマップは以下の通りです

#### これまでの経過　※現在独学から4か月経過
・HMTL / CSS / Javascriptをprogateとドットインストールで学習
・基本情報技術者試験に無事合格
・jQuery / git / command line / sassをprogateで学習
・いくつかの静的サイト(モーダルやハンバーガーメニュー含む)の作成
・Ruby / Railsをprogateで学習
・Railsチュートリアル(cloud9環境で)を1週。

#### これからの予定
・Railsチュートリアルをもう1週。　(←本記事はここです！)
・reactの学習
・Tech PitでRails + Reactのアプリ作成
・オリジナルアプリ作成

※学習ロードマップをつくるために参考にした記事
・https://qiita.com/ddpmntcpbr/items/739dbb992b5ffac3fc2f
・https://qiita.com/halhal23/items/073913754cd7f7d9352d
・https://qiita.com/aki0151/items/f39ef43c9d9fc1b87d9a


#環境

Railsチュートリアルの2週目として、
Railsチュートリアル第6版( https://railstutorial.jp/chapters/beginning?version=6.0 )に
いくつかの技術要素を追加していきます。
最終的な環境は以下の通りです。

##### エディタ：vscode
 => cloud9の代わりに。
##### バックエンド：ruby 2.7.4 , rails 6.1.4
##### 開発環境：Docker (docker engine 20.10.7), Docker-compose
 => cloud9の代わりに。比較的簡単に環境構築ができ、本番環境との差異が少なくなりやすい。
##### テストツール：RSpec 3.10 (rspec-rails 5.0.1)
 => Minitestの代わりに
##### CI/CDツール：circleCI 2.1 
 => gitと連携し、テストとデプロイを半自動化。
##### デプロイ先：Heroku
 => ※本当はAWSにデプロイしたいのですが、技術的ハードルを下げるため、今回はherokuに。



# 手順
主に、以下の2つをベースに、学習していきます。
####　(1)Railsチュートリアル
基本はこちらの第６版（最新版）

https://railstutorial.jp/chapters/beginning?version=6.0

第６版はMinitestを用いているので、TESTに関する部分だけは第2版を参照

https://railstutorial.jp/chapters/beginning?version=4.0


　　
####　(2)動画：Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース（山浦清透さん）
https://www.youtube.com/watch?v=lZD1MIHwMBY&t=1829s

本動画はいくつかのチャプターに分かれていますので、
以下手順詳細では、該当チャプターを併記します。

　　
## ①rails newまで
参考：Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース（山浦清透さん）
チャプターは
[冒頭] ～ [Docker composeでrailsを構築しよう （https://www.youtube.com/watch?v=ltDdZAJli8c&t=0s) ]まで

知識ゼロのDocker初心者でもなんとかなります。
git,WSL,doxkerなどの環境構築から、Docker-composeの設定までこちらで進めます。


## ②RSpecのインストール
参考：railsチュートリアル第２版　３章１節
https://railstutorial.jp/chapters/static-pages?version=4.0#sec-static_pages

補足資料(qiita)
・https://qiita.com/tatsurou313/items/c923338d2e3c07dfd9ee
・https://qiita.com/yongjugithub/items/3cfcfafa494e085c9cf1
・gem 'rspec-rails'のbundle installや rails g rspec:installで詰まったら？
=> spring stopするとよい。(https://teratail.com/questions/278260)


## ③dockerとherokuの接続
参考：Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース（山浦清透さん）
チャプターは
[本番環境に公開しよう　https://www.youtube.com/watch?v=uQf9968RWWo&t=0s ]


## ④一度Rails Tutorialを進める
参考：railsチュートリアル第６版　３章１節～３章５節
https://railstutorial.jp/chapters/static_pages?version=6.0#cha-static_pages

テストのためにいくつかview fileを作っておきたい。
Static_pagesを作るところまで進める。

また、テストの記述に関しては第２版を参照。
https://railstutorial.jp/chapters/static-pages?version=4.0#sec-static_pages



## ⑤circleCIによるCI/CDの構築
参考：Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース（山浦清透さん）
チャプターは
[ CI/CDを構築しよう　https://www.youtube.com/watch?v=bmXoupfX_r0&t=0s ]


# 最後に
山浦清透さんの動画とrailsチュートリアルを参考にすれば、
ほとんど詰まらずに進めることができました。
（私の場合、ケアレスミスで何ヶ所か詰まりましたが…。）

私と同じ境遇の初学者の方の参考となれば幸いです。
Laravelに初めからある変数やメソッドには、むやみに型定義しない方が良い

## どういうことか

（PHPStormの型補完機能を使って型宣言をしたら、地味にエラーにハマったのでメモです。）

Laravelプロジェクトをインストールしたら、初めから様々なClassが作成されていると思います。
例えば、
`Http/Middleware/EncryptCookies.php`
というClassが既に存在していたりするのですが、このClassでは
`$except`という変数が定義されています。

```EncryptCookies.php
<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        // 
    ];
}
```

PHPStormのような補完機能のあるエディタを使っていたら、
「`$except`に型宣言がされてませんよ！」と警告されてしまうことがあって少々鬱陶しいので、
つい補完機能を使って`array`の型宣言をつけてしまったことがありました。
しかし、これがエラーを招く原因に。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/4f458f32-b720-e324-9140-612f52b02bb5.png)

補完機能で、ついarrayの型宣言をしてしまった↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/4436836e-2b22-f5c3-cb75-70fc26f6c524.png)

## 何が起きたか

変数`$except`に、arrayの型宣言をつけたことで、実は見えないところでも変化が起きていました。

クラス`EncryptCookies.php`は、
`Illuminate\Cookie\Middleware\EncryptCookies` を継承しているのですが、
この継承元のクラスの方にも`$except`という変数が定義されています。

つまり、`$except`はオーバーライドされていたわけなのですが、オーバーライドしている方の
`$except`にPHPStormの補完機能でarrayの型宣言をつけてしまった結果、
なんと継承元(親)の`$except`の方にもarrayの型宣言がされてしまっていたことがわかりました。😓

継承元の、`Illuminate\Cookie\Middleware\EncryptCookies`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/613b29ed-69a8-f211-9655-adea979cf3cf.png)

継承元の`Illuminate\Cookie\Middleware\EncryptCookies`の方は、
vendor配下でgitの管理外でもあるから変化に気付きにくい。。。

ローカルで動かしている分には、問題なくアプリも動作するのですが、問題はサーバー等にデプロイした時です。

### 500エラーが発生
プライベートで開発しているアプリをAWSにデプロイしたらエラーが。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613419/80dff54d-98aa-8b97-f8cf-f9145037c43c.png)


エラーログを見てみると。。

```
 local.ERROR: Type of App\Http\Middleware\EncryptCookies::$except must not be defined (as in class Illuminate\Cookie\Middleware\EncryptCookies) {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 64): Type of App\\Http\\Middleware\\EncryptCookies::$except must not be defined (as in class Illuminate\\Cookie\\Middleware\\EncryptCookies) at /var/www/html/laravel/app/Http/Middleware/EncryptCookies.php:7)
[stacktrace]
#0 {main}
```

どうやら、
`Http/Middleware/EncryptCookies.php`の変数`$except`(オーバーライドしてる方)に、
arrayの型宣言をするな！と怒られているようです。

**原因：**
サーバー側の方では、`Http/Middleware/EncryptCookies.php`が継承している、
親の`Illuminate\Cookie\Middleware\EncryptCookies`(vendor配下)の中に定義されている
`$except`にはarrayの型宣言なんてされていないので、
オーバーライドした方の`$except`で型宣言したらエラーが発生してしまっていました。😇
→ gitの管理外のClassなので、ローカルの方で書き換えられててもサーバー側には反映されませんよね..

## 結論
Laravelに初めからある変数やメソッドは、オーバーライドされているものの可能性があるので
むやみに型宣言しない方が良い😇
VxWorksをRaspberryPi3で起動する

# WindRiverが提供しているVxWorks 7 SDK for Raspberry Pi 
VxWorksはNASAが航空宇宙分野でも使用する信頼性の高いリアルタイムOSです。
気軽にに使用できるよう、WindRiver社提供のSDKを利用してRaspberryPi3上でVxWorksを起動してみました。
しかし下記リンクのページ（WindRiver社）の方法ではうまくいかない部分もあったため、情報を共有しておきます。

[VxWorks 7 SDK for Raspberry Pi 3](https://labs.windriver.com/downloads/wrsdk-vxworks7-docs/README-raspberrypi3b.html)
[VxWorks 7 SDK for Raspberry Pi 4](https://labs.windriver.com/downloads/wrsdk-vxworks7-docs/README-raspberrypi4b.html)

上記ページではわかりづらい部分、実際とパスが異なる部分などを記載しておきます。
上記ページも確認しながら、下記手順にて進めてみてください。

##VxWorks起動用SDカード作成手順
以下の手順でVxWorks起動用SDカードを作成します。
1.SDカードをFAT32でフォーマット
　Linux OSにおいてコマンド実行するか、I/O DATAが提供しているツールなどを利用します

2.RaspberryPiのファームウェアをSDカードに書き込む
　入手元：https://github.com/raspberrypi/firmware/archive/1.20200212.tar.gz
　コピー元：上記ファイル解凍後のbootフォルダ内のファイルすべて
　コピー先：SDカード直下

3.u-bootをビルド
　以下はUBUNTUを利用する場合のコマンド例です。
`$ sudo apt install gcc-aarch64-linux-gnu
$ git clone https://gitlab.denx.de/u-boot/u-boot.git $ cd u-boot $ CROSS_COMPILE=aarch64-linux-gnu- make rpi_3_defconfig $ CROSS_COMPILE=aarch64-linux-gnu- make
`

4.「3.」で作成したu-boot.binをkernel8.imgに変更してSDカード直下に上書き

5.VxWorksカーネルイメージをSDカード直下のvxフォルダ内にコピー
　１）SDカード直下にvxフォルダを作成
　２）「VxWorks 7 SDK for Raspberry Pi3」のuVxWorksを1)で作成したフォルダ内にコピー
　コピー元："VxWorks SDK for Raspberry Pi 3\wrsdk-vxworks7-raspberrypi3b\vxsdk\bsps\rpi_3_0_1_1_2\uVxWorks"

ポイントは以下のとおりです。
・「3.」でビルドしたu-boot.binはkernel8.imgに置き換えること
・github上にある「rpi_3-0.1.1.0」用のブートローダーは使用しないこと（バージョンが異なる）

## VxWorks起動手順
起動手順については冒頭にリンクを張った「VxWorks 7 SDK for Raspberry Pi 3」のページを参照ください。
ここでは大まかな流れと注意する点を記載しておきます。

流れ：
1.SDカードをRaspberryPi3に装着
2.シリアル（USB-シリアル変換(UART))でホストPCとRaspberryPi3を接続
　注意：TXにRX、RXにTXを接続する（テレコにする）ことに注意
3.RaspberryPi3の電源をON　
4.ターミナルソフト（Windowsの場合はTera Termなど）でVxWorksシェルが起動することを確認

LANに接続していればTELNETでシェルを操作することも可能です。
![スクリーンショット 2021-07-17 211556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/372725/fddceeb5-1661-ba76-7233-260e6860be8b.png)


##最後に
多忙なためメモ書き程度になってしまい申し訳ございません。
余裕があれば画像を載せたり、この先のVxWorks利用方法なども載せて充実化します。
ブレイン・コンピューター・インターフェース(BCI) 思考を文字列で出力することに成功したFacebook

Every Qiita #15
のんびり独学初学者の毎日投稿チャレンジ 15日目
今回は・・・
備忘録ではありませんが、思考を文字に変換するというSFのようなことが現実に・・・驚嘆したので書いてみました。

##ブレイン・コンピューター・インターフェース(BCI) 
今回の現実には考えられないような技術はFacebookの研究組織「Facebook Reality Labs」とカリフォルニア大学の研究チームが共同開発したものになります。

[![](https://img.youtube.com/vi/_GMcf1fXdW8/0.jpg)](https://www.youtube.com/watch?v=_GMcf1fXdW8)
[“Neuroprosthesis” Restores Words to Man with Paralysis - YouTube]

**1. 脳インプラントと呼ばれる電気信号を処理するチップを運動性言語中枢〔ブローカ中枢〕前頭葉部分に埋め込む
2. 脳インプラントから送られた信号を脳信号処理
3. 発話検知
4. 単語分類
5. 言語モデリング**

上記の流れでコンピュータ処理を行い画面に出力されます。

実際に検証した結果、1分間15単語を出力した場合、74%（中央値）の精度で出力できたとのこと。1分間に100単語出力することが可能みたいです・・・

世界のIT技術の進歩は本当に早すぎて形容し難い感情になります:fearful:
今まではへえーすごいな。で終わっていましたが、ITの世界に興味を持ってからどんな技術でどのように処理されているのか、背景が知りたくなる思考になってしまいました:joy:

##参考記事

https://www.youtube.com/watch?v=_GMcf1fXdW8
備忘録　テクニカルライティング 簡潔に書く

この記事はこちらのページを引用し、個人的なメモとして残しています

> [upwite blog](https://upwrite.jp/writing_professionals/prow8346224798)

# 簡潔に書く
## 同音反復は避ける
同じ意味の言葉は繰り返さずに、不要な言葉を省く
例文
20杪の期間->20杪
予め予測する->予測する
未だ未解決->未解決

## 動詞の名詞化は避ける
動詞を無理に名刺に変えて使うことがない様にする
例文
行動する->行う
可能です->できます
充填する->うめる
陳述する->述べる

## 不要な語句を消す
なくても意味が通じる語句を省きます
例文
初回のケースに関しましては->初回のケースは

## 曖昧な表現をなくす
文末や文章中の曖昧な表現を避けます
例文

文末の曖昧さを修正する
タイトルの修正が効果的と思われます
タイトルの修正が効果的です

説明の曖昧さを修正する
B製品の方が少し長い
B製品方が5cm長い

とりたて助詞や「など」で曖昧さを出さない
恒星には太陽などがあります
恒星には太陽やベテルギウスやシリウスなどがあります

## 不要な強調語を削除する
例文
極めてユニークな->ユニークな
非常に重要な->重要な
[Ruby on rails]フラッシュメッセージ&エラーメッセージ　Bootstrap バリデーション

<h2>やりたいこと</h2>
①投稿完了後の成功メッセージ（フラッシュメッセージ）

![スクリーンショット 2021-07-17 20.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/d4bf36df-a792-1b34-f05a-71585556443c.png)


②投稿ができなかった時のエラーメッセージ
![スクリーンショット 2021-07-17 17.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/3e2cade9-67ab-2fc0-22cf-2abfa5b4a06f.png)


<h2>フラッシュメッセージの実装</h2>

```
def create
    @item=Item.new(item_params)
    if @item.save
    redirect_to admin_item_path(@item), notice:"登録完了しました！"
    else
    render :new
    end
  end

  def update
    @item=Item.find(params[:id])
    if @item.update(item_params)
    redirect_to admin_item_path(@item),notice:"更新完了しました！"
    else
    render:edit
    end
  end

```


<h5>メッセージを表示させたいviewファイルの記述</h5>
シンプルに<%= notice %>だけでもいけます。

```perl:show.html.erb
<% if flash[:notice] %>
 <div class="alert alert-success" role="alert">
 <p class="notice text-center" style="color:green;"><%= flash[:notice] %></p></div>
<% end %>
```

https://pikawaka.com/rails/flash

https://webnetamemo.com/coding/bootstrap3/201702264279

<h2>エラーメッセージ実装</h2>

まずバリデーションを記述します。
ここで、引っかかればfalse　何もなければtrueが返って来ます。
<h6>バリデーションだけ書くだけだと、エラーメッセージは表示されませんので注意</h6>

```
    validates :name,:introduction,:price,presence:true
    validates :introduction, length: {maximum: 250}
    validates :price, numericality: { only_integer: true }
```

上記のコードで、下記３つの項目を記述しています。

item(商品）の登録時、商品名、商品紹介、価格の空欄投稿をNGに。
商品紹介(introduction)の長さを250字までに。
商品価格(price)は数値（半角)であること！
（もし、全角で１０００とか打つと、「Price is not a number」と弾かれます。）

<h4>以下参考にさせていただきました</h4>

https://qiita.com/suzy1031/items/c3220a3749aec48d3d43


https://qiita.com/h1kita/items/772b81a1cc066e67930e


<h3>エラーメッセージを表示させる</h3>

投稿機能、編集機能が複数ある場合には、こんな感じで部分テンプレートにすると楽です。

```
<%= render 'layouts/errors', obj: @item %>
```

部分テンプレートにしない場合、```obj```のobjには@itemなり@bookなり渡してください。
objはオブジェクトです。

```perl:layouts/_errors.html.erb
<% if obj.errors.any? %>
  <div class="alert alert-danger" role="alert">
  <div id="error_explanation">
    <h3><%= pluralize(obj.errors.count, "error") %> prohibited this obj from being saved:</h3>
    <ul>
      <% obj.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
  </div>
<% end %>
```


<h4>終わり</h4>

<h5>現状でできる日本語化はこれ</h5>

上記のコードの一部を、こんな風に変えて少し日本語にしました。
```<h3><%= pluralize(obj.errors.count, "error") %> 保存されていません</h3>```

![スクリーンショット 2021-07-17 18.03.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/ef315faa-db1b-16b1-64d7-628cfcbace77.png)

エラーメッセージの日本語化はgem入れるとできるようですが、
なんでもかんでも日本語化したくないと思ってしまうところがあります。。
nestjs/swaggerをv3系からv5にアップデートしたらoperationIdが変わってしまった時の対処法

nestjs/swaggerのv5がリリースされたので、v3からアップデートしてみました。
※nestjs/coreはv6⇒v8へのアップデートを一緒にやりました。

# OperationIdが変わった。。。

v3系の時は/api-jsonでアクセスした際のoperationIdはControllerクラスのメソッド名と一致していました。
それが、v5系にアップデートしたところ「Controller名 + メソッド名」となっていました。

その影響でopenapi-generatorで自動生成されるAPIクライアントのメソッド名も変わってしまいました。。。
数本程度のAPIしかないのであればApiOperationでoperationIdを明記すればよいかもしれないですが、数十本以上あるとそうもいきません。


# operationIdFactoryを使う

参考：https://docs.nestjs.com/openapi/introduction#document-options

以下のように、SwaggerDocumentOptionsのoperationIdFactoryでメソッド名だけを返してやることで依然と同じようにoperationIdがメソッド名で出力されるようになります。


```typescript
const options: SwaggerDocumentOptions =  {
  operationIdFactory: (
    controllerKey: string,
    methodKey: string
  ) => methodKey
};
const document = SwaggerModule.createDocument(app, config, options);

```
未経験からCCNA取得までの道のり　ver13

スイッチング周辺めちゃくちゃ難しいからアウトプット！！


#🚩VTP(Virtial Trunking Protocol)
スイッチ間でVLAN情報を同期するためのプロトコル！

・サーバモード
VLAN情報を同期、VLANの作成・削除が可能

・クライアントモード
VLAN情報を同期、VLANの作成・削除は不可能

・トランスペアレントモード
VLAM情報と同期しない、VLANの作成・削除が可能
___

#🚩VLAN情報同期の条件
１,トランクポートによる接続
2,VTPドメイン名の一致
3,VTPモードはサーバorクライアント
4,VTPパスワードの一致
5,VTPバージョンの一致
___


#🚩音声VLAN...IP Phoneとpcのデータを別々のVLANに分離する機能

音声トラフィックとデータトラフィックを論理分解、音声トラフィックを優先処理！

___
#🚩STP・RSTP・MSTP

STP 
規格： IEEE802.1d 　　　インスタンスの数：全体で一つ(CST)
規格：PVST+(cisco独自)　インスタンスの数:VLANごとに一つ(PVST+)
___

RSTP
規格： IEEE802.1w 　　　　　インスタンスの数：全体で一つ(CST)
規格：Rapid PVST+(cisco独自) インスタンスの数:VLANごとに一つ(PVST+)
___
MSTP
規格： IEEE802.1s 　　　インスタンスの数：複数のLANで一つ(MST)
___
※CST(Common Spanning Tree)
※PVST+(Per VLAN Spanning Tree Plus)
※ MST(Multiple Spanning Tree)
___
#🚩BDPU(Bridge Protocol Data Unit)
構内ネットワークで循環防止を防止する「スパニングツリー」で通信制御に用いられるフレーム！
内容情報
・ルートID
・ブリッジID
・パスコスト
・ポートID
・HELLOタイム

STPのポート状態

Disabled(ディセーブル):
管理者によりshutdownされている状態。何も転送されない

Blocking(ブロッキング):
電源投入時のスイッチのポートは全てブロッキング状態・BPDUの受信のみ可

Listening(リスニング):
初期状態のスイッチはBPDUを送信するために他のスイッチと接続しているポートをリスニング状態にする。
リスニング状態までデフォルトで20秒かかる。BPDUの送受信は可能、ユーザデータの送受信は不可。
BPDUの交換により、非指定ポート(NDP)に選出されたポートはリスニング状態からブロッキング状態へ。
MACアドレスが学習しているが、データも送信しない状態。

Leaning(ラーニング):
デフォルトで15秒、ルートポート(RP)または指定ポート(DP)にとどまったポートは、ラーニング状態に移行し、MACアドレスを構築
ユーザデータの受信のみ可、送信は不可。

Forwarding(フォワーディング):
さらにデフォルトで15秒ルートポート(RP)or指定ポート(DP)にとどまったポートは、フォワーディングへ移行。
この状態でようやくユーザのデータを転送するようになる。

___
Amazon RDS Performance Insights の中身見てみる

## RDSの構築

- データベースの作成

![1RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f9f15de0-ae33-030e-b6f2-53752425071b.png)

- データベースの詳細を設定

基本的にはデフォルトで作成。

![2RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f35657cd-9cce-b843-09f2-be21421ea748.png)


`Performance Insights` を設定するには 開発/テスト のテンプレートを使用

![3RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3f9d8cd2-3b1d-dd09-5a06-1801147e2037.png)


`Performance Insights` の設定は追加設定から設定を行う
デフォルトで有効になってました。

![4RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b1728c00-a539-5c52-5f1c-af1c37e46f63.png)


- 作成

作成できました。

![5RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a30ff896-002c-a0cb-14c6-31841fd06d18.png)

- 接続

`mysql -h [エンドポイント] -u [ユーザ] -p` で接続します。

- テストデータ挿入

てきとーなデータを入れました

```
mysql> select * from test.test_user;
+------+------+
| id   | name |
+------+------+
|    1 | Bob  |
|    2 | Aki  |
|    3 | Natu |
|    4 | Mery |
+------+------+
```

## Performance Insights の確認方法

- DBへ移動

RDS > データベース > モニタリングタブ > モニタリングからパフォーマンスインサイト で進みます
進むとタブでパフォーマンスインサイトが開きます。

![6RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/deb94ef6-d2d5-f379-f875-08b4a863b9c2.png)


- カウンターメトリクス

デフォルトで `Innodb_rows_read` が表示されます。

![7RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7c637139-1197-de6e-fc82-66ba578feb7e.png)


`メトリクスを管理する` から、表示されるメトリクスの変更が出来ます。

![8RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/769fb773-0971-41ca-5988-dff608346200.png)


- データベースのロード

待機・SQL・ユーザ・ホスト・データベースで
時系列のグラフと積算のグラフで表示できます。
DBの中身が特にきちんとあるわけではないので、グラフはずっと0でした。

また、SQLやユーザなど詳細を確認することが出来ます。
↑でも書いてますがきちんとあるわけではないので、SQLは出なかったです。
ある程度時間がかかるSQLじゃないと表示されないかもしれないです。

![9RDS Management Console - Google Chrome 2021-07-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/1b4af4a2-501f-4418-7925-2f6c7dd9628e.png)


## 勉強後イメージ

SQLとか見たかったけど、やっぱりちゃんとデータ入れないとだめっぽい....
そこまでするのは大変だったから一旦これで(´・ω・`)
実際に運用するとなると結構SQLとかぱっと見れるからすごい良さそう
PHPでユニークIDを生成する

PHPでユニークなIDを生成するときには、uniqid関数を使うとできます。

## uniqid とは
uniqidは、マイクロ秒単位の現在時刻に基づき、接頭辞なしで一意なIDを取得します。
※ 同じマイクロ秒で同じIDが生成される可能性がある。

## uniqid のメリット
・一意なIDを生成する

## 使い方
### 接頭辞
接頭辞ありとなしで文字列を生成することができます。

```
// 接頭辞なし
uniqid();
```

```
// 接頭辞あり
uniqid("PREFIX_");
```

### 文字列の長さ
第二引数がfalse・なしの場合は、返される文字列が13文字になります。
第二引数がtrueの場合は23文字となります。

```
// 第二引数がFALSE
uniqid("", false);
```

```
// 第二引数がTRUE
uniqid("", true);
```
別docker-composeで立ち上げたDBを参照する

## やりたいこと

* Docker上に構築したec-cubeのDB（mySQL)にこれまた別のDockerで構築したrailsアプリから接続したい
    * railsとec-cubeでそれぞれ別のdocker-composeファイルが存在する
    * どういう設定したらrailsからec-cubeのDBのコンテナが見れるのかわかんない

## 解決した方法

* 別docker-compose 同士のネットワークを繋げる設定をした
    * 具体的にはrailsとec-cubeを同じネットワーク内に所属させ、コンテナ名で参照できるようにした
    * こちら参考にさせていただきました。ありがとうございます・・・・！
        * [別docker-compose同士のネットワークを繋げる方法](https://qiita.com/kai_kou/items/d568fe94ee92f837e274)


## 設定ファイルとか

* railsアプリ側の「docker-compose.yml」と「database.yml」の設定

```
# docker-compose.yml: 「networks」がポイント
version: '3.7'
services:
  app:
    build: .
    command: /bin/bash -c "rm -f /opt/test_api/api/tmp/pids/server.pid && bundle exec rails s -b 0.0.0.0"
    volumes:
      - ".:/app"
    ports:
      - "3000:3000"
    tty: true
    networks:
      - [DBコンテナのネットワーク名]

networks:
  [DBコンテナのネットワーク名]:
    external: true
```

DBコンテナのネットワーク名は以下のコマンドで確認すると◎

```
docker network list

# 「NAME」部分を指定する
NETWORK ID     NAME                DRIVER    SCOPE
xxxxxxxxxxxx   bridge              bridge    local
xxxxxxxxxxxx   sampleapp_backend   bridge    local
xxxxxxxxxxxx   rails_api_default   bridge    local
```

```
# database.yml
# host はDBのコンテナ名を指定する

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: root
  host: mysql_1
  port: 3306

development:
  <<: *default
  database: sampledb

test:
  <<: *default
  database: app_test

production:
  <<: *default
  database: app_production
  username: app
  password: <%= ENV['APP_DATABASE_PASSWORD'] %>
```

コンテナ名は以下のコマンドで確認しましょう◎

```
docker ps

CONTAINER ID   IMAGE               COMMAND                  CREATED             STATUS             PORTS                                            NAMES
xxxxxxxxxxxx   sample_app          "/bin/bash -c 'rm -f…"   18 minutes ago      Up 18 minutes      0.0.0.0:3000->3000/tcp                           sample_app_1
xxxxxxxxxxxx   mysql:5.7           "docker-entrypoint.s…"   About an hour ago   Up About an hour   33060/tcp, 0.0.0.0:13306->3306/tcp               mysql_1
```


ネットワークを共有する、、
確かに言われてみればそうか！だけど、最初全然わかんなかった。。
ec-cubeの設定ファイル、MySQLで立ち上げるときはノーマルdocker-composeとMySQL用docker-composeファイルが分かれてて、中でネットワークの指定して共有してますもんね。
それを応用して考えればよかったのか:rolling_eyes:

応用が効かないのは小学生の頃から変わってないらしい ←
Railsで架空のCafeのHPを作ってみよう!【7日目】『クォーテーションの違い』編

#概要
基本Railsの記法に則り書いていきます！
１から全ての説明ではなく
その中であれ？どうやるの？と
疑問に思った点や実装に困った箇所を
ピックアップして紹介していきます♩

#設定と準備
・Rails
・HTML
・CSS
・Javascript(jQuery)

↑上記の言語とフレームワークを使い
架空(自分で考えたテキトーなもの)のCafeの
HPを作っていこうと思います！

#7日目の作業内容:round_pushpin:
・テーブルの追加とそれに伴うコントローラーの作成

#7日目の気になった箇所:zap:
```index.html.erb
<%= '#{@sample.name}さん' >
```
書き方合ってるはずなのになんで全部文字列判定されるの？？？

#仮説:pushpin:
書き方自体に問題はないので他に問題がある。

#結論:star:
シングルクォーテーションで囲っていたから！
railsで、自分で定義したインスタンス変数などをビューで使う場合

```index.html.erb
<%= "#{@sample.name}さん" >
```
このようにダブルクォーテーションで
囲ってあげなければいけない。
初学者による復習[ロールバックで修正しよう！]

今回はカラムを修正したい時と方法を復習も踏まえ記述していこうと思う。

**そもそもカラムとはなんぞや**
カラムとはデータベースに入っているデータの項目のこと。
例えば名前、メールアドレスなど。

マイグレーションファイルにカラムを記述しターミナルで

```
rails db:migrate
```

のコマンドを実行するとテーブルが作られてしまい記述を削除するだけでは
データベースのデータからは削除できない。

なのでターミナルで

```
rails db:rollback
```

を実行するとデータベースのカラムを削除することができる！
その後、変更したいカラム名を記述し

```
rails db:migrate
```

を再度実行すると新しいカラムに上書きできる。
nRF52でよく使用している乱数生成

# 記事の概要

乱数を利用する方法について自分用のメモです。
詳しい解説はせず、コードのみの掲載になります。
もしも詳細を知りたい方がいるようならば説明させていただきたく、コメント欄にご記入ください。


# ダミー乱数生成

乱数にみせかけたダミーの固定された数字列を生成します。
デバッグ時に生成鍵を固定値にしたい場合に使用します。

```C
int entropy_dummy_source( void *data, unsigned char *output,
                                 size_t len, size_t *olen )
{
    ((void) data);

    memset( output, 0x6a, len );
    *olen = len;

    return( 0 );
}
```

# 乱数生成

```C
#define CACHE_SIZE 32
static uint8_t cache[CACHE_SIZE] = {60};
static size_t cache_idx = 0;
static uint8_t rng_generate_uint8() {
    // Find out whether random data is available in the pool.
    uint8_t available;
    sd_rand_application_bytes_available_get(&available);

    if (available > 0) {
        // Generate a new random number and save it in the cache.
        const ret_code_t result = sd_rand_application_vector_get(cache + cache_idx, 1);
        APP_ERROR_CHECK(result);
    }

    // Return a number from the cache.
    const uint8_t ret = cache[cache_idx];
    cache_idx = (cache_idx + 1) % CACHE_SIZE;
    return ret;
}

static void generate_random(uint8_t *output, uint16_t output_len)
{
    nrf_delay_ms(10);
    for(int i=0;  i<output_len; i++)
    {
        *(output+i) = rng_generate_uint8();
    }
}

int entropy_source( void *data, unsigned char *output,
                                 size_t len, size_t *olen )
{
    ((void) data);

    generate_random(output, len);
    *olen = len;

    return( 0 );
}
```
[Python]StreamlitとPandasを用いたデータ可視化方法 メモ

* Webアプリケーション構築用フレームワークStreamlitとデータ処理用ライブラリpandasを用いたデータ可視化方法についてメモする。

## 事前準備

* `Streamlit`インストール

  ```shell
  pip install streamlit
  ```

* `Pandas`インストール

  ```shell
  pip install pandas
  ```

  

## コード

* 厚生労働省(全国)、NHK(都道府県別)が公開しているコロナウィルス情報を整形し、表・グラフ描画する。
  * 全国情報は、表形式で統計情報(合計、平均、最大、最小)を描画する。
  * 都道府県別情報は、セレクトボックスで選択した都道府県情報を月別で折れ線グラフで描画する。



* `test.py`

```python
import streamlit as st
import datetime
import pandas as pd
from urllib.request import Request, urlopen

# タイトル描画
st.title('COVID-19 Data Visualization')

dt_now = datetime.datetime.now()
st.text('現在日時:' + dt_now.strftime('%Y年%m月%d日 %H:%M:%S'))

# 単日PCR検査陽性者数の集計情報
st.markdown('## PCR 検査陽性者数(単日) 集計情報')
# CSVデータの読み込み
df = pd.read_csv(
    'https://www.mhlw.go.jp/content/pcr_positive_daily.csv', parse_dates=True, index_col=0)
df = df.agg(['sum', 'mean', 'max', 'min'])
df = df.rename(index={'sum': '合計',
                      'mean': '平均',
                      'max': '最大',
                      'min': '最小'})
# テーブル描画
st.table(df)

# 県別感染者情報
st.markdown('## 県別感染者情報')

# 県別感染者データ読み込み
# Pandas.read_csvでは403となったため、urllibを使用する。
req = Request(
    'https://www3.nhk.or.jp/n-data/opendata/coronavirus/nhk_news_covid19_prefectures_daily_data.csv')
req.add_header(
    'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0')
content = urlopen(req)
df = pd.read_csv(
    content, index_col=0, parse_dates=True)

# 都道府県選択セレクトボックス
option = st.selectbox(
    '都道府県',
    ('北海道', '青森県', '岩手県', '宮城県', '秋田県', '山形県', '福島県', '茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県', '新潟県', '富山県', '石川県', '福井県', '山梨県', '長野県', '岐阜県', '静岡県', '愛知県', '三重県', '滋賀県', '京都府', '大阪府', '兵庫県', '奈良県', '和歌山県', '鳥取県', '島根県', '岡山県', '広島県', '山口県', '徳島県', '香川県', '愛媛県', '高知県', '福岡県', '佐賀県', '長崎県', '熊本県', '大分県', '宮崎県', '鹿児島県', '沖縄県'))

# 選択した都道府県データを抽出
df = df[df['都道府県名'] == option]
column_name = '月別感染者数( '+option+' )'
df = df.rename(
    columns={'各地の感染者数_1日ごとの発表数': column_name})
df = df.loc[:, [column_name]]

# 月別合計値を取得
df = df.resample('M').sum()

# 折れ線グラフ描画
st.line_chart(df)

```



### 動作確認

* 起動

```shell
  streamlit run test.py
```

```
    You can now view your Streamlit app in your browser.
  
    Local URL: http://localhost:8501
    Network URL: http://10.4.183.2:8501
```

* アクセス
  * `http://localhost:8501` にアクセス
  * 次のような画面が描画される。
    ![streamlit_colona.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/3f89fbdd-e59c-7cf0-7a71-9e94382289c2.png)




## 参考情報

* [Streamlit - API reference](https://docs.streamlit.io/en/stable/api.html)
* [厚生労働省 -> 新型コロナウイルス感染症について -> オープンデータ](https://www.mhlw.go.jp/stf/covid-19/open-data.html)
* [新たに確認された感染者数（NHKまとめ）](https://www3.nhk.or.jp/news/special/coronavirus/data/)
Node.js実行中に「JavaScript heap out of memory」が発生する

# tl:dr
 NODE_OPTIONSの `max-old-space-size`を変更します。

# 🔥現象例
```
 <--- Last few GCs --->

 [326:0x41400b0]   917511 ms: Mark-sweep 1511.0 (1774.9) -> 1510.0 (1775.4) MB, 2311.1 / 0.0 ms  allocation failure GC in old space requested
 [326:0x41400b0]   920160 ms: Mark-sweep 1510.0 (1775.4) -> 1509.8 (1728.9) MB, 2643.0 / 0.0 ms  last resort GC in old space requested
 [326:0x41400b0]   922034 ms: Mark-sweep 1509.8 (1728.9) -> 1509.8 (1719.9) MB, 1873.7 / 0.0 ms  last resort GC in old space requested


 <--- JS stacktrace --->

 ==== JS stack trace =========================================

 Security context: 0x1fe852a5891 <JSObject>
     1: push(this=0x1f442c2ea851 <JSArray[43037]>)
     2: query [/webapp/node_modules/pg/lib/client.js:512] [bytecode=0xe166cd56f31 offset=384](this=0x22a2a88e70d9 <Client map = 0x320165dfab1>,config=0x824a0505cb9 <String[186]: INSERT INTO "pancakes" ("value","createdAt","updatedAt","cake_id") VALUES ('','2021-07-11 01:07:39.748 +00:00','2021-07-11 01:07:39.748 +00:00',31613,60...

 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
  1: node::Abort() [/usr/local/bin/node]
  2: 0x8cd14c [/usr/local/bin/node]
  3: v8::Utils::ReportOOMFailure(char const*, bool) [/usr/local/bin/node]
  4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/local/bin/node]
  5: v8::internal::Factory::NewUninitializedFixedArray(int) [/usr/local/bin/node]
  6: 0xd8366f [/usr/local/bin/node]
  7: 0xd977a5 [/usr/local/bin/node]
  8: v8::internal::JSObject::AddDataElement(v8::internal::Handle<v8::internal::JSObject>, unsigned int, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::Object::ShouldThrow) [/usr/local/bin/node]
  9: v8::internal::Object::AddDataProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::PropertyAttributes, v8::internal::Object::ShouldThrow, v8::internal::Object::StoreFromKeyed) [/usr/local/bin/node]
 10: v8::internal::Object::SetProperty(v8::internal::LookupIterator*, v8::internal::Handle<v8::internal::Object>, v8::internal::LanguageMode, v8::internal::Object::StoreFromKeyed) [/usr/local/bin/node]
 11: v8::internal::Runtime_SetProperty(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/local/bin/node]
 12: 0x13b934d042fd
 Aborted (core dumped)
```

# 🚀対応
Node.js実行時に、`max-old-space-size`(ヒープ領域の最大値設定)を増やします。
[こちらの記事](https://qiita.com/kawanet/items/cfedd535990b32710c50)によると、デフォルトは1400MBらしいので、それよりも大きい値を指定します。

```
node --max-old-space-size=3000 index.js
```

# 📖参考
ヒープ領域：コンピュータープログラミングにおいて、動的に確保可能なメモリの領域。
[wikipedia](https://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E9%A0%98%E5%9F%9F)
SharePoint ドキュメントライブラリの5000件問題と対応策について

SharePoint には、リスト とは別にドキュメントライブラリというのが存在します。
SharePoint の リスト については、モダンサイトにすれば5000件問題から解放されるみたいな話があるのですが・・・
※詳しいお話は、太田さんがまとめてくれています！
[idea.toString(); SharePoint Online モダン リストの 5,000 件問題対応と 20,000 件問題の回避方法](https://idea.tostring.jp/?p=4088)

こと、ドキュメントライブラリについては、5000件を超えると明示的に以下のような警告が表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/cb59dbc2-6b3b-27c5-562a-dcb51e6ef0a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/f391424f-e923-1f5a-770f-2b821fb98fae.png)

まぁ、だから何だ？ってお話なんですけど、今回意外なところでこの問題にぶつかりました。

# そもそも ドキュメントライブラリのアイテムって？

ドキュメントライブラリだから、アイテムのカウントは当然ファイル単位と思われている方も多いかと思います。

しかし、調査した結果 **フォルダもカウントに含まれる** ことが分かりました。
まぁ、考えてみれば当然っちゃ当然なのですが・・・

この図のように、フォルダ「1」に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/3b884a72-f9fa-88df-ff3b-697acaf7f24f.png)
ファイル「1.xlsx」が入っている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/fc76a493-9d30-2d87-f8e4-0e3af4818adc.png)

フォルダ「1」を構成するアイテム数は**2**となります。

一般的なファイルサーバーのような扱いをしている場合は、フォルダに複数のファイルやフォルダが格納されていると思いますので、ドキュメントライブラリのアイテム数は尋常じゃない個数になるということは想像に難しくないでしょう。

# 今回問題が起きたところ

Power Automate を組んでいるときに、当該フォルダのファイルの一覧を取得しようとして、以下のようなフローを組みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/455de7fa-e539-dade-bab1-5a5bce8f63f6.png)

結果は、アイテム数が5000件を行かない場合は、明示的に配列データとして一覧を取得することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/43db9db0-cfff-c1cf-28dd-ed2ff40056b1.png)

ところが、5000件を超えると、以下のようなエラーが出るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/08fd938b-d858-caaa-3167-58217a39a4a0.png)

かと思えば、環境によってはエラーにはならず、空の配列だけが出力されることもあります。
※つまり処理が継続してしまう。

でも、フォルダも指定しているので、そんな全件検索を使用しているつもりはないと思うのですが、明示的にOdata の Filter クエリを投げないと出力できないようです。

# じゃあクエリをなげるか・・・

クエリを投げるようにすればいいっぽいので、作成日を適当に入れて検索してみました。
しかし・・・

## 5000件未満のファイル取得はうまくいく

以下のように、フィルタークエリを作成日を指定して実施したところ、きちんと出力されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/eb449fbc-614e-0a2f-6192-b388402144a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/fa78a307-0911-2f37-1235-4a59543af9b0.png)

・・・が

## 5000件以上のファイル取得はうまくいかない

同様のクエリを、5000件以上のフォルダに対して同様に行ったところ・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/e4797257-9371-689b-a4bc-643c97bf5d6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/17695815-11d7-b403-b159-b92db82e0041.png)

ご覧のように、取得することができません・・・。

# フォルダのIDを元に検索するのが一番確実・・・？

冒頭で申しました通り、フォルダもまた1アイテムです。
基本的にフォルダが作成された後でないとファイルをフォルダ内に「作成」されることはありませんので、当該フォルダのIDを取得して、それをフィルタクエリに入れてあげれば、5000アイテムを超えるドキュメントライブラリであっても検索されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/87e235e7-8fc9-9815-5a27-dff6fa805525.png)

ただし、あくまで
格納先のフォルダができた後にファイルがそのフォルダに作成されることが前提の仕様となりますので、予めファイルが作成されていて、そのフォルダに移動するといった場合は、IDが作成時より若いと思われますので、そういう場合は一工夫する必要があるかと思います。
bin/rails s でサーバーは走るが、ブラウザが表示されない。

書籍をもとにDocker上にてアプリを作成中。前回webコンテナからログアウトし、2日ぶりにログインし、サーバーを立ち上げることに。

```
$ bin/rails s 
```

上記のコマンドを入力してサーバーは立ち上がりますが、ブラウザが表示されません。


書籍を確認し下記のコマンドを入力。

```
$ bin/rails s -b 0.0.0.0
```

-b以降のIPアドレスを指定するのを忘れていました。 -b 0.0.0.0を指定する事により、すべてのIPアドレスに応答するようになります。

無事にブラウザが表示されました。
カルマンフィルターその６

# スムージング
前回までで、t期の情報を用いて、t期の状態変数を更新するフィルタリング値の導出とその意義を説明してきた。そして、カルマンゲインの導出過程からフィルタリングにより予測の精度を向上させていることも分かった。では、実際にt期の観測値が予測値と大幅に異なっていた場合、それはどこに問題があったのであろうか。その原因の１つには、過去からの情報により逐次的に推定した状態変数が大きく間違っていた可能性がある。それを補正するのが本日説明するスムージングとなる。日本語では平滑化と呼ばれるものであり、現在まででえられた情報を用いて、過去の推定値を補正する手法である。
## スムージングの意義
数式展開の前に、このスムージングの意義を述べたい。例えば、今日得られた観測値は、予測値とは大きく異なっていた場合、それは昨日の推定された状態変数が間違っていた可能性がある。そうであれば、昨日の状態変数を今日の情報で補正してあげた方がよい、と考える。補正対象は昨日だけの情報ではなく、過去の全てに遡る。
また昨日の状態変数の分散が大きい場合、大きい分散に基づいて予測され値は実現した観測値と差が大きくなる。そうであれば、昨日の状態変数の分散を補正してあげた方がよい。同様に昨日だけではなく、過去の全てに遡る。

## スムージングの式
下記は、本ブログの[その２](https://qiita.com/yukio_takagi/items/ec321d0fffd556e11c62)からの再掲であるが、状態変数のスムージング値、及びその分散を下記の(5),(8)式に示した。
$$\hat \beta_{N} \equiv E_{N}[\tilde \beta_t|\Omega_{1:N}] \tag{5}$$

$$\hat \Sigma_{t|N} \equiv Var_{t}[\tilde \beta_t|\Omega_{1:N}] \tag{8}$$

まず式(5)を上記の言葉の式に当てはめると、次のようになる。


$$\hat \beta_{N} = \hat \beta_{t|t} + \hat \Sigma_t^{*}(\hat \beta_{t+t|N}-\phi \hat \beta_{t|t})　\tag{16}$$

式(16)のカッコ内はスムージングの期待値とフィルタリング値の差であり、予測誤差である。
また、$\hat \Sigma_t^{*}$ は次のようになる。

$$\hat \Sigma_t^{*}=\phi \frac{\hat \Sigma_{t|t}}{\hat \Sigma_{t+1|t}}  \tag{17}$$
式(17)の分母は状態変数の分散のt+1期の予測値、分子はt期の状態変数の分散のフィルタリング値であり、その比となっている。これを式(16)の予測誤差とかけることで、フィルタリング値を補正している。

また式(8)を上記の言葉の式に当てはめると、次のようになる。

$$\hat \Sigma_{t|N} = \hat \Sigma_{t|t} + (\Sigma_t^{*})^2 (\hat \Sigma_{t+1|N}-\hat \Sigma_{t+1|t})  \tag{18}$$

式(18)も同様に、分散のスムージングした期待値と分散のフィルタリング値の差であり、予測誤差である。それを分散の比をかけて、分散のフィルタリング値を補正している。

これで、ようやく、カルマンフィルター、カルマンスムーザーまでの解説が一区切りできた。次回以降はMCMCに行きたいところであるが、その前にこれまでのところをまずは簡単にコーディングに入ることにしたい。
where句を使用しながら全レコードを SELECT or 特定レコードのみ SELECT を実現する方法

# 概要
Redash 等のセレクトボックスで ID1 を選択したらそのIDのレコードを、ALL を選択したらフィルタリングせずに全レコードを取得したいときがあります。

そこで SQL で `WHERE id =` に 1 を記載したら id 1 のレコードを取得、ALL のようなものを記載したら全レコードを取得をする方法を考えてみました。

# やり方
※ ~~対象テーブルが文字列のユニーク識別子を持っていることが前提条件となります。~~
=> CAST 関数を使って STRING に変換すれば id カラムでもできますね


`LIKE` を使用して個別取得したいときは該当レコードのユニークIDを指定、全取得したいときはすべての文字列にマッチするようにワイルドカードを指定することで実現できます。

個別選択:
`WHERE unique_code_column LIKE "code1234"`

全選択:
`WHERE unique_code_column LIKE "%_%"`

下記は Big Query × Redash の例です

```sql
WITH users AS(
    SELECT '田中' as name, 's9nicadgu3' as uid
    UNION ALL
    SELECT '佐々木' as name, 'p9f2igt4k5' as uid
    UNION ALL
    SELECT '佐藤' as name, 'tztrg8ibra' as uid
)

SELECT
    *
FROM
    users
WHERE uid LIKE {{ uid }}

## Dropdown List uid
"%_%"
"s9nicadgu3"
"p9f2igt4k5"
"tztrg8ibra"
```

Query Based Dropdown List を使用し、 uid を名前付きでよりわかりやすくすることもできます。

![Untitled.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572412/5e5504a3-fa9e-bfd9-ea90-97d2ceeaee4f.gif)