OmniAICreator/Qiita-1.07M huggingface dataset:
Unity ShaderGraph レシピ #6 ランバート反射でライティング

#ランバート反射でライティング
![gif_animation_008.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/6e40f2de-77f1-7f35-8b2f-7bb7788de34b.gif)


#作り方
ライトを適用せずにただテクスチャを貼っただけのモデルは立体感がありません。（図はただの緑のテクスチャを貼っただけのティーポット）
陰影が無いからです。
この印影をつける処理をシェーディングといいます。もともとシェーダとは陰影をつけるプログラムのことを指しました。古の話です。

![スクリーンショット 2020-12-28 1.15.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/a8868ab6-a79c-872b-3d1e-937d72c8d063.png)

最もシンプルな陰影の付け方ですが、メッシュの頂点を、ライト方向を向いているものは明るく、逆側を向いているものは暗くします。
ライトの方向ベクトルとメッシュの法線で内積を取ることで、頂点がライト方向を向いているか否か判定できるので、その結果を元に明るさを変更します。
これを　[ランバート反射モデル](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%90%E3%83%BC%E3%83%88%E5%8F%8D%E5%B0%84)といいます。

### 1.ライトがあたっている強さを計算
ライトベクトルとメッシュの法線の内積結果は(-1〜1)になります。
ライトの方を向いているほど1に近く、逆を向いているほど-1に近くなります。
このままだとテクスチャカラーと乗算する時に都合が悪いので明度を0〜1の間にまるめます。
具体的には結果に0.5を掛けて-0.5〜0.5の範囲にした後、0.5を足して0〜1の範囲にします。

![スクリーンショット 2020-12-28 1.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/a2e51b64-9df1-95ba-213d-241e343e4ffc.png)

これでライト方向を向いてる頂点ほど明るく、そうじゃないものほど暗くすることができました。

### 2.ライトカラー適用
先程の明度情報にライトカラーを乗算します。白だとテクスチャカラーそのままで陰影が付きます。今回は黄色。
![スクリーンショット 2020-12-28 1.33.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/aecfb16a-8cb7-e33b-a9a8-92e78d0af0be.png)

### 3. テクスチャカラー適用
先程の明暗付きライトカラーとテクスチャカラーを乗算します。
![スクリーンショット 2020-12-28 1.44.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/c2dc31b3-f2de-6355-e5b8-bd75c03d3edb.png)



###完成！
![スクリーンショット 2020-12-28 1.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/1bd7ba81-56d7-78f2-ee27-ee9cdc622656.png)
![スクリーンショット 2020-12-28 1.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/09ee7666-4304-dee6-7f39-a0f78873a0aa.png)


---
その他のレシピは[ShaderGraphレシピ一覧](https://qiita.com/Teppy/items/73fc6141751a62f5265d)にまとまっています
QuickSight で対応していない日付フォーマット(yyyymmddhhmiss, UTC)を扱う。

# QuickSight で対応していない日付フォーマットを扱う。

## 課題

日付のフォーマットが”yyyymmddhhmiss”,UTCを扱う必要があったが、フィールドでDate型を指定すると検証でエラーとなる。

## 結論

関数（parseDate, concat, substring）を駆使して日付フォーマットに変換する。

## 対応

データセット画面にて、計算フィールドを追加
![image-20201228013411491.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/003e032f-f41a-70e2-3588-5d33ea24acd3.png)


下記式にて変換。文字を分解して、Tを付けつつ parseDate にて日付に変換を実施。

```
addDateTime(9,"HH",
    parseDate(concat( substring({accept_order_date},1,8), "T", substring({accept_order_date},9,6)) , "yyyyMMdd'T'HHmmss")
)

```



accept_order_date　を受注日時というフィールドに再定義
![image-20201228013851178.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/3d9e66c6-c55c-8b81-0b5e-c540424b483c.png)


## 実行結果

データセットで見てみます。うまく日付に変換できました。
![image-20201228013944045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/eb88bfdb-be96-00fa-ab27-e584d3e57328.png)
未経験3年目のwebエンジニアが今年使った技術まとめ2020

# はじめに

今年も終わりそうです。

2020年ってどんな技術使ったけな〜〜〜ってメモです。

## フロントエンド

### FW

相変わらず [Nuxt.js + TypeScript](https://ja.nuxtjs.org/) です。

今のお仕事では [Composition API](https://composition-api.nuxtjs.org/) も導入され、次バージョンへの追従もされています。

### CSSライブラリ

今のお仕事では [TailwindCSS](https://tailwindcss.com/) を使っています。

要素にtailwindが提供するclassをいっぱい当てていく感じで、まじでCSSを書く量が減ります。

tailwindが提供しているclassを使って、独自のclassを作ることもできるのですぎょいなぁって思います。

### UIライブラリ

[Vuetify](https://vuetifyjs.com/ja/) か [ElementUI](https://element.eleme.io/#/en-US) を使うことが多かったです。

どちらも使いやすいのですが、１つ残念なのはElementUIはレスポンシブ対応ではないので、そこだけちょっと悲しいです。

## バックエンド

今年の夏くらいまで`Pyramid + SQLAlchemy (Python)`を使用していましたが、今のお仕事からは [Nest.js](https://nestjs.com/) を使用しています。

アノテーションつけるとSwaggerが作られたり、Swaggerのjsonからフロントエンドの型とAPIコール用の関数を生成する [openapi2aspida](https://github.com/aspida/openapi2aspida) と一緒に使うと、フロントエンドで書く型が激減して幸せになれました。

## インフラ

お仕事ではほぼ`AWS`しか使ってないです。

管理はほぼ全部 [Terraform](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) です。

もともと`ALB -> EC2 + Nginx + Docker`で動かしてた構成を、今年は`TerraformでALB -> ECS for EC2`な環境を作り出す事ができました。

cronを使っていた定期バッチは `CloudWatch Event + スケジューリングされたタスク` で `実行環境に依存しないcron` を作ることもできました。

構成変更のおかげで、１からECSで運用するまでのmoduleを作ったり、ECSで運用する用のCloudFrontのmoduleを作ったりして、AWS・Terraformの知識が上がりました。

CircleCIとかだと、公式で自動デプロイ用のプラグインがあるのですが、お仕事ではGitLabを使用しているので、自動デプロイのフローやスクリプトは`AWSCLI`を使って自前で書きました。

おかげでCIのフロー分けの知見が溜まったり、シェルスクリプトもすこし書けるようになりました。

また個人的には[Terraform Registry](https://registry.terraform.io/modules/raisaaaan/ses/aws/latest)にSESを簡単に作成できるmoduleを公開するって事もしてみました (小声)

## おわり

来年は今年作ったECSの環境を`k8s`に置き換えられるようにしたいです。

もう社内では取り組まれていますが、自分の知識がまだ追いついていないので、時間を見つけて勉強したいと思っています。
【Rails6】mysqlのlocalデータをターミナルからdump！

## 経緯
Rails6とmysqlを使用して個人開発中です。（なんちゃってアプリを作っています）ローカルのデータベースを頻繁に更新するのでdumpしたいと思いましたがググって出てきた記事だとエラーが起こるので、色々試して、やっとうまくいくコマンドを見つけました。

## 結論

以下のコマンドを、アプリのディレクトリでターミナルから実行すると `db/dumpしたファイル名.dump` にdumpされます。

```console
$ sudo mysqldump -u root -p -t アプリケーションのデータベース名 dumpしたいテーブル名 dumpしたいテーブル dumpしたいテーブル名... > db/dumpしたファイル名.dump
```

## 例

```console
$ sudo mysqldump -u root -p -t sample_app_development users posts comments > db/sample_app_development.dump
```

## ちなみに

以下のコマンドがうまく行かなかったコマンドです。

```console
$ sudo  mysqldump -u root -p -t sample_app_development users posts comments > db/sample_app_development.dump

# 以下エラー
Enter password: 
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect
```

このエラー文が出てきて、MySQLのパスワードを変更したりしましたがうまくいかず、、、
辿り着くまでに3時間くらい無駄にしたので、もし参考なるところがあると幸いです。

参考
https://tech.dely.jp/entry/rails6_multiple_db
https://qiita.com/k-yamada-github/items/e8dbd6f53c638a930588
https://qiita.com/kumamotone/items/086d6fe150738b5d2c3c
study-AI E資格講座 応用数学 レポート 

＜目次＞
　１．線形代数
　２．確率・統計
　３．情報理論


１．線形代数
　1) 固有値・固有ベクトルの求め方を確認する。
　　　ある行列Aに対して，以下のような式が成り立つ
　　　　A・x(ベクトル）＝係数λ・x(ベクトル）
　　　係数λを固有値、x(ベクトル）を固有ベクトルという
　
　　　固有ベクトルは「のうちの一つ」と表される。つまり固有ベクトルの値は定数倍しても
　　　同じ性質を持つ。
　　　
　　　(a)固有値の求め方
　　　　｜A－λI（単位行列｜＝0　を満たすλを求める。
　　　　λは複数解をもつ
   
　　  (b)固有ベクトルの求め方
　　　　λのパターンそれぞれに対して求める　　

　　　　A・x(ベクトル）＝係数λ・x(ベクトル）に求めたλをあてはめ、
　　　　矛盾のないベクトルを求める
　　　　ベクトルがX1 X2 X3 のうち、X1 X2が求まったとき、X3については1とみなす
　

　2) 固有値分解について理解を深める。
　　　　固有値を対角線上に並べた行列𝛬
　　　　固有ベクトルを並べた行列𝑉

　　　　以下の数式であらわすことができる
　　　　𝐴𝑉=𝑉𝛬
　　　　𝐴=𝑉𝛬V(の逆行列）

　　　　行列Aを３要素に分解することで以下のメリットがある
　　　　　・行列を累乗するときの計算が容易になる
　　　　　・行列の特色を見出すときに見出しやすい
　　　　
　3) 特異値・特異ベクトル、特異値分解の概要を知る
　　　　正方行列以外も固有値分解できないのかの発想。

　　　　𝑀𝑣(ベクトル)=𝜎𝑢(ベクトル）
　　　　M(転置行列）𝑢(ベクトル）=𝜎𝑣(ベクトル)
　　　　が成り立つ「単位ベクトル」があれば固有値分解に似たようなこと、
　　　　「特異値分解」ができる。

　　　　𝑀=𝑈𝑆V（転置行列）
　　　　　※U、Vは直交行列

　　　　𝑀𝑉=𝑈𝑆
　　　　↓
　　　　𝑀=𝑈𝑆V（逆行列）

　　　　𝑀（転置行列）𝑈　=　𝑉𝑆（転置行列）
　　　　↓
　　　　𝑀（転置行列）=　𝑉𝑆（転置行列）U（逆行列）

　　　　𝑀𝑀（転置行列）=𝑈𝑆𝑉（逆行列）𝑉𝑆（転置行列）𝑈（逆行列）　★Vが消せる
　　　　　　　　　　　　=𝑈𝑆𝑆（転置行列）𝑈（逆行列）

　　　　つまり𝑀𝑀（転置）を固有値分解すれば、その左特異ベクトルと特異値の2乗が求められる。


２．確率・統計
　1) 条件付き確率について理解を深める
　　条件付確率：Bの条件下でAが発生する確率

　　全体の事象Dの中のBかつAではなく、Bである前提下の中でAが発生する確率を求める
　　よってP（A|B）＝P（AかつB）／P（B）の式で表現される。

　　独立した事象の同時確率について
　　P（A)（A|B）＝P（A)（B)を証明すれば因果関係がないことが証明できる

　2) ベイズ則の概要を知る
　　ベイズ則：P(A)P(A|B)　＝　P（B）P(A|B)
　　　　　　　P(A,B) = P(B,A)
　　　　　　　P(B,A) = P(B|A) × P(A)
　　　　　　　よって　P(B,A)とP(A)が定まれば　P(B|A)を求めることができる

　3) 期待値・分散の求め方を確認する
　　期待値：その分布における，確率変数の...平均の値or 「ありえそう」な値
　　　期待値は　Σ各要素の確立P(x)×確立変数f(x)　で求まる
　　　　　　　　∫とdxで挟むことで表現もできる。

　　分散：データの散らばり具合を指す。期待値からのズレを平均化したもの
　　　分散は、値と平均値の差の二乗（プラマイ考慮。絶対値だと計算が煩雑なため）の平均
　　　を取ることでもとめることができる
　　　そのまま使うと単位が違うため平方根を取るこれを標準偏差という。

　　　似た言葉で、共分散があり、２つのデータ系列の傾向の違いを表す。
　　　正の値を取れれば似た傾向、負の値があれば逆の傾向
　　　無関係の場合はプラマイでゼロに近似していく。

　4) 様々な確率分布の概要を知る。
　　　・ベルヌーイ分布
　　　　　コイントスのように2択の選択肢の場合で、2択の発生確率が等しくなくても
　　　　　扱うことができる
　　　・マルチヌーイ（カテゴリアル分布）
　　　　　サイコロのイメージ。ベルヌーイ分布のN択版
　　　・二項分布
　　　　　ベルヌーイ分布を多数試行の実施を表しており、実現的
　　　・ガウス分布
　　　　　試行回数が多いほど釣り鐘上の分布を示し、信頼性を増すことを表す。


３．情報理論
　1) 自己情報量・シャノンエントロピーの定義を確認する
　　　自己情報量：１０個の中の１個、２個の中の１個でインパクトが違う。自分の中で
　　　　　　　　　持っている情報量Wを示す指標
　
　　　　log(W(X)) で表すこともできるが、扱いづらいため、
　　　　-log(P(X)) で確率を使って表すこともできる。
　　　　対数の底がネイピアのeのとき，単位は(nat)。
　　　　ただしツートンの２bitで表現できるとよりシンプルの願いを込め、
　　　　しばしばlogが出てくる
　　　　式はツートンのlogを取るというイメージを持つとよい。
　　
 　　　シャノンエントロピー：自己情報量の期待値を指す
　　　　　　𝐻(x)=𝐸(𝐼(𝑥)
　　　　　　　  =−𝐸(log(𝑃(𝑥)) ※確率に直す
　　　　　　　  =−∑ 𝑃(𝑥)log(𝑃(𝑥)) ※シグマを取る

　　　　　　グラフにすると2択問題でどちらが出るか半々の確立の時に、一番情報量が多い

　2) KLダイバージェンス・交差エントロピーの概要を知る
　　　　KLダイバージェンス：同じ事象・確率変数における異なる確率分布P,Qの違いを表す
　　　　　Qの確率分布の予定だったものがPの確率分布だった時の「距離」を示す
　　　　　距離なのでマイナスを取らない

　　　　　Σ　P(x)(-log(Q(x))-(-log(P(x)) ※QからPの距離
　　　　　Σ　P(x)log(P(x)/Q(x))

　　　　交差エントロピー：KLダイバージェンスの一部分を取り出したもの。
　　　　　　　　　　　　　Qについての自己情報量をPの分布で平均している

　　　　　H(P,Q) = H(P) + DKL(P||Q)
　　　　　-Σ　P(x)log(Q(x))
SQLのANY/SOMEについて

SQLについていろいろと調べていて、ANY/SOMEというものを発見したので記事にしておこうと思います。
使ったことがない句なのでもしかしたらあまり使いどころがないのかもしれませんが……。
まず、以下のようなテーブルを用意します。

|Div|Name|Price|
|:-----|:-----|:-----|
|01|りんご|200|
|02|ぶどう|100|
|01|なし|150|
|03|みかん|300|
|02|ばなな|250|

```ruby:SQL
SELECT * FROM TABLE1 WHERE Price > ANY (SELECT Price FROM TABLE1 WHERE Div = '01');
```

ANY句の直後に指定されているSELECT句を実行すると、200と150が返されます。
ANYは比較演算子の条件に一つでも一致しているとTrueを返すので、この場合、Priceが150より大きいレコードがすべて返されることになります。
よって、上記のSQLを実行すると、以下のような結果が返されます。

|Div|Name|Price|
|:-----|:-----|:-----|
|01|りんご|200|
|03|みかん|300|
|02|ばなな|250|

なお、SOMEはANYとまったく同じ動きをします。
体温を毎日記録しておくためのショートカットアプリをつくった【じぶんでできるコロナ対策】


### いきさつ

体温を毎日記録しておく必要があるとき、スマホにささっと記録できるようにした。意外にも好評なので、ダウンロードできるようにしておきます。（iPhoneかiPad限定）

### ダウンロード

#### 下記をクリック

https://www.icloud.com/shortcuts/4818a3c0e0dc4a0c89d6a27f4f086104

- もしうまくダウンロードできたら「信頼されていない……追加」を押し、途中の説明は飛ばして「メモをつくる」にすすんでください。

- 何かエラーが出たら、「準備編」にすすんでください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/099373a7-086c-b2f4-7360-ce1f1cc39d77.jpeg" width=80%>

### 準備編

#### 準備①ショートカットをいちど実行する

- ショートカットアプリを開き、「＋」を押して、新規ショートカットを作成
- アクションを追加
<img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-1.jpg" width=45%> <img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-2.jpg" width=45%>

- 「Appを開く」を追加
- アプリを選択（なんでもいい）し、「次へ」
<img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-3.jpg" width=45%> <img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-4.jpg" width=45%>

- 画面右上の（…）を押し、名前をつけて、右上の「完了」を２回押す
<img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-5.jpg" width=45%> <img src="https://www.danshihack.com/wp-content/uploads/2020/09/ios-14-homescreen-custom-6.jpg" width=45%>

- 「マイショートカット」にいまつくったのができているので、押す
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/ac32e66e-df3a-d3f1-2c6e-e352b401ddb1.jpeg" width=45%>

選択したアプリが立ち上がればOK！！！（たとえばInstagram）


#### 準備②ショートカットを許可


設定 > ショートカット > 信頼されていないショートカットを許可　をオンに。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/93c08ecd-832e-3714-bb5d-759d291d5871.jpeg" width=80%>


#### もういちどダウンロード！！！

下記をクリック

https://www.icloud.com/shortcuts/4818a3c0e0dc4a0c89d6a27f4f086104

画面をスクロールして「信頼されていないショートカットを追加」を押す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/b49e1acc-5b46-b250-5e6e-887eaaf77799.jpeg" width=80%>

こんな感じになればOK。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/4b5957e3-b3bf-4eb3-93e7-a9f7596ca05f.jpeg" width=80%>

「準備①ショートカットをいちど実行する」で作成したもの（上の画面の「Instagram」）は削除してOK。


### メモをつくる

「メモ」アプリを開き、「200720_はかるん」というタイトル（だけ）のメモを作成。
「_」の入力は、下図のところにあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/29ab22ba-be02-a2c9-e097-969aec52030c.jpeg" width=45%> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/9b861f64-82a2-5621-fb13-e48450081c43.jpeg" width=45%>


### つかいかた

- ショートカットアプリを開く
- はかるんを押す
- 体温と日付を入力
- おわり

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/9232e85c-997f-b72c-823b-ddb7803b4e9a.gif" width=80%>


#### 謝辞

準備（ショートカットをいちど実行）は下記に依った。
[【解説】iPhoneのホーム画面カスタマイズ方法！アイコン変更、オシャレなウィジェットなど](https://www.danshihack.com/2020/09/24/junp/iphone-home-customize.html)
2年目のシステムエンジニアが1年目の自分を客観視してみた

#１年目と2年目で何が違うか
##1年目
・エラーを読んだ気でいる
・自分が何がわからないのか分からない
・先輩の言っていることがわからない
・とりあえず動かしてコードを書いてみる
・自分がエンジニアに向いていない気がする

##2年目

> エラーを読んだ気でいる
>

__▽エラーは、訳の分からない英単語の羅列ではない__
該当する部分をコピーしてGoogleで検索。
あなたと同じように困ってる人はネットの向こうに大量にいる。

__▽先輩への質問の仕方__
エラーの原因を検索しても解決法が分からなかった場合は先輩に聞こう。
「実装したいこと、試したこと、エラー内容、ネットの記事にはこうあった、ご存知であれば教えてください」と聞くと答えやすいかも。
___
>何がわからないのか分からない
>

__▽シンプルに基礎知識不足__
基本情報の勉強やQittaなどでとにかくインプットする、出来たらアウトプットする。Qiitaを適当に読んでみて理解できなかった単語は全部調べるくらいでいいと思う。
___

>先輩の言っていることがわからない
>

__▽自分の言葉で置き換えて再度聞く__
〜で〜だからという理解であってますか？
(違うなら違うという返事が返ってくる)

__▽先輩から自分の知らない単語が出てきた__
その場で聞けるなら聞く、無理なら記憶しておいて即調べる。
調べることを後回しにしない。
分からなかった単語は自分で口頭で説明できるようにする。
___

> とりあえず動かしてコードを書いて動かしてみる
>

__▽事前調査に時間をかけた方が良い__
公式ドキュメントを一通り読む。
その言語の書き方のお作法を調べる。
命名規則は何か調べる。
___

>自分がエンジニアに向いていない気がする
>

__▽結局続けた人が強い__
ただ経験と努力が足らないだけ。
~~早く技術で圧倒したいと思うくらいのメンタルでいい。~~

___
まだまだ知識不足ですが、1年目と2年目で意識していることは多少なりとも変わったかなと思います。
謙虚さを忘れずにこれからも仕事に取り組みたいと思います。
Raspberry Piを買った OSのインストール

# はじめに
お勉強のために購入したRaspberry PiでしたがOSのインストールにてこずったので、メモを残すことにしました。
## 用意したもの
* Raspberry Pi UD-RP4B2 amazonで購入
* ACアダプタ PS-0530C amazonで購入
* Micro SDカード BMS-32G4AA ケーズデンキで購入
* HDMIケーブルとHDMI Micro変換器
* テレビ（ディスプレイとして）
* USBキーボード
* USBマウス
* LANケーブル
* 作業用パソコンWindows10 SDカードの読み書きができるもの

## Micro SDカードにNOOBSをインストールする
NOOBSとNOOBS Liteがあります。はじめはお手軽に見えたNOOBS Liteを選んでインストールを試みたのですが、インストール中のダウンロードがあまりに遅いので断念しました(6時間で50%)。結局OSイメージ込みのNOOBSをダウンロード(約2時間)してやり直すことになりました。ネットワーク環境によるのでしょうか。
### NOOBSをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/b04144b0-84cd-df50-83f0-99f35430ac47.png)
### Micro SDカードをフォーマットする
買ってきたSDカードをそのまま利用したら起動時に```waiting for sd card (settings partition)```というメッセージが出て進まなくなったのでここからやり直しました。
使ったソフト；SDメモリカードフォーマッター(https://www.sdcard.org/jp/downloads/formatter/ )でフォーマットしました。


### zipファイルを解凍して中身をMicro SDカードに保存する。
回答したフォルダの中身をそのままSDカードの直下に入れます。フォルダごとではなく中身がSDカードの一番上の階層に来るように。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/27a16540-ec15-cbc5-90f3-bca37233e2d2.png)

### Raspberry Piの起動
![DSC_0066.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/ce59b16b-26dd-5817-8284-f6a479eda619.jpeg)
* 準備したMicro SDカードをRaspberry Piに差し込む。差込口は裏側にあります。写真でいうと基盤の左端に見えているでっぱりが差し込んだSDカードの頭になります。
* LANケーブル、USBキーボードおよびマウスを差し込む。写真の基盤の右側。
* HDMI Microのディスプレイケーブルを差し込む。下側の左から2番目のケーブルです。小さくて見えづらいですが、HDMI 0の記載があるほうに差し込みます。最初HDMI 1に差して立ち上げたのですが、何も始まりませんでした。
* 最後に電源ケーブルを差し込みます。差し込むことにより左端の赤いランプが点灯して電源が入ります。スイッチなど無いアナログ感。
* インストール中でも電源を抜けば止まりますが、その場合↑のMicro SDカードのフォーマットからやり直さなければいけない場合があります。

## OSのインストール
![16089844038722136973213130096295.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/d0a08076-8af0-3e87-8ff5-4d3808007f29.jpeg)
* 無事にNOOBSが立ち上がったら、あとはポチポチクリックするだけでOSのインストールができます。
* OSの種類の選択肢が出てきますが、一番上に表示されている2つの選択肢以外はNOOBSに含まれていないため、間違って選択すると延々ダウンロードが始まります。

# おわりに
それぞれの工程でひとしきり悩んだのでOSをインストールするだけで3日がかりとなりました。最近は何でもクラウドでできるので、こういうタイプの苦労は本当に久々でした。オンプレの高い壁を感じた次第です。しかし、時代はいつかオンプレに戻ってくるはず。
# 参考文献
* https://raspida.com/raspixnoobs
* https://www.iodata.jp/product/pc/raspberrypi/ud-rp4b/index.htm
* https://hackerlife.blog.fc2.com/blog-entry-23.html
* https://www.ratocsystems.com/products/triple_r/blog/?x=entry:entry200521-092107;comments:1
* https://raspida.com/how2screenshot2ways
Ruby で ? の付くメソッドは true/false を返す，とは限らない

Ruby のメソッドは，名前が `?` で終わっていてもよいことになっています。

実際，組込みクラスには　[String#empty?](https://docs.ruby-lang.org/ja/3.0.0/method/String/i/empty=3f.html) とか [Array#include?](https://docs.ruby-lang.org/ja/3.0.0/method/Array/i/include=3f.html) といったメソッドがあります。
述語メソッド，つまり返り値の真・偽を利用するためのメソッドにこのような命名をする慣習があります。これはルールではなく慣習です。

ところで，
[Ruby の真／偽と true/false は違う - Qiita](https://qiita.com/scivola/items/1dbb6f7d0b04dda4a633)
にも書いたのですが，Ruby では真・偽を表すのに，必ずしも `true`/`false` を使うわけではありません。

実際，組込みの述語メソッドで，`true`/`false` 以外を返すものもあります。
例えば [String#casecmp?](https://docs.ruby-lang.org/ja/2.4.0/method/String/i/casecmp=3f.html) は大文字／小文字の違いを無視して一致判定するもので，基本的に `true`/`false` を返しますが，文字列のエンコーディングが非互換の場合は `nil` を返す仕様になっています。

なお，「述語メソッド」を「返り値の真偽性を利用するためのメソッド」とするならば，これはメソッド自体の仕様ではなく利用側の目的による括りなので，線引きはやや曖昧性があると私は考えています。
たとえば，[Regexp#match](https://docs.ruby-lang.org/ja/3.0.0/method/Regexp/i/match.html) は，引数の中に自身にマッチする部分文字列を見出したときは MatchData オブジェクトを返し，そうでないとき `nil` を返す仕様ですが，Ruby 2.4 で [Regexp#match?](https://docs.ruby-lang.org/ja/3.0.0/method/Regexp/i/match=3f.html) が登場するまでは，

```rb
if /\d/.match(str)
  # 云々
end
```

みたいな場面で使われることがありました。
これなどまさに述語メソッドとしての使い道だったと言えるでしょう。
Rustで時間計測をするには

# はじめに

Rust でメソッドの実行時間を測定したいと思ったので、調べてみました。小ネタですが [Rustその2 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/rust2) 24日目 アドベントカレンダーが空いていたので、埋めておきます。

## 環境

とりあえず、手持ちで一番安定している環境ということで。

+ MacBook Pro (Retina, 15-inch, Mid 2015)
    - Processor: 2.8 GHz Quad-Core Intel Core i7-4980HQ
    - Memory: 16 GB 1600 MHz DDR3
+ macOS 10.15.7 (19H114)
+ rustc 1.48.0 (7eac88abb 2020-11-16)

# crate std

測定対象のメソッドを呼ぶ前と呼んだ後で `std::time::Instant::now()` を呼びだし、`duration_since()` メソッドで duration を求めるのが簡単で分かりやすい方法だと思います。

`std::time::Instant` のドキュメントによれば、次のようなシステムコールを呼んでいるそうです。私が今のところ使ったことがあるプラットフォームだけ抽出しておきます。

| プラットフォーム | システムコール |
|---------------|-------------|
| UNIX      | clock_gettime(CLOCK_MONOTONIC)            |
| macOS     | mach_absolute_time                        |
| WASI      | \_\_wasi_clock_time_get(CLOCKID_MONOTONIC)  |
| Windows   | QueryPerformanceCounter                   |

# crate quanta

最近の x86 系の CPU であれば、CPU 内に TSC カウンタというリアルタイムクロックで駆動されるカウンタがありますので、それを直接呼び出すものです。CPU 内のレジスタを読み出すだけなので、システムコールを呼び出すよりは格段にオーバーヘッドが少ないのではと思ってしまいます。オーバーヘッド`crate quanta` のドキュメントによれば、TSC カウンタの読み出しオーバーヘッドは 11ns 程度らしいので、意外とオーバーヘッドがあるのねぇ、と思ってしまいます。

# やってみよう！

とりあえず、カウンタを１万回呼び出し、その平均値を求めましょう。

```rust:src/main.rs
use std::time::Instant;
use quanta::Clock;

fn main() {
    let mut clock = Clock::new();
    const N:u32 = 1_000_000;

    let istart = Instant::now();
    let mut istop = istart;
    for _ in 1..N {
        istop = Instant::now();
    }
    println!("std::time:Instant::now() overhead = {:?}",
        istop.duration_since(istart));

    let start = clock.now();
    let mut stop = start;
    for _ in 1..1_000_000 {
        stop = clock.now();
    }
    println!("quanta::clock::now() overhead = {:?}",
        stop.duration_since(start));
}
```

```console
$ cargo r --quiet --release
std::time::Instant::duration 15.614537ms
quanta::Instant::duration 13.580445ms
```

私の環境だと、何度やってもこの程度でした。1,000,000回呼び出しているので、std と quanta のオーバーヘッドはそれぞれ 15.6ns, 13.6ns ぐらいのようです。

# おわりに

`crate quanta` を使った方が 2.0ns ほどオーバーヘッドが小さいようです。

今回は、こんなところで。
JavaScript　DOM操作で要素の追加と削除を行う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/32409e2f-e615-d03f-f568-b043bdb5c94c.png" width="300">

#要素を追加する
```html:index.html
    <!DOCTYPE html>
    <html lang="ja">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>
        <h1>JavaScript Practice</h1>
        <dl id="credit">
            <dt>今日の天気</dt>
            <dd class="weather">晴れ</dd>
        </dl>
        <script src="index.js"></script>
    </body>

    </html>
```

#1,どこに要素を追加するのかツリー構造の確認（変更前）
><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/5fdcf03b-f894-b8a3-e008-1aa863935e3b.png" width="600">

#2,appendChild()メソッドを使う
>document.appendChild();メソッドを使用する

>```javascript:index.js
// タグを生成
    let element = document.createElement("p");
// テキストを生成
    let text = document.createTextNode("いいお天気ですね");
// bodyタグに要素を追加
    document.querySelector("body").appendChild(element).appendChild(text);
```

#3,どこに要素が追加されたかツリー構造の確認（変更後）
><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/ac1c6899-21e9-f32f-2f2f-53fb9e562a14.png" width="600">

#4,要素の削除を行う
>**removeChild();**メソッドを使用する

>```javascript:index.js
// 要素を削除
    let element2 = document.getElementById("credit");
    let parent = element2.parentElement;
    parent.removeChild(element2);
```

#5,要素の確認
><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e55a79d5-6f8c-4646-cf49-0d0829669882.png" width="600">
顔画像データセット仕分けのための学習用データ作成(#1)

#概要
UTKFaceデータセットを特徴ごとに仕分けするモデルの学習用データを作成する。
色々とご指摘頂けますと幸いです。

###UTKFace
[UTKFaceページ](https://susanqq.github.io/UTKFace/)
・ダウンロードすると3つの圧縮フォルダがあり
　①900MB
　②500MB
　③70MB
それぞれに画像が保存されている。3つ合わせると２万枚を越える。
・画像のファイル名が　「年齢-性別-民族-○○○.jpg」とラベル付けされている

###仕分け
データセットを確認すると加工処理されたデータや、複数人が写っているデータなどがある
上記②フォルダのデータを使用し
・問題なし
・グレースケール
・複数人が写っている
・加工処理されている
を判別するための学習用データを作成する。

今回は下記リンクにかなり助けられました。
[顔画像から年齢を予測](https://qiita.com/ha9kberry/items/314afb56ee7484c53e6f)

###環境
Google Colaboratory（GPU）

```csharp

import os, zipfile, io, re
from PIL import Image           #Image.openで必要
import numpy as np

X=[]
Y=[]
im_size = 299

# 問題なしデータ ZIP読み込み
z = zipfile.ZipFile('/content/drive/My Drive/image.zip')
imgfiles = [ x for x in z.namelist() if re.search(r"^image.*jpg$", x)]

for imgfile in imgfiles:
    image = Image.open(io.BytesIO(z.read(imgfile)))
    image = image.convert('RGB')
    image = image.resize((im_size, im_size))
    data = np.asarray(image)
    X.append(data)
    Y.append(0)

z.close()
del z, imgfiles
```

予め②フォルダの画像データを手作業で4つのフォルダに分割する。
各フォルダを読み込み

普通データはY.append(0)
グレースケールはY.append(1)
複数人はY.append(2)
加工処理はY.append(3)
としました。


```csharp

X = np.asarray(X)
Y = np.asarray(Y)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)

from keras.utils.np_utils import to_categorical

# 正解ラベルをone-hotの形にします
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

del X,Y
```

手作業で仕分けした4つのZIPファイルの読み込みと学習用データ作成までをFOR文で回したいと思いましたがちょっと思いつかなかったので実際はかなり長い文章になってしまっています。

次回はこれを使用してディープラーニングに挑戦していきたいと思います。
[顔画像データセット仕分けのためモデル構築-VGG19の転移学習](https://qiita.com/dream88sound/items/12cfe5217ca705334a05)
授業6回目：変数、method



# 参考サイト

[チャート式ruby-II(variable and method)](https://qiita.com/daddygongon/items/c51f3e0695174bb3c508)


# 変数

入力として受け取った値を適当な変数に代入して出力しよう.

```ruby
name = ARGV[0]
puts name
```

name が変数である. 複雑な計算をする時は数の入れ物みたいに機能する.
ところで、前回もしれっと出てきたが、ARGV[0]には標準入力値が入る.

このプログラムを name.rb として保存し、名前を入力してみよう.

```ruby
> ruby name.rb Alpha
Alpha
```


# method

関数は変数よりももっと大きな、処理のまとまりが入った入れ物みたいな感じ.
ruby では method と呼ぶ.
例として1つ作ってみよう.

```ruby
def hello(name)
  puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
```

出力はこんな感じ. 入力した文字に Hello を付けて返している.

```ruby
> ruby hello_method.rb Rudy
Hello Rudy.
```


# note

 ・例えばPython なんかでは、数を扱う際は int や float といった型を設定しなければ
 　ならないが、 ruby の変数は型を宣言せずにどのようなデータも格納できる.
　 [参考:Ruby 3.0.0 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/doc/spec=2fintro.html)



------
 - **source** ~/grad_members_20f/members/batamon-427/task6.org
(テスト自動化) 画像認識に曖昧さを持たせる

#背景
社内のシステム開発者向けにテスト自動化システムを構築・運用している。(SikuliX + Testablish)
その中で日常的に出てくる技術課題ややりたいことをメモ書き。

Sikuliが楽しい!

#課題
SikuliはOSSのRPAツールである。
となると、RPAツールにありがちな環境差異での画像のちょっとしたズレによる認識失敗がとても気になる。
実際、Win10&Edgeで画面解像度やツール設定を同一にしても、モニタの接続有無や細かいバージョン差ですぐ失敗になってしまう事例が多い。テスト自動化の大敵は冪等性が中々確保し辛い点である。一方で手動テスト(人)の場合は、多少の差異があっても曖昧さを頭で解釈して作業を進めることが出来る。(ので、ずるい。ただし、それが品質を悪くすることもある)　Sikuliにも多少の寛容さを求めたいところである。

#対応
Sikuliの画像認識(OpenCV)には、曖昧さを設定できるオプションがある。
ならば始めは精確さを求めて探索し、徐々に引き下げて曖昧さを増やしていくようにしてはどうか。
また、精確さはデフォルト0.7になっているらしいが、それも厳密にいえばどうかと思う。(同一画面上の似た別要素を誤認識することもある) やはり0.99辺りから始めるのが論理的に良い気がする。

考えたロジック
認識率0.99から始め、見つからない場合は認識率を0.1ずつ下げて判定する。(0.4をMinとする)

#目的
RaiMan氏曰く『Sikuli is God's eye』とのことで、神のような寛容さを持った、多少の画像のズレは許容できる画像認識を実現する。

#内容
以下実装で検証。
>\-----------------------
import sys
dir = os.getcwd()
acc = 0.99
saveFileName = "ファイル名"
saveFilePath = os.path.join(dir, saveFileName)
while acc > 0.4:
　if exists(Pattern(saveFilePath).similar(acc)):
　　find(Pattern(saveFilePath).similar(acc)).highlight()
　　wait(1)
　　highlightAllOff()
　　find(Pattern(saveFilePath).similar(acc)).click()
　　break
　else:
　　acc = acc - 0.1
wait(1)
\-----------------------

#結果 or 気付いた点
多少のズレでも認識できるようになった!!(対象画像を80%へ縮めても特定可能)
文字の判定は苦手(線で描かれており、面積的に比率が少ないため？ 文字はOCR機能の方がよさげ)
画像認識はOCRに比べ各段に早い

#結論
RPAでの画像認識操作では必須かも
学習メモ：Ruby基礎３

#配列
names = [“Satou”, “Etou”, “Hatake”]
puts names
puts names[1]
puts “私の名前は#{names[1]}です”

コンソール
[“Satou”, “Etou”, “Hatake”]
Satou
私の名前はSatouです

1.[“Satou”, “Etou”, “Hatake”]を配列という。
  　この場合は　“Satou”等を要素と言う
　文字列以外にも数値も含めることが可能。
　
　配列を変数へ代入し変数を出力すると配列の要素が表示される。
　
2.配列を代入された変数、[ ]にインデックス番号を入れて出力すると
　その番号の要素が表示される。
　※注意としては
　　インデックス番号とは配列の番号である。０から始まる。

3.変数展開の場合便利である。

#each文
names = [“Satou”, “Etou”, “Hatake”]
message = “こんばんわ”
names.each do |name|
  puts “名前は#{name}です”
end

コンソール
名前はSatouです
名前はEtouです
名前はHatakeです

1.names(変数).each do |name(変数)|
　繰り返し処理を行なっている。
　この場合は　配列namesから要素を一つずつ取り出してる。
　each文の終わりは　end　と書く。
　※name(変数)はこの繰り返し処理のためにつけられた変数である。
　　つまり
　　値と関係あればどういう名前の変数でも良い。
　　

2.その後の処理は配列の要素を取り出せた分だけ繰り返し行う。
　これによって配列の要素を全てを変数展開なども容易である。

3.変数が使える範囲をスコープという。
　each文中のスコープで使われている変数は end 以降のスコープでは使えない。
　この場合 name が使えなくなる。　
　each文外のスコープにある変数はeach文のend以降のスコープでも使える。
　この場合　変数 message である。

乱文ですがお許しください。
学習メモ：Ruby基礎２

#変数
name = “maik”
puts name
puts “name

コンソール
maik
name

1.値を入れておく箱のようなものである。
　変数の定義方法　変数名＝ 値　となる。
　この場合　name　である。
　代入
　プログラミングにおける「＝」は左の変数に右の値を入れるという意味    になる。
　注意としては
　・変数をクォーテーションで囲んでしまうとコンソールには変数名が出力される。

　　————————
　　puts name
　　name = “maik”

　　コンソール
　　エラー発生
　　————————
　・変数は定義した後に使わなければエラーになる。
　※上から順に実行されるから。
　また
　————————
　text = “勉強しよう”
　puts “Aさん、” + text
　puts “Bさん、” + text

　コンソール
　Aさん勉強しよう
　Bさん勉強しよう
　—————————-
　変数に文字列を代入することで文字列の結合も可能になる。
  —————————
　number1 = 5
　number1 = 20
　puts number1 + 3
　number2 = 10
　puts number1 + number2
　number1 = number1 + 3

　コンソール
　23
　30
　23
　——————————
　変数に数値を代入することで数値の計算も可能になる。

変数のメリット
・同じ要素を繰り返し使えるから。
・変更に対応しやすい。
・何の要素か分かり易い。
・変数に名前をつけられる。
　
注意すること
・変数の値と変数名が想像しやすいこと。相応しくない変数名は避ける。
・２語以上の変数名の場合、アンダーバー（＿）を使用する。
・頭文字が数字、ローマ字表記、日本語表記を避ける。
・プログラムは上から順に実行されるのでプログラムの一番下の変数が
　最後の変更された値となる。　　
　この場合　number1　である。
 
変数の自分自身の代入
変数の自分自身の代入の更新もプログラムの一番下の変数が
最後の変更された値となる。
この場合　number1
     
計算記号の省略された書き方
x = x + 1 ⇨ x += 1
x = x - 1 ⇨ x -= 1
等等
他にも掛け算、割り算、割り算の余りがある。
Assert&rubular

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# assert\_equal

equalかどうかを判定する関数を書いてみる

```lisp
def assert_equal(expected, result)
  return expected == result
end

p assert_equal(1,1)
p assert_equal(1,2)
```

実行結果

```lisp
$ ruby assert_equal.rb
true
false
```


# Colorize

出力に色を付けてみることができる

```lisp
require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end

assert_equal(1,1)
assert_equal(1,2)
```

実行結果

```lisp
$ ruby assert_equal.rb
true
false
```

trueが赤色に，falseが緑色に出力される


# richな出力

1)引数でとってきた，expectedとresultの値を表示する
2)true、false時のメッセージを出す
を実現する

```lisp
require 'colorize'
require 'colorize'

def assert_equal(expected, result)
  puts "expected: #{expected}"
  puts "result: #{result}"
  if expected == result
    puts "succeeded in #{__method__}.\n".green
  else
    puts "failed in #{__method__}.\n".red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)
```


# 関数の整理

重複している処理は整理

```lisp
require 'colorize'

def assert_data_print(expected, result)
  puts "expected: #{expected}"
  puts "result: #{result}"
end

def assert_result_print(is_success, method_name)
  if is_success
    puts "succeeded in #{method_name}.\n".green
  else
    puts "failed in #{method_name}.\n".red
  end
end

def assert_equal(expected, result)
  assert_data_print(expected, result)
  assert_result_print(expected == result, __method__)
end


def assert_not_equal(expected, result)
  assert_data_print(expected, result)
  assert_result_print(expected != result, __method__)
end

assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 1)
assert_not_equal(1, 2)
```


## 重複実行の予防

```lisp
if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end
```

のようにする
codeが書いてあるファイル名(FILE)が，動いているファイル名($PROGRAM\_NAME)と一致するかを確認することで、requireの時はこの中身が実行されないようにできる


# Rubular

文字情報を取り出す便利ツールな正規表現



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/memo9.org
Reactを学習するときに参考にした記事

# Reactを学習するときに参考にした記事

記事のリンク集です。個人的なまとめです。



# Reactの学習

### [React / チュートリアル：React の導入](https://ja.reactjs.org/tutorial/tutorial.html)

React公式のチュートリアルを触ってみたところ、手順通りにコーディングを進めていけば簡単なゲームが完成するように理解できるようになっていて、非常にわかりやすかったです。オススメです。





# Reduxの学習

### [React チュートリアルの三目並べに Redux を導入する](https://qiita.com/hey_cube/items/e20a0267c65b03937818)

Redux公式のチュートリアルを触ってみましたが、いろいろと手順が省略されており、あまりわかりやすいとは言えませんでした。

こちらの記事は、丁寧に手順が記載されており、とてもわかりやすかったです。

React公式のチュートリアルで作ったゲームのソースコードをそのまま活用でき、手順通りにコーディングを進めていけばReduxのコードが完成するようになっています。



### [たぶんこれが一番分かりやすいと思います React + Redux のフロー図解](https://qiita.com/mpyw/items/a816c6380219b1d5a3bf)

初めてこちらの記事を読んだときは、専門用語だらけで混乱してしまいましたが、三目並べのコードが完成した段階でこちらの記事を読み返してみたところ、用語の意味がすんなりと頭に入ってきました。

図がとても丁寧でわかりやすいです。
C++で作成したdllをC#で使用する方法

仕事でC++で書かれたdllをC#で初めて使用したので、忘却録としてまとめる

##開発環境

PC:windows10 pro
IDE:Visual Studio 2010

##C#コード（呼び出し側）

```C#:hoge.cs
using System.Runtime.InteropServices; ←追加

namespace hogehoge
{
    public class hogeClass
    {
        [DllImport(“Library.dll”)]
        private static extern IntPtr hoge()
        ・・・・・

    }
}
```


〇DllImportで、使用したいdllをimport
DllImportを使用する為にSystem.Runtime.InteropServicesを追加する

使用したい関数の修飾子はstatic externにする

型はdll側に合わせて書く
例では、IntPtrとなっている。これはdll側がbyte型のポインタになっているため

※今回はdllから１つの関数しか呼び出していないが、複数呼び出す時は、関数ごとに[DllImport(“hoge.dll”)]を書く必要がある。
スマートフォン の SSH クライアントアプリが素晴らしかった

使ってみたアプリは `termius` と言うアプリで、
公式サイトは [こちら](https://termius.com/)

> スマートフォンの

とタイトルに書きましたが、
Windows, Mac, Linux, iOS, Android とマルチプラットフォーム対応です。
[Google Play - termius](https://play.google.com/store/apps/details?id=com.server.auditor.ssh.client)
[App Store - termius](https://apps.apple.com/us/app/termius-ssh-shell-console-terminal/id549039908)

インストールしたらまずアカウント作成を求められます。
作らないと何も出来ないので、作成します。
新規にアカウントを作成すると14日間のPremium機能Trialが始まるようです。


Hosts をタップして右上の`+`ボタンをタップ、`New Host`をタップします。

|項目名  |概要                        |
|:-------|:--------------------------|
|Alias   |任意の名前                  |
|Hostname|ip address か FQDN         |
|Username|そのままログインするユーザー名|

`Password` を入力しても良いですが、鍵の生成も簡単にできます。
`Key` をタップして右上の`+`をタップ、`Generate Key`をタップします。

デフォルトでタイプが`ED25519`になっているので、そのままで良いでしょう。

NameとPassphraseを入力して右上のSaveをタップすると今追加した鍵がリストに表示されるので、それをタップ。
先ほどの`New Host`の画面に戻ってきて先ほど選んだ鍵がKeyに表示されているはずです。
そうしたら右上の`Save`をタップします。

Hostsのリストに追加されるはずです。

一旦Keychainの画面に移動します。
ここで、先ほど追加したkeyをロングタップするとShareというメニューがあります。
これを選択すると、メールなどで公開鍵を送ることが出来ます。
これで他のデバイスに送信し、SSHサーバーの方に登録します。

そうしたらアプリのHostsの画面に戻り、先ほど追加したHostをタップすると接続出来ます。
AndroidのChromeでリンクを押した時につく、青色を消す。


AndroidのChromeでリンクやボタンを押した時、リンク領域が青色になる。
これは、タップ時のハイライトカラーを透明にすることで解消できる。
全てのセレクタに適用して、解決した。

Android

```css:style.css
* { -webkit-tap-highlight-color: rgba(0, 0, 0, 0) }
```
Epic Games製 Blenderアドオン「Send to Unreal」でスケール問題を回避したFBXを書き出す方法

## はじめに

当記事では「Send to Unreal」を用いて FBX ファイルを書き出し、それをUE4へインポートする方法をとっております。
アドオンが出た時点ではBlender側のシーンの単位を 0.01 に変更しなくてはなりませんでしたが、今回 1.0 のまま問題のない書き出しができましたので共有になればと記事を書きました。記事を書いている時点では書いている内容以上のものは把握できておりませんので、間違いなどありましたらご指摘いただけますと幸いです。

コメントや Twitter(@ Foltkaur) であれば反応ができると思います。

## 環境

| ツール | バージョン |
|:-:|:-:|:-:|
| Unreal Engine | 4.26.0 |
| Blender | 2.83.10 |
| Send to Unreal | 1.6.0 |

ダウンロードやインストール方法などは各自で調べてください。

当環境ではBlenderのUIを日本語に設定して使用しております。
したがって続く説明もその表記に従ったものになります。

## 設定の共有

### 設定の開き方

Blender画面左上の
「編集」メニューから歯車マークの「プリファレンス」を開いてアドオンから選択する。または
「Pipeline」メニュー（インストール済みで追加される）から「エクスポート」「Advanced Dialog」を選択する。

### 設定

今回は FBX ファイルをBlendファイルのある場所に書き出しますのでカレントディレクトリを指定しています。
Blendファイルとして保存されていないとエラーがでるようです。
![PathTabSettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985004/37407c26-b61f-decf-5201-9053620f6a9f.png)

---

ここの項目はいじった記憶がないですが確認をお願いします。
目的のためには一番上のチェックが重要だと思います。
![ExportTabSettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985004/0b8a723b-bf50-0e69-836e-cf0e452ffccd.png)

---

上の画像の一番下の「FBX Settings」を開いたものです。
Blenderデフォルトの FBX エクスポートとほぼ同じに見えます。
ここではアーマチュアのプライマリボーン軸とセカンダリボーン軸を変更しています。
![FBXSettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985004/49f99b5e-9a46-770d-04bf-ff4e4e4000f5.png)



## 書き出しの方法

インストールが完了していると複数のコレクションが追加されていると思います。
名前の通り、それぞれのコレクションに対応するオブジェクトを入れていくことになります。
![Collections.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985004/fb425aa4-77fd-3d86-38fb-c131565c2530.png)
書き出しそのものはオブジェクトを選択して「Pipeline」メニューから「エクスポート」内の「Send to Unreal」を押すだけで完了します。

### 確認できた書き出し方法の違い

* 選択されているオブジェクトと同じもののコレクションが書き出しされる（Rigコレクション内のメッシュを選択しているとMeshコレクション内のものが書き出しされる）
* 非表示にしたオブジェクトは書き出しされない
* Meshコレクション内にアーマチュアがあっても書き出しされない（Rigコレクション内にメッシュがあっても書き出しされない）
* Meshコレクションにメッシュ（アーマチュアモディファイアで関連付けされている）Rigコレクションにアーマチュアの状態でメッシュを選択しているとスケルタルメッシュが書き出しされる（Rigコレクション以外にあるとスタティックメッシュになる）
* Rigコレクションのアーマチュアを選択しているとアニメーションが書き出しされる（設定のとおり通常BlenderのNLAやアクションの扱い？）
* Meshコレクション内にメッシュのみとアーマチュアモディファイアのあるメッシュがあっても同時に書き出しされる

## UE4 にインポート

書き出しされた FBX ファイルを通常どおりのドラッグ・アンド・ドロップで問題ありません。

## 参考にさせていただいた資料と各種リンク

UE4とBlenderでランニングコストを抑えるモダンなワークフロー
https://www.slideshare.net/EpicGamesJapan/ue4-festeast2019-blenderworkflow

新しい Blender アドオンをダウンロードしましょう
https://www.unrealengine.com/ja/blog/download-our-new-blender-addons

### UE4のためのBlenderアドオン

双方ともに使用させていただいております。ありがとうございます！

X4UE
https://github.com/Indie-us-Games/X4UE

Blender-For-UnrealEngine-Addons
https://github.com/xavier150/Blender-For-UnrealEngine-Addons

## おわりに

ふと思い出して使ってみると苦しんでいた問題が解決されていて驚きました。
色々と難しそうなこともできるようなので多くの方の情報が集まることを期待しています。
Ruby のクラスは定数，じゃない

Ruby の初心者向け記事にときどき，クラスが定数であるかのような記述が見られます。
これは，

```rb
class Hoge
end

p defined? Hoge # => "constant"
```

というところから来ているのでしょうね。
`defined?` のあとに定数名を書くと `"constant"` という文字列を返す仕様ですが，そのとおりになっているので，`Hoge` が定数であることが分かります。

でね，上の例で

* `Hoge` はクラスである
* `Hoge` は定数である

はまあ正しいんだけれども，

* クラスは定数である

と言っちゃうとおかしなことになります。
だって，クラスは一つのオブジェクトだし，定数はオブジェクトを指すものでしょ。

では正確にはどういうことなのか？
こうです。

```rb
class Hoge
end
```

というクラス定義式を実行すると，「`Hoge`」という名前のクラスが定義され，それが同名の定数に代入された状態になる，ということなんです。

だから `Hoge` はクラス名であり，それを指す定数の名でもあるわけです。
決してクラス自体が定数というわけではありません。

```rb
class Hoge
end

# クラスの名前を表示
p Hoge.name # => "Hoge"

# クラスを定義したことで同名の定数が Object に定義されたことを確認
p Object.constants.include?(:Hoge) # => true
```

では無名のクラスを定義するとどうなるのでしょうか。
`Class.new` で名前の無いクラスが作れます。

```rb
c = Class.new

# (1) 名前を持たないことを確認
p c.name # => nil

# (2) なんかの定数に代入
Hoge = c

# (3) 名前が出来た！
p c.name # => "Hoge"

# (4) 別の定数にも代入
Fuga = c

# (5) 名前は変わらない
p c.name # => "Hoge"
```

名前を持たないクラスの名前を求めると（(3) のところ），自身が代入されている定数を探し，見つかればその定数名を自身の名前とします。
名前が出来るのは (2) の時点ではなく (3) の時点です。

(4) で別の定数に代入していますが，既にクラスは名前を持っているので，(5) では (4) の影響を受けていません。

なお，初めて名前を求めたときに複数の定数に代入されている場合，いずれの定数の名前がクラス名に採られるかは不定だそうです。
参考：[Class.new (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/3.0.0/method/Class/s/new.html)
at.allowとかcron.allowによるアクセス制御メモ

`at.allow`、`at.deny`は`at`コマンドのアクセス制御ファイル。`at`を使っていいユーザーは`at.allow`に書いて、`at`を使わせたくないユーザーは`at.deny`に書く。`cron.allow`、`cron.deny`も同じように、`crontab`コマンドを使えるユーザーを制限する。でもこれらのファイルってあったり無かったりして、どの場合にアクセス制御がどうなってるのかよくわからないのでまとめておく。


```
+--------------------------------------------------------+
| at.allow | at.deny | atコマンドを使用できるユーザー         |
+----------+---------+-----------------------------------+
|    ×     |    ×    | rootのみ                           |
+----------+---------+-----------------------------------+ 
|    ○     |    ×    | root+at.allowに書かれたユーザー      |
+----------+---------+-----------------------------------+
|    ×     |    ○    | root+at.denyに書かれていないユーザー  |
+----------+---------+-----------------------------------+
|    ○     |    ○    | root+at.allowに書かれたユーザー      |
+----------+---------+-----------------------------------+

○:ファイルあり
×:ファイル無し
```

`cron`も同様。
Rake

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# Rake

rakeはmakeやantのruby版
rakeコマンドの内容はRakefileにtaskを作成する
Rakefileに

```lisp
task :default do
  system 'rake -T'
  exit
end

desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end
```

実行結果

```lisp
$ rake hello Cyoukou
hello Cyoukou
```

となるこれはつまりRakefileの中の「hello」というtaskを実行したことになる


# System Call

system callでgitの操作を一発でできるように

```lisp
desc 'git push'
task :push do
  p comm = "git pull origin main"
  system comm
  p comm = "git add -A"
  system comm
  p comm = "git commit -m \'commit\'"
  system comm
  p comm = "git push origin main"
  system comm
  exit
end
```

ような感じでpullからpushまでやってくれる便利！！



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/memo8.org
JavaScript　DOM操作でCSS（スタイル）の変更を行う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/702c7eac-1f28-069e-b881-e27829acf9df.png" width="300">

#CSS（スタイル）を変更する

```html:index.html
    <!DOCTYPE html>
    <html lang="ja">

    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>

    <body>
        <h1>JavaScript Practice</h1>
        <dl>
            <dt>今日の天気</dt>
            <dd class="weather">晴れ</dd>
        </dl>
        <script src="index.js"></script>
    </body>

    </html>
```

#1,styleプロパティを「.(ドット)」でつなげたものに、スタイルの値を代入する
>```javascript:index.js
// styleプロパティを「.(ドット)」でつなげたものに、スタイルの値を代入する
  let element = document.querySelector(".weather");
  element.style.color="blue";
```

#2,CSSのプロパティに「-(ハイフン)」を含む場合,直後のアルファベットを大文字にする
>```javascript:index.js
// CSSのプロパティに「-(ハイフン)」を含む場合,直後のアルファベットを大文字にする
  element.style.textDecoration ="underline";
```

#3,複数のスタイルを指定する場合
>```javascript:index.js
// 複数のスタイルを指定する場合
  element.style.cssText="color:blue; text-decoration:underline;";
```
Unity ShaderGraph レシピ #7 トゥーンシェーディング


#トゥーンシェーディング
![gif_animation_007.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/8f4948bd-ab9f-254f-7713-6ca4b1fc3384.gif)


#作り方
ライトベクトルとメッシュの法線から頂点の明るさを算出し、その値をUVとしてトゥーン用のライトマップ（ToonMap）から最終的な明るさを決め、モデルに適用します。

### 1.TooｎMapに使うUV値の計算
頂点の法線と、ライトの向きで内積を取ります。どちらも単位ベクトルの場合、結果は(-1〜1)の値に収まります。
法線がライトの向きと向き合っている場合（明るい場合）=1、ライトと同じ方向を向いている場合（暗い場合）=-1になります。
この値をUV値にしたい(0〜1の値)ので、まず0.5を掛けて(-0.5〜0.5)その結果に0.5を足すことで0〜1の範囲に収めることができます。

![スクリーンショット 2020-12-27 17.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/827e527d-8986-cb10-a3ef-5a4a01a6cd2c.png)


### 2.UV値を使ってToonMapをマッピング
![スクリーンショット 2020-12-27 22.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/f68da50d-d575-d8b0-f15e-926e9d984201.png)



### 3. ToonMapをメッシュのテクスチャと乗算してライティング
![スクリーンショット 2020-12-27 23.50.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/53052498-77bb-1b39-d8c7-65edfb38199f.png)




###完成！
![スクリーンショット 2020-12-27 23.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/2dcc40b7-fd11-72b5-135a-113def472753.png)


![スクリーンショット 2020-12-27 23.50.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/50c671b4-9695-def3-1f90-3bf380e6c11c.png)

###ToonMapを変えることでシェーディングをカスタマイズできます

![toon3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/1573fa24-8653-d875-ca91-d8411c67114d.png)
↑の場合は↓
（作ってる時には気づかなかったですが画像の右上にゴミがありますね…）
![スクリーンショット 2020-12-27 23.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/52a54a12-eca1-a77e-0911-d7dc21233a64.png)

![toon2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/e4f95889-04c8-963a-df72-d510f00c5815.png)
↑の場合は↓
![スクリーンショット 2020-12-27 23.52.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/9bae59ba-265d-62be-cc13-c5d27667c049.png)

![toon1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/b78eaaae-1260-0538-cc39-ff08b59d7d40.png)
↑の場合は↓
![スクリーンショット 2020-12-27 23.52.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/475d3c26-0f80-b787-930e-cba37116df59.png)

---
その他のレシピは[ShaderGraphレシピ一覧](https://qiita.com/Teppy/items/73fc6141751a62f5265d)にまとまっています
AccessのRoundは特定条件で四捨五入にならないので注意（ExcelのRoundとは違う）

#ExcelのRound
まず最初に、ExcelはRoundに第二引数が必要です。（この時点でAccessのRoundと違ってる）
んでもって結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dc7e201a-8214-dbc8-babb-3f44c16935f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/094d6ff8-8632-b190-96ab-c9c8a2e679cd.png)

```=ROUND(0.4,0)``` の結果は 0 （画像割愛）
```=ROUND(1.4,0)``` の結果は 1 （画像割愛）

四捨五入。


#AccessのRound
下記の結果は…

```vb:
Debug.Print "0.5をRoundすると " & Round(0.5)
Debug.Print "1.5をRoundすると " & Round(1.5)
```
0.5を通した場合、四捨五入で **1** になるかと思いきや **0** になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2e1fe7b9-a81b-b220-4a36-fb3e51b008af.png)

AccessでのRoundの厄介なところは、 **端数が0.5の時だけ** 偶数に近くなるように丸められるということです…。

下記の結果はどうかというと…

```vb:
Debug.Print "0.6をRoundすると " & Round(0.6)
Debug.Print "1.6をRoundすると " & Round(1.6)
```

四捨五入です…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b095242d-4783-5910-0168-6ca7c22f6f9a.png)

テストデータの値が閾値になっていないとバグがテストをすり抜ける可能性があります。

#AccessでRoundを使わずに小数点第一位を四捨五入

0.5を足して小数点を切り捨てるInt()を通す。

```vb:
Int(四捨五入対象 + 0.5)
```

下記の結果は…

```vb:
Dim test_ As Double

test_ = 0.4
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 0.5
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 0.6
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.4
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.5
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.6
Debug.Print test_ & "の時は" & Int(test_ + 0.5)
```
四捨五入です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/79da5dcb-5e48-b848-1e41-2dda0ccd0497.png)

#Accessで小数点〇桁を四捨五入したい時の注意点
小数点〇桁もRoundを使わずに四捨五入しようとしたらつまずきました。
**『 * 』で一旦桁を上げてInt()四捨五入 ⇒ 『 / 』で桁下げる**
なんて感じで任意の桁の小数点四捨五入ができると思っていました。

```vb:
Dim test_ As Double
test_ = 1.15

'【1】
'1.15の小数点第二位を四捨五入したい
'（結果は1.2にならない）
Debug.Print Int(test_ * 10 + 0.5) / 10

'【2】
'1.15の小数点第二位を四捨五入したい'
'桁を上げる段階でCDbl()を通す
'（結果は1.2になる）
Debug.Print Int(CDbl(test_ * 10) + 0.5) / 10

'【3】
'1.15の小数点第二位を四捨五入したい'
'1ステップずつ結果を変数に格納
'（結果は1.2になる）
test_ = test_ * 10
test_ = test_ + 0.5
Debug.Print Int(test_) / 10
```
実行結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/52306c91-19e4-6df4-554e-dd1e7e801057.png)

コンパイルする時に何か最適化していて、その影響で結果が違うのかなあ…(´・ω・`)

ひとまず対象の値を一旦文字列にキャストして、 **ドット** を元に整数部と小数部を分けて……
みたいな愚直な自作関数を作って対応しました…(´・ω・`)

#参考サイトさん
https://tom-51.net/pc/access-round

#バージョン
Windows10 Pro バージョン20H2 OSビルド19042.685
Access for Microsoft 365 MSO（16.0.13426.20270）32ビット
Excel for Microsoft 365 MSO（16.0.13426.20270）32ビット
rails newコマンドが実行できないエラー：bundler: failed to load command: springの解消

こんばんは。Miyayanと申します。今回初めてQiitaにて記事をあげます。
ゆえに拙い部分もあるかと存じますが、どうぞよろしくお願いいたします。

# 目次

- 環境
- 参考記事
- 概要
- 仮説
- 試したこと
- 解決方法
- まとめ

# 環境

**OS**  : macOS Big Sur ver.11.1
**Ruby**  : 2.6.5p114 
**Rails** : 6.0.0
**bundler** : 2.1.4, default: 1.17.2
**gem** : 3.0.3

# 参考記事

・[【Rails6】rails new で bundler: failed to load command: spring が出た。問題はbundler2.1.4かRuby2.7にあるようだが.....](https://qiita.com/chabudai/items/4051c21ca9161a301bfb#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%82%A8%E3%83%A9%E3%83%BC)

・[bundler: failed to load command: spring が出た。。](https://note.com/_20yute0_/n/n83f9f32d7a40)

・[「gem update --system」と「gem update」の違い](https://qiita.com/tatama/items/4e9d6bb8bfa2d9556db7)

# 概要

railsにてnewコマンドを用い、アプリケーションの作成を試みました。

```
rails _6.0.0_ new アプリ名 -d mysql
```

すると、下記文面が赤色で表示されるではないですか！

```
bundler: failed to load command: spring (/Users/ユーザー名/アプリを作成したいディレクトリ/アプリ名/vendor/bundle/ruby/2.6.0/bin/spring)
```

どうもエラーのようでエラーっぽくないと言いますか、正直プログラミング初学者の私からしたらイマイチ何が起きているのかもパッとしない状況・・・。
しかし赤文字ってだけで何かムズムズしてしまう。
どうにかしてこの警告のような文面が出ることなくアプリケーションを作成できないものだろうか・・・。

# 仮説

文面から見るにSpringというものがうまくいってないように感じます。
しかしながら、インストールされているGemを見ると、

```
Installing spring 2.1.1
```

と緑色で表示があり、Springは入っている。正直この警告は無視しても良さそうな感じがします。
参考記事を見てみると、バージョンが2.1.4となっているbundlerが悪さをしているのかと書かれております。

では、bundlerをいじってみましょうか。

# 試したこと

まずbundlerのバージョンを確かめてみます。

```
% gem list bundler

*** LOCAL GEMS ***

bundler (2.1.4, default: 1.17.2)
```

参考記事の方々と同じ2.1.4です。
これをアンインストールし、バージョンを再度確認。

```
% gem uninstall bundler
Successfully uninstalled bundler-2.1.4

% gem list bundler     

*** LOCAL GEMS ***

bundler (default: 1.17.2)
```

そしてさらに、最新バージョンのbundlerを入れてみます。

```
% gem install bundler
```

ここで再度bundlerのバージョンを確かめてみましょう。

```
% gem list bundler   

*** LOCAL GEMS ***

bundler (2.2.3, default: 1.17.2)
```

bundlerが2.2.3にアップグレードされました。
これでnewコマンドでアプリを作成してみましょう！！！

```
bundler: failed to load command: spring (/Users/ユーザー名/アプリを作成したいディレクトリ/アプリ名/vendor/bundle/ruby/2.6.0/bin/spring)
```

<font color="red">**出るんかい！！！**</font>
どうもbundlerではなさそう。あるいは2.2.3でもSpringの警告文は出るのかもしれない。

**gemそのもののバージョン・・・？**

# 解決方法

こちらは私の場合、解決した方法です。あくまでご参考程度にしていただけると幸いです。

gemのバージョンを確認してみる。

```
% gem -v
3.0.3
```

gemのアップデートを試みる。

```
% gem update --system
```

再度gemのバージョンを確認する。

```
% gem -v             
3.2.3
```

アップデートが完了したようです。
流石にこれで解決するのかなーと半信半疑でしたが、ここで一旦bundlerのバージョンも確認してみます。

```
% gem list bundler

*** LOCAL GEMS ***

bundler (default: 2.2.3)
```

**ん？**ちょいと表記が違いますね。
先程は

```
bundler (2.2.3, default: 1.17.2)
```

こういう表示だったのが、gem自体のアップデートを行なったことによりbundlerのdefaultがカチッと最新バージョンになったようです。

ここでrails newコマンドで再度アプリを作成すると、
<font color="red">**無事警告が出ることなく作成完了しました！！！**</font>


# まとめ

結論、なぜ解決したのかパッとしませんが、
①bundlerのdefaultバージョンが1.17.2より現行最新である2.2.3へと切り替わったことで解決した。
②gemのバージョンが3.0.3から3.2.3になったことで解決した。

以上２パターンかなぁと感じております。

あくまで私の環境下での解決方法ではありましたが、同様に
bundler: failed to load command: spring
が出た方のご参考になれば幸いです。

**ご覧いただきありがとうございました！**
Flutter: [core/no-app] No Firebase App ‘[DEFAULT]’ has been created の解決策（flutter）

#エラー内容
Flutter: [core/no-app] No Firebase App ‘[DEFAULT]’ has been created 

#解決策
void main()に必ず初期化の記述を加える

```
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
```


#こういうこと
```dart
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
```
FactoryBot、外部キーバリデーションで弾かれたときの解決方法

#はじめに
　以前から、FactoryBotを使って、Rspecのテストがエラーでなかなか進めませんでした。今回、解決出来たので紹介します。

↓以前の投稿
[FactoryBotで外部キーの値はどうやって作り出すんだ〜（泣](https://qiita.com/TerToEer_sho/items/02348a0fd017b1ea81bc)

##設計

userテーブルはroomテーブルとアソシエーションしていて、ユーザー登録をする際に、room_idを入力する必要があるような状況です。

##ユーザー登録のテストコード一部

```ruby:user_spec.rb
RSpec.describe User, type: :model do
  describe 'ユーザー登録' do
    before do
      @user = FactoryBot.build(:user)
    end
    it '全ての項目が入力されていれば、登録できること' do
      expect(@user).to be_valid
    end
  end
end
```

`@user = FactoryBot.build(:user)`の部分でいつもエラーが出てしまっていた。

##FactoryBotの一部

###roomモデル

```ruby:rooms.rb
FactoryBot.define do
  factory :room do
    Faker::Config.locale = :ja
    name { Faker::Name.first_name }
  end
end
```


###userモデル

```ruby:users.rb
FactoryBot.define do
  factory :user do
    Faker::Config.locale = :ja
    room { FactoryBot.create(:room) } #元々のエラーの原因はここ
    email { Faker::Internet.free_email }
    nickname { Faker::Name.last_name }
    password = Faker::Internet.password(min_length: 6)
    password { password }
    password_confirmation { password }
  end
end
```

##Rspecのエラーだった原因

ずばり、この部分です。

```ruby

room { FactoryBot.create(:room) }（修正後）
room_id { 1 }（修正前）
```
外部キーにしていた`room_id`を無理やり、「１」という値を入れて、FactoryBotとして生成させようとしていました。しかし、これでは、バリデーションのエラーが出てしまっていました。エラーを解釈すると、「外部キーが見当たらない」みたいな感じです。

##解決方法
- 外部キーのカラムには  
FactoryBotの中に、FactoryBotを打ち込む！！
- 細かい点ではあるが、  
`_id`は記述しない。

##最後に
　これで、やっとテストコードを進めていくことができます。久しぶりに、がっつり知識が増えました！