OmniAICreator/Qiita-1.07M huggingface dataset:
【TypeScript】Cypressのインストール手順

### はじめに
TypeScriptでCypressをインストールした時に初期セットアップで苦戦したので手順を解説します
詳しくは公式ドキュメントに記載されてあります

https://docs.cypress.io/guides/getting-started/installing-cypress#What-you-ll-learn

### 目次
・インストール
・アプリを開く
・初期設定
・テストを始める
・TypeScriptでの注意点

### インストール
まずはnpmまたはyarnを使ってCypressをインストールします

    npm install cypress --save-dev
    yarn add cypress --dev

### アプリを開く
インストールが完了したら、下記コマンドを叩くことでアプリが立ち上がります

    npx cypress open
    yarn run cypress open

### 初期設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/55963796-0044-f05e-3713-3e219babf57d.png)

上記のようにアプリが立ち上がったら、まずテストの種類を選択します
今回はE2E Testingを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/e9dbd6ba-ea6a-c22e-3198-5a77fb624917.png)

次にファイル構成を選択します
今回はそのまま実行を押して次に進みます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/6a12b8a3-e698-c021-2d92-ebf2c17450a8.png)

続いて起動するブラウザを選択します
今回はChromeを選択します

以上でインストールは完了です

プロジェクト内にcypressフォルダが生成されていると思います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/83370beb-ea54-c7ee-5793-39ab63df2fec.png)


### テストを始める
アプリを立ち上げ、Chromeを起動したら、最初のテストファイルを作成します
Create new empty specを選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/d20e2091-d849-8209-0287-de9266b911f5.png)

最初のテストファイル名称が表示されます
そのままCrete Specを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/ea9df22e-8149-0fff-199c-670ce1ffb36c.png)

確認ダイアログが表示されますのでそのままOkay run the specを押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/99249625-b583-1565-1f98-34f9a6987655.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/ee27d33a-00a5-be98-6c23-36ad4b670464.png)

最初のテストファイルが作成されました

### TypeScriptでの注意点
作成されたテストファイルをエディタで確認すると、
TypeScriptの場合、describeやitでエラーが発生しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/8ff7099f-0392-786a-17a4-4e1748f258c7.png)

エラーを解消するために、cypressフォルダ直下にtsconfig.jsonファイルを作成します
それでもエラーが解消されない場合、エディターを再起動してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2741747/4cd211e0-f3b4-da2b-751a-087cd4f89844.png)

詳しくは公式ドキュメントを確認してください

https://docs.cypress.io/guides/tooling/typescript-support?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=sc#Install-TypeScript

以上でインストールと初期セットアップは完了です
【図解】プログラムが読み込まれる流れのざっくりまとめ~メモリとCPUの連携~

プログラムが読み込まれる流れについてまとめてみました。
自分が書いたソースコードがどのように読み込まれ実行されるのか、ざっくりとした図でまとめています。
本記事はあくまで、ざっくりと大きな流れをイメージすることが目的ですので、レジスタの種類やメモリの細かい動作までは記述していません。

# 図解
![CPUとメモリの関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345720/ba78d8c1-57f7-d4a1-b7b6-ed0056fcc048.png)

# 流れ

### 1.コンパイル
コンパイルとは人が書いたコード（ソースコード）をPCが読める言語（ネイティブコード）に変換することです。
普段私たちが書いているプログラミング言語は人間が扱い易いように人間用に用意された言語です。人間には理解できますがPCには理解できません。
反対にPCが読める言語、つまりネイティブコードは二進数で表現されているため、異次元の天才エンジニア以外には基本的に理解できないです。
この隔たりを解消するのがコンパイラです。
まずはこのコンパイラを通してコンパイルを行いソースコードをネイティブコードへ変換することが始まりです。
ちなみにコンパイラは言語、CPU、OSごとに専用のコンパイラが必要になります。

### 2.メモリで各アドレスに命令・データを格納
メモリとはコードに書かれている命令やデータを一時的に格納しておくものです。
私たちが書いているプログラムは結局、PCに対しての命令ですが、それがネイティブコードに変換され、メモリに格納されます。

#### アドレス

メモリに格納された命令・データの場所を示すものです。CPUはこのアドレスを指定して命令・データの読み書きをします。
アドレスの実態は素子（0か1かだけを表現できるピンのようなものだとイメージすれば良い）で、素子1つで1bitです（0か1かだけを表現するため）。
これらが8つ集まり（つまり8bitで）1つのアドレスを表現します。

### 3.CPUがメモリから命令・データを読み出す
具体的にはCPUの制御装置部分がメモリから命令・データを読み出します。メモリはただ命令・データを格納しておく場所であり、命令の処理（要は演算）はCPUが行います。

### 4.レジスタが制御装置から命令・データを読み出し
レジスタはCPUの中にある記憶領域です。レジスタには色々と種類があり、それぞれ役割が異なるのですが、ざっくりとした流れだけ理解できれば良いのでここでは解説しません。
レジスタは制御装置からデータを読み出し、プログラムの流れを管理するため、実行中のプログラムの情報を記録したり、直前の実行結果を保管したり、演算に使う値を格納したりします。

### 5.演算装置で演算をする

CPUというとこのイメージが強いと思いますが、演算装置はレジスタに保管された値を参照しつつ、演算を行います。
CPUが頭使っているんだ！とイメージしておけば良いと思います。

### 6.出力

演算結果に応じて、制御装置が出力を行います。
これでやっと、私たちが書いたコードが意味のある形に出力されるということです。

# 終わりに

ざっくりですが、自分が書いたコードがどのような流れで動いているか？をイメージすることは重要だと思ったのでまとめさせていただきました。
【Java初心者向け②】インスタンスの作成と実行

## javaのインスタンスについて理解する
Javaはコンパイル言語のため、実行の前にコンパイルが必要になります。
コンパイル方法が分からない方は下記でコンパイル方法を学習してください。

https://qiita.com/kousueke/items/31f12740c912afafe4c5

## 環境
- Windows10,11
- Java 19.0.1

## 流れ
- 今回使用するプログラムの概要
- 用語説明
- クラスの作成
- インスタンス作成
- インスタンス実行
- コード全体

### 今回使用するプログラムの概要
今回はスポーツを題材にしたプログラムを作成していきます。
処理としては、クラスに定義したメソッド（処理）を用いて、競技名を出力するものになります。

### 用語説明
#### オブジェクト指向
そもそもですが、Javaはオブジェクト指向の言語です。
オブジェクト指向とは
オブジェクト（部品となる物）を作成し、それらのオブジェクトを組み合わせて、プログラム行う言語になります。
また、これから説明するインスタンス化はオブジェクト指向の言語において必須となる工程になります。

#### クラス・インスタンス・インスタンス化について
クラスとは設計図にあたるものであり、クラスを元にインスタンス（オブジェクト）を作成します。
インスタンス化（オブジェクト化）とは、クラスを元にインスタンス（オブジェクト）を作成することを言います。

#### 要約
- クラス＝設計図
- インスタンス（オブジェクト）＝部品
- インスタンス化（オブジェクト化）＝設計図を元に部品を作成すること

## クラスの作成
それではまず、設計図となるクラスを作成します。
ファイル名「Test.java」を作成してください。

クラスは下記２つの要素で構成されます。
- フィールド　クラスブロック内に宣言された変数（データ）のこと
- メソッド　クラスで行われる処理のこと
今回の場合、クラス名、フィールド名、メソッド名は下記になります。
クラス名：Sport
フィールド名：name
メソッド名：getname

```
class Sport {
    // フィールド（またはメンバー変数、フィールド変数、インスタンス変数）
    String name;

    //メソッド
    public void getname() {
        System.out.println("競技名は" + this.name + "です");
    }
}
```
上記のクラスを元にインスタンスの作成をしていきます。


## インスタンス作成
作成したクラスをもとに、インスタンスを作成します。
インスタンスの作成は、「new演算子」を使って下記のように記述します。
```
クラス名 インスタンス名 = new クラス名();
```
今回の場合は下記がクラス名とインスタンス名です。
クラス名：Sport
インスタンス名：soccer

```
public class Test {
    public static void main(String[] args) {
        Sport soccer = new Sport();
    }
}
```
## インスタンスの実行
インスタンスの実行には、フィールド（変数）nameへ値の代入と、メソッドを利用するための記述が必要になります。
#### フィールド（変数）nameに値を代入
フィールド（変数）に値を代入する記載は下記になります。
```
インスタンス名.フィールド（変数）名 = 代入する値;
```
今回の場合、インスタンス名とフィールド（変数）名は下記になります。
インスタンス名：soccer
フィールド（変数）名；:name
代入する値：サッカー

```
public class Test {
    public static void main(String[] args) {
        Sport soccer = new Sport();
        soccer.name = "サッカー"; //追記
    }
}
```

#### メソッドを利用するための記述
最後にクラスで定義した「getnameメソッド」を利用するための記述をします。

クラス定義した通り、getnameメソッドの処理の内容は、変数（name）を利用した出力処理です。
メソッドを利用するには下記のように記載します。
```
インスタンス名.メソッド名();
```
今回の場合、インスタンス名とメソッド名は下記になります。
インスタンス名：soccer
メソッド名：getname
```
public class Test {
    public static void main(String[] args) {
        Sport soccer = new Sport();
        soccer.name = "サッカー"; 
        soccer.getname(); //追記
    }
}
```
コンパイルを実施し、下記の出力が出来ていれば成功です。
```
競技名はサッカーです
```


## コード全体
上記すべてを記載したコードの全体は下記になります。
また、下記は複数のインスタンスを作成した場合のコードも追記した内容になっています。
```
//クラスの定義//

class Sport {
    //フィールド
    String name;

    //メソッド
    public void getname() {
        System.out.println("競技名は" + this.name + "です");
    }
}


// インスタンス化

public class Test3 {
    public static void main(String[] args) {
        Sport soccer = new Sport();
        soccer.name = "サッカー"; //インスタンス変数nameにサッカーを代入
        soccer.getname(); //getnameメソッドを使用

        Sport baseball = new Sport();
        baseball.name = "野球"; //インスタンス変数nameに野球を代入
        baseball.getname(); //getnameメソッドを使用

        Sport basketball = new Sport();
        basketball.name = "バスケットボール"; //インスタンス変数nameにバスケットボールを代入
        basketball.getname(); //getnameメソッドを使用
    }
}
```
Renovateと自動テストを前提としたTerraformのバージョン制約戦略

# 背景

terraformでは[mavenやrubygemsなどと同様のバージョン制約構文](https://developer.hashicorp.com/terraform/language/expressions/version-constraints)が使えます。
モジュールやproviderのバージョンはこの構文により柔軟なバージョン指定ができます。

Renovateはこのバージョン指定を解釈して柔軟にバージョンアップのPRを作ってくれます(偉い!)。
具体的には

- `~> X.Y` という書き方の場合はその範囲内で最新バージョンにするPRと、 メジャーバージョン(X部分)を上げるPRを別で作成
- `>= X.Y` という書き方の場合はメジャーバージョンアップとマイナーバージョンアップも区別せずPRを作成

といった器用なことをしてくれます([そもそもの `~>` と `>=` の挙動の違いについてはこちらを参照]([Pessimistic](https://guides.rubygems.org/patterns/#pessimistic-version-constraint)))。

このRenovateにGitHub Actionsによる `terraform plan` 自動実行などを組み合わせるとバージョンアップがほぼ自動になるため非常に便利です。

# 課題

RenovateとGitHub Actionsによりモジュールとプロバイダーの自動バージョンアップを使う前提の場合、どのようにバージョン指定を書くべきでしょうか。

# 2023/07/10追記

数ヶ月前、renovate botはバージョン指定が `>=` などでも `.terraform.lock.hcl` を更新してくれるようになりました。
なので、今では以下の `=` や `~>` ではなく `>=` を使うべきです。 renovatebotの改良に感謝！

# 提案

- モジュールは `= X.Y.Z` または `X.Y.Z` [^1]
- プロバイダは `~> X.Y`

で書きましょう。

[^1]: 両方とも意味は同じ

## モジュール を `=` で書くべき理由

[「【Terraform】moduleのアンチパターンとそれに対するベストプラクティス5選」の「アンチパターン5. モジュールのバージョンを最低バージョンで指定してしまう」](https://qiita.com/bigwheel/items/2b420183639416b5c6bb#%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B35-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E6%9C%80%E4%BD%8E%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86)が理由です。

ちなみにこれを普通にやるとバージョンアップが煩雑になるのですが、renovateによりそこも自動化されるためこのプラクティスが非常に実践しやすくなります。

## プロバイダ を `~>` で書く意味

プロバイダはモジュールと違いロックファイルが今ではありますので `=` で指定する必要はありません。
なので `>=` と `~>` の比較になりますが、  `~>` が良いと思います。

terraformは概ねsemantic versioningを推奨しています([moduleのバージョニングで推奨している例](https://developer.hashicorp.com/terraform/language/expressions/version-constraints#module-versions))。そのためterraform本体やprovider自体もsemantic versioningベースのものがほとんどです。

そのため、 バージョンX.Y.ZのX部分が変わるときはプロバイダに非互換の変更が入るときです。
もし `>=` の方式で書いていた場合、 `terraform init -upgrade` でプロバイダをアップグレードすると互換性のないプロバイダにアップグレードされて `terraform plan` が壊れる可能性があります。
まだroot moduleでの宣言ならば良いですが、これを配布しているchild moduleのrequired_versionなどで書いてしまうとそれを参照しているすべてのroot moduleでも問題が発生します。
意味論的にも `>=` は互換性が壊れる可能性のある未来のメジャーバージョンアップ後も動作大丈夫ですよ、という意味になり辻褄が合いません。

`~>` の方式で書いた場合、メジャーバージョンアップの際にversion.tfファイルの書き換えが必要になってバージョンキャッチアップが先延ばしになる問題がありますが、renovateを使っていればこれも自動化・低コスト化できるのでその問題も解決できます。

# まとめ

面倒なバージョンアップをスマートに支援してくれるRenovateバンザイ！

# Sponsor

この記事はSpeee社内での知見を元にSpeeeの業務時間を使用して書かれました。
[雑記] 認証 と 認可

# きっかけ

認証系機能の要件を整理する際、「認証」と「認可」をひっくるめて「認証」と表現する人がいて、少なからず混乱を生んだということがありました。
その際、説明のために 認証 と 認可 の違いを改めて調べたので、自分の理解を覚書として書き連ねます。

# 認証 と 認可 の違い

先述の話題では「ログイン認証」の要件として、大きく分けて以下の2点が挙げられていました。

* ID、パスワードを用いたユーザーの特定
* ユーザーが利用可能な機能の選定(メインメニューのボタン表示/非表示)

結論としては、前者が「認証」で後者が「認可」となるのですが、これらが「ログイン認証」としてひとくくりに話されていたために「ユーザーが利用可能な機能を認証する」と言った発言が飛び交うことになりました。

## 認証(Authentication) : 本人確認

認証とは、システムであればアクセスしてきた者が誰であるかを特定することを指します。
IDやパスワードと言った情報を元に、システムに登録された特定のユーザーとアクセスしてきた者を対応付ける機能が代表的です。

## 認可(Authorization) : 権限確認

認可とは、アクセスしてきた者に対して権限を確認することを指します。
システムであれば、特定の機能を対象者が利用できるかどうかや、特定のデータに対してのアクセス権限を判断したりします。

認可そのものはアクセスしてきた者が誰であるかを特定する必要は無く(つまり、認証を前提としない)、あくまで権限の有無を判断することを指します。
実際には特定のユーザーに対して権限の有無を判断するケースも多いため、ここが認証と認可を混同しやすい要因かもしれません。


# 認証 と 認可 の例

理解を促す為に、現実社会における 認証 と 認可 の例をいくつか挙げていきます。

## 認証 の例

本人確認を行う手段として、以下のようなものが挙げられます。

* 運転免許証、マイナンバーカード
* 住民票の写し、戸籍抄本
* 名刺、名札

これらの媒体に記載された情報(名前、住所、顔写真 等)を頼りに、所持した者が誰であるかを特定することが出来ます。
ただし、公的機関が発行したものであるか、顔写真があるか 等によって「どの程度、持ち主が本人であると断定できるか/信用できるか」については差があるので、利用場面によっては求められるものが変わることがあります。

## 認可 の例

権限を確認する手段としては、以下のようなものが挙げられます。

* 鍵 (住宅の鍵 等)
* 乗車券 (鉄道のきっぷ/特急券 等)

鍵は住宅のような施錠された区画に入室すること、乗車券は駅の改札内や車両に立ち入る権限の確認として機能します。
認可 においては本人を特定する必要が無いため、以下のような事例が成り立ちます。

* 鍵を所持していれば、住宅の持ち主でなくても入室できる。
* 乗車券は購入した本人でなくても、乗車券を現に所持している人に対して鉄道等に乗車する権利が与えられる。

## 認証 と 認可 を同時に行う場合の例

認証 と 認可 はその一方だけではなく、両方を同時に行うものもあり、以下のようなものが挙げられます。

* 運転免許証
  本人を確認する手段として用いられ、同時に自動車等を運転する権限が与えられる。
* パスポート
  本人を確認する手段として用いられ、同時に国外へ渡航する権限が与えられる。

また、認可 を受ける為に 認証 が前提となっているものもあります。

* 航空券
  航空券は券面に記載された本人に限定して、旅客機へ搭乗する権限が与えられる。
  (一般的な鉄道の乗車券と異なり、譲渡が認められない)


## その他の 認証、認可 に関わる手続きの例

以下のように、その媒体が持つ機能の一部を用いて認可を行う事例があります。

* 運転免許証 に記載された 生年月日 によって年齢を確認し、20歳以上の場合に酒類・タバコ等を購入する権限を与える(認可)。
* 名札 に書かれた店舗名を確認し、その店舗の従業員であることを確認する(本人特定までは行わない限定的な認証)。

また、認可においては与えられる権限に条件を設けられる場合や、別の媒体での認可を併せて求められる場合、あるいは認可を行う担当者によって追加の判断が行われる場合があり、以下のような事例が挙げられます。

* 自動車の運転免許証を持っていれば自動車を運転する権限が与えられるが、「眼鏡等」の条件が設けられている場合は眼鏡やコンタクトレンズを装着しない状態ではその権限が与えられない。
* 自動車の運転免許証において、運転が認められる車種が限定されている(例えば大型トラックの運転が認められない場合がある)。
* パスポートを所持していれば国外への渡航は認められるが、特定の国への渡航においては別途正当なビザを所持していることが求められる。
* パスポートを所持している場合でも、入国審査官の判断によっては入国を認められない場合がある。

# まとめ

認証 と 認可 は同時に行なわれたり、複合的な判断が行われることがある為、混同されることがあります。
それぞれ目的が異なるのできちんと整理していきたいと思う所存です。

改めて一言でまとめると、以下の通りです。

* **認証** : 本人確認。対象者が誰であるかを特定する手続き
* **認可** : 権限確認。対象者が権限を持っているか確認する手続き
【Xcode】実機でビルドできなくなった

# エラー
![スクリーンショット 2022-10-30 20.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/392b2ec6-c6d7-5fa8-46a1-a2c0324019e2.png)
```
This operation can fail if the version of the OS on the device is incompatible with the installed version of Xcode. You may also need to restart your Mac and device in order to correctly detect compatibility.
```

# 原因
サポートされていないバージョン

# 確認方法
![スクリーンショット 2022-10-30 20.42.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ef29622d-92e6-50c9-fdb5-553a9ad6e391.png)
ここのパスは人によって違うかもしれないです。
AppStoreからXcodeをインストールしている人は「Xcode-14.0.0.app」ここが「Xcode.app」かもしれません
```:ターミナル
cd /Applications/Xcode-14.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
```
```:ターミナル
ls
```
これがサポートされているバージョンらしいです
```
11.0	11.3	12.1	12.4	13.2	13.5	14.0	14.3	15.0	15.5
11.1	11.4	12.2	13.0	13.3	13.6	14.1	14.4	15.2	15.6
11.2	12.0	12.3	13.1	13.4	13.7	14.2	14.5	15.4	16.0
```

# 解決方法(仮)
下記のリンクから対応するバージョンをインストールする

https://github.com/filsv/iOSDeviceSupport

詳しいやり方は[こちら](https://www.fuwamaki.com/article/345)に記載されています

しかし、15.7はありませんでした笑

# おわり
どうすればいいのか、、、
困りました
文系出身エンジニアが応用情報技術者試験に合格した勉強法

R4年度 春期の応用情報技術者試験に合格したので、今更ながら勉強方法をまとめたいと思います。
![DB6E16B5-AFEA-4DF1-9438-8E31E6560F1C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951763/9d93bb5e-c3d5-4b9c-1bc9-c75cbba34df4.jpeg)
午前・午後ともに8割程度得点できました。

## 受験時の状況
- IT実務歴4年ほど(ネットワークが主)
- 文系出身
- 基本情報 なし(受けてない)
- CCNP、AWS SAAなどのベンダ資格取得済

## 使用した教材
- 応用情報技術者　合格教本
- 応用情報技術者試験ドットコム　過去問道場

## 勉強のスケジュール
- 合格教本をさらっと一周読む(１〜2月)
- 応用情報技術者試験ドットコム過去問道場で過去問を解く(2〜3月)
- 復習(4月)

1〜2月は1日1時間程度、勉強したりしなかったりでゆったり進め、3月頃からは1日1〜3時間ほどコンスタントに勉強しました。また過去問道場の量が多いので、上記以外にも日々の隙間時間を利用して解きまくりました。

## 午前の対策
過去問道場で、午前問題を5年分(計10回分)実施
→問題に出てきた知識を合格教本やネットで確認

を繰り返しました。

年度をまたいで同じような問題が出るため、ある程度の問題量をこなしていくと知識というより暗記で解けてしまうことも多くなります。そのくらい過去問をやっておけば合格ラインは取れると思います。

また、(特に文系は)あの分厚い合格教本を全ページ同じ熱量でやり込もうとすると時間も気力も足りないので、過去問で出た範囲を中心に固めていくのが効率的な対策になるかと思います。

## 午後の対策
以下に絞って対策しました。
 - 情報セキュリティ
 - 経営戦略
 - ネットワーク
 - プロジェクトマネジメント
 - サービスマネジメント
 - システム監査

午後問題は選択式で、情報セキュリティは必須、それ以外に4つ選択が必要です。少し多めに情報セキュリティ+5分野を対策しました。
文系出身なのでマネジメント系を多めに選択。またネットワークは実業務でやっていたので選択しました。

対策としては、
- 午後問題の過去問を各分野2〜3年分(4〜6回分)実施
- 午後問題で対策する分野については、過去問道場の午前問題を全て実施(単語が問われる問題の対策)

をやりました。

午後問題は長い問題文と記述問題が厄介で、最後は集中力との戦いになります。
そのため過去問演習から時間を測って解くのをお勧めします。私は1分野につき20分以内に解くようにしていました。
(試験時間と大問数で割ると、実際はもう少し時間にゆとりはあると思います)

## 受験当日の感想
午前問題については、過去問と同じような知識が問われることが多く、問題によっては過去問がそのまま出たりもしました。なので対策としては過去問をやり込むに尽きると感じました。

午後問題については、時間を短めに計って演習していたこともあり、集中が切れたり時間が足りないということはありませんでした。
ただ、毎年得点の稼ぎどころであるシステム監査が難化するという事象に遭遇しました…。結果としてはそれなりに得点できてはいたのですが、運ゲー感は否めません。この対策としては、「落ち着いて解く」しかないかと思います…。

## 次の目標
高度情報を目指します。
システムアーキテクト、プロジェクトマネジメント、ITストラテジストは取りたいなと思っています。
合格できたら、またQiitaに記事を書きたいと思います。
ネットワークの変更を実施するお話

# はじめに

最近の流行病で弊社もリモートワークを導入
ただ、急ぎのこともあって、社内のとあるセグメントと同一だった。

色々あって、ここと同じは嫌だよねえということで変更を実施することに。

また、NW機器はほぼ触ったことないので、暖かく見守って頂ければと。

ざっくり流れはこんな感じです。
- 構成
- L3
- ルータ
- 接続確認
- 最後に

# 構成

セレスでリモートワークをする際の、
ネットワークの構成はざっくり下記になりますので、それぞれに変更点を加えていきます。

端末　⇄ （インターネット）　⇄　ルータ　⇄ L3 ⇄ 社内リソースへ

# L3

L3はVLANを利用しているので、その設定をします。
VLANはポートとタグがあるけど、ポートVLANです。

telnetでログインしたら下記コマンドで編集モードに入ります。
```
system-view
```

VLANの設定を実施します。
既にあるVLANの値と被らないように値を決めてください。

```
vlan <設定したいVLANの値を入力>
 description # VPNSeg-Vlan #

quit
```

上記で作成したVLANの値とポートを紐づけます。
このポートはVLANいくつ。的なやつです。
今回は複数ポートでリンクアグリゲーションをする...等の設定は入れておりません。
必要であれば、その設定を入れてください。

```
interface gigabitethernet <設定したいポートナンバー>
　　port access vlan <登録したVLANの値>

quit
```

ポートには1つのVLANの値しか設定出来ませんので、
既に登録がある場合は、下記コマンドで削除をしてから、上記コマンドを実施してください。
```
interface gigabitethernet <設定したいポートナンバー>
　　undo port access vlan <消したいVLANの値>

quit
```


L3でルーティングを実施する必要があるため、VLANインターフェースの設定をします。
機器によっては、SVI。
割り当てたいセグメントの書式は、`IPアドレス サブネットマスク`（`192.168.0.0 255.255.255.0`のような）です。
ルーティングのルールに関しては、既にルールを作成しているので、それも割り当てます。

```
interface Vlan-interface<登録したVLANの値>
　　description ## VPN-Seg ##
　　ip address <割り当てたいセグメントを記載>
　　ip policy-based-route <ルーティング先のルールを記載>

quit
```

最後に保存します。
```
save
```

上記をすることにより、
端末のゲートウェイにL3のIPを設定すれば、ルーティング可能となります。

設定に関しては、下記のようになっており、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490993/da9b78c8-eb37-51ae-1ce7-e4dfea4c47c2.png)
`system-view`で編集者モードに入り、下記コマンドでそれぞれのポートやVLANインターフェースに対して設定を行うイメージです。
（終わったら`quit`で抜ける）
- interface gigabitethernet
- interface Vlan-interface

全体的な設定をするのであれば、system-view後に設定する。のような感じです。

# ルータ

ルータに関しては、画像入れると環境を記載してしまうことになるので、ざっくりと。。。
ウィザードを利用して、VPNの設定（IPの割当はL3のVLanインターフェースで設定した範囲）を行い、ゲートウェイをL3のIPに設定しました。

# 接続確認

問題なければVPN接続実施後、社内のサーバやファイルサーバ等のリソースにアクセスすることが可能になります。
アクセス出来ない。ということがあれば、ルータでポートを閉じてたりしているので、確認しましょう。

# 最後に

L3の設定をしているときに、接続確認を行うため端末とL3を繋げてpingで確認していたのですが、
どんだけL3に設定しても、繋がらない事象が発生しました。

結論、WindowsのFWのルールでICMP返さない設定になってました。　
みんな検証する時はWindowsのFWはオフ。もしくはICMPは許可にしような！
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">

# ユーザーフロートとは

UXデザイナーは、リサーチによって得られた情報を使って、ユーザーがデザインされた製品に接する際に必要とするニーズを特定するのです。このプロセスの概要を説明するために、私たちはユーザーフローを作成します。

***<font color="MediumVioletRed">『アプリやウェブサイトで典型的なユーザーが取る経路のことで、ユーザーは最初から最後までタスクを完了すること』</font>***

UXデザイナーは、アプリの画面をデザインする前に、ユーザーがアプリ内をどのように効率的に移動できるかを理解する必要があるのです。

- ユーザーはアプリ内で<font color="Teal">どのような行動</font>をとるのか？
- ユーザーは<font color="Teal">どのような判断</font>を下すのか？
- アクションや意思決定の後、ユーザーは<font color="Teal">どのような画面</font>を体験するのか？


# ユーザーフローを描く

UXデザイナーは、ユーザーフローのアウトラインを、円、長方形、菱形、矢印のついた線などの一般的な図形で描くことがよくあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1b035dcf-cace-0ddc-1206-542cfc270759.png" width="600">

<dl>
  <dt>Action</dt>
  <dd>ユーザーが製品設計の中で行うアクションを円で表現しています。つまり、あるタスクを最初から最後まで完了させるために必要なステップを円で表現しているのです。</dd>
  <dt>Screen</dt>
  <dd>ユーザーがタスクを完了するまでに体験するデジタル製品の画面を長方形で表現したものです。</dd>
  <dt>Decision</dt>
  <dd>菱形は、ユーザーフローにおいて、ユーザーが質問し、意思決定しなければならないポイントを表します。ユーザーが決断することで、フローが進むか、フローが戻るかのどちらかになります。</dd>
  <dt>User flow direction</dt>
  <dd>矢印の付いた線は、すべてを結びつけ、情報の流れを表示します。実線はユーザーフローを進む方向、点線は戻る方向または前のページに戻る方向を示します。
</dd>
</dl>

# サンプル

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6e3e3e3e-f317-9bb2-3ec4-af8cc95f15da.png" width="800">

ユーザーフローを作成する際には、作成したプロブレムステートメントを参照し、ユーザーのニーズに確実に応えられるようなデザインを心がけましょう。もちろん、プロブレムステートメントが変われば、次のようにユーザーフローも変わる可能性があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/ecf74b21-5aa3-e53c-fdc8-c361db32f21d.png" width="800">

# 既存製品の場合

上記は、ゼロからアプリを設計し、まったく新しいユーザーフローを作り上げています。しかし、現実の世界では、ユーザーフローが確立されている既存の製品に取り組むこともあるでしょう。

既存製品の場合、ユーザーフローの作成・更新は煩雑になりがちです。しかし、徹底的なユーザーリサーチを行えば、ユーザーの使い方に合わせた画面の再編成、拡張、縮小が可能です。つまり、

***<font color="MediumVioletRed">『新規製品であれ、既存製品であれ、ユーザーとそのニーズを最優先して設計することが重要である』</font>***

# さいごに

ユーザーのニーズを理解した上でデザインすることで、より優れたデザイナーとなり、ユーザーを製品に引きつけることができるのです。ユーザーフローを作ることは、確かな一歩です。

UXデザイナーとして、あなたの最高のツールの1つは、ユーザーがあなたの製品でタスクを完了するために取る経路の概要を示すことができることです。
VBAにおけるクラスモジュールのパブリックメンバーに配列を利用する


VBAはExcelにての利用時、Rangeなど配列を利用したいケースが多い
しかしインスタンス変数に配列を利用しようとするとエラーが発生した。

その時の一時的対処のメモ

## エラー内容
VBAにおいて以下のようなクラスモジュールを作成しようとする
```html:SampleClass
Option Explicit

Public numbers() As Long

```


以下のようなエラーになる
![コンパイルエラー2022-10-31 164756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331199/92519a63-2892-ab80-dca6-330acdd63f1d.png "コンパイルエラー:
定数、固定長文字列、配列、ユーザー定義型および Declareステートメントは、
オブジェクトモジュールのパブリックメンバーとしては使用できません。")


## 対応策
Variant型で変数宣言する
その後、Array型の値を代入すると配列として利用できる

```html:SampleClass
Option Explicit
Public numbers As Variant

Private Sub Class_Initialize()
    numbers = Array()
End Sub
```
### 実行例
```html:SampleModule
Public Sub Test()
    
    Dim number As Variant
    Dim cls As SampleClass
    
    Set cls = New SampleClass
    cls.numbers = Array(1,2,3)

    For Each number In cls.numbers
        Debug.Print number
    Next
    

End Sub
```
```html:出力結果
 1 
 2 
 3 
```
VRRPをかんたんに説明してみる

# 勉強前の理解度
* 何回かググった気がする
* ネットワークをうまい感じにするプロトコル

# VRRPの概要
　**デフォルトゲートウェイを冗長化して、耐障害性を高めるための仕組みのこと**。通常時に稼働しているルーター(マスタールーター)に障害が発生した場合、待機しているルーター(バックアップルーター)に自動的に切り替わる。
　機能面ではCiscoのHSRPと似ているが、HSRPが同一メーカーのルーターのみで運用可能である点に対し、VRRPは異なるメーカーのルーター間でも運用可能である。1998年にRFC2338で定義された。

# VRRPの仕組み
#### マスタールーターの広告
　**マスタールーターは稼働中、マルチキャストでバックアップルーターにVRRPパケット(広告)を毎秒送り続ける**ことで、正常に稼働していることを伝えている。しかしバックアップルーターがVRRPパケットを3秒間(3回分)受信できなかった場合、マスタールーターに障害が発生したと判断して、処理を切り替える。
　処理を切り替える際には、GARPを使用する。(仮想ルーター(後述)のIPアドレスとMACアドレスを送信元IPアドレスと送信元MACアドレスに設定してARPを送信することで、各ノードの学習テーブルを更新する)

#### VRRPプライオリティ
　**ルーターの優先度のこと**。0~255の値をとる。最もプライオリティ値の高いルーターがマスタールーターとなる。マスタールーターのプライオリティ値は255で、バックアップルーターのプライオリティ値は1~254である。障害が発生してマスタールーターからバックアップルーターになったルーターのプライオリティ値は0になる。

#### 仮想ルーター
　マスタールーターとバックアップルーターで構成される。仮想IPアドレスと仮想MACアドレスをもち、これらが実際の通信に使用される。
　各ルーターはVRRPグループに分けられ、その識別子としてVRIDをもつ。そしてマスタールーターとなる場合にはVRIDを仮想MACアドレスに埋め込み、通信に使用する。


# 参考
[マスタリングTCP/IP](https://www.ohmsha.co.jp/tbc/text_series_0201.htm)
[Virtual Router Redundancy Protocol - Wikipedia](https://ja.wikipedia.org/wiki/Virtual_Router_Redundancy_Protocol)
[VRRPとは？仕組みや動作例・VRRPパケットの構成についても解説](https://www.fenet.jp/infla/column/network/vrrp%E3%81%A8%E3%81%AF%EF%BC%9F%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%957%E3%81%A4%EF%BD%9C%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AE%E6%B3%A8%E6%84%8F/)
[VRRPとは](https://www.infraexpert.com/study/fhrpz06.html)
無理せずQiitaで情報発信をするには？

# 目次
* [はじめに](#はじめに)
* [自分がしている方法(3ステップ)](#自分がしている方法(3ステップ))
* [効果的な理由について](#効果的な理由について)
* [まとめ](#まとめ)
* [参考文献](#参考文献)

# はじめに
* 情報発信をしたい。
* でも続かない。だから発信できない。
* でも、最近出来ている。
* なぜなら、やり方を変えたからだ。
* 今日はその方法を伝えたい。


# 自分がしている方法(3ステップ)
たったの3ステップで完了する。
* **パソコンを開く**
* **Qiitaを開く**
* **5分間執筆する**

以上だ。

# 効果的な理由について
理由は２つだ。**ハードルが低い、合図がある**。
* ハードルが低い
    * 1日1記事書かないといけないってなるとプレッシャーにならない？
* 合図がある。
    * パソコンを開いたら、Qiitaの記事を書く。
    * 「パソコンを開いたら、」っていう合図がある。

# まとめ
* 要するに、**記事を書くことを習慣化できたから**Qiitaで情報発信ができている。
* だから、**習慣を身に着つけよう**。
* **参考文献に、習慣を身に着けるのにおすすめな書籍を紹介**している。
* ぜひ読んでほしい。

# 参考文献

https://www.amazon.co.jp/%E5%B0%8F%E3%81%95%E3%81%AA%E7%BF%92%E6%85%A3-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%B4%E3%83%B3%E3%83%BB%E3%82%AC%E3%82%A4%E3%82%BA/dp/4478065772/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=18QNFS8NT38JM&keywords=%E5%B0%8F%E3%81%95%E3%81%AA%E7%BF%92%E6%85%A3&qid=1667206238&qu=eyJxc2MiOiIyLjE0IiwicXNhIjoiMS41OCIsInFzcCI6IjEuNjMifQ%3D%3D&sprefix=%E5%B0%8F%E3%81%95%E3%81%AA%E3%81%97%E3%82%85%E3%81%86%E3%81%8B%E3%82%93%2Caps%2C389&sr=8-1

https://www.amazon.co.jp/%E3%82%B8%E3%82%A7%E3%83%BC%E3%83%A0%E3%82%BA%E3%83%BB%E3%82%AF%E3%83%AA%E3%82%A2%E3%83%BC%E5%BC%8F-%E8%A4%87%E5%88%A9%E3%81%A7%E4%BC%B8%E3%81%B3%E3%82%8B1%E3%81%A4%E3%81%AE%E7%BF%92%E6%85%A3-%E3%83%95%E3%82%A7%E3%83%8B%E3%83%83%E3%82%AF%E3%82%B9%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%82%B8%E3%82%A7%E3%83%BC%E3%83%A0%E3%82%BA%E3%83%BB%E3%82%AF%E3%83%AA%E3%82%A2%E3%83%BC/dp/4775942158/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=329TJEE87HNM3&keywords=%E3%82%A2%E3%83%88%E3%83%9F%E3%83%83%E3%82%AF%E3%83%8F%E3%83%93%E3%83%83%E3%83%84&qid=1667206279&qu=eyJxc2MiOiIwLjk0IiwicXNhIjoiMS4wOCIsInFzcCI6IjAuODkifQ%3D%3D&sprefix=%E3%82%A2%E3%83%88%E3%83%9F%E3%83%83%E3%82%AF%E3%83%8F%E3%83%93%E3%83%83%E3%83%84%2Caps%2C217&sr=8-2

https://www.amazon.co.jp/%E5%80%92%E3%82%8C%E3%81%AA%E3%81%84%E8%A8%88%E7%94%BB%E8%A1%93-%E3%81%BE%E3%81%9A%E3%81%AF%E6%8C%AB%E6%8A%98%E3%83%BB%E5%A4%B1%E6%95%97%E3%83%BB%E3%82%B5%E3%83%9C%E3%82%8A%E3%82%92%E8%A8%88%E7%94%BB%E3%81%9B%E3%82%88%EF%BC%81-%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%A4%EF%BD%81%EF%BD%89%EF%BC%A7%EF%BD%8F-ebook/dp/B07JG1PQ38/ref=sr_1_1?keywords=%E5%80%92%E3%82%8C%E3%81%AA%E3%81%84%E8%A8%88%E7%94%BB%E8%A1%93&qid=1667206341&qu=eyJxc2MiOiIxLjA1IiwicXNhIjoiMC43NyIsInFzcCI6IjAuNjUifQ%3D%3D&sprefix=%E5%80%92%E3%82%8C%E3%81%AA%E3%81%84%E8%A8%88%E7%94%BB%E8%A1%93%2Caps%2C219&sr=8-1
Next.js学習メモ

### Next.jsとは
* Vercel社が提供しているReactのフレームワーク
* フロントだけでなくサーバ側でも動かすことができる
* Netflixやtiktok,twitch、Notion、Huluなどで利用されている
* 似た名前でNuxt.js(ナクスト)があるがこちらはVue.jsのフレームワーク

### Next.jsの特徴
<dl>
    <dt>1.ハイブリッドレンダリング</dt>
    <dd>→ 必要に応じて適切なレンダリングを行える ※SSG,SSR,CSR(SPA)</dd>
    <dd>→ 結果、SEOに強い＆表示の速いWEBアプリを作ることができる</dd>
    <br>
    <dt>2.ファイルシステムルーティング</dt>
    <dd>→ pagesディレクトリ配下のフォルダ構成がそのままURLになる</dd>
    <dd>→ pagesディレクトリ配下のエクスポートされたコンポーネントがそのままページになる</dd>
    <dd>→ 都度ルーティング設定を書かなくていいのでめちゃ楽</dd>
    <br>
 　　　　　　<dt>3.画像の最適化</dt>
    <dd>→ Next.jsが提供する<Image>タグを利用することで画像ファイルをwebPへ自動変換する</dd>
    <dd>→ webPとはgoogleが提供する次世代画像ファイル形式</dd>
    <dd>→ 表示速度が向上し、結果SEOにも強くなる ※クローラーはページスピードも重視しているため</dd>
</dl>

### レンダリングの使い分けについて

|   | SSG | SSR | CSR |
|:-:|:-:|:-:|:-:|
|いつHTMLを<br>生成するか|ビルド時|リクエスト毎|リクエスト毎|
|どこでHTMLを<br>生成するか|サーバ|サーバ|クライアント|
|SEO|◎|○|×|
|最適なページ|更新頻度が低い<br>ユーザ 1:コンテンツ N|更新頻度が高い<br>ユーザ N:コンテンツ N |SEOを捨てた<br>動的なページ|
|　例|ブログ、ECサイト<br>LP、問い合わせ|SNS、チャット<br>動画配信|リッチUIな管理画面<br>サービスサイト|


### 学習中によく出てきたワード
#### client-side-navigationとは
* jsによってページを切り替える仕組み
* ページ遷移時にURLが変わってもページの再読み込みが不要
* ブラウザのページ遷移より高速
* クライアントの情報を保持したままページ遷移する

### pre-renderingとは
* 事前にHTMLを生成すること
* ブラウザの負荷を下げて表示を高速化するメリットがある
* 検索エンジンのクローラにコンテンツを見せることができSEOも○
* ブラウザのjavascriptを無効にしてもHTMLは表示される
* next.jsではデフォルトで全ページpre-renderingされる
* SSGとSSRの2種類のpre-renderingがある

#### Code Splittingとは
* 自動でいい感じに小分けにしてバンドルしてくれること
* 通常は１つのファイルにバンドルされるため、
ファイルサイズが大きくなり、読み込み速度が遅くなる。
* それを解消する目的でコード分割が行われる
IDaaS関連のまとめ

# はじめに
ゼロトラストを実現するためにはIDの一元管理、MFA、SSOなどの機能は必須です。
本記事ではIDaaS関連の資料についてまとめます。

# Oktaとは
Oktaはクラウド型ID管理、SSO、多要素認証、などを提供する統合認証基盤サービスです。

https://www.okta.com/jp/

マクニカ社がOktaの概要、基本設定を説明している動画が参考になりましたので、備忘録として記載します。

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

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

https://www.youtube.com/watch?v=bnRdursSGHs
postgreSql 機能概要



★ オブジェクト管理全般の機能 
```
・ツリー表示 
・オブジェクトの作成、コピー、検索 
・CREATE文やデータのリバース表示 
・ソース編集 
・統計情報取得 
・データ出力 
```

★ SQL実行に関する機能 
```
・SQLの作成（実行・結果表示・GUI操作）、実行計画の表示 
・オブジェクト名候補のポップアップ表示による補助 
・SQL文の整形補助（改行・右揃え自動調整など） 
・様々なファイル形式でのSQL結果出力（Excel・クリップボード） 
 ```

★ ストアドプログラム作成に関する機能 
```
・高度なスクリーンエディタ 
・コンパイル、プログラムの実行 
 ```

★ DBA向け機能（データベースシステムの導入や管理、記録を行う人向けの機能） 
```
・ログインしたユーザーの情報表示および権限付与 
・データファイルの情報表示および編集 
・プロセスやロック情報、待機イベント情報の一覧表示 
・バックアップ 
```
Macに外部ストレージを接続したときに自動マウントさせない

参考記事の焼き直しですが，macOS 13 Venturaでも使えることが確認できたので報告

# 参考
↓基本的な方法

https://bioid.hatenablog.jp/entry/2021/05/16/162752

↓設定の意味もちょっと詳しく書いてあります

https://timesaving.hatenablog.com/entry/2020/02/21/193500

↓fstabの意味

https://hara-chan.com/it/infrastructure/fstab/

# ニーズ
TimeMachine用の単一HDDにAPFSボリュームを複数設定し，複数台のMacのバックアップを行なっていて，HDD接続時に他のMac用のボリュームを自動マウントさせたくない

<!--
## パーティションとAPFSボリュームの違い

↓思ってますが間違ってたら教えてください

```
HDD1
├── パーティション1
└── パーティション2

HDD2
├── APFSコンテナ1
│   ├── APFSボリューム1
│   ├── APFSボリューム2
│   └── APFSボリューム3
└── APFSコンテナ2
    ├── APFSボリューム1
    ├── APFSボリューム2
    └── APFSボリューム3
```

コンテナ複数作ることはないと思いますが...
-->

# やり方
参考記事がなくなったとき用に写経

## 1. UUIDを確認
   * ディスクユーティリティから確認する方法
     1. ![スクリーンショット 2022-10-31 16.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/09ae162f-8c27-0213-690a-a80a6cfdaaa7.png)
        右上の情報ボタンを押す
     2. ![スクリーンショット 2022-10-31 16.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83914/d5306848-50ab-cc39-515c-07f2c2f82423.png)
        `ファイルシステムUUID`をメモ
   * ターミナルから確認する方法
     ```bash
     diskutil info [ボリューム名] | grep "Volume UUID"
     ```

## 2. 自動でマウントしないように設定する
1. ターミナルで以下を実行
   ```bash
   sudo vifs
   ```
2. viで設定ファイルが開くので，以下を入力
   ```
   UUID=[取得した UUID] none auto noauto
   ```

### fstabのフォーマット
```
UUID=XXXXX-XXXX-XXXX-XXXX-XXXX [mount point] [format] [option] [dump] [diskcheck]
```

引用元: https://hara-chan.com/it/infrastructure/fstab/

#### mount point
大体の資料がnoneを指定してますね
macOSが勝手に `/Volumes` 以下にマウントしてくれるのでいらないことはしないほうがいいかも

#### format

autoを指定しておくと，どのファイルシステムか自動で推測してくれる

#### option
`,`区切りで複数指定可能

|option||
|:--|:----|
| async | ファイルシステムの非同期入出力を設定 |
| auto | mount -aコマンド実行時にマウント（よく使う） |
| noauto | mount -aコマンド実行時にマウントされない |
| defaults | デフォルトオプションを設定(async,auto,dev,exec,nouser,rw,suid) |
| exec | バイナリの実行を許可する |
| noexec | バイナリの実行を許可しない |
| ro | 読み出し専用でマウント |
| rw | 読み書きを許可してマウント |
| unhide | 隠しファイルも表示 |
| suid | SUIDとSGIDを有効化 |
| user | 一般ユーザーでもマウント可 |
| nouser | 一般ユーザーでのマウント不許可 |

引用元: https://hara-chan.com/it/infrastructure/fstab/

本当にこれらのオプションが全てmacOSで使えるのか不明

今回重要なのは noauto

rwとか他のオプションを明記しなかったが別に読み書きできた

#### dump, diskcheck
linuxではこれらを指定できるみたいですが，mac用の設定でこれを指定している参考記事は一つもありませんでした
なんじゃこりゃ

---


以上，写経多めになってしまいましたが，macOS 13 Venturaでも使えることが確認できたのでご活用ください
Visual Studio のソリューションエクスプローラーに「参照の追加」が見つからない

「依存関係」を右クリックしたら「プロジェクト参照の追加」が出てきた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/113139b0-cfeb-5e30-f6b2-9c0854b5071c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7a009020-720a-823b-9ba0-a53921115cbb.png)


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
【2022年最新版】DVDコピーフリーソフト 3選

<h2>Top 1. 4Videosoft DVD コピー</h2>

<a href="https://www.4videosoft.jp/dvd-copy/">4Videosoft DVD コピー</a>は普段にアップグレードをしていて、最新のコピーガードにも対応できますので、自作のDVDは勿論、レンタルDVDもコピーできます。
機能:
1.高性能のDVDコピーソフトで、DVDをPCにコピー、DVDを圧縮することができます。
2. DVDをDVDフォルダーやISOイメージファイルとしてバックアッブできます。
3.動画編集機能を搭載し、コピー設定が可能 
4.分かりやすく、使いやすい 
5.「フルコピー」、「メインムービー」「カスタマイズ」モードを選択してコピーするのも好かれる所です。
![guide-mode.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960431/74569fb6-9bb5-5c3e-d785-49bd24951dab.jpeg)
<h2>Top 2. DVDShrink</h2>
DVD ShrinkはWindows向けの無料に使えるDVDコピーフリーウェアです。
機能:
1.無料使えるDVDコピーソフト。操作でDVDをコピー、リッピングでき
2層分のDVD映像を1層分の容量に圧縮できます。
3. DVDのリージョンコードを変更できます。
4.DVDコピースピード早い、PCパフォーマンスに優しい。
<h2>Top 3. DVD Decrypter</h2>
DVD Decrypterは、主にDVD-Video のバックアップを取るために使うWindows向けのDVDコピー・リッピングフリーウェアです。
機能:
1.DVD Decrypterは無料使えるDVDコピーソフトです。DVDをPCにコピーする以外、DVDリッピングもできます。
2．DVD DecrypterはREC保護リージョンの設定ができ、リージョン番号を日本二向けの2を選択できます。 
3.設定には様々な選択があり、CSS、IFOモード、ISO書き込みモードなど。
4.DVD書き込み速度は速い、コピースピードも速いです。

もっと多くのDVDコピーソフトは<a href="https://www.4videosoft.jp/dvd-solution/free-dvd-copy-software-ranking.html">DVDコピーフリーソフト 10選</a>までご参照ください。
【備忘録2】Ruby：配列の合計値の取得方法まとめ

合計値の取得方法がいまいち整理できていなかったので、わかっている範囲で整理します。

# 想定読者

- Ruby初心者

# 配列の合計値の取得方法まとめ

合計値を取得する方法には下記のようなものがあります。

- sumメソッド
- injectメソッド
- forループ
- eachループ

ではそれぞれの使い方を整理します。

# sumメソッド

sumメソッドは配列内の値を合計してくれます。

```ruby
array = [1,2,3,4,5,6,7,8,9,10]
total = array.sum
puts total #=>55
```

こんな感じですね。もし、配列内の文字列の値を、数値で合計したい場合は要素を加工するようにしましょう。

```ruby
array = ["1","2","3","4","5","6","7","8","9","10"]
total = array.sum{|array| array.to_i}
puts total #=>55
```

# injectメソッド

injectメソッドもsumメソッドと同じように呼び出した配列の合計値を計算してくれます。配列からinjectメソッドを呼び出し、:+を引数に加えます。

```ruby
array = [1,2,3,4,5,6,7,8,9,10]
total = array.inject(:+)
puts total #=>55
```

# ループを使った方法【for/each】

for・eachループを使って合計を求める方法もあります。ループで合計を求めるためには、まず配列の合計値を格納するための変数を用意します。

```ruby
sum = 0
```

この変数の中に格納していきます。

それでは、ループ処理を用いて合計値を求めていきましょう。

## for構文

for構文は配列から順に要素を取り出し、決められた処理を繰り返し行います。

今回は要素を取り出して合計します。for構文の公式は以下の通りです。

```ruby
#for構文
for 仮変数 in 配列
	処理したいコード
end
```

配列の要素が仮変数に格納され、その変数を元にコードが処理されます。

合計値を求める場合は以下のようになります。

```ruby
array = [1,2,3,4,5,6,7,8,9,10]
sum = 0 #合計値を格納するための変数
for i in array
	sum += i
end
puts sum #=>55
```

配列arrayの要素が仮変数iに代入され、sumの値に加算されます。

+=は加算を表しており、sum = sum + iです。

配列の要素がなくなるまで処理が行われ、要素がなくなったらループを抜け、putsで出力されます。

## each構文

続いてはeach構文です。each構文もfor構文と同じように、指定された配列の要素を取り出して、繰り返し処理を行います。公式は以下の通りです。

```ruby
#each構文
配列.each do |変数|
	処理したいコード
end
```

配列の要素が変数に格納され、繰り返し処理が行われます。

合計を求める場合は以下のようになります。

```ruby
array = [1,2,3,4,5,6,7,8,9,10]
sum = 0 #合計値を格納するための変数
array.each do |arr|
	sum += arr
end
puts sum #=>55
```

配列arrayの値が変数arrに格納され、sumの値に加算されます。

sum += arrは、sum = sum + arrです。

こちらも配列の要素がなくなるまで処理が行われ、要素がなくなったらループを抜け、putsで出力されます。

# まとめ

配列の値を合計する方法は以下の4つです。

- sumメソッド
- injectメソッド
- forループ
- eachループ

ループを使う場合は、合計値を格納するための変数の定義を忘れずにしておきましょう。

# 参考サイト・資料

https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92Ruby-%E6%96%B0%E7%89%88-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/479816884X?&linkCode=sl1&tag=shayo02-22&linkId=66755c2af64ae089597a8c811be327e8&language=ja_JP&ref_=as_li_ss_tl

https://asapoon.com/ruby/2560/array-hash-sum/

https://www.choge-blog.com/programming/rubyarraygetsumvalue/
npmとyarnって結局どっちを使えばええんや！

# 始めに
Vue.jsを使う上で、npmとyarnどっちを使えばいいか迷いました。
備忘録として調べた内容を置いておきます。

# そもそもnpm、yarnって何？？
### npmとは
npmとはNodeJS上で動作するパッケージマネージャーの一つです。

#### パッケージマネージャーって何？？
パッケージマネージャーは各ソフトウェアのインストールや更新などの操作、また他のソフトウェアとの依存関係を管理してくれるものです。

### yarnって？？
yarnは2016年にnpmの2つの問題を受けて登場したものです。

#### 大きな問題って？？
npmには以下の2つの問題がありました。
* インストールが遅い
* バージョン固定ができない。

その問題を受けて台頭したyarnにはnpmの従来の機能に加えて以下の3つの特徴がありました。

#### yarnの特徴3つ
* インストールが早い
* バージョンを固定可能(現在はnpmも可能)
* セキュリティが高い

## 結局npmとyarnどっち使えばええんや！
結論から言うと、好きな方を使おうということだそうです。

npmの課題だったインストールの遅さ、バージョン固定の不可は現在では解決され、パフォーマンス面ではほぼ変わりません。
強いて言うなら、yarnの方がインストールのスピードがちょい早いと言うくらい。

# npmとyarn、超使えるコマンドを置いておくよ！
npmとyarnの早見表を見つけたので置いておきます。

[npmとyarn早見表](https://qiita.com/rubytomato@github/items/1696530bb9fd59aa28d8)
[記事紹介] BIMIを使ってメールにロゴを表示する方法 (送信者編)

@qualitia_cdevの中の一人、@hirachanさんが書いた記事をみなさまにご紹介します。


### BIMIを使ってメールにロゴを表示する方法 (送信者編)
https://qiita.com/hirachan/items/85d0983ebfa0e5034041#_reference-97a7658d5e3d191d0f31
複数形ラベルの項目が見つからない



+ [Where is 'plural label' field in 'In 'Optimize Customer Data with Standard and Custom Objects'?　「標準オブジェクトとカスタムオブジェクトを使用して顧客データを最適化する」で「ラベル名（複数形）」の欄が見つからない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epjeJ)

言語設定を日本語以外にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8aec8019-d102-24ef-3bd6-0bad7e3bc481.png)



+ [Missing plural labels/複数形ラベルの項目が見つからない](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDhsa)


:::note
When the plural option is missing on the object detail itself, then it will be available in setup >> Rename Tabs and Labe
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/81feeb70-7a15-fc9f-ef63-da760d0d9fa4.png)



+ [Plural Label Custom Object](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KRnGD)

:::note
Goto setup --> Rename Tabs and Labels --> your object --> edit
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/86a77531-5fa5-5cde-ec5a-494754c93783.png)

# 商談を作成すると、ページの右側にあるはずの連絡先ロール オプションが表示されません。

Optimize Customer Data with Standard and Custom Objects

+ [取引先担当者の役割が商談に表示されないのはなぜですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erOhu)

:::note
「データ モデリング」モジュールの「標準オブジェクトとカスタム オブジェクトを使用して顧客データを最適化する」という課題に戻る必要がありました。 

また、新しい環境を作成し、「リードと商談」モジュールの「商談に取り組む」チャレンジの手順をやり直しました。  

チャレンジをクリアするには、新しい Trailhead プレイグラウンドを作成し、戻って Formulas モジュールから始める必要がありました。
:::
git の基本






gitを使う前はいつもpullをしましょう

```
$ git pull
```

 ファイルの修正が終わったら、addをします。
```
$ git add .
$ git add test.php
```

addしたのをcommit
```
$ git commit -m "コメント"
```

リモートリポジトリにpush
```
$ git push
```

commitの確認
commitのlogを確認
```
$ git log
```





参考
```
https://dev.classmethod.jp/articles/lim-git-command/
【Windows小ネタ】XBox Game Barでキャプチャ動画の保存が出来ない場合の解決方法


# 参考記事

[Microsoft Communityからの質問](https://answers.microsoft.com/en-us/windows/forum/all/xbox-game-bar-saving-to-appdatalocaltemp/d30a4f2b-f7ec-4220-8301-76139eecc22d)

XBoxゲームクリップは今開いている画面の動画をすぐ作ることが出来るので、大変便利なツールだが、
保存したフォルダに動画が保存されないという問題があったので、
その解決方法を記す。

# 発生した問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/fceb8f30-3b8a-e586-3b87-4024389f3bc3.png)

ゲームクリップのキャプチャを押し、
"See my captures"を押すと、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/541d8f32-41d2-2c28-b0e7-3467f19d790e.png)

Galleryにて、"There was a problem getting your captures. Try again in a bit."というエラーが発生する。

では、どこが保存先に指定されているのか？を確認したかったので、
"Setting"から、"Gaming" > "Captures"を開くと、
確かに、よく分からないファイルパス(Userディレクトリ内のAppData/Local/Temp)に格納される設定となっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/6fdefaf2-1303-b9fa-b0a7-066365d672a2.png)

・・・が、ここでHow to save to a different folderを選択しても、
Microsoft公式には解決策が載っていない。

# 解決方法

レジストリエディタを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8750dbc1-88ec-876a-583d-b11dfa8cbdad.png)

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Foldersを開く。
そして、よく見ると、**EDC0FE71-98D8-4F4A-B920-C8DC133CB165**というキーに明らかに見慣れないファイルパスがあるので、これを現実に存在するフォルダパスに置き換える。
なおこのキーはMicrosoftの識別名の一つで、アプリケーションのメジャーアップデートなどで変更がある点に注意。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/f3be1062-b631-9106-b047-008f3db20d3f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/6ee388f1-6162-41fc-717e-92b9bfab0978.png)

ＰＣを再起動し、XBox Game Barを再度開く。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/a8e0bae3-f586-0ec6-93ad-44df66b05de5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/61706725-eb5b-3e33-f92c-f40d85b83b8d.png)

Galleryが表示されてないのがちょっと気になるが、
一応保存することが出来るようになった。
システム統合・検証テスト

# 主なテストの種類
主なテストには次のようなものがある。
テストを行った後不具合が発見された時は、```バグ修正やチューニング（性能を確保するための調整)```を行う。
仕様変更を伴う場合は、文書類の更新も行う。

### 機能テスト
```ユーザから求められたシステム機能要件を満たしている```かを検証する。

### 性能テスト
データの処理速度、```画面からのリクエストに対する応答速度（スループット、レスポンスタイム)```など、システム全体を評価する。

### 操作性テスト
```ヒューマンインタフェースが使いやすい```か、ミスを起こしやすくないかなどを評価する。

### 状態遷移テスト
その時の```状況や時間経過などによって異なる動作をするシステム```を対象とした統合テスト手法。テストデータは、```状態遷移図や状態遷移表```をもとに行うが、通常の統合テストより場合分けが複雑になる。

### 負荷テスト（ストレステスト)
実際の稼働と同様、あるいはより```大きな量的な負荷（データ量、同時発生するリクエストの数など）```を与えてシステムの限界を評価する。

### 例外処理テスト
```イレギュラーなデータの処理やエラー処理について```、適切に（安全な方向に）動作するかを評価。

### 障害回復テスト
障害は発生した際に、```発生状況を把握```でき、```原因を突き止め```られ、さらに的確な復旧作業の手順を経て```迅速に回復```できるかを評価する。

### セキュリティテスト
```ネットワークやデータベース、人の介在```する部分などを含めた```セキュリティを保持する観点```からのテスト。必要に応じてさまざまなテストを行う。

# リグレッションテスト（回帰テスト）
```システムの変更(修正、機能追加)```が行われたとき、それまで正常に稼働していた部分に、```思わぬ影響を及ぼしていること```がある。回帰テスト（リグレッションテスト：regression test)は、```変更機能と従来機能を含めて```テストすることで、```他の正常な部分に影響を与えないかを検証```する方法のこと。```退行テスト```ともいう。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
【MySQL】「CASE句を使ってみよう」

# はじまり
人間さん「う～ん…」

いぬ先生「どうしたの？」

人間さん「果物を仕入れて管理してるんだけど」
人間さん「これを見てほしい」

products テーブル
|id|name|condition|price|
|:-:|:-:|:-:|:-:|
|1|りんご|良|20|
|2|オレンジ|悪|200|
|3|りんご|悪|2000|
|4|もも|良|100|
|5|オレンジ|良|500|

人間さん「だれよ？状態悪いりんごを2000円にしたの…」
人間さん「あと良いりんごも20円って安すぎよ…」

いぬ先生「間違いなく入力ミスってるね～」

# SELECTで使う

人間さん「ちょいとリストに出すか」
人間さん「SELECTとSELECTをUNIONで繋げて…」
人間さん「よしできた」

```sql
SELECT
    id,
    name,
    condition,
    price AS '元価格',
    300 AS '新価格'
FROM
    products
WHERE
    name = 'りんご',
    AND condition = '良'
UNION
SELECT
    id,
    name,
    condition,
    price AS '元価格',
    100 AS '新価格'
FROM
    products
WHERE
    name = 'りんご',
    AND condition = '悪';
```

人間さん「実行っと」

|id|name|condition|元価格|新価格|
|:-:|:-:|:-:|:-:|:-:|
|1|りんご|良|20|300|
|3|りんご|悪|2000|100|

人間さん「うん、この値段設定でいくか」

いぬ先生「ちょっと待って」

人間さん「どしたの？」

いぬ先生「今のSQLなんだけどちょっとパフォーマンスが良くないかも」

人間さん「どういうところ？」

いぬ先生「これだとSELECT文が2回ある分、テーブルスキャンを2回行っていることになる」
いぬ先生「なのでパフォーマンスは良くないかな」
いぬ先生「他に良い方法があるよ」

人間さん「でも別に良くない？」
人間さん「結果は同じなんでしょ？」

いぬ先生「まぁそうね」
いぬ先生「ただ、今回はデータも少ないからいいかもだけど」
いぬ先生「今後大量のデータを扱うときには速さが違ってくるから」
いぬ先生「良い機会だしCASE式を使ってみよう」

人間さん「頼もしい」

いぬ先生「さっきのからWHEREのconditionはCASEにかえて…」
いぬ先生「SELECTとUNIONを削って…」
いぬ先生「これでよしっと」

```sql
SELECT
    id,
    name,
    condition,
    price AS '元価格',
    CASE WHEN condition = '良' THEN 300
         WHEN condition = '悪' THEN 100
         ELSE 200
    END AS '新価格'
FROM
    products
WHERE
    name = 'りんご';
```

いぬ先生「これで結果は人間さんのと同じになる」

|id|name|condition|元価格|新価格|
|:-:|:-:|:-:|:-:|:-:|
|1|りんご|良|20|300|
|3|りんご|悪|2000|100|

人間さん「お～なんだかスッキリしたね」

いぬ先生「だけど、これだとテーブルスキャンが1回になるから」
いぬ先生「パフォーマンスも良くなって速度も上がるよ」

人間さん「ありがとう～」
人間さん「ん、ここの200ってなに？」

```sql
    CASE WHEN condition = '良' THEN 300
         WHEN condition = '悪' THEN 100
         ELSE 200 -- この行のところ
    END AS '新価格'
```

いぬ先生「これはデフォルト値で」
いぬ先生「いずれの条件にも一致しない場合は200円設定になるよってこと」
いぬ先生「今回のケースだとその対象がないから意味はなさないけど」
いぬ先生「ELSE句は書くように意識しよう」

人間さん「なんで？」

いぬ先生「これがないと各条件に漏れてしまった商品の金額がNULLになってしまう」
いぬ先生「CASE式の仕様によるものなんだ」
いぬ先生「なので、CASE式を使うときは、常に明示的にELSE句を書くようにしよう！」

人間さん「わかりました！」




# UPDATEで使ってみる

人間さん「さて金額を修正するかな」
人間さん「良いりんごは300円」
人間さん「悪いりんごは100円っと」

```sql
UPDATE
    products
SET
    price = 300
WHERE
    name = 'りんご'
    condition = '良';
UPDATE
    products
SET
    price = 100
WHERE
    name = 'りんご'
    condition = '悪';
```

いぬ先生「度々失礼！」
いぬ先生「これもテーブルスキャンが2回行われてしまうから」
いぬ先生「CASE式を使ってパフォーマンス良くしようか」

人間さん「え、UPDATEでも使えるの！？」

いぬ先生「そう、SELECTと同じように使えるんだよ」
いぬ先生「UPDATEだとさっきの人間さんのSQLがこうなる」

```sql
UPDATE
    products
SET
    price = CASE WHEN condition = '良' THEN 300
                 WHEN condition = '悪' THEN 100
                 ELSE 200
            END
WHERE
    name = 'りんご';
```

いぬ先生「SET句のカラム名(price)は忘れずにね」

人間さん「（いつも忘れそうになる…）」

いぬ先生「実行！」

|id|name|condition|price|
|:-:|:-:|:-:|:-:|
|1|りんご|良|300|
|2|オレンジ|悪|200|
|3|りんご|悪|100|
|4|もも|良|100|
|5|オレンジ|良|500|

いぬ先生「更新うまくいったね！」

人間さん「助かりました～」
vf pageがapexなしの場合、JSでデータ取得

<apex:page showHeader="false" showChat="false" sidebar="false" >
    <script type="text/javascript">
        var __sfdcSessionId = '{!GETSESSIONID()}';
    </script>
    <script src="../../soap/ajax/27.0/connection.js" type="text/javascript"></script>
    <script type="text/javascript"> 
    
    var state;    
    window.onload = setupPage;
    function setupPage() 
    {
      //function contains all code to execute after page is rendered

      state = { //state that you need when the callback is called
          output : document.getElementById("output"),
          startTime : new Date().getTime()};
        
        var callback1 = {
          onSuccess: showTotalLicensesThisMonth,

          onFailure: queryFailed,
          source: state};
          
        sforce.connection.query(
          "SELECT sum(Total_Seats__c) totallicensethismonth FROM Opportunity where Platform__c = 'UK' and (not name like '%Trial%') and Order_Processed__c = True and Next_Steps__c in ('Customer - Provisioned', 'Customer - Provisioned â€“ Awaiting Training') and CloseDate = THIS_MONTH and StageName not in ('Closed Lost','Closed Cancelled') and accountid not in (select id from account where name like '%zzz%') and id not in (SELECT OpportunityId FROM OpportunityLineItem where PricebookEntry.name = 'CloudCall_Intl_DDI_Yearly')",
           callback1);
       
    }

    function queryFailed(error, source) 
    {
        //alert("An error has occurred: " + error);
        console.log("An error has occurred: " + error);

    }

    function showTotalLicensesThisMonth(queryResult, source) 
    {
        //alert(queryResult);
        if (queryResult.size > 0) 
        {
            //get the records array
            var records = queryResult.getArray('records');
            
            var totallicensethismonth = isNaN(parseFloat(records[0].totallicensethismonth)) ? 0 : parseFloat(records[0].totallicensethismonth);
            document.getElementById('totallicensethismonth').innerHTML = formatNumber(totallicensethismonth,2);
        }
    }

  </script>
    <table cellpadding="3" width="100%" >

    <tr>
    <td style="font-size:12px;font-weight:bold;" width="70%">
        Licenses Provisioned this month: 
    </td>
    <td style="font-size:12px;font-weight:bold;text-align:right" width="30%">
        <a href="/00OG0000004eh5f" title="click to see report" target="_blank"><span id="totallicensethismonth" style="font-size:12px;color:#F00"></span></a>
    </td>
    </tr>

    </table>
</apex:page>
【Shopify】カスタマイズの動的セクションの作成方法

この記事では、shopifyのカスタマイズ機能にオリジナルの動的セクションを追加する方法を紹介します。

### 動的セクションのファイル作成

管理画面>オンラインストア>コードの編集を開く
sectionフォルダに任意の名前でファイルを作成。
〇〇.liquidで作成。特にルールはなし。

以下、一番オーソドックスなテンプレ。
これをコピペしてもらってカスタムしてもらえると🙆‍♀️

``` liquid
<section>
    <h2>{{section.settings.title}}</h2>
    {% if section.blocks != blank %}
    <ul>
        {% for block in section.blocks %}
            <li>
                <img src="{{ block.settings.image | img_url: 'master'}}" alt="">
                <span>{{block.settings.caption}}</span>
            </li>
        {% endfor %}
    </ul>
  {% endif %}
</section>

{% schema %}
{
  "name": "オリジナルセクション",
  "settings": [
  {
    "type": "text",
    "id": "title",
    "label": "タイトル",
    "default":"テキストテキストテキストテキスト"
  }],
  "blocks":[
  {
    "type": "grid_item",
    "name": "item",
    "settings": [
    {
      "type": "textarea",
      "id": "caption",
      "label": "内容を記入してください",
      "default": "本文が入ります。本文が入ります。本文が入ります。"
    },
    {
      "type": "image_picker",
      "id": "image",
      "label": "画像を追加してください"
    }
    ]
  }
  ],
  "presets":[
    {
      "name": "オリジナルセクション"
    }
  ]
}
{% endschema %}
```

{% schema %}{% endschema %}の中に動的セクションの設定を記載。

　以下schemaタグで使用可能なタイプ一覧

|タイプ    |内容                  |
|----------|--------------------------|
|**text**  |    1行のテキスト    |
|**textarea**|複数行のテキスト|
|**radio**  |ラジオボタン|
|**select**|ドロップダウンリスト|
|**checkbox**  |    チェックボックス    |
|**range**|レンジスライダー|
|**number**  |    数字カウント    |
|**color**|カラー選択|
|**font_picker**  |    フォント選択    |
|**collection**|コレクション選択|
|**product**  |    商品選択    |
|**blog**  |    ブログ選択    |
|**page**|ページ選択|
|**link_list**  |    メニュー選択    |
|**url**  |    URL選択    |
|**video_url**  |    ビデオURL選択    |
|**richtext**  |    装飾可能なテキスト    |
|**html**  |    HTML要素    |
|**article**  |    記事選択    |
|**image_picker**  |  画像選択    |
|**header**  |    ヘッダー見出し    |
|**paragraph**  |    説明用段落    |



参考サイト
https://www.shopify.com/jp/blog/partner-theme-blocks
https://ec-penguin.com/blogs/shopify/schema-type-summary
Raspberry PiでNASの共有ディレクトリをsambaでmount

NASサーバにSMBが組み込まれており、共有設定してあったので
RaspberryPiから共有ディレクトリをマウントしてたときの備忘録


# 準備
## samba clientをインストール

```
sudo apt-get install smbclient
```


## 共有ディレクトリを確認
```
smbclient -L NASサーバのIPアドレス -U NASサーバに存在するユーザ名
```


## マウントポイントを作成
```
sudo mkdir /mnt/nas_home
```


## マウントしてみる
```
sudo mount -t cifs -o username=NASサーバにあるユーザ名,password=ユーザ名のパスワード //NASサーバIPアドレス/共有ディレクトリ名 /mnt/nas_home(先程作ったマウントポイント)
```

問題なければlsできると思う
```
ls -alg /mnt/nas_home
```


ひとまずマウンドを解除する
```
sudo umount /mnt/nas_home
```


# piユーザで書き込めるようにする

## piユーザの各ID(User Group)を調べる
```
$ id pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),999(spi),998(i2c),997(gpio),117(lpadmin)
```

uid=1000 gid=1000だったのがわかった

# fstabに追加
```
$ vi /etc/fstab
```


/etc/fstabファイルに以下を追加
```/etc/fstab
/mnt/nas_home(先程作ったマウントポイント) //NASサーバIPアドレス/共有ディレクトリ名 cifs username=NASサーバにあるユーザ名,password=ユーザ名のパスワード,user,uid=1000,gid=1000,noauto,rw
```

``uid=1000,gid=1000``　が先程確認したID



## 確認
```
sudo mount -f
```


## 問題なければマウントする
```
sudo mount -a
```



## そもそも
NFSでつなごう
ユニットテストとレビュー

# ユニットテストの手法
### デバッグ(debug/debugging)
コーディングしたプログラムモジュールから```エラー（バグ）を取り除き、正しく動作する```ことを確認する作業。
文法的なエラーについてはコンパイラなどにかけて発見し、```論理的なエラーについてはテストデータと出力をチェック```して見つける方法がとられる。さまざまなデバッグツールが用いられる。

### コードレビュー(code review)
コーディングが終わったプログラムについて、```定められたコーディング基準```に則っているか、```ソフトウェア詳細設計書```に基づいているか、```効率性、保守性が適切かを確認```。

### アサーションチェック
プログラム中に論理的な条件を挿入しておき、その```条件が満たされない時にメッセージを出すことで、エラーを発見```するチェック方法。

### ユニット（モジュール）テスト
```全てのプログラムロジックを通るようなテストデータ```を用意し、ホワイトボックステストの手法を行う。

### テストカバレッジ分析
プログラムの命令や条件が組まなくテストされいるか、その```カバレッジ（網羅率)を測定し、分析```する方法。
```テストそのものを確認```できる。

# レビューとレビュー手法
レビューは複数の関係者によって仕様書などの成果物を検査し、問題点を洗い出す作業で、開発の各工程の最終段階を行う。

### ウォークスルー
作成された仕様書、ソールコードなどについて、```開発担当者を含む複数のメンバ（関係者）で検討し、エラーを早期発見```する。

### インスペクション
モデレータ（責任者)のもとに行うレビュー（ウォークスルーをより組織化したもの)。
第三者がソースコードを1行ずつチェックする手法を```コードインスペクションという。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8