OmniAICreator/Qiita-1.07M huggingface dataset:
SQLでNULLを条件にする時は"IS NULL"を使う

SQLの条件文でカラムがNULLであることを指定する際には、"= NULL"ではなくて"IS NULL"を使うそうですが、それの理由について調べていてなるほど思ったのでメモ書きしておきます。

# IS NULLを使う理由
[こちらの記事](http://yellowring.hatenablog.jp/entry/2014/06/28/232543#f-b7afbc7c)がとても参考になりました。ありがとうございます。

簡潔に説明すると、SQLにおいてNULLというのはNULLという名前の固有値ではなく、「何か分からないもの」らしいです。
なので、NULLと何かを比較するのは「何か分からないもの」と何かを比較するということになり、分からないものとの比較結果は「分からない」ので、結果が0件になるということです。
なので、"NULL = NULL"という式もFALSEになります。（分からないものと分からないものを比較した結果は「分からない」ため。）

そして、"IS NULL"という演算子は「対象が未知もしくは適用不能」であるかを確かめられるので、NULLを条件に検索する際はこの演算子を使えばいいみたいです。

# 実際に確認
実際にテーブルを作って確かめてみました。

### テーブル定義

```
mysql> SHOW COLUMNS FROM users;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| name  | text | YES  |     | NULL    |                |
+-------+------+------+-----+---------+----------------+
```

### レコード

```
mysql> SELECT * FROM users;
+----+------+
| id | name |
+----+------+
|  1 | NULL |
|  2 | TOMO |
+----+------+
```

### "= NULL"で検索

```
mysql> SELECT * FROM users WHERE name = NULL;
Empty set (0.00 sec)
```

結果は0件ですね。

### "IS NULL"で検索
```
mysql> SELECT * FROM users WHERE name IS NULL;
+----+------+
| id | name |
+----+------+
|  1 | NULL |
+----+------+
```
nameがNULLのレコードがちゃんと返ってきました。
WordPressって互換性保持のためmagic_quotes_gpcが有効ってマジ？

打ち消すクラスメソッドなコード。
`$GET = $_GET;`の`$GET`に対して使ったりすると良い。

```php
/**
 * magic_quotes_gpcの逆処理
 *
 * WordPressでは互換性保持のため、PHP5.4で廃止されている magic_quotes_gpc が動作してしまっている。
 * この機能自体をoffにするのは影響範囲が大きすぎるので、動作することを前提にし、エスケープされたものを戻せる処理として用意。
 * $_GETや$_POSTへの使用を前提にしているので array_walk_recursive() から使う
 *
 * @example array_walk_recursive($array, [$this, 'reverse_magic_quotes_gpc']);
 * @see     https://stray-light.info/wp/magic_quotes_gpc/
 * @see     https://core.trac.wordpress.org/ticket/18322
 * @param   string &$value 値
 */
private function reverse_magic_quotes_gpc(&$value): void
{
    $value = stripslashes($value);
}
```
AtCoder Beginner Contest 198　備忘録

ABC198の備忘録
https://atcoder.jp/contests/abc198

A：AC
B：寝落ち⇒後日見直し
C：寝落ち⇒後日見直し
D：未着手
E：未着手
F：未着手


A - Div
N個の互いに区別できないお菓子を、A君とB君で分け合います。 
両者とも1個以上の整数個のお菓子を得るような分け方は何通りありますか？

要はNまでの数列で、どこでスプリットするかという話。
＝数値の間はいくつかるかってことだけ。
簡単。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
  int n;
  cin>>n;
  cout<<n-1<<endl;
  }

```

B - Palindrome with leading zeros
1E9までのある数字に対して、頭に0をつけて回文にできるかって問題。
例えば 101 はすでに回文なので”Yes”、1210は頭に0をつけると01210で回文になるので"Yes"、123はどう0をつけても回文にならんので、"No"という感じ。
1桁のときは絶対"Yes"。
2桁のときは、ぞろ目(22等)か10の倍数(30等)の時に"Yes"
3桁以降は、1桁目と末桁を比較し、一致する場合は2桁目と末-1桁目を比較、を繰り返す。
最後まで一致がしたらflg on, 一致しない場合はbreakして頭に0を追加し再探索。
最大9桁なので、ちょっと探索範囲広いけどめんどいので無条件で9個ゼロとりあえず足して探索しとく。

```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
  string N;
  cin>>N;
  int count=N.size();
  int flg=0;

if(count==1){ //1桁のとき
 cout<<"Yes"<<endl;
}
else if(count==2){ //2桁のとき
  if(N.at(0)==N.at(1)||N.at(1)=='0'){
    cout<<"Yes"<<endl;
  }
  else{
    cout<<"No"<<endl;
  }
}
else{ //3桁以上のとき
  for(int i=0;i<10;i++){
      count=N.size();
    for(int j=0;j<=(count/2);j++){ //両側から探索するので、文字数/2
      if(N.at(j)==N.at(count-1-j)){ //文字の位置は0からなので、1ずらす
            if(j==(count-1)/2) //最後の探索まで来たら、YESフラグ立てる
            {
            flg=1;
            }
       }
      else{
        break; //それ以外は飛ばす
      }
    }
    N=N.insert(0, "0"); //0を頭に足す
  }
  if(flg==1){
    cout<<"Yes"<<endl;
  }
  else{
    cout<<"No"<<endl;
  }
}
}
```


C - Compass Walking
原点ｽﾀｰﾄでR歩幅で歩くとき、（X,Y）までは最短何歩で行けるか？
（X,Y）までの距離は単純にsqrt(X^2+Y^2)でOK。
最短歩数は距離÷歩幅になるのは直観的に明らか。
距離/歩幅で割り切れる時は商がそのまま答え、割り切れない時は+1すればいい

と思ったら一発目WA。
よくよく考えると、歩幅＞距離になるｹｰｽを考慮しないとあかん。
一度離れてから、もう一歩いく感じになるので、この時は答えは2になる。
この条件をいれればおｋ


```php
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
 
int main() {
  long double R,X,Y;
  cin>>R>>X>>Y;
  int step=0;
  long double dis=0;
  dis=sqrt(X*X+Y*Y);
  step=dis/R;
if(dis<R){
  cout<<"2"<<endl;
}
else{
    if(dis/R>step){
    cout<<step+1<<endl;
  }
    else{
    cout<<step<<endl;
  }
}

}

```
Githubで複数Team作成している場合はコードレビューの割り当て(ランダムアサイン)がプルリク作成時に動かない

Githubのコードレビューの割り当て(ランダムアサイン)機能を使おうと思い、ドキュメント通りにTeamにアサイン設定をしてみたがうまく動かない…
https://docs.github.com/ja/organizations/organizing-members-into-teams/managing-code-review-assignment-for-your-team


Githubサポートに問い合わせたところ、現状複数Team作成している場合はプルリクエスト作成時に勝手にアサインはされないとのこと。
明示的にプルリクエストのReviewersにコードレビューの割り当て設定をしたTeamを指定するとTeamのメンバーが設定に従いアサインされます。
pull panda時代にランダムアサインを使っていた方はちょっと設定が変わっててうまくいかなかったので書いてみました。。
2021年4月14日時点ではドキュメントに書かれていなかったので注意してください。ドキュメントに追記されたら削除予定です。
4k 有機EL (OLED) 120Hz PC環境構築

# introduction
こんにちは、都内でエンジニアをしている、@pompompurin です。
昨今、リモートでの仕事が多くなってきたので、自宅のPC環境をお財布が許す範囲で最強にしました。

# 4k 有機EL(OLED)を試したい！
人間はバカだと思います、なにせ目の前に最高なものがあるとすれば試したくなるんです。
ということで、ガチで ４k 120 Hz 環境を作るために調査します。
色々調べると、OLEDモニターでpc用のものはほぼなく、
TVを買ってしまってそれに接続するのが楽なことがわかりました。

なので、私は、以下のTV を購入しました。

* [LG 55型 4Kチューナー内蔵 有機EL テレビ OLED 55BXPJA](https://www.amazon.co.jp/LG-4K%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8A%E3%83%BC%E5%86%85%E8%94%B5-%E6%9C%89%E6%A9%9FEL-55BXPJA-Alexa/dp/B0873LQZDZ/ref=psdc_3477491_t1_B0873L7G24)

これにした理由は、値段です。
上位のcx という機種もあるのですが今回の用途的にはスペック差がないのでこれにしました。

# 4k 120 Hz のための PC
PCについて詳しい方には、特に説明等もいらないかと思いますが、
高性能なpcが必要です、理由は単純で画面の描画がフルHDなどに比べて処理が重たいからです。
もともとpcはあったのでそれを使います。

## マシン構成
* AMD ryzen 3800x
* Memory 32 GB
* Storage 1 TB MVME SSD
* __Nvidia RTX 2080 Ti__
* Windows 10 Pro

のような感じです。
本当は、RTX 3080、3090 を使いたいのですが
今、マイニング需要やコロナの影響ですごく高価なので手持ちの 2080 Ti を使います。

# pc と tv の接続
接続する上で、注意することがあります。
私が持っているグラフィックカードは ２０８０ Ti という一世代前のもので hdmi 接続だと 4k __60hz__ までしか対応してません。
4k 120 Hz で接続するには、Display Port を使います。
しかし、テレビ側はディスプレイポートではなく、ついているのは HDMI 2.1 なので 変換する必要があります。

このコンバートケーブルがまじで高いです。普通このようなのものだと３０００円ぐらいで買えるのですが、
諸々揃えると、ケーブルだけで１万円します。
ほぼ、コンバータの価格です。
まあ、需要ないでしょうしこの価格で買うしかないのかなと思います。

amazon リンク
[Club3D DisplayPort 1.4 to HDMI 2.1 4K120Hz HDR アクティブ アダプタ](https://www.amazon.co.jp/Club3D-DisplayPort-4K120Hz-Adapter-CAC-1085/dp/B08BX49V5V)
[Club3D HDMI 2.1 4K120Hz 8K60Hz 48Gbps Male/Male 2m](https://www.amazon.co.jp/Club3D-120Hz-48Gbps-%E3%83%8F%E3%82%A4%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89-CAC-1372/dp/B07JN586YY/ref=pd_bxgy_2/358-0348736-8609013?_encoding=UTF8&pd_rd_i=B07JN586YY&pd_rd_r=e123d7da-3a2e-4b8f-87a0-8893d07d920e&pd_rd_w=VErZ6&pd_rd_wg=icAgH&pf_rd_p=c92b218a-07b0-4eb8-b4c0-7deb8e7dc525&pf_rd_r=G5AFJ0Z0TNP22PW5X3NE&psc=1&refRID=G5AFJ0Z0TNP22PW5X3NE)

最新の RTX 3080 などでは、もともとついている HDMI が 2.1 なので  HDMI ケーブルだけ買えばいいと思います。

# 接続
簡単に図を書くとこんな感じ

```
NVIDIA 2080Ti          PCのUSB ポート
|                          | 
DisplayPort 1.4 to HDMI 2.1アダプタ
|
HDMI 2.1 ケーブル
|
TV
```

HDMIのケーブルが極太でびっくりしました。小回りはよくない感じです。信号線がちゃんと シールドされているのかと思います。
コンバータに電源がいるようで PCのUSB から取得しています。

# 結果
一言で言うと
__ヌルヌル、めちゃ綺麗__
それにつきます。
時々、ゲームとかもやるのですが、設定を落とせば、１２０ FPSでるのでとても面白いです。

投資した価値で言うと、
自己満足 だけなら 最高
金銭的なのも含まれると、まあ なくても、ね？ ってかんじです。

正直。４k 60 Hz の時点でめっちゃ綺麗なんです。
なので １２０ Hz は、オマケです。

まあ、いまさらいうと。
仕事中には一切使っていない orz
仕事というよりメインユースが MAC OS なんですよね。
mac book pro で4k 120hz 出せれば嬉しいんですけどできないので、そこは我慢です。

これを機に、OS 乗り換えも考えたんですけど
もしやるとしても、Ubuntu とかになるかと思います。
Pythonを使って、簡単金融分析(コピペで一瞬)

この記事ではこのversionで書いています。

Python: 3.8.5
JupyterLab 2.2.6


世界の金融情報をyahooを使って、集めてみました:relaxed:

銘柄の部分を自分の興味のある企業に入れ替えれば

色々、分析してみることは簡単です！

是非、試してみてください！

コピペ推奨！

```python:qiita.py

%matplotlib notebook
from matplotlib.animation import FuncAnimation
from IPython.display import HTML
import pandas as pd
import pandas_datareader.data as web
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas_datareader
%matplotlib inline
from pylab import rcParams
rcParams['figure.figsize'] = 20,10

```
ここで色々インポートして、図の大きさをなどを設定しています。




```python:qiita2.py

bank = ["MFG","PYPL"]
banks = web.DataReader(bank,'yahoo')
price = banks["Adj Close"]
price.plot(title='mizuho vs. PYPL', grid=True)
plt.show()


```

日本のメガバンクと今新しい銀行を比べてみたかったので

上では、MFG(みずほファイナスグループ)と(PYPL)ペイパルを比べみると・・・

どん！


[![Image from Gyazo](https://i.gyazo.com/2d6ea646a08942b771c08031775781fb.png)](https://gyazo.com/2d6ea646a08942b771c08031775781fb)

こんな感じになります！

ペイパルの成長度とみずほの横ばいさが浮き彫りになりますね:flushed:

こんな感じで皆様もどんどん気になる企業があるなら、比較してみましょう！！！

銘柄のコードはYahooファイナスで簡単に出てきますので！

https://finance.yahoo.co.jp/

ではでは・・・・・・
Docker Desktop for Windows がうまく動かないときはログを見てみる

# 概要

- PC 交換をした
  - 以下に沿って WSL2 のボリュームの引っ越しをした
  - https://forest.watch.impress.co.jp/docs/serial/yajiuma/1220926.html
- Docker Desktop も入れ直した
- うまく WSL2 と連携されず、 docker コマンドが使えなかった
- 設定に問題がなさそうであればログをみるのが手っ取り早い

# 環境

- Windows 10
- WSL2 + Ubuntu 18.04
- Docker Desktop for Windows 2.3.0.4

# 現象

WSL Integration が有効になっているのに `docker` コマンドが使えない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/b6a7d551-ac59-ea8a-8be1-e85f9683e4b6.png)

```bash
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

# ログの参照

- Troubleshoot -> Run Diagnostics -> logfile
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49525/fe0631b9-fb35-55c2-e722-fce36d9389fe.png)
  - もしくは `C:/Users/<User Name>/AppData/Local/Docker/log.txt` を直接開く

# 今回の原因

> [12:37:48.751][WslIntegrationAgent-Ubuntu1804][Info   ] time="2021-04-14T12:37:48+09:00" level=fatal msg="mkdir /mnt/c/Users/ogawa/key.pem: permission denied"

なぜか mkdir で permission denied になっていた。

PC 交換に伴って Windows のユーザー名が ogawa -> t_ogawa へ変更となっていたため、 `/mnt/c/Users/ogawa/key.pem` は現 PC には存在していなかった。
そこで `/mnt/c/Users/ogawa` ディレクトリを作って key.pem を置いてあげたところエラーは解消され、

```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

docker コマンドが打てるようになった。

なお、key.pem は自前のコンテナの起動スクリプトで利用するものであった。

# まとめ

- docker の動作がおかしいときはログをみる
Herokuアップデート方法

①ターミナルでherokuのアップデートの指示が表示されました。

```:ターミナル
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/original-2-app.git'
Air original_2_app % heroku logs
 ›   Warning: heroku update available from 7.51.0 to 7.52.0.
```
②ターミナルでアップデートをします。

```:ターミナル
$ heroku update
```
③ターミナルでアップデートの確認を行います。

```:ターミナル
$ heroku version
```
サイバーセキュリティフレームワークの種類と特徴

ここ数ヶ月、PSIRTとかCSIRTの構築プロジェクトを担当することになり、これまでしっかり覚えてこなかった情報セキュリティとかサイバーセキュリティ関係のフレームワークについて、自分の覚書のつもりで調べてみました。

#なぜフレームワークが必要なのか？
##フレームワークを活用して自社の組織体制を整備
世界中で標準的に使用されているサイバーセキュリティフレームワークとして、最も有名なフレームワークの一つが**NIST CSF（NIST CyberSecurity Framework）**です。

このフレームワークが登場するまでは、**ISMS（情報セキュリティマネジメントシステム）**が情報セキュリティ対策を考える上で最も利用されていたフレームワークでした。

このNIST CSFの登場によりISMSとの二本立てでサイバー攻撃対策を構築・整備の指針として参照されており、事実上のデファクトスタンダードとも言えます。

なぜフレームワークが必要かというと「情報セキュリティポリシーの策定や社内体制の整備など、どの企業などでもサイバー攻撃に対する確固たる組織を一から作っていくのは専門的知識も必要であり非常に困難だから」です。

そのために、後述するような標準的なフレームワークを参照して、自社に最適なサイバー攻撃対策組織を構築・整備していくために使われるということになります。

#NIST/米国国立標準技術研究所
##NISTとは何か？
![nist-logo_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935177/dc77b408-9cd1-ea2f-a04b-06c47f7a427e.jpeg)
NIST（**ニスト**と読みます）とは、National Institute Standards and Technologyの頭文字を取ったもので、日本語では「米国国立標準技術研究所」とか「アメリカ国立標準技術研究所」と表記されることが多いです。

技術書籍によっては「米国商務省標準技術局」と表記されている場合もありますが、これは現在は米国商務省の傘下に置かれている組織のためです。

#サイバーセキュリティフレームワークの種類と一覧
##それぞれ強みと特徴がある
フレームワークと一口に言ってもそれぞれ強みや特徴があるため、どれか一つに絞って自組織のセキュリティ体制を整備するのではなく、フレームワークを複数組み合わせて組織にあったモデルケースを一度作って運用していくケースが多いです。

以下に主なフレームワークを列挙します。

1. NIAT CSF
1. ISMS
1. CIS Controles
1. PCI DSS

###NIST CSFの特徴と強み
NIST CSFは2014年2月19日に初版が公開されており、最新バージョンは2018年4月公開のVersion1.1でIPAから**「重要インフラのサイバーセキュリティを改善するためのフレームワーク　1.1版」**というタイトルで対訳版が公開されています。

このフレームワークの特徴は他のフレームワークと比較して以下の2点にフォーカスしている点があげられ、組織の重要インフラが対象になっています。

1. サイバー攻撃に特化
1. 組織面の強化 


### ISMSの特徴と強み
ISMSは特定の業界にフォーカスしたものではなく、情報セキュリティ全般を対象としており、特徴としては以下の2点があげられます。

1. 守るべき情報セキュリティ全般の対策
1. 組織面の強化

###CIS Controlsの特徴と強み
CIS ControlsについてもISMS同様、特に特定の業界にフォーカスして作成されたものではなく、特徴としては以下の2点があげられます。

1. サイバー攻撃対策に特化
1. 技術的な対策状況に詳しい

### PCI DSSの特徴と強み
PCI DSSはクレジットカード情報をあつかう業界のセキュリティ対策にフォーカスして作られたフレームワークで、特徴としては以下の2点があげられます。

1. クレジットカードを扱う際の情報セキュリティ全般
1. 技術的な側面にも言及している

##参考サイト一覧
- [【解説】NIST サイバーセキュリティフレームワークの実践的な使い方](https://www.nri-secure.co.jp/blog/nist-cybersecurity-framework)
- [IPA セキュリティ関連NIST文書](https://www.ipa.go.jp/security/publications/nist/)
- [NIST](https://www.nist.gov/)

#おわりに
NIST CSFや他のフレームワークについてはまた別の記事で一つ一つ詳細を書いていきます。あくまでも個人的なメモですが、覚えたことについては今後追記していくことになると思います。

それでは
PythonでDiscordのOAuth2をやってみる

PythonでDiscordのOAuth2を行う方法をまとめておきます。
Flaskとrequestsを利用します

ネットを調べてみましたが、出てきたライブラリ等が正常に動かなかったので自前で実装
githubにも公開しています
https://github.com/CubeZeero/Discord-OAuth2-Example.py

# 準備

Flaskとrequestsをインストール

```
pip install flask requests
```
次にDiscordのDeveloperPortalからアプリケーションを作成
https://discord.com/developers/applications

右上にある**New Application**から新しいアプリケーションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152256/abdf8c48-10a7-2c81-638d-dd546366880c.png)

アプリケーションの名前を決め、**Create**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152256/f6c02a1d-8b40-51db-f265-c58bbbe4aaf6.png)

左のメニューからOAuth2を選択し、ClientIDとClientSecretをメモっておく
RedirectsにCallbackURLを指定しておきます。今回は`http://localhost:5000/callback/`でテスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152256/0b27025c-bdc5-8263-cb2c-a40544bf1e23.png)

## 実装

先程メモしたClientIDとClientSecretを変数に入れ、portが5000になっていることを確認
githubからstaticフォルダとtemplateフォルダを落としてpythonプログラムと同じディレクトリにおいてください
https://github.com/CubeZeero/Discord-OAuth2-Example.py

以下コード

```python:DiscordOAuth2.py
from flask import Flask, request, render_template
import webbrowser
import requests
import json

app = Flask(__name__)

port = 5000
client_id = 'YOUR CLIENT_ID HERE'
client_secret = 'YOUR CLIENT_SECRET HERE'
callback_url = 'http://localhost:'+ str(port) +'/callback/'

login_url = 'https://discord.com/api/oauth2/authorize?response_type=code&client_id='+ client_id +'&scope=identify&redirect_uri='+ callback_url + '&prompt=consent'

webbrowser.open(login_url)

@app.route('/callback/')
def callback():
    authorization_code = request.args.get("code")

    request_postdata = {'client_id': client_id, 'client_secret': client_secret, 'grant_type': 'authorization_code', 'code': authorization_code, 'redirect_uri': callback_url}
    accesstoken_request = requests.post('https://discord.com/api/oauth2/token', data=request_postdata)

    responce_json = accesstoken_request.json()

    access_token = responce_json['access_token']
    token_type = responce_json['token_type']
    expires_in = responce_json['expires_in']
    refresh_token = responce_json['refresh_token']
    scope = responce_json['scope']

    responce_txt = open('responce.txt', 'w')
    responce_txt.write('access_token: '+ access_token +'\ntoken_type: '+ token_type +'\nexpires_in: '+ str(expires_in) +'\nrefresh_token: '+ refresh_token +'\nscope: '+ scope)
    responce_txt.close()

    return render_template('complete_window.html', title='Complete')

if __name__ == "__main__":
    app.run(port=port)
```

流れとしては


1. ClientIDやscopeなどを指定してログインURLを作成

2. 作成したログインURLを `webbrowser.open()` で開く

3. 認証完了後 `/callback` にコードが返ってくるので ``request.args.get("code")`` でコードのみ取得

4. requestsを使用し、必要な情報をPOSTしてトークンと交換

5. トークンなどの情報をresponce.txtとしてまとめて保存

6. 完了したことを示すhtmlを表示

こんな感じです

# 終わり
基本的なOAuth2の流れなので他のサービスでも利用できるはずです
以上

:hugging:
Redux Toolkit[環境構築]

#Redux・TypeScript作成方法

```
$ npx create-react-app アプリ名 --template redux-typescript
```
[Git Hubはこちらから](https://github.com/reduxjs/cra-template-redux-typescript)


#VScodeにESLint+Prettier追加します。
設定が反映されている方はしなくて大丈夫です。

[この記事を参考に作成していきます。](https://qiita.com/madono/items/a134e904e891c5cb1d20)
##eslint
```
$ yarn add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
```
##prettier
```
$ yarn add -D prettier eslint-config-prettier
```

#アプリの直下に.eslintrc.json作成

```json:.eslintrc.json
{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier",
    "prettier/@typescript-eslint"
  ],
  "plugins": ["@typescript-eslint"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "sourceType": "module"
  },
  "env": { "browser": true, "node": true, "es6": true },
  "rules": {
     "適当なルール なければ書かなくてもいいです。"
  }
}
```
#settings.jsonに追記する

(command + ,)で設定が開いて右上のファイルマークを押すと
settings.json変更できます。記述がなければ変更してください。

```settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": true
  },
}
```

#作成アプリに必要なものインストール
```
$ yarn add node-sass
$ yarn add react-hook-form
$ yarn add @material-ui/core
$ yarn add @material-ui/icons

```

これで環境構築は完成です。
【SQL】テーブルからデータを読み込む方法 no.4

![見出しを追加 - 2021-04-14T115405.397.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/12e8de42-21cd-a7d7-f0b2-1204dc81c6a1.png)

こんにちは、まゆみです。

SQLについての記事をシリーズで書いています。

今回は第4回目になります。

[前回の記事](https://qiita.com/Mayumi_Pythonista/items/fcf57b379b8e07b88001)では、テーブルを作って(<font color="Red">C</font>REATE)、そこに値(レコード)を入れるところまでを書きました。

今回の記事では、その作ったテーブルからデータを読み込む(<font color="Red">R</font>EAD)方法を書いていきます

ではさっそく始めていきますね。


#SQLiteOnline で練習

前回と同じく、[SQL Online IDE](https://sqliteonline.com/)にアクセスすると、気軽にSQLの練習ができるのでおすすめです。

SQL Online IDEを開くと、デモテーブルが一番に表示されます。

そしてコードを書くところに

>SELECT * FROM demo;

と書かれています。

実はこの『SELECT * FROM demo』が書かれているためにデモテーブルが最初に表示されるのです。


#w3schools のチュートリアル

ではさっそく、[w3schools](https://www.w3schools.com/sql/sql_select.asp)の<font color="Red">SELECTの説明</font>を見てみましょう


![スクリーンショット 2021-04-14 110844.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/72f4bb96-3eac-57f4-5050-a650a4b385f8.jpeg)

![SELECT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6d7a3411-4cd3-bed2-4ee9-a3cd7cf161fc.png)

SELECTは選択するという意味なので、どのコラムを選択するかを決め、それをSELECTの後ろに<font color="Red">スペースを空けてから</font>書きます。

<font color="Red">全てのコラムを選択するなら、＊(アスタリスク)</font>です。

そのあと、どのテーブルから(FROM)データを読み込みたいのかを指定します。

>FROM　テーブル名

を続けて書きます。

#SELECT　FROMを試してみる

では、SELECT FROMを使った結果がどうなるのか試してみましょう。

前回の記事で作ったテーブルを使って『SELECT FROM』を使ってみるか、もしテーブルを作るのが面倒であれば、<font color="Red">w3schools のサイトでも試してみることができます</font>


![スクリーンショット 2021-04-14 112435.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d3027812-4ab0-07f7-5636-154436a2e7b9.jpeg)

少しスクロールすると、上記のような画面になりますので、試してみてくださいね。

#WHERE
![見出しを追加 - 2021-04-14T114421.687.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/55769231-128b-6f92-f8de-90135f15c7b3.png)

<font color="Red">条件に合う横の列を取り出したいとき</font>は、どこ(WHERE)を使います

w3schoolsのチュートリアルを参照してみましょう

![スクリーンショット 2021-04-14 114702.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3d4e8aad-059a-2d5f-3547-b083389ee9ad.jpeg)

『どんな条件に合致するデータを取り出したいか』という条件は以下のように書きます。

```
WHERE id = 1;
```
としたり

```
WHERE address = "Grape Village";
```

として検索をかけることができます

#まとめ

今回の記事では、既存のテーブルからデータをどのように欲しいデータにアクセスできるのか書きました。

次回は『UPDATE』データの更新について書いていきますね。
物理層の規格など整理

イーサネットの規格や、ケーブルの規格、コネクタの規格がごっちゃになって会話されることがあるので整理してみる。
\#登場人物は、メインで使っている 1G/10G, メタル/光 のため、網羅しているわけではない

#イーサネットの規格
どういった信号を流しますよ、といったもの。対応したケーブルを使う必要がある。

|  規格  |  スループット  |  信号  |  伝送距離  |  利用ケーブル  |
| ---- | ---- |  ---- |  ----  |  ----  |
|  1000Base-T  |  1Gbps  |  電気  |  100m  |  メタル Cat5e/6/6A  |
|  10GBase-T  |  10Gbps  |  電気  |  100m  |  メタル Cat6A  |
|  1000Base-SX  |  1Gbps  |  光  |  550m(*)  |  ファイバー OMx  |
|  1000Base-LX  |  1Gbps  |  光  |  5km(*)  |    ファイバー OMx/OSx  |
|  10GBase-SR  |  10Gbps  |  光  |  300m(*)  |  ファイバー OMx  |
|  10GBase-LR  |  10Gbps  |  光  |  10km(*)  |  ファイバー OSx  |
(*)ケーブルに依存する

光の「Sは短くて(Short)、マルチモード」「Lは長くて(Long)、シングルモード」と覚えておく。
\#実際は何の略かは知らない

#ケーブルの種類
|  名称  |  スループット  |  信号  |
| ---- | ---- |  ---- |  ----  |
|  メタル Cat5e  |  1Gbps  |  電気  |
|  メタル Cat6  |  1Gbps  |  電気  |
|  メタル Cat6A  |  10Gbps  |  電気  |
|  ファイバー OM1  |  10Gbps  |  光  |
|  ファイバー OM2  |  10Gbps  |  光  |
|  ファイバー OM3  |  10Gbps  |  光  |
|  ファイバー OS1  |  10Gbps  |  光  |
|  ファイバー OS2  |  10Gbps  |  光  |

「OMはマルチモード」「OSはシングルモード」と覚えておく。

#コネクタの種類
機器にケーブルを接続するときの、ケーブル側のコネクタ形状。

|  名称  |  対応ケーブル  |
| ---- | ---- |
|  RJ45  |  メタル  |
|  LC  |  ファイバー  |
|  SC  |  ファイバー  |
「Lは Largeっぽいけど小さい」「Sは Smallっぽいけど大きい」と紛らわしい。

#トランシーバの種類
ケーブルを機器に接続するときの、機器側の受け口。
RJ45 は機器に最初から設けられている(OnBoard)ことが多いが、LC/SC はトランシーバを取り付けて増設する必要がある。

|  名称  |  イーサネット規格  |  コネクタ  |
| ---- | ---- |  ---- |
|  GBIC  |  1000Base-SX/LX  |  SC  |
|  SFP  |  1000Base-SX/LX  |  LC  |
|  XENPAK  |  10GBase-SR/LR  |  SC  |
|  X2  |  10GBase-SR/LR  |  SC  |
|  XFP  |  10GBase-SR/LR  |  LC  |
|  SFP+  |  10GBase-SR/LR  |  LC  |
webpacker::manifest::missingentryerror　に遭遇した

## エラー文

webpacker::manifest::missingentryerror　〜
みたいなのが出てきました


原因は
Your Yarn packages are out of date!
Please run `yarn install --check-files` to update.

👆と出てました。


やったこと
yarn install --check-files
bundle exec rails webpacker:install
Java Wordで指定するテキストにブックマークを追加

<p><strong>今回はSpire.Doc for Javaという無料のライブラリを利用して、Wordで指定するテキストにブックマークを追加する方法を紹介します。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/doc-for-java-free.html">Free Spire.doc for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414112055.png" alt="f:id:lendoris:20210414112055p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.doc.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414112108.png" alt="f:id:lendoris:20210414112108p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
```java
import com.spire.doc.*;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextSelection;
import com.spire.doc.fields.TextRange;

public class AppendBookmarkToCharacter {
    public static void main(String[]args){
        //ファイルをロードします。
        Document doc = new Document();
        doc.loadFromFile("sample.docx");

        //指定するテキストを探します。
        TextSelection textSelection = doc.findString("。様々な花が咲き、果実が生じる。",false,false);
        TextRange range = textSelection.getAsOneRange();
        Paragraph para = range.getOwnerParagraph();
        int index = para.getChildObjects().indexOf(range);

        //ブックマークを追加します。
        BookmarkStart start = new BookmarkStart(doc,"ブックマーク1");
        BookmarkEnd end = new BookmarkEnd(doc, "ブックマーク1");
        para.getChildObjects().insert(index, start);
        para.getChildObjects().insert(index + 2, end);

        //保存します。
        doc.saveToFile("appendbookmarktocharacter.docx",FileFormat.Docx_2013);
        doc.dispose();
    }
}
```
<h4><strong>実行結果</strong></h4>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414112205.png" alt="f:id:lendoris:20210414112205p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p> </p>
Java ODTファイルをPDFで保存 

<p><strong>ODTファイル「OpenDocument」 とは、ワープロソフトなどで作成・編集される文書ファイルの標準ファイル形式の一つです。今回はSpire.Presentation for Javaという無料のライブラリを利用して、ODTファイルをPDFに変換する技を紹介していきます。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/presentation-for-java.html">Free Spire. Presentation for Java</a>無料版をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414112922.png" alt="f:id:lendoris:20210414112922p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> 2.</strong><strong>IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. Presentation.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414112938.png" alt="f:id:lendoris:20210414112938p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>サンプルコード</strong></h4>
```JAVA
import com.spire.presentation.*;

public class Test {
    public static void main(String[] args) throws Exception {

        Presentation presentation = new Presentation();
        presentation.loadFromFile("toPDF.odp",FileFormat.ODP);

        presentation.saveToFile("output/Result.pdf", FileFormat.PDF);
    }
}
```
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210414/20210414113016.png" alt="f:id:lendoris:20210414113016p:plain" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>以上です</strong></p>
<p><strong>如何でしょうか？簡単でしょう？</strong></p>
<p><strong>もしお役に立てば幸いです、なお、ここまで読んでくださってありがとうございます。</strong></p>
<p><strong> </strong></p>
Heroku Webサービスを公開(勉強メモ)

※勉強メモです。
### Heroku：Webサービスを公開する方法  
Heroku：PaaS(Pltform as a Service)サーバーコンピュータを提供してくれるサービス 

#####・Gitでデプロイ  
デプロイ：Webアプリケーションなどをアップロードして起動し、ユーザが利用可能な状態にする事  

#####・Herokuへのログイン  
・コマンドラインツールのインストール 
HerokuをCloud9のターミナルから操作するためのコマンドツール(heroku-cli)をインストール 
```sudo snap install --classic heroku```  

・Herokuへログイン 
```heroku login -i```  

######・メッセージボードのプロジェクトフォルダへ移動  
Gitを使うため 
```cd ~/environment/message-board/```  

#####・Herokuアプリを作成  
```heroku create アプリケーション名``` 
これがアップロード先になる 
作成されたか確認```heroku apps```  

######リモートリポジトリherokuの確認 
Heroku上に作成されたGitリポジトリがリモートリポジトリ「heroku」として登録される。 
```git remote -v```  

#####・Heroku用の設定  
データベースをMySQLからPostgreSQLに 
Gemfileにコード追加  

```:Gemfile
group :production do
  gem 'pg', '>= 0.18', '< 2.0'
end
```  
```bundle install --without production``` 
Cloud9上では読み込む必要がないgemのため、スキップオプション 
このGemfileの更新はproduction環境で、pgというGemを使用する事を指定。pg:PostgreSQLとRailsを連携するGem  

######Heroku上でPostgreSQLを使用する為下記編集  
```config/database.yml
production:
  adapter: postgresql
  encoding: unicode
  pool: 5
  database: message-board_production
  username: message-board
  password: <%= ENV['MESSAGE-BOARD_DATABASE_PASSWORD'] %>
```  

#####・Gitのコミットを最新に  

#####【デプロイ】  
登録されたリモートリポジトリherokuに対してgit pusuを行うと、そのままデプロイされる。更新しても、git commit , git push heroku mainするだけでデプロイできる。  

#####【Herokuアプリを開く】  
https://Herokuアプリ名.herokuapp.com/ 
環境変数などの設定を行っていない為エラーになる  

#####【マイグレーション】  
heroku run コマンドでHerokuアプリ上でコマンドを実行できる。 
```$ heroku run rails db:migrate```  

・Herokuでエラーログ参照 
```$ heroku logs```  

・環境変数の確認 
```$ heroku config```  

・環境変数の設定方法 
heroku config:set 環境変数=値 
```$ heroku config:set ABC=abc``` 
削除には heroku config:unset 環境変数 
```$ heroku config:unset ABC```
RSpecで単体テストしようと思ったらバリデーションが足らないことが判明しました。

テストコードを調べながらコーディングしていたら結局、バリデーションかけ忘れが発覚してバリデーションを調べていく羽目になりました。とほほ

参考
>https://qiita.com/iamu_TECH_CAMP/items/d10ffa4f7fa3afaa61b6

目的
-

テストコードとして
・パスワードは英数混合かつ半角以外は登録できない
・名前（姓・名で分割入力）は漢字・ひらがな・全角カタカナ以外は登録できない
・読みがな（姓・名分割入力）は全角カタカナ以外登録できない

としたい

できればある程度DRY（繰り返しを避ける）ためにコードもまとめたい

疑問１
-

空欄しない「presence :trueは浮かぶが全角カタカナで登録という文字指定・文字サイズ指定はどうするのか？

＊(参考)バリデーションを定義すると、下記のメソッドが動く前に必ず検証が行われます。
save/create/update

>###length(文字数制限）

```rb
#最低でも3文字以上
validates :カラム名, length: { minimum: 3 } 
#3文字以内
validates :カラム名, length: { maximum: 3 } 
#5文字から10文字以内
validates :カラム名, length: { in: 5..10 } 
#6文字ピッタリ
validates :カラム名, length: { is: 6 } 
```

|オプション名|	内容|
|---------|---------|
|minimum|最小値を指定
|maximum|最大値を指定
|in|長さの範囲を指定
|is|値の長さを指定


>###format

正規表現とフォーマットに入力された値が合致するかの検証
withオプションと併用して使用

下は全角カタカナのみを許可したバリデーション

```rb
validates :name, format: { with: /\A[ァ-ヶー－]+\z/ }
```

|指定型|指定方法|
|---------|---------|
|全て数値（半角）|/\A[0-9]+\z/|
|半角アルファベット（小文字）|/\A[a-z]+\z/
|半角アルファベット（大文字）|/\A[A-Z]+\z/
|半角アルファベット（大文字・小文字）|/\A[a-zA-Z]+\z/
|半角アルファベット（小文字・数値）|/\A[a-z0-9]+\z/
|半角アルファベット（大文字・数値）|/\A[A-Z0-9]+\z/
|全角ひらがな|/\A[ぁ-んー－]+\z/
|全角カタカナ|/\A[ァ-ヶー－]+\z/
|全角ひらがな、カタカナ|/\A[ぁ-んァ-ヶー－]+\z/
|半角カナ|/\A[ｧ-ﾝﾞﾟ]+\z/
|漢字|/\A[一-龥]+\z/
|全角ひらがな、漢字|/\A[一-龥ぁ-ん]/
|全角ひらがな、全角カタカナ、漢字|/\A[ぁ-んァ-ン一-龥]/


（参考）Rubyのバリデーション用正規表現集

>https://gist.github.com/nashirox/38323d5b51063ede1d41

|正規表現|意味|
|--|--|
|/\A\d{3}[-]\d{4}\z/|郵便番号（「-」を含む且つ7桁）|
|greater_than_or_equal_to: 〇〇|〇〇と同じか、それ以上の数値|
|less_than_or_equal_to: △△|△△と同じか、それ以下の数値|


formatオプション
モデルのクラスの中でvalidatesメソッドを使用する際に利用できるオプションです。format: {with: 正規表現, message: 正規表現にマッチしなかった場合のエラーメッセージ}とすることで、特定のカラムへ正規表現を用いた入力制限をすることができます。

今回設定するバリデーションでは、以下の通りの正規表現を使います。


完成したバリデーション
-

```rb:models/user.rb
class User < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  
  with_options presence: true do
    validates :nickname, :birthday, :password_confirmation
    validates :first_name, :last_name, format: { with: /\A[ぁ-んァ-ン一-龥々]/, message: "は全角ひらがな、全角カタカナ、漢字で入力して下さい" }
    validates :last_name_prono, :first_name_prono, format: { with: /\A[ァ-ヶー－]+\z/, message: "は全角カタカナで入力して下さい" }
  end
  validates :password, :password_confirmation,
  format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }
end
```


with_options〜endで同じバリデーションをまとめているのですが、
上の方のdeviseの:validatableでパスワードの空登録禁止のバリデーションはかかっているので
with_options〜endで同じバリデーションをまとまりの中から外しています。バリデーションが２回かかり
同じメッセージ「Email cant't be blank」が２度出ないようにしています。


パスワードのwithの部分ですが

```ruby:models/user.rb
format: { with: /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i, message: "は半角英数で入力して下さい" }
```

詳しく知りたい方は

@momotaro98さんのパスワード向け正規表現 /^(?=.*?[a-z])(?=.*?\d)[a-z\d]{8,100}$/i を解読するを参考にしてみてください。とっても詳しいです。
>https://qiita.com/momotaro98/items/460c6cac14473765ec14
【ECCUBE4】mailhog

docker-compose.yml

```
services:
  mailhog:
      image: mailhog/mailhog
      ports:
        - "8025:8025"
        - "1025:1025"
```

.env

```
# Delivery is disabled by default via "null://localhost"
MAILER_URL=null://localhost
MAILER_TRANSPORT=smtp
MAILER_HOST=mailhog
MAILER_PORT=1025
MAILER_COMMAND=/usr/local/bin/mhsendmail
MAILER_USER_NAME=
MAILER_PASSWORD=
```
Git/GitHub　コマンド

※勉強メモです。
### バージョン管理の一連の流れ  

####1.リポジトリの作成(初期化) 
~/environmen下にフォルダを作成・移動 
```git init```リポジトリ作成

####2.ファイルの変更 
```git status```状況確認(変更ﾌｧｲﾙ赤に)  

####3.ファイルの変更箇所のステージ 
```git add ファイル名```ファイル選択
(アスタリスクで全選択) 
```git status```状況確認(緑になる)  

####4.コミット
```git commit -m "コメント"``` 
``` git log```コミット履歴確認 
差分の確認```git diff```  

### ・GitHubへリポジトリを反映させる流れ 
####1.GitHubにリモートリポジトリを作成する  
GitHubにログインし、New repositoryで作成  
『.gitgnor』で.envファイルなど、登録したくないファイルを指定

####2.ローカルリポジトリにリモートリポジトリを登録する 
```git remote add origin https://github.com/ユーザ名/リポジトリ名.git``` 
```git remote -v```リモリポの確認

####3.ローカルリポジトリのブランチ名を変更する  
```git branch -M main```  

####4.登録したリモートリポジトリへプッシュする  
```git push origin main```  

####5.GitHubのリモートリポジトリにプッシュされたか確認する  
GitHubにて確認
rails sで起動できなかった・・・

# 対処

###  エラー文

Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)

👆といったエラー文が出てきました


###  解決

使用したURL：https://madogiwa0124.hatenablog.com/entry/2018/04/07/135714

$  lsof -i:3000
と記述

$  kill -9 (PIDの番号)

とやったらrails sと再起動したら起動できました。
日本語の文字化けをhtml上で修正する

# はじめに
自分のメモ帳みたいなものです．
WebアプリケーションであるNginxにて日本語が文字化けしてしまったのでその解決策の1つを書きます．


![スクリーンショット 2021-04-14 11.14.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/2055b9cf-d2d9-33ee-3943-01e5aaa943e0.png)

ソースコードはこちら
なおReactを使っています

```html
<!DOCTYPE html>
<html>
  <head>
    <script src="http://fb.me/react-0.13.3.js"></script>
    <script src="http://fb.me/JSXTransformer-0.13.3.js"></script>
  </head>
  <body>
    <div id="app"></div>

    <script type="text/jsx">
     var HelloWorld = React.createClass({
       render: function() {
         return (
           <p>Hello!World!(ハローワールド)</p>
         );
       }
     });

     var m = React.render(<HelloWorld />, document.getElementById('app'));
    </script>
  </body>
</html>
```

# 解決法
`<head>`の中に下記を挿入するだけ

```html
<meta http-equiv="content-type" charset="UTF-8">
```

ということで最終的なソースコードがこちら

```html
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" charset="UTF-8">
    <script src="http://fb.me/react-0.13.3.js"></script>
    <script src="http://fb.me/JSXTransformer-0.13.3.js"></script>
  </head>
  <body>
    <div id="app">
    <script type="text/jsx">
     var HelloWorld = React.createClass({
       render: function() {
         return (
           <p>Hello!World!(ハローワールド)</p>
         );
       }
     });

     var m = React.render(<HelloWorld />, document.getElementById('app'));
    </script>
  </body>
</html>
```


結果としてもしっかりと日本語が表示されるようになりました．
![スクリーンショット 2021-04-14 11.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459889/64b4554a-65a6-6e3f-4ca2-761be53717be.png)


# 終わりに
本当はconfファイル等を編集するのがいいと思いますが，ひとまず緊急の際は参考にしてください．
「NeosVR」Writeを使って好きなタイミングでレジスタに時間を書き込む

###今回の目標
「T」ノード（ワールドが開始からの経過時間）を「Pulse」を押したタイミングで「Float」ノード（レジスタ）に書き込みます。

レジスタとは、一時的に値を入れる器。変数の様な物です。

![IMG_20210414_070436.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/4e798a35-5811-8aa0-6700-a6052a52a1a9.jpeg)

###ワールドが開始からの経過時間
「T」ノードを下記の様に繋ぐとリアルタムで経過時間が表示します。
![IMG_20210414_065709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1b5c034a-6be5-82b9-580a-a36225701b79.jpeg)

###「Pulse」（パルス）を押したタイミングで経過時間を表示
「Write」ノードと「Float」ノードを下記の様に繋ぎます。
「Write」ノードとは、パルスを発生させたタイミングでレジスタに値を入れることができます。

![IMG_20210414_070125.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b613b1c6-925e-822d-2b2c-aed65424eb2f.jpeg)

###「Pulse」を押す
「Float」ノードに繋がった結果が押されたタイミングの経過時間が表示されます。
![IMG_20210414_070409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1ffa1f15-af35-34c8-1fee-3b848cc7423b.jpeg)

###もう一度「Pulse」を押す
経過時間が押されたタイミングで更新されました。
![IMG_20210414_070414.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/0f80efe5-d88e-9008-7e99-ecbf87d04a99.jpeg)

##補足資料ノード
####Write
![IMG_20210414_065313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/e9983eef-e578-54d8-4720-c633b9f2c641.jpeg)
![IMG_20210414_065330.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/879e4976-3919-e777-b66b-b57c4aee5b14.jpeg)
####Float
![IMG_20210414_065431.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/c138346e-d343-7f29-febe-7624c9b7d9a3.jpeg)
![IMG_20210414_065437.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/1251e787-514a-6c48-21cc-c8823f5090a2.jpeg)
![IMG_20210414_065501.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/53954f16-f9ac-0e57-3ffa-cb118d37101d.jpeg)
####T
![IMG_20210414_065615.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/ef4447bc-b5e4-b82f-1bfe-ca841b7a9642.jpeg)
![IMG_20210414_065621.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/5649b84a-c76a-d072-7713-f6c0b69b38f2.jpeg)
システム・トリガーを試す（３）（Oracle Database 19c)

　ユーザーが発行したCREATE文やDROP文の実行時にPL/SQLプログラムを実行したい場合にはDDLトリガーを作成します。利用用途としては、特定のDDLを禁止したり、ログに残すことで監査を強化する等が考えられます。

# DDLトリガー
DDLトリガーはCREATE TRIGGER文に対象となるDDL文（CREATE / DROP / AUDIT / GRANT / TRUNCATE / その他）を指定するか、どのDDLでも実行されるようにする場合は「BEFORE DDL」や「AFTER DDL」を指定します。下記の例では以下の条件でトリガーが発行されます。

|項目|説明|設定値|
|:---|:---|:---|
|名前|トリガーの名前|DDL_TRIGGER1|
|発行時点|DDL実行前|BEFORE|
|ユーザー|SCOTTのみ|SCOTT.SCHEMA|
|DDLの種類|すべてのDDL| DDL|

```
CREATE OR REPLACE TRIGGER ddl_trigger1 BEFORE DDL ON SCOTT.SCHEMA
DECLARE
    evt VARCHAR2(128);
    own VARCHAR2(128);
    nam VARCHAR2(128);
    typ VARCHAR2(128);
    err NUMBER;
BEGIN
    evt := ora_sysevent;
    own := ora_dict_obj_owner;
    nam := ora_dict_obj_name;
    typ := ora_dict_obj_type;
    err := ora_server_error(1);

    IF (evt = 'DROP') THEN
        RAISE_APPLICATION_ERROR(-20000, 'Cannot execute DROP statement.');
    END IF;

    DBMS_SYSTEM.KSDWRT(2, 'Before DDL: Event: ' || evt || ', Owner: ' || own || ', Name: ' || nam || ', Type: ' || typ || ', Error: ' || to_char(err));
END;
/
```

例ではトリガーをSYSユーザーで定義しています。SCOTTユーザーがDROP文を実行するとエラー「ORA-20000: Cannot execute DROP statement.」が発生し、オブジェクトの削除ができない仕様になっています。それ以外のDDLが実行された場合はアラートログに情報を出力します。
　BEFOREトリガーのため、オブジェクトの存在やセキュリティ・チェックの前に実行されることになります。ON SCOTT.SCHEMAが指定されていますので、SCOTTユーザーとして接続された場合に限り実行されます。

```
$ sqlplus scott/tiger

SQL*Plus: Release 19.0.0.0.0 - Production on 水 4月 14 10:09:55 2021
Version 19.8.0.0.0

Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.8.0.0.0
に接続されました。
SQL>
SQL> CREATE TABLE drop1(c1 NUMBER, c2 VARCHAR2(10));

表が作成されました。

SQL> DROP TABLE drop1;
DROP TABLE drop1
*
行1でエラーが発生しました。:
ORA-04088: トリガー'SYS.DDL_TRIGGER1'の実行中にエラーが発生しました ORA-00604:
再帰SQLレベル1でエラーが発生しました。 ORA-20000: Cannot execute DROP statement
ORA-06512: 行15
```

# トリガー・ファンクション
 前述のトリガーでは情報を取得するためにいくつかの関数や変数が利用されていました。これらは[イベント属性ファンクション](https://docs.oracle.com/cd/F19136_01/lnpls/plsql-triggers.html#GUID-266DBF6D-AA74-490C-ADE5-962C10708C2D) と呼ばれ、トリガー内でトリガー発行の元になったオブジェクトやユーザーの情報を入手できます。主なファンクションは以下の通りです。

|属性|データ型|説明|例|
|:---|:---|:---|:---|
|ora_sysevent|VARCHAR2(20)|イベント名|CREATE, DROP等|
|ora_dict_obj_owner|VARCHAR2(128)|イベント対象オブジェクトの所有者|SCOTT|
|ora_dict_obj_name|VARCHAR2(128)|イベント対象オブジェクト名|EMP|
|ora_server_error|NUMBER|エラー・スタック上の指定した位置にあるエラー・コード||
|ora_server_error_depth|PLS_INTEGER|エラー・スタック上のエラー・メッセージ数|||
|ora_login_user|VARCHAR2(128)|ログイン・ユーザー名|SCOTT|
|ora_instance_num|NUMBER|インスタンス番号||
|ora_client_ip_address|VARCHAR2|LOGONイベントでのクライアントのIPアドレス||
|ora_sql_txt(OUT ora_name_list_t)|PLS_INTEGER|トリガーを起動する文のSQLテキスト||

すべてのトリガー・ファンクションが常に利用できるわけではありません。例えばBEFORE DDLトリガーの場合、構文エラーのチェック後、セキュリティチェック前に発行されるため、ora_server_errorにはエラーが格納されません。
privateなgemがCould not find Xxxで見つからない時

# これ何
sidekiq-proの最新がbundle installでlocalに入ってこなかった。
その時に対応したことメモ。

## エラーメッセージ

```shell
$ bundle install
[DEPRECATED] Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. You should run `bundle update` or generate your lockfile from scratch.
Fetching gem metadata from https://gems.contribsys.com/..
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://gems.contribsys.com/..
Could not find sidekiq-pro-5.2.2 in any of the sources
```

## 解決方法

~/.bundle に入っているキャッシュを削除する

```shell
$ rm ~/.bundle
```
Material ComponentでToolbarのmenuにBadgeを表示させる

[material-components 1.3.0](https://github.com/material-components/material-components-android/releases/tag/1.3.0) から Toolbar の menu に Badge を簡単に表示できるようになりました。

## 実装

```kotlin
val badge = BadgeDrawable.create(requireContext())
BadgeUtils.attachBadgeDrawable(badge, toolbar, R.id.action_info)
```

material-components にある `BadgeUtils` を使います。
(`BadgeUtils` は Experimental なので今後変更される可能性があります)
`attachBadgeDrawable` で Toolbar と表示させたい menu の id を渡すことで Badge を表示させることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/a1359aaf-c9f0-fc09-c8cf-e207ab2a0d4b.png" width="200px" />


これまで頑張っていた Badge の表示がとても簡単になって最高ですね。
laravel カラム追加時にnull許可に設定する

# 目的

- NULL許可カラムを追加する時のマイグレーションファイルの記載方法をまとめる

# 情報

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v12.14.1 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

# 方法

1. たとえはTinyInt型の「delete_flag」カラムをNULL許可として追加したい時はup側には下記のように記載する。（`nullable()`をつければNULL許可カラムを作成する事ができる。）

    ```php
    Schema::table('tasks', function (Blueprint $table) {
        $table->tinyInteger('deletef_lag')->nullable()->comment('削除フラグ');
    });
    ```
tsukuba-kdbのcsvからjson作成

```python
import pathlib
import json

import pandas as pd
import requests

# ダウンロード
def fetch_file(url, dir="."):

    p = pathlib.Path(dir, pathlib.PurePath(url).name)
    p.parent.mkdir(parents=True, exist_ok=True)

    r = requests.get(url)
    r.raise_for_status()

    with p.open(mode="wb") as fw:
        fw.write(r.content)

    return p


url = "https://github.com/Make-IT-TSUKUBA/alternative-tsukuba-kdb/raw/master/kdb_20210404.csv"

csv_path = fetch_file(url)

df = pd.read_csv(
    csv_path,
    skiprows=3,
    header=None,
    usecols=[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 17, 18, 19],
)

# A列が空白の行を削除
df.dropna(subset=[0], inplace=True)

# 科目番号の上がタイトルのため１行ずらして、科目番号以降を補完
df[20] = df[0].shift()
df[20] = df[20].where(df[0] == "科目番号").fillna(method="ffill")

# 行内の欠損以外をカウント　※下の確認用
df.notnull().sum(axis=1).value_counts()

# 科目番号の行（ヘッダー）、行内に5項目以上ない行は削除
df1 = df[df[0] != "科目番号"].dropna(thresh=5)

# 欠損を空文字に置換
df1.fillna("", inplace=True)

# 改行前後の空白を削除
df1[10] = df1[10].apply(
    lambda s: "\n".join([i.strip() for i in s.strip().splitlines()])
)
df1[11] = df1[11].apply(
    lambda s: "\n".join([i.strip() for i in s.strip().splitlines()])
)

result = []

# Q行が空白の場合削除
for d in df1.values.tolist():

    if not d[13]:
        d.pop(13)

    result.append(d)

# JSON変換
with open("kdb.json", "w", encoding="utf-8") as fp:
    json.dump(result, fp, indent="\t", ensure_ascii=False)
```
いつものbashrc備忘録

## 概要
bashrc でuserhost, username などの見た目を設定するときの備忘録。
いつも検索して時間を使ってしまうので。。


## bashrc

```
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
```
ノーコードツール　Studioを使ってみた


今までにもノーコードツールを使ってきましたが、まず実感としてStudioはかなりお洒落にサイト制作をできるように感じました。
基本料金は無料ですが、独自ドメインを使いたいなど追加したい機能に応じて有料プランに加入する必要があります。

パソコンさえあれば無料でサイトが作成出来るのでとりあえず登録だけしてみるのもアリだと思います。

Studioのサイトはこちらhttps://studio.design/ja


以下Studioのメリットとデメリット

メリット:thumbsup:

・テンプレを使用すれば初見でも数時間でサイトが出来る
・マージン、パディングの調節で簡単に要素を思った通りに配置出来る
・作成している画面でレスポンシブでの見え方が確認できる（わざわざ検証ツールを使わないので楽）
・慣れればアニメーションも上手く付けられる
・公式のYouTubeチャンネルを見れば基礎的な部分は学べるのでわざわざ調べなくていい
・動画を背景として簡単に埋め込む事ができる

デメリット:thumbsdown:
・マージン、パディングを若干でも使ったことがない人は少し最初難しいと感じるかも
・他のノーコードツールに比べるとテンプレの数がまだまだ少ない
・Google Analyticsなどの機能と連携できる
・ユーザーが多くないので参考になる記事数が少ない　→　つまづいた箇所の解決に時間が掛かる


まとめ
完全に初心者の方にはあまりオススメ出来ないのが正直な感想です。
はいじめてノーコードツールで制作するならペライチの方が圧倒的に優しのではないかと思います。
ただある程度ノーコードでの制作に慣れていてオリジナリティのあるサイトを制作した方にはだいぶオススメです。
数日いじってみたら大体マスターできますし一つのスキルとして今後の武器になる可能性も多いにあります！

どちらにしてもそんなに時間がかからずにサイトを作れるので迷ったら一度やってみるべきだと！
Just DO it！:v:
大量のファイルをリネーム

をWindowsでやりたい方法をググると……

[Windows PowerShellを使って複雑なパターンのファイル名変更を行う：Tech TIPS - ＠IT](https://www.atmarkit.co.jp/ait/articles/1411/07/news133.html)

が見つかったのでこんなやり方なのかなー
と思い

```PowerShell
 dir | rename-item -newname { $_.name -replace 'hoge','' }
```
とするとhogeが取れてリネーム出来ていました。

わーいヽ(=´▽`=)ﾉ
と嬉しかったのでQiitaにメモ失礼いいたします。
さくらのクラウドのオブジェクトストレージをgo-cloud(Go CDK)で読み取る

[go-cloud](https://github.com/google/go-cloud/)を利用してオブジェクトの内容を読んでみます。

- アクセスキーとシークレットキーは環境変数で渡す
- blobのドライバーはblank importする([ドライバ固有オプション](https://gocloud.dev/howto/blob/#s3)は利用しない)

```bash
# オブジェクトストレージのアクセスキーとシークレットキーは環境変数で渡す
export AWS_ACCESS_KEY_ID=your-access-key
export AWS_SECRET_ACCESS_KEY=your-secret-key
```

```go
package main

import (
	"context"
	"fmt"
	"io"
	"os"

	"gocloud.dev/blob"
	_ "gocloud.dev/blob/s3blob"
)

const (
	endpoint = "https://s3.isk01.sakurastorage.jp"
	region   = "jp-north-1"
)

var (
	bucketName = "your-bucket-name"    // バケット名を指定
	objectKey  = "path/to/your/object" // オブジェクトのキーを指定
)

func main() {
	url := fmt.Sprintf("s3://%s?region=%s&endpoint=%s", bucketName, region, endpoint)
	ctx := context.Background()

	// バケットのオープン
	bucket, err := blob.OpenBucket(ctx, url)
	if err != nil {
		panic(err)
	}
	defer bucket.Close()

	// オブジェクトの読み取り
	r, err := bucket.NewReader(ctx, objectKey, nil)
	if err != nil {
		panic(err)
	}
	defer r.Close()

	// 標準出力へコピー
	fmt.Println("Content-Type:", r.ContentType())
	fmt.Println()
	if _, err := io.Copy(os.Stdout, r); err != nil {
		panic(err)
	}
}
```

`blob.OpenBuckt()`に渡すURLでパラメータとしてエンドポイントとリージョンを指定しています。

```go
url := fmt.Sprintf("s3://%s?region=%s&endpoint=%s", bucketName, region, endpoint)
```

この例では扱いませんでしたがオブジェクトの書き込みも可能なはずです。
参考: https://gocloud.dev/howto/blob/#writing

---

以上です。
Stripe決済でのCVCチェック

#Stripe決済のCVCの仕様

Stripe決済のpayment_method.attachedイベントのレスポンスで、cvc_checkの項目があります。

どうもこのcvcのチェックですが、成功と失敗以外の結果もあるようで、システム側の考慮が必要です。
cvc_checkの値として返ってくる値と説明は以下の通り。

>pass：セキュリティーコードが成功した
fail：セキュリティーコードが失敗した
unavailable：カード会社・銀行からチェックしないという判断
unchecked：セキュリティーコードがカード会社・銀行から確認できない
null: セキュリティーコードが設定されていないこと

#CVCチェックの結果をどう扱うか
カード会社でチェックしないという判断って、何やねん！とは思いますが、
unavailableやunchecked、nullも一旦CVCチェックとしてはOKとしたほうが良さそうな感じがします。

実際に決済がされた時にできたかできなかったかわかるので、損をするということはないと思います。
（サービス利用開始時に決済されるはずなので、決済されなければ使えない）

#あとがき
内容が薄いですが、調べてもでてこなかったので、記事として残しておこうと思いました。
Stripeは意外と難しいですが、サポートの人の回答が早くて非常に助かりました。
Synology の NAS にパスワードなしで ssh でログイン

Synology の Nas に、公開鍵を送って、
.ssh/authorized_keys の設定をしても、パスワードなしで ssh ログインが出来ませんでした。

こちらで答えを見つけました。
[Synology DSM 5で他の（非root）ユーザーとしてパスワードなし（パスワードなし）でSSH](https://www.it-mure.jp.net/ja/linux/synology-dsm-5%E3%81%A7%E4%BB%96%E3%81%AE%EF%BC%88%E9%9D%9Eroot%EF%BC%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AA%E3%81%97%EF%BC%88%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AA%E3%81%97%EF%BC%89%E3%81%A7ssh/958892983/)

```text
ホームフォルダーにも適切なアクセス許可が必要であることに気付きました。

cd /var/services/homes/
chown <username> <username>
chmod 755 <username>
```

私が行った操作は、

```bash
cd /var/services/homes
chmod 755 uchida
```

これで、パスワードなしで ssh ログインが出来るようになりました。

確認した OS のバージョンです。

```text
$ uname -a
Linux **** 4.4.59+ #25556 SMP Thu Mar 4 17:52:53 CST 2021 aarch64 GNU/Linux synology_rtd1296_ds220j
```
ローカルの Docker のイメージを一括削除

Chromebook の linux 開発環境で容量が逼迫したので、スペースを確保するためにローカルの Docker イメージを一括削除したときのコマンドを備忘録として残しておく。

```shell
for img in $(docker images|awk '{pring $3}'|sed -e '1d' -)
do
  docker rmi $img
done
```
GitとGitHubの基本

<h1>Gitって何が便利なのか</h1>
Gitとはバージョン管理システムのことである。
	最新のファイルが分からなくなるのを防ぐ
	誰が、いつ、何のために変更したのかを残せる
	
<h1>Gitの仕組み</h1>
変更履歴を時系列順にメッセージを残して記録できる
誰が、いつ、何のために変更したのかを遡れる
	
<h1>開発の流れ</h1>
1.ファイルの変更をする
	2.個人リポジトリに変更履歴を記録(commit)
	3.共有リポジトリに変更を共有(push)
	
<h1>複数人での開発の流れ</h1>
1.情報を取得する(pull)
	2.開発の流れ（変更→commit→push)
	
<h1>GitHubとは</h1>
Gitリポジトリのホスティングサービス（コードを預ける場所を提供）
	ソーシャルコーディングの場でもあり、オープンソースの開発がしやすくなった経緯がある


<h1>GitHubの特徴</h1>
プルリクエストによる複数人開発がしやすい（コードレビューがしやすい）。他のチームのソフトウェアが見える事。
	
<h1>プルリクエストとは</h1>
変更を上げる際にリクエストを送り、取り込みの可否を依頼、修正改善の確認をするもの


<h1>Gitリポジトリのホスティングサービス</h1>
	Bitbucket（個人開発向き）
		非公開リポジトリも無料作成
		公開不可のプロジェクト向き
		人数制限あり、２〜３人までなら無料
	GitHub
	 	非公開リポジトリは有料
		公開リポジトリは無料

<h1>Gitのバージョン確認</h1>

	$ git version
	
<h1>初期設定</h1>

	$ git config --global user.name "GitHubのユーザー名"
	$ git config --gloabal user.email GitHub登録時のメールアドレス
	
<h1>GitHubにリモートリポジトリを作成</h1>

	$ git remote add origin https://github.com/~.git(リモートリポジトリのURL)


<h1>ローカルリポジトリの新規作成</h1>

$ git init

.gitディレクトリが作成。ここでバージョン管理を行う 


<h1>基本的なワークフロー</h1>
	1.ファイルの変更をステージングエリアへ追加
		$ git add ファイル名　＃個別ファイルの追加
		$ git add .        ＃全てのファイルを追加
		
	2.ローカルリポジトリにコミット
		$ git commit        ＃一つの作業に１コミット推奨
		
	3.リモートリポジトリにプッシュ
		$ git push -u origin master
		
		origin　リモートリポジトリのデフォルト名
		master　ローカルリポジトリのデフォルトのブランチ名

<h1>ステージングエリアとは</h1>
	複数ファイルを変更した時にコミットするファイルを選択するためのもの
	
<h1>コミットメッセージの書き方</h1>
	１行目：　変更内容の要約
	２行目：　空行
	３行目：　変更した理由
	
<h1>リポジトリの状態を確認</h1>
	$ git status
	
		赤字：　変更されたファイル
		緑字：　ステージングエリアにあるファイル

<h1>変更差分の表示</h1>
	＄Git Commit -v
	
<h1>コミットの履歴を確認</h1>
	$ git log
	
<h1>削除したファイルをステージングエリアに追加</h1>
	$ git rm ファイル名
	
<h1>コミットの変更履歴を確認</h1>
	$ git log --oneline 　　　#１行で表示する
	$ git log -p ファイル名　＃ファイルの差分を表示する
	4 git log -n 3 　　　　　＃表示するログ数を指定
	
	commit　ハッシュ値
	Author 　書いた人の名前とメールアドレス
	Date　変更した日付
	ここにコミットメッセージが表示

<h1>変更差分を確認</h1>
	$ git diff　　　　＃ステージとの差分
	$ git diff HEAD　#ステージとコミットの差分
	
	differenceの略
	
<h1>バージョン管理をしたくないファイルをGitの管理から外す</h1>
	.gitignoreファイルに指定する
		自動生成されるファイル
		パスワードが記載されているファイルなど
		
	.gitignoreファイルの書き方
		#から始まる行はコメントとみなされるため無視される
		指定したファイルを除外　　index.html
		ルートディレクトリを指定　/root.html
		ディレクトリ以下を除外　dir/
		
	既にコミットしている場合
		$ git rm ファイル名　　　　＃ファイルも一緒に削除
		$ git rm -r ディレクトリ名　＃ディレクトリも一緒に削除
		$ git rm --cached ファイル名　＃ファイルは残す（gitの管理だけ外す）
		
	元の状態に戻す
		$ git reset HEAD ファイル名
		$ git checkout ファイル名


参考元
[Git: 初めてのGitとGitHub/山浦清透](https://www.udemy.com/course/intro_git/)
Amazon GuardDuty とは

## 勉強前イメージ

guard duty で見張り役という意味なので、セキュリティの何かを定期的に見るサービス？

## 調査

### Amazon GuardDuty とは

AWSアカウントや環境に対して継続的にセキュリティチェックを行ってくれるサービスで、難しく言うと脅威検出サービスな感じです
これを有効にするとCloudTrailやVPCフローログなどのイベントログが自動的に分析されます。
使用方法は有効化するだけで上記を行ってくれます。

### メリット

- 総合的な脅威の特定

検知対象はAWSのネットワーク上のログとアカウントの操作ログ、
分析対象はCloudTrailやVPCフローログなどのイベントログになります。
最新の脅威インテリジェンスから悪意のあるAPIコールなどの検出を行います。

- オートメーションによるセキュリティ強化

CloudWatch EventsとLambdaを使うことで
自動で修復させるアクションも実施することが出来ます。

- エンタープライズ規模の一元的な管理

AWS Organizationsを使用して複数アカウントまとめて有効化することが出来ます。
組織全体をまとめて集約された調査結果をCloudWatch Eventsから入手できます。

### GuardDuty有効化の方法

ホーム > GuardDuty > 今すぐ始める から
すぐに有効化できる画面が出てきますので、こちらをクリックすると有効化することが出来ます。

![1GuardDuty Management Console - Google Chrome 2021-04-12 15.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f62971d9-1e7d-c1a9-da6c-e320dfddde0d.png)

## 勉強後イメージ

他にもセキュリティの検知を行うサービスいくつかあってごっちゃになってきた気がする。
一度まとめないと。

## 参考

- [AWS環境における脅威検知と対応](https://pages.awscloud.com/rs/112-TZM-766/images/A1-02.pdf)
- [Amazon GuardDuty](https://aws.amazon.com/jp/guardduty/)
- [【初心者向け】AWSの脅威検知サービスAmazon GuardDutyのよく分かる解説と情報まとめ](https://dev.classmethod.jp/articles/guardduty-summary/)