OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その027

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: アプリケーションと活動
サービスアプリケーションとサポートアプリケーションの準備

にある練習問題3問目をご紹介します

動画の解説はこちらです

https://www.youtube.com/watch?v=PsK8pHVCQkE

<iframe width="560" height="315" src="https://www.youtube.com/embed/PsK8pHVCQkE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

![２７１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/057d26b6-a2cb-04ce-9b7f-3b3d3ccc830c.png)


正解はAです
Experience Cloudを使用すると顧客どうしてやりとりをすることが可能です

Experience Cloudの設定などは動画を解説しているのでご確認ください
情報処理安全確保支援士　令和3年春期　午後Ⅰ

■問1（難易度：普通）
テーマ：OAuthによる認証・認可を提供するSNSで自社開発のSaaSを認証したい
【問われていること】
・SaaSを作る側になったとして、認証をどうやって行うか？
　従来：基本認証(ID、PW)による認証システムを独自に組み込む
　今後：IDaaSに任せる。
・IDaaSに任せる方法のメリット・デメリットは？
　メリット　 ：本来のサービスの開発に集中できる。IDaaS製品によっては多要素認証、リスクベース認証、特権ID管理など高度な認証機能が利用できる。
  デメリット ：IDaaSに依存する。IDaaS製品の柔軟性、可用性に自社製品も巻き込まれる。
・具体的にどうやってIDaaSに認証させるか。
　→OAuth認証を本文では取り上げている。SAML認証も知っておいたほうが良い。

■問2（難易度：易）
テーマ：Webサーバを公開する際、名前解決（DNS）で気をつけないといけないこと。
【問われていること】
・DNSサーバの役割は？
　→名前解決。ホスト名からIPアドレスを教えてあげる案内員。

・内部と外部にDNSサーバを置く理由は？
　→外部NWから内部NWにくるものは外部DNSサーバで対応し、内部NWのさらに詳細な場所は内部DNSサーバが名前解決する。役割を分けることで攻撃される箇所を減らすなどのリスク低減、サーバの負荷低減などが可能。レコードの管理もしやすい。

・（外部）DNSサーバはどんな攻撃をされるか？
　DNSリフレクション攻撃：送信元IPアドレスを偽装し、DNSサーバに問い合わ、偽装先にパケットが大量に送られる。攻撃者→宅配ピザ→第三者　に大量のピザを送るイメージ。
　対策：外部DNSサーバを権威DNSサーバ機能とフルサービスリゾルバ機能に分ける＋FWで外部→フルサービスリゾルバ機能サーバへのアクセスを遮断する。
権威DNS機能：ゾーン情報を持つ。プライマリであり、普通はセカンダリDNSサーバにゾーン情報を同期している。
フルサービスリゾルバ機能：再起問い合わせする。聞かれて分からんかったら、解決するまで他の人に聞いてくれるポジションの人みたいなイメージ。

　DNSキャッシュポイズニング攻撃：再起問い合わせ中に嘘の回答を送りつけ、DNSサーバに誤認させておく。
　対策：毎回の問い合わせで使うポート番号をランダムにする。
    　　DNSSEC(DNS Security Extensions)を使う。再起問い合わせの回答にはディジタル証明書も必須。
ディジタル証明書：サーバの正当性（変なところから送られてきてないか）とデータの完全性（途中で改ざんされていないか）を保証するもの

■問3（難易度：難）
テーマ：EDRを用いて、マルウェア対策とパッチの適用する。
【問われていること】
・全社PCに対してセキュリティを高めるには？
　→マルウェア対策ソフトをインストールする
・↑はどうやってやるの？（個人にインストールする方法では実施しない人がかならずいる）
　→PC起動時に配信サーバに強制的にアクセスし、ダウンロードする。
　　（管理者　　　：事前に検証端末で業務アプリに影響ないかは確認しておく。）
　　強制ダウンロードをどうやって実現するか？で登場するのがEDR製品。
・EDR(:Endpoint Detection and Response)とは？
  エンドポイント、つまり、各端末にエージェントを仕込んでおいて、そのエージェントが各端末のログなどをEDR管理サーバに送る。そのログを監視して、不審な動きをしていないかを見張る仕組み。
　「現代では100％ウイルスを防ぐのは無理。感染した際のダメージを最小限にする」という考えに基づいた製品。
　エージェント経由でマルウェアソフトのインストールやバージョンアップを管理者→エンドユーザにプッシュできる。ここが問3のテーマになっている。
　代表製品だとCrowdStrike。

メモ（出題はほとんどされないが、覚えていおいて損はない）
・Wake on LAN：ブロードキャスト後、MACアドレスを16回送って、停止中のサーバを起動する。A LAN→B LANのサーバを起動したいなら、L3スイッチの設定を変えて、ブロードキャストが転送されるようにしないといけない。
コンテナ上でコマンドを叩いてMySQL8.0の認証をする方法

はじめに
--
現在開発中のポートフォリオでは、dockerでMySql8.0のimageを使用しています。
MySQL8.0から認証方式が変わったようで、ターミナルからコマンドを叩いて認証を済ませないと使用ができませんでした。

コンテナを作り直した際に毎回ログインの方法を確認していたので、手順を備忘録として残そうと思います。
(docker-compose.ymlで"command: --default-authentication-plugin=mysql_native_password"を記述すればokみたいですが、今回はターミナルでコマンドを叩いて認証をする流れを書いていきます)

手順
--
コンテナを起動
~~~
~% docker-compose up -d
~~~

コンテナに下記のコマンドで接続
~~~
~% docker exec -it <dbのコンテナ名> bash
~~~

MySQLのサーバーにログイン
~~~
~# mysql -uroot -p
Enter password: #docker-compose.ymlのMYSQL_ROOT_PASSWORDの値を入力
~~~

上記三つの手順で認証は完了します。
まだまだコマンド一つ一つの理解度不足だなと感じたので、一つ一つのコマンドも勉強してqiitaにまとめようと思います。

参考
--

https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html#docker-connecting-within-container
プログラミングの検索術

## 検索スキルを高めるべき理由

- ほとんどが価値も必要もない情報
- 検索力 = 問題解決力
- 価値のある情報は人生を変える

## 検索目的を明確にする

- 検索のゴールを決める
    - あらかじめ目的のメモを取っておく
1. 既知情報探索
    1. 知りたい情報が決まっている
2. **探求探索**(一番難しい)
    1. 何を探すのかはっきりしていない
3. 全数検索
    1. 対象について網羅的に情報を得たい
4. 再検索
    1. 既に見つけている情報に再アクセスする(ブックマークなど)

## プログラミング

### Google・Yahoo

- 全般

### Stack Overflow

- [英語](https://stackoverflow.com/)がおすすめ
- [日本語](https://ja.stackoverflow.com/)
- 質問をしてもよいかも

### ソースコード検索

- [searchcode](https://searchcode.com/)
    - [GitHub](https://github.com/)やBitBucketから検索
    - アクセスするタイミングによっては動作しない場合もある

### 記事

- [Qiita](https://qiita.com/)
- [Zenn](https://zenn.dev/)

## 図書

### [NDL ONLINE](https://ndlonline.ndl.go.jp/#!/)(国立国会図書館オンライン)

- 日本の書籍すべて
- 納品する義務がある？

### [Webcat Plus](http://webcatplus.nii.ac.jp/)

- NDL ONLINEよりも広い(日本)

### [World Cat](https://www.worldcat.org/ja)

- Webcat Plusより広い
- 世界中の図書

### オンラインショッピング

- おすすめや関連が変わるのでいろいろ見てみると良いかも
- 購入履歴からアルゴリズムによって変えてくれる
    - Amazon
    - 紀伊国屋
    - ジュンク堂

## 学術雑誌・論文

### [Google Scholar](https://scholar.google.com/)

- 論文とか学術

### CiNii Articles

### J-Stage

## 統計情報

### [総務省統計局](https://www.stat.go.jp/)

### [政府統計の総合窓口](https://www.e-stat.go.jp/)

- 消費者のデータ
- 自分たちの生活の変化
- データサイエンス
- マーケティング

## 検索語

- 増やせば増やすほど良いというわけではない
    - `プログラミング Python 勉強`
        - `プログラミング`はいらない
        - 意味のない絞り込みはやらない。情報がなくなっちゃう
- 順番を入れ替えるだけでも変わる
    - `Python 勉強`
    - `勉強 Python`

## フレーズ検索

- `教科書 歴史`
    - 順番とか無視されて大量の情報が出てくる
- `“教科書の歴史”`
    - 完全一致

## フィールド

- [詳細検索](https://www.google.com/advanced_search?q=%E3%81%82&biw=1440&bih=789&sxsrf=ALiCzsZYx4hi9FdETYjsBpFMLO3q0AHHJQ:1663464879843&hl=ja)

### 論理演算子

- AND
    - `教科書 歴史`
        - 教科書かつ歴史
- OR
    - `教科書 OR 歴史`
        - 教科書か歴史どっちかあれば良い
- NOT
    - `教科書 -歴史`
        - 歴史を除く
- `プログラミング 勉強 OR 独学 -スクール`

## サイト内検索

- `site:~`  （例: `golang site:stackoverflow.mu`）

## 絞り込む

### 期間

### 言語

- 日本語
    - 2.3%
- 英語
    - 59.6%
    - 情報の量が多い
    - やり方
        - `how to 〇〇`
    - 比較
        - `〇〇 vs △△`
        - AとBの違いは？
            - `difference between ~ and ~`（例: `difference between c and c++`）
    - 意味
        - `〇〇 definition`
        - `〇〇 meaning`
        - `what is 〇〇`
            - 解説記事
    - 動作しない
        - `git push not working`
    - 理由
        - `why use ~`  （例: `why use golang`）
        - `why not use ~`  （例: `why not use golang`）
    - ～の処理の流れを知りたい
        - `how does ~ work` （例: `how does http work`）
Linux ssh,ssh-agentについて

●sshコマンド

ssh [ オプション ] [ユーザ名@]接続先ホスト
・-l ログインユーザ名の指定(-lオプションと[ユーザ名@]両方を省略した場合は現在のユーザ名を指定)
・-p 接続先ポート番号の指定
・-i 秘密鍵のファイルを指定
・-o ssh-configで設定できるオプションの指定


sshコマンドは以下の順で取得した設定に基づいて動作。
1. コマンドラインオプション
2. ユーザ毎の設定ファイル（~/.ssh/config）
3. システム全体の設定ファイル（/etc/ssh/ssh_config）

●ssh-agent
パスフレーズ付きの秘密鍵を使ってSSH接続する際に毎回パスフレーズを入力しないで済むようにするには、「ssh-agent」を使用。

「ssh-agent bash」コマンドでssh-agentはbashを起動し、バックグラウンドで動作。ssh-agentによって起動されたシェル内で子プロセスとしてssh-addやsshコマンドを実行すると、これらの認証エージェントとしてssh-agentが機能。

また、指定した文字列を評価後に連結して実行させるevalコマンドでssh-agentを起動することも可能。この場合、現在のシェルでssh-agentが動作。

●ssh-add -l
ssh-agentに登録された秘密鍵の一覧を表示する

●ssh-agent -k
ssh-agentを終了する

●SSH Agent Forwarding
ローカルホストから多段階でSSHアクセスする際に、パスフレーズを聞かれないようにしたり、秘密鍵を中継サーバに置かなくていいように、認証情報を転送する仕組み。
ローカルホストでのみ秘密鍵をssh-agentに登録しておけば、その後のSSH接続でもssh-agentが秘密鍵を引き継ぎ、複数のホストを経由した公開鍵認証が可能。

※ユーザの公開鍵は各サーバの「~/.ssh/authorized_keys」に登録しておく必要がある

●SSH Agent Forwardingを許可するには以下の設定が必要。
・SSHサーバの設定ファイル「/etc/ssh/sshd_config」で「AllowAgentForwarding yes」を設定。（デフォルトはyes）

・また、次のいずれかの方法で許可する。
　- SSH接続時に、sshコマンドで「-A」オプションを使用。（「-a」オプションで禁止）
　- 常に許可するには、SSHサーバのシステム設定ファイル「/etc/ssh/sshd_config」、または接続先ユーザの設定ファイル「~/.ssh/config」で「ForwardAgent yes」を設定する。


●SSHポートフォワーディング
SSHがポートを用意して通信を中継することをSSHポートフォワーディングという。また、SSHの暗号化接続内を通ることで、SSHサーバ・クライアント間でのHTTP通信は外部から内容を盗み見ることができなくなる。「SSHトンネリング」とも呼ばれる。SSHポートフォワーディング設定を行うことを「トンネルを掘る」ということもある。

■ローカルポートフォワーディング
-Lは「Local port forwarding」のためのオプション。

ssh -L 転送対象ポート番号:SSHサーバから見た接続先アドレス:SSHサーバからの接続先ポート番号 [SSH接続ユーザー名@]SSHサーバアドレス


■リモートポートフォワーディング
SSHサーバが転送用ポートを用意し、SSHクライアントの指定されたポートに転送

ssh -R 転送対象ポート番号:SSHクライアントから見た接続先アドレス:SSHクライアントからの接続先ポート番号 [SSH接続ユーザー名@]SSHサーバアドレス

●X11フォワーディング
ネットワークを介したXサーバ・クライアントの通信に特化し、通信の暗号化、設定作業を簡略化できる。Xサーバ・クライアント間の通信は暗号化されていないため、入力したキー情報など盗み見られる恐れがある。X11フォワーディングを使うことで、ローカルのXサーバとリモートのXクライアントで安全に通信を行うことができる。
この機能を使うには、SSHサーバの設定で「X11Forwarding yes」となっている必要がある。

ssh -X [SSH接続ユーザー名@]SSHサーバアドレス [Xクライアントコマンド]

-Xオプションを付けてssh接続すると、Xクライアントの表示用にDISPLAY環境変数が自動で設定される。

●SSHのデーモン「sshd」の設定ファイルは「/etc/ssh/sshd_config」。
このファイルで認証の方法などを設定。rootユーザのSSHログインの許可/不許可も設定可能で、不許可とする場合は「PermitRootLogin」の項目を「no」とする。（デフォルトはyes）
cscの作法 その273

# 概要
cscの作法、調べてみた。
WndProc使ってみた。



# 参考にしたページ


https://qiita.com/kob58im/items/ab7a60730ea9acf20742

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/715668ed-5b76-4a82-f601-9b953dcc543d.png)

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

>cd csc2


>csc cowin.cs

```

以上。
Qiita検索オプション

# 検索時に利用できるオプション


| 検索内容 | オプション |
|:-:|:-:|
|タイトル   | title:  |
| 本文  | body:  |
| コード  | code:  |
| タグ  | tag:  |
| ユーザー  | user:  |
| ストックの数  | stocks:>or<数字  |
| 作成日<br>例:2015-10-09以降  | created:>2015-10-09  |
| 更新日<br>例:2015-10-01以降  | updated:>2015-10-01  |
| 〇〇又は<br>△△を含む  | 〇〇 OR △△  |
デザインパターン 

# 0章
## 実装とインタフェースの切り分け
インタフェースに対してプログラミングすることが積極的に取り入れられている。
## 再利用の方法
### 継承
* スーパークラスで実装されている内容をサブクラスにも引き継ぐ
### オブジェクトコンポジション
* オブジェクトは「もの」、コンポジションは「組み立て」
* 別のオブジェクトが持つ機能を組み合わせて利用することをオブジェクトコンポジションと言う
    * 例: SD カード
        * SDカードを挿しこむことで大容量が記録できるように拡張される
        * 携帯電話は、SDカードの「記録する」という機能を利用して機能を拡張

参考文献:
[TECHSCORE](https://www.techscore.com/tech/DesignPattern/foundation/foundation1)
PyTorchのAMPとSAMの併用

### SAM(Sharpness-Aware Minimization)
SAMについては下記などで詳しく紹介されているのでここでは説明を割愛.  

https://qiita.com/omiita/items/f24e4f06ae89115d248e

SAMは2回のforward-backwardを必要とするという点から、  
性能面としてはよいものではある(と思う)が、実装をなにかといじる必要がでてくる.  
今回記述する`AMP(AutoMixedPrecision)`についても同様である.

### AMP(AutoMixedPrecision)
これも公式が一番詳しいとは思うので割愛.

https://pytorch.org/docs/stable/amp.html

通常はfloat(fp32)であるが、Half(fp16)化によって演算速度アップや省メモリになるためのもの.  

### AMPとSAMの併用

PyTorchのAMPで利用されるGradScalerは`step(optimizer)`を呼出してパラメータを更新する.
しかし、よく利用させていただいている[SAMの実装](https://github.com/davda54/sam)では通常の`optimizer.step()`ではなく、
`first_step()`と`second_step()`を呼び出すようになっているため、
そのままGradScalerに渡すと**assertion error**を生じてしまう.  

この問題を回避するため下記実装例のような形をとる.
具体的には`optimizer.step`を差替えるという方法でAMPを使う.

### 実装例
```python
import torch

class SAM(torch.optim.Optimizer):
    #
    # SAMの実装については https://github.com/davda54/sam などを参照
    #

def train_loop(model, loader, loss_fn, scaler, optim):
    value = 0
    count = 0
    model.train()
    for i, itr in enumerate(loader):
        x, t = itr
        bs = x.shape[0]
        x = x.to(CFG.device)
        t = t.to(CFG.device).long()
        if isinstance(optim, SAM):
            # SAM 1st Path
            optim.step = optim.first_step
            with autocast(enabled=scaler._enabled):
                y = model(x)
                loss = loss_fn(y, t)
            scaler.scale(loss).backward()
            scaler.step(optim)
            scaler.update()
            # SAM 2nd Path
            optim.zero_grad()
            optim.step = optim.second_step
            with autocast(enabled=scaler._enabled):
                y = model(x)
                l = loss_fn(y, t)
            scaler.scale(l).backward()
            scaler.step(optim)
            scaler.update()
        else:
            # Default Optimizer
            optim.zero_grad()
            with autocast(enabled=scaler._enabled):
                y = model(x)
                loss = loss_fn(y, t)
            scaler.scale(loss).backward()
            scaler.step(optim)
            scaler.update()
        value += bs * loss.item()
        count += bs
    value = value / count if count > 0 else 0
    return value
```
またコードとしてはOptimizerがSAMを継承しているかを`isinstance`を用いて判断する.
SAMもしくはそのスーパークラスであれば2回のbackwardをするパスに入るようにしている.
これによりOptimizerに依存するコードの変更は少なくできるが、
逆にlossなどの変更点が増えてしまうなどのデメリットがある.
もっと良い書き方があるようにも思うが思いつかない....
【Unity】2022年版 AssetGraph導入メモ

# はじめに
AssetGraphの存在を最近知ったが、ここ数年の情報が少なく導入時に少し躓いたので、公式マニュアルに記載がない部分を中心に記録を残す。

# AssetGraphとは
* ノードベースのGUIツールでアセットの管理を自動化することができる。
* オープンソース化されているが2020年から更新が止まっている。（最新版Unityでの導入方法がドキュメントに書いていない。）
* 指定した条件のアセットがプロジェクトに追加されたタイミングや任意のタイミングで処理を実行できる。
* アセットを監視し、変化したら処理を行うこともできる。

https://www.docswell.com/s/UnityJapan/KNX1D5-unityassetgraph-unity

https://docs.unity3d.com/Packages/com.unity.assetgraph@1.7/manual/index.html

# 導入方法
パッケージマネージャの`add packege from git url`に`https://github.com/Unity-Technologies/AssetGraph.git`を入力すると導入することができる。
※2022年9月17日時点で`Version 1.7.2-preview`が最新で正式リリースはされていない…

# 詳しい使用方法

以下のサイトが分かりやすくおススメです。

https://tsubakit1.hateblo.jp/entry/2018/01/11/233824

# AssetGraphファイルを作成する
`window > AssetGraph > OpenGraphEditor`から新規作成することができる。

<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/eb47adc0-d350-df68-a1f1-237babd1ff95.png">

# 簡単な使用例：AssetGraphを使ってTextureの自動/手動設定変更をしてみる
1.指定ディレクトリに格納されたら設定を変更する。
* 自動設定対象のアセットと対象の設定用ノード`LoadFromDictionary`作成し、対象のディレクトリを設定する。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c2f946f2-522d-e98f-c11d-1aa860ddfdf1.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5e00fc48-88ba-9d9d-8aba-9ffa3728b9f7.png)

* ノード選択状態でInspectorウィンドウで対象のディレクトリが設定できる。
    * `Respond To Asset Change` のチェックボックスをONにすることで対象ディレクトリにAssetが格納されたら自動で処理を実行できるようになる。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/d34131bb-b008-ef45-1086-5fa1726aad36.png">

2.OverWriteImportSettingsノードを作成し、ImporterTypeをTextureに設定する。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/86f92864-703e-bbe5-5cd2-0a0363b4f190.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/e9f1d63d-5dce-038e-f8aa-6d9725df141d.png)
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/e0a511f9-205f-a1d3-7841-46b61d804af8.png">

3.Inspectorウィンドウの表示内容がTextureインポート設定用の内容に切り替わるので、任意の値に設定する。今回はTextureTypeをSprite、DefaultMaxSizeを512に設定している。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/18bc7c55-c4a3-01d9-c335-1d2b54c22ae7.png">

4.右上のExecuteボタンを押す、またはアセットを対象ディレクトリに格納すると、Texturesディレクトリの中の画像ファイルが512サイズの2DSpriteに変更される。
<img width="500" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/dd3d5015-07ca-62e2-6804-6d967b6a5ea0.png">

# とにかく画像をインポートしたときに処理を実行したい場合
LastImportedItemsNodeノード+SplitByFilterノードを組み合わせるだけで簡単に設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/33d86eae-39f5-1836-012c-ae2cc6e97024.png)
Windows+SourceTreeで.github\workflowsがPush出来なくなったときの対処法

※`! [remote rejected] master -> master (refusing to allow an OAuth App to create or update workflow `.github/workflows/android.yml` without `workflow` scope)`
的なことを言われたときを想定しています。

# 環境

PC : 

```
エディション	Windows 11 Home
バージョン	21H2
インストール日	‎2022/‎06/‎15
OS ビルド	22000.856
エクスペリエンス	Windows 機能エクスペリエンス パック 1000.22000.856.0
```

SourceTree : `ver3.4.7`

なおOSアップデート前も同じ方法で行っていたのでWindows10でも大丈夫なはず。



# 原因
GitHubの(CIを編集できる)トークンが切れている  

# 対処法  
1.`GitHubでworkflowsの編集権限のあるトークンを再発行`  

GitHubの画面上部のバーの右のアイコンをクリック  
→出てきたメニューの中から「Settings」を選択  
→「Developers settings」  
→「Personal access tokens」  
→任意のトークンを選択 or 「Generate new token」  
→「workflow」にチェックが入っていることを確認して、「Regenerate token」  
→再発行したトークンをコピー  

2.`PC(windows)の資格情報マネージャーにトークンを登録`  

「資格情報マネージャー」を起動  
→「Windows資格情報」のタブを開く
→https://github 関係っぽい汎用資格情報全ての設定を、

```
ユーザー名:kkkkan (自分のGitHubのアカウント名) 
パスワード:先ほど発行したトークン
```

に上書き(2022/3/21現在は、私の環境では該当する資格情報が二つあった。)  

トークンはパスワードではないけど、ここに登録することでうまくいくっぽい??  
→「Windows資格情報」を閉じる  
→~~SourceTreeを再起動~~  
`2022/9/18 追記` : 
SourceTreeを再起動+ SourceTreeの`オプション>認証>アカウント`でGitHubのアカウントを選択して`編集>OAuthトークンの再読み込み`をしないとだめだった

これでうまくpushできるようになっているはず。  

# 参考 
https://qiita.com/masato_makino/items/93c4429cdb4d54c007c7
web3.jsでMetamaskに保有しているETHの情報を取得する

最近仕事でweb3.jsを触る機会があり、Metamaskにアクセスして保有ETHの情報を取得する方法をまとめました

## サンプル
Metamskのアカウント情報(複数ある場合は最初のアカウント)を取得し、保有ETH情報を表示するサンプルです。
※Chrome拡張のMetamaskをインストールしないと起動しませんのでご注意ください
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="zYjZBEO" data-user="kurokiri" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kurokiri/pen/zYjZBEO">
  metamask web3.js</a> by Kurokiri (<a href="https://codepen.io/kurokiri">@kurokiri</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## 処理説明
```js
await window.ethereum.request({ method: 'eth_requestAccounts' });
```
ここでMetamaskで作成したアカウント情報を取得します。Metamaskではアカウントは複数作成できますが現在選択しているアカウントが取得されます。

```js
const ownedWei = await web3.eth.getBalance(account[0]);
```
web3.jsの`web3.eth.getBalance`を用いて保有ETHを取得しています。
ここで取得される値の単位はWeiと言ってETHの最小単位で
`1Wei = 0.000000000000000001ETH`
となります。

```js
const ownedEth = web3.utils.fromWei(ownedWei, 'ether');
```
値の単位がWeiからETHになるよう変換しています。これでMetamsk上に表示される保有ETHと同じ値になります。

## まとめ
今回テストネットは考えずにイーサリアムメインネット前提でサンプルを実装しましたが、ChainIDで処理を分ければテストネット毎の制御は可能です。
web3.js自体あまり触る機会はないかもしれませんが、試すと面白いので興味を持った方は是非触ってみてください！

## リファレンス
https://web3js.readthedocs.io/en/v1.8.0/
Phaserで作った試作品を公開する環境

## 結論

PLAYCODEで公開するのがいいかな、と思いました。
https://964701.playcode.io

* サーバーを立てなくてもいいですし、SSL証明書を用意しなくてもいいので維持費がかかりません
* ファイルをアップロードしたり、ディレクトリ階層を作ったりできるので、実際に近い構成にすることができます
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2807262/f5fabc02-6f7f-b962-47ed-7ea9e0e2f75c.png)

## 発端

　流行りのWEB3にあやかりたいという願望から、Dappを開発できたらいいな、とか思うのですが、オープンソースで開発に携われるようなプロジェクトってあまり見つからないしハードルが高いと思うんですよね。
　それでもチャレンジしたいなら、自分で立ち上げるしかないってことでしょうか。
それで、個人規模で比較的簡単に作れそうなものはゲームかなと思ったわけです。
　スマコンとのインターフェースにWeb3.jsを使って、マルチプラットフォームで動かすならフロントエンドもJSに統一した方が都合が良さそうだという着想から、JS製のゲームフレームワークであるところのPhaserを使ってみようということになりました。

## 模索

　まずは試作品を作って肉付けしていくという方針を立てました。試作段階でも手軽に進捗を見て貰えた方がなにかと便利だろうということで、公開用の環境を作りたくなりました。
　当初はGCPの無料枠でサーバーを立てました。維持費はかからないのですが、HTTPSじゃないですし、VSCodeと相性が悪いのかポートフォワーディングをしたりLive Serverを立ち上げるとセッションが切断してしまい、再起動するまで一切接続できなくなるという不可解で絶望的な現象に見舞われ憔悴してしまいました。
　次の候補として、CodePenを試しました。問題なく動きます。
動くのですが、一つのJSファイルに全てのコードを書けるのはごく小規模なうちだけだろうということで、複数ファイルに分割して書けるPLAYCODEに白羽の矢を立てたのです。

## 展望

　WEB3がもっと浸透して、デファクトスタンダードに近づけば、DAOももっと身近なものになって敷居が低くなるのでしょうか。有志が集まってタスクを分担するという体制をもっと気軽に組めるようになるといいですね。
　WEB3が浸透せずに廃れてしまう残念な未来が到来することも可能性としてあります。ただ将来的にコケるかもしれないという危惧はあれど、殆どが既存技術の延長線上にありますし、大した怪我はしなさそうです。関わって損はないと、とりあえず楽観しておきます。
Amazon Polly とは

## 勉強前イメージ

polly、slackで見たことある
あれ一緒？

## 調査

### Amazon Polly とは

テキストを音声スピーチに変えてくれるAWSのサービスになります。
現在では、英語や日本語など33種類提供されていて、アメリカ英語やイギリス英語など細分化されているのが特徴です。
またこのAIもすでに事前トレーニング済みのものになります。

また、読み上げのエンジンが以下の2つ用意されています。

- スタンダード
- ニューラル

ニューラルはニューラルTTS(NTTS)とも呼ばれ、スタンダードより高音質で音声を生成でき人間のような自然な読み上げ音声になります。

現在日本語は女性はMizukiで、男性はTakumiという音声が再生でき
男性はニューラルも存在します。

費用としては従量課金制で、
最初の12ヶ月は500万字/月まで無料、それ移行は100万字あたり4.00USD/月になります。

## 勉強後イメージ

slackのpolly全く関係なかったw
音声にしてくれるサービスらしい。

## 参考

- [入力したテキストを音声に変換するAWS「Amazon Polly」を無料で試す](https://www.watch.impress.co.jp/docs/review/minireview/1243596.html)
- [Amazon Polly](https://aws.amazon.com/jp/polly/)
gitでproxyを無効にできないときの解決方法

## proxyを使いたくないときでも、gitがproxy経由でアクセスしてしまった・・
proxy使いたくないけど、強制的にproxyになってしまい困っていました
```bash
brew services start mysql@5.7
出力
==> Tapping homebrew/services
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-services'...
fatal: unable to access 'https://github.com/Homebrew/homebrew-services/': Could not resolve proxy: (自分が使用しているproxy)
```
## 環境
Mac, bash
## うまく行った方法：git configを設定する


以下のコマンドを実行し、proxyを使用しない設定をgit configに保存します。
```bash
git config --global http.proxy ""
git config --global https.proxy ""
```
保存されているか確認
```bash
git config --global -l
# 出力
http.proxy=
https.proxy=
```
その後上記コマンドが成功
```bash
brew services start mysql@5.7
# 出力
==> Successfully started `mysql@5.7` (label: homebrew.mxcl.mysql@5.7)
```

## うまく行かなかった方法：.bashrcを編集
調べると、.bashrcに、proxyを使用しないIPアドレスを指定すればできるという情報を得たのですが、試してもうまくいきませんでした
```bash
export no_proxy="127.0.0.1, localhost"
export no_proxy="127.0.0.1, localhost"
```
おそらくこれがうまく行かなかった原因は、自分がproxy環境下でgitをインストールしたからだと思われます。gitのどこかに、常にproxyを使うような設定がされていると推測しています。。
【Ruby】Rubyのわかりにくい文法

### ハッシュの記法の色々

```rb:Railsコンソール
#　ハッシュのキーを文字列で
>> user = { "name" => "tarou", "email" => "tarou@example.com" }
=> {"name"=>"tarou", "email"=>"tarou@example.com"}

# ハッシュのキーをシンボルで
>> user = { :name => "test", :email => "test@example.com" }
=> {:name=>"test", :email=>"test@example.com"}

>> user[:name]              # :nameキーにアクセス
=> "test"

>> user[:test]          # 存在しないキーに対応する値にアクセスするとnil
=> nil
```

そして、Rubyでおそらく一番よく目にする、
この記法に至る

```rb
>> user = { name: "test", email: "test@example.com" }
=> {:name=>"test", :email=>"test@example.com"}
```

### ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる。
```rb
# Railsで見かける例のやつ
stylesheet_link_tag 'application', { media: 'all',
                                     'data-turbolinks-track': 'reload' }
# 上は以下のように書いても同じ
stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track': 'reload'


user = User.new({name: "test", email: "test@example.com"})

user = User.new(name: "test", email: "test@example.com")
```

### mapの省略記法
```rb
>> %w[A B C].map { |f| f.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
```
C#(dotnet core)でのmysql db contextの作成（メモ）


自分で使うためのメモ

ASP.NET Core/コンソールなどでも使える

## 必要なパッケージ（NuGetする）

* Pomelo.EntityFrameworkCore.MySql
* MySql.Data

## DbContext継承クラスを作成

```c#
using Microsoft.EntityFrameworkCore;
using MySqlConnector;

public class NekochayaDbContext : DbContext
{
    /// <summary>
    /// connection string を生成するため
    /// </summary>
    private MySqlConnectionStringBuilder Config { set; get; }


    /// <summary>
    /// 設定
    /// </summary>
    /// <param name="config"></param>
    public NekochayaDbContext(IConfiguration config)
    {
        Config = new MySqlConnectionStringBuilder();
        Config.Server = config.GetSection("NekochayaDB").GetValue<string>("Host");
        Config.Port = 3306;
        Config.UserID = config.GetSection("NekochayaDB").GetValue<string>("User");
        Config.Password = config.GetSection("NekochayaDB").GetValue<string>("Pass");
        Config.Database = config.GetSection("NekochayadB").GetValue<string>("Schema");
        Config.CharacterSet = "utf8mb4";
    }


    /// <summary>
    /// コネクション情報の反映
    /// </summary>
    /// <param name="optionsBuilder"></param>
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
        optionsBuilder.UseMySql(Config.ConnectionString, ServerVersion.AutoDetect(Config.ConnectionString));

    /// <summary>
    /// 主キーなどの設定はここ
    /// </summary>
    /// <param name="modelBuilder"></param>
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

    }
}


```
STM32G071とOLED、OLED096UNO-Aでデモで遊ぶ


x NUCLEO-G071RB


目的
OLEDの動作確認


部品


![o_con766.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/86b44514-7d0a-04a4-2d22-2ac43b0692a4.jpeg)




★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]



https://www.aitendo.com/product/18634



![o_con767.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a98a099a-e61b-dff0-8e3a-2dcbca46aecb.jpeg)




![o_con762.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e5478128-d9e6-b3d2-1ae8-56c6271acbca.jpeg)


![o_con763.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6624998f-8855-6bc3-2651-d0b72c1ae580.jpeg)


![o_con764.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/48ab814a-10f8-b923-cc48-b8f95014b27f.jpeg)


![o_con765.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/95f76c16-631f-a0ba-24f9-54933a41df73.jpeg)
Blender奮闘記④

# 初めに
この間yukiさんのクリームソーダを作ろうを作り終えましたので、yukiさんの次の動画を元にBlenderを触っていきたいと思います。

次の動画はこれです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/RWWuprqWJlQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

星空キャンディを作ってみよう!

# 星空キャンディを作ってみよう!
今回の動画は、キャンディ部分は前回の動画ができる人なら5分もあれば終わるような内容でした。メインはテクスチャの作成です。

![スクリーンショット 2022-09-17 011228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/e516f445-7a19-e90b-3751-50449edd06d2.png)

ここまで5分程度でした。

![candy_texter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/7328852c-183b-5824-c287-6785b96d85bf.png)

テクスチャをどんどんつけて……

![star_candy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/4a063e69-a22a-0ca3-197c-72ae7413b203.png)

完成!!

前回のクリームソーダを作ろうとは打って変わって早かったですね。。。全部で20分くらいでした。
ただ、一点躓いた点がありました。
それは、キャンディ複製後マテリアルプロパティの値を変えるとすべてのマテリアルプロパティの値が同一値に変化してしまう点です。
同一のマテリアルプロパティがコピーされてしまったために起こったことだと思います。コピーすると独立した存在になるわけじゃないみたいですね。コピーの仕方が悪いのかもですが……そのため、コピーをしたキャンディのマテリアルプロパティを選択し、新規プロパティを押して独立した存在にしました。


少しずつ身についていってそうです。

# 復習
再度作成します。

![スクリーンショット 2022-09-18 045510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/69695be7-7458-839d-d981-2a4d42430860.png)

これまたそこまで時間をかけずに作成することができました。
透き通った飴を作る場合はベースカラーの色を明るい色に変更する必要があるというのは大きな学びになりました。

# 終わりに
次は、この知識を利用してスーパーボールを作成したいと思います。

イメージはこういう感じです。

![mono74062266-180209-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/e82531f3-cf7b-1eb6-7209-c41ab428e94f.jpeg)

[スーパーボール](https://www.monotaro.com/g/03063137/#)
【小ネタ】LinuxやMacには/bin/[という謎のバイナリがある

## 概要
LinuxやMacには```/bin/[```という謎のバイナリファイルがあります。
(※Windowsでは、WSLは当然として、CygwinとかGitBashにもあります)
```
$ which [
/usr/bin/[
$ file $(which [)
/usr/bin/[: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=e839984e966cdfd5f1bfde6ecda802397d4a4c1f, stripped
```
これは一体何なのだろう...
ググってもあんまり情報出てこなかったので、Manコマンド叩いてちょっと見てみました。

## 結論
シェルスクリプトのif文の条件とかで使う```[]```の事でした。

## 考察？
まさか```if [ 条件 ]; then```の```[```がコマンドだったとは。。。
これはtestコマンドの省略系なので、確かに言われてみればコマンドですね。
```[ 条件 ]```は以下の性質を持つようです。
- 条件が真⇒$?=0
- 条件が偽⇒$?=1(※1以外もあるのかも。とりあえず0にはならないみたい。)


ということは、bashなどの```if```は、
- ```if $?=0となるコマンド```⇒処理が実行される
- ```if $?!=0となるコマンド```⇒処理が実行されない

という性質を持つのかな？ちょっとやってみました。
```
$ cat test.txt
hello
$ if grep 'hello' test.txt >/dev/null; then echo '真'; fi
真
$ if grep 'hoge' test.txt >/dev/null; then echo '真'; fi
# 何も出力されなかった
```

どうやら合ってそうですね。
Androidアプリ忘備録 ~文法メモ

Android Studioにおける
kotlinプロジェクト文法について忘備録です。
# HTMLにおけるDOCTYPみたいなもの
```kotlin
<?xml version="1.0" encoding="utf-8"?>
```
# LinearLayoutの書き方
```kotlin
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
...
</LinearLayout>
```
# ListViewの書き方
```kotlin
<ListView
    android:id="@+id/lvMemoList"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="10dp"
    android:layout_weight="0.6"/>
```
# Buttonの書き方
```kotlin
<Button
    android:id="@+id/btnAdd"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:onClick="onAddButtonClick"
    android:text="追加"/>
```
# TextViewの書き方
```kotlin
<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text="タイトル"
    android:textSize="20sp"/>
```
# EditText
```kotlin
<EditText
    android:id="@+id/etTitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
```
CompTIA PenTest+ 受験記録 (2022/8)

# CompTIA PenTest+とは
https://www.comptia.jp/certif/cybersecurity/comptia_pentest/
公式から引用
>CompTIA PenTest+は、ペネトレーションテストの手法、脆弱性評価、また攻撃があった際のネットワークを回復するために必要となるスキルを評価します。効率的に作業を進めるためにフレームワークをカスタマイズし、結果を適切に報告すると共に、ITセキュリティ全般的な状態の改善を図るための戦略を提案できるスキルとベストプラクティスを育成します。

つまりは、一連のペネトレーションテストを行う際のスキルをはかる試験といえるでしょう。

# 受験のきっかけ
所属組織にて、レッドチームを立ち上げることになり、メンバーに選定していただきました。レッドチームのメンバーとしてのペネトレーションテストのスキルを向上させるため、受験することにしました。余談ですが、OSCPよりもCompTIA PenTest+を受験した理由は、受験時間がOSCPよりも短いからです。子供がいると、48時間も受験時間に充てられないのが本音・・・でもOSCPもそのうち受けたいです。
- 試験時間
    - OSCP 48時間
    - CompTIA PenTest+ 2時間45分(165分)

# 前提知識
セキュリティ系の資格は情報処理安全確保支援士くらいで、CompTIAの試験は初になります。

# 学習内容
使用した学習教材は以下の二つです。
- [The Official CompTIA PenTest+ Self-Paced Study Guide (Exam PT0-001) 日本語版](https://jp-store.comptia.org/p/PEN-001-JPPP-20-C) 20,433円
- [PenTest+（PT0-001対応）Web模擬試験（リテイクチケット付）](https://www.tac-school.co.jp/kouza_it/it_crs_comptia_pentestplus.html)50,100円

学習時間はおおよそ40時間ほどです。

## The Official CompTIA PenTest+ Self-Paced Study Guide (Exam PT0-001) 日本語版 (公式テキスト)
ペネトレーションテストを実施するうえで、ペネトレーションテスト技法だけでなく、契約の話やステークスホルダー、報告書の記載に関する内容等重要な情報が盛り込まれていて、学習教材としてはとても良いと思います。送料込みで20,000円を超えるため、筆者は購入を躊躇し、職場に持っている同僚がいたため、お借りして勉強しました。

## PenTest+（PT0-001対応）Web模擬試験
正直これだけやっとけば受かる気がします。
内容は以下の通り
- Web模擬試験が2回分
- 出題範囲の章単位での小テスト(各章毎に5問出題)
- パフォーマンスベーステストの模擬試験1回分

筆者はそれぞれ、Web模擬試験2回分を4周、小テストを2周、パフォーマンスベーステストを1周実施しました。
Web模擬試験では90%が合格ラインだったのですが、4周目でようやく90%に到達できるレベルまで達しました。初回は60%程でしたが、間違えたところは公式テキストで確認し、理解を深めていくやり方でした。

# 試験当日
試験時間は165分ですが、そこまで時間がかかることなく、大体1時間10分ほどで終えました。試験終了後、アンケートに答え、点数と合否がモニタに表示されて試験終了です。受付で印刷された紙ももらいました。

# 試験結果
787/900点で無事合格しました。750点が合格ボーダーラインです。

後日、デジタルバッジが発行されますので、取得するようにしましょう。カッコイイですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586409/057409d3-0768-f8f6-049f-7fe98dcb2552.png)

# 最後に
本資格の有効期限は3年ですので、本資格をきっかけにまたCompTIAの資格や別のセキュリティ関連の資格の勉強に励み、自身のスキルを磨いていこうと思います。
Android Studio をアップデートしたら起動しなくなった

## 経緯
Flutter の環境構築の最中、Android Studio のインストールが少し前だったので、
この機に最新バージョンにアップデートしようとしていたところでした。

## エラーの内容
最新版にアップデート後、Android Studio を起動すると以下のエラーが発生するように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/183f1610-3705-fc3c-30b7-21b6a82aabdd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/473f8854-553b-04ab-d4e9-3df884a9ac82.png)

ふむ、さっぱり原因がわかりません。。。

## 解決方法
調べていると teratail で見つけた以下の質問がエラー内容が同じで日本語化したことが原因とのこと。

https://teratail.com/questions/4eha2exphz3gr7

前に日本語化していたため、早速日本語化を解除してみます。
Pleiades の日本語化プラグインをダウンロードして起動し、Android Studio を日本語化する際に設定が追加される
ファイルを確認します。

https://mergedoc.osdn.jp/

![settingfile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/d2c0d433-01d5-b0b2-7437-498758d6c1dc.png)

対象のファイルをエディタで開いてみます。
8行目の ` -javaagent: ` 以降が以前日本語化した際に追加された設定のようです([ユーザー名]の箇所は便宜上変えています)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/401f16eb-969b-883e-44ae-ef7f0cc2cc00.png)
コメントアウト(先頭に #) して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/3057115c-0168-36dc-3442-48fc0a23fb1f.png)

Android Studio を起動してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/c49abb23-01c4-03d4-1cf6-d79b44eb7316.png)
無事起動できました！

日本語化の解除は以下の記事を参考にしました。

https://zesys.net/pc/android/android-studio-cancel-japanese-localization/

## 最後に
軽い気持ちでアップデートしようとしたら、ちょっと詰まってしまいました。。。
2次元配列を1次元配列にする方法

はじめに
--
reactのuseStateで作成した配列を使ってあれこれ機能を実装していると、配列のネストをフラットにしたい！という時がありました。
"flat()"という便利なメソッドの存在を知ったので調べて備忘録として残そうと思います。

二次元配列とは？
--
配列の中に配列が入っている、下記のような配列のことを二次元配列といいます。
~~~
[[a,b,c],[d,e,f]]
~~~

ちなみにさらに配列が中に一つ入っていると三次元配列というみたいです。
見てると頭おかしくなりそうですね。
~~~
 [[[a,b,c],[d,e,f]],[[g,h,i],[j,k,l]]]
~~~

二次元や三次元配列は多次元配列とも呼ばれるそうです。
そして、目にすることが多い下記の配列が1次元配列と言います。
~~~
[a,b,c]
~~~

構文
--
~~~react
const newArray = arr.flat([depth]);
~~~

引数の"depth"に入れた数字分ネストをフラットにしてくれます。
(省略可能でデフォルト値は1)

言葉ではイメージが湧かないと思うので例を見ていきましょう。

例
--
自分が実装している中で配列を一次元配列にしたい！と思った例をここに書くと事前説明が長すぎることになるので、[公式ドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)の例を引用させてもらいます。

~~~js
const arr1 = [0, 1, 2, [3, 4]];

console.log(arr1.flat());
// [0, 1, 2, 3, 4]が返ってくる
// 引数に指定がないと、1つフラットにする

const arr2 = [0, 1, 2, [[[3, 4]]]];

console.log(arr2.flat(2));
// [0, 1, 2, [3, 4]]が返ってくる

console.log(arr2.flat(3));
// [0, 1, 2, 3, 4]が返ってくる


const arr3 = [1, 2, [3, 4, [5, 6]]];
console.log(arr3.flat());
// [1, 2, 3, 4, [5, 6]]が返ってくる
// 一層分なので、[3, 4, [5, 6]]の外側が消える
~~~

文章にするのが難しいのですが、引数の数字分、外側から"[]"の層が減っていくというイメージで良いのではないかと思います。
(表現が正しくないかもしれないです)

引数を"Infinity"にすると平坦にする
--
このようなとんでもなく深くネストされた配列を一次元配列にしたいと思ったら、"Infinity"を引数に入れれば問答無用で一次元配列にしてくれるようです。

~~~js
const arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]];
arr4.flat(Infinity);
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]が返ってくる
~~~

終わりに
--
実装していく中で、配列への理解度がすごく大切な気がしました。
mapやfilterメソッドも調べてまとめようと思います。
Python3エンジニア認定基礎試験合格までの勉強法

### はじめに
Python未経験者が1か月半かけて勉強し、無事に資格取得までできましたので、これから試験に臨む方向けにどのように勉強したか共有したいと思います。
私自身はプログラミング経験はプログラミングスクールにてRubyを3か月～4か月ほど学習と、VBAを1年弱ほど触っているような技術感です。実務で本格的なプログラムを書いた経験はほぼなしです。

### 試験について

>試験日程：通年
試験方式：コンピュータ上で実施するCBT方式
試験時間：60分
問題数：40問
合格ライン：70

比較的難易度は低く、合格率は高め。

試験範囲　Pythonチュートリアル（書籍だがウェブ上で無料で閲覧もできる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/5b787820-39c4-0869-256f-94f113736d83.png)

### 勉強法その１　動画教材
まず、Pythonを知ろうというところから、Udemy「現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル」をセール時に購入し、動画を見ながら手を動かして、基礎的な構文をインプットしました。ただ、ちょっと難しくて後半ついて行くのが大変でしたが試験範囲の部分までを軽く理解しておきました。一週間で15時間ほど学習しました。

https://www.udemy.com/course/python-beginner/?AID=210314689780&a8=A1bBK1OaoPi_j4G5atiSOybyS4IHhb.yStiXO0Uv6XmaoPb1FPha6SkaiPIJkJ.iTXNSGublT1bBes00000016735001&aEightID=s00000016735001

### 勉強法その２　Pythonチュートリアルの読み込み
試験範囲のみ読み進めました。
正直このフェーズは本当に必要だったかどうかは後から思うと疑問ですが、土日を使って一気に読み終えました。難しくて意味がよくわからないことが多く、結構つらかったです(笑)

### 勉強法その３　模擬試験の実施
PrimeStudyというサイトで模擬試験が3種類準備されています。

https://study.prime-strategy.co.jp/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/a5f378ec-fa11-a340-b03d-431ad2b34d48.png)

まずは第一回を初見で受験したところ、65％とわずか届かず。時間が足りませんでしたが、意外と取れていて、安心した記憶があります。受験後、取れなかった問題を検索して調べました。割とこの試験の問題に関する記事がヒットすることがあったので捗りました。
自分自身、ミスした問題を調べてたどり着いた記事を自分用にまとめたりしていました。

https://qiita.com/y-matsunaga/items/77d0e581b8009d2aee85

これを第3回まで繰り返します。（模擬試験１→１→２→２→３→３）のように実施。
2週目はどの試験も合格圏内に行けます。
3週目ともなると、私の場合はどの試験も９０％越えとなり、自身がついたのでこの時点で模擬試験はやめました。（パターンは同じなので飽きてしまった）

### 勉強法その４　再度Pythonチュートリアルを読み込む
最初読んだときより、自分の頭がこの本を受け付け始めていると感じました。
わかる部分はさらさらっと読み進め、自分が模擬試験でミスした部分などが記載されているページを見つけたときなんかは食い気味に読み込み、さらに理解を深めました。

### 試験本番日
早起きして模擬試験を一度実施。なんとなく模擬試験２を選択。前回受験からちょっと期間空いていたので心配でしたが、100点満点だったので、安心して2度寝しました(笑)
電車で40分ほど揺られている間にPythonチュートリアルを読んで対策し、本番を迎え、受験しました。
1問だけ5分ぐらい悩みましたが他は順調に解き進め、30分でフィニッシュ。
5問落とし？の875点で合格しました。

![01D95454-FC76-4706-9C6E-FA25081BFBD1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/cc49e4bd-88f3-226d-f764-81f8fab86dbe.jpeg)

### 感想
PrimeStudyの模擬試験には感謝です。
個人的には本番の方が簡単に感じました。
本番はPrimeStudyの模擬試験とは空気が変わった問題も出たりしたので、そういうのに考えさせられましたが、おおむね模擬試験に連続で合格できれば大丈夫だと感じました。

### 終わりに
無事合格はできたもののコードはまだまだ自力では全然書けないので、この試験勉強で得た知識を活用し、知識からスキルへとステップアップさせていきたいと思います。
次はデータ分析試験を受験したいと思います！
Unityと数学


安原さん https://qiita.com/yuji_yasuhara

https://www.youtube.com/watch?v=Qd6t44Zt5nY

https://www.youtube.com/watch?v=7-G72E2kiqM

ゲームアプリの数学
https://github.com/ryukbk/mobile_game_math_unity
Capitalisation of table name generated by Hibernate when using MySQL server

# My problem

I am working on a Spring Boot project with JPA (Hibernate implementation), and the database underlying is MySQL running on Windows. The table names are in lower case. One day I moved the database from Windows to Linux, imported all data, and then restarted the application. Hibernate created some of the tables for me, with names same as entity class, including capitalisation. And it reads the data from the new table instead of the old table with lower case name. I tried to find out why and finally got the reason.

# Database and table name of MySQL

First I need to talk about history. In the time of MyISAM storage engine, a database is just a folder and a table is a group of files in that folder. The name of the database is the name of the folder. In Windows, when accessing a folder, the case of name is not considered, so "Student" and "student" means the same folder. But in Linux, the folder name is case sensitive. So when running two SQL query below, different behavior can be seen when running on Windows and Linux.

```sql
SELECT `name`, `class` from `student`;
SELECT `name`, `class` from `Student`;
```

And now **lower_case_table_names** system variable determines the behavior of case of table name. For details please read [this](https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html).

# When Hibernate will help you generate table name

When an entity class is not specified a table name by @Table annotation, Hibernate will determine the table name. Hibernate first read the system variable **lower_case_table_names**, and then decided to use the name including capitalisation or not by this value.

# Back to my problem

In the newly setup Linux MySQL database, add the following line into my.cnf. Restart both MySQL server and my application, and the problem is solved.

```ini
[mysqld]
lower_case_table_names = 1
```
Rubyで外部コマンドを実行する方法メモ

# 前提
- Ruby 3.1.2



# [Kernel.#`](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/=60.html)
- 基本的にはこれを使うことが多い
- コマンドの標準出力を文字列として返す
- 終了ステータスは`$?`で確認する

```ruby
def exec_command(command)
  result = `#{command}`

  raise RuntimeError, "`#{command}` is failed." unless $?.success?

  result
end

p exec_command('ruby -v')
=>
"ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]\n"
```



# [Kernel.#system](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/system.html)
- あまり使うことなさそう
- 子プロセスでコマンド実行する
    - 生成した子プロセスの終了を待つ
- 終了ステータス0で`true`、それ以外は`false`を返す
    - そもそも実行できなかった場合は`nil`
- 終了ステータスは`$?`で確認する

```ruby
def exec_command(command)
  result = system(command)

  raise RuntimeError, "`#{command}` is failed." unless $?.success?

  result
end

p exec_command('sleep 10; echo "finish sleep"')
p exec_command('ruby -v')
=>
finish sleep
true
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
true
```



# [Kernel.#exec](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/exec.html)
- あまり使うことなさそう
- 該当プロセスの実行内容がコマンド実行に変わる
    - 実行後、本来の処理には戻らない

```ruby
def exec_command(command)
  exec(command)
end

p exec_command('ruby -v')
p 'not exec'
=>
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
```



# [Kernel.#spawn](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/spawn.html)
- 並列実行したい場合に使う
- 子プロセスでコマンド実行する
    - 生成した子プロセスの終了を待たない
- 子プロセスのプロセスIDを返す

```ruby
def exec_command(command)
  spawn(command)
end

p exec_command('sleep 10; echo "finish sleep"')
p exec_command('ruby -v')
=>
96755
96756
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
finish sleep
```
転職活動の話とその後

転職してから記事書くことに気が回らなかった、という言い訳はさておき。
自分が転職した感想をまとめていこうと思います。少しでも参考になったら嬉しいです。


## 自己紹介
年齢：アラサー
前職：メーカーのR&D部門に在籍。実験、シミュレーション解析＋データ解析と広く浅く(？)やってた。何でも屋みたいな。
現職：メーカーでシミュレーション。前職よりはやや川下側の企業。

## 転職のきっかけ
もう少し給料を上げたいな、というのが一番の理由でした。同業他社と比べると、平均年収が100万ぐらい低かったので。
もちろん給料以外の理由もあり、

**・会社の財務面**
新卒の時は正直そこまで気にしていなかったのですが、業務を進める中で厳しいなと思うところが出てきまして。あと経理の人と話す機会があったのですが、そこでうん・・・となってしまう内容がありました。
**・今後のキャリア**
R&D部門に在籍していたのですが、どこかで別の部門に行きたいなという思いがありました。技術自体は面白いと思うのですが、コストのことも見れるようになれたらいいなと。とにかく自分の手でいいものを作りたい、というのは少し違うかなと。
ただ、別部門への異動が他の部署と比べて少ない&自分はしばらく異動できなさそうという感じだったので、選択肢の1つとして転職を考えてみました。

## 転職の流れ
●このままでいいのか、という気持ちだけで転職エージェントに相談。
「なぜ転職が必要か、また今後何をしていきたいかを明確にした方がいい」とアドバイスを受け、その段階では転職活動せず仕事を頑張る。
↓
●最初の相談から1年ほど経過し、上記の理由や自分の考えがある程度まとまる。ここから半年ほど、いつ転職すべきかということをぐるぐる考える。
↓
●覚悟が決まり、複数のエージェントに相談。そこでどのエージェントからも「**年収低いですね**」とハッキリ言われて、ちょっとへこむ(わかっていてもショックを受けます)。
前職より基本上がると言われたので本格的に活動する。
↓
●活動してから1か月～1か月半で内定をもらったので終了。その後退職報告⇒引継ぎを実施して、現在に至る。

## 転職活動を通してよかったこと
**・思っていたより評価してもらえた**
関わっていた分野が広い分、専門性が弱いというところを当初気にしていました。それでも興味を持っていただける企業が多かったことは嬉しかったです。また逆に、自分のネガティブ面も教えてもらえたのは収穫でした。
**・年収が上がった**
転職を考えた最初のきっかけ。具体的な金額は伏せますが、これだけもらえたらいいなという金額よりもアップしました。
**・スキルや考え方を整理できた**
何をやってきたか、どうしていきたいか、というのをまとめることができました。あとは活動中にも少し変わったりして、考えながら修正するのは楽しかったです。今はR&D部門とは違う部門にいるのですが、それもキャリアの1つとして叶えられたなと。
**・英語面接の経験ができた**
面接が得意じゃなかったのですが、どうにか慣れたいなと思いました。そこで英語面接したら日本語の面接が楽に感じるのではと考えて、外資系のエージェントに相談し、英語で話すことをやってみました。別に外資系に行きたいわけではなったのですが。
伝えきれないことも多く反省はありましたが、やりきったという自信が少しついた気がします。

## 転職その後
現職に移って、いいことも大変なことも。

いいところ：オフィスがきれい、セキュリティに関する考えがしっかりしている、利益をそれなりに出している、業務に関する蓄積がある、ルールがきっちりしている。
大変なところ：ルールが多い(これはメリット/デメリット両方)、スピード感が速い、アンラーニング難しい。

やっぱり企業文化がそれぞれあるので、合わせていくのは労力が必要ですね。スピード感が結構違うので、ひーひー言っていますがそれでも面白いと思っています。

## まとめ
転職が必ずしもいいとは限りませんが、自分は実施してみてよかったなと思いました。
あとは転職後はやっぱりギャップが生まれると思うので、アンラーニングについて学んでおくといいのではないでしょうか。

↓アンラーニングの記事
https://www.hrpro.co.jp/series_detail.php?t_no=2788
https://www.works-i.com/column/works02/detail020.html
https://wisdombase.share-wis.com/blog/entry/unlearning
クラスメソッドとインスタンスメソッドとinitializeメソッドの備忘録

どれがクラスメソッド、インスタンスメソッド、initializeメソッドか思い出す為に簡単にですがメモします。

### 先に記述内容
```
class Vegetable

  def self.fresh
    puts "新鮮な野菜はいかがですか？"
  end
 
  def initialize(name, price)
    @name = name
    @price = price
  end
 
  def introduce
    puts "#{@name}は#{@price}円です"
  end
 end
 
 carrot = Vegetable.new("にんじん", 120)
 lettuce = Vegetable.new("レタス", 200)
 tomato = Vegetable.new("イチゴ", 160)
 
 Vegetable.fresh
 carrot.introduce
 lettuce.introduce
 tomato.introduce
```
```:結果
新鮮な野菜はいかがですか？
にんじんは120円です
レタスは200円です
イチゴは160円です
```
### クラスメソッド
クラスオブジェクトから呼び出すためのメソッド
個別の情報によらず、共通の結果を返す動作を定義する
メソッド名の前にselfを.(ドット)で繋いで定義する。
```
class Vegetable
  def self.fresh
    puts "新鮮な野菜はいかがですか？"
  end
end
 
Vegetable.fresh
```

### initializeメソッド
インスタンスが生成された瞬間に、生成されたそのインスタンスが実行する処理を定義するインスタンスメソッド。
クラス名.newに対して引数を渡すことでinitializeメソッドに値を渡すことができる。
```
class Vegetable
  def initialize(name, price)
    @name = name
    @price = price
  end
end
 
 carrot = Vegetable.new("にんじん", 120)
 lettuce = Vegetable.new("レタス", 200)
 tomato = Vegetable.new("イチゴ", 160)
　# インスタンス = クラス名.new
```

### インスタンスメソッド
インスタンスが使用できるメソッド。
インスタンスごとの個別の情報（属性値）を使った処理に使用する。
インスタンス名.メソッド名で呼び出す。
```
class Vegetable

  def initialize(name, price)
    @name = name
    @price = price
  end
 
  def introduce
    puts "#{@name}は#{@price}円です"
  end
  
end
 
 carrot = Vegetable.new("にんじん", 120)
 lettuce = Vegetable.new("レタス", 200)
 tomato = Vegetable.new("イチゴ", 160)
 
 carrot.introduce
 lettuce.introduce
 tomato.introduce
```

以上になります。
xserverドメインをgithub pagesで使う

# github pagesについてのメモ

## githubアカウントの無料プランと有料プランの違い
無料プランはレポジトリをpublicにしないと使えない
有料プランだとprivateでも使える

## github pagesの設定

### 設定画面の開き方
- レポジトリのページに飛ぶ
- Settingsを開く
- Pagesをクリックする

### 設定項目
- SourcesはDeploy from a branchにする
- Branchを選択し、rootかdocs/を選択してSaveを押す
- Custom domainを設定できるようになる(設定しない場合は(https\://アカウント名.github.io/リポジトリ名)となる)
- Enforce HTTPS にチェックを入れるとhttpsにできる

## 独自ドメインの取得
### xserverドメインで取得する
- [xserver](https://www.xdomain.ne.jp/)にアクセスする
- 取得したいドメインを入力し検索する
- ドメインを選択し手続きに進む

### ドメインの設定
- DNSレコード設定をクリックする
- DNSレコード設定を追加するを押す
- ホスト名と優先度は空欄のままで以下のように設定する

| 種別             |       内容             |
|:-----------------|-----------------------:|
| A                |        185.199.108.153 |
| A                |        185.199.109.153 |
| A                |        185.199.110.153 |
| A                |        185.199.111.153 |
| AAAA             |    2606:50c0:8000::153 |
| AAAA             |    2606:50c0:8001::153 |
| AAAA             |    2606:50c0:8002::153 |
| AAAA             |    2606:50c0:8003::153 |

## 参考
[Xserver Domain で取得したドメインを使って GitHub Pages で HTTPS に対応したサイトを公開する方法](https://y-ktzw.com/posts/custom-domain/)
[GitHub Pages サイトのカスタムドメインを管理する](https://docs.github.com/ja/enterprise-cloud@latest/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site)
FlutterでTalkBack、VoiceOverを検知してa11y対応

# はじめに
みなさん、Flutterでa11y（accessibility）周りやっていますでしょうか。

アプリの分野でa11yは聞き慣れないかもしれませんが、 Webの分野では[Web Content Accessibility Guidelines (WCAG) 2.1](https://waic.jp/docs/WCAG21/)として、a11yの対応項目みたいなものがルールとして決められています。

アプリでもWCAGのようなルールに対応していけたら、よりa11yの高いアプリをつくれるのではないかなと思いっています。

Flutterだけで言えば、すぐに書いたコードが動いてそこで満足してしまいがちですが **すべてのユーザーに同じサービス価値を届けるために** a11yについて考えることは大切だと思っています。せっかくいいアプリを作れてもそれが特定のユーザーにしか使ってもらえないのはもったいないので、積極的に対応していきたいです。

今回は、WCAGで定められている色々なルールの中で [達成基準 2.2.2: 一時停止、停止、非表示を理解する](https://waic.jp/docs/WCAG21/Understanding/pause-stop-hide.html) というルールについての話です。

# 「一時停止、停止、非表示を理解する」とは
WCAGの[達成基準 2.2.2: 一時停止、停止、非表示を理解する](https://waic.jp/docs/WCAG21/Understanding/pause-stop-hide.html)を読んでもなかなか何を言っているのか理解が難しいと思います。
Amebaの[Accessibility Guidelines](https://a11y-guidelines.ameba.design/2/2/2/)が具体的な例があってわかりやすいです。

この2.2.2の達成基準では、アプリ内で埋め込まれた動画が自動再生されたり、横並びのリストのカルーセルが自動でスクロールされるなどの動作が他のコンテンツと並行して表示されて5秒以上続く場合、ユーザーがそれを非表示・一時停止・停止の操作をできる術を用意しなければならないというルールが定められています。

WCAGでは以下のような理由で対応理由が記載されています。

> この達成基準を満たさないコンテンツでは、利用者がそのウェブページ全体を使用できない恐れがあるため

# TalkBackとVoiceOver
スマートフォンを普段使っていてこの機能を触れる機会はあまり多くないと思います。
どちらもスクリーンリーダーと呼ばれる機能で、ONにすることでスマートフォン内のすべてのコンテンツに対してフォーカスが当たってそれを読み上げる機能です。主に目が不自由なユーザーが使う機能で、目が見えていなくてもスマートフォンを操作できるようにするための機能です。
Android、iOSそれぞれこの機能を設定アプリから設定できて、AndroidではTalkBack、iOSではVoiceOverと呼ばれています。

百聞は一見に如かずだと思いますので、色んなアプリで自分でこの機能をONにして試してみてください。

https://support.google.com/accessibility/android/answer/6007100?hl=ja

https://support.apple.com/ja-jp/guide/iphone/iph3e2e415f/ios

今回、このトークバックがONのときに自動更新コンテンツが画面内にあると困ることがありました。次の章で詳しくお話します。

# Flutterでどのように対応するか
Flutterだからというわけでは一般的な対応策として、Amebaの[Accessibility Guidelines](https://a11y-guidelines.ameba.design/2/2/2/)でまとめられているように自動更新されるコンテンツの近くに一時停止ボタンを用意するのが良いようです。

しかし、デザインの都合上それができない場合があったり、デザインがそれを考えられて作られていない場合があるかもしれません。

私が実際遭遇して困った場面として、画面内に自動再生される無限スクロールのカルーセルがあってスクリーンリーダーをONにしているとカルーセルがスクロールされている音が無限に鳴り響くというものでした。

そこでどうにか今ユーザーがスクリーンリーダーをONにしているかどうか検知してONにしている場合は自動再生を止めたかったです。

MediaQueryDataにある`accessibleNavigation`というプロパティがそれでした。
https://api.flutter.dev/flutter/widgets/MediaQueryData/accessibleNavigation.html

スクリーンリーダーをONにしているとこのプロパティがtrueになります。

先ほどのドキュメントに記載があるように、PlatformDispatcherの`accessibilityFeatures`がもとみたいです。

https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/accessibilityFeatures.html

# まとめ
- すべてのユーザーに同じサービス価値を届けるためにアプリでもa11y対応は大切です
- 自動更新されるコンテンツには一時停止ができる術を用意しましょう
- FlutterでスクリーンリーダーのON・OFFはMediaQueryDataのaccessibleNavigationのbool値で検知できます

# Links
- https://waic.jp/docs/WCAG21/Understanding/pause-stop-hide.html
- https://a11y-guidelines.ameba.design/2/2/2/
- https://support.google.com/accessibility/android/answer/6007100?hl=ja
- https://support.apple.com/ja-jp/guide/iphone/iph3e2e415f/ios
- https://api.flutter.dev/flutter/widgets/MediaQueryData/accessibleNavigation.html
- https://api.flutter.dev/flutter/dart-ui/PlatformDispatcher/accessibilityFeatures.html
PostgreSQLクライアントからの接続について

# はじめに
PostgreSQLと書いたり、PSQLと書いたり、言葉に揺らぎがあるかもしれませんがご容赦ください。
Almalinux8.6のコンテナで環境構築しています。

# サーバーとクライアント
PostgreSQLに限った話ではないですが、
DBサーバーと、DBを利用するクライアントは別物になります。
この記事は、DBを利用するクライアント側での説明となります。

# PostgreSQLクライアントの設定
dnf標準のリポジトリからはインストールできないため、リポジトリを追加する必要があります。
また、標準リポジトリを利用しないように設定してからインストールする必要があります。
以下のコマンドになります。
```
# dnf -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# dnf -qy module disable postgresql
# dnf -y install postgresql13
```

# PSQLクライアントからPSQLサーバーのDBへ接続
- PSQLのユーザー名：dbuser
- 接続したいDB名：dbname
- 接続先ホスト名もしくはIPアドレス：hostname
```
# psql -U dbuser -d dbname -h hostname
```

# ユーザーを確認する
```
dbname=# \du
 dbuser    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```

# DB一覧を表示
¥lと打ちたいところですが、バックスラッシュ(\)+lです。
MACの場合、Optionキーを押しながら¥キーでバックスラッシュを打てます。
```
dbname=# \l
                              List of databases
   Name    | Owner  | Encoding |  Collate   |   Ctype    | Access privileges 
-----------+--------+----------+------------+------------+-------------------
 dbname    | dbuser | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | dbuser | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | dbuser | UTF8     | en_US.utf8 | en_US.utf8 | =c/dbuser        +
           |        |          |            |            | dbuser=CTc/dbuser
 template1 | dbuser | UTF8     | en_US.utf8 | en_US.utf8 | =c/dbuser        +
           |        |          |            |            | dbuser=CTc/dbuser
(4 rows)
```
DBの外からでも`psql -U dbuser -d dbname -h hostname -l`で調べられます。

# DB作成＆削除
testdbという名前のDBを作成
```
dbname=# CREATE DATABASE "testdb";
CREATE DATABASE
```
DBを削除
```
dbname=# DROP DATABASE "testdb";
DROP DATABASE
```

# テーブル作成＆削除
作成コマンド
```
dbname=# CREATE TABLE fruit(id integer, fruit varchar(10), price integer);
CREATE TABLE
```
削除コマンド
```
dbname=# DROP TABLE fruit;
DROP TABLE
```
# テーブルにレコードを追加
文字を打つ際は、シングルクォーテーションで囲う。ダブルクォーテーションだと失敗するので注意。
```
dbname=# INSERT INTO fruit(id,fruit,price) VALUES (1,'meron',3000);
INSERT 0 1
```
全レコード追加する場合は、カラム名を省略可能
```
dbname=# INSERT INTO fruit VALUES (2,'apple',100);
INSERT 0 1
```

# SQLでテーブル内のレコードを確認
```
dbname=# SELECT * FROM fruit;
  1 | meron |  3000
```

SQLコマンドは、書いていると長くなるのでここまでにします。