OmniAICreator/Qiita-1.07M huggingface dataset:
学生向け：これやるだけで発表が105%になる方法

# はじめに
これから学会発表を控えている人や企業に向けてプレゼンテーションをする人も多いと思います．
しかし，最初はどうすればいいかと分からない部分が多いと思います．
そういった人たちでも，自身の経験から，多少マシになる方法を伝授します！！
ちなみに**現在学生である自身の経験**を少し記載させていただきます．これらは就活におけるインターンシップや本選考を抜いたものとなっております．

* 学会発表経験：4回
* 他大学合同研究会：2回
* 企業先との合同研究発表：2回

こんな感じで，企業先とか他大学の教授など様々な人に向けてプレゼンや発表経験があります．なので，受けが良かったときもあれば，最初はダメダメといろいろ経験した自分だからこそ伝えられることがあると思うのでよかったら見ていってください！！

# 読むべき対象者
* 学生でプレゼン経験が浅い人
* 近いうちに学会に出場する or 予定の人
* 自身の発表内容に説得力がほしい人


# スライドのコツ
## データを用いて説得力アップ！
自分が伝えたいことに関連する資料や調査結果が存在していればできるだけ載せましょう！！
例えば，「近年では，○○という問題がある」⇒「だから私は××したい(した/行った)」
この○○の部分に関してデータが存在しているだけで，以下のメリットがあります．

* **視覚化によって相手に伝わりやすい**
* **文字だけのスライドだと疲れてくる**
⇒図があるだけで読み手の負担も削減
* **自身で感じているといった根拠のない主観的な評価出ないことを説得**
⇒他の人も同じように感じているといった客観性を持たせることが出来る
⇒この問題を解決することでの社会的有用性につながる
(みんなが困っているから解決出来たら社会に貢献！みたいなイメージ)

## グラフは見やすく
突然ですが，ここでクイズです(デデン！)
下の2つのグラフを見比べて，どこが違うか少し考えてみてください！！
また，皆さんはどっちの方が見やすいと感じますか❓

<img width="600" alt="bad.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727338/4dcaa4fd-909f-1fc1-7ed7-82e8ce47ec7f.png">
<img width="600" alt="good.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727338/c2951328-2693-df85-e84f-dfbcf1a2c2cb.png">


色々と突っ込みどころもあると思いますが，重要なポイントだけざっと紹介します！
### 基礎ポイント(ここだけは直そう)
* **グラフにタイトルを入れよう**
上のグラフが何のデータを表してるかが分かりづらいですよね！
一方で，下のグラフは，タイトルが入っているため，そのグラフ自体が何を示しているのかが一目でわかりますね！
また，発表のスライドにおいてグラフを頻繁に使う人ほど，どのデータを表しているのかが明確になって，相手にも伝わりやすくなると思います．

* **文字は基本的に大きく**
字が小さすぎて分からないことは，初心者が陥りがちな問題です，実際に，学会発表などでも，この事例は頻繁に見ます．
この場合だと，上のグラフは，x軸の数値が小さすぎて，分かりづらいですね！
数値はデータを可視化するうえでかなり重要な部分なので，出来るだけ大きくして，相手に伝わるようにしましょう！
ただし，大きくしすぎて，逆に重なってしまうことには注意しよう！
* **凡例を忘れずに**
凡例とは，右図の右上にある「東京・大阪」などがどのデータなのかを表現しているものです．なので，これがあるかな以下で，どのデータの説明をしているのかが一目瞭然ですね！

### 応用ポイント(みんなより一歩先へ)
* **軸のタイトルを詳細に**
左図のy軸の「金額」だと悪くはないのですが，何の**金額**か分からない可能性があります．
例えば，「金額」⇒**売上金額？** or **特売価格での売上金額？** or **仕入金額？**
みたいに状況によっては，いろいろ可能性が考えられますよね．
なので，どの**金額**なのかをしっかりと記載することで，相手にスムーズに伝わるでしょう！！
* **単位を付けよう**
こちらも意外とつけてない人も多いと思いますが，あった方が👍です．
例えば，左の金額と記載されているため，「円」だ！！ということは，分かると思います．
しかし，それが，**円** なのか **万円** なのか **億円** なのかによって，グラフの見方が大きく変わってしまう可能性があります．なので，細かいですが，具体的な単位を付けてあげることが出来れば，相手に誤解を与えずに正確な情報伝達が出来ると思います．


# プレゼン
## 発表時間は基本的にオーバーはダメ！！
意外と気にしない人も多いと思いますが，発表時間はオーバーしてはいけません．逆に早く終わる分には全然大丈夫なんですよ～
なので，少し自分が与えられているおおよその時間よりも少し短くを意識するのがいいと思います．
また，発表本番は緊張とかで意外と早口になったりもすると思うので，練習では，与えられた発表時間ピッタリぐらいでもいいかもですね！！

## 事前メモにこだわりすぎない
スライドの下にスライドで発表する用のメモを書く人も多いと思いますが，本番ではそれを一言一句読むのはやめたほうがいいと個人的には思います．

* **読んでる感が強まり，伝えている感が薄れる**
自分では意外と気が付かないですが，文字の羅列を読むのに必死になっている感が実際は結構出ています．身近な感じでいうと，ニュースキャスターみたいな感じですね～．あとは，発表時はできるだけ相手を見る(オンラインであれば正面のカメラを見る)ことが大事です．相手と向き合うこともコミュニケーションの一つなので，紙面ではなくできるだけ相手を見て話すためにも話す内容はできるだけ覚えていきましょう！

# まとめ

今回は，スライドと発表についてのちょっとしたコツを記載しました．最後にポイントだけまとめておきます！！

:::note info
**基礎として抑えよう😃**
* データを有効活用
* グラフにタイトルを入れる
* 文字は基本的に大きく
* 凡例を入れる

---

**もう一歩先へ🌟**
* グラフ軸のタイトルを詳細に
* 軸に単位をつける
:::

:::note warn
**ここだけは注意👀**
* 発表時間を意識しよう
* メモにこだわりすぎない
:::

それではこの辺で...🙋‍♂️
【SwiftUI】設定のカメラがOFFの場合に設定へ移動するアラート

## 前提
* iOS16以上


``` xxx.swift
import AVFoundation

struct XxxView: View {
    @State var showAlert = false;

    var body: some View {
        checkCamera()
        return ZStack(alignment: .bottom) {
          ...
        }
        .alert("カメラを使用できません", isPresented: $showAlert) {
            Button("Cancel") {}
            Button("設定") {
                guard let settingsURL = URL(string: UIApplication.openSettingsURLString ) else {
                    return
                }
                UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
            }
        } message: {
            Text("iOSの設定でカメラへのアクセスを許可してください。")
        }
    }
    
    func checkCamera() {
        let status = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)

        if status == AVAuthorizationStatus.authorized {
            // print("アクセス許可あり")
        } else if status == AVAuthorizationStatus.denied {
            // print("アクセス許可されていない")
            AVCaptureDevice.requestAccess(for: .video, completionHandler: { granted in
                if (granted == false) {
                    showAlert = true
                }
            })
        }
    }
}
```
【Jenkins】Credentialsの暗号を復元する方法

## Jenkins移行時のつまづきポイント、Credentials

Jenkinsを別サーバーに移行する際、一番忘れがちなのがCredentials。
再発行した方が早いかもしれないが、外部サービスと連携したAPIキーなどは再発行が面倒だったり、使いまわしている場合に他サービスに影響が出る場合もある。（そもそも使い回すのがどうかという議論はさておく）

**っていうか、移行前サーバーにあるデータなのにサービス元まで確認に行くのが面倒くさい**

## Credentialsは復元できない？

ふつうにJenkinsからCredentialsの内容を見に行くと、隠しテキスト化されてしまっていて閲覧ができない。
SSHから `/var/lib/jenkins/credentials.xml` を確認に行っても `{AQAAA...../.......}` のような暗号化された値しか閲覧できない。
(ちなみに、ブラウザで表示したCredentialsの更新画面のソースからもこれは取得できる)


```/var/lib/jenkins/credentials.xml
<java.util.concurrent.CopyOnWriteArrayList>
  <org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl plugin="plain-credentials">
    <scope>GLOBAL</scope>
    <id>HOGE-SECRET</id>
    <description>ほげほげ</description>
    <secret>{AQAAABAAAAAQ38QQY5Zxk6OzKUz7u5KZh+xa+W2WlKR/iQ254IxBREg=}</secret>
  </org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl>
</java.util.concurrent.CopyOnWriteArrayList>
```

パスワードのところで「要素を検証」するとすぐ上くらいに表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104999/fab8f404-42d0-59e1-6e62-afc851899e52.png)



## Jenkinsで暗号化しているならJenkinsの機能で復元できるんじゃないか？　・・・　できた！

調べたらありました。

Jenkinsの管理 → スクリプトコンソールより以下を実行

```java
println hudson.util.Secret.decrypt("{AQAAABAAAAAQ38QQY5Zxk6OzKUz7u5KZh+xa+W2WlKR/iQ254IxBREg=}")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104999/590f6fbb-b90e-9ed8-5ab4-a95d1172553b.png)

### 注意

暗号化キーがサーバーによって違うので、上記のコマンドを暗号化データを含めてコピーしただけだと結果は出ないので、各々差し替える必要がある。
（同様にcredentials.xmlの内容をサーバーを跨いでコピーしても動作しない）


## Jenkinsの管理権限があれば誰でもCredentialsは閲覧できてしまう

まぁ、「管理者」なんだから当然と言えば当然だけど・・・
ユーザーの権限管理は気をつけよう。

----

## 参考資料（というか該当部分を抜粋しただけ）

- Accessing and dumping Jenkins credentials
https://www.codurance.com/publications/2019/05/30/accessing-and-dumping-jenkins-credentials
poetryのpython version指定で沼った話

## 何が起きた?

pythonのrepositoryで別のpythonのrepositoryをsubmoduleで参照しておりました。

そして以下のような記述をしておりました。

```yaml:project-Aのpyproject.toml
[tool.poetry.dependencies]
python = ">=3.7.1, <3.11"
```

```yaml:project-B(submodule)のpyproject.toml
[tool.poetry.dependencies]
python = "^3.10"
```

project-Aでは3.7.1以上3.11未満のpythonバージョンを指定、project-Bでは3.10以上4.0.0未満のバージョンを指定しているので範囲内に両方を満たすバージョンがあるのでpoetryがよしなに解決してpython 3.10.xみたいなのを参照してくれるかと思っておりました。

しかし以下のエラーが出ました。

```
SolverProblemError

  The current project's Python requirement (>=3.7.1,<3.11) is not compatible with some of the required packages Python requirement:
    - project-B requires Python ^3.10, so it will not be satisfied for Python >=3.7.1,<3.10
  
  Because project-A depends on project-B (0.1.0) which requires Python ^3.10, version solving failed.

  at ~/.poetry/lib/poetry/puzzle/solver.py:241 in _solve
      237│             packages = result.packages
      238│         except OverrideNeeded as e:
      239│             return self.solve_in_compatibility_mode(e.overrides, use_latest=use_latest)
      240│         except SolveFailure as e:
    → 241│             raise SolverProblemError(e)
      242│ 
      243│         results = dict(
      244│             depth_first_search(
      245│                 PackageNode(self._package, packages), aggregate_package_nodes

  • Check your dependencies Python requirement: The Python requirement can be specified via the `python` or `markers` properties
    
    For project-B, a possible solution would be to set the `python` property to ">=3.10,<3.11"
```

エラーとしてはバージョン解決エラー(SolverProblemError)のようです。なぜでしょう？

> For project-B, a possible solution would be to set the `python` property to ">=3.10,<3.11"

と出ているのでproject-Bのpython versionを">=3.10,<3.11"にしてあげて、つまりproject-Aのpythonバージョン内にしてあげてと書いてあります。


## 結論

> poetry's version solving is fundamental different to other programs in that way, that it tries to find a major version of a package, that is compatible to all python versions, to which the current project is compatible, and not just the one you are currently using.

このissueに書いてある通りpoetryのversion解決は他のパッケージマネージャーと異なり、指定した全てのmajor versionでcompatible(互換性がある)必要があるそうです。

https://github.com/python-poetry/poetry/issues/2444#issuecomment-632471356


ですのでproject-Bのpython versionはproject-Aのpython versionに内包(project-A ⊂ project-Bの関係)されてないといけません。言い換えると全てのAのpython versionでBは動ける必要があるということです。

つまり今回のケースだと

```yaml:project-Aのpyproject.toml
[tool.poetry.dependencies]
python = ">=3.10.0, <3.11"
# package B: python = "^3.10"
```
にする必要があります。

逆にproject-B ⊂ project-Aでも動きません。

```yaml:project-Bのpyproject.toml
[tool.poetry.dependencies]
python = "3.10"
# package A: python = ">=3.7.1, <3.11"
```

この記事で誰かを沼から救えたら幸いです。
Red Hat OpenShift Developer SandboxでRed Hat OpenShift Data Scienceを使ってみる

# はじめに
Red Hat OpenShift Data ScienceはRed Hat OpenShiftのマネージド・クラウドサービスに対するアドオンです。データサイエンティストにサンドボックス環境を提供し、機械学習モデルの開発、トレーニング、テスト、およびデプロイが可能です。
今回は[前回](https://qiita.com/ynagashi/items/5b3a6eda057256bb707f "前回")ご紹介したRed Hat OpenShift Developer SandboxでRed Hat OpenShift Data Scienceを使用する方法をご紹介します。
Red Hat OpenShift Developer Sandboxにアクセスしたことが無い方は、[こちら](https://qiita.com/ynagashi/items/5b3a6eda057256bb707f "こちら")の記事を参考に、OpenShift Developer Sandboxにアクセスしてください。

[Red Hat OpenShift Data Science 公式ページ](https://www.redhat.com/ja/technologies/cloud-computing/openshift/openshift-data-science "Red Hat OpenShift Data Science 公式ページ")

#
まずはじめに、Red Hat OpenShift Developer Sandboxにアクセスし、パネルのアイコンをクリックします。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/394e4ee8-4637-aeb4-41eb-e1f158c93fd1.png)



「Red Hat OpenShift Data Science」を選択します。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/be54c507-b6b6-8f11-6e7c-01a48c9b4935.png)



今回はJupyterを使ってみたいと思いますので、Jupyterの「Launch application」をクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/fbe63ec1-ec63-bcf0-7d0f-e49667301e78.png)


Jupyterが起動します。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/ed6f584a-f646-6f8a-bac9-20b841cd7a21.png)


今回はGitからクローンして実行したいと思いますので、画面左側のGitのアイコンをクリックします。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/f92f52af-556b-86f9-8398-de06cf113859.png)


「Clone a Repository」をクリックします。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/fa9490f8-286b-ae3a-487d-2535ef278ff3.png)


URL↓を入力し、「CLONE」をクリックします。
https://github.com/takahi-i/mlbook
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/d5e72dc1-13e7-3841-92de-f0be14a89b52.png)


ファイルブラウザにクローンした「mlbook」が表示されます。
![FireShot Capture 041 - JupyterLab_ - jupyter-nb-ynagashi-rhods-notebooks.apps.sandbox.x8i5.p1.openshiftapps.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/bf58d32b-7786-f08f-3315-574bd5fe3042.png)


「mlbook」→「notebook」→「chapter01」と進んでいき、「機械学習の理解.ipynb」をクリックします。
すると「機械学習の理解.ipynb」がタブで開きます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/1a1bb400-f356-4373-5fd9-3d50d59f5121.png)


「!python -V」の部分にカーソルを合わせクリックし、上部の実行アイコンをクリックします。
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/70e799c6-6b20-0104-aa9b-4180568e41f7.jpeg)


実行結果が表示されます。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668052/a642787a-ba5e-d0b5-ee88-f29e3796a1e2.png)


このようにRed Hat OpenShift Data ScienceではOpenShift上で機械学習を実行することができます。
今回は一例としてJupyterをご紹介しました。

以上となります。
【パブリッシャー】UNIONクエリの結果をソートする方法

Sharperlightクエリビルダではユニオンクエリを作成できます。そしてクエリ結果は親クエリ、追加したユニオンクエリの順番に出力されます。
このように定義されている場合、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/205872e1-b70e-ab70-0210-b79e27492e0f.png)
戻ってくるデータセットの順番は、親クエリの出力、ユニオンクエリの定義された順番に応じた出力といった形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1586ff81-c046-fe37-9092-e581dc6b4c6d.png)
なので、それらをひとつのデータセットと見なし、ある列にソートをかけることはできません。
でもソートしたい場面に多く遭遇します。ではどうするかというと。。。
Sharperlightパブリッシャーで作成するレポートのクエリとしてユニオンクエリを作成します。それとは別に新たなレポートを作成し、そのレポートのクエリのデータソースとして、ユニオンクエリをもつレポートを使用するといった使い方をします。

ではここにユニオンクエリがあります。今回はカスタムデータ定義を利用し疑似データを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fb5ea578-2c26-0521-f54f-555f3372cb2b.png)
親クエリはコードが`TKO`という支店のデータセットを返してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/79203719-5a1e-5d66-51f7-650ec48bbf10.png)
ひとつだけ追加したユニオンクエリは、コードが`OSK`という支店のデータセットを返してきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b449176b-ff39-dc11-d585-a6873719df3e.png)
最終出力結果はこのようになっています。`グローバルコード`でソートをかけようとしても、データ全体に対してかけることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/28ead84b-425f-a6bf-b27a-8aa9b13f030d.png)
そこで、新たに別のレポートを準備します。そのレポートのクエリでユニオンクエリを使用します。
カスタム定義のデータセットで、`_Publisher={グループ名}.{コード}`という形式で（公開クエリ）レポートを呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a3e087a6-2058-3fd4-ce50-de65d9a06d4f.png)
全列を出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d8bf89df-38a5-0d8d-a7fa-3f38c2f1f56b.png)
出力列のオプションダイアログで、グローバルコード列にソートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6542a4a4-ef63-69e5-e744-c72eeb201141.png)
プレビューしてみます。どうですか？親クエリとユニオンクエリの結果がひとつのデータセットとして扱われています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/21620178-c2f9-f989-9c10-d81a20330758.png)
ユニオンクエリからのデータセットをひとつのデータセットとして扱う場合の方法は、これだけではなくカスタムテーブルを準備するといった方法等もあります。

では、失礼します。
Remove Image Background using Pythonを実験

## 環境構築
[Rembg](https://github.com/danielgatis/rembg)
インストール。
```
└─$ pip install rembg
```

pipの位置がいろいろだめだとエラーになったのでリンクを張って再挑戦
```
└─$ sudo ln -s ~/.local/bin/pip /usr/bin/pip
└─$ sudo ln -s /usr/bin/pip /usr/bin/pip3
└─$ sudo ln -s /usr/bin/pip /usr/bin/pip3.10

└─$ pip install rembg
```

## 確認
```
└─$ rembg --help
```
コマンドがみつかりません、エラーなので調べたらなんだかな場所にあったのでPATHを通した。
```
└─$ sudo find / -name rembg 2>/dev/null
$HOME/.local/lib/python3.10/site-packages/rembg
$HOME/.local/bin/rembg

└─$ cat ~/.bashrc
export PATH="$PATH:$HOME/.local/bin"
└─$ . ~/.bashrc
└─$ printenv | grep PATH
(OK)
```
もう一度確認。
```
└─$ rembg --help
Usage: rembg [OPTIONS] COMMAND [ARGS]...
Options:
  --version  Show the version and exit.
  --help     Show this message and exit.
Commands:
  i  for a file as input
  p  for a folder as input
  s  for a http server
```

## 背景削除実験開始
[Day 120 : Remove Image Background using Python](https://www.youtube.com/watch?v=RkdFkhfMK2k)
某ホテルのデザートビュッフェでの写真を試してみる。（ワクワク）
![cake.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/9d0db79f-a047-d993-2bfc-b2a9f2d273f2.jpeg)

実験開始。
```
└─$ rembg i cake.jpeg cake.png
Access denied with the following error:

        Too many users have viewed or downloaded this file recently. Please
        try accessing the file again later. If the file you are trying to
        access is particularly large or is shared with many people, it may
        take up to 24 hours to be able to view or download the file. If you
        still can't access a file after 24 hours, contact your domain
        administrator. 

You may still be able to access the file from the browser:

         https://drive.google.com/uc?id=1tCU5MM1LhRgGou5OpmpjBQbSrYIUoYab 
・・・
onnxruntime.capi.onnxruntime_pybind11_state.NoSuchFile: [ONNXRuntimeError] : 3 : NO_SUCHFILE : Load model from ・・・/.u2net/u2net.onnx failed:Load model ・・・/.u2net/u2net.onnx failed. File doesn't exist
```

ファイルがないらしい。
[こちらの記事「Remgbを使って画像から背景を削除してみた」](https://dev.classmethod.jp/articles/python-rembg/)を参考にエラーメッセージに表示されたモデルファイルを取得して指定された場所に配置する。

しかしwgetでもcurlでもダウンロードがうまくいかなかったので素直にブラウザーからダウンロードした。
https://drive.google.com/uc?id=1tCU5MM1LhRgGou5OpmpjBQbSrYIUoYab 

これを以下に配置。
```
└─$ ls ~/.u2net/
u2net.onnx
```

## 再挑戦
```
└─$ rembg i cake.jpeg cake.png
```

おお！
![cake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277081/fe32f916-b8cb-9168-ee07-ae34d09de283.png)
EC2にユーザーを追加する

以下のコマンドをec2-userで実行する。

```bash
# パスワード認証を有効にする
sudo vi /etc/ssh/sshd_config
------------------------------------
PasswordAuthentication no
↓
PasswordAuthentication yes
------------------------------------

# sshdサービスを再起動する
sudo service sshd restart

# ユーザーを追加
sudo useradd ユーザー名

# パスワードを設定
sudo passwd ユーザー名

# sudoを使えるように設定
sudo usermod -aG wheel ユーザー名
```
Google UXデザイン：競合分析を実行する

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">

# 題材

ファストフード・バーガー・レストランの競合分析を行うことにします。

クライアント(Burger Garden)は、現在のWebサイトがあまりビジネスにつながらないと感じており、Webサイトの再設計をあなたに手伝ってほしいと考えています。

なお、[最終的な分析結果はこちら][result]です。

[result]: https://docs.google.com/spreadsheets/d/161VBzpqjfF1X9hjp9E5TlbLXOuFrBS4KQsrQke8SZlk/template/preview

# ①ゴールを定義する

このプロジェクトはWebサイトの再設計であるため、目標は、

***<font color="MediumVioletRed">『各競合他社のWebサイトのユーザーエクスペリエンスを比較すること』</font>***　

です。

また、競合製品の評価に一貫した言葉を使うことで、より均一なフィードバックが得られ、競合製品を「採点」することができます。

|  評価  |  内容  |
| ---- | ---- |
|  Needs work  |  サイトは使い勝手が悪く、ユーザーのニーズを満たすことができていない。  |
|  Okay　  |  問題は抱えているが、何からの改善を行えば、ユーザーのニーズを満たすことができる。  |
|  Good  |  ユーザーのニーズを満たしているが、ユーザーに必要な情報を必ずしも簡単に提供できていない。  |
|  Outstanding  |  一貫性が感じられ、ユーザーのニーズを満たしているか、それ以上である。  |

# ②競合他社をリストアップする

企業またはチームに、直接および間接的な競合は誰かを尋ねます。

この情報を早期に入手することで、その企業が業界において、どのような位置づけにあるのかを知ることができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b72305af-93c2-22d0-724e-f8e64eae9f73.png" width="250">

# ③比較したい特定の要素を定義する

ここでは、次の要素に基づいて評価してみます。

|  要素  |  内容  |
| ---- | ---- |
|  First impression  |  ・ウェブサイトはレスポンシブであるか、つまりデバイス間でサイズが変更されているか？<br>・デザインは製品を引き立てているか？ウェブサイトをどう感じるか？  |
|  Interaction　  | ・ユーザーはどのような機能を利用することができますか？<br>・スクリーンリーダーを使用しているユーザーを含め、すべてのユーザーがアクセス可能なウェブサイトになっているか？<br>・英語を母国語としない人たちにもどの程度受け入れられやすいか？<br>・ユーザーがウェブサイト内のページをクリックする際に混乱しないか、ナビゲーションは明確か？  |
|  Visual design  |  ・すべてのセクションとページで同じように表示され、同じように感じられるか？<br>・ブランディングは、想定される利用者層にマッチしているか？<br>・画像やカラーパレットは印象に残りやすいか？  |
|  Content  |  ・企業のブランディングにマッチしているか？<br>・ユーザーは興味のある内容を見つけることができるか？  |

# ④調査を開始する

競合他社をそれぞれ確認しながらスプレッドシートに一行ずつ記入していきましょう。箇条書きのメモ、リンク、スクリーンショットなど、情報収集に役立つものなら何でもかまいません。

#### First impressions

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a87f34a5-c0b4-6e7b-d22e-bb263d213707.png" width="700">

#### Interaction

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a8cb63eb-479f-a539-2d71-346d6fbb3289.png" width="700">

#### Visual design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/028525bb-1956-faa8-b83b-92b39e7bb044.png" width="500">

#### Content

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/56f9b28b-1cb1-cda5-010f-16d9b85d62fc.png" width="600">

# ⑤報告書をまとめる

報告書に何を盛り込み、どのように調査結果を提示するかは、プロセスの最初に説明した監査のゴールによって異なります。

- 競合他社の利用者層を比較することにメインを置いたとすれば、数字や図表を用いた情報的なグラフィックをいくつか盛り込むとよい。
- ビジュアルデザインに重点を置くのであれば、競合他社のウェブサイトのスクリーンショットを掲載し、さまざまな部分を強調するとよい。

[報告書の書き方については、次回ご紹介します。][report]

[report]: https://qiita.com/mapami/items/de972cd3b58f5cc97261

# さいごに

競合分析を行うことは、新しい業界、新しいクライアント、最近の業界動向に関する情報を得ることで、ユーザー・エクスペリエンス・デザインに精通するための素晴らしい方法となります。

できれば、競合分析プロセスに時間をかけることで、今後のデザインを構築するための知識の基礎を得ることができます。
CDP 7.1.7 SP1 Installer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/a7949529-e6e2-90f2-6e7e-ad1f8ca23258.png)
CDP Private Cloud Base 7.1.7 SP1の場合は、
Cloudera Runtime 7.1.7-1.cdh7.1.7.p1000になります。
CDP Private Cloud Base 7.1.7 の場合は、
Cloudera Runtime 7.1.7-1.cdh7.1.7.p0です。
Power Appsの委任について

# 委任とは
委任という言葉が少しわかりづらいですが、つまり「任せる」という意味です。
一般的な「委任(delegation)」は「上司が部下に自分の仕事の一部を移管して任せる」ことです。
Power Appsにおける「委任」は「データベースの検索処理をデータベース側に任せる」ことを言います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cdc267c2-ea03-2c90-f1bf-463aeec44a4a.png)



委任が発生すると検索条件をSharepoint、Dataverseなどのデータベースに与えます。
その中で検索をかけさせて、その結果だけをアプリに受け渡すので、データが何万件あってもアプリの品質を損なうことなく検索をかけてくれます。

逆にデータソース側で検索をかけることができない場合、Power Appsのローカル上に全件データを取ってきてPower Appsのローカル上で検索をかけることになります。そうすると、アプリが重くなりますよね。

実はそれだけではなく、**Power Appsの制約として一度に持ってこれるデータは標準で500件、上限で2000件まで**と決まっています。
大きなデータソースに処理をかけた場合は、2001件目以上のデータが返ってこなくなります。
なので、大きなデータを扱う際はこの委任に気を付けなければいけません。

逆に、データ件数がそこまで多くない場合は気にしなくて大丈夫です。
例えば、先祖返り（ローカルデータと元データで変わってしまう現象）が発生するなどの例はありません。

回避する方法としては例えば、委任できるフィルターをかけて、次に委任できないフィルターをかけると2000件以上のデータを取ってくることもできます。


# Dataverseで委任可能な関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6dd46e30-96eb-af77-2246-5a38e3fe0df4.png)
# Sharepointで委任可能な関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ec1af028-e3d8-2b90-d825-1803c4cb0800.png)

## 参考
[キャンバス アプリでの委任について](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview)
Zoom Japan Developer Workshop 2022 - Engineer Day の収録動画を一挙公開！

:::note info
2022年の10月に開催した、Zoom Japan Developer Workshop 2022 - Engineer Dayの収録動画を一挙公開します。日本語で初めてZoomのAPIやSDKを詳しく解説しました。Zoomとの連携や、ビデオ通信の組込/実装に取り組まれている方の参考にあれば幸いです。感想やコメントもQiitaやTwitterでお寄せいただければと思います。
:::

![Developer Workshop 2022 Eng1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2123955/f7327036-078b-561b-f28f-a5f34a66dcd3.png)

* Zoom Japan Developer Workshop 2022 - Engineer Day
    * 2022年10月13日開催
    * ZoomのDevleoper Platformのを構成する、APIやSDKを実際に扱う際の手続きや実装について詳しく解説しています。必要に応じてそれぞれのセッションをご確認ください。
 
    *  Zoom API, Webhook, Chatbotの実装
        *  Zoom Developer Platformの基本となるAPIの実装。加えてWebhookとChatbotについて解説しています。
        * 収録動画への[リンク(Dropbox)](https://www.dropbox.com/s/o12b49n3wv98r7s/Engineer_Day_Session1.mp4?dl=0) 約120分
    * Zoom Meeting SDKの実装
        * Zoom MeetingとWebinarをアプリやウェブサイトに組み込むためのZoom Meeting SDKの実装について解説しています。
        * 収録動画への[リンク(Dropbox)](https://www.dropbox.com/s/gvlamqqvit0yb71/Engineer_Day_Session2.mp4?dl=0) 約90分
    * Zoom ISV契約の実装
        * Zoom MeetingやWebinarをプラットフォームとして提供するためのISVパートナープログラムに参加する場合の実装について解説しています。
        * 収録動画への[リンク(Dropbox)](https://www.dropbox.com/s/dcvkw2i7ri6rbsp/Engineer_Day_Session3.mp4?dl=0) 約30分
    * Zoom Video SDKの実装
        * UI/UXをフルにカスタマイズできるZoom Video SDKの実装について解説しています。なお、Zoom Video SDKは通常のZoom MeetingおよびWebinarとの相互接続はできません（互換性はありません）。
        * 収録動画への[リンク(Dropbox)](https://www.dropbox.com/s/gu2un4rj9mjjq2w/Engineer_Day_Session4.mp4?dl=0) 約60分

:::note info
 (参考情報)
* Zoom Japan Developer Workshop 2022 - Business Day
    * 2022年9月15日開催
    * ZoomのDevleoper Platformの概要と、APIやSDKを使う際のライセンスや料金について解説しています。ライセンスや契約についてはこちらの記事をぜひご確認ください。
    * https://qiita.com/kensano/items/554a4ad5725d8b2e6b7d
    * ビジネスに関しては、こちらのQiita Zineの下記記事もよろしければご覧ください。
        * [「Zoomの拡張機能！？シームレス連携が出来るAPIとSDKについて中の人に聞いてみた」](https://zine.qiita.com/interview/202205-zoom/)
:::

:::note warn
本収録動画の内容は2022年9月/10月時点のZoom Developer Platformの仕様に準拠していますので、ご視聴時の仕様と異なっている可能性があります。最新の情報は当社ウェブサイト（英語）でご確認ください。
https://marketplace.zoom.us/docs/guides/

QiitaのOraganizationページで日本語でも一部情報提供を行っています。ぜひこちらも併せてご確認ください。
https://qiita.com/organizations/zvc
:::
VueでページをリロードしてもVuexの状態を保持できる様にする

# はじめに
ログイン情報を保持したり、パスワードの有効期限が切れていたら更新するまで他のページに遷移させない、などなど、
Vuexを利用し始めると、一度はページのリロードや遷移でstateの値がリセットされる現象に頭を悩ませるのではないでしょうか。

少なくとも私は半日悩みました。

リロードをしても状態を保持するためには、何らかの方法でブラウザに保存する必要があります。
自前でCookieやlocalStorageに保存する処理を実装する事もできますが、ここは先人達に習い便利なパッケージ`vuex-persistedstate`を利用して楽をしたいと思います。
（Vuexの永続化、stateの永続化で調べると色々と出てきます）

なお、Vueのバージョンは3となります。

# vuex-persistedstate

https://github.com/robinvdvleuten/vuex-persistedstate

npmを使ってインストールします。

```console
npm install --save vuex-persistedstate
```

## Vuexの設定

今回、authモジュールとして認証関連のstoreを分ける事にしたので、メインのVuexファイルでvuex-persistedstateをプラグインとしてインポートする必要があります。
また、保持したいstateと保持したくないstateがあるので、pathsオプションで保持したいstateを明示的に指定したいと思います。
（保存先はデフォルトのlocalStorageとします）

```store/index.ts
import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'
import * as root from './root'
import * as auth from './modules/auth'

Vue.use(Vuex)

interface ModulesStates {
  auth: auth.State
}

export type RootState = root.State & ModulesStates

export default () =>
  new Vuex.Store({
    state: root.state() as any,
    getters: root.getters,
    mutations: root.mutations,
    actions: root.actions as any,
    modules: {
      [auth.name]: auth,
    },
    plugins: [createPersistedState({
      key: auth_info,
      paths: [
        'auth.isPasswordValid',
        'auth.isLoggedIn',
      ]
    })],
  })
```

## storeの設定
ログインの状態を保持する`isLoggedIn`というstateと、パスワードの状態を保持する`isPasswordValid`という二つのstateを用意しました。

```store/modules/auth/state.ts
export interface State {
  isLoggedIn: boolean
  isPasswordValid: boolean
}
export const state = (): State => ({
  isLoggedIn: false,
  isPasswordValid: true,
})
```

```store/modules/auth/mutations.ts
import { MutationTree } from 'vuex'
import { State } from '~/store/modules/auth/state'

export const mutations: MutationTree<State> = {
  setLoginState: (state: State, isLoggedIn: boolean) => {
    state.isLoggedIn = isLoggedIn
  },
  setPasswordState: (state: State, isPasswordValid: boolean) => {
    state.isPasswordValid = isPasswordValid
  },
}
```

```store/modules/auth/getters.ts
import { GetterTree } from 'vuex'
import { RootState } from '~/store'
import { State } from '~/store/modules/auth/state'

export const getters: GetterTree<State, RootState> = {
  isLoggedIn: (state: State) => state.isLoggedIn,
  isPasswordValid: (state: State) => state.isPasswordValid,
}
```

## storeの利用
準備が整ったので、実際にstateの値がlocalStorageに保存されているか確認します。
ログイン時に、下記の様にstateに値をセットします。

```login.ts
store.commit('auth/setLoginState', true)
store.commit('auth/setPasswordState', true)
```

Chromeの開発ツールでlocalStorageを確認すると、下記の様に値が保存されていることが確認できます。

| キー | 値 |
|:-:|:-:|
| auth_info | {"auth":{"isPasswordValid":true,"isLoggedIn":true}} |

# middlewareの実装

認証が必要な画面で共通して利用できる様に、ログイン画面やパスワード更新画面へのリダイレクト処理をミドルウェアに切り出しました。

```middleware/guard/auth.ts
import { Context } from '@nuxt/types'

export default function ({ store, redirect }: Context) {
  if (!store.getters['auth/isLoggedIn']) redirect('/login')
  if (!store.getters['auth/isPasswordValid']) redirect('/passwordUpdate')
}
```

# おわりに
実際にはAPI等のレスポンスに応じたアクセス制御を行うのですが、
APIを実行する前段階でのフロントエンド側の制御として参考にしていただければと思います。
28歳でエンジニアを目指してテックキャンプを受講した感想

## 数あるプログラミングスクールの中でテックキャンプを選んだ理由
テックキャンプでは現在（２０２２年１０月）１.短期集中スタイルと2.夜間、休日スタイルの二つの受講プランがあります。
短期集中スタイルは就業していない人向け、夜間、休日スタイルは働きながら学習したい人向けと分かれています。
自分は元々アパレル店員をしておりシフトが遅番が多く、仕事おわりに学習する時間がない、なるべく早く転職したかったので短期集中スタイルを選びました。

他社のプログラミングスクールは「仕事を続けながら休みの日や仕事おわりに学習する」という内容が多く最短でプログラミングを学びたい、学習時間を確保できない自分にはテックキャンプの短期集中スタイルが一番合っていました。
また専門実践教育給付金制度の対象にもなっているので受講料の負担が減るので金銭面の心配も少なく済みました。

## 受講してみて
テックキャンプでは「Ruby on Rails」というフレームワークをメインで使い、Ruby、HTML、CSS、JavaScript、AWSなど、アプリ開発に関する様々なことを学びます。
元々エンジエア、プラグラミングに興味を持った理由がアプリやECサイトを作ってみたいと思っていた自分にはぴったりな学習内容でした。

テックキャンプに通う前からProgateと言う学習サービスを使ってRuby、HTML、CSSを学習していましたが実際にテキストエディタ、ターミナルを使用してプログラミングを書くのはと感覚というか雰囲気が違うので未経験から始める、プログラミングを書くのに必要なものを全く知らなかった自分は通って正解だったなとも思いました。

自分が選んだ短期集中スタイルは約１０週間で基礎から応用までに必要な知識を学ぶ、一週間の目安の学習時間が５５時間だったのでかなりハードなスケジュールでした。
ただ最初はこの学習時間が2ヶ月近くも続くのかと思いましたが2週間もすれば慣れました。
1日のタイムスケジュールも決まっていますし、学習が進みプログラミングの知識がついてくれば処理を完成させる達成感、楽しさを感じられるようになってきます。

逆にこの達成感、楽しさを感じられない、スケジュールについてこれない人は短期集中スタイルに向いてないかと思います。
基礎→応用→発展→最終課題の順番でカリキュラムは進んでいきますが基本的には自己学習スタイルになりますのでタイムスケジュールは決まっていますが自分でやる気、モチベーションを上げて行かないと途中で挫折すると思います。

## プログラミング未経験ならスクール入った方が良い
実際にプログラミングスクールに通ってみて受講して正解だったなと思いました。
大学等でプログラミングを触ってみたことがある人はまだしも未経験者が独学で学ぶのは相当キツイと思います。テックキャンプのカリキュラムは自分はわかりやすいなと思いましたし、本当に分からないことがあればオンラインで講師に何回でも質問できます（質問できる時間帯は限られていますが）。
独学者が挫折する多くの理由は質問できる環境がないことにあると言われているので質問したらすぐに答えてくれる、サポートしてくれる講師がいるのはかなり大きいと思います。
それに書籍や参考書通りに進めても実践的な部分まで到達するには時間がかかりますし、実際に現場で必要な知識がどこなのかもわかりにくいです。

## まとめ
これからエンジニアを目指そう、プログラミングスクールに通おうと思っている方にはおすすめです。
未経験からエンジニア転職までの基礎知識をつけるための環境は整っていますし学習終了後もキャリアアドバイザーが転職成功をサポートしてくれます。
受講料はかなりお金がかかりますが専門実践教育給付金制度を活用すればかなり出費を抑えることができますのでうまく活用してください。

以上になります。
モデル駆動型アプリのフォームの種類まとめ

# フォームの種類
モデル駆動型アプリを作る際、フォームが何種類か選べますがこれらの違いはなんでしょう

モデル駆動型アプリの編集画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/4f352091-ea2e-4524-164a-3ea739aecc1f.png)

Dataverseテーブルの詳細画面＞フォームの詳細画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a2cb6f23-6eb9-a3e7-8293-ddc00c1c53d4.png)

フォームの種類としては4種類です。
- メインフォーム
- 簡易表示フォーム（クイックビューフォーム）
- カードフォーム
- 簡易作成フォーム

この中でデフォルトで用意されてるのがメインフォーム・簡易表示フォーム・カードフォームですね。
簡易作成フォームは有効化の設定が必要です。
この４種類をご紹介します。

## メインフォーム
一番スタンダードなフォーム。ビュー（一覧画面）から一行クリックしたときに表示される詳細画面です。
そのテーブルをモデル駆動型アプリに追加した時にデフォルトで表示されるのがメインフォームなので、
基本はこれをカスタマイズしておけば大丈夫です。
（例）販売注文テーブルのメインフォームは販売注文テーブルのビューで一行クリックすると表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/dc3742f3-6132-d306-dcc3-60b686638b67.png)

メインフォームは、アクセス権を操作することができます。
[フォームのアクセス権限の設定](https://qiita.com/skuramoto/items/628ac9ea412eb34b63c0)

## 簡易表示フォーム
簡易表示フォームは、メインフォーム内に表示される**関連テーブルのフォーム**です。
メインフォーム内の検索列によって参照される行の追加データを表示することができます。
メインフォームを離れることなく、関連するテーブルのデータを表示できるのが便利です。

例）販売注文テーブルに関連づく製品テーブルのフォームを同じ画面に表示させたい！
注文販売テーブルの「製品」列（検索列）に関連づく製品テーブルの１行分が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/34610901-a02e-4442-a4a6-26834547c391.png)

[メインフォームに簡易表示フォームを追加する方法](https://qiita.com/skuramoto/items/64ea6e1a1a27be020f50)


## カードフォーム
カードフォームは、モデル駆動型アプリのビュー（一覧画面）的な用途で使われます。
コンパクト形式で情報を表示できるので、モバイルデバイスに適してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0765bd52-9aa9-12b0-7640-e46e97fdbf0f.png)

[カードフォームの作成方法](https://qiita.com/skuramoto/items/f0dd218885fb9d6f3bf8)
[ビューにカードフォームを追加する方法](https://qiita.com/skuramoto/items/5a86135d5fdd1c48c61e)


## 簡易作成フォーム
ビュー（一覧画面）で右横にスライド表示されて、データ編集ができる形式のフォームです。こちらは有効化されていないと使えないです。
メインフォームと比べると使えるコンポーネントは少ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/20f2e317-a5f9-4661-5220-6d0316327ae9.png)

[簡易作成フォームを有効化する方法](https://qiita.com/skuramoto/items/d8f3f9df94fae0c68bd7)
[簡易作成フォームを作る](https://qiita.com/skuramoto/items/57664b577dbab513c050)


また、親テーブルのフォームのサブグリッドコンポーネントでデータ追加を行う際にも、この簡易作成フォームが表示されます。その為、画面遷移せずその場で、関連付けを行いながら子テーブルにデータを追加することができ便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ee5a261a-9086-c7ac-65a4-1d0c99a46096.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/761f989e-2578-cfc8-cf99-e3b0e6be412c.png)



# まとめ

いろんな種類のフォームがあるので、いろいろためして
その時の目的にあったデータ入力・詳細表示方法でアプリを作ってみてください！

https://qiita.com/skuramoto/items/64ea6e1a1a27be020f50

https://qiita.com/skuramoto/items/f0dd218885fb9d6f3bf8

https://qiita.com/skuramoto/items/5a86135d5fdd1c48c61e

https://qiita.com/skuramoto/items/d8f3f9df94fae0c68bd7

https://qiita.com/skuramoto/items/57664b577dbab513c050
AWS Cloud Practitioner 試験学習記録

# はじめに
AWS Cloud Practitioner 試験に挑戦します。
使用教材と実際に学習していくときに感じた感想を記録していきます。

2022年10月31日に受験予定です。

# 使用教材
- [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー ](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403)
- [図解即戦力 Amazon Web Servicesのしくみと技術がこれ1冊でしっかりわかる教科書](https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Amazon-Web-Services%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B0%8F%E7%AC%A0%E5%8E%9F/dp/4297108895/ref=pd_lpo_2?pd_rd_i=4297108895&psc=1)
- [AWS Cloud Practitioner Essentials](https://login.us-east-1.auth.skillbuilder.aws/login?scope=openid%20email%20profile&response_type=code&client_id=7ci5c0bl3n2646khir5nfa6ash&identity_provider=&redirect_uri=https://explore.skillbuilder.aws/manage/v1/openidconnect/code)
- [【2022年版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）](https://www.udemy.com/course/aws-4260/#reviews)

# 学習スケジュール
勉強時間は1日4時間を目安に設定しています。
## 1日目
- 参考書通読
- AWS Cloud Practitioner Essentials 受講
## 2日目
- AWS Cloud Practitioner Essentials 受講
- 模擬試験問題集 実施
## 3日目
- 模擬試験問題集 実施
## 4日目
- 模擬試験問題集 実施
## 5日目
- 模擬試験問題集 実施
## 6日目
- 模擬試験問題集 実施

# おわりに
何か共有することがあれば、随時更新していきます。
Oracle Database19c OUI（Oracle Universal Installer）でのインストール

# はじめに
Oacle初心者がとりあえずOracleを動かしてみようという設定方法になります。

#### 構成オプション
今回は「ソフトウェアのみの設定」を選択します。
「単一インスタンス・・・」ではリスナーの設定部分が省略されていて、エンタープライズマネージャ起動に手間が掛かるためです。
![oui1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/a2909bb7-3a53-f0f9-7b26-2757f888e6ad.png)

#### データベース・インストール
単一インスタンスを選択します。（RACは今回不要です）
![oui2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/9739681f-4dde-a87b-4a2b-5e1c995da0e8.png)

#### インストール・タイプ
Enterprise Editionを選択します。
![oui3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/48d5540e-1fb2-478f-08aa-a6bede435c7b.png)

#### インストール場所
デフォルト値で良いです。
![oui4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/c166f9e0-ff73-4e8a-b293-c7171f251206.png)

#### インベントリの作成
デフォルト値で良いです。
![oui5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/5404ee15-5ea1-7ce8-9540-c73eb208ff6a.png)

#### 権限のあるオペレーティング・システム・グループ
デフォルト値で良いです。
![oui6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/38bbe6ca-6f57-2869-7070-acc85801cde4.png)

#### rootスクリプトの実行構成
「構成スクリプトを自動的に実行」にチェックを入れ、rootのパスワードを設定します。
![oui7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/92e8e511-c890-1fba-d1fe-62daf98f3fb7.png)

#### 前提条件チェックの実行
終わるまで待ちます。
![oui8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/ae4a2491-c9f6-dd8d-ede8-39477d30399f.png)
「すべて無視」にチェックを入れて「次へ」をクリックします。
![oui9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/a880223a-dd57-b35f-5968-5a8ca7deb012.png)
「はい」をクリックします。
![oui10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/e563b55a-48e7-7374-bcb7-1901e116ac68.png)
#### サマリー
「インストール」をクリックします。
![oui11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/fffde5ec-c6bc-78af-4649-25b6dfd8d322.png)

#### 製品のインストール
終了するまで待ちます。
![oui12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/a6543461-2330-e2fe-be77-464b34e746ec.png)
「はい」をクリックします。
![oui13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/79129851-6f94-e60b-7529-614542d80a0c.png)
「閉じる」をクリックします。
![oui14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/735aa8bd-eec5-7d61-2122-88f876ccf38e.png)

以上で終了です。
【AWS】Azure ADを紐づけたCognito ユーザプールでMFAを行う

# 前回記事（本記事の前提）

https://qiita.com/kei1-dev/items/8e5afd0d14807e86d45f

# きっかけ
前回記事の続きでログインにMFAつけた場合の挙動の検証が必要になった。

# Cognitoで設定できる？
- 前回設定したユーザプールのMFA設定部分ではグレーアウト
    - 公式サイトで新規作成時のみサポートしている旨が記載
![スクリーンショット 2022-10-24 13.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/49ccff3a-2bc0-85a7-e79d-56c750ae06b1.png)

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-settings-mfa.html

# Azure ADでMFAを追加する
## 注意点
- Azure Active Directory Premium P2を求められ、設定してます。

## Azure ADの設定実施
- セキュリティ>条件付きアクセスで、新しいポリシーボタンを押下する。
![スクリーンショット 2022-10-24 13.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/68eaa145-32d1-2589-a4b1-852ebcc06518.png)

- 条件付きアクセスを設定するにあたり、セキュリティの規定値群を無効にする必要があるので、無効化する。
    - 上記のポリシー設定画面でも以下の注意画面が表示される。
![スクリーンショット 2022-10-24 11.42.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/00ce31e4-a82d-795b-29da-609f177349a0.png)
![スクリーンショット 2022-10-24 11.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/999025a4-d144-03a0-8b2f-25d0c4de412b.png)

- ポリシー設定で以下内容を設定し、保存ボタンを押下する。
    - 名前: 任意
    - 割り当て：　MFAを設定したいユーザやグループを設定
    - クラウド アプリまたは操作: Cognito設定をしたアプリ
    - アクセス制御:
        - アクセス権の付与にチェック
            - 多要素認証を要求する
    - ポリシーの有効化: オン
![スクリーンショット 2022-10-24 11.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/143c43a3-6ec2-47bb-4b88-4cbd39fb4f05.png)
![スクリーンショット 2022-10-24 11.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/c610b8f2-34f0-a43a-a4e7-3ec7316c8169.png)

## 動作確認
- Cognito HostedUIからログイン試行を行う。
    - 詳細情報が必要という画面が現れればMFA設定はできている
![スクリーンショット 2022-10-24 13.04.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/e81497c6-3e2b-167b-4219-232c86870f2f.png)
![スクリーンショット 2022-10-24 13.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/2142900d-2530-c784-00b9-9722afcf2916.png)
![スクリーンショット 2022-10-24 13.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/9d01ba54-5f9e-6864-9559-c77b78204b2a.png)
![スクリーンショット 2022-10-24 13.07.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/c2b1e7ec-dda3-88bb-d192-dc5462f2aa6e.png)

- MS Authenticatorを設定し、再度ログイン試行を行う。
    - MS Authenticatorでサインイン要求を承認し、アプリ画面が現れることを確認する。
![スクリーンショット 2022-10-24 14.00.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/df13b71c-782f-282a-727b-b1e4fb1d1b9f.png)
![スクリーンショット 2022-10-24 14.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/bedbc2e9-8805-eadc-527e-debc08f7f8db.png)

# 参考サイト

https://learn.microsoft.com/ja-jp/azure/active-directory/authentication/tutorial-enable-azure-mfa
簡易作成フォームを作る

基本的にはメインフォームの編集と同じですが、ちょっと特徴があります。
まず有効化しないと作ることができないので、簡易作成フォームを有効化しましょう

https://qiita.com/skuramoto/items/d8f3f9df94fae0c68bd7

# 作成手順
まずほかのフォームの種類はデフォルトで一個用意されてますが、簡易作成フォームはないので、作るところからやりましょう。

テーブルの詳細画面の[フォーム]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d367dc41-9ce3-968f-cad7-37808f26f6e6.png)

新しいフォームから[簡易作成フォーム]を選択すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8f015f72-bd17-871f-b51e-e601a0d0d4f3.png)

簡易作成フォームの編集画面が開きます。
テーブル列は、メインフォームのように**関連テーブルは選択できません**。
また、もともと３つのセクションが表示されてますが、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5f8fbcd1-b7a3-3fa7-78b5-14b0260f01f8.png)

コンポーネント見てみると追加でセクションを置くことはできないです。（もちろんタブも）全体的なコンポーネントの種類も少ないですね。
次のコントロールは簡易作成フォームに追加できません:
サブグリッド、簡易表示フォーム、Web リソース、iFrame、メモ、Bing 地図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cb5fce1d-2ff6-851e-1131-3e9d71a0685c.png" width=70%>

もしこのセクション３つもいらない場合は非表示にすることで消せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1aa37a5c-24f6-acc4-77cf-7ce769033a32.png)

以下のようなフォームを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e2fce504-ec78-a269-74f5-29c02b8a7ad2.png)

# 簡易作成フォームをモデル駆動型アプリに追加
モデル駆動型アプリの編集画面にて
[ページ]＞対象のテーブルのフォーム＞[フォームの追加]＞簡易作成フォームを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/a9aed6be-335d-7d27-4a92-c0f934b3e71c.png)

# 簡易作成フォームの使い方
モデル駆動型アプリを開いて、右上の[＋]をクリックし、作成した簡易作成フォームを選択
（すぐに反映されないかもしれないのでその場合は待つ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ff9a4b9e-19c3-4114-dc13-df12fa66bb1a.png)

簡易作成フォームが表示され、ここでデータ入力を行うことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/cbcaf5ea-1175-5c0e-f71d-b4e58cc2d9d2.png)
GitHub ActionsでNode.js 12のサポートが終了します

## 先に結論だけ

2022年9月22日から、GitHub ActionsでNode.js v12の非推奨化プロセスが始まりました。Node.js v12に依存する`actions/checkout@v2`, `actions/setup-node@v2`をv3に移行しましょう。

## はじめに

この記事は、GitHub ActionsでのNode.js v12サポート終了と、その対処法を共有するためのものです。

### 対象とする読者

- すでにGitHub Actionsを使っている

## サポート終了の告知

いつも通りGitHubで作業をしていると、見慣れない警告がActionsタブに表示されていました。

![](https://www.evernote.com/l/AAlE00XMoR5H3paA6xy77yXo4I2L8Tuv8scB/image.png)

> build (14.x)
> Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: actions/checkout, actions/setup-node, actions/setup-node, actions/checkout
> Node.js 12 のアクションは非推奨です。詳しくは https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/ をご覧ください。 次のアクションを Node.js 16 を使用するように更新してください: actions/checkout, actions/setup-node

### 公式Blogでの告知

警告メッセージに表記されているBlog記事を参照します。

https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/

GitHub Actionsを実行している環境で、Node.js v12のサポートが終了するのでv16に移行するようにという告知がありました。

## 必要な対処

Blog記事を参考に、対処方法を確認します。

### GitHub公式のactionsをv3に更新する

[actions/checkout](https://github.com/actions/checkout), [actions/setup-node](https://github.com/actions/setup-node)など内部的にNode.js v12を使うアクションを最新バージョンに更新します。ワークフローがどのアクションに依存しているかは、GitHubのActionsタブ内のサマリーに表示されています。

v2と指定されているアクションをv3に更新します。

_▼.github/workflows/あなたのワークフロー.yml_

```yml
    steps:
      - uses: actions/checkout@v3
                              ^^^
```

### actions/setup-node with node-version "16"

`actions/setup-node`で利用するNode.jsのバージョンを16以上に設定します。

_▼.github/workflows/あなたのワークフロー.yml_

```yml
      - name: Use Node.js
        uses: actions/setup-node@v3
        with:
          node-version: "16"
                        ^^^^
```

[マトリックス戦略](https://docs.github.com/ja/actions/using-jobs/using-a-matrix-for-your-jobs)を使っている箇所も、Node.js v16以上に変更します。

_▼.github/workflows/あなたのワークフロー.yml_

```yml
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [ 16.x, 18.x ]
                        ^^^^^^^^^^
```

---

以上、ありがとうございました。
I2Sのマスタークロックの安定度

周波数カウンター(TR5822)を使ってGPIBでデータを拾ってみました。

自作のMac OS Xのアプリの[さるのこしかけ](http://hp.vector.co.jp/authors/VA009278/monkey/)を使いました。GPIBはFT2232を使ったモジュールでMacにUSBで接続しています

SN11122

![20221024-143033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8e6d3870-115d-7d62-1800-42ba11010d56.png)

PCM2706

![20221024-131545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bb10585a-34f3-11c4-41ea-840962dc8832.png)

PIC32MX

![20221024-141156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/86f1ad91-93aa-084e-ad24-41392668a418.png)

AR9341

![20221024-131330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/28356d80-3b6e-429e-c3eb-9ec00fe14154.png)

CP2114は低すぎてグラフになりませんでした。

PIC32MXのグラフがひどいように見えますが、マイクロチップのテクニカルノート(AN1422)に「サンプリングレートが48 kHz のデータストリームの変動を±0.2%に収めるには、参照クロック出力を12,263,424 ～12,312,576 Hzのレンジ内に調整する必要があります。」とあるので、間違いではなさそうです。

すべてmpg123でWBGOを再生しているところをとりました。

AR9341の直だしI2SはPCM2706よりちょっと安定度が低いように見えますが、周波数は48Kの256fsの12.2880MHzに近いです。

PCM2706はFOXのTCXOの12Mを付けてます。

USBなI2Sはマスタークロックが安定していても、USBのアイソクロナス転送のクロックも影響するので、一概に評価できません。

久しぶりに、さるのこしかけ使ってみて、使い方完全に忘れていました。

GPIB ControlのウインドウでOpen->IFC->DCLしてチャンネル設定してSDCしてF0をTalkすると周波数が拾えるようになります。
情報セキュリティ対策

# マルウェア対策
## ウイルスの予防
### 修正プログラム（パッチ）の実行
OSやアプリケーションソフトのセキュリティホールを悪用されないように、メーカから提供される修正プログラムを実行しておく。

# セキュリティ技術評価
### デジタルフォレンジックス
犯罪捜査などを行う際、パソコンやスマートフォンなどに残されている電子記録を収集・解析し、証拠とすること。証拠データの証明には```ハッシュ値```を利用する。
　
### 耐タンパ性
システムの内部構造や記憶しているデータにおける```解析困難度を示す指標```。
例えば、ICカードに記憶されているデータであれば、盗み出そうとする行為に対する耐性の度合い。

# セキュリティ製品・サービス
### SIEM(シーム：　Security Information and Event Management)
```統合的```なログ管理システム。
ログを```一元管理しリアルタイム```に分析を行うことで、```異常を早期発見```して警告を発することができる。

### IDS(intrusion Detection System)
IDS（侵入検知システム)は、ネットワーク上のパケットやコンピュータ内部の挙動を監視して不正な侵入を検知する。

### IPS(intrusion Prevention System)
IPS(侵入防止システム）は検知と同時に防止を行う（接続を遮断）。
また攻撃を定義した検出パターンにより、さまざまな攻撃に対応できる。

### MDM(Mobile Device Management)
スマートフォンやタブレットなどの```モバイル端末管理ツール```。
利用状況やバージョン管理、機能やアプリの利用制限、パスワードや紛失時の漏洩対策に対応できる。　

# IoTのセキュリティ
不正アクセスによる盗撮や盗聴被害のほか、マルウェア感染やIoTネットワーク全体への侵入などが考えられる。またIoTデバイスは管理者から離れたところに設置されるため、デバイス自体の盗難対策も必要となる。
主に次のような対策方法がある。
* IoTネットワークの接続機器が```把握できるように、全体構成を明確```にしておく。
* 導入時には、```初期設定のログイン情報を必ず変更```しておく。
* 機器自体にセキュリティ機能がない場合、```ホストや中継機において対策```を行う。
* IPアドレスやポート番号によって```接続先を制限```する。
* ユーザ認証、メッセージ認証によりなりすましや改ざん、情報漏洩を防止する。
* ```データの通信路やデータそのものを暗号化```する。
* 耐タンパ性の向上手段として、筐体の開封感知による自動消去、内部構造やデータ解析を困難にするといった対策をとる。また遠隔操作による機能のロック、データの消去を可能にしておく。


#### 筐体とは？
筐体とは、```機械を収める箱```を指します。身近なところではスマートフォンやパソコンのケース、大きなものでは自動車や飛行機の外板など、幅広い意味で使われます。英語では、「ケース（Case）」「ハウジング（Housing）」「エンクロージャー（Enclosure）」とも呼ばれます。
出典 https://www.keyence.co.jp/ss/products/marker/housing-design/basic/type.jsp#:~:text=%E6%A8%B9%E8%84%82%E7%AD%90%E4%BD%93-,%E7%AD%90%E4%BD%93%E3%81%A8%E3%81%AF,%EF%BC%89%E3%80%8D%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

# 関連記事
https://qiita.com/masatom86650860/items/efceb390945efb48644e#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9%E3%81%AE%E7%A8%AE%E9%A1%9E

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
UnrealEngine GamePlayTagを使おう！

# はじめに
enumは便利だけど255までしか定義できないし、型の縛りがあるから使いづらいな～
FNameは自由度高いけど入力ミスが心配だなー

なんて方におすすめなのがGamePlayTagです！
何を今更、という感じですが昔からUEを使ってる方とかは存在を知らないかもしれないので紹介しちゃいます。
自分は知りませんでしたｗ

# GamePlayTagとは
- 文字列のリストを作っておき、使う時にそのリストから選択することができるタグです。
- タグは階層構造をもたせることができます

状態異常などのステート、アクターの検索、アニメーションのIdなどいろんなものに使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/61efaa29-679f-3eb6-a778-776936a29af0.png)

使う時はこんな感じでリストから選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/8add9737-7931-84f8-220f-fca89fa890ba.png)

# ネットワークで通信する場合のコストは？
デフォルトだと文字列で送られてしまうのでここにチェックを入れましょう。
こうするとindexで送ってくれるようになります。ただしサーバーとクライアントでタグのリストが同じでないとずれてしまうのでバージョンを合わせる等注意が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778561/cbc7207d-faf9-fd1a-396a-9335e540b196.png)

詳細は[こちら](https://inks.blue/ac/2019-GameplayTag/Day18-ReplicateGameplayTag.html)

# C++から使う場合のおすすめのやり方

C++の場合は文字列でTagを取得します。"Animation.Idle"としても良いのですがTagをリファクタリングする時に大変なのと
インテリセンスで選べたほうが間違いないのでこのように定義しておくと良いでしょう。

```cpp
UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_ABC, TEXT("A.B.C"));

UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_AnimationIdle, TEXT("Animation.Idle"));
UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_AnimationRun, TEXT("Animation.Run"));

UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_StatePoison, TEXT("State.Poison"));
UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_StateSleep, TEXT("State.Sleep"));
```

# 高度なゲームプレイタグって？
編集できるユーザーを制限できるようです。


# おすすめGamePlayTagの紹介ページ
すばらしい記事がたくさんあるので自分が説明するよりこちらのサイトを見たほうが良いです。

GamePlayTagについてなんと19回にも分けてとても詳しく紹介されています。
ここを読めばほぼ全て分かります。おすすめ。

https://qiita.com/advent-calendar/2019/ue4-gameplaytag

リストが巨大化して検索が大変になってくると欲しくなるフィルタリングのやり方について紹介されています。

https://historia.co.jp/archives/17266/

以上