OmniAICreator/Qiita-1.07M huggingface dataset:
【CDK】cdk deploy実行時に「but the current credentials are for XXXXXXXXXXX」のエラー

# はじめに
cdk deployコマンドを実行したところ、タイトル記載のエラーが発生し、コマンド実行に失敗しました。
本記事では、今回の事象と原因、解決策を記載します。

# 環境情報
実行環境：Mac（Big Sur 11.7.2）
CDK使用言語：TypeScript
cdk-cliのバージョン：2.61.1

# 事象
cdk deployコマンド実行時に以下のエラーが出ました。
・実行コマンド
　cdk deploy --profile user1 --region ap-northeast-1

・エラー内容
Stack Deployments Failed: Error: Need to perform AWS calls for account user1, but the current credentials are for XXXXXXXXXXX

# 原因
Stackインスタンスに渡す環境情報に不備があったことが原因でした。
CDKでは、Stackインスタンスに以下の環境情報を渡します。
　account：AWSアカウントID
　region：デプロイ先リージョン

CDKでは、処理のエントリーポイントとなるファイル(binディレクトリにあるファイル)でStackインスタンスを生成します。
そして、生成時のコンストラクタの第3引数（euvプロパティを含むオブジェクト）に環境情報を渡します。
環境情報のaccountでは、デプロイ先のAWSアカウントIDを記載します。
```sample.ts
import { BackendStack } from '../lib/backend-stack';
import { App } from 'aws-cdk-lib';

type AccountInfomation = {
  account:string,
  region:string
};

const app:App = new App();
//Stackインスタンスに渡す環境情報
const accountInformation:AccountInfomation = {
  account: "XXXXXXXXXXX",  //デプロイ先AWSアカウントIDを記載
  region: "ap-northeast-1",
};
//Stackインスタンス生成
new BackendStack(
  app,
  "KawakitaBackendStack",
  { env: accountInformation }
);
```


しかし、私はaccountプロパティにAWSアカウントIDではなく、コマンド実行時のprofileオプションで指定したIAMユーザー名を記載していました。
```sample.ts
const accountInformation:AccountInfomation = {
  account: "user1",  //IAMユーザーを記載していた
  region: "ap-northeast-1",
};
```

cdkコマンドでは、profileオプションで指定したIAMユーザーから、そのユーザーが属するAWSアカウントIDを特定し、内部で保持します。
そして、特定したIDと、Stackに渡したaccountプロパティの値が同じか確認するのですが、ここが異なっていた場合、上記のエラーが発生します。

# 解決策
accountプロパティの値を、IAMユーザー名からAWSアカウントIDに修正しました。
```diff_typescript
const accountInformation:AccountInfomation = {
- account: "user1",
+ account: "XXXXXXXXXXX",  //AWSアカウントIDを記載
  region: "ap-northeast-1",
};
```

# 最後に
accountプロパティにAWSアカウントIDを渡すのは常識でしょうが、そこが抜けていると今回のようなエラーになることが分かりました。
同様のエラーが発生した時の解決の一助になれば幸いです。
フォルダ内の古いファイルを削除する


>Programを実行していると、ディレクトリーの中に”古いファイル”が溜まっていくことありませんか？
エポック秒を利用し古いファイルを判断して、指定した個数以外のファイルを削除する様にしました。
>


```python
# "/Qiita投稿Program/古いファイルを削除/test/"フォルダ内の古いファイルを削除する

# ---------------------------------------------------------------------------
import os       # OSに依存しているさまざまな機能を利用するためのモジュール
import glob     # 引数に指定されたパターンにマッチするファイルパス名を取得
# ---------------------------------------------------------------------------
def p():
    print('-'*50)
    print('')

# ---------------------------------------------------------------------------
def remv():
    # フルパスで記述
    # ↓「書類」にあるファイルの場合
    # PATH =  '/Users/user名/Documents/test/'

    # ↓ iCloudにあるファイルの場合（ /com~apple~CloudDocs/以下はご自身の配列で記述してください。これは参考です。）
    PATH = '/Users/user名/Library/Mobile Documents/com~apple~CloudDocs/qiita関係/Qiita投稿Program/09_フォルダ内の古いファイルを削除/test/'
   
    # --------------------------------------
```
>フルパスの取得
フィルダを指定して右クリックから「パス名をコピー」でフルパスを取得
<font color='red'>注意:パスの最後にスラッシュ（/）の追記を忘れない様に(・・/古いファイルを削除/test/)</font>
![giita.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/b542a0f0-e074-ca42-2291-7a0f606de49b.jpeg)
```python    
    # --------------------------------------
    # フォルダ内のファイル一からファイルパスを取得してファイル名のみを取得してから、ファイルの作成日時（エポック秒）を取得（古いファイルから消すため）
    files = glob.glob(PATH + "*.txt")
    temp2 = []
    
    # --------------------------------------
    # ファイル名とエポック秒をセットにしてリストに変換し2次元リストを作成[['ファイル名', エポック秒],['ファイル名', エポック秒],...]
    for file in files:
        # ファイルパスからファイル名.拡張子を取得
        f_name= os.path.basename(file)
        
        for i in range(1):
            temp1 = []
            # ファイル名をリストへ
            temp1.append(f_name)
            
            # ファイルのエポック秒を取得
            epSec = os.path.getctime(file)

            # epSecをリストに代入
            temp1.append(epSec)
        
        temp2.append(temp1)

    # リストをソート
    temp2.sort()
    
    # temp2にあるファイルの個数を調べる
    ln = len(temp2)

    # リストにn個ファイルを残して削除
    n = 2 　　　# フォルダに残す個数を指定
    lv = ln - n

    # 削除
    for i in range(lv):
        sr = temp2[i][0]
        print(f'削除したファイル名：{sr}')

        os.remove(PATH + sr)
        
    if lv>2:
        p()
        print('以上のファイルを削除完了しました。')
        p()
    else:
        print(f'現在のファイル数は{n}個です。')
        p()
if __name__=='__main__':
    remv()
unchecked exception

NullPointerExceptionのようなRuntimeException系のexceptionは
uncheckedExceptionで、try,catch不要
```java
public class Outer {
    public static void main(String[] args) {
            NullPointerException npe = new NullPointerException();
            System.out.println(npe instanceof RuntimeException);
            String[] str = null;
            String s = str[0];
    }
}
```
```
Exception in thread "main" true
java.lang.NullPointerException
	at com.mycompany.mavenproject1.Outer.main(Outer.java:13)
```
InterruptedExceptionは、RuntimeExceptionではない。
```java
    public static void main(String[] args) {
            Exception ie = new InterruptedException();
            System.out.println(ie instanceof RuntimeException);
            //Thread.sleep(1000);
    }
```
```
false
```
try,catchなしのため、compile error
```java
public class Outer {
    public static void main(String[] args) {
            Exception ie = new InterruptedException();
            System.out.println(ie instanceof RuntimeException);
            Thread.sleep(1000);
    }
}
```
```
Exception in thread "main" java.lang.RuntimeException: Uncompilable code - 例外java.lang.InterruptedExceptionは報告されません。スローするには、捕捉または宣言する必要があります
	at com.mycompany.mavenproject1.Outer.main(Outer.java:1)
Command execution failed.
```
Nodejs + React + MySQL+ Express  Todoアプリ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/e5c2b470-4718-34e6-e550-b3034296f198.png)

# 開発環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/5e66bcbd-044b-bcab-dadd-b694cab5382b.png)

# 参考動画
https://youtu.be/8ly39na3LLM

# 使用したパッケージ
### バックエンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/53dd671f-bbd5-7611-098a-1477c0a95587.png)

```terminal:terminal
 npm install body-parser cors dotenv express mysql2 nodemon
```

### フロントエンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/cee8d4f5-f74c-f9ba-071f-148439ed45a3.png)
```terminal:terminal
 npm install axios react-router-dom react-toastify
```

# 完成品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/cac43429-7204-e8f1-3c10-ebd028094183.png)

# MySQLと接続
```javascript:index.js
 const mysql = require("mysql2");

 const db = mysql.createPool({
  host: process.env.HOST,
  user: "root",
  password: "",
  database: "crud_contact",
});
```

# Axios 全データの取得
```javascript:Home.jsx
 const [data, setData] = useState([]);

 const loadData = async () => {
    const response = await axios.get("http://localhost:5000/api/get");
    setData(response.data);
  };
```

# 参考資料
https://reactrouter.com/en/main

https://expressjs.com/

https://www.npmjs.com/package/react-toastify
【Spring Boot】@ConfigurationPropertiesの『Prefix must be in canonical form』を解決する

# 前提
SpringBootにて`@ConfigurationProperties`を使って`application.yml`の値を読み取る際に以下の警告が出た。
```
Prefix must be in canonical form {行数}
```
# 問題点

読み取り元の`yml`ファイルは以下。
```application.yml
sampleData:
    data1: hoge
    data2: fuga
```
読み取りをするにあたり、下記のように記述していた。

```SampleDataConfig.java
@Component
@Setter
@Getter
@ConfigurationProperties(prefix = "sampleData")
public class SampleDataConfig {
    String data1;
    String data2;
}

```
# 解決策

`prefix`に指定する値がキャメルケースであることが問題だった。
そのため以下のようにケバブケースで`prefix`を指定することで警告が消える。

```java
@ConfigurationProperties(prefix = "sample-data")
```
喋れるオンラインフィギュアがつくりたくて・・・

# 0.TL;DR
- ぶっちゃけChatGPT試したかった
- せっかくだから、Kawaiiものに喋らせたかった
- 結論、こわ・・・

https://chatgpt-with.pages.dev/

# 1. 使用した技術
- [Angular](https://angular.io/)
- [Three.js](https://threejs.org/)
- [ChatGPT](https://openai.com/blog/chatgpt/)

Angularを選定した理由はとくにはないけど、`RX大好きマンなのとコードにDOM書きたくない病`を患っている。
Reactの検証とかでもよかったけど、どっちかというと`ChatGPT`が優先
single page applicationにしたかったとかそういうのもない。

MMDのロードするの、てっとり速いのがThree.jsだったから、Threeって感じ
正直、WebGLをゴリゴリ書くのはシンドい。

ChatGPTくっそ流行ってるけど、[グーグル、「ChatGPT」の脅威に対処するため共同創設者らの協力を要請か](https://japan.cnet.com/article/35198930/)とかなんとか・・・

実際に、コーダー不要なのかと検証するために、作ってみた。
tempatureとかは、はっきり言ってサンプルそのままにしてあるけど、チューニング次第でいろんなことできる。

ただ、サンプル時点でも、かなり哲学的なこと言ってくれる。

# 2. 問題点
# 2-1. フロントだけで作ったので、トークンどうするのか問題
OpenAIはなんかGitHubにシークレットあげると勝手に検知して、シークレット検知しよる。

![スクリーンショット 2023-01-25 122210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59111/533386ab-0723-e851-c94c-2399c9cad531.png)

勝手にシークレット変えてくれるという、機能つき。
まー、探知されないように、ゴニョゴニョした…。
バレるとモロバレなので、暗号復号の形式については、かかない。

GitHub直上げ検知するのは、どうやってるんだか…

# 2-2. たまに（いや？よく？）嘘つく（未解決問題）

まだまだ、学習途中なのか嘘をつくこともしばしばあり。
今日はいつ？とかいうと、平気で変な回答かえってきたりする。

チューニングについては、どこかのタイミングで覚えたい。

# 2-3. パンツ見せない問題

ベッドとオービットコントローラーを駆使してパンツ隠した。

# 2-4. Recognitionが途中でとまる問題

音声入力APIがChromeに入ってるので使ってみたのだけれども、`continuous=true;`にしても、1分無音だとカットする。
あーなんて、クリーンIT、ありがた迷惑。

ってなことで、クリック中だけ、音声読み取るようにした。
言いたいときと聞かれたくないときの差別化できていいかなってので、まぁこれは仕様変更で対処。

# 3. 結論
そりゃ騒がれるほどに優秀だわって感じがする。
哲学的なこととかも考えてくれるし、同じことを言っても時々で別の判断をしてくれる。
バグフィックスとか脆弱性診断とか、昔はやったChatOPSの可能性を再認識した。

ソースは弊社PoCに上がってるので、勝手にご覧あれ…
検証のために、3日ぐらいでつくった雑コードなので、OOPは破綻してるけど・・・。

# 4. 宣伝

ここのところ、記事あげてなかったけど、楽しいエンジニア募集してます。
PoCとかいろいろやってなんか作っていくフルリモとか、福利とかいろいろ考えた会社にしました。
指摘とかあれば、いろいろと教えていただけると嬉しいです。

https://www.devenus.com/
HTML5プロフェッショナル認定試験レベル１合格記

# 概要
HTML5プロフェッショナル認定試験レベル１ ver2.5を受験しました。
どういう風に勉強すればいいのか自身の体験が参考になれば幸いです。

https://html5exam.jp/

## きっかけ
Web勉強していてちょうどいい資格ないかな～と探していました。
HTMLは基本的な事は知っているがHTML5になって変わった点については理解が浅かったので受験しました。
自己啓発が目的です。

## 結果
83点/100点で合格しました。（65点以上で合格）
セクションごとの正解率はAPIの基礎知識だけ低かったもののそれ以外は80%以上といった感じです。

## 用意したもの
### 書籍
「HTML5プロフェッショナル認定試験 レベル1 スピードマスター問題集 Ver2.5対応」（以降スピードマスター問題集）という書籍を購入しました。

書籍を検索するとこの本と「HTML5プロフェッショナル認定試験 レベル1 対策テキスト&問題集」（以降対策テキスト問題集）の2つがヒットします。
2つの書籍の違いは
* スピードマスター問題集は「問題を解く→答えを見る→解説を見る」の順番
* 対策テキスト問題集は「知識を学ぶ→問題を解く」の順番

と本の構成の違いがありますので自分に合った参考書を選ぶのがいいと思います。
社内で他に受験された方の意見も参考にスピードマスター問題集の方を購入しました。

#### （参考）書籍URL
https://www.amazon.co.jp/dp/479817646X

https://www.amazon.co.jp/dp/4839980225

### 学習サイト
Ping-tのプレミアムプランに1ヶ月加入して対策問題集をこなしました。

https://mondai.ping-t.com/g

1ヶ月にした理由の1個に***不合格になるともう1ヶ月延長しないといけない***という緊張感を出すというのも込めました。

正直な事を言うと出てくる問題の内容の比率でいうと書籍に乗っていた問題の方が多いです。
それなのに何故Ping-tも利用したかというと
* ジャンルごとに問題を出したり、正解/不正解を記録する部分がシステム化されてる
* 移動時間中にポチポチ解ける
* ミスした部分を重点的に解き直せる

という利便性のところが大きいです。
後5問くらい「あ、Ping-tで見たやつだ」があってそこを拾えたのが大きかったかもしれないです。
懸念点としてはレベル2が教材として無いのでこの勉強法はレベル1のみで有効という事です・・・
（レベル２も対応お願いします！）

:::note warn
注意
書籍等購入する際は試験のバージョンが一致しているか必ず確認してください。
(今回はバージョン2.5を受験したので紹介している書籍等もそれに準拠しています）
:::

## スケジュール
1ヶ月前から対策を始めました。
なお、全体的な話として毎日きっちりはやっておらずモチベーションが高まっているときとかにやってます。
### 対策開始～2週間前
業務前の朝の時間や移動時間を活用してPing-tの問題を1日40問目安で解きました。ちなみに問題は約400問あります。
まずは現時点での自分の知識でどのくらい挑めるのか知る事を目標としました。
最初は惨敗でしたが何度もミスした部分を解き直すことでじんわりと知識が身に付いた気がします。

それらを全部解いたら2周目に入ります。間違えた直後に解き直して正解したような問題は時間を空けるとまた間違えることが多く、問題を周回することは大事だなぁと思いながら最終的には3周目を終えたところでPing-tでの対策は終わりました。

模擬試験という機能もあり90分60問で問題を解くことも可能なのでそちらも3回くらいやりました。
90点くらいは取れていたと思いますが、Ping-tの模擬試験で90点取れたとしても当日は出る問題の系統が若干違うので慢心しない方がいいです。

### 1週間前～前日
Ping-tでの対策がほぼ終わり、残りの時間はスピードマスター問題集をひたすら読みました。
ここで思ったのは「Ping-tでやらなかったような問題まだまだあるな」という少しばかりの絶望。

この問題集には問題の重要度というのが☆１～☆３でありますがそれは無視して一通りやった方が間違いないです。
なぜかというと、当日は見たことが無いような問題が出てくることもあるのでそこに対する余裕を持たせるには
少なくとも事前で学習できる部分は完ぺきにしておいた方がいいです。

後、スピードマスター問題集の場合選択肢ごとの解説があり「なぜ正解か」「なぜ不正解か」が分かりやすいので解説も見て学ぶとより身に付きます。

## 問題について
ほとんどは選択式ですが一部記述があります。
記述になる問題はかなり限定されているのでまずはそこを抑えるのがいいと思います。
具体的な問題の内容にここで触れるのはダメな気がするのでそこは問題集等を是非見てください。
気にする点としては
* 正しい記述方法がモノによってバラバラなので混在しないように1個1個覚える
（大文字や小文字の違いとか複数ある場合の区切り方とか）
* 問題文にある「正しいものを選べ」「適切なものを選べ」の違いを意識する
（こうやって書くことは出来るけど推奨されてないからNGっていうパターンが時折あって、そういう時は問題文が「適切なものを選べ」になっています。）
* 問題文と選択肢が全く同じで本番に出てくるパターンはほぼないので、ちゃんと応用を利かせられるようにする
選択肢ごとに「合っている」「誤りである」を覚える。

辺りです。

## 当日

緊張と寒さ（当日はニュースになるレベルの大寒波）でヤバかったですが問題を解き始めると「あー、大丈夫そう」という安心感がでて波に乗れたので、やはりある程度当日初めて見るような問題に対するバッファを持たせておくのが重要だと実感しました。
見直し等をしたうえで試験時間90分に対し40分を使っての退出だったので時間的な心配はありませんでした。
とはいえAPIの部分で初めて見るような問題の問われ方があって面食らったのを覚えています。(多分そこは不正解）

## 感想

セクショニングコンテンツについて理解が深まったのが一番大きかったかもしれないです。
divタグ乱用人間から卒業しなければと思いました。
自分のようなHTMLの基礎だけ知っているような人に対し知識のアップデートを行う機会としては良かったと思います。
あまり具体的に「これ知っておくといい」という部分が紹介できておらず申し訳ないですが受験する際の参考にしていただければと思います。
Salesforce Data Pipelines

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



# To enable the Provider Search org preference,you must first enable the Data Pipeline org preference.

:::note alert
To see this option, you must be assigned the Use Data Pipelines Add On User Settings permission set license and the Data Pipelines Add On permission set.
:::

+ [Set Up Provider Search Issue - Still unable to enable provider search after adding the correct permission sets](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000LJSsF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3376197a-352f-ca5d-ec57-080ea688eef3.png)


:::note
To use Data Pipelines, you must enable it first.

Enable Data Pipelines and Features
https://help.salesforce.com/s/articleView?id=sf.sdp_setup_enable.htm&type=5
:::

:::note
上記と同じ問題が発生し、「Data Pipelines Base User」権限セットのみが表示されました。検索から「データパイプライン」がまだ表示されませんでした。ページを更新する場所が他にあったので、ブラウザをハード更新したところ、検索に「データ パイプライン」が表示されました。
:::


:::note
It took me 15 minutes for the system to process and show up on my side.
:::
Xcodeで「The provided entity includes an attribute with a value that has already been used on this account. The app name you entered is already being used for another app in your account. 」

Flutterで作成したモバイルアプリをAppleStoreで提出しようと思ったら、「App record creation error」 と表示されました。

# 結論

https://appstoreconnect.apple.com/apps

App Store Connectで新しいアプリを作成していなかったことが原因
【Flutter】Immutableとは何か

## はじめに
Flutterを勉強中、Immutableという単語が出てきました。
「Immutableってなんぞ？？」と疑問に思ったので、備忘のためにまとめます。

## Immutableとは
Immutableとは不変、つまりは値が変わらないこと。
対義語はMutable、こちらは可変なので、値を変えることができます。

具体的に例を挙げて説明していきますね。

## MutableとImmutableの使い分け
ユーザがレシピを作成して、オンライン上にアップすることができるWebサイトを例として使いましょう。

Aさんがとっても美味しい肉じゃがのレシピを考案しました。
「他の人にも食べてもらいたい！」と思い、サイトにオリジナル肉じゃがレシピをアップします。

すると、Bさんが「美味しそう！」と思い、自分用にそのレシピを保存しました。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/1f6a42fb-7b96-d593-f5ac-b918b4c86754.png)


しかしAさん、「お醤油は大さじ1じゃなくて大さじ1.5の方が美味しい！」とレシピを改良。
サイトにアップしていたレシピを編集し、お醤油の分量を大さじ1から大さじ1.5に変更しました。

ここで問題になるのが、最初にAさんがアップしたレシピがMutableかImmutableかです。

Mutable、つまり可変だった場合は、Aさんはオリジナルのレシピに上書きすることになります。
Bさんもオリジナルのレシピを参照しているので、突然お醤油の分量が大さじ1.5になって驚くわけですね。
「元々の分量の味が好きだったのに、その分量がわからない！！」とBさんは焦ってしまいます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/fb832247-298e-2be2-cc8e-c05900772edf.png)


一方Immutableだった場合、つまり不変だった場合は、
Aさんはオリジナルのレシピは上書きできないので、オリジナルのレシピをコピーして、
そのコピーの値を変更することになります。
すると、Bさんはオリジナルのレシピを参照しているので、
Bさんが閲覧できるレシピは変更前の分量、つまりはお醤油の分量が大さじ1のレシピになります。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1080626/01dbe109-0fc3-82ef-6359-c2b2cadda38e.png)


今回のBさんは変更前のレシピを気に入っていたので、Immutableにした方が適していましたね。
反対に、Bさんが「Aさんがレシピを変更したなら、絶対に変更後のレシピの方が美味しいに違いない！！」というAさん信者だった場合は、
MutableにしてAさんの変更をすべて反映できるようにしてあげた方が適しています。
その都度使い分けが必要なんですね。

## まとめ
というわけで、Immutableとは値を変えることができないという意味でした。
対義語はMutable、こちらは値を変えることができるという意味です。

もともとの値を変えたくない場合はImmutable(不変)なオブジェクトを、
オリジナルを上書きしたい場合はMutable(可変)なオブジェクトを作りましょう。

以上、お読みいただきありがとうございました！
【Oracle】1未満の小数が「.1」になる表示の修正

Oracleで「0.1」をファイル出力等すると「.1」になるため、これを「0.1」としたい。

整数部3桁、小数点以下2桁
```
TO_CHAR(数値, 'FM990.99')
```
FM：以降のスペースを削除
9：数値がなければスペース
0：数値がなければ0
.：その場所に小数点

これだけでは整数の場合、「1.」となるため、更に末尾が小数点なら削除する。
```
RTRIM(TO_CHAR(数値, 'FM990.99'), '.')
```
- TO_CHARだけでできないか？
→無理そう
テーブルを自己結合して九九をやらせる

## はじめに

特に実用的な内容ではありません。ネタです。
テーブルの自己結合を使って遊んでみました。

## テーブル

1~9が入ったtestという名前のテーブルを用意。

```sql
select * from test;
```

![スクリーンショット 2023-01-25 11.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/7611e702-d192-87c1-6d14-ca3c2b265bc6.png)


## 九九

九九をやらせてみます。

```sql
select test1.id, test2.id, test1.id*test2.id 
from test as test1
join test as test2;
```

![スクリーンショット 2023-01-25 11.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/3c55b31b-8efe-1b2e-20bf-e69b8d9b8ea9.png)
…
![スクリーンショット 2023-01-25 11.30.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/6fd4a87b-c096-f1f8-953c-137dc73e46da.png)

## ポイント

* 同一のテーブル同士を結合させることが可能です。
* 同名のためas句にて別名をつける必要があります。

## まとめ

自己結合できるってことだけを覚えておき、必要なタイミングで活用できればいいかなと思います。
Android Studio Electric EelとRoom 2.5.0でSQLのハイライトが適用されないのを回避する

Android Studio Electric Eel と Room 2.5.0 の組み合わせで `@Query` に書いている SQL のハイライトがなくなり、コードジャンプも使えない現象が発生します。

![ハイライトが適用されていない Query](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/bb845fed-9f27-0dbd-aa25-a4327d82c0ea.png)

この問題の回避策を書いておきます。

## 回避策

「Android Studio」 → 「Settings」 を開き、「Editor」 → 「Language Injections」 を開く

![スクリーンショット 2023-01-25 11.05.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/9274c9ba-8c07-6fe0-fdc5-b461619c9488.png)

＋ ボタンから 「Generic Kotlin」 を選択し、「Name」 には任意の名前、「ID」 には 「RoomSql」、「Places Patterns」 には以下の内容を入力する。

```
+ kotlinParameter().ofFunction(0, kotlinFunction().withName("Query").definedInClass("androidx.room.Query"))
+ kotlinParameter().ofFunction(0, kotlinFunction().withName("DatabaseView").definedInClass("androidx.room.DatabaseView"))
```


![スクリーンショット 2023-01-25 11.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/597e656d-456c-5ef8-7d17-62d2d2083eb1.png)


最後に追加した内容を適用すると Room の `@Query` に書かれている SQL にハイライトやコードジャンプが復活する。


![スクリーンショット 2023-01-25 11.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126298/1f2b4acd-305a-03a5-8e64-f5fd65b6501c.png)


<hr />

別の回避策として Android Studio Flamingo を使うという手もあります。
(Electric Eel に修正パッチが来るかは不明)

## 参考
- https://issuetracker.google.com/issues/234612964#comment6
【Unity】Azure Kinect Examples for Unityのシーンが再生できない

検証用に借りているPCでAzure Kinectを動かすときにハマったので記録しておきます。

# 環境
[MSI Prestige-15-A11SCS-032JP](https://jp.msi.com/Business-Productivity/Prestige-15-A11X/Specification)
Windows 11 Pro 21H2
CPU：Core i7-1185G7
GPU：NVIDIA GeForce GTX 1650 Ti Max-Q 4GB

Unity 2021.3.4f1

# 状況
https://assetstore.unity.com/packages/tools/integration/azure-kinect-examples-for-unity-149700?locale=ja-JP

上記のアセットを購入し、ドキュメントに書いてある
・Azure Kinect Sensor SDK (v1.4.0)
・Azure Kinect Body Tracking SDK (v1.0.1) 
をインストールし、デモシーンを再生するとUnityがフリーズした。（落ちない、エラーも出ていない）

# 原因と解決方法
### Unityのフリーズ
Unityプロジェクトのパスに日本語が含まれていたからだった。Azure Kinectを使わない他のプロジェクトファイルは問題なく動作していたのでSDKが関係していそう。
借りているPCの「デスクトップ」がOneDriveと同期する設定になっており、User直下のデスクトップと違って常に日本語のパスになっていたみたい。Windows11に慣れてなくてわからなかったけど、PC本体の言語を英語に変更しても日本語のままだった。
`User/OneDrive/デスクトップ`から`User/Desktop`などにプロジェクトファイルを移動するとフリーズせず再生された。

### ボディトラッキングが反応しない
パスの修正でAzure KinectのColor映像は映るようになったけど、トラッキングが反応しないままだった。BodyTracking SDKのバージョンを変更すると動いた。

| Sensor SDK | Body Tracking SDK | 結果|
|:----------:|:----------:|:----------:|
| 1.4.1      |1.1.2 |✕（最新）
| 1.4.0     |1.0.1 | ✕（ドキュメント）
| 1.4.0       |1.1.0| ◯
| 1.4.1       |1.1.1| ◯


# 余談
TouchDesignerはSDK類をインストールしてなくてもAzure Kinectが動くのでとっても便利。
windowsのGitBashを日本語対応させる


## GitBashで日本語入力するとおかしくなる
例えばコミットする際などにGitBashを利用して日本語入力をすると、文字化けしたり、勝手に消えたりする事象が発生。
なんとかできないかと思い、色々調べてみると割とあっさり解決できたのでメモ書きとして残すことに。

## 日本語入力対応手順
1. GitBashのロゴを右クリックし、Optionを選択
1. Textを選択
1. Localeをjs_JPに、Character setをUTF-8に変更
1. 同画面の上部にあるFontのselectを選択
1. フォント名をMS ゴシックに変更
1. 最後にsaveすればOK

![スクリーンショット 2023-01-25 110058.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119237/2fb58f27-950c-2b76-5d9c-7b5788203430.png)

これだけでGitBashで日本語を使えるようになります。
簡単ですね！
Heroku Schedulerのlogを見るには

こんなコマンドで取得することができます

`heroku logs -t -a アプリ名 --ps scheduler`
実行されるとコマンドが表示されるみたいですね

```
2023-01-25T01:08:13.891392+00:00 heroku[scheduler.6446]: Starting process with command `echo "flushdb" > /tmp/cmd.txt; heroku redis:cli -a slack-all-timeline HEROKU_REDIS < /tmp/cmd.txt`
```
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「コスト削減に役立つオプション」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「コスト削減に役立つオプション」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[コスト削減に役立つオプション](https://learn.microsoft.com/ja-jp/training/modules/configure-subscriptions/8-apply-cost-savings)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「リソースタグ」](https://qiita.com/fsd-jume/items/d1c2799c00afa30ea1b1)

## コスト削減に役立つオプション
**◆Reservations**
・1年分/3年分の前払い(月払いも可)で使用するリソースの割引を受けることができる
・従量課金制の料金を最大72%削減可能
・対象のサービス(一部)
　-VM
　-SQL Databaseのコンピューティング容量
　-Azure Cosmos DBのスループット
・予約購入時に選択した属性と一致するリソースの使用に割引が適用
⇒リソースを停止させた場合、属性が一致する指定スコープ内の別のリソースに自動適用
⇒一致するリソースが無い期間も予約割引期間は消費される
・属性の例
　-SKU
　-リージョン
　-スコープ(管理グループ/サブスクリプション/リソースグループ)
・例：VMを1台分1年間の予約購入をした場合
　-VM1/VM2：予約購入時に指定したサブスクリプション/SKU/リージョン
　-VM3：予約購入時の指定と異なるSKU(それ以外は同じ)
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/1d760a09-33f4-f256-b819-f73277825464.png)

**◆Azureハイブリッド特典**
・対象ユーザ：ソフトウェアアシュアランスを含む対象製品のライセンスを持つユーザ
・対象製品(オンプレミス)
　-Windows Server
　-SQL Server
　-Red Hat Enterprise Linux
　-SUSE Linux Enterprise Server
・オンプレミスからAzureへの移行にかかるコストを節約可能
・Azureハイブリッド特典の節約計算ツールで節約額の確認が可能

**◆Azureクレジット**
・Visual Studioサブスクリプションのユーザは月単位のAzureクレジットを利用可能
例：Visual Studio EnterpriseではUSD150クレジット/月を利用可能
・Azureが開発/テスト用の自分専用のサンドボックスとなる

**◆Azureリージョン**
・リージョンごとに価格が異なる場合がある
⇒別のリージョンを選択して節約できるか確認

**◆予算**
・Cost Managementの予算作成機能によるコスト分析が可能
・特定期間中の支出を監視し、コストを積極的に管理

**◆料金計算ツール**
・Azureのすべての領域における見積もりを提供可能

## 次の学習内容
**◆管理グループ**

https://qiita.com/fsd-jume/items/98d61193f8cf9b71a09a

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
クリーンアーキテクチャのディレクトリ構成

```
├── data
│   ├── datasource
│   │   └── 永続記憶デバイスへのアクセス。repositoryから依存される。
│   ├── repository
│   │   └── 永続記憶へのアクセス。データ取得の架け橋。
│   └── network
│       └── ネットワークへのアクセス。
├── domain
│   ├── model
│   │   └── ビジネスロジック。usecase、presenterから依存される。
│   ├── entity
│   │   └── ビジネスロジックが含まれないデータ。メソッドは含む。依存しない。
│   └── usecase
│       └── ユースケース。model、entityに依存する。
├── presentation
│   ├── presenter                                   
│   │   └── ユーザインタフェースの制御。usecase、model、entityに依存。
│   └── ui
│       └── view
│           └── ユーザインタフェースの実装。全てに依存する可能性がある。
└── utility
    └── 横断的に使用するロジック及び拡張。依存しない。
```
モーダルを簡易につくってみる

モーダルを簡単に作ってみる
出来上がったやつのサンプルページのリンク、イメージはこんな感じ

https://sueasen.github.io/javascript-exercise/work/modal/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/318c8fd5-fdd0-b002-c283-f11c0f8ec257.png)

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="GRXrqrd" data-user="sueasen" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/sueasen/pen/GRXrqrd">
  Untitled</a> by sueasen (<a href="https://codepen.io/sueasen">@sueasen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

- HTML ボタンとモーダル準備
```html:index.html
<!doctype html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link rel="stylesheet" href="./style.css">
</head>

<body>

    <button class="openModalBtn modal-proc">モーダル！</button>

    <section class="modalArea">
        <div class="modalBg modal-proc"></div>
        <div class="modalWrapper">
            <div class="modalContents">
                <h1>モーダル</h1>
                <p>ここは適当に変更する</p>
            </div>
            <div class="closeModalBtn modal-proc">×</div>
        </div>
    </section>

</body>

<script src="script.js"></script>

</html>
```

- CSS でモーダルの配置・表示/非表示
```css:style.css
@charset "utf-8";

/* モーダル全体 */
.modalArea {
  visibility: hidden;
  opacity : 0;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transition: .4s;
}

/* モーダル・背景 */
.modalBg {
  width: 100%;
  height: 100%;
  background-color: #000;
  opacity : 0.7;
}

/* モーダル・ダイアログ */
.modalWrapper {
  position: absolute;
  top: 50%;
  left: 50%;
  transform:translate(-50%,-50%);
  width: 70%;
  max-width: 500px;
  padding: 10px 30px;
  background-color: #fff;
}

/* モーダル・閉じるボタン */
.closeModalBtn {
  position: absolute;
  top: 0.5rem;
  right: 1rem;
  cursor: pointer;
}

/* モーダル表示 */
.is-show {
  visibility: visible;
  opacity : 1;
}

/* モーダル表示用ボタン */
.openModalBtn {
  position: absolute;
  top: 50%;
  left: 50%;
  transform:translate(-50%,-50%);
}
```

- JavaScript で動きを設定
```javascript:script.js
/**
 * モーダル操作（表示/非表示ボタン、モーダル・背景）のイベント設定
 */
window.addEventListener('load', (e) => {
    document.querySelectorAll('.modal-proc').forEach(dom => {
        dom.addEventListener('click', () => {
            document.querySelector('.modalArea').classList.toggle('is-show');
        });
    });
});
```
フォルダ内のファイル名を配列で取得するターミナル構文

なんかこう…痒いところに手が届かないというか、いつもこの辺の地味なところで手が止まる今日この頃。

半日悩んだ末にやっと出てきたこの構文。


`current_path=$(pwd);files=($current_path/*);echo ${files[@]};`


このコマンドは、現在のカレントディレクトリのパスを取得し、そのフォルダ内のすべてのファイル名を配列filesに格納します。

## 構文詳細

今回の構文の詳細を説明します。内容としては、
1. 現在のパスを取得する
1. 配列として格納
1. ターミナル上に表示

といった流れです。




### 現在のフォルダパスを取得する
`current_path=$(pwd)`
この部分は、現在のカレントディレクトリのパスを取得し、変数current_pathに格納するコマンドです。

自身では、一度`cd`でディレクトリを移動した後に作業することが多いので、パスを手打ちしたり、いちいちD＆Dでフォルダ持ってきたりはしない前提がありまして。なので、現在位置を`pwd`で拾い、それを使える状況がベストでして。

### ファイル名を配列で
`files=($current_path/*)`
この部分は、current_pathに格納されたパスを使用して、特定のフォルダ内のすべてのファイル名を配列filesに格納するコマンドです。

そもそもターミナルの使い方に慣れていない筆者で、変数の使い方も怪しいところで…
一度取得したパスを変数に入れ、文字列を追加して使用する、ここにたどり着くにも一苦労でした。

### 配列に入れたファイル名の取り出し
配列filesを使用して、特定のファイル名を取得することもできます。 例えば、配列filesの最初のファイル名を取得するには、 `echo ${files[0]}` と入力します。


配列内のすべてのファイル名を一度に表示するには、 `echo ${files[@]}` が使用できますが、改行されずに、スペース区切りで一気に出てきてしまい、可読性が悪くなります。

### 隠しファイルについて
配列内のファイル名には、隠しファイルも含まれてしまいます。
隠しファイルを除外するには、`files=($current_path/.[^.]*)` と書きましょう。
アンケートでメールを送信するときのエラー


+ [send survey](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfyRg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b520b28e-de7f-97d8-d795-ed1c9d648c8c.png)

:::note
I managed to solve it, I had to go to settings -> global actions -> SendEmail -> Edit Layout, and I managed to enable the fields to appear on the screen.
:::

+ [【未解決】Salesforce send Survey email in sandbox is blank/empty](https://salesforce.stackexchange.com/questions/377536/salesforce-send-survey-email-in-sandbox-is-blank-empty)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/77d9707f-24f0-afbf-a100-821bc110f43c.png)

[Email body section does not load in the Email composer](https://help.salesforce.com/s/articleView?id=000384148&type=1)


+ [【未解決】Non-admin Invite Applicant error](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfzdg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/787e6893-ecbe-03e3-d810-cf120e41e1cd.png)

+ [【未解決】Error when trying to Send Salesforce Survey: We couldn't find the record you're trying to access](https://salesforce.stackexchange.com/questions/266661/error-when-trying-to-send-salesforce-survey-we-couldnt-find-the-record-youre)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cf583524-bffb-9ebf-30fb-3c586eb01ab6.png)
指定した複数リージョンのセキュリティグループの一覧をワンライナーで作る

# はじめに

セキュリティグループルールの一覧は管理コンソールからのCSV出力が可能ですが、複数リージョンの出力を一度に行いたかったのでAWS CLIで一覧を作成することにしました。
作成した一覧はタブ区切りになっているのでスプレッドシートなどにコピーしてご活用ください。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-security-groups.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-security-group-rules.html

## コマンド

- 取得したいリージョンが複数あればスペース区切りでリージョン名を追加してください

```bash
echo -e "OwnerId\
\tRegionName\
\tVpcId\
\tGroupId\
\tGroupName\
\tDescription\
\tSecurityGroupRuleId\
\tGroupId\
\tIsEgress\
\tIpProtocol\
\tFromPort\
\tToPort\
\tCidrIpv4\
\tCidrIpv6\
\tDescription\
\tReferencedGroupInfo.GroupId\
\tReferencedGroupInfo.PeeringStatus\
\tReferencedGroupInfo.VpcId\
\tReferencedGroupInfo.VpcPeeringConnectionId\
"\ > /tmp/sg-rules.tsv; \
echo "ap-northeast-1 us-east-1" | tr ' ' '\n' | \
while read region_name
do
    aws ec2 describe-security-groups \
        --region $region_name \
        --query 'SecurityGroups[*].[OwnerId, GroupId, GroupName, VpcId, Description]' \
        --output text | LANG=C sort -u | \
    while read owner_id sgid group_name vpcid description
    do
        aws ec2 describe-security-group-rules \
            --filter Name="group-id",Values=$sgid \
            --region $region_name \
            --output text \
            --query "SecurityGroupRules[*].[\
                SecurityGroupRuleId\
                , GroupId\
                , IsEgress\
                , IpProtocol\
                , FromPort\
                , ToPort\
                , CidrIpv4\
                , CidrIpv6\
                , Description\
                , ReferencedGroupInfo.GroupId\
                , ReferencedGroupInfo.PeeringStatus\
                , ReferencedGroupInfo.VpcId\
                , ReferencedGroupInfo.VpcPeeringConnectionId\
            ]" | sed "s/^/${owner_id}\t${region_name}\t${vpcid}\t${sgid}\t${group_name}\t\"${description}\"\t/"
    done
done >> /tmp/sg-rules.tsv;
```
goutteインストールのバージョンエラー解決

```
 composer require weidner/goutte
```
したところ、以下のエラーが出た。

```
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - fabpot/goutte[v3.2.0, ..., v3.2.1] require symfony/css-selector ~2.1|~3.0 -> found symfony/css-selector[v2.1.0, ..., 2.8.x-dev, v3.0.0-BETA1, ..., 3.4.x-dev] but the package is fixed to v5.4.19 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
    - fabpot/goutte[v3.2.2, ..., v3.2.3] require symfony/css-selector ~2.1|~3.0|~4.0 -> found symfony/css-selector[v2.1.0, ..., 2.8.x-dev, v3.0.0-BETA1, ..., 3.4.x-dev, v4.0.0-BETA1, ..., 4.4.x-dev] but the package is fixed to v5.4.19 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
    - fabpot/goutte[v3.3.0, ..., v3.3.1] require guzzlehttp/guzzle ^6.0 -> found guzzlehttp/guzzle[6.0.0, ..., 6.5.x-dev] but the package is fixed to 7.5.0 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
    - weidner/goutte 1.6.0 requires fabpot/goutte ^3.2 -> satisfiable by fabpot/goutte[v3.2.0, ..., v3.3.1].
    - Root composer.json requires weidner/goutte 1.6 -> satisfiable by weidner/goutte[1.6.0].

Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Installation failed, reverting ./composer.json and ./composer.lock to their original content.
```

どうやらバージョンが違うと怒られているらしい。
Laravelのバージョンを確認

```
php aritsan -V 
```

私のバージョンは7.~でした。
バージョン7あたりはGoutteのバージョン1.6でいい様子。
今度はバージョンを指定してみる。

```
 composer require weidner/goutte:1.6
```

また冒頭と同じエラーが。
仕方なくcomposer.jsonを編集

```
"require": {
        ~~,
        "weidner/goutte": "^1.6"
    },
```
コマンド実行

```
composer update
```
解決できました。

参考：https://halfpower.work/2022/09/18/goutte%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E8%A7%A3%E6%B1%BA%E3%81%AE%E4%BB%95%E6%96%B9/
顧客分析の手順 - １つの変数を把握する

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第6回： 1つの変数を把握する
前回までで、単一の表を用いて各顧客の様々な事実を把握する方法、その事実としての変数を流し込む方法、そしてその変数の性質について触れてきました。今回は出来上がった変数がどのような特徴を有しているかを把握するための方法についてご紹介していきます。


### 分布の理解
質的変数の分布は、図8 のように複数の値毎に顧客がどのように分散しているか、そしてそれぞれの値における発生頻度を理解します。これによって分布の全体像が把握できます。また、順序を規定している質的変数に関しては、アンケート結果のように元からその変数が質的変数であれば、最も頻度の高い発生値（最頻値）はどこか、最小値はどこか、最大値はどこかについても理解可能です。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/26e5c4d3-042b-989a-94bf-1e59e03665d4.png">


量的変数を同様に捉える場合には、複数のグループに集約し、グループ毎の顧客数を縦の長さで表現することによって理解可能です。このような場合、その分布は図8 の形式で理解できます。元々量的変数は性質として連続した値で構成されているため、そのままの値を見る場合には値の大きい、もしくは小さい順に各顧客を並びかえ、以下の図9 のような形で表現されます。しかしながらこれは顧客数が膨大である場合には現実的な見方とは言えません。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/f427733e-3cd2-4c59-4ea0-75a1a074ce53.png">

しかしながら一方、最頻値、最小値、最大値、平均値といった代表値に関しては、元々のデータを利用して算出する必要があります。一旦集約してしまった値をもとにした場合、本来の値とずれる可能性があるためです。

### 量的変数のグループ集約
前述した量的変数のグループ集約をする場合には、いくつかのグルーピング基準を設定する必要があります。以下にその代表的な例を 4つご紹介します。
### 件数等分：
 一般にデシル分割、クインタイル分割等の呼称で用いられているグルーピング基準がこれです。対象が顧客であれば、顧客数毎に N個のグループに分割します。その際、並び替えの基準として何らかの量的変数を用います。特徴として各グループの顧客数は基本的に同じ数となります。

### 実値等分： 
量的変数の最大値から最小値を差し引き、その範囲を求めます。そして N個のグループに分割したい場合には、その範囲を N等分に分割します。各顧客はそれぞれが有している量的変数の値に応じて、各グループに所属します。特徴として、各グループに所属する顧客数はばらばらです。

### 実値等幅： 
量的変数の最小値から最大値を範囲として、その範囲を任意の量的変数に順ずる値幅で等分します。例えば変数が買上金額、最小値が 0円、最大値が 1,000円として、150円幅で分割するといった形で指定します。そうすると結果としては 0円から 150円の顧客、151円から 300円の顧客...901円から 1,000円の顧客といった形式で分割、集約されます。

### 任意境界： 
グループの上下境界を任意に指定します。ある意図を持って集約させたい場合にはこの手法を用います。

以下の図10 は、ある顧客毎の量的変数を前述した 4つの方法で分割、集約した結果です。


<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/e37591ec-5b2a-e7d2-4038-a2adbf522344.png">


ここで、件数等分と実値等分は N個のグループに、実値等幅では範囲を N値きざみに、任意境界は 2つのグループに分解するための境界を規定しています。

このような手順を利用して、単一の変数が有している分布を理解し、分析の対象として適しているかどうかを見定め、実施する分析や顧客管理上の基礎理解とします。おそらく、想定される各変数それぞれに対してこのような基礎分析を済ませるだけでも、自社の顧客に関する知識は充分に底上げされるのではないかと考えます。


#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
クロス集計表を作成する2＊1_統計量(SPSS Modeler データ加工逆引き11-7)

# クロス集計表を作成する（2＊1_統計量の集計表）

![スクリーンショット 2023-01-18 18.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/165144bf-336f-17c6-b447-d8e533f0458f.png)
＊該当のないセル（AB型北地区の50代）は欠損値になっています

## 1.想定される利用目的

・データ理解のための基礎統計量確認
・固定帳票の作成


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/cross_tabulation2_1s.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2023-01-10 15.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d748b9ea-0847-f6cb-ddfc-d1fb5985793a.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-01-16 14.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5a18a392-7a46-243c-c102-4397c3a45427.png)

b.[再構成]ノードを以下のように編集します。[年代]を[再構成フィールド]に移して[値フィールド]は[体重]を選択します。
![スクリーンショット 2023-01-16 14.07.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0abe2852-a9cc-8a27-4179-7a26376adb18.png)

[プレビュー]します。
![スクリーンショット 2023-01-16 14.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/caecb8d9-bfeb-ed0f-adcc-182e0f974c6b.png)

c.[レコード集計]ノードを以下のように編集します。
![スクリーンショット 2023-01-16 14.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a9936aad-2879-771b-d41e-e41a21b63ad7.png)

d.[ソート]ノードを以下のように編集します。
![スクリーンショット 2023-01-10 15.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f8efb2a1-949a-2bd8-0188-6dd2628da1fc.png)

[デーブル]ノードを実行します。AB型の50代には該当がないのでNULLになっています。
![スクリーンショット 2023-01-16 14.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f5ab4060-f037-4a09-02e7-223e1f217469.png)

#### 注意事項

空欄NULLの扱いについて[-]や[N/A]などの特定文字を代入する場合には置換ノードを利用します。

[再構成]ノードで列に展開するメンバーが表示されないときは前方でデータ型の[値の読み込み]を実行します。
フィールド名は適宜[フィルター]ノードで変更します。

## 4.参考情報

####  SPSS Statistics Custom Tablesと連携して多重クロス集計を作成する

https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-06/

####  カテゴリ値を列に展開してIDで集約　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/2519553c7cce0fc0b0e0

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Quick Start: Customize an App with Lightning Object Creator /Import Data to Create a Custom Object

[Trailhead関係　個別の課題別](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)


# We can’t find the custom object 'Vehicle Interest

+ [Quick Start: Customize an App with Lightning Object Creator /Import Data to Create a Custom Object](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jfy5z)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4f08bb9e-1a50-76cc-eb62-c233469a5f1d.png)


どうもブラウザの問題みたいな回答だ

:::note
Could you please follow the below steps.

-- Click on the browser 3 dotted menu on the top right
-- Settings
-- Privacy and security
-- Cookies and other site data
— Select “Allow all cookies”
— Disable all your browser extensions.
-- Clear the cookies, cache for "All time"
-- Make sure the browser is updated with the latest version.
-- Restart your browser 
-- Login to your Trailhead account
-- Click on your profile avatar on top right corner
-- Click on Hands-On Orgs 
-- Click the "Launch" button next to the Trailhead playground in which have completed this challenge.

If the issue still persists, kindly check in a different browser or an incognito window. 
:::

# 本番環境に作成される？

+ ['Import Data to Create a Custom Object' challenge keep saving on my Org not on Trailhead.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000NFG79)

解答を見てもよく分からん。

:::note
I've tried again just now, and it worked!
After changing the 'hand on org' password again, it worked.
:::
Googleプロジェクト管理：スクラムの3本柱

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1c9e3622-d11d-e6dd-1bb7-f12b3fef8845.png" width="800">

今回、アジャイルの傘下にある特定の方法論の一つであるスクラムについて、説明します。

# スクラムの理論　

まず、スクラムとは何でしょうか？

スクラムガイドでは、スクラムを「複雑な製品を開発し、提供し、維持するためのフレームワーク」と定義しています。つまり、チームが置かれている環境や業界が予測困難で、多くのリスクがある場合でも、スクラムを使ってユーザーにとって価値ある製品を作ることができるのです。

スクラムは、反復的かつ漸進的なアプローチを用います。
- 反復的とは、プロジェクトのプロセスが繰り返されることを指します。
- インクリメンタルとは、作業が小さなチャンクに分割され、互いに積み重なることを指します。製品は、各イテレーションで行われる作業を通じて、時間をかけて構築されます。

***<font color="MediumVioletRed">反復</font>*** と ***<font color="MediumVioletRed">インクリメント</font>*** により、プロジェクトのライフサイクルを通じて進捗状況を確認し続けることができる。これにより、予測可能性が高まり、プロジェクトの不確実性を管理することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/9af47390-6eab-1279-05e0-f87077469820.png" width="600">

スクラムは、***<font color="MediumVioletRed">経験主義</font>***　と呼ばれる科学的な理論に基づいています。これは、「真の知識は、実際に生きている経験から得られる」というシンプルな概念を表すおしゃれな言葉です。

スクラムの創始者は、物事が計画通りに進むと仮定したり、不確実な世界で将来を予測しようとしたりすべきではないと強調しています。その代わり、スクラムを使うなら、プロジェクトで行う各決定が実際の経験と確かなデータに基づいていることを保証することになるのです。つまり、各イテレーションやインクリメントは、プロジェクトを改善するために本当に価値のあることを学ぶことができるミニ実験として理解されるのです。

# スクラムの３本柱

経験主義は、3つの基礎的な柱の上に成り立っています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5a5f9a4c-a397-1686-e0ad-bcdf844f328f.png" width="600">

## <font color="MediumBlue">1.透明性（Transparency)</font>

透明性とは、私たちの仕事の最も重要な側面を、結果に対する責任者に見えるようにすることです。誰もが透明でなければなりません。これには、スクラムチームのメンバーからシニアスポンサー、そしてユーザーまで、すべての人が含まれます。

小さなチームであれば、透明性を確保するのは簡単です。そして幸運なことに、スクラムチームは意図的に3人から9人までの少人数で構成されています。こうすることで、コミュニケーションの断絶、および不必要な複雑化を避けることができます。スクラムチーム内の透明性は、チームの生産性とプロジェクトの完成に不可欠です。

チーム以外の透明性という点では、顧客、スポンサー、経営陣など、すべてのステークホルダーに対して透明性を確保することで、関係者全員の間に信頼関係が築かれます。透明性はまた、より多くのコラボレーションとミスの減少を促します。

## <font color="MediumBlue">2.検査(Inspection)</font>

検査とは、スプリントゴールの結果に向かって、望ましくない差異を検出するためにタイムリーにチェックを行うことを指します。つまり、常に自分たちの進捗や成果物をチェックし、望ましくない変化を発見できるようにすることです。

チームがアジャイルで仕事をするとき、ステークホルダーによる仕事の点検は、成長と進歩のために必要な機会です。検査が多く行われれば行われるほど、チームは自分たちの仕事をより改善することができます。変化と改善のチャンスがあるうちに、意図的に点検することで得られる本当の価値があるのです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/faba53b6-1609-0888-81c8-b12b1684017e.png" width="500">

## <font color="MediumBlue">3.適応(Adaption)</font>

検査は、私たちの次の柱である「適応」を推進するものでもあります。適応とは、プロジェクト、製品、あるいはプロセスを調整して、それ以上の逸脱や問題を最小化する方法を継続的に探すことです。

スクラムでは、そしてアジャイル全体でも、私たちは変化を受け入れ、常に改善し続けることができるのです。ですから、私たちが適応するとき、うまくいっていない、あるいはもっとよくなる可能性のある側面を変えます。

透明性と検査は、スクラムチームが改善や変更を特定するために必要な情報と機会を提供する。適応には問題に対する即時の修正も含まれるが、将来のプロジェクトが過去の過ちを繰り返さないように、変更を実施することも含まれるかもしれない。
検証ツールのHTMLを編集せずにテキストを直接書き換える方法があった

コーディングしていて「あるある」なのが、

**構築したレイアウト内の文字数が増えたら、崩れないかな...？**

そんな時、コードで文字数を増やしたり、検証ツールのHTML要素からテキストを増やしたりしていませんか？

僕もそうしていました。

しかし！この作業をもっと簡単にできる方法があったんです💡

## `document.desidnMode` で直接編集を可能にする

`document.desidnMode` という設定をすることで、**ブラウザに表示されるテキストが全てカーソル選択して編集することができます。**

```
document.desidnMode = 'on';
```

## サイトのアドレスバーでJSを入力する

こちらも同様の効果があります。

※Chromeで貼り付けた場合、`javascript:`が自然と抜けるので手打ち

```
javascript:document.body.contentEditable='true'; document.designMode='on'; 
void 0
```

## 実際の動作

![1bb9fa76d462f20c1b55a43db3c9dd3f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949803/8f54e6ab-fe7b-c405-7bcc-7774e168dc0b.gif)
なかなか使えるCHATGPT

CHAT-GPTでしばらく遊んでいる。

# 内容
自身のＳＮＳでコメントを返す。

# フォーマット

絵文字と文章で次の文章に２０字で、私たちのコミュニティでも企画してくださいとコメントをして下さい。「 　＊＊＊　」

＊＊＊に文章を入れている。

# 例

絵文字と文章で次の文章に２０字で、私たちのコミュニティでも企画してくださいとコメントをして下さい。「昨日の三上山は楽しかった」

🎉🎉 みんなで昨日の三上山を楽しんだのね！ 次は何か新しい企画をしよう！ 💡💡 皆で一緒に考えて、私たちのコミュニティで企画してみましょう！ 🙌🙌

# 参考

https://qiita.com/EasyCording/items/fd5efe3920dcc4f03d14
[sklearn]pipeline実行できない

scikit-learnのpipelineは前処理やモデルを定義しておくと処理を簡潔にかけるので重要です。
今回、pipelineをつかってgridsearchを組み込んだときにpipelineが動かなかったエラーにハマったのでその解決法です。

```python:❌
param_grid = {'n_components': [2, 3, 4, 5, 6], 'scale':[True, False], 'max_iter': [1000]}

pipe = Pipeline(steps=[('scaler', StandardScaler()),('model', PLSRegression())])
kf = KFold(n_splits=5, shuffle=True, random_state=0)
grid_search = GridSearchCV(pipe, param_grid, cv=kf, refit=True, n_jobs=-1, verbose=1)
```


```python:エラー
ValueError: Invalid parameter 'max_iter' for estimator Pipeline(steps=[('scaler', StandardScaler()), ('model', PLSRegression())]). Valid parameters are: ['memory', 'steps', 'verbose'].
```

# 解決法
param_gridの指定方法を間違えていました。pipelineを組むときはどの処理の引数か判断できるようにprefixをつける必要があります。
指定の方法は「pipeline名 + '\__'」をつければok。
今回だと'model\__'をつければ良いです
```python:⭕️
param_grid = {'model__n_components': [2, 3, 4, 5, 6], 'model__scale':[True, False], 'model__max_iter': [1000]}

# ...
```
neosでlogix その87

# 概要
neosでlogixやってみる。
整理してみた。

# 参考にしたページ。

https://qiita.com/e1ght3/items/34d558045f977335f28d


# 生成
|対象|　内容
|:--|:--|
|world|		ホームからワールドを新規作成して保存。現在自分がいるワールドも新規保存したワールドに切り替わる。
|folder|		インベントリーのプラスマークをクリックする。フォルダに名前を付ける。メールマークでフォルダを共有フォルダに設定して、セッションに、取り出す。
|avater	|	セッションに3Dモデルをペーストする。モデルインポーターが、起動する。7zbson、そのものを、ペーストできる。
|object	|	インベントリを開いて、Essential Tools>DevToolTipを呼ぶ。

# 保存
|対象|　内容
|:--|:--|
|world	|	ホームからセッション設定、保存。
|folder	|	-
|avater	|	グラブして、インベントリーのプラスマークをクリックする。(ctrl+s)
|object	|	グラブして、インベントリーのプラスマークをクリックする。(ctrl+s)

# 呼び出し
|対象|　内容
|:--|:--|
|world	|	セッションに、neosrec:///****を、ペーストする。(ctrl+v)
|folder	|	セッションに、neosrec:///****を、ペーストする。(ctrl+v)
|avater	|	セッションに、neosdb:///****を、ペーストする。(ctrl+v)
|object	|	セッションに、neosdb:///****を、ペーストする。(ctrl+v)

# 共有
|対象|　内容
|:--|:--|
|world	|	ホームからセッション設定でワールドオーブ取得、セッションに、取り出す。共有フォルダに入れる。
|folder	|	インベントリーのメールマークでフォルダを共有フォルダに設定して、セッションに、取り出す。それをグラブして、tでコンテキストメニューを開く。「リンクのアドレスをコピー」をクリックする。
|avater|		共有フォルダに入れる。
|object|		共有フォルダに入れる。

以上。
【達人プログラマー】ユーザーを喜ばせる

# はじめに
達人プログラマー（第2版）を読み終えました。
こちらの書籍には、設計やコーディングなど技術的に参考になる箇所だけでなく、心構えについても素晴らしいと思える箇所が多くありました。
簡単にですが、そのなかから一つ抜粋して記事を書いていきます。

https://www.ohmsha.co.jp/book/9784274226298/


# ユーザーを喜ばせる
>人を魅了しようという場合、あなたのゴールはお金を儲けでもなく、人を思いどおりに動かすことでもない。彼らを大きな喜びで満たすことだ。
▶ガイ・カワサキ

>開発者としての我々の目標は、「ユーザーを喜ばせる」ことです。それこそが我々の存在理由なのです。ユーザーのデータをマイニングできるようにしたり、ユーザー数を数えたり、ユーザーの財布の紐を緩めることではありません。

**[52 ユーザーを喜ばせる]** のセクションのはじめにはこのように書かれています。
自身の利益を考えずに、ユーザーを喜ばせる。献身的で素晴らしいですね！
しかし当たり前ですが、生活していく上でお金を稼がなければ生きていくことはできませんよね。[^1]
[^1]:プログラマーとしての業務が本業でないなどであれば別ですが、、、

ここで言いたいのは、自身の邪な気持ちを抑えユーザーが喜ぶものを目標として開発することで、開発されたものや開発した人に対して「お金や行動で支援したい！」と、開発者側への利益が付随してくるのではないかなと私は捉えました。

そう考えたときに「艦これ」を思い出しました。[^2]
リリースして大人気だったにもかかわらず、あまりにも課金要素が少なく、Twitterや2chなどでは冗談交じりで課金させてくれーと騒がれていたのを覚えています。
自分も、無課金で問題なくゲームを楽しめていましたが、サービスを少しでも長く続けてほしいとお布施の気持ちからドックの解放などしていました。笑

[^2]:参考：[果して「艦これ」は儲かっているのか。「アスキークラウド」が迫る「没頭」ビジネスの正体](https://news.nicovideo.jp/watch/nw835911)

## どうすれば喜んでもらえるか？
では、そのためにはどうすればよいでしょうか？
>クライアントを喜ばせたいのであれば、問題解決を積極的に支援できるように彼らとの関係を培ってください。あなたの肩書は「ソフトウェア開発者」であるべきなのです。それが我々のやることであり、達人プログラマーの本質というわけです。
我々は問題を解決するのです。

このような記述があります。
なにやらこれが肝みたいですね。
ユーザーを喜ばせるためには、抱えている問題を解決すればよいようです。

## 問題の解決方法
本来であればユーザーとする人と直接やりとりできるのが一番なのですが、アプリ開発だとなかなか難しいですよね。
そこで今回はプランナーさんとのやりとりなどに置き換え[^3]つつ、**[45 要求の落とし穴]** からどうすればよりユーザーの問題解決に近づけるか挙げていきます。
[^3]: 本来であれば、使用者と直接やりとりができればいいですが、難しいので、、、。お問い合わせや、リアルイベントなどを通して接する機会があればよりいいと思います！

### セラピーとしてのプログラミング
アプリ開発をするにあたって、まずプランナーさんなどからこういうものを作りたいという要求（企画、仕様）が出て来ると思います。
しかし、その要求を鵜呑みにしてそのまま実装してはいけません。
確認してみると疑問に思う点があるはずです。

```
例：
要求：50ドル以上で送料を無料にしたい

疑問点：
・50ドルは税込価格で考えるのか？
・50ドルは送料込みで考えるのか？
 などなど
```
こういった疑問点を質問し、既に考えていたことですぐに答えが返ってくることもあれば、全く想定しておらず返答に困るような質問もあると思います。
そうなった時がチャンスです。
双方、場合によっては全体を巻き込んでどうすればよいか考えます。
引き起こされる結果を考え、フィードバックを繰り返すことでより要求が洗練されていくのです。

### 真実の要求はプロセスの中にある
上記は言葉でやり取りしやすい例でしたが、中には言葉では言い表しづらい場合もあると思います。
そんなときは、モックアップやプロトタイプを作成し、実際に確認してもらうことで、話がすすみやすく、認識の違いによる間違った道にも進みづらくなるでしょう。

### 相談者の靴を履いて歩く
こちらは実際の対象となるユーザーに対してもできることです。
ユーザーになりきってみるのです。
例えば弊社ではアーティストさんのコンテンツを扱うことが多いのですが、ライブやイベントに参加してみることでアプリを実際に使うファンの方々の気持ちを理解しやすくなるでしょう。

## チームなどで
ユーザーと聞いて真っ先に思い浮かぶのは、外部のお客様かと思いますが、なにも外部の人にだけあてはまることではありません。
日々チーム内では、それぞれが様々な作業をしていると思います。
例えば雑談中などにこういった作業が大変だーということを耳にした場合、
上記の方法などで本当の要求を見つけ、便利なショートカットを教える、空いた時間でちょっとしたツールを作成してみるなど、解決してあげることで、チームのメンバーがきっと喜んでくれることでしょう！


# おわりに
10ANTZでは、「ファンとアーティストの“ありがとう”をつなぐ」というミッションを掲げています。
アプリを利用するファンの方だけでなく、アーティストさんなどもユーザーと捉え、関わって頂いた皆さんに喜んでもらえる仕事を目指していきたいです！
TCP/IPについては、基礎レベルだから絶対知っとこう！

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はTCP/IPの仕組みについて調べてみましょう！

![インスタスライド_202301051.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/47fb07df-8bf1-0a69-401d-5947593bc5ea.gif)


# TCP/IPについて
TCP/IPの詳細は、業務ではあまり使いません
ーネットワークエンジニアは使います。
ーAWSで構築する時に使います。
でも知らないと恥ずかしい知識です。

# TCP/IPとは？
インターネットや企業ＬＡＮで広く利用されているオープンなネットワークのプロトコルです

# プロトコルとは？
通信規約：通信のための約束事です。
通信規約を決めて置く事でオープンで全てのPCがネットワーク接続できます。

# プロトコルのイメージ
電気機器をコンセントに挿せばどのコンセントでも充電できます。
これは規約にそって作れてるからです。

同じイメージです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/43cff335-5c59-e767-89f4-1ccd23d794d3.png)

# TCPIP特徴
パケット通信

通信データを「パケット（小包）」と呼ばれる小さな単位に分割して、送受信する通信方式です。
このパケットにはヘッダと呼ばれる宛先や制御情報等の情報が付加されます。
ヘッダー情報にＩＰアドレス等が含まれている。

# パケット通信のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/59d6ba8e-c962-1a7e-9760-59a551b6187c.png)
・パケットはバラバラに分割される
・様々なネットワークを流れる送信される
・小さいパケットで送信されるので効率的
・到着したら元データに組み立てられる

# まとめ
ー　TCPIPはオープンなネットワークプロトコルである
ー　プロトコルとは通信規約
ー　パケット分割して送信される
ー　分割されるので効率的
ー　業務ではあまり使いません
ー　でも知ってないと恥ずかしい知識です

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。