OmniAICreator/Qiita-1.07M huggingface dataset:
TavernでStageごとにテスト対象を使い分ける方法

## 初めに
以前、[TavernでStageごとの設定を使い分ける方法](https://qiita.com/atakig/items/08b34ba3d13b4e7c8377)のような記事を書きましたが、今はより使い勝手が良さそうな方法で行っていますので、紹介します

## 結論
[run](https://tavern.readthedocs.io/en/latest/basics.html#using-the-run-function)を使っています
以前検討しましたが、パス区切りを/ではなく.で行っていたため、エラーになっていました

## ディレクトリ構成
現在のところ下のような構造で運用しています
(まだ開発段階ですのでdev関連のみとなります)

```
tests
├── __init__.py
├── helper
│   ├── dev_data.py
│   ├── utility.py
│   └── validation.py
├── test_XXXX_api.tavern.yaml
└── test_XXXX_api_dev.py
```

## 実行方法
下のようにpythonスクリプトを実行します
```
python3 tests/test_XXXX_api_dev.py dev
```

## testファイルの内容
test_XXXX_api_dev.pyは下のようになりました
パラメータで読み込むデータ定義ファイルを切り分けています
テスト結果の判定処理でも使うため、パラメータもextra_cfgに含めています
runのパラメータについては、上記のマニュアルページにも記載されていますが、githubの[ソースファイル](https://github.com/taverntesting/tavern/blob/master/tavern/core.py)が参考になりました
```test_XXXX_api_dev.py
from tavern.core import run
import sys

stage = sys.argv[1]
tavern_file = "tests/test_XXXX_api.tavern.yaml"
if stage == "dev":
    import helper.dev_data as data
elif stage == "stg":
    pass
elif stage == "prd":
    pass
else:
    ValueError(f"Invalid stage: {stage}")

extra_cfg = {
    "variables": {
        "xxxx": data.xxxx,
        "yyyy": data.yyyy,
        "zzzz": data.zzzz,
        "stage": stage,
    }
}
success = run(tavern_file,
              tavern_global_cfg=extra_cfg,
              tavern_strict=False,
              pytest_args=["-s"])
```

## 他のファイルの内容
蛇足ですが、dev_data.pyも

```dev_data.py
xxxx = "XXXXX"
yyyy = "YYYY"
zzzz = "ZZZZ"
```

validation.pyの一部
```validation.py
def response(response, stage: str):
    if stage == "dev":
        import tests.helper.dev_data as base

```

## もう少しリファクタリングできないかな...
テストデータを変更する際には、dev_data.pyとtest_XXXX_api_dev.pyの両方を触ることになりますが、
test_XXXX_api_dev.pyにテストデータも集約すると、validation.pyからtest_XXXX_api_dev.pyの参照が循環参照でエラーになったため、断念しました

## 終わりに
[TavernでStageごとの設定を使い分ける方法](https://qiita.com/atakig/items/08b34ba3d13b4e7c8377)だと、shellファイルの中で何をやっているのか分からないため、一抹の不安がありましたが、この方法だとデータの定義、テストの実行、テストそのものとそれぞれのファイルの役割が明示的になり、テストのメンテナンス性とテストの実行の敷居が下がり、継続的なテストファイルのメンテナンスに繋げられそうです


同じ悩みを持つ何方かのお役に立つと嬉しく思います
CSSフレームワークやライブラリを素振りするためのFigmaファイルを作った

## この記事の概要

筆者はCSSフレームワークやCSS in JSのライブラリを素振りすることが多いです。

その際、それなりに精度の高いモックアップを組んでみないと使用感が掴めません。

しかし毎回1からモックアップを用意するのも時間がかかるので、さっと検証するためのデータを作りました。

せっかく作ったので公開します。

## 見本

|  | desktop | mobile |
| --- | --- | --- |
| トップページっぽいもの | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/6e574e0d-382d-24f5-d8b2-999d39e83d1c.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/780eba79-ec4c-8322-917b-9fb6232e12b9.png) |
| 詳細ページっぽいもの | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/083c5b5d-1d64-21b0-df91-b62b3db4cc68.png) | ![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/869cf166-6145-7ae3-e74d-8910ed5865c5.png) |



## 実物

https://www.figma.com/community/file/1079458872134226213

FigmaのCommunity fileとして公開しています。

以下のような要素を盛り込んでいます。

- 色やタイポグラフィー、グリッドなど最低限のデザイントークン
- VariantsやComponent propを用いたComponent
- ある程度状態が変化するPrototype
- desktop, mobileそれぞれのビュー
- flex, gridを用いそうなレイアウト
- positionを用いそうな要素
- header, nav, footerといった頻出要素

## 使い方のイメージ

1. 上記のファイルをDuplicateする
1. デザイントークンをCSS custom propertiesなど、繰り返し使う値として登録する
1. Variantsから、コードに渡す値を想定しながらComponentをコーディングする
1. 全体を通してCSSフレームワークの使用感を確かめる

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
[Swift]TableViewのCellがあるかの判別（0件の時に文字を表示）

## はじめに

下記のようなToDo作成画面で、Cellがない時は「登録しているToDoがありません」と表示させることが多いと思います。

![ezgif-5-5bbc20ca27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/0cf9a6df-03c6-bf17-308f-ed7de22ee152.gif)

調べてると意外と情報が少なかったので載せておきます。

## 方法

まず、TableViewの下に表示させたいLabelを配置しておきます。

![スクリーンショット 2022-05-19 18.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/8e5ff16f-393e-7607-2fe3-e02c7a64b007.png)

次に、TableViewの「numberOfRowsInSection」部分のセットアップで下記を記載します。

```ruby: TodoViewController.swift

private var todoModel: [TodoModel] = []

　　　　　　#//省略

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if todoModel.isEmpty {
            tableView.backgroundColor = .clear
        } else {
            tableView.backgroundColor = .white
        }
        return todoModel.count
    }
```

cellがない場合はTableViewのbackgroundColorを透明にして
cellがある場合は白にすればいいだけ。

簡単ですね。
Modeler scriptでターミナルノード実行のスクリプトを自動生成する

Modeler Scriptでノードを実行したり、変更したりする場合、以下のようにノードの「注釈」タブでIDを調べる必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cd281f0f-6cef-c408-58c4-4ca10a8029c6.png)

しかしながら、スクリプトエディターで「デフォルトスクリプト追加」をクリックすると自動的にストリーム内のターミナルノードをすべて実行(run)するスクリプトを自動生成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c2c7f799-8fa8-ab91-710c-32762f2177d7.png)

単純に実行順序を指定するだけなら、このスクリプトの順番を入れ替えるだけで使えますし、ここで抜き出したIDを使って別の操作を行うこともできます。

■テスト環境
Modeler 18.3
Windows 10 64bit
Pythonの勉強方法(初心者)

Pythonの勉強方法を紹介したいと思います。
Pythonといっても、コーディングのレベルはさまざまです。ここでは、データ分析を行なったり機械学習を実装する上で必要なレベルになるための勉強法を紹介します。

余談ですが、、、
ちなみに私自身も学部1, 2年の時にPythonのプログラミングの授業がありましたが、その時は全くできませんでした、、
(今もたいして書けませんが、、😂)

長期休暇にプログラミングの勉強しようと決意してもなかなか続かず、、
いざコードを書いてみても、実行時エラーの意味がわからない、、

などなど、苦労しました。

そんな自分が、企業の長期インターンで全く問題なくプログラムを書くレベルまでになった勉強方法を紹介したいと思います。


### ○ 意識したこと
・無理にメソッドを使おうとしなくてOK
・実行時間とか気にせず、自分が書けるコードを書く(無駄が多くてもOK)
・細かいことはとりあえず無視(必要になった時に勉強する)

### ○ 実際に行ったこと
・とても簡単な本でいいので、一冊とりあえず頑張ってやってみる。
・YouTubeの動画で勉強する。(←一番オススメ)
・本やYouTubeに記載されているコードを自分なりに適当にいじってみる(引数とか確認してみる)
・既存のモジュール(関数)を自分でイチから書いてみる(車輪の再発明)

### ○ 使用した参考書・webサイト
○ 参考書
「Pythonからはじめる数学入門 , Amit Sara[著] 黒川利明[翻訳]」
https://www.amazon.co.jp/Pythonからはじめる数学入門-Amit-Saha/dp/4873117682

「Pythonによる数値計算とシミュレーション , 小高 知宏(著)」
https://www.amazon.co.jp/Pythonによる数値計算とシミュレーション-小高-知宏/dp/4274221709



○ YouTubeチャンネル：
チャンネル名：【IT・プログラミングLab】伊沢 剛
https://www.youtube.com/playlist?list=PLwgFP6xz77Rxol-cydiwuJSeVFK61rGXP

チャンネル名：いまにゅのプログラミング塾

・Python鬼の100本ノック
https://www.youtube.com/watch?v=Gh0qRBHbnVs&list=PLCZyyif9kAwUrhonYORyv8ktC_ehhhAvM&index=9

・pandas20本ノック
https://www.youtube.com/watch?v=ZQZ38rK28Gk&list=PLCZyyif9kAwUrhonYORyv8ktC_ehhhAvM

・Numpy20本ノック
https://www.youtube.com/watch?v=k4YzlaOXfvQ&list=PLCZyyif9kAwUrhonYORyv8ktC_ehhhAvM&index=2

・matplotlib20本ノック
https://www.youtube.com/watch?v=bsYJ3hTvx7c&list=PLCZyyif9kAwUrhonYORyv8ktC_ehhhAvM&index=3

○ webサイト
・Qiita
https://qiita.com
困ったらQiitaでキーワード検索してみると誰かが記事書いてくれてると思います。ちなみにQiitaは今でもかなり使っています。
Postgresでのテーブルの作り方

<h4>Postgres　テーブルの作り方</h4>
ターミナル開く<br>
psql postgres<br>
create database nodedb;<br>
\c nodedb<br>
下の文が表示される<br>
You are now connected to database "nodedb" as user "＊＊＊＊＊".<br>

次に以下のコマンドを実行
```CREATE TABLE member (id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, name varchar(20));```

下の文が表示される<br>
CREATE TABLE<br>


<br>
<h4>React.js　参考記事（初心者）Training</h4>
Reactアプリの起動方法
react-native run-ios
or
react-native run-android
</br>




https://newsite-make.com/react-study/

https://note.com/dragontaro/n/n0daa9f013135
マイクロソフト製品を利用するときに90日間限定の開発用アカウントを作る方法

## 開発用のオフィスアカウントを取得する方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/76a28784-0537-417f-e1fc-8419ab594b4f.png)


## 以下リンクより今すぐ参加をクリック
https://developer.microsoft.com/ja-JP/microsoft-365/dev-program


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/9f610d56-f6c7-23e5-3121-f5a26a620763.png)

### 入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/5e204a06-be1c-2d39-88dd-f3194c12fd13.png)

### インスタンス　サンドボックスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/92b87417-80c1-448f-3967-1839d8f3dea9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367026/76a28784-0537-417f-e1fc-8419ab594b4f.png)

以上
GitHubのIssueラベルって何処にあるん？

## IssueはわかるもののIssueラベルがわからない

https://qiita.com/maeda_t/items/4344bdeabcc6a18a34cc

## Issueのラベルなのはわかるけどどうやってつけるの？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/79edb1f2-fcd8-cbf3-461f-b7f85770582c.png)

## Issue内の画面右側に普通にあった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/8e5798d6-2259-1224-a5b9-8fe09f95b2ae.png)

## Edit labelsで好きなラベルを作れちゃうぞ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1211754/737dc28e-bd52-3df5-7c19-c23dae9a3cac.png)
Kali Linux2022.1 でハッキングラボをつくってみる9 無線LANへのハッキング３ WEPのパスワードの一部がわかっていたら

# はじめに
[前回](https://qiita.com/kagirohi/items/0a735577852953c42f27)では、WEPのアクセスポイントtestのパスワードが55555であることがわかりました。
これを、攻撃車がパスワードの一部をわかっているものとして、もう一度解析してみようと思います。
条件は、
パスワードが、
- 数字のみで構成されている
- はじめの数字は5
- 桁数は５桁

これらを攻撃者が既知であるとします。

:::note alert
注意事項
記事で紹介されている行為を他人や団体、インフラなどの許可を得ずに行った場合、犯罪となる可能性が有ります。
あくまでも、記事の内容は情報セキュリティの学習です。読者様の所有・管理の機器、システムでのみ実行してください。
また、読者さまのシステムにトラブルが起きたとしても、私は責任を負いかねます。
:::
# 辞書ファイル作成
こうしたケースの攻撃では、辞書攻撃が利用されるので、解析用の辞書をつくる。
`crunch`コマンドで解析用の辞書ファイルを作成します。ファイルは、前述の３条件に基づいて作成します。
```
crunch 5 5 -t 5%%%% 1234567890 -o 
//または
crunch 5 5 -t 5%%%% -f /usr/share/crunch/charset.lst numeric
```
ファイルの出力は、-oオプションか出力をリダイレクトすることで行う。
```
crunch 5 5 -t 5%%%% -f /usr/share/crunch/charset.lst numeric -o wep_wordlist.txt
//または
crunch 5 5 -t 5%%%% -f /usr/share/crunch/charset.lst numeric > wep_wordlist.txt
```

# aircrack-ngでのWEPのパスワード解析
解析するキャプチャファイルは、前回と同じもの。
```
aircrack-ng -w wep_wordlist.txt cracking_wep_test-01.cap -e test
```

# crunchでの辞書作成とWEPのパスワード解析を同時に行う
```
crunch 5 5 -t 5%%%% 1234567890 | aircrack-ng -w - cracking_wep_test-01.cap -e test
```
# おわりに
参考にしたもの
「ハッキング・ラボのつくりかた」
「HackerJapan2013年５月号 記事：28号のツール厨房第１回パスワード辞書作成ツールcrunch」
「The name '   ' is either already used in your application or reserved by Ruby on Rails.」のエラーの解決法

## 開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2
## エラーメッセージ
```
$ The name 'Entry' is either already used in your application or reserved by Ruby on Rails.Please choose an alternative or use --skip-collision-check or --force to skip this check and run this generator again.
```

## 解決方法

```
% rails destroy model entry  
```
この後
```
 invoke  active_record
      remove    db/migrate/日にち_create_entries.rb
      remove    app/models/entry.rb
      invoke    test_unit
      remove      test/models/entry_test.rb
      remove      test/fixtures/entries.yml
```
が出ればモデルの削除ができています。
## エラーの意味と原因
モデルを既に作成していました。
# 参考記事
[[Rails] model名が原因でエラーになる場合の対処方法](https://qiita.com/tu-kun/items/4fede82431e546abd941)
OCI上のOracle Linux 8にGUI機能を追加し、VNC Clientでリモートアクセスする

# はじめに
OCI上に構築したOracle Linux 8のインスタンスに、GUI機能を追加して、
VNCクライアントで接続するための構築手順です。
基本的には[こちら](https://docs.oracle.com/en/learn/install-vnc-oracle-linux/)のドキュメント通りに進めることで構築が可能ですが、メモしておきます。

https://docs.oracle.com/en/learn/install-vnc-oracle-linux/

# インストール手順
### VNC設定など
ポート開放、VNC設定、セキュリティリスト開放なども実施ください。
ポートはtcpの5901を用います。

### GUI環境のインストール
```shell
$ sudo dnf groupinstall "Server with GUI"
```
### グラフィカルモードをデフォルトに設定し、リブート
```shell
$ sudo systemctl set-default graphical
$ sudo reboot
```
### /etc/gdm/custom.confファイル内のWaylandEnableのコメントアウト(#)を削除する
```shell
$ sudo vi /etc/gdm/custom.conf
WaylandEnable=false
```

### VNCパッケージのインストール
```shell
$ sudo dnf install -y tigervnc-server tigervnc-server-module
```

### VNC passwordの設定
VNCで接続する際のパスワードを設定する。
view-onlyのパスワードも聞かれるが、マウスやキーボードが使えない権限になるため必要に応じて設定。
```shell
$ vncpasswd
```

### vncserver.users ファイルにユーザ情報を追記
```shell
$ sudo vi /etc/tigervnc/vncserver.users
```
下記を追記
```
:1=opc
```


### 画面サイズなどの設定をファイルに追記
```shell
$ sudo vi /etc/tigervnc/vncserver-config-defaults
```
下記を追記
```
session=gnome
geometry=1280x1024
```

### 自動起動の設定ファイルを作成
```shell
$ sudo mkdir /etc/systemd/system/vncserver@.service.d/
$ sudo vi /etc/systemd/system/vncserver@.service.d/10-restart.conf
```
下記を追記
```
[Service]
Restart=always
```


### VNCサービスの登録
```shell
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now vncserver@:1.service
```

### ファイアウォールルールの設定
```shell
sudo firewall-cmd --zone=public --add-service=vnc-server --permanent
sudo firewall-cmd --reload
```

# 動作確認
netstatコマンドにて、Xvncプロセスが:5901ポートにて動作していることが分かる
```shell
$ netstat -tpln | grep Xvnc
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      2359/Xvnc
tcp6       0      0 :::5901                 :::*                    LISTEN      2359/Xvnc
```


# クライアントからの接続
### Ultra VNC Viewerから接続
- 割り当てられたグローバルIPアドレス:5901に追記
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/e8112c03-bea8-81a6-5763-ebd3fac4531d.png)

- `vncpasswd`にて設定したパスワードを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/c3bcfca6-585d-3844-bdb9-c382ecc443e1.png)


- 接続完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2470077/b17b8b81-d5b0-ed47-b1d3-c5a6ff96e398.png)


＊セッションが切れるとパスワードの入力が求められます。
　その際はsshでノードにログインして、opcに対して`$ sudo passwd opc`コマンドにてパスワードを設定することでログイン可能です。


# 要塞(Bastion)ホスト経由でのアクセス

追記予定

# 参考
https://docs.oracle.com/en/learn/install-vnc-oracle-linux/

https://docs.oracle.com/cd/F34086_01/bastion-hosts_jp.pdf
VRoid Studioで制作キャラクターの操作個人的まとめ(macトラックパッド) 拡大,回転,移動など 

この記事はpixivの出している、3Dキャラクターモデルが簡単に作れる『VRoid Studio』で躓いた初心者向けの記事です。macトラックパッドユーザー向け。

Windowsとかの人はこっち　[Vroidの公式操作方法 サイト](https://vroid.pixiv.help/hc/ja/articles/360012333453-%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC)


# VRoidで製作中のキャラクターが 回転 しない！？
「前からしか見えないっ、後ろどうなってんの？」ってなりますが回転できます。
結論：二本指でトラッグパッドを**押しながら**、キャラを回転させたい方に押したまま移動させる

以下のように下からも見れます
![スクリーンショット 2022-05-19 16.59.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670275/d605f1e8-6d1e-9c76-ed4c-80541b589d8c.png)

# VRoidで製作中のキャラクターが 移動 しない！？
結論：Shift+一本指でドラッグ

# VRoidで製作中のキャラクターが 拡大縮小 しない！？
結論：二本指でドラッグ
もしくは：ズームイン Cmdと**＋**, ズームアウト　Cmdと**ー**
Google Cloud Professional Cloud Architect を取得しました

# Google Cloud Professional Cloud Architect を取得しました
2022/3に Professional Cloud Architect を受験し、合格しましたので、そのとき実施した学習方法をまとめます。

## 前提
Google Cloud の経験は、業務で Cloud Storage と BigQuery を少し触ったことがある程度です。
2021年に Associate Cloud Engineer を取得していたので、各種サービスの概要などは理解していました。

## 学習方法
### Coursera

https://www.coursera.org/professional-certificates/gcp-cloud-architect-jp

コース1~5は Associate Cloud Engineer 取得時に受講していたので、今回はコース6の「Preparing for the Google Cloud Professional Cloud Architect Exam 日本語版」のみ受講しました。
教材の動画や確認テストで苦手なカテゴリや忘れている箇所を洗い出して、公式のドキュメントで復習していました。

### Udemy 模擬問題

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/

正答率が全セット80%以上になるまで実施しました。
間違った問題や正解したけど自信がない問題は、解説に載っている公式ドキュメントまで目を通しました。
実際の試験で、この模擬問題がそのまま出題されていた設問もあったので、この模擬問題をやりこんでおくのは重要だと思います。

### 公式模擬問題
Google Cloud が公開している模擬問題も、正答率が80%になるまで実施しました。
この模擬問題については、クラウドエースさんが解説している記事がとても詳しく参考になりました。

https://cloud-ace.jp/column/detail262/

### ケーススタディの把握
Professional Cloud Architect の試験では、架空の会社やソリューションを説明するケーススタディを使った問題が出題されます。

https://cloud.google.com/certification/guides/professional-cloud-architect?hl=ja

受験時もケーススタディの内容は確認できますが、事前に確認しておくと時間短縮になります。
「gcp professional cloud architect ケーススタディ」で検索するといろんな人がブログや動画で解説しているので、
それらをみて自分の考え方が合っているかを確認していました。

## 受験
テストセンターで受験しました。
点数や正答率は非公開で、試験→アンケートのあとに、「合格」と表示されました。
この合格は仮合格で、その後 Google の審査を経て、正式な合否が決まります。
わたしの場合は受験から2日後に正式な合格通知がきました。

## 受験した感想
難易度は高いですが、きちんと対策すれば合格する試験だと思います。
また、Associate Cloud Engineer を学習範囲が被っているので、Associate Cloud Engineer を受験したらすぐ Professional Cloud Architect の学習に取り掛かるのがおすすめです。
（わたしはだいぶ時間が空いてしまったため、思い出すのに時間を使いました。）

以上です。
どなたかの参考になれば幸いです。
事前に定義されたリストの順番にそって、配列の要素を並べ替える簡単な方法

例えばいくつかの都道府県を、事前に定義された順番に並べ替えたい時、

```ruby
ISO_PREFECTURE_LIST = ["北海道", "青森県",...,"千葉県","東京都","神奈川県",...,"鹿児島県","沖縄県"]
prefs = ["東京都", "沖縄県", "青森県"]

# prefsをISOの都道府県リスト順に並べ替えたい

p ISO_PREFECTURE_LIST & prefs
#=> ["青森県, "東京都", "沖縄県"]
```

「&」は両集合の共通要素を返してくれる積演算だが（intersectionのエイリアス）、結果の集合の順番が左辺のものになるので、こういうこともできる。

ただし
「重複する要素は取り除かれます。」
なので用途に注意。

https://docs.ruby-lang.org/ja/latest/method/Array/i/=26.html
【全Blenderユーザに薦めたい】レンダリングを失敗させないアドオン：FinalCheck

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784893/bd3b602c-d974-5655-9243-a94a5554cfa8.png)

## はじめに
Blenderをはじめ、プリレンダーCGのレンダリングは、時間がかかるが故に非常に気を使う工程です。
寝る前にレンダリングを実行し、起きて見てみたら失敗していた...という経験がある人もいると思います。

失敗の原因には、
* 非表示にしていたオブジェクトがレンダーでは表示されていた
* 処理が重くなるため作業中にオフにしていた機能を、レンダー時にオンにし忘れていた
* テスト用の低クオリティ設定のまま最終的なレンダリングをした
* テクスチャ画像のパスが壊れていた

など、ケアレスミスと呼べるものも多くあります。これらのミスはシーンが複雑になるほど増えていくものです。人の目での確認は限界がありますが、自動化し簡単にチェックできるようになれば、制作が効率化するに違いありません。  
そこで、ボタン一つでシーンの問題を一覧で確認できるアドオン **FinalCheck** を作成しました。個人的に最近の制作でも結構役に立ったのでおすすめしたいです。

## FinalCheck - Blender Addon
無料ダウンロードは、[Gumroad](https://omineme.gumroad.com/l/finalcheck)(投げ銭も可)、もしくは[GitHub](https://github.com/omine-me/FinalCheck)から。
または、[Blender Market](https://blendermarket.com/products/finalcheck)から1ドルで購入できます(いずれも内容は同じです)。
### 概要
FinalCheckは、シーンの問題をチェックし、簡単に修正できるアドオンです（日本語、英語に対応）。
チェックボタンを押すだけで、問題のあると思われる項目を一覧で表示します。
レンダリングの直前にチェックすることで、ケアレスミスによるレンダリングの失敗を防げます。
### チェックする項目
* コレクションの可視性： ビューポートとレンダーでコレクションの可視性が異なるか。
* オブジェクトの可視性： ビューポートとレンダーでオブジェクトの可視性が異なるか。
* パスが不明なファイル： 画像ファイルのパスが壊れているか。
* レンダー領域： レンダー領域が設定されていて、レンダー領域が縮小しているか。
* 解像度%： 解像度%が100%より小さいか。
* サンプル数： レンダーのサンプル数がビューポートのサンプル数より小さいか。
* インスタンス化： ビューポートとレンダーでインスタンサーの可視性が異なるか。
* モディファイア： ビューポートとレンダーでモディファイアの可視性が異なるか。
* コンポジット： ビューアーノードとコンポジットノードのインプットが異なるか。(α版)
* パーティクル
    * エミッターを表示： ビューポートとレンダーでエミッターの可視性が異なるか。
    * 子パーティクルの量： ビューポートとレンダーで子パーティクルの量が異なるか。
    * パーティクルの表示率： ビューポートでのパーティクルの表示率が100%より小さいか。
* グリースペンシル
    * モディファイア： ビューポートとレンダーでモディファイアの可視性が異なるか。
    * エフェクト： ビューポートとレンダーでエフェクトの可視性が異なるか。

結果の一覧は、シーン - ビューレイヤー - コレクション - オブジェクト - モディファイア - モディファイアの詳細設定(現在パーティクルのみ)というように、階層構造で表示されるため、分かりやすい表示になっています。
また、各項目は、項目の右側に現在の値などのUIが表示され、簡単に修正できます。
**[New!]** : レンダリング時に自動チェックできるようになりました！（Ver.0.2.0）

### 設定項目
チェック項目ごとにチェックする・しないを設定から変更できるため、巨大なファイルでも必要なチェックを迅速に行えます。また、全てのシーン・ビューレイヤーをチェックするか、現在のシーン・ビューレイヤーのみをチェックするかも設定できます。

### 将来的な目標
* ユーザーからの要望があればチェック項目の追加
* レンダリング前に自動的にチェックする機能の追加
    * 現状Blender APIの制約的に難しい部分がある。


## 技術的側面・制作時の課題
### Blender APIによる制限
Blender API(bpy)の機能に依存する部分が多く、その制限によってできないことはどうあがいてもできません。
例えば、APIの制限により見送った機能には、
* コンポジットノードのチェック(現在は部分的に実装しています)

などがあります。
また、Blender APIはBlenderのバージョンごとの違いが結構あり、本アドオンはBlender 2.8以前では利用できません。

細かい話になりますが、API経由で設定するアドオン独自のコマンド(オペレーター)は、その引数のタイプが決まっており、リストやメソッド、参照等を渡すことができません。そのため、参照を渡したいときには、オブジェクトIDをstringに変換し、引数に入力し、コマンド内で参照に戻すというオーバーヘッドが発生します（ちなみに、オブジェクトIDは数値で表されますが、intへの変換は桁の問題でできません）。

### データ構造の複雑さ
チェックでは様々なBlenderの内部データにアクセスしますが、複雑な部分も多いです。
特にコレクションについては、マスターコレクションと通常のコレクションのクラスが異なったり、それぞれが入れ子になって存在するため、扱いが難しかったものの一つです。

## おわりに
個人的に欲しいと思い、2か月ほどかけて制作しました。
自分で使っていて結構役立っているので、ぜひいろんな人に使ってもらいたいと思っています。
フィードバックやバグは、[GitHub](https://github.com/omine-me/FinalCheck)もしくは[Twitter](https://twitter.com/mineBeReal)からお願いします。
TCPのコネクションの確立

# TCPによるデータ通信
前まではHTTPリクエストとHTTPレスポンス（クライアントとサーバー）によってコンピュータネットワークを構成している学んでいた。
今回はそれのHTTPのデータのやり取りを行うのは、```TCP/IP（Trasmission Control Protocol)```だ。
```TCP```はWebサイトの閲覧、メールの送受信、ファイルの転送のデータ転送時に利用されている。
# コネクション（通信経路）
TCPはこの両者の通信ができる状態なのかを確認し、通信経路を確立する。
通信経路のことを```コネクション```と呼ぶ。

# コネクションの状態を確認
コネクションの確立は3回のやり取りによって状態を確認する。
1.クライアントからの接続要求
2.クライアントに対して確認応答及び、サーバーからの接続要求
3.サーバーに対して確認応答
の3段階がある。

## クライアントの接続要求の手段
接続を要求するために```SYNパケット```と呼ばれるデータを送る。
このデータを受け取ったサーバーは応答をする。

## サーバーがクライアントに対しての確認応答及び、サーバーの接続要求
送信相手からの確認応答を受け取りサーバーへの送信が完了したと判断するこの確認作業を```ACKパケット```と言う。
とりあえず確認して無事完了の判断を```ACKパケット```と言う。
また接続完了を伝えるために```ACKパケット```をクライアントに送信する。
そして```SYNパケット```を送信し、クライアントに対して、接続を要求する。

### 確認応答
ACKとは、二者間の通信で、相手方に何らかの肯定的な応答を返す際に送られる信号やデータ、パケットなどのこと。「接続要求を受理した」「データが正しく受信できた」といった内容を伝達するために用いられる。
出典 https://e-words.jp/w/ACK.html#:~:text=ACK%20%E3%80%90ACKnowledgement%E3%80%91%20%E8%82%AF%E5%AE%9A%E5%BF%9C%E7%AD%94%20%2F,%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82
## サーバーに対して確認応答
サーバーからのデータの送信が完了したと判断したことを送信する(ACKパケット)
【初学者向け/スコープ原因のバグ対策】JSグローバル変数や関数の引数など、スコープに関しての整理

:::note 
対象者
* 関数や変数を習ったけど、 **グローバル変数**や **スコープ**といったキーワードがなかなか理解できない
* 関数が入れ子になったとき、変数/関数の **宣言場所**や **引数**ってどんな挙動するの？
:::
# スコープ=範囲とは
プログラムで使用される変数は自由に名前を設定できますよね？
すると、同じ名前にしたり、上書きしたりと、プログラム側はブレない基準で処理しないといけないです。
そのため、 **宣言場所**によって、使用できる **範囲**を制限します。
関数の外で宣言した変数は関数の中でも宣言せずに使用することができます。これを **グローバル変数**と呼びます。
```javascript
let global_v = 0; // グローバル変数
function f1() {
 // 変数宣言不要!
 console.log(global_v); // 0が表示される
}

f1(); // ここで関数を実行します
```
ちなみにですが、以下のように関数内で同じ変数名で宣言してしまった場合、関数内の変数が優先されます。

:::note alert
非推奨！
バグの原因ですので、良くない書き方なのです。（バグ原因を探す一つとしてご紹介しています）
:::
```javascript
let global_v = 0; // グローバル変数
function f1() {
 let global_v = 1;
 console.log(global_v); // 1が表示される
}

f1(); // ここで関数を実行します
```
# バグの嵐
:::note alert
引き続き非推奨の書き方を列挙していきます。
:::
### 関数宣言時の引数名
以下の例では、関数`f2()`の引数名に`v1`というグローバル変数と同じ名前を書いているため混乱のもととなります。
上記と同様に引数は関数内のみで有効のローカル変数として定義されるので、`return`などしないと関数の外では使えません。
```javascript
let v1 = 0;
 function f1() {
  v1 += 1;
  console.log("in1-" + v1); // in1-1
 }
 function f2(v1) { // 下の関数呼び出しの箇所で引数にグローバル変数のv1を指定しています
  v1 += 1; // 引数として呼び出したローカル変数の処理。
  console.log("in2-" + v1); // in2-2
  // このローカル変数のv1は特にreturnしていない
 }
f1();
console.log("out1-" + v1); // out1-1
f2(v1); // 引数にグローバル変数のv1を指定しています
console.log("out2-" + v1); // out2-1 特にreturnされていないのでf1()で計算されたグローバル変数のv1を表示します
```
### 関数内に関数を宣言したとき
変数だけでなく、関数にもスコープがあります。
そのため、 **どこで宣言したか**が重要になったりします！
```javascript
function main(){
 console.log("hoge");
 function child(){ // main関数内での関数宣言
  console.log("huge");
 }
 child(); // main関数内ではスコープ内なので実行できる
}
main();
child(); // こちらはスコープ外なので実行できない
```

今日(2022/5/19)のところはひとまずここまで。
気が向いたら追記しまふ。
fastpagesとGithub Pages使ってAWS環境定義書作れるらしいから試してみた

# なんでやったの❓
👇この方のQiita記事に触発されて、これがやれるなら・・・・・
- [fastpagesを使ってJupyter Notebookを簡単にブログに変換する - Qiita](https://qiita.com/__yuki__/items/6841bba8272411c633fb)

👇これもやれるのでは❓と思ったからです :thinking: 
- [Jupyter Notebookと Boto3で AWS環境定義書を作成してみる | DevelopersIO](https://dev.classmethod.jp/articles/awsspec-by-jupyter/#toc-10)


## ちょっとハマったところ
### Jupyter Notebookで色々やれるって言ってもAWSのクレデンシャルはコードに書けないなー :sweat: :sweat: 
- 環境変数とかから読み込んで実行できる状態をDocker :dolphin: コンテナ上で作った
- boto3 さんの認証情報の読み込み順とかよくわからなかったので、下記が大変参考になりました :bow: 
    - [Boto3（AWS SDK for Python）の利用する認証情報 - Qiita](https://qiita.com/tsukamoto/items/00ec8ef7e9a4ce4fb0e9)

### 上記で認証情報設定したけど、、、、なんか動かんぞ❓❓❓
- dockerコンテナに `root` ユーザで `exec /bin/bash` してAWS CLIの設定してたみたいで、Jupyter Notebookが実行されてるのは別ユーザだったみたい :thinking: 
- 該当ユーザで `aws configure` して、読み取り権限付与したら Jupyter Notebook上でAWS CLIが動いた :tada: 

### dockerでJupyter Notebook動かせるらしいが、どのイメージが良いのかとかはっきり言ってわからん :sweat: :sweat: 
- 下記のdocker-stacksっていう色々とまとまったものがあったので、それを読んで `jupyter/base-notebook` 使ってみた
    - [jupyter/docker-stacks: Ready-to-run Docker images containing Jupyter applications](https://github.com/jupyter/docker-stacks)

# できあがったやつ(漏れちゃいけない情報は削除済み :grin: )
- [Fastpages Notebook でブログを書いてみた | fastpages](https://takarashinya.github.io/fastpages-sample/jupyter/2022/05/18/first.html)

# その他参考サイト
- [fastai/fastpages: An easy to use blogging platform, with enhanced support for Jupyter Notebooks.](https://github.com/fastai/fastpages)
- [JupyterNotebookでboto3を使えるようにした話 - How to make datas our friends](https://024minion.hatenablog.jp/entry/2017/12/28/033541)
- [| notebook.community](https://notebook.community/NII-cloud-operation/Jupyter-LC_docker/sample-notebooks/02_AWS%E6%93%8D%E4%BD%9C%E7%94%A8%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
Gitブランチ　忘れないように（初期）

メインのブランチ
main(従来はmasterだったが今はmainが主流に）
master
develop

最初にdevelopブランチを作って何も入ってない状態でプッシュする
それ以降はプッシュすることはないdevelopブランチに関しては

developブランチは主に Future ブランチのマージ先として利用する

futureブランチはdevelopブランチから作る
ブランチ作成

git checkout -b "branchname"

Master main ブランチに関してはリーダーがdevelopからマージ先として利用するので私は何もいじらない
mainに何もマージ先と指定することは今の私にはないだろう。

vscode のsource controlにはステージングされたファイルだけが残る
プッシュしてしまったらSource controlにトラッキングファイルやステージングされたファイルは残らない。

git commit -m "comment"
–m の意味はメッセージ
commentを入れたい時に使いましょう

git push origin (branch name)
<h3>PUSHが一番最後<br></br>

結論
git add . ☞　Commit(メッセージなど添えて）　☞PUSHHHHHHHH</h3>


参考になるリンク↓
Headがdetachedしたときに見るとよい
https://qiita.com/kenkono/items/c488ec9559f6cca34313

一度マージリクエスト作成後は、同じ手順でプッシュすれば同じマージリクエストにlatest versionとして追加されるので、わざわざまたマージリクエストを作らなくてもいい。

Detached origin になったとき、使うコマンド
```git push origin HEAD:pushしたいブランチ```


origin/ブランチ名について
origin/ブランチ名　というのは、ローカルにプルしたリモートブランチを指す。 リモートレポジトリがoriginと呼ばれているため、この名前がついている。


<h4>commitの履歴を見るには？</h4>
git log
<br>
git log --graph　
<br>
git log --pretty=oneline(綺麗に一行ずつ見やすくしてくれる）
<br>
上記のいずれかのコマンドを使う

<h4>git繋がっているレポジトリの情報を見るには</h4>
git remote -v　コマンドを使う
Django makemigrationsでエラー 「No installed app with label 'xxxx'」

## エラーで出たxxxxを書き換える

```seting.py
INSTALLED_APPS = [
# 下の自分で作成したアプリの名称を使う
# 今回のアプリ名 ⇨　mysuperapp
    'mysuperapp.apps.AppConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

```

## ターミナル
```
python manage.py makemigrations mysuperapp
```

でOK!
【Rails7】Ajaxリクエスト時にCSRF tokenを含める（おそらく）公式のやり方

巷にはX-CSRF-Tokenを手動で取得して送信するサンプルコードが溢れていますが、
一応公式で楽する方法が用意されています。

# Rails6以前

rails-ujsに含まれるRails.ajaxメソッドを使うことで、自動でCSRF tokenをサーバーに送信できます。

```javascript
const data = new FormData();
data.append("some_key", "some value");

Rails.ajax({
  url: "/some_resources",
  type: "POST",
  data: data,
  success: function(response) {
  }
});
```


# Rails7以降

TurboフレームワークとStimulusが標準構成になり、rails-ujsは含まれなくなりました。
その代わり、上記ajax機能のみを切り出したrequest.jsというライブラリが公式で提供されています。
（本体に含まれているわけではないので事前にimportmapでpinする必要あり）


```javascript
import { Controller } from '@hotwired/stimulus'
import { post } from '@rails/request.js'

export default class extends Controller {
  async hoge() {
    const response = await post("/some_resources", {
      body: { some_key: "some value" }
    })
    if(response.ok){
      ...
    }
  }
}


```

get, post, patch, put, destroy(deleteじゃないのか)などに対応したメソッドも用意されていて、
かつFormData以外に普通のObjectも渡せるようになっており便利。


詳細はこちらのREADMEに。

https://github.com/rails/request.js
yamlのエイリアスとアンカーを使って２つの配列を結合する (PyYAMLで検証)

``` yaml
array1 : &array1
- a: 1
  b: 2
  c: 3
array2 : &array2
- d: 4
  e: 5
  f: 6

array :
 <<: *array1
 <<: *array2

# 結果
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
```

``` yaml
array1 : &array1
- a: 1
  b: 2
  c: 3
array2 : &array2
- d: 4
  e: 5
  f: 6

array :
 - <<: *array1
 - <<: *array2

# 結果
# [{'a': 1, 'b': 2, 'c': 3}, {'d': 4, 'e': 5, 'f': 6}]
 ```

``` yaml
array1 : &array1
- a: 1
  b: 2
  c: 3
array2 : &array2
- d: 4
  e: 5
  f: 6

array :
- *array1
- *array2

# 結果
# [[{'a': 1, 'b': 2, 'c': 3}], [{'d': 4, 'e': 5, 'f': 6}]]
```

### 検証に使ったpythnコード
``` python
import yaml

def main():

    document = """
    # ここにyamlを入れる
    """
    values = yaml.safe_load(document)
    print(yaml.dump(values))

    print(values.get('array'))

if __name__ == '__main__':
    main()
```
athena(presto)で週次毎の集計

### 週次での集計コード(月曜始まり)
`ver`は`'yyyy-mm-dd'`の文字列想定です
```sql
group by
    date_add('day', -(6 + day_of_week(cast(ver as date)))%7, cast(ver as date))
```
### やってること
`day_of_week(timestamp)`が日付を入れると月~日を1~7とする曜日番号で返してくれるのでそれを利用しています。    
コード内で6としている部分を変えれば好きな曜日起点での週次集計ができるかと思います。    

prestoでの週次集計を調べると`week()`をによる週番号での方法が出てくるのですが、それだと1年以上の集計ができないためこの方法を使っています。    
やり方自体は[MySQL日毎、周毎、月毎集計](https://qiita.com/ssd710/items/a0dbfe1a6ba1eca278b6)のものをpresto式に書き換えただけです(ありがとうございます)
ネットワーク～初期導入作業（キッティングetc）～

# はじめに
ネットワークの設計を経て機器が納品されて、いざキッティングするぞ:muscle::bangbang:
となった時のために、作業手順や作業内容について紹介します。

大まかな作業の流れは以下となります。
Cisco機器想定ですが、他メーカの機器でも概ね同じ作業を行います。

:::note info
１.事前準備
２.検品
３.起動確認
４.各種ステータス確認（目視＆ログ）
５.デフォルトコンフィグ取得
６.サポート解析用ログ取得
７.キッティング
:::

では１つずつ説明していきます。

# １.事前準備
キッティングする機器のハードウェア仕様は事前に調べておきます。
ポート構成（ポート数、コンソールポートやmgmtポート）や、電源構成（消費電力、電源の入れ方や落とし方）、ステータスランプ（LEDランプ）の見方は、次工程以降で必要な知識になります。
「ハードウェア設置ガイド」「インストールガイド」等メーカサイトに掲載があるので、簡単に調べることができます。

参考：[Cisco Catalyst 9300 シリーズ スイッチ ハードウェア設置ガイド](https://www.cisco.com/c/ja_jp/td/docs/switches/lan/catalyst9300/hardware/install/b_c9300_hig/b_c9300_hig_chapter_01001.html)

# ２.検品
その名の通り、納品された機器のチェックです。
機器が入った段ボールを開梱して、発注した機種＆台数が合っているか、納品書に記載されている同梱物は入っているか、保守資料などの紙媒体もすべてチェックします。
1台ずつ検品用チェックシートを作っておくと作業が円滑に進みエビデンスにもなります。
同梱物は、ケーブル類やラックマウント用金具やネジ、電源ユニット等々、機器によって様々です。

![Cisco同梱物.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/ffd33d02-15eb-b4cf-f42d-36edbafb2b7c.png)
＃Cisco Catalyst 9300 シリーズ スイッチ ハードウェア設置ガイド（梱包内容
より）


# ３.起動確認
機器の電源を入れて、正常に起動するか確認します。
機器によって消費電力や電源の形状が異なるので、キッティング環境の電源設備は予め確認しておく必要があります。シャーシ型など大きい機器は30Aコンセントが必要になる場合もあります。

初めにコンソール接続をしておき、起動中のログをエビデンスとして取得します。
エラーログが出ていないかを確認し、ログインプロンプトが表示されれば起動完了です。



# ４.各種ステータス確認（目視＆ログ）
無事に起動できたら、ステータス確認を行います。
目視確認では、機器のステータスランプが正常であることを確認します。
LEDランプが、電源やFAN周辺、装置前面など各所にあります。
緑点灯、緑点滅、橙点灯、消灯etc...正常状態が何れかは知っておく必要があります。

ログ確認では、主に以下ログを確認し取得します。
機器ごとにOSバージョンやシリアル番号の一覧表を作っておくと運用保守面で便利です。

+ **show version**　
機器に搭載しているOSバージョン、License、筐体シリアル番号等の情報

+ **show inventory**
機器に搭載している各モジュール(電源/FAN等)シリアル番号の情報

+ **show env all**
電源やFANの稼働状態

+ **show logging**
装置内に出力されたログ情報

（Ciscoコマンドを例としてます、メーカ/機種によってはコマンドは異なります。）



# ５.デフォルトコンフィグ取得
工場出荷状態の真っ新なコンフィグのことをデフォルトコンフィグと言います。
キッティング前後で何を設定したのか比較して判別できるよう、取得しておきます。
パラメータシートに漏れがないか確認するのにも役立ちます。

+ **show running-config**
稼働中のコンフィグ情報

+ **show running-config all**
show running-configには表示されないデフォルト値を含んだ全コンフィグ情報



# ６.サポート解析用ログ取得
Ciscoでいう「**show tech-support**」ログのことです。
showコマンドの塊みたいなものですが、かなりの容量になります。
GUIログインが出来る機器はブラウザからダウンロードできますが、コンソール接続で行うと数時間かかることもあるので、可能であればmgmtポートにIPアドレスを仮設定して、telnetなどでリモートログインして取得することをお勧めします。



# ７.キッティング
パラメータシートを元に設定をしていきます。
事前に流し込み用コンフィグを作っておくのもありですが、1つ1つのコマンドが弾かれていないか確認しながら行うことが大切です。OSバージョンや機種によってはコマンドが異なることがあります。
キッティング前後の「**show running-config**」を比較して、想定通りの設定が入っているか、想定外の設定が入っていないかを確認します。


# 次の工程について
キッティングが完了したら、各設定が機能するか単体試験を行って確認します。
単体試験を終えたら、周辺機器と接続して結合試験を行います。

これらはまたの機会に。では。m(_ _"m)
SSHキー作り方

SSHキーの作り方について調べてた際このサイトが一番分かりやすかったのでリンクを貼っておく.


https://jdblischak.github.io/2014-09-18-chicago/novice/git/05-sshkeys.html#:~:text=Key%20Points&text=Your%20public%20key%20can%20be,your%20public%20key%20with%20GitHub
脅威とマルウェア

## 脅威の種類
### 物理的脅威
<b>災害による機器の故障、侵入者による物理的破壊や妨害行為などによる脅威
### 人的脅威
<b>操作ミス・紛失・内部関係者による不正使用・怠慢などの人による脅威のこと。
人の心理の隙を突いて機密情報を入手することを<font color = blue>ソーシャルエンジニアリング</font>という。画面を覗き見ることを<font color = blue>ショルダーハッキング</font>という。
離席時に画面をロックする<font color = blue>クリアスクリーン</font>や机を整理しておく<font color = blue>クリアデスク</font>などを心がける。
### PCの廃棄
<b>データ消去用ソフトで磁気ディスクの全領域にビット列を上書きしたり、物理的に破壊するなどが必要。
### 不正のトライアングル
<b>不正行為は機会・動機・正当化の条件が揃った時行われるという<font color = blue>不正のトライアングル理論</font>がある。対策として、実施者と承認者を別の人にしたりすることが必要(<font color = blue>職務分掌</font>)
### 技術的脅威
<b>コンピュータウイルスやサイバー攻撃などのIT技術を使った脅威のこと。
## マルウェア
<b>悪意をもって作成された不正プログラムの総称。
<font color = blue>コンピュータウイルス</font>
<font color = blue>マクロウイルス</font>
<font color = blue>ワーム</font>
<font color = blue>BOT</font> - ネットワークを通じて外部から操る。外部から悪意のある命令を出すサーバを<font color = blue>C&Cサーバ</font>という
<font color = blue>トロイの木馬</font> - 有益なソフトウェアと見せて、特定条件まで動作せず、悪意のある動作をするもの。
<font color = blue>スパイウェア</font> - 利用者の意図に反してPCにインストールされ、個人情報などを収集される。
<font color = blue>ランサムウェア</font> - 勝手にPCのファイルを暗号化して読めなくして戻すためのパスワードと引き換えに金銭を要求する。
<font color = blue>キーロガー</font>
 <font color = blue>ルートキット</font> - <font color = blue>バックドア</font>を作り、侵入の痕跡を隠蔽する。
### BYOD
<b>個人的に所有数PCやスマホなどの情報端末を業務に利用すること。ウイルス感染や情報漏洩のリスクがある。
また、社員が情報システム部門の許可を得ずに、私物のPCやスマホ、社外のクラウドサービスなどを業務に使うことを<font color = blue>シャドーIT</font>という。同様に、セキュリティ面のリスクが増える。
企業が社員などに貸与するスマホの設定やアプリを一元管理する仕組みを<font color = blue>MDM</font>という。
## ウイルス対策ソフト
<b>マルウェアを検知して、コンピュータを脅威から守り、安全性を高めるソフトウェアの総称。
これは既知ウイルスのシグネチャコード(ウイルスを識別する特徴的なコード)を記録した<font color = blue>ウイルス定義ファイル(パターンファイル)</font>を持っている。
### 検出方法
<b><font color = blue>パターンマッチング方式</font> - 検査対象と既知ウイルスのシグネチャコードを比較する。未知のものは検知できない。
<font color = blue>ビヘイビア方式(振舞い検知)</font> - サンドボックスといわれる仮想環境で、実際に検査対象を実行して、その挙動を監視することで、ウイルスを検知する。未知のものも検知できるが誤検知もある。
### セキュリティホール
<b>OSやソフトウェアに潜むセキュリティ上の脆弱性のこと。脅威はここを狙うので、<font color = blue>セキュリティパッチ</font>と呼ばれる修正プログラムをすぐに反映させる。
### ゼロデイ攻撃
<b>セキュリティパッチがベンダから提供される前にセキュリティホールを利用する攻撃は、<font color = blue>ゼロデイ攻撃</font>と言われている。
簡単なufw設定まとめ

# ufwとは
Ubuntuなどで標準的に使われるファイアウォールアプリケーション。
外部からの通信を許可/ブロックするルールを記述し、それに従って通信を制御します。
シェルからコマンドラインで操作します。

# 記事の趣旨
本記事は、個人で管理しているマシンの範疇で、接続元や公開するポートを制御したいときのための簡単な覚書です。シェルは使えるけど、何からやれば良いかわからない人、多数のコマンドを羅列されても困る人向けに、設定手順の概要と必要なコマンドに絞ってまとめました。

★不特定多数からの通信を受け付けるサーバなどには適さない内容なので、必ずその用途の記事を見てください！

また、以下のようなこともできるようなので、必要に応じて別の記事を探してください。
- ログ設定
- 通信回数の制限（不特定多数にポート公開する場合のセキュリティ対策）
- 通信を遮断し、"Connection Refused"を返す

# 設定の流れ
1つ1つのポートに対して設定を書いていくのは困難なので、以下の手順で設定。

~~ 初期設定 ~~
- デフォルト状態（全ブロック/全許可）を設定
- 特定の ポート/接続元/プロトコル に対する許可ルールを追加
- ufwを有効化

~~ 運用 ~~
- 必要に応じて新たにルールを追加
- ufwをリロード

特定の接続元だけを想定するのであれば、特定のポート、接続元、プロトコルのみを通す設定（ホワイトリスト登録的な感じ）で大概OKなので、デフォルト全ブロック → 必要なものを許可リストに追加という流れで設定できる。

# コマンド一覧
- root権限がいるので、su状態かsudoで実行

### 動作状態、許可/ブロックルールリストの確認
```ufw status```

### 有効化/無効化
- 有効化
```ufw enable```
default deny 状態にしてenableすると全ブロックになる。ssh接続中に設定するときは要注意。接続元のIPに許可を出してからenableが安心…
- 無効化
```ufw disable```
- 設定変更後のリロード
```ufw reload```

### デフォルト状態の変更
- 全ブロック
```ufw default DENY```
- 全許可
```ufw default ALLOW```

### 許可
本記事で追加するのは、許可ルールのみです。
基本コマンドは、```ufw allow [内容]```で、内容の中身を用途に合わせて変えます。
以下、よく使うものです。
  
- ポートに対して許可
```ufw allow [port] ``` 
- ポート＆プロトコルに対して許可
```ufw allow [port]/[protocol]```
- アプリケーションに対して許可
``````ufw allow [app]``````
- 特定の接続元＆ポートに対して許可　★この記事のケースでは、一番よく使うと思います
```ufw allow from [IP] to any port [port]```
- 全盛り設定
```ufw allow from [IP] proto [protocol] to any port [port]```

app：ssh, httpなど
protocol：udp, tcp
IP：IPアドレス xxx.xxx.xxx.x/xxみたいな指定もOK
port：解放対象のポート番号 min:maxで範囲指定も可能

### ブロック
ホワイトリスト登録であれば、基本使わないです。
基本コマンドは、```ufw deny [内容]```です。
内容は、上記の許可方法のallowをdenyに変えるだけなので割愛。

### ルールの削除
不要になったルールを削除します。基本コマンドは、```ufw delete [内容or番号]```です。

- ルールの内容を指定して削除
許可ルールの記述と同様でOK。IPごとのルールは、1or2番目の方法でまとめて消せないので3or4番目を使用
ポート　```ufw delete allow [port]```
ポート＆プロトコル　```ufw delete allow [port]/[protocol]```
IP＆ポート　```ufw delete allow from [ip] to any port [port]```
IP&ポート＆プロトコル　```ufw delete allow from [ip] proto [protocol] to any port [port]```

- 番号で指定して削除
```ufw delete allow [番号]```
statusで出てくる順番に従って指定

# まとめ
とりあえず単純な設定であれば、大体これだけでなんとかなります。

# 参考文献
ある程度理解しておきたいときに、iptableとの関係も含めて解説つき。

https://qiita.com/shimakaze_soft/items/c3cce2bfb7d584e1fbce

大元のマニュアル。

https://help.ubuntu.com/community/UFW

本記事も含めてユースケース特化の記事は、状況にぴったり合うものがあれば非常に便利です。しかし閲覧者と編集者が少ない分、記載ミスの可能性も高まるので、怪しいと思ったときは大元と照合するのが安心安全です。
Oracle Analytics Cloud：分析用のデータをととのえる。　どこから持ってくるか？＝「接続」を作成する。

はじめに
---
Oracle Analytics Cloud(OAC)で分析をはじめるには、まず分析の対象となるデータを指定します。対象となるデータがデータベースに入っている場合、本記事ではAutonomous Data Warehouseに入っている場合について記載します

OACにアクセスする
---
OACのURLにアクセスします。URLがわからない場合はOCI管理コンソールで作成したOACサービスを開きます。分析ホームページをクリックすると、OACのURLにアクセスできます。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e71c6dc2-bcde-2f87-a3b7-dadcc32b20a8.png)


「接続」を作成する
---
右上の作成アイコンをクリックします。接続をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ed524c9f-965c-be9c-581f-46e2b67e46d3.png)

接続タイプは、Oracle Autonomous Data Warehouseをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/38528d81-3c5f-c670-dc97-bf0b008dd170.png)

任意の接続名を入力し、クライアント資格証明のところの選択をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1ba86eb8-c2a6-6edb-578b-73e78c02d7be.png)

ダウンロードしたAutonomous Data Warehouseのウォレットファイルを選ぶと、クライアント資格証明のところにcwallet.soおよびサービス名が表示されます。分析対象のデータがあるDBユーザー名、DBユーザーのパスワードを入力し、保存をクリックします。
※本記事では別の記事で作成したSHJPを指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/95f38db3-a6e1-12fd-b245-1eec9ea0e461.png)

パスワードが間違っていたり、サービスが停止されていたりすると、保存に失敗します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fe0002ce-f039-03b5-26fe-6c3d91a660d6.png)

作成した接続は、ナビゲータメニュー - データをクリックし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/1d7088e4-f757-9450-e510-933c93441186.png)

接続をクリックすると、リストされます
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c930d0c5-c592-3b0e-46a2-18bd9b6d4dfd.png)

以上で、接続が作成されました。ウォレットファイルに接続先のホスト名やデータベースの識別情報が格納されており、その情報を元に、どこにデータをとりにいくかの指定がなされます。ウォレットファイルを解凍すると接続ファイル群や資格証明ファイルなどを参照することができます。
睡眠時間自動記録（gas,Alexa,IFFFT）

# 睡眠時間自動記録（gas,Alexa,IFFFT）
自分の睡眠時間を記録する方法を、考えました。
　**あくまで僕の生活習慣に合わせたので、時間の設定などは各自でお願いします**

# やりたいこと
アレクサ、おやすみ
アレクサ、おはよう
の合図により就寝時刻と、起床時刻がgoogleカレンダーに記録され、
その時間差から睡眠時間を計算する。
# どうやってやるのか
- **AlexaとIFFFTを連携させる**

*アレクサの定型アクションを使ってIFFFTのアプレットを実行する*　　

- **IFFFTとGoogleCalenderを連携させる**

　*IFFFT側ではアレクサとgoogleCalenderを連携させておいて、就寝時刻を記録するアプレットと起床時刻を記録するアプレットの二つを作成する*

- **GoogleCalenderのデータ（就寝時刻と起床時刻）を取得し、差から睡眠時間を求め、それをgooglecarenderに記録する。**

# イメージ
これで、アレクサおやすみと言うと、その時刻がカレンダーに追加されます
起床時刻も同じことです。
そして、その記入された二つのデータから時間を抽出し、差をgasで求めます！
![スクリーンショット 2022-05-19 15.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600947/33ac4aad-a5fe-9877-aef6-b3a313d95355.png)



# 全コード
```js
function sleepFunction() {
  const calender=CalendarApp.getDefaultCalendar();
  //今日と昨日の時刻を取得
  let today = new Date();
  let yesterday = 
  new Date(today.getFullYear(), today.getMonth(),today.getDate() - 1);

  let hour =0;
  let minute =0;


//起床時間（11時に実行時点で一つしかないので確定で１つしか取得しない）
    const　wakeup_events = 
    calender.getEventsForDay(today, {search: '起床時刻'});

    const wakeup_start = wakeup_events[0].getStartTime();
    const wakeup_hours =wakeup_start.getHours();
    const wakeup_minutes =wakeup_start.getMinutes();


  let sleep_events = 
  calender.getEventsForDay(today, {search: '就寝時刻'});

//12時過ぎてから寝た場合
  if(sleep_events.length>0){
    let sleep_start = sleep_events[0].getStartTime();
    let sleep_hours =sleep_start.getHours();
    let sleep_minutes =sleep_start.getMinutes();

     hour =wakeup_hours - sleep_hours;
     minute =wakeup_minutes - sleep_minutes;

    if(minute>60){
      minute -=60;
      hour +=1;
    }
  //起床時間の分数ー就寝時間の分数がマイナスだった場合

  if(minute<0){
    hour -=1;
    minute = 60 + wakeup_minutes - sleep_minutes;
  }
  }

//12時前に寝た場合

  else{
  const yesterday_sleep_events =calender.getEventsForDay(yesterday, {search: '就寝時刻'});

    let sleep_start = yesterday_sleep_events[yesterday_sleep_events.length-1].getStartTime();
    let sleep_hours =sleep_start.getHours();
    let sleep_minutes =sleep_start.getMinutes();

    let yesterday_minute =60 - sleep_minutes;
    let yesterday_hour =23 - sleep_hours;
if(yesterday_minute===0){
yesterday_hour +=1;

}
    
// console.log(yesterday_hour);
// console.log(yesterday_minute);
     hour =yesterday_hour +  wakeup_hours;
     minute =yesterday_minute + wakeup_minutes;

    if(minute>60){
      minute -=60;
      hour +=1;
    }
// console.log(`今日睡眠時間は　${hour}時間 ${minute}分です`);

  }
 
//カレンダーに書き込みます。
            
            let title =`睡眠時間${hour}時間${minute}分です`;
            let startTime = new Date;
            let endTime = new Date;
            let event = calender.createEvent(title,startTime,endTime);

          event.setColor(CalendarApp.EventColor.PALE_RED);

}

```
kintoneレコード件数の取得方法


```diff_javascript
      const body = {
        'app': kintone.app.getId(),
        'totalCount':'true'
      };
      
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {
        // success
        console.log(resp.totalCount);
      }, (error) => {
        // error
        console.log(error);
      });
```
TypeScrpt(JS)のスプレッド構文とreduceについてのメモ&リンク

### スプレッド構文(Spread Syntax)(...)
[JSのスプレッド構文を理解する](https://qiita.com/akisx/items/682a4283c13fe336c547)  



### reduce  
[【javascript】reduce](https://qiita.com/chihiro/items/1047e40514a778c08baa) 
[【JavaScript】reduce()で配列の畳み込み処理を簡単に実装する](https://hataworakuni.net/reduce-in-javascript) 
[【JavaScript】reduceメソッドとは何か？第1, 第2, 第3, 第4引数の意味や初期値の設定方法を実例で解説（初心者向け、わかりやすい）](https://prograshi.com/language/javascript/how-to-use-reduce/) 
[reduce()はArrayにて最強……おぼえておけ。（配列とかおれおれAdvent Calendar2018 – 23日目）](https://ginpen.com/2018/12/23/array-reduce/)
【Python】特定ユーザーの最新の投稿にいいねしたアカウントを全件取得する

# 初めに
　ことすたぐらむフォロー機能2のいいねしたアカウントのユーザーIDを全件取得する工程になります。
　こちらと、フォロー機能1で搭載した画面からのフォローを組み合わせることで、フォロー機能2は完成します。
　順に解説していきます。

# 最新の投稿にいいねしたアカウントを全件取得する

## ライブラリをインポートする
　まずはライブラリをインポートしましょう。インポートするライブラリはinstaloaderです。instaloaderについては別記事で詳しく書こうと思いますが、非常に使いやすいライブラリです。
```python:instagram.py
import instaloader
```
## ログインIDとパスワードを定義する
　instaloaderでInstagramにログインするための情報を設定しましょう。
```python:instagram.py
import instaloader

#IDとpasswordを定義
INSTAGRAM_ID = 自分のユーザーID
INSTAGRAM_PASSWORD = 自分のパスワード
```

## Instagramにログインする
　では実際にログインをしてまいります。こちらの解説は[以前の記事](https://qiita.com/fishyamamoto/items/c280521edad9f825342e)で行っております。
```python:instagram.py
import instaloader

#IDとpasswordを定義
INSTAGRAM_ID = 自分のユーザーID
INSTAGRAM_PASSWORD = 自分のパスワード

#Instagramにログインする
loader = instaloader.Instaloader()
loader.login(INSTAGRAM_ID, INSTAGRAM_PASSWORD)
```

## 任意のユーザーの投稿をすべて取得する
　instaloaderにはProfileクラスが用意されています。このクラスのメソッドを使用して、Profileインスタンスを作成する際に渡した引数のアカウントの情報を取得することができます。
```python:instagram.py
id = 投稿を見るアカウントのユーザーID
profile = instaloader.Profile.from_username(loader.context, id)
```
　.from_usernameはProfileインスタンスを作成する際に、引数としてアカウントIDを渡しますという意味です。これでProfileインスタンスが作成できました。こちらを使用して投稿をすべて取得するコードは以下のになります。
```python:instagram.py
import instaloader

#IDとpasswordを定義
INSTAGRAM_ID = 自分のユーザーID
INSTAGRAM_PASSWORD = 自分のパスワード

loader = instaloader.Instaloader()
loader.login(INSTAGRAM_ID, INSTAGRAM_PASSWORD)

id = 投稿を見るアカウントのユーザーID

profile = instaloader.Profile.from_username(loader.context, id)
posts = profile.get_posts()
```
　Profileインスタンス.get_posts()ですべての投稿を取得することができます。簡単ですね。

## 最新の投稿を取得する
 .get_posts()の戻り値はNodeIteraterです。順番は最新の投稿からになっています。ですので初歩的な関数next()を使用して最新の投稿のみを取得しましょう。
　ソースコードは以下になります。
```python:instagram.py
import instaloader

#IDとpasswordを定義
INSTAGRAM_ID = 自分のユーザーID
INSTAGRAM_PASSWORD = 自分のパスワード

loader = instaloader.Instaloader()
loader.login(INSTAGRAM_ID, INSTAGRAM_PASSWORD)

id = 投稿を見るアカウントのユーザーID

profile = instaloader.Profile.from_username(loader.context, id)
posts = profile.get_posts()
#最新の投稿を取得する
post = next(posts)
```

## 最新の投稿にいいねしたアカウントを全件取得する
　では最新の投稿が取得できたので、いいねしたアカウントを全件取得しましょう。instaloaderの.get_posts()の戻り値はNodeIteraterですが、中身はPostオブジェクトになります。
　Postクラスにはいいねしたアカウントを全件取得できるget_likes()という関数があります。戻り値はNodeIteraterです。
　そちらを使用して全件取得するコードは以下のとおりです。
```python:instagram.py
users = post.get_likes()
```
 usersの中身はuserオブジェクトです。userクラスにはusernameプロパティーがあります。こちらがアカウントのユーザーIDになります。
　Iteraterなので、for文で回してしまいましょう。
　完成形のコードは以下になります。
```python:instagram.py
import instaloader

#IDとpasswordを定義
INSTAGRAM_ID = 自分のユーザーID
INSTAGRAM_PASSWORD = 自分のパスワード

loader = instaloader.Instaloader()
loader.login(INSTAGRAM_ID, INSTAGRAM_PASSWORD)

id = 投稿を見るアカウントのユーザーID

profile = instaloader.Profile.from_username(loader.context, id)
posts = profile.get_posts()
i = iter(posts)
post = next(i)
for user in post.get_likes():
    print(user.username)
```

## 実行方法
　コマンドプロンプトを開いて以下のコマンドで実行できます。
```sh:実行方法
python instagram.py
```

# 終わりに
　ことすたぐらむのローカルソースの作成も佳境を迎えました。そろそろサーバー側の記事も書いていきますね。
　ぜひご指摘、ご質問などコメントよろしくお願いします。
　最後まで読んでいただき感謝です。
【c++】エラトステネスのふるい

```c++
#include <stdio.h>
main(unsigned int argc, char *argv[]){
  int a;
  char s[255];
  int i,j,k;
  a=atoi(argv[1]); 
  for (i=2;i<=a;i++) s[i]=1; 
  j=0; 
  k=2; 
  do {
    if (s[k]!=0) { 
      j++; 
      for (i=k*k;i<=a;i+=k) { 
        s[i]=0;
      }
    }
    k++;
  }while (k<=a);
  printf("%d¥a",j); 
} 
```

ここからまだ最適化の余地あります。
TS2339エラーの対処方法について

## エラー

試しにこのようなコードをTypeScriptで書いてみます。

```typescript
const canvas = document.getElementById("hogeCanvas");
const ctx = canvas.getContext("2d");
```

JavaScriptでは問題ないが、TypeScriptだと以下のようにエラーとして怒られます。

```
error TS2339: Property 'getContext' does not exist on type 'HTMLElement'
```

これはTypeScriptが戻り値をHTMLElementと推論した結果、
getContextのような、メソッドやプロパティが参照できないためです。

## 解決策

[型アサーション](https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion)で具体的な要素を指定します。

```typescript
const canvas = <HTMLCanvasElement>document.getElementById("hogeCanvas");
const ctx = canvas.getContext("2d");
```

もしくは、

```typescript
const canvas = document.getElementById("hogeCanvas") as HTMLCanvasElement;
const ctx = canvas.getContext("2d");
```

それかanyです。

```typescript
const canvas:any = document.getElementById("hogeCanvas");
const ctx = canvas.getContext("2d");
```

型安全性を妥協するから、anyはあくまで最終手段にしましょう。

## 参考
https://typescript-jp.gitbook.io/deep-dive/type-system/type-assertion
Sweetviz　Associationsの読み方

# はじめに

Sweetvizを使って乳がんのデータを可視化してみました。

[sklearn.datasets.load_breast_cancer — scikit-learn 1.1.0 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html)

この記事はSweetvizのAssociationsに関するメモです。

## Sweetvizとは

探索的データ解析(EDA)に使われるツールの一つです。
データセットを見やすく表示してくれます。

## 使い方

こんな感じで使います。

```py
import sweetviz as sv
my_report = sv.analyze(df, 'target')
my_report.show_html()
```

## Associationsの読み方

Associationsからは、数値相関だけでなく、不確実性係数[^不確実性係数]、相関比[^相関比]を読み取ることができます。

[^不確実性係数]: 不確実性係数(uncertainty coefficient) 2つの質的変数[^質的変数]間の相関を表す。
[^質的変数]: 質的変数(qualitative variable) カテゴリや名前など。数値で示される量的変数(quantitative variable)とセットで使われる。
[^相関比]: 相関比(correlation ratio)とは2変数のうち一方が量的変数、もう一方が名義尺度である場合に、この2つの変数間の相関の程度を表す統計量。

![スクリーンショット 2022-05-19 14.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169789/651411cd-ae00-50af-93e5-06468110495a.png)


- 四角
    - 質的変数(カテゴリー)との相関比
- 丸
    - 量的変数同士の量的相関

|  | 青 | 赤 |
| - | - | - |
| 四角 | 色が濃いほど、そのカテゴリーの割合が高い | 色が濃いほど、そのカテゴリーの割合が低い |
| 丸 | 色が濃いほど、その数値が大きくなる | 色が濃いほど、その数値が低くなる |

### 注意点

カテゴリー同士の比較の場合、不確実係数が表示されます。その場合、**線対称にならない**ので、注意が必要です。
【Rails】redirect_toでリダイレクト先に値を引き継ぐ

# コード
リダイレクト先に値を渡すには`flash`を使うと良いです。
```ruby:controller
flash[:user_params] = user_params
redirect_to action: :new
```

# 詳細
今回はJSを使うことなくサーバー側でバリデーションチェックから、
個々のinputへのエラー表示まで行う仕様だったので、
`create`でバリデーションチェックをして、
引っ掛かったら`new`へ入力済みの値とエラーのカラムを渡す必要がありました。
```ruby:controller
def new
  @user = flash.present? ? User.new(flash[:user_params]) : User.new
end

def create
  @user = User.new(user_params)
  if @user.invalid?
    flash[:user_params] = user_params
    redirect_to action: :new
  end
  # 以下バリデーションが通った時の処理
end
```
`user_params`はストロングパラメーターです。

# 追記
今回の本題ではないのですが、
サーバー側でバリデーションチェックで引っ掛かったカラム調べて、
それぞれの場所にメッセージ出すのであれば、
`redirecet_to`ではなく`render`でも大丈夫だった件です。
```ruby:controller
def create
  @user = User.new(user_params)
  return render :new if @user.invalid?
end
```
```slim:view
// エラーの中にnameが含まれているか？
= @user.errors.include?(:name)
```
ドキュメント型DBとRDBの5つの違い

# ドキュメント型DBの特徴について

ドキュメントDBといえば例えばMongo DBなどが挙げられるが、
RDBと比較してどのような特徴があるのかを備忘録としてまとめておく。

## 用語
RDBで言うところのテーブルはコレクション
RDBで言うところのレコードはドキュメントと呼ばれる。

## スキーマについて

RDB = スキーマあり、データ構造がある
ドキュメント型 = スキーマレス、キーごとデータとして格納する
そのため、キーを打ち間違えたりするとそのキーごとドキュメントに保存されてしまう。キーごと保存されるため、データ容量も肥大化しがち

## クエリーについて
RDB = 柔軟なクエリーが発行できる。
ドキュメント型 = シンプルなクエリーしかできない。
(Mongo DBに限っては割と柔軟なクエリーができる。)

## 拡張性について
RDB 　＝　スケールアップの考え方
ドキュメント型 = スケールアウトの考え方

## パフォーマンスについて
RDBとドキュメント型ではそこまで大きな違いはない。
Indexを貼ったり、Read Replicaを使用してReadの分散をさせたりは可能
＊シャーディングに関しても可能だが、運用負荷がかかるため最終手段として使用するのが推奨される。
【EC2】 ec2-userでログインできない、他のユーザならログインできる。なんで？

# はじめ
ec2-userユーザではログインできなく、他のユーザでログインできた。
さらに、ec2-userのssh情報(.ssh/authorized_keys)を見ても、問題はなさそうだし・・・

違和感を感じたので、調べてみました。

## 解決
### 概要

結論から言うと、ec2-userに「AllowUsers」の設定がされていなかったからです。

### 詳細

ログを確認してみると、

```
$ less /var/log/secure
User hogehoge from 100.100.100.100 not allowed because not listed in AllowUsers
```

となっていた。


```
$ sudo less /etc/ssh/sshd_config | grep "AllowUsers"
AllowUsers fugafuga
```

これのみだと、いくら鍵を持ってもダメ見たいなので、vimで編集して追記。

```
$ sudo less /etc/ssh/sshd_config | grep "AllowUsers"
AllowUsers fugafuga hogehoge
```

すると無事ログインできました。

# 所感

違和感というより、自分が知らないだけでした。
ec2-userのユーザをログインさせないためには、対策としてありですね。
ただ、プロジェクトを運用していくうえで情報共有は非常に大切だと思いましたー

# 参考
https://qiita.com/toshihirock/items/897776cfa620c3231737
PHPリクエスト　メモ

PHPリクエスト　メモ

リクエスト オブジェクトはいくつかのプロパティオブジェクトを持ちます。 
そのうちのいくつかは、PHPのスーパーグローバル変数をコピーしたものです。

```.php
$request->cookies for $_COOKIES
$request->env for $_ENV
$request->files for $_FILES
$request->post for $_POST
$request->query for $_GET
$request->server for $_SERVER

//その他のプロパティオブジェクトは、リクエストに特有の情報を表します。

$request->client for the client making the request
$request->content for the raw body of the request
$request->headers for the request headers
$request->method for the request method
$request->accept for content negotiation
$request->params for path-info parameters
$request->url for the request URL
```