OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel ペジネーションのリンクをHttps対応にする

## 発生した問題
一覧表示画面のペジネーションリンクから２ページ目の一覧表示画面へアクセスしようとしたところ、`「アクセス時間が長すぎます。」`と出て、一向に画面遷移しない状態が続きました。

デベロッパーツールからペジネーションのリンクを確認すると、httpsではなくhttpでアクセスしようとしてることがわかりました。
どうやらペジネーションのリンクは、１ページ目はhttpsに対応してるが、２ページ目以降はhttpで通信されてしまうらしい。。。

ということで、以下のように修正してhttpsでアクセスできるようにしてあげます！

## AppServiceProvider.phpを修正
`/app/Providers/AppServiceProvider.php`に以下のコードを追加。

```php
public function boot(UrlGenerator $url)
{
    $url->forceScheme('https');

　　　　　  //　以下を追記
    // ペジネーションリンクをhttps対応（.env APP_ENV=localでない場合https化）
    if (!$this->app->environment('local')) {
        $this->app['request']->server->set('HTTPS', 'on');
    }
}
```

## 最後に
これでペジネーションのリンクから２ページ目以降にアクセスできるようになりました！
独自ドメインをhttps化していたので、ペジネーションリンクもhttps対応にする必要があったようです。

## 参考記事

https://tech.adseed.co.jp/paginate
Swift 5.6で強化された型システムについて

# Type Placeholders

Swiftでは型推論を使用して、コードから冗長さを省くことができます。
しかし、コードを明確するために必要に応じて型を明示する際に、必要なのは型の特定の部分だけなのに、完全な型を指定しなければならないのは、面倒に感じることがあります。

```Swift
enum Either<Left, Right> {
  case left(Left)
  case right(Right)
}

let either: Either<ClosedRange<Int>, Range<Int>> = .left(0...10)
```

新しい**型プレースホルダー**（正式にはプレースホルダー型）は、型アノテーションを部分的に記述し、必要な詳細のみを提供できます。
型プレースホルダーはアンダースコア記号`_`で記述され、不足な型情報は推論するようコンパイラに指示します。

```Swift
enum Either<Left, Right> {
  case left(Left)
  case right(Right)
}

// Inferred as 'Either<ClosedRange<Int>, Range<Int>>'
let either: Either<_, Range<Int>> = .left(0...10)
```

# Existential any

Swiftの**実存型**は、「特定のプロトコルに準拠した任意の型」の値を格納できます。
今日のところ、実存型はプレーンなプロトコル名またはプロトコル合成を使用して綴られます。

```Swift
protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [DataSourceObserver] { ... }
}
```

実存型は、その基礎となる型情報を消去します。
これは基礎となる型を動的に変更する必要がある場合に便利ですが、実存型がプロトコルに適合するような他の有用な機能を持つことを禁止しています。
既存の構文は、実存型がこれらの基本的な制限を持たない一般的な適合要件と同じように見えるため、混乱を招いています。

Swift 5.6では、実存型は`any`キーワードで明示的にマークします。

```Swift
protocol DataSourceObserver { ... }

struct DataSource {
  var observers: [any DataSourceObserver] { ... }
}
```
FlutterFire で設定したのに「Could not locate configuration file: 'GoogleService-Info.plist'」って言われる問題

# エラー
FlutterFire cli を用いて Firebase にの接続情報を設定。
flutter run すると以下のエラーが発生する。
dart only で初期化できるようになったはずでは...？
```
8.11.0 - [Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
8.11.0 - [Firebase/Core][I-COR000003] The default Firebase app has not yet been configured. Add `FirebaseApp.configure()` to your application initialization. This can be done in in the App Delegate's application(_:didFinishLaunchingWithOptions:)` (or the `@main` struct's initializer in SwiftUI). Read more: https://goo.gl/ctyzm8.
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The default FirebaseApp instance must be configured before the default Authinstance can be initialized. One way to ensure this is to call `FirebaseApp.configure()` in the App Delegate's `application(_:didFinishLaunchingWithOptions:)` (or the `@main` struct's initializer in SwiftUI).'
```

# 解決策
https://github.com/firebase/flutterfire/issues/7983

過去の特定のバージョンのバグだったようで、[firebase_auth](https://pub.dev/packages/firebase_auth) を最新バージョンにしたら修正されました。

# Google Sign in を使っている場合
https://github.com/flutter/flutter/issues/96391

2022/03/28の時点では、[Google Sign in](https://pub.dev/packages/google_sign_in) は dart only では初期化できないようです。
GoogleService-Info.plist を入れましょう。
issue 見る限り対応されるのは時間の問題かもしれません。楽しみですね。
大手SIer若手女性営業の学び「私の仕事に大切な人」


　こんにちは。大手SIerで営業2年目のたなぴーです。

　最近はおいしいものを食べることに幸せを感じて
　着実に養分（脂肪）をおなかに蓄えております(^^;
　
　今回先輩エンジニアに進められてQiitaを知りました。
　奮闘中で、忘れっぽいので、学びをアウトプットしていきます。

　副業も解禁されたので、これから投稿を増やしていきたいと思います！

　
　今回は、営業活動をしている中で気づいた「私の仕事に大切な人＝FOX」
　について、皆さんに共有します。
　

　＜調べたこと＞
　
　・FOXとは

　　最も影響力がある人物のこと。
　　Foxは、必ずしも表向きの権限者ではない。
　　経営の上層部や現場の権限者の付近にいる参謀のような存在の場合が多い。
　　ときには外部のコンサルタントであったりする。
　（三国志では、蜀の主君である劉備ではなくて、軍師の諸葛孔明
　　のようなイメージ）
　　参考文献：https://plaza.rakuten.co.jp/mensdiet/diary/200412110000/

　
　＜前提＞

　　そもそもこの体験は、私が営業でFOXを押さえられていなかったこと
　　からきています。
　　FOXって何だろう。というところからでした。

　　営業活動をする中で、FOXを押さえる文化を知りませんでした。
　　そちらに関しては、特に先輩や上司に教えてもらうこともなく
　　もうすぐ3年目を迎えようとしております。

　　これはまずい。ただ社内にも教育できる人が残念ながらおりません。(人手不足)
　　それならば、社外の人に教育してもらおう！というのが
　　今回Qiita投稿の経緯となります。
　　
　　また、アウトプットとインプットの割合は7:3といわれており
　　積極的なアウトプット推進のためというのも投稿理由の一つです。
　　
　　
　＜課題＞

　　今回の事象は"FOXを怒らせたこと"から始まっております。
　　FOX激怒後の私の無知な対応で、危うく案件ロスト＝失注の危機を
　　引き起こしてしまうという失態が課題と考えました。

　　
　＜経緯・詳細＞
　　
　　今回のライセンスには、契約更新時に前回より金額を
　　大きくしなければならないという謎ルールがあり、
　　ちょっと欲をだして、不要なライセンスを売ろうとしたら、
　　不信感を生んでしまいFOXに怒られてしまいました。
　　
　　説明の仕方も、画面オフにしてライセンス料の値上げをお伝えし、
　　リモートで直接お客様側の偉い人に担当者をすっ飛ばして説明。
　
　　その後、他ツールを顧客自ら、先行発注し
　　当初のツールの載せ替えを図ろうとしていたという
　　"案件ロスト（失注）の危機"を引き起こしてしまいました。
　　
　　　
　＜課題後の自身の対応＞　反省点！

　　FOXが激怒したことによって、怖い人を避けてしまう小心者な性格である私は
　　上司に特に相談することもなく他関係者からの情報収集のみで、
　　FOXを遠ざけておりました。
　　
　　それが情報に抜け漏れを発生させて、ツールの載せ替えの危機に。
　　
　　
　＜対策＞

　　そもそもツールのライセンス体系については
　　事前にFOXへの共有が必要だったかなと思い、
　　またそこに紐づく情報収集も今後は積極的に行います。
　　
　　加えて、FOXを怖がらずに積極的に話しかけて情報収集する能力も大事で、
　　もしそれが難しく、「FOXと話せていない。怖い。」のであれば、
　　上司へエスカレーション。
　　早めにアラートをあげること大切だと感じました。

　　名付けて、「オコミュニケーションの法則」！！

　　
　＜まとめ＞

　　今回の体験の中で、FOXというのは私が営業活動をする中での
　　「大切な人」であり
　　そこのキャッチアップを逃すと大変なことを引き起こしかねないことを
　　学びました。


![マウスくん.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2597626/7f851a45-4416-bfce-29e7-85d73e2a3bab.png)
ディジタル無線通信の信号表現

# はじめに

(ディジタル)無線通信では，信号表現についてまとめました．特にベースバンド帯と搬送波帯の違いに焦点を当てています．


# ディジタル変調方式

ご存じの方も多いかと思いますが，ディジタル変調方式の数式表現を定義しておきます．ここでは，PSK（位相変位変調, Phase Shift Keying）を例にとります．


# 変調波=複素包絡線×搬送波？？

情報が乗った変調波$s(t)$を次のように表現されます．

```math
s(t) = A \cos\{ 2\pi f_c t + \phi_m(t) \}
\quad(1)
```

ここに，$f_c$は搬送波周波数で，PSKなら位相$\phi_m(t)$に情報を乗せます．上の式を解釈しやすくするために，次のように変形します．

```math
\begin{align}
s(t)
 &= \{A \cos\phi_m(t)\} \cos(2\pi f_c t) - \{A \sin\phi_m(t)\} \sin(2\pi f_c t)~~~\quad(2) \\
 &= Re[z(t)] \cos(2\pi f_c t) - Im[z(t)] \sin(2\pi f_c t) \qquad\qquad\qquad~~(3)
\end{align}
```

ここで，$z(t)$は次のように定義しています．

```math
\begin{gather}
z(t) \equiv A e^{j \phi_m(t)} = A \{ \cos\phi_m(t) + j \sin\phi_m(t) \} \quad(4)\\
\rightarrow
\begin{cases}
Re[z(t)] = A \cos\phi_m(t) \\
Im[z(t)] = A \sin\phi_m(t)
\end{cases}
\end{gather}
```

上記のような変形をした理由は，**情報が乗った成分($z(t)$; 複素包絡線)と搬送波を切り離して考えられる**からです．この様子を下図に示します．$z(t)$は同図に示したように，実質的に情報が乗っている部分です(PSKならデータに応じて$\phi_m(t)$を変える)．ここで，以下の1),2)理由から$z(t)$を**複素包絡線**と呼びます．

1) 同図(b)を見て分かるように，**$z(t)$は周波数$f_c$の搬送波の係数**となっています．難しく言うと**包絡線**になっています．
2) $z(t)$は，データに応じて複素平面に配置される複素数です．例えば，BPSKでデータ0を送信する場合は，$z(t)=A\exp[ j \phi_m(t)]_{\phi_m(t)=0} = A \exp[j0]= A$となります．このように複素平面上に0,1のデータがどのように配置されるかを視覚的に表したものを**IQ平面**とか**信号空間ダイヤグラム**と言います．

![キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290566/1e92ceff-6f34-c313-1a65-401f78c52948.png)


###### ■ 補足1：
式(2)を眺めると第1項は複素包絡線と搬送波が互いに$\cos()$同士なので同相(In-Phase)軸と呼び，第2項は第1項に対して直交関係にある$\sin()$なので直交(Quadrature)軸と呼びます．

###### ■ 補足2：
上記のように，搬送波と複素包絡線を切り離して考えられるのは，**変調波 = 複素包絡線 × 搬送波**のような比例関係（線形関係）だからです．その意味でPSK（およびASK）を線形変調方式と呼びます．





## ベースバンド帯と搬送波帯

上述のように，(線形変調方式では)**情報が乗った複素包絡線$z(t)$と搬送波を切り分けて考える**ことができます．

- 前者は，式(4)からも明らかなように，(中心)周波数は0 Hzです．その意味で，**ベースバンド帯域**とか**基底帯域**と呼びます．下図(a)にその様子を示します（補足3）．ベースバンド帯で考えると，情報0,1に対応するパルス(BPSKなら振幅は$z(t)=Re[e^{j\phi_m(t)}]_{\phi_m(t)=0 ~\mathrm{or}~\pi}=\pm A$）が一定の期間$T_s$だけ継続します．$T_s$が短いほど高速な伝送となります．

```math
\begin{gather}
z(t) \equiv A e^{j \phi_m(t)} = A \{ \cos\phi_m(t) + j \sin\phi_m(t) \} \quad(再掲4)\\
\rightarrow
\begin{cases}
Re[z(t)] = A \cos\phi_m(t) \\
Im[z(t)] = A \sin\phi_m(t)
\end{cases}
\end{gather}
```

- 後者は，式(3),(4)に示したように，複素包絡線$z(t)$に搬送波がかかっており(中心)周波数が$f_c$となります．その意味で，**搬送波帯**と呼びます．周波数を搬送波帯までもっていくのは，1) ベースバンド帯の場合，(中心)周波数が0 Hzなので空間に電波を放射するのが困難になるからです．2) 無線通信ではシステム毎に周波数が割り当てられているため，許容された周波数までシフトする意味もあります．

```math
\begin{align}
s(t)
 &= \{A \cos\phi_m(t)\} \cos(2\pi f_c t) - \{A \sin\phi_m(t)\} \sin(2\pi f_c t)~~~\quad(再掲2) \\
 &= Re[z(t)] \cos(2\pi f_c t) - Im[z(t)] \sin(2\pi f_c t) \qquad\qquad\qquad~~(再掲3)
\end{align}
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290566/92377cf2-ff87-49af-97b9-ccd9825b0d55.png)

###### ■ 補足3：
同図では，同相のI軸のみ示しています，実際にはQ軸もあります．両者は本質的には同じ考え方なので省略しています．


# 参考
- 高畑ほか，ディジタル無線通信入門，培風館，2005年．
春から大学生（情報・工学）の方へ～プログラミング入門7～（C言語/C++開発キットMinGWの中身を覗いてみた）

# 第１回
https://qiita.com/HaaSAtC/items/490d066bdbec8441a2f6

# MinGWとは？
C言語で書いたプログラムを機械語に翻訳するコンパイラや文法の間違いを探す「デバッガ」、プログラム中で読み込んで使う「ヘッダファイル」などをまとめたもの。

# インストール場所(Windows)
MinGWを単体でインストールした場合、基本的にはPC//ローカルディスクC//Program Filesなど。Eclipse Pleiadesでまとめてインストールした場合、PC//ローカルディスクC//pleiades~~//eclipse。

# binフォルダ
binはbinary(2進数の)の略。つまり、機械語で書かれたファイルを格納している。具体的には、.exe(アプリケーション)、.dll(dynamic link library、動的ライブラリ)など。
c++.exe
g++.exe(GNU C++ compiler、C言語もC++も両方C++言語としてコンパイルする)
gcc.exe(GNU C compiler、C言語、C++コンパイラ)
gdb.exe(the GNU project debugger、プログラムの文法間違いを見つけてくれる)
などなど。
https://kamocyc.hatenablog.com/entry/2020/01/23/075331

# etcフォルダ
etc(エトセトラかな？)
gdbinitという名前のファイルが１つだけ。

# includeフォルダ
基本的には.hという拡張子のファイルが８つくらい入っていると思います。プログラム中で読み込んで（引用して）使うものですが、これを「ヘッダファイル」と言います。
エディタなどで中身を開いてみると、英語で注意書きがずらっと出てきます。
その下に#ifdefとか#defineとか#endifとか書いてあると思います。「関数のプロトタイプ宣言」「構造体」や「定数」の宣言などが並んでいます。これらの意味については授業で習うと思いますが、興味があれば調べてみてください。
また、CG用のヘッダなど初めから含まれていないヘッダファイルは、後から追加することもできます。
https://xtech.nikkei.com/it/article/COLUMN/20100219/344843/

# libフォルダ
dllやlib、aやo、hなど様々なファイルが入っています。dllやhについては上で出てきたかと思います。dllとlibは機械語で書かれており、プログラム中で使う「関数」の実体が入っています。hファイルはその使い方と使用宣言です。プログラムの上のほうの行でhファイルを読み込むことで、その中に書かれている関数の「しよう（仕様/使用）」を宣言します（＝プロトタイプ宣言）。その後、プログラム中で実際に関数が使用される際にはdllやlibなどを参照するわけです。dllはコンパイルが終わって作成されたexeファイルとともに実行されますが（外付け）、libはexeファイルが作成される際に中に取り込まれます（一体化する）。aファイルとoファイル（オブジェクトファイル）はコンパイル（の途中）で生成されるものです。授業で詳しくやるはず。
dllはLinuxだとsoファイルに相当します。

# libexecフォルダ
exeやa,dll,sh(シェルスクリプト)が入っている。メインではなさそう？

# licensesフォルダ
利用規約みたいなのが入ってる

# optフォルダ
bin, include, info, lib, share, ssl(=Secure Socket Layer?)と分かれる。
Secure Socket Layer＝通信の暗号化の仕組み

# shareフォルダ
.py（Pythonのプログラム）や.xml(データ保持のファイル)を含む。デバッガ関連のプログラムがPythonで書かれているということでしょうか？

# x86_64-w64-mingw32
こちらにもbin, include, libフォルダが含まれていました。

# 次回
次回は、Java Development Kitを覗いてみようと思います。

https://qiita.com/HaaSAtC/items/074aee981a79f3af24c5
ぼくのかんがえたさいきょうのGithub Actionsで複数のCloudFormationファイルをCI/CDする方法

terraformになれてたぼくがCloudFormation(CFn)で立ち上げたプロダクトにアサインされてCI/CDをしようと思った時に考えたさいきょうの方法です。
（如何せんCFn初心者なので、全然最強でない可能性ありますがご了承ください。。）

### やりたかったこと
- dev(development),staging(stg),production(prd)など複数環境に手軽にデプロイ(prdはさすがに手軽すぎるのは危険なので、チェック機構は欲しい)
- 手軽にデプロイしたいが、どういう変更が入るか(`terraform`で言うところの`terraform plan`の結果)は知りたい
- 色々カスタマイズできるようにしておきたい

### 実現したこと

> - 色々カスタマイズできるようにしておきたい

下記公式のactionがありましたが、リポジトリがアーカイブされており２年前を最後にメンテナンスされてないようだったので使うことを断念しました...

>AWS CloudFormation "Deploy CloudFormation Stack" Action for GitHub Actions · Actions · GitHub Marketplace
https://github.com/marketplace/actions/aws-cloudformation-deploy-cloudformation-stack-action-for-github-actions

よって、自分でpythonで似たものを作ることにしました。

行ったことは下記の感じです。

- プルリクエスト上でlinter, dryrunを流しコメントとして表示(サンプルはdevのみです。)
  - 例: https://github.com/LittleWat/cfn-github-action-sample/pull/2
  ![pr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104256/4306c0ba-103b-a58a-0465-6853b9c0a8b4.png)

- `dev-release` or `stg-release`ブランチに force pushすると `dev`環境や`stg`環境にデプロイ
- `prd-release` ブランチ向けにプルリクエストを作成するとdryrunが走り、良さそうであればマージ。すると `prd`環境にデプロイされる。


一応ソースはgithubにupしました。
https://github.com/LittleWat/cfn-github-action-sample

ツッコミなど大歓迎です。
ひとまず作っただけなので、今後運用していくと色々と問題が出てくるかと思います汗
随時対応していく所存です。

良きCI/CDライフをお送りください！

（cdkの方が今やメジャー感があるので、cdkも気になる今日この頃です）
Formオブジェクトとは

## Formオブジェクトとは
モデルとフォームの責務を切り分けられる事で、単体のモデルに依存しない場合や、フォーム専用の特別な処理をモデルに書きたくない場合に用いる。

Railsのフォームは基本的にモデルに依存する。
例えば``1つのフォーム送信で複数のモデルの更新をしたい場合バリデーションの責務が曖昧なものとなり、可読性も低下する``ため、責務を明確にするとことで使う。

1つのフォームで複数モデルの操作をしたいときに``Form Object``を使うと、処理がすっきりかける。またログインに関する処理など、特定のフォームでしか行わない処理も``Form Object``に書くと良い。

## メリット
・``ActiveRecord``と同じバリデーションを使うことができる
・``Form Object``にパラメーターをそのまま渡すことができるためエラーメッセージを戻す処理が書きやすい
・責務がモデルとは言い切れないビジネスロジックを``controller/view``から切り離せる

## ユースケース
**サインアップ処理**
ユーザの作成と他ユーザのフォローを同時に行うなど、``複数のActiveRecordモデルを作成``するとき。

**複数のタグを作成**
複数の子レコードを作成するとき。``accepts_nested_attributes_for``を使うような場面だが使いたくないとき。

``ブログの検索フォーム``
``ActiveRecordモデルを使用しない``場合。

## 使い方
1.formsディレクトリ、利用したいフォームファイルの作成
2.コントローラーに記載

#### 1.formsディレクトリ、利用したいフォームファイルの作成
``app/forms``ディレクトリを作成し、その中に利用したいフォームのFormオブジェクトを作成する。

```
$ mkdir app/forms

$ touch app/forms/sample_form.rb
```
作成したファイルに、バリデーションや使用するメソッドを記述していく。
```sample_form.rb
class SampleForm
  include ActiveModel::Model 
  #↑通常のモデルのようにvalidationなどを使えるようにする
  include ActiveModel::Attributes
  #↑ActiveRecordのカラムのような属性を加えられるようにする

  attribute :first_name, :string
  attribute :last_name, :string
  attribute :email, :string
  attribute :body, :string

  validates :first_name, presence: true
  validates :last_name, presence: true
  validates :email, presence: true
  validates :body, presence: true

  def save
    処理
  end
end
```

#### 2.コントローラーに記載

```sample_controller.rb
class SamplesController < ApplicationController
  def new
    @sample = SampleForm.new
  end

  def create
    @sample = SampleForm.new(sample_params)
    if @sample.save
      redirect_to :samples, notice: 'サンプル情報を作成しました。'
    else
      render :new
    end
  end

  private

  def sample_params
    params.require(:sample).permit(:first_name, :last_name, :email, :body)
  end
end
```
Windows.edb が肥大化した時の対応方法

C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb が肥大化してCドライブがどうしようもなくなった時の対応方法のメモ書きです。 (Windows 10, 11)

# デフラグ
マイクロソフトのサイトに記載があります。

[Windows.edb は、PST ファイルのインデックスを作成するときに予想よりも大きい](https://docs.microsoft.com/ja-jp/troubleshoot/windows-client/shell-experience/larger-windowsdotedb-file)

しかし、なぜか Windows.edb のパスが %AllUsersProfile%\Microsoft\Search\Data\Applications\Windows\Windows.edb と書かれており正しく動作しなません。これを正しいパスに置き換えなければならないです。

コマンドプロンプトかPowerShellを管理者権限で起動し、下記のコマンドを実行して Windows.edb のデフラグを行いました。


```
Sc config wsearch start=disabled
Net stop wsearch

EsentUtl.exe /d C:\ProgramData\Microsoft\Search\Data\Applications\Windows\Windows.edb

Sc config wsearch start=delayed-auto

Net start wsearch
```

これを実行して5分後に8GBだったファイルが7GBになりました。ただ、Windows.edbが破損している場合はエラーになりました。うまくいったときの結果と言い、この機能にはそんなに期待はできません。

# インデックスの再構築

Windows.edb で検索してもなぜか上記のデフラグしかヒットせず、インデックス（つまり Windows.edb ファイル）の再構築の話ができてません。（これがこの記事を書いている理由）

再構築を行えばファイルのサイズは最小になりますし、破損していても問題ありません。（ただし再構築に時間がかかるし、再構築後に元の木阿弥になる可能性もあり）

Windows 11の場合の再構築方法は
1. 「設定」をクリック
2. 「プライバシーとセキュリティ」をクリック
3. 「Windowsのアクセス許可」の「Windows検索」をクリック
4. 「ファイルを検索」をクリック
5. 「検索場所をカスタマイズ」をクリック
     ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160914/4dbb72f9-b715-d14b-1c59-c28ce1ddb125.png)
6. 「詳細設定」をクリック
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160914/bcd651ea-987c-7647-15fe-9cb7bbebc9b5.png)
7. 「インデックスを削除して再作成します」の右側にある「再構築」をクリック
   ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160914/93fee3f8-5c22-1557-a823-55f4453b9144.png)
8. 「インデックスの再作成には・・・」と表示されたら「OK」をクリック
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160914/85e6b1d7-2c21-a575-a351-02650c25e7e4.png)


これで Windows.edb が再構築され 10MB くらいのサイズになります。
バイアス・バリアンスとニューラルネットワークの学習フロー

### 1. バイアスとバリアンス
　どうもNegimaruです。今回はバイアスとバリアンスについてまとめます。具体的には、次の3つについて書きます。複雑な数式は使わず、言葉による説明での直感的な理解を目指します。

- バイアスとバリアンスとは何か
- バイアスとバリアンスの測り方
- バイアスとバリアンスの視点から考える機械学習の基本的な流れ

### 2. バイアスとバリアンスとは
　まずは、バイアスとバリアンスとはそもそも何かを説明します。バイアスとは、**モデルの予測と学習データのずれの大きさ**のことです。つまり、バイアスが「大きい」というのはモデルが十分に訓練されておらず学習データに対して良い予測ができないことを表し、バイアスが「小さい」というのはモデルが学習データに対して良い予測ができることを表します。一方、バリアンスとは**モデルの予測の分散、つまりモデルの複雑さの度合い**のことです。したがって、バリアンスが「大きい」とはモデルが複雑であることを表し、バリアンスが「小さい」とはモデルが単純であることを表します。一般に、バイアスもバリアンスも小さくすることが望ましいです。バイアスが小さいことは訓練データによくフィットしていることを表し、バリアンスが小さいことはモデルの予測の分散が小さく未知のデータによくフィットする可能性が高いことを表すからです。（モデルの予測の分散が小さいということは、学習データのノイズをモデルが学習していないことを表し、未知のデータも正しく予測できることが期待できます）。

### 3. バイアスとバリアンスの測り方
　あるモデルのバイアスとバリアンスの大小は、訓練データに対するそのモデルの性能と、検証データに対するそのモデルの性能から分かります。二値分類モデルを例に説明します。今、ベイズエラーは0に近いとします。（つまり、理想的な分類器は100%に近い精度で分類できるとします）。このとき、訓練データに対するエラー率（train set error）と検証データに対するエラー率（dev set error）の値によって次の4つに分類できます。数字は厳密ではないです。雰囲気が伝わればと思います。

- train set error = 1%、dev set error = 11%のとき
訓練データによくフィットしているが、検証データにあまりフィットしていない。つまり、**バイアスが小さく、バリアンスが大きい**といえる。この状態のことを**過学習**という。
- train set error = 15%、dev set error = 16%のとき
訓練データにあまりフィットできていない。検証データにもフィットできていないが、これは、バリアンスが大きいからではなくモデルが訓練集合にすらフィットできていないことからくると考えられる。よって、**バイアスが大きく、バリアンスが小さい**状態であるといえる。この状態のことを**学習不足**という。
- train set error = 15%、dev set error = 30%のとき
訓練データをあまり再現できておらず、検証データはそれよりさらに再現できていない。これは、**バイアスが大きく、バリアンスも大きい**状態である。基本的には線形に近いモデルが、訓練データの一部に過剰にフィットしてしまったときなどに起こる。
- train set error = 0.5%、dev set error = 1%のとき
訓練データも検証データもよく再現できている理想的な状態。つまり、**バイアスが小さく、バリアンスも小さい**状態である。

（注）古典的機械学習では、バイアスとバリアンスは一般的に**トレードオフ**の関係にあります。しかし、ニューラルネットワークの文脈では、このトレードオフ関係が議論されることはあまりないようです。

### 4. バイアスとバリアンスの視点から考える機械学習の基本的な流れ
　それでは上記を踏まえて、機械学習をどのような流れで行えばよいかを説明します。学習の基本的な流れは次のような図で表せます。

![flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2605268/d2db9b5e-2f2f-4123-c125-f4193faeaf65.jpeg)

ポイントは次の3つです。
- バイアスから小さくすること。まず、訓練データに適合したモデルが手に入らないと始まらない。
- バイアスを小さくする主な方法はニューラルネットワークを大きくすることと、より長く学習すること。ニューラルネットワークを大きくして複雑なモデルにすればモデルの表現力が上がって訓練集合により適合させることができる。また、単純に訓練時間が足りなくてモデルが適合していない場合は訓練時間を伸ばすことが有効。
- バリアンスを小さくする主な方法は、訓練データを増やすことと正則化を強めること。訓練データを増やせば特定のデータへの過剰なフィットは避けれる可能性がある。また、正則化でモデルの表現力を弱めれば過学習を防げる。正則化の方法としては、L2正則化やドロップアウトなどが挙げられる。

### 5. 参考文献
- [Courseraの講座](https://www.coursera.org/learn/deep-neural-network)
- [バイアスとバリアンスのトレードオフについての記事](https://atmarkit.itmedia.co.jp/ait/articles/2009/09/news025.html)
vagrant upでエラー「next InitializeSecurityContext failed」が出た

# 「vagrant up」で「next InitializeSecurityContext failed」エラーが出たときの対処

## 環境

* Windows 10
* Vagrant 2.2.19
* VirtualBox 6.1.32

---

## 前提条件

上記環境が導入されていること（バージョンは記載時のもの）

## vagrantfile
今回はvagrantfileの中身はなんでもいいので適当に。
```ruby
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.network "public_network"
  config.vm.provision "shell", inline: <<-SHELL
    apt update
  SHELL
end
```

## vagrant up でエラー発生
![2022-03-27-18-36-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256143/169520b0-5891-b9bd-a088-f52a126aa319.png)

```
Error: schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - 失効の関数は証明書の失効を確認できませんでした。
```

## 原因

Kasperskyのリアルタイム保護で止められているようです。

タスクトレイのアイコン右クリックして、「保護機能の一時停止...」をクリック

![2022-03-27-18-43-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256143/71427466-d559-9c2b-13e7-d342a1ed91fb.png)

任意の時間を設定して一時停止する。

![2022-03-27-18-45-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256143/e5b7ee00-1e5d-d7dd-771d-d836969b43dc.png)

## 再実行
![2022-03-27-22-28-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256143/8cb7da40-15af-60a4-1740-2337670c6b2c.png)
![2022-03-27-22-29-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256143/3446f176-1bdb-ad07-1251-96053f177084.png)

## まとめ
イメージを取得する際にKasperskyの基本設定の状態だと制限がかかってしまい取得できないようです。
「保護機能の一時停止」をして実行すれば回避できます。
※次回以降の起動時は普通に「vagrant up」できます。
問い合わせなどに使える、ボタンを押すとメールが開いて宛先も入力されている簡単ワンタッチメール

すごく久しぶりの、投稿ですが、今日も頑張ります。
今回は、問い合わせなどに使えるワンタッチメール機能を、作成したいと思います。
```ruby
<p><a href="mailto:jdvlak&#64;gmail.com">私にメールを送信</a></p>
```
が、ワンタッチメールです。
つぎは、電話です
```ruby
<p><a href="tel:電話番号を入力">お問い合わせ電話はこちら</a></p>
```
すごく簡単です。
参考になると嬉しいです
フォローしてくれると、必ず９８％フォロバします
フォローお願いします
Execution failed for task ':app:kaptDevelopDebugKotlin'. > A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution    > java.lang.reflect.InvocationTargetException (no error message)　というエラーが出た時

# 初めに

ビルド実行時に　AndroidStudioで

>Execution failed for task ':app:kaptDevelopDebugKotlin'.
>　> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
>　   > java.lang.reflect.InvocationTargetException (no error message)

というエラーが発生した時の対処をここに残します
※エラー自体を解消するものではありません、エラーの内容を把握するためのものです

# 翻訳
> タスク'：app：kaptDevelopDebugKotlin'の実行に失敗しました。
>　>org.jetbrains.kotlin.gradle.internal.KaptExecutionの実行中にエラーが発生しました
>　   > java.lang.reflect.InvocationTargetException（エラーメッセージなし）

エラーメッセージが無く何が原因か、何をすれば解決するのかがわからない状態です

# 実行すること
AndroidStudioの左上　
Analyze（分析）　＞　 Inspect Code（コードの検査）　
　＞whole project（プロジェクト全体）　にチェックで　OK


![スクリーンショット 2022-03-27 22.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2394054/ae758d38-f179-47dc-ed45-215bba09df6f.png)

これで原因となるエラーの元を分析してくれます
Macでlima上のDockerにEmacsでdocker-trampする方法

# はじめに
この環境って結構レアケースだと思うので、とても情報が少なく、やっと接続できるようになったのでメモしておきます。
まず、Docker Desktopが有償になってしまい、その代替えとしてMacではlima VMを使って、その上でDocker Engine Serverを動かして使用するという方法を見つけたので試してみました。
https://qiita.com/yoichiwo7/items/44aff38674134ad87da3
たぶん大抵の人はこれで解決するのでしょう。

ただ、私の場合はEmacsを使っており、dockerコンテナ上のファイルにアクセスするのにdocker-trampを使っています。
急にdocker-trampが使えなくなった時の使い勝手の悪さときたら。。。

ということで試行錯誤して、やっと使えるようになりました。
こんな方法があったとは知らなかったです。

# ssh接続できるようにする
まず先ほどのページの設定 [Docker Desktop for Macの実用的な代替手段: lima + Docker](https://qiita.com/yoichiwo7/items/44aff38674134ad87da3)を実施した後に、次のように lima.yaml を設定変更します。

```yaml:~/.lima/default/lima.yaml
ssh:
  localPort: 0
  loadDotSSHPubKeys: true
```

localPortを0にしておくと自動でポートを設定してくれて、デフォルトだと60022でssh接続できるようになります。

いったんstop→startします。
```
limactl stop
limactl start
```

この後、一度sshで接続しておきます。
```
ssh -p 60022 127.0.0.1
```

# docker-trampで接続する

dockerコンテナが起動していないと思いますので起動しておきます。

```
docker start test-container
```

この状態で、Emacsからdocker-trampで接続します。

```
C-x C-f /ssh:127.0.0.1#60022|docker:test-container:/root
```
/rootディレクトリに接続する例です。
Multi-hopという機能を利用して接続できるようです。
これリモートのコンテナでも使えるので便利ですね。
RustでVecを2つのキーでソートしたい

使いたかったときにぱっと書けず悶々としたので共有します。
@Kogia_sima さんにコメントで教えていただきました！！！

```rust
vec.sort_by(
    |a, b| a.0.cmp(&b.0).then(a.1.cmp(&b.1))
);
```

----
ここからが下が元記事です(↑の方がエレガントです)

```rust
use std::cmp::Ordering;

// (中略)

let mut vec = vec![];
vec.push((1, 2));
vec.push((2, 3));
vec.push((2, 2));
vec.push((3, 1));
vec.sort_by(|a, b| match a.0.cmp(&b.0) {
    Ordering::Equal => a.1.cmp(&b.1),
    other => other, // ここの変数名はお好みで。
});
println!("{:?}", vec); // [(1, 2), (2, 2), (2, 3), (3, 1)]

```

ちょっとめんどい。
既存のリポジトリをBitbucketに紐づけする方法

はじめて使用したときに困ったので、備忘録として。（ときたま使用するときがあるし...）

# ローカルリポジトリの準備
  
1. Sourcetreeを用いて，ローカルリポジトリを作成．作業パスは追加したいファイルがあるパスを選択。
    * ex. "cd C:\Long\Coat\Daddy"　(Daddy下にソースファイルやら何やら)
    * この時出力先のエラーが出るが「はい」を押して続行。
    * クローン作成先のパス"C:\Long\Coat\Daddy"は既に存在しています。続行して、このフォルダにリポジトリを作成しますか？
![create repositry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2598835/93f35c99-2331-c5c2-71b9-da47a86aa849.png)

2. 好きなのファイルをコミットする．

# リモートリポジトリの準備
1. Bitbucketにアクセス 
     * 「＋」ボタンからリポジトリを作成
        * リモートリポジトリ名：remoteLCD
     * **このとき、.gitignoreを含むか聞かれますが、ローカルリポジトリの準備の時点で作成していたら、作成しないように！**

# ローカルリポジトリとリモートリポジトリの紐づけ
* 「ローカルの Git リポジトリを Bitbucket に移行しましょう」の指示通りに行う．
1. コマンドプロンプトを開く
1. ローカルリポジトリに移動．（cd C:\Long\Coat\Daddyとか）
1. 下記コマンドを入力
```
　　　git remote add origin https://xxx@bitbuckte.org/xxx/remoteLCD.git
```
4. 下記コマンドを入力
```
     git push -u origin master
```
* あとは、Bitbucket上で確認できます。
【UiPath】親ロボットのCatchの作り方【備忘録】

親ロボットに内蔵するTryCatchのCatch部分について個人用の備忘録です。

まず、Catchには「BusinessRuleException」「System.Exception」の2種類を用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607132/8de755af-63c2-2e5a-9e6e-e743d3e0c702.png)

■System.Exception部分について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607132/6c943bf7-65fb-144a-cd9a-a101998490df.png)
① エラー時の時刻を取得します。
　string = Now.ToString("yyyyMMMdd_HHmmss")

② エラー文言を作成
　「exception.Message」がエラー内容そのもの
　「exception.Source」がエラーを起こしたアクティビティ名
　「exception.StackTrace」がエラーの詳細情報
　下記のエラー文言をString型変数に代入する。

【エラー文】
"ロボットが異常終了しました。" + Environment.NewLine +
"原因を確認してロボットを再実行してください。" + Environment.NewLine +
"\<exception.Message>" + Environment.NewLine +
exception.Message + Environment.NewLine +
"\<exception.Source>" + Environment.NewLine +
exception.Source + Environment.NewLine +
"\<exception.StackTrace>" + Environment.NewLine +
exception.StackTrace


③ エラー文をテキストファイルに書き込み
　基本はロボフォルダの中に「error」というフォルダを作成しておき、①で作成したエラー時刻をファイル名にしてテキストファイルを作成。
　書き込みするエラー文は②で作成したもの。error\yyyyMMdd_HHmmss.txt と出力。
　

④ エラースクリーンショットを作成
　TakeScreenShotアクティビティでスクリーンショットを撮影できる。
　アクティビティプロパティの出力には、UiPath.Core.image型の変数を用意。

⑤ エラー画像を保存
　工程④で撮影したimage型変数をSaveImageアクティビティでpngファイルとして保存します。
　出力先は③同様、error\yyyyMMdd_HHmmss.png と出力。

⑥ エラーが発生したことをユーザーに通知
　この例ではエラー内容をMessageBoxアクティビティで出力しているが、メールで出力することが多い。
　メールで通知する際には必ず、②のエラー文、④のエラースクリーンショットを添付して送信すること。

■BusinessRuleException部分について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607132/09a6b554-1178-712f-0248-5fd5659c63c7.png)
こちらもSystem.Exception同様、スクショ、エラー文を記載してもよい。
ただ、個人的にはロボが異常終了したのではなく「ロボ実行に必要なファイルが不足している」「ロボを実行できる状況ではない」等、ロボを動かす前段階でユーザーが準備しなければいけないことを忘れていた場合に使用しているため、ロボ実行開始した初期段階で発生することを想定。
そのため、MessageBoxアクティビティにexception.Messageだけとかなり簡素な作りにしている。

なお、BusinessRuleExceptionを出力するためにはTry内で、Throwアクティビティを使用し例外を発生させる必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607132/17b78c96-7052-e66c-0d05-7a7fddaed2af.png)
上記画像はスローアクティビティの配置例。
勤怠情報を入力するロボにて、入力するべき勤怠情報が存在しなかった場合にThrowアクティビティに進むようにしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607132/8ee3b485-a857-c7b6-4f2f-6c861cb2de0b.png)
上記画像は具体的なThrowアクティビティの中身。
カッコ内に勤怠情報が存在しなかった場合に出力したいエラー文を記載している。
これにより、Catch内にフローが進んだ時に、exception.Messageに上記エラー文が格納され、MessageBoxやメールにエラー内容を記載できる。

■補足（ロボットの作りとexception.Sourceについて）
exception.Sourceは異常が発生したアクティビティ名を保持しているが、TryCatchアクティビティのTry内で異常終了が発生しても、exception.Sourceで異常が発生したアクティビティ名を取得することが出来ない。
exception.Sourceで取得できるのは、Try内でInvokeWorkflowアクティビティで呼び出した外部のロボを使用した際に、外部ロボでエラーが発生したときのみ接続元のCatch内にて外部ロボの異常発生したアクティビティ名を使うことが出来る。

そのためなるべくロボットを作る際には親ロボット、子ロボット（役割ごとに分割したロボ）という形で作成し、子ロボに処理内容は任せ、親ロボは子ロボの呼び出しと異常終了時のTryCatchだけ用意する仕組みにしておくのが良いと思われる。
【Excel】TinySeleniumVBAのヘッドレスモードでファイルをダウンロードする方法

# はじめに
下記サイトの方で「ヘッドレスモードでファイルをダウンロードができない」旨の質問を頂きました。

https://qiita.com/yaju/items/9d1f189a5d2118a3f4d3

質問の回答になるサンプルを提示したところ、無事解決したようです。
私もヘッドレスモードでファイルをダウンロードできないことは初めて知る内容でしたし、いいネタなので記事化することにしました。

# 何故できないのか
ヘッドレスモードでなければアンカータグをクリックするだけでファイルをダウンロードすることが出来ますが、ヘッドレスモードになると何も反応しなくなります。
正確には、プログラムは正常終了しますが保存先パスにファイルが存在しない状態になります。

こちらで議論されていますが、セキュリティの観点からのようです。
https://bugs.chromium.org/p/chromium/issues/detail?id=696481

# 回避方法
Pythonによる回避方法のサイトを見つけたのですが、これをTinySeleniumVBAでどう実現するのか難しそうでした。

https://tech.fragment.co.jp/python/headless%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89/

もう少し調べるとSeleniumBasic(SeleniumVBA)での回避方法を見つけました。

https://stackoverflow.com/questions/71343970/using-selenium-vba-how-to-download-files-in-headless-mode

Python版に比べるとダウンロード先を指定するだけで非常にシンプルです。シンプルすぎて本当に出来るのか逆に不安でした。

```vb
Dim bot As New ChromeDriver, post As Object
  With bot
    .SetPreference "download.default_directory", ThisWorkbook.Path & "\"
    .Timeouts.ImplicitWait = 1000
    .AddArgument "--headless"
    .Start
    .get "http://"
  end with
```

手始めにTinySeleniumVBAに書き換えて試してみたところ、ヘッドレスモードでダウンロードすることができました。

## ソースコード
TinySeleniumVBAは最新版v0.1.3のEdge上で確認しています。
CSVファイルがあるサイトとして下記をサンプルとして採用しました。

https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741&tclass2val=0

ヘッドレスモードでCSVファイルを、ThisWorkbook.pathフォルダの配下にダウンロードできました。
※ThisWorkbook.pathフォルダは任意に変更してください。

```vb
Dim Driver As New WebDriver
Driver.Edge "C:\Tools\edgedriver_win64\msedgedriver.exe"
Dim cap As Capabilities
Set cap = Driver.CreateCapabilities()
cap.AddArgument "--headless"
cap.AddPref "download.default_directory", ThisWorkbook.path & "\"
Driver.OpenBrowser cap

' Navigate to e-stat.go.jp
Dim baseUrl As String
baseUrl = "https://www.e-stat.go.jp"
Driver.Navigate baseUrl & "/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741&tclass2val=0"

Dim csvanchors
csvanchors = Driver.FindElements(By.XPath, "//a[@data-file_type='CSV']")
csvanchors(0).Click
```

ThisWorkbook.pathフォルダではなく、ユーザーのダウンロードフォルダにする場合は下記に書き換えてください。

```vb
Dim path As String
Dim downloadPath As String
path = CreateObject("Wscript.Shell").SpecialFolders("MyDocuments")
downloadPath = Left(path, InStrRev(path, "\")) & "DownLoads"

cap.AddPref "download.default_directory", downloadPath & "\"
```

【2022/05/22追記】
Mac版TinySeleniumVBAのテストをしていて、下記2点を修正する必要がありました。

```vb
cap.AddPref "download.default_directory", ThisWorkbook.path & "\"
↓
cap.AddPref "download.default_directory", ThisWorkbook.path
```
末尾の`& "\\"`が不要でした。これがあると"DownLoad\\"というフォルダが作成されてしまいます。
Windowsはパス区切りが複数回続けて書いても問題ないですがMacは駄目です。

```vb
csvanchors = Driver.FindElements(By.XPath, "//a[@data-file_type='CSV']")
↓
csvanchors = Driver.FindElements(By.XPath, "//a[@data-file_type=""CSV""]")
```
CSVのところは、ダブルクォーテーションにしないと正しい結果が得られませんでした。

# 最後に
シンプルになったのはバージョンが上がったからかも知れませんね。
他の言語でも同様にシンプルに回避できるようになっているかは確認していません。
Ethernet SoftWare Component requirements and specification, Ethernet(20)

データに関する記事を書こう！
https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。

 <この項は書きかけです。順次追記します。>
# data centered design
与件中心設計は、dataの構造設計を十分に生かした処理体系を考えることから始める場合がある。

# address transformation
自己ECU内のMac Address, IP Addressを、自己処理に引き渡す方法を確立する。
## MAC address transformation
自己MACアドレスであれば、以降の処理を省略し、内部処理に引き渡すかどうかを検討する。

## IP address transformation
自己IPアドレスであれば、以降の処理を省略し、内部処理に引き渡すかどうかを検討する。

# Ethernet data structure
Ethernetのデータ構造を、そのままアプリケーションで利用するためには、
暗号化をどう扱うかを決めておくとよい。

データ暗号化をアプリケーションで利用できるようにするほか、
プレゼンテーション層、セッション層でも暗号化に対応できるようにするとよい。

# softether
アプリケーションがsoftetherを利用できるようにするとよい。

# X on Ethernet
場合によててゃ、X on IPも検討する。

## CAN on Ethernet
CAN通信のパケットをEthernetに乗せて送る手順を確立する。

## Lin on Ethernet
LIN通信のパケットをEthernetに乗せて送る手順を確立する。

## FlexRay on Ethernet
FlexRayのパケットをEthernetに乗せて送る手順を確立する。

# 課題
## セキュリティ
Software Componentでセキュリティを扱う方法を用意する。

## Diagnostics
アプリケーションそう、プレゼンテーション層、セッション層は、Software Componentで扱うとよい。場合によっては、Diagnostics Software Componentを定義するとよい。

## Calibration
EthernetまたはWi-Fiで処理することを前提として設計し、
場合によっては、CAN on Ethernet, CANでも実現できるようにする。

# 参考資料
成功体験は語っても、成功体験に頼らないために。清水吉男・田中伸明・柏原一雄・佐々木 眞一。仮説（153）
https://qiita.com/kaizen_nagoya/items/d32adfaf7b2568bfd9d2

データ構造とプログラム構造の複雑さで迷う
https://qiita.com/kaizen_nagoya/items/11c177ebb7b25e23ebff

データ技術の方向性
https://qiita.com/kaizen_nagoya/items/aaaa9e739ba1baf6528f

アメリカ留学、アメリカ就職の代わりに行ったこと。行なっていること。英語(33) 仮説(111)
https://qiita.com/kaizen_nagoya/items/9f8e791bd6be3bed34bb

オブジェクト指向まとめ（描きかけ） 仮説(65)
https://qiita.com/kaizen_nagoya/items/c558ce2d77721a85d0cc

巫女さん中心駆動設計(Miko Centered and Miko Driven Design)。仮説（58）
https://qiita.com/kaizen_nagoya/items/62f3cf7b9b67b57ae95f

猫中心設計。仮説（25)
https://qiita.com/kaizen_nagoya/items/d409c1185df30f660adc

分析と設計。仮説（122）
https://qiita.com/kaizen_nagoya/items/d7341c407026af61f216

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 　20220327
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
vagrant+virtualboxでwp core check-updateがなぜかSuccessになる

# 結論
Vagrantfileのpublic_networkが有効になっていないことが原因でした。
つまり仮想環境からネット上への通信が許可されていなかった状態でした。
具体的には以下の行のコメントを外します。

```
config.vm.network "public_network"
```

これによりパブリックネットワークが設定されvirtualbox内からネットにアクセスできるようになります。

# 起こっていた問題
wordpressのコアにアップデートがあるかを確認するために
以下のコマンドを打ちました。

```
$ wp core check-update
Success: WordPress is at the latest version.
```

この時、実はwordpressのバージョンが古いことは認識していたので上記の出力は違っていることがわかりました。

# 正しい出力
結論で書いたVagrantfileのコメントをはずして実行すると以下のようになりました。

```
$ wp core check-update
+---------+-------------+----------------------------------------------------------------+
| version | update_type | package_url                                                    |
+---------+-------------+----------------------------------------------------------------+
| 5.8.4   | minor       | https://downloads.wordpress.org/release/ja/wordpress-5.8.4.zip |
| 5.9.2   | major       | https://downloads.wordpress.org/release/ja/wordpress-5.9.2.zip |
+---------+-------------+----------------------------------------------------------------+
```

# 環境
Vagrant+virtualbox+wordpressにてローカル環境を構築していました。

# 状況
久々に触ったということもあり、前述の設定を忘れていましたのでログとして残します。Macで運用していたデータをwinに移動して立ち上げたという状況で今回の問題に当たりました。

# 備考
他の仮想環境、アプリやgithubなどのストレージでも今回のようにネットワークを開けていないと同じ問題になると思います。
PHPからDBにデータを挿入する方法

・PHPからDBにデータを挿入する方法
～はじめに～
`insert into`でデータを挿入することが可能だが、いたずらされる可能性がある。
そのため、以下の方法でデータを挿入する方が良い。

～推奨方法～
`prepare`、`bind_param`、`execute`を使う。
例)挿入するデータ(カラムの種類)が1つの時
```
<?php
$db = new mysqli("localhost:8889", "root", "root", "mydb");
$input = "入力値";
$statement = $db->prepare("insert into data(memo) values(?)");
if (!$statement) {
    die($db->error);
}
$statement->bind_param("s", $input);
$return = $statement->execute();
if ($return) {
    echo "データを挿入しました";
} else {
    echo $db->error;
}
?>
```
補足画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2596732/ba241f8f-f161-0808-092f-55b8379da356.png)
※$statement->execute()でデータ挿入の実行

例)挿入するデータ(カラムの種類)が複数の時
```
<?php
$db = new mysqli("localhost:8889", "root", "root", "mydb");
$input1 = "入力値";
$input2 = 2;
$statement = $db->prepare("insert into data(memo1, memo2) values(?, ?)");
if (!$statement) {
    die($db->error);
}
$statement->bind_param("si", $input1, $input2);
$return = $statement->execute();
if ($return) {
    echo "データを挿入しました";
} else {
    echo $db->error;
}
?>
```
補足画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2596732/02095646-92bf-1930-dc18-b79173d6cd67.png)
WSL2でaws-vaultが使えるようになるまで

## はじめに

WSL2でaws-vault使えるようにするための手順を忘備録として書きます。
検証環境はWSL2のUbuntu20.04です。
なお、以下のコマンドでWSLのバージョンの確認ができます。

```
$ wsl -l -v
```

前提として必要なライブラリをインストールします。

```bash
$ sudo apt install build-essential curl git
```

今回はHomebrew経由でインストールするので、まずHomebrewをインストールします。
以下のページの「インストール」のコマンドを実行します。
https://brew.sh/index_ja

```
# 2022年3月時点
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

インストール後に以下のコマンドを実行します。

```
$ echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.profile
$ eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
$ brew install gcc
```

以下のコマンドでヘルプが表示されることを確認して下さい。

```
$ brew help
```

aws-vaultをインストールします。

```bash
$ brew install aws-vault
```

以下のツールが必要なのでインストールします。

* [pass](https://www.passwordstore.org/)
* [GnuPG](https://gnupg.org/)

```
$ brew install pass gnupg
```

GPGの鍵を作成します。
名前とメールアドレスとパスワードなどを入力します。

```
$ gpg --gen-key
```

キーが作成できたかどうかは以下のコマンドで確認できます。

```bash
$ gpg --list-keys
```

![Snag_885e33b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/e8bcef1b-8e0f-1419-9be1-e4a6747e608e.png)


passを初期化します。
以下のコマンドを実行してください。
キーIDは`gpg --list-keys`コマンドの実行結果から参照して貼り付けてください。

```bash
$ pass init <キーID>
```

![Snag_88759ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/02336fa8-f1e1-a383-dd8d-250076f16d70.png)

~/.bashrcか~/.zshrcに以下を追記してターミナルを再起動します。

```
export AWS_VAULT_BACKEND=pass
export AWS_VAULT_PASS_PREFIX=aws-vault
export AWS_SESSION_TOKEN_TTL=3h
```

プロファイルの設定を実施します。
コマンド実行後にIAMユーザのクレデンシャル情報を聞かれるので適宜入力します。

```
$ aws-vault add <プロファイル名>
# サンプルではawsというプロファイルを追加する例
# aws-valut add aws
```

以下のコマンドで設定したプロファイルが登録されているかどうかを確認します。

```
$ aws-vault list
```

以下のコマンドが正しく実行されることを確認して下さい。

```
$ aws-vault exec <プロファイル名> -- aws s3 ls
```

次に~/.aws/configファイルを修正します。
AWSのアカウントIDとユーザ名は適宜変更してください
※awsというプロファイルを追加したので以下のようになっていますが、profileの後の文字は追加したプロファイル名によって変わります。

```:~/.aws/config
[profile aws]
mfa_serial=arn:aws:iam::<AWSアカウントID>:mfa/<IAMユーザ名>
```

![Snag_7aa3b0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/b88cc214-ce6f-f9cb-354d-fb6cb8db751d.png)

再度以下のコマンドを実行してみましょう。

```
$ aws-vault exec aws -- aws s3 ls
```

すると今度はMFAの入力を求められると思います。
MFAの4桁の数字を入力すると実行結果が表示されると思います。

![Snag_7e028b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/027b7182-e0cc-1b33-965f-97ff08c2b232.png)


### トラブルシューティング1

以下のエラーが出る場合、
aws-vault: error: exec: aws-vault sessions should be nested with care, unset AWS_VAULT to force

以下のコマンドを実行します。

```bash
$ unset AWS_VAULT
```

### トラブルシューティング2

以下のエラーが出る場合、
gpg: *警告*: サーバ'gpg-agent'はこちらより古いです(2.2.19 < 2.3.4)
gpg: problem with fast path key listing: IPCパラメータエラーです - ignored
gpg: 公開鍵の復号に失敗しました: タイムアウトです
gpg: 復号に失敗しました: タイムアウトです

以下のコマンドを実行します。

```bash
$ gpgconf --kill all
```
vimのコマンドモードのカーソル移動でCtrl+FやCtrl+Bを使えるようにする


vimrcに以下を追記する

```vim
cnoremap <C-A> <Home>
cnoremap <C-F> <Right>
cnoremap <C-B> <Left>
cnoremap <Esc>b <S-Left>
cnoremap <Esc>f <S-Right>
```


`:help cmdline-window`でマップ例を確認できる
データ件数10,30,100。「@torifukukaiou【毎日自動更新】データに関する記事を書こう！ LGTMランキング！」に基づいて

データに関する記事を書こう！

https://qiita.com/official-events/30be12dd14c0aad2c1c2

テーマ2『データに関する記事を書こう！』参加記事です。

データの件数が１０件、３０件、１００件と三段階で分析してみるとよいという経験則があります。

データ件数10,30,100。三段統計活用法

https://qiita.com/kaizen_nagoya/items/d40437f8a0714afc16b1

Qiita記事三段階分析10,30,100 (1)

https://qiita.com/kaizen_nagoya/items/e5142a6ed5186e65e79b


【毎日自動更新】データに関する記事を書こう！ LGTMランキング！

https://qiita.com//items/b10fa94764aaaa2c6db1#_reference-400d4b83fd984654b76d

で、データが100件になる前に、予備分析をしてみようかなって思います。

「@torifukukaiou 【毎日自動更新】データに関する記事を書こう！ LGTMランキング！」

https://qiita.com/kaizen_nagoya/items/47a0b0c8be62b4c30484

まだ、３０件データが揃っていない状況では、自分以外の人からのリンク数が大事そうだということが推測できました。

与件網(data network)が凡人網(ordinary people network)

https://qiita.com/kaizen_nagoya/items/9ca08075fb424efdc559

投稿者ごとの記事数は分析対象にしない。
行事の趣旨として、記事数の要請があるわけではないから。

># 投稿者ごとのLGTM数と記事数
|No.|user|LGTM|Count|L/C|
|:----|:----|:----|:----|:----|
|1|@kaizen_nagoya|30|41|0.73|
|2|@keiji_dl|19|4|4.75|
|3|@hanaseleb|13|4|3.25|
|4|@torifukukaiou|12|4|3|

投稿者ごとのLGTM数では、１記事あたりのLGTM数を計算してみた。
何か意味があるわけではない。引き算でも、割り算でも、なんでもいい。
データ間の演算を見て感じることがあればよい。

># タグごとの記事数とLGTM数
|No|tag|count|LGTM|L/C|total tag|C/Total|
|:----|:----|:----|:----|:----|----:|:----|
|1|Qiitadelika|55|85|1.54|60|91.6|
|2|AdventCalendar2022|44|41|0.93|331|13.2|
|3|データ分析|15|15|1|2,061|0.7|
|4|データサイエンス|11|26|2.36|1,234|0.8|


タグごとの記事数は、どういうタグに人気があるかを確認するとよい。

社会事象は受動測定は不可能である。
能動測定の能動の意思をつかむことが分析の鍵の一つになる。

Qiita全体で、そのタグがどれくらいの記事数があるかをTotal tagに記録した。

># タグごとのLGTM数と記事数
|No|tag|LGTM|Count|L/C|total tag|C/Total|
|:----|:----|:----|:----|:----|----:|:----|
|1|Qiitadelika|85|55|1.54|60|91.6|
|2|AdventCalendar2022|41|44|0.93|331|13.2|
|3|Python|28|6|4.66|62,687|0|
|4|データサイエンス|26|11|2.36|1,234|0.8|
|5|delika|21|8|2.62|9|88.8|
|6|Microsoft|19|4|4.75|1,023|0.3|
|7|テキストマイニング|16|1|16|81|1.2|
|8|データ分析|15|15|1|2,061|0.7|
|9|40代駆け出しエンジニア|12|4|3|90|4.4|
|10|PowerPlatform|10|3|3.33|313|0.9|

Pythonは、元記事が多く、0.009%で限りなく０に近い。
[React アニメーション]簡単なサイドバーのアニメーションからFramer Motionに入門してみる。

サイドバーの開閉のアニメーションにframer-motionを使ったので、記事にしてみます。


サイドバーのアニメーション程度だったら他のライブラリを使うのもありかもしれません。
ただ、ある程度高機能なものを使えるようになっておいた方が、リッチなUIのアプリに対応できるので今回はframer-motionを選びました。Framer Motionは

[Framer Motion](https://www.framer.com/motion/)

npm trendsをみても順当にシェアを伸ばしているので、これからも使われていきそうですね。
https://www.npmtrends.com/framer-motion-vs-motion-vs-react-motion-vs-react-spring-vs-react-transition-vs-react-transition-group


## アニメーションをつける前のサイドバー

とりあえず、アニメーションをつける前のコードを載せておきます。

```tsx
const SideMenuArea: React.FC<Props> = ({ setIsOpenSideMenu, isOpenSideMenu }) => {
  const sideMenuWidth = 336;

  return (
    <>
      {isOpenSideMenu && (<aside
        className="h-screen"
        css={css`
          min-width: ${isOpenSideMenu ? sideMenuWidth : 0}px;
        `}
       >
        サイドバーに表示したい内容。ナビゲーションとか、グラフとか。
      </aside>)
    <>
  )
}
```

## サイドメニューにアニメーションをつける。
次にインストールと、動くコードです。

```
$ yarn add framer-motion
```

```tsx
const SideMenuArea: React.FC<Props> = ({ setIsOpenSideMenu, isOpenSideMenu }) => {
  const sideMenuWidth = 336;

  return (
    <>
      <AnimatePresence>
        {isOpenSideMenu && (
          <motion.aside
            className="h-screen"
            css={css`
              min-width: ${isOpenSideMenu ? sideMenuWidth : 0}px;
            `}
            initial={{ opacity: 0 }}
            animate={{ opacity: 1, x: 0, minWidth: isOpenSideMenu ? sideMenuWidth + 'px' : 0 }}
            exit={{
              opacity: 0,
              x: 0,
              width: 0,
              minWidth: 0,
              transition: { opacity: { duration: 0.3 }, duration: 0.8 },
            }}
            transition={{ duration: 0.8 }}
          >
            サイドバーに表示したい内容。ナビゲーションとか、グラフとか。
          </motion.aside>
        )}
      </AnimatePresence>
    <>
  )
}
```

ここでは、framer-motionのAnimatePresenceとmotion.aside(motion.~~)を使っています。

### AnimatePresence

AnimatePresenceをつけることで、コンポーネントを削除したときにもアニメーションが効くようになります。

そのため、上記のコードからAnimatePresenceを削除すると、サイドバーを開く場合にはアニメーションするのですが、閉じるときにアニメーションしないようになります。

今回はコンポーネントを削除するので必要ですが、別のシチュエーションで、コンポーネントを削除せずにアニメーションをつけたい場合は不要になります。

[AnimatePresence]([https://www.framer.com/docs/animate-presence/](https://www.framer.com/docs/animate-presence/))

### motion.~~

framer-motionでは、motion.の後にhtmlタグをつけることで、animationの対象とすることができます。例えば、motion.divのようにも書くことができ、今回はasideタグをanimationさせたいので、motion.asideとしています。

このタグのプロパティにアニメーションさせたい内容を書きます。アニメーションさせたい内容がanimateプロパティに書かれることが多そうです。今回はサイドメニューの開閉時にアニメーションをつけたいので、initialとexitを追加して、animateとの差分で変化していきます。

initialとanimationとexitがあれば一応動くのですが、アニメーションの時間も調整したいですね。transitionを書けば簡単に指定できます。さらに、transitionを複数箇所に設定することで、細かく調整することもできます。

```tsx
<motion.aside
  // ~~
  exit={{
  opacity: 0,
  x: 0,
  width: 0,
  minWidth: 0,
  transition: { opacity: { duration: 0.3 }, duration: 0.8 }}}
  transition={{ duration: 1 }}
>
```

上記のコードではmotion.aside直下のtransitionで、まず全体のtransitionを設定しています。
さらに、exitの中で、exit全体のdurationとopacityのみのdurationを切り替えています。
これで、サイドメニューが消える前に、先にコンテンツが消えるようにできます。
Rails チュートリアルを終えて



　Qiita初投稿です。私は現在、都内の私立大学の新3年生です。昨年の夏頃からプログラミングに興味を持ち、独学による学習を続けてきました。Virtual Box を利用した環境構築、「Rails Tutorial」やDotinstall など様々な教材に触れてきました。これらの経験から現状を振り返り、これからの目標設定を考えたいと思います。

　※この記事は第三者に閲覧していただくことを目的としていません。あくまで、自己完結する記事となります。

現在の目標は、SNSアプリをポートフォリオとして作成することです。そのために必要な知識をqiita などを通じて模索する予定です。

これまでやったこと(3/27現在)
• Rails Tutorial 
一周目: 理解度は60%ほど。章にもよるが、一章を読むのに2~3日ほどかかった。モチベの維持が難しいと感じた。開発の大まかな概要を理解した。
二周目: コードの細部やテスト(TDD)の流れ、REST API など一周目では見落としていた概念を理解した。また、各リソース毎に仕組みを適宜、紙などにフローチャートなどで分かりやすくまとめた。しかし、レイアウト関連のCSS, JavaScript などはコードのコピペであった。

次に、Rails Tutorial の知識を元に想定した課題を箇条書きで書いた。

目先の課題
• Docker
- Docker-compose によるコンテナ作成。Dockerは事実上のデファクトスタンダードのようなので、基礎を学習する。Docker-compose.yml を含む、関連ファイルのある程度のコードが理解できるように学習を進める。

• MySQL
- Rails Tutorial ではDBにPostgreSQLを利用したが、MySQLの方が理想的であることがQiitaでのポートフォリオ関連の投稿から分かるため採用する。


これからの課題

• CSS (Bootstrap)
- レスポンシブデザインのアプリを開発するために必須の知識。最低限の知識をつける。
• Rspec
- 標準のテストフレームワーク
• Git
- 開発に必須なので基本は押さえる。
• AWS
- デプロイに利用。
• CircleCI

学習に利用させていただく記事一覧
Ruby on Rails チュートリアル全まとめ(解説・単語・演習) - Qiita
いまさらだけどDockerに入門したので分かりやすくまとめてみた - Qiita
いまさらだけどGitを基本から分かりやすくまとめてみた - Qiita

その他、独学者による様々なポートフォリオを参照する予定です。
三項演算子

## 使用用途
- if文に似たようなもので、条件式がTRUEの場合に真の式を返し、FALSEの時は偽の式を返す。
- if文よりもコンパクトに見える。

:::note warn
注意
if文とは異なり、演算子なので結果として式を返す。　
if文のように条件に応じた処理を記述するものではない。
多用すると可読性が低下する。
:::

## 使い方
``` php:三項演算子
条件式 ? 真の式 : 偽の式
```

``` php:例
<?php
$value1 > $value2 ? "value1はvalue2より大きい" : "value1はvalue2より小さい";
?>
```

?の前が条件。
その次がTRUEの際の式。
その次がFALSEの際の式。

例文の場合、条件式がTRUEであれば、「value1はvalue2より大きい」が返る。条件式がFALSEであれば、「value1はvalue2より小さい」が返る。


### この式をif文で書いた場合
``` php:if文で書いた場合
<?php
if ($value1 > $value2) {
  echo "value1はvalue2より大きい";
} else {
  echo "value1はvalue2より小さい";
}
?>
```

## 三項演算子のネスト
``` php:三項演算子のネスト
(条件式1 ? 真の式1 : (条件式2 ? 真の式2 : 偽の式));
```
まず初めに、条件式1のTRUE、FALSEを判断し、TRUEの場合は真の式1が返される。
FALSEの場合は条件式2に移り、その結果によって真の式2または偽の式が返される。
　
　
　
この記事は以下の情報を参考にして執筆しました。
- https://qiita.com/rana_kualu/items/748dba779148152301ff
Spring bootのアノテーションについて（@RequestParam）

現在学習しているSpring bootにて基礎的なアノテーションの@RequestParamについて再度学習したので、アウトプットも兼ねてまとめます。

## ①RequestParam

ブラウザからのリクエストの値（パラメータ）を取得することができるアノテーション。
### Controllerクラス
```java

public String example(@RequestParam("message")String message Model model ) {

Model.attribute("message", message);

return "example";

}

```
### View（HTML）
```html
<p th:text = “${message}”></p>
```
http://localhost:8080/~?message=example
上記のようにリクエストの際に

>message=example

とすることで、
①RequestParamの"message"にexampleという文字列が代入される。

②String message = exampleとなる。

③th:text = “${message}”で、htmlにはexampleと表示される。

## 変数の省略
RequestParamの変数名と関連づける引数の変数が同じな場合は、省略できる。

```java
@RequestParam("message")String message

@RequestParam String message
```


RequestParamを使用した場合、デフォルトでは値の入力は必須なので、何もないとエラーになる。

例)＠RequestParam (“message”) String messageの状態で、

http://localhost:8080/
のみ（パラメータに値を渡さない）とエラー

エラーを出さないようにするためには、required = false にする。
```java
@RequestParam(required = false)
```

デフォルト値の設定も可能。
```java
@RequestParam (defaultValue = "hello") String message
```
グラフィカルモデルをmermaid.jsを使って良い感じに書きたいんだけど...

# はじめに
最近、Bayesian Approachによる回帰モデルを活用する機会が有り、その際にグラフィカルモデルを描きたいと思ったんですが、どんなツールで書くべきか迷ってしまいました。
一方で世の中にはmermaid.jsというものがあり、「最近githubでmermaid記法を使えるようになった！」という話題をtwitterで目にしたので、「mermaid.jsを使えば楽にグラフィカルモデルを書けるのでは？」という考えに至りました。
本記事では、グラフィカルモデルをmermaid.jsで描く為に使えそうなtipsをまとめました：）
# グラフィカルモデルって例えばこんな感じ
例えばこんな感じのグラフィカルモデルを書きたいんです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697279/581af383-8bed-17e9-668b-84307e019830.png)

# mermaid.js でノードの形を変更する
括弧を使い別ける事で、ノードの形を変更できるようです。

```mermaid
graph TD
    a
    b[テキスト入りノード]
    c(丸括弧形ノード)
    d((円形ノード))
    e>非対称形ノード]
    f{ひし形ノード}
```

こんな感じになるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697279/a1c4e2aa-7f0e-fd75-f2a2-666723c45476.png)

なお、グラフィカルモデルにおいては、基本的には円形ノードを使っていきます。

# mermaid.js でノードの色を変更する

CSS の記法(?)が使えるようです。

```mermaid
graph LR
    start(x)-->stop(y)
    style start fill:#f9f
    style stop fill:#ccf
```

こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697279/693a8960-9b12-9c9b-da30-2154f1903635.png)

また、**ClassDef を使う事で、複数のノードに同一のテーマを適用できる**ようですね。`ノード名:::クラス名`と記述します。

なおグラフィカルモデルにおいては、観測されていない確率変数は塗りつぶさず、観測されている確率変数は塗りつぶして表します。なので、ClassDef で観測変数と見観測変数のスタイルをそれぞれ定義して、使い分けたいです。
(ちなみに既知の定数は塗りつぶした点で表します。)
なので例えば、

```mermaid
graph LR
    classDef observed fill:white
    classDef non-observed fill:#EEEEEEE
    x((X)):::non-observed -->y((y)):::observed
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697279/3d170fd2-8420-0470-c157-6035ede967f2.png)


# 繰り返しのノードを枠で囲む

サブグラフを用いれば、特定のノードを枠で囲める様ですね。
例えばこんな風に。

```mermaid
graph LR
    classDef observed fill:white
    classDef non-observed fill:#DDDDDD
    subgraph a[N]
        x((x)):::non-observed --> y((y)):::observed
    end
    z((z)):::non-observed --> y
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697279/8d41ed61-eceb-5538-9f1a-2158006fb9df.png)

# おわりに
とりあえずこれで何とか、グラフィカルモデルっぽい図は書けそうな気がします。(気がするだけで、実際には決して最適解ではないと思います...!)
皆さんはグラフィカルモデルをどうやって書いてるのでしょうか？オススメのツール等があればぜひコメント等で教えていただければ嬉しいです：）
draw.io等で手書きすべきなのかー。
# 参考
- 【目的無しの泥臭調査⑤】mermaid.jsの記法を覚えて、楽しく図を描く。
  - https://qiita.com/t_o_d/items/ac5b04419252f768a535
- Mermaid のテーマ・スタイルの変更方法
  - https://zenn.dev/junkawa/articles/zenn-mermaidjs-theme-config
- CSS カラーコード
  - http://www.netyasun.com/home/color.html
Python(Django)でダッシュボード作る(WSL2)

# はじめに
こんにちは。私用でPythonでダッシュボードをつくってみる機会があったので記事にしてみました。

PythonはじめてですのでWSL2へのインストール等々から始めていきます:pray:

参考になれば幸いです:smile:

# Djangoとは
Djangodは、Pythonで実装されたWebアプリケーションフレームワークです。

日本語のドキュメントもあるので助かります:bow:

https://github.com/plotly/dash

# 1. Python3がインストールされているか確認する

```
$ python3 -V
```

# 2. 1でインストールしてなかったらPython3をインストールする
```console
$ sudo apt-get update
$ sudo apt install python3 -y
```

# 3. pipがインストールされているか確認する

```console
$ pip -V
```

# 4. 3でインストールしてなかったらpip3をインストールする

```
$ sudo apt-get update
$ sudo apt install python3-pip -y
```

# 5. ダッシュボードのテーマをclone
今回は以下を使っていこうと思います。
README.mdを読みながら進めているので、本記事の更新が古い場合はREADME.mdを参考にいただければ幸いです:pray:

https://github.com/app-generator/django-volt-dashboard

```console
$ git clone https://github.com/app-generator/django-volt-dashboard.git
$ cd django-volt-dashboard
```

# 6. virtualenvをインストールする

```console
sudo apt install python3-virtualenv -y
```

# 7. 仮想環境の作成

```console
$ virtualenv env
$ source env/bin/activate
```

# 8. 必要なパッケージをインストール

```console
$ pip install -r requirements.txt
```

# 9. マイグレーション実行

```
$ python manage.py makemigrations
$ python manage.py migrate
```

# Webサーバ立ち上げ

```
$ python manage.py runserver
```
 
以下にアクセスしてページが表示されればOK！

http://127.0.0.1:8000/

最初はユーザがいないのでSignUpページで作成後、ログインすると色々ページを見ることができます。
この時点でログインの機能が備わっているがうれしいところ。


# おわりに
この先はいろいろtemplateをいじって変わるのを確認してみるのが、全体の動きをざっくりつかむコツかもしれません。

LaravelやRailsを使ってきた私からすると、DjangoのMTVフレームワークの理解が少し難しそうですが、ちょっとずつ慣れていければと思いました。

それでは！