OmniAICreator/Qiita-1.07M huggingface dataset:
良いコードは良い名前から生まれる - Good Concepts in Programming -

# 概要
プログラミングの良い概念を理解するとプログラマーレベルが上がると考えています。
良い概念は特定のプログラミング言語に縛られないので、様々なプログラミング言語で役に立ちます。
前回は[やらない理由を書いてやらない（早期リターン）](https://qiita.com/masaki_nakada_ari/items/b702b38c4ac2dee7561d)を紹介しました。
今回紹介する良い概念は「良いコードは良い名前から生まれる」です。

# 良いコードは良い名前から生まれるとは
プログラミングでは変数名、関数名、クラス名などに名前を付けなければいけません。
人間がコードを理解するときにコードの可読性はとても重要です。
意味のある名前を付けるとコードの可読性は抜群に上がります。

# サンプルコード
名前の付け方でコードの見え方に違いがあるのでしょうか？
意味のない名前を付けたコードと意味のある名前を付けたコードを比較してみましょう。

## 1.変数名に良い名前を付ける
商品の税込金額を計算するサンプルコードです。

``` bad_variable_name.js
// a: 消費税率, b: 金額, c: 消費税, d: 税込金額
const a = 0.1
let b = 1000;
let c = b * a;
let d = b + c;
```

コメントが付いていないと、何をしているコードかすぐに理解ができないです。
では変数名に意味のある名前を付けてみましょう。

``` good_variable_name.js
const TaxRate = 0.1;
let price = 1000;
let tax = price * TaxRate;
let total = price + tax;
```

処理の内容は全く同じですが読みやすくなりました。
変数名に意味のある名前を付けることで、何をしているコードかすぐに理解できます。

## 2.関数名に良い名前を付ける
関数を定義して実行するサンプルコードです。

``` bad_function_name.js
function funcA() {
    // チェック処理
}

function funcB() {
    // 計算処理
}

function funcC() {
    // ログ出力処理
}

// チェック処理、計算処理、ログ出力処理の順番で実行
funcA();
funcB();
funcC();
```

コメントが付いてないと、何を実行しているのかわかりませんね。
では関数名に意味のある名前を付けてみましょう。

``` good_function_name.js
function check() {
    // チェック処理
}

function calculate() {
    // 計算処理
}

function outputLog() {
    // ログ出力処理
}

check();
calclate();
outputLog();
```

関数名からどんな処理をするのか予測できます（もちろん関数名に合った処理を記載する必要があります）。

## 3.条件式に良い名前を付ける
条件式に名前を付けるというのはあまり聞き慣れないかもしれませんが効果的です。

``` bad_condition_name.js
const TargetTotalPrice = 1000000;
const TargetVisitCount = 20;

// ゴールド会員の判定をします（一定金額以上の利用かつ一定回数の来店でゴールド会員）
if (totalPrice >= TargetTotalPrice && visitCount >= TargetVisitCount)
{
    // ゴールド会員の処理をします
}
```

問題のないコードですが、if文の中が少し読みにくいと感じます。
では条件式に意味のある名前を付けてみましょう。

``` good_condition_name.js
const TargetTotalPrice = 1000000;
const TargetVisitCount = 20;
const isGoldMember = totalPrice >= TargetTotalPrice && visitCount >= TargetVisitCount;

if (isGoldMember) {
    // ゴールド会員の処理をします
}
```

変数に条件式を代入しただけですが、名前が付けることで見やすくなった気がしませんか？
また変数になったことで同じ条件の場合に変数を再利用できます。

## 4.クラス名に良い名前を付ける
クラス名のサンプルコード（Python）です。
クラスはデータ構造（変数）と振る舞い（関数）をカプセル化するので名前は重要です。

```bad_class_name.py
class Class1:
    def say(self):
        return "hello!"

class Class2(Class1):
    def say(self):
        return "こんにちは！"
```

コメントが書いてないので、クラス名から何をしたいクラスか読み取れないと思います。
ではクラス名に意味のある名前を付けてみましょう。

```good_class_name.py
class Greeting:
    def say(self):
        return "hello!"

class JapaneseGreeting(Greeting):
    def say(self):
        return "こんにちは！"
```

挨拶（Greeting）に関するクラスだとクラス名から読み取れます。

# まとめ
今回は良いコードは良い名前から生まれるを紹介しました。
コードが理解しにくいと感じたらコードの中の名前が良くないかもしれません。
良いコードは良い名前から生まれるを理解してプログラマーレベルが上がったと感じていただければ幸いです。

最後まで読んでいただきありがとうございます。
スプレットシート フィルターを作る方法

# 概要

- Google スプレットシートでフィルターを作る方法を簡単にまとめる。

# 方法

1. 下記の様な表があったとする。

    ![無題のスプレッドシート_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8b05b49b-cecf-a42f-29b8-9e02eabf583f.png)

1. 「種別」の内容に応じてフィルターを作りたいとする。
1. c2~c9までを範囲選択する。

    ![無題のスプレッドシート_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b9369d0e-b432-4d03-4723-d4b935b43e29.png)

1. 「データ」の「フィルタの作成」をクリックする。

    ![無題のスプレッドシート_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a6260dc4-aadc-7d81-4608-0ef8a911042e.png)

1. フィルターが作成された。

    ![無題のスプレッドシート_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9b2da3c9-cdfe-30b8-aaac-89f0a8500c3a.png)
    ![無題のスプレッドシート_-_Google_スプレッドシート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3d50ceb0-8a75-27d7-3f11-5691bf45677b.png)


# 参考文献

https://support.google.com/a/users/answer/9308952?hl=ja
laravel クエリビルダ whereBetween

## 概要

- whereBetweenの使い方と注意点を簡単にまとめる。

## 使い方

- 下記のように使う。（公式ドキュメントの内容そのまま拝借）

    ```php
    $users = DB::table('users')
       ->whereBetween('votes', [1, 100])
       ->get();
    ```

- 上記の処理はusersテーブルのvotesカラムの値が1~100の間のレコードをすべて取得する。ヒットした情報はCollectionで返される。
- 上記の処理をあえてwhereで書き換えると下記の様になる。

    ```php
    $users = DB::table('users')
       ->where('votes', '>', 1)
       ->where('votes', '<', 100)
       ->get();
    ```

## 注意点

- whereBetweenは`>`と`<`で比較される。すなわちwhereBetweenで指定した上限、下限の値を含まない。
- もし上限、下限の値を含めて比較してほしい場合（`≧`や`≦`で比較したい場合）はwhereを使って下記の様に表現する他ないかもしれない。

    ```php
    $users = DB::table('users')
       ->where('votes', '>=', 1)
       ->where('votes', '<=', 100)
       ->get();
    ```

## 参考文献

https://readouble.com/laravel/8.x/ja/queries.html#additional-where-clauses
IR Remoteを用いてArduinoから赤外線入力を確認するプログラム

## 概要
https://amzn.to/3TRIMEB
Arduinoのキットなどによく入っている、上のリンクのリモコンの、各ボタンのコード込みで動作確認できるコードがなかったので、自分用に書きました。せっかくなので以下に貼り付けます。

## バージョンなど
```bash
Arduino IDE 1.8.13
IRremote 2.8.0
```

## コード

```c:remoteControl.ino
#include <IRremote.h>        // ライブラリのインクルード
const int ReceiverPin = 11;  // 赤外線受信モジュール接続ピンをD2に

IRrecv irrecv(ReceiverPin);  // IR受信オブジェクトの生成(使用ピンを指定)
decode_results results;      // 受信情報の格納先(メーカー名/受信したデータ&ビット数など)

void setup() {

  Serial.begin(115200);       // シリアルポートを初期化
  irrecv.enableIRIn();        // 赤外線(IR)受信モジュールを有効に

  delay(500);

}

void loop() {
  
  if (irrecv.decode(&results)){            // 赤外線受信モジュールからデータを受信したかの確認
    if (results.value== 0xFF6897){
     Serial.println("0キーON"); //0が押された
    }
    else if( results.value == 0xFF30CF ){       // "1"が押された時
      Serial.println("1キーON");
    }
    else if( results.value == 0xFF18E7 ){       // "2"が押された時
      Serial.println("2キーON");
    }
    else if( results.value == 0xFF7A85 ){       // "3"が押された時
      Serial.println("3キーON");
    }
    else if( results.value == 0xFF10EF ){  // "4"が押された時
      Serial.println("4キーON");
    }
    else if( results.value == 0xFF38C7 ){  // "5"が押された時
      Serial.println("5キーON");
    }
    else if( results.value == 0xFF5AA5 ){       // "6"が押された時
      Serial.println("6キーON");
    }
    else if( results.value == 0xFF42BD ){       // "7"が押された時
      Serial.println("7キーON");
    }
    else if( results.value == 0xFF4AB5 ){  // "8"が押された時
      Serial.println("8キーON");
    }
    else if( results.value == 0xFF52AD ){       // "9"が押された時
      Serial.println("9キーON");
    }
    else if( results.value == 0xFF9867 ){       // "100+"が押された時
      Serial.println("100+キーON");
    }
    else if( results.value == 0xFFB04F ){       // "200+"が押された時
      Serial.println("200+キーON");
    }
    else if( results.value == 0xFFA25D ){       // "CH-"が押された時
      Serial.println("CH-キーON");
    }    
    else if( results.value == 0xFF629D ){       // "CH"が押された時
      Serial.println("CHキーON");
    }
    else if( results.value == 0xFFE21D ){       // "CH+"が押された時
      Serial.println("CH+キーON");
    }
    else if( results.value == 0xFF22DD ){       // "|<<"が押された時
      Serial.println("|<<キーON");
    }
     else if( results.value == 0xFF02FD ){       // "|>>"が押された時
      Serial.println("|>>キーON");
    }
     else if( results.value == 0xFFC23D ){       // ">||"が押された時
      Serial.println(">||キーON");
    }
    else if( results.value == 0xFFE01F ){       // "-"が押された時
      Serial.println("-キーON");
    }
    else if( results.value == 0xFFA857 ){       // "+"が押された時
      Serial.println("+キーON");
    }   
    else if( results.value == 0xFF906F ){       // "EQ"が押された時
      Serial.println("EQキーON");
    }  
    else Serial.println("未割り当てのキー");   // 未割り当てのキーが押された時

    Serial.print("IRコード: "); 
    Serial.print(results.value, HEX);       // 16進数で受信値を出力
    Serial.print(",  ビット: ");
    Serial.println(results.bits);           // ビット数(受信値長)を出力
    Serial.println("");
   
    irrecv.resume();                        // 次の値を受け取る
    
  }
  delay(500);
}
laravel Blade内でuse宣言する方法

# 概要

- Bladeファイル内でuse宣言を行う方法をまとめる。

# 方法

1. 下記のようにphpディレクティブを用いてuse宣言を行う。

    ```blade
    @php
      use Carbon\CarbonImmutable;
      $now = CarbonImmutable::now();
    @endphp
    ```

1. 本末転倒だがuse宣言をしなくてもフルでnamespaceを設定すれば呼び出すこともできる。

    ```blade
    @php
      $now = Carbon\CarbonImmutable::now();
    @endphp
    ```
ATmega328の電源電圧測定

```c

// 電源電圧(AVCC)測定関数
// 戻り値：電圧(mV)
float cpuVcc(){                      
  long sum=0;
  adcSetup(0x4E);                    // Vref=AVcc, input=internal1.1V
  for(int n=0; n < 10; n++){
    sum = sum + adc();               // adcの値を読んで積分
  }
  return (1.1 * 10240.0)/ sum;       // 電圧を計算して戻り値にする
}
 
void adcSetup(byte data){            // ADコンバーターの設定
  ADMUX = data;                      // ADC Multiplexer Select Reg.
  ADCSRA |= ( 1 << ADEN);            // ADC イネーブル
  ADCSRA |= 0x07;                    // AD変換クロック　CK/128
  delay(10);                         // 安定するまで待つ
}
 
unsigned int adc(){                  // ADCの値を読む
  unsigned int dL, dH;
  ADCSRA |= ( 1 << ADSC);            // AD変換開始
  while(ADCSRA & ( 1 << ADSC) ){     // 変換完了待ち
  }
  dL = ADCL;                         // LSB側読み出し 
  dH = ADCH;                         // MSB側
  return dL | (dH << 8);             // 10ビットに合成した値を返す
}

void setup() {
  //電圧を測定
  float ddd = cpuVcc(); // 電源電圧測定
  Serial.println(ddd);  // 電源電圧表示
}

void loop() {

}
```

どなたかのプログラムを参考に作成したのですが、
忘れてしまった。。。

ご存じの方は教えて下さい。
[簡易メモ]webpackのautoprefixerが共通scssで効かなかったので対応

# 現象
autoprefixer

https://github.com/postcss/autoprefixer
公式通り設定したが、
各module.scssの記述は反映されるが、
共通scssの記述が反映されなかった。

# 環境
"webpack": "5.53.0
"autoprefixer": "^10.3.5",
"css-loader": "^5.2.7",
"postcss-scss": "^4.0.0",
"postcss": "^8.3.7",
"sass": "^1.42.1",
"sass-loader": "^12.1.0",

```構成.md
 root
 ┣ app
 │ ┣ src
 │ │ ┣ components
 │ │ │ ┣ hoge.module.scss
 │ │ │ └ hoge.tsx 
 │ │ └ styles
 │ │   ┣ common.scss
 │ │   └ _global-variables.scss
 │ └ webpack
 │   └ webpack.config.js
 ┣ package.json
 └ postcss.config.js  
```

```webpack.config.js
 const path = require('path');
 const BASE_PATH = path.resolve(__dirname, '..');
 
 module.exports = {
   // 省略
   module: {
     rules: [
       {
         test: /.(sass|scss|css)$/,
         use: [
           {
             loader: 'css-loader',
             options: {
               modules: { /* 省略 */ },
               importLoaders: 2,
             },
           },
           {
             loader: 'sass-loader',
             options: {
               additionalData: '@import "global-variables";',
               sassOptions: {
                 includePaths: [path.resolve(BASE_PATH, 'src/styles')],
               },
             },
           },           
           {
             loader: 'postcss-loader',
             options: { plugins: [autoprefixer] },
           },
         ]
       }
     ]
   }
 }
```

```common.scss
body {
  text-size-adjust: 100%;
}
```

![スクリーンショット 2021-11-11 17.03.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/2e2dd97b-ebfb-f648-fdaf-e994cce06b2d.png)


`hoge.module.scss` の `autoprefixer` は効いていたが
`common.scss` の `autoprefixer` が効いていなかった

# 修正
'sass-loader'を'postcss-loader'の下に記述
loaderは下から実行されるらしい


```webpack.config.js
 const path = require('path');
 const BASE_PATH = path.resolve(__dirname, '..');
 
 module.exports = {
   // 省略
   module: {
     rules: [
       {
         test: /.(sass|scss|css)$/,
         use: [
           {
             loader: 'css-loader',
             options: {
               modules: { /* 省略 */ },
               importLoaders: 2,
             },
           },
           {
             loader: 'postcss-loader',
             options: { plugins: [autoprefixer] },
           },
           {
             loader: 'sass-loader',
             options: {
               additionalData: '@import "global-variables";',
               sassOptions: {
                 includePaths: [path.resolve(BASE_PATH, 'src/styles')],
               },
             },
           }
         ]
       }
     ]
   }
 }
```

![スクリーンショット 2021-11-11 17.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566220/a18d7490-918c-7bbf-fbd4-27149c963cd4.png)
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">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6ba377a0-6e0d-841f-e50d-713f6404bdb2.jpeg" width="500">


</details>

# ストーリーボードとは

UXでは、ストーリーボードは、製品でのユーザーの経験を視覚的に説明し、探索する一連のパネルまたはフレームです。

***<font color="MediumVioletRed">『デザインの理想的な流れを概説するためのアイデア発想のためのツール』</font>***

- ストーリーボードを使ってアイデアをスケッチすることで、体験の流れに沿って作業を進めることができます。
- また、デザインしている製品がどのように使われるかをイメージできるため、ステークホルダーにアイデアを説明する際の視覚的な補助としても機能します。

実際の製品には多くの画面があるかもしれませんが、ストーリーボードは、ユーザーが製品を体験する際の最も重要な部分だけに焦点を当てます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/d846bcbf-0204-09c8-cc43-9c3a9a541e6c.png" width="700">

# 4つ要素と2種類のストーリーボード

<dl>
  <dt>Character</dt>
  <dd>物語の中のユーザー</dd>
  <dt>Scene</dt>
  <dd>ユーザーの環境を想像する</dd>
  <dt>Plat</dt>
  <dd>デザインの利点や解決策</dd>
  <dt>Narrative</dt>
  <dd>物語はユーザーのニーズや問題、そしてデザインがどのようにその問題を解決するのか</dd>
</dl>

UXデザインでは、一般的に2種類のストーリーボードがあり、どちらも上記4つの重要な要素が盛り込まれています。

<dl>
  <dt>ビックピクチャ・ストーリーボード</dt>
  <dd>ユーザーが何を必要としているか、その背景、そして、なぜその製品がユーザーにとって有用であるかに焦点を当てます。</dd>
  <dd>全体像のストーリーボードは、デザイナーがステークホルダーに自分たちのアイデアを支持してもらおうとするデザインプロセスの初期によく使用されます。</dd>
  <dt>クローズアップ・ストーリーボード</dt>
  <dd>製品やその仕組みに焦点を当てます。</dd>
  <dd>デザインプロセスの中盤から終盤に使用するのが最適です。</dd>
</dl>


# ストーリーボードを作成してみる

6コマのストーリーボードにする例を見てみます。

<dl>
  <dt>例）プロブレム・ステートメント</dt>
  <dd>アマルはアスリートで、参加したいクラスがすぐに満員になるので、ワークアウトのクラスに申し込む方法を必要としています。</dd>
  <dt>例）ゴール・ステートメント</dt>
  <dd>アスリートであるユーザーが、ワークアウトクラスに早く申し込めるようにする。</dd>
</dl>

### ビジュアル
アプリやサービスを利用したユーザーの体験をガイドするものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/7d16a941-4eb8-b7fe-477e-b0a62088bf33.png" width="600">

### キャプション
ストーリーの各コマを説明するテキストです。スケッチするのが難しいインタラクションを描くのに便利です。

1. アマルはジムにいて、今日のワークアウトクラスに参加できないのでイライラしています。
1. アマルはソファに座っていて、携帯電話のアプリを開いています。
1. 携帯電話を拡大し、アマルがカレンダーを見て、ワークアウトクラスの予定を入れたい日を選んでいるところを映しています。
1. アマルがワークアウトクラスを選択しています。
1. アマルが確認画面で、ボタンをタップしてクラスを確定しています。
1. ワークアウトクラスに参加するアマルを笑顔で描いています。
.gitignoreファイル作成の便利ツール

# はじめに
Python/Djangoで個人開発している際に、.gitignoreを作成していましたが、何を記載した方がいいか分かりませんでした。
ググっている最中に以下のサイトを見つけた為、共有しようと思い記載致しました。

# サイトの紹介
https://www.toptal.com/developers/gitignore

# 使い方
① 検索欄で.gitignoreを作成したい言語を検索する。LaravelなどのフレームワークでもOK
② 「作成」ボタンを押すと、.gitignoreで記載する内容が表示される
備忘録-PHPUnit

# 開発の効率化-PHPUnit

・要件（前提条件、使用環境）
　・PHPが導入済み
　・VSコードを導入済み
　・dockerを導入済み
　・Xdebugが導入済み
　・Composerが導入済み


　1.インストールする
# コード
```
composer require --dev phpunit/phpunit ^latest
```

###### 参考資料

[PHPUnitドキュメント](”https://phpunit.readthedocs.io/ja/latest/index.html”)
カテゴリの値を別の値に割り当てる(SPSS Modeler データ加工逆引き2-12)

# カテゴリの値を別の値に割り当てる

![スクリーンショット 2022-10-27 13.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/545207b7-1d02-2e67-08a5-2bcc38955c2f.png)


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

・データのクレンジング
・目的変数の単純化


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

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

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

![スクリーンショット 2022-10-27 13.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c968783e-ee84-9ec2-fb30-0462a534ca5b.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-10-27 13.25.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e3394e40-1a23-3a17-aaad-d684e1cde5a5.png)

#### フィールド（列）を置換する

b.[データ分類]ノードを編集します。
![スクリーンショット 2022-10-27 13.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/722602b4-d6d3-7b1f-1120-17d8545c289c.png)

[プレビュー]します。
![スクリーンショット 2022-10-27 13.36.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9ba3eef3-31b7-f172-e22d-6c6a6c804d34.png)

#### 新しいフィールド（列）として定義する

c.[データ分類]ノードを編集します。
![スクリーンショット 2022-10-27 13.38.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3dac410f-b80c-deb5-b838-a8473d93b0a9.png)

[プレビュー]します。
![スクリーンショット 2022-10-27 13.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/676e32a9-b06e-bb01-f19e-ee6b78ee0cca.png)


#### 注意事項

[データ分類フィールド]に対象列が現れない場合には前方でデータの型が確定されていません。[データ型]または入力時の[データ型]タブで[値の読み込みを行います]

[データ分類値]に不要なブランク行が含まれているとノードが適切に動作しません。

https://qiita.com/416nishimaki/items/794fab983057aeb17280#%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E3%83%92%E3%83%B3%E3%83%88

## 4.参考情報

#### データ分類ノード

https://qiita.com/416nishimaki/items/794fab983057aeb17280

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
仕事ができるようになる為に大切なこと

これはぼくにとってとても頭のいたいことだが。。

会議とかで、だれがが注意されていたとき、
（ぼくじゃなくてよかった）とホッと胸をなでおろしている
自分がいる。

でもここで本当にできる人は、自分のことも振り返っている気がする。
それが例えば、報告がおそいっていうことに対してなら、
自分にもそういうことがないかふりかえり、改善する。

自分の身に何か降りかかる前に、ほかの人から学習する。
簡単そうにみえて、なかなか身につかていない。。

これができるとある意味最強だ。。
自分以外でも、となりの席の人でも同僚の人でも上司でもお客さんでも
いろんなところから学習できる。
そういうひとは成長が早いと思うし、きっと仕事がたのしくなり
プラス方向へ循環していく。

ぼくも一人前になるためにこれはほんとに意識しよう。
Cloud SecurityにおけるD.I.E原則

情報セキュリティの世界では長きに渡りC.I.A原則 - Confidentiality/Integrity/Availabilityが謳われてきました。同時に、Cloud Securityの世界では新しいセキュリティの原則が誕生しています。この記事は[2021年のRSAカンファレンス](https://www.youtube.com/watch?v=_omGtDfaAjI)でのセッションからヒントを得た要約です。
<br>
先ずC.I.A原則をおさらいしてみます。
**C=Confidentiality**ですね。認可されていないユーザが不正に機密情報にアクセスすることを防ぐ原則です。現在は必須とされている多要素認証やデータの暗号化がこれにあたります。
次は**I=Integrity**です。データは常に信頼できるものとして扱かわれるべきとした原則で不正に改ざんされることを回避することです。データのHash比較やSigniture等の対策が有効です。
最後は**A=Availability**です。ユーザが必要な時に常にデータにアクセスできる原則です。古くは共有ストレージを用いたクラスタリングシステム等がこれに該当しますね。
<br>
次にCloud SecurityにおけるD.I.E原則を考えてみます。
**D=Distributed**です。サービスは常に分散されたComponentで提供されていて、仮に1つのComponentに障害が発生した場合でもサービス提供を継続できるようにすることです。Availability Zoneのように複数のDatacenterをまたがってComponentを配置することが必要です。
**I=Immutable**です。日本語にすると"揺るぎない"や"普遍の"と言う意味です。現在はInfrastructure as Codeで望んだ環境を定義して構築して、仮に環境が不正に壊されてしまったとしてもその定義にしたがっていつでも戻せることが当たり前ですね。
**E=Ephemeral**です。日本語にすると"一時的な"とか"はかない"と言った意味です。Cloudの大きな特性の1つにResource on demandがあるかと思います。VMやContainerは必要な時に立ち上げて用が済んだら停止したり消したりしますね。
<br>
ここでD.I.E原則の観点からC.I.A原則の意味を今一度考えてみます。
**D=Distributed**でサービスは分散されているので**A=Availability**が担保されています。自前でクラスタリングのような面倒な対策を施す必要はないですね。
**I=Immutable**でいつでもどこからでも望んだ環境を構築できるので、仮に悪意を持ったユーザが不正に環境を改ざんしたとしても問題ないため**I=Integrity**は万全です。
**E=Ephemeral**で用が済んだら停止したり消したりするので、認可されていないユーザが誤って機密情報にアクセスしてしまうことは少なくなりますね。
<br>
では本当にC.I.A原則はCloud Securityの世界では不要なのかもう一度考えてみます。
D.I.EはCloudの環境に対する原則ですが、お客様にとっては環境上で管理されるデータが最も大切ですね。いくらCloudの環境がD.I.E原則に従っていても不正なデータアクセスや漏洩の懸念は残ります。データに対しては従来からのC.I.A原則が必要です。
多要素認証を徹底して**C=Confidentiality**を、データの暗号化やHash管理で**I=Integrity**を、重要なデータはバックアップを何重にも取って**A=Availability**を担保すべきですね。
<br>
D.I.E原則とC.I.A原則のハイブリッドが理想ですね。
Prebid.jsからGoogle Ad ManagerのPPIDへIM-UIDを連携する

# はじめに
この記事は、インティメート・マージャ―で提供している共通IDソリューション「IM-UID」を Prebid.js の User ID モジュールを利用し、パブリッシャー指定の識別子（以下 PPID）をセットする方法を記載しています。


# PPIDとは？

- PPIDは、Google アド マネージャー（以下 GAM） が利用するクロスデバイス対応の識別子で、複数のデバイスで 1 人のユーザーを識別するために利用するためのものです。 [^1]
- PPIDは、フリークエンシー キャップ、オーディエンス セグメンテーション、オーディエンス ターゲティング、広告の順次ローテーション等で使用されます。[^2]
- 適切な識別子を PPID にセットすることで、広告の収益を向上することが期待できます。


# やりたいこと
- GAMのPPIDにIM-UIDを連携する
    - PPIDには以下の制限事項があるため、IM-UIDのハッシュ値を連携しています。[^2]
        - Google にとって意味を持たない値となるようハッシュ化または暗号化されていること
        - 英数字（[0-9 a-z A-Z]）または 16 進表記の UUID（8-4-4-4-12）であること（ハイフンも使用できます）
        - 32 文字以上、150 文字以内であること


# 前提条件
- Prebid.js の 7.11.0 以降を利用していること
- [IM-UID の UserID モジュール](https://docs.prebid.org/dev-docs/modules/userId.html#im-uid-by-intimate-merger) を組み込んでいること

# 導入方法

pbjs の setConfig（） で userSync の ppid に `ppid.intimatemerger.com` を設定してください。

```JavaScript
pbjs.setConfig({
  userSync: {
    ppid: 'ppid.intimatemerger.com', // GAM Publisher Provided ID
    userIds: [{
      name: 'imuid',
      params: {
        cid: 5126 // Set your Intimate Merger Customer ID here for production
      }
    }]
  }
});
```

既に IM-UID の UserID モジュールをご利用頂いてる方は、ppidの設定1行を追加するだけで、 PPID に IM-UID がセットされるようになります。

# 確認方法

console から pbjs object を経由することで、確認ができます。

## Prebid.jsのバージョン

```
> pbjs.version
v7.11.0
```

## UserID モジュール

```
> pbjs.getUserIds()
{ imuid: 'i.vusIbpLQTwWW3I7tDCv1RQ', imppid: 'dbe39d9d56f98d5f9cb22df15b285791' }

> pbjs.getUserIdsAsEids()
 (2)[{...},{...}]
 0: {source: 'intimatemerger.com', uids: Array(1)}
 1: {source: 'ppid.intimatemerger.com', uids: Array(1)}
```

`imppid` が取得できていることと、source に `ppid.intimatemerger.com` が存在していることをご確認ください。

# こちらのサービスを試してみたい方は

- PPIDが有効化されていない場合は、Googleのアカウントマネージャーにご相談ください。
- UserID モジュールについては、インティメート・マージャーの[ポストCookieソリューション問い合わせ窓口](https://lp.intimatemerger.com/im-uid)へお問い合わせください。


[^1]: https://support.google.com/admanager/answer/6280452?hl=ja
[^2]: https://support.google.com/admanager/answer/2880055?hl=ja
Unity Standalone Playerのクラッシュダイアログを回避する

## はじめに

Unityのスタンドアロンプレーヤーがクラッシュすると、以下のようなダイアログが表示されます。

![Screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/7b87a204-0e9b-3fe0-16f9-07c4b9e86448.png)

アプリを使用する状況によっては、このダイアログを表示したくない場合があるでしょう。
この記事では、このダイアログを回避する方法と、その有効性の検証を行います。

### 前提
- この記事のコードは、以下の環境で検証しました。
- Unity 2021.3.12f1
- Windows 11

## 回避方法

`-silent-crashes`というコマンドライン引数は、エディタのオプションとしては記載がありますが、スタンドアロンプレーヤーのオプションとしては記載されていません。

https://docs.unity3d.com/ja/current/Manual/EditorCommandLineArguments.html

https://docs.unity3d.com/ja/current/Manual/PlayerCommandLineArguments.html

このオプションが、スタンドアロンプレーヤーでも使用できるみたいです。

## 有効性の検証

下記のコードを以下のような`UnityEngine.UI.Text`なオブジェクトにアタッチしました。

```text:Hierarchy
🧊Canvas
　🧊Text (Legacy)
```

```csharp:CrashTest.cs
using UnityEngine;
using UnityEngine.UI;

public class CrashTest : MonoBehaviour {

    private const float TimeLimit = 5.0f;
    private Text infomation;
    private float timeLeft;

    private void Start () {
        infomation = GetComponentInChildren<Text> ();
        timeLeft = TimeLimit;
    }

    private void Update () {
        if (timeLeft > 0f) {
            timeLeft -= Time.deltaTime;
            if (timeLeft > 0f) {
                infomation.text = $"{timeLeft:F5}";
            } else {
                infomation.text = "crashed";
                // 表示のために次のフレームまで待つ
                Invoke ("Crash", 1/60f);
            }
        }
    }

    private void Crash () {
#if UNITY_EDITOR
        // エディタ自体がクラッシュするので、単に再生を終了
        UnityEditor.EditorApplication.isPlaying = false;
#else
        // ビルド後は強制クラッシュ
        UnityEngine.Diagnostics.Utils.ForceCrash (UnityEngine.Diagnostics.ForcedCrashCategory.Abort);
#endif
    }

}
```

以上のプロジェクトを、Windows Standalone Playeとしてビルドし、以下のコマンドで実行しました。

```text
> WindowsPlayerCrashTest.exe
```
こちらは、ダイアログが表示されます。

```text
> WindowsPlayerCrashTest.exe -silent-crashes
```
こちらは、ダイアログが表示されなくなりました。

## おわりに
なぜ、エディタのコマンドライン引数としてしか記載されていないのかは謎ですが、スタンドアロンプレーヤーでも有効なようです。

この検証は、Windowsでしか行われておらず、MacやLinuxでも同様になるかは確認していません。
他の環境での結果や、この手法に関する公式情報をご存じでしたら、コメントをお寄せいただけると助かります。

最後までお読みいただきありがとうございました。
2022/11/01主にITとかセキュリティの記事

「ABC-MART」「ユーキャン」などが情報漏洩か EFOツール「Form Assist」などへ不正アクセス(10/30)
https://news.mynavi.jp/techplus/article/20221030-2499170/

不正調査で「フォレンジック」定着、企業の半数超に(10/30)
https://www.nikkei.com/article/DGXZQOUC213S40R21C22A0000000/

DHL、フィッシング詐欺で最も名前を使われたブランドに　2022年第3四半期(10/31)
https://www.zaikei.co.jp/article/20221031/695319.html

【墨汁速報】DappNodeハッカー秘密鍵を再現か？DAOトークン投げ売りで価格が10分の1へ(10/30)
https://coinchoice.net/dappnode-private-key-was-compromised-node-token-dumped_bnews/

最新版以外のmacOS、既知の脆弱性がすべて修正されるとは限らない(10/30)
https://www.zaikei.co.jp/article/20221030/695313.html

要注意！ Androidがハッキングされている5つの兆候(10/30)
https://www.lifehacker.jp/article/2210-check-android-device-hacked/

医療機関のサイバーセキュリティー対策を急げ(10/30)
https://news.yahoo.co.jp/articles/93aab8a7d12108cb5b6e213e81e22408614eb78b

サイバー要員、27年度最大5000人に拡充へ　防衛省検討
アクティブ・サイバー・ディフェンスの対応急ぐ(10/29)
https://www.nikkei.com/article/DGXZQOUA292XE0Z21C22A0000000/

サイバー要員、27年度5000人に　防衛省が増員検討(10/30)
https://www.nikkei.com/article/DGKKZO65578510Q2A031C2MM8000/

サイバー部隊、５０００人へ拡充 防衛省、２７年度５倍超に(10/29)
https://www.the-miyanichi.co.jp/news/Main/2022102901000918.php

防衛省、サイバー人材確保急務 ハイブリッド戦に備え(10/30)
https://www.nikkei.com/article/DGKKZO65576550Z21C22A0EA3000/

トラス前首相の私用携帯ハッキング　ウクライナ情報流出か―英紙(10/30)
https://www.jiji.com/jc/article?k=2022103000460&g=int

NEWS pickup＆digest（2022/9/20～10/7）(10/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800011/101900060/

iPhone トラブルシューティング(10/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/101900148/101900001/

検索結果のトップに偽サイト、フィッシングよけの「常識」が通用しない事態が続々(10/31)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07303/
『Windowsカーネルドライバプログラミング』の2章冒頭でビルドが通らない時の対処法

# はじめに
『Windowsカーネルドライバプログラミング』とは、Windows上で動作するカーネルドライバの開発方法について実践的に学べる書籍だ。
1 章はWindowsの構成要素についての解説がされていたが、2 章からは実際に WDK などのインストールを行い、サンプルアプリを作成していく。
そこでビルドが通らなくなってしまいハマったので備忘録として記事に残すことにした。

# 動作確認環境
Windows 10 Home 22H2
Visual Studio Installer v2.11.69.53063
Visual Studio Community 2019 v16.11.20

# いきなり本題
p.27 で翻訳者からの注釈があるが、書籍に書かれている通りに進めていくと、サンプルアプリを初めてビルドしてみる段階で Spectre の軽減対策関連のビルドエラーが発生してしまう。
Visual Studio のコンソールに書かれているエラーログを読むと、詳細は以下のページに書かれているという。
https://learn.microsoft.com/ja-jp/cpp/build/reference/qspectre?view=msvc-160

読んでみると、コンパイルオプションとして、/Qspectre を指定するには Visual Studio Installer 経由で別途ライブラリをインストールする必要があるらしい。
上記の公式ページの名前で検索すると、おそらく言語設定の問題だが、検索に引っかからない。
なので、自分の環境ではこれをインストールすればよいという対応表を残す。
同じようにハマった人がもしこの記事に辿り着いたら参考にしてみてほしい。

| 公式ページの記載 | Visual Studio Installer での該当コンポーネント名 |
|:---:|:---:|
|MSVC version version_numbers Libs for Spectre [(x86 and x64)&#124;(ARM)&#124;(ARM64)]|MSVC version - VS 2019 C++ [x86/x64&#124;ARM&#124;(ARM64)] Spectre 軽減ライブラリ(version_numbers)|
|Visual C++ ALT for [(x86 and x64)&#124;(ARM)&#124;(ARM64)] with Spectre Mitigations|Spectreの軽減策を含む、[version_numbers] ビルドツール用 C++ ATL ([(x86およびx64)&#124;(ARM)&#124;(ARM64)])|
|Visual C++ MFC for [(x86 and x64)&#124;(ARM)&#124;(ARM64)] with Spectre Mitigations|Spectreの軽減策を含む、[version_numbers] ビルドツール用 C++ MFC ([(x86およびx64)&#124;(ARM)&#124;(ARM64)])|

バージョンに関しては各々インストールしているものが違うと思うので、各自調べて該当するものを探してほしい。
※日本語ページならコンポーネント名も日本語版にしてくれと思うのは傲慢だろうか…？

上にあげた 3 つのコンポーネントを「個別のコンポーネント」欄から検索してインストールしたら無事ビルドに成功した。
まぁ原著が少し古いみたいだからこういうことはあるんだろうなぁ。
話は面白いし、内容も濃いのでしっかり食らいついていきたい。

# おわりに
何か間違いや別の解決方法を見つけたらぜひコメントに残してくれると嬉しい限りである。

今回はとても短い記事になってしまったが、また次の機会にお会いしよう。
ばいちゃ！
CloudFront の証明書を作成する

CloudFront の証明書は、これまで、ROOT 発行のもので使っていたのですが、最小特権の観点からは望ましくありません。

以下のようにして、証明書を作成して、CloudFront で、公開鍵とグループを登録し、Behavior で、望ましい方法である、公開鍵グループを選択して使いましょう。

```Bash
#!/bin/bash

echo ""
echo "#### I will create a key pair for CloudFront. ####"
echo ""
echo -n "CLIENT:"
read CLIENT
TODAY=$(date '+%Y%m%d')
echo ""

set -x
openssl genrsa -out cloudfront_${CLIENT}_private_key_${TODAY}.pem 2048
openssl rsa -pubout -in cloudfront_${CLIENT}_private_key_${TODAY}.pem -out cloudfront_${CLIENT}_public_key_${TODAY}.pem
set +x

echo ""
echo "#### Please check generated files. ####"
echo ""

```

（参考）
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html
GitHubで複数アカウント登録してハマった話

GitHubでアカウントを作り直して、GitHubにアクセスできなくなってハマったので、メモ。

1.GitHubでAAAというユーザーを新規作成。
2.sorceTreeにてローカルリポジトリをプッシュ。
3.GitHubでBBBというユーザーを新規作成。
4.sorceTreeにてローカルリポジトリをプッシュしようとして、エラー。

＜参考サイト＞
①gitの複数アカウント管理で詰まった「ERROR: Repository not found. fatal: Could not read from remote repository.」
https://www.virtual-surfer.com/entry/2018/04/21/212704
②【GitHub】SSHキーを追加しても接続失敗する場合の対処法(fatal: Could not read from remote repository.)
https://inno-tech-life.com/dev/infra/git_ssh_err/

②の「ssh-agentからSSHキーを削除」で解決しました。よかった。
プリプロセッサを活用しよう

# 使う場面
Microsoft Visual Studioではプリプロセッサ機能があり、
マクロを事前に設定することができます。
そして、構成プロパティごとに使えるのでとても便利です。
例:デバックからリリースの切り替えでデバックの処理がいらないとき
# やり方
![a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2418830/4a5716ae-75f7-c525-92df-057190827344.png)
1:プロジェクトのプロパティページを開く
2:設定したい構成、プラットフォームを選択
3:C/C++またはC#
4:プリプロセッサ
5:プリプロセッサの定義
6:追加するマクロを定義
これで6で追加したマクロを設定した構成で使い分けることができます。
iPad SafariでStable Diffusion DemoがConnection errored out.

# 事象

iPadでStable Diffusionのデモ画面（Gradio）を実行すると、13～15秒程度で接続が切れ、「Connection errored out.」というエラーメッセージが表示される。

特に前兆も無く不定期に発生する。

# 環境
* iPad Air （第４世代）
* iPadOS 15.7
* Safari 605.1.15

# 原因

詳細は不明だが、iPad Safari側の問題と思われる。

# 対策

上記事象が発生した際は、一度「機内モード」にして一切のネットワーク接続を切断する。その後「機内モード」を解除すると事象が解消した状態となる。

Gradioに限らず、待ち時間の長いAjax通信で発生しているようなので、発生したら機内モードにして戻す、を覚えておくとよさそうですね。

# ここで問題

この不具合の問い合わせ先はどこですか？
Oracle DBのシーケンスを手動で進める

# 何者かが手動で50件データ投入した

↓これに

|id|name|price|
|--|----|-----|
| 1|foo |  100|
| 2|bar |  150|
| 3|baz |  200|

↓何者かがこれを投入した。

|id|name|price|
|--|----|-----|
| 4|fuga|  990|
| :| :  |   : |
|53|hoge|  999|

↓当然こうなった。

|id|name|price|
|--|----|-----|
| 1|foo |  100|
| 2|bar |  150|
| 3|baz |  200|
| :| :  |   : |
|53|hoge|  999|

しかし、シーケンスが3で止まっているので、オンラインシステム経由でinsertしようとするとidに4を設定しようとして、4は既に存在するので一意制約違反でシステムエラー。オンラインシステム全部動かなくなりました。なんてことしてくれるんだ。

# とにかくシーケンスを進めよう

結果が53になるまでひたすらNEXTVALを連打します。

```sql:
SELECT XXX_SEQ.NEXTVAL FROM DUAL
```

これを50回繰り返せばOK。
50件程度なら何も考えずに連打してしまった方が速いです。

# じゃあ1000件だったら1000回連打するのか

ALTER SEQUENCEで一時的に増分値を増やす方法が以下で挙げられていますが、今動いている環境でこれをやるのは感心しません。また、増分値を戻し忘れる、誤った値に戻してしまうなどの事故のもとにもなりかねません。

https://oracle.programmer-reference.com/oracle-sequence-advance/

だいたいこの手の作業ミスって、結合テストの後半くらいに原因不明のバグとしてあらわれてくるので困るのです。

とはいえ、流石に1000回もNEXTVALやってられないので別の方法を考えます。CONNECT BY LEVELを使ってみましょう。以下はLEVELという疑似列を作成する構文を組み合わせたものです。
CONNECT BY LEVEL <= 1000 で、1～1000までの連番が生成されます。

```sql:
SELECT LEVEL, XXX_SEQ.NEXTVAL FROM DUAL CONNECT BY LEVEL <= 1000
```

https://gonsuke777.hatenablog.com/entry/20140629/1404058247
Link94 「アプリケーションが、存在しないか一致しない SDK コンポーネントに依存する操作を要求しました。」について

# 要因
新規のPCでプロジェクトをビルドした時のエラー内容です。
DirectX関連でエラーが出ているようです。
ちなみに私はDirectXのスワップチェインでエラーになりました。
# 解決
https://www.microsoft.com/ja-JP/download/confirmation.aspx?id=6812

DirectXのSDKをインストールすると解決しました。
もしそれでも治らない場合は、Windowsの設定＞アプリと機能＞オプション機能で
グラフィックツールがインストールされているかを確認してください。
[Golang]メモ

とりあえずAPIテストに必要なサンプルは揃えた

## GetのAPIを作成

```go
func SampleGetAPI(router *gin.RouterGroup) {
	router.GET("/ping", func(c *gin.Context) {
		// queryparamerの値を取得する
		fmt.Println(c.Query("samplequery"))
		c.JSON(200, gin.H{
			"Message": "pong",
		})
	})
}

```

## requestを送って返ってきた値を取り出す

```go
func TestRes(t *testing.T) {

	resp, _ := http.Get("http://localhost:8080/ping")
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	//これが中身
	var post responseBody
	if err := json.Unmarshal(body, &post); err != nil {
		fmt.Println(err)
		return
	}
	fmt.Printf("%+v\n", post.Message)
}
```

## Post用のAPIを作成する

```go
func SamplePostPage(router *gin.RouterGroup) {
	router.POST("/samplepost", func(c *gin.Context) {

		bodyAsByteArray, _ := io.ReadAll(c.Request.Body)
		jsonBody := string(bodyAsByteArray)
		fmt.Println(jsonBody)
		var post responseBody
		if err := json.Unmarshal(bodyAsByteArray, &post); err != nil {
			fmt.Println(err)
			fmt.Println("ggg")
			return
		}
		fmt.Printf("%+v\n", post.Sample)
		fmt.Println("kkk")
		c.JSON(200, gin.H{
			"Message": "pong",
		})
	})
}

```

```go
func TestResPost(t *testing.T) {
	values := map[string]string{"Sample": "aaaabbbb"}

	jsonValue, _ := json.Marshal(values)
	resp, err := http.Post(
		"http://localhost:8080/samplepost",
		"application/json",
		bytes.NewBuffer(jsonValue),
	)
	defer resp.Body.Close()
	resp.Header.Add("Content-Type", "application/json")
	if err != nil {
		fmt.Println(err)
		return
	}

	println(resp)

}


```

## Map

```go
// キーとvalueがType指定なしで100個文の要素のメモリ領域を確保
target := make(map[interface{}]interface{}, 100)
target["k1"] = 1
target[3] = "hello"
target["world"] = 1.05
fmt.Println(target)

```

```
map[3:hello k1:1 world:1.05]
```

## [gin]r.Use()
ミドルウエア追加するときにつかう

## デフォルトライブラリだけhttpを返す

```go:main.go
// html
    http.HandleFunc("/healthcheck", func(w http.ResponseWriter, r *http.Request) {
        
        fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
    })

    http.ListenAndServe(":8000", nil)

```

## set-cookie

```go
func runserver(){
    
    http.HandleFunc("/healthcheck", func(w http.ResponseWriter, r *http.Request) {
     
        cookie := http.Cookie{
            Name: "csrftoken",
            Value:"abcd",
        }
        
        http.SetCookie(w, &cookie)
        fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
    })

```
ネットワーク 備忘録

## UTPケーブル
別名LANケーブル
・最大長100m レイトコリジョン（プリアンブルを送信後にコリジョンを検出）のリスクが高まる

参考URL

https://www.youtube.com/watch?v=WaqRP49JQxc&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=4

|タイプ|使用例|
|----|----|
|ストレート|MDI(PC)とMDI-X(スイッチなど)|
|クロス|MDI(PC)とMDI(PC)||

AUTO MDI/MDI-X 対応 LAN ポートなら、ストレートケーブルとクロスケーブルどちらでも使える

http://direct.pc-physics.com/network/cross-cable-necessity.html

### 自宅ネットワーク環境
|名称|説明|
|----|----| 
|ルータ|ネットワーク間のデータ転送装置||
|ONU|光信号とデジタル信号の変換装置||
|ホームゲートウェイ|ルータ + ONU の一体型装置||

https://selectra.jp/telecom/guides/knowledge/onu#ONU%E3%81%A8%E3%83%AB%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%AE%E9%81%95%E3%81%84

### LAN WAN VPN
|名称|説明|備考|
|----|----|----|
|LAN|拠点内の狭域ネットワーク|自前で構築|
|WAN|拠点間の広域ネットワーク|NTTもしくはKDDIと契約<br>各企業が設定したVPN環境をレンタルするサービスが主流|
|VPN|インターネット回線を利用した、仮想的な専用ネットワーク|WANの一種|

https://www.itscom.co.jp/forbiz/column/vpn/229/#:~:text=VPN%E3%81%AF%E7%8F%BE%E5%9C%A8%E3%81%AE%E6%97%A5%E6%9C%AC,%E3%81%8CVPN%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

## 通信方式
|通信方式|説明|備考|
|----|----|----|
|ユニキャスト|1対1||
|ブロードキャスト|1対全体|ブロードキャストドメイン|
|マルチキャスト|1対特定グループ||
|エニーキャスト|1対1(特定グループ)|DNSルートサーバ|

参考URL

https://www.youtube.com/watch?v=2ZCK11TF64g&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=3

## OSI参照モデル
|階層|階層名|PDU(データ単位)|代表プロトコル|備考|
|----|----|----|----|----|
|7|アプリケーション層|メッセージ|HTTP HTTPS QUIC DNS|
|6|プレゼンテーション層|メッセージ||
|5|セッション層|メッセージ||
|4|トランスポート層|セグメント|TCP UDP|
|3|ネットワーク層|パケット|IP|
|2|データリンク層|フレーム||MACアドレス|
|1|物理層|ビット||有線：イーサネット(IEEE802.3)<br>無線：IEEE802.11|
## TCP/IPモデル
|階層|階層名|備考|
|----|----|----|
|7~5|アプリケーション層||
|4|トランスポート層||
|3|インターネット層||
|2~1|ネットワークインターフェース層||

参考URL

https://www.youtube.com/watch?v=orKcBIeMVTY&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=5

参考書籍 図解入門TCP/IP みやた ひろし：著者 P20


### MACアドレス
<b>データリンク層に接続されている機器を識別する情報</b>
イメージ：通信するための出入り口を判断する情報
例：無線と有線両方で通信できるPCは無線のMACアドレス、有線のMACアドレスと2つのMACアドレスがある。
構成：【48ビット】ベンダ識別子(OUI)24ビット + ベンダ内管理識別子(UAA)24ビット

参考URL

https://www.youtube.com/watch?v=ruibtqhMaUw&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=7

https://www.youtube.com/watch?v=E4bRs-TVOLM&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=8

参考書籍 図解入門TCP/IP みやた ひろし：著者 P83

### 通信相手のmacアドレスの取得
arp
https://youtu.be/M79Jsqoocmc


## スイッチ と ルータ 比較
|項目|スイッチ|ルータ|
|----|----|----|
|繋ぐもの|隣り合う機会同士|ネットワーク同士|
|OSI参照モデル|データリンク層|ネットワーク層|
|理解できるもの|L2(MACアドレス)<br>L1(物理層)|L3(IPアドレス)<br>L2(MACアドレス)<br>L1(物理層)|

参考URL

https://www.youtube.com/watch?v=9LmdwZR0b8A&list=PLfrpqyRFsglLIZ38E6ih11nEQZjNGgbVN&index=13

## IPアドレス 
|項目|説明|例|
|----|----|----|
|ネットワーク部|IPの前方|<b>192.168.0</b>.11|
|ホスト部|IPの後方|192.168.0<b>.11</b>|
|サブネットマスク|ネットワーク部とホスト部の境目|255.255.255.0|

### クラス
|項目|A|B|C|
|----|----|----|----|
|先頭ﾋﾞｯﾄ|0|10|110|
|先頭10進数|1～126|128～191|191～223|
|ﾈｯﾄﾜｰｸ,ﾎｽﾄ部の区切り|8ﾋﾞｯﾄ|16ﾋﾞｯﾄ|24ﾋﾞｯﾄ|
|ﾈｯﾄﾜｰｸｱﾄﾞﾚｽ数|126|16万6382|209万7150|
|ﾎｽﾄｱﾄﾞﾚｽ数|1677万7214|6万5534|254|

参考：おうちで学べるネットワークのきほん 著：Gene P55-表1

|項目|説明|備考|
|----|----|----|
|ｸﾗｽﾌﾙ ｱﾄﾞﾚｽ|ABCｸﾗｽのようにﾈｯﾄﾜｰｸ,ﾎｽﾄ部の区切りが固定|IPｱﾄﾞﾚｽの利用効率が悪いため現在利用されていない|
|ｸﾗｽﾚｽ ｱﾄﾞﾚｽ|ｻﾌﾞﾈｯﾄﾏｽｸでﾈｯﾄﾜｰｸ,ﾎｽﾄ部の区切りが変動||

参考：おうちで学べるネットワークのきほん 著：Gene P61
Google Cloud Next '22 で GAが発表されたBatchを試してみるのとそれの所感

# はじめに
Google CloudNext '22 で発表された内容の新サービスや、新たな機能について、できるものを実際に動かしてみたいと思います。
ちなみに新たに公開されたものとしては以下のように纏められているブログがありますので、こちらベースでみていきます。
https://cloud.google.com/blog/ja/topics/google-cloud-next/google-cloud-next22-wrap-up
今回はGAされたBatchサービスを動かしてみます。

# Batchを動かしてみる
今回はこちら試していきたいと思います。
https://cloud.google.com/batch
Google Cloud でも Batch サービスが登場しました。
実行例にあるような単発軽微なスクリプトを動かすこともできるし、大規模なスクリプトを動かすことも可能です。
ユースケースとしては分析や電子設計、ゲノム配列などが記載されています。

## 作成する
### 1.Job list から 作成 する

### 2.作成画面に遷移し、情報を入力していきます。
![スクリーンショット 2022-10-31 23.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/f4ddfcd8-85b0-9c54-f404-3b5295955e84.png)
　・リージョンでは残念ながらまだ東京は選べません。
　・「VM provisioning model」ではSpot VM も選択可能になっています。
　・マシンタイプは汎用、コンピューティング最適化、メモリ最適化、から適切なマシンタイプの選択が可能です。
　　動作させるスクリプトに応じて選択します。

### 3.Task 箇所ですが、まずコンテナを動作させるか、直接シェルを動作させるか、選択可能です。
　今回はスクリプトで簡単にechoしてみました。
![スクリーンショット 2022-10-31 23.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/08fd75c3-5607-fa0b-471c-4691dcf77ab4.png)
　・スクリプトを選択すると、スクリプトを直接入力できるようになっています。
　・タスク数、冗長数が選択可能です。
　・コンテナであればImage URL を選択、改めて、command を定義できるようになっていました(こういう機能はあんまり無い気がします)。
![スクリーンショット 2022-11-01 0.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/33f458bf-26b1-b653-fb1a-4edc9a5d0814.png)

### 4.タスクあたりのリソース割当が決められます
![スクリーンショット 2022-10-31 23.30.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/ff6225f3-3c29-3792-8632-a0649a8d9c37.png)

### 5.最後にオプションとしてストレージの割当が決められます
![スクリーンショット 2022-11-01 1.01.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/d7985fa4-4f34-c24a-fe45-b50e87f70ec4.png)
　・Cloud Storage は選ぶことが可能でした、これはCloud Storageをマウントすることが可能でファイル出力などに利用できます
　・NFSはGoogleのFileStore共有が使えるようですが、ファイアウォールは許可しておく必要があるので注意してください
　・ローカルディスクはグレイアウトしていましたが、理由としてはそのZoneにVMが無いって出てきたので、
　　VMがある対象のZoneを選ぶことで、もしかしたら選べるようになるかもしれません(まだ試していません)
![スクリーンショット 2022-11-01 1.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/e99f7854-aba4-cd53-64b1-ddfced7b2010.png)

### 6.作成する
　作成するとじきにリストの画面上でステータスが「キューに格納」→「完了しました」と変化します。
 ※画面はキューに格納です
![スクリーンショット 2022-10-31 23.30.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/f41f7076-4d2d-779a-44d8-06a4d54510dd.png)
　対象ジョブを開いて、Loggingを確認すると、標準出力されたものがCloud Loggingに出力されていました。
![スクリーンショット 2022-10-31 23.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/84134034-a580-43bc-fde7-323098aad170.png)


# 所感
ドキュメントのサンプルにも記載がありますが、workflowに盛り込んでジョブを実行する、
というのが使い所としてはありそうです。
https://cloud.google.com/workflows/docs/tutorial-batch-and-workflows
VPC内のVMのディスクに対して何かを出力したい場合や書き換えたい、はたまたファイル情報を読み込みたいなどがあれば、それもできそうです。
ほかには、Cloud Functions では使えない、スクリプトを利用したジョブ実行ができるので、
その点で、若干かゆいところに手が届くようなこともあるのかな、と思いました。
もう少し実用的なケースがあればそれも記事書きたいと思います。今回は試し実行でした。
localでGiteaセットアップ時にsshの使い方がわからなかったのでメモ

# GitHub触ってる時
自分のリポジトリに表示されてるCodeや、作った時のコマンドをそのままコピぺしてて理解してなかった

例
```bash
git@github.com:{ユーザー名}/{リポジトリ名}.git
```

# 状態

## RaspberryPi

RaspberryPiにアクセスするためのconfigを別途設定済み ← これのせいでややこしい
```config:~/.ssh/config
Host raspberry.local
        HostName raspberry.local
        User pi
        Port 22
        IdentityFile ~/.ssh/raspberry
```

## Gitea
Docker Composeで立ててます

一応yamlファイル
```yaml:compose.yaml
services:
  server:
    image: gitea/gitea
    restart: always
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 3000:3000
      - 2222:22
```

## ssh接続してみる(失敗)
Portは当然変更してるから、`ssh git@raspberry.local:2222`だとエラーが出る
```bash
> ssh git@raspberry.local:2222
ssh: Could not resolve hostname raspberry.local:2222: nodename nor servname provided, or not known

> ssh git@raspberry.local:2222:{ユーザー名}/{リポジトリ名}.git
ssh: Could not resolve hostname raspberry.local:2222:{ユーザー名}/{リポジトリ名}.git: nodename nor servname provided, or not known
```

そりゃ、コロン以降に、ユーザー名とリポジトリ名のパス書いてるからそうなるよね...
(ポートの識別できないし)

# 結局どうしたのか

1. configを作る
1. URLをconfigから認証するように変更する

だけ.

## configを作る

```config:~/.ssh/config
Host gitea
        HostName raspberry.local
        User git
        Port 2222
        IdentityFile ~/.ssh/raspberry-gitea
```

認証通るかテスト

```bash
> ssh gitea
PTY allocation request failed on channel 0
Hi there, {アカウント名}! You've successfully authenticated with the key named {認証鍵前}, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to raspberry.local closed.
```

接続は通ったのでクリア

## URLをconfigから認証するように変更する

giteaから適当なリポジトリに移動して、SSHのコマンドをコピー

```text:sample
git@raspberry.local:{ユーザー名}/{リポジトリ名}.git
```

弄ってからコマンドをremote urlに登録
```text:編集後
gitea:{ユーザー名}/{リポジトリ名}.git
```
最初のgiteaは、configで設定したHostのところと一致させればok!

```bash
> git remote add origin gitea:{ユーザー名}/{リポジトリ名}.git
```

そのまま、pushとか、pullしたら問題なく通るはず

# まとめ

結局本体にアクセスするためにconfigのHostを使い切ったせいで、
今回別のHostを登録して、giteaに接続するためのURLも変える必要があった。

今回はconfigのホストに合わせて書き換えるという強行突破(?)で解決したけど、
コピペワンクリックでできなくなるのは面倒なので、下記のどっちかやっておけば良さそう
1. 同じドメインで運用するのをやめる
1. ラズパイにsshするときのHostを変える

ルーターの設定よくわからんので、個人的には後者が即実行できて無難
でもサブドメインでの運用とかできたらかっこいいよなぁ...笑

なんかもうちょい上手いやり方ありそうだけどね
Vue.jsですべての要素をアニメーションの対象にする

※※※ 個別の要素を繊細に制御したい場合はdata属性を持たせるなどの別記事を探して参照した方がよい。この記事は**大変大雑把な挙動を実装するためのもの**です。 ※※※

ユーザー動作（テキストフォームの検索実行や、チェックボックスのチェック挙動）のたびに一覧領域をすべてリフレッシュ→その後アニメーションでふわっと表示させるという表現をしたい。

```index.html
<transition-group name="fade" tag="div" appear>
  <template v-if="items.length">
    <article v-for="(item,index) in items" v-bind:key="item.id">
      ...
    </article>
  </template>
</transition-group>
```

しかしVue.jsは再描画をなるべく避ける指向のライブラリであるためか、ユーザー動作の前後で変化のない要素がアニメーションにならない。
色々探しても「一度全部消す」という表現に使えそうなやり方がtransition-groupコンポーネントで見つからない。
必ずしも全ての要素に対してVue.jsのtransitionが走るとは限らないので、Vue.jsのtransitionから一旦離れて考えてみる。素朴なCSSアニメーションで組んでみる。

```script.js
new Vue({
  el: '#app',
  data: {
    animeFlg : false,
  },...
  computed: {
    items: function() {
      let arr = [];
      this.animeFlg = true;
      ...絞り込み処理...
      setTimeout(function(){
        if(this.animeFlg){
          this.animeFlg = false;
        }
      },500);
      return arr;
    }
  }
});
```
itemsは算出プロパティなので
1.算出プロパティが走るたびにCSSアニメーション用のフラグをtrueにする
2.returnの直前でsetTimeout()を使い、return後にCSSアニメーション用のフラグをfalseにする
```index.html
<div :class="{ 'refresh-fade' : animeFlg }">
  <template v-if="items.length">
    <article v-for="(item,index) in items" v-bind:key="item.id">
      ...
    </article>
  </template>
</div>
```
3.一覧のラッパー要素のクラスをデータバインディングにして、アニメーション用フラグの状態によってクラスを制御する
```style.css
@keyframes refresh-fade {
  0% {
    opacity: 0;
  }
  10% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}
.refresh-fade {
  animation: refresh-fade 1s;
}
```
4.transitionでもいいが制御しやすいのでanimationで指定

これで全体が一度リフレッシュ→フェードされるように見える。とりあえずは望んだ動作になった。
（せっかくのVue.jsのtransition機能を無下にする仕上がり…）

ただこれだと「もっと見る」ボタンなどを押したときの挙動も全体がリフレッシュされるように見えてしまうので、divを再度transition-groupにし、部分動作の際のVue.jsのtransitionを実装する。詳しくは以下の過去記事を参照。
https://qiita.com/c_nnnnnn/items/900f1f8af53f139df92a

```index.html
<transition-group tag="div" :class="{ 'refresh-fade' : animeFlg }" :name="showMoreAnimeFlg ? 'cat-fade' : 'cat-no-fade'" @after-enter="deAnimate" @after-leave="deAnimate">
  <template v-if="items.length">
    <article v-for="(item,index) in items" v-bind:key="item.id">
      ...
    </article>
  </template>
</transition-group>
```
```script.js
...
methods: {
  showMoreItems:function(){//もっと見るボタンに追加されているmethod
    ...
    this.showMoreAnimeFlg = true;
  },
  deAnimate : function(){//Vueのtransition後に発火するイベント
    this.showMoreAnimeFlg = false;
  }
}
```
```style.css
.cat-fade-enter {
  opacity: 0;
}
.cat-fade-enter-to {
  opacity: 1;
}
.cat-fade-enter-active{
  transition: opacity .5s;
}
```
5.もっと見るボタンクリック時に部分アニメーション用フラグをtrueにする
6.transition-groupに設定されたnameをデータバインディングにして、部分アニメーション用フラグの状態によってクラスを制御する（アニメーションと非アニメーションの切り替え）
7.JavaScriptフックでVue.jsのtransition後に部分アニメーション用フラグをfalseにする

もっとスマートな方法が多分ある。わかりません。
Javaで何か作ってみる(2022/10/31 Day11)

## 今日やった事
- 本当何もしなかった。
## 参考にしたもの
- 特になし。
## 所感
- 今日は本当何も勉強しなかった、ただただ反省。。。
## 明日の予定
- 今日で完全に整理が終わらなかったので、明日中にGitHubの整理を終えたい。
Shell の算術式 ((...)) は演算結果が 0 の場合はコマンドが失敗したとみなされる

算術式 `((...))` は便利ですが、下記のように単独で用いる場合は注意が必要です。

```bash
set -e

declare -i num=1
((i=i-1))  # ⭐演算結果が 0 なので、コマンド失敗とみなされ、
           #  ここで終了してしまう
....
```

**`((...))` の演算結果が 0 の場合はコマンドが失敗したと見なされる** ため、 `set -e` や `set -o errexit` している場合は上記の ⭐ の部分でプログラムが途中で終了してしまいます。

また、 `set -e` していなくても、 **プログラムの末尾で `((...))` で演算した場合、演算結果が 0 であればプログラムの終了コードは 1 になってしまします** 。

上記の問題はインクリメント/デクリメントでもよく陥ってしまします。

```bash
set -e

declare -i i=0
((i++))  # インクリメントの評価値は可算前の値なので演算結果は 0 、
         # つまり ここでプログラムが途中で終了する
```

## これらの問題を避ける方法

括弧の後に `|| :` を追記してやります。
`:` は「何もしない」コマンドです。（[参考](https://qiita.com/xtetsuji/items/381dc17241bda548045d)）

```bash
((i++)) || :
```

また、代入で書き直すという別解もあります。この場合は演算結果が　0 であってもコマンド失敗とは見なされません。

```bash
i=$((i++))
```

## 関連記事

[Bash シェルスクリプトで数値計算を行うとスクリプトが強制終了される問題でハマった話 | ゲンゾウ用ポストイット](https://genzouw.com/entry/2021/05/17/203142/2595/)
Windows（WSL2）でMacOSXを使った開発環境を構築

# 目的
- WindowsからOSXを使った開発環境を整える

# おおまかな流れ
1. WindowsにWSL2・Linux GUIアプリを動かす環境をインストール
2. WSL2にDockerをインストール
3. Dockerコンテナ：sickcodes/docker-osx（[参考](https://github.com/sickcodes/Docker-OSX)）を立ち上げ
4. 3.で立ち上げたコンテナにWindowsのVSCodeから接続・操作

![スクリーンショット 2022-10-31 181218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109639/3a156636-27c7-c9e8-77d8-4d7687a0a721.png)


# 検証した環境
- Windows11 （22000.1098）
- [**こちら**](https://github.com/sickcodes/Docker-OSX)に下記の記述あり
> You must have Windows 11 installed with build 22000+ (21H2 or higher).

# 手順
※ 長文回避のためWSL2、VSCodeなどのインストール手順については割愛。それらを含んだ手順詳細は[**こちら**](https://lethediana.sakura.ne.jp/tech/archives/steps-ja/1240/)を参照ください
## OSXを実行するコンテナのセットアップ
1. WSL2をインストール（割愛）
2. .wslconfigファイルを作成
    - `C:/Users/<Your_Name>`に.wslconfigというファイルを作成（`<Your_Name>`の部分はWindowsのユーザーネーム）
    - .wslconfigに下記の内容を追加して保存
    ```
    [wsl2]
    nestedVirtualization=true
    ```
3.  Windows Subsystem for Linux Previewをインストール
    - [こちら](https://aka.ms/wslstorepage)  からインストール可能
4. WSL2のUbuntuを起動
    - .wslconfigはWSL2起動時に反映されるため、必要なら再起動する
5. WSL2でDockerをインストール（割愛）
6. WSL2で下記コマンドを実行
    - タグ（`auto`の部分）を変更することでバージョンなどを変更できる
    - `auto`はCatalinaがプレインストールされたイメージ
    ```
    $ docker run -it \
    --device /dev/kvm \
    -p 50922:10022 \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e "DISPLAY=${DISPLAY:-:0.0}" \
    sickcodes/docker-osx:auto
    ```
7. WindowsでQEMUが起動し下記の画面が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109639/bebe7cbc-62fc-c994-39df-7e04829d0dac.png)

## WindowsのVSCodeから接続
- 前節で立ち上げたコンテナ上のMacOSXのディレクトリをどこかにマウントしてコーディング・コンテナにssh接続してコマンド操作 ができると効率的と思われるため、下記はそのための手順
- 前節7.の画面が表示されている状態で、VSCodeのWSLウインドウを開き、VSCodeのターミナルで作業する想定（この状態へは[**こちら**](https://lethediana.sakura.ne.jp/tech/archives/steps-ja/1169/)の「VSCodeの準備と動作確認」を参照）

### ファイルマウント
1. 下記コマンドを実行し、sshfsをインストール
    `$ sudo apt update`
    `$ sudo apt install sshfs`
2. 下記コマンドでマウントを実行
    `$ sshfs user@localhost:<path-on-OSX> -p 50922 <path-on-WSL>`
    - `<path-on-OSX>` にOSXのパスを`<path-on-WSL>` にWSLのパスを設定する
    - こだわりがなければ`<path-on-OSX>` にOSXのパスはとりあえず`/`と書いておけば全部マウントされる
    - Passwordはデフォルトでalpine

### ssh接続
1. 下記コマンドを実行
`$ ssh user@localhost -p 50922`
    - 初回実行時は、`Are you sure you want to continue connecting (yes/no/[fingerprint])?`と聞かれるのでyesを入力
    - Passwordはデフォルトでalpine
2. `user@users-iMac-Pro ~ %` と表示されることを確認
    - この状態でVSCodeのターミナルからGUI関連の処理も実行できる
例）`% open -a Safari`を実行すると、前節7.の画面でSafariが立ち上がる
Azureポータルでユーザーを作成するには

●Azureポータルでユーザーを作成するには

■ID
ユーザー名、名前の入力は必須

■パスワード
ユーザーに対する初期パスワードを設定。

■グループとロール
グループでは、作成するユーザーが所属するグループを選択。役割はAzure ADテナントの特定の管理権限を割り当てたい場合に設定。特定権限を割り当てない場合は、特別な管理権限を持たないユーザーというロールが使用される。

■設定
サインインをブロックするかどうかを設定し、利用場所を国の一覧から選択する。
利用場所は必須ではないが、特定のライセンスを割り当てるために必要になる場合がある。例えば、Azure AD Premiumのライセンスを割り当てるためには、利用場所が設定されている必要があり、未設定の場合はライセンス割り当て時にエラーになる。

■ジョブ情報
役職や部署などのユーザー情報に付随する情報を設定する。
paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript 部分列

部分列 (paizaランク B 相当)

https://paiza.jp/works/mondai/sequence_search_problems_advanced/sequence_search_problems_advanced__before_after_boss

# 解答例

問題文を正しく理解することが大事です。

>数列 b が数列 a の部分列かどうか判定してください。言い換えると、数列 a からいくつかの要素を取り除いて元の数列の順序で結合した数列が、数列 b と等しくなることがあるかどうかを判定してください。

部分列は、例えば、aが1,2,3,4,5で、bが2,3,4のように連続しているとき、bはaの部分列ですが、aが1,2,3,4,5で、bが1,3,5のようにとびとびのときも、bはaの部分列です。

「数列 b の中で、数列 a の要素と一致した要素の個数」を変数`match_count`として用意します。
aとb[macth_count]が一致したらmacth_countを増やしてbの次を調べます。
すなわち、aの要素とbの要素が一致したら、次のbの要素を順々に調べていきます。
最終的にmach_count=mだったら、部分列だと判定できます。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m] = lines[0].split(" ").map(Number);
const a = lines[1].split(" ").map(Number);
const b = lines[2].split(" ").map(Number);

let match_count = 0;//数列 b の中ですでに数列 a の要素と一致した要素の個数
let flag = false;//部分数列判定
//aの先頭から調べていく
for (let i = 0; i < n; i++) {
  //数列 b の中で、数列 a の要素と一致しているか
  if (a[i] === b[match_count]) {
    match_count += 1;//一致したら次のbの要素
  }
  //最終的にmatch_countとb要素の個数mと等しければ部分数列
  if (match_count === m) {
    flag = true;//部分数列が存在した
    break;//終わり
  }
}
console.log(flag ? "Yes" : "No");
```